From 3d2e4e770581e5da51699dd041b8883a4bfe0115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Fri, 21 Nov 2025 21:59:54 +0800 Subject: [PATCH 01/98] Restore: feature/service This branch was previously covered by a revert for misoperation of PR. Now it should be restored for the following developing. - Sincere apology from Kiramei. --- core/Baas_thread.py | 7 +- core/config/config_set.py | 31 +- core/config/default_config.py | 10 +- core/ocr/baas_ocr_client/server_installer.py | 151 +++--- core/scheduler.py | 1 + core/utils.py | 48 +- deploy/installer/installer.py | 47 +- deploy/installer/toml_config.py | 43 ++ gui/components/expand/baasUpdateConfig.py | 80 +++- main.py | 13 +- main.service.py | 64 +++ requirements-linux.txt | 2 +- requirements.service.txt | 35 ++ requirements.txt | 2 +- service.example.py | 12 +- service/__init__.py | 4 + service/app.py | 364 ++++++++++++++ service/broadcast.py | 48 ++ service/config_manager.py | 479 +++++++++++++++++++ service/context.py | 51 ++ service/diff.py | 136 ++++++ service/encryption.py | 71 +++ service/logging.py | 144 ++++++ service/messages.py | 64 +++ service/runtime.py | 342 +++++++++++++ service/utils/__init__.py | 12 + service/utils/config_ops.py | 147 ++++++ service/utils/update.py | 300 ++++++++++++ 28 files changed, 2534 insertions(+), 174 deletions(-) create mode 100644 main.service.py create mode 100644 requirements.service.txt create mode 100644 service/__init__.py create mode 100644 service/app.py create mode 100644 service/broadcast.py create mode 100644 service/config_manager.py create mode 100644 service/context.py create mode 100644 service/diff.py create mode 100644 service/encryption.py create mode 100644 service/logging.py create mode 100644 service/messages.py create mode 100644 service/runtime.py create mode 100644 service/utils/__init__.py create mode 100644 service/utils/config_ops.py create mode 100644 service/utils/update.py diff --git a/core/Baas_thread.py b/core/Baas_thread.py index 32078853b..1b00b82a6 100644 --- a/core/Baas_thread.py +++ b/core/Baas_thread.py @@ -71,7 +71,7 @@ class Baas_thread: - def __init__(self, config, logger_signal=None, button_signal=None, update_signal=None, exit_signal=None): + def __init__(self, config, logger_signal=None, button_signal=None, update_signal=None, exit_signal=None, **kwargs): self.project_dir = os.path.abspath(os.path.dirname(__file__)) self.project_dir = os.path.dirname(self.project_dir) self.u2_client = None @@ -100,7 +100,7 @@ def __init__(self, config, logger_signal=None, button_signal=None, update_signal self.task_finish_to_main_page = False self.static_config = ConfigSet.static_config self.ocr = None - self.logger = utils.Logger(logger_signal) + self.logger = utils.Logger(logger_signal, jsonify=kwargs.get("jsonify", False)) self.last_refresh_u2_time = 0 self.latest_img_array = None self.total_assault_difficulty_names = ["NORMAL", "HARD", "VERYHARD", "HARDCORE", "EXTREME", "INSANE", "TORMENT"] @@ -693,6 +693,9 @@ def init_config(self): except Exception as e: self.logger.error("Config initialization failed") self.logger.error(e.__str__()) + + import traceback + traceback.print_exc() return False def swipe(self, fx, fy, tx, ty, duration=None, post_sleep_time=0): diff --git a/core/config/config_set.py b/core/config/config_set.py index 0878af764..588bb4d2f 100644 --- a/core/config/config_set.py +++ b/core/config/config_set.py @@ -3,8 +3,6 @@ import re from core.config.generated_user_config import Config from core.config.generated_static_config import StaticConfig -from gui.util.customized_ui import BoundComponent -from gui.util.translator import baasTranslator as bt from dataclasses import asdict @@ -54,20 +52,32 @@ def get_server_mode(server): return 'JP' def get(self, key, default=None): - self._init_config() - value = getattr(self.config, key, default) - return bt.tr('ConfigTranslation', value) + try: + from gui.util.translator import baasTranslator as bt + self._init_config() + value = getattr(self.config, key, default) + return bt.tr('ConfigTranslation', value) + except ModuleNotFoundError: + self._init_config() + return getattr(self.config, key, default) def has(self, key): self._init_config() return hasattr(self.config, key) def set(self, key, value): - self._init_config() - value = bt.undo(value) - setattr(self.config, key, value) - self.save() - self.dynamic_update(key) + try: + from gui.util.translator import baasTranslator as bt + self._init_config() + value = bt.undo(value) + setattr(self.config, key, value) + self.save() + self.dynamic_update(key) + except ModuleNotFoundError: + self._init_config() + setattr(self.config, key, value) + self.save() + self.dynamic_update(key) def update(self, key, value): self.set(key, value) @@ -114,6 +124,7 @@ def inject(self, component, string_rule, attribute="setText"): :param attribute: Attribute to inject (default is setText) :return: BoundComponent, which can be ignored """ + from gui.util.customized_ui import BoundComponent bounded = BoundComponent(component, string_rule, self, attribute) self.inject_config_list.extend(re.findall(r'{(.*?)}', string_rule)) self.inject_comp_list.append(bounded) diff --git a/core/config/default_config.py b/core/config/default_config.py index 71fff346c..bb77015f4 100644 --- a/core/config/default_config.py +++ b/core/config/default_config.py @@ -338,7 +338,7 @@ DEFAULT_CONFIG = """ { - "name": "新的配置", + "name": "New Config", "purchase_arena_ticket_times": "0", "screenshot_interval": "0.3", "autostart": false, @@ -3628,14 +3628,6 @@ "JP_name": "ホシノ(臨戦)", "JP_implementation": true }, - { - "CN_name": "星野(临战)", - "CN_implementation": false, - "Global_name": "Hoshino (Battle)", - "Global_implementation": false, - "JP_name": "ホシノ(臨戦)", - "JP_implementation": true - }, { "CN_name": "萌绘(泳装)", "CN_implementation": false, diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index fb8f8cb44..3768c630b 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -13,90 +13,121 @@ import shutil import os -from core.exception import OcrInternalError -from dulwich import porcelain -from dulwich.repo import Repo import platform +import pygit2 +from pygit2 import Commit + +from core.exception import OcrInternalError +from pygit2.enums import ResetMode -if sys.platform not in ['win32', 'linux', 'darwin']: +if sys.platform not in ["win32", "linux", "darwin"]: raise Exception("Ocr Unsupported platform " + sys.platform) OCR_SERVER_PREBUILD_URL = "https://gitee.com/pur1fy/baas_-cpp_prebuild.git" SERVER_INSTALLER_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) -SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, 'bin') - -branch = { - 'win32': { - 'amd64': 'windows-x64', - }, - 'linux': { - 'x86_64': 'linux-x64', - }, - 'darwin': { - 'arm64': 'macos-arm64', - }, +SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, "bin") + +branch_map = { + "win32": {"amd64": "windows-x64"}, + "linux": {"x86_64": "linux-x64"}, + "darwin": {"arm64": "macos-arm64"}, } -branch = branch[sys.platform] +arch_map = branch_map[sys.platform] arch = platform.machine().lower() -if arch not in branch: +if arch not in arch_map: raise Exception("Unsupported machine architecture " + arch) -branch = branch[arch] +branch = arch_map[arch] def check_git(logger): - if not os.path.exists(SERVER_BIN_DIR + '/.git'): + """ + 检查并更新 OCR Server 的本地 git 仓库 + """ + git_dir = os.path.join(SERVER_BIN_DIR, ".git") + if not os.path.exists(git_dir): + clone_repo(logger) + return + + logger.info("Ocr Server Update check.") + try: + repo = pygit2.Repository(SERVER_BIN_DIR) + local_sha = str(repo.head.target) + except Exception: + logger.warning("Git Repo corrupted, remove .git folder and reinstall.") + shutil.rmtree(git_dir, ignore_errors=True) clone_repo(logger) + return + + try: + git = pygit2.Repository() + remote = git.remotes.create_anonymous(OCR_SERVER_PREBUILD_URL) + refs = {head.get("name"): head.get("oid") for head in remote.ls_remotes()} + remote_sha = str(refs.get(f"refs/heads/{branch}", None)) + except Exception as e: + raise OcrInternalError(f"Failed to fetch remote info: {e}") + + if not remote_sha: + logger.warning(f"Remote branch '{branch}' not found.") + return + + logger.info(f"remote_sha: {remote_sha}") + logger.info(f"local_sha : {local_sha}") + + if local_sha == remote_sha: + logger.info("Ocr Server No updates available.") + return + + logger.info("Pulling updates from the remote repository...") + + try: + remote_obj = ( + repo.remotes["origin"] + if "origin" in list(repo.remotes.names()) + else repo.remotes.create("origin", OCR_SERVER_PREBUILD_URL) + ) + refspec = f"refs/heads/{branch}:refs/remotes/origin/{branch}" + remote_obj.fetch(refspecs=[refspec]) + remote_commit = repo.revparse_single(f"refs/remotes/origin/{branch}") + if not isinstance(remote_commit, Commit): + remote_commit = repo[remote_commit.target] + repo.reset(remote_commit.id, ResetMode.HARD) + repo.checkout_tree(remote_commit.tree) + updated_sha = str(repo.head.target) + + except KeyError as ke: + logger.error(f"Branch {branch} not found in remote repository.") + raise OcrInternalError(f"Remote branch '{branch}' does not exist: {ke}") + + except Exception as e: + logger.error("Failed to update the BAAS_ocr_server.") + raise OcrInternalError(f"Update failed: {e}") + + if updated_sha == remote_sha: + logger.info("Ocr Server Update success.") else: - logger.info("Ocr Server Update check.") - try: - repo = Repo(SERVER_BIN_DIR) - # Get local SHA - local_sha = repo.head().decode('ascii') - except Exception: - logger.warning("Git Repo corrupted, remove .git folder and reinstall.") - shutil.rmtree(SERVER_BIN_DIR + '/.git') - clone_repo(logger) - return - # Get remote SHA - remote_refs = porcelain.ls_remote(OCR_SERVER_PREBUILD_URL) - remote_sha = remote_refs.get(b'refs/heads/' + branch.encode('ascii')).decode('ascii') - - logger.info(f"remote_sha: {remote_sha}") - logger.info(f"local_sha : {local_sha}") - - if local_sha == remote_sha: - logger.info("Ocr Server No updates available.") - else: - logger.info("Pulling updates from the remote repository...") - # Reset the local repository to the state of the remote repository - porcelain.reset(repo, mode='hard') - # Pull the latest changes from the remote repository - for i in range(1, 4): - try: - porcelain.pull(repo, OCR_SERVER_PREBUILD_URL, branch, protocol_version=0) - break - except Exception as e: - if i == 3: - raise OcrInternalError("Failed to update the BAAS_ocr_server. Please check your network") - logger.error(f"Failed to update BAAS_ocr_server, retrying... {i}") - logger.error(e) - updated_local_sha = repo.head().decode('ascii') - if updated_local_sha == remote_sha: - logger.info("Ocr Server Update success.") - else: - logger.warning("Failed to update the BAAS_ocr_server, please check your network.") + logger.warning("Failed to update the BAAS_ocr_server, please check your network.") def clone_repo(logger): logger.info("Installing Ocr Server, please hang on...") + + if os.path.exists(SERVER_BIN_DIR) and os.listdir(SERVER_BIN_DIR): + logger.warning("Target directory not empty, removing old files...") + shutil.rmtree(SERVER_BIN_DIR) + for i in range(1, 4): try: - porcelain.clone(OCR_SERVER_PREBUILD_URL, SERVER_BIN_DIR, branch=branch) + pygit2.clone_repository( + OCR_SERVER_PREBUILD_URL, + SERVER_BIN_DIR, + checkout_branch=branch, + ) break except Exception as e: if i == 3: raise OcrInternalError("Failed to install the BAAS_ocr_server. Please check your network") logger.error(f"Failed to install BAAS_ocr_server, retrying... {i}") - logger.error(e.__str__()) + logger.error(str(e)) + logger.info("Ocr Server Install success.") diff --git a/core/scheduler.py b/core/scheduler.py index b02db3b1a..32c59f96d 100644 --- a/core/scheduler.py +++ b/core/scheduler.py @@ -118,6 +118,7 @@ def update_valid_task_queue(self): _valid_event = sorted(_valid_event, key=lambda x: x['priority']) # sort by priority self._valid_task_queue = [] + self._waitingTaskDisplayQueue = [] for i in range(0, len(_valid_event)): self._waitingTaskDisplayQueue.append(_valid_event[i]['event_name']) thisTask = { diff --git a/core/utils.py b/core/utils.py index 9775aa5c0..d82494fad 100644 --- a/core/utils.py +++ b/core/utils.py @@ -3,6 +3,19 @@ import threading from typing import Union from datetime import datetime, timedelta, timezone +import queue + +# Status Text: INFO, WARNING, ERROR, CRITICAL +STATUS_TERMINAL = [' INFO', ' WARNING', ' ERROR', 'CRITICAL'] +STATUS_HTML = ['    INFO', ' WARNING', '   ERROR', 'CRITICAL'] + +# Status Color: Blue, Orange, Red, Purple +STATUS_COLOR = ['#2d8cf0', '#f90', '#ed3f14', '#3e0480'] + +# Status HTML: status +STATUS_HTML_EMB = [ + f'{status}' + for _color, status in zip(STATUS_COLOR, STATUS_HTML)] def delay(wait=1): @@ -25,23 +38,28 @@ def call_it(): return decorator + def detach(func): def wrapper(*args, **kwargs): threading.Thread(target=func, args=args[:-1], kwargs=kwargs).start() + return wrapper + class Logger: """ Logger class for logging """ - def __init__(self, logger_signal): + def __init__(self, logger_signal, jsonify=False): """ :param logger_signal: Logger Box signal """ # Init logger box signal, logs and logger # logger box signal is used to output log to logger box self.logs = "" + self.jsonify = jsonify + self.log_collector = queue.Queue() self.logger_signal = logger_signal self.logger = logging.getLogger("BAAS_Logger") formatter = logging.Formatter("%(levelname)8s |%(asctime)20s | %(message)s ") @@ -63,29 +81,31 @@ def __out__(self, message: str, level: int = 1, raw_print=False) -> None: self.logger_signal.emit(message) return + if self.jsonify: + self.log_collector.put({ + "time": datetime.now(), + "level": level, + "message": message + }) + print( + f'{STATUS_TERMINAL[level - 1]} | {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | {message}') + return + while len(logging.root.handlers) > 0: logging.root.handlers.pop() - # Status Text: INFO, WARNING, ERROR, CRITICAL - status = ['    INFO', ' WARNING', '   ERROR', 'CRITICAL'] - # Status Color: Blue, Orange, Red, Purple - statusColor = ['#2d8cf0', '#f90', '#ed3f14', '#3e0480'] - # Status HTML: status - statusHtml = [ - f'{status}' - for _color, status in zip(statusColor, status)] # If logger box is not None, output log to logger box # else output log to console if self.logger_signal is not None: message = message.replace('\n', '
').replace(' ', ' ') adding = (f''' -
- {statusHtml[level - 1]} | {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | {message} +
+ {STATUS_HTML_EMB[level - 1]} | {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | {message}
''') self.logs += adding self.logger_signal.emit(adding) else: - print(f'{statusHtml[level - 1]} | {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | {message}') + print(f'{STATUS_HTML_EMB[level - 1]} | {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | {message}') def info(self, message: str) -> None: """ @@ -232,6 +252,7 @@ def is_nearby_group(coord, group, abs_x=10, abs_y=10): return True return False + def get_nearest_hour(target_hour): now = datetime.now(timezone.utc) current_hour = now.hour @@ -241,7 +262,7 @@ def get_nearest_hour(target_hour): hour_delta = diff - 24 else: hour_delta = diff - else: # target_hour < current_hour + else: # target_hour < current_hour diff = current_hour - target_hour if diff > 12: hour_delta = 24 - diff @@ -250,4 +271,3 @@ def get_nearest_hour(target_hour): nearest_time = (now + timedelta(hours=hour_delta)).replace(minute=0, second=0, microsecond=0) return nearest_time - diff --git a/deploy/installer/installer.py b/deploy/installer/installer.py index eac30c1c7..13fcc96cf 100644 --- a/deploy/installer/installer.py +++ b/deploy/installer/installer.py @@ -51,15 +51,14 @@ import tomli_w from copy import deepcopy from alive_progress import alive_bar -# from dulwich import porcelain -# from dulwich.repo import Repo + from easydict import EasyDict as eDict from halo import Halo from loguru import logger from pygit2 import clone_repository, Repository, RemoteCallbacks, GIT_RESET_HARD, GitError -from toml_config import TOML_Config +from toml_config import TOML_Config, DEFAULT_SETTINGS from mirrorc_update.mirrorc_updater import MirrorC_Updater from const import GetShaMethod, get_remote_sha_methods, REPO_BRANCH @@ -72,48 +71,6 @@ # ==================== Default Settings ===================== -DEFAULT_SETTINGS = { - "General": { - "mirrorc_cdk": "", - "current_BAAS_version": "", - "current_BAAS_Cpp_version": "", - "get_remote_sha_method": "", - "dev": False, - "refresh": False, - "launch": False, - "force_launch": False, - "internal_launch": False, - "no_build": True, - "debug": False, - "use_dynamic_update": False, - "source_list": [ - "https://pypi.tuna.tsinghua.edu.cn/simple", - "https://mirrors.ustc.edu.cn/pypi/web/simple", - "https://mirrors.aliyun.com/pypi/simple", - "https://pypi.doubanio.com/simple", - "https://mirrors.huaweicloud.com/repository/pypi/simple", - "https://mirrors.cloud.tencent.com/pypi/simple", - "https://mirrors.163.com/pypi/simple", - "https://pypi.python.org/simple", - "https://pypi.org/simple", - ], - "package_manager": "pip", - "runtime_path": "default", - "linux_pwd": "", - }, - "URLs": { - "REPO_URL_HTTP": "https://gitee.com/pur1fy/blue_archive_auto_script.git", - "GET_PIP_URL": "https://gitee.com/pur1fy/blue_archive_auto_script_assets/raw/master/get-pip.py", - "GET_UPX_URL": "https://ghp.ci/https://github.com/upx/upx/releases/download/v4.2.4/upx-4.2.4-win64.zip", - "GET_ENV_PATCH_URL": "https://gitee.com/pur1fy/blue_archive_auto_script_assets/raw/master/env_patch.zip", - "GET_PYTHON_URL": "https://gitee.com/pur1fy/blue_archive_auto_script_assets/raw/master/python-3.9.13-embed-amd64.zip", - }, - "Paths": { - "BAAS_ROOT_PATH": "", - "TMP_PATH": "tmp", - "TOOL_KIT_PATH": "toolkit", - }, -} repo = None diff --git a/deploy/installer/toml_config.py b/deploy/installer/toml_config.py index 38e2ad992..aec02def8 100644 --- a/deploy/installer/toml_config.py +++ b/deploy/installer/toml_config.py @@ -1,6 +1,49 @@ import os import tomli_w +DEFAULT_SETTINGS = { + "General": { + "mirrorc_cdk": "", + "current_BAAS_version": "", + "current_BAAS_Cpp_version": "", + "get_remote_sha_method": "", + "dev": False, + "refresh": False, + "launch": False, + "force_launch": False, + "internal_launch": False, + "no_build": True, + "debug": False, + "use_dynamic_update": False, + "source_list": [ + "https://pypi.tuna.tsinghua.edu.cn/simple", + "https://mirrors.ustc.edu.cn/pypi/web/simple", + "https://mirrors.aliyun.com/pypi/simple", + "https://pypi.doubanio.com/simple", + "https://mirrors.huaweicloud.com/repository/pypi/simple", + "https://mirrors.cloud.tencent.com/pypi/simple", + "https://mirrors.163.com/pypi/simple", + "https://pypi.python.org/simple", + "https://pypi.org/simple", + ], + "package_manager": "pip", + "runtime_path": "default", + "linux_pwd": "", + }, + "URLs": { + "REPO_URL_HTTP": "https://gitee.com/pur1fy/blue_archive_auto_script.git", + "GET_PIP_URL": "https://gitee.com/pur1fy/blue_archive_auto_script_assets/raw/master/get-pip.py", + "GET_UPX_URL": "https://ghp.ci/https://github.com/upx/upx/releases/download/v4.2.4/upx-4.2.4-win64.zip", + "GET_ENV_PATCH_URL": "https://gitee.com/pur1fy/blue_archive_auto_script_assets/raw/master/env_patch.zip", + "GET_PYTHON_URL": "https://gitee.com/pur1fy/blue_archive_auto_script_assets/raw/master/python-3.9.13-embed-amd64.zip", + }, + "Paths": { + "BAAS_ROOT_PATH": "", + "TMP_PATH": "tmp", + "TOOL_KIT_PATH": "toolkit", + }, +} + try: import tomllib except ModuleNotFoundError: diff --git a/gui/components/expand/baasUpdateConfig.py b/gui/components/expand/baasUpdateConfig.py index e2a9842db..6ee585025 100644 --- a/gui/components/expand/baasUpdateConfig.py +++ b/gui/components/expand/baasUpdateConfig.py @@ -1,9 +1,11 @@ import binascii +import tempfile import threading import time import webbrowser +from pathlib import Path -import dulwich +import pygit2 import requests from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor @@ -35,7 +37,7 @@ def run(self): elif self.method == GetShaMethod.MIRRORC_API: success, sha_value = self.mirrorc_api_get_latest_sha() elif self.method == GetShaMethod.PYGIT2: - success, sha_value = self.dulwich_get_latest_sha(self.config) + success, sha_value = self.pygit2_get_latest_sha(self.config) else: success = False sha_value = self.tr("未知方法") @@ -71,31 +73,53 @@ def mirrorc_api_get_latest_sha(): return False, str(e) @staticmethod - def dulwich_get_latest_sha(data): + def pygit2_get_latest_sha(data): url = data["url"] branch = data["branch"] target_ref = f"refs/heads/{branch}" try: - remote_refs = dulwich.porcelain.ls_remote(url) - for ref_name, sha in remote_refs.items(): - decoded_ref = ref_name.decode("utf-8") + # 创建一个临时 bare 仓库 + tmpdir = tempfile.mkdtemp(prefix="pygit2-remote-") + repo = pygit2.init_repository(tmpdir, bare=True) + + # 添加远程仓库 + try: + remote = repo.remotes["origin"] + except KeyError: + remote = repo.remotes.create("origin", url) + + # 拉取远程引用(不下载对象) + remote.fetch() # 轻量 fetch,默认不会 checkout + + # 获取远程引用表 + remote_refs = remote.ls_remotes() + + # 遍历匹配分支引用 + for ref_name, oid in remote_refs: + decoded_ref = ref_name if decoded_ref == target_ref: - if len(sha) == 20: - return True, binascii.hexlify(sha).decode("utf-8") - try: - hex_str = sha.decode("utf-8") - if len(hex_str) == 40: - return True, hex_str - except: - pass - return True, binascii.hexlify(sha[:20]).decode("utf-8") - ref = f"refs/heads/{branch}", - sha = remote_refs[ref.encode("utf-8")] - return True, binascii.hexlify(sha[:20]).decode("utf-8") + sha = str(oid) + return True, sha + + # 如果没找到直接尝试 refs/remotes/origin/ + ref_full = f"refs/remotes/origin/{branch}" + if ref_full in repo.references: + oid = repo.references[ref_full].target + sha = str(oid) + return True, sha + + return False, f"Branch '{branch}' not found in remote." + except Exception as e: return False, str(e) - + finally: + # 删除临时目录 + try: + import shutil + shutil.rmtree(tmpdir) + except Exception: + pass class MirrorCCDKTestThread(QThread): finished = pyqtSignal(RequestReturn, bool) @@ -349,10 +373,14 @@ def _init_data_and_state(self): def _get_local_version(self): self._BAAS_local_version_sha = self.config.get("General.current_BAAS_version", None) method = "setup.toml" + if not self._BAAS_local_version_sha: try: - self._repo = dulwich.repo.Repo(".") - self._BAAS_local_version_sha = self._repo.head().decode("utf-8") + repo_path = Path.cwd() + repo = pygit2.Repository(repo_path) + self._repo = repo + + self._BAAS_local_version_sha = str(repo.head.target) method = ".git" except Exception: method = None @@ -360,7 +388,13 @@ def _get_local_version(self): if self._BAAS_local_version_sha: sha_display = self._BAAS_local_version_sha self._BAAS_local_version_label.setText(sha_display) - method_text = f"({self.tr('从 setup.toml 读取')})" if method == "setup.toml" else f"({self.tr('从 .git 读取')})" + + if method == "setup.toml": + method_text = f"({self.tr('从 setup.toml 读取')})" + elif method == ".git": + method_text = f"({self.tr('从 .git 读取')})" + else: + method_text = "" self._BAAS_local_version_method_label.setText(method_text) else: self._BAAS_local_version_label.setText(self.tr("无法获取")) @@ -581,7 +615,7 @@ def _detect_update_method_thread(self): method_type = config["method"] is_ok, sha = (TestGetRemoteShaMethodWorker.github_api_get_latest_sha(config) if method_type == GetShaMethod.GITHUB_API - else TestGetRemoteShaMethodWorker.dulwich_get_latest_sha(config)) + else TestGetRemoteShaMethodWorker.pygit2_get_latest_sha(config)) if is_ok: self._BAAS_remote_version_sha = sha self._BAAS_remote_version_get_method = "git" diff --git a/main.py b/main.py index f652d6844..06509708c 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ import json import os +import traceback from core.ocr import ocr from core.utils import Logger @@ -8,21 +9,23 @@ from core.ocr.baas_ocr_client.server_installer import check_git class Main: - def __init__(self, logger_signal=None, ocr_needed=None): + def __init__(self, logger_signal=None, ocr_needed=None, **kwargs): self.ocr_needed = ocr_needed self.ocr = None - self.logger = Logger(logger_signal) + self.logger = Logger(logger_signal, jsonify=kwargs.get("jsonify", False)) self.project_dir = os.path.abspath(os.path.dirname(__file__)) self.logger.info(self.project_dir) - self.init_all_data() + if not kwargs.get("lazy_data", False): + self.init_all_data() self.threads = {} def init_all_data(self): if not self.init_ocr(): self.logger.error("Ocr Init Incomplete Please restart .") - return + return False self.init_static_config() self.logger.info("-- All Data Initialization Complete Script ready--") + return True def init_ocr(self): try: @@ -70,7 +73,7 @@ def init_static_config(self): return True except Exception as e: self.logger.error("Static Config initialization failed") - self.logger.error(e.__str__()) + self.logger.error(traceback.format_exc()) return False def operate_dict(self, dic): diff --git a/main.service.py b/main.service.py new file mode 100644 index 000000000..41272bee4 --- /dev/null +++ b/main.service.py @@ -0,0 +1,64 @@ +import argparse +import os + +import uvicorn + +DEFAULT_HOST = os.getenv("BAAS_SERVICE_HOST", "127.0.0.1") +DEFAULT_PORT = int(os.getenv("BAAS_SERVICE_PORT", "8190")) + +import logging, re + +ANSI_ESCAPE = re.compile(r'\x1b\[([0-9;]*[mGKH])') + +STATUS_TERMINAL = { + logging.INFO: " INFO", + logging.WARNING: " WARNING", + logging.ERROR: " ERROR", + logging.CRITICAL: "CRITICAL", +} + +class PlainFormatter(logging.Formatter): + def format(self, record): + level = STATUS_TERMINAL.get(record.levelno, " INFO") + log_fmt = f"{level} | %(asctime)s | %(message)s" + formatter = logging.Formatter(log_fmt, "%Y-%m-%d %H:%M:%S") + output = formatter.format(record) + + return ANSI_ESCAPE.sub('', output) + + +handler = logging.StreamHandler() +handler.setFormatter(PlainFormatter()) + +root = logging.getLogger() +root.setLevel(logging.INFO) +root.handlers = [handler] + + + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Start BAAS service mode backend") + parser.add_argument("--host", default=DEFAULT_HOST, help="Host to bind (default: %(default)s)") + parser.add_argument("--port", type=int, default=DEFAULT_PORT, help="Port to bind (default: %(default)s)") + parser.add_argument("--reload", action="store_true", help="Enable auto-reload (development only)") + parser.add_argument("--log-level", default="info", help="Uvicorn log level") + return parser.parse_args() + + +def main() -> None: + args = parse_args() + config = uvicorn.Config( + "service.app:app", + host=args.host, + port=args.port, + reload=args.reload, + log_level=args.log_level, + log_config=None + ) + server = uvicorn.Server(config) + server.run() + + +if __name__ == "__main__": + main() diff --git a/requirements-linux.txt b/requirements-linux.txt index 21ca352ee..bb54ed729 100644 --- a/requirements-linux.txt +++ b/requirements-linux.txt @@ -3,7 +3,7 @@ PyQt5 == 5.15.11 numpy < 2.0 av == 12.0.0 imgaug -dulwich +pygit2 adbutils == 2.2.1 uiautomator2 == 2.16.23 opencv-python == 4.8.1.78 diff --git a/requirements.service.txt b/requirements.service.txt new file mode 100644 index 000000000..4d90f146c --- /dev/null +++ b/requirements.service.txt @@ -0,0 +1,35 @@ +# =========================== # +# Core Utils # +numpy < 2.0 # +adbutils == 2.2.1 # +uiautomator2 == 2.16.23 # +opencv-python == 4.8.1.78 # +# =========================== # + +# =========================== # +# Process & Screenshot # +psutil # +requests # +# =========================== # + +# =========================== # +# Toml Config Process # +tomli == 2.2.1 # +tomli_w == 1.2.0 # +# =========================== # + +# =========================== # +# Steam Server Specific # +mss == 10.0.0 # +PyAutoGUI == 0.9.54 # +# =========================== # + +# =========================== # +# Service Specific # +pygit2 # +fastapi # +uvicorn # +websockets # +watchfiles # +cryptography # +# =========================== # diff --git a/requirements.txt b/requirements.txt index 0b14a1540..1d9a6699f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,7 +14,7 @@ PyQt-Fluent-Widgets == 1.2.0 #windows installer auto build pyinstaller requests -dulwich +pygit2 psutil tqdm diff --git a/service.example.py b/service.example.py index ed7acb7c9..a207e3f10 100644 --- a/service.example.py +++ b/service.example.py @@ -4,12 +4,16 @@ def main(): - main = Main(ocr_needed=["NUM", "Global", "JP"]) # 日服也必须要 Global,否则会崩溃 - config = ConfigSet(config_dir="jp_hoshino") # 修改为自己的配置目录名 - baas = Baas_thread(config, None, None, None) + main = Main(ocr_needed=["en-us", "zh-cn"], jsonify=True) # 日服也必须要 Global,否则会崩溃 + config = ConfigSet(config_dir="default_config") # 修改为自己的配置目录名 + baas = Baas_thread(config, None, None, None, jsonify=True) + # 得到Logger + # logger=baas.logger + + # 初始化数据 baas.init_all_data() baas.ocr = main.ocr # type: ignore - + # # 应用启动 baas.thread_starter() diff --git a/service/__init__.py b/service/__init__.py new file mode 100644 index 000000000..5068dd815 --- /dev/null +++ b/service/__init__.py @@ -0,0 +1,4 @@ +from .app import app, context + +__all__ = ['app', 'context'] + diff --git a/service/app.py b/service/app.py new file mode 100644 index 000000000..4d2a88cee --- /dev/null +++ b/service/app.py @@ -0,0 +1,364 @@ +from __future__ import annotations + +import contextlib +import asyncio +import os +import secrets +import time +from pathlib import Path +from typing import Any, Dict, Union + +from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect +from starlette.middleware.cors import CORSMiddleware + +from .context import ServiceContext +from .encryption import AuthenticationError, CipherBox, HandshakeResponse, HandshakeSession +from .messages import ( + CommandMessage, + ProviderRequest, + SyncPatchMessage, + SyncPullMessage, +) + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +context = ServiceContext(PROJECT_ROOT) + +_SHARED_SECRET: Union[str, None] = None + + +def _load_shared_secret() -> str: + secret = os.getenv("BAAS_SERVICE_SECRET") + if secret: + return secret + fallback = PROJECT_ROOT / "config" / "service.secret" + if fallback.exists(): + return fallback.read_text(encoding="utf-8").strip() + (PROJECT_ROOT / "config").mkdir(exist_ok=True) + token = secrets.token_hex(16) + fallback.write_bytes(token.encode("utf-8")) + return token + + +@contextlib.asynccontextmanager +async def lifespan(app: FastAPI): + global _SHARED_SECRET + _SHARED_SECRET = _load_shared_secret() + await context.startup() + + yield + + await context.shutdown() + + +app = FastAPI(title="BAAS Service Mode", lifespan=lifespan) + +# Allow all origins +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +@app.get("/health") +async def health() -> Dict[str, Any]: + statuses = context.runtime.current_status() + return {"ok": True, "statuses": statuses} + + +async def _perform_handshake(websocket: WebSocket) -> tuple[HandshakeSession, CipherBox]: + if _SHARED_SECRET is None: + raise RuntimeError("Shared secret not initialised") + await websocket.accept() + session = HandshakeSession(_SHARED_SECRET) + challenge = session.issue_challenge() + await websocket.send_json({"type": "handshake", "challenge": challenge.challenge, "algorithm": challenge.algorithm}) + raw = await websocket.receive_json() + response = HandshakeResponse(**raw) + session.verify(response.response) + await websocket.send_json({"type": "handshake_ok"}) + return session, session.build_cipher() + + +async def _sync_sender(websocket: WebSocket, cipher: CipherBox, queue: asyncio.Queue) -> None: + try: + while True: + payload = dict(await queue.get()) + payload.setdefault("direction", "push") + await websocket.send_text(cipher.encrypt_json(payload)) + except asyncio.CancelledError: + pass + + +@app.websocket("/ws/sync") +async def websocket_sync(websocket: WebSocket) -> None: + queue = None + sender_task = None + try: + _, cipher = await _perform_handshake(websocket) + queue = await context.config_manager.subscribe_updates() + sender_task = asyncio.create_task(_sync_sender(websocket, cipher, queue)) + while True: + encrypted = await websocket.receive_text() + message = cipher.decrypt_json(encrypted) + msg_type = message.get("type") + if msg_type == "pull": + data = SyncPullMessage(**message) + snapshot = await context.config_manager.get_snapshot(data.resource, data.resource_id) + response = { + "type": "snapshot", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": snapshot.timestamp, + "data": snapshot.data, + } + await websocket.send_text(cipher.encrypt_json(response)) + elif msg_type == "patch": + data = SyncPatchMessage(**message) + await context.config_manager.apply_patch( + data.resource, data.resource_id, data.ops, data.timestamp, origin="frontend" + ) + response = { + "type": "patch_ack", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": data.timestamp, + } + await websocket.send_text(cipher.encrypt_json(response)) + elif msg_type == "list": + snapshot = await context.config_manager.get_config_list() + response = { + "type": "config_list", + "timestamp": snapshot.timestamp, + "data": snapshot.data, + } + await websocket.send_text(cipher.encrypt_json(response)) + else: + raise HTTPException(status_code=400, detail=f"Unsupported sync message: {msg_type}") + except (AuthenticationError, HTTPException) as exc: + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: + import traceback + traceback.print_exc() + await websocket.close(code=1011, reason=str(exc)) + finally: + if sender_task: + sender_task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await sender_task + if queue is not None: + context.config_manager.unsubscribe_updates(queue) + + +async def _provider_sender(websocket: WebSocket, cipher: CipherBox, queue: asyncio.Queue, envelope_type: str) -> None: + try: + while True: + payload = await queue.get() + if envelope_type == "status": + response = {"type": envelope_type, "status": payload} + else: + response = {"type": envelope_type, "entry": payload} + await websocket.send_text(cipher.encrypt_json(response)) + except asyncio.CancelledError: + pass + + +@app.websocket("/ws/provider") +async def websocket_provider(websocket: WebSocket) -> None: + log_queue = status_queue = None + log_task = status_task = None + try: + _, cipher = await _perform_handshake(websocket) + history = context.log_manager.get_history() + scopes = context.log_manager.get_scopes() + await websocket.send_text(cipher.encrypt_json({"type": "logs_full", "scopes": scopes, "entries": history})) + await websocket.send_text(cipher.encrypt_json({"type": "status", "status": context.runtime.current_status()})) + if context.runtime.is_all_data_initialized: + await websocket.send_text( + cipher.encrypt_json({"type": "status", "status": {"is_all_data_initialized": True}}) + ) + log_queue = await context.log_manager.subscribe() + status_queue = await context.runtime.subscribe_status() + log_task = asyncio.create_task(_provider_sender(websocket, cipher, log_queue, "log")) + status_task = asyncio.create_task(_provider_sender(websocket, cipher, status_queue, "status")) + while True: + encrypted = await websocket.receive_text() + message = cipher.decrypt_json(encrypted) + req_type = message.get("type") + if req_type == "static_request": + ProviderRequest(**message) + snapshot = await context.config_manager.get_static_snapshot() + await websocket.send_text( + cipher.encrypt_json( + { + "type": "static_snapshot", + "timestamp": snapshot.timestamp, + "data": snapshot.data, + } + ) + ) + elif req_type == "status_request": + await websocket.send_text( + cipher.encrypt_json({"type": "status", "status": context.runtime.current_status()})) + else: + raise HTTPException(status_code=400, detail=f"Unsupported provider message: {req_type}") + except (AuthenticationError, HTTPException) as exc: + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: + await websocket.close(code=1011, reason=str(exc)) + finally: + for task in (log_task, status_task): + if task: + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task + if log_queue is not None: + context.log_manager.unsubscribe(log_queue) + if status_queue is not None: + context.runtime.unsubscribe_status(status_queue) + + +@app.websocket("/ws/trigger") +async def websocket_trigger(websocket: WebSocket) -> None: + try: + _, cipher = await _perform_handshake(websocket) + while True: + encrypted = await websocket.receive_text() + message = cipher.decrypt_json(encrypted) + cmd = CommandMessage(**message) + response_payload: Dict[str, Any] + try: + if cmd.command == "start_scheduler": + if not cmd.config_id: + raise ValueError("config_id is required for start_scheduler") + result = await context.runtime.start_scheduler(cmd.config_id, + set_log=context.ensure_runtime_logger_attached) + response_payload = {"status": "ok", "data": result} + elif cmd.command == "stop_scheduler": + if not cmd.config_id: + raise ValueError("config_id is required for stop_scheduler") + result = await context.runtime.stop_scheduler(cmd.config_id) + response_payload = {"status": "ok", "data": result} + elif cmd.command == "solve": + if not cmd.config_id: + raise ValueError("config_id is required for solve") + task = cmd.payload.get("task") + if not task: + raise ValueError("task is required for solve command") + result = await context.runtime.solve_task(cmd.config_id, task, + set_log=context.ensure_runtime_logger_attached) + response_payload = {"status": "ok", "data": result} + elif cmd.command.startswith("start_"): + if not cmd.config_id: + raise ValueError(f"config_id is required for command '{cmd.command}'") + result = await context.runtime.solve_task(cmd.config_id, cmd.command, + set_log=context.ensure_runtime_logger_attached) + response_payload = {"status": "ok", "data": result} + elif cmd.command.startswith("add_config"): + name = cmd.payload.get("name") + server = cmd.payload.get("server") + if not server or not name: + raise ValueError("server and name are required for add_config") + result = await context.runtime.add_config(name, server) + response_payload = {"status": "ok", "data": result} + elif cmd.command.startswith("remove_config"): + id = cmd.payload.get("id") + if not id: + raise ValueError("id is required for remove_config") + result = await context.runtime.remove_config(id) + response_payload = {"status": "ok", "data": result} + elif cmd.command == "detect_adb": + result = await context.runtime.detect_adb() + response_payload = {"status": "ok", "data": {"addresses": result}} + elif cmd.command == "valid_cdk": + result = await context.runtime.valid_cdk(cmd.payload["cdk"]) + response_payload = {"status": "ok", "data": result} + elif cmd.command == "test_all_sha": + result = await context.runtime.test_all_sha() + response_payload = {"status": "ok", "data": result} + elif cmd.command == "check_for_update": + result = await context.runtime.check_for_update() + response_payload = {"status": "ok", "data": result} + elif cmd.command == "update_setup_toml": + result = await context.runtime.check_for_update() + response_payload = {"status": "ok", "data": result} + elif cmd.command == "status": + response_payload = {"status": "ok", "data": context.runtime.current_status()} + else: + raise ValueError(f"Unsupported command '{cmd.command}'") + except Exception as inner_exc: # noqa: BLE001 - convert to payload + response_payload = {"status": "error", "error": str(inner_exc)} + await websocket.send_text( + cipher.encrypt_json( + { + "type": "command_response", + "command": cmd.command, + **response_payload, + "timestamp": cmd.timestamp, + } + ) + ) + except (AuthenticationError, HTTPException) as exc: + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: + await websocket.close(code=1011, reason=str(exc)) + + +async def _heartbeat_sender(websocket: WebSocket, cipher: CipherBox, interval: float) -> None: + try: + while True: + payload = { + "type": "heartbeat", + "timestamp": time.time() + } + await websocket.send_text(cipher.encrypt_json(payload)) + await asyncio.sleep(interval) + except asyncio.CancelledError: + pass + except WebSocketDisconnect: + pass + except RuntimeError: + pass + + +async def _heartbeat_receiver(websocket: WebSocket, cipher: CipherBox) -> None: + try: + while True: + encrypted = await websocket.receive_text() + message = cipher.decrypt_json(encrypted) + if message.get("type") == "ping": + await websocket.send_text(cipher.encrypt_json({"type": "pong", "timestamp": time.time()})) + except asyncio.CancelledError: + pass + except WebSocketDisconnect: + pass + + +@app.websocket("/ws/heartbeat") +async def websocket_heartbeat(websocket: WebSocket) -> None: + sender_task = receiver_task = None + try: + _, cipher = await _perform_handshake(websocket) + sender_task = asyncio.create_task(_heartbeat_sender(websocket, cipher, 3.0)) + receiver_task = asyncio.create_task(_heartbeat_receiver(websocket, cipher)) + await asyncio.gather(sender_task, receiver_task) + except (AuthenticationError, HTTPException) as exc: + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: + await websocket.close(code=1011, reason=str(exc)) + finally: + for task in (sender_task, receiver_task): + if task: + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task diff --git a/service/broadcast.py b/service/broadcast.py new file mode 100644 index 000000000..32a63d136 --- /dev/null +++ b/service/broadcast.py @@ -0,0 +1,48 @@ +import asyncio +import threading +from typing import Any, List, Set, Union + + +class BroadcastChannel: + """Simple multi-consumer broadcast based on asyncio queues.""" + + def __init__(self, loop: Union[asyncio.AbstractEventLoop, None] = None, max_queue_size: int = 128) -> None: + self._loop = loop + self._max_queue_size = max_queue_size + self._subscribers: Set[asyncio.Queue] = set() + self._lock = threading.Lock() + + def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + + def subscribe(self) -> asyncio.Queue: + queue: asyncio.Queue = asyncio.Queue(maxsize=self._max_queue_size) + with self._lock: + self._subscribers.add(queue) + return queue + + def unsubscribe(self, queue: asyncio.Queue) -> None: + with self._lock: + self._subscribers.discard(queue) + + async def publish(self, message: Any) -> None: + with self._lock: + subscribers: List[asyncio.Queue] = list(self._subscribers) + for queue in subscribers: + try: + queue.put_nowait(message) + except asyncio.QueueFull: + try: + queue.get_nowait() + except asyncio.QueueEmpty: + pass + try: + queue.put_nowait(message) + except asyncio.QueueFull: + # Give up if subscriber never consumes + pass + + def publish_threadsafe(self, message: Any) -> None: + if self._loop is None: + raise RuntimeError("Event loop is not set for BroadcastChannel") + asyncio.run_coroutine_threadsafe(self.publish(message), self._loop) diff --git a/service/config_manager.py b/service/config_manager.py new file mode 100644 index 000000000..3959518d2 --- /dev/null +++ b/service/config_manager.py @@ -0,0 +1,479 @@ +from __future__ import annotations + +import asyncio +import json +import os +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Dict, Iterable, List, Optional, Tuple, Union + +from watchfiles import Change, awatch + +from .broadcast import BroadcastChannel +from .diff import PatchConflictError, apply_patch, diff_documents +from .messages import PatchOperation, SyncPushPayload +from .utils import read_setup_toml, write_setup_toml + +ResourceKey = Tuple[str, Optional[str]] + + +@dataclass +class ResourceSnapshot: + data: Any + timestamp: float + + +REPO_URL_CHECK_UPDATE_METHOD_MAPPING = { + "https://github.com/pur1fying/blue_archive_auto_script.git": "github", + "https://gitee.com/pur1fy/blue_archive_auto_script.git": "gitee", + "https://gitcode.com/m0_74686738/blue_archive_auto_script.git": "gitcode", + "https://e.coding.net/g-jbio0266/baas/blue_archive_auto_script.git": "tencent_c_coding" +} + +REPO_URL_CHECK_UPDATE_METHOD_MAPPING_REV = { + v: k for k, v in REPO_URL_CHECK_UPDATE_METHOD_MAPPING.items() +} + + +class ConfigManager: + """Manages persisted configuration resources with diff support.""" + + def __init__(self, project_root: Path, loop: asyncio.AbstractEventLoop | None = None) -> None: + self._root = project_root + self._config_root = self._root / "config" + self._lock = asyncio.Lock() + self._snapshots: Dict[ResourceKey, ResourceSnapshot] = {} + self._mtimes: Dict[ResourceKey, float] = {} + self._update_bus = BroadcastChannel(loop) + self._loop = loop + self._gui_full: Union[Dict[str, Any], None] = None + self._setup_toml: Union[Dict[str, Any], None] = None + + def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._update_bus.set_loop(loop) + + # ------------------------------------------------------------------ + # basic filesystem helpers + # ------------------------------------------------------------------ + def _file_path(self, resource: str, resource_id: Optional[str]) -> Path: + if resource in ("config", "event"): + if not resource_id: + raise ValueError(f"resource_id required for resource '{resource}'") + return self._config_root / resource_id / f"{resource}.json" + if resource == "gui": + return self._config_root / "gui.json" + if resource == "static": + return self._config_root / "static.json" + if resource == "setup_toml": + return self._root / "setup.toml" + raise ValueError(f"Unsupported resource '{resource}'") + + def list_config_ids(self) -> List[str]: + ids: List[str] = [] + if not self._config_root.exists(): + return ids + for child in self._config_root.iterdir(): + if not child.is_dir(): + continue + config_file = child / "config.json" + event_file = child / "event.json" + if config_file.exists() and event_file.exists(): + ids.append(child.name) + return sorted(ids) + + async def get_config_list(self) -> ResourceSnapshot: + async with self._lock: + ids = self.list_config_ids() + return ResourceSnapshot(json.loads(json.dumps(ids)), time.time()) + + # ------------------------------------------------------------------ + # snapshot helpers + # ------------------------------------------------------------------ + def _project_gui(self, full_gui: Dict[str, Any]) -> Dict[str, Any]: + main_window = full_gui.get("MainWindow", {}) + fluent = full_gui.get("QFluentWidgets", {}) + return { + "MainWindow": { + "Language": main_window.get("Language"), + "DpiScale": main_window.get("DpiScale"), + }, + "QFluentWidgets": { + "ThemeMode": fluent.get("ThemeMode"), + }, + } + + def _project_setup_toml(self, full_setup_toml: Dict[str, Any]) -> Dict[str, Any]: + config_URLs = full_setup_toml.get("URLs", {}) + config_General = full_setup_toml.get("General", {}) + return { + "updateMethod": REPO_URL_CHECK_UPDATE_METHOD_MAPPING.get(config_URLs.get("REPO_URL_HTTP")), + "shaMethod": config_General.get("get_remote_sha_method"), + "mirrorcCdk": config_General.get("mirrorc_cdk") + } + + @staticmethod + def gen_event_formation_attr(data: dict) -> Union[dict, None]: + result = {} + BASE_DIR: str = "src/explore_task_data/activities" + for server_mode in ["CN", "JP", "Global"]: + current_event = data["current_game_activity"][server_mode] + if current_event is None: + result[server_mode] = None + continue + + file_path = os.path.join(BASE_DIR, f"{current_event}.json") + + if not os.path.exists(file_path): + result[server_mode] = None + return None + + with open(file_path, "r", encoding="utf-8") as f: + stage_data = json.load(f) + + ret = dict(activity_name=current_event, story=dict(), mission=dict(), challenge=dict()) + en2cn = { + "story": "故事", + "mission": "任务", + "challenge": "挑战", + } + + for key, value in stage_data.items(): + # 直接三大类的列表结构 + if key in ("story", "mission", "challenge"): + for i, v in enumerate(value, start=1): + ret[key][f"{en2cn[key]}{i}"] = v + continue + + # 其他带编号结构 + tp = None + if key.startswith("story"): + tp = "story" + elif key.startswith("mission"): + tp = "mission" + elif key.startswith("challenge"): + tp = "challenge" + if tp is None: + continue + + pos = key.find("_") + if pos == -1: + continue + + number = key[len(tp):pos] + name = f"{en2cn[tp]}{number}" + if "sss" in key: + name += "三星" + if "task" in key: + name += "成就任务" + + # 队伍信息 + team = "" + for s in value.get("start", []): + temp = s[0] + if temp: + team += temp + " " + if team.endswith(" "): + team = team[:-1] + ret[tp][name] = team + result[server_mode] = ret + return result + + def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: + if self._setup_toml is None: + self._setup_toml = {} + merged = json.loads(json.dumps(self._setup_toml)) + merged.setdefault("General", {}) + merged.setdefault("URLs", {}) + merged.setdefault("Paths", {}) + + shaMethod: Optional[str] = projection.get("shaMethod", None) + updateMethod: Optional[str] = projection.get("updateMethod", None) + mirrorcCdk: Optional[str] = projection.get("mirrorcCdk", None) + if shaMethod is not None: + merged["General"]["get_remote_sha_method"] = shaMethod + if updateMethod is not None: + merged["URLs"]["REPO_URL_HTTP"] = REPO_URL_CHECK_UPDATE_METHOD_MAPPING_REV[updateMethod] + if mirrorcCdk is not None: + merged["General"]["mirrorc_cdk"] = mirrorcCdk + + self._setup_toml = merged + return merged + + def _merge_gui(self, projection: Dict[str, Any]) -> Dict[str, Any]: + if self._gui_full is None: + self._gui_full = {} + merged = json.loads(json.dumps(self._gui_full)) # deep copy via json + merged.setdefault("MainWindow", {}) + merged.setdefault("QFluentWidgets", {}) + main_window = projection.get("MainWindow", {}) + if "Language" in main_window: + merged["MainWindow"]["Language"] = main_window.get("Language") + if "DpiScale" in main_window: + merged["MainWindow"]["DpiScale"] = main_window.get("DpiScale") + fluent = projection.get("QFluentWidgets", {}) + if "ThemeMode" in fluent: + merged["QFluentWidgets"]["ThemeMode"] = fluent.get("ThemeMode") + self._gui_full = merged + return merged + + def _load_from_disk(self, resource: str, resource_id: Optional[str]) -> ResourceSnapshot: + path = self._file_path(resource, resource_id) + data = None + if resource == "setup_toml": + data, _ = read_setup_toml() + else: + with path.open("r", encoding="utf-8") as fp: + data = json.load(fp) + if resource == "gui": + self._gui_full = data + projection = self._project_gui(data) + data_to_store = projection + elif resource == "setup_toml": + self._setup_toml = data + projection = self._project_setup_toml(data) + data_to_store = projection + else: + data_to_store = data + + if resource == "static": + event = self.gen_event_formation_attr(data_to_store) + data_to_store["current_game_activity"] = event + + timestamp = path.stat().st_mtime + snapshot = ResourceSnapshot(data=data_to_store, timestamp=timestamp) + self._snapshots[(resource, resource_id)] = snapshot + self._mtimes[(resource, resource_id)] = timestamp + return snapshot + + async def get_snapshot(self, resource: str, resource_id: Optional[str]) -> ResourceSnapshot: + key = (resource, resource_id) + async with self._lock: + snapshot = self._snapshots.get(key) + if snapshot is None: + snapshot = self._load_from_disk(resource, resource_id) + return ResourceSnapshot(json.loads(json.dumps(snapshot.data)), snapshot.timestamp) + + async def get_static_snapshot(self) -> ResourceSnapshot: + snapshot = await self.get_snapshot("static", None) + + return snapshot + + # ------------------------------------------------------------------ + # update operations + # ------------------------------------------------------------------ + async def apply_patch( + self, + resource: str, + resource_id: Optional[str], + operations: Iterable[PatchOperation | dict[str, Any]], + timestamp: float, + origin: str = "backend", + ) -> ResourceSnapshot: + key = (resource, resource_id) + + async with self._lock: + snapshot = self._snapshots.get(key) + if snapshot is None: + snapshot = self._load_from_disk(resource, resource_id) + elif timestamp < snapshot.timestamp: + raise PatchConflictError("Incoming patch is older than current snapshot") + + current_data = json.loads(json.dumps(snapshot.data)) + ops_payload = [op.model_dump() if isinstance(op, PatchOperation) else dict(op) for op in operations] + updated = apply_patch(current_data, ops_payload) + + if resource == "gui": + if not isinstance(updated, dict): + raise PatchConflictError("GUI patch must result in a mapping document") + full_gui = self._merge_gui(updated) + elif resource == "setup_toml": + if not isinstance(updated, dict): + raise PatchConflictError("Setup patch must result in a mapping document") + full_setup_toml = self._merge_setup_toml(updated) + else: + full_gui = updated + + path = self._file_path(resource, resource_id) + if resource == "gui": + to_dump = full_gui + elif resource == "setup_toml": + to_dump = full_setup_toml + else: + to_dump = updated + + if resource == "setup_toml": + write_setup_toml(to_dump) + else: + self._write_json(path, to_dump, resource) + + new_timestamp = max(timestamp, time.time(), path.stat().st_mtime) + new_snapshot = ResourceSnapshot(data=updated, timestamp=new_timestamp) + self._snapshots[key] = new_snapshot + self._mtimes[key] = new_timestamp + + payload = SyncPushPayload( + resource=resource, resource_id=resource_id, timestamp=new_snapshot.timestamp, ops=[ + PatchOperation(**op) for op in ops_payload + ], origin=origin, + ) + await self._update_bus.publish(payload.model_dump()) + return ResourceSnapshot(json.loads(json.dumps(new_snapshot.data)), new_snapshot.timestamp) + + def _write_json(self, path: Path, data: Any, resource: str) -> None: + indent = 4 if resource in ("config", "gui") else 2 + with path.open("w", encoding="utf-8") as fp: + json.dump(data, fp, indent=indent, ensure_ascii=False) + + async def subscribe_updates(self) -> asyncio.Queue: + if self._loop is None: + raise RuntimeError("ConfigManager event loop not configured") + return self._update_bus.subscribe() + + def unsubscribe_updates(self, queue: asyncio.Queue) -> None: + self._update_bus.unsubscribe(queue) + + # ------------------------------------------------------------------ + # disk scanning + # ------------------------------------------------------------------ + async def scan_once(self) -> None: + current_ids = set(self.list_config_ids()) + previous_ids = set(self._known_config_ids) if hasattr(self, "_known_config_ids") else set() + + for added in current_ids - previous_ids: + await self._notify_config_added(added) + + for removed in previous_ids - current_ids: + await self._notify_config_removed(removed) + + self._known_config_ids = current_ids + + for config_id in current_ids: + await self._check_resource("config", config_id) + await self._check_resource("event", config_id) + + await self._check_resource("gui", None) + + async def _notify_config_added(self, config_id: str): + payload = SyncPushPayload( + resource="config", + resource_id=config_id, + timestamp=time.time(), + ops=[PatchOperation(op="add", path="", value={})], + origin="filesystem", + ) + await self._update_bus.publish(payload.model_dump()) + + async def _notify_config_removed(self, config_id: str): + payload = SyncPushPayload( + resource="config", + resource_id=config_id, + timestamp=time.time(), + ops=[PatchOperation(op="remove", path="", value=None)], + origin="filesystem", + ) + # 清理缓存 + self._mtimes.pop(("config", config_id), None) + self._mtimes.pop(("event", config_id), None) + self._snapshots.pop(("config", config_id), None) + self._snapshots.pop(("event", config_id), None) + await self._update_bus.publish(payload.model_dump()) + + async def _check_resource(self, resource: str, resource_id: Optional[str]) -> None: + key = (resource, resource_id) + path = self._file_path(resource, resource_id) + if not path.exists(): + return + mtime = path.stat().st_mtime + previous = self._mtimes.get(key) + if previous is None: + self._mtimes[key] = mtime + return + if mtime <= previous: + return + async with self._lock: + old_snapshot = self._snapshots.get(key) + fresh_snapshot = self._load_from_disk(resource, resource_id) + if old_snapshot is None: + ops = [{"op": "replace", "path": "", "value": fresh_snapshot.data}] + else: + ops = diff_documents(old_snapshot.data, fresh_snapshot.data) + if not ops: + return + payload = SyncPushPayload( + resource=resource, + resource_id=resource_id, + timestamp=fresh_snapshot.timestamp, + ops=[PatchOperation(**op) for op in ops], + origin="filesystem", + ) + await self._update_bus.publish(payload.model_dump()) + + async def watch_filesystem(self) -> None: + if self._loop is None: + self._loop = asyncio.get_running_loop() + self._update_bus.set_loop(self._loop) + + await self.scan_once() + + try: + async for changes in awatch(self._root, recursive=True): + await self._handle_watch_batch(changes) + except asyncio.CancelledError: + raise + + async def _handle_watch_batch(self, changes: Iterable[tuple[Change, str]]) -> None: + resource_changes: set[ResourceKey] = set() + rescan_configs = False + for change, raw_path in changes: + path = Path(raw_path) + if path.name == "setup.toml" and path.parent == self._root: + resource_changes.add(("setup_toml", None)) + continue + if path == self._config_root or self._config_root in path.parents: + needs_rescan, resource_key = self._classify_config_change(change, path) + rescan_configs = rescan_configs or needs_rescan + if resource_key is not None: + resource_changes.add(resource_key) + if rescan_configs: + await self.scan_once() + for resource, resource_id in resource_changes: + await self._check_resource(resource, resource_id) + + def _classify_config_change( + self, + change: Change, + path: Path, + ) -> tuple[bool, Optional[ResourceKey]]: + try: + relative_parts = path.relative_to(self._config_root).parts + except ValueError: + return False, None + + if not relative_parts: + return True, None + + if len(relative_parts) == 1: + name = relative_parts[0] + if name == "gui.json": + return False, ("gui", None) + if name == "static.json": + return False, ("static", None) + if change != Change.modified: + return True, None + return False, None + + if len(relative_parts) == 2: + config_id, filename = relative_parts + if filename == "config.json": + return change != Change.modified, ("config", config_id) + if filename == "event.json": + return change != Change.modified, ("event", config_id) + if change != Change.modified: + return True, None + return False, None + + if change != Change.modified: + return True, None + return False, None diff --git a/service/context.py b/service/context.py new file mode 100644 index 000000000..5c0526306 --- /dev/null +++ b/service/context.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import asyncio +import threading +from contextlib import suppress +from pathlib import Path +from typing import Optional + +from .config_manager import ConfigManager +from .logging import LogManager +from .runtime import ServiceRuntime + + +class ServiceContext: + """Aggregates long-lived service components.""" + + def __init__(self, project_root: Path) -> None: + self.project_root = project_root + self.config_manager = ConfigManager(project_root) + self.runtime = ServiceRuntime(project_root) + self.log_manager = LogManager() + self._loop: Optional[asyncio.AbstractEventLoop] = None + self._fs_task: Optional[asyncio.Task] = None + + async def startup(self) -> None: + loop = asyncio.get_running_loop() + self._loop = loop + self.config_manager.set_loop(loop) + self.runtime.set_loop(loop) + self.log_manager.set_loop(loop) + + await self.runtime.ensure_ready() # ensures OCR server is ready + main_queue = self.runtime.get_main_log_queue() + self.log_manager.register_queue(main_queue, scope="global") + await self.log_manager.start() + + self._fs_task = asyncio.create_task(self.config_manager.watch_filesystem(), name="config-fs-watch") + threading.Thread(target=self.runtime.init_all_data).start() + + + async def shutdown(self) -> None: + if self._fs_task: + self._fs_task.cancel() + with suppress(asyncio.CancelledError): + await self._fs_task + self._fs_task = None + await self.log_manager.stop() + + def ensure_runtime_logger_attached(self) -> None: + for queue, scope in self.runtime.get_log_sources(): + self.log_manager.register_queue(queue, scope=scope) diff --git a/service/diff.py b/service/diff.py new file mode 100644 index 000000000..c270ae716 --- /dev/null +++ b/service/diff.py @@ -0,0 +1,136 @@ +from __future__ import annotations + +import copy +from typing import Any, Iterable, List + + +class PatchConflictError(Exception): + """Raised when an incoming patch cannot be applied cleanly.""" + + +def _escape_segment(segment: str) -> str: + return segment.replace("~", "~0").replace("/", "~1") + + +def _unescape_segment(segment: str) -> str: + return segment.replace("~1", "/").replace("~0", "~") + + +def _split_path(path: str) -> List[str]: + if path in ("", "/"): + return [] + if not path.startswith("/"): + raise PatchConflictError(f"Invalid json-pointer path: '{path}'") + raw_segments = path.split("/")[1:] + return [_unescape_segment(seg) for seg in raw_segments] + + +def _resolve_parent(document: Any, segments: Iterable[str]) -> tuple[Any, str]: + segments = list(segments) + if not segments: + raise PatchConflictError("Cannot resolve empty path segments") + target = document + for seg in segments[:-1]: + if isinstance(target, dict): + if seg not in target: + raise PatchConflictError(f"Missing key '{seg}' while resolving path") + target = target[seg] + elif isinstance(target, list): + try: + index = int(seg) + except ValueError as exc: + raise PatchConflictError(f"Invalid list index '{seg}'") from exc + if index < 0 or index >= len(target): + raise PatchConflictError(f"List index {index} out of range") + target = target[index] + else: + raise PatchConflictError(f"Cannot traverse into non-container type at segment '{seg}'") + return target, segments[-1] + + +def apply_patch(document: Any, operations: Iterable[dict[str, Any]]) -> Any: + current = document + for op in operations: + operation = op.get("op") + path = op.get("path", "") + value = op.get("value") + segments = _split_path(path) + + if not segments: + if operation == "replace" or operation == "add": + current = copy.deepcopy(value) + elif operation == "remove": + raise PatchConflictError("Cannot remove the document root") + else: + raise PatchConflictError(f"Unsupported operation '{operation}'") + continue + + parent, last_seg = _resolve_parent(current, segments) + + if isinstance(parent, dict): + if operation == "add" or operation == "replace": + parent[last_seg] = copy.deepcopy(value) + elif operation == "remove": + if last_seg not in parent: + raise PatchConflictError(f"Key '{last_seg}' not found for removal") + del parent[last_seg] + else: + raise PatchConflictError(f"Unsupported operation '{operation}'") + elif isinstance(parent, list): + if last_seg == "-": + index = len(parent) + else: + try: + index = int(last_seg) + except ValueError as exc: + raise PatchConflictError(f"Invalid list index '{last_seg}'") from exc + if operation == "add": + if index < 0 or index > len(parent): + raise PatchConflictError(f"List index {index} out of range for add") + parent.insert(index, copy.deepcopy(value)) + elif operation == "replace": + if index < 0 or index >= len(parent): + raise PatchConflictError(f"List index {index} out of range for replace") + parent[index] = copy.deepcopy(value) + elif operation == "remove": + if index < 0 or index >= len(parent): + raise PatchConflictError(f"List index {index} out of range for remove") + parent.pop(index) + else: + raise PatchConflictError(f"Unsupported operation '{operation}'") + else: + raise PatchConflictError("Target container must be dict or list") + + return current + + +def _diff_dict(old: dict[str, Any], new: dict[str, Any], base_path: str) -> List[dict[str, Any]]: + ops: List[dict[str, Any]] = [] + old_keys = set(old.keys()) + new_keys = set(new.keys()) + + for removed in old_keys - new_keys: + path = f"{base_path}/{_escape_segment(removed)}" if base_path else f"/{_escape_segment(removed)}" + ops.append({"op": "remove", "path": path}) + + for added in new_keys - old_keys: + path = f"{base_path}/{_escape_segment(added)}" if base_path else f"/{_escape_segment(added)}" + ops.append({"op": "add", "path": path, "value": copy.deepcopy(new[added])}) + + for common in old_keys & new_keys: + path = f"{base_path}/{_escape_segment(common)}" if base_path else f"/{_escape_segment(common)}" + ops.extend(diff_documents(old[common], new[common], path)) + + return ops + + +def diff_documents(old: Any, new: Any, base_path: str = "") -> List[dict[str, Any]]: + if isinstance(old, dict) and isinstance(new, dict): + return _diff_dict(old, new, base_path) + if isinstance(old, list) and isinstance(new, list): + if old == new: + return [] + return [{"op": "replace", "path": base_path or "", "value": copy.deepcopy(new)}] + if old != new: + return [{"op": "replace", "path": base_path or "", "value": copy.deepcopy(new)}] + return [] diff --git a/service/encryption.py b/service/encryption.py new file mode 100644 index 000000000..91d4b261c --- /dev/null +++ b/service/encryption.py @@ -0,0 +1,71 @@ +from __future__ import annotations + +import base64 +import hashlib +import hmac +import json +import secrets +from dataclasses import dataclass +from typing import Any, Union + +from cryptography.fernet import Fernet, InvalidToken + + +class AuthenticationError(Exception): + """Raised when the websocket handshake fails.""" + + +@dataclass +class HandshakeChallenge: + challenge: str + algorithm: str = "HMAC-SHA256" + +@dataclass +class HandshakeResponse: + response: str + +class HandshakeSession: + """One-time handshake helper coordinating challenge/response.""" + + def __init__(self, shared_secret: str) -> None: + if not shared_secret: + raise AuthenticationError("Shared secret is not configured") + self._shared_secret = shared_secret.encode("utf-8") + self._challenge_bytes: Union[bytes, None] = None + + def issue_challenge(self) -> HandshakeChallenge: + self._challenge_bytes = secrets.token_bytes(32) + challenge = base64.urlsafe_b64encode(self._challenge_bytes).decode("ascii") + return HandshakeChallenge(challenge=challenge) + + def verify(self, response: str) -> None: + if self._challenge_bytes is None: + raise AuthenticationError("Handshake challenge was not issued") + expected = hmac.new(self._shared_secret, self._challenge_bytes, hashlib.sha256).hexdigest() + if not hmac.compare_digest(expected, response): + raise AuthenticationError("Invalid handshake response") + + def build_cipher(self) -> "CipherBox": + return CipherBox(self._shared_secret.decode("utf-8")) + + +class CipherBox: + """Symmetric encryption box backed by Fernet.""" + + def __init__(self, shared_secret: str) -> None: + digest = hashlib.sha256(shared_secret.encode("utf-8")).digest() + key = base64.urlsafe_b64encode(digest) + self._fernet = Fernet(key) + + def encrypt_json(self, payload: dict[str, Any]) -> str: + data = json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + return self._fernet.encrypt(data).decode("utf-8") + + def decrypt_json(self, token: str) -> dict[str, Any]: + try: + data = self._fernet.decrypt(token.encode("utf-8")) + + except InvalidToken as exc: + print("INVALID") + raise AuthenticationError("Encrypted payload could not be authenticated") from exc + return json.loads(data.decode("utf-8")) diff --git a/service/logging.py b/service/logging.py new file mode 100644 index 000000000..8ad0be536 --- /dev/null +++ b/service/logging.py @@ -0,0 +1,144 @@ +from __future__ import annotations + +import asyncio +import queue +import threading +from collections import defaultdict +from datetime import datetime, timezone +from typing import Any, Dict, List, Optional, Set + +from .broadcast import BroadcastChannel + +LEVEL_MAP = { + 1: "INFO", + 2: "WARNING", + 3: "ERROR", + 4: "CRITICAL", +} + + +class LogManager: + """Consumes logger queues and republishes entries tagged by scope.""" + + def __init__(self, loop: asyncio.AbstractEventLoop | None = None) -> None: + self._loop = loop + self._broadcast = BroadcastChannel(loop) + self._history_lock = threading.Lock() + self._history_all: List[Dict[str, Any]] = [] + self._history_per_scope: Dict[str, List[Dict[str, Any]]] = defaultdict(list) + self._sources: Dict[queue.Queue, str] = {} + self._queue_tasks: Dict[queue.Queue, asyncio.Task] = {} + self._sentinels: Dict[queue.Queue, object] = {} + self._active_tasks: Set[asyncio.Task] = set() + self._running = False + + def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._broadcast.set_loop(loop) + + def register_queue(self, log_queue: queue.Queue, scope: str = "global") -> None: + if log_queue in self._sources: + return + self._sources[log_queue] = scope + sentinel = object() + self._sentinels[log_queue] = sentinel + if self._running and self._loop is not None: + task = self._loop.create_task(self._pump_async(log_queue, scope, sentinel), name=f"log-pump-{scope}") + self._queue_tasks[log_queue] = task + self._active_tasks.add(task) + task.add_done_callback(self._make_cleanup(log_queue)) + + def unregister_queue(self, log_queue: queue.Queue) -> None: + scope = self._sources.pop(log_queue, None) + if scope is None: + return + task = self._queue_tasks.pop(log_queue, None) + sentinel = self._sentinels.pop(log_queue, None) + if task is not None and sentinel is not None: + try: + log_queue.put_nowait(sentinel) + except queue.Full: + # Queues provided by the logger are unbounded; ignore if full. + pass + + async def start(self) -> None: + if self._running: + return + if self._loop is None: + raise RuntimeError("LogManager loop is not configured") + self._running = True + for idx, (src, scope) in enumerate(self._sources.items()): + sentinel = self._sentinels.setdefault(src, object()) + task = self._loop.create_task( + self._pump_async(src, scope, sentinel), + name=f"log-pump-{idx}", + ) + self._queue_tasks[src] = task + self._active_tasks.add(task) + task.add_done_callback(self._make_cleanup(src)) + + async def stop(self) -> None: + if not self._running: + return + self._running = False + tasks = list(self._active_tasks) + for queue_obj, sentinel in list(self._sentinels.items()): + try: + queue_obj.put_nowait(sentinel) + except queue.Full: + # Queues provided by the logger are unbounded; ignore if full. + pass + if tasks: + await asyncio.gather(*tasks, return_exceptions=True) + self._queue_tasks.clear() + self._active_tasks.clear() + self._sentinels.clear() + + def _make_cleanup(self, queue_obj: queue.Queue): + def _cleanup(task: asyncio.Task) -> None: + self._active_tasks.discard(task) + self._queue_tasks.pop(queue_obj, None) + self._sentinels.pop(queue_obj, None) + + return _cleanup + + async def _pump_async(self, source: queue.Queue, scope: str, sentinel: object) -> None: + while True: + record = await asyncio.to_thread(source.get) + if record is sentinel: + break + entry = self._normalize_record(record, scope) + with self._history_lock: + self._history_all.append(entry) + self._history_per_scope[scope].append(entry) + await self._broadcast.publish(entry) + + def _normalize_record(self, record: Dict[str, Any], scope: str) -> Dict[str, Any]: + timestamp = record.get("time") + if isinstance(timestamp, datetime): + iso = timestamp.astimezone(timezone.utc).isoformat() + else: + iso = datetime.now(timezone.utc).isoformat() + level = LEVEL_MAP.get(record.get("level", 1), "INFO") + message = record.get("message", "") + return {"scope": scope, "time": iso, "level": level, "message": message} + + def get_history(self, scope: Optional[str] = None) -> List[Dict[str, Any]]: + with self._history_lock: + if scope is None: + return list(self._history_all) + return list(self._history_per_scope.get(scope, [])) + + def get_scopes(self) -> List[str]: + with self._history_lock: + scopes = set(self._history_per_scope.keys()) + scopes.update(self._sources.values()) + return sorted(scopes) + + async def subscribe(self) -> asyncio.Queue: + if self._loop is None: + raise RuntimeError("LogManager loop is not configured") + return self._broadcast.subscribe() + + def unsubscribe(self, queue_obj: asyncio.Queue) -> None: + self._broadcast.unsubscribe(queue_obj) diff --git a/service/messages.py b/service/messages.py new file mode 100644 index 000000000..7ad211bb2 --- /dev/null +++ b/service/messages.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +from typing import Any, Dict, List, Literal, Optional, Union + +from pydantic import AliasChoices, BaseModel, Field, field_validator + + +class PatchOperation(BaseModel): + op: Literal["add", "remove", "replace"] + path: str + value: Union[Any, None] = None + + @field_validator("path") + def validate_path(cls, value: str) -> str: + if value != "" and not value.startswith("/"): + raise ValueError("json-pointer paths must start with '/' or be empty") + return value + + +class SyncPullMessage(BaseModel): + type: Literal["pull"] + resource: Literal["config", "event", "gui", "static", "setup_toml"] + resource_id: Optional[str] = None + is_include_diff_baseline: bool = Field( + default=False, + description="Whether to return baseline timestamp", + validation_alias=AliasChoices("is_include_diff_baseline", "include_diff_baseline"), + ) + + +class SyncPatchMessage(BaseModel): + type: Literal["patch"] + resource: Literal["config", "event", "gui", "setup_toml"] + resource_id: Optional[str] = None + timestamp: float + ops: List[PatchOperation] + + +class ProviderRequest(BaseModel): + type: Literal["static_request", "status_request"] + resource_id: Optional[str] = None + + +class CommandMessage(BaseModel): + type: Literal["command"] + command: str + timestamp: float + config_id: Optional[str] = None + payload: Dict[str, Any] = Field(default_factory=dict) + + +class HandshakeResponse(BaseModel): + type: Literal["handshake_response"] + response: str + timestamp: float + + +class SyncPushPayload(BaseModel): + type: Literal["patch"] = "patch" + resource: Literal["config", "event", "gui", "setup_toml"] + resource_id: Optional[str] = None + timestamp: float + ops: List[PatchOperation] + origin: Literal["backend", "filesystem", "frontend"] = "backend" diff --git a/service/runtime.py b/service/runtime.py new file mode 100644 index 000000000..a4e09493a --- /dev/null +++ b/service/runtime.py @@ -0,0 +1,342 @@ +from __future__ import annotations + +import os +import asyncio +import datetime +import shutil +import threading +import time +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +from core.Baas_thread import Baas_thread +from core.config.config_set import ConfigSet +from core.device import emulator_manager +from main import Main +from .broadcast import BroadcastChannel +from .utils import * + +_TASK_ALIAS = { + "start_hard_task": "explore_hard_task", + "start_normal_task": "explore_normal_task", + "start_fhx": "de_clothes", + "start_main_story": "main_story", + "start_group_story": "group_story", + "start_mini_story": "mini_story", + "start_explore_activity_story": "explore_activity_story", + "start_explore_activity_mission": "explore_activity_mission", + "start_explore_activity_challenge": "explore_activity_challenge", +} + + +class _SignalHook: + def __init__(self, callback) -> None: + self._callback = callback + + def emit(self, payload): # noqa: ANN001 - Qt compatible signature + self._callback(payload) + + +def _default_status(config_id: str) -> Dict[str, Any]: + return { + "config_id": config_id, + "running": False, + "is_flag_run": False, + "button": None, + "current_task": None, + "waiting_tasks": [], + "exit_code": None, + "timestamp": time.time(), + } + + +@dataclass +class ConfigSession: + config_id: str + config_set: ConfigSet + baas: Baas_thread + button_signal: _SignalHook + update_signal: _SignalHook + exit_signal: _SignalHook + thread: Optional[threading.Thread] = None + status: Dict[str, Any] = field(default_factory=dict) + + +class ServiceRuntime: + """Coordinates Baas_thread lifecycle and exposes async-friendly APIs.""" + + def __init__(self, project_root: Path, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: + self._project_root = project_root + self._loop = loop + self._status_bus = BroadcastChannel(loop) + self._status_lock = threading.Lock() + self._sessions: Dict[str, ConfigSession] = {} + self._statuses: Dict[str, Dict[str, Any]] = {} + self._lock = asyncio.Lock() + self._main: Optional[Main] = None + self._baas: Optional[Baas_thread] = None + self._baas_thread: Optional[threading.Thread] = None + self._active_config_id: Optional[str] = None + self._update_signal: Optional[_SignalHook] = None + self._exit_signal: Optional[_SignalHook] = None + self.is_all_data_initialized: bool = False + + def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._status_bus.set_loop(loop) + + # ------------------------------------------------------------------ + # public utility accessors + # ------------------------------------------------------------------ + def get_main_log_queue(self): + self._ensure_main_sync() + assert self._main is not None + return self._main.logger.log_collector + + def init_all_data(self): + assert self._main is not None + self._ensure_config() + status = self._main.init_all_data() + if status: + self._status_bus.publish_threadsafe({ + "is_all_data_initialized": True + }) + self.is_all_data_initialized = True + + def get_log_sources(self) -> List[Tuple[Any, str]]: + sources: List[Tuple[Any, str]] = [] + for session in self._sessions.values(): + sources.append((session.baas.logger.log_collector, f"config:{session.config_id}")) + return sources + + def current_status(self) -> Dict[str, Dict[str, Any]]: + with self._status_lock: + return {cid: dict(status) for cid, status in self._statuses.items()} + + def list_sessions(self) -> List[str]: + return list(self._sessions.keys()) + + async def subscribe_status(self) -> asyncio.Queue: + if self._loop is None: + raise RuntimeError("ServiceRuntime loop is not configured") + return self._status_bus.subscribe() + + def unsubscribe_status(self, queue_obj: asyncio.Queue) -> None: + self._status_bus.unsubscribe(queue_obj) + + # ------------------------------------------------------------------ + # lifecycle helpers + # ------------------------------------------------------------------ + def _ensure_main_sync(self) -> None: + if self._main is not None: + return + self._main = Main(ocr_needed=["en-us", "zh-cn"], jsonify=True, lazy_data=True) + + async def _ensure_main(self) -> None: + await asyncio.get_running_loop().run_in_executor(None, self._ensure_main_sync) + + @staticmethod + def _ensure_config() -> None: + config_dir_list = [] + for _dir_ in os.listdir('./config'): + if os.path.isdir(f'./config/{_dir_}'): + files = os.listdir(f'./config/{_dir_}') + if 'config.json' in files: + check_config(_dir_) + if len(config_dir_list) == 0: + check_config('default_config') + + + async def ensure_ready(self) -> None: + await self._ensure_main() + + def _get_or_create_session(self, config_id: str) -> ConfigSession: + session = self._sessions.get(config_id) + if session is not None: + return session + self._ensure_main_sync() + assert self._main is not None + config = ConfigSet(config_dir=config_id) + button = _SignalHook(lambda payload: self._handle_button_signal(config_id, payload)) + update = _SignalHook(lambda payload: self._handle_update_signal(config_id, payload)) + exit_signal = _SignalHook(lambda payload: self._handle_exit_signal(config_id, payload)) + baas = Baas_thread( + config, + None, + button, + update, + exit_signal, + jsonify=True, + ) + baas.set_ocr(self._main.ocr) + status = _default_status(config_id) + session = ConfigSession( + config_id=config_id, + config_set=config, + baas=baas, + button_signal=button, + update_signal=update, + exit_signal=exit_signal, + status=status, + ) + self._sessions[config_id] = session + with self._status_lock: + self._statuses[config_id] = status + self._publish_status(config_id) + return session + + async def start_scheduler(self, config_id: str, set_log=None) -> Dict[str, Any]: + loop = asyncio.get_running_loop() + async with self._lock: + session = self._get_or_create_session(config_id) + if set_log: set_log() + if session.thread and session.thread.is_alive(): + return {"status": "already-running", "config_id": config_id} + init_ok = await loop.run_in_executor(None, session.baas.init_all_data) + if not init_ok: + raise RuntimeError("Baas_thread initialization failed") + + def runner() -> None: + try: + session.baas.send("start") + finally: + session.thread = None + self._update_status(config_id, running=False, is_flag_run=session.baas.flag_run, current_task=None, + waiting_tasks=[]) + + thread = threading.Thread( + target=runner, + name=f"baas-scheduler-{config_id}", + daemon=True, + ) + session.thread = thread + thread.start() + self._update_status(config_id, running=True, is_flag_run=True, exit_code=None, current_task=None, + waiting_tasks=[]) + return {"status": "started", "config_id": config_id} + + async def stop_scheduler(self, config_id: str) -> Dict[str, Any]: + async with self._lock: + session = self._sessions.get(config_id) + if session is None: + return {"status": "unknown-config", "config_id": config_id} + if not session.thread: + self._update_status(config_id, running=False, is_flag_run=False, current_task=None, waiting_tasks=[]) + return {"status": "stopped", "config_id": config_id} + session.baas.send("stop") + thread = session.thread + session.thread = None + if thread and thread.is_alive(): + thread.join(timeout=10.0) + self._update_status(config_id, running=False, is_flag_run=False, current_task=None, waiting_tasks=[]) + return {"status": "stopped", "config_id": config_id} + + async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict[str, Any]: + if task_name in _TASK_ALIAS: + task_name = _TASK_ALIAS[task_name] + loop = asyncio.get_running_loop() + async with self._lock: + session = self._sessions.get(config_id) + if session is None: + session = self._get_or_create_session(config_id) + if set_log: set_log() + baas = session.baas + needs_init = session.baas.scheduler is None + + if needs_init: + await loop.run_in_executor(None, baas.init_all_data) + + def _call() -> None: + try: + self._update_status(config_id, running=True, is_flag_run=True, exit_code=None, current_task=task_name, + waiting_tasks=[]) + baas.flag_run = True + baas.send("solve", task_name) + finally: + session.thread = None + self._update_status(config_id, running=False, is_flag_run=session.baas.flag_run, current_task=None, + waiting_tasks=[]) + + thread = threading.Thread( + target=_call, + name=f"baas-solver-{task_name}-{config_id}", + daemon=True, + ) + session.thread = thread + thread.start() + + return {"status": "ok", "task": task_name, "result": 0} + + @staticmethod + async def detect_adb() -> List[str]: + loop = asyncio.get_running_loop() + adb_res = await loop.run_in_executor(None, emulator_manager.autosearch) + return adb_res + + @staticmethod + async def valid_cdk(cdk): + loop = asyncio.get_running_loop() + cdk_res = await loop.run_in_executor(None, validate_cdk, cdk) + return cdk_res + + @staticmethod + async def test_all_sha(): + loop = asyncio.get_running_loop() + all_sha_res = await loop.run_in_executor(None, test_all_repo_sha) + return all_sha_res + + @staticmethod + async def check_for_update(): + loop = asyncio.get_running_loop() + all_update_res = await loop.run_in_executor(None, check_for_update) + return all_update_res + + @staticmethod + async def add_config(name, server): + serial_name = str(int(datetime.datetime.now().timestamp())) + check_config(serial_name, name=name, server=server) + return { + "serial": serial_name + } + + @staticmethod + async def remove_config(_id): + shutil.rmtree(f'./config/{_id}') + return {} + + # ------------------------------------------------------------------ + # signal handlers + # ------------------------------------------------------------------ + def _handle_button_signal(self, config_id: str, payload: Any) -> None: + self._update_status(config_id, button=payload) + + def _handle_update_signal(self, config_id: str, payload: Any) -> None: + if isinstance(payload, list) and payload: + current = payload[0] + waiting = [item for item in payload if item != current] + else: + current = None + waiting = [] + self._update_status(config_id, current_task=current, waiting_tasks=waiting) + + def _handle_exit_signal(self, config_id: str, payload: Any) -> None: + self._update_status(config_id, running=False, is_flag_run=False, exit_code=payload) + + def _update_status(self, config_id: str, **changes: Any) -> None: + with self._status_lock: + status = self._statuses.setdefault(config_id, _default_status(config_id)) + status.update(changes) + status["timestamp"] = time.time() + snapshot = dict(status) + self._publish_status(config_id, snapshot) + + def _publish_status(self, config_id: str, snapshot: Optional[Dict[str, Any]] = None) -> None: + if snapshot is None: + with self._status_lock: + status = self._statuses.get(config_id) + if status is None: + return + snapshot = dict(status) + if self._loop: + self._status_bus.publish_threadsafe({"config_id": config_id, "status": snapshot}) diff --git a/service/utils/__init__.py b/service/utils/__init__.py new file mode 100644 index 000000000..5b073239e --- /dev/null +++ b/service/utils/__init__.py @@ -0,0 +1,12 @@ +from .update import * +from .config_ops import * + +__all__ = [ + "VersionInfo", + "check_for_update", + "test_all_repo_sha", + "validate_cdk", + "read_setup_toml", + "write_setup_toml", + "check_config" +] diff --git a/service/utils/config_ops.py b/service/utils/config_ops.py new file mode 100644 index 000000000..18b62d076 --- /dev/null +++ b/service/utils/config_ops.py @@ -0,0 +1,147 @@ +import datetime +import json +import os + +from core.config import default_config +from core.config.config_set import ConfigSet + + +def check_switch_config(dir_path='./default_config'): + path = './config/' + dir_path + '/switch.json' + with open(path, 'w', encoding='utf-8') as f: + f.write(default_config.SWITCH_DEFAULT_CONFIG) + + +def check_single_event(new_event, old_event): + for key in new_event: + if key not in old_event: + old_event[key] = new_event[key] + return old_event + + +def check_event_config(dir_path='./default_config', user_config=None): + path = './config/' + dir_path + '/event.json' + default_event_config = json.loads(default_config.EVENT_DEFAULT_CONFIG) + server = user_config.server_mode + enable_state = user_config.config.new_event_enable_state + if server != "CN": + for i in range(0, len(default_event_config)): + for j in range(0, len(default_event_config[i]['daily_reset'])): + default_event_config[i]['daily_reset'][j][0] = default_event_config[i]['daily_reset'][j][0] - 1 + if not os.path.exists(path): + with open(path, 'w', encoding='utf-8') as f: + with open("error.log", 'w+', encoding='utf-8') as errorfile: + errorfile.write("path not exist" + '\n' + dir_path + '\n' + datetime.datetime.now().strftime( + '%Y-%m-%d %H:%M:%S') + '\n') + f.write(json.dumps(default_event_config, ensure_ascii=False, indent=2)) + return + try: + with open(path, 'r', encoding='utf-8') as f: # 检查是否有新的配置项 + data = json.load(f) + for i in range(0, len(default_event_config)): + exist = False + for j in range(0, len(data)): + if data[j]['func_name'] == default_event_config[i]['func_name']: + for k in range(0, len(data[i]['daily_reset'])): + if len(data[j]['daily_reset'][k]) != 3: + data[j]['daily_reset'][k] = [0, 0, 0] + data[j] = check_single_event(default_event_config[i], data[j]) + exist = True + break + if not exist: + temp = default_event_config[i] + if enable_state == "on": + temp['enabled'] = True + elif enable_state == "off": + temp['enabled'] = False + data.insert(i, temp) + + with open(path, 'w', encoding='utf-8') as f: + f.write(json.dumps(data, ensure_ascii=False, indent=2)) + except Exception as e: + with open("error.log", 'w+', encoding='utf-8') as f: + f.write(str(e) + '\n' + dir_path + '\n' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + '\n') + with open(path, 'w', encoding='utf-8') as f: + f.write(json.dumps(default_event_config, ensure_ascii=False, indent=2)) + return + + +def delete_deprecated_config(file_name, config_name=None): + # delete useless config file + pre = 'config/' + if config_name is not None: + pre += config_name + '/' + if type(file_name) is str: + path = pre + file_name + if os.path.exists(path): + os.remove(path) + elif type(file_name) is list: + for name in file_name: + path = pre + name + if os.path.exists(path): + os.remove(path) + + +def check_static_config(): + if not os.path.exists('./config/static.json'): + with open('./config/static.json', 'w', encoding='utf-8') as f: + f.write(default_config.STATIC_DEFAULT_CONFIG) + return + try: + with open('./config/static.json', 'w', encoding='utf-8') as f: + f.write(default_config.STATIC_DEFAULT_CONFIG) + except Exception: + os.remove('./config/static.json') + with open('./config/static.json', 'w', encoding='utf-8') as f: + f.write(default_config.STATIC_DEFAULT_CONFIG) + + +def update_config_reserve_old(config_old, config_new): # 保留旧配置原有的键,添加新配置中没有的,删除新配置中没有的键 + for key in config_new: + if key not in config_old: + config_old[key] = config_new[key] + dels = [] + for key in config_old: + if key not in config_new: + dels.append(key) + for key in dels: + del config_old[key] + return config_old + + +def check_and_update_user_config(dir_path='./default_config', server=None, name=None): + path = './config/' + dir_path + '/config.json' + if not os.path.exists(path): + with open(path, 'w', encoding='utf-8') as f: + f.write(default_config.DEFAULT_CONFIG) + try: + with open(path, 'r', encoding='utf-8') as f: + data = json.load(f) + data = update_config_reserve_old(data, json.loads(default_config.DEFAULT_CONFIG)) + if name is not None: + data['name'] = name + if server is not None: + data['server'] = server + with open(path, 'w', encoding='utf-8') as f: + f.write(json.dumps(data, ensure_ascii=False, indent=2)) + except Exception: + os.remove(path) + with open(path, 'w', encoding='utf-8') as f: + f.write(default_config.DEFAULT_CONFIG) + + +def check_config(dir_path, server=None, name=None): + delete_deprecated_config("display.json", dir_path) + if not os.path.exists('./config'): + os.mkdir('./config') + check_static_config() + if type(dir_path) is not list: + dir_path = [dir_path] + for path in dir_path: + if not os.path.exists('./config/' + path): + os.mkdir('./config/' + path) + check_and_update_user_config(path, server, name) + config = ConfigSet(config_dir=path) + config.update_create_quantity_entry() + check_event_config(path, config) + check_switch_config(path) diff --git a/service/utils/update.py b/service/utils/update.py new file mode 100644 index 000000000..3848fa0dc --- /dev/null +++ b/service/utils/update.py @@ -0,0 +1,300 @@ +from __future__ import annotations + +import time +from dataclasses import dataclass +from datetime import datetime, timezone +from pathlib import Path +from types import SimpleNamespace +from typing import Any, Dict, List, Optional, Tuple, Union + +import pygit2 +import requests +import tomli_w + +try: # Python 3.11+ + import tomllib # type: ignore[import] +except ModuleNotFoundError: # pragma: no cover - Python < 3.11 fallback + import tomli as tomllib # type: ignore[import] + +from deploy.installer.const import GetShaMethod, get_remote_sha_methods +from deploy.installer.mirrorc_update.const import MirrorCErrorCode +from deploy.installer.mirrorc_update.mirrorc_updater import MirrorC_Updater +from deploy.installer.toml_config import DEFAULT_SETTINGS + +RepositoryResult = Dict[str, Any] + + +@dataclass +class VersionInfo: + """Normalized version data loaded from setup.toml.""" + + version: Optional[str] + source: str + path: Path + + def to_dict(self) -> Dict[str, Any]: + return { + "version": self.version, + "source": self.source, + "path": str(self.path), + } + + +def _github_api_get_latest_sha(config: Dict[str, Any], timeout: float) -> Tuple[bool, str]: + owner = config["owner"] + repo = config["repo"] + branch = config["branch"] + url = f"https://api.github.com/repos/{owner}/{repo}/branches/{branch}" + try: + response = requests.get(url, timeout=timeout) + response.raise_for_status() + response_json = response.json() + sha_value = response_json.get("commit", {}).get("sha") + if not sha_value: + return False, "Commit SHA not found in GitHub response" + return True, sha_value + except requests.RequestException as exc: # pragma: no cover - network errors + return False, str(exc) + + +def _mirrorc_api_get_latest_sha(timeout: float) -> Tuple[bool, str]: + mirrorc_inst = MirrorC_Updater(app="BAAS_repo", current_version="") + try: + ret = mirrorc_inst.get_latest_version(cdk="", timeout=timeout) + if ret.has_data and ret.latest_version_name: + return True, ret.latest_version_name + return False, ret.message + except Exception as exc: # pragma: no cover - external dependency + return False, str(exc) + + +def _pygit2_get_latest_sha(config: Dict[str, Any]) -> Tuple[bool, str]: + url = config["url"] + branch = config["branch"] + target_ref = f"refs/heads/{branch}" + try: + git = pygit2.Repository(".") + remote = git.remotes.create_anonymous(url) + for head in remote.ls_remotes(): + if head.get("name") == target_ref: + return True, str(head.get("oid")) + return False, f"Branch '{branch}' not found at {url}" + except Exception as exc: + return False, str(exc) + + +def test_all_repo_sha(timeout: float = 3.0) -> List[RepositoryResult]: + """Test every configured repository and return timing + SHA details.""" + results: List[RepositoryResult] = [] + for config in get_remote_sha_methods: + result = test_repo_sha(config, timeout) + results.append(result) + return results + + +def test_repo_sha(config: dict[str, Union[str, GetShaMethod]], timeout: float) -> dict[str, Any]: + method = config["method"] + start = time.perf_counter() + if method == GetShaMethod.GITHUB_API: + success, value = _github_api_get_latest_sha(config, timeout) + elif method == GetShaMethod.MIRRORC_API: + success, value = _mirrorc_api_get_latest_sha(timeout) + else: + success, value = _pygit2_get_latest_sha(config) + elapsed = time.perf_counter() - start + result: RepositoryResult = { + "name": config.get("name"), + "method": method.name, + "duration": elapsed, + "success": success, + "value": value if success else None, + "error": None if success else value, + } + return result + + +def _format_expired_time(timestamp_value: Optional[float]) -> Tuple[Optional[float], Optional[str]]: + if not timestamp_value: + return None, None + dt = datetime.fromtimestamp(timestamp_value, tz=timezone.utc) + return timestamp_value, dt.isoformat() + + +def validate_cdk(cdk: str, timeout: float = 3.0) -> Dict[str, Any]: + """Validate a MirrorC CDK and return structured status information.""" + if cdk != "": + updater = MirrorC_Updater(app="BAAS_repo", current_version="") + try: + ret = updater.get_latest_version(cdk=cdk, timeout=timeout) + except requests.RequestException as exc: + data, path_setup_toml = read_setup_toml() + data["General"]["mirrorc_cdk"] = "" + write_setup_toml(data, path_setup_toml) + return { + "success": False, + "code": None, + "message": str(exc), + "latest_version": None, + "expires_at": None, + "expires_at_iso": None, + "mirrorc_message": None, + } + except Exception as exc: # pragma: no cover - unexpected error + data, path_setup_toml = read_setup_toml() + data["General"]["mirrorc_cdk"] = "" + write_setup_toml(data, path_setup_toml) + return { + "success": False, + "code": None, + "message": str(exc), + "latest_version": None, + "expires_at": None, + "expires_at_iso": None, + "mirrorc_message": None, + } + else: + ret = SimpleNamespace( + code=MirrorCErrorCode.KEY_INVALID.value, + message="CDK invalid.", + latest_version_name=None + ) + + code = ret.code + expires_ts = getattr(ret, "cdk_expired_time", None) + expires_ts, expires_iso = _format_expired_time(expires_ts) + + base_messages = { + MirrorCErrorCode.SUCCESS.value: ( + "CDK valid. Expires at {}" if expires_iso else "CDK valid." + ), + MirrorCErrorCode.KEY_EXPIRED.value: "CDK expired.", + MirrorCErrorCode.KEY_INVALID.value: "CDK invalid.", + MirrorCErrorCode.RESOURCE_QUOTA_EXHAUSTED.value: "CDK quota exhausted for today.", + MirrorCErrorCode.KEY_MISMATCHED.value: "CDK mismatched for requested resource.", + MirrorCErrorCode.KEY_BLOCKED.value: "CDK blocked.", + } + message = base_messages.get(code, f"MirrorC returned code {code}.") + + data, path_setup_toml = read_setup_toml() + data["General"]["mirrorc_cdk"] = cdk if code == MirrorCErrorCode.SUCCESS.value else "" + write_setup_toml(data, path_setup_toml) + + return { + "success": code == MirrorCErrorCode.SUCCESS.value, + "code": code, + "message": message, + "mirrorc_message": getattr(ret, "message", None), + "latest_version": getattr(ret, "latest_version_name", None), + "expires_at": expires_ts, + "expires_at_iso": expires_iso, + } + + +def get_local_version(setup_path: Optional[Path] = None) -> Tuple["VersionInfo", Dict[str, Any], str]: + data, path = read_setup_toml(setup_path) + general_section = data.get("General", {}) + version_value = general_section.get("current_BAAS_version") + try: + repo = pygit2.Repository(Path.cwd()) + _branch = repo.head.shorthand + if not version_value: + commit = repo.revparse_single("HEAD") + version_value = str(commit.id) + data.setdefault("General", {})["current_BAAS_version"] = version_value + with path.open("wb") as file: + tomli_w.dump(data, file) + except Exception: + version_value = "" + _branch = "master" + + return VersionInfo(version=version_value, source="setup.toml", path=path), data, _branch + + +def read_setup_toml(setup_path: Union[Path, None] = None) -> tuple[dict[str, Any], Union[Path, None]]: + path = setup_path or (Path.cwd() / "setup.toml") + if not path.exists(): + with path.open("wb") as file: + tomli_w.dump(DEFAULT_SETTINGS, file) + + with path.open("rb") as fp: + data = tomllib.load(fp) + return data, path + + +def write_setup_toml(content: dict, setup_path: Union[Path, None] = None) -> None: + path = setup_path or (Path.cwd() / "setup.toml") + if not path.exists(): + with path.open("wb") as file: + tomli_w.dump(DEFAULT_SETTINGS, file) + + with path.open("wb") as fp: + tomli_w.dump(content, fp) + + +def _select_remote_record( + local_version: Optional[str], + results: List[RepositoryResult], +) -> Optional[RepositoryResult]: + for record in results: + value = record.get("value") + if not record.get("success") or not value: + continue + if not local_version: + return record + if len(value) == len(local_version): + return record + return next((record for record in results if record.get("success") and record.get("value")), None) + + +def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: + """ + Detect whether a newer version is available. + + The function compares the version retrieved from setup.toml with the first + successful remote value (preferring matching formats) and returns a + structured response that can be consumed by service endpoints. + """ + try: + local_info, setup_toml, _branch = get_local_version() + method_name = setup_toml.setdefault("General", {}).get("get_remote_sha_method", None) + if not method_name: + repo_results = test_all_repo_sha(timeout=timeout) + method_name = _select_remote_record(local_info.version, repo_results).get("name") + setup_toml.setdefault("General", {})["get_remote_sha_method"] = method_name + with local_info.path.open("wb") as file: + tomli_w.dump(setup_toml, file) + + for ind, x in enumerate(get_remote_sha_methods): + if "branch" in x: + get_remote_sha_methods[ind]["branch"] = _branch + + method_config = list(filter(lambda x: x.get('name') == method_name, get_remote_sha_methods))[0] + repo_result = test_repo_sha(method_config, timeout=timeout) + remote_version = repo_result.get("value") if repo_result else None + + update_available = ( + bool(local_info.version) + and bool(remote_version) + and local_info.version != remote_version + ) + + return { + "local": local_info.version, + "remote": remote_version, + "update_available": update_available + } + + except: + import traceback + traceback.print_exc() + return {} + + +__all__ = [ + "check_for_update", + "test_all_repo_sha", + "validate_cdk", + "VersionInfo", + "read_setup_toml", + "write_setup_toml" +] From 888ecb3e23a788f06600104444943443bd84b8a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Fri, 21 Nov 2025 23:38:33 +0800 Subject: [PATCH 02/98] Fix: uv does need setuptools to support adb --- requirements.service.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.service.txt b/requirements.service.txt index 4d90f146c..f568bc4e2 100644 --- a/requirements.service.txt +++ b/requirements.service.txt @@ -1,6 +1,7 @@ # =========================== # # Core Utils # numpy < 2.0 # +setuptools # adbutils == 2.2.1 # uiautomator2 == 2.16.23 # opencv-python == 4.8.1.78 # From a6c14256003578286e4db17bda4dfc40da78621d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 24 Nov 2025 12:06:05 +0800 Subject: [PATCH 03/98] Update: Check local version every time --- service/utils/update.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/service/utils/update.py b/service/utils/update.py index 3848fa0dc..bd10b146e 100644 --- a/service/utils/update.py +++ b/service/utils/update.py @@ -192,17 +192,14 @@ def validate_cdk(cdk: str, timeout: float = 3.0) -> Dict[str, Any]: def get_local_version(setup_path: Optional[Path] = None) -> Tuple["VersionInfo", Dict[str, Any], str]: data, path = read_setup_toml(setup_path) - general_section = data.get("General", {}) - version_value = general_section.get("current_BAAS_version") try: repo = pygit2.Repository(Path.cwd()) _branch = repo.head.shorthand - if not version_value: - commit = repo.revparse_single("HEAD") - version_value = str(commit.id) - data.setdefault("General", {})["current_BAAS_version"] = version_value - with path.open("wb") as file: - tomli_w.dump(data, file) + commit = repo.revparse_single("HEAD") + version_value = str(commit.id) + data.setdefault("General", {})["current_BAAS_version"] = version_value + with path.open("wb") as file: + tomli_w.dump(data, file) except Exception: version_value = "" _branch = "master" From 823438614bfbc95fd6705365eb9e87ba30bd22d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 3 Dec 2025 18:20:26 +0800 Subject: [PATCH 04/98] Update requirements for Sub Utils and rich package --- requirements.service.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.service.txt b/requirements.service.txt index f568bc4e2..974f4e7ed 100644 --- a/requirements.service.txt +++ b/requirements.service.txt @@ -8,9 +8,10 @@ opencv-python == 4.8.1.78 # # =========================== # # =========================== # -# Process & Screenshot # +# Sub Utils # psutil # requests # +rich >= 14.2.0 # # =========================== # # =========================== # From 51269d637bc1a2e56d0f5b20d6eab03f7be47a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 3 Dec 2025 20:07:15 +0800 Subject: [PATCH 05/98] Fix: Refactor logging to use rich formatting and centralize setup Replaces custom logging and console output with a centralized rich-based logging format. Moves log handler and formatter setup to service/__init__.py via set_log_format(), and updates main.service.py and core/utils.py to use standard logging. Adds logging for config changes in config_manager.py and suppresses specific warnings for cleaner output. --- core/utils.py | 12 ++------ main.service.py | 33 ++-------------------- service/__init__.py | 59 +++++++++++++++++++++++++++++++++++++-- service/config_manager.py | 23 +++++++++++++++ 4 files changed, 85 insertions(+), 42 deletions(-) diff --git a/core/utils.py b/core/utils.py index e3c9ff7c9..805625344 100644 --- a/core/utils.py +++ b/core/utils.py @@ -1,11 +1,11 @@ import logging import sys import threading +import queue from datetime import datetime, timedelta, timezone from typing import Union from rich.console import Console -from rich.markup import escape console = Console() @@ -88,25 +88,19 @@ def __out__(self, message: str, level: int = 1, raw_print=False) -> None: "level": level, "message": message }) - print( - f'{STATUS_TERMINAL[level - 1]} | {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | {message}') + logging.log((level + 1) * 10, message) return while len(logging.root.handlers) > 0: logging.root.handlers.pop() - levels_str = ["INFO", "WARNING", "ERROR", "CRITICAL"] # If logger signal is not None, output log to logger signal # else output log to console - levels_color = ["#2d8cf0", "#ff9900", "#ed3f14", "#3e0480"] if self.logger_signal is not None: self.logs += f"{levels_str[level - 1]} | {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | {message}" self.logger_signal.emit(level, message) else: - console.print(f'[{levels_color[level - 1]}]' - f'{levels_str[level - 1]} |' - f' {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} |' - f' {escape(message)}[/]', soft_wrap=True) + logging.log((level + 1) * 10, message) def info(self, message: str) -> None: """ diff --git a/main.service.py b/main.service.py index 41272bee4..7c0fc14e1 100644 --- a/main.service.py +++ b/main.service.py @@ -1,41 +1,11 @@ import argparse import os - import uvicorn +from service import set_log_format DEFAULT_HOST = os.getenv("BAAS_SERVICE_HOST", "127.0.0.1") DEFAULT_PORT = int(os.getenv("BAAS_SERVICE_PORT", "8190")) -import logging, re - -ANSI_ESCAPE = re.compile(r'\x1b\[([0-9;]*[mGKH])') - -STATUS_TERMINAL = { - logging.INFO: " INFO", - logging.WARNING: " WARNING", - logging.ERROR: " ERROR", - logging.CRITICAL: "CRITICAL", -} - -class PlainFormatter(logging.Formatter): - def format(self, record): - level = STATUS_TERMINAL.get(record.levelno, " INFO") - log_fmt = f"{level} | %(asctime)s | %(message)s" - formatter = logging.Formatter(log_fmt, "%Y-%m-%d %H:%M:%S") - output = formatter.format(record) - - return ANSI_ESCAPE.sub('', output) - - -handler = logging.StreamHandler() -handler.setFormatter(PlainFormatter()) - -root = logging.getLogger() -root.setLevel(logging.INFO) -root.handlers = [handler] - - - def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Start BAAS service mode backend") @@ -47,6 +17,7 @@ def parse_args() -> argparse.Namespace: def main() -> None: + set_log_format() args = parse_args() config = uvicorn.Config( "service.app:app", diff --git a/service/__init__.py b/service/__init__.py index 5068dd815..e5ac92168 100644 --- a/service/__init__.py +++ b/service/__init__.py @@ -1,4 +1,59 @@ -from .app import app, context +def set_log_format(): + import logging + from datetime import datetime + from rich.console import Console + from rich.markup import escape + + console = Console() + + levels_label = { + logging.INFO: ("[INFO]", "#2d8cf0"), + logging.WARNING: ("[WARN]", "#ff9900"), + logging.ERROR: ("[ERRO]", "#ed3f14"), + logging.CRITICAL: ("[CRIT]", "#7c3aed"), + } + + class RichFormatter(logging.Formatter): + def format(self, record): + label, color = levels_label.get(record.levelno, ("INFO", "cyan")) + time_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + msg = escape(record.getMessage()) + level_tag = f"[{color} bold]{label}[/]" + time_tag = f"[dim]{time_str}[/dim]" + if record.levelno != logging.INFO: + msg = f"[{color} bold]{msg}[/]" + return f"{time_tag} {level_tag} {msg}" + + # ----------- Handler 直接输出到 console.print ----------- + class RichHandler(logging.Handler): + def emit(self, record): + try: + msg = self.format(record) + console.print(msg, soft_wrap=True) + except Exception: + self.handleError(record) + + # ----------- 使用 ---------- + handler = RichHandler() + handler.setFormatter(RichFormatter()) -__all__ = ['app', 'context'] + root = logging.getLogger() + root.setLevel(logging.INFO) + root.handlers = [handler] + + logging.getLogger("watchfiles").setLevel(logging.ERROR) + logging.getLogger("watchfiles.main").setLevel(logging.ERROR) + + +import warnings + +# Suppress warning from adbutils +warnings.filterwarnings( + "ignore", + message="pkg_resources is deprecated as an API", + category=UserWarning +) + +from .app import app, context +__all__ = ['app', 'context', 'set_log_format'] diff --git a/service/config_manager.py b/service/config_manager.py index 3959518d2..925984d8e 100644 --- a/service/config_manager.py +++ b/service/config_manager.py @@ -2,6 +2,7 @@ import asyncio import json +import logging import os import time from dataclasses import dataclass @@ -424,10 +425,32 @@ async def watch_filesystem(self) -> None: raise async def _handle_watch_batch(self, changes: Iterable[tuple[Change, str]]) -> None: + watch_dirs = [ + self._config_root, + ] + + watch_files = [ + self._root / "setup.toml", + ] + resource_changes: set[ResourceKey] = set() rescan_configs = False for change, raw_path in changes: path = Path(raw_path) + + in_watch_dir = any(path == d or d in path.parents for d in watch_dirs) + in_watch_file = any(path == f for f in watch_files) + + if not (in_watch_dir or in_watch_file): + continue + + try: + rel_path = path.relative_to(self._root) + except ValueError: + rel_path = path + + logging.info(f"{change.name}: {rel_path.as_posix()}") + if path.name == "setup.toml" and path.parent == self._root: resource_changes.add(("setup_toml", None)) continue From 8019db5f920ad346af6f71a99e86d6db1d2b5673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 3 Dec 2025 20:10:32 +0800 Subject: [PATCH 06/98] Update utils.py --- core/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/core/utils.py b/core/utils.py index 805625344..967eca0b4 100644 --- a/core/utils.py +++ b/core/utils.py @@ -9,6 +9,7 @@ console = Console() +levels_str = ["INFO", "WARNING", "ERROR", "CRITICAL"] def delay(wait=1): def decorator(func): From fd252145bf55baa73528c6693df08e77c490e70a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 16 Dec 2025 14:56:07 +0800 Subject: [PATCH 07/98] Feat: Add the frontend part --- service/app.py | 3 + service/dist/assets/highlight-BsptWXP5.js | 7 + service/dist/assets/highlight-BsptWXP5.js.br | Bin 0 -> 42983 bytes service/dist/assets/index-CcNZVzNR.css | 1 + service/dist/assets/index-CcNZVzNR.css.br | Bin 0 -> 13282 bytes service/dist/assets/index-DySAOzzf.js | 67 +++ service/dist/assets/index-DySAOzzf.js.br | Bin 0 -> 82223 bytes service/dist/assets/markdown-XJO5hUeu.js | 29 ++ service/dist/assets/markdown-XJO5hUeu.js.br | Bin 0 -> 41073 bytes service/dist/assets/misc-GeCjUSSS.js | 344 +++++++++++++ service/dist/assets/misc-GeCjUSSS.js.br | Bin 0 -> 29974 bytes service/dist/assets/motion-Dp9wOFzY.js | 25 + service/dist/assets/motion-Dp9wOFzY.js.br | Bin 0 -> 39726 bytes service/dist/assets/ui-CImlNgPE.js | 53 ++ service/dist/assets/ui-CImlNgPE.js.br | Bin 0 -> 64249 bytes service/dist/cursors/alternativeselect.cur | Bin 0 -> 503 bytes service/dist/cursors/areaselect.cur | Bin 0 -> 607 bytes service/dist/cursors/block.cur | Bin 0 -> 1702 bytes service/dist/cursors/help.cur | Bin 0 -> 1396 bytes service/dist/cursors/link.cur | Bin 0 -> 1050 bytes service/dist/cursors/move.cur | Bin 0 -> 804 bytes service/dist/cursors/normal.cur | Bin 0 -> 1021 bytes service/dist/cursors/pen.cur | Bin 0 -> 859 bytes service/dist/cursors/resizeDIAG1.cur | Bin 0 -> 874 bytes service/dist/cursors/resizeDIAG2.cur | Bin 0 -> 898 bytes service/dist/cursors/resizeNS.cur | Bin 0 -> 359 bytes service/dist/cursors/resizeWE.cur | Bin 0 -> 309 bytes service/dist/cursors/text_static_blue.cur | Bin 0 -> 406 bytes service/dist/cursors/text_static_white.cur | Bin 0 -> 391 bytes .../Auto clear mainline plot settings.md | 46 ++ .../Commonly used emulator adb address.md | 26 + .../de_DE/Description of normal graphs.md | 113 +++++ ...fficult Chart Configuration Description.md | 102 ++++ .../docs/de_DE/Frontend Development Guide.md | 103 ++++ .../de_DE/Guide for activity sweep fill in.md | 53 ++ ... BlueArchive game (first-use must read).md | 30 ++ .../Normal Sweeping Scanning Description.md | 62 +++ .../Scheduling Configuration Filling Guide.md | 83 ++++ ...ask force attributes required by region.md | 38 ++ ...orting guidelines on issues (important).md | 60 +++ .../Auto clear mainline plot settings.md | 46 ++ .../Commonly used emulator adb address.md | 24 + .../en_US/Description of normal graphs.md | 113 +++++ ...fficult Chart Configuration Description.md | 103 ++++ .../docs/en_US/Frontend Development Guide.md | 104 ++++ .../en_US/Guide for activity sweep fill in.md | 53 ++ ... BlueArchive game (first-use must read).md | 29 ++ .../Normal Sweeping Scanning Description.md | 61 +++ .../Scheduling Configuration Filling Guide.md | 83 ++++ ...ask force attributes required by region.md | 37 ++ ...orting guidelines on issues (important).md | 57 +++ service/dist/docs/entry.json | 304 ++++++++++++ service/dist/docs/entry.json.br | Bin 0 -> 5361 bytes .../Auto clear mainline plot settings.md | 46 ++ .../Commonly used emulator adb address.md | 26 + .../fr_FR/Description of normal graphs.md | 111 +++++ ...fficult Chart Configuration Description.md | 103 ++++ .../docs/fr_FR/Frontend Development Guide.md | 101 ++++ .../fr_FR/Guide for activity sweep fill in.md | 53 ++ ... BlueArchive game (first-use must read).md | 30 ++ .../Normal Sweeping Scanning Description.md | 63 +++ .../Scheduling Configuration Filling Guide.md | 85 ++++ ...ask force attributes required by region.md | 37 ++ ...orting guidelines on issues (important).md | 60 +++ .../Auto clear mainline plot settings.md | 46 ++ .../Commonly used emulator adb address.md | 28 ++ .../ja_JP/Description of normal graphs.md | 112 +++++ ...fficult Chart Configuration Description.md | 102 ++++ .../docs/ja_JP/Frontend Development Guide.md | 104 ++++ .../ja_JP/Guide for activity sweep fill in.md | 50 ++ ... BlueArchive game (first-use must read).md | 31 ++ .../Normal Sweeping Scanning Description.md | 64 +++ .../Scheduling Configuration Filling Guide.md | 84 ++++ ...ask force attributes required by region.md | 40 ++ ...orting guidelines on issues (important).md | 65 +++ .../Auto clear mainline plot settings.md | 46 ++ .../Commonly used emulator adb address.md | 26 + .../ko_KR/Description of normal graphs.md | 117 +++++ ...fficult Chart Configuration Description.md | 105 ++++ .../docs/ko_KR/Frontend Development Guide.md | 111 +++++ .../ko_KR/Guide for activity sweep fill in.md | 53 ++ ... BlueArchive game (first-use must read).md | 32 ++ .../Normal Sweeping Scanning Description.md | 62 +++ .../Scheduling Configuration Filling Guide.md | 86 ++++ ...ask force attributes required by region.md | 40 ++ ...orting guidelines on issues (important).md | 54 +++ .../Auto clear mainline plot settings.md | 46 ++ .../Commonly used emulator adb address.md | 25 + .../ru_RU/Description of normal graphs.md | 114 +++++ ...fficult Chart Configuration Description.md | 103 ++++ .../docs/ru_RU/Frontend Development Guide.md | 104 ++++ .../ru_RU/Guide for activity sweep fill in.md | 53 ++ ... BlueArchive game (first-use must read).md | 30 ++ .../Normal Sweeping Scanning Description.md | 63 +++ .../Scheduling Configuration Filling Guide.md | 79 +++ ...ask force attributes required by region.md | 36 ++ ...orting guidelines on issues (important).md | 65 +++ .../Auto clear mainline plot settings.md | 46 ++ .../Commonly used emulator adb address.md | 29 ++ .../zh_CN/Description of normal graphs.md | 111 +++++ ...fficult Chart Configuration Description.md | 102 ++++ .../docs/zh_CN/Frontend Development Guide.md | 102 ++++ .../zh_CN/Guide for activity sweep fill in.md | 41 ++ ... BlueArchive game (first-use must read).md | 29 ++ .../Normal Sweeping Scanning Description.md | 47 ++ .../Scheduling Configuration Filling Guide.md | 66 +++ ...ask force attributes required by region.md | 35 ++ ...orting guidelines on issues (important).md | 59 +++ service/dist/favicon.ico | Bin 0 -> 15406 bytes service/dist/fonts/JetBrainsMono.ttf | Bin 0 -> 189028 bytes .../dist/fonts/SourceHanSans-Subset-JP.woff2 | Bin 0 -> 258428 bytes .../dist/fonts/SourceHanSans-Subset-SC.woff2 | Bin 0 -> 266404 bytes .../dist/icons/property/currency_icon_ap.webp | Bin 0 -> 5976 bytes .../icons/property/currency_icon_gem.webp | Bin 0 -> 7966 bytes .../icons/property/currency_icon_gold.webp | Bin 0 -> 9124 bytes .../icons/property/item_icon_arenacoin.webp | Bin 0 -> 13150 bytes .../icons/property/item_icon_chasecoin.webp | Bin 0 -> 12830 bytes .../icons/property/item_icon_craftitem_0.webp | Bin 0 -> 9760 bytes .../icons/property/item_icon_craftitem_1.webp | Bin 0 -> 15208 bytes .../dist/icons/property/item_icon_pass.webp | Bin 0 -> 15342 bytes service/dist/icons/regular/ic_warning.svg | 13 + service/dist/images/bg-dark.webp | Bin 0 -> 251202 bytes service/dist/images/bg-light.webp | Bin 0 -> 289662 bytes service/dist/images/logo.png | Bin 0 -> 126799 bytes service/dist/index.html | 20 + service/dist/locales/de.json | 449 +++++++++++++++++ service/dist/locales/de.json.br | Bin 0 -> 6286 bytes service/dist/locales/en.json | 450 +++++++++++++++++ service/dist/locales/en.json.br | Bin 0 -> 5167 bytes service/dist/locales/fr.json | 449 +++++++++++++++++ service/dist/locales/fr.json.br | Bin 0 -> 6297 bytes service/dist/locales/ja.json | 449 +++++++++++++++++ service/dist/locales/ja.json.br | Bin 0 -> 6203 bytes service/dist/locales/ko.json | 449 +++++++++++++++++ service/dist/locales/ko.json.br | Bin 0 -> 5895 bytes service/dist/locales/ru.json | 449 +++++++++++++++++ service/dist/locales/ru.json.br | Bin 0 -> 6768 bytes service/dist/locales/zh.json | 454 ++++++++++++++++++ service/dist/locales/zh.json.br | Bin 0 -> 5534 bytes service/dist/scripts/fernetBrowser.min.js | 10 + service/dist/scripts/fernetBrowser.min.js.br | Bin 0 -> 17572 bytes 141 files changed, 9009 insertions(+) create mode 100644 service/dist/assets/highlight-BsptWXP5.js create mode 100644 service/dist/assets/highlight-BsptWXP5.js.br create mode 100644 service/dist/assets/index-CcNZVzNR.css create mode 100644 service/dist/assets/index-CcNZVzNR.css.br create mode 100644 service/dist/assets/index-DySAOzzf.js create mode 100644 service/dist/assets/index-DySAOzzf.js.br create mode 100644 service/dist/assets/markdown-XJO5hUeu.js create mode 100644 service/dist/assets/markdown-XJO5hUeu.js.br create mode 100644 service/dist/assets/misc-GeCjUSSS.js create mode 100644 service/dist/assets/misc-GeCjUSSS.js.br create mode 100644 service/dist/assets/motion-Dp9wOFzY.js create mode 100644 service/dist/assets/motion-Dp9wOFzY.js.br create mode 100644 service/dist/assets/ui-CImlNgPE.js create mode 100644 service/dist/assets/ui-CImlNgPE.js.br create mode 100644 service/dist/cursors/alternativeselect.cur create mode 100644 service/dist/cursors/areaselect.cur create mode 100644 service/dist/cursors/block.cur create mode 100644 service/dist/cursors/help.cur create mode 100644 service/dist/cursors/link.cur create mode 100644 service/dist/cursors/move.cur create mode 100644 service/dist/cursors/normal.cur create mode 100644 service/dist/cursors/pen.cur create mode 100644 service/dist/cursors/resizeDIAG1.cur create mode 100644 service/dist/cursors/resizeDIAG2.cur create mode 100644 service/dist/cursors/resizeNS.cur create mode 100644 service/dist/cursors/resizeWE.cur create mode 100644 service/dist/cursors/text_static_blue.cur create mode 100644 service/dist/cursors/text_static_white.cur create mode 100644 service/dist/docs/de_DE/Auto clear mainline plot settings.md create mode 100644 service/dist/docs/de_DE/Commonly used emulator adb address.md create mode 100644 service/dist/docs/de_DE/Description of normal graphs.md create mode 100644 service/dist/docs/de_DE/Difficult Chart Configuration Description.md create mode 100644 service/dist/docs/de_DE/Frontend Development Guide.md create mode 100644 service/dist/docs/de_DE/Guide for activity sweep fill in.md create mode 100644 service/dist/docs/de_DE/Internal settings in BlueArchive game (first-use must read).md create mode 100644 service/dist/docs/de_DE/Normal Sweeping Scanning Description.md create mode 100644 service/dist/docs/de_DE/Scheduling Configuration Filling Guide.md create mode 100644 service/dist/docs/de_DE/Task force attributes required by region.md create mode 100644 service/dist/docs/de_DE/reporting guidelines on issues (important).md create mode 100644 service/dist/docs/en_US/Auto clear mainline plot settings.md create mode 100644 service/dist/docs/en_US/Commonly used emulator adb address.md create mode 100644 service/dist/docs/en_US/Description of normal graphs.md create mode 100644 service/dist/docs/en_US/Difficult Chart Configuration Description.md create mode 100644 service/dist/docs/en_US/Frontend Development Guide.md create mode 100644 service/dist/docs/en_US/Guide for activity sweep fill in.md create mode 100644 service/dist/docs/en_US/Internal settings in BlueArchive game (first-use must read).md create mode 100644 service/dist/docs/en_US/Normal Sweeping Scanning Description.md create mode 100644 service/dist/docs/en_US/Scheduling Configuration Filling Guide.md create mode 100644 service/dist/docs/en_US/Task force attributes required by region.md create mode 100644 service/dist/docs/en_US/reporting guidelines on issues (important).md create mode 100644 service/dist/docs/entry.json create mode 100644 service/dist/docs/entry.json.br create mode 100644 service/dist/docs/fr_FR/Auto clear mainline plot settings.md create mode 100644 service/dist/docs/fr_FR/Commonly used emulator adb address.md create mode 100644 service/dist/docs/fr_FR/Description of normal graphs.md create mode 100644 service/dist/docs/fr_FR/Difficult Chart Configuration Description.md create mode 100644 service/dist/docs/fr_FR/Frontend Development Guide.md create mode 100644 service/dist/docs/fr_FR/Guide for activity sweep fill in.md create mode 100644 service/dist/docs/fr_FR/Internal settings in BlueArchive game (first-use must read).md create mode 100644 service/dist/docs/fr_FR/Normal Sweeping Scanning Description.md create mode 100644 service/dist/docs/fr_FR/Scheduling Configuration Filling Guide.md create mode 100644 service/dist/docs/fr_FR/Task force attributes required by region.md create mode 100644 service/dist/docs/fr_FR/reporting guidelines on issues (important).md create mode 100644 service/dist/docs/ja_JP/Auto clear mainline plot settings.md create mode 100644 service/dist/docs/ja_JP/Commonly used emulator adb address.md create mode 100644 service/dist/docs/ja_JP/Description of normal graphs.md create mode 100644 service/dist/docs/ja_JP/Difficult Chart Configuration Description.md create mode 100644 service/dist/docs/ja_JP/Frontend Development Guide.md create mode 100644 service/dist/docs/ja_JP/Guide for activity sweep fill in.md create mode 100644 service/dist/docs/ja_JP/Internal settings in BlueArchive game (first-use must read).md create mode 100644 service/dist/docs/ja_JP/Normal Sweeping Scanning Description.md create mode 100644 service/dist/docs/ja_JP/Scheduling Configuration Filling Guide.md create mode 100644 service/dist/docs/ja_JP/Task force attributes required by region.md create mode 100644 service/dist/docs/ja_JP/reporting guidelines on issues (important).md create mode 100644 service/dist/docs/ko_KR/Auto clear mainline plot settings.md create mode 100644 service/dist/docs/ko_KR/Commonly used emulator adb address.md create mode 100644 service/dist/docs/ko_KR/Description of normal graphs.md create mode 100644 service/dist/docs/ko_KR/Difficult Chart Configuration Description.md create mode 100644 service/dist/docs/ko_KR/Frontend Development Guide.md create mode 100644 service/dist/docs/ko_KR/Guide for activity sweep fill in.md create mode 100644 service/dist/docs/ko_KR/Internal settings in BlueArchive game (first-use must read).md create mode 100644 service/dist/docs/ko_KR/Normal Sweeping Scanning Description.md create mode 100644 service/dist/docs/ko_KR/Scheduling Configuration Filling Guide.md create mode 100644 service/dist/docs/ko_KR/Task force attributes required by region.md create mode 100644 service/dist/docs/ko_KR/reporting guidelines on issues (important).md create mode 100644 service/dist/docs/ru_RU/Auto clear mainline plot settings.md create mode 100644 service/dist/docs/ru_RU/Commonly used emulator adb address.md create mode 100644 service/dist/docs/ru_RU/Description of normal graphs.md create mode 100644 service/dist/docs/ru_RU/Difficult Chart Configuration Description.md create mode 100644 service/dist/docs/ru_RU/Frontend Development Guide.md create mode 100644 service/dist/docs/ru_RU/Guide for activity sweep fill in.md create mode 100644 service/dist/docs/ru_RU/Internal settings in BlueArchive game (first-use must read).md create mode 100644 service/dist/docs/ru_RU/Normal Sweeping Scanning Description.md create mode 100644 service/dist/docs/ru_RU/Scheduling Configuration Filling Guide.md create mode 100644 service/dist/docs/ru_RU/Task force attributes required by region.md create mode 100644 service/dist/docs/ru_RU/reporting guidelines on issues (important).md create mode 100644 service/dist/docs/zh_CN/Auto clear mainline plot settings.md create mode 100644 service/dist/docs/zh_CN/Commonly used emulator adb address.md create mode 100644 service/dist/docs/zh_CN/Description of normal graphs.md create mode 100644 service/dist/docs/zh_CN/Difficult Chart Configuration Description.md create mode 100644 service/dist/docs/zh_CN/Frontend Development Guide.md create mode 100644 service/dist/docs/zh_CN/Guide for activity sweep fill in.md create mode 100644 service/dist/docs/zh_CN/Internal settings in BlueArchive game (first-use must read).md create mode 100644 service/dist/docs/zh_CN/Normal Sweeping Scanning Description.md create mode 100644 service/dist/docs/zh_CN/Scheduling Configuration Filling Guide.md create mode 100644 service/dist/docs/zh_CN/Task force attributes required by region.md create mode 100644 service/dist/docs/zh_CN/reporting guidelines on issues (important).md create mode 100644 service/dist/favicon.ico create mode 100644 service/dist/fonts/JetBrainsMono.ttf create mode 100644 service/dist/fonts/SourceHanSans-Subset-JP.woff2 create mode 100644 service/dist/fonts/SourceHanSans-Subset-SC.woff2 create mode 100644 service/dist/icons/property/currency_icon_ap.webp create mode 100644 service/dist/icons/property/currency_icon_gem.webp create mode 100644 service/dist/icons/property/currency_icon_gold.webp create mode 100644 service/dist/icons/property/item_icon_arenacoin.webp create mode 100644 service/dist/icons/property/item_icon_chasecoin.webp create mode 100644 service/dist/icons/property/item_icon_craftitem_0.webp create mode 100644 service/dist/icons/property/item_icon_craftitem_1.webp create mode 100644 service/dist/icons/property/item_icon_pass.webp create mode 100644 service/dist/icons/regular/ic_warning.svg create mode 100644 service/dist/images/bg-dark.webp create mode 100644 service/dist/images/bg-light.webp create mode 100644 service/dist/images/logo.png create mode 100644 service/dist/index.html create mode 100644 service/dist/locales/de.json create mode 100644 service/dist/locales/de.json.br create mode 100644 service/dist/locales/en.json create mode 100644 service/dist/locales/en.json.br create mode 100644 service/dist/locales/fr.json create mode 100644 service/dist/locales/fr.json.br create mode 100644 service/dist/locales/ja.json create mode 100644 service/dist/locales/ja.json.br create mode 100644 service/dist/locales/ko.json create mode 100644 service/dist/locales/ko.json.br create mode 100644 service/dist/locales/ru.json create mode 100644 service/dist/locales/ru.json.br create mode 100644 service/dist/locales/zh.json create mode 100644 service/dist/locales/zh.json.br create mode 100644 service/dist/scripts/fernetBrowser.min.js create mode 100644 service/dist/scripts/fernetBrowser.min.js.br diff --git a/service/app.py b/service/app.py index 4d2a88cee..48f64ef30 100644 --- a/service/app.py +++ b/service/app.py @@ -10,6 +10,7 @@ from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect from starlette.middleware.cors import CORSMiddleware +from starlette.staticfiles import StaticFiles from .context import ServiceContext from .encryption import AuthenticationError, CipherBox, HandshakeResponse, HandshakeSession @@ -362,3 +363,5 @@ async def websocket_heartbeat(websocket: WebSocket) -> None: task.cancel() with contextlib.suppress(asyncio.CancelledError): await task + +app.mount("/", StaticFiles(directory="service/dist", html=True), name="static") diff --git a/service/dist/assets/highlight-BsptWXP5.js b/service/dist/assets/highlight-BsptWXP5.js new file mode 100644 index 000000000..04898bf2d --- /dev/null +++ b/service/dist/assets/highlight-BsptWXP5.js @@ -0,0 +1,7 @@ +import{g as Wn}from"./motion-Dp9wOFzY.js";function Wr(){}function Yr(){}const mt=(function(e){if(e==null)return Vn;if(typeof e=="function")return Xe(e);if(typeof e=="object")return Array.isArray(e)?Yn(e):Zn(e);if(typeof e=="string")return Xn(e);throw new Error("Expected function, string, or object as test")});function Yn(e){const t=[];let i=-1;for(;++i":""))+")"})}return p;function p(){let f=Zt,N,_,y;if((!t||d(l,c,g[g.length-1]||void 0))&&(f=ti(i(l,g)),f[0]===Dt))return f;if("children"in l&&l.children){const w=l;if(w.children&&f[0]!==jn)for(_=(r?w.children.length:-1)+o,y=g.concat(w);_>-1&&_c&&(c=g):g&&(c!==void 0&&c>-1&&l.push(` +`.repeat(c)||" "),c=-1,l.push(g))}return l.join("")}function Vt(e,t,i){return e.type==="element"?di(e,t,i):e.type==="text"?i.whitespace==="normal"?Qt(e,i):ui(e):[]}function di(e,t,i){const r=Jt(e,i),a=e.children||[];let d=-1,o=[];if(ci(e))return o;let s,l;for(bt(e)||$t(e)&&Bt(t,e,$t)?l=` +`:si(e)?(s=2,l=2):Xt(e)&&(s=1,l=1);++d]+>")+")",s={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},g={className:"number",variants:[{begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"},{begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"}],relevance:0},m={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{className:"string",begin:/<.*?>/},i,e.C_BLOCK_COMMENT_MODE]},p={className:"title",begin:t.optional(a)+e.IDENT_RE,relevance:0},f=t.optional(a)+e.IDENT_RE+"\\s*\\(",N=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],_=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],y=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],w=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],k={type:_,keyword:N,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:y},D={className:"function.dispatch",relevance:0,keywords:{_hint:w},begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))},x=[D,m,s,i,e.C_BLOCK_COMMENT_MODE,g,c],q={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:k,contains:x.concat([{begin:/\(/,end:/\)/,keywords:k,contains:x.concat(["self"]),relevance:0}]),relevance:0},z={className:"function",begin:"("+o+"[\\*&\\s]+)+"+f,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:k,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:k,relevance:0},{begin:f,returnBegin:!0,contains:[p],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[c,g]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:[i,e.C_BLOCK_COMMENT_MODE,c,g,s,{begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:["self",i,e.C_BLOCK_COMMENT_MODE,c,g,s]}]},s,i,e.C_BLOCK_COMMENT_MODE,m]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:k,illegal:"",keywords:k,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:k},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function _i(e){const t={type:["boolean","byte","word","String"],built_in:["KeyboardController","MouseController","SoftwareSerial","EthernetServer","EthernetClient","LiquidCrystal","RobotControl","GSMVoiceCall","EthernetUDP","EsploraTFT","HttpClient","RobotMotor","WiFiClient","GSMScanner","FileSystem","Scheduler","GSMServer","YunClient","YunServer","IPAddress","GSMClient","GSMModem","Keyboard","Ethernet","Console","GSMBand","Esplora","Stepper","Process","WiFiUDP","GSM_SMS","Mailbox","USBHost","Firmata","PImage","Client","Server","GSMPIN","FileIO","Bridge","Serial","EEPROM","Stream","Mouse","Audio","Servo","File","Task","GPRS","WiFi","Wire","TFT","GSM","SPI","SD"],_hints:["setup","loop","runShellCommandAsynchronously","analogWriteResolution","retrieveCallingNumber","printFirmwareVersion","analogReadResolution","sendDigitalPortPair","noListenOnLocalhost","readJoystickButton","setFirmwareVersion","readJoystickSwitch","scrollDisplayRight","getVoiceCallStatus","scrollDisplayLeft","writeMicroseconds","delayMicroseconds","beginTransmission","getSignalStrength","runAsynchronously","getAsynchronously","listenOnLocalhost","getCurrentCarrier","readAccelerometer","messageAvailable","sendDigitalPorts","lineFollowConfig","countryNameWrite","runShellCommand","readStringUntil","rewindDirectory","readTemperature","setClockDivider","readLightSensor","endTransmission","analogReference","detachInterrupt","countryNameRead","attachInterrupt","encryptionType","readBytesUntil","robotNameWrite","readMicrophone","robotNameRead","cityNameWrite","userNameWrite","readJoystickY","readJoystickX","mouseReleased","openNextFile","scanNetworks","noInterrupts","digitalWrite","beginSpeaker","mousePressed","isActionDone","mouseDragged","displayLogos","noAutoscroll","addParameter","remoteNumber","getModifiers","keyboardRead","userNameRead","waitContinue","processInput","parseCommand","printVersion","readNetworks","writeMessage","blinkVersion","cityNameRead","readMessage","setDataMode","parsePacket","isListening","setBitOrder","beginPacket","isDirectory","motorsWrite","drawCompass","digitalRead","clearScreen","serialEvent","rightToLeft","setTextSize","leftToRight","requestFrom","keyReleased","compassRead","analogWrite","interrupts","WiFiServer","disconnect","playMelody","parseFloat","autoscroll","getPINUsed","setPINUsed","setTimeout","sendAnalog","readSlider","analogRead","beginWrite","createChar","motorsStop","keyPressed","tempoWrite","readButton","subnetMask","debugPrint","macAddress","writeGreen","randomSeed","attachGPRS","readString","sendString","remotePort","releaseAll","mouseMoved","background","getXChange","getYChange","answerCall","getResult","voiceCall","endPacket","constrain","getSocket","writeJSON","getButton","available","connected","findUntil","readBytes","exitValue","readGreen","writeBlue","startLoop","IPAddress","isPressed","sendSysex","pauseMode","gatewayIP","setCursor","getOemKey","tuneWrite","noDisplay","loadImage","switchPIN","onRequest","onReceive","changePIN","playFile","noBuffer","parseInt","overflow","checkPIN","knobRead","beginTFT","bitClear","updateIR","bitWrite","position","writeRGB","highByte","writeRed","setSpeed","readBlue","noStroke","remoteIP","transfer","shutdown","hangCall","beginSMS","endWrite","attached","maintain","noCursor","checkReg","checkPUK","shiftOut","isValid","shiftIn","pulseIn","connect","println","localIP","pinMode","getIMEI","display","noBlink","process","getBand","running","beginSD","drawBMP","lowByte","setBand","release","bitRead","prepare","pointTo","readRed","setMode","noFill","remove","listen","stroke","detach","attach","noTone","exists","buffer","height","bitSet","circle","config","cursor","random","IRread","setDNS","endSMS","getKey","micros","millis","begin","print","write","ready","flush","width","isPIN","blink","clear","press","mkdir","rmdir","close","point","yield","image","BSSID","click","delay","read","text","move","peek","beep","rect","line","open","seek","fill","size","turn","stop","home","find","step","tone","sqrt","RSSI","SSID","end","bit","tan","cos","sin","pow","map","abs","max","min","get","run","put"],literal:["DIGITAL_MESSAGE","FIRMATA_STRING","ANALOG_MESSAGE","REPORT_DIGITAL","REPORT_ANALOG","INPUT_PULLUP","SET_PIN_MODE","INTERNAL2V56","SYSTEM_RESET","LED_BUILTIN","INTERNAL1V1","SYSEX_START","INTERNAL","EXTERNAL","DEFAULT","OUTPUT","INPUT","HIGH","LOW"]},i=fi(e),r=i.keywords;return r.type=[...r.type,...t.type],r.literal=[...r.literal,...t.literal],r.built_in=[...r.built_in,...t.built_in],r._hints=t._hints,i.name="Arduino",i.aliases=["ino"],i.supersetOf="cpp",i}function Ei(e){const t=e.regex,i={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[i]}]};Object.assign(i,{className:"variable",variants:[{begin:t.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},d=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),o={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i,a]};a.contains.push(s);const l={match:/\\"/},c={className:"string",begin:/'/,end:/'/},g={match:/\\'/},m={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,i]},p=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],f=e.SHEBANG({binary:`(${p.join("|")})`,relevance:10}),N={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},_=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],y=["true","false"],w={match:/(\/[a-z._-]+)+/},I=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],L=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],k=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],D=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:_,literal:y,built_in:[...I,...L,"set","shopt",...k,...D]},contains:[f,e.SHEBANG(),N,m,d,o,w,s,l,c,g,i]}}function hi(e){const t=e.regex,i=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",a="[a-zA-Z_]\\w*::",o="("+r+"|"+t.optional(a)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{match:/\batomic_[a-z]{3,6}\b/}]},c={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},g={className:"number",variants:[{match:/\b(0b[01']+)/},{match:/(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/},{match:/(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/},{match:/(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/}],relevance:0},m={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{className:"string",begin:/<.*?>/},i,e.C_BLOCK_COMMENT_MODE]},p={className:"title",begin:t.optional(a)+e.IDENT_RE,relevance:0},f=t.optional(a)+e.IDENT_RE+"\\s*\\(",y={keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"],literal:"true false NULL",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"},w=[m,s,i,e.C_BLOCK_COMMENT_MODE,g,c],I={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:y,contains:w.concat([{begin:/\(/,end:/\)/,keywords:y,contains:w.concat(["self"]),relevance:0}]),relevance:0},L={begin:"("+o+"[\\*&\\s]+)+"+f,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:y,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:y,relevance:0},{begin:f,returnBegin:!0,contains:[e.inherit(p,{className:"title.function"})],relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:y,relevance:0,contains:[i,e.C_BLOCK_COMMENT_MODE,c,g,s,{begin:/\(/,end:/\)/,keywords:y,relevance:0,contains:["self",i,e.C_BLOCK_COMMENT_MODE,c,g,s]}]},s,i,e.C_BLOCK_COMMENT_MODE,m]};return{name:"C",aliases:["h"],keywords:y,disableAutodetect:!0,illegal:"=]/,contains:[{beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:m,strings:c,keywords:y}}}function Ni(e){const t=e.regex,i=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",a="[a-zA-Z_]\\w*::",o="(?!struct)("+r+"|"+t.optional(a)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},g={className:"number",variants:[{begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"},{begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"}],relevance:0},m={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{className:"string",begin:/<.*?>/},i,e.C_BLOCK_COMMENT_MODE]},p={className:"title",begin:t.optional(a)+e.IDENT_RE,relevance:0},f=t.optional(a)+e.IDENT_RE+"\\s*\\(",N=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],_=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],y=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],w=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],k={type:_,keyword:N,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:y},D={className:"function.dispatch",relevance:0,keywords:{_hint:w},begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))},x=[D,m,s,i,e.C_BLOCK_COMMENT_MODE,g,c],q={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:k,contains:x.concat([{begin:/\(/,end:/\)/,keywords:k,contains:x.concat(["self"]),relevance:0}]),relevance:0},z={className:"function",begin:"("+o+"[\\*&\\s]+)+"+f,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:k,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:k,relevance:0},{begin:f,returnBegin:!0,contains:[p],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[c,g]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:[i,e.C_BLOCK_COMMENT_MODE,c,g,s,{begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:["self",i,e.C_BLOCK_COMMENT_MODE,c,g,s]}]},s,i,e.C_BLOCK_COMMENT_MODE,m]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:k,illegal:"",keywords:k,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:k},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function yi(e){const t=["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"],i=["public","private","protected","static","internal","protected","abstract","async","extern","override","unsafe","virtual","new","sealed","partial"],r=["default","false","null","true"],a=["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"],d=["add","alias","and","ascending","args","async","await","by","descending","dynamic","equals","file","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","record","remove","required","scoped","select","set","unmanaged","value|0","var","when","where","with","yield"],o={keyword:a.concat(d),built_in:t,literal:r},s=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),l={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},c={className:"string",begin:/"""("*)(?!")(.|\n)*?"""\1/,relevance:1},g={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},m=e.inherit(g,{illegal:/\n/}),p={className:"subst",begin:/\{/,end:/\}/,keywords:o},f=e.inherit(p,{illegal:/\n/}),N={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},e.BACKSLASH_ESCAPE,f]},_={className:"string",begin:/\$@"/,end:'"',contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},p]},y=e.inherit(_,{illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},f]});p.contains=[_,N,g,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,l,e.C_BLOCK_COMMENT_MODE],f.contains=[y,N,m,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,l,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];const w={variants:[c,_,N,g,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},I={begin:"<",end:">",contains:[{beginKeywords:"in out"},s]},L=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",k={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:o,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:""},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},w,l,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},s,I,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[s,I,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+L+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:o,contains:[{beginKeywords:i.join(" "),relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[e.TITLE_MODE,I],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,relevance:0,contains:[w,l,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},k]}}const Ti=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),wi=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Si=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],vi=[...wi,...Si],Ai=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),Oi=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),Ri=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),ki=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function Mi(e){const t=e.regex,i=Ti(e),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},a="and or not only",d=/@-?\w[\w]*(-\w+)*/,o="[a-zA-Z-][a-zA-Z0-9_-]*",s=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[i.BLOCK_COMMENT,r,i.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+o,relevance:0},i.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+Oi.join("|")+")"},{begin:":(:)?("+Ri.join("|")+")"}]},i.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ki.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[i.BLOCK_COMMENT,i.HEXCOLOR,i.IMPORTANT,i.CSS_NUMBER_MODE,...s,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...s,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},i.FUNCTION_DISPATCH]},{begin:t.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:d},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:a,attribute:Ai.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...s,i.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+vi.join("|")+")\\b"}]}}function Ii(e){const t=e.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:t.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:t.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}function xi(e){const d={keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],literal:["true","false","iota","nil"],built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]};return{name:"Go",aliases:["golang"],keywords:d,illegal:"jt(e,t,i-1))}function Di(e){const t=e.regex,i="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",r=i+jt("(?:<"+i+"~~~(?:\\s*,\\s*"+i+"~~~)*>)?",/~~~/g,2),l={keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto","when"],literal:["false","true","null"],type:["char","boolean","long","float","int","byte","short","double"],built_in:["super","this"]},c={className:"meta",begin:"@"+i,contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},g={className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:l,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[e.BACKSLASH_ESCAPE]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,i],className:{1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{begin:[t.concat(/(?!else)/,i),/\s+/,i,/\s+/,/=(?!=)/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,i],className:{1:"keyword",3:"title.class"},contains:[g,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+r+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:l,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[c,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,zt,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},zt,c]}}const Gt="[A-Za-z$_][0-9A-Za-z$_]*",Bi=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],Pi=["true","false","null","undefined","NaN","Infinity"],en=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],tn=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],nn=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Ui=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],Fi=[].concat(nn,en,tn);function $i(e){const t=e.regex,i=(P,{after:j})=>{const ae="",end:""},d=/<[A-Za-z0-9\\._:-]+\s*\/>/,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(P,j)=>{const ae=P[0].length+P.index,ne=P.input[ae];if(ne==="<"||ne===","){j.ignoreMatch();return}ne===">"&&(i(P,{after:ae})||j.ignoreMatch());let ee;const _e=P.input.substring(ae);if(ee=_e.match(/^\s*=/)){j.ignoreMatch();return}if((ee=_e.match(/^\s+extends\s+/))&&ee.index===0){j.ignoreMatch();return}}},s={$pattern:Gt,keyword:Bi,literal:Pi,built_in:Fi,"variable.language":Ui},l="[0-9](_?[0-9])*",c=`\\.(${l})`,g="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",m={className:"number",variants:[{begin:`(\\b(${g})((${c})|\\.)?|(${c}))[eE][+-]?(${l})\\b`},{begin:`\\b(${g})\\b((${c})\\b|\\.)?|(${c})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},p={className:"subst",begin:"\\$\\{",end:"\\}",keywords:s,contains:[]},f={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"xml"}},N={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"css"}},_={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"graphql"}},y={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,p]},I={className:"comment",variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},L=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,f,N,_,y,{match:/\$\d+/},m];p.contains=L.concat({begin:/\{/,end:/\}/,keywords:s,contains:["self"].concat(L)});const k=[].concat(I,p.contains),D=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:s,contains:["self"].concat(k)}]),x={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:D},q={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,"(",t.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},z={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...en,...tn]}},H={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},se={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[x],illegal:/%/},de={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function le(P){return t.concat("(?!",P.join("|"),")")}const ue={match:t.concat(/\b/,le([...nn,"super","import"].map(P=>`${P}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:"title.function",relevance:0},W={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},V={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},x]},re="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",fe={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(re)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[x]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:s,exports:{PARAMS_CONTAINS:D,CLASS_REFERENCE:z},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),H,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,f,N,_,y,I,{match:/\$\d+/},m,z,{scope:"attr",match:r+t.lookahead(":"),relevance:0},fe,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[I,e.REGEXP_MODE,{className:"function",begin:re,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:D}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:d},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0,contains:["self"]}]}]},se,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[x,e.inherit(e.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},W,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[x]},ue,de,q,V,{match:/\$[(.]/}]}}function zi(e){const t={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},i={match:/[{}[\],:]/,className:"punctuation",relevance:0},r=["true","false","null"],a={scope:"literal",beginKeywords:r.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:r},contains:[t,i,e.QUOTE_STRING_MODE,a,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}var Me="[0-9](_*[0-9])*",He=`\\.(${Me})`,qe="[0-9a-fA-F](_*[0-9a-fA-F])*",Gi={className:"number",variants:[{begin:`(\\b(${Me})((${He})|\\.)?|(${He}))[eE][+-]?(${Me})[fFdD]?\\b`},{begin:`\\b(${Me})((${He})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${He})[fFdD]?\\b`},{begin:`\\b(${Me})[fFdD]\\b`},{begin:`\\b0[xX]((${qe})\\.?|(${qe})?\\.(${qe}))[pP][+-]?(${Me})[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${qe})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],relevance:0};function Ki(e){const t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},i={className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},r={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},d={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},o={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[d,a]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,d,a]}]};a.contains.push(o);const s={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(o,{className:"string"}),"self"]}]},c=Gi,g=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),m={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},p=m;return p.variants[1].contains=[m],m.variants[1].contains=[p],{name:"Kotlin",aliases:["kt","kts"],keywords:t,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,g,i,r,s,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:t,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:t,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[m,e.C_LINE_COMMENT_MODE,g],relevance:0},e.C_LINE_COMMENT_MODE,g,s,l,o,e.C_NUMBER_MODE]},g]},{begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/,excludeBegin:!0,returnEnd:!0},s,l]},o,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:` +`},c]}}const Hi=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),qi=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Wi=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],Yi=[...qi,...Wi],Zi=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),rn=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),an=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),Xi=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse(),Vi=rn.concat(an).sort().reverse();function Qi(e){const t=Hi(e),i=Vi,r="and or not only",a="[\\w-]+",d="("+a+"|@\\{"+a+"\\})",o=[],s=[],l=function(L){return{className:"string",begin:"~?"+L+".*?"+L}},c=function(L,k,D){return{className:L,begin:k,relevance:D}},g={$pattern:/[a-z-]+/,keyword:r,attribute:Zi.join(" ")},m={begin:"\\(",end:"\\)",contains:s,keywords:g,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l("'"),l('"'),t.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},t.HEXCOLOR,m,c("variable","@@?"+a,10),c("variable","@\\{"+a+"\\}"),c("built_in","~?`[^`]*?`"),{className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0},t.IMPORTANT,{beginKeywords:"and not"},t.FUNCTION_DISPATCH);const p=s.concat({begin:/\{/,end:/\}/,contains:o}),f={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},N={begin:d+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+Xi.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},_={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",keywords:g,returnEnd:!0,contains:s,relevance:0}},y={className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a}],starts:{end:"[;}]",returnEnd:!0,contains:p}},w={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0,returnEnd:!0,illegal:`[<='$"]`,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,f,c("keyword","all\\b"),c("variable","@\\{"+a+"\\}"),{begin:"\\b("+Yi.join("|")+")\\b",className:"selector-tag"},t.CSS_NUMBER_MODE,c("selector-tag",d,0),c("selector-id","#"+d),c("selector-class","\\."+d,0),c("selector-tag","&",0),t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",begin:":("+rn.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+an.join("|")+")"},{begin:/\(/,end:/\)/,relevance:0,contains:p},{begin:"!important"},t.FUNCTION_DISPATCH]},I={begin:a+`:(:)?(${i.join("|")})`,returnBegin:!0,contains:[w]};return o.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,_,y,I,N,w,f,t.FUNCTION_DISPATCH),{name:"Less",case_insensitive:!0,illegal:`[=>'/<($"]`,contains:o}}function Ji(e){const t="\\[=*\\[",i="\\]=*\\]",r={begin:t,end:i,contains:["self"]},a=[e.COMMENT("--(?!"+t+")","$"),e.COMMENT("--"+t,i,{contains:[r],relevance:10})];return{name:"Lua",aliases:["pluto"],keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:t,end:i,contains:[r],relevance:5}])}}function ji(e){const t={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%",subLanguage:"xml",relevance:0},r={begin:"^[-\\*]{3,}",end:"$"},a={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},d={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},o={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},s=/[A-Za-z][A-Za-z0-9+.-]*/,l={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:t.concat(/\[.+?\]\(/,s,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},c={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},g={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},m=e.inherit(c,{contains:[]}),p=e.inherit(g,{contains:[]});c.contains.push(p),g.contains.push(m);let f=[i,l];return[c,g,m,p].forEach(w=>{w.contains=w.contains.concat(f)}),f=f.concat(c,g),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:f},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:f}]}]},i,d,c,g,{className:"quote",begin:"^>\\s+",contains:f,end:"$"},a,r,l,o,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}function tr(e){const t={className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},i=/[a-zA-Z@][a-zA-Z0-9_]*/,s={"variable.language":["this","super"],$pattern:i,keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"],literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"],built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"],type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"]},l={$pattern:i,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:s,illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+l.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:l,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}function nr(e){const t=e.regex,i=["abs","accept","alarm","and","atan2","bind","binmode","bless","break","caller","chdir","chmod","chomp","chop","chown","chr","chroot","class","close","closedir","connect","continue","cos","crypt","dbmclose","dbmopen","defined","delete","die","do","dump","each","else","elsif","endgrent","endhostent","endnetent","endprotoent","endpwent","endservent","eof","eval","exec","exists","exit","exp","fcntl","field","fileno","flock","for","foreach","fork","format","formline","getc","getgrent","getgrgid","getgrnam","gethostbyaddr","gethostbyname","gethostent","getlogin","getnetbyaddr","getnetbyname","getnetent","getpeername","getpgrp","getpriority","getprotobyname","getprotobynumber","getprotoent","getpwent","getpwnam","getpwuid","getservbyname","getservbyport","getservent","getsockname","getsockopt","given","glob","gmtime","goto","grep","gt","hex","if","index","int","ioctl","join","keys","kill","last","lc","lcfirst","length","link","listen","local","localtime","log","lstat","lt","ma","map","method","mkdir","msgctl","msgget","msgrcv","msgsnd","my","ne","next","no","not","oct","open","opendir","or","ord","our","pack","package","pipe","pop","pos","print","printf","prototype","push","q|0","qq","quotemeta","qw","qx","rand","read","readdir","readline","readlink","readpipe","recv","redo","ref","rename","require","reset","return","reverse","rewinddir","rindex","rmdir","say","scalar","seek","seekdir","select","semctl","semget","semop","send","setgrent","sethostent","setnetent","setpgrp","setpriority","setprotoent","setpwent","setservent","setsockopt","shift","shmctl","shmget","shmread","shmwrite","shutdown","sin","sleep","socket","socketpair","sort","splice","split","sprintf","sqrt","srand","stat","state","study","sub","substr","symlink","syscall","sysopen","sysread","sysseek","system","syswrite","tell","telldir","tie","tied","time","times","tr","truncate","uc","ucfirst","umask","undef","unless","unlink","unpack","unshift","untie","until","use","utime","values","vec","wait","waitpid","wantarray","warn","when","while","write","x|0","xor","y|0"],r=/[dualxmsipngr]{0,12}/,a={$pattern:/[\w.]+/,keyword:i.join(" ")},d={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},o={begin:/->\{/,end:/\}/},s={scope:"attr",match:/\s+:\s*\w+(\s*\(.*?\))?/},l={scope:"variable",variants:[{begin:/\$\d/},{begin:t.concat(/[$%@](?!")(\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@](?!")[^\s\w{=]|\$=/,relevance:0}],contains:[s]},c={className:"number",variants:[{match:/0?\.[0-9][0-9_]+\b/},{match:/\bv?(0|[1-9][0-9_]*(\.[0-9_]+)?|[1-9][0-9_]*)\b/},{match:/\b0[0-7][0-7_]*\b/},{match:/\b0x[0-9a-fA-F][0-9a-fA-F_]*\b/},{match:/\b0b[0-1][0-1_]*\b/}],relevance:0},g=[e.BACKSLASH_ESCAPE,d,l],m=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],p=(_,y,w="\\1")=>{const I=w==="\\1"?w:t.concat(w,y);return t.concat(t.concat("(?:",_,")"),y,/(?:\\.|[^\\\/])*?/,I,/(?:\\.|[^\\\/])*?/,w,r)},f=(_,y,w)=>t.concat(t.concat("(?:",_,")"),y,/(?:\\.|[^\\\/])*?/,w,r),N=[l,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),o,{className:"string",contains:g,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0}]},c,{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:p("s|tr|y",t.either(...m,{capture:!0}))},{begin:p("s|tr|y","\\(","\\)")},{begin:p("s|tr|y","\\[","\\]")},{begin:p("s|tr|y","\\{","\\}")}],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:f("(?:m|qr)?",/\//,/\//)},{begin:f("m|qr",t.either(...m,{capture:!0}),/\1/)},{begin:f("m|qr",/\(/,/\)/)},{begin:f("m|qr",/\[/,/\]/)},{begin:f("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub method",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,s]},{className:"class",beginKeywords:"class",end:"[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,s,c]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return d.contains=N,o.contains=N,{name:"Perl",aliases:["pl","pm"],keywords:a,contains:N}}function ir(e){const t=e.regex,i=/(?![A-Za-z0-9])(?![$])/,r=t.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,i),a=t.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,i),d=t.concat(/[A-Z]+/,i),o={scope:"variable",match:"\\$+"+r},s={scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},l={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},c=e.inherit(e.APOS_STRING_MODE,{illegal:null}),g=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(l)}),m={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(l),"on:begin":(W,V)=>{V.data._beginMatch=W[1]||W[2]},"on:end":(W,V)=>{V.data._beginMatch!==W[1]&&V.ignoreMatch()}},p=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),f=`[ +]`,N={scope:"string",variants:[g,c,m,p]},_={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},y=["false","null","true"],w=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],I=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],k={keyword:w,literal:(W=>{const V=[];return W.forEach(re=>{V.push(re),re.toLowerCase()===re?V.push(re.toUpperCase()):V.push(re.toLowerCase())}),V})(y),built_in:I},D=W=>W.map(V=>V.replace(/\|\d+$/,"")),x={variants:[{match:[/new/,t.concat(f,"+"),t.concat("(?!",D(I).join("\\b|"),"\\b)"),a],scope:{1:"keyword",4:"title.class"}}]},q=t.concat(r,"\\b(?!\\()"),z={variants:[{match:[t.concat(/::/,t.lookahead(/(?!class\b)/)),q],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[a,t.concat(/::/,t.lookahead(/(?!class\b)/)),q],scope:{1:"title.class",3:"variable.constant"}},{match:[a,t.concat("::",t.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[a,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},H={scope:"attr",match:t.concat(r,t.lookahead(":"),t.lookahead(/(?!::)/))},se={relevance:0,begin:/\(/,end:/\)/,keywords:k,contains:[H,o,z,e.C_BLOCK_COMMENT_MODE,N,_,x]},de={relevance:0,match:[/\b/,t.concat("(?!fn\\b|function\\b|",D(w).join("\\b|"),"|",D(I).join("\\b|"),"\\b)"),r,t.concat(f,"*"),t.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[se]};se.contains.push(de);const le=[H,z,e.C_BLOCK_COMMENT_MODE,N,_,x],ue={begin:t.concat(/#\[\s*\\?/,t.either(a,d)),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:y,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:y,keyword:["new","array"]},contains:["self",...le]},...le,{scope:"meta",variants:[{match:a},{match:d}]}]};return{case_insensitive:!1,keywords:k,contains:[ue,e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},s,{scope:"variable.language",match:/\$this\b/},o,de,z,{match:[/const/,/\s/,r],scope:{1:"keyword",3:"variable.constant"}},x,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:k,contains:["self",ue,o,z,e.C_BLOCK_COMMENT_MODE,N,_]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},N,_]}}function rr(e){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}function ar(e){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}function or(e){const t=e.regex,i=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],s={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},l={className:"meta",begin:/^(>>>|\.\.\.) /},c={className:"subst",begin:/\{/,end:/\}/,keywords:s,illegal:/#/},g={begin:/\{\{/,relevance:0},m={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,l],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,l],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,l,g,c]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,l,g,c]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,g,c]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,g,c]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},p="[0-9](_?[0-9])*",f=`(\\b(${p}))?\\.(${p})|\\b(${p})\\.`,N=`\\b|${r.join("|")}`,_={className:"number",relevance:0,variants:[{begin:`(\\b(${p})|(${f}))[eE][+-]?(${p})[jJ]?(?=${N})`},{begin:`(${f})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${N})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${N})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${N})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${N})`},{begin:`\\b(${p})[jJ](?=${N})`}]},y={className:"comment",begin:t.lookahead(/# type:/),end:/$/,keywords:s,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},w={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:["self",l,_,m,e.HASH_COMMENT_MODE]}]};return c.contains=[m,_,l],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:s,illegal:/(<\/|\?)|=>/,contains:[l,_,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},m,y,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,i],scope:{1:"keyword",3:"title.function"},contains:[w]},{variants:[{match:[/\bclass/,/\s+/,i,/\s*/,/\(\s*/,i,/\s*\)/]},{match:[/\bclass/,/\s+/,i]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[_,w,m]}]}}function sr(e){return{aliases:["pycon"],contains:[{className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}function cr(e){const t=e.regex,i=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,r=t.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),a=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,d=t.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:i,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:t.lookahead(t.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:i},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE],variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[a,r]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,r]},{scope:{1:"punctuation",2:"number"},match:[d,r]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,r]}]},{scope:{3:"operator"},match:[i,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:a},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:d},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}function lr(e){const t=e.regex,i="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",r=t.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),a=t.concat(r,/(::\w+)*/),o={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield",...["include","extend","prepend","public","private","protected","raise","throw"]],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},l={begin:"#<",end:">"},c=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],g={className:"subst",begin:/#\{/,end:/\}/,keywords:o},m={className:"string",contains:[e.BACKSLASH_ESCAPE,g],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:t.concat(/<<[-~]?'?/,t.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,g]})]}]},p="[1-9](_?[0-9])*|0",f="[0-9](_?[0-9])*",N={className:"number",relevance:0,variants:[{begin:`\\b(${p})(\\.(${f}))?([eE][+-]?(${f})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},_={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:o}]},x=[m,{variants:[{match:[/class\s+/,a,/\s+<\s+/,a]},{match:[/\b(class|module)\s+/,a]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:o},{match:[/(include|extend)\s+/,a],scope:{2:"title.class"},keywords:o},{relevance:0,match:[a,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:r,scope:"title.class"},{match:[/def/,/\s+/,i],scope:{1:"keyword",3:"title.function"},contains:[_]},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[m,{begin:i}],relevance:0},N,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|(?!=)/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:o},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,g],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(l,c),relevance:0}].concat(l,c);g.contains=x,_.contains=x;const se=[{begin:/^\s*=>/,starts:{end:"$",contains:x}},{className:"meta.prompt",begin:"^("+"[>?]>"+"|"+"[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"+"|"+"(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"+")(?=[ ])",starts:{end:"$",keywords:o,contains:x}}];return c.unshift(l),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:o,illegal:/\/\*/,contains:[e.SHEBANG({binary:"ruby"})].concat(se).concat(c).concat(x)}}function dr(e){const t=e.regex,i=/(r#)?/,r=t.concat(i,e.UNDERSCORE_IDENT_RE),a=t.concat(i,e.IDENT_RE),d={className:"title.function.invoke",relevance:0,begin:t.concat(/\b/,/(?!let|for|while|if|else|match\b)/,a,t.lookahead(/\s*\(/))},o="([ui](8|16|32|64|128|size)|f(32|64))?",s=["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"],l=["true","false","Some","None","Ok","Err"],c=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],g=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"];return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:g,keyword:s,literal:l,built_in:c},illegal:""},d]}}const ur=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),gr=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],pr=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],br=[...gr,...pr],mr=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),fr=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),_r=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),Er=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function hr(e){const t=ur(e),i=_r,r=fr,a="@[a-z-]+",d="and or not only",s={className:"variable",begin:"(\\$"+"[a-zA-Z-][a-zA-Z0-9_-]*"+")\\b",relevance:0};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t.CSS_NUMBER_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+br.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+r.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+i.join("|")+")"},s,{begin:/\(/,end:/\)/,contains:[t.CSS_NUMBER_MODE]},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+Er.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:/:/,end:/[;}{]/,relevance:0,contains:[t.BLOCK_COMMENT,s,t.HEXCOLOR,t.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,t.IMPORTANT,t.FUNCTION_DISPATCH]},{begin:"@(page|font-face)",keywords:{$pattern:a,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:d,attribute:mr.join(" ")},contains:[{begin:a,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},s,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,t.HEXCOLOR,t.CSS_NUMBER_MODE]},t.FUNCTION_DISPATCH]}}function Nr(e){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}function yr(e){const t=e.regex,i=e.COMMENT("--","$"),r={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},a={begin:/"/,end:/"/,contains:[{match:/""/}]},d=["true","false","unknown"],o=["double precision","large object","with timezone","without timezone"],s=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],l=["add","asc","collation","desc","final","first","last","view"],c=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],g=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],m=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],p=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],f=g,N=[...c,...l].filter(D=>!g.includes(D)),_={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},y={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},w={match:t.concat(/\b/,t.either(...f),/\s*\(/),relevance:0,keywords:{built_in:f}};function I(D){return t.concat(/\b/,t.either(...D.map(x=>x.replace(/\s+/,"\\s+"))),/\b/)}const L={scope:"keyword",match:I(p),relevance:0};function k(D,{exceptions:x,when:q}={}){const z=q;return x=x||[],D.map(H=>H.match(/\|\d+$/)||x.includes(H)?H:z(H)?`${H}|0`:H)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:k(N,{when:D=>D.length<3}),literal:d,type:s,built_in:m},contains:[{scope:"type",match:I(o)},L,w,_,r,a,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,i,y]}}function on(e){return e?typeof e=="string"?e:e.source:null}function Ce(e){return $("(?=",e,")")}function $(...e){return e.map(i=>on(i)).join("")}function Tr(e){const t=e[e.length-1];return typeof t=="object"&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function oe(...e){return"("+(Tr(e).capture?"":"?:")+e.map(r=>on(r)).join("|")+")"}const _t=e=>$(/\b/,e,/\w$/.test(e)?/\b/:/\B/),wr=["Protocol","Type"].map(_t),Kt=["init","self"].map(_t),Sr=["Any","Self"],ut=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","package","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Ht=["false","nil","true"],vr=["assignment","associativity","higherThan","left","lowerThan","none","right"],Ar=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],qt=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],sn=oe(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),cn=oe(sn,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),gt=$(sn,cn,"*"),ln=oe(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),Ye=oe(ln,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),me=$(ln,Ye,"*"),We=$(/[A-Z]/,Ye,"*"),Or=["attached","autoclosure",$(/convention\(/,oe("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",$(/objc\(/,me,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Rr=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"];function kr(e){const t={match:/\s+/,relevance:0},i=e.COMMENT("/\\*","\\*/",{contains:["self"]}),r=[e.C_LINE_COMMENT_MODE,i],a={match:[/\./,oe(...wr,...Kt)],className:{2:"keyword"}},d={match:$(/\./,oe(...ut)),relevance:0},o=ut.filter(F=>typeof F=="string").concat(["_|0"]),s=ut.filter(F=>typeof F!="string").concat(Sr).map(_t),l={variants:[{className:"keyword",match:oe(...s,...Kt)}]},c={$pattern:oe(/\b\w+/,/#\w+/),keyword:o.concat(Ar),literal:Ht},g=[a,d,l],m={match:$(/\./,oe(...qt)),relevance:0},p={className:"built_in",match:$(/\b/,oe(...qt),/(?=\()/)},f=[m,p],N={match:/->/,relevance:0},_={className:"operator",relevance:0,variants:[{match:gt},{match:`\\.(\\.|${cn})+`}]},y=[N,_],w="([0-9]_*)+",I="([0-9a-fA-F]_*)+",L={className:"number",relevance:0,variants:[{match:`\\b(${w})(\\.(${w}))?([eE][+-]?(${w}))?\\b`},{match:`\\b0x(${I})(\\.(${I}))?([pP][+-]?(${w}))?\\b`},{match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},k=(F="")=>({className:"subst",variants:[{match:$(/\\/,F,/[0\\tnr"']/)},{match:$(/\\/,F,/u\{[0-9a-fA-F]{1,8}\}/)}]}),D=(F="")=>({className:"subst",match:$(/\\/,F,/[\t ]*(?:[\r\n]|\r\n)/)}),x=(F="")=>({className:"subst",label:"interpol",begin:$(/\\/,F,/\(/),end:/\)/}),q=(F="")=>({begin:$(F,/"""/),end:$(/"""/,F),contains:[k(F),D(F),x(F)]}),z=(F="")=>({begin:$(F,/"/),end:$(/"/,F),contains:[k(F),x(F)]}),H={className:"string",variants:[q(),q("#"),q("##"),q("###"),z(),z("#"),z("##"),z("###")]},se=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}],de={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//,contains:se},le=F=>{const Ae=$(F,/\//),ye=$(/\//,F);return{begin:Ae,end:ye,contains:[...se,{scope:"comment",begin:`#(?!.*${ye})`,end:/$/}]}},ue={scope:"regexp",variants:[le("###"),le("##"),le("#"),de]},W={match:$(/`/,me,/`/)},V={className:"variable",match:/\$\d+/},re={className:"variable",match:`\\$${Ye}+`},fe=[W,V,re],P={match:/(@|#(un)?)available/,scope:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:Rr,contains:[...y,L,H]}]}},j={scope:"keyword",match:$(/@/,oe(...Or),Ce(oe(/\(/,/\s+/)))},ae={scope:"meta",match:$(/@/,me)},ne=[P,j,ae],ee={match:Ce(/\b[A-Z]/),relevance:0,contains:[{className:"type",match:$(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Ye,"+")},{className:"type",match:We,relevance:0},{match:/[?!]+/,relevance:0},{match:/\.\.\./,relevance:0},{match:$(/\s+&\s+/,Ce(We)),relevance:0}]},_e={begin://,keywords:c,contains:[...r,...g,...ne,N,ee]};ee.contains.push(_e);const Ve={match:$(me,/\s*:/),keywords:"_|0",relevance:0},Le={begin:/\(/,end:/\)/,relevance:0,keywords:c,contains:["self",Ve,...r,ue,...g,...f,...y,L,H,...fe,...ne,ee]},Ie={begin://,keywords:"repeat each",contains:[...r,ee]},Qe={begin:oe(Ce($(me,/\s*:/)),Ce($(me,/\s+/,me,/\s*:/))),end:/:/,relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:me}]},De={begin:/\(/,end:/\)/,keywords:c,contains:[Qe,...r,...g,...y,L,H,...ne,ee,Le],endsParent:!0,illegal:/["']/},Et={match:[/(func|macro)/,/\s+/,oe(W.match,me,gt)],className:{1:"keyword",3:"title.function"},contains:[Ie,De,t],illegal:[/\[/,/%/]},ve={match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},contains:[Ie,De,t],illegal:/\[|%/},Je={match:[/operator/,/\s+/,gt],className:{1:"keyword",3:"title"}},je={begin:[/precedencegroup/,/\s+/,We],className:{1:"keyword",3:"title"},contains:[ee],keywords:[...vr,...Ht],end:/}/},et={match:[/class\b/,/\s+/,/func\b/,/\s+/,/\b[A-Za-z_][A-Za-z0-9_]*\b/],scope:{1:"keyword",3:"keyword",5:"title.function"}},tt={match:[/class\b/,/\s+/,/var\b/],scope:{1:"keyword",3:"keyword"}},nt={begin:[/(struct|protocol|class|extension|enum|actor)/,/\s+/,me,/\s*/],beginScope:{1:"keyword",3:"title.class"},keywords:c,contains:[Ie,...g,{begin:/:/,end:/\{/,keywords:c,contains:[{scope:"title.class.inherited",match:We},...g],relevance:0}]};for(const F of H.variants){const Ae=F.contains.find(it=>it.label==="interpol");Ae.keywords=c;const ye=[...g,...f,...y,L,H,...fe];Ae.contains=[...ye,{begin:/\(/,end:/\)/,contains:["self",...ye]}]}return{name:"Swift",keywords:c,contains:[...r,Et,ve,et,tt,nt,Je,je,{beginKeywords:"import",end:/$/,contains:[...r],relevance:0},ue,...g,...f,...y,L,H,...fe,...ne,ee,Le]}}const Ze="[A-Za-z$_][0-9A-Za-z$_]*",dn=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],un=["true","false","null","undefined","NaN","Infinity"],gn=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],pn=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],bn=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],mn=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],fn=[].concat(bn,gn,pn);function Mr(e){const t=e.regex,i=(P,{after:j})=>{const ae="",end:""},d=/<[A-Za-z0-9\\._:-]+\s*\/>/,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(P,j)=>{const ae=P[0].length+P.index,ne=P.input[ae];if(ne==="<"||ne===","){j.ignoreMatch();return}ne===">"&&(i(P,{after:ae})||j.ignoreMatch());let ee;const _e=P.input.substring(ae);if(ee=_e.match(/^\s*=/)){j.ignoreMatch();return}if((ee=_e.match(/^\s+extends\s+/))&&ee.index===0){j.ignoreMatch();return}}},s={$pattern:Ze,keyword:dn,literal:un,built_in:fn,"variable.language":mn},l="[0-9](_?[0-9])*",c=`\\.(${l})`,g="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",m={className:"number",variants:[{begin:`(\\b(${g})((${c})|\\.)?|(${c}))[eE][+-]?(${l})\\b`},{begin:`\\b(${g})\\b((${c})\\b|\\.)?|(${c})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},p={className:"subst",begin:"\\$\\{",end:"\\}",keywords:s,contains:[]},f={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"xml"}},N={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"css"}},_={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"graphql"}},y={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,p]},I={className:"comment",variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},L=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,f,N,_,y,{match:/\$\d+/},m];p.contains=L.concat({begin:/\{/,end:/\}/,keywords:s,contains:["self"].concat(L)});const k=[].concat(I,p.contains),D=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:s,contains:["self"].concat(k)}]),x={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:D},q={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,"(",t.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},z={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...gn,...pn]}},H={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},se={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[x],illegal:/%/},de={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function le(P){return t.concat("(?!",P.join("|"),")")}const ue={match:t.concat(/\b/,le([...bn,"super","import"].map(P=>`${P}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:"title.function",relevance:0},W={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},V={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},x]},re="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",fe={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(re)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[x]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:s,exports:{PARAMS_CONTAINS:D,CLASS_REFERENCE:z},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),H,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,f,N,_,y,I,{match:/\$\d+/},m,z,{scope:"attr",match:r+t.lookahead(":"),relevance:0},fe,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[I,e.REGEXP_MODE,{className:"function",begin:re,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:D}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:d},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0,contains:["self"]}]}]},se,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[x,e.inherit(e.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},W,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[x]},ue,de,q,V,{match:/\$[(.]/}]}}function Ir(e){const t=e.regex,i=Mr(e),r=Ze,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],d={begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},o={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a},contains:[i.exports.CLASS_REFERENCE]},s={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},l=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],c={$pattern:Ze,keyword:dn.concat(l),literal:un,built_in:fn.concat(a),"variable.language":mn},g={className:"meta",begin:"@"+r},m=(_,y,w)=>{const I=_.contains.findIndex(L=>L.label===y);if(I===-1)throw new Error("can not find mode to replace");_.contains.splice(I,1,w)};Object.assign(i.keywords,c),i.exports.PARAMS_CONTAINS.push(g);const p=i.contains.find(_=>_.scope==="attr"),f=Object.assign({},p,{match:t.concat(r,t.lookahead(/\s*\?:/))});i.exports.PARAMS_CONTAINS.push([i.exports.CLASS_REFERENCE,p,f]),i.contains=i.contains.concat([g,d,o,f]),m(i,"shebang",e.SHEBANG()),m(i,"use_strict",s);const N=i.contains.find(_=>_.label==="func.def");return N.relevance=0,Object.assign(i,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),i}function xr(e){const t=e.regex,i={className:"string",begin:/"(""|[^/n])"C\b/},r={className:"string",begin:/"/,end:/"/,illegal:/\n/,contains:[{begin:/""/}]},a=/\d{1,2}\/\d{1,2}\/\d{4}/,d=/\d{4}-\d{1,2}-\d{1,2}/,o=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,s=/\d{1,2}(:\d{1,2}){1,2}/,l={className:"literal",variants:[{begin:t.concat(/# */,t.either(d,a),/ *#/)},{begin:t.concat(/# */,s,/ *#/)},{begin:t.concat(/# */,o,/ *#/)},{begin:t.concat(/# */,t.either(d,a),/ +/,t.either(o,s),/ *#/)}]},c={className:"number",relevance:0,variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},g={className:"label",begin:/^\w+:/},m=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]}),p=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield",built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",literal:"true false nothing"},illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[i,r,l,c,g,m,p,{className:"meta",begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,end:/$/,keywords:{keyword:"const disable else elseif enable end externalsource if region then"},contains:[p]}]}}function Cr(e){e.regex;const t=e.COMMENT(/\(;/,/;\)/);t.contains.push("self");const i=e.COMMENT(/;;/,/$/),r=["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"],a={begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword",3:"title.function"}},d={className:"variable",begin:/\$[\w_]+/},o={match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},s={className:"number",relevance:0,match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/},l={match:/(i32|i64|f32|f64)(?!\.)/,className:"type"},c={className:"keyword",match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/};return{name:"WebAssembly",keywords:{$pattern:/[\w.]+/,keyword:r},contains:[i,t,{match:[/(?:offset|align)/,/\s*/,/=/],className:{1:"keyword",3:"operator"}},d,o,a,e.QUOTE_STRING_MODE,l,c,s]}}function Lr(e){const t=e.regex,i=t.concat(/[\p{L}_]/u,t.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,a={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},d={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},o=e.inherit(d,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),c={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[d,l,s,o,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[d,o,l,s]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[c],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[c],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:t.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:i,relevance:0,starts:c}]},{className:"tag",begin:t.concat(/<\//,t.lookahead(t.concat(i,/>/))),contains:[{className:"name",begin:i,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function Dr(e){const t="true false yes no null",i="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},a={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},d={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},o={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,a]},s=e.inherit(o,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),p={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},f={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},N={begin:/\{/,end:/\}/,contains:[f],illegal:"\\n",relevance:0},_={begin:"\\[",end:"\\]",contains:[f],illegal:"\\n",relevance:0},y=[r,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+i},{className:"type",begin:"!<"+i+">"},{className:"type",begin:"!"+i},{className:"type",begin:"!!"+i},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},p,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},N,_,d,o],w=[...y];return w.pop(),w.push(s),f.contains=w,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:y}}const Br={arduino:_i,bash:Ei,c:hi,cpp:Ni,csharp:yi,css:Mi,diff:Ii,go:xi,graphql:Ci,ini:Li,java:Di,javascript:$i,json:zi,kotlin:Ki,less:Qi,lua:Ji,makefile:ji,markdown:er,objectivec:tr,perl:nr,php:ir,"php-template":rr,plaintext:ar,python:or,"python-repl":sr,r:cr,ruby:lr,rust:dr,scss:hr,shell:Nr,sql:yr,swift:kr,typescript:Ir,vbnet:xr,wasm:Cr,xml:Lr,yaml:Dr};var pt,Wt;function Pr(){if(Wt)return pt;Wt=1;function e(n){return n instanceof Map?n.clear=n.delete=n.set=function(){throw new Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=function(){throw new Error("set is read-only")}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach(u=>{const E=n[u],R=typeof E;(R==="object"||R==="function")&&!Object.isFrozen(E)&&e(E)}),n}class t{constructor(u){u.data===void 0&&(u.data={}),this.data=u.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function i(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(n,...u){const E=Object.create(null);for(const R in n)E[R]=n[R];return u.forEach(function(R){for(const Y in R)E[Y]=R[Y]}),E}const a="",d=n=>!!n.scope,o=(n,{prefix:u})=>{if(n.startsWith("language:"))return n.replace("language:","language-");if(n.includes(".")){const E=n.split(".");return[`${u}${E.shift()}`,...E.map((R,Y)=>`${R}${"_".repeat(Y+1)}`)].join(" ")}return`${u}${n}`};class s{constructor(u,E){this.buffer="",this.classPrefix=E.classPrefix,u.walk(this)}addText(u){this.buffer+=i(u)}openNode(u){if(!d(u))return;const E=o(u.scope,{prefix:this.classPrefix});this.span(E)}closeNode(u){d(u)&&(this.buffer+=a)}value(){return this.buffer}span(u){this.buffer+=``}}const l=(n={})=>{const u={children:[]};return Object.assign(u,n),u};class c{constructor(){this.rootNode=l(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(u){this.top.children.push(u)}openNode(u){const E=l({scope:u});this.add(E),this.stack.push(E)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(u){return this.constructor._walk(u,this.rootNode)}static _walk(u,E){return typeof E=="string"?u.addText(E):E.children&&(u.openNode(E),E.children.forEach(R=>this._walk(u,R)),u.closeNode(E)),u}static _collapse(u){typeof u!="string"&&u.children&&(u.children.every(E=>typeof E=="string")?u.children=[u.children.join("")]:u.children.forEach(E=>{c._collapse(E)}))}}class g extends c{constructor(u){super(),this.options=u}addText(u){u!==""&&this.add(u)}startScope(u){this.openNode(u)}endScope(){this.closeNode()}__addSublanguage(u,E){const R=u.root;E&&(R.scope=`language:${E}`),this.add(R)}toHTML(){return new s(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function m(n){return n?typeof n=="string"?n:n.source:null}function p(n){return _("(?=",n,")")}function f(n){return _("(?:",n,")*")}function N(n){return _("(?:",n,")?")}function _(...n){return n.map(E=>m(E)).join("")}function y(n){const u=n[n.length-1];return typeof u=="object"&&u.constructor===Object?(n.splice(n.length-1,1),u):{}}function w(...n){return"("+(y(n).capture?"":"?:")+n.map(R=>m(R)).join("|")+")"}function I(n){return new RegExp(n.toString()+"|").exec("").length-1}function L(n,u){const E=n&&n.exec(u);return E&&E.index===0}const k=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function D(n,{joinWith:u}){let E=0;return n.map(R=>{E+=1;const Y=E;let Z=m(R),S="";for(;Z.length>0;){const T=k.exec(Z);if(!T){S+=Z;break}S+=Z.substring(0,T.index),Z=Z.substring(T.index+T[0].length),T[0][0]==="\\"&&T[1]?S+="\\"+String(Number(T[1])+Y):(S+=T[0],T[0]==="("&&E++)}return S}).map(R=>`(${R})`).join(u)}const x=/\b\B/,q="[a-zA-Z]\\w*",z="[a-zA-Z_]\\w*",H="\\b\\d+(\\.\\d+)?",se="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",de="\\b(0b[01]+)",le="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",ue=(n={})=>{const u=/^#![ ]*\//;return n.binary&&(n.begin=_(u,/.*\b/,n.binary,/\b.*/)),r({scope:"meta",begin:u,end:/$/,relevance:0,"on:begin":(E,R)=>{E.index!==0&&R.ignoreMatch()}},n)},W={begin:"\\\\[\\s\\S]",relevance:0},V={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[W]},re={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[W]},fe={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},P=function(n,u,E={}){const R=r({scope:"comment",begin:n,end:u,contains:[]},E);R.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const Y=w("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return R.contains.push({begin:_(/[ ]+/,"(",Y,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),R},j=P("//","$"),ae=P("/\\*","\\*/"),ne=P("#","$"),ee={scope:"number",begin:H,relevance:0},_e={scope:"number",begin:se,relevance:0},Ve={scope:"number",begin:de,relevance:0},Le={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[W,{begin:/\[/,end:/\]/,relevance:0,contains:[W]}]},Ie={scope:"title",begin:q,relevance:0},Qe={scope:"title",begin:z,relevance:0},De={begin:"\\.\\s*"+z,relevance:0};var ve=Object.freeze({__proto__:null,APOS_STRING_MODE:V,BACKSLASH_ESCAPE:W,BINARY_NUMBER_MODE:Ve,BINARY_NUMBER_RE:de,COMMENT:P,C_BLOCK_COMMENT_MODE:ae,C_LINE_COMMENT_MODE:j,C_NUMBER_MODE:_e,C_NUMBER_RE:se,END_SAME_AS_BEGIN:function(n){return Object.assign(n,{"on:begin":(u,E)=>{E.data._beginMatch=u[1]},"on:end":(u,E)=>{E.data._beginMatch!==u[1]&&E.ignoreMatch()}})},HASH_COMMENT_MODE:ne,IDENT_RE:q,MATCH_NOTHING_RE:x,METHOD_GUARD:De,NUMBER_MODE:ee,NUMBER_RE:H,PHRASAL_WORDS_MODE:fe,QUOTE_STRING_MODE:re,REGEXP_MODE:Le,RE_STARTERS_RE:le,SHEBANG:ue,TITLE_MODE:Ie,UNDERSCORE_IDENT_RE:z,UNDERSCORE_TITLE_MODE:Qe});function Je(n,u){n.input[n.index-1]==="."&&u.ignoreMatch()}function je(n,u){n.className!==void 0&&(n.scope=n.className,delete n.className)}function et(n,u){u&&n.beginKeywords&&(n.begin="\\b("+n.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",n.__beforeBegin=Je,n.keywords=n.keywords||n.beginKeywords,delete n.beginKeywords,n.relevance===void 0&&(n.relevance=0))}function tt(n,u){Array.isArray(n.illegal)&&(n.illegal=w(...n.illegal))}function nt(n,u){if(n.match){if(n.begin||n.end)throw new Error("begin & end are not supported with match");n.begin=n.match,delete n.match}}function F(n,u){n.relevance===void 0&&(n.relevance=1)}const Ae=(n,u)=>{if(!n.beforeMatch)return;if(n.starts)throw new Error("beforeMatch cannot be used with starts");const E=Object.assign({},n);Object.keys(n).forEach(R=>{delete n[R]}),n.keywords=E.keywords,n.begin=_(E.beforeMatch,p(E.begin)),n.starts={relevance:0,contains:[Object.assign(E,{endsParent:!0})]},n.relevance=0,delete E.beforeMatch},ye=["of","and","for","in","not","or","if","then","parent","list","value"],it="keyword";function ht(n,u,E=it){const R=Object.create(null);return typeof n=="string"?Y(E,n.split(" ")):Array.isArray(n)?Y(E,n):Object.keys(n).forEach(function(Z){Object.assign(R,ht(n[Z],u,Z))}),R;function Y(Z,S){u&&(S=S.map(T=>T.toLowerCase())),S.forEach(function(T){const O=T.split("|");R[O[0]]=[Z,_n(O[0],O[1])]})}}function _n(n,u){return u?Number(u):En(n)?0:1}function En(n){return ye.includes(n.toLowerCase())}const Nt={},Te=n=>{console.error(n)},yt=(n,...u)=>{console.log(`WARN: ${n}`,...u)},Oe=(n,u)=>{Nt[`${n}/${u}`]||(console.log(`Deprecated as of ${n}. ${u}`),Nt[`${n}/${u}`]=!0)},Be=new Error;function Tt(n,u,{key:E}){let R=0;const Y=n[E],Z={},S={};for(let T=1;T<=u.length;T++)S[T+R]=Y[T],Z[T+R]=!0,R+=I(u[T-1]);n[E]=S,n[E]._emit=Z,n[E]._multi=!0}function hn(n){if(Array.isArray(n.begin)){if(n.skip||n.excludeBegin||n.returnBegin)throw Te("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),Be;if(typeof n.beginScope!="object"||n.beginScope===null)throw Te("beginScope must be object"),Be;Tt(n,n.begin,{key:"beginScope"}),n.begin=D(n.begin,{joinWith:""})}}function Nn(n){if(Array.isArray(n.end)){if(n.skip||n.excludeEnd||n.returnEnd)throw Te("skip, excludeEnd, returnEnd not compatible with endScope: {}"),Be;if(typeof n.endScope!="object"||n.endScope===null)throw Te("endScope must be object"),Be;Tt(n,n.end,{key:"endScope"}),n.end=D(n.end,{joinWith:""})}}function yn(n){n.scope&&typeof n.scope=="object"&&n.scope!==null&&(n.beginScope=n.scope,delete n.scope)}function Tn(n){yn(n),typeof n.beginScope=="string"&&(n.beginScope={_wrap:n.beginScope}),typeof n.endScope=="string"&&(n.endScope={_wrap:n.endScope}),hn(n),Nn(n)}function wn(n){function u(S,T){return new RegExp(m(S),"m"+(n.case_insensitive?"i":"")+(n.unicodeRegex?"u":"")+(T?"g":""))}class E{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(T,O){O.position=this.position++,this.matchIndexes[this.matchAt]=O,this.regexes.push([O,T]),this.matchAt+=I(T)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const T=this.regexes.map(O=>O[1]);this.matcherRe=u(D(T,{joinWith:"|"}),!0),this.lastIndex=0}exec(T){this.matcherRe.lastIndex=this.lastIndex;const O=this.matcherRe.exec(T);if(!O)return null;const J=O.findIndex((xe,at)=>at>0&&xe!==void 0),X=this.matchIndexes[J];return O.splice(0,J),Object.assign(O,X)}}class R{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(T){if(this.multiRegexes[T])return this.multiRegexes[T];const O=new E;return this.rules.slice(T).forEach(([J,X])=>O.addRule(J,X)),O.compile(),this.multiRegexes[T]=O,O}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(T,O){this.rules.push([T,O]),O.type==="begin"&&this.count++}exec(T){const O=this.getMatcher(this.regexIndex);O.lastIndex=this.lastIndex;let J=O.exec(T);if(this.resumingScanAtSamePosition()&&!(J&&J.index===this.lastIndex)){const X=this.getMatcher(0);X.lastIndex=this.lastIndex+1,J=X.exec(T)}return J&&(this.regexIndex+=J.position+1,this.regexIndex===this.count&&this.considerAll()),J}}function Y(S){const T=new R;return S.contains.forEach(O=>T.addRule(O.begin,{rule:O,type:"begin"})),S.terminatorEnd&&T.addRule(S.terminatorEnd,{type:"end"}),S.illegal&&T.addRule(S.illegal,{type:"illegal"}),T}function Z(S,T){const O=S;if(S.isCompiled)return O;[je,nt,Tn,Ae].forEach(X=>X(S,T)),n.compilerExtensions.forEach(X=>X(S,T)),S.__beforeBegin=null,[et,tt,F].forEach(X=>X(S,T)),S.isCompiled=!0;let J=null;return typeof S.keywords=="object"&&S.keywords.$pattern&&(S.keywords=Object.assign({},S.keywords),J=S.keywords.$pattern,delete S.keywords.$pattern),J=J||/\w+/,S.keywords&&(S.keywords=ht(S.keywords,n.case_insensitive)),O.keywordPatternRe=u(J,!0),T&&(S.begin||(S.begin=/\B|\b/),O.beginRe=u(O.begin),!S.end&&!S.endsWithParent&&(S.end=/\B|\b/),S.end&&(O.endRe=u(O.end)),O.terminatorEnd=m(O.end)||"",S.endsWithParent&&T.terminatorEnd&&(O.terminatorEnd+=(S.end?"|":"")+T.terminatorEnd)),S.illegal&&(O.illegalRe=u(S.illegal)),S.contains||(S.contains=[]),S.contains=[].concat(...S.contains.map(function(X){return Sn(X==="self"?S:X)})),S.contains.forEach(function(X){Z(X,O)}),S.starts&&Z(S.starts,T),O.matcher=Y(O),O}if(n.compilerExtensions||(n.compilerExtensions=[]),n.contains&&n.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return n.classNameAliases=r(n.classNameAliases||{}),Z(n)}function wt(n){return n?n.endsWithParent||wt(n.starts):!1}function Sn(n){return n.variants&&!n.cachedVariants&&(n.cachedVariants=n.variants.map(function(u){return r(n,{variants:null},u)})),n.cachedVariants?n.cachedVariants:wt(n)?r(n,{starts:n.starts?r(n.starts):null}):Object.isFrozen(n)?r(n):n}var vn="11.11.1";class An extends Error{constructor(u,E){super(u),this.name="HTMLInjectionError",this.html=E}}const rt=i,St=r,vt=Symbol("nomatch"),On=7,At=function(n){const u=Object.create(null),E=Object.create(null),R=[];let Y=!0;const Z="Could not find the language '{}', did you forget to load/include a language module?",S={disableAutodetect:!0,name:"Plain text",contains:[]};let T={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:g};function O(b){return T.noHighlightRe.test(b)}function J(b){let A=b.className+" ";A+=b.parentNode?b.parentNode.className:"";const B=T.languageDetectRe.exec(A);if(B){const G=he(B[1]);return G||(yt(Z.replace("{}",B[1])),yt("Falling back to no-highlight mode for this block.",b)),G?B[1]:"no-highlight"}return A.split(/\s+/).find(G=>O(G)||he(G))}function X(b,A,B){let G="",Q="";typeof A=="object"?(G=b,B=A.ignoreIllegals,Q=A.language):(Oe("10.7.0","highlight(lang, code, ...args) has been deprecated."),Oe("10.7.0",`Please use highlight(code, options) instead. +https://github.com/highlightjs/highlight.js/issues/2277`),Q=b,G=A),B===void 0&&(B=!0);const ge={code:G,language:Q};Ue("before:highlight",ge);const Ne=ge.result?ge.result:xe(ge.language,ge.code,B);return Ne.code=ge.code,Ue("after:highlight",Ne),Ne}function xe(b,A,B,G){const Q=Object.create(null);function ge(h,v){return h.keywords[v]}function Ne(){if(!M.keywords){te.addText(K);return}let h=0;M.keywordPatternRe.lastIndex=0;let v=M.keywordPatternRe.exec(K),C="";for(;v;){C+=K.substring(h,v.index);const U=be.case_insensitive?v[0].toLowerCase():v[0],ie=ge(M,U);if(ie){const[Ee,Hn]=ie;if(te.addText(C),C="",Q[U]=(Q[U]||0)+1,Q[U]<=On&&(ze+=Hn),Ee.startsWith("_"))C+=v[0];else{const qn=be.classNameAliases[Ee]||Ee;pe(v[0],qn)}}else C+=v[0];h=M.keywordPatternRe.lastIndex,v=M.keywordPatternRe.exec(K)}C+=K.substring(h),te.addText(C)}function Fe(){if(K==="")return;let h=null;if(typeof M.subLanguage=="string"){if(!u[M.subLanguage]){te.addText(K);return}h=xe(M.subLanguage,K,!0,Lt[M.subLanguage]),Lt[M.subLanguage]=h._top}else h=ot(K,M.subLanguage.length?M.subLanguage:null);M.relevance>0&&(ze+=h.relevance),te.__addSublanguage(h._emitter,h.language)}function ce(){M.subLanguage!=null?Fe():Ne(),K=""}function pe(h,v){h!==""&&(te.startScope(v),te.addText(h),te.endScope())}function Mt(h,v){let C=1;const U=v.length-1;for(;C<=U;){if(!h._emit[C]){C++;continue}const ie=be.classNameAliases[h[C]]||h[C],Ee=v[C];ie?pe(Ee,ie):(K=Ee,Ne(),K=""),C++}}function It(h,v){return h.scope&&typeof h.scope=="string"&&te.openNode(be.classNameAliases[h.scope]||h.scope),h.beginScope&&(h.beginScope._wrap?(pe(K,be.classNameAliases[h.beginScope._wrap]||h.beginScope._wrap),K=""):h.beginScope._multi&&(Mt(h.beginScope,v),K="")),M=Object.create(h,{parent:{value:M}}),M}function xt(h,v,C){let U=L(h.endRe,C);if(U){if(h["on:end"]){const ie=new t(h);h["on:end"](v,ie),ie.isMatchIgnored&&(U=!1)}if(U){for(;h.endsParent&&h.parent;)h=h.parent;return h}}if(h.endsWithParent)return xt(h.parent,v,C)}function Fn(h){return M.matcher.regexIndex===0?(K+=h[0],1):(dt=!0,0)}function $n(h){const v=h[0],C=h.rule,U=new t(C),ie=[C.__beforeBegin,C["on:begin"]];for(const Ee of ie)if(Ee&&(Ee(h,U),U.isMatchIgnored))return Fn(v);return C.skip?K+=v:(C.excludeBegin&&(K+=v),ce(),!C.returnBegin&&!C.excludeBegin&&(K=v)),It(C,h),C.returnBegin?0:v.length}function zn(h){const v=h[0],C=A.substring(h.index),U=xt(M,h,C);if(!U)return vt;const ie=M;M.endScope&&M.endScope._wrap?(ce(),pe(v,M.endScope._wrap)):M.endScope&&M.endScope._multi?(ce(),Mt(M.endScope,h)):ie.skip?K+=v:(ie.returnEnd||ie.excludeEnd||(K+=v),ce(),ie.excludeEnd&&(K=v));do M.scope&&te.closeNode(),!M.skip&&!M.subLanguage&&(ze+=M.relevance),M=M.parent;while(M!==U.parent);return U.starts&&It(U.starts,h),ie.returnEnd?0:v.length}function Gn(){const h=[];for(let v=M;v!==be;v=v.parent)v.scope&&h.unshift(v.scope);h.forEach(v=>te.openNode(v))}let $e={};function Ct(h,v){const C=v&&v[0];if(K+=h,C==null)return ce(),0;if($e.type==="begin"&&v.type==="end"&&$e.index===v.index&&C===""){if(K+=A.slice(v.index,v.index+1),!Y){const U=new Error(`0 width match regex (${b})`);throw U.languageName=b,U.badRule=$e.rule,U}return 1}if($e=v,v.type==="begin")return $n(v);if(v.type==="illegal"&&!B){const U=new Error('Illegal lexeme "'+C+'" for mode "'+(M.scope||"")+'"');throw U.mode=M,U}else if(v.type==="end"){const U=zn(v);if(U!==vt)return U}if(v.type==="illegal"&&C==="")return K+=` +`,1;if(lt>1e5&<>v.index*3)throw new Error("potential infinite loop, way more iterations than matches");return K+=C,C.length}const be=he(b);if(!be)throw Te(Z.replace("{}",b)),new Error('Unknown language: "'+b+'"');const Kn=wn(be);let ct="",M=G||Kn;const Lt={},te=new T.__emitter(T);Gn();let K="",ze=0,we=0,lt=0,dt=!1;try{if(be.__emitTokens)be.__emitTokens(A,te);else{for(M.matcher.considerAll();;){lt++,dt?dt=!1:M.matcher.considerAll(),M.matcher.lastIndex=we;const h=M.matcher.exec(A);if(!h)break;const v=A.substring(we,h.index),C=Ct(v,h);we=h.index+C}Ct(A.substring(we))}return te.finalize(),ct=te.toHTML(),{language:b,value:ct,relevance:ze,illegal:!1,_emitter:te,_top:M}}catch(h){if(h.message&&h.message.includes("Illegal"))return{language:b,value:rt(A),illegal:!0,relevance:0,_illegalBy:{message:h.message,index:we,context:A.slice(we-100,we+100),mode:h.mode,resultSoFar:ct},_emitter:te};if(Y)return{language:b,value:rt(A),illegal:!1,relevance:0,errorRaised:h,_emitter:te,_top:M};throw h}}function at(b){const A={value:rt(b),illegal:!1,relevance:0,_top:S,_emitter:new T.__emitter(T)};return A._emitter.addText(b),A}function ot(b,A){A=A||T.languages||Object.keys(u);const B=at(b),G=A.filter(he).filter(kt).map(ce=>xe(ce,b,!1));G.unshift(B);const Q=G.sort((ce,pe)=>{if(ce.relevance!==pe.relevance)return pe.relevance-ce.relevance;if(ce.language&&pe.language){if(he(ce.language).supersetOf===pe.language)return 1;if(he(pe.language).supersetOf===ce.language)return-1}return 0}),[ge,Ne]=Q,Fe=ge;return Fe.secondBest=Ne,Fe}function Rn(b,A,B){const G=A&&E[A]||B;b.classList.add("hljs"),b.classList.add(`language-${G}`)}function st(b){let A=null;const B=J(b);if(O(B))return;if(Ue("before:highlightElement",{el:b,language:B}),b.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",b);return}if(b.children.length>0&&(T.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(b)),T.throwUnescapedHTML))throw new An("One of your code blocks includes unescaped HTML.",b.innerHTML);A=b;const G=A.textContent,Q=B?X(G,{language:B,ignoreIllegals:!0}):ot(G);b.innerHTML=Q.value,b.dataset.highlighted="yes",Rn(b,B,Q.language),b.result={language:Q.language,re:Q.relevance,relevance:Q.relevance},Q.secondBest&&(b.secondBest={language:Q.secondBest.language,relevance:Q.secondBest.relevance}),Ue("after:highlightElement",{el:b,result:Q,text:G})}function kn(b){T=St(T,b)}const Mn=()=>{Pe(),Oe("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function In(){Pe(),Oe("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let Ot=!1;function Pe(){function b(){Pe()}if(document.readyState==="loading"){Ot||window.addEventListener("DOMContentLoaded",b,!1),Ot=!0;return}document.querySelectorAll(T.cssSelector).forEach(st)}function xn(b,A){let B=null;try{B=A(n)}catch(G){if(Te("Language definition for '{}' could not be registered.".replace("{}",b)),Y)Te(G);else throw G;B=S}B.name||(B.name=b),u[b]=B,B.rawDefinition=A.bind(null,n),B.aliases&&Rt(B.aliases,{languageName:b})}function Cn(b){delete u[b];for(const A of Object.keys(E))E[A]===b&&delete E[A]}function Ln(){return Object.keys(u)}function he(b){return b=(b||"").toLowerCase(),u[b]||u[E[b]]}function Rt(b,{languageName:A}){typeof b=="string"&&(b=[b]),b.forEach(B=>{E[B.toLowerCase()]=A})}function kt(b){const A=he(b);return A&&!A.disableAutodetect}function Dn(b){b["before:highlightBlock"]&&!b["before:highlightElement"]&&(b["before:highlightElement"]=A=>{b["before:highlightBlock"](Object.assign({block:A.el},A))}),b["after:highlightBlock"]&&!b["after:highlightElement"]&&(b["after:highlightElement"]=A=>{b["after:highlightBlock"](Object.assign({block:A.el},A))})}function Bn(b){Dn(b),R.push(b)}function Pn(b){const A=R.indexOf(b);A!==-1&&R.splice(A,1)}function Ue(b,A){const B=b;R.forEach(function(G){G[B]&&G[B](A)})}function Un(b){return Oe("10.7.0","highlightBlock will be removed entirely in v12.0"),Oe("10.7.0","Please use highlightElement now."),st(b)}Object.assign(n,{highlight:X,highlightAuto:ot,highlightAll:Pe,highlightElement:st,highlightBlock:Un,configure:kn,initHighlighting:Mn,initHighlightingOnLoad:In,registerLanguage:xn,unregisterLanguage:Cn,listLanguages:Ln,getLanguage:he,registerAliases:Rt,autoDetection:kt,inherit:St,addPlugin:Bn,removePlugin:Pn}),n.debugMode=function(){Y=!1},n.safeMode=function(){Y=!0},n.versionString=vn,n.regex={concat:_,lookahead:p,either:w,optional:N,anyNumberOfTimes:f};for(const b in ve)typeof ve[b]=="object"&&e(ve[b]);return Object.assign(n,ve),n},Re=At({});return Re.newInstance=()=>At({}),pt=Re,Re.HighlightJS=Re,Re.default=Re,pt}var Ur=Pr();const Fr=Wn(Ur),Yt={},$r="hljs-";function zr(e){const t=Fr.newInstance();return e&&d(e),{highlight:i,highlightAuto:r,listLanguages:a,register:d,registerAlias:o,registered:s};function i(l,c,g){const m=g||Yt,p=typeof m.prefix=="string"?m.prefix:$r;if(!t.getLanguage(l))throw new Error("Unknown language: `"+l+"` is not registered");t.configure({__emitter:Gr,classPrefix:p});const f=t.highlight(c,{ignoreIllegals:!0,language:l});if(f.errorRaised)throw new Error("Could not highlight with `Highlight.js`",{cause:f.errorRaised});const N=f._emitter.root,_=N.data;return _.language=f.language,_.relevance=f.relevance,N}function r(l,c){const m=(c||Yt).subset||a();let p=-1,f=0,N;for(;++pf&&(f=y.data.relevance,N=y)}return N||{type:"root",children:[],data:{language:void 0,relevance:f}}}function a(){return t.listLanguages()}function d(l,c){if(typeof l=="string")t.registerLanguage(l,c);else{let g;for(g in l)Object.hasOwn(l,g)&&t.registerLanguage(g,l[g])}}function o(l,c){if(typeof l=="string")t.registerAliases(typeof c=="string"?c:[...c],{languageName:l});else{let g;for(g in l)if(Object.hasOwn(l,g)){const m=l[g];t.registerAliases(typeof m=="string"?m:[...m],{languageName:g})}}}function s(l){return!!t.getLanguage(l)}}class Gr{constructor(t){this.options=t,this.root={type:"root",children:[],data:{language:void 0,relevance:0}},this.stack=[this.root]}addText(t){if(t==="")return;const i=this.stack[this.stack.length-1],r=i.children[i.children.length-1];r&&r.type==="text"?r.value+=t:i.children.push({type:"text",value:t})}startScope(t){this.openNode(String(t))}endScope(){this.closeNode()}__addSublanguage(t,i){const r=this.stack[this.stack.length-1],a=t.root.children;i?r.children.push({type:"element",tagName:"span",properties:{className:[i]},children:a}):r.children.push(...a)}openNode(t){const i=this,r=t.split(".").map(function(o,s){return s?o+"_".repeat(s):i.options.classPrefix+o}),a=this.stack[this.stack.length-1],d={type:"element",tagName:"span",properties:{className:r},children:[]};a.children.push(d),this.stack.push(d)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}}const Kr={};function Zr(e){const t=e||Kr,i=t.aliases,r=t.detect||!1,a=t.languages||Br,d=t.plainText,o=t.prefix,s=t.subset;let l="hljs";const c=zr(a);if(i&&c.registerAlias(i),o){const g=o.indexOf("-");l=g===-1?o:o.slice(0,g)}return function(g,m){ni(g,"element",function(p,f,N){if(p.tagName!=="code"||!N||N.type!=="element"||N.tagName!=="pre")return;const _=Hr(p);if(_===!1||!_&&!r||_&&d&&d.includes(_))return;Array.isArray(p.properties.className)||(p.properties.className=[]),p.properties.className.includes(l)||p.properties.className.unshift(l);const y=li(p,{whitespace:"pre"});let w;try{w=_?c.highlight(_,y,{prefix:o}):c.highlightAuto(y,{prefix:o,subset:s})}catch(I){const L=I;if(_&&/Unknown language/.test(L.message)){m.message("Cannot highlight as `"+_+"`, it’s not registered",{ancestors:[N,p],cause:L,place:p.position,ruleId:"missing-language",source:"rehype-highlight"});return}throw L}!_&&w.data&&w.data.language&&p.properties.className.push("language-"+w.data.language),w.children.length>0&&(p.children=w.children)})}}function Hr(e){const t=e.properties.className;let i=-1;if(!Array.isArray(t))return;let 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�EmT;b)Iu@50o`G zr0J)H2A6P4gp1>1l{dN%m;nYj-s!BMvs|^}>3?$?YBR-TE2{`DT#(x$V5AEsDgOze zXuF2$80u@g3;`Mw>0y;mU0|LIR#9`12j~W z(BYx#Jh*7xmxOJUH5Vq0Q`&k}WCbHxyqb;Pgo&@{V3$Bs2oE zP8W!*f?wGbcCdvH_*M9suRAS}H-hQI(3!6}<(pVyU^6B^3PzwWm;L}Bg4wXs=mnWa#?u(9#Ite~T+%3jmIU*AZdM7?XhRE|%l^uzr^F z|5Xse^1(cW8IO#ngXHiIEC4Jh-^1Y+fW|DLvOp-br`w^mU66!OT;T< zR?0-x5_Q2Z+!vUB^V!(X|O#H(C@@!vhV;HOgYma)cB#`d>cx-xo=YXyrz0flr*ZO(;>iaKo(5oU0+G}6zEHuwIPjfv@xi4;QP zwzy$YK7Z#>t+xxH9?hJoq%fsq^^a>rF(YK$xLx)1AssWUE?{J4Szh2!Kh?llSO?%l z!F>#Szy%Xzf9~EkiAXg|@jMsC%xewUr}J2MhNQxT)4u8N6<6GXv|2{Sxg!Z|ub8LK z;_=*%i6rAwPdI0@1^<50O4*{?z5=Ee`HcU8hcA&BgZ-gL#pz;_7%FO4DF;RO9)aF3 zQr@i;JDjF2)i|L#w>B1Yd#KPF{K2i03e&;S`3|KN22%G2pJZ;5!b!6Q;kr>n#;~*N z;&9cy&M8+st|D03O}J9I$=J6+;wUJPi>_Iz0d2CW0MqxZ=dEym*AGK}41J0&aALIa z3ne0Sr~q}c!$`V@q}qjwv(}*3d!DC=)$R(65x$l7ZgR}6rS&oTEw@!#rp+NSb%d}4 z!FWhZB05?OpKN79h?47Z8pvMf>Pb>hE*HPiSi9;M3JvX0;aJ5y3WfvB&)&x>JRky$ z_AdN^M4b^}VrI%`&VUP(wM4^8k|=`&k%A<>4)ThJot#u9qLYL=JjB7X$4r0l3{l}Q zB-9z8l_~|s8Ulkgsoz6b@bOKGn<5BSel1P+Vdt3d)~90bzmUP{;*#T zWyGVp8(qrE{6yRITf_v4tFF-BQ`N0gUXkx3uE=#Bd~%>71alRK9B-|);&3DbC)ZZM zdv)};&J{ErHY25haDI(DCyH%ZAxv{c7m`>n&Y!-QUC(o`OevpuQp(az5d}y&77zQ) zv+B}h{y;|ARC?_gdY+Tf1qMG$|Bh6`PoZ2YKdD1ed&UAU%FjknHPXt*9I>YbF|kmV z0oX(a=NcU4YMb+h0Obx+Ks(STh93{e`AJY+{8e0f=6L6(vfb8n4%-&dA*Yauub!cB-%5fHbS5{SV!h8r0o8ue|LQ(*!cpLLP`NZr`J*az$6t)c&M>CrVN+oBjN%=|;t zDnH)DeEwj|sYsc*MFq^S)4_|Yqyfm9_oZDp13!pHW$*UB1)UN?ew+P)$SS6Y9eK^T zoL=mS%I7jYw)x2;@*IilC%vX3AoYTx!h`@=C|4^D)=g3~=-LGC0%7UY&;po z=nyb?1Q}FV4$@1oMEISA@jk*c2zr10Bh6!0OWG2^b8|8 zpE=$~*SL89s9z>8`iX`U^z=T~Qf*^lLPi+Tq9ItP0!fpdp?+Ad4Zn^e(F?PEHgkxJ z{ud1fTbj5xj;t+AvpYpm7*rGWYV4D!LTK)E6br>H>}eAR9_p~`Oq{{XUamv zZ60}Ac-EZT)XB;+57Jz5i~p}Ki-7uSdL0DfKYFKszT)14Bz_M8jMK3;{I9m53bKvb z4iE0*N72&_WwI?+;cJAx|Kt9_U&}QXrNuF533E-p1$KHYILc70&$o>XI9Z%9eo)v6 zIUV{!jeDPti_pEyofnpDQuCldDIMy$c$9$<6lNa<&5!Q#Afk4dnGTh-FyS5Ps`@Az7LRW}bFpxEkO5&e!9UTD($Kbf&(JcK zCiIVyox`E8`#JW)_R=Xw&-AiR%bbJumL$PE4`!sG!a=x+nYV(PyXzqIXs)hzC|J#l z+N#iFMPq^zH~v)E@9&6FreZ5qjSgn+uKi$$M1)IC3k}RCSl_LLZ{xNoPh~9K(Bx)S zx3Dja@=Z;Mr>>ATYw=?1ZP)$vCcGiY>Yo(Ot|axDg0!$*9%%78+a?@?R$k=kxCHaM z1f>*7zDm@7OB*MG?v2iWlI%ax=arIAt)yiY#FTy)5I(kzR{F~4_1${UO|xsKe{g5r zNxo|cYu9KAD(`LbFbu&)0IxN`WK=?eS$&BPAdLtegmPN`*ChDxjAr_;*a~Tg0aaV@ zbw9k%RICn%E6iq+JK$VMvCRs}P9p|cMy*0*-wb`#jHFnqP@$4wi|LFuvK+k6IYmm` zXS-f z;Tthcn+*YsjqZDDzi8+@>S?-t4xmF#eXm&}=RuC>ZqRx01j?zf)1uRsZYmh5#N;*P zcr~i5of|38u9hdf&w08!rPkwzFw4BDlx9|el_==%(NK8>1fitM74k+L!>}4WgJ9?L zFq)=uhUHf!al)o($I^Gwh=%F~h9FaIPfc22p;h9!s-2k&Fn-B|Jyw$x{2tIUU-_m# zu-qd$Ets#j+R^Z?eQrFrS*zOk6O)w9lIGpOgys43FTG9)XPzyDdJ$8V$TiJgb*@)L zMa#uv$gYF%auOx$3;3kdb^^Gt=0-hHRd^Td=jY^{Jy6t_3D8;Nctb_^_DMD}_;{kC zT4m7~1V;L$dDtuyp3O?wE2b!UpjH+6MTv`wSe6B)dtj#24N1ng@!TPw@>ZV+F16Y2 z@0@@z(yV#BWr5 zS;9v8_M82KZuHU48w38+CJQi@>9Iock?MhNPMcEis68NwLb$;sdCBTJ3W#l2yk&6J zp4x-P9+Qt}&#}qO%ju)R6+&0=gtL}`TZ*z2?QSWuyGo?k?-w5I1^xRNlAtRK+i1ZU zus2UDB`eErhi$;iTbx!D+XuQ8asL2k6~VvNt$`Cq<-T-nL>+MlZV^#$oN*aY*3r<> z{qGSz>UeQcMb-7^Ep8ssaM@kxn%ZSqy-@653>gY83@N%+u^R2XWBE$oi?sckiy}ZT z)yk_lWkDQN&iDuY%Z2)a{nB*4;CAe`yiAlsNor23?Pu?7)2A!S!0N-w zvHV-n39~9L;>K^N+;E>V`6sVO%YdKT2{PVU=xLX{R35$HzS9C24?9T0T$Ym`-krgt z%mS3eRT^>wo6h1@95=VW6Fe_t>mufdK zns{-UZCinEKQ{JNIw!hWUE{Esho1bI8Q$~gmR^LE)2?aF-a;j!y=ocKUm_9@P(>1j2Ds}4zOgF*C)_vP^wnTnH-DWq&ZxKX=&`nB+|8nxEZ z$w2UHb`_Rw`Hb3`u#SS&OzfVZS9*Vh%i(GbI5W?#sUAfl-lYeRXubRR^g}pL3#Wcdi0|xIlxA{DD z3GW`iyOm!WN(%T;JrJ6@ z)4=PeFJ|d6OQ8KoV0T8bg`^&y?UG-a1Rwjda=7>&XS7u9@HM zaSpSwS(w@lk>S+9I8_`60;U7s4PS^0>77)voX zx{-IHj?F&I;J2%k>kUVFtm>unVY4%;%WU6A#4ozsW=mmjXcqL!$}cQ(ziVu5ruli):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:oklab(21% -.00316127 -.0338527/.1);--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.71429}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-40{margin-top:calc(var(--spacing)*40)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mr-4\.5{margin-right:calc(var(--spacing)*4.5)}.mr-6{margin-right:calc(var(--spacing)*6)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.size-\(--cell-size\){width:var(--cell-size);height:var(--cell-size)}.size-2\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-auto{width:auto;height:auto}.\!h-8{height:calc(var(--spacing)*8)!important}.h-\(--cell-size\){height:var(--cell-size)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-35{height:calc(var(--spacing)*35)}.h-36{height:calc(var(--spacing)*36)}.h-40{height:calc(var(--spacing)*40)}.h-\[1\.15rem\]{height:1.15rem}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[calc\(100\%-64px\)\]{height:calc(100% - 64px)}.h-\[calc\(100\%-70px\)\]{height:calc(100% - 70px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-35{max-height:calc(var(--spacing)*35)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-100{max-height:calc(var(--spacing)*100)}.max-h-\[40vh\]{max-height:40vh}.max-h-\[95vh\]{max-height:95vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-16{min-height:calc(var(--spacing)*16)}.min-h-100{min-height:calc(var(--spacing)*100)}.min-h-\[120px\]{min-height:120px}.w-\(--cell-size\){width:var(--cell-size)}.w-1\/2{width:50%}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-14{width:calc(var(--spacing)*14)}.w-18\.5{width:calc(var(--spacing)*18.5)}.w-20{width:calc(var(--spacing)*20)}.w-20\.5{width:calc(var(--spacing)*20.5)}.w-24{width:calc(var(--spacing)*24)}.w-25{width:calc(var(--spacing)*25)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-\[400px\]{width:400px}.w-\[420px\]{width:420px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-none{max-width:none}.max-w-xs{max-width:var(--container-xs)}.min-w-\(--cell-size\){min-width:var(--cell-size)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-10{min-width:calc(var(--spacing)*10)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[80px\]{min-width:80px}.min-w-\[100px\]{min-width:100px}.min-w-\[160px\]{min-width:160px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-\(--radix-popover-content-transform-origin\){transform-origin:var(--radix-popover-content-transform-origin)}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.translate-x-\[-8px\]{--tw-translate-x:-8px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[8px\]{--tw-translate-x:8px;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-1px\]{--tw-translate-y:-1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize{resize:both}.scroll-my-1{scroll-margin-block:calc(var(--spacing)*1)}.\[appearance\:textfield\]{appearance:textfield}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-2{row-gap:calc(var(--spacing)*2)}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[2px\]{border-radius:2px}.rounded-\[50\%\]{border-radius:50%}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-l-md{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.rounded-r-md{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1px\]{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-4{border-bottom-style:var(--tw-border-style);border-bottom-width:4px}.border-l-3,.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-l-\[5px\]{border-left-style:var(--tw-border-style);border-left-width:5px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-\[\#90a1b977\]{border-color:#90a1b977}.border-gray-400{border-color:var(--color-gray-400)}.border-input{border-color:var(--input)}.border-primary-500{border-color:var(--color-primary-500)}.border-primary-500\/70{border-color:#0891b2b3}@supports (color:color-mix(in lab,red,red)){.border-primary-500\/70{border-color:color-mix(in oklab,var(--color-primary-500)70%,transparent)}}.border-primary-600{border-color:var(--color-primary-600)}.border-purple-500{border-color:var(--color-purple-500)}.border-red-500{border-color:var(--color-red-500)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-200\/50{border-color:#e2e8f080}@supports (color:color-mix(in lab,red,red)){.border-slate-200\/50{border-color:color-mix(in oklab,var(--color-slate-200)50%,transparent)}}.border-slate-300{border-color:var(--color-slate-300)}.border-slate-400{border-color:var(--color-slate-400)}.border-slate-500{border-color:var(--color-slate-500)}.border-transparent{border-color:#0000}.border-yellow-500{border-color:var(--color-yellow-500)}.\!bg-transparent{background-color:#0000!important}.bg-\[\#eeeeeeee\]{background-color:#eeee}.bg-\[var\(--color-slate-100\)\]{background-color:var(--color-slate-100)}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-border{background-color:var(--border)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-primary-100{background-color:var(--color-primary-100)}.bg-primary-100\/70{background-color:#cffafeb3}@supports (color:color-mix(in lab,red,red)){.bg-primary-100\/70{background-color:color-mix(in oklab,var(--color-primary-100)70%,transparent)}}.bg-primary-500{background-color:var(--color-primary-500)}.bg-primary-600{background-color:var(--color-primary-600)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-100\/50{background-color:#ffe0e580}@supports (color:color-mix(in lab,red,red)){.bg-red-100\/50{background-color:color-mix(in oklab,var(--color-red-100)50%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-secondary{background-color:var(--secondary)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-100\/50{background-color:#f1f5f980}@supports (color:color-mix(in lab,red,red)){.bg-slate-100\/50{background-color:color-mix(in oklab,var(--color-slate-100)50%,transparent)}}.bg-slate-100\/80{background-color:#f1f5f9cc}@supports (color:color-mix(in lab,red,red)){.bg-slate-100\/80{background-color:color-mix(in oklab,var(--color-slate-100)80%,transparent)}}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/80{background-color:color-mix(in oklab,var(--color-slate-900)80%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-cyan-50{--tw-gradient-from:var(--color-cyan-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-cyan-400{--tw-gradient-from:var(--color-cyan-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-cyan-400\/40{--tw-gradient-from:#00d2ef66}@supports (color:color-mix(in lab,red,red)){.from-cyan-400\/40{--tw-gradient-from:color-mix(in oklab,var(--color-cyan-400)40%,transparent)}}.from-cyan-400\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-50{--tw-gradient-from:var(--color-slate-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-indigo-400\/40{--tw-gradient-via:#7d87ff66}@supports (color:color-mix(in lab,red,red)){.via-indigo-400\/40{--tw-gradient-via:color-mix(in oklab,var(--color-indigo-400)40%,transparent)}}.via-indigo-400\/40{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-purple-50{--tw-gradient-to:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-400\/40{--tw-gradient-to:#c07eff66}@supports (color:color-mix(in lab,red,red)){.to-purple-400\/40{--tw-gradient-to:color-mix(in oklab,var(--color-purple-400)40%,transparent)}}.to-purple-400\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-500{--tw-gradient-to:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-100{--tw-gradient-to:var(--color-slate-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.\[mask-composite\:exclude\]{-webkit-mask-composite:xor;mask-composite:exclude}.fill-primary{fill:var(--primary)}.object-cover{object-fit:cover}.object-center{object-position:center}.\!p-0{padding:calc(var(--spacing)*0)!important}.\!p-2{padding:calc(var(--spacing)*2)!important}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-\[3px\]{padding:3px}.\!px-4{padding-inline:calc(var(--spacing)*4)!important}.px-\(--cell-size\){padding-inline:var(--cell-size)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-6{padding-block:calc(var(--spacing)*6)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-0{padding-right:calc(var(--spacing)*0)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-5{padding-right:calc(var(--spacing)*5)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-keep{word-break:keep-all}.text-ellipsis{text-overflow:ellipsis}.hyphens-none{-webkit-hyphens:none;hyphens:none}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:var(--accent-foreground)}.text-blue-400{color:var(--color-blue-400)}.text-cyan-400{color:var(--color-cyan-400)}.text-cyan-500{color:var(--color-cyan-500)}.text-foreground{color:var(--foreground)}.text-gray-500{color:var(--color-gray-500)}.text-green-500{color:var(--color-green-500)}.text-green-700{color:var(--color-green-700)}.text-indigo-500{color:var(--color-indigo-500)}.text-inherit{color:inherit}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-500{color:var(--color-primary-500)}.text-primary-600{color:var(--color-primary-600)}.text-primary-700{color:var(--color-primary-700)}.text-primary-foreground{color:var(--primary-foreground)}.text-purple-400{color:var(--color-purple-400)}.text-purple-500{color:var(--color-purple-500)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-slate-200{color:var(--color-slate-200)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.placeholder-slate-400::placeholder{color:var(--color-slate-400)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-\[0_0_10px_rgba\(255\,255\,246\,0\.8\)\]{--tw-drop-shadow-size:drop-shadow(0 0 10px var(--tw-drop-shadow-color,#fffff6cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-\[0_0_80px_rgba\(0\,215\,255\,0\.8\)\]{--tw-drop-shadow-size:drop-shadow(0 0 80px var(--tw-drop-shadow-color,#00d7ffcc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-\[5px\]{--tw-backdrop-blur:blur(5px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.\[--cell-size\:--spacing\(8\)\]{--cell-size:calc(var(--spacing)*8)}.\[-ms-overflow-style\:none\]{-ms-overflow-style:none}.\[scrollbar-width\:none\]{scrollbar-width:none}.running{animation-play-state:running}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\[focused\=true\]\/day\:relative:is(:where(.group\/day)[data-focused=true] *){position:relative}.group-data-\[focused\=true\]\/day\:z-10:is(:where(.group\/day)[data-focused=true] *){z-index:10}.group-data-\[focused\=true\]\/day\:border-ring:is(:where(.group\/day)[data-focused=true] *){border-color:var(--ring)}.group-data-\[focused\=true\]\/day\:ring-\[3px\]:is(:where(.group\/day)[data-focused=true] *){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[focused\=true\]\/day\:ring-ring\/50:is(:where(.group\/day)[data-focused=true] *){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.group-data-\[focused\=true\]\/day\:ring-ring\/50:is(:where(.group\/day)[data-focused=true] *){--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.peer-checked\:opacity-100:is(:where(.peer):checked~*){opacity:1}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.odd\:bg-white:nth-child(odd){background-color:var(--color-white)}.even\:bg-slate-50:nth-child(2n){background-color:var(--color-slate-50)}.checked\:border-slate-500:checked{border-color:var(--color-slate-500)}.checked\:bg-primary-400:checked{background-color:var(--color-primary-400)}.checked\:text-primary-foreground:checked{color:var(--primary-foreground)}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-primary-500:focus-within{--tw-ring-color:var(--color-primary-500)}@media (hover:hover){.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-primary-300:hover{border-color:var(--color-primary-300)}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-primary-100\/70:hover{background-color:#cffafeb3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary-100\/70:hover{background-color:color-mix(in oklab,var(--color-primary-100)70%,transparent)}}.hover\:bg-primary-700:hover{background-color:var(--color-primary-700)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-100\/90:hover{background-color:#ffe0e5e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-100\/90:hover{background-color:color-mix(in oklab,var(--color-red-100)90%,transparent)}}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:bg-slate-200\/70:hover{background-color:#e2e8f0b3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-200\/70:hover{background-color:color-mix(in oklab,var(--color-slate-200)70%,transparent)}}.hover\:bg-slate-300:hover{background-color:var(--color-slate-300)}.hover\:bg-white\/50:hover{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/50:hover{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.hover\:bg-white\/70:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/70:hover{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-primary:hover{color:var(--primary)}.hover\:text-primary-500:hover{color:var(--color-primary-500)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:border-primary-500:focus{border-color:var(--color-primary-500)}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-primary-500:focus{--tw-ring-color:var(--color-primary-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-slate-500:focus{--tw-ring-color:var(--color-slate-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:\!border-current:focus-visible{border-color:currentColor!important}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:\!ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:\[--tw-ring-shadow\:0_0_\#0000\]:focus-visible{--tw-ring-shadow:0 0 #0000}.focus-visible\:\[--tw-ring-color\:transparent\]:focus-visible{--tw-ring-color:transparent}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-primary-500:focus-visible{--tw-ring-color:var(--color-primary-500)}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus-visible\:\!ring-offset-0:focus-visible{--tw-ring-offset-width:0px!important;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)!important}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.focus-visible\:\[--tw-ring-offset-shadow\:0_0_\#0000\]:focus-visible{--tw-ring-offset-shadow:0 0 #0000}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-focus\:border-ring:has(:focus){border-color:var(--ring)}.has-focus\:ring-\[3px\]:has(:focus){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.has-focus\:ring-ring\/50:has(:focus){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.has-focus\:ring-ring\/50:has(:focus){--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.aria-selected\:text-muted-foreground[aria-selected=true]{color:var(--muted-foreground)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[range-end\=true\]\:rounded-md[data-range-end=true]{border-radius:calc(var(--radius) - 2px)}.data-\[range-end\=true\]\:rounded-r-md[data-range-end=true]{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.data-\[range-end\=true\]\:bg-primary[data-range-end=true]{background-color:var(--primary)}.data-\[range-end\=true\]\:text-primary-foreground[data-range-end=true]{color:var(--primary-foreground)}.data-\[range-middle\=true\]\:rounded-none[data-range-middle=true]{border-radius:0}.data-\[range-middle\=true\]\:bg-accent[data-range-middle=true]{background-color:var(--accent)}.data-\[range-middle\=true\]\:text-accent-foreground[data-range-middle=true]{color:var(--accent-foreground)}.data-\[range-start\=true\]\:rounded-md[data-range-start=true]{border-radius:calc(var(--radius) - 2px)}.data-\[range-start\=true\]\:rounded-l-md[data-range-start=true]{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.data-\[range-start\=true\]\:bg-primary[data-range-start=true]{background-color:var(--primary)}.data-\[range-start\=true\]\:text-primary-foreground[data-range-start=true]{color:var(--primary-foreground)}.data-\[selected-single\=true\]\:bg-primary[data-selected-single=true]{background-color:var(--primary)}.data-\[selected-single\=true\]\:text-primary-foreground[data-selected-single=true]{color:var(--primary-foreground)}.data-\[selected\=true\]\:rounded-none[data-selected=true]{border-radius:0}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(var(--spacing)*2*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(var(--spacing)*2)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(var(--spacing)*2*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(var(--spacing)*2)}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing)*9)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing)*8)}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing)*2)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x: calc(100% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}@media not all and (min-width:320px){.max-\[320px\]\:hidden{display:none}}@media not all and (min-width:64rem){.max-lg\:flex-col{flex-direction:column}}@media not all and (min-width:48rem){.max-md\:hidden{display:none}.max-md\:max-h-40{max-height:calc(var(--spacing)*40)}}@media (min-width:40rem){.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:min-w-\[75px\]{min-width:75px}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:py-4{padding-block:calc(var(--spacing)*4)}.sm\:pr-4{padding-right:calc(var(--spacing)*4)}.sm\:pr-6{padding-right:calc(var(--spacing)*6)}.sm\:pl-2{padding-left:calc(var(--spacing)*2)}.sm\:pl-4{padding-left:calc(var(--spacing)*4)}}@media (min-width:48rem){.md\:hidden{display:none}.md\:min-h-40{min-height:calc(var(--spacing)*40)}.md\:w-18\.5{width:calc(var(--spacing)*18.5)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:64rem){.lg\:block{display:block}.lg\:hidden{display:none}.lg\:h-full{height:100%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}}@media (min-width:80rem){.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@container not (min-width:32rem){.\@max-lg\:flex-col{flex-direction:column}}@container (min-width:32rem){.\@lg\:flex-row{flex-direction:row}}.dark\:border-input:where(.dark,.dark *){border-color:var(--input)}.dark\:border-primary-300:where(.dark,.dark *){border-color:var(--color-primary-300)}.dark\:border-slate-400:where(.dark,.dark *){border-color:var(--color-slate-400)}.dark\:border-slate-500:where(.dark,.dark *){border-color:var(--color-slate-500)}.dark\:border-slate-600:where(.dark,.dark *){border-color:var(--color-slate-600)}.dark\:border-slate-700:where(.dark,.dark *){border-color:var(--color-slate-700)}.dark\:border-slate-800:where(.dark,.dark *){border-color:var(--color-slate-800)}.dark\:bg-\[\#0000002f\]:where(.dark,.dark *){background-color:#0000002f}.dark\:bg-\[oklch\(12\.9\%_0\.042_264\.695\)\]:where(.dark,.dark *){background-color:#020618}.dark\:bg-destructive\/60:where(.dark,.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:where(.dark,.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:where(.dark,.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:bg-primary-800:where(.dark,.dark *){background-color:var(--color-primary-800)}.dark\:bg-primary-900\/40:where(.dark,.dark *){background-color:#164e6366}@supports (color:color-mix(in lab,red,red)){.dark\:bg-primary-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-primary-900)40%,transparent)}}.dark\:bg-primary-900\/50:where(.dark,.dark *){background-color:#164e6380}@supports (color:color-mix(in lab,red,red)){.dark\:bg-primary-900\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-primary-900)50%,transparent)}}.dark\:bg-red-900\/40:where(.dark,.dark *){background-color:#7f244066}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900)40%,transparent)}}.dark\:bg-red-900\/50:where(.dark,.dark *){background-color:#7f244080}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.dark\:bg-slate-600:where(.dark,.dark *){background-color:var(--color-slate-600)}.dark\:bg-slate-700:where(.dark,.dark *){background-color:var(--color-slate-700)}.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-700)50%,transparent)}}.dark\:bg-slate-800:where(.dark,.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800)40%,transparent)}}.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800)50%,transparent)}}.dark\:bg-slate-900:where(.dark,.dark *){background-color:var(--color-slate-900)}.dark\:bg-slate-900\/80:where(.dark,.dark *){background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900)80%,transparent)}}.dark\:from-slate-800:where(.dark,.dark *){--tw-gradient-from:var(--color-slate-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-slate-900:where(.dark,.dark *){--tw-gradient-from:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-slate-900:where(.dark,.dark *){--tw-gradient-to:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-slate-950:where(.dark,.dark *){--tw-gradient-to:var(--color-slate-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:fill-slate-700:where(.dark,.dark *){fill:var(--color-slate-700)}.dark\:text-green-300:where(.dark,.dark *){color:var(--color-green-300)}.dark\:text-muted-foreground:where(.dark,.dark *){color:var(--muted-foreground)}.dark\:text-primary-300:where(.dark,.dark *){color:var(--color-primary-300)}.dark\:text-primary-400:where(.dark,.dark *){color:var(--color-primary-400)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-slate-100:where(.dark,.dark *){color:var(--color-slate-100)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\:text-slate-500:where(.dark,.dark *){color:var(--color-slate-500)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:drop-shadow-\[0_0_10px_rgba\(255\,255\,246\,0\.8\)\]:where(.dark,.dark *){--tw-drop-shadow-size:drop-shadow(0 0 10px var(--tw-drop-shadow-color,#fffff6cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.dark\:drop-shadow-\[0_0_80px_rgba\(59\,130\,246\,0\.8\)\]:where(.dark,.dark *){--tw-drop-shadow-size:drop-shadow(0 0 80px var(--tw-drop-shadow-color,#3b82f6cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.dark\:prose-invert:where(.dark,.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.dark\:odd\:bg-slate-900:where(.dark,.dark *):nth-child(odd){background-color:var(--color-slate-900)}.dark\:even\:bg-slate-800:where(.dark,.dark *):nth-child(2n){background-color:var(--color-slate-800)}.dark\:checked\:border-slate-400:where(.dark,.dark *):checked{border-color:var(--color-slate-400)}.dark\:checked\:bg-primary-600:where(.dark,.dark *):checked{background-color:var(--color-primary-600)}@media (hover:hover){.dark\:hover\:border-primary-500:where(.dark,.dark *):hover{border-color:var(--color-primary-500)}.dark\:hover\:bg-accent\/50:where(.dark,.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:where(.dark,.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}.dark\:hover\:bg-red-900:where(.dark,.dark *):hover{background-color:var(--color-red-900)}.dark\:hover\:bg-red-950\/30:where(.dark,.dark *):hover{background-color:#4608094d}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-950\/30:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-950)30%,transparent)}}.dark\:hover\:bg-slate-600:where(.dark,.dark *):hover{background-color:var(--color-slate-600)}.dark\:hover\:bg-slate-700:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}.dark\:hover\:bg-slate-700\/50:where(.dark,.dark *):hover{background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-700\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-700)50%,transparent)}}.dark\:hover\:bg-slate-700\/70:where(.dark,.dark *):hover{background-color:#314158b3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-700\/70:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-700)70%,transparent)}}.dark\:hover\:bg-slate-800:where(.dark,.dark *):hover{background-color:var(--color-slate-800)}.hover\:dark\:bg-red-900\/90:hover:where(.dark,.dark *){background-color:#7f2440e6}@supports (color:color-mix(in lab,red,red)){.hover\:dark\:bg-red-900\/90:hover:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900)90%,transparent)}}.dark\:hover\:text-accent-foreground:where(.dark,.dark *):hover{color:var(--accent-foreground)}}.dark\:focus\:bg-slate-700:where(.dark,.dark *):focus{background-color:var(--color-slate-700)}.dark\:focus-visible\:ring-destructive\/40:where(.dark,.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:data-\[state\=active\]\:border-input:where(.dark,.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:where(.dark,.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=active\]\:bg-input\/30:where(.dark,.dark *)[data-state=active]{background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:data-\[state\=active\]\:text-foreground:where(.dark,.dark *)[data-state=active]{color:var(--foreground)}.dark\:data-\[state\=checked\]\:bg-primary-foreground:where(.dark,.dark *)[data-state=checked]{background-color:var(--primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:where(.dark,.dark *)[data-state=unchecked]{background-color:var(--foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:where(.dark,.dark *)[data-state=unchecked]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:where(.dark,.dark *)[data-state=unchecked]{background-color:color-mix(in oklab,var(--input)80%,transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&\:\:-webkit-calendar-picker-indicator\]\:hidden::-webkit-calendar-picker-indicator{display:none}.\[\&\:\:-webkit-calendar-picker-indicator\]\:appearance-none::-webkit-calendar-picker-indicator{appearance:none}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none}.\[\&\:first-child\[data-selected\=true\]_button\]\:rounded-l-md:first-child[data-selected=true] button{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}:is(.rtl\:\*\*\:\[\.rdp-button\\_next\>svg\]\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *) *):is(.rdp-button_next>svg),:is(.rtl\:\*\*\:\[\.rdp-button\\_previous\>svg\]\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *) *):is(.rdp-button_previous>svg){rotate:180deg}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing)*2)}.\[\&\:last-child\[data-selected\=true\]_button\]\:rounded-r-md:last-child[data-selected=true] button{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.\[\&\>span\]\:text-xs>span{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&\>span\]\:opacity-70>span{opacity:.7}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:text-muted-foreground>svg{color:var(--muted-foreground)}[data-slot=card-content] .\[\[data-slot\=card-content\]_\&\]\:bg-transparent,[data-slot=popover-content] .\[\[data-slot\=popover-content\]_\&\]\:bg-transparent{background-color:#0000}}::selection{color:#fff;background:#0891b2}@font-face{font-family:Source Han Sans SC;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/SourceHanSans-Subset-SC.woff2)format("woff2")}@font-face{font-family:Source Han Sans JP;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/SourceHanSans-Subset-JP.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/JetBrainsMono.ttf)}:lang(zh),:lang(ko),:lang(en),:lang(fr),:lang(ru),:lang(de),:lang(zh-CN),:lang(zh-TW),:lang(zh-HK){font-family:"Source Han Sans SC",var(--font-sans),sans-serif}:lang(ja){font-family:"Source Han Sans JP",var(--font-sans),sans-serif}.font-mono,.font-mono *{font-family:var(--font-mono),monospace!important}html{font-family:var(--font-sans)sans-serif}::-webkit-scrollbar{z-index:999;width:7px;height:9px}::-webkit-scrollbar-thumb{background-color:var(--color-primary-500);background-image:-webkit-linear-gradient(45deg,#fff3 25%,#0000 0 50%,#fff3 0 75%,#0000 0,#0000);border-radius:10px}::-webkit-scrollbar-track{border-radius:10px}.scroll-embedded{scrollbar-gutter:stable}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}*{cursor:url(/cursors/normal.cur),auto;-webkit-user-select:none;user-select:none}img{-webkit-user-drag:none}input[type=text],.allow-select-text *{-webkit-user-select:text;user-select:text}a,a *,button,button *,select,select *,.cursor-link,.cursor-link *,[role=button],[role=button] *,.cursor-pointer,.cursor-pointer *,input[type=button],input[type=button] *{cursor:url(/cursors/link.cur),pointer!important}input[type=text],input[type=text] *,input[type=password],input[type=password] *,input[type=number],input[type=number] *,input[type=time],input[type=time] *,textarea,textarea *,[contenteditable=true],[contenteditable=true] *,.cursor-text,.cursor-text *{cursor:url(/cursors/text_static_white.cur) 7 16,text}.cursor-grab,.cursor-grab *{cursor:url(/cursors/move.cur),grab}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}html,body,#root{height:100%}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(96.8% .007 247.896);--muted-foreground:oklch(55.4% .046 257.417);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(92.9% .013 255.508);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.8% .042 265.755);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(55.4% .046 257.417);--accent:oklch(27.9% .041 260.031);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.4% .046 257.417);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} diff --git a/service/dist/assets/index-CcNZVzNR.css.br b/service/dist/assets/index-CcNZVzNR.css.br new file mode 100644 index 0000000000000000000000000000000000000000..2bd7f3c0055d8a1c07293f20c6078642eb4f229b GIT binary patch literal 13282 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 p of m)if(p.type==="childList")for(const b of p.addedNodes)b.tagName==="LINK"&&b.rel==="modulepreload"&&c(b)}).observe(document,{childList:!0,subtree:!0});function d(m){const p={};return m.integrity&&(p.integrity=m.integrity),m.referrerPolicy&&(p.referrerPolicy=m.referrerPolicy),m.crossOrigin==="use-credentials"?p.credentials="include":m.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function c(m){if(m.ep)return;m.ep=!0;const p=d(m);fetch(m.href,p)}})();var Hr={exports:{}},Wn={},Br={exports:{}},qr={};/** + * @license React + * scheduler.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var pm;function op(){return pm||(pm=1,(function(u){function o(U,X){var te=U.length;U.push(X);e:for(;0>>1,be=U[Te];if(0>>1;Tem(he,te))Mem(st,he)?(U[Te]=st,U[Me]=te,Te=Me):(U[Te]=he,U[ze]=te,Te=ze);else if(Mem(st,te))U[Te]=st,U[Me]=te,Te=Me;else break e}}return X}function m(U,X){var te=U.sortIndex-X.sortIndex;return te!==0?te:U.id-X.id}if(u.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var p=performance;u.unstable_now=function(){return p.now()}}else{var b=Date,C=b.now();u.unstable_now=function(){return b.now()-C}}var g=[],x=[],j=1,h=null,S=3,y=!1,D=!1,L=!1,M=!1,Y=typeof setTimeout=="function"?setTimeout:null,E=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;function R(U){for(var X=d(x);X!==null;){if(X.callback===null)c(x);else if(X.startTime<=U)c(x),X.sortIndex=X.expirationTime,o(g,X);else break;X=d(x)}}function Z(U){if(L=!1,R(U),!D)if(d(g)!==null)D=!0,I||(I=!0,ee());else{var X=d(x);X!==null&&me(Z,X.startTime-U)}}var I=!1,fe=-1,Ce=5,Ve=-1;function K(){return M?!0:!(u.unstable_now()-VeU&&K());){var Te=h.callback;if(typeof Te=="function"){h.callback=null,S=h.priorityLevel;var be=Te(h.expirationTime<=U);if(U=u.unstable_now(),typeof be=="function"){h.callback=be,R(U),X=!0;break t}h===d(g)&&c(g),R(U)}else c(g);h=d(g)}if(h!==null)X=!0;else{var Ke=d(x);Ke!==null&&me(Z,Ke.startTime-U),X=!1}}break e}finally{h=null,S=te,y=!1}X=void 0}}finally{X?ee():I=!1}}}var ee;if(typeof w=="function")ee=function(){w(G)};else if(typeof MessageChannel<"u"){var ue=new MessageChannel,Se=ue.port2;ue.port1.onmessage=G,ee=function(){Se.postMessage(null)}}else ee=function(){Y(G,0)};function me(U,X){fe=Y(function(){U(u.unstable_now())},X)}u.unstable_IdlePriority=5,u.unstable_ImmediatePriority=1,u.unstable_LowPriority=4,u.unstable_NormalPriority=3,u.unstable_Profiling=null,u.unstable_UserBlockingPriority=2,u.unstable_cancelCallback=function(U){U.callback=null},u.unstable_forceFrameRate=function(U){0>U||125Te?(U.sortIndex=te,o(x,U),d(g)===null&&U===d(x)&&(L?(E(fe),fe=-1):L=!0,me(Z,te-Te))):(U.sortIndex=be,o(g,U),D||y||(D=!0,I||(I=!0,ee()))),U},u.unstable_shouldYield=K,u.unstable_wrapCallback=function(U){var X=S;return function(){var te=S;S=X;try{return U.apply(this,arguments)}finally{S=te}}}})(qr)),qr}var bm;function dp(){return bm||(bm=1,Br.exports=op()),Br.exports}var vm;function fp(){if(vm)return Wn;vm=1;/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var u=dp(),o=Bg(),d=Yg();function c(e){var t="https://react.dev/errors/"+e;if(1be||(e.current=Te[be],Te[be]=null,be--)}function he(e,t){be++,Te[be]=e.current,e.current=t}var Me=Ke(null),st=Ke(null),Ut=Ke(null),Ka=Ke(null);function gl(e,t){switch(he(Ut,t),he(st,e),he(Me,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?kf(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=kf(t),e=Uf(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}ze(Me),he(Me,e)}function ha(){ze(Me),ze(st),ze(Ut)}function tn(e){e.memoizedState!==null&&he(Ka,e);var t=Me.current,a=Uf(t,e.type);t!==a&&(he(st,e),he(Me,a))}function ga(e){st.current===e&&(ze(Me),ze(st)),Ka.current===e&&(ze(Ka),Vn._currentValue=te)}var Q,De;function at(e){if(Q===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Q=t&&t[1]||"",De=-1)":-1n||v[l]!==z[n]){var H=` +`+v[l].replace(" at new "," at ");return e.displayName&&H.includes("")&&(H=H.replace("",e.displayName)),H}while(1<=l&&0<=n);break}}}finally{xa=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?at(a):""}function gh(e,t){switch(e.tag){case 26:case 27:case 5:return at(e.type);case 16:return at("Lazy");case 13:return e.child!==t&&t!==null?at("Suspense Fallback"):at("Suspense");case 19:return at("SuspenseList");case 0:case 15:return an(e.type,!1);case 11:return an(e.type.render,!1);case 1:return an(e.type,!0);case 31:return at("Activity");default:return""}}function uu(e){try{var t="",a=null;do t+=gh(e,a),a=e,e=e.return;while(e);return t}catch(l){return` +Error generating stack: `+l.message+` +`+l.stack}}var Si=Object.prototype.hasOwnProperty,_i=u.unstable_scheduleCallback,Ni=u.unstable_cancelCallback,xh=u.unstable_shouldYield,ph=u.unstable_requestPaint,mt=u.unstable_now,bh=u.unstable_getCurrentPriorityLevel,ou=u.unstable_ImmediatePriority,du=u.unstable_UserBlockingPriority,ts=u.unstable_NormalPriority,vh=u.unstable_LowPriority,fu=u.unstable_IdlePriority,yh=u.log,jh=u.unstable_setDisableYieldValue,ln=null,ht=null;function pa(e){if(typeof yh=="function"&&jh(e),ht&&typeof ht.setStrictMode=="function")try{ht.setStrictMode(ln,e)}catch{}}var gt=Math.clz32?Math.clz32:Nh,Sh=Math.log,_h=Math.LN2;function Nh(e){return e>>>=0,e===0?32:31-(Sh(e)/_h|0)|0}var as=256,ls=262144,ns=4194304;function $a(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ss(e,t,a){var l=e.pendingLanes;if(l===0)return 0;var n=0,i=e.suspendedLanes,r=e.pingedLanes;e=e.warmLanes;var f=l&134217727;return f!==0?(l=f&~i,l!==0?n=$a(l):(r&=f,r!==0?n=$a(r):a||(a=f&~e,a!==0&&(n=$a(a))))):(f=l&~i,f!==0?n=$a(f):r!==0?n=$a(r):a||(a=l&~e,a!==0&&(n=$a(a)))),n===0?0:t!==0&&t!==n&&(t&i)===0&&(i=n&-n,a=t&-t,i>=a||i===32&&(a&4194048)!==0)?t:n}function nn(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function wh(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function mu(){var e=ns;return ns<<=1,(ns&62914560)===0&&(ns=4194304),e}function wi(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function sn(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ch(e,t,a,l,n,i){var r=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var f=e.entanglements,v=e.expirationTimes,z=e.hiddenUpdates;for(a=r&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Mh=/[\n"\\]/g;function Nt(e){return e.replace(Mh,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Oi(e,t,a,l,n,i,r,f){e.name="",r!=null&&typeof r!="function"&&typeof r!="symbol"&&typeof r!="boolean"?e.type=r:e.removeAttribute("type"),t!=null?r==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+_t(t)):e.value!==""+_t(t)&&(e.value=""+_t(t)):r!=="submit"&&r!=="reset"||e.removeAttribute("value"),t!=null?Mi(e,r,_t(t)):a!=null?Mi(e,r,_t(a)):l!=null&&e.removeAttribute("value"),n==null&&i!=null&&(e.defaultChecked=!!i),n!=null&&(e.checked=n&&typeof n!="function"&&typeof n!="symbol"),f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"?e.name=""+_t(f):e.removeAttribute("name")}function Cu(e,t,a,l,n,i,r,f){if(i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(e.type=i),t!=null||a!=null){if(!(i!=="submit"&&i!=="reset"||t!=null)){Ai(e);return}a=a!=null?""+_t(a):"",t=t!=null?""+_t(t):a,f||t===e.value||(e.value=t),e.defaultValue=t}l=l??n,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=f?e.checked:!!l,e.defaultChecked=!!l,r!=null&&typeof r!="function"&&typeof r!="symbol"&&typeof r!="boolean"&&(e.name=r),Ai(e)}function Mi(e,t,a){t==="number"&&rs(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function jl(e,t,a,l){if(e=e.options,t){t={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Hi=!1;if(Ft)try{var on={};Object.defineProperty(on,"passive",{get:function(){Hi=!0}}),window.addEventListener("test",on,on),window.removeEventListener("test",on,on)}catch{Hi=!1}var va=null,Bi=null,os=null;function Du(){if(os)return os;var e,t=Bi,a=t.length,l,n="value"in va?va.value:va.textContent,i=n.length;for(e=0;e=mn),qu=" ",Lu=!1;function Gu(e,t){switch(e){case"keyup":return i0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Yu(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var wl=!1;function r0(e,t){switch(e){case"compositionend":return Yu(t);case"keypress":return t.which!==32?null:(Lu=!0,qu);case"textInput":return e=t.data,e===qu&&Lu?null:e;default:return null}}function u0(e,t){if(wl)return e==="compositionend"||!Qi&&Gu(e,t)?(e=Du(),os=Bi=va=null,wl=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-e};e=l}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=Wu(a)}}function Iu(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Iu(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Pu(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=rs(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=rs(e.document)}return t}function Vi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var p0=Ft&&"documentMode"in document&&11>=document.documentMode,Cl=null,Ji=null,pn=null,Ki=!1;function eo(e,t,a){var l=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Ki||Cl==null||Cl!==rs(l)||(l=Cl,"selectionStart"in l&&Vi(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),pn&&xn(pn,l)||(pn=l,l=li(Ji,"onSelect"),0>=r,n-=r,Yt=1<<32-gt(t)+n|a<le?(re=$,$=null):re=$.sibling;var xe=A(N,$,T[le],B);if(xe===null){$===null&&($=re);break}e&&$&&xe.alternate===null&&t(N,$),_=i(xe,_,le),ge===null?F=xe:ge.sibling=xe,ge=xe,$=re}if(le===T.length)return a(N,$),oe&&Pt(N,le),F;if($===null){for(;lele?(re=$,$=null):re=$.sibling;var Ga=A(N,$,xe.value,B);if(Ga===null){$===null&&($=re);break}e&&$&&Ga.alternate===null&&t(N,$),_=i(Ga,_,le),ge===null?F=Ga:ge.sibling=Ga,ge=Ga,$=re}if(xe.done)return a(N,$),oe&&Pt(N,le),F;if($===null){for(;!xe.done;le++,xe=T.next())xe=q(N,xe.value,B),xe!==null&&(_=i(xe,_,le),ge===null?F=xe:ge.sibling=xe,ge=xe);return oe&&Pt(N,le),F}for($=l($);!xe.done;le++,xe=T.next())xe=k($,N,le,xe.value,B),xe!==null&&(e&&xe.alternate!==null&&$.delete(xe.key===null?le:xe.key),_=i(xe,_,le),ge===null?F=xe:ge.sibling=xe,ge=xe);return e&&$.forEach(function(Hg){return t(N,Hg)}),oe&&Pt(N,le),F}function we(N,_,T,B){if(typeof T=="object"&&T!==null&&T.type===L&&T.key===null&&(T=T.props.children),typeof T=="object"&&T!==null){switch(T.$$typeof){case y:e:{for(var F=T.key;_!==null;){if(_.key===F){if(F=T.type,F===L){if(_.tag===7){a(N,_.sibling),B=n(_,T.props.children),B.return=N,N=B;break e}}else if(_.elementType===F||typeof F=="object"&&F!==null&&F.$$typeof===Ce&&il(F)===_.type){a(N,_.sibling),B=n(_,T.props),_n(B,T),B.return=N,N=B;break e}a(N,_);break}else t(N,_);_=_.sibling}T.type===L?(B=tl(T.props.children,N.mode,B,T.key),B.return=N,N=B):(B=ys(T.type,T.key,T.props,null,N.mode,B),_n(B,T),B.return=N,N=B)}return r(N);case D:e:{for(F=T.key;_!==null;){if(_.key===F)if(_.tag===4&&_.stateNode.containerInfo===T.containerInfo&&_.stateNode.implementation===T.implementation){a(N,_.sibling),B=n(_,T.children||[]),B.return=N,N=B;break e}else{a(N,_);break}else t(N,_);_=_.sibling}B=tc(T,N.mode,B),B.return=N,N=B}return r(N);case Ce:return T=il(T),we(N,_,T,B)}if(me(T))return J(N,_,T,B);if(ee(T)){if(F=ee(T),typeof F!="function")throw Error(c(150));return T=F.call(T),P(N,_,T,B)}if(typeof T.then=="function")return we(N,_,Ts(T),B);if(T.$$typeof===w)return we(N,_,_s(N,T),B);zs(N,T)}return typeof T=="string"&&T!==""||typeof T=="number"||typeof T=="bigint"?(T=""+T,_!==null&&_.tag===6?(a(N,_.sibling),B=n(_,T),B.return=N,N=B):(a(N,_),B=ec(T,N.mode,B),B.return=N,N=B),r(N)):a(N,_)}return function(N,_,T,B){try{Sn=0;var F=we(N,_,T,B);return Hl=null,F}catch($){if($===Rl||$===ws)throw $;var ge=pt(29,$,null,N.mode);return ge.lanes=B,ge.return=N,ge}finally{}}}var rl=No(!0),wo=No(!1),Na=!1;function mc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function hc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function wa(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ca(e,t,a){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(pe&2)!==0){var n=l.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),l.pending=t,t=vs(e),co(e,null,a),t}return bs(e,l,t,a),vs(e)}function Nn(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,gu(e,a)}}function gc(e,t){var a=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,a===l)){var n=null,i=null;if(a=a.firstBaseUpdate,a!==null){do{var r={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};i===null?n=i=r:i=i.next=r,a=a.next}while(a!==null);i===null?n=i=t:i=i.next=t}else n=i=t;a={baseState:l.baseState,firstBaseUpdate:n,lastBaseUpdate:i,shared:l.shared,callbacks:l.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var xc=!1;function wn(){if(xc){var e=Ul;if(e!==null)throw e}}function Cn(e,t,a,l){xc=!1;var n=e.updateQueue;Na=!1;var i=n.firstBaseUpdate,r=n.lastBaseUpdate,f=n.shared.pending;if(f!==null){n.shared.pending=null;var v=f,z=v.next;v.next=null,r===null?i=z:r.next=z,r=v;var H=e.alternate;H!==null&&(H=H.updateQueue,f=H.lastBaseUpdate,f!==r&&(f===null?H.firstBaseUpdate=z:f.next=z,H.lastBaseUpdate=v))}if(i!==null){var q=n.baseState;r=0,H=z=v=null,f=i;do{var A=f.lane&-536870913,k=A!==f.lane;if(k?(ce&A)===A:(l&A)===A){A!==0&&A===kl&&(xc=!0),H!==null&&(H=H.next={lane:0,tag:f.tag,payload:f.payload,callback:null,next:null});e:{var J=e,P=f;A=t;var we=a;switch(P.tag){case 1:if(J=P.payload,typeof J=="function"){q=J.call(we,q,A);break e}q=J;break e;case 3:J.flags=J.flags&-65537|128;case 0:if(J=P.payload,A=typeof J=="function"?J.call(we,q,A):J,A==null)break e;q=h({},q,A);break e;case 2:Na=!0}}A=f.callback,A!==null&&(e.flags|=64,k&&(e.flags|=8192),k=n.callbacks,k===null?n.callbacks=[A]:k.push(A))}else k={lane:A,tag:f.tag,payload:f.payload,callback:f.callback,next:null},H===null?(z=H=k,v=q):H=H.next=k,r|=A;if(f=f.next,f===null){if(f=n.shared.pending,f===null)break;k=f,f=k.next,k.next=null,n.lastBaseUpdate=k,n.shared.pending=null}}while(!0);H===null&&(v=q),n.baseState=v,n.firstBaseUpdate=z,n.lastBaseUpdate=H,i===null&&(n.shared.lanes=0),Oa|=r,e.lanes=r,e.memoizedState=q}}function Co(e,t){if(typeof e!="function")throw Error(c(191,e));e.call(t)}function To(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;ei?i:8;var r=U.T,f={};U.T=f,Uc(e,!1,t,a);try{var v=n(),z=U.S;if(z!==null&&z(f,v),v!==null&&typeof v=="object"&&typeof v.then=="function"){var H=C0(v,l);En(e,t,H,St(e))}else En(e,t,l,St(e))}catch(q){En(e,t,{then:function(){},status:"rejected",reason:q},St())}finally{X.p=i,r!==null&&f.types!==null&&(r.types=f.types),U.T=r}}function M0(){}function Dc(e,t,a,l){if(e.tag!==5)throw Error(c(476));var n=sd(e).queue;nd(e,n,t,te,a===null?M0:function(){return id(e),a(l)})}function sd(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:te,baseState:te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:la,lastRenderedState:te},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:la,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function id(e){var t=sd(e);t.next===null&&(t=e.alternate.memoizedState),En(e,t.next.queue,{},St())}function kc(){return Pe(Vn)}function cd(){return Le().memoizedState}function rd(){return Le().memoizedState}function D0(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=St();e=wa(a);var l=Ca(t,e,a);l!==null&&(ft(l,t,a),Nn(l,t,a)),t={cache:uc()},e.payload=t;return}t=t.return}}function k0(e,t,a){var l=St();a={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Bs(e)?od(t,a):(a=Ii(e,t,a,l),a!==null&&(ft(a,e,l),dd(a,t,l)))}function ud(e,t,a){var l=St();En(e,t,a,l)}function En(e,t,a,l){var n={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(Bs(e))od(t,n);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var r=t.lastRenderedState,f=i(r,a);if(n.hasEagerState=!0,n.eagerState=f,xt(f,r))return bs(e,t,n,0),Ee===null&&ps(),!1}catch{}finally{}if(a=Ii(e,t,n,l),a!==null)return ft(a,e,l),dd(a,t,l),!0}return!1}function Uc(e,t,a,l){if(l={lane:2,revertLane:mr(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},Bs(e)){if(t)throw Error(c(479))}else t=Ii(e,a,l,2),t!==null&&ft(t,e,2)}function Bs(e){var t=e.alternate;return e===ae||t!==null&&t===ae}function od(e,t){ql=Os=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function dd(e,t,a){if((a&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,gu(e,a)}}var An={readContext:Pe,use:ks,useCallback:He,useContext:He,useEffect:He,useImperativeHandle:He,useLayoutEffect:He,useInsertionEffect:He,useMemo:He,useReducer:He,useRef:He,useState:He,useDebugValue:He,useDeferredValue:He,useTransition:He,useSyncExternalStore:He,useId:He,useHostTransitionStatus:He,useFormState:He,useActionState:He,useOptimistic:He,useMemoCache:He,useCacheRefresh:He};An.useEffectEvent=He;var fd={readContext:Pe,use:ks,useCallback:function(e,t){return lt().memoizedState=[e,t===void 0?null:t],e},useContext:Pe,useEffect:$o,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,Rs(4194308,4,Po.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Rs(4194308,4,e,t)},useInsertionEffect:function(e,t){Rs(4,2,e,t)},useMemo:function(e,t){var a=lt();t=t===void 0?null:t;var l=e();if(ul){pa(!0);try{e()}finally{pa(!1)}}return a.memoizedState=[l,t],l},useReducer:function(e,t,a){var l=lt();if(a!==void 0){var n=a(t);if(ul){pa(!0);try{a(t)}finally{pa(!1)}}}else n=t;return l.memoizedState=l.baseState=n,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},l.queue=e,e=e.dispatch=k0.bind(null,ae,e),[l.memoizedState,e]},useRef:function(e){var t=lt();return e={current:e},t.memoizedState=e},useState:function(e){e=zc(e);var t=e.queue,a=ud.bind(null,ae,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:Oc,useDeferredValue:function(e,t){var a=lt();return Mc(a,e,t)},useTransition:function(){var e=zc(!1);return e=nd.bind(null,ae,e.queue,!0,!1),lt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var l=ae,n=lt();if(oe){if(a===void 0)throw Error(c(407));a=a()}else{if(a=t(),Ee===null)throw Error(c(349));(ce&127)!==0||Do(l,t,a)}n.memoizedState=a;var i={value:a,getSnapshot:t};return n.queue=i,$o(Uo.bind(null,l,i,e),[e]),l.flags|=2048,Gl(9,{destroy:void 0},ko.bind(null,l,i,a,t),null),a},useId:function(){var e=lt(),t=Ee.identifierPrefix;if(oe){var a=Qt,l=Yt;a=(l&~(1<<32-gt(l)-1)).toString(32)+a,t="_"+t+"R_"+a,a=Ms++,0<\/script>",i=i.removeChild(i.firstChild);break;case"select":i=typeof l.is=="string"?r.createElement("select",{is:l.is}):r.createElement("select"),l.multiple?i.multiple=!0:l.size&&(i.size=l.size);break;default:i=typeof l.is=="string"?r.createElement(n,{is:l.is}):r.createElement(n)}}i[Fe]=t,i[it]=l;e:for(r=t.child;r!==null;){if(r.tag===5||r.tag===6)i.appendChild(r.stateNode);else if(r.tag!==4&&r.tag!==27&&r.child!==null){r.child.return=r,r=r.child;continue}if(r===t)break e;for(;r.sibling===null;){if(r.return===null||r.return===t)break e;r=r.return}r.sibling.return=r.return,r=r.sibling}t.stateNode=i;e:switch(tt(i,n,l),n){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&sa(t)}}return Ue(t),$c(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&sa(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(c(166));if(e=Ut.current,Ml(t)){if(e=t.stateNode,a=t.memoizedProps,l=null,n=Ie,n!==null)switch(n.tag){case 27:case 5:l=n.memoizedProps}e[Fe]=t,e=!!(e.nodeValue===a||l!==null&&l.suppressHydrationWarning===!0||Mf(e.nodeValue,a)),e||Sa(t,!0)}else e=ni(e).createTextNode(l),e[Fe]=t,t.stateNode=e}return Ue(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(l=Ml(t),a!==null){if(e===null){if(!l)throw Error(c(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(c(557));e[Fe]=t}else al(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),e=!1}else a=sc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(vt(t),t):(vt(t),null);if((t.flags&128)!==0)throw Error(c(558))}return Ue(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(n=Ml(t),l!==null&&l.dehydrated!==null){if(e===null){if(!n)throw Error(c(318));if(n=t.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(c(317));n[Fe]=t}else al(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),n=!1}else n=sc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),n=!0;if(!n)return t.flags&256?(vt(t),t):(vt(t),null)}return vt(t),(t.flags&128)!==0?(t.lanes=a,t):(a=l!==null,e=e!==null&&e.memoizedState!==null,a&&(l=t.child,n=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(n=l.alternate.memoizedState.cachePool.pool),i=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(i=l.memoizedState.cachePool.pool),i!==n&&(l.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),Qs(t,t.updateQueue),Ue(t),null);case 4:return ha(),e===null&&pr(t.stateNode.containerInfo),Ue(t),null;case 10:return ta(t.type),Ue(t),null;case 19:if(ze(qe),l=t.memoizedState,l===null)return Ue(t),null;if(n=(t.flags&128)!==0,i=l.rendering,i===null)if(n)Mn(l,!1);else{if(Be!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(i=As(e),i!==null){for(t.flags|=128,Mn(l,!1),e=i.updateQueue,t.updateQueue=e,Qs(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)ro(a,e),a=a.sibling;return he(qe,qe.current&1|2),oe&&Pt(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&mt()>Ks&&(t.flags|=128,n=!0,Mn(l,!1),t.lanes=4194304)}else{if(!n)if(e=As(i),e!==null){if(t.flags|=128,n=!0,e=e.updateQueue,t.updateQueue=e,Qs(t,e),Mn(l,!0),l.tail===null&&l.tailMode==="hidden"&&!i.alternate&&!oe)return Ue(t),null}else 2*mt()-l.renderingStartTime>Ks&&a!==536870912&&(t.flags|=128,n=!0,Mn(l,!1),t.lanes=4194304);l.isBackwards?(i.sibling=t.child,t.child=i):(e=l.last,e!==null?e.sibling=i:t.child=i,l.last=i)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=mt(),e.sibling=null,a=qe.current,he(qe,n?a&1|2:a&1),oe&&Pt(t,l.treeForkCount),e):(Ue(t),null);case 22:case 23:return vt(t),bc(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(a&536870912)!==0&&(t.flags&128)===0&&(Ue(t),t.subtreeFlags&6&&(t.flags|=8192)):Ue(t),a=t.updateQueue,a!==null&&Qs(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==a&&(t.flags|=2048),e!==null&&ze(sl),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),ta(Ge),Ue(t),null;case 25:return null;case 30:return null}throw Error(c(156,t.tag))}function q0(e,t){switch(lc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ta(Ge),ha(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ga(t),null;case 31:if(t.memoizedState!==null){if(vt(t),t.alternate===null)throw Error(c(340));al()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(vt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(c(340));al()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ze(qe),null;case 4:return ha(),null;case 10:return ta(t.type),null;case 22:case 23:return vt(t),bc(),e!==null&&ze(sl),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ta(Ge),null;case 25:return null;default:return null}}function Rd(e,t){switch(lc(t),t.tag){case 3:ta(Ge),ha();break;case 26:case 27:case 5:ga(t);break;case 4:ha();break;case 31:t.memoizedState!==null&&vt(t);break;case 13:vt(t);break;case 19:ze(qe);break;case 10:ta(t.type);break;case 22:case 23:vt(t),bc(),e!==null&&ze(sl);break;case 24:ta(Ge)}}function Dn(e,t){try{var a=t.updateQueue,l=a!==null?a.lastEffect:null;if(l!==null){var n=l.next;a=n;do{if((a.tag&e)===e){l=void 0;var i=a.create,r=a.inst;l=i(),r.destroy=l}a=a.next}while(a!==n)}}catch(f){ye(t,t.return,f)}}function Ea(e,t,a){try{var l=t.updateQueue,n=l!==null?l.lastEffect:null;if(n!==null){var i=n.next;l=i;do{if((l.tag&e)===e){var r=l.inst,f=r.destroy;if(f!==void 0){r.destroy=void 0,n=t;var v=a,z=f;try{z()}catch(H){ye(n,v,H)}}}l=l.next}while(l!==i)}}catch(H){ye(t,t.return,H)}}function Hd(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{To(t,a)}catch(l){ye(e,e.return,l)}}}function Bd(e,t,a){a.props=ol(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(l){ye(e,t,l)}}function kn(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof a=="function"?e.refCleanup=a(l):a.current=l}}catch(n){ye(e,t,n)}}function Xt(e,t){var a=e.ref,l=e.refCleanup;if(a!==null)if(typeof l=="function")try{l()}catch(n){ye(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(n){ye(e,t,n)}else a.current=null}function qd(e){var t=e.type,a=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&l.focus();break e;case"img":a.src?l.src=a.src:a.srcSet&&(l.srcset=a.srcSet)}}catch(n){ye(e,e.return,n)}}function Wc(e,t,a){try{var l=e.stateNode;cg(l,e.type,a,t),l[it]=t}catch(n){ye(e,e.return,n)}}function Ld(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Ra(e.type)||e.tag===4}function Fc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ld(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Ra(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ic(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Wt));else if(l!==4&&(l===27&&Ra(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(Ic(e,t,a),e=e.sibling;e!==null;)Ic(e,t,a),e=e.sibling}function Xs(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(l!==4&&(l===27&&Ra(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(Xs(e,t,a),e=e.sibling;e!==null;)Xs(e,t,a),e=e.sibling}function Gd(e){var t=e.stateNode,a=e.memoizedProps;try{for(var l=e.type,n=t.attributes;n.length;)t.removeAttributeNode(n[0]);tt(t,l,a),t[Fe]=e,t[it]=a}catch(i){ye(e,e.return,i)}}var ia=!1,Xe=!1,Pc=!1,Yd=typeof WeakSet=="function"?WeakSet:Set,We=null;function L0(e,t){if(e=e.containerInfo,yr=di,e=Pu(e),Vi(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var l=a.getSelection&&a.getSelection();if(l&&l.rangeCount!==0){a=l.anchorNode;var n=l.anchorOffset,i=l.focusNode;l=l.focusOffset;try{a.nodeType,i.nodeType}catch{a=null;break e}var r=0,f=-1,v=-1,z=0,H=0,q=e,A=null;t:for(;;){for(var k;q!==a||n!==0&&q.nodeType!==3||(f=r+n),q!==i||l!==0&&q.nodeType!==3||(v=r+l),q.nodeType===3&&(r+=q.nodeValue.length),(k=q.firstChild)!==null;)A=q,q=k;for(;;){if(q===e)break t;if(A===a&&++z===n&&(f=r),A===i&&++H===l&&(v=r),(k=q.nextSibling)!==null)break;q=A,A=q.parentNode}q=k}a=f===-1||v===-1?null:{start:f,end:v}}else a=null}a=a||{start:0,end:0}}else a=null;for(jr={focusedElem:e,selectionRange:a},di=!1,We=t;We!==null;)if(t=We,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,We=e;else for(;We!==null;){switch(t=We,i=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),tt(i,l,a),i[Fe]=e,$e(i),l=i;break e;case"link":var r=$f("link","href",n).get(l+(a.href||""));if(r){for(var f=0;fwe&&(r=we,we=P,P=r);var N=Fu(f,P),_=Fu(f,we);if(N&&_&&(k.rangeCount!==1||k.anchorNode!==N.node||k.anchorOffset!==N.offset||k.focusNode!==_.node||k.focusOffset!==_.offset)){var T=q.createRange();T.setStart(N.node,N.offset),k.removeAllRanges(),P>we?(k.addRange(T),k.extend(_.node,_.offset)):(T.setEnd(_.node,_.offset),k.addRange(T))}}}}for(q=[],k=f;k=k.parentNode;)k.nodeType===1&&q.push({element:k,left:k.scrollLeft,top:k.scrollTop});for(typeof f.focus=="function"&&f.focus(),f=0;fa?32:a,U.T=null,a=ir,ir=null;var i=Da,r=da;if(Je=0,Vl=Da=null,da=0,(pe&6)!==0)throw Error(c(331));var f=pe;if(pe|=4,Pd(i.current),Wd(i,i.current,r,a),pe=f,Ln(0,!1),ht&&typeof ht.onPostCommitFiberRoot=="function")try{ht.onPostCommitFiberRoot(ln,i)}catch{}return!0}finally{X.p=n,U.T=l,bf(e,t)}}function yf(e,t,a){t=Ct(a,t),t=qc(e.stateNode,t,2),e=Ca(e,t,2),e!==null&&(sn(e,2),Zt(e))}function ye(e,t,a){if(e.tag===3)yf(e,e,a);else for(;t!==null;){if(t.tag===3){yf(t,e,a);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(Ma===null||!Ma.has(l))){e=Ct(a,e),a=yd(2),l=Ca(t,a,2),l!==null&&(jd(a,l,t,e),sn(l,2),Zt(l));break}}t=t.return}}function or(e,t,a){var l=e.pingCache;if(l===null){l=e.pingCache=new Q0;var n=new Set;l.set(t,n)}else n=l.get(t),n===void 0&&(n=new Set,l.set(t,n));n.has(a)||(ar=!0,n.add(a),e=K0.bind(null,e,t,a),t.then(e,e))}function K0(e,t,a){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,Ee===e&&(ce&a)===a&&(Be===4||Be===3&&(ce&62914560)===ce&&300>mt()-Js?(pe&2)===0&&Jl(e,0):lr|=a,Zl===ce&&(Zl=0)),Zt(e)}function jf(e,t){t===0&&(t=mu()),e=el(e,t),e!==null&&(sn(e,t),Zt(e))}function $0(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),jf(e,a)}function W0(e,t){var a=0;switch(e.tag){case 31:case 13:var l=e.stateNode,n=e.memoizedState;n!==null&&(a=n.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(c(314))}l!==null&&l.delete(t),jf(e,a)}function F0(e,t){return _i(e,t)}var ei=null,$l=null,dr=!1,ti=!1,fr=!1,Ua=0;function Zt(e){e!==$l&&e.next===null&&($l===null?ei=$l=e:$l=$l.next=e),ti=!0,dr||(dr=!0,P0())}function Ln(e,t){if(!fr&&ti){fr=!0;do for(var a=!1,l=ei;l!==null;){if(e!==0){var n=l.pendingLanes;if(n===0)var i=0;else{var r=l.suspendedLanes,f=l.pingedLanes;i=(1<<31-gt(42|e)+1)-1,i&=n&~(r&~f),i=i&201326741?i&201326741|1:i?i|2:0}i!==0&&(a=!0,wf(l,i))}else i=ce,i=ss(l,l===Ee?i:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(i&3)===0||nn(l,i)||(a=!0,wf(l,i));l=l.next}while(a);fr=!1}}function I0(){Sf()}function Sf(){ti=dr=!1;var e=0;Ua!==0&&ug()&&(e=Ua);for(var t=mt(),a=null,l=ei;l!==null;){var n=l.next,i=_f(l,t);i===0?(l.next=null,a===null?ei=n:a.next=n,n===null&&($l=a)):(a=l,(e!==0||(i&3)!==0)&&(ti=!0)),l=n}Je!==0&&Je!==5||Ln(e),Ua!==0&&(Ua=0)}function _f(e,t){for(var a=e.suspendedLanes,l=e.pingedLanes,n=e.expirationTimes,i=e.pendingLanes&-62914561;0f)break;var H=v.transferSize,q=v.initiatorType;H&&Df(q)&&(v=v.responseEnd,r+=H*(v"u"?null:document;function Zf(e,t,a){var l=Wl;if(l&&typeof t=="string"&&t){var n=Nt(t);n='link[rel="'+e+'"][href="'+n+'"]',typeof a=="string"&&(n+='[crossorigin="'+a+'"]'),Xf.has(n)||(Xf.add(n),e={rel:e,crossOrigin:a,href:t},l.querySelector(n)===null&&(t=l.createElement("link"),tt(t,"link",e),$e(t),l.head.appendChild(t)))}}function bg(e){fa.D(e),Zf("dns-prefetch",e,null)}function vg(e,t){fa.C(e,t),Zf("preconnect",e,t)}function yg(e,t,a){fa.L(e,t,a);var l=Wl;if(l&&e&&t){var n='link[rel="preload"][as="'+Nt(t)+'"]';t==="image"&&a&&a.imageSrcSet?(n+='[imagesrcset="'+Nt(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(n+='[imagesizes="'+Nt(a.imageSizes)+'"]')):n+='[href="'+Nt(e)+'"]';var i=n;switch(t){case"style":i=Fl(e);break;case"script":i=Il(e)}Mt.has(i)||(e=h({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),Mt.set(i,e),l.querySelector(n)!==null||t==="style"&&l.querySelector(Xn(i))||t==="script"&&l.querySelector(Zn(i))||(t=l.createElement("link"),tt(t,"link",e),$e(t),l.head.appendChild(t)))}}function jg(e,t){fa.m(e,t);var a=Wl;if(a&&e){var l=t&&typeof t.as=="string"?t.as:"script",n='link[rel="modulepreload"][as="'+Nt(l)+'"][href="'+Nt(e)+'"]',i=n;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":i=Il(e)}if(!Mt.has(i)&&(e=h({rel:"modulepreload",href:e},t),Mt.set(i,e),a.querySelector(n)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Zn(i)))return}l=a.createElement("link"),tt(l,"link",e),$e(l),a.head.appendChild(l)}}}function Sg(e,t,a){fa.S(e,t,a);var l=Wl;if(l&&e){var n=vl(l).hoistableStyles,i=Fl(e);t=t||"default";var r=n.get(i);if(!r){var f={loading:0,preload:null};if(r=l.querySelector(Xn(i)))f.loading=5;else{e=h({rel:"stylesheet",href:e,"data-precedence":t},a),(a=Mt.get(i))&&zr(e,a);var v=r=l.createElement("link");$e(v),tt(v,"link",e),v._p=new Promise(function(z,H){v.onload=z,v.onerror=H}),v.addEventListener("load",function(){f.loading|=1}),v.addEventListener("error",function(){f.loading|=2}),f.loading|=4,ii(r,t,l)}r={type:"stylesheet",instance:r,count:1,state:f},n.set(i,r)}}}function _g(e,t){fa.X(e,t);var a=Wl;if(a&&e){var l=vl(a).hoistableScripts,n=Il(e),i=l.get(n);i||(i=a.querySelector(Zn(n)),i||(e=h({src:e,async:!0},t),(t=Mt.get(n))&&Er(e,t),i=a.createElement("script"),$e(i),tt(i,"link",e),a.head.appendChild(i)),i={type:"script",instance:i,count:1,state:null},l.set(n,i))}}function Ng(e,t){fa.M(e,t);var a=Wl;if(a&&e){var l=vl(a).hoistableScripts,n=Il(e),i=l.get(n);i||(i=a.querySelector(Zn(n)),i||(e=h({src:e,async:!0,type:"module"},t),(t=Mt.get(n))&&Er(e,t),i=a.createElement("script"),$e(i),tt(i,"link",e),a.head.appendChild(i)),i={type:"script",instance:i,count:1,state:null},l.set(n,i))}}function Vf(e,t,a,l){var n=(n=Ut.current)?si(n):null;if(!n)throw Error(c(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Fl(a.href),a=vl(n).hoistableStyles,l=a.get(t),l||(l={type:"style",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Fl(a.href);var i=vl(n).hoistableStyles,r=i.get(e);if(r||(n=n.ownerDocument||n,r={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},i.set(e,r),(i=n.querySelector(Xn(e)))&&!i._p&&(r.instance=i,r.state.loading=5),Mt.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},Mt.set(e,a),i||wg(n,e,a,r.state))),t&&l===null)throw Error(c(528,""));return r}if(t&&l!==null)throw Error(c(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Il(a),a=vl(n).hoistableScripts,l=a.get(t),l||(l={type:"script",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(c(444,e))}}function Fl(e){return'href="'+Nt(e)+'"'}function Xn(e){return'link[rel="stylesheet"]['+e+"]"}function Jf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function wg(e,t,a,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),tt(t,"link",a),$e(t),e.head.appendChild(t))}function Il(e){return'[src="'+Nt(e)+'"]'}function Zn(e){return"script[async]"+e}function Kf(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+Nt(a.href)+'"]');if(l)return t.instance=l,$e(l),l;var n=h({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),$e(l),tt(l,"style",n),ii(l,a.precedence,e),t.instance=l;case"stylesheet":n=Fl(a.href);var i=e.querySelector(Xn(n));if(i)return t.state.loading|=4,t.instance=i,$e(i),i;l=Jf(a),(n=Mt.get(n))&&zr(l,n),i=(e.ownerDocument||e).createElement("link"),$e(i);var r=i;return r._p=new Promise(function(f,v){r.onload=f,r.onerror=v}),tt(i,"link",l),t.state.loading|=4,ii(i,a.precedence,e),t.instance=i;case"script":return i=Il(a.src),(n=e.querySelector(Zn(i)))?(t.instance=n,$e(n),n):(l=a,(n=Mt.get(i))&&(l=h({},a),Er(l,n)),e=e.ownerDocument||e,n=e.createElement("script"),$e(n),tt(n,"link",l),e.head.appendChild(n),t.instance=n);case"void":return null;default:throw Error(c(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,ii(l,a.precedence,e));return t.instance}function ii(e,t,a){for(var l=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=l.length?l[l.length-1]:null,i=n,r=0;r title"):null)}function Cg(e,t,a){if(a===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Ff(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function Tg(e,t,a,l){if(a.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var n=Fl(l.href),i=t.querySelector(Xn(n));if(i){t=i._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=ri.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=i,$e(i);return}i=t.ownerDocument||t,l=Jf(l),(n=Mt.get(n))&&zr(l,n),i=i.createElement("link"),$e(i);var r=i;r._p=new Promise(function(f,v){r.onload=f,r.onerror=v}),tt(i,"link",l),a.instance=i}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=ri.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var Ar=0;function zg(e,t){return e.stylesheets&&e.count===0&&oi(e,e.stylesheets),0Ar?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(n)}}:null}function ri(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)oi(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var ui=null;function oi(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ui=new Map,t.forEach(Eg,e),ui=null,ri.call(e))}function Eg(e,t){if(!(t.state.loading&4)){var a=ui.get(e);if(a)var l=a.get(null);else{a=new Map,ui.set(e,a);for(var n=e.querySelectorAll("link[data-precedence],style[data-precedence]"),i=0;i"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(u)}catch(o){console.error(o)}}return u(),Hr.exports=fp(),Hr.exports}var hp=mp();const gp=qg(hp),$m=O.createContext(null);function xp({children:u}){const[o,d]=O.useState(null);return s.jsx($m.Provider,{value:{openId:o,setOpenId:d},children:u})}function pp(){return O.useContext($m)}function bp(u){const o=u.replace(/-/g,"+").replace(/_/g,"/"),d=o.length%4,c=o+(d?"=".repeat(4-d):""),m=atob(c);return Uint8Array.from([...m].map(p=>p.charCodeAt(0)))}async function vp(u,o){const d=await crypto.subtle.importKey("raw",new TextEncoder().encode(u),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),c=await crypto.subtle.sign("HMAC",d,o);return Array.from(new Uint8Array(c)).map(m=>m.toString(16).padStart(2,"0")).join("")}async function yp(u){const o=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(u)),d=btoa(String.fromCharCode(...new Uint8Array(o))).replace(/\+/g,"-").replace(/\//g,"_");return new window.fernet.Secret(d)}class jp{constructor(o,d,c){this.ws=null,this.fernetSecret=null,this.url=o,this.sharedSecret=d,this.name=c}async connect(o){return new Promise((d,c)=>{let m=!1;this.ws=new WebSocket(this.url),this.ws.onopen=p=>{console.log(`[${this.name}] Connected`),this.onOpen?.(p)},this.ws.onmessage=async p=>{try{const b=JSON.parse(p.data);if(b.type==="handshake"){const C=bp(b.challenge),g=await vp(this.sharedSecret,C);this.ws?.send(JSON.stringify({response:g}))}else b.type==="handshake_ok"&&(this.fernetSecret=await yp(this.sharedSecret),console.log(`[${this.name}] Handshake OK`),m=!0,d())}catch{if(!this.fernetSecret)return;try{const b=p.data,g=new window.fernet.Token({secret:this.fernetSecret,token:b,ttl:0}).decode();this.name!=="heartbeat"&&console.log(`[${this.name}] Recv: ${g}`),o?.(g)}catch(b){console.error(`[${this.name}] Decrypt error: ${b}`)}}},this.ws.onerror=p=>{console.error(`[${this.name}] Error:`,p),this.onError?.(p),m||c(p)},this.ws.onclose=p=>{console.warn(`[${this.name}] Closed (code=${p.code}, reason=${p.reason||"none"})`),this.onClose?.(p),m||c(p)}})}sendJson(o){if(!this.fernetSecret)throw new Error("Handshake not done");if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not open");const c=new window.fernet.Token({secret:this.fernetSecret}).encode(JSON.stringify(o));this.ws.send(c),console.log(`[${this.name}] Sent: ${JSON.stringify(o)}`)}close(){this.ws&&(this.ws.close(),this.ws=null)}}const Sp=u=>(o,d,c)=>{const m=c.subscribe;return c.subscribe=((b,C,g)=>{let x=b;if(C){const j=g?.equalityFn||Object.is;let h=b(c.getState());x=S=>{const y=b(S);if(!j(h,y)){const D=h;C(h=y,D)}},g?.fireImmediately&&C(h,h)}return m(x)}),u(o,d,c)},_p=Sp,W=(...u)=>Qg(Xg(u)),Np=u=>typeof u=="object"&&u!==null&&!Array.isArray(u),$r=u=>{const o=new Date(u),d=(c,m=2)=>String(c).padStart(m,"0");return`${o.getFullYear()}-${d(o.getMonth()+1)}-${d(o.getDate())} ${d(o.getHours())}:${d(o.getMinutes())}:${d(o.getSeconds())}.${d(o.getMilliseconds(),3)}`},Wm=u=>{const o=new Date(u),d=(c,m=2)=>String(c).padStart(m,"0");return`${d(o.getHours())}:${d(o.getMinutes())}:${d(o.getSeconds())}.${d(o.getMilliseconds(),3)}`},wp=()=>Math.floor(Date.now()/1e3),qt=()=>Date.now(),Va={日服:"JP",国际服:"Global",国际服青少年:"Global",韩国ONE:"Global",Steam国际服:"Global",B服:"CN",官服:"CN"},Cp={日服:"JP",国际服:"Global_en-us",国际服青少年:"Global_en-us",韩国ONE:"Global_en-us",Steam国际服:"Global_en-us",B服:"CN",官服:"CN"},Fm=Om((u,o)=>({globalLogData:[],appendGlobalLog:d=>{u(c=>({globalLogData:[...c.globalLogData,d]}))}}));class Vt{static get(o){try{const d=localStorage.getItem(o);return d?JSON.parse(d):null}catch(d){return console.error("[StorageUtil:get] error:",d),null}}static set(o,d){try{localStorage.setItem(o,JSON.stringify(d))}catch(c){console.error("[StorageUtil:set] error:",c)}}static remove(o){try{localStorage.removeItem(o)}catch(d){console.error("[StorageUtil:remove] error:",d)}}static clear(){try{localStorage.clear()}catch(o){console.error("[StorageUtil:clear] error:",o)}}}const bi="ws://localhost:8190",{appendGlobalLog:jm}=Fm.getState(),vi=async(u,o=1e3)=>{const{connect:d}=V.getState();for(;;)try{await d(u),console.log(`[${u}] connected successfully`);return}catch(c){c.reason==="Invalid handshake response"?(console.error(`[${u}] connect failed, maybe Secret is Incorrect!`,c),V.setState(m=>({...m,_secret:""})),Vt.set("SECRET","")):console.error(`[${u}] connect failed, retrying in ${o}ms`,c),await new Promise(m=>setTimeout(m,o))}},Ya=(u,o,d,c,m=1/0)=>new Promise((p,b)=>{const C=d(u());if(c(C)){p();return}const g=o(d,j=>{c(j)&&(clearTimeout(x),g(),p())});let x=null;m!==1/0&&(x=setTimeout(()=>{g(),b(new Error("waitFor timeout"))},m))}),Tp=(u,o,d=1/0,c=50)=>new Promise((m,p)=>{const b=Date.now(),C=()=>{try{const x=u();o(x)?(clearInterval(g),m()):Date.now()-b>=d&&(clearInterval(g),p(new Error("waitFor timeout")))}catch(x){clearInterval(g),p(x)}};C();const g=setInterval(C,c)}),V=Om()(_p((u,o,d)=>({connections:{},logStore:{},configStore:{},staticStore:{},eventStore:{},updateStore:{},statusStore:{},versionStore:{},pendingCallbacks:{},_all_data_initialized:!1,_heartbeat_time:0,_initiating:!1,_secret:"",connect:async c=>{if(o().connections[c])return;let m="";c==="provider"&&(m=`${bi}/ws/provider`),c==="sync"&&(m=`${bi}/ws/sync`),c==="trigger"&&(m=`${bi}/ws/trigger`),c==="heartbeat"&&(m=`${bi}/ws/heartbeat`);const p={config:g=>{u(x=>({configStore:{...x.configStore,[g.resource_id]:g.data}}))},event:g=>{u(x=>({eventStore:{...x.eventStore,[g.resource_id]:g.data}}))},static:g=>{u(x=>({staticStore:g.data}))},setup_toml:g=>{u(x=>({updateStore:g.data}))}},b={config_list:g=>{u(x=>{const j=Object.fromEntries(g.data.filter(E=>!(E in x.configStore)).map(E=>[E,{}])),h=Object.fromEntries(g.data.filter(E=>!(E in x.eventStore)).map(E=>[E,[]])),S=Object.fromEntries(g.data.map(E=>{const w=`config:${E}`;return w in x.logStore?null:[w,[]]}).filter(E=>!!E)),y=Object.fromEntries(g.data.filter(E=>!(E in x.statusStore)).map(E=>[E,{}])),D=Object.fromEntries(Object.entries(x.configStore).filter(([E])=>g.data.includes(E))),L=Object.fromEntries(Object.entries(x.eventStore).filter(([E])=>g.data.includes(E))),M=Object.fromEntries(Object.entries(x.logStore).filter(([E])=>g.data.some(w=>E===`config:${w}`))),Y=Object.fromEntries(Object.entries(x.statusStore).filter(([E])=>g.data.includes(E)));return{configStore:{...D,...j},eventStore:{...L,...h},logStore:{...M,...S},statusStore:{...Y,...y}}})},snapshot:g=>{p[g.resource](g)},logs_full:g=>{const x=g.scopes,j=Object.fromEntries(x.map(S=>[S,[]]));g.entries.forEach(S=>{const y={time:S.time,level:S.level,message:S.message};j[S.scope].push(y),S.scope=="global"&&jm(y)}),u(S=>({logStore:j}))},log:g=>{const x=g.entry,j={time:x.time,level:x.level,message:x.message};u(h=>{const S=h.logStore[x.scope]??[];return{logStore:{...h.logStore,[x.scope]:[...S,j]}}}),x.scope=="global"&&jm(j)},status:g=>{const x=g.status;if(typeof x!="string")if("is_all_data_initialized"in x)u(j=>({...j,_all_data_initialized:!0}));else{let j=Object.keys(x)[0];typeof x[j]=="object"&&"config_id"in x[j]?Object.keys(x).forEach(h=>{u(S=>({statusStore:{...S.statusStore,[h]:{...S.statusStore[h]??{},...x[h]}}}))}):u(h=>({statusStore:{...h.statusStore,[x.config_id]:x.status}}))}},command_response:g=>{const{timestamp:x,command:j,data:h,status:S}=g,y=o().pendingCallbacks[x];y?(y({command:j,data:h,status:S}),delete o().pendingCallbacks[x]):console.warn("CallBack Not Found:",g)},patch:g=>{const x=g.ops,j=g.resource;if(j==="gui")return;const h=g.resource_id??null;h&&(Array.isArray(x)?x.forEach(S=>{if(S.op==="add"){o().send("sync",{type:"list"});const y=Object.keys(o().configStore).length;Ya(o,d.subscribe,D=>Object.keys(D.configStore).length,D=>D===y+1).then(()=>{o().send("sync",{type:"pull",resource:"config",resource_id:h}),o().send("sync",{type:"pull",resource:"event",resource_id:h})})}if(S.op==="remove")o().send("sync",{type:"list"});else{const y=`${h}::${j}${S.path}`;let D=S.value;o().patch(y,D)}}):console.error("Invalid patch message:",g))},patch_ack:g=>{const{timestamp:x}=g,j=o().pendingCallbacks[x];j?(j(),delete o().pendingCallbacks[x]):console.warn("CallBack Not Found:",g)},heartbeat:g=>{const{timestamp:x}=g;u(j=>({...j,_heartbeat_time:x}))}};u(g=>({...g,_secret:Vt.get("SECRET")})),await Ya(o,d.subscribe,g=>g._secret,g=>g!==""),Vt.set("SECRET",o()._secret);const C=new jp(m,o()._secret,c);await C.connect(g=>{try{const x=JSON.parse(g);b[x.type]?.(x)}catch(x){console.error("Message parse error:",x,g)}}),C.onClose=()=>{u(g=>{const x={...g.connections};return delete x[c],{connections:x}})},C.onError=g=>console.error("Socket error:",g),u(g=>({connections:{...g.connections,[c]:C}}))},disconnect:c=>{const m=o().connections[c];m&&(m.ws?.close(),u(p=>{const b={...p.connections};return delete b[c],{connections:b}}))},send:(c,m)=>{const p=o().connections[c];p&&p.sendJson(m)},init:async()=>{o()._initiating||(u(c=>({...c,_initiating:!0})),await vi("heartbeat"),await vi("provider"),await vi("sync"),o().send("sync",{type:"pull",resource:"static"}),await Ya(o,d.subscribe,c=>Object.keys(c.staticStore).length,c=>c>0),o().send("sync",{type:"pull",resource:"setup_toml",resource_id:"global"}),await Ya(o,d.subscribe,c=>Object.keys(c.updateStore).length,c=>c>0),o().send("sync",{type:"list"}),await Ya(o,d.subscribe,c=>Object.keys(c.configStore).length,c=>c>0),Object.keys(o().configStore).forEach(c=>{o().send("sync",{type:"pull",resource:"config",resource_id:c})}),await Ya(o,d.subscribe,c=>Object.keys(c.eventStore).length,c=>c>0),Object.keys(o().configStore).forEach(c=>{o().send("sync",{type:"pull",resource:"event",resource_id:c})}),await vi("trigger"),o().trigger({timestamp:qt(),command:"check_for_update",payload:{}},c=>{u(m=>({...m,versionStore:{local:c.data.local,remote:c.data.remote}}))}),await Ya(o,d.subscribe,c=>c.versionStore,c=>Object.keys(c).length>0),await Ya(o,d.subscribe,c=>c._all_data_initialized,c=>c),u(c=>({...c,_initiating:!1})))},patch:(c,m)=>{const[p,b]=c.split("::"),[C,...g]=b.split("/");u(x=>{let j;switch(C){case"config":j="configStore";break;case"event":j="eventStore";break;case"setup_toml":j="updateStore";break;default:throw new Error(`Unknown resource scope: ${C}`)}const h=x[j],S=h?.[p]??{};if(!(g[0]in S)&&m===void 0)return;let y={...S};if(g.length===0||g.length===1&&g[0]==="")y=m;else{let D=y;for(let M=0;M{const[b,C]=c.split("::"),g=qt(),x=Np(m)?Object.entries(m).map(([j,h])=>({op:"replace",path:`/${j}`,value:h})):[{op:"replace",path:"/",value:m}];o().pendingCallbacks[g]=()=>{p&&Dt.success(ji("settings.updateSuccess"),{description:ji("settings.updateSuccessDesc")})},o().send("sync",{type:"patch",resource_id:b,resource:C,timestamp:g,ops:x})},trigger:(c,m)=>{const p=c.timestamp||Date.now();m&&(o().pendingCallbacks[p]=m),o().send("trigger",{type:"command",_timestamp:p,...c})}}))),Lr={lang:"",theme:"",zoomScale:100,scrollToEnd:!0,assetsDisplay:!0},Im=O.createContext(void 0);function zp(u){let o="pending",d,c=u.then(m=>{o="success",d=m},m=>{o="error",d=m});return{read(){if(o==="pending")throw c;if(o==="error")throw d;return d}}}const Ep=V.getState().init,Ap=zp(Ep()),Op=({children:u,setReady:o})=>{const[d,c]=O.useState([]),[m,p]=O.useState(null),[b,C]=O.useState(!1),[g,x]=O.useState(Lr);Ap.read();const j=V(S=>S.configStore);O.useEffect(()=>{const S=Vt.get("uiSettings");S?x(S):(x(Lr),Vt.set("uiSettings",Lr)),C(!0)},[]),O.useEffect(()=>{b&&Vt.set("uiSettings",g)},[g]),O.useEffect(()=>{const S=Object.keys(j).map(y=>({id:y,name:j[y].name,settings:j[y]}));S.length>0&&!m&&(async()=>{const y=Vt.get("tabOrder");y&&y.length&&S.sort((D,L)=>{const M=y.indexOf(D.id),Y=y.indexOf(L.id);return M===-1&&Y===-1?0:M===-1?1:Y===-1?-1:M-Y}),p(S[0])})(),c(S)},[j]),O.useEffect(()=>{o(!0)},[]);const h={profiles:d,uiSettings:g,setUiSettings:x,activeProfile:m,setActiveProfile:p};return s.jsx(Im.Provider,{value:h,children:s.jsx(xp,{children:u})})},Ja=()=>{const u=O.useContext(Im);if(u===void 0)throw new Error("useApp must be used within an AppProvider");return u},Pm=O.createContext(void 0),Mp=({children:u})=>{const[o,d]=O.useState(()=>localStorage.getItem("theme")||"system");O.useEffect(()=>{const m=window.document.documentElement,p=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light",b=o==="system"?p:o;m.classList.remove("light","dark"),m.classList.add(b),localStorage.setItem("theme",o);const C=window.matchMedia("(prefers-color-scheme: dark)"),g=()=>{if(o==="system"){const x=C.matches?"dark":"light";m.classList.remove("light","dark"),m.classList.add(x)}};return C.addEventListener("change",g),()=>C.removeEventListener("change",g)},[o]);const c=m=>{d(m)};return s.jsx(Pm.Provider,{value:{theme:o,setTheme:c},children:u})},eh=()=>{const u=O.useContext(Pm);if(u===void 0)throw new Error("useTheme must be used within a ThemeProvider");return u},Dp=({onStateChanged:u})=>{const[o,d]=O.useState(!1),[c,m]=O.useState(!0),p=V(x=>x._heartbeat_time),b=V(x=>x.init),C=O.useRef(Date.now());O.useEffect(()=>{if(!p)return;C.current=Date.now(),d(!0),m(!0),u(!0);const x=setTimeout(()=>d(!1),300);return()=>clearTimeout(x)},[p]),O.useEffect(()=>{const x=setInterval(async()=>{Date.now()-C.current>5e3&&(m(!1),u(!1),await b())},1e3);return()=>clearInterval(x)},[]);const g=c?o?"var(--color-primary-400)":"var(--color-primary-500)":"var(--color-slate-500)";return s.jsx(Ze.div,{className:"w-4 h-4 rounded-full mx-auto",animate:{scale:c&&o?1.3:1,backgroundColor:g,boxShadow:c?o?"0 0 25px var(--color-primary-500)":"0 0 10px var(--color-primary-400)":"none"},transition:{type:"spring",stiffness:300,damping:15}})},kp=()=>{const{t:u}=ne(),[o,d]=O.useState(!1);return s.jsxs("div",{className:"flex flex-row items-center justify-center p-4 bg-slate-100/50 dark:bg-slate-700/50 w-full rounded-xl self-start",children:[s.jsx(Dp,{onStateChanged:d}),s.jsx(Ze.div,{className:"ml-4 text-sm font-bold rounded-lg",animate:{color:o?"var(--color-primary-400)":"var(--color-slate-400)"},transition:{duration:.4},children:u(o?"heartbeat.connected":"heartbeat.connecting")}),s.jsx("div",{className:"flex-grow"})]})},Up="/",Rp=({activePage:u,setActivePage:o})=>{const{t:d}=ne(),c=V(x=>x.versionStore),[m,p]=O.useState(!1),b=c.remote&&c.local!==c.remote,C=[{id:"home",label:d("home"),icon:Zg},{id:"scheduler",label:d("scheduler"),icon:Vg},{id:"configuration",label:d("configuration"),icon:Jg},{id:"settings",label:d("settings"),icon:Vr},{id:"wiki",label:d("title.wiki"),icon:Kg}],g=async()=>{};return s.jsxs("div",{className:"relative",children:[s.jsxs("aside",{className:"w-64 h-full flex-shrink-0 bg-white dark:bg-slate-900 border-r border-slate-200 dark:border-slate-700 flex-col lg:block hidden",children:[s.jsxs("div",{className:"h-16 flex items-center border-b border-slate-200 dark:border-slate-700 px-4",children:[s.jsx("img",{src:`${Up}images/logo.png`,alt:"Logo",className:"h-8 w-8"}),s.jsx("h1",{className:"text-xl font-bold text-primary-600 dark:text-primary-400 flex-1 text-start ml-2",children:d("appTitle")})]}),s.jsxs("nav",{className:"flex-1 px-4 py-6 h-[calc(100%-64px)] flex flex-col",children:[s.jsx("ul",{children:C.map(x=>s.jsxs("li",{children:[x.id==="settings"&&s.jsx("hr",{className:"border-[1px] border-slate-300 dark:border-slate-500"},x.id+"hr"),s.jsxs("button",{onClick:()=>o(x.id),className:`flex items-center w-full px-4 py-3 my-1 text-sm font-bold rounded-lg transition-colors duration-200 ${u===x.id?"bg-primary-500 text-white":"text-slate-600 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800"}`,children:[s.jsx(x.icon,{className:"w-5 h-5 mr-3"}),s.jsx("span",{children:x.label})]})]},x.id))}),s.jsx("div",{className:"flex-grow"}),b&&s.jsxs("button",{className:`flex flex-row items-center justify-center p-4 bg-red-100/50 hover:bg-red-100/90\r + dark:bg-red-900/50 hover:dark:bg-red-900/90 w-full rounded-xl self-start mb-2 transition`,onClick:()=>p(!0),children:[s.jsx(Jr,{className:"text-red-500"}),s.jsx("div",{className:"ml-2 text-sm font-bold rounded-lg text-red-500",children:d("update.available")}),s.jsx("div",{className:"flex-grow"})]}),s.jsx(kp,{})]})]}),s.jsx("nav",{className:"lg:hidden fixed bottom-0 left-0 w-full bg-white dark:bg-slate-900 border-t border-slate-200 dark:border-slate-700 flex justify-between items-center py-2 px-4 z-40",children:C.map(x=>s.jsxs("button",{onClick:()=>o(x.id),className:`flex flex-col items-center w-full text-sm font-medium py-2 ${u===x.id?"text-primary-500":"text-slate-600 dark:text-slate-300 hover:text-primary-500"}`,children:[s.jsx(x.icon,{className:"w-6 h-6 mb-1"}),s.jsx("span",{children:x.label})]},x.id))}),b&&s.jsx(Ze.button,{onClick:()=>p(!0),whileHover:{scale:1.1},whileTap:{scale:.95},animate:{y:[0,-4,0]},transition:{duration:2,repeat:1/0,ease:"easeInOut"},className:"lg:hidden fixed bottom-25 right-5 z-50 w-14 h-14 rounded-full bg-red-500 hover:bg-red-600 text-white shadow-lg flex items-center justify-center",children:s.jsx(Jr,{className:"w-7 h-7"})}),s.jsx(Bp,{open:m,localVersion:c.local,remoteVersion:c.remote,onCancel:()=>p(!1),onConfirm:async()=>{await g(),p(!1)}})]})},Hp="fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50",Bp=({open:u,localVersion:o,remoteVersion:d,onCancel:c,onConfirm:m})=>{const{t:p}=ne();return u?s.jsx("div",{className:Hp,onMouseDown:b=>{b.target===b.currentTarget&&c()},children:s.jsxs(Ze.div,{initial:{opacity:0,scale:.96,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:10},transition:{duration:.18,ease:"easeOut"},onMouseDown:b=>b.stopPropagation(),className:"w-[420px] rounded-2xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-2xl p-6",children:[s.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[s.jsx("div",{className:"rounded-full bg-primary-100 dark:bg-primary-900/40 text-primary-600 p-3",children:s.jsx(Jr,{className:"w-6 h-6"})}),s.jsxs("div",{children:[s.jsx("h2",{className:"text-lg font-semibold text-slate-900 dark:text-slate-100",children:p("confirmUpdateTitle")||"Confirm Update"}),s.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:p("updatePrompt")||"A new version is available. Confirm to update your application."})]})]}),s.jsxs("div",{className:"rounded-lg border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800/40 p-3 mb-5",children:[s.jsxs("div",{className:"flex items-center gap-2 text-sm mb-1",children:[s.jsx(Mm,{className:"w-4 h-4 text-red-500"}),s.jsxs("span",{className:"text-slate-600 dark:text-slate-300",children:[p("localVersion")||"Current version",":"]}),s.jsx("code",{className:"font-mono text-slate-700 dark:text-slate-100",children:o.slice(0,8)})]}),s.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[s.jsx(eu,{className:"w-4 h-4 text-green-500"}),s.jsxs("span",{className:"text-slate-600 dark:text-slate-300",children:[p("remoteVersion")||"Latest version",":"]}),s.jsx("code",{className:"font-mono text-green-700 dark:text-green-300",children:d?d.slice(0,8):"UNKNOWN"})]})]}),s.jsxs("div",{className:"flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400 mb-4",children:[s.jsx(tu,{className:"w-4 h-4 text-primary-500"}),s.jsx("span",{children:p("updateNotice")||"Make sure your current tasks are saved before updating."})]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx("button",{onClick:c,className:"px-4 py-2 rounded-md bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors",children:p("cancel")||"Cancel"}),s.jsx("button",{onClick:m,className:"px-4 py-2 rounded-md bg-primary-600 hover:bg-primary-700 text-white font-medium shadow-sm transition-colors",children:p("updates")||"Update Now"})]})]})}):null};function th({...u}){return s.jsx(Ox,{"data-slot":"select",...u})}function ah({...u}){return s.jsx(kx,{"data-slot":"select-value",...u})}function lh({className:u,size:o="default",children:d,...c}){return s.jsxs(Mx,{"data-slot":"select-trigger","data-size":o,className:W("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",u),...c,children:[d,s.jsx(Dx,{asChild:!0,children:s.jsx(au,{className:"size-4 opacity-50"})})]})}function nh({className:u,children:o,position:d="popper",...c}){return s.jsx(Ux,{children:s.jsxs(Rx,{"data-slot":"select-content",className:W("bg-popover dark:bg-slate-900 text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",d==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",u),position:d,...c,children:[s.jsx(qp,{}),s.jsx(Hx,{className:W("p-1",d==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),children:o}),s.jsx(Lp,{})]})})}function sh({className:u,children:o,...d}){return s.jsxs(Bx,{"data-slot":"select-item",className:W("focus:bg-accent dark:focus:bg-slate-700 focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",u),...d,children:[s.jsx("span",{className:"absolute right-2 flex size-3.5 items-center justify-center",children:s.jsx(qx,{children:s.jsx(Dm,{className:"size-4"})})}),s.jsx(Lx,{children:o})]})}function qp({className:u,...o}){return s.jsx(Gx,{"data-slot":"select-scroll-up-button",className:W("flex cursor-default items-center justify-center py-1",u),...o,children:s.jsx(km,{className:"size-4"})})}function Lp({className:u,...o}){return s.jsx(Yx,{"data-slot":"select-scroll-down-button",className:W("flex cursor-default items-center justify-center py-1",u),...o,children:s.jsx(au,{className:"size-4"})})}function ih({delayDuration:u=0,...o}){return s.jsx(Kx,{"data-slot":"tooltip-provider",delayDuration:u,...o})}function ch({...u}){return s.jsx(ih,{children:s.jsx(Qx,{"data-slot":"tooltip",...u})})}function rh({...u}){return s.jsx(Xx,{"data-slot":"tooltip-trigger",...u})}function uh({className:u,sideOffset:o=0,children:d,...c}){return s.jsx(Zx,{children:s.jsxs(Vx,{"data-slot":"tooltip-content",sideOffset:o,className:W("bg-primary dark:bg-slate-700 dark:text-white text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",u),...c,children:[d,s.jsx(Jx,{className:"bg-primary dark:bg-slate-700 fill-primary dark:fill-slate-700 z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]"})]})})}const en=({label:u,tooltip:o,className:d})=>s.jsxs("label",{className:`text-sm font-medium mb-2 flex items-center ${d??""}`,children:[s.jsx("span",{children:u}),s.jsxs(ch,{children:[s.jsx(rh,{asChild:!0,children:s.jsx("button",{type:"button",className:"ml-1",children:s.jsx($g,{size:18})})}),s.jsx(uh,{className:"max-w-xs text-sm",children:o})]})]}),Oe=({label:u,tooltip:o,value:d,onChange:c,options:m,placeholder:p,className:b,selectId:C,disabled:g=!1})=>{const x=O.useId(),j=C??x,h=pp(),S=h?h.openId===j:void 0,y=D=>{h&&h.setOpenId(D?j:null)};return s.jsxs("div",{className:`space-y-2 ${b??""}`,children:[u&&(o?s.jsx(en,{className:"block text-sm font-medium",label:u,tooltip:o}):s.jsx("label",{className:"block text-sm font-medium",children:u})),s.jsxs(th,{value:d,disabled:g,onValueChange:D=>{c(D),h&&h.setOpenId(null)},...h&&{open:S,onOpenChange:y},children:[s.jsx(lh,{className:"w-full",children:s.jsx(ah,{placeholder:p??"请选择"})}),s.jsx(nh,{position:"popper",children:m.map(D=>s.jsx(sh,{value:D.value,children:D.label},D.value))})]})]})};function Gp({className:u,type:o,...d}){return o==="number"?s.jsxs("div",{className:"relative w-full",children:[s.jsx("input",{type:"number","data-slot":"input",className:W("appearance-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none","file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent pr-8 px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",u),...d}),s.jsxs("div",{className:"absolute inset-y-0 right-1 flex flex-col justify-center",children:[s.jsx("button",{type:"button",tabIndex:-1,className:"hover:text-primary transition-colors",onClick:c=>{const m=c.currentTarget.parentElement?.previousSibling||null;m&&m.stepUp(),m?.dispatchEvent(new Event("input",{bubbles:!0}))},children:s.jsx(km,{className:"h-3 w-3"})}),s.jsx("button",{type:"button",tabIndex:-1,className:"hover:text-primary transition-colors",onClick:c=>{const m=c.currentTarget.parentElement?.previousSibling||null;m&&m.stepDown(),m?.dispatchEvent(new Event("input",{bubbles:!0}))},children:s.jsx(au,{className:"h-3 w-3"})})]})]}):s.jsx("input",{type:o??"text","data-slot":"input",className:W("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive","appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none",u),...d})}const de=({label:u,tooltip:o,className:d,childClassName:c,...m})=>s.jsxs("div",{className:`space-y-2 ${d??""}`,children:[u&&(o?s.jsx(en,{className:"block text-sm font-medium",label:u,tooltip:o}):s.jsx("label",{className:"block text-sm font-medium",children:u})),s.jsx(Gp,{...m,className:W("w-full",c)})]}),Yp="[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",Qp=()=>{const{t:u}=ne(),{activeProfile:o,setActiveProfile:d}=Ja(),[c,m]=je.useState([]),p=O.useRef(c),b=V(G=>G.configStore),{modify:C,trigger:g}=V(),x=je.useRef(null),[j,h]=je.useState({left:!1,right:!1}),S=je.useCallback(()=>{const G=x.current;G&&h({left:G.scrollLeft>0,right:G.scrollLeft+G.clientWidth{S();const G=x.current;if(!G)return;const ee=()=>S(),ue=()=>S();return window.addEventListener("resize",ee),G.addEventListener("scroll",ue,{passive:!0}),()=>{window.removeEventListener("resize",ee),G.removeEventListener("scroll",ue)}},[S]);const y=G=>{x.current?.scrollBy({left:G,behavior:"smooth"})},[D,L]=je.useState(null),[M,Y]=je.useState(null),[E,w]=je.useState(null),R=()=>L(null);O.useEffect(()=>{const G=Object.keys(b).map(Se=>({id:Se,name:b[Se].name,server:b[Se].server,settings:b[Se]})),ee=Vt.get("tabOrder");ee&&ee.length&&G.sort((Se,me)=>{const U=ee.indexOf(Se.id),X=ee.indexOf(me.id);return U===-1&&X===-1?0:U===-1?1:X===-1?-1:U-X}),m(G);const ue=G.find(Se=>Se.id===o?.id);d(ue??G[0]),(async()=>setTimeout(()=>{if(!(ue??G[0]))return;document.getElementById(`tab-${ue??G[0].id}`)?.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"})},0))()},[b]);const Z=G=>{m(G),Vt.set("tabOrder",G.map(ee=>ee.id))},I=G=>{d(G),document.getElementById(`tab-${G.id}`)?.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"})};O.useEffect(()=>{p.current=c},[c]);const fe=async(G,ee)=>{if(p.current.some(me=>me.name.trim()===G.trim()))throw new Error(u("nameExists"));const ue=await new Promise(me=>{g({timestamp:qt()+Math.random()*1e3,command:"add_config",payload:{name:G,server:ee}},U=>me(U.data.serial))});await Tp(()=>p.current.filter(me=>me.id===ue),me=>me.length!==0);const Se=p.current.find(me=>me.id===ue);Se&&d(Se)},Ce=async(G,ee,ue)=>{const Se=ee.trim();if(c.some(me=>me.id!==G.id&&me.name.trim()===Se))throw new Error(u("nameExists")||"Name already exists");C(`${G.id}::config`,{name:Se,server:ue}),m(me=>me.map(U=>U.id===G.id?{...U,name:Se,server:ue}:U)),o?.id===G.id&&d({...o,name:Se})},Ve=async G=>{if(c.length<=1){alert(u("cannotDeleteLast")||"Cannot delete the last profile.");return}let ee=null;m(ue=>{const Se=ue.findIndex(U=>U.id===G.id),me=ue.filter(U=>U.id!==G.id);return o?.id===G.id&&(ee=me[Math.max(0,Math.min(Se,me.length-1))]??null),me}),ee&&queueMicrotask(()=>d(ee)),g({timestamp:qt()+Math.random()*1e3,command:"remove_config",payload:{id:G.id}})};je.useEffect(()=>(window.addEventListener("click",R),()=>{window.removeEventListener("click",R),window.removeEventListener("contextmenu",R)}),[]);const K=V(G=>G.statusStore);return s.jsxs("header",{className:"h-16 flex-shrink-0 bg-white dark:bg-slate-900 border-b border-slate-200 dark:border-slate-700 flex items-center px-3",children:[s.jsxs("div",{className:"flex items-center gap-1 mr-2",children:[s.jsx("button",{className:`p-1 rounded hover:bg-slate-100 dark:hover:bg-slate-800 ${j.left?"":"opacity-40 pointer-events-none"}`,onClick:()=>y(-200),"aria-label":"scroll-left",children:s.jsx(Um,{className:"w-5 h-5"})}),s.jsx("button",{className:`p-1 rounded hover:bg-slate-100 dark:hover:bg-slate-800 ${j.right?"":"opacity-40 pointer-events-none"}`,onClick:()=>y(200),"aria-label":"scroll-right",children:s.jsx(Rm,{className:"w-5 h-5"})})]}),s.jsx("div",{ref:x,className:`flex-1 overflow-x-auto ${Yp}`,children:s.jsx(Ir,{axis:"x",values:c,onReorder:Z,className:"flex items-stretch h-10 gap-1",children:c.map(G=>{const ee=o?.id===G.id;return K[G.id]?s.jsxs(Pr,{id:`tab-${G.id}`,value:G,className:`group relative flex items-center max-w-xs shrink-0 rounded-lg px-3 h-10 select-none + border cursor-pointer transition-colors + ${ee?"bg-slate-100 dark:bg-slate-700 border-slate-400 dark:border-slate-500":"bg-slate-50 dark:bg-slate-800 border-slate-200 dark:border-slate-700 hover:bg-slate-100 dark:hover:bg-slate-700"} + `,onClick:()=>I(G),onPointerDown:ue=>{ue.button===1&&(ue.preventDefault(),w(G))},onContextMenu:ue=>{ue.preventDefault(),L({x:ue.clientX,y:ue.clientY,tab:G})},children:[K[G.id].running?s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}):s.jsx(s.Fragment,{}),s.jsx("span",{className:"truncate pr-5",children:G.name}),s.jsx("button",{title:u("delete")||"Delete",className:"absolute right-1 p-1 rounded opacity-0 group-hover:opacity-100 hover:bg-slate-200/70 dark:hover:bg-slate-700/70 transition",onClick:ue=>{ue.stopPropagation(),w(G)},children:s.jsx(Kt,{className:"w-3.5 h-3.5"})})]},G.id):s.jsx("div",{},G.id)})})}),s.jsxs("div",{className:"ml-3",children:[s.jsxs("button",{onClick:()=>Y({mode:"create"}),className:"hidden sm:flex items-center px-3 h-9 rounded-lg bg-primary-600 text-white hover:bg-primary-700 transition-colors",children:[s.jsx(dm,{className:"w-4 h-4 mr-2"}),u("addProfile")]}),s.jsx("button",{onClick:()=>Y({mode:"create"}),className:"flex sm:hidden items-center h-9 rounded-lg bg-primary-600 text-white hover:bg-primary-700 transition-colors w-9",children:s.jsx(dm,{className:"w-5 h-5 translate-x-[8px]"})})]}),s.jsx(Zr,{children:D&&D.tab&&s.jsxs(Ze.div,{initial:{opacity:0,scale:.96},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.96},transition:{type:"tween",duration:.12},className:"fixed z-50 min-w-[160px] rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 shadow-lg py-1",style:{top:D.y+2,left:D.x+2},children:[s.jsxs("button",{className:"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-slate-100 dark:hover:bg-slate-700",onClick:()=>{Y({mode:"edit",tab:D.tab}),L(null)},children:[s.jsx(Wg,{className:"w-4 h-4"})," ",u("edit")||"Edit"]}),s.jsxs("button",{className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 hover:bg-red-50 dark:hover:bg-red-950/30",onClick:()=>{w(D.tab),L(null)},children:[s.jsx(Hm,{className:"w-4 h-4"})," ",u("delete")||"Delete"]})]})}),s.jsx(Xp,{open:!!M,mode:M?.mode||"create",initial:M?.tab||null,onClose:()=>Y(null),onSubmit:async G=>{M?.mode==="create"?await fe(G.name,G.server):M?.mode==="edit"&&M?.tab&&await Ce(M.tab,G.name,G.server),Y(null)},checkName:(G,ee)=>c.some(ue=>ue.id!==ee&&ue.name.trim()===G.trim())}),s.jsx(Zp,{open:!!E,name:E?.name||"",onCancel:()=>w(null),onConfirm:async()=>{E&&await Ve(E),w(null)},disabled:c.length<=1})]})},oh="fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center z-50",Xp=u=>{const{t:o}=ne(),[d,c]=je.useState(u.initial?.name??""),[m,p]=je.useState("CN"),[b,C]=je.useState(null),[g,x]=je.useState(!1);je.useEffect(()=>{u.open&&(c(u.initial?.name??""),p(u.initial?.server??"NULL"),C(null))},[u.open,u.initial]);const j=async()=>{const h=d.trim();if(!h)return C(o("configAdd.nameRequired"));if(m==="NULL")return C(o("configAdd.serverRequired")||"Server is required");if(u.checkName(h,u.initial?.id))return C(o("configAdd.nameDuplicate")||"Name already exists");try{x(!0),await u.onSubmit({name:h,server:m})}catch(S){console.error(S),console.error({nm:h,server:m}),C(S?.message||o("saveFailed")||"Save failed")}finally{x(!1)}};return u.open?s.jsx("div",{className:oh,onMouseDown:h=>{h.target===h.currentTarget&&u.onClose()},children:s.jsxs(Ze.div,{initial:{opacity:0,y:12,scale:.98},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:12,scale:.98},transition:{duration:.18,type:"tween",ease:"easeOut"},className:"w-[420px] rounded-xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-700 shadow-xl p-5",onMouseDown:h=>h.stopPropagation(),children:[s.jsx("div",{className:"text-lg font-semibold mb-4",children:u.mode==="create"?o("createProfile")||"Create Profile":o("editProfile")||"Edit Profile"}),s.jsxs("div",{className:"space-y-4",children:[s.jsx(de,{value:d,label:o("profileName"),placeholder:o("placeholder.profileName"),onChange:h=>c(h.target.value)}),s.jsx(Oe,{label:o("server.server"),value:m,disabled:u.mode==="edit",onChange:h=>p(h),placeholder:o("configAdd.selectServer"),options:[{label:o("configAdd.selectServer"),value:"NULL"},{label:o("server.cn.official"),value:"官服"},{label:o("server.cn.bilibili"),value:"B服"},{label:o("server.global"),value:"国际服"},{label:o("server.global.teen"),value:"国际服青少年"},{label:o("server.kr.one"),value:"韩国ONE"},{label:o("server.jp"),value:"日服"}]}),b&&s.jsx("div",{className:"text-red-600 text-sm",children:b})]}),s.jsxs("div",{className:"mt-5 flex justify-end gap-2",children:[s.jsx("button",{onClick:u.onClose,className:"px-3 py-2 rounded-md bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700",disabled:g,children:o("cancel")}),s.jsxs("button",{onClick:j,className:"px-3 py-2 rounded-md bg-primary-600 text-white hover:bg-primary-700 disabled:opacity-60 flex items-center",disabled:g,children:[g&&s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}),s.jsx("span",{children:u.mode==="create"?o("create")||"Create":o("save")||"Save"})]})]})]})}):null},Zp=u=>{const{t:o}=ne();return u.open?s.jsx("div",{className:oh,onMouseDown:d=>{d.target===d.currentTarget&&u.onCancel()},children:s.jsxs(Ze.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:8},transition:{duration:.16},className:"w-[420px] rounded-xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-700 shadow-xl p-5",onMouseDown:d=>d.stopPropagation(),children:[s.jsxs("div",{className:"flex items-start gap-3",children:[s.jsx("div",{className:"mt-1 rounded-full bg-red-100 dark:bg-red-900/40 text-red-600 p-2",children:s.jsx(Hm,{className:"w-5 h-5"})}),s.jsxs("div",{className:"flex-1",children:[s.jsx("div",{className:"text-lg font-semibold",children:o("confirmDeleteTitle")}),s.jsx("div",{className:"text-sm text-slate-600 dark:text-slate-300 mt-1",children:o("confirmDeleteMessage",{name:u.name})})]})]}),s.jsxs("div",{className:"mt-5 flex justify-end gap-2",children:[s.jsx("button",{onClick:u.onCancel,className:"px-3 py-2 rounded-md bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700",children:o("cancel")}),s.jsx("button",{onClick:u.onConfirm,disabled:u.disabled,className:"px-3 py-2 rounded-md bg-red-600 text-white hover:bg-red-700 disabled:opacity-60",children:o("delete")})]})]})}):null};function Vp(u){const o=O.useRef(null);return isNaN(u)&&(u=1),O.useEffect(()=>{const d=o.current;d.style.transformOrigin="0 0",d.style.transform=`scale(${u})`,d.style.width=`${100/u}%`,d.style.height=`${100/u}%`},[u]),o}const Jp=({children:u,activePage:o,setActivePage:d})=>{const{uiSettings:c}=Ja(),m=Vp(c?.zoomScale/100);return s.jsxs("div",{className:"flex h-full w-full overflow-hidden text-slate-800 dark:text-slate-200",ref:m,children:[s.jsx(Rp,{activePage:o,setActivePage:d}),s.jsxs("div",{className:"flex flex-1 flex-col overflow-hidden",children:[s.jsx(Qp,{}),s.jsx("main",{className:"flex-1 overflow-y-auto p-6 pr-0 sm:pr-6 bg-slate-100 dark:bg-slate-800",children:u})]})]})},Ae=({children:u,variant:o="primary",className:d="",...c})=>{const m="px-4 py-2 text-sm font-semibold rounded-lg shadow-sm focus:outline-none transition-colors duration-200 disabled:opacity-50 disabled:cursors-not-allowed",p={primary:"bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500",secondary:"bg-slate-200 text-slate-800 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600 focus:ring-slate-500",danger:"bg-red-600 text-white hover:bg-red-700 focus:ring-red-500"};return s.jsx("button",{className:`${m} ${p[o]} ${d}`,...c,children:u})},Kp=u=>{switch(u){case"INFO":return"text-blue-400";case"WARNING":return"text-yellow-400";case"ERROR":return"text-red-400";case"CRITICAL":return"text-purple-400";default:return"text-slate-400"}},$p=u=>{switch(u){case"INFO":return"text-inherit font-normal border-l-[3px] border-gray-400";case"WARNING":return"text-yellow-500 font-bold border-l-[5px] border-yellow-500";case"ERROR":return"text-red-500 font-bold border-l-[5px] border-red-500";case"CRITICAL":return"text-purple-500 font-bold border-l-[5px] border-purple-500";default:return"text-inherit font-normal border-l-[3px] border-gray-400"}},Wp=({index:u,logs:o,style:d})=>{const c=o[u];return s.jsxs("div",{style:d,className:"flex items-start cursor-text px-2",children:[s.jsx("span",{className:"text-gray-500 whitespace-nowrap min-w-[100px] hidden sm:block",children:Wm(c.time)}),s.jsxs("span",{className:`sm:min-w-[75px] ${Kp(c.level)} font-bold flex justify-end mr-2`,children:[s.jsx("span",{className:"block sm:hidden",children:c.level.trim().charAt(0)}),s.jsx("span",{className:"hidden sm:block",children:c.level})]}),s.jsx("div",{className:`flex-1 pl-2 sm:pl-2 whitespace-pre-wrap break-words ${$p(c.level)}`,children:c.message})]})},Fp=({logs:u=[],scrollToEnd:o=!1})=>{const d=O.useRef(null),c=Fg({defaultRowHeight:28});return O.useLayoutEffect(()=>{if(!o||!d.current)return;let m=0;const p=()=>{d.current&&u.length>0&&d.current.scrollToRow({index:u.length-1,align:"end"}),m=requestAnimationFrame(p)};return p(),()=>cancelAnimationFrame(m)},[o,u.length]),s.jsx("div",{className:"w-full h-full bg-slate-900/80 dark:bg-slate/50 rounded-lg font-mono text-sm text-white py-1 pl-1 sm:py-4 sm:pl-4 overflow-x-auto allow-select-text",children:u.length>0?s.jsx(Ig,{listRef:d,rowComponent:Wp,rowCount:u.length,rowHeight:c,rowProps:{logs:u}}):s.jsx("div",{className:"text-slate-400 px-2 py-2 select-none",children:"No logs yet."})})};function nu({...u}){return s.jsx($x,{"data-slot":"popover",...u})}function su({...u}){return s.jsx(Wx,{"data-slot":"popover-trigger",...u})}function iu({className:u,align:o="center",sideOffset:d=4,...c}){return s.jsx(Fx,{children:s.jsx(Ix,{"data-slot":"popover-content",align:o,sideOffset:d,className:W("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",u),...c})})}const Qa="/",Ip=()=>{const{t:u}=ne(),[o,d]=je.useState(Date.now());return je.useEffect(()=>{const c=setInterval(()=>d(Date.now()),1e4);return()=>clearInterval(c)},[]),c=>{const m=Math.floor(o/1e3-c);if(m<60)return u("secondsAgo",{count:m});const p=Math.floor(m/60);if(p<60)return u("minutesAgo",{count:p});const b=Math.floor(p/60);if(b<24)return u("hoursAgo",{count:b});const C=Math.floor(b/24);return u("daysAgo",{count:C})}},Gr=({className:u=""})=>s.jsx("div",{className:`animate-pulse bg-slate-200 dark:bg-slate-700 rounded-md ${u}`}),Pp=({profileId:u})=>{const{t:o}=ne(),d=Ip(),c=V(g=>g.configStore[u]),[m,p]=O.useState(Array.from({length:8}).map(()=>!1));if(!c||Object.keys(c).length===0)return s.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-4 gap-2 p-2",children:Array.from({length:8}).map((g,x)=>s.jsxs("div",{className:"flex items-center bg-white dark:bg-slate-800/50 p-3 rounded-lg border border-slate-200 dark:border-slate-700",children:[s.jsx(Gr,{className:"w-10 h-10 rounded-full mr-4"}),s.jsxs("div",{className:"flex-1 space-y-2",children:[s.jsx(Gr,{className:"h-4 w-3/4"}),s.jsx(Gr,{className:"h-3 w-1/2"})]})]},x))});const C=[{name:o("property.ap"),value:`${c.ap.count}/${c.ap.max}`,time:c.ap.time,icon:`${Qa}icons/property/currency_icon_ap.webp`},{name:o("property.credits"),value:c.creditpoints.count.toLocaleString(),time:c.creditpoints.time,icon:`${Qa}icons/property/currency_icon_gold.webp`},{name:o("property.pyroxene"),value:c.pyroxene.count.toLocaleString(),time:c.pyroxene.time,icon:`${Qa}icons/property/currency_icon_gem.webp`},{name:o("property.coin.arena"),value:c.tactical_challenge_coin.count.toLocaleString(),time:c.tactical_challenge_coin.time,icon:`${Qa}icons/property/item_icon_chasecoin.webp`},{name:o("property.coin.commission"),value:c.bounty_coin.count,time:c.bounty_coin.time,icon:`${Qa}icons/property/item_icon_arenacoin.webp`},{name:o("property.keystone"),value:c.create_item_holding_quantity.Keystone?.toLocaleString()||"-1",time:c.pyroxene.time,icon:`${Qa}icons/property/item_icon_craftitem_1.webp`},{name:o("property.keystone.piece"),value:c.create_item_holding_quantity["Keystone-Piece"]?.toLocaleString()||"-1",time:c.pyroxene.time,icon:`${Qa}icons/property/item_icon_craftitem_0.webp`},{name:o("property.pass"),value:`${c._pass.level}/${c._pass.max_level}`,time:c._pass.time,icon:`${Qa}icons/property/item_icon_pass.webp`}];return s.jsx("div",{className:"max-[320px]:hidden grid sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-2",children:C.map((g,x)=>s.jsxs(nu,{open:m[x],onOpenChange:()=>p(j=>{const h=[...j];return h[x]=!1,h}),children:[s.jsx(su,{asChild:!0,children:s.jsxs("div",{onMouseEnter:()=>p(j=>{const h=[...j];return h[x]=!1,h}),onMouseLeave:()=>p(j=>{const h=[...j];return h[x]=!1,h}),className:"bg-white dark:bg-slate-800/50 p-3 rounded-lg border border-slate-200 dark:border-slate-700 flex items-start transition-transform hover:scale-[1.02]",children:[s.jsxs("div",{className:"flex flex-col items-center justify-center mr-4 min-w-10 ml-1",children:[s.jsx("img",{src:g.icon,className:"w-8 h-6",alt:g.name}),s.jsx("div",{className:"text-sm text-slate-500 dark:text-slate-400",children:g.name})]}),s.jsxs("div",{children:[s.jsx("div",{className:"text-l font-bold text-slate-800 dark:text-slate-100",children:g.value}),s.jsx("div",{className:"text-xs text-slate-400 dark:text-slate-500 mt-1",children:d(g.time)})]})]})}),s.jsx(iu,{className:"w-56 p-2 mr-6 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 max-h-100 overflow-y-auto"})]},g.name))})},kt=({children:u,className:o="",onClick:d})=>{const c="bg-white dark:bg-slate-800/50 border border-slate-200 dark:border-slate-700 rounded-xl shadow-sm",m=d?"cursors-pointer hover:shadow-md hover:border-primary-300 dark:hover:border-primary-500 transition-all duration-200":"";return s.jsx("div",{className:`${c} ${m} ${o}`,onClick:d,children:u})},Xa=({children:u,className:o=""})=>s.jsx("div",{className:`p-4 border-b border-slate-200 dark:border-slate-700 ${o}`,children:u}),ma=({children:u,className:o=""})=>s.jsx("div",{className:`p-4 ${o}`,children:u}),Za=({children:u,className:o=""})=>s.jsx("h3",{className:`text-lg font-semibold text-slate-800 dark:text-slate-100 ${o}`,children:u}),cu=({children:u,className:o=""})=>s.jsx("p",{className:`text-sm text-slate-500 dark:text-slate-400 ${o}`,children:u}),nt=({children:u,checked:o,label:d,onChange:c,className:m="",...p})=>u?s.jsx("button",{onClick:()=>c(!o),className:`px-6 py-2 rounded-lg text-sm font-semibold transition-all duration-200 ${o?"bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500":"bg-slate-200 text-slate-800 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600 focus:ring-slate-500"} ${m}`,...p,children:u}):s.jsxs("button",{onClick:()=>c(!o),className:`px-6 py-2 rounded-lg text-sm font-semibold transition-all duration-200 ${o?"bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500":"bg-slate-200 text-slate-800 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600 focus:ring-slate-500"} ${m}`,...p,children:[d??""," : ",o?ji("switch.on"):ji("switch.off")]}),eb=({profileId:u})=>{const{t:o}=ne(),[d,c]=O.useState(!1),m=V(b=>b.statusStore[u]?.current_task),p=V(b=>b.statusStore[u]?.waiting_tasks);return s.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-1",children:[s.jsxs("div",{className:"bg-white dark:bg-slate-800/50 p-2 rounded-lg border border-slate-200 dark:border-slate-700 flex items-center",children:[s.jsx(Kr,{className:"w-5 h-5 mr-2 text-primary-500"}),s.jsxs("div",{className:"flex-grow",children:[o("runningTask"),":"]}),s.jsx("div",{className:"flex flex-col items-center justify-center float-end",children:m?s.jsx("span",{className:"text-lg font-semibold text-primary-600 dark:text-primary-400",children:o(m)}):s.jsx("span",{className:"text-slate-500 dark:text-slate-400",children:o("noTaskRunning")})})]}),s.jsxs("div",{className:"bg-white dark:bg-slate-800/50 p-2 rounded-lg border border-slate-200 dark:border-slate-700 flex items-center",children:[s.jsx(Kr,{className:"w-5 h-5 mr-2 text-primary-500"}),s.jsxs("div",{className:"flex-grow",children:[o("nextTask"),":"]}),s.jsx("div",{className:"flex flex-col items-center justify-center float-end mr-2",children:p&&p.length>0?s.jsx("span",{className:"text-lg font-semibold text-primary-600 dark:text-primary-400",children:p[0]}):s.jsx("span",{className:"text-slate-500 dark:text-slate-400",children:o("noTasksQueued")})}),s.jsxs(nu,{open:d,onOpenChange:c,children:[s.jsx(su,{asChild:!0,children:s.jsx("button",{className:"p-1 hover:bg-slate-100 dark:hover:bg-slate-700 rounded-lg outline-none",onClick:()=>c(!d),children:s.jsx(Pg,{className:"w-5 h-5 text-slate-600 dark:text-slate-300"})})}),s.jsx(iu,{className:"w-56 p-2 mr-6 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 max-h-100 overflow-y-auto",onFocusOutside:()=>c(!1),children:p&&p.length>0?s.jsx("ul",{className:"space-y-1",children:p.map((b,C)=>s.jsx("li",{className:"text-lg px-3 py-2 bg-slate-100 dark:bg-slate-800 rounded-md",children:b},C))}):s.jsx("div",{className:"text-sm text-slate-500 dark:text-slate-400",children:o("noTasksQueued")})})]})]})]})},tb=({profileId:u})=>{const{t:o}=ne(),{uiSettings:d,setUiSettings:c}=Ja(),{profiles:m,activeProfile:p}=Ja(),b=u??p?.id,C=O.useMemo(()=>m.find(L=>L.id===b)??p??null,[m,b,p]),g=V(L=>L.statusStore),x=V(L=>L.trigger),j=V(L=>L.logStore),h=g[u]?.running||!1,S=()=>{!C||h||x({timestamp:qt(),command:"start_scheduler",config_id:u,payload:{}},L=>{console.debug("start_scheduler acknowledged",L)})},y=()=>{!C||!h||x({timestamp:wp(),command:"stop_scheduler",config_id:u,payload:{}},L=>{console.debug("stop_scheduler acknowledged",L)})},D=()=>{const L=j[`config:${u}`].map(w=>`[${$r(w.time)}] ${w.level}: ${w.message}`).join(` +`),M=new Blob([L],{type:"text/plain;charset=utf-8"}),Y=URL.createObjectURL(M),E=document.createElement("a");E.href=Y,E.download=`logs-${u}-${new Date().toISOString()}.txt`,E.click(),URL.revokeObjectURL(Y)};return s.jsxs("div",{className:"h-full flex flex-col min-h-0 gap-2",children:[s.jsxs("div",{className:"flex justify-between items-center shrink-0",children:[s.jsxs("div",{className:"flex",children:[s.jsx("h2",{className:"text-2xl font-bold text-slate-800 dark:text-slate-100",children:o("home")}),s.jsxs("h2",{className:"text-2xl ml-3 text-slate-500 dark:text-slate-400",children:["#",C?.name]})]}),s.jsx("div",{className:"flex sm:hidden items-center gap-2",children:s.jsx(Ae,{onClick:h?y:S,variant:h?"danger":"primary",className:"pl-2 pr-2 flex items-center justify-center",children:h?s.jsx(fm,{className:"w-4 h-4"}):s.jsx(mm,{className:"w-4 h-4"})})}),s.jsx("div",{className:"hidden sm:flex items-center gap-2",children:s.jsxs(Ae,{onClick:h?y:S,variant:h?"danger":"primary",className:"w-25 pl-3 flex items-center justify-center",children:[h?s.jsx(fm,{className:"w-4 h-4 mr-2"}):s.jsx(mm,{className:"w-4 h-4 mr-2"}),o(h?"stop":"start")]})})]}),s.jsx(eb,{profileId:u}),d?.assetsDisplay&&s.jsx("div",{className:"shrink-0",children:s.jsx(Pp,{profileId:u})}),s.jsxs(kt,{className:"flex-1 min-h-100 flex flex-col",children:[s.jsxs(Xa,{className:"flex justify-between items-center",children:[s.jsx(Za,{children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(ex,{})," ",o("logs")]})}),s.jsxs("div",{className:"sm:flex hidden items-center justify-center",children:[s.jsx(nt,{checked:d?.scrollToEnd,onChange:L=>{c(M=>({...M,scrollToEnd:L}))},label:o("log.scroll"),className:"!px-4"}),s.jsx(Ae,{onClick:D,className:"ml-2",children:s.jsxs("div",{className:"flex",children:[s.jsx(hm,{size:20,className:"mr-2"}),o("log.export")]})})]}),s.jsxs("div",{className:"sm:hidden flex items-center justify-center",children:[s.jsx(nt,{checked:d?.scrollToEnd,onChange:L=>{c(M=>({...M,scrollToEnd:L}))},label:"",className:"!px-4 ml-2 w-8 h-8",children:s.jsx(tx,{size:20,className:"rounded w-4 h-4 translate-x-[-8px]"})}),s.jsx(Ae,{onClick:D,className:"ml-2 w-8 h-8",children:s.jsx(hm,{size:20,className:"rounded w-4 h-4 translate-x-[-8px]"})})]})]}),s.jsx(ma,{className:"flex-1 min-h-0 p-0 flex overflow-x-hidden",children:s.jsx(Fp,{logs:j[`config:${u}`],scrollToEnd:d?.scrollToEnd})})]})]})};function Gt({className:u,orientation:o="horizontal",decorative:d=!0,...c}){return s.jsx(Px,{"data-slot":"separator",decorative:d,orientation:o,className:W("bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",u),...c})}const ru=({isOpen:u,onClose:o,title:d,children:c,width:m=40})=>(O.useEffect(()=>{const b=C=>{C.key==="Escape"&&o()};return window.addEventListener("keydown",b),()=>{window.removeEventListener("keydown",b)}},[o]),u?s.jsx("div",{className:"fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center z-50",onMouseDown:b=>{b.target===b.currentTarget&&o()},children:s.jsx(Ze.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:8},transition:{duration:.16},onMouseDown:b=>b.stopPropagation(),className:"rounded-xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-700 shadow-xl p-5 px-3",style:{width:`${m}%`,minWidth:"320px"},children:s.jsxs("div",{className:"overflow-auto px-2",style:{maxHeight:"calc(100vh - 80px)"},children:[s.jsxs("div",{className:"flex items-center justify-between p-0 border-b border-slate-200 dark:border-slate-700",children:[s.jsx("h2",{className:"text-xl font-semibold text-slate-800 dark:text-slate-100",children:d}),s.jsx("button",{onClick:o,className:"p-1 rounded-full hover:bg-slate-100 dark:hover:bg-slate-700",children:s.jsx(Kt,{className:"w-5 h-5 text-slate-500"})})]}),s.jsx("div",{className:"py-2 overflow-y-auto px-1",children:c})]})})}):null),ab=({isOpen:u,onClose:o,alternatives:d,selected:c,onChange:m,translatePrefix:p})=>{const{t:b}=ne(),[C,g]=O.useState(""),x=O.useMemo(()=>d.filter(h=>(p?b(p+"."+h):h).toString().toLowerCase().includes(C.toLowerCase())),[C,d]),j=h=>{c.includes(h)?m(c.filter(S=>S!==h)):m([...c,h])};return s.jsxs(Zm,{open:u,onClose:o,className:"relative z-50",children:[s.jsx("div",{className:"fixed inset-0 bg-black/30","aria-hidden":"true"}),s.jsx("div",{className:"fixed inset-0 flex items-center justify-center",children:s.jsxs(Vm,{className:"w-full max-w-3xl rounded-lg bg-white dark:bg-slate-800 p-6 shadow-lg",children:[s.jsxs("div",{className:"flex justify-between items-center mb-4",children:[s.jsx(Jm,{className:"text-lg font-semibold",children:b("scheduler.selector")}),s.jsx("button",{onClick:o,children:s.jsx(Kt,{className:"w-5 h-5 text-slate-500"})})]}),s.jsx("input",{type:"text",placeholder:b("scheduler.search"),value:C,onChange:h=>g(h.target.value),className:"w-full mb-4 px-3 py-2 border rounded-md focus:ring-primary-500 focus:border-primary-500"}),s.jsx("div",{className:"flex flex-wrap gap-2 max-h-96 overflow-y-auto",children:x.map(h=>{const S=h.toString(),y=c.includes(S);return s.jsx("button",{onClick:()=>j(S),className:`px-3 py-1 rounded-full text-sm border transition ${y?"bg-primary-600 text-white border-primary-600":"bg-slate-100 dark:bg-slate-700 border-slate-300"}`,children:p?b(p+"."+S):S},S)})})]})})]})},Sm=({label:u,tooltip:o,values:d,onChange:c,className:m,alternatives:p=[],translatePrefix:b})=>{const[C,g]=O.useState(!1),{t:x}=ne(),j=y=>{c(d.filter(D=>D!==y))},h=y=>{c(y)},S=()=>{g(!0)};return s.jsxs(s.Fragment,{children:[s.jsxs("div",{children:[u&&(o?s.jsx(en,{className:"block text-sm font-medium mb-2",label:u,tooltip:o}):s.jsx("label",{className:"block text-sm font-medium mb-2",children:u})),s.jsx("div",{className:W("space-y-2",m),children:s.jsx("div",{className:"overflow-x-auto pb-1",children:s.jsxs(Ir,{axis:"x",values:d,onReorder:h,className:"flex gap-1 min-w-max",children:[d.map((y,D)=>s.jsxs(Pr,{value:y,className:W("flex items-center gap-2 px-3 py-0.5 shrink-0","rounded-full border border-slate-300 dark:border-slate-600","bg-slate-100 dark:bg-slate-700","shadow-sm hover:shadow-md","cursor-grab"),children:[s.jsx("span",{className:"flex items-center justify-center w-5 h-5 text-xs font-medium rounded-full bg-primary text-primary-foreground",children:D+1}),s.jsx("span",{className:"text-sm",children:b?x(b+"."+y):y}),s.jsx("button",{onClick:()=>j(y),className:"ml-1 inline-flex items-center justify-center w-5 h-5 rounded-full text-red-500 hover:bg-red-100 dark:hover:bg-red-900 transition",children:s.jsx(Kt,{className:"w-3.5 h-3.5"})})]},y)),s.jsxs("button",{onClick:S,className:W("flex items-center gap-1 px-3 py-0.5 shrink-0","rounded-full border-2 border-dashed border-slate-300 dark:border-slate-600","text-slate-600 dark:text-slate-200","hover:bg-slate-100 dark:hover:bg-slate-600"),children:[s.jsx(lu,{className:"w-4 h-4"})," ",x("add")]})]})})})]}),s.jsx(ab,{isOpen:C,onClose:()=>g(!1),alternatives:p,selected:d,onChange:y=>{c(y)},translatePrefix:b})]})},_m=({label:u,tooltip:o,values:d,onChange:c,className:m,mode:p="time"})=>{const{t:b}=ne(),C=()=>{p==="time"&&c([...d,[0,0,0]])},g=()=>{p==="range"&&c([...d,[[0,0,0],[23,59,59]]])},x=y=>{c(d.filter((D,L)=>L!==y))},j=y=>String(y).padStart(2,"0"),h=y=>y.length===2?`${j(y[0])}:${j(y[1])}`:`${j(y[0])}:${j(y[1])}:${j(y[2])}`,S=y=>y.split(":").map(D=>parseInt(D));return s.jsxs("div",{children:[u&&(o?s.jsx(en,{className:"block text-sm font-medium mb-2",label:u,tooltip:o}):s.jsx("label",{className:"block text-sm font-medium mb-2",children:u})),s.jsx("div",{className:W("space-y-2",m),children:s.jsxs("div",{className:"overflow-x-auto pb-2 flex flex-row gap-1 scroll-embedded",children:[d.map((y,D)=>s.jsxs("div",{className:W("flex items-center gap-1 px-2 shrink-0","rounded-full border border-slate-300 dark:border-slate-600","bg-slate-100 dark:bg-slate-700","shadow-sm hover:shadow-md"),children:[p==="time"&&s.jsx(de,{type:"time",value:h(y),step:"1",onChange:L=>{const M=L.target.value,Y=S(M),E=[...d];E[D]=Y,c(E)},className:"w-20.5 md:w-18.5",childClassName:"h-6 px-1 bg-slate-200 dark:bg-slate-600 shadow-none translate-y-[-1px]"}),p==="range"&&s.jsx("div",{className:"flex items-center gap-1",children:y.map((L,M)=>s.jsxs(je.Fragment,{children:[M===1&&s.jsx("span",{className:"mx-1 text-slate-500 dark:text-slate-300",children:"~"}),s.jsx(de,{type:"time",value:h(L),step:"1",onChange:Y=>{const E=S(Y.target.value),w=[...d];w[D][M]=E,c(w)},className:"w-18.5",childClassName:"h-6 px-1 bg-slate-200 dark:bg-slate-600 shadow-none translate-y-[-1px]"})]},M))}),s.jsx("button",{onClick:()=>x(D),className:`inline-flex items-center justify-center w-5 h-5\r + rounded-full text-red-500 hover:bg-red-100 dark:hover:bg-red-900 transition`,children:s.jsx(Kt,{className:"w-3.5 h-3.5"})})]},D)),s.jsxs("button",{onClick:p==="time"?C:g,className:W("flex items-center gap-1 px-3 py-0.5 shrink-0","rounded-full border-2 border-dashed border-slate-300 dark:border-slate-600","text-slate-600 dark:text-slate-200","hover:bg-slate-100 dark:hover:bg-slate-600"),children:[s.jsx(lu,{className:"w-4 h-4"})," ",b("add")]})]})})]})},Wr=ax("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function lb({className:u,variant:o,size:d,asChild:c=!1,...m}){const p=c?ep:"button";return s.jsx(p,{"data-slot":"button",className:W(Wr({variant:o,size:d,className:u})),...m})}function nb({className:u,classNames:o,showOutsideDays:d=!0,captionLayout:c="label",buttonVariant:m="ghost",formatters:p,components:b,...C}){const g=Km();return s.jsx(tp,{showOutsideDays:d,className:W("bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,u),captionLayout:c,formatters:{formatMonthDropdown:x=>x.toLocaleString("default",{month:"short"}),...p},classNames:{root:W("w-fit",g.root),months:W("flex gap-4 flex-col md:flex-row relative",g.months),month:W("flex flex-col w-full gap-4",g.month),nav:W("flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between",g.nav),button_previous:W(Wr({variant:m}),"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none",g.button_previous),button_next:W(Wr({variant:m}),"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none",g.button_next),month_caption:W("flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)",g.month_caption),dropdowns:W("w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5",g.dropdowns),dropdown_root:W("relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md",g.dropdown_root),dropdown:W("absolute bg-popover inset-0 opacity-0",g.dropdown),caption_label:W("select-none font-medium",c==="label"?"text-sm":"rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5",g.caption_label),table:"w-full border-collapse",weekdays:W("flex",g.weekdays),weekday:W("text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none",g.weekday),week:W("flex w-full mt-2",g.week),week_number_header:W("select-none w-(--cell-size)",g.week_number_header),week_number:W("text-[0.8rem] select-none text-muted-foreground",g.week_number),day:W("relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none",g.day),range_start:W("rounded-l-md bg-accent",g.range_start),range_middle:W("rounded-none",g.range_middle),range_end:W("rounded-r-md bg-accent",g.range_end),today:W("bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none",g.today),outside:W("text-muted-foreground aria-selected:text-muted-foreground",g.outside),disabled:W("text-muted-foreground opacity-50",g.disabled),hidden:W("invisible",g.hidden),...o},components:{Root:({className:x,rootRef:j,...h})=>s.jsx("div",{"data-slot":"calendar",ref:j,className:W(x),...h}),Chevron:({className:x,orientation:j,...h})=>j==="left"?s.jsx(Um,{className:W("size-4",x),...h}):j==="right"?s.jsx(Rm,{className:W("size-4",x),...h}):s.jsx("div",{}),DayButton:sb,WeekNumber:({children:x,...j})=>s.jsx("td",{...j,children:s.jsx("div",{className:"flex size-(--cell-size) items-center justify-center text-center",children:x})}),...b},...C})}function sb({className:u,day:o,modifiers:d,...c}){const m=Km(),p=O.useRef(null);return O.useEffect(()=>{d.focused&&p.current?.focus()},[d.focused]),s.jsx(lb,{ref:p,variant:"ghost",size:"icon","data-day":o.date.toLocaleDateString(),"data-selected-single":d.selected&&!d.range_start&&!d.range_end&&!d.range_middle,"data-range-start":d.range_start,"data-range-end":d.range_end,"data-range-middle":d.range_middle,className:W("data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70",m.day,u),...c})}const ib=({value:u,onChange:o,className:d,delay:c=500})=>{const[m,p]=O.useState(!1),b=u!=null?new Date(u):null,{t:C}=ne(),g=b?`${b.getFullYear()}-${String(b.getMonth()+1).padStart(2,"0")}-${String(b.getDate()).padStart(2,"0")}`:"0000-00-00",x=b?`${String(b.getHours()).padStart(2,"0")}:${String(b.getMinutes()).padStart(2,"0")}:${String(b.getSeconds()).padStart(2,"0")}`:"00:00:00",[j,h]=O.useState(x);O.useEffect(()=>{b&&h(`${String(b.getHours()).padStart(2,"0")}:${String(b.getMinutes()).padStart(2,"0")}:${String(b.getSeconds()).padStart(2,"0")}`)},[u]);const S=O.useRef(null),y=O.useCallback(L=>{if(!L){o(null);return}const M=b??new Date;M.setFullYear(L.getFullYear(),L.getMonth(),L.getDate()),O.startTransition(()=>{o(M.getTime()),p(!1)}),Dt(C("toast.dateUpdated"),{description:M.toLocaleString()})},[b,o,C]),D=O.useCallback(L=>{const M=L.target.value;h(M),S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{const[Y,E,w]=M.split(":").map(Z=>parseInt(Z,10)),R=b??new Date;R.setHours(Y||0,E||0,w||0),O.startTransition(()=>{o(R.getTime())}),Dt.success(C("toast.timeUpdated"),{description:R.toLocaleString()})},c)},[b,c,o,C]);return s.jsxs("div",{className:W("flex bg-transparent border px-4 rounded-lg py-0 w-fit h-8",d),children:[s.jsxs(nu,{open:m,onOpenChange:p,children:[s.jsx(su,{asChild:!0,children:s.jsx(de,{value:g,className:"justify-between font-mono !p-0",childClassName:"border-none !p-0 !bg-transparent shadow-none h-8"})}),s.jsx(iu,{className:"w-auto overflow-hidden p-0",align:"start",children:s.jsx(nb,{mode:"single",selected:b??void 0,captionLayout:"label",onSelect:y})})]}),s.jsx("span",{className:"mx-1 h-8",children:"."}),s.jsx(de,{type:"time",step:"1",value:j,onChange:D,className:"font-mono h-8",childClassName:`h-8\r + border-none !p-0 !bg-transparent shadow-none\r + focus:outline-none focus-visible:outline-none\r + focus-visible:!ring-0 focus-visible:!ring-offset-0\r + focus-visible:!border-current\r + focus-visible:[--tw-ring-color:transparent]\r + focus-visible:[--tw-ring-shadow:0_0_#0000]\r + focus-visible:[--tw-ring-offset-shadow:0_0_#0000]\r + `})]})},Fr=O.memo(ib),cb=({task:u,onClose:o,onSave:d,allTasks:c})=>{const{t:m}=ne(),[p,b]=O.useState({...u}),C=(x,j)=>{b(h=>({...h,[x]:j}))},g=()=>{d(p)};return s.jsx(ru,{isOpen:!0,onClose:o,title:m("scheduler.detailConfig"),width:80,children:s.jsxs("div",{className:"space-y-2",children:[s.jsx(de,{label:m("scheduler.eventName"),value:p.event_name,disabled:!0}),s.jsx("label",{className:"block text-sm font-medium",children:m("scheduler.nextTick")}),s.jsx(Fr,{value:u.next_tick*1e3,onChange:x=>C("next_tick",Math.floor(x/1e3)),className:"w-full justify-center flex xl:hidden"}),s.jsxs("div",{className:"grid grid-cols-1 gap-y-2 lg:grid-cols-2 gap-2",children:[s.jsx(de,{label:m("scheduler.priority"),type:"number",value:p.priority??0,onChange:x=>C("priority",Number(x.target.value))}),s.jsx(de,{label:m("scheduler.interval"),type:"number",value:p.interval??0,onChange:x=>C("interval",Number(x.target.value)),min:0}),s.jsx(_m,{label:m("scheduler.dailyReset"),values:p.daily_reset??[],onChange:x=>{C("daily_reset",x)},mode:"time"}),s.jsx(_m,{label:m("scheduler.disabledRange"),values:p.disabled_time_range??[],onChange:x=>{C("disabled_time_range",x)},mode:"range"}),s.jsx(Sm,{label:m("scheduler.preTask"),values:p.pre_task??[],onChange:x=>{b(j=>({...j,pre_task:x}))},alternatives:c,translatePrefix:"eventName"}),s.jsx(Sm,{label:m("scheduler.postTask"),values:p.post_task??[],onChange:x=>{b(j=>({...j,post_task:x}))},alternatives:c,translatePrefix:"eventName"})]}),s.jsx(Gt,{}),s.jsx("div",{className:"flex justify-end gap-2 pt-1",children:s.jsx(Ae,{onClick:g,children:m("common.confirm")})})]})})},Fn=({text:u,tooltip:o,className:d})=>s.jsx(ih,{children:s.jsxs(ch,{children:[s.jsx(rh,{asChild:!0,children:s.jsx("div",{className:`overflow-hidden whitespace-nowrap text-ellipsis cursor-default ${d??""}`,children:u})}),s.jsx(uh,{children:s.jsx("p",{children:o||u})})]})}),rb=[],Nm=je.memo(function({task:o,side:d,onMove:c,onEdit:m,onChangeTime:p,t:b}){return s.jsx("div",{className:"flex items-center justify-between bg-slate-50 dark:bg-slate-700 p-2 rounded-md gap-2 min-w-0 overflow-x-hidden",children:d==="left"?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"flex flex-grow min-w-0 overflow-hidden text-ellipsis text-left mr-2",children:s.jsx(Fn,{text:b("eventName."+o.func_name)})}),s.jsx(Fr,{value:o.next_tick*1e3,onChange:C=>p(o,C),className:"hidden xl:flex"}),s.jsx(Ae,{onClick:()=>m(o),className:"rounded-[50%] w-8 h-8",children:s.jsx(Vr,{className:"w-4 h-4 translate-x-[-8px]"})}),s.jsx(Gt,{orientation:"vertical",className:"!h-8"}),s.jsxs(Ae,{onClick:()=>c(o,!0),className:"rounded-[50%] w-8 h-8",children:[s.jsx(Bm,{className:"w-4 h-4 translate-x-[-8px] max-md:hidden"}),s.jsx(qm,{className:"w-4 h-4 translate-x-[-8px] md:hidden"})]})]}):s.jsxs(s.Fragment,{children:[s.jsxs(Ae,{onClick:()=>c(o,!1),className:"rounded-[50%] w-8 h-8",children:[s.jsx(Lm,{className:"w-4 h-4 translate-x-[-8px] max-md:hidden"}),s.jsx(Gm,{className:"w-4 h-4 translate-x-[-8px] md:hidden"})]}),s.jsx(Gt,{orientation:"vertical",className:"!h-8"}),s.jsx(Ae,{onClick:()=>m(o),className:"rounded-[50%] w-8 h-8",children:s.jsx(Vr,{className:"w-4 h-4 translate-x-[-8px]"})}),s.jsx(Fr,{value:o.next_tick*1e3,onChange:C=>p(o,C),className:"hidden xl:flex"}),s.jsx("div",{className:"flex flex-grow min-w-0 overflow-hidden text-ellipsis text-right mr-2 justify-end",children:s.jsx(Fn,{text:b("eventName."+o.func_name)})})]})})}),ub=({profileId:u})=>{const{t:o}=ne(),{profiles:d,activeProfile:c}=Ja(),m=u??c?.id,p=O.useMemo(()=>d.find(K=>K.id===m)??c??null,[d,m,c]),[b,C]=O.useState(""),[g,x]=O.useState("default"),[j,h]=O.useState(null),S=V(K=>K.statusStore[u]?.current_task),y=V(K=>K.statusStore[u]?.waiting_tasks),D=V(K=>K.eventStore[u]??rb),L=V(K=>K.modify),M=O.useMemo(()=>{let K=D.filter(G=>G.event_name.includes(b));return g==="default"?K=[...K].sort((G,ee)=>G.priority-ee.priority):g==="time"&&(K=[...K].sort((G,ee)=>new Date(ee.next_tick).getTime()-new Date(G.next_tick).getTime())),K},[D,b,g]),Y=M.filter(K=>!K.enabled),E=M.filter(K=>K.enabled),w=O.useCallback(K=>{L(`${u}::event`,K)},[]),R=O.useCallback((K,G)=>{O.startTransition(()=>{w(D.map(ee=>ee.func_name===K.func_name?{...ee,enabled:G}:ee))})},[D,w]),Z=O.useCallback((K,G)=>{w(D.map(ee=>ee.func_name===K.func_name?{...ee,next_tick:Math.floor(G/1e3)}:ee))},[D,w]),I=O.useCallback(K=>{h(K)},[]),fe=K=>{O.startTransition(()=>{w(D.map(G=>({...G,enabled:K})))})},Ce=()=>{const K=new Date().getTime();O.startTransition(()=>{w(D.map(G=>({...G,next_tick:Math.floor(K/1e3)})))})},Ve=K=>{O.startTransition(()=>{w(D.map(G=>G.func_name===K.func_name?K:G)),h(null)})};return s.jsxs("div",{className:"h-full flex flex-col gap-4 min-h-0",children:[s.jsxs("div",{className:"flex",children:[s.jsx("h2",{className:"text-2xl font-bold text-slate-800 dark:text-slate-100",children:o("scheduler")}),s.jsxs("h2",{className:"text-2xl ml-3 text-slate-500 dark:text-slate-400",children:["#",p?.name]})]}),s.jsx("div",{className:"grid grid-cols-1 gap-2",children:s.jsxs(kt,{children:[s.jsx(Xa,{children:s.jsxs(Za,{className:"flex items-center",children:[s.jsx(Kr,{className:"w-5 h-5 mr-2 text-primary-500"}),o("taskOverview")]})}),s.jsx(ma,{children:s.jsxs("div",{className:"space-y-1",children:[s.jsx("div",{className:"border-dashed border-b-2 pb-1",children:S?s.jsx("div",{className:"px-3 py-2 bg-primary-100 dark:bg-primary-800 rounded-md",children:s.jsxs("span",{className:"text-primary-700 dark:text-primary-300 font-semibold",children:[o("runningTask"),": ",o(S)]})}):s.jsx("p",{className:"text-slate-500 dark:text-slate-400",children:o("noTaskRunning")})}),y&&y.length>0?s.jsx("ul",{className:"space-y-0 h-35 overflow-auto pr-2 gap-2 flex flex-col",children:y.map((K,G)=>s.jsx("div",{className:"px-3 py-2 bg-slate-100 dark:bg-slate-800 rounded-md",children:s.jsx("span",{className:"text-slate-700 dark:text-slate-300",children:K})},G))}):s.jsx("p",{className:"h-35 max-h-35 text-slate-500 dark:text-slate-400",children:o("noTasksQueued")})]})})]})}),s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s.jsx(Ym,{size:20}),s.jsx("div",{className:"flex-1 bg-white dark:bg-slate-800 rounded-md shadow-sm",children:s.jsx(de,{placeholder:o("scheduler.search"),value:b,onChange:K=>C(K.target.value),className:"w-full"})}),s.jsx("div",{className:"bg-white dark:bg-slate-800 rounded-md shadow-sm",children:s.jsx(Oe,{onChange:K=>x(K),value:g,options:[{label:o("scheduler.sortDefault"),value:"default"},{label:o("scheduler.sortByTime"),value:"time"}]})}),s.jsx(Ae,{variant:"primary",onClick:Ce,className:"mr-2 rounded-[50%] w-8 h-8",children:s.jsx(lx,{className:"w-4 h-4 translate-x-[-8px]"})})]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 flex-1 md:min-h-40",children:[s.jsx(kt,{className:"flex flex-col min-h-0",children:s.jsxs(ma,{className:"pr-1 sm:pr-4 flex flex-col flex-1 min-h-0",children:[s.jsxs("div",{className:"flex justify-between mb-2",children:[s.jsxs("div",{className:"flex items-center",children:[s.jsx(nx,{className:"w-5 h-5 mr-2 text-red-500"}),s.jsx("span",{className:"font-medium",children:o("scheduler.inactiveTasks")})]}),s.jsxs(Ae,{variant:"primary",onClick:()=>fe(!0),className:"rounded-[50%] w-8 h-8 mr-4.5",children:[s.jsx(Bm,{className:"w-4 h-4 translate-x-[-8px] max-md:hidden"}),s.jsx(qm,{className:"w-4 h-4 translate-x-[-8px] md:hidden"})]})]}),s.jsx("div",{className:"flex-1 min-h-0 overflow-auto space-y-2 scroll-embedded pr-1 max-md:max-h-40",children:Y.map(K=>s.jsx(Nm,{task:K,side:"left",onMove:R,onEdit:I,onChangeTime:Z,t:o},K.func_name))})]})}),s.jsx(kt,{className:"flex flex-col min-h-0",children:s.jsxs(ma,{className:"flex flex-col flex-1 min-h-0",children:[s.jsxs("div",{className:"flex justify-between mb-2",children:[s.jsxs(Ae,{variant:"primary",onClick:()=>fe(!1),className:"rounded-[50%] w-8 h-8 ml-2",children:[s.jsx(Lm,{className:"w-4 h-4 translate-x-[-8px] max-md:hidden"}),s.jsx(Gm,{className:"w-4 h-4 translate-x-[-8px] md:hidden"})]}),s.jsxs("div",{className:"flex items-center",children:[s.jsx("span",{className:"font-medium",children:o("scheduler.activeTasks")}),s.jsx(eu,{className:"w-5 h-5 ml-2 text-green-500"})]})]}),s.jsx("div",{className:"flex-1 min-h-0 overflow-auto space-y-2 scroll-embedded pr-1 max-md:max-h-40",children:E.map(K=>s.jsx(Nm,{task:K,side:"right",onMove:R,onEdit:I,onChangeTime:Z,t:o},K.func_name))})]})})]}),j&&s.jsx(cb,{task:j,onClose:()=>h(null),onSave:Ve,allTasks:D.filter(K=>K.func_name!=j.func_name).map(K=>K.func_name)})]})},In=({isOpen:u,onClose:o,allStudents:d,selected:c,onChange:m,lang:p="JP"})=>{const{t:b}=ne(),[C,g]=O.useState(""),x=S=>p==="CN"?S.CN_name:p==="Global"?S.Global_name:S.JP_name,j=O.useMemo(()=>d.filter(S=>typeof S=="string"?S.toLowerCase().includes(C.toLowerCase()):x(S).toLowerCase().includes(C.toLowerCase())),[C,d,p]),h=S=>{c.includes(S)?m(c.filter(y=>y!==S)):m([...c,S])};return s.jsxs(Zm,{open:u,onClose:o,className:"relative z-50",children:[s.jsx("div",{className:"fixed inset-0 bg-black/30","aria-hidden":"true"}),s.jsx("div",{className:"fixed inset-0 flex items-center justify-center",children:s.jsxs(Vm,{className:"w-full max-w-3xl rounded-lg bg-white dark:bg-slate-800 p-6 shadow-lg",children:[s.jsxs("div",{className:"flex justify-between items-center mb-4",children:[s.jsx(Jm,{className:"text-lg font-semibold",children:b("artifact.selectStudent")}),s.jsx("button",{onClick:o,children:s.jsx(Kt,{className:"w-5 h-5 text-slate-500"})})]}),s.jsx("input",{type:"text",placeholder:b("student.search"),value:C,onChange:S=>g(S.target.value),className:"w-full mb-4 px-3 py-2 border rounded-md focus:ring-primary-500 focus:border-primary-500"}),s.jsx("div",{className:"flex flex-wrap gap-2 max-h-96 overflow-y-auto",children:j.map(S=>{const y=typeof S=="string"?S:x(S),D=c.includes(y);return s.jsx("button",{onClick:()=>h(y),className:`px-3 py-1 rounded-full text-sm border transition ${D?"bg-primary-600 text-white border-primary-600":"bg-slate-100 dark:bg-slate-700 border-slate-300"}`,children:y},y)})})]})})]})};function Pn({className:u,...o}){return s.jsx(ap,{"data-slot":"tabs",className:W("flex flex-col gap-2",u),...o})}function es({className:u,...o}){return s.jsx(lp,{"data-slot":"tabs-list",className:W("bg-muted text-muted-foreground dark:bg-slate-800 dark:text-white inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",u),...o})}function Lt({className:u,...o}){return s.jsx(np,{"data-slot":"tabs-trigger",className:W("data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",u),...o})}function Jt({className:u,...o}){return s.jsx(sp,{"data-slot":"tabs-content",className:W("flex-1 outline-none",u),...o})}const ob=(u,o,d)=>Math.max(o,Math.min(d,u)),db=({onClose:u,profileId:o})=>{const c=V(w=>w.staticStore).student_names,{t:m}=ne(),p=V(w=>w.configStore[o]),b=V(w=>w.modify),C=O.useMemo(()=>({cafe_reward_collect_hour_reward:p.cafe_reward_collect_hour_reward??!1,cafe_reward_use_invitation_ticket:p.cafe_reward_use_invitation_ticket??!0,cafe_reward_allow_exchange_student:p.cafe_reward_allow_exchange_student??!0,cafe_reward_allow_duplicate_invite:p.cafe_reward_allow_duplicate_invite??!1,cafe_reward_has_no2_cafe:p.cafe_reward_has_no2_cafe??!1,cafe_reward_affection_pat_round:p.cafe_reward_affection_pat_round??5,patStyle:p.patStyle??"普通",cafe_reward_invite1_criterion:p.cafe_reward_invite1_criterion??"lowest_affection",cafe_reward_invite2_criterion:p.cafe_reward_invite2_criterion??"lowest_affection",cafe_reward_invite1_starred_student_position:String(p.cafe_reward_invite1_starred_student_position??"1"),cafe_reward_invite2_starred_student_position:String(p.cafe_reward_invite2_starred_student_position??"1"),favorStudent1:p.favorStudent1??[],favorStudent2:p.favorStudent2??[]}),[p]),[g,x]=O.useState(C),[j,h]=O.useState(!1),[S,y]=O.useState(!1);O.useEffect(()=>x(C),[C]);const D=JSON.stringify(g)!==JSON.stringify(C),L=w=>R=>x(Z=>({...Z,[w]:R})),M=w=>{const R=w.target.value;if(R==="")return x(I=>({...I,cafe_reward_affection_pat_round:""}));const Z=Number(R);Number.isFinite(Z)&&x(I=>({...I,cafe_reward_affection_pat_round:ob(Math.trunc(Z),4,15)}))},Y=w=>R=>{x(Z=>({...Z,[w]:R}))},E=async()=>{const w={};if(Object.keys(g).forEach(R=>{g[R]!==C[R]&&(w[R]=g[R])}),Object.keys(w).length===0){u();return}b(`${o}::config`,w),u()};return s.jsxs("div",{className:"space-y-2",children:[s.jsxs(Pn,{defaultValue:"basic",className:"w-full",children:[s.jsxs(es,{className:"grid grid-cols-3 w-full",children:[s.jsx(Lt,{value:"basic",children:m("cafe.basicSettings")}),s.jsx(Lt,{value:"cafe1",children:m("cafe.cafe1Settings")}),g.cafe_reward_has_no2_cafe&&s.jsx(Lt,{value:"cafe2",children:m("cafe.cafe2Settings")})]}),s.jsxs(Jt,{value:"basic",className:"space-y-6",children:[s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-2",children:[["cafe_reward_collect_hour_reward","cafe.collectReward"],["cafe_reward_use_invitation_ticket","cafe.useInvitation"],["cafe_reward_allow_exchange_student","cafe.exchangeStudent"],["cafe_reward_allow_duplicate_invite","cafe.duplicateInvite"],["cafe_reward_has_no2_cafe","cafe.hasNo2Cafe"]].map(([w,R])=>s.jsx(nt,{label:m(R),checked:g[w],onChange:L(w)},R))}),s.jsx(Gt,{}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-2",children:[s.jsx(de,{label:m("cafe.patRounds"),tooltip:m("cafe.patRoundsDesc"),type:"number",value:g.cafe_reward_affection_pat_round,onChange:M,min:4,max:15}),s.jsx(Oe,{label:m("cafe.patStyle"),value:g.patStyle,onChange:Y("pat_style"),options:[{value:"拖动礼物",label:m("cafe.patStyleDragGift")}]})]})]}),s.jsxs(Jt,{value:"cafe1",className:"space-y-6 pt-4",children:[s.jsx(Oe,{label:m("cafe.invite1Mode"),value:g.cafe_reward_invite1_criterion,onChange:Y("cafe_reward_invite1_criterion"),options:[{value:"lowest_affection",label:m("cafe.lowestAffection")},{value:"highest_affection",label:m("cafe.highestAffection")},{value:"starred",label:m("cafe.starred")},{value:"name",label:m("cafe.byName")}]}),g.cafe_reward_invite1_criterion==="starred"&&s.jsx(Oe,{label:m("cafe.starredPosition"),value:g.cafe_reward_invite1_starred_student_position,onChange:Y("cafe_invite1_starred_position"),options:[1,2,3,4,5].map(w=>({value:String(w),label:String(w)}))}),g.cafe_reward_invite1_criterion==="name"&&s.jsxs("div",{className:"space-y-2",children:[s.jsx("label",{className:"block text-sm font-medium",children:m("cafe.cafe1Students")}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[g.favorStudent1.map(w=>s.jsxs("span",{className:"flex items-center gap-1 px-2 py-1 bg-slate-200 rounded-full text-sm dark:bg-slate-700",children:[w,s.jsx("button",{onClick:()=>x(R=>({...R,favorStudent1:R.favorStudent1.filter(Z=>Z!==w)})),children:s.jsx(Kt,{className:"w-3 h-3"})})]},w)),s.jsx("button",{onClick:()=>h(!0),className:"px-3 py-1 text-sm border rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 transition",children:m("Add Student")})]})]})]}),g.cafe_reward_has_no2_cafe&&s.jsxs(Jt,{value:"cafe2",className:"space-y-6 pt-4",children:[s.jsx(Oe,{label:m("cafe.invite2Mode"),value:g.cafe_reward_invite2_criterion,onChange:Y("cafe_reward_invite2_criterion"),options:[{value:"lowest_affection",label:m("cafe.lowestAffection")},{value:"highest_affection",label:m("cafe.highestAffection")},{value:"starred",label:m("cafe.starred")},{value:"name",label:m("cafe.byName")}]}),g.cafe_reward_invite2_criterion==="starred"&&s.jsx(Oe,{label:m("cafe.starredPosition"),value:g.cafe_reward_invite2_starred_student_position,onChange:Y("cafe_invite2_starred_position"),options:[1,2,3,4,5].map(w=>({value:String(w),label:String(w)}))}),g.cafe_reward_invite2_criterion==="name"&&s.jsxs("div",{className:"space-y-2",children:[s.jsx("label",{className:"block text-sm font-medium",children:m("cafe.cafe2Students")}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[g.favorStudent2.map(w=>s.jsxs("span",{className:"flex items-center gap-1 px-2 py-1 bg-slate-200 rounded-full text-sm dark:bg-slate-700",children:[w,s.jsx("button",{onClick:()=>x(R=>({...R,favorStudent2:R.favorStudent2.filter(Z=>Z!==w)})),children:s.jsx(Kt,{className:"w-3 h-3"})})]},w)),s.jsx("button",{onClick:()=>y(!0),className:"px-3 py-1 text-sm border rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 transition",children:m("Add Student")})]})]})]})]}),s.jsx(In,{isOpen:j,onClose:()=>h(!1),allStudents:c,selected:g.favorStudent1,onChange:w=>x(R=>({...R,favorStudent1:w})),lang:Va[p.server]}),s.jsx(In,{isOpen:S,onClose:()=>y(!1),allStudents:c,selected:g.favorStudent2,onChange:w=>x(R=>({...R,favorStudent2:w})),lang:Va[p.server]}),s.jsx(Gt,{}),s.jsx("div",{className:"flex justify-end pt-4",children:s.jsx("button",{onClick:E,disabled:!D||g.cafe_reward_affection_pat_round==="",className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:m("save")})})]})},fb=({onSelect:u})=>{const{t:o}=ne(),[d,c]=O.useState(!1),[m,p]=O.useState(!1),[b,C]=O.useState([]),g=V(j=>j.trigger),x=async()=>{p(!0),g({timestamp:qt(),command:"detect_adb",payload:{}},j=>{console.log("detect_adb",j.data.addresses);const h=j.data.addresses;!h||h.length===0?C([]):C(h),p(!1)})};return s.jsxs(s.Fragment,{children:[s.jsx(Ae,{variant:"primary",onClick:()=>c(!0),style:{borderRadius:"50%",padding:"8px",width:"36px",height:"36px"},children:s.jsx(gm,{size:20})}),s.jsx(ru,{isOpen:d,onClose:()=>c(!1),title:o("adb.title"),width:40,children:s.jsxs("div",{className:"space-y-2",children:[s.jsx(Ae,{onClick:x,disabled:m,className:"w-full",children:m?s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}),o("adb.detecting")]}):s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(gm,{className:"mr-2 h-4 w-4"}),o("adb.detectBtn")]})}),s.jsxs("div",{className:"space-y-2 max-h-60 overflow-y-auto",children:[b.map(j=>s.jsx(kt,{className:"p-2 cursor-pointer hover:bg-slate-100 dark:hover:bg-slate-700",onClick:()=>{u?.(j),c(!1)},children:j},j)),b.length===0&&!m&&s.jsx("p",{className:"text-sm text-slate-500",children:o("adb.noData")||"No results found"})]})]})})]})},mb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(S=>S.configStore[u]),m=V(S=>S.modify),p=je.useMemo(()=>({server:c.server,adbIP:c.adbIP,adbPort:c.adbPort}),[c]),[b,C]=je.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=S=>y=>{C(D=>({...D,[S]:y}))},j=async()=>{const S={};if(Object.keys(b).forEach(y=>{JSON.stringify(b[y])!==JSON.stringify(p[y])&&(S[y]=b[y])}),Object.keys(S).length===0){o();return}m(`${u}::config`,S),o()},h=S=>{const{name:y,value:D}=S.target;C(L=>({...L,[y]:D}))};return s.jsxs("div",{className:"space-y-2",children:[s.jsx(Oe,{label:d("server.server"),value:b.server,disabled:!0,onChange:x("server"),options:[{label:d("server.cn.official"),value:"官服"},{label:d("server.cn.bilibili"),value:"B服"},{label:d("server.global"),value:"国际服"},{label:d("server.global.teen"),value:"国际服青少年"},{label:d("server.kr.one"),value:"韩国ONE"},{label:d("server.jp"),value:"日服"}]}),s.jsx(de,{id:"adbIP",name:"adbIP",type:"text",label:d("server.adbIP"),value:b.adbIP,onChange:h,className:"w-full",placeholder:"127.0.0.1"}),s.jsxs("div",{className:"flex items-end justify-end gap-2",children:[s.jsx(de,{id:"adbPort",name:"adbPort",label:d("server.adbPort"),type:"number",value:b.adbPort,onChange:h,className:"flex-1",min:0,max:65535}),s.jsx(fb,{onSelect:S=>{C(y=>{const[D,L]=S.split(":");return{...y,adbIP:D,adbPort:L}})}})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:j,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},yi=["primary","normal","advanced","superior"],hb=({onClose:u,profileId:o})=>{const{t:d}=ne(),c=V(E=>E.configStore[o]),m=V(E=>E.modify),p=V(E=>E.staticStore),b=p.lesson_region_name[Cp[c.server]],C=p.student_names,[g,x]=O.useState(!1),j=O.useMemo(()=>{let E;if(!c.lesson_each_region_object_priority)E=b.map(()=>[...yi]);else if(c.lesson_each_region_object_priority.lengthyi);E=[...c.lesson_each_region_object_priority,...R]}else c.lesson_each_region_object_priority.length>b.length?E=c.lesson_each_region_object_priority.slice(0,b.length):E=c.lesson_each_region_object_priority;let w;if(!c.lesson_times)w=b.map(()=>1);else if(c.lesson_times.length1);w=[...c.lesson_times,...R]}else c.lesson_times.length>b.length?w=c.lesson_times.slice(0,b.length):w=c.lesson_times;return{lesson_enableInviteFavorStudent:c.lesson_enableInviteFavorStudent??!1,lesson_favorStudent:c.lesson_favorStudent??[],lesson_relationship_first:c.lesson_relationship_first??!1,lesson_each_region_object_priority:E,lesson_times:w}},[c]),[h,S]=O.useState(j);O.useEffect(()=>{S(E=>JSON.stringify(E)!==JSON.stringify(j)?j:E)},[j]);const y=JSON.stringify(h)!==JSON.stringify(j),D=async()=>{const E={};if(Object.keys(h).forEach(w=>{JSON.stringify(h[w])!==JSON.stringify(j[w])&&(E[w]=h[w])}),Object.keys(E).length===0){u();return}m(`${o}::config`,E),u()},L=E=>{S(w=>({...w,lesson_favorStudent:w.lesson_favorStudent.filter(R=>R!==E)}))},M=(E,w)=>{S(R=>{const Z=R.lesson_each_region_object_priority.map(I=>[...I]);return Z[E].includes(w)?Z[E]=Z[E].filter(I=>I!==w):Z[E].push(w),{...R,lesson_each_region_object_priority:Z}})},Y=(E,w)=>{const R=Number(w);Number.isFinite(R)&&S(Z=>{const I=[...Z.lesson_times];return I[E]=R,{...Z,lesson_times:I}})};return s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-2",children:[s.jsx(nt,{checked:h.lesson_enableInviteFavorStudent,label:d("lesson.enableFavorStudent"),onChange:E=>S(w=>({...w,lesson_enableInviteFavorStudent:E}))}),s.jsx(nt,{checked:h.lesson_relationship_first,label:d("lesson.relationshipFirst"),onChange:E=>S(w=>({...w,lesson_relationship_first:E}))})]}),h.lesson_enableInviteFavorStudent&&s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium mb-2 text-slate-700 dark:text-slate-200",children:d("lesson.favorStudent")}),s.jsx("div",{className:"overflow-x-auto pb-1 scroll-embedded",children:s.jsxs(Ir,{axis:"x",values:h.lesson_favorStudent,onReorder:E=>S(w=>({...w,lesson_favorStudent:E})),className:"flex gap-1 min-w-max",children:[h.lesson_favorStudent.map((E,w)=>s.jsxs(Pr,{value:E,className:`\r + flex items-center gap-2 px-3 py-0.5 shrink-0\r + rounded-full border border-slate-300 dark:border-slate-600\r + bg-slate-100 dark:bg-slate-700\r + shadow-sm hover:shadow-md\r + cursor-grab\r + `,children:[s.jsx("span",{className:"flex items-center justify-center w-5 h-5 text-xs font-medium rounded-full bg-primary text-primary-foreground",children:w+1}),s.jsx("span",{className:"text-sm",children:E}),s.jsx("button",{onClick:()=>L(E),className:"ml-1 inline-flex items-center justify-center w-5 h-5 rounded-full text-red-500 hover:bg-red-100 dark:hover:bg-red-900 transition",children:s.jsx(Kt,{className:"w-3.5 h-3.5"})})]},E)),s.jsxs("button",{onClick:()=>x(!0),className:`\r + flex items-center gap-1 px-3 py-0.5 shrink-0\r + rounded-full border-2 border-dashed border-slate-300 dark:border-slate-600\r + text-slate-600 dark:text-slate-200\r + hover:bg-slate-100 dark:hover:bg-slate-600\r + `,children:[s.jsx(lu,{className:"w-4 h-4"})," ",d("add")]})]})})]}),s.jsx(Gt,{}),s.jsx("div",{className:"overflow-y-auto overflow-x-auto border rounded-md",style:{maxHeight:"calc(100vh - 320px)",minHeight:"80px"},children:s.jsxs("table",{className:"min-w-full text-sm",children:[s.jsx("thead",{className:"sticky top-0 bg-slate-100 dark:bg-slate-700 z-10",children:s.jsxs("tr",{children:[s.jsx("th",{className:"px-2 py-1 border text-left",children:d("lesson.region")}),yi.map(E=>s.jsx("th",{className:"px-2 py-1 border",children:d(`schedule.${E}`)},E)),s.jsx("th",{className:"px-2 py-1 border",children:d("lesson.times")})]})}),s.jsx("tbody",{children:b.map((E,w)=>s.jsxs("tr",{children:[s.jsx("td",{className:"px-2 py-1 border",children:E}),yi.map((R,Z)=>s.jsx("td",{className:"px-2 py-1 border text-center",children:s.jsxs("label",{className:"relative inline-flex items-center cursor-pointer mt-1",children:[s.jsx("input",{type:"checkbox",checked:h.lesson_each_region_object_priority[w].includes(R),onChange:()=>M(w,R),className:`\r + peer w-6 h-6 cursor-pointer\r + appearance-none\r + rounded-full border\r + border-slate-500 dark:border-slate-400\r + bg-slate-100 dark:bg-slate-700\r + checked:bg-primary-400 checked:border-slate-500\r + dark:checked:bg-primary-600 dark:checked:border-slate-400\r + checked:text-primary-foreground\r + focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\r + disabled:cursor-not-allowed disabled:opacity-50\r + `}),s.jsx(Dm,{className:`\r + pointer-events-none absolute left-0.5 top-0.5 h-5 w-5 text-white\r + opacity-0 peer-checked:opacity-100 transition-opacity\r + `})]})},Z)),s.jsx("td",{className:"px-2 py-1 border ",children:s.jsx(de,{type:"number",value:h.lesson_times[w],onChange:R=>Y(w,R.target.value),min:0,max:99,className:"w-20 px-1 m-auto"})})]},w))})]})}),s.jsx(In,{isOpen:g,onClose:()=>x(!1),allStudents:C,selected:h.lesson_favorStudent,onChange:E=>S(w=>({...w,lesson_favorStudent:E})),lang:Va[c.server]}),s.jsx("div",{className:"flex justify-end pt-4 border-t",children:s.jsx("button",{onClick:D,disabled:!y,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},gb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(w=>w.staticStore),m=V(w=>w.configStore[u]),p=V(w=>w.modify),b=Va[m.server],C=c.common_shop_price_list[b],g=c.tactical_challenge_shop_price_list[b],x={common:{title:d("commonShop.title"),listKey:"CommonShopList",refreshKey:"CommonShopRefreshTime",defaultGoods:C},tactical:{title:d("tacticalShop.title"),listKey:"TacticalChallengeShopList",refreshKey:"TacticalChallengeShopRefreshTime",defaultGoods:g}},[j,h]=O.useState("common"),S=O.useMemo(()=>({CommonShopList:m.CommonShopList||Array(x.common.defaultGoods.length).fill(0),CommonShopRefreshTime:m.CommonShopRefreshTime??0,TacticalChallengeShopList:m.TacticalChallengeShopList||Array(x.tactical.defaultGoods.length).fill(0),TacticalChallengeShopRefreshTime:m.TacticalChallengeShopRefreshTime??0}),[m]),[y,D]=O.useState(S);O.useEffect(()=>{D(S)},[S]);const L=JSON.stringify(y)!==JSON.stringify(S),M=(w,R)=>{D(Z=>{const I=w==="common"?[...Z.CommonShopList]:[...Z.TacticalChallengeShopList];return I[R]=I[R]===1?0:1,w==="common"?{...Z,CommonShopList:I}:{...Z,TacticalChallengeShopList:I}})},Y=(w,R)=>{const Z=R.target.value;if(Z===""){D(fe=>w==="common"?{...fe,CommonShopRefreshTime:""}:{...fe,TacticalChallengeShopRefreshTime:""});return}const I=Number(Z);Number.isFinite(I)&&D(fe=>w==="common"?{...fe,CommonShopRefreshTime:Math.max(0,Math.min(I,5))}:{...fe,TacticalChallengeShopRefreshTime:Math.max(0,Math.min(I,5))})},E=async()=>{if(!L){o();return}const w={};Object.keys(y).forEach(R=>{y[R]!==S[R]&&(w[R]=y[R])}),p(`${u}::config`,w),o()};return s.jsxs("div",{className:"space-y-6",children:[s.jsxs(Pn,{defaultValue:"common",value:j,onValueChange:w=>h(w),children:[s.jsxs(es,{className:"grid grid-cols-2 w-full",children:[s.jsx(Lt,{value:"common",children:x.common.title}),s.jsx(Lt,{value:"tactical",children:x.tactical.title})]}),["common","tactical"].map(w=>{const R=x[w];return s.jsxs(Jt,{value:w,className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center justify-between p-4 bg-slate-50 dark:bg-slate-700/50 rounded-lg",children:[s.jsxs("div",{children:[s.jsx("label",{className:"text-slate-700 dark:text-slate-200 font-medium",children:d("commonShop.refreshTimes")}),s.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:d("commonShop.refreshDesc")})]}),s.jsx(de,{type:"number",min:0,max:5,value:w==="common"?y.CommonShopRefreshTime:y.TacticalChallengeShopRefreshTime,onChange:Z=>Y(w,Z),className:"w-20"})]}),s.jsx("div",{className:"max-h-[40vh] overflow-y-auto pr-1 grid grid-cols-2 gap-1",children:R.defaultGoods.map(([Z,I,fe],Ce)=>{const Ve=(w==="common"?y.CommonShopList:y.TacticalChallengeShopList)[Ce]===1,K=fe==="creditpoints"?`${I} ${d("creditpoints")}`:`${I} ${d("pyroxene")}`;return s.jsx("div",{className:`${Ve?"bg-primary-600 text-white hover:bg-primary-700":"bg-slate-200 text-slate-800 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600"} p-2 rounded-lg cursor-pointer`,onClick:()=>M(w,Ce),children:s.jsxs("div",{children:[s.jsx(Fn,{text:Z}),s.jsx("div",{className:`text-sm ${Ve?"text-slate-200":"text-slate-500 dark:text-slate-400"}`,children:K})]})},`${Z}-${Ce}`)})})]},w)})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:E,disabled:!L,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 disabled:opacity-60",children:d("save")})})]})},xb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(S=>S.configStore[u]),m=V(S=>S.modify),p=O.useMemo(()=>({ArenaLevelDiff:c.ArenaLevelDiff,ArenaComponentNumber:c.ArenaComponentNumber,maxArenaRefreshTimes:c.maxArenaRefreshTimes}),[c]),[b,C]=O.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=S=>y=>{const D=parseInt(y,10);isNaN(D)||C(L=>({...L,[S]:D}))},j=S=>{const{name:y,value:D}=S.target,L=parseInt(D,10);isNaN(L)||C(M=>({...M,[y]:L}))},h=async()=>{const S={};if(Object.keys(b).forEach(y=>{JSON.stringify(b[y])!==JSON.stringify(p[y])&&(S[y]=b[y])}),Object.keys(S).length===0){o();return}m(`${u}::config`,S),o()};return s.jsxs("div",{className:"space-y-6",children:[s.jsxs("div",{className:"space-y-2",children:[s.jsx(de,{id:"ArenaLevelDiff",name:"ArenaLevelDiff",label:d("arena.higherLevel"),type:"number",className:"w-full",value:b.ArenaLevelDiff,onChange:j,min:"-89",max:"89"}),s.jsx(de,{id:"maxArenaRefreshTimes",name:"maxArenaRefreshTimes",label:d("arena.max_refresh_times"),type:"number",className:"w-full",value:b.maxArenaRefreshTimes,onChange:j,min:"0"}),s.jsx(Oe,{label:d("arena.opponent_no"),className:"w-full",value:b.ArenaComponentNumber.toString(),onChange:x("ArenaComponentNumber"),options:[{value:"1",label:"1"},{value:"2",label:"2"},{value:"3",label:"3"}],placeholder:d("selectPlaceholder")||void 0})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:h,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},pb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(M=>M.configStore[u]),m=V(M=>M.modify),b=V(M=>M.staticStore).hard_task_student_material,[C,g]=O.useState(!1),x=O.useMemo(()=>({mainlinePriority:c.mainlinePriority,hardPriority:c.hardPriority,rewarded_task_times:c.rewarded_task_times,scrimmage_times:c.scrimmage_times,activity_sweep_task_number:c.activity_sweep_task_number,activity_sweep_times:c.activity_sweep_times,special_task_times:c.special_task_times,purchase_rewarded_task_ticket_times:c.purchase_rewarded_task_ticket_times,purchase_lesson_ticket_times:c.purchase_lesson_ticket_times,purchase_scrimmage_ticket_times:c.purchase_scrimmage_ticket_times}),[]),[j,h]=O.useState(x),S=M=>b.filter(([Y,E])=>E===M).map(([Y])=>Y),y=()=>Array.from(new Set(b.map(([M,Y])=>Y))),D=JSON.stringify(j)!==JSON.stringify(x),L=async()=>{const M={};if(Object.keys(j).forEach(Y=>{JSON.stringify(j[Y])!==JSON.stringify(x[Y])&&(M[Y]=j[Y])}),Object.keys(M).length===0){o();return}m(`${u}::config`,M),o()};return s.jsxs("div",{children:[s.jsxs(Pn,{defaultValue:"daily",className:"w-full",children:[s.jsxs(es,{className:"w-full",children:[s.jsx(Lt,{value:"daily",children:d("stage.dailyTab")}),s.jsx(Lt,{value:"sweep",children:d("stage.sweepTab")})]}),s.jsxs(Jt,{value:"daily",className:"space-y-4",children:[s.jsxs("div",{children:[s.jsx(en,{label:d("stage.normalLabel"),tooltip:d("stage.normalDesc")}),s.jsx(de,{type:"text",value:j.mainlinePriority,onChange:M=>h({...j,mainlinePriority:M.target.value}),placeholder:d("placeholder.config.insert")})]}),s.jsxs("div",{children:[s.jsx(en,{label:d("stage.hardLabel"),tooltip:d("stage.hardDesc")}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx(de,{type:"text",value:j.hardPriority,onChange:M=>h({...j,hardPriority:M.target.value}),placeholder:d("placeholder.config.insert"),className:"flex-1"}),s.jsx(Ae,{onClick:()=>g(!0),variant:"secondary",children:d("stage.selectStudent")})]})]})]}),s.jsxs(Jt,{value:"sweep",className:"grid gap-2 grid-cols-1 md:grid-cols-2",children:[s.jsx(de,{label:d("sweep.rewarded"),value:j.rewarded_task_times,onChange:M=>h({...j,rewarded_task_times:M.target.value})}),s.jsx(de,{label:d("sweep.scrimmage"),value:j.scrimmage_times,onChange:M=>h({...j,scrimmage_times:M.target.value})}),s.jsx(de,{label:d("sweep.activityNumber"),value:j.activity_sweep_task_number,onChange:M=>h({...j,activity_sweep_task_number:Number(M.target.value)})}),s.jsx(de,{label:d("sweep.activityTimes"),value:j.activity_sweep_times,onChange:M=>h({...j,activity_sweep_times:M.target.value})}),s.jsx(de,{label:d("sweep.special"),value:j.special_task_times,onChange:M=>h({...j,special_task_times:M.target.value})}),s.jsx(Oe,{label:d("sweep.purchaseRewarded"),value:j.purchase_rewarded_task_ticket_times,onChange:M=>h({...j,purchase_rewarded_task_ticket_times:M}),options:["max",...Array.from({length:13},(M,Y)=>Y.toString())].map(M=>({value:M,label:M}))}),s.jsx(Oe,{label:d("sweep.purchaseLesson"),value:j.purchase_lesson_ticket_times,onChange:M=>h({...j,purchase_lesson_ticket_times:M}),options:["max","0","1","2","3","4"].map(M=>({value:M,label:M}))}),s.jsx(Oe,{label:d("sweep.purchaseScrimmage"),value:j.purchase_scrimmage_ticket_times,onChange:M=>h({...j,purchase_scrimmage_ticket_times:M}),options:["max",...Array.from({length:13},(M,Y)=>Y.toString())].map(M=>({value:M,label:M}))})]})]}),s.jsx(Gt,{className:"mt-4"}),s.jsx("div",{className:"flex justify-end pt-4",children:s.jsx("button",{onClick:L,disabled:!D,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})}),s.jsx(In,{isOpen:C,onClose:function(){g(!1)},allStudents:y(),selected:[],onChange:function(M){const Y=S(M[0]);h(E=>{const w=E.hardPriority?E.hardPriority+", ":"";return{...E,hardPriority:w+Y.join(", ")}}),g(!1)}})]})},bb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(y=>y.staticStore),m=V(y=>y.configStore[u]),p=V(y=>y.modify),b=c.total_assault_difficulties[Va[m.server]],C=O.useMemo(()=>({totalForceFightDifficulty:m?.totalForceFightDifficulty}),[m]),[g,x]=je.useState(C),j=JSON.stringify(g)!==JSON.stringify(C),h=()=>{const y={};if(Object.keys(g).forEach(D=>{JSON.stringify(g[D])!==JSON.stringify(C[D])&&(y[D]=g[D])}),Object.keys(y).length===0){o();return}p(`${u}::config`,y),o()},S=y=>D=>{x(L=>({...L,[y]:D}))};return s.jsxs("div",{className:"space-y-6",children:[s.jsx(Oe,{label:d("tactical.hardLevel"),className:"w-full",value:g.totalForceFightDifficulty.toString(),onChange:S("totalForceFightDifficulty"),options:b.map((y,D)=>({value:y,label:y}))}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{disabled:!j,onClick:h,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},vb=({onClose:u,profileId:o})=>{const{t:d}=ne(),c=V(y=>y.configStore[o]),m=V(y=>y.modify),p=["1","2","3","4"],b=["1","2","3","4"],C=O.useMemo(()=>({drill_enable_sweep:c.drill_enable_sweep,drill_fight_formation_list:c.drill_fight_formation_list.map(String),drill_difficulty_list:c.drill_difficulty_list.map(String)}),[c]),[g,x]=O.useState(C),j=JSON.stringify(g)!==JSON.stringify(C),h=(y,D)=>L=>{x(M=>{const Y=[...M[y]];return Y[D]=L,{...M,[y]:Y}})},S=async()=>{const y={drill_enable_sweep:g.drill_enable_sweep,drill_fight_formation_list:g.drill_fight_formation_list.map(Number),drill_difficulty_list:g.drill_difficulty_list.map(Number)};m(`${o}::config`,y),u()};return s.jsxs("div",{className:"space-y-2",children:[s.jsx(nt,{label:d("drill.useAllAfterSweep"),checked:g.drill_enable_sweep,onChange:y=>x(D=>({...D,drill_enable_sweep:y})),className:"w-full"}),s.jsx(Gt,{}),s.jsxs("div",{children:[s.jsx("label",{className:"block mb-2 text-sm font-medium text-slate-700 dark:text-slate-200",children:d("drill.out_partyNo")}),s.jsx("div",{className:"flex items-center gap-2",children:g.drill_fight_formation_list.map((y,D)=>s.jsxs(je.Fragment,{children:[s.jsx(Oe,{value:y,onChange:h("drill_fight_formation_list",D),options:p.map(L=>({value:L,label:L})),className:"flex-1"}),D!==g.drill_fight_formation_list.length-1&&s.jsx("span",{className:"text-slate-400",children:"/"})]},D))})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block mb-2 text-sm font-medium text-slate-700 dark:text-slate-200",children:d("drill.difficulty")}),s.jsx("div",{className:"flex items-center gap-2",children:g.drill_difficulty_list.map((y,D)=>s.jsxs(je.Fragment,{children:[s.jsx(Oe,{value:y,onChange:h("drill_difficulty_list",D),options:b.map(L=>({value:L,label:L})),className:"flex-1"}),D!==g.drill_difficulty_list.length-1&&s.jsx("span",{className:"text-slate-400",children:"/"})]},D))})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700 mt-4",children:s.jsx("button",{onClick:S,disabled:!j,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},yb={mumu:"MuMu模拟器",mumu_global:"MuMu模拟器全球版",bluestacks_nxt_cn:"蓝叠模拟器",bluestacks_nxt:"蓝叠国际版"},jb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(h=>h.configStore[u]),m=V(h=>h.modify),p=O.useMemo(()=>({open_emulator_stat:c.open_emulator_stat,emulator_wait_time:c.emulator_wait_time,emulatorIsMultiInstance:c.emulatorIsMultiInstance,program_address:c.program_address,emulatorMultiInstanceNumber:c.emulatorMultiInstanceNumber,multiEmulatorName:c.multiEmulatorName}),[c]),[b,C]=O.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=h=>S=>{C(y=>({...y,[h]:S}))},j=async()=>{const h={};if(Object.keys(b).forEach(S=>{JSON.stringify(b[S])!==JSON.stringify(p[S])&&(h[S]=b[S])}),Object.keys(h).length===0){o();return}m(`${u}::config`,h),o()};return s.jsxs("div",{className:"@container space-y-2",children:[s.jsxs("div",{className:"flex @lg:flex-row @max-lg:flex-col gap-2",children:[s.jsx(nt,{label:d("emulator.openOnLaunch"),checked:b.open_emulator_stat,onChange:h=>x("open_emulator_stat")(h),className:"w-full"}),s.jsx(nt,{label:d("emulator.multiInstance"),checked:b.emulatorIsMultiInstance,onChange:h=>x("emulatorIsMultiInstance")(h),className:"w-full"})]}),s.jsx(de,{type:"number",label:d("emulator.waitTime"),value:b.emulator_wait_time,onChange:h=>x("emulator_wait_time")(h.target.value),placeholder:"5"}),!b.emulatorIsMultiInstance&&s.jsxs("div",{className:"space-y-2",children:[s.jsx("label",{className:"block text-sm font-medium text-slate-700 dark:text-slate-200",children:d("emulator.address")}),s.jsx("div",{className:"flex gap-2",children:s.jsx(de,{type:"text",value:b.program_address,onChange:h=>x("program_address")(h.target.value),placeholder:"C:\\\\Path\\\\to\\\\MuMuPlayer.exe",className:"flex-1"})})]}),b.emulatorIsMultiInstance&&s.jsxs("div",{className:"space-y-4",children:[s.jsx(Oe,{label:d("emulator.multiType"),value:b.multiEmulatorName,onChange:x("multiEmulatorName"),options:Object.entries(yb).map(([h,S])=>({value:h,label:S}))}),s.jsx(de,{type:"number",label:d("emulator.instanceCount"),value:b.emulatorMultiInstanceNumber,onChange:h=>x("emulatorMultiInstanceNumber")(h.target.value)})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:j,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},Sb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(h=>h.configStore[u]),m=V(h=>h.modify),p=O.useMemo(()=>({push_json:c.push_json,push_serverchan:c.push_serverchan,push_after_error:c.push_after_error,push_after_completion:c.push_after_completion}),[c]),[b,C]=O.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=h=>S=>{C(y=>({...y,[h]:S}))},j=async()=>{const h={};if(Object.keys(b).forEach(S=>{JSON.stringify(b[S])!==JSON.stringify(p[S])&&(h[S]=b[S])}),Object.keys(h).length===0){o();return}m(`${u}::config`,h),o()};return s.jsxs("div",{className:"space-y-6",children:[s.jsxs("div",{className:"w-full flex gap-2 lg:flex-row max-lg:flex-col",children:[s.jsx(nt,{label:d("push.afterError"),checked:b.push_after_error,onChange:x("push_after_error"),className:"flex-1"}),s.jsx(nt,{label:d("push.afterCompletion"),checked:b.push_after_completion,onChange:x("push_after_completion"),className:"flex-1"})]}),s.jsx(de,{label:d("push.json"),value:b.push_json,onChange:h=>x("push_json")(h.target.value),placeholder:d("placeholder.config.insert")}),s.jsx(de,{label:d("push.serverchan"),value:b.push_serverchan,onChange:h=>x("push_serverchan")(h.target.value),placeholder:d("placeholder.config.insert")}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:j,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},_b=({profileId:u,onClose:o,setActivePage:d})=>{const{t:c}=ne(),m=V(b=>b.trigger),p=b=>async()=>{m({timestamp:qt(),command:"solve",config_id:u,payload:{task:b}},C=>{Dt(c("stage.taskTriggerStart"),{description:c("stage.taskTriggered",{task:c(b)})})}),o(),d?.("home")};return s.jsx("div",{className:"space-y-2",children:s.jsxs("div",{className:"flex items-center justify-between p-4 bg-slate-50 dark:bg-slate-700/50 rounded-lg",children:[s.jsxs("div",{children:[s.jsx("label",{className:"text-slate-700 dark:text-slate-200 font-medium",children:c("other.fhx")}),s.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:c("other.fhxDesc")})]}),s.jsx("button",{onClick:p("start_fhx"),className:"px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors duration-200",children:c("execute")})]})})},Nb=({onClose:u,profileId:o})=>{const{t:d}=ne(),c=V(M=>M.configStore[o]),m=V(M=>M.modify),p=Va[c.server],b=O.useMemo(()=>({clear_friend_white_list:c.clear_friend_white_list}),[c]),[C,g]=O.useState(""),[x,j]=O.useState(b),h=JSON.stringify(x)!==JSON.stringify(b),S=M=>{let Y=7;if((p==="JP"||p==="Global")&&(Y=8),M.length!==Y)return d("friend.invalidLength");if(p==="CN"){if(!/^[0-9a-z]+$/.test(M))return d("friend.invalidFormatCN")}else if(p==="Global"&&!/^[A-Z]+$/.test(M))return d("friend.invalidFormatGlobal");return null},y=async()=>{const M=C.trim(),Y=S(M);if(Y){Dt.error(d("friend.addFailed"),{description:Y});return}if(x.clear_friend_white_list.includes(M)){Dt.error(d("friend.addFailed"),{description:d("friend.alreadyExists")});return}const E=[...x.clear_friend_white_list,M];j(w=>({...w,clear_friend_white_list:E}))},D=async M=>{const Y=x.clear_friend_white_list.filter(E=>E!==M);j(E=>({...E,clear_friend_white_list:Y}))},L=async()=>{const M={clear_friend_white_list:x.clear_friend_white_list};m(`${o}::config`,M),u()};return s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{className:"flex gap-2 items-center",children:[s.jsx(de,{type:"text",value:C,onChange:M=>g(M.target.value),placeholder:d("friend.placeholder"),className:"flex-1"}),s.jsx("button",{onClick:y,className:"px-4 py-1.5 bg-primary-600 text-white rounded-lg hover:bg-primary-700",children:d("friend.add")})]}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[x.clear_friend_white_list.map(M=>s.jsxs("span",{className:"inline-flex items-center px-3 py-1 rounded-full bg-slate-200 text-slate-800 dark:bg-slate-700 dark:text-slate-100 font-mono font-bold",children:[M,s.jsx("button",{onClick:()=>D(M),className:"ml-2 text-red-600 hover:text-red-800 dark:text-red-400",children:"✕"})]},M)),x.clear_friend_white_list.length===0&&s.jsx("p",{className:"text-slate-500 text-sm",children:d("friend.empty")})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700 mt-4",children:s.jsx("button",{onClick:L,disabled:!h,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})};function wb({className:u,...o}){return s.jsx("textarea",{"data-slot":"textarea",wrap:"soft",className:W("border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","whitespace-pre-wrap break-keep break-normal overflow-x-auto hyphens-none",u),style:{wordBreak:"keep-all",overflowWrap:"normal",whiteSpace:"pre-wrap"},...o})}const Cb=({onClose:u,profileId:o})=>{const{t:d}=ne(),c=V(j=>j.configStore[o]),m=V(j=>j.modify),p=O.useMemo(()=>({use_acceleration_ticket:c.use_acceleration_ticket,createTime:c.createTime,create_phase:c.create_phase,create_phase_1_select_item_rule:c.create_phase_1_select_item_rule,create_phase_2_select_item_rule:c.create_phase_2_select_item_rule,create_phase_3_select_item_rule:c.create_phase_3_select_item_rule,createPriority_phase1:c.createPriority_phase1,createPriority_phase2:c.createPriority_phase2,createPriority_phase3:c.createPriority_phase3}),[c]),[b,C]=O.useState(p);O.useEffect(()=>{C(p)},[p]);const g=JSON.stringify(b)!==JSON.stringify(p),x=async()=>{const j={};if(Object.keys(b).forEach(h=>{JSON.stringify(b[h])!==JSON.stringify(p[h])&&(j[h]=b[h])}),Object.keys(j).length===0){u();return}m(`${o}::config`,j),u()};return s.jsxs("div",{className:"space-y-4",children:[s.jsxs(Pn,{defaultValue:"global",className:"w-full",children:[s.jsxs(es,{className:"w-full",children:[s.jsx(Lt,{value:"global",children:d("artifact.global")}),Array.from({length:b.create_phase}).map((j,h)=>s.jsx(Lt,{value:`phase${h+1}`,children:d(`artifact.phase_${h+1}`)},h))]}),s.jsx(Jt,{value:"global",children:s.jsxs("div",{className:"flex flex-col justify-between gap-4 mt-4",children:[s.jsx(nt,{label:d("artifact.useTicketDesc"),checked:b.use_acceleration_ticket,onChange:j=>C(h=>({...h,use_acceleration_ticket:j}))}),s.jsx(de,{id:"createTime",label:d("artifact.createTime"),type:"number",value:b.createTime,onChange:j=>C(h=>({...h,createTime:j.target.value})),min:"1",max:"10"}),s.jsx(Oe,{label:d("artifact.phaseCount"),value:b.create_phase.toString(),onChange:j=>C(h=>({...h,create_phase:Number(j)})),options:[1,2,3].map(j=>({value:j.toString(),label:j.toString()}))})]})}),Array.from({length:b.create_phase},(j,h)=>h).map(j=>s.jsx(Jt,{value:`phase${j+1}`,children:s.jsx(Tb,{phase:j+1,draft:b,settings:c,setDraft:C})},j))]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:x,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 disabled:opacity-60",children:d("save")})})]})},Tb=({settings:u,phase:o,draft:d,setDraft:c})=>{const{t:m}=ne(),[p,b]=O.useState(!1),C={1:{default:m("artifact.default")},2:{primary:m("artifact.white"),normal:m("artifact.blue"),primary_normal:m("artifact.whiteBlue"),advanced:m("artifact.gold"),superior:m("artifact.purple"),advanced_superior:m("artifact.goldPurple"),primary_normal_advanced_superior:m("artifact.all")},3:{advanced:m("artifact.gold"),superior:m("artifact.purple"),advanced_superior:m("artifact.goldPurple")}},g=V(j=>j.staticStore),x=j=>{const h=g.create_phase2_recommended_priority[j],S=g.create_default_priority[Va[u.server]].phase2,y=h.map(D=>S[D]);return S.forEach((D,L)=>{h.includes(L)||y.push(S[L])}),y};return s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block mb-1",children:m("artifact.materialSelect")}),s.jsxs(th,{value:d[`create_phase_${o}_select_item_rule`],onValueChange:j=>c(h=>({...h,[`create_phase_${o}_select_item_rule`]:j})),children:[s.jsx(lh,{className:"w-full",children:s.jsx(ah,{})}),s.jsx(nh,{children:Object.entries(C[o]).map(([j,h])=>s.jsx(sh,{value:j,children:h},j))})]})]}),o===2&&s.jsxs("div",{children:[s.jsx("label",{className:"block mb-1",children:m("artifact.phase2.recommend")}),s.jsx(Ae,{className:"w-full",variant:"secondary",onClick:()=>b(!0),children:m("artifact.selectStudent")})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block mb-1",children:m("artifact.priority")}),s.jsx(wb,{value:d[`createPriority_phase${o}`].join(" > ")||"",onChange:j=>c(h=>({...h,[`createPriority_phase${o}`]:j.target.value.split(">").map(S=>S.trim())})),placeholder:"A > B > C",className:"min-h-[120px]"})]}),s.jsx(In,{isOpen:p,onClose:function(){b(!1)},allStudents:Object.keys(g.create_phase2_recommended_priority),selected:[],onChange:function(j){const h=x(j[0]);c(S=>({...S,createPriority_phase2:h})),b(!1)}})]})},zb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(y=>y.staticStore),m=V(y=>y.configStore[u]),p=V(y=>y.modify),b=[[d("script.doNothing"),"无动作"],[d("script.exitBaas"),"退出 Baas"],[d("script.exitEmu"),"退出 模拟器"],[d("script.exitBoth"),"退出 Baas 和 模拟器"],[d("script.shutdown"),"关机"]],C=O.useMemo(()=>({screenshot_interval:m.screenshot_interval,autostart:m.autostart,then:m.then,screenshot_method:m.screenshot_method,control_method:m.control_method}),[m]),[g,x]=O.useState(C),j=JSON.stringify(g)!==JSON.stringify(C),h=y=>D=>{x(L=>({...L,[y]:D}))},S=async()=>{const y={};if(Object.keys(g).forEach(D=>{JSON.stringify(g[D])!==JSON.stringify(C[D])&&(y[D]=g[D])}),Object.keys(y).length===0){o();return}p(`${u}::config`,y),o()};return s.jsxs("div",{className:"space-y-2",children:[s.jsx(de,{type:"number",label:d("script.screenshotInterval"),value:g.screenshot_interval,onChange:y=>h("screenshot_interval")(y.target.value),placeholder:"1.0",min:.1,step:.1}),s.jsx(nt,{label:d("script.autostart"),checked:g.autostart,onChange:y=>h("autostart")(y),className:"w-full"}),s.jsx(Oe,{label:d("script.then"),value:g.then,onChange:h("then"),options:b.map(y=>({value:y[1],label:y[0]}))}),s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s.jsx(Oe,{label:d("script.screenshotMethod"),value:g.screenshot_method,onChange:h("screenshot_method"),options:c?.screenshot_methods?.map(y=>({value:y,label:y}))??[],className:"flex-1"}),s.jsx(Oe,{label:d("script.controlMethod"),value:g.control_method,onChange:h("control_method"),options:c?.control_methods?.map(y=>({value:y,label:y}))??[],className:"flex-1"})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:S,disabled:!j,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},Eb=({profileId:u,setActivePage:o,onClose:d})=>{const{t:c}=ne(),m=V(R=>R.staticStore),p=V(R=>R.configStore[u]),b=V(R=>R.modify),C=V(R=>R.trigger),g=O.useMemo(()=>({manual_boss:p.manual_boss,explore_normal_task_list:p.explore_normal_task_list,explore_hard_task_list:p.explore_hard_task_list}),[p]),[x,j]=O.useState(g),h=JSON.stringify(x)!==JSON.stringify(g),[S,y]=O.useState([]),D=Va[p.server],L=m.current_game_activity[D],M=L?.activity_name??c("stage.noEvent");O.useEffect(()=>{if(!L)return;const R=[];["story","mission","challenge"].forEach(Z=>{const I=L[Z];I&&Object.entries(I).forEach(([fe,Ce])=>{R.push([fe,Ce])})}),y(R)},[L]);const Y=async()=>{const R={};if(Object.keys(x).forEach(Z=>{JSON.stringify(x[Z])!==JSON.stringify(g[Z])&&(R[Z]=x[Z])}),Object.keys(R).length===0){d();return}b(`${u}::config`,R),d()},E=R=>Z=>{j(I=>({...I,[R]:Z}))},w=R=>async()=>{if(R==="start_hard_task"||R==="start_normal_task"){if(R==="start_hard_task"&&(!x.explore_hard_task_list||x.explore_hard_task_list.trim()==="")){Dt.error(c("stage.noHardTask"));return}else if(R==="start_normal_task"&&(!x.explore_normal_task_list||x.explore_normal_task_list.trim()==="")){Dt.error(c("stage.noNormalTask"));return}await Y()}C({timestamp:qt(),command:"solve",config_id:u,payload:{task:R}},()=>{Dt(c("stage.taskTriggerStart"),{description:c("stage.taskTriggered",{task:c(R)})})}),d(),o?.("home")};return s.jsxs("div",{children:[s.jsxs(Pn,{defaultValue:"explore",className:"w-full",children:[s.jsxs(es,{className:"w-full",children:[s.jsx(Lt,{value:"explore",children:c("stage.exploreTab")}),s.jsx(Lt,{value:"event",children:c("stage.eventTab")})]}),s.jsxs(Jt,{value:"explore",className:"space-y-2",children:[s.jsx(nt,{label:c("stage.manualBoss"),checked:x.manual_boss,onChange:E("manual_boss"),className:"w-full"}),s.jsxs("div",{className:"flex gap-2 w-full",children:[s.jsx(Ae,{className:"flex-1",onClick:w("start_main_story"),children:c("stage.story.main")}),s.jsx(Ae,{className:"flex-1",onClick:w("start_group_story"),children:c("stage.story.group")}),s.jsx(Ae,{className:"flex-1",onClick:w("start_mini_story"),children:c("stage.story.mini")})]}),s.jsx(Gt,{}),s.jsxs("div",{className:"w-full flex flex-row gap-2 items-end",children:[s.jsx(de,{label:c("stage.normalTask"),value:x.explore_normal_task_list,onChange:R=>E("explore_normal_task_list")(R.target.value),placeholder:c("placeholder.config.insert"),className:"flex-1"}),s.jsx(Ae,{onClick:w("start_normal_task"),className:"h-9",children:c("execute")})]}),s.jsxs("div",{className:"w-full flex flex-row gap-2 items-end",children:[s.jsx(de,{label:c("stage.hardTask"),value:x.explore_hard_task_list,onChange:R=>E("explore_hard_task_list")(R.target.value),placeholder:c("placeholder.config.insert"),className:"flex-1"}),s.jsx(Ae,{onClick:w("start_hard_task"),className:"h-9",children:c("execute")})]})]}),s.jsxs(Jt,{value:"event",className:"space-y-4",children:[s.jsx(kt,{className:"p-3",children:s.jsxs("p",{className:"text-sm",children:[c("stage.currentEvent"),": ",s.jsx("b",{children:M})]})}),s.jsxs("div",{className:"flex gap-2 w-full",children:[s.jsx(Ae,{className:"flex-1",onClick:w("start_explore_activity_story"),children:c("stage.story")}),s.jsx(Ae,{className:"flex-1",onClick:w("start_explore_activity_mission"),children:c("stage.mission")}),s.jsx(Ae,{className:"flex-1",onClick:w("start_explore_activity_challenge"),children:c("stage.challenge")})]}),s.jsxs("div",{children:[s.jsx("p",{className:"mb-2",children:c("stage.attrTable")}),s.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-2 text-sm",children:S.map(([R,Z],I)=>s.jsxs(kt,{className:"p-2 flex justify-between",children:[s.jsx("span",{children:R}),s.jsx("span",{className:"font-medium",children:c(`property.${Z}`)})]},I))})]})]})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700 mt-4",children:s.jsx("button",{onClick:Y,disabled:!h,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:c("save")})})]})},Ab=["burst","pierce","mystic","shock","Unused"],Ob=["preset","side","order"],Mb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(y=>y.configStore[u]),m=V(y=>y.modify),p=O.useMemo(()=>({choose_team_method:c.choose_team_method,side_team_attribute:c.side_team_attribute,preset_team_attribute:c.preset_team_attribute}),[c]),[b,C]=O.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=(y,D,L)=>M=>{C(Y=>{const E=Y[y].map((w,R)=>R===D?w.map((Z,I)=>I===L?M:Z):w);return{...Y,[y]:E}})},j=y=>D=>{C(L=>({...L,[y]:D}))},h=async()=>{const y={};if(Object.keys(b).forEach(D=>{JSON.stringify(b[D])!==JSON.stringify(p[D])&&(y[D]=b[D])}),Object.keys(y).length===0){o();return}m(`${u}::config`,y),o()},S=y=>{const D=b[y],L=y=="preset_team_attribute"?4:1;return s.jsx("div",{className:"grid gap-2 border rounded-lg p-2 bg-slate-50 dark:bg-slate-800",style:{gridTemplateColumns:`repeat(${L}, minmax(0, 1fr))`},children:D.map((M,Y)=>M.map((E,w)=>s.jsx(Oe,{value:E,onChange:R=>x(y,Y,w)(R),options:Ab.map(R=>({value:R,label:d(`property.${R}`)})),className:"w-full"},`${Y}-${w}`)))})};return s.jsxs("div",{className:"space-y-6",children:[s.jsx(Oe,{label:d("team.chooseMethod"),value:b.choose_team_method,onChange:j("choose_team_method"),options:Ob.map(y=>({value:y,label:d(`team.${y}`)}))}),b.choose_team_method==="preset"&&S("preset_team_attribute"),b.choose_team_method==="side"&&s.jsx("div",{className:"space-y-4",children:S("side_team_attribute")}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:h,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},Db={cafe:50,schedule:50,shop:50,artifact:80,arena:30,dailySweep:70,tactical:60,drill:50,whitelist:70,server:30,script:60,emulator:50,stage:80,team:70,push:50,other:30},wm={cafe:{icon:yx,descKey:"cafeDesc",component:db},schedule:{icon:vx,descKey:"scheduleDesc",component:hb},shop:{icon:bx,descKey:"shopDesc",component:gb},arena:{icon:px,descKey:"arenaDesc",component:xb},dailySweep:{icon:xx,descKey:"dailySweepDesc",component:pb},tactical:{icon:gx,descKey:"tacticalDesc",component:bb},drill:{icon:hx,descKey:"drillDesc",component:vb},whitelist:{icon:mx,descKey:"whitelistDesc",component:Nb},artifact:{icon:fx,descKey:"artifactDesc",component:Cb},server:{icon:dx,descKey:"serverDesc",component:mb},script:{icon:ox,descKey:"scriptDesc",component:zb},emulator:{icon:ux,descKey:"emulatorDesc",component:jb},stage:{icon:rx,descKey:"stageDesc",component:Eb},team:{icon:cx,descKey:"teamDesc",component:Mb},push:{icon:ix,descKey:"pushDesc",component:Sb},other:{icon:sx,descKey:"otherDesc",component:_b}},kb={show:{transition:{staggerChildren:.05}}},Ub={hidden:{opacity:0,y:8,scale:.98},show:{opacity:1,y:0,scale:1,transition:{duration:.18,ease:"easeOut"}}},Rb=({children:u,onClick:o})=>s.jsx(Ze.div,{variants:Ub,initial:"hidden",animate:"show",whileHover:{y:-2},whileTap:{scale:.99},className:"cursor-pointer",onClick:o,children:s.jsx(kt,{children:u})}),Hb=({profileId:u,setActivePage:o})=>{const{t:d}=ne(),{profiles:c,activeProfile:m}=Ja(),p=u??m?.id,b=O.useMemo(()=>c.find(M=>M.id===p)??m??null,[c,p,m]),[C,g]=O.useState(null),[x,j]=O.useState(null),h=M=>{j(Db[M]),g(M)},S=()=>{g(null)},y={[d("featureSettings")]:["cafe","schedule","shop","artifact","arena","dailySweep","tactical","drill","whitelist"],[d("generalSettings")]:["server","script","emulator","stage","team","push","other"]},D=M=>{const{icon:Y,descKey:E}=wm[M];return s.jsx(Rb,{onClick:()=>h(M),children:s.jsx(Xa,{children:s.jsxs("div",{className:"flex items-center gap-4",children:[s.jsx("div",{className:"bg-primary-100 dark:bg-primary-900/50 p-3 rounded-lg",children:s.jsx(Y,{className:"w-6 h-6 text-primary-600 dark:text-primary-400"})}),s.jsxs("div",{children:[s.jsx(Za,{children:d(M)}),s.jsx(cu,{children:d(E)})]})]})})},M)},L=C?wm[C].component:null;return s.jsxs("div",{className:"space-y-8",children:[s.jsx("div",{className:"flex items-baseline justify-between",children:s.jsxs("div",{className:"flex",children:[s.jsx("h2",{className:"text-2xl font-bold text-slate-800 dark:text-slate-100",children:d("configuration")}),s.jsxs("h2",{className:"text-2xl ml-3 text-slate-500 dark:text-slate-400",children:["#",b?.name]})]})}),s.jsx(Ze.div,{variants:kb,initial:"show",animate:"show",className:"space-y-8",children:Object.entries(y).map(([M,Y])=>s.jsxs("section",{children:[s.jsx("h3",{className:"text-lg font-semibold mb-4 text-slate-700 dark:text-slate-200",children:M}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2",children:Y.map(D)})]},M))}),C&&L&&s.jsx(ru,{isOpen:!0,title:d(C),onClose:S,width:x??0,children:s.jsx(L,{onClose:S,profileId:b.id,setActivePage:o})})]})},Bb="/";ml.use(jx).init({lng:Vt.get("uiSettings")?.lang||"en",fallbackLng:"en",resources:{},interpolation:{escapeValue:!1}});async function dh(u){try{const o=await fetch(`${Bb}locales/${u}.json`);if(!o.ok)throw new Error(`Failed to load locale: ${u}`);const d=await o.json();ml.addResourceBundle(u,"translation",d,!0,!0),await ml.changeLanguage(u),console.log(`[i18n] switched to ${u}`)}catch(o){console.error(`[i18n] failed to load ${u}:`,o)}}const Yr=[{label:"updateMethod.github",method:"github"},{label:"updateMethod.gitee",method:"gitee"},{label:"updateMethod.gitcode",method:"gitcode"},{label:"updateMethod.tencent",method:"tencent_c_coding"}];let Cm=!0;const Tm=[{label:"shaMethod.github",value:"github"},{label:"shaMethod.mirrorc",value:"mirrorc"},{label:"shaMethod.gitee",value:"gitee"},{label:"shaMethod.gitcode",value:"gitcode"},{label:"shaMethod.tencent_c_coding",value:"tencent_c_coding"}],qb=()=>{const{t:u,i18n:o}=ne(),{theme:d,setTheme:c}=eh(),{uiSettings:m,setUiSettings:p}=Ja(),b=V(Q=>Q.trigger),C=V(Q=>Q.updateStore),g=V(Q=>Q.versionStore),x=V(Q=>Q.modify),[j,h]=O.useState(Yr),S=Q=>{c(Q),p(De=>({...De,theme:Q}))},y=Q=>{dh(Q).then(()=>{p(De=>({...De,lang:Q}))})},D=Q=>{const De=Number(Q);p(at=>({...at,zoomScale:De}))},[L,M]=O.useState(u("version.fetching")),[Y,E]=O.useState(u("version.fetching")),[w,R]=O.useState(u("version.tapToTest")),[Z,I]=O.useState(g.local),[fe,Ce]=O.useState(g.remote),[Ve,K]=O.useState(""),[G,ee]=O.useState(""),[ue,Se]=O.useState(!1),[me,U]=O.useState(!1),[X,te]=O.useState(!1),[Te,be]=O.useState(C.updateMethod),[Ke,ze]=O.useState(""),he=[{label:u("localVersion"),value:L,icon:s.jsx(Sx,{className:"w-8 h-8 text-cyan-500"})},{label:u("remoteVersion"),value:Y,icon:s.jsx(_x,{className:"w-8 h-8 text-indigo-500"})},{label:u("updateMethod"),value:u(w),icon:s.jsx(Nx,{className:`w-8 h-8 text-purple-500 ${X?"animate-spin":""}`})}],[Me,st]=O.useState(C.mirrorcCdk),[Ut,Ka]=O.useState(Tm.map(Q=>({method:Q.label,status:"pending"}))),gl=()=>{te(!0),Ce(""),I(""),ee(""),K(""),M(u("version.fetching")),E(u("version.fetching")),R(u("version.testing")),b({timestamp:qt(),command:"check_for_update",payload:{}},Q=>{I(Q.data.local),Ce(Q.data.remote),R("version.tapToTest"),te(!1)})};O.useEffect(()=>{Cm&&(Cm=!1,Me&&ga())},[]),O.useEffect(()=>{C.mirrorcCdk?(h([...Yr,{label:"updateMethod.mirrorc",method:"mirrorc"}]),be("mirrorc")):(be(C.updateMethod),h(Yr.filter(Q=>Q.method!=="mirrorc")))},[C]),O.useEffect(()=>{Ve+Z+G+fe!==""&&(M(Ve===null||Z===null?u("version.checkError"):`${Z.slice(0,6)}`),E(G===null||fe===null?u("version.checkError"):`${fe.slice(0,6)}`))},[Ve,Z,G,fe]);const ha=()=>{Se(!0),Ka(Ut.map(Q=>({...Q,status:"testing"}))),b({timestamp:qt(),command:"test_all_sha",payload:{}},Q=>{Ka(Q.data.map(De=>({status:De.success?"success":"error",method:u(`shaMethod.${De.name}`),time:De.duration.toFixed(3),sha:De.value}))),Se(!1)})},tn=Q=>{if(Q==="mirrorc"){be(Q);return}else Q!=="mirrorc"&&C.mirrorcCdk&&(st(""),ze(""));x("global::setup_toml",{mirrorcCdk:""},!1),x("global::setup_toml",{updateMethod:Q}),be(Q)},ga=(Q,De=!0)=>{Me||De&&Dt.error(u("cdk.noCDKInput")),U(!0),b({timestamp:qt()+Math.random(),command:"valid_cdk",payload:{cdk:Me}},at=>{if(at.data.success){const xa=at.data.expires_at_iso;console.log(xa);const an=xa?u(at.data.message,{expire_date:$r(xa)}):u(at.data.message);De&&Dt.success(u("CDK Test OK"),{description:an}),ze(xa),x("global::setup_toml",{mirrorcCdk:Me},!1)}else Me!==""&&De&&Dt.error(u(at.data.message),{description:u(at.data.mirrorc_message)}),st(""),ze(""),x("global::setup_toml",{mirrorcCdk:""},!1);U(!1)})};return s.jsxs("div",{className:"space-y-4",children:[s.jsxs(kt,{className:"relative overflow-hidden rounded-2xl border border-slate-200/50 bg-gradient-to-br from-slate-50 to-slate-100 dark:from-slate-900 dark:to-slate-950 shadow-lg",children:[s.jsx("div",{className:"absolute inset-0 rounded-2xl border border-transparent [mask-composite:exclude] bg-gradient-to-r from-cyan-400/40 via-indigo-400/40 to-purple-400/40 blur-2xl opacity-40 pointer-events-none"}),s.jsxs(Xa,{className:"flex flex-row items-center gap-2",children:[s.jsx(tu,{className:"w-5 h-5 text-cyan-400"}),s.jsx(Za,{className:"text-lg font-semibold tracking-wide bg-gradient-to-r from-cyan-400 to-purple-500 bg-clip-text text-transparent",children:u("versionInfo")})]}),s.jsx(ma,{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:he.map((Q,De)=>s.jsxs("div",{className:`flex items-center gap-3 p-3 rounded-lg bg-white dark:bg-slate-800/40 transition ${Q.label===u("updateMethod")?" cursor-link hover:bg-white/70 dark:hover:bg-slate-700/50":""}`,onClick:Q.label===u("updateMethod")?gl:void 0,children:[Q.icon,s.jsxs("div",{className:"flex flex-col",children:[s.jsx("p",{className:"text-sm font-medium text-slate-600 dark:text-slate-400",children:Q.label}),s.jsx("p",{className:"text-base font-semibold text-slate-900 dark:text-slate-100",children:Q.value})]})]},De))})]}),s.jsxs(kt,{children:[s.jsxs(Xa,{className:"flex flex-row items-center gap-2",children:[s.jsx(wx,{className:"w-5 h-5"}),s.jsx(Za,{children:u("uiSettings")})]}),s.jsxs(ma,{className:"space-y-6",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-slate-700 dark:text-slate-200 mb-2",children:u("theme")}),s.jsx("div",{className:"flex space-x-2 p-1 bg-slate-100 dark:bg-slate-700 rounded-lg",children:["light","dark","system"].map(Q=>s.jsx("button",{onClick:()=>S(Q),className:`flex-1 py-2 text-sm font-medium rounded-md transition-colors ${d===Q?"bg-white dark:bg-slate-600 shadow":"hover:bg-white/50 dark:hover:bg-slate-700/50"}`,children:u(Q)},Q))})]}),s.jsx(Oe,{value:o.language,label:u("language"),onChange:y,options:[{value:"en",label:u("english")},{value:"zh",label:u("chinese")},{value:"ja",label:u("japanese")},{value:"ko",label:u("korean")},{value:"de",label:u("deutsch")},{value:"ru",label:u("russian")},{value:"fr",label:u("french")}]}),s.jsx(Oe,{value:m?.zoomScale.toString(),label:u("ui.zoom"),onChange:D,options:[50,60,70,80,90,100,110,120,130,140,150].map(Q=>({value:Q.toString(),label:`${Q}%`}))}),s.jsx(Gt,{}),s.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:[s.jsx(nt,{label:u("log.scroll.detail"),checked:m?.scrollToEnd,onChange:Q=>{p(De=>({...De,scrollToEnd:Q}))}}),s.jsx(nt,{label:u("assetsDisplay.detail"),checked:m?.assetsDisplay,onChange:Q=>{p(De=>({...De,assetsDisplay:Q}))}})]})]})]}),s.jsxs(kt,{children:[s.jsxs(Xa,{className:"flex flex-row items-center gap-2",children:[s.jsx(Cx,{className:"w-5 h-5"}),s.jsx(Za,{children:u("globalUpdateSettings")})]}),s.jsxs(ma,{className:"space-y-4",children:[s.jsxs("div",{className:"grid grid-cols-1 gap-1",children:[s.jsxs("div",{className:"grid sm:flex gap-2 items-center",children:[s.jsx(de,{label:u("mirrorCdk"),placeholder:u("enterCdk"),value:Me,onKeyDown:Q=>{Q.key==="Enter"&&ga()},onChange:Q=>st(Q.target.value),className:"flex-1"}),s.jsx(Ae,{onClick:ga,disabled:me,className:"pl-3 self-end",children:me?s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}),u("mirror.verifying")]}):s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(Tx,{className:"mr-1 h-4 w-4"}),u("mirror.verify")]})})]}),Ke!==""?s.jsxs("div",{className:"text-sm text-slate-600",children:[u("update.dueDate"),": ",$r(Ke)]}):s.jsx("div",{className:"text-sm text-slate-600",children:" "})]}),s.jsx(Gt,{}),s.jsx(Oe,{label:u("updateChannel"),value:Te,onChange:tn,options:j.map(Q=>({value:Q.method,label:u(Q.label)}))}),s.jsxs("div",{className:"grid sm:flex gap-2",children:[s.jsx(Oe,{label:u("shaConnectivityTest"),value:C.shaMethod,onChange:Q=>x("global::setup_toml",{shaMethod:Q}),options:Tm.map(Q=>({value:Q.value,label:u(Q.label)})),className:"flex-grow"}),s.jsx(Ae,{onClick:ha,disabled:ue,className:"pl-3 self-end",children:ue?s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}),u("shaTest.testing")]}):s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(zx,{className:"mr-1 h-4 w-4"}),u("shaTest.testAll")]})})]}),s.jsx("div",{className:"overflow-auto rounded-xl border border-slate-200 dark:border-slate-700 shadow-md",children:s.jsxs("table",{className:"w-full text-sm border-collapse",children:[s.jsx("thead",{className:"bg-gradient-to-r from-cyan-50 to-purple-50 dark:from-slate-800 dark:to-slate-900",children:s.jsxs("tr",{children:[s.jsx("th",{className:"px-4 py-3 text-left font-semibold text-slate-700 dark:text-slate-200 border-b border-slate-200 dark:border-slate-700",children:u("shaTest.method")}),s.jsx("th",{className:"px-4 py-3 text-center font-semibold text-slate-700 dark:text-slate-200 border-b border-slate-200 dark:border-slate-700",children:u("shaTest.status")}),s.jsx("th",{className:"px-4 py-3 text-center font-semibold text-slate-700 dark:text-slate-200 border-b border-slate-200 dark:border-slate-700",children:u("shaTest.time")}),s.jsx("th",{className:"px-4 py-3 text-center font-semibold text-slate-700 dark:text-slate-200 border-b border-slate-200 dark:border-slate-700",children:u("shaTest.sha")})]})}),s.jsx("tbody",{children:Ut.map((Q,De)=>s.jsxs("tr",{className:"odd:bg-white even:bg-slate-50 dark:odd:bg-slate-900 dark:even:bg-slate-800 hover:bg-slate-100 dark:hover:bg-slate-700 transition-colors",children:[s.jsxs("td",{className:"px-4 py-3 border-b border-slate-200 dark:border-slate-700 flex",children:[s.jsx(Fn,{text:u(Q.method)}),s.jsx("div",{className:"flex-grow"})]}),s.jsxs("td",{className:"px-4 py-3 text-center border-b border-slate-200 dark:border-slate-700 w-20",children:[Q.status==="success"&&s.jsx(eu,{className:"w-5 h-5 mx-auto text-green-500"}),Q.status==="error"&&s.jsx(Mm,{className:"w-5 h-5 mx-auto text-red-500"}),Q.status==="testing"&&s.jsx(hl,{className:"text-yellow-500 mx-auto animate-spin h-5 w-5"}),!["success","error","testing"].includes(Q.status)&&s.jsx(Ex,{className:"w-5 h-5 mx-auto text-slate-400"})]}),s.jsx("td",{className:"px-4 py-3 text-center border-b border-slate-200 dark:border-slate-700 font-mono w-24",children:Q.time??"-"}),s.jsx("td",{className:"px-4 py-3 border-b border-slate-200 dark:border-slate-700 font-mono w-20",children:Q.sha?s.jsx(Fn,{text:Q.sha.substring(0,6),tooltip:Q.sha}):"-"})]},De))})]})})]})]})]})},fh="/",Lb={en:"en_US",zh:"zh_CN",ja:"ja_JP",ko:"ko_KR",fr:"fr_FR",de:"de_DE",ru:"ru_RU"},mh=async(u,o)=>{const d={},c=`${fh}docs/${Lb[o]}/${u}.md`,m=await fetch(c);return d[o]=await m.text(),d},Gb=async u=>{const d=await(await fetch(`${fh}docs/entry.json`)).json();return Promise.all(d.map(async c=>({...c,body:await mh(c.basename,u)})))},Yb=u=>u.startsWith("zh")?"zh":u.startsWith("ja")?"ja":u.startsWith("ko")?"ko":u.startsWith("fr")?"fr":u.startsWith("de")?"de":u.startsWith("ru")?"ru":"en",zm=(u,o)=>u[o]??u.en,Qb=u=>u.replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim(),Xb=(u,o,d,c)=>`${u} ${o} ${d} ${c.join(" ")}`.toLowerCase(),Zb="fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50",Vb=({open:u,article:o,onClose:d})=>{if(O.useEffect(()=>{if(!u)return;const m=p=>{p.key==="Escape"&&(p.stopPropagation(),d())};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[u,d]),!u||!o)return null;const{i18n:c}=ne();return s.jsx("div",{className:Zb,onMouseDown:m=>m.target===m.currentTarget&&d(),children:s.jsxs(Ze.div,{initial:{opacity:0,scale:.95,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.97,y:10},transition:{duration:.2,ease:"easeOut"},onMouseDown:m=>m.stopPropagation(),className:"w-full max-h-[95vh] m-5 overflow-hidden rounded-2xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-2xl flex flex-col",children:[s.jsxs(Xa,{className:"space-y-2 border-b border-slate-200 dark:border-slate-700 p-4",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Qm,{className:"w-5 h-5 text-primary-600 dark:text-primary-400"}),s.jsx(Za,{className:"text-lg",children:o.localizedTitle})]}),s.jsx("button",{onClick:d,className:"rounded-full p-1.5 hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors",children:s.jsx(Kt,{className:"w-5 h-5 text-slate-500"})})]}),s.jsx(cu,{children:o.localizedSummary}),s.jsx("div",{className:"flex flex-wrap gap-2",children:o.tags.map(m=>s.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-primary-100/70 dark:bg-primary-900/40 px-2 py-0.5 text-xs text-primary-700 dark:text-primary-300",children:[s.jsx(Xm,{size:12}),m]},m))})]}),s.jsx(ma,{className:"flex-1 overflow-y-auto scroll-embedded prose prose-sm dark:prose-invert max-w-none p-4 cursor-text allow-select-text",children:s.jsx(cp,{remarkPlugins:[rp],rehypePlugins:[up],children:o.body[c.language]})})]})})},Jb=()=>{const{t:u,i18n:o}=ne(),d=Yb(o.language),[c,m]=O.useState(""),[p,b]=O.useState(null),C=O.useDeferredValue(c),[g,x]=O.useState("all"),[j,h]=O.useState(null),[S,y]=O.useState([]);O.useEffect(()=>{let E=!0;return(async()=>{try{const w=await Gb(d);E&&b(w)}catch(w){console.error("Failed to load wiki articles:",w)}})(),()=>{E=!1}},[]),O.useEffect(()=>{if(!p)return;(async()=>{const w=await Promise.all(p.map(async R=>{const Z=zm(R.title,d),I=zm(R.summary,d);let fe=R.body[d]??R.body.en??"",Ce=R;if(!R.body[d])try{const G=await mh(R.basename,d);Ce={...R,body:{...R.body,...G}},G&&(fe=G[d])}catch(G){console.error(`Failed to load ${R.basename} (${d})`,G)}const Ve=Qb(fe),K=Xb(Z,I,Ve,R.tags);return{...Ce,localizedTitle:Z,localizedSummary:I,bodyHtml:fe,searchIndex:K}}));return y(w),w})().then(void 0)},[p,d]);const D=O.useMemo(()=>{if(!S.length)return[];const E=new Map;return S.forEach(w=>{E.set(w.category,(E.get(w.category)??0)+1)}),Array.from(E.entries())},[S]),L=O.useMemo(()=>{if(!S.length)return[];const E=C.trim().toLowerCase();return S.filter(w=>{const R=g==="all"||w.category===g,Z=!E||w.searchIndex.includes(E);return R&&Z})},[S,C,g]);if(!p)return s.jsx("div",{className:"flex h-full items-center justify-center text-slate-500 dark:text-slate-400",children:s.jsx(hl,{className:"animate-spin mr-2 h-10 w-10"})});const M=(E,w,R)=>{const Z=g===E;return s.jsxs("button",{onClick:()=>x(E),className:`px-3 py-1 rounded-full text-sm transition-colors ${Z?"bg-primary-600 text-white shadow-md":"bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-300 hover:bg-primary-100/70 dark:hover:bg-slate-700"}`,children:[w,typeof R=="number"&&s.jsxs("span",{className:"ml-1 opacity-80",children:["(",R,")"]})]},E)},Y=E=>s.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-primary-100/70 dark:bg-primary-900/40 px-2 py-0.5 text-xs text-primary-700 dark:text-primary-300",children:[s.jsx(Xm,{size:12}),E]},E);return s.jsxs("div",{className:"flex h-full flex-col gap-4 overflow-hidden",children:[s.jsxs("header",{className:"space-y-1",children:[s.jsxs("h1",{className:"text-2xl font-semibold text-slate-900 dark:text-slate-100 flex items-center gap-2",children:[s.jsx(Qm,{className:"w-6 h-6 text-primary-600 dark:text-primary-400"}),u("wiki.title")]}),s.jsx("p",{className:"text-sm text-slate-600 dark:text-slate-400 max-w-3xl",children:u("wiki.subtitle")})]}),s.jsxs("div",{className:"relative p-1",children:[s.jsx(Ym,{className:"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-slate-400",size:16}),s.jsx("input",{value:c,onChange:E=>m(E.target.value),placeholder:u("wiki.searchPlaceholder")??"",className:"w-full rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 pl-10 pr-3 py-2 text-sm text-slate-800 dark:text-slate-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 transition cursor-text","aria-label":u("wiki.searchPlaceholder")??"Search"})]}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[M("all",u("wiki.category.all")??"All",S.length),D.map(([E,w])=>M(E,u(`wiki.category.${E}`)??E,w))]}),s.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-500 dark:text-slate-400",children:[s.jsx("span",{children:u("wiki.resultsCount",{count:L.length})}),c&&s.jsx("button",{className:"underline",onClick:()=>m(""),children:u("wiki.clearSearch")})]}),s.jsxs("div",{className:"flex-1 overflow-y-auto space-y-3 scroll-embedded p-2 pr-4",children:[s.jsx(Zr,{initial:!1,children:L.map(E=>s.jsx(Ze.div,{layout:!0,initial:{opacity:0,y:6},animate:{opacity:1,y:0},exit:{opacity:0,y:-6},transition:{duration:.15,ease:"easeOut"},children:s.jsxs(kt,{onClick:()=>h(E),className:"cursor-pointer transition-colors hover:border-primary-300 dark:hover:border-primary-500",children:[s.jsxs(Xa,{className:"pb-3",children:[s.jsx(Za,{className:"text-base flex items-center justify-between gap-3",children:s.jsx("span",{children:E.localizedTitle})}),s.jsx(cu,{children:E.localizedSummary})]}),s.jsx(ma,{className:"!p-2 flex gap-2 flex-wrap",children:E.tags.slice(0,4).map(Y)})]})},E.id))}),L.length===0&&s.jsx("div",{className:"rounded-xl border border-dashed border-slate-300 dark:border-slate-700 p-6 text-center text-sm text-slate-500 dark:text-slate-400",children:u("wiki.noResults")})]}),s.jsx(Zr,{children:j&&s.jsx(Vb,{open:!!j,article:j,onClose:()=>h(null)})})]})},Em=({words:u,className:o,filter:d=!0,duration:c=.5,mode:m="word"})=>{const[p,b]=Lg(),C=je.useMemo(()=>m==="word"?u.split(" "):[],[u,m]);return O.useEffect(()=>{b("span",{opacity:1,filter:d?"blur(0px)":"none"},{duration:c??.5,delay:m==="word"?Gg(.2):0})},[p,u,m,d,c]),m==="all"?s.jsx(Ze.div,{ref:p,children:s.jsx(Ze.span,{className:W("opacity-0",o),style:{filter:d?"blur(10px)":"none",whiteSpace:"pre-wrap"},children:u})}):s.jsx(Ze.div,{ref:p,children:C.map((g,x)=>{const j=g.split(` +`);return s.jsxs(Ze.span,{className:W("opacity-0",o),style:{filter:d?"blur(10px)":"none",whiteSpace:"pre-wrap"},children:[j.map((h,S)=>s.jsxs(je.Fragment,{children:[h,S{o.current?.scrollIntoView({behavior:"smooth"})},[u]),s.jsxs("div",{className:"w-full h-full opacity-50 scrollbar-hide font-mono overflow-auto p-2 text-sm",children:[u,s.jsx("div",{ref:o})]})}const $b=({message:u="Loading..."})=>{const o=Fm(m=>m.globalLogData),d=V(m=>m._secret),{theme:c}=eh();return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"fixed inset-0 bg-[var(--color-slate-100)] dark:bg-[oklch(12.9%_0.042_264.695)] overflow-hidden",children:s.jsx("img",{src:c==="light"?`${Qr}images/bg-light.webp`:`${Qr}images/bg-dark.webp`,alt:"Loading BG",className:"w-full h-full object-cover object-center"})}),s.jsx("div",{className:"fixed w-full h-full p-2",children:s.jsx("div",{className:"w-full h-full bg-slate-100/80 dark:bg-slate-900/80 backdrop-blur-[5px] rounded-md p-2 border border-2 border-primary-500/70",children:s.jsx(Kb,{children:o.map((m,p)=>s.jsxs("div",{className:"flex",children:[s.jsx("div",{className:"min-w-[80px] text-slate-600 dark:text-slate-400",children:s.jsx(Em,{words:Wm(m.time),mode:"all"})}),s.jsx("div",{className:"min-w-[80px] flex justify-end mr-2 font-bold",style:{color:Xr[m.level]},children:s.jsx(Em,{words:m.level,mode:"all"})}),s.jsx(Ze.div,{className:"flex-1 border-l-3 pl-4",style:{borderColor:Xr[m.level],whiteSpace:"pre-wrap",borderLeftWidth:m.level==="INFO"?"3px":"5px",color:m.level==="INFO"?"inherit":Xr[m.level],fontWeight:m.level==="INFO"?"inherit":"bold"},initial:{opacity:0,filter:"blur(10px)"},animate:{opacity:1,filter:"blur(0px)"},transition:{duration:.5},children:m.message})]},`${m.time}-${p}`))})})}),s.jsxs("div",{className:"z-10 flex flex-col items-center justify-center w-full h-full",children:[s.jsxs("div",{className:"fixed",style:{marginTop:"calc(var(--spacing) * -15)"},children:[s.jsx("img",{src:`${Qr}images/logo.png`,alt:"App Logo",className:"w-36 h-36 mb-6 fixed rounded-full drop-shadow-[0_0_80px_rgba(0,215,255,0.8)] dark:drop-shadow-[0_0_80px_rgba(59,130,246,0.8)]"}),s.jsx("div",{className:`animate-spin rounded-full h-40 w-40 border-t-4 border-b-4 drop-shadow-[0_0_10px_rgba(255,255,246,0.8)]\r + border-primary-500 dark:border-primary-300 mb-6 dark:drop-shadow-[0_0_10px_rgba(255,255,246,0.8)]`,style:{marginTop:"calc(var(--spacing) * -2)",marginLeft:"calc(var(--spacing) * -2)"}})]}),s.jsx("p",{className:`text-lg font-bold text-slate-500 dark:text-slate-200 absolute mt-40 py-1 px-4 rounded-lg font-mono\r + bg-[#eeeeeeee] dark:bg-[#0000002f] backdrop-blur-[5px] border-[#90a1b977] dark:border-slate-700 border`,children:u})]}),s.jsx(Fb,{open:!d,onCancel:()=>{},onConfirm:m=>{V.setState(p=>({...p,_secret:m}))}})]})},Wb="fixed inset-0 flex items-center justify-center bg-black/50 z-50 backdrop-blur-sm",Fb=({open:u,onCancel:o,onConfirm:d})=>{const{t:c}=ne(),[m,p]=O.useState(""),[b,C]=O.useState("");if(!u)return null;const g=async()=>{if(!m.trim()){C(c("secretRequired")||"Please enter your secret.");return}C(""),await d(m.trim())};return s.jsx("div",{className:Wb,onMouseDown:x=>{x.target===x.currentTarget&&o()},children:s.jsxs(Ze.div,{initial:{opacity:0,scale:.96,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:10},transition:{duration:.18,ease:"easeOut"},onMouseDown:x=>x.stopPropagation(),className:"w-[400px] rounded-2xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-2xl p-6",children:[s.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[s.jsx("div",{className:"rounded-full bg-primary-100 dark:bg-primary-900/40 text-primary-600 p-3",children:s.jsx(xm,{className:"w-6 h-6"})}),s.jsxs("div",{children:[s.jsx("h2",{className:"text-lg font-semibold text-slate-900 dark:text-slate-100",children:c("enterSecretTitle")||"Enter Secret"}),s.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:c("enterSecretPrompt")||"Please enter your secret key to proceed."})]})]}),s.jsxs("div",{className:"mb-4",children:[s.jsx("label",{className:"block text-sm text-slate-600 dark:text-slate-300 mb-1",children:c("secretLabel")||"SECRET"}),s.jsxs("div",{className:"flex items-center gap-2 border border-slate-300 dark:border-slate-700 rounded-md px-3 py-2 bg-slate-50 dark:bg-slate-800 focus-within:ring-2 focus-within:ring-primary-500 transition",children:[s.jsx(xm,{className:"w-4 h-4 text-slate-500"}),s.jsx("input",{type:"text",value:m,onChange:x=>p(x.target.value),placeholder:c("secretPlaceholder")||"Enter your secret...",className:"flex-1 bg-transparent outline-none text-slate-800 dark:text-slate-100 placeholder-slate-400 text-sm transition"})]}),b&&s.jsx("p",{className:"mt-1 text-xs text-red-500 dark:text-red-400",children:b})]}),s.jsxs("div",{className:"flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400 mb-4",children:[s.jsx(tu,{className:"w-4 h-4 text-primary-500"}),s.jsx("span",{children:c("secretNotice")||"This secret will be used for authentication. Keep it private."})]}),s.jsx("div",{className:"flex justify-end gap-2",children:s.jsx("button",{onClick:g,className:"px-4 py-2 rounded-md bg-primary-600 hover:bg-primary-700 text-white font-medium shadow-sm transition-colors",children:c("confirm")||"Confirm"})})]})})},Ib=({...u})=>{const{theme:o="system"}=Ax();return s.jsx(ip,{theme:o,className:"toaster group",style:{"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)","--toast-description":"var(--popover-foreground)"},...u})},Pb={show:{opacity:1,x:0,display:"block",transition:{type:"tween",duration:.2,ease:"easeOut"}},hide:{opacity:0,x:-24,transition:{type:"tween",duration:.2,ease:"easeOut"},transitionEnd:{display:"none"}}},ev=()=>{const[u,o]=O.useState(!1),[d,c]=O.useState(!1);return O.useEffect(()=>{document.documentElement.lang=ml.language;const m=p=>{document.documentElement.lang=p};return ml.on("languageChanged",m),()=>{ml.off("languageChanged",m)}},[]),O.useEffect(()=>{dh(ml.language||"en").then(void 0)},[]),s.jsx(s.Fragment,{children:s.jsxs(Mp,{children:[!d&&s.jsx(Ze.div,{initial:!1,animate:{opacity:u?0:1},transition:{duration:.2},onAnimationComplete:m=>{u&&m.opacity===0&&c(!0)},className:"fixed inset-0 z-[100]",children:s.jsx($b,{})}),s.jsx(O.Suspense,{fallback:null,children:s.jsx(Op,{setReady:o,children:u&&s.jsxs(s.Fragment,{children:[s.jsx(av,{}),s.jsx(Ib,{})]})})})]})})},Am=(u,o)=>u==="home"||u==="scheduler"||u==="configuration"?`${u}:${o??"none"}`:u,tv=u=>{if(u.includes(":")){const[o,d]=u.split(":");return[o,d]}return[u,void 0]},av=()=>{const[u,o]=je.useState("home"),{activeProfile:d}=Ja(),c=d.id,m=Am(u,c),[p,b]=je.useState([Am("home",c)]);je.useEffect(()=>{b(g=>g.includes(m)?g:[...g,m])},[m]);const C=O.useCallback((g,x)=>{switch(g){case"home":return s.jsx(tb,{profileId:x});case"scheduler":return s.jsx(ub,{profileId:x});case"configuration":return s.jsx(Hb,{profileId:x,setActivePage:o});case"settings":return s.jsx(qb,{});case"wiki":return s.jsx(Jb,{});default:return null}},[]);return s.jsx(Jp,{activePage:u,setActivePage:o,children:s.jsx("div",{className:"relative flex-1 min-h-0 overflow-hidden scroll-embedded h-[calc(100%-70px)] lg:h-full",children:p.map(g=>{const[x,j]=tv(g),h=g===m;return s.jsx(Ze.div,{className:"absolute inset-0 overflow-y-auto scroll-embedded pr-2",variants:Pb,initial:h?"show":"hide",animate:h?"show":"hide",style:{pointerEvents:h?"auto":"none"},"aria-hidden":!h,children:C(x,j)},g)})})})},hh=document.getElementById("root");if(!hh)throw new Error("Could not find root element to mount to");const lv=gp.createRoot(hh);lv.render(s.jsx(je.StrictMode,{children:s.jsx(ev,{})})); diff --git a/service/dist/assets/index-DySAOzzf.js.br b/service/dist/assets/index-DySAOzzf.js.br new file mode 100644 index 0000000000000000000000000000000000000000..1b5ee36bbd0241ace6a8b7387695d32a81532814 GIT binary patch literal 82223 zcmV(nK=Qv^ZYOmCJ+@t;+$I7$(EnviZS+J@6K6Bm0ra$mc@A>3`X7|@GZ~?(s!2uV z*rxA*Ak{UKLor$~WrGSOPPL&H>USDtw&iZhqGW*`c#t8n&qW)pu(JhPM|CSB!S6H$ z8J!_W*K)dxpBl}PWjn2mKkZ+py$TD4NJwN01X%#6Pusj-_IB9Xd)wqY z-C5RdmH&MWsY4B^tndbyK-x)w5TxDJRC~Q$sACL0#1^tD6a??U8`|~#=o?|_baglFS^+Yn99+>$lXRI~174or8H0-gFPivHzrw1{JRfx`B8TBXLbj$KBdn*wt*n~O%FPnP0s?$WZUWVbXvyf8N z#i9G6@EjIl@PhRg$0CIuZio7*_GP(~$nD^x3SFYFXf;#j-e*J;i_+?~B#bB$6gAez zHvjf}^S^$Z(`S0`-JA6JLWVlXZUsq|Ovi|#Cc9L+fokIHVygDP&rdjYIF})2bt)Zl z_GFesIHVmzfCo}0yf(<*3+S_!`tRq*2#waxwd3QGW*rF=)Pi$uoQw2g?Ld(z$OT_Z z?d?^ouV0c_H0r@+?S=T-HJq5`je;=C72C34+7j5UaX9kepLB0uQOwM)N_Tx*^UFk^ zM-;dmXpL}Fg~b-&jo|;k`J|mI7S?? zAWIEWdhdah{#%s37p2m(`m3w{tlePN!yZf3PVLRiPlh1t4J7^VN8LSggGu*bFl+Vq z!yZZj1?P=6P4;~csafZ?+U~0NY4Q^wkcnR#dW@<6p(g~S0H#H}-w`&nz zQf9M9o%miFT<<0xJz|6X)?@B88Kccki>*$5LM$q7s(WOBMP0(O&j$I-?CSmy6`ws5 zQcH{1?xwhG-r%tpk0EOXOJz3;R^5%U=4dlx4Uis$YhR2wv}|y!KH;m>itxdR~ zafRoWl{;>pODFV^?pri?XnVpF+=$E=<%P~0m3MLzm?q*IpsbfuOd(~IQ!7c;^!mIE zr@|UfA16}+mq}b@?>d8=Iu=u?oLnSK38uudbhN0jQrCU3b8WFA1{Fr2Q_o2 zaO7Z!|Ge?Kg%?kcL^_-W)~48IG|zcEO(O==i1-rmZ=B+|#&M7HIO6Y1#KWaSb_ecD_f`<>X4K*1klkpz1sBl$<@a7VD{Jp|->wdx zzGfK=SgDGj7?I*I-@Um0>+0q11$)X*yA!jcTZJ9E`1|)CFZV)=pg<>}aG<0L6;-E; z7qsxO6((OX=UcYOe_DXr5XvSikBM=I3a=%dq-glHxT+ULQavUA5RhOfb9L(%WOWht z_;Y#Pilk|;Y`<{rlI4WByT+~(tWjiokMPW@>Z>WcYb+nXF^4u}jTu4{rH3JqY*|MR z35Kegdv)MDPTMY&RKnCTAl@37IFJhY_p1jqq}f^o=|(7$&g=V!qlM&nZK5|O+I*CO z#zsTd_Rl%BcV`Ym*5TcKR2|P_6mH2%<_5_;K%W!WMY6|<8axgH(c8r49XcE49y9OzGs<~#HAkiFxZ#1nt&SLgrT?iXFx6om^M zT@e{I1~cT-fqu_E&aC=0-p}jJj%Q00J@J1WMr&q#q7_oTfL0-iKW!~b9QFEUCO#C7{VcF$R(iL7z(S%{TMENw8AAxWCjy~yYd~9 zl4Ee^J>;ruZ7dPH3puA59ny90SKDK*G|2u7ts&@r;lgid$W_R&&ixx(ZA%)MvqXQh zyoy`$)p@Ijd_pvP7^`v8bf=M2x>&p6f@GHWestX@!|DS`Q&K2R?HI28`ex^uOi7HUH&j8e{ymW5d2#1%S@}YgS@G9b~&pSa?2>VeTB95O|08Z!AH` z!sCw>+ytad4$C6j^h%q7dGSNy^{Qr90KPAmcMXzmKa>7w`*}EiW5IPthk`|YYu<6lhwzv`ewuNd~dQ0Q|`>JZVcoRnFs(7Ks77#7vaRG)~Fs^KU? zH+GZTUvyFj@D zJ^F-PHA<+|9T3obU_hN=GeP46h>%xZ^!-S=vP$S`bQ~r!E=4s2z*{jN4U32;z?jjb z*pH#u4^!+h+YNfmAZb7#eW&t<$G-Kvk$V)6dN{xuVqGQRyMMaeCF~< zgq^Th57AeMxTBmiMqm&C0hTJRLIE|HUQuiI`t|N7_jr&Zj*x*^8VX*m5Y35Lki`yB zi`w@oh{#IL@*&3da0~fHAH_0(oR#maCC+`F2h+7}QVx;iOo~;^qs=Ja%FP?#u*-a( z*B5UE|59yhw~IaVTQ%+i0$ufD?elu#T`lWQVjLvOcPfzSA~)y+nh}uY{(~Q_m>;xy zKYMS<^;79db#VB23g8MYUA3y2Ykhx2mY8UTX0ESa(wY2$W)38JlkTVZZDnl<5l(u` zJ3ONP`zsJ6xAcUs@3{W?`*_9i(nIShB9$)pE#12c$h^?1vdX0Q@t0(~D!6B(H`abN z{jB-inPKz!Dii3}W_3PS(X+i(p}E(`$l!`traa{;^MezJFsE8N=AwHaz;q$i)-TuA zPkYdG_KM`6OOW_#`o)-+cK+u{eLhbvJ=fI`hCbn}P4URX?d1x&nDUPTk6Y<%@7hdw z$QsMf3Xy8+Kf{z!?qh@UzYX2Y}0a$@a0cFGPFIFBrNeZnUZ<;Zsy#XFj0L(7ll=WlKA z^83pXb-7<+3Is?jf4AQ(*nE1hzXUt%1R6jsqD+_icM(0s%g((qTS<{`gQcslP{hAtj%d_ zz@I9r>h%to{T&vJcJHYfZnIItO&F;oQogSP2$V~U$-|E=NNYdF3EHvJ-w{i7*WYcW zJI5^ZE#=jp87GYutn13E|4~#8-Wf1hF!4gfZM6M)2F3v>VTVnd`kn30lu-*z6xaUn zKG9p8b6z|b2c`l!HO+crsccn^FZhZ~cY1B!@tlWh>UGeIQ)?LwUBvuOO-zUK;>#Lv zjo^KCjfI}B6LwQ2PVYKmrVE4?+8w4;CCJp#woQZRNx4e3h*MA!9mAcC-VM8mx?V#x z&#L}Z6q(Z$K?zHc4XuC%ypA?Kg@UHWgPPzGDo zU#q$uz=#Qc3pBvd>gOjU@T)5pCdTJDTzJ7LFaYZ(gCr@G zh-N7(^w%q|>F_uH_AixUaaj)1!oBY%z7!ZO^uwK1z1SWy8dUGaPIx%OYG3U1>WXn! zly4Oms@Gz-#1pXW%VJ~AArUl-eGpSZwJvr+EDB%xHgJ0^cE_`~hZ(*>56@ewl%UQ& zi5q04)%2pf|2)q>?-#w&6Q|vaI5s&_OdzZ3mYz7#RvhE1D~E}x!!?spvJKb48Ea*= zLW-uXn(?zt98Uw)DG#0J6oC$XEEq$hD@wOF*z|$4%GnDXaW%P|1BA}A5zYuk*O{>> z39AI=@gkKoIABSVo_w^N(*~sD6_NfnA9FR-6L`)B#`3w}vm<)YjruI<#vZ zNFdV<(w0n1ZuK4D>0jH%gw_;7eM!Y$G_dq4Qa}B_7PU`vjDuaUUMUE=#wuO~Q$tl< zhtjsH0@orgT#_AUP%#(CoJL>_Ur@RW!!ScX@De=Vy@I#HRjL&=Hb zynE$~PdVTK?MShpI(EA65gu9)rBLvT+ABi2c7YnwcN;+V06DA|SI6!x>2cWp@&Em; z4*&YofTQ{~x1ZmRUr+*j_CFa~xaW?Nt=AYU`Gx;InEm};#2?!k6ZV-|gX zXF8Hr;gk9>UiU%LT#5p%yp$Z9B`xp23L90bg@Hg}-^vJNPHWw4@-e-N; z$q9O>TJI(I?Rek+J(z?JNd)STUmbAN%RgI!ghj@!Wd> zq3CyJe>6L(BQL zRDXVaDuJgQfLuc9ntNhFNJJzQr!#Bua=O<(qSYG^D8NB(c-po`c~h;W(`+UJN2BKA zP-Eaqh_3gvl4X0%p+=Ts<8sp?Sz97S@x-Z_={DmVSkS#V$x{WzROT{bCRNOb0@boq zsFf~HO-%S?*LC4|jg}G+K>+mX#ydyDpCAOF2`SUFLAiC{x~PXC74+NShCKPQ|Lg5u z4ysrGDZirW9*0zVJ6(2Z~@DO;Y8;#)M* z{sH-TsCoS@bMcX!5hI)_aq}{~HR=?T#9Lr{h_&LaFm=hTQRkPqcksI7YiL|xd~TTr zAp+=V2i@yHN4$ji&7vCZHER1suL6Dfs+<=uQDQ%$>_sus9fS_RWvyynWbS0`6ULf*6Tq7a4^4eIO65>y8X zJrSvz8^RUzo@3(4%V}py04CvE(UH<7+Xa4_iVcY_u5#jDvv80v;B*B4bu}70;b#pJ zo5gB^%TQr1+zY}kMCO;w=OnA)!?r)PG!^9vARoMy4o z6#J0UJ|f6Z%FtOy0UncKgW*b|^08*aoMD(*G$1u@mLv_=MUj^4`n_6?&IEMQ=j8oi zNYi_hhX3N}_sP%S)9<)bO18FSYD<;2MCg&`p6!&Leo8HIm~YM@;!FiUMAq5=?GRO* z*@=cWqm-BwjQPL}2JKMiSbhbl*JgTe{1?~}Lts=!vL`UKz~9=$Mk{6ykG}vQH&wH- z5U27<)oQ1YpLxr5b`3RO7pfe_BJwpAY-bbl7V889raYRhbZ$Ec6GNq*t$e^XkX zj1+!0`GU>cisq`4wtX~Z?!C^>(Q~6dHqNzINQUle6=0-@FC(F0_CHPHMm^ZgFx$<5 z#9vxEAp3@8lRsj>-DTwT8#iOwBGkC6x#GLfgkuF>BN-k{ZN*nrT%@pE3Q}OKU>ttr zqktCsuwsl+(K(z#jyRwXHs{)A)1mUbbs+YsQq7yMfA~xLGx;ClzwVfwQ!PCc{Tn)EEmK$}blZ%4mMZE-{ z`&_gCbUU8jm8V}GL1)Hh#_MEYB77MYGLz@Z9Ce~S2UE+-aR0RRauE%plR&I!si;NB zq>xGmo)^j3vZ{Bw-9RzU#BiE+RSRa7X&3(w*nyp>rEN@qHQ&(G)#a)IZ)P95JW2Tg zUE%?n?R+f%eNn+vWH2lh%=wx|Hgg)v_c3{*?K*(g|8o?*H2-_4H3sQiUsqH78A8&-;_FXQ=kCzK-O5Rlvg6-o}`JninMM#+SV;)4IjKW2#}~d{l)f z-GA7&Mw9K_3zP#Z*LV~2BVkF zEAMuS<0;eg>G{WLK0n0)AjDU`Ja6E9!X*NjjY4!4aQ+%$jLjK@lk+$KdpAU(;O~|4WOgT zr^_|liq?)OuKcPohW)4XwmT>JtwI7IrVk-(zPb7L!V{M^*!u)L@M~&V5&%6Di zyyucgK}P=SfbjA|JJt~c6k4|@b6oP3$}Cb0#?;SPWJPg_SZ1mmJsi}x?%I7bY-Ata zdoF-T>7%e{*cgJ^$f1jf)r}nL$A# z0g$E9>U0k^D`h`UmI5VA2DPoh%+26y^(D4rldeNP?pJl4^)p#wTuzC=epX;}MD^Z? zeK+HuFky}9vt1md8_6d?1CKneAKk!p(kd8PQm2MEfWA0EN7>`3R5upFB0MW6rIZoR zmEk-HL2A{+lw>mpyBd%>=7VW#45yc}9*z>KF1rcP-PqE!HQIP&XrglMWli%~dHyJf zD?4TxP-7YT{uD)$3qt!cg>be{&j&PX84OXN_Y>z*Vt(A^Zv??PD{4eBG8F3(id3<% z>VFNJe^?y~BUjyz{nWp|{(pV{;oJA;FIsu#H8*f?oE}uwf^JH9Jx-$Y_0Es(czhw$ zm93!vwqs1dIY6$^$hMp{*(rSAoNJhGH%^>m)E7yXB`AlM-<)g4nTzcwbB-OB8+Sm+ zvWa#;KhI90C_xmhYU?_DxIlBn{C;>+&g7+Y8ziz47Iv!)GanpCFK9pjMoR=s>@J0; z`4v7#T`P-b0MtaLgum(hW-^ri1(LqQz4HMDLNNt zi?MkO;e*cmCdI1aBTAXE&H*#*d}DLd;(Re)$stSt!Xk?xuEBD@p~D4QY|qQ2Y1LGo zBcl)PjaUW0A`i#?C?pZ61E<23U~FY_Xxo&CO=5%mL#_)xJgRm|JGZyz(XkMUV?C2H zzt|=1@bc=Gl*@rj@x7Ks02#5`_6>0u5goIYcM9+9Ne>IUYLk6dTVO!)R7GGGDY%+8 zjXoT`TqiuLrFBa6mGxiJ$IVje72l|fmg0Nd?&U9WBKLSCMnLg0h@ZqaOE~h1&=w`~ zoZj&$O<-3Kv`I~IQus>>VYPB6Z`GD6T1DbSL}zHQYNGNQonJ}xadmO#w=)cu0|oH3}Ojp>uNL(P33x%Bzm|>UCwquPyK( zUX_vV;Mxcis~5KHaObP&&$;%pv%^x0#M&g8#{pRENpB@^R${Y30mg8Jfrgbg%YAr*OzQNky-uQZXh1DS-Ea%1S~l<49DQ{Mb7S5DW~oL<5Rx{AJfugbh+eBxlXXeUjh5Hf)=yG6&>dgg7| zzvij(wcB6y?AdUF8E{k=#cG&rIBz_*$IHf*EYE8EaNf3~_Hn~$b&U_u#7}(k7d}-7 z#5h%NNEJG_t!}!V_^WtaO`-syQ+2kxO1t?+SGC@Z@^i~jm+dhm@9BS3XXuw%ZSB2o z)lo{V+*j!ZQ52nP|S?ce>jj>g-%sihGVTW`VVp9?@xTa$~pwSc=C!-&A&T<8Xw~lA?83`LQwRP^2+FLsQS9gFtR?QyJFh%{3pIU zAs_Htv|!{?KSJt9K=?{o`_D!BrFb6Y;hsCQ$73BXChE1P>Ub|EFk-ix)Z=TRQ^?w?x{7b|`(Z)tkDgJrGiZbpc-sLuopv zkm{mc@XofayDy3==Aa0>CU}V)XZXk? zuFV00ww7Q5teqOZTM@pFWe{cOX6<&rHARF;W^_PUG*c}-M&xh6cTKofnLMb~4A2_@ zp((14CD870<|_pLPz=y9YRn-z^T}YI`XV1qKu9zN zP+71ZeXqzo6NM#|&&s2s^GNtl^;g_eVB%9M?lXh$gWVV^9l$SA*0L*nt$=tMXsK z|1lAcD&z+tjSkaQkY>B8h&Wj{C{3$2&(Vo5_e;u<2qpbt+MHxb>$5Dv4&`XGNZZ4M z7C>x^ykkl6s6h-&HUnrRzUUk|G*R!bibj zgJiYb&Dqv)I_{SeKZeqMCn7jb6YfZ<8kbiG0Ue#zTk3iH*wEsYw#BmOHJ(zaZG{DeEXRj5)jrj_U z@P#Jn!bGq!k8h$$Q%ZLF*t?ER@APD zM_364gU?evl(vf6i#=6#d);-R$3uI=H4nw)EJ^9q)i^)o_6bShIgeG2l}BNuYkbUt zc~dZ7iH3a*QW9ADy5d#f7LOBZqEy-Vvn}~NX8~fgWN}==HLDd5rw&+>lbXPhxbfkT$1py>@m_q6@oG{^~AtvTc%fcc4KCn%3)gsSB+x?GgU9rBcx^HY)H zRWY&d3fhhRw$xFtT1ln{L(%S{u{=;7<5+VrDfz-w8Hwz+t}!MoCp>=>i^fG$NDcPB zPhwF4*W#GSF;ZJ|WG}}p_5v+%AshIW#U59EEnkTiBO_oDzD#$({&3^DRXy5OHgwqA z(mu9sgf=KBkkeS1v8q}60(13%-x#dAs03fC^kq(e`S;GSbnsO^f78B7FFU)irC{uQ zCEedX(4WHHW6tc8D?U7$PL=LS!(;g@5Jxyf+8sI5D7e}BV5^|Y+LDXJK&{Lq19>!GNFP}0X-9=O{9S9) zTHFc>_loIOZJU%<)eQXNgWPPq(Ies3V}G%I{b$#E+GnBsdktFq7#5JW?KO{9E$0BO zUhV!Iw)|er*J;_^^}%GxWXCG%laInglQR_qWZN~iuN6&E|Huz-yPgj0!VQ$E)M)zRw9 z2qA;YRq3SirV46c=3q5rIH!N58trF`MnXWOxWdHAQ+49DO0SmU36o2?KXFri<-L;Y zaVW^h8M!4!6zqJb+wu8RVV# z0+%}f%KIn4H?F4~R~7v|0an)qR%}f{lZ=n*^b&02w?C_Dr+gjd_9l!M*VK!bo4Ate zA7K;>L4z&+rF;$J`5IvA69dJ8=b|A0^RHYq!TG=wxZM`l#NdP%YPN9@>&|Wn(wEax z0{{X}XDO#+hA4zvgDJ%7%-p}^@gm{0U`W(i6pNQY|eR3y4+S@#kKp^?v9m^YHX>9 zdcYqG+@|WwNw1CUwJL*mCZb})fIBDPwFJVkxzHigPoCk*Z)cQjjM^KK(dELIk6n`= zoTvnA4WirO%rq!rg%3es0g=XF!w= zhxljdr03c1MWK39(+U1Lgg-+Q7LDLWZ9tO$k|~=!SlJFxJ=m+M^Izw^ zF7_(bxGrpI=YM{vU#pT1@br|Ikd2V*1dpM6p=Po4G}JJ)Dn(%b*FrA@z>^6x;(-K&W;X0nGo!Rwa!Y`4?HqMA z-xG`1W%6qeFx!L+l-~0?BH!o|3(0o^X|Qq)iiBy7`vI=-iDRm!RJh9z%wq!SRLfde zUA1;vpC?ZAkwpO01&t^K>p|Gu_mQn>!6e283T~F>6Rf-R;qdng>n6s>Lz+YRGdg&9 ze0nv^wJNle>oW`Wix^CIW@T}|3 zGBB8!Xg*iEiQ#(k!)zi4tK)B69$uFK(XN6)l`W<+%Qi+uBs2(?Z76@+LPJe6VkCi6 ztYHA1Sy~$NFx6fEI+n6SSzKr<{j>w90WV;;u$=(3cZj~G{e|LC@Xa84H69TGE63iYoe+FRpPHnOPkzRCRaK4|tPj`y_F*<^s;xnkGWOP5hU zgA#sShOqcEl*@;6>)U|G?6sT2)CHcUcgvX} z8t$@#uYK_V_~Kc0qqr=>6p$KI(NVj)@mnTEk!G3`n7U3Nu$#8rA=STPz{QDYx48S@ z`#*8hA$@kzt?l1QoOaA6t%ho6YqQZn2*yD{bYXYXBmy1~N|Lie@P-y}xPC}BC)#&# zSKo$xC1C&yuc(9!8Cs6+(mofiGeU0~hL%bRfY2^yYRKxcP$3(*$Q?eqXGShxsAE*r z@xa&Vo9!z4HZ8x#Ius;=e|v1GqxPc_zCY5GIOd;!Mmy7RZsYUVGrC|`Vf*An{GPh$L6bq2)na z!27ORx3PJBp0KiBjm`QW|rt#FfEKyD()7bhhDOFy@HnGQQn%n z$b+lox9RVeU(=i({!e(v;Xn0}57L)jLHyeD$+Tvt-j(IdWU9viDW+Rc^B4PtVxj55 z!3%OwkI~HmOJ(n(0X9_+Fc4nCU(eyED71i~F{Ygx=5pyaOe7?s%aF|90*CH8s(Ikv zS{nk&Uj=DUYtb+7Cy%FExDU3aTdI!?^G$Rt-KrY2y%1Fsqa91NVCU?5!$PanRBlQg z363Zpzn_YjOdO%S4J0o5ooqN)h-AzQLCv%Y8p9t1?PwM&7_d67Pmjm>`xF~4Gx;qb zKEqwIH6|lT4v1|@(ZjJ0w`b`$W9|DYf-BG?P)Pn>dx1M*YfC#zk3t;f-s_?2A=cyE zrxtgaOqxgb^2uc@IA(--5?AIsiW6wSbcLyyn)l4$9d>WYfUfJ~u}yy9*{Pyju9=6u zr_gzJoh2J~DpWf8p9=aGJ{VkCSg($5Ebd9+ePrv!w_ddUTw^1sgaee<;|c7VTh2Tj z;r#20RNi{L=9UGvw;@maF|YV0#ZZz(B9`Q&i+53i^_T)5Jd0%u@TXzf7$m2bO`*qh z>qoYrv*1+Wb7Dn09O>f=%BWP}ZPf7n@UEMbO=eLDmSM;^ZfM&&xA|~eYu1MwK=MTBYRyrGdgTx(7h*#VyDIm7MJTWBx-WWa;vSAdE5eh9 zHip3=F=u6SJlbOXl4-K+AO3o7bg&ifANLQo;d(!#XNveKg3I;IKU>X4?g#CpR-pB~ z2CcOM>J7+YVx>*3PmV+I9149AcgB7{s^JLpRLS9Ih@|Ezr(2AR3>Z_u>?2w`&VVqn zk?&(U!akr|!|z-s!C`&iy9xL?vF~7&Zhw}5D)MReL(}efU|Eo)j<5QO4(CyV>mrxP z?qIhlq>~ImjmJNwB&b&Jg<96K;8$$}RwJwR$?ghF56}3)*QQeccR!X2K6fm8_|`9Q zRo7^mBB_~J(nf1;genHC$S#vLFRDrB-IASB<-6PdfBi+a0xM;QQ|r@< zG^8apalK}Kf(#eI_t(Prq3lv$VcU%NhjI>k0?u&K%JRM^X-V70o1c!_3fWelyf5Wb zL?HC5@A^+NgsODcE4(7+mbAI)d7?{=%?5_Sv{L zKN?3_O|KW1+YOBu=rY_@rV0NrSa5YLJ>WGW97ltO9*Y3xoJwlofjo5zm^!1VUA=>a8t;H|4FC(^KxYDHbP>Tg`f&?^SuB*nV=;A#-Y#a{~GF4Mz zg+bh#k}$ugpi`S&f~%a}7Qb-0dho_3EXvR{!;(-yPP??8F|{8KWO&5(YPH?j#CDxlCf0tgFu8YLhy$8Si<0;tCkFs`FW z{cZT#jV+g3k?4%*e-#%Zn=?qhHSV;C^cVBHPTcC^&j^tmv)msdK^w;v#hUTRim_!zRK_fn6tng&j(8!p^0W>uG~ZyBBN_ zW%rHkWb>H(PDuBJB%|IIK)_FVm9seQ`>IKj;<}I9{`4{sASZjt0L=84+T~v0!TYd# zfrcj|-?404d!E|41G0!Lojb!xnhLZ zY?T73ciD8{kUqU6Y?c<2@b3H|PR1qMxoh$_YoF}<*sJ~Qb9*Vc>z>Zm>mqjxY?d(R z9g6Agy(>h1YgY({4fL(uh?k@=2LFhLXPyhBI^()PnR1#9dOEj9z4QqN6M!h4%LXAj zj7!?o=PqjrTt;x?g~CZKU*>C*R$nF#8?&_|tA`a8LA?DRXhfT{36WBs#MPp$^j(4G z_gv{}(+WgmcHs1xx)ntfwbHp(i_1FLV(``T`Wk{AzyDL_E4bz)tV!4F|5V34eUwQk z!4kao%uH~w<&bfVVG>K`UN~_@6H|L(Gw}fj95r#Um##pQ(3|>VEpFHZ^_||jm|T`z z2~&YL>A!2BrgS3S@V!FGWV0Z2aGO^b+Q0{O%aYLL^W-(pKl|u$d|9wb-{P@b8xrvb^Si8pRktq+B!ia(O_@6K}A;Z$iM0NzDvjlN=Xcv$<(IyZ>JCsDJ1(Do-Ns%kqFGX!_nR z{M*ZO(0K5m@hZ(Q@A*rB)wl{SI(AbM2rA2(teGfI!m2AgM%4{MZ>=waj-m7rBVNh`}{BaFU!j~u?`4eIDuo`QcJisSx_Jz zyT2;=wlvzPUQGu>3*xqXB^zufnZFDcmkZ)G*DS+eScx_Byl*>At?I;>xtCSF$yORH zw`nB6YMMBKS!CjD#I3vBk8#M1X@aARePB1%MR82T`t!6hWvzkxgj;cLUKf}e>`D26 zs-gYHEIO$P9?8Yaw#rJ1ymHuz1t{j~ODw+v56fcK^KQ`orTzV9D$P=P(N?{%6k58# zTRG2o)aa1|-@dDJWe2{(!w}3`&=R6s+ML&XZ*Mq;7d>F$7mL1ua3?L<7Ih$f*s2O> z_4rK$doc8d-43Y_`cUA*R?PW=KJ8O}2#aJJHKq>;W4z%}$cM^!jB+}!|Lz+}=skV^gxcYdjz8a^`6@z*J~vC{fO$A< zr9*7RRPrsM`GZ`wrhZJfN(W?0=6AU&9u{3k}R)|&=77MgG zwVC?wjXCAP2C6{;C$)P#Ey2f$8!yj^7daGwll{fZ#>-YFy+GNS(jyPqz6|8@g71vj z+#QT}7r@Xf2}A*Bs90%r%F2<~d?7ebXVuh2^9{ifuXCuUUUJ zP;KbiuX%=ID13+bx_FtETZO-~ddxeQCK znirQ|(9~7hVSBcNXSS0!iOf$GDNV|*h^G~e8Fj*rUh>N^-?>J-b|$5ubWZiPSnpae z>Nbhd<_wTmWA^dQk_-oau8}Kj0gJQC&{gOJ4o`*Z*<5=PMJq867`>e1e4YqYLAax; zENZOCYz3KgX|(-utY@+ZlhBtw5nrAuCQLoe^#YDPvMoi*p_dP5HH!SIRRyUNrvS#e z@nNJY9q_COCk)0DdxN7TV_+xKpjYgi7#)=qWrATo!*RfHzPI~713^e9L@CZMVUQ)x z_c0&4ki?`P6%&jmu)|CAVNhaM501BdE^1t>4)RtqehhAGT={nP$}PP@bY{-ruNziK z**F?2Dw-2-<{TKc!d=wGlGJ6i12eczz%thr*tXYC1mU~} zz$(F-re#Nsuq?T55W>h4HXg_#MV2N)bWu%$-gv<{#pH)zdI_^+Y0WRtNL=f|`2QMO zwW_Ee{@RfIjBGYx>p(WJaw_U{kL!(J)f%GIut{Txp|XStn5*c1Rcqa03h0)LBtlV~ zh6l#yQzzTpFp1;tOEC0$z5yQ6>P`lo7DRIHfLhaOH~d3a{Dml}jGGhYAAQzc~%+iV~V z>h&LQ9?8MPGFk;R0s5+HJsIujTu{D!S#en>U|y?}Iceuxvv_(tb5-VLr#Mz;Y76J6 z(v{dAdDoT#18#W?0rtEs>|BE#e&W6+cmMfxXDFxP83E@&TjEx|DtrC|IVL&A(x zr^j?n|6o#6cA+2CZzLkFuv!T-Or}GUgco%2JuB2iJ-Ay(_-ypQE9G>AdE z%jDdc@$AjXY%d(cR%U;EYdBoUG9v@9reZAp4Obbebsg@mnj@Xh#Mj+lje#_)!R%ML%ExErtx_`zAh_;0rS& zT@_{pUL2Gzimw|rJGWJ*%8=R<1xA}BXd(&&jN>)mSTY)acLGk3!77_^2RGn3!O#%NYKy`#<8fwgRHAPbR)5s0VVC`B%yul3M+Wj0LasZd+lV)5}p@ zdAsB^C%hi*ifeD;_ATl>IwTOtFo#Lj@0tWP@2u~#`0LzNd$MxG|1jy(s?N~pYKi}v znBo1y9kI*MxFsCdF*-YFi3D0O@es&tvJ#om#+0~8zvK@Ql~yeuW6r^HQs$>mhNl$; z)o27urJ96}I7hKkHSZr6#W2wm@($Oe!^28Mv%-%!&;?aAZ+QjLU7{?4EK1eqfgosO zMsD%g`6RcF+`E&^*wg_x8e84?E{|4r_(N;Ez-|^quu=1Uk~_62W|hB2{uT~jT8qu! z>xOJP%W~q1>j+U_hMR&UdeNG0;KboDIwxOEw=0IvRQP8TSscp;o!uz5S;0mQzbe0t z5LOiamYq@`56F>H0ueB5f^jrQ;7RAJ&?RdhhEsKvPPs*970kw6Z3b$a7mkcgYkk-8 zoX-nWuPNt~@DIMN0Y(O|X|2$r!58d+HA4hke(ijma6h_CYYKT2Vbn#K+-?c_@Px+X zZwn7al~KTgLcNuF0=_JwO3$}Fi&l;ccqi_DUYZRDwf~IHEuJ&b(Nl1mo(NWtl5lHX zQ>tmaS(;nzOkqChEDV5Ljr~ebs~ZZgEo3O05k>+Fh2tssKwCn#KGQNKi^&w9VoL?L zxL@`syEvG6-Iz0q)t?wydy|1z>a%YISEpq|%9y#81}^gq2s?tIO;ReY@(w+O5|fkU zm&*zRX`(;lvgfgCl0uh*=zx#fpe*tQpyn7N7U0Er5gzef6$LZO)fJe0+U#OrSdf>< z3UK9fWrn;F{Q*iBxm$QGBe~20b6Dx0X%5)!HzVaL7U?^`7$$4NT}cd(Vvb{0ia+p! zr=@UC^AN)&If%^#U@=$(RFq)NvxEkuwXn73%0QKJ3k07Qge3vn5krJw2shqk5pC_% z0&bxHjNQ#EGV03^fCxbPDT5;U1w}2GY>)q?!L+Jt08@T3V8v=}%Fa(*_B=jjqk#=3 ze)Oj)et#M(J3S@#fF!ySO&Nc_=NS*<5^{+R=JkUfUD#rx%#LB-R&+)Zp<`klvadIq z9lrNm!*vzcK#(yA)j4AmmvQ*_YENL+)&?S8;Y>yq`Moe21`_g3qa%CVe9S=a=!_~5 zP!W^@$^^rnxAu_^)A-5Q3;!5^lu)ms2Ufd~T5;`x(fGk;%H+Ka!4__S*w0*Y<`SAq zYKS)$Cxn-(Uoy5IICi_Q9w{Bn4sXK+Ly6n*CP4~8mW$2b!1_pH%IFlj7zXa5X?~hY zD~TRZ#^xZXXX;I9u8I_PSR1ffLCX8{Shw~QHT4FRFL0pv%=%_G!FshCczjRcCY1FI zzJIwc$uR3XJ^w7!<+G^Er>n~|>TPT65vcVFpm^Wm4=C-2Gj{ zaPM*wKbJl%ILr*a^^E`Nnc?*rhu28P=8pwc13kP>_^_gP$p2%RTHf!Afl>`OALRvD zWl$i%p*2CGKtNYLBi1=l4Yj$iovSDtIus`is1r)(X5ecB0Tv5x6@SdCr*5~&%4z_9 z575u48rZQ=(4@>{<``QW5GrXlpBr^H2xzN?Umtk`D#vao6Jh{l4MvkFhP#SgGbZot zcNJ*YmaMxDz^@5c?PKo0Sky=9+B@z3aD1`8MukY zx-h`Q@~4Wg4k8XmXd!?jZlpNoa%RX<05Ix2@y!IWVX#AZ_jx8V8bw{tqWg{}CULTs zwXUDhF>ps~XS!*?&}e-hn0Dcc>OkbW5gZnvRLb#NUkuqJG5kMtIr8VW(exlqN9Sqp zg3Ql^8jSbxvK!y7bS&;Rd~3=O?2)f&ACgRWQt-6P>`)LZs^8w#R_q|zqX(2@cvCtA z58HOKt5}U?pLSuB>36I3vnrOe5Y}7a;H#Zh*?LXm5&Y#l+zo0R(TraJE_2d5yapr0 zLp8VQPPME--al%26C5|_L=CefMwQdb)kYMb(;Sf)Z*0qgA;L0~`ojen(Z$E&xpB0N z&yjsdXGADI7N)E9Kwy8aZdb%AIJ&5=CFmZC}2nV7VN`9B4g?6i#_OKJ#3JTd# zT=`|N!^KWSyU{kn;%I=lmI8`u%~py+j3^N-46y~~O29Fug|y)pZQ5bM_>~nSXTzTD zY|fx0_%K_*a#n?6m4a|!q(_=ssuxBYs#&60#8*81Eu8yCvm`KMK`Lb6+U~ErQlHwjgfG?Q#Db#zAJKb1Bm~k1h9z>dZVx@C<)`KEp=}Y+nW0l?HVL zyLYk)PxV1I2fOB)pSXoRR3{h!-6M|5Fwu}#bC#~x>u)@`XUvSSnH%LwKT`4*uBPrw zd=&W4T@O>Z=|6D{^dYRIB>--0Wt387Xxg`iO|@-q0X zEV7tOj_mF2U19msOt9BTk74K)gtBzzkcU!L$RueVh8szyI1gK|C(v1CtUno>8gG?x zQL{B!Uh+2m2arYKOU1YZ<^RBuQ({rX(>xj=4U+)0q|pIzFI$4+7Wa)%usG9uPb^!2cl4g+Is z!)P+bD*1PhV6Ta!*ru%WMF4#a-6TL4z7-;Te*10%p1b%J9T=tUbnVbopff@B>!|eSV|?wr=q< z=7mGOC=<wl9j~Vc2`-PpB7OnW^Bi&k04A0r50Q>xZIC^p+5Ij2BJH(Cu;h@ z?Q)*5+P1`y95iEAhkaqG)*424yT=HPavX{}~J?O5QAXja-o>K{6<9(2#QAZ}eGvXG&0(_n@=!1~#;#LG(a!2ByH8 zRaCR9%(p~@y(j5gfA4riGltef+c5_?OZL2XSf2X0C1e2=$WpnxFkO) z6XJCB$ulj*nj2j)f}T2UKaosHS8UI=#$@=*M|qnAfRA7dtTlV#cTtb(St#ftQUu13 zTV2wOjAhF4iJSNbZ~VuKNX@>b`%Nzi)~CYClj)PQq)(qb3W3VXMFUv)joQRpa_B(G zHK(PTWL=Oxh129j=-{6v>smhTIphI=+j6zyP?yxA?g6lw2b{2T!fj{NGZE)I0x~5l zY+DkC%ppSwYXS1bv09F@p74jw!okDqo=C?Qq8wV()3|HtAJhs(j2eryDFKRB-G=V} zD4PVp>&ku>;Pm5yaP6*Sj6RvH#BCEDkf8EvSA(+`QjroI|0?3ZS8Bwo_Iw&|N%?ar z!O!zaf~DCluM4&pEV3G>Wus0U%IDKRtB%6&F}o$hZd*e{VbcU*g(u1>a+m-mB>F+A z|H}TjNuvO$h`c0g%@PtpSdDG`!l_kaCdP(JnYM|1-86m=3e1i@QS#@=+_?9sHK(G9 zo7H3_cGM@PD1@DSMTb0*f>4xSu#rybC}`*ypeM`AVA(?1(zBU~x@yw;Sl(kZRd(g^ zq`x~XPeF^MbK`|9Mg=FnqB(+M!uB%qTUX4T+PT`Bji!zuRv|KX^^Mk-a*BTnTLUi?vbvlh=r;W$j=?e`jhf~W_%f1thM`;%s)ju4|kM-Rhu&i4> zIk8x1*g~$wG??V1LsM@Is|m6x?vrBHDfYOsnZ`$2=Q4Z}*SRxNbQn0z!h5hM^d zYb0cWW|5GkbI!M9ERHE|lEA=o4DdCch9#1@UjdqbC^OU_YR_wKfYF@e%OxX|4`b++ zb3+j_3+c(_M+MvpL5ziV zb##Y(xi9YE5vLEQe+JYFK1VP>amIm%SIsMiYI^%Oa^U!f^*as|-FxK2-0aJ+1iE@4 zvH&X0RXg1`PDncZOUDlr4e&ZeWC6nFpy1jnNY$?r38oucE*=35T(GdE`pG#;e*r}s zvg-T_d*@t%eQn}&p(-_BuB>2T6U#xpeD4#ikhm!KMT+}7dYY65zY?YP1i`RCo@RdJ z&a5njQ7Y|6{fx~492t571Xj~~=f=wP(RCF9^^h&uKxMRaJX$G5RxlD- zg3vJ^{X=DLR>&s#BL?Kg%4lC+gX!d(b~*OCO-HS(wP5}VkyTn$`|P#T2j4Smhpk9X zOc$9T#^5->q{D!FzhV`$lQ@YcwbboC=;CqBB-2Ii)J}|sYi_{1nrM$i$LamVWv9=Cs0`mXFm^aze-S@? zqxofKUZ5{9@pR~&xDIr-L4SYs=YXp(dBlVfQioWA3!exIHv7;kS>*qJZe%ZgKHaYj zl%Q05q#L}CFxSJVbX5sp@T*4mB%^(RF;&&d=S9srhC5~_Sg#DS*^mnn;hOasw@fLX zWjwxP*bEUCvU%3;qVHuKCYT-E-N>D1jT3eYT1>+AG=61^$F*cy@UpoVtdTMj1P)qO zC|9lJCd){XL|5Z2-P!qm?BUfH@Oru2~9^*bq;>0(12{$QhS$x9; z;ERgwEW*x4ycnyl1-|D4NB>wfQPOZt6uV~UoV$Y6EDXf)&Us7?YN;D41IWe(=Co|A z-ak<_z;=obzb2baUZX3Al4>Cc1eIBTVi$!Ud0MNDAKZGLv~+D!NL5xP(LoFc z!+ab^${L+=kpRK3)`*S9a5Lsd-v$n)F@mvTS$VAJqD%U;VOZcVSbuk&>qSa4AvbNaykXB%D$u7Vb1t`tgEc|?f0}E zMd_;sc0fP2o3A}wfkDG^IjZ&xlkawmmp$wFxLMUFv7HH>#8X?+le%s_)hRBK%+fYf zj#RGpzAsFCLJz?_rFjk0@ia@WKjE$C(gn1 zi*dre$<;@t=48#)U6?3Qb!%d#UO#)Ehn#;PETJwun^u#jT51#&CR{PTwwH)Ky3Y}t zaPaRnCby!6!us{K&xLzE9jp)79k14|7>D(5n%sXkNKZ}sXPlt7prK<9E{==`F)C~L zT=nLXsGv7PqzQAze_5;SGkIPLvJrvvBNrIs>XZS9yHVjJ&)(=w(B@On<@KE}ECe2M>2hb*7)OinKsAdz($O zxc{u&#qP=Yl$*iJOCb6reiN+y!^`oM<#!>1bV8=PWiZ z3bDRO#;QB%jfQwZW1;~j?X2lj`GF)tYb0ngy-jcAE<)Srxq{%+P9zqA5ANh*ltF&7 z0z-9=0!OaGT+hzNpd=Bz`*owe_Z!F1zr3Go3Xh@V(m-~@YbXRj7xM0mRFvuI1TukA zCLfCQ=&Q!elmr@F!Ottj+;w;ti@EhJA1&5U*k+@p`jnF21Cp~eUixIXZu|P`05>~& z6x7UObblT?Pr*4aw3ewya6y3cfRhh$47+V?Il$(2|bN2`moLnn;t4zi&3H_y-FJsBM+t@9OXZ z8YkjXAJb7a=X+rZTnl8e^Ta2)>3WyTZsRN_t;Aih+4#!KCjHV0=NQJqD^bXY=7c0u zw>`r}M-a={7k6p&YF_qQ)qM|mh3dSYpLS!xMs{B#4K8p(cms`ksXdCgog}ovn!Joh z?z6KOxB-q|7FC!=5AH{uGiKxQ9@id4%(i$WT4ss}2TI>8xzoN;7ExR5-?|GrGv2nM zzO&v)@b8~6`|%#cw9^!E83kW3N74gbh|O{;_n1;Vdy=ggpEG208s~Q68;sbnDYa@4 zvVeS0>bqJpQW=%gO$c`Kr=#%btmxU#)i2s{|Alo0Vyeut>?5>Ldy3%=MPYUAD4aoB zKQe+#^nF1-?aU0>P&=s+N6*)BQOS%@{cBPr!nu3(R6p%hM}!lmafwG^q8qM)5k=BF z%Dl1on6qBf70t6IuEN6}TG*x)s`!$Hu8hY8v(Cr%&9z_6QHd{t%EJi6##ezx6u$N- z7NuH3iRDM{f6`)bS|_8OdLsbp#_{WyM>*}EFLcusUuQ3egf%LAi!s%t_C=8$(N^r++>)-S*TlTCqTEI0Kqyad zon{{O`aF&4cj3Fm?)?4Zq@C;o-6W9rn8!IT6cGNU>kPz4Q8fFraH-ExAB!7zu1j06 z;ni}~L%V%6+!j7Mqen(BQxORdxk5pr{B0|pz@1pf)KB*|8V%bOI$i*b(5t#Gk$F)U zfC~)Z16|EO64@l$dnJu0vF5m_TC+Lqs3l8uWT6rh$~3Om-g78NEL@$)z6?AQ_{SBa zpP0cx2F7<%*_$yDMtR--6*BF(v988yv~=!!X}$k1smoSc$)bh=IMvlyf?8oWWRxjM3>8-<2&a4-Gm>wp9BlYrsv&dg!0w0NZNX z;YXY?iCfcY!=Hg5>&q!`3!BW;AX~Ii@)R606yFcDf}hqfEHgU_iXsP!^HmGx8+z8G zpH5xxoe{116n_)Q>eyBNZu`23*=S=54DO+NO!JW9$hdyTe`wfk(Pp0$;*@a@MkqyfEsSQ3LJ*=I}fg z_m6%=%&-X2EQifz;5ju8-D~RMdLcuA6VzCOk9mrQQ7P|&9yW!$J1rlNzUIE)+9#Y- z^^a`|@aEX89p}O%rCC&^C}<4tKd4svVMXC4cW*0s#0bn~ACc~>F1$5jaZ@WMhMNUVP8D(1bRN!xk!rBuRf7G z;UxJDs;!VZosTK5!E~9yk+UXQoB}h?8LGghj3WZUY<{JT$gqxFo^!g}cT@DZr7B#bT2*x8c8<1g7NBS+LF~2Ae>GY8? zZ?;s`{bP44Bx3S;=LOP$f59Y0 zH`BTE63OL<0FXQeWYlrS5<}L)E1REPK10+dq+AmrYK?3h>!7tNFjL2TW|_dyNg>CL zmHX10RPxGWo3$$j#zuZlXi0z<2{h4eBb=ph?wmf zU~s(ip%Z`(2+rh10H}dP-=Nv;Yy``~`vtl_wEvrZHkc)=Nk}GRkYH@*9J8mi?wP6J zl;w#!RS9J-8|*ZTcx!gI53SVlf@zNxDi%`J+=el;Qu;H19J9v2yL0%+uI2jM^*#>{ z$7!+?WDq?(5J!dktPn+gRzoK=rxw?X+k;6Y9M~|-6`9PK^`S{J9C|2IGKV<+3S-Bo zP9k^iN}O^M3Ta2q)A7NZZgL`Qa&M(t9f?2}W}-vs2{Sh&bzz|b@yFW0k*@8&<~4M5 z>IfdAkC>Uz!!HW5i!F*Xb~Ijh@%O?G>0d$1o>ja*Lg8++qh9&>Ra$NfYloV6$)K~9 zDx|m4S@giHB-E=>0L8X-m$HvNTQ~*4zynRJk`wJ&a@QfF_un@`dqB}J#~x!g0#u8h zM>EKH0BgV%ykq2(lG~s!aO7g-AhP>iTqMKJdBBRuTn7M(or=t5^7(O37U*#sB+7Hw z+uC?lfCL@1J>Hmt0=-CUOKnc+SGlVWXV&Izb6pH4fAw6e0}@EX*0mSeneY-}Xyi_W z0Brk!;`S!^kdl~N>m~<_jksbsz`U^>o+X5WLoX#+ew_68v&JBZ;Sq*k4~N25rRwsx zTKtNLo6P;nhgG(%s4-!}Z68P(>SC#}9^0-%+N*A1DTM|I=#fE%pve>>WC+)!607FN z-12rZpPvd;oFNNEYUdP?%ofAkyQOR@drKDSfO})@L}Pu~^n|HCj#!FCF?)y4&lun+ z!IKnb%#5hvb+{2QRq9|*Q-^<{a7{l1Ks)Wfm=7)F6>b3lId}vpm}L*zY@xaFG|BSG zusCRJcsScyRrH$}smbo(nwyr%8NzQ0sxJ&iIkOelV={AJ(UXy~HefJcHJu8y+%yqi z&k$bSSz=iND&J#l7IU(Gj=`%rb}jMC-=cGN`nISQE-Cu^z7a&X@!mp1`AofwNj&MB*wK&|-al%j_C3;UZGIprk*TcO z;<{#%Slc4mC*ZBBUSzHR^5&y9N4IG^2A1=q*69cH*eD>i(Jn#?7RGG4g+9`mD5~uT zav9BpaZd{@WEv*Un5=ntFe|wk(xt)O2nPr5+miNKOBZTkwNT`#L8;9WBu+(d5IvkZ zU%qN%lqlplzjnmWGus-wk)X?VuOAKZGyr^@IkBHhzAP@zG1Ob zCCy*Nv{4RGy%K2#Z&@PJ)RW`MTwA)k|QD@9jma#xToi(p3x?DjY7%30iOaJ>6 z$`d z-;v36I{;2BXd^zn9+Nw9&+TE)beqF2ib|B~A0u$6PdoSqeT*{UK zi-ln@yrW-RZ)J^S-Nf223s4K?)W2Q^{OTh*XAnXj#UoV1EwycT<#C%0LGc59B=}xV=9RjsitN`s?W?+#{)$*FCR4oMGQ%; zGRGuIxtcO;jXLE*(f(bgIbRdQJ3uqz^@48vk74TnZgMuLq#obPrUxMztAqy4P#dvK zaLQ%~Z44N;t)RstliENuk>B`fri-rD(SlLD@s>$`%lIB2W4jf(msgS-EbXH{zS}Pa zgtyl~Y6!9;Ls+@hb_IpGr~;EZck!7dt?{aFPc=8Eod}ZoFXhC<*Z`Xq(LA|ru+q+d z`AQEUe^B^#OFD0wAxG7@6h0g-l}=Z@+=&*35Gtp6iL*X&6XC{zHJA2vw@^JUAvh#H zxPgHDdS`bd1;wFE!n}_L*aIp4x||BL&>BB(PWdaBnCUFQ+Y@OL@#mUKV1@bvwka27 zw+$UuYc54ISPNg+5Gn$Dux`m%VxAhxxgwXnoTt517FkvH(>~>;JmujB%9_g?G_3Z8 zp{#}N!hR3&>kPR4e%e(UJf~ES3fsFlw2Z|5X2kfFD3pvnDT9MsCcCa*k2_mBS5!V zpDbTllS07&6B&u0HpEOjCWKN8I8W1gl2Xa-Zh;?y9tXH9X@T1@IT01mpA5eYjX!oP zmf3v2fj{QeoF{ZceDLgdY9`%T-d_6}@6U-`oC%9ehF9H;Y2yXI-&SS2x0m!Bw1o=t zZP@;FDBq6D)fn!t&U@13nr23Iuk>5pt+E>&zrnl^8{u4|ljD`pn2)r}RZb?9l%|hq z^+_Lr>N#CQaZzg^_#J)%jpp<*B3q?~t|0xKk59Z!!!;j?4jH098i4#|CaMh0!-(+T zdB98#bXwTudN~IsMyGCP)u{+j_=y*_J!@W5^a0q{*@)dxmfgD%ty`j8AxW<#!h_h> zhH1gXdHYQrw~e;E0RPj`ge6W}v%-(XxgaZ)^$>Cevre>+4{nltXmJtaAP+Z2y#^1Q zMU(N&Vk#c}!AB5=`ZmYMhk^c#+&75X7;7U9Gw4?hFl6E^TgJO;9Qh}Wf(pz-W|yJc z9E&^hF6V&T!i|`OJZxeUjrWa_a5U3$vuwUfpmxh#)L~TY1iajnq_W@s;!(d-JDjEB z$EIyQhlQndW}_MmvQq{QOK=#Im0BsSY@T~i%7NIPZ)1gE0BUJwr6K4pfm-)TV$^Rz zeaV!ya~-EPN>p~SZc5oT0=mo;5D+*_Gj|iEu~GON$TAwI!t>P=NJI{s3PG1a^k-}J=}~fx99P^6w*F22Yt83gGBj&eby0Re8|9ps4Ev` z?tV4s=yPsi&TsRj;RI#>E2?@5XP)r<93T@g3M&HK}RY8k~Au%7^ z*{BY*41R$C_I2dyc&UE217$yyL+uBW2XEHPC%XRTt;|u&Lce(o9w8F;N?%Val_fpI z{c31gC(L8Z)lvdHsv(!anFZFgP${A#3TJXQSi2BwzSkmA8wU1@ouV5_^3*$@zBLbK zBz2X`4@?=i?IDi@ebyXuBe0mjqyg9&as@+Nj9R-BKJ+}m6C2V8qo zNuqjDBDJZZ?an*r$I2yUtQY-?`#8xr4LT=o@V(54-%39l=u=QWcSM6FcNtCkV`+=B+F%FgAT=-ICZqcla;Ve-4V{Eg-Jz3otWdL z-`BAO=(t$zCN!mXz*0|8Xa=iIce3gP{A92XjFzwkugj<$WX~~cg=tH%VM}8xv-Y6& z%Pi-7v~jhNmd1XDCk<{?m?8fPsG%U>B;uB_HQ>(}B zcVUVRjZQmT>&22@D)e&|U>}DA`*M|c>(+E&vj5yXvf0=1B!*D1@3W^3v%#2`G zyO&#m@6CBkf~gTCQNj1a4=Iae4M7KiQc!eF-?9{lHrL%!1QHnJYj~z+)buFUKg4Q>8EQF(QJ4VNRrSW^S+ldok$~f*Hj^#7C z`}ofBr6wGvsoRIUKWmoGCCSW2Kyd1_`TLSS{TYH&;H57-d~wWxn=ci5r#M57+mZnV z1JkzE6zr-Lv=($mu3@Jw08bdq9@3ts$7>B{5kLFcog(Z8)V|!iNkDdsy()h0tl51@ zRMCjhi4jpeHLZQU>x988c*+6cuvs&fq_p;vXfeLK$LK)raKdc4y(C2B8a>|r{tR{x z*NCjk@yH$Lto4-cYA2R{_e%F82Q1E_=qEWs;N7knlg9fIAqn|;nN7<0k(1F>7o<{S zdUE>(y)ATePvS6C5KwJWg$HlC&AMZ8)DT_> ztY;2)W3s}LBO0fY%t(%Bkx`6Ifg?2q0$VTD{sa5Qu*5XYVbQJ7n-FS#>)7f4bJ_|w zrPT`jm7QZ%e+~n}_AqzzN(rZmMqaP+PR_AhC+2OEiP!qcHAM53TY}o;rWL?f0o$F4 zCZ$X?E*P^6**nusL%qz>0E9gC0TUNbBuK?2U=FbO3GO2g9h)XBTA_H$cgRzwooa@Z+a={0WTrq80GYs zw%B^yegdIL&3>;OPgx4FYfl|g-qJhzi3BB)Cv0iNaj3AWM(k@JgAziH-A2fZx?*-3D0OU#53N-~CYi3v> z=BK4ftuok%VWqwgdma+GVi9Xv(#<&MO7?%!a($x_fC$ z)(_VrhkxvIKijT5_4P>->$I zeau2cXPAQfR%%b(O+gz;PZ66-Ha{pCUO(x9kpa*bH2= z432?5K{s%O6WX-qJ$ckgO$T#L&K}xfIi2LM+c~NU9jc4biJLAGr}K+QIel}1Th25%#rFQOozH~ zI)9XQvk$qzj2Bz(fl1NTfp!QdhicQbPy*gZ9|qh7mEg%}wHv%?pS_^T4pf9Nxo|6)-V+u8SR<8F^nn6jbk<-Q#1#ggakky*xhz{KAb6Av>S;dcB7 z&oo`BtjG4|1j(_^GtqRjlr692Jk!STJfbxtD%~-2{B!C5V4TOX)GKELU$S;g=yMSK zV>sD*PH;%@G26Fq7|4^7;$ktc$buN+%UXD3eMo|$B#tO|qA=;TNqVhy5R%y9kR_d< znj&S*mv3B;^RS+6i328z1$3ihu}6M0dfruj3GvRW2_B@0uL_RZBTNo#EpX$Xh3J!k zFIwiu-^GbfI#%htssrGhO(vW|Vy*MY@O+GR?h;6@^%Cl-hdJ$5Up$()^g_7xWbocY z7u;7$K9?7q%$wxa;+hEG5Pw|D1O|4BE`@p0_L}kynr4;UY%rdk379S&XtB&RR?oWL zR@$P$Mc~90weJW*t4$(Vf$zo7$eog>F}t+;#puSUBfLYT`~55qbKWFx{b!Mb#6;yE zAw-v#m%ZlUnua^)#go@I-FS$OrqanK=GZQ)*4;ezjAH=>gtnlcUH%llTNM}D3NaLe z`AtN%c017N1t3}x-?L4Grr1@CM&M$P%0~ObUbHG?(4w#zpj?qqSL4FfNbR<13*n@I zJL^l<4}c@*aw_^Pv=HaiB?Er^MRPXk%J8X5^fY&2iAw$UP5-<%;-JwuHKUnstKGH- zwmlis=;cF#fUUG_sb(hoHT!R`dPyt5=#{fBrs7*k*?n*6G|I?hthRDyx|NW4ah|Rt zRHT(i!*qB}m&@sZ*mog^D~ph#mh3o@ZJ2^l*(A#2wfdd*QW-bZn6hIBT!a(s7t#+M zNEVeQ^d2b1f6{C?DD&^D(0SBq<0OOXo#;H6r~Ax(}Zh-d+GN>$!V99r{_^)Mx%p9dI>g zKrZuR$bk*o!5TZkW%On>N#nG`$MkLst%@4g5mV_q7dk*9E@x4mNKUt)l?(tmV7ywt zA))b8F9c08A25geF-!iX-OIim#cRr=pYxVM$J(Romak2-nPhEdHn=jOXI#tL(nJ;G z^mkD%K)qB1YikhFGNHYx4UqM0VM)BivbHGhVi!t_0VqvaFd{&r;lNWPV98rZo+#T| zx3r8>5meQD2P%L_VB{Ywv@KrX8M$f#v^EDMRhUuGEC%K6&!=Slu~L-g%6daItrS&@v`}uqU^gE)trX-g_FE~$u!d0w<|65@Kq9EG+KWH1G?2LHk5Pev{ZtY%o04e@`sr=yj#QYK9pwdbFO{N z{MtyXleu<$^(#^>P^^nmG;6gN(1pNOxM7jhOx5#iaMQ8ZP3w1%fvN|y>2y?u)iu1z zaWR|S+KFop_18HIj5wLS=Gi%p6`u1f*)etCOp5^oNRklk71!8ELCs{jBo&DmpRv5b58O(}@;ru}YkbT{EC8D7Jwx+UhuQ$Ifmqx92s zvGnUsKwwXPzeY-(|w>JQ9O7 zLN;?*IQ*~nFuve0u-%JS#!^!qwz}m3X_57z3g+Nj&lS+Z99@FUgr8X%Q;UQ~7#|{0 zb{I#|_|H2m^X_f259mvnmJ3cN+#OB|<%WMXb<&sS&GBTo$xKGF7}bKNONu@ntLcE7 z?5ZskxUm*}r>|s2@!UHtXIq%V7*eA_(rwbW-Awz~T{tUb zQZbs3QKFyBpjQd97<3iMcX_n@G5JLb4mFn5_+P2on{EpikDM^1b}XBZQgv+p=U^)j zC@o*Q;pCrWQcQ755wUx0D=nfp8}95s1p%ZXbJs8dq)HOa5!D4zCe1f| z&>{J)w##p=I%nP_og%BfF@!i~0gqq53!WRt)=CJ?XxL!z{(2KY5QEs&Z~<%gY>VR4v`u09-z9=K9&VgRU)?G)qdZ zSlNqEpYpYO7SuPuX%GV_Iu@b{D}ed<+1uL9UGTH5Z(G(h5n|=R)epCP6@tZ^EbW-z zwc#SE1O`t$dz*t}fLodvCC(heIY%w!QS*l*g+rW(8JcC19557|y-#RLk3`gr;u{2B zD-k9LeU!Tfsm{_VlyxIU(}WN`F?*OP7&Y6c#-uoPv5a2VV$hjpTD@2b#R+{-OTow8 z1A~h=6*p&9b-~1#D_Nj;E6(?qt%<)qb2c_*<3y_IDd7BieU$7cyqhp*hX7ID3PvoL zf`F(F8L>yHXvNg1Lxm6C&wQNBUg_=kC$o31&*Bujt+RWoay=IN2HNptopqM}nR)a5 zFno7$fOUaK;278hHN0i)1>0GXo40Mr>7{mDc?r?~UlHK-T-RlEg`<^A4r8zHabIL} z(qA@`I+~W2Z5Dw8@mQ+P{VOF)^;hUs6z<*|O|Xx9;JRc?7$L|+JY*^8=K?huU{cmM zMP_G;3O=B>@E#EajB#c1+Uqsr@TO3B3pV1~?~xju?aqZFpPmmTy&|35r@Tro_iT5# zx26&?S(dzdZu(uo5KFwwqUbgViR=Mo?fRylBh0Z*sCAV5)~i2Q_<9K)u$GW%Q$3Ic zHtAR{!z(U=81>FZAKRQ%r@VJEtP;Y^Rqz`kt?C4_Q29L=PpjX|q+aPeA5}{U-i)s1 zm@$Gi$z?QpSCiRL?UOX2#WAfYT#mE>hCEkihiW7~X9qN^CU!=eKrJSsIwn!t#AJY| zP&r|Y{#sF;w8NT069R$zx#miQ?+!>39bc{Hf1dt%7y5- zpmX)isn}dvh$1$7vxEuDWq-_r)y;YeuXE6A8`{_O~tP$?-qYVa-{ft{uIaknz-UvSyDaAD3$A}{oz#iIHPs^C1I z+_~tdc-)fHWxwQ-7rU(r;cU5r-vhhbt*H0psc)Q$@_d(^v{p0Jk4!s2#Y+XqXheZQ zh1Ckx674$sTD0|v`sOzxHhxBI2U~YQ_I{Jzu0#|$0$r%Fq0!v{a*;!-74BM`B&Y|D zb3w~R`H^Fnz%X3AI+`3+GkUpuHhztx>L0ZC*5;b@0Rn3gX>M0m`$~3L;Y4mkuL#Rn z-GFdEH~G(3K?S?Q`*!wsg%KL&#D?}3YlU@KG3>fOG;KUqC!*Sbk)wpGf`MiL4?4FiT&~F)8@{1jnnagh4>e%pi-s!z zn6soPT#Z0`=U>}ff$w~$_0MhH7WcFT?fy(p(~V|s7lwj1$M){~AT%C8EF*pPni!T7 z=Ig~@^+kZc@q%P7KH_>Iym)h8ZgVj*T2FKsRv7Ar@Oox?dkTT-Oqur zyIkrpa4EoygZ#8)UnST&k35dKIkyio7Fxot(qMregkA6_)ugunFvE&ra`|41LHL)p3a7>xT8EI5Zf@QlB1w+Jjxu9n?r876hPUJe*yk>WS79f z2(=_eoY4F8lQU!csATbbC7nh#h z#}G_{;H)HB2PwLaU>xYn{SRzPlrYM9r%VUQss`Sv-4@bP<1ws&@VB>c`{5js-bIK; zXTd-6e^5ByUOCA%){cJz(y1-PD8>iQ7O2%|sG*1_s$j-89(23=wj#KuyQlo;N3=y#oGWK(uG|E`Mv>y99btL+}Nu85{n&=CK&82kS6HX^fG1kIrQ*T-vJ}=kVm+=_Jt-%D-!iS+F z|EHFx#~Cu>BBwmhYdCQDzTpyXCE8!umV!r*tBKgFf4_$nThvT9bFxn*=P_%`hUaQG z`*oVv;A=YFr}#3|@T#I%^17wVwB9Nax+(zb&M)u}5^80Pb!+nTie7I`_Z^#Hvk{eT z??#kO7IJ=fPkWJdfMaLl zZtz>mLknB_f}q6;mRDf-1=E41`Cu@!WnRK#Mwv@fpTX<%87DE^-llatjgCv+%JS9m znI?v9*vm!2E9-kQIY+`9St4g4U7E>3wQm&r^#!gQfiVH*6LGUxrONyxEM2%KS9 z|IhUG!W>fKWO-lQIJo4^tB9m%*xSrETNm*UKrR_T(@y@Y5F_JRpp{|4~es=+$G%2yX+fdjT z&#JV_FF(D=TG?^s!E7KBl*uv4D>y(&N2;RevEW6FLcu1h4MQ#$S%aI8iH^U6&C6Ao zSK(^y+Q~RH;|g#YL2M_!t}%l&)joWCK0yyMvj7)XyuG z6j(ldzzfC<*L~LS&q_Q~qe{m8ge43pQd8J%a;v~CtQ2=XkZgwegJh@HEzskkkzWiTl zoK$YMz}W@=mtet{TO&eIB*=(nokg9f!}dUTTc)Lwmp-=XT=yyFtZLHmi|4p=GvOmj z1~Pih&cX@?*D7n(&0P7j8h7k!Np6C%_FM}YZ1ZI<$Ff~ae;TNZC$(!`qPtnJ>bxF% zC@rH=I;VgB2OMbkvTrwXSyeNxfF-M6!zcEz z{cV07f8$~Q_p+bFc6L!1;fPy!PI)3NPx$u4>ruaR4so2H%=9@KTXZzK@b{lob6o0w zCpKxxB|rHl7OFGv*_Ql`;@S{_T0wA^@aLzg+LmBq&ZGeGOL*b-~Hu$IYD zdt%5rj;8lUBWkKlEQ%vhuM_6?CicN7md1hI=1H>x$X|>zs*p;G^c-f*eZBfX}5` zhAB!O8W6TyVenooRjOS;i?*1n&!~y+DVom;0Mf+xJ*)%+<(L+j(S2Q7t%)RG}QGQY$$9#@HjSsS|7C-ds5y!Uk&SF2Q^EF_-T>99>U(+ zXIuZWr+=4}^|iQ+@BbMZuHXM*eNxw7=D7RmMN&Pmh$*w~5bsT&>wCZMnSG();wE3b ze=C&*{B|CmRDf@|ve<}+p0o+_g&%e#-3yJ6-Z+ATzVWQcTxi^EL7x=xvMW_^8^j{beZxn?kqy^h5~V7Ry@PDsrPdAuUEC_SP|5Mmi&(TlAy98EF3 zUakQ5s4q}Hrn>vNLD1R{oVVD6_ZUyYiub^cE8#L0vK!cPxs9eJ26fY8v{(nPbDci> z^|I?{A=vg+fj4C%=`Q`k%TiWg7YnV*teZ`TE*Tn&Zqvsv;F(y+xO08I15rwAS{g)@ zmsasY?{|B+^G8SE&2Vj3(JYVo=#5?qXiTR3h%cN3Y6WUJyR)e_cv!IFCmdBsf)*$& zSFiml?7K`BIZO+y43J~ButInh#pTO8{MiJ{#GJ0cAA#(mr=y&5f-Sd$j^l6I&;{Ax z+Tw+ZM}N}3NIGsc1eSMVPtbZZZ`1#|M6ar3En&bGyiBDtmLh`OsIu|bx^ulA@=a;c zIaKX<+w9ONDi)iS!ew;b(#ci>ngB-YB}CIaX!lRLkZ5c45UFN-Mh0HC-RO0$jcT>< z+_`_8sz_e$=z*UktLEz!9>9fCXi=-$GG#AoQT$Hy@Uglnvp=JM23u7}-GXQP%wig; zF3JBF)>}D^KDH<26{7Oui0U(i1dxxO!%0ey(oqZEA?hdAksLuRm64}f+-#oLb|wID zn9C^m9y58J3ZPge++ioTGAxBlhkxye+F}SR zu@lONp#W|+I0&kw@FSC`&T)Owxc+0?J#qYqZt?i9f^mJwbY{WEYUit#H7@JKEpkI) zVHHDT9}v};HM5>xpS@xlfVF7K0XBr>2fbR!h>p(oU z+WOh}63O}QneW|CEkm!ad4#U&ktcjGKnH z6BL*4qaHavRM)$ItuU$1TuBqQH9xNt9#|@9%d3su;|^7JCHW85pwn0{?+40KbW~g| zyUQOI*lv6di+!5Jdyp$f?*AXrc#4%tFIu&49hF&O>h`GImn(3bzDt`TVU93LbouQ!FICfBe$Y#xRfv(hMRTC+ z9ladw1Kxhs+IOx6txAj23D1e`J`mGos$SCyfs^k z*D=kXN!Vs3rp#Ab9oMm8iu#vCCdjF|biG)+wc?Vg*!eVqdn@^82VIyq+jm$bwhFp%(KAOj*S-|F@?QT+7=G2 zsWkR6}h(fMqOqu%Vf&z>qv9UjUPY}oC(#E^_QeywTsM#Mc?QDo!?-xd6``Sp> z(IQK0Cy)Lioxn%wwp~;{3Et{PwO_Tvyk%cKAhWEDH%8<94|z-v8*@cmtIEow&|}N5 ze$NjJpS2Kv{tcFLwTGw$taU_$dBU7_3)#bTAn)pgGn8?AzXF*LgmZcBzf|i1FqmCL z++YYu-G1GD8xwgWG4m5o@aqp1?X1vCOq07}#}^*j4vQ`BWmz>-ni73yB0aW`1qcE zxw@kHI_vm*)TUGB)obJ9zs8-D-kIeOdhYrM=&aDe6wA-6o>1FSNv#5AO|%g{Mno*F z)jWe}$HfXQ2Tt0DR$ZoHs6+@7EML~8_xv^YpR5l4)>JJ@D|p#5Zl)q>zNT`dvPi)w zid+s-(KmIOw^r2}xm5u-074-%v^Mg$$Nky-FJNB7RdiskzepDnQOEd;<@L58lYOV4EG3mF1wE@$aTCQgg zx1RVXVsFqLmt;p+(a`p>6Wp$7&|F7=o$_OnzQ zwz)zYlE!GV}C@iB}-fBfU zclOMN97|_s#b=rK=0;K2ptRmf%(kPY52@$S&+!WHtS1oE%lj>W%~px8%H?5tdj;5o z9L`)b3b@o|ZXhjI8JMeusVVf!N&EQ;Zy1x?EvHLcepGL#gB=T8FGuQ6-wVS+Ybkr{ zCEc4p^ibH4&o=7ke0khe9jTipxJ?5@{?A*UDvi|+x3j}XY;&%0iq~ddcUW<+LmGa%oY1P|&BvE7SQp^pa!`E;N))Rh5_!MZGm9Ve!g%islP8NL@M? z*D(&#uu0exH0~`eH)U032FDwJiM%klz)&KUok$WJG)9>DdxOx3#SWirzv98t4!VM; z+e)*FON_oSZ02lysz4|! zYn{N;^d!W^l5TrG=HPer%4Y7%sjq9)Vf910dv76QA^5JN0~mFQSWl7i zS#g9pD+tUbDpUJ@P1xr+g}sx0L0^g;Z6~tVbM-a7)j%(`?eY3CI*p!TnLTvnrJY@u*tzuO z^54y3>$7pcv1IfAsp(D6O%-u0#EZ> zsfyg!lYync$J1ApXZeUP10-He?s2$5H8EMS<$vT3cs+DE5Kay(c-%3;lV8q>SPJi9 zzv~PH4B-($`dzE^mq36Z@Kn_6QOB-=TSbD8ND?so8Y~vo25XVZa&7JuWpFV71AD7fuWcH>SQAQy_cB;;uY#-R+J9B1kN35m?aR8PoDOc%7nl9=TUe2)O+P9C?QdU4M8A%SB7Y9;_D=o3f@6A6)ZsU(LE z-1?r5Bg^=pf?J}bdP(#_@@CzRw(9MDYezzqhKwcZ(JtuDrU!wDR@-LFsVyPX_sHA zHY%xI$@G?SMLPb~@dXLxxI5;2Pg4AV!0Eo;uUOyS=8foJh!EE#?7$AiY3aO+C}P3^ zUgJbFfKjC_^c_Ls(8x+0!}$2t+?F^CU+hQ zQhUQWp#UY-NS?2}HG(&58x-mWFif<9X$oq{Ng`T%Erb0YoBtj8IGjM(QFuIfW5@A_mh>$M8x>OkW>ovyr^QDeKc`6Lq9L$-n_L^)>G^dY@{`Gx|xLkQJ@dYzDCEpt$Eh ziL(A%E$dt4uhJAJF4aAb@2p46%+`bd@skI(6mm6B{-Be|hZBZP=_vxZig!E(5IRHQ zQB{qxRZ(6kT1PR0-+a76L}=K%?aOFj3LTnl%iT=AhS9UklSR1`Q7IW6bZYP<1KVEL z0Px&msJDtDwT{~5d_T?$^c0_48^HXKkd{zK(#8}E75>(cXOpMX+qISg~WZd^HD7&jT{)^m*>q+J)&NrR^HIdjhSk^K?U8HW`+VR_ zPl+y1p64&s+0Bo36AJ!n#+-t$ccpKE%!1+q#;M%*d08&S#sHgdt^oX`()29s2ocBJSD;u2$DKe*Hj&{YLqmprINCZ%V|DiGG@0p`ukRepLjQYDo`r zKe;?RLJ*o2l#cLz{0_NJa9GealR`NOP~=&&7rjI`G@r@-*M26WJCW+9qtR#DKHe?* zOV0poah8X@5WJ^qYXwNSf%~o-Poh2fE6)pt%Du^OJa;8{;f8tXkSGTr6?VV5jqT-I zAR{U5Zta>j&Jj|ryA5DL%_^ZvBv6s~WC{F*$5j(}v^6Ye4+?S^4kx~W;K~|ZWnrwV zuno9fQXh8-|Vkqdj@fgf@-j;wJ&8fr#5acxWI~K#H(v68HdSldxR%j zt=f~ip->yY&Ut&%TPEU`byUU(Yh!@mZZ;)(Qu{2PP*e%(goiC4Doj&T#04hT#El%J zwJT?Bz+K+E04W*l)BTq~mJ=Nn7!{izme}Rx8(a$OH1ixORhUNR(1iy<@Cc$-{Q16Tv^|ONj zP+itI3qK97{$zm|T(Ul|dQ!ccri11V#s;X47R;BioBX)Tdmh`|JJitIfSYJH)-iw2 z00Ycgk1^l*G=&>5W?1UD`hu7g7DL@?C3`AVZql2>Okc5HYtc0uP@(x0Y_nZ%Fpdbt zT75}!$lUzNO!x(r<6sjYcS6+zk~V*ysAKiF+DrdFv7;B3zb@3M04QmEKtvbNV?XV% zIRIW!^)lebm}IZ6cHTc4m?^N466$zgv>JM*PJCQLkm>kjw!}pRY`vJyIhd9^ns^O$ zdXX$CEHxNetcYQ)4=5mF$8Q^H({?3|bC~ zCAo<05#2f!5`@C>EZ+3oZX0RWTG~#H8rvL$Firg%e)PztuYggnK~S7trV|=~_D67~ z9;zgNiJBKYk17J5=~m6kZkVHsbT0$B%6P>krauI#&BfcVlKr7-K&XzU875BM#%d!$ zID<&BGS?*GhIH=M9_|Tu4v5YNc@m8;)Rq$vjefGI=l}EVp(jE^Rj3NSg#*$_K(?6F zh1}@iJz~jCdRSFb0zZ2~7zGw&NhIcrQ<<9ZcQv97Yf`6S&JbOWlNX7OMz9iF2!5Q;6e6p!>>=itQE)@O%ol z7EO6mg2jia9Ii;B908EnMqj!2 zY-zy`z~xfhKPXq7%0;`6C2f9{%WtHyNF#uVqrk})pP==5yBKTr%v`(A?)bz%w3u~^ z=%SHcnwE!{NCh;#p9v5MO##KB3ltgPcG>0i$Q~6}4+FGnF#9%)O-pJv5&<<9?OgZP zk|ZOI017QKXH}gfFM4TmjFcA5U@$gEQAXSr79#$n)=GZ1a6pQ5R0^t!+h!P`eb*il zPT6RI2ye}4wcWSohfHIQ%wn5#$ z1DcB8!n@vHWU;sQKorPRXpKh`(e?Lrdi7@{X$J$}$v z%VX!bgRt2nbvK%WE&rltbBbo{Y7vxNaQ>G92brs@`A4l)^=F-W!wm4Xeh-_b`X#4_ z<{i{fvoT*&&V-PmZTY&q>~d#vu(Z!%y;`S0Ny-P9INuEf!X$@Y=Q(lF*STbR-J7M`Mc zOj(3cLQN%yjrFmiqFycbXKH=G(!t%xZiM^>v*|J%*I49RMX`dw&!x)Y_A2~6JZohU zUXnYKEIh@+++fazOMgtSkxyFw8ub*`{6_IJ-RP#bVR)i*RO8-r?_`e>67O7Eu3hMW zrmHhn;wf8zXAA*PKjiQbwNOJrvNHh~r1f^M-shSJuc@Xw!WB*MH5b_M%o%f=BfV^< z`8j3=N)$-62%TeTcQ=&z0-E$bQy7Vw#uB~Zs<3KwUljmSu{Ma3OMP0RWOKZXK04Bn z+5AG*(FEFt+D4d4e=<+i4cgh2dL3*7Htfyz zA|3Q&R)`ii$O)u!_w$VN8ogq6xBWKDQ_NkUs1g*h6)2w3L|jVJrO2$L5)52$XT-(g z03C97{Kp#4V${HX_~@I?SN#Mt7&7O-Q$S3h6ak#DP(neV2PMct-%+CbWyzaGL~S3l zuC<!228CRa5Y|jr#d@68h^9^j8xN)l1^Q@3_^~Yc~Y@ zdItk0ltSoZ%{qXgdFF~XiN|r+e&PmA^laer-*Z2!l!C|(5 zxS`pNXw)PQr+qF<9%M-u%W}^8Lb_ls(NoB~-P~Owyd#bvF8gOrpGte6>O7n)_vnct z!sM15UnN>>l*STiZVWt7#{*oPFv8l1t7)365(QPlVilLm>epy3qND7N0h^tp#pyKZ zMY0(;CQ}GRtw-1xV|_iw%os)N9!=x;pWfBSV*Ao|RzZQ0*(0(X^Lx4%>&1I7QA4G2 zkE`hUj!-wENFg_LaNF;wTl1(Jql^3$su+uG9rb2};WVp{X%5(7&^Bv5AKYqq#WrSf z}3TEB8#^ z#wF>>zDB0xTutod>aiHVoW{g44b>??a1V5bC{T0^6xOl(d17hDv1a!*r|9 z-S{N+baB}ns$WSZ@nruxky6qTOsVV(1l5SFjAp1;xuyI;{+0PZsN3piS}3aYSj+R+ zI#?d}Z+~lwiWAIUu-lL{=I`Y{($C)+-bO=mCk=L9YEcY2UL`OqOG+YbX6^iL|`Rg@pAHFJj+Np{hq>~&kb-aKVGk&H-oR^EtN zzvgDp-#e9#?of{K_tJDLe)yLL zL`OX31tne(!#|DsMm8^xCbNGKfJIvQ<L93Vyu&dfMx+IXG`wl8WjuU~H1D~Eq_C5Zu!Sq?lig`1VLgXl$M zbBXh!tATAAxv>t$ejF~%P#Yhz0FfUyn22%DHrou zc8vu%Pz#tz*8K5Exf*8|4Je(c2zhtHWG&D>8d`T8e2$dSwhO6ZRbe2jdWUB5YbeX9 z1(Rh;1sZH6?N{8%0&XndC@@o_BWS?w)*Qp<^wDK{Lq9Lo+vs25W@zqJl;3qRWSa^W z*ot6rOvM!BWT=}Ks<#2>2W{gvmS|!Ft{-u08>~N%f*2Q|d)#r+jgA5N(>-ra=q51N znXaBjT`{b_mmmonj_>9c=?E?1{SqVif;^-4y~qoUk=k`RoM19#UT|1~Fwn!0Vh#J5lto)t8tm^O+rr(GIVp za+7MQ4D7haux(Nh&8OPR?JRZRnHWGQ>N5l3AC5vqJ3N3xN=kpl$jrJAfYOy`V`HE( zESZWK%RcOZ{{i~{2IO=l3q`oVoqp0=4&{AnXP-(N9rh}$a&H_SBom&7~ZbPx40hz)6 zHywH)2_R87HzsbxKm0=%ap}klvs=yuC|guaLzyE3bBO0L#AJ&q6H4y=>V&9~23?OH zk<1(lYDpUvED_9v3N7wniiVC5K);;UBk?5@Dh{FLX-mU#{qEsTG;?Ihq zTwBkgNb}&47&m^n4h1S9Q?kvuSy>F1Vj07yVC;WP$U4`->G0sH!|J`0>%uFkpASGN z25@r4yAB}R`A!zK@?7v44r@d%vftiB3++jJ<A}#0;g@Sn>Ap) zfv&!%UUG817#kW}f39q|+mzgZH`LZ+G^gCqdGc26zfQ$^XBrScuWItYP)98a^H>h)b}%{|wRu^D-Wn~f**;IeofGiFP&@M4WV&2F$7SCnM(IsQx~@ErV_ z7pb3lfEeG&jAY!xh7OM7Dm?6Gq=O*ZSYe=cg0ey5jn=$K$+}%BXv2A$ zeEaftM#yhSj)|?(WIN9j87^jcB5+9zw-|>Qelju`abp#h3s1kAD8CYqtQs)oK9Ql) zyb7Dp{*=JcCM6}^BUL=SJ6 z%-A>x%lUOq&}CrfWNue_l|1W>$y)iXWKkJW29*et@NOhGi|ejUT9Yo78gL0C=kX2gGfRt=6Um3Yg(+6)S< z(a0=Xcdr#LB}c*3U<^sQt&`$!`namS^a3FZm58Nu^QYn^L4QtQYl4(jHHk^Bx+|e3 zbnB*uozsx^N{7y52d4XegObPl+Y3i?e<|<-U@iKWJZlBUGk;Y2v}-VUFA{R~qf-2n zF~5_6NsK@WYsh;SdJRcsnZPsLa$LhNvt6`^Y09g{i; zD`i4%XOv}GrT~ceC`;`eVGw($fr4liBb4Qf|No#Yoe%=KSPUf7+{CLS`ogC}1S^4c ztTj2IBhJl(;)Y4d9{Y>|jK@|iFUG3k4!W1>N>qWu-QSrIHp6Z92<4Fs8gQE0$5Fub zVNnu0W{8k02i{e-7JAg{h_TQ8hY{p0 zJ0RFQ6|>Rb6M8;e*$h3PNDvUFU*_M+q)w7;0C(7-G1v08lqR^>u!2v(Ea;qy_-r$G z`4v91RFuy5ABtCrV@uhMH43apR2Fg?<0?+H`{Ul7-H6Zv|LG-rlhEi5Y&w(L zPl?<_U!&ZE4S8VdQJM_TJ#}G-1P^prXJI>0PmYHSPFwx%fYZa`{ZLJEP6mF7@a_mNSdNDnZJx%neiLf~R>qjwlXe ziC)$A79D?816;^w^9fky5xB2&b>cb#>ZmaRpjr2v!So3bJe{kjClcKz|}d%IL2X6x$Q z#hnB9<1EIgRUfP92Tz^Rm|aAGoI^~LfQ(=}@guDUWI=s7uX=(Y7_HN%(X&S6I{j+0 zeE<^VF(zTtln2rf3~TxIHC1)c9A`eQDrn#a6gFfcgM*u@4tI_}V&Mn$zlvlw)dLGc zS&ZWyz+**t$Exjd&5d?BYju2BFq72o!Y%xUxuIk>ZDEJ~UE$`wb^+OCE$CiqWU;#t zr#dsv&4f++hmTfd#h7aGBJALO83+Hqq)9c8^4SF_*43u0_}+tVu3vFhec`cO~Z(yK?Na>Vy~^y+RW z7C+3SKMpxQ)v`MDc0EPkr$cbCC-nl#-|DCa_?C4VQ7lx*fk7WO;cE-_Kx+I?`MKOtkadt zp48x=2f+Dy**62K!1%&bscs8bs!a9E-IK;H7n=i$Js>Sl;=kq|xFK-qs^2x3na!=M zFXD&jl`kCWYh9Syq`m3xTbR%N31lrVHg;Is^$=E3G>qC5%&BL*YRhx)(jxFB1t{>Y zlP(-zfN)yJ(`V;+bK-0;@{h*RCD)y^tSx7*NoVKRSk>DBRd4%R7feZRhXqr8TRPt{ z=>|S6(WqijZL5d-vQVQH>oPJV>KMfcR*VW;5gYM+Vzm=eC9l&3+6E^ZwxJvKG29#z-KI^#szc^fwnK`uGvqdKr2;k8(u`JoYCsj?6E*Xhdp~69#)%PVWFKD3 zGS@l@(Lb~#0id)x$fEDTSRUAHvokv2{xi}yhBk~y<``;LRN3?x55S|a=dkuZ&#-JS;*>|%z%F;fRPXkT+M2NijF#UNFVHd$&(3!)hFPQS2Jt-9jkU zJ{B)jq|qJH@g;EZ{W+VA{;)2&M)*PAj~ck(?o|BU^}?u9&KUTkRZU9BS}VN5BG zieV2Q%fn>>Kf7`_7SBIxXdZ!HD=ljX`n2x>8xjrvqnY~zio6-4VUvOnPu!A1LL#rM zj1Pjqq~Y_AwkG8k^#2CDat^#%UEeiKU<~QOhl!3FK`nA_FRk$9!eoR0Zp;Ib8p-6f z>w-5{bjV=>I zPf7g+lI0>S&x02>TS!^iK$*SFrLEZebEv`l$;T)I`4cE;f{c%WtK|L;?dr0Y2vye} z(cVHP{fdJC&SvGRb#}3k%ui-3+>W6i^p2IUcy8>75P&KHDhL=87$2|;g@hYBLzlQH zIE8C(kP((-yJfoDj;N+M0_#3b`uk2gs@BZIQzT|V9Jz{I6nzn~ySYofb_ozA;21xh7KYEW0g8^~a@pmu^ z4v`5dp`IOPGiHEK%*}YhlXYtP3mtt*x?=9Tk3Z=Bj;TJnx>DtA(_fmpmT+VHCw=&h zXNP3@cq0z;E`As>1lNdme>7@>7n(-Wd|Ww-xTnnVJ34_?{Y~~Rm6eq;om{PQY?;cL z)hZvbR{4GT%CFE2AT0Y2TxBZs6Pdm{Z1t0}Iy;{_K2fc%*wHe@c@Tkhpvur`$ckH` zcVt#*$=o-x@I~%1{vI`HIqym3c024?3Puy~U7UC*Z20p(%ZZ1Tqo_V*nh4(JRk3=V z^gR|(5>H$I=n-$T+oc4}=v3DYc|fuzpQc+rwJy)r>+wL4HUShBiTf7nygTV`L0WE9 zbHlw#@*c9^$D{FfefV*K#ClfV13QjrER!4n$IX#237uisFtwn393-KoSP4paiJ(*V z8JEU3XhG?G!`=tlsBr>LbreOiLOj8gz4(X+9;TYb8~M-~aj*gFjT5!)9w#qs)EJfv z0{7VzmoHA6MS@8ghIuUXl8>ERhlluk2j5_+&8@HXc};T}N6kTFA~0OGG;g46%u2)= zlFG6T4RrqT0}^Da*hq8M-^#Q%jyj3m;Qz+NuIOLG3nT1~7$@`4M7 zy?;x=6ImE}^zxz$S~^OP`}JDg@?`dEsI*F%oc2xyq7bTqyIyj$j8)Ou2`s^-%VA?Q zerhy3n%_({v(3s;Z0maa)7v;^F*CavYK@tEv)62Aq zykK!sy;{%nnqQUjYET|_QcA{Ip}u$`<+j3I>>?5a>(8@?Y;%44DGPm z)|D@-@G}`rjpjF{Mp~`B&f}ySzwLK|%h?myXt;$d=|bMJu2KyPROJ9ZK*7I-kl{b5 z{s1!FdhhIky2kDXcm^j+{)#)rb~E3i-o8sYUVmk#hLk|fP0=$W++FGzN!gjSu3Lak2yj-5b{L6h>1;>y4Yru?i#vM(Hf(6$Xny&okoaUcm9h zxy9ys8@O8B=1wt`x#e+ zgrQXMWQxg|Yjvq&=HKnR>&fKXZLy@&Imasu$wO(X9EM7SpWF1+hW-jS3FI#Fu`)ZF zzUL58L@wKbBPu2Iz|9tH;FhIJCb3Gw>b#xwFgL1;yS6RM2eb17f0kmNG%s%5;4MVs zyoO#Ch^bL_{7jh{qgvWx5c(NpVaQM9HFW!%?mNOGT#l{$8Q#CGu7nr*#HuemF<81m zM%DxFiF{vtw#P_FjnT(DuRFkUbtMyzxl_rilD#kitTZ)j9orp}EDx$;^?G(l_FcoL z>F5jp-dXg;V26YpR+ae!v1s-3Z!FQ^uxBn*X6P>ANg{uT?WaaM?P!O8qR3zupX$JxX)(!iTXXxXb10^+tXsBM_2JhRtMnxIWj=G(I($$*kk{KVk_e^>ao(UCyZVF{;5N#yQh*F}+dh zG#W9Wy|kxYF$+w&3%YVq!ffeU#61Wr54;bsyiQqud3B_Pky8cP#R*yj1&LS+rd>$f z1pAqiwOr^PIOt=U-Z9ieGNL|7;W$0n;o>^p&SgliRp7TwWm)EBRbr#qFaJ|8ttDg1 zmkwVn6ibFLVpA*;zF=0I4t&w17y^o-&7~NY5m-$ z%5p4g>rfSr)baKSu#gGwwT@=6Ql@Xa{BpPGsrl%CLIMNJ68*|plXo{Ot1uQv!t_M@ zXIvuYzS1@E(LOYPCE33wU3j<${+lF3t}X^7^^U`rOS}dSK3XrPZO2AARf@49hjZc> zG#RB=Z+CHH_ZBtIK}ImGUb*u`bb$w z?$2_}LfEPO@}l|`Vv;o9S1Tg|aodGYvHEso61O;9R@3Tmn&)Mu%Aff?ly~eHe{7Yp zGPJ`wZpyBA8z_0+!|XBS4U*#ia#!l@nQe!5XFK*?=3OdSQ;(mX zR?{Qd7vlqSbg;G-{DtK2r*D*+WzeGDlZT~{T|QmaRH28cad*L}wiEtJ7c{oJ$%{$A zI^J{nU~+QbEbY!(1h}M?K9w4eilX`Z+Q*I25eA&6f0%PE4)nlGv9~MPyDl!U7IOBf z16R5FDB+-_DY+5bBEeX;mY$+T3sE+Y=fz$EBRt-T^nNlH6p~L#p&vY$cW0z9`mn>% z1?k%2$jyOckN_C*+59*a9W!LP44B@ch*it>ars}zy|By%Zmq{wMpzrwv?UBmVfKhL zORbO7XG>=8?B2ul!AIy2nYq9KHRjR5gFEbPRyugeHpjM-*)`(%HoPO*3aX3t!7h@r zA7FGT^IO4nqUbbo1|3_4vvdRePa9PpGnu>cAyac;R%zefWPODcof9e1M_p~2V7?}O zr5i|7?=C3E`uuggpGbfyoQnu>n0%z?i^`^2{$(b_V3IfGgu*QF|Cklo2T7<$QEU^v zJ8j<3kp9_m&d3NoNPShJ#un=weh+h~R2O-zq2H}57xieNH_MVT`b#S)=$c#i%*`|{ zn3KdDTUD;|@%F+CY)wblYU>XQD!e4^6-9*vvi>}kNOQN|Uf7HfH4CK=e5LlR_oizD zvBMwbgU{p6SiB~4=vAuJ>Ey6c{2PkP9SdgZ&P1g70b%0Mke&0qT z{dG^sFZ|&fL4$5YivD2Onf(KgayNprER+5N`ynu_PU&BFg+9S_uscfe!~COo~IiAT3*iK>RGr#g?c<{LgyPW+@`RQ+P_) zfKkY#r1D);!mm`!Y+EFLa69m_J@DRg&%0akEG=$#*pKB0j>Wf@=rjUOWxOi_9FV`R zD~%&LP9p<<;~r$aK)K*H3D0-6VGv(ErcmGOcbLGiS)g~JG?bgP;j8&>3lu9$7^(x- z{!j8AvVWLDFV7R{t~*ou!EonY0<87jv z@%LF7@_oDmA%9DudVRNEy5!@O`|^|*b<0>c0_n}|aH~nOYrU4qq*!I)S(mgo;fIT& z)~KE;;&?q|XH6^RdGUKZNmehU!^rFEs3ip?rW2v_}UVE^@pIB$Fgv=S7(#CEtUs*Wu%Hl9XYm%Z>Y`ihfP4 z-n1y_T{AVV;;@r?pU5QY6#{%Ko5>Gl{m8ivUewOsO3++Whpjj$BV(-;c9_$u6tC;> zm7jj89}gAHJb3NqvBG-Q_JOOsbKRk#B9&6|8@&x4AjKu$F;Tqa{;@t#EF?emK8Y0h z36d`#;zy{BMXe|-9C{8sJ*;CjRo|cc#3_yxt7|%vn)MxUb-LtLiP$9di#gp``?#uz zYyVqdUVAsLkLs2mHK0iP%e8JBw)W?A)Y@ACS0%lbn_|{ni2lK?|Irxz<{7g-d0g$y zKs!aPaWp6{XUk0*P<0JA$GCw@Ji^5;sr{S>$_gsbCBqY<0h_q<;D0AeAx^@YAZI*( zC&a!}eQxZVt&JQujGJSiq+nwrUZ21f2#CL;;?ZL!1pfKxyGpA%C$wKDHHISO0{!3O z-e}oAGzk=s^~QETxx8H>Aa|aN^{T(j^vcIp_bD(FS9!EE#4VcjrK&Juspv03$7jK+ zXIJUgibWN%CdeYSla=%vUD=H)N^T~A+P_CNOBjKLzIJ~z_?_(xV%*OZMT zs7jI3orIotuXHkJyVE_ZWKYOp@|crfn;89M{#Ujs_^|vgPj&7YCr$3!$&JM$q?0Wa zyq%AcldK0N@u(o&gGH%5ne88tzM_UPC5Qpr+ZjQ@^81#**TaB$VywT1z&;o<9qOu>tP&P+{ftzcd2OLq(Kc7Y zgf@W;ky`6k%5!xdzimv}I!5pm_n`f3flzFm{b}_Ih+5QE2Xr?l5@g!lm@O-Dcd3r)7jFsnQMD5!Vuk$_}C@!xuV$k6}I|xuvqcdKVklM_O zwK*W6H^Bv?N3~w4bNhi_sTxM^cN&Uja-_KcYJLU%mZn!Yx6GEw33t)1I`B4Fj>$8QsaUc@p{cj^$rNs5aPdA=s-pH)2NmwdtIB+Q#RusJ z5#6U`%EWJKR6Zeu9tObi7lN>h6o7Tx|5U$BNTC*faL}3PkpQM-!aoM~_~Bzq{U-~q zu~-e0(7LYBFMuA92owVx2DNH~thPcpy$qxQgY^C_sOA6mB%ly|X%x^uJ&3TG#a_SC zWIr%9yH*f2(yp>*VjA^=&zW6K>LBA-)E&*?tLq}C3vIQX9j}*NQ~GQzOH0QdqVm{F*r0jNLT*(-O%(vc zX8@4Ui1?ctNv-+z7JNiAjGAaslUs|H<+K$EH;`~yI+1A&nUX#8>u~Wgq&Bf0w%|ET ze#?VHd#h*CnA8SK-j*@BQc=}aP6L-ZF6?4g3`LwTq0UR<)1oCPE0x?Vu~9V`YEfV_5+x_!ZA>o|9;}-he~5|nhEbtzb}%sh7kF0N^e&QR7x=Hy z?hn7_%bK5sMUo8EvjVZY*!_+fYp-(QzQwuo@4fhzS9{p)1in`VhJQW;e;_yKAI3)> z^}v6~Ablmba_#TWQ{D8O*wlJNW*F{_`#!!H-{y`KhQn=@Hnb~A} z3`LHLp!BZqW;&6#NhSn49;DFx;yD&$vqB)aV*g{3F9bA6(E0?JtXs^Jqd8A#oB>;9 zP#dcwxpA5VP^CNE0%+#lQe=I+KlUFQ!)|eWB%lF{dFEowuEDA-K#U|d6yC|H>99&U zriFL?J+an8*I82>Hx{U?kFvZ&)hbN!tQD75i~TTGqOMUr zmJQ8FK!rbNVkx#b4;5ASE>*iwR8>e_&xYgfQetTE+H#_zGhRF-MIAzpFX%)zqLS8k z)%3Pd;yOwZr;(m(x`hPec<)dyw-*W#Dp%=vC1Wb@!k&SZeg7+=+Kbr(DOq?_>KrCW3McwflwAI& zQSZd3?0tUQxEOMo1%l||u6s~&ML$Go^FPG+CV)dx!h#2ik47FT!xeTB?gp_h+^?oF zmw&|j+%`{Y*3cfnz82&9RVeSVT}$}%3`^i~8v6{hQ;~YibMU^gG96^|GOJMxD{eHW zFukuR+#Kq1(4ylG@*SRdI7>~Wp(S=G7f=m-!S0g}eiWTfX%NYHQ{kw-*_a2<2kE~f z{JrR@FkPq@e;1uvtHzYUpgATecN#ey#Lu(+d$GI~OOi7AHiDjn&)G9-pC6@NZz|{S z#Z|PH1JL2K9-M#Du@2?m-?h$3*7c)ES_5f6Z9nz^zLygGfqgB&!Q%%;tS-`r?SMjA5TBnGzk--Br=uvp6DPcOg9V3EKOlA1#d| zUBry`r-e|HK;{EHtN=4ttY#3)q!WKiD=9muSmE=>eW+)~tqERrn%h95e2a>8P0Gk0 z$S(TStw3oOMvX9wCUuG6Y%CAEc^Y&+C$ntLmp; zbt_)|3dB}DQ?BGn((Zu7qypwCl&Xh$5E3!1EOHbj;NcA-qUUQx?$5o_TPfxAk05c6 zbM)rzK89V2pl_=x+0BugE@YQ;gcEWPidE4I*?!#04Rft?8c*mTJDe)=_E&J5?soy zFMriM+ynVWdI5E@dPDlt(Wd5-aN_yM(|@2>=O4W}m}he|Mb-=OtqTDt=H$DGUg~xo z&B21O;ms{EHV>GLp!uudI7k)-v1poDEX4ErEv&IA;RicYBTb~dAICj%_UL$mcIkzN z%WSVBFHJsKS5ibZS^aZX*rS4Hxgprc3^=PzGqKG@>82lA6%8^o;E!2vx6Xt>O8|Cb zO;@`e8C6w=p9``5*YkZkYA-EV2V|Gvio=&IU+#Fhtd<1WmqskCT7Yb&M!Vb~gJjLp z76Gn}75HLG?$aUq19NVG`mh_Z1}*(hgK@;R36Ja+A>aT9qkYddyD7f%!$p^pr|hCw zWm{%Ae7`g@!2iw=3Sv#r&(c8p*~}fHd0~AM#D3_IjhJvBum{NJTs4oT2!&}wt+rZ2 z2j@!r3r`pvi92c=LacwY(+GELn8C#HEIHOXzqfT>v?OsTJ7h zC`hy#UR$EQOr8N@aOn{QNLyj?b~0SZ))VaC!>7S)owln1eIkMZaPD_xRg5>0TL^)} zQ$37$p#B>k^K@RiaT^#0EB9q@w%#Mb4KfOp>k%>gGeko)W2$f8feSo+*p(v_c+Hnp zdej77F-E{U!aPR1pwcU3>FClu2m43_Sp$C0<_yz=`v37Wc?zF}p>k#mW&mD_RcUVC zGUaA+f$40&SN4c15+s+w11#<9A!g`T0r{QIT0s_|aE=a1} z@5{_)>3|_+B&!%ug#Ji$Fo6I@UM;#c{Iq$65i-S7%hjXfA~t$o*7^v|s0zkjd`7@# zD?V3&D*<-J4d!=*cMlJydE_l4TA`<1`g)7b9(l9q6@3zltw0~YQ<(td2&n4`K}F$RV4X-z@&X!vXOmd$Q8&&(x1S3pC;shX zB^|pE*9O}jLCfQ*3oylzR6w)KZsUygj1{y_^CikCl8uRY54{Zn8fH>GXA#T`-Mm7! z6j~$$7DZ4#gfq`QBX~>nUJ-Z62masdNg#hB(Xv2`$9*v2d+ATZd@Uv^Cp*UB*=OS! z&EeF1QkHT58{~Dgg&i$hSct5(#kCBnX4_v?TQCF{{(fAwf72csBy5se8pLmir|~w( z_aTZj1*l-Dzlnq_j3nFxKbV?;`iy&?FiG(svD% zcbhBOgU&U4J;%B^0@LEd#IMZB1*iiDJ|b9RNxig%FuT#&;$$rCvJPFh*3z zgRNeDb{>`_4|3J3WuuT|B!8_mFyF2ZK_n`GWZ$?9UPyP~&8oLfoa#SG-S#AG#L66y zWgf#BdhbB&;`AGkfvJ+&B=1Chti{}~`c9yK@_sqrp{a#>hP61c%w`rV5#_Pzn}=uv z86HNti7?{C%jDqwx^j$kDd)v>At5 zjUrYcH`C4ZFaQK1+Snqi@+gxW%C1F_+Y5M^@=9^eL~XM7;B-LpGwfYp{uPhg2X{bx zM2qz5{Vy)7*s-%E|4H;4Xtn}=aGe8O_vrU)9ZrJx;kAQKn?MSgZi!K{547d4GAQFc zS)W{SO1*^VNNfjmq*NLj zFs!Q>oq3z}*>VX2rg=9q$9oBEf6r5S&>tVyD$DKFzNGOje6$(}nXN2Y4>1Q`3|T0M z1+8u511&sEKJTc_k=Yd2{xtm%_?|w=6%Fp~IuYM>I^C(NO*J-8@A%#MoL}KLI@(4rns!x*ZZp>!l@JE~e=8wBSUU9$nWaY2%0+OfQnEmn2vDGX@*o{xRrvStI z<9%lSwo=S?@DenL9P8Xg%R5k9-4H>rq9wyd62s-9Zl?X){Xs+kcDf zBOofs}Ya92k!)LTP@jO(YTQs==MfoLQT{ycnZcjQbF<4~_J4VO3 z04_d9OzWi&Gk{v6>D|VA05s$ZXr(r4*g>3`3la=2*t&NN)cjlyK*9zAS*aNhCq{+E zop6ha1W_E_4Op>9R73S*9;~we)lHGK(OGH|??~|SGpjdFnyrh6!e_+;xPZ02QE|aL zmNrpUF5buwOZlzXt&Jl<$D;TEE{tMi3+!%)oN&S;2Hs2Qfr)^+V1y-gV$?Iav=he8 zs2l(OG0|xzRm4oTWpK|)2#)o~ZUXU1cZ}|?#2(Dx>W^6uw3W?-)qZZsV`w4vm(o>$ z!R8A<(S2Cu1`jU1R-0OiW^9lrl;&&4PRE^#N1f5#ST}Ww&=VRME+Q6j7x~OlQ57qC zMDK&J&3B@$ji(~C8HwpoRX2jUD-0(M+``A&5BOYFuFmQ1oyN6#1j@(#{8`r5iT(iw zCQ-W_PrkcqQLP1c$&^!4af`ts(!zt8-ylv48{c1%Zjj>)Stm0;1{tS3$W=0$eLM8K zg|$_hrFi*9Sc}ts>_&t7{QQDiOvwfggCYLVxC)+ z`$&`4X!G9D+bv34qM_VJAxxoeh~1VPVe@fkI- z^c&SR7*(_%sQ`95cFM%t{SV=_$b8;Lxh*=@$;q9U*f0sTXPCso%|=R?7gsn|LK=A3 zYi7>e(8vY($5A`tG32Y}Y@YF9?T?$Z*;#QV~e8o>l*Q+QSB zQlluiypy9Y0~|amQm^K4Q+D%I?uMNrkALmBT`8`LzjT>Ee(FmM$r*$NFu5b;`noo(_CJX^VS#_5jFJ$oU=9rSk z;2Ncefjy>LN;6OIN}*&oYFPUViSvdVbf91Wke6o`zJ4{(7}a^fa&fNJV%oSo5|T0g zz1Sa))+sb*DSBtosvg=DKd}IF1m1M_>h|qpq;lw34GKyP_x51;6SXn!>U0P9`w+~S zCjg|;Kir@vfL$jH;W8CC0S8$abSA3C>!NdE!gZ-~y&X|))0~%T#9ohy`wi~?-@zPV zxSZ8U-z{aVKGKAqGl!mD zkzQN9)~AI|51+b4kDSb*_PxCbbs+yR&T0Y!USW1)EVNCy&lZ=yC?{~2xWxSNQ3w(> zO=$1WpFw?b|Is)2d6WGF$1aZ_>74X$!ZFc-K>*OkgmXbOTd_wEwo1zN*5{K;dlJEx z5A$wT#y%?qQe?Vx3tbv8F|vCx{TChnwZk@xK&wDKGHc+9Be5L4^13Lj=jaq&Ab97M zrjXmoXO7vNY3u^`FiFTyurFFST2gF9vb)QF78*2YfoHYjw%(s96hZy1G+g%B`g;t=1i?E;kZDID_xXYCMeiXOaiil9T987j` zlKEHr;_2ZvxhEsI1wv}uSb--VjwA_S9q@N&Qe5>#v5XP-!T9b1FCc_G0q~gCErCl@ z;BsCEfy=Hx7{3sIW?T=rLVe#A1K^J54QyqD%S`Z)04<)+OE$PP1TMLJaoO_cjGTR) zm2>%1a(LaaL_+8J0E1zQ!MU)Xi;}tY+rGM?fNUOg_K`uR+&VUZvcHB|9g)3en9t3- z+BU+qtK78M&%@M-6kDq(?bB^U@qCVHMYRd4-8A z6bR@JREM0xn;RHjc}vO0UvU5q^mN`_Fj7`y{1}7aHE4J~@&~F=o~DabVy@avM7t>0 zjCbDId^`8Xw!kF_>%v+FqV|r|PtRPaM2A^iVjn3hu7%`5^VqP$gu2ZR%5l{;qbQaL zxE;Oudwl*#>eX(1)DTaAPyBs9-np?H`7~iUVTAIu>7w~3o-vMmD?-7CEw)1x;PFAD z3=Z0oHpfB0w;RL?x_)}Z`J=^=%H6LOSV!IKgq_%mpPHM?h8cOTBQ^MDrO@gi{BFyk zjuC#xUpNCU5(k!|_HPy7KyWLc!Cr+JY%Kig7IYezm*#fUz6OOpSBm?vh5M1vx|@XR zx01>Aq^`3|qxV)&{){EEqXn9wdnM}dmg$$RY}B%ap+r!-xHq!LAo2W%9UNgBGXMgb zTrhCa^~QkZXzOdj$3y{4N6I8>V$efqr?2lTlSDI9avnF=LG8Ks@1BpaS^MJ>IrGlz z^E=*ROOx#CkRUFy>BD<`P*LV-XD8x%V|CYo;Dp{71^K+jBO>M9NlE0=zXj*2fn{t_ z%ydUoXWS{t_yQyHEuFyXG%(ci4u-~$iiIKTCDgZ;BTj@lz{H&oju_8v3fhx5Y=nO0T{;VTu0nciw^4yZ`kZQI*L@4o1rrAMfstG0k28`U~{eUj6M`uNT$G zQJP!Re251~RL%mC*vvEx^0QS)+%05d&m$bgZvRHC5X)#7zD6ZCh!B;5OuzRIR@ziQ z=y3Vxv2yE!lW~}qW{Wn0&m}m-Z&+AF`F2cI&K=v&Kky3r*K3Tj+umZ^o+8_Q8`v30 zoD2h^+c`%hK(Tsc(z+E2%UCVCmyRx54f>Abo6%zPT(m_rd zUXeK(Jr?d|Y2U&TW<+l2a)y)%YGMDqF_KGt&!6%4)BLBa@y$up6J*uzrgAL7v44v|D3_5#Cx*j$7(N9bJ4PD+ygsnpDF% z6XLa<@J!$Gs(mxlDG(_`ni{v%W7k=^hJw8MsHbYIj;Qvh@;z}=DVopZz}i+Y>B*o- z$4awbXu*w&GCtqh0%vRRtqKy!_%3N#?%ur`*^xh$+rz0zXU;cK*xZV`_&UUb)q(o# zYbl=2dcH(6H4e~bq-=zVn%=F(AnmLc&ME!slN6l}22{o7Q&s2ElQMud_#y88@Q)J{ z1Ur~(?5*QNOKs62V}6+^yI>&yV$gYkwmg&9Qm6u zi9_(tFfmcC(FTo!VU!I8S|ZBb1fMJxlz9bGDw3y-GiPyP_wP0?ErR)6A6vLxACpAe zFpuN=`+RQc&DMX6(;yd5G^7a|Wz7OS|9qp=!?=}LmjUP6(X~4G#)_=pfYbcYp_oN| z3J!rA?wLC^aQ)B48(wPsTdt}*vOPky;B3$a|L`-)$QC)nM9r4WFkS__*k$G08d$Zb z%}hIoXFpFJ_ptTX)A~nF|FM&Ly3OxIM%MzDom^@%Hir4SKR5Na-j|~#tiZ()!mhXP zex;|g)buPWe*yU7FuE|cc%bm+AV+zm|NaO*7@!@VG!U8HSTYIOOmz2p_&b3K z^gS;5g&+*$mSGzdPu@7A+=}iJ^itu=cXu=k@~Oi(Q35L_ug5kM<}~zSdH2eC{q2b! zCMq5Jr|vB8hQO564zK)J+Loylo`6943r&@nhfbB~*8#U_Q^How27( z9Q=j263uag631`&dq^(|Iq!z{DouMaIs&1$6OoJi0FnAD(&1t;pt_+vv6xcEAK;`& za@6fIY(t7N30B)V-bap0$IBOLthRP@P90T0m8vKvggo!6dpkZ^iUtiw+avge;H0~7 zzjaoqoru1g4OGB}F?st1+9*dT`tZvG1NN4X?uNRY^H!qe_<_em4_{s8YjQh`=*S7qlapXI zPc)OBEeRZns~SFEy9%><+C{xWfh=`t`8M-N2KC8sj<5nKr7S#rM)vddb)0rs}h6 z12s_4%`H}}u<33*rt8h2(e6F4`z^9*yI=R-+bB?i%f`pVI17l&ySqT#3zWr7=-c3w zgT{h`Rv1{Sxy1LNKvjhzj@ptJMkiV~PzTN$caKd0_r&5rAm&awmx%`09GF9bE#hDoHw_C)6sH+E(RYv zYY$-SC~4q-O@H2Qsu9mH@@^#N&)a0)b8j)7U32taD)*k)C=jFWSG9LTi59R-dJ)## zZp7)vLMf7OJm&NCkj%sbf`gU#w|PhoJ9eJmPg%>=qH~KeG09*BHmFjz#u$@)O)a(e z<}dl2N|*yOviJKOKLE^8LJQJcnu~A7Pq>>$$%u@6Q-}u<>)>`(koV&}B zs%N5sJ8m2c!O^L5D_N0zbEzzA$}>8Yu^LD6zrk+j{ese8BVZ{>%(!RxWm2+)1j*5TBP!yNcToZge##Y)uHiI=LlQGM*>K5GP zOx~^J6|o0dDbjv`_JWdGFh?jo7lh0plZ`Cp(i4p4nf*=?uf@tVFOg&Jj=Bs8+2J+Y6?crqs!C5;!-^|IpW>)?Kn~#fff0cXxG}lyC&nZh^XYz8m zwDT#b-qmKaYOb-V0MehXvnF6SnoG$-ZgM#rR3a9s?2Zf5UvU)HQJMpoToV$^o-aK>fCk+b3F{FEy8tUZ`X+U+@yI9x>K4<=Qnm!L;tl*awaZcj4v$7EJ^`X3NN- zY3;}GCI_dP0C9Kw!p@NvkDuL!N_+~(q(=!;ADkp&OS8@JUlm$At$O01DZT6 z&kihtw*Z66dm}aVl8#-Z=^onZE#72XKEIE9`u1d;x$x31EX5{!X`zFn@uc_9wM(mN zoPMQwzrCrg(ibyQMm;U)yJA=NRn83Ts)ROzS=z5a*fEbj8HUsXi4+iL`|!y!h%G8!B#J7AIv?RA(+Q~Al^)# zP>=(;3<`PyYUm!VHuhrx%5ynJX2jaO7e!&a?crEbykST0YfpNb@oXJD>-1vmS+Tlu z(=G3lfI&KpRc^k`$R9^1b<-$Ng}RK_)^uM6%;bR-OVrF&~P7u2+3fa zimj?vW<|GAh`UHiJ+!Z2=ivUV8v#=ErW=YS=qLekI~Et=M!92&dxzWx0u_n#@N&1^ zVsG69Kvs=qMytg!&dN0L((K^x+zi-glxy>_jGp73f+}*f$ zi$}M^K5KW`-_FdVd&ke#HkyVo3G<9f09WHrLVdjD=D^>*FxI>5QpQX;9B~WJaB+b9 zrBB#1Qloo*7JPs0hrX8&Wx} zWD<(SLlpixbK>$;NK?H4U+$o5eY@F^)JRFa62=uVQgE4#18Ok=+AOgD(GuUf9h3E+ zg{*c|!tL)()4W={zGVEP1`f`!j5pLg(@F7pXGF!uzQ!u_%?Zos--!N8%deFBFugb4MBfo1 z)a9=#C!x?ub$8A**emyW_4|(A{at!-f5$hg=OS#q2ZH~^7Ke8K8YfoPg*b#{aSC+6 zd)N&iu;AWOce+wAEK+Z_$Y#446aV*z2C`l)YiYw}r|)i5XD~g?)2>^@$6%!_df%MQ zu6w`~dqCi3hJFVb;0pTV2rT1OfNpNEeIaNXKM!<5j3Ap0l#J|a z`G6Z8r`yx36)wN_Jdi2_?bYcvmJ8M`yYL7$caco!^SK1_Y-sz6NOHu*goWMx1n(59 z^OPRt#AdHi6_o9oF@L}RTbDg%1~1iN@EV0g+M5X8ak859Jt*s1WVLS0TXxsF=|4ykL@U!~^3V@8 z`B8N2TkqH8t4H*0%pZG;Mr^N-yuM|CNA5|Rgw8$duN3S6z9QH8T$8uS`S%PT z&k3UGPirHJZWrwsASv0UV=XuUk>3hSX}<-|`IMKLGxHN@IdqS~nej#cN|F)~59Vr= z3RS4)x{E$vN<1Mkd-M*HOa?5i~)F!i`C|~P0tSq z9%2)ai0=C&e`fzgMe(Hy^=8tZgf*F_(Esbrd2!?k!MVh?teHR2rN&%hz2}b;vsl=? zrsVIO;k}DkdoLqr3-meY0Fj-}2ZS`v@L+*e#gbb;xM=(~Yp!sdAB(>G?d^VS`L*&g z%g2G(u+#UC3yV?v#H__jC3ZmOo^lImmTzeiz+gzcMU{$l^duqoWT-ONc{v)F)XKLhWN7Gs@zku269&!6^k< zDr@Dg)h^1Af|d@LVO~Nj*I*OiD+I~-H@pFfa(CA%k@@-Pa7GIsrL?>T?>9r>p4BUf zgu4*sw*5dZZwQVtukM@k%`y*vp3Mg6?cUAyOwz3#o3$Rx&{YyTzQ>U82W7^SyKRV| zX9~Gcgh^lYI+-%UcGKA%k-6@w{=5xWygl&Mg#aBiIEn%y;>cRY#`%O*_q;@Njt+Bm zOSxcF;VS}X=Z+$S%A_-YKpg7TqEPPF4_XC$lr-x_+2GoMrUw2~23dA?XLpMx6Hj5Q zlz6Ah?`C<(_DTAV7ONGuB8;?2uH7xh%0xAfVm{b9Eaft53B_A_dy_055Q=6|=gQ`@Ye`Bwbzd(JQ z!w5?5z;;tT`MedWJ9(^`uri-~d2H$`XZUT&%1EOBA7b^!SaF%}@V^&$UG;a?NY`CwN;uu!Gjk`f9dnUW-bLEGZ}Jzn`@1nYE!JJAzD_CVhDc}$V5nhjs8m6AWEGxh zk%y{IK3cI!l?B{-ve|(bc>$i-*1kGjo&eNZicuVM+Z`50w@5;R!K`dczE}Ba1s#jC zV%8F(Jd3S@aXF?xQiD?&R5Y&%7DV++NTM3BF!9R9hyY{OrqfT0oREUV`qi?IAiP5h zEem*4OuKMoyeLTgycsI~x3`}WF<5}N9J7_I=PfX4`Ei!l4uba$=Z_rw{x`;%u<7f< zfrOtrSzhg(eB8~ZyKGTEpcle#95eY8IIk_J#U@)yeO4;$P zZI(Xo&X%ulXa1<7|2&~j(IXO%KYuWc@J^y;62l>R?8^H_xP7$!hy#VxPsi_w`0%z- zbTGVmeM|gR&9<|xKVmhD6kg==cAMMC*}+v?1fpYWaO8$z8<$vS1zES7kLGKOI>Ea^*z%7Wgz;_@iVRL?rJlP2|ah24mC zc{X7H&BB@jTpD+kb8kVp&eHl^E{@;!>bkk+Yo zj#EDwC|DzW<8YwsRyUd;IQ)tgH$(Ki5Vr1yJ~b#fh_uTt-*+YS^}DjSpw+4I`o_*rx3yS2 zGlZ>s0`>xw07VKb8|)-Zz*$Zuz=YKj@p&t3zO(8AL`yhSALUnZs|iEya_+Mm8~J3J zLw5T_aH4|hy)X<1ig!3UXXEF?F_Py}d_R9dN~OF%2v0?gghGkcQkopp6D72@KMt4_ z9~6P)KggVatCsR8a*y>UtLjQNBoW0(uR`WvbuMiUxRoTbb*;u~d>6!i$QaG8oLt~A_iY>rEOe(Ve>=Qz!3_m30rCS5cyC-!c-r;k&5z$cl}^J zq&MVfMc9C17qbM$8`7tAhNKy$;ct%iJfS?|LzcqMV>he=s(XX7gSyp}F#b2{M;)c1 z*Q1*Xv1AU>A6VoIMM0{U+dyEJ=^+GdtpAc+D#^gkhe4D>qo-do=l?jz(}j6CqtFFp z_&(djA4=qVJpfohr@x$Dq=^17`Sz2&m@DCQ`Wm}-{!pBui4_l*8vBE{QR?`F2tgWe zXZ-&Ymm9*S$*k2llD#8juQ8;3hs{7GxX-!stJgB&>y3z<-s@#kjpaUd4#+#zPxp_xp9}tyz4Gy&FdUlk-wtAvIVE9+`A}<{o1X@eV*dRARHY z!ce&d{>wJ;SD<$6pl7Y>-7L@icfc+uj-RC1?k((F zq9|Jyp@HSv`ECigjFQK?n@Ko&Kr{WM&QGpIs%SztXn#Y)&I{TEbs^#%8K{iIYUTFA zLL7f4+d<}1D+ipyd|adC6E%x0`Yz(|@Be!V1Yymh9n{<7D+Q3aY(A?F#^oc(IM^OC zyC$^;>RC@%!Ahsk(5|Bu;;iaT&7+7ztSW%nyh1{J80btQYD1HEHTtj~>q9!wZhMzi zWQ6Vs=cxpR!mx{gUay>8FR2lug6T`W4;bditd!Pg=`n>SqpW2QAbIuIUq278mjVpq zx@b|qi)vw+A={^bKo|=W4-NF0OHs zQwY{w8tSMV;yY~a_R5gGy^7>LPngH)ew+iUFeYgJbY}8h#6!>YZt5zT5U1heYN=f@ZL6l zvdZn$D(cc@QjX$O(>w7Um?TOiNPRcH8zEOUJB8}fkwr!G-xE3UqlQ1|z4)`IW=Ey5 zRBxXm2rDh=jT4b+Xy5*lSpIfrWJvp7>B$m!xIn3EMR%kkFgPGK4rxj-7gA$VI&**` zd0*}lb4f#hzTqbt1Zns4OVjRw(E{*s`_mw~|INiO?d1q zu;8F5CAq-1TRGVMTFFAbatOa3-_kosZw?o88nw#&BGk#cskD9 zb*hof6)IL|G`S4H?iJ0K^PMs~v{6G5hZc=$M3Uk^>5XQ?rr6-eNgkbK%m89-rlk)V zMDh$L*rl6h`jhjv1l8a2m0G$e3T5sK=;d>vtB)S@JigLA7md`<5)G4_>Fvp5m1HXZ$Z`IdWDXaA!i4JvXsL@tdYIM}IBj`s{nVa&ybJch zEHz!H2=0`h`o+G|?#UnifGuR`?1WU;Q{uD^?RpwPKqcLm>Lek*Gr0%1%cd#q^NwsR zJ=hIzyfGXJi(aFoJwOa4c1Xe$`$&QKajRMh@5`&@wNQXr{o5?CQY#ZkzD#hl_bQEoZ-) z01{g2P@x0*@6{Eeg9A$Np4z^2CF~Tev}OBr`YlPPwX;_Zk=#kyTK76E_t4*Yuivvzaexkj#+gGgq3QWbbLRs;GBE>?_TH{`fIAGV^G zwz{f$K&e``VgWYY8xSxC8*px*rv>h3`1^Jr%9-=*(e*QLX!4`M2suw4g4Hvcaohh5 zAAnJLV1&qj_V`j_Pgi*!M+sYb#=Ux0PzMxAAgd~pEk1`uDEC~|FP+OoD(*Bz0;neC z&hiD~lA0VkRq>P;5syoH`4A+L-o>=jrtH3t4?mTy_nE++C29G@jyQn1GL+e!k7({g znLtj5;Xwm=ZI9m3RW-uQX!&Umc>*A!_N?Yi7vhDA;@y&_hM@ z_}7H;WR%4C#r7F) zn|_w&Sp1r~ppg$Tv?RD&4By=G|w?CG zH#f+0D}mKt#?aoW=;_SP>@51!l=hrArSjT5WF~4j!&-GI5p}*B8tHZBXQwrTRbGHH z+xLH>;x++7s<;=;fXcJb)%W{FOp!!lh}h>2;YbkPZf`0VtyD;5OSN%|nTmp6NiEA} zCF&}pdsUC6Nap(TTV`2mjImF@Pr8qwju_du@>2J4BzZDD)*B6~+}02VaE6EcOMC&Z|H019@!sT39lZW&8H`qm5=uxLI|cLIkrz znK-K^rExWe@#M+<^Sm&|oyr)iMncjWv`g&fB&%sSrRVGIHOB+<;(ZWWF$t z$50~`WgxUWW@OCXJ*u?pzF`g8VXL_mIzb=Ybw&RFnE8n+q>u1+MBNjg}gc31P@+ccBqe(u{b{iwbJdTd>8+dWq%Hsr!| zXGr7l@4nn6lh%Qd(^`~gn7l2^M;G}aXH9C4Po0QG`M=#Po?Tlfwgw& z^EEU;Wh2PH%Q*X8+i0_V6=1dpNVRpOe|c zFOJ#6&)n?c7xV04q1n&)?BN&2`av>yw1)!+!O9E)^ccaPP~mMwtdZyjuEkkcQ48D* zyRU3rG>>=NWYiVax};PA#4?`=B=NKP{5u#n4~lV265AJfKe zo|}5htg+;ux|Uc+=dLp1Q{g{Rj_DQuMQ-w9_9kb^!X8OLnG;4xvaL7^CwpSR$mPiD z1~G%-h~>PQnx!I|^F|39)5y4ZL1!@LQ^zV8&Zjn#%a)^q&;$H@NJ0`-z3OtZTkN=K z*V5DhHbx|0_K33X1BtT@c2Sl&6`MP$y={k{jyz)1)!tiqE~1CirzD(`4*|8jOY~EM zyuF+^>Ca3uU-_UBPmiE<%g5kW3KGU70@H8S`ngk@t&LKnKAhr z;S(2qbURW7Mg#dwJv0{g9*`UDR8=Oi3_@v-#@}-7>Rm^S4>P^#`%s5ixX?y3H`KGa zhcGQgPF9!sC=TM_Hj=z#SHKcLQ{Zlaic-T|4iKJm1`|N>6V61FB*t}^4=S4Dorb-U z_{8c~JfAnKpEK|Nr(#f#czm_u531ZH@UGF3Jg_jaYNVg5E=dXsVYDW=lBkq4RQna! z2(Cm}m==QyS7NK?cMTl>QCrk~+^OnD19G56N_nqv8&RVNsm1aK^%?D4elydO;US z0BHbwT>mT(`K$^f6z?0{WcFz8N^B%D;O`Ph!NJ$-fd>2gjn+rWG zR>yQt^++%C+dZ9*m2UIrmGp}$&37*xj`1er>|rcco31uuak^E7})i}8iFNt~XL!xT!(+fb}l#0bFdxw4ie_#>}(Xh^M)e@(r=((pT$q zuC}7m4CnPORrD7&uW7>HZ}`Sa4sH1~CU>of9x9Q}c%&R*z{RGohD(Lwa9BbDje(=v z&c?GV)2>YrVq&%tZRlQo&3<{q*&CI~6TzXcuLF;FV1hiUyF^%fnE&tiMZY;a13o?u zOqwP2uejM=k_GK<7CcKBm+M&XI?AKXNbCWtf3w%c5O0LM0|M+Sy7%2mmI8o~LwB*r zOhl@~6qe=^X05u|zlTVRO?Rnw=Q9tZKxpkpq^(2n9c($hemeJe9dXS^J)>DXfK@A8 zf0R2Ol__0JSKuP`i(;sspiocgPyx(#SwJteR^~vL*EOTQ+axvD*}v}ZMXN5f493#q zvi}vvs?bs$JRP0kjm|uVUI?J^5Hn^5;?2kAyN)>gtCcHTR0PNr!BD!jy61Ssc`ghp zmb-Q9vDW5pge5XPhkC-3TBMf7O-(a+G=%c`GqYqH4j@O5CMuY{a4_sq_I~eCDBPSX z-4@0SMt%=rr&9qX280x7>C3u_m||V8;cGN|9O5vPfC{fKU7E?RFq#H)hut}gwR%Om zaqqi~?{=z8j9qEko&&0Ep45HM@vdItyXUl`FGdmu_Z2>FUbx-yJ>${Btt-SL6q4Fpj;bYP@yIY6uI%{{!?5;4_U*kJ@?9hFo(3@&LD>F*gDBE6T z+Z_{9jXAxmoD~f+NaT46dYrV}F)9|-<1T!G{}ladba|?4b#m@CwwsoYYT%@P#z0~H zaA;@w;);FkI!s^JomOIw5K_rDZoL!Bz9hKQO}_}%R*l2FXZz2W0{`*~q~spE zJp>tE*F%lWm}7((^P9g%RmOMu@8tsHli4z|*}`9{ZCvyMyzAK2Uy5ajwCEdlm zDz{GNc)IJz%}q?sS-FwNasb&LA{=)V^oS}W6$Z1KW9;{deH3IqB%&nWMD{{ExDc1- z$AwoF(&Mm=&D-@~fy6Y=_r5Bn+d7g;^^5cP=MKlpdVAyKeMxPQOX~s!8YOSoI_;I} zip^@@c|mn++l6{@v5q#>*Y4=JIfotL1nxAoDkU@^;~?O+K;ci$B_7b|NMQp5DPEXZbY2-}UN9l48pSFY&R z&Td>)SEQT{vnU7d2gUfyDj{cK(L zfTzQmMZLkO{=!)wy_I<6ctdD6}VL0-adGGe(zn;2~z2QkQ2O8 zQy7End&0XN+}6QnZ73>VWG)RoHIQ>m_TTg%PYRi{C#u+59&^W`(puCOS$r+P(_E=% zj)esQs9bwh(tq2&i7~mR=)Vxe4BTU=1?gpT%$VbBDNk?LcW9~4 z8W_^JJp@tNz07oB#~SY0ox)Baz%(uz%_&E@G@b zAq+en50lny5kv0F_@T!dqc(Lp0*u%36~@%?;Tk-{IMZC@+e%<~*cx22Gb|BTb`es! zz13Us88V{yc`*I=Xfqh5SW{Vd@+VegvSdRqCJB=ufW?y?!%Zp^YdtzbHnNWK#5H;oI?`oj#XL>=w40yUGg`z+ll@ z&rI*s#BPWEz)&_xu*Xc3)~Kqbv_!1;z8 zUJJa|WWH@z?M$!-_K$$Hh3S+H6M)$+XUHzuc3Db;-IMp83S3tOF|59flwbvs0S$ja$t!D)%|*f+c7s@#6#{RrG6fX`a6y+eFKxWDT#%wD>TqcxXj z*S)|3vB91YbJ^$gsCLr(p7hPwyW2`U(b;^Fq}?vc`w$i8q>dZw^{3R&>C7%ryK7gw zpY9yxn^)fKt2Kl5SX)k1IiE^;`=-xMV|b_aRF7aW*d5^SkgNB7Q9QaeQm@^H@(`x> zw6QCXz>wYkUHEU#0Q7nEie2VT+=l8t?=x)sAxb2Wva51e>!_FQ`AlbJiXE7TK(Wg6 zGnTkfY!6wK)twUX^;Od zD`*I<)*;0I(@hK!n|bD=?=aDgtTQLYDHlQ_69Q>xf~o%$>{qbNnr){DeCfi;EY9O} z*ysJUzaZOkd}8c_!QUyXRiLv1llArQr#R-aXD&{U=N)zjzX2Dnky}W>exZkXiOd@K zmZ+s3Ca2cYm)sijrC%e(53=DoG6PG0Q0?;i&7CQEC(dXJ_9?yidPs(7f6Lhuz73{! zT~bzs?;2G6rxDaa&nXTHz-*VL@q(YG85wU@P`rAL9>r;RuH^+UNrjT0)KA z3&2l~S<;qutS@s!H^U|Vu$GJ&kCj|X$v!$??(n6ls%19@kl|R0QyhF0ddP$;lWx2otKbrnl9it`=UrR4F>cF$$rLvlJ# zziwa*WjJdK-xp+}=;@e~siC_aM)HrIT@f~NKtlxNiV__yh8@7#VkHydIMoK-90N5lR%0^{TG*HH8E+Vghx$WK^v>p%8NwL_#1|I2qw5j*(8cOX_ai-$jZtO#*Xm?sAFPIt{yl6XvOa3F+h(A zGNLj@33kM%RACSxLwFjvC@cY{;NuuzVK_s0ClF61{d{@I={5fB#BaleE#>gH%9ON? zyAACsU#0gt_|@ipEYn+NwyLl5#C$1Z9|81MKqKa+yp53)UQb-TJiXO0K9GJU@<*F> z7*RP-$)-a;7j)gml0f4@gQSsE1w%#EU}yGzoC(YKK4ZeJL~%`bFLwXwU71$sqB5&9 z+aS97eqlEL_otpS6BMyt=XVtn;ewm^=6D;(e4v-vvwh>=AB8sRu6*%~;iNd@q7^e15RNO(u4ei*a9C-gUPD1kM1ad~I zhp;tud(ICt{}|y179DREl@{iW1O#UvF;cSuL{MU@xEgEf4#V1n{*;_Q={*vyV3VBc z{Y3`F_SQ|#M491K3NyDRvIBOHAR|JnxEFeazqaYp+qm_X9?NY23FI_|E%#x4>if(vv^YhinGy+Z@ zuc?gddXaPf(@n$0z{8?v_UE3hr>2TN%G+BgI>)A>hm#A&v4ykKk-ZC9R+H1B!e}rk zd58b1RkI_T&(C}jlsv}cGEcx&aIDsspGetOS84eOawf;g9?Jbo6Wab@#~@0tEAtUM zEM}y>y*e?zZg)kQJ(ZEwvX`RbD36$QQedZqulCk~b|;W9bdrwRB)WmZxvA28tKiwO z`u$<>>cx&Trp z_cO%9Xk!wY8aJdSpSQZ;@ziL_oz(^Hch!`(}kpCMdzm}k{-Jvsbk54FT^=u{(P1$1yT+da*Zm)3(wBQ@p!JJr?@yUqY<& z?Yq#AB%TjDDt@i3d()(vd0oaItn9xHZi%LT!K-BZ(iEWaRyG>{wN-z0{;%TCzz&96 z%HEf{=0J`f{nKuTB_Hi0qrR=u{DRE>2o_{M%Q_jqO&(T$L0CvRG8L7-*KLGZ!WI$E zNBvY^({!<}8e2|cUr9>5ljy-MC!T0ak0xWZf3zxG$bXx-ME~AD2|-N^c5%?HSD5pidBFLiUh4%MMtoA`{iGJ#q*@! z+!1bxdVjcMkaH!2J~wm^CQ`)Bons=|691xbHl#Y29}xLKiHazg_KKwVew zbW^zp5?j5;V|$$n%8>?WKCxA|;_2R3CwS=g5o=`gknFV=AcQ>eVnRDq8IfICUNdgG zOhZqLE(QL7zw9!^b*hWE4?k_A@(Xst<|^)+1$KH5Db{FHanbb(rX@AM5A#`}AmH;ItYLDjth=FN8GK6X`HMb^< zY|jR3HqOq8CqZ?^l|rUMpI(|2O96q7Q+(`vYYl?QJG^R~{`VfKS&-qAF09F;=;cD7 zujjydG#oRVDn?^}jC)(q+6*YW8(H^28A#psYI2-yQ{c=%HpH6yWytX)1vzHIIYT-e z#}2jXY-If<_I%9t2l=!#^|Co&Db?u;Zt?)4{3+TYBH+}|O*7zU4tr6kGVL>5C*S2f zW`N07NxrwPJe&PtG_8vM-pj3yEw7?`zYRXqyz*t9Ozxr$|Lk`zzg%N)c_(L$MGTE< zKPx+f%sF=GTbi*h;>2M@*HKqjjb3NzUx9icTK5EwH3%H$g{b+QYrOh%_5ROByoBG! zgY`7e|6ft{(+b0Yq#ZUk^sk@+_A<6QUO2CYn0DN!_VQaHv$(tA zHFPKJt{U_-J;eg{ZxV8T^TYMc*S-4wkRHf>^f%hd<3!qVW^_2w_Cy*Bc){aK;sorM zL_hdaL)#eXthh`4@JtBrs3eC5qr4%(B`!)IW~zE&SnYox=R{c=lX&EtTa208v!c_S ziLPJA?_RVWdz9cy<~)hou@PKOtucyrk_w|9f@$KZF5$d&W();4T$v7h&YjV0q{;jL z#(JZ(V@KSRXSh;?JB75N9@8XunP#KnR z7L<4Qz56?!C~4cBPF~r6u4w5i_@^cQPp2o#_gP+QDuz9xX-V$)Sl(F&zR%Vq z>UW2p=bUmu%>R`&?j;cj)`p_}<%??OF7s1r!1qZ^AT$W%ExSh7A_;CTbsTvSE;6Z& z$gQd)%vi;>{p5Ba7^eK#(R-vk41BM&SHGsnx$j7kzvZMI4LC(ne*7I+g(N;VwblQ| zfFH&iYu~$@JMQ9WuiFxJCx1kJ`t`;>$o4`#-Vu}^#Oxgn1wtQzi1Z|47Wgp4YP6F% zf7(?%!O_oN=|Z_w_nn3J_|92i_niT{FXXoGYa3Vetn$OqqJKUmM!lb4I=@pKlZe`h zo4BY*{Mk3K^5o>@{x;#X8Qft$GJ(yScC)3X#@vY}H(epF9QlaA4*f+~{8_O6uMxgZ zieYp45CP~m;|l{o^9->r00?Va>;ZT=j=_}BxSAA0S4}VxfUuPYfF}UOM>ptu$#VlsDoIy@RO9tDOM0+5CptuuA2EgP%`NSeT`O=mKN|C zsfZnIZRl=$^phE`lH{;v)V}QPRGtqrZB?w%RbQlt6L`mdgDd`Jnt5L+SeVou}VNuQ@?8YCiC=f{ADns9QL79ZwYK1Z`;&U*EkM>DVBE);D{F;V zbHH%Bqp#d6#Oecq=L#y7M}Vv)C@-4pN&YJ!6d0iy^By$^=XS;~ZHF&itm>Ixl2j9L z3t~P3AY~k(8(rm|&|ak`7jOyB99gL70JcE>!|*e#$O+Nv7>sHVDi?y$@<3JBo1Vu1 zdMtGX)3m598LiHNgLRgm*(#Gz8c(B-2BBa#+yr*d2C&;TfZa)*d7W(4c@t?| zYTTF7;_(i?XjIn~)Qz#JyK|ONv^Pk69B6FX{(J0i%58Ep{{ey28 zVG47b4t$3lZfY&RMK<3YJEEp?t6tt1B5GH_9Kd&N+42n^y0J1oK0M!{!epK+sAj}4 zBv!SHuW?Eu(@!?*QNEtZOovusq%$edp3upE%E;tb^&W zU5n!IC+S{QYGI8%8par~hTWU(FU?GJK??tI76f!8Vx5NRc>|j7stk)auhki~omc2z z+kYDmh_oLX3r*s~pfnGZ|C|kYy%M|gfv+1yRarKXqAT(w`0BLSV%2W|kG=#t9motY zYRuz7jd`3b+VX+AdEHhu++ohRP`69U{MY1$`4qKc4-TQEkiLepG;2qNRsW(OBu@6b zgL7SMm`sZYF}WW&!}=dG*#Ggo^NH`yr*$@YI@kOk#h{UuwpqI^o0Xa-YiUp5^hzEJ=Q zRQ~ubKsnqk7tcM&3iM+HIaga{1+>pu{*@jMvoPS5M)x@BMiFYEad6xFCo`E;v#R~n zjpZ6L;-a=#AM=W(md0NY@_y~Fm_@$d7ii@F=3iFsWCsx6|DfDgUHHFy5CFsUUv6v} zcx?Jh9?%QR`D*v&g{isX^JW!k6?qv`pm@zV+DE<(e?^ARj zW~m3l<0?7i?M3%jMT0e4N+)AV;g|(A=hBx_+3BWY?5rDHj1Zk(QWa?YHxR)PFg3Qs z!c-W+S|<9&ZS7yw<(1}a44UnwZbE~de@%)fcDJ+JQ&BVDBA*k+O^lc)2DSD@mzQsF z^8OmUenJS)De!L)%FpEeOExnl(0|I)HHO3UdfYLr$mU?`iaY!7MF(XLp?$X zkroh`65OP*u!NVWK{jhlK69E{UbIIv_&t#;fMt7^f2+1dZEBacu!ROm(vHyT{xn0T zH4aEw*(4_d?H11+(?%VKuW+OwQnKiHsdQ=LQl#>!JJR$*_Q00gM8LG7L3p8<_icUoYf8wNYeE|Fz#0?`VUCbB&~atv{i_Om z1u@K~YMR!lnqg{#V^m68CP&g=3-s@xemC{!Z0Dir_GH%Z=IW3K%Nh}NPXab^7T|96?C)}Tw6RffK;N^)#b10v#jCRt1!9hYIO_-r6jyv?!UxJJLGyX%7odqG0-bQA>a=1U*STJwYBFHN^vn`~5VP@$|To-6B) zqQJR*PNjO8Fb51qYOhUHcVzhI+RNWvvDVH6^YkC~z#rD>r>E~Ts06p1dwzNeQqFMV z;pzTDUD!6yJ$+kI>FDk&FQ=@<KI>!pmESEFuuvorAIxY%gIGim3sb*6c`K(p8*+LQ zVn_F@?8*Bk`^6jCjC6Lc-jFT`eaq@0HyY>8rS zdp`cV!v7wg2dk(pn}Rg{8E=_E#v9#=KkW8C2TPkoaP=t3g-Q~%z1qjb!f~0j6IR`J zAgJ^po5=BT1v#%SxvO}267T@Zj^x?fCreN8sq>*fpu)O$yUPCb!_Q~xmSF3lC*zd9%kD}6pCAiRxs#hLz=WRf)pf$HO2<-Ga; z{a0Cee+3Rk@Wa%%zXR8qV4qd^PoS*?+p2E<2{a%mp%%XZZZ86VsmK374>A2}cEHZ&l&#jB#`ut9 zqcW!o4ab1w4`T@q@^pw}ES2JN%mC@b@f$SHD|6EqJW3LacH<5w8$` zf1yU`dEw^@s-G12u9H9PS%28ceSX$`KDn*Wx~(TmJZp(3{G~4FPhLAy4sVUCX_VBIFd+V_LcCgiEMv{3Evt(5 zX={4C|FpZA80~%9#Y76{&Ynoy-TQAWDX;}}l~g>X>~Nm$_fdc({hA?lKt7$O?jHmC z9jpqLcg^(ulyO7NL!mnpK{GxZELBqcvV`6@L3JESJ3e{uMtX+@2Psg*jBl7oV{j|ra+juNphh&>m3|Vpw zdHV^>vB{KjkEmpL3%?oIC&0~L45pB7nBuHcfP)kREF**Ut& zFDH~6|4=fa;lvM2XpEh);8*}rOO&qu(<&;w132or;L_QK(v!} zj;j$@h00w!&Ec!EJAoJ9lXOEKC|by1jI=x#Bn$0^9yFQNVI~}dFVS>P*ac4hV?9i0 z!J(Q@P!h`q6N!YA0IjU;U@J?TgtnCke;x23Ve}jXI9^d3*xSzj<%G&ZRae z>!TD$s7scmOn?1IOvbq{TO8bMP!evIrP&5FULxI+nhhgX;j2!}g-pYNmZ-Y<4`p_|p_ z!!4~(gXw`7VUU%nPzM;#bVg~$$+njzGzK?@{S5l?Vn{5Q0xKp}r++2#%RjpPURQv` zho%7GlFtJbblogBtz0tqG7I;ZIivL+z{hCiqJ$}hiyqibkdUq#(2%HZX9=t4@34|M z)mf$G*nqwE6zCPd)!inTsppgGoQe5XYSKNDWHuof?Oy8#;_J@%R9f=sik7D})(K+P z?zF=C=&Ad&MY3@F^v@d+qeEBXAVaEpqYW*nk9<-SAog)Xr5dPG7I5R{e8yfK?7z`d zVf9~ggR3LcQL$B4sw>*<_JTQtF8#>%?Iw1Y4x~(~y!%{hD*HYgZZY;^^6;)%82frl zgrjZ8l-grk!hDIbpN)?37r#h^BP}v7(bT~AO-dJ}E(ouc(QH7*nV3hWoC&_o z#5wcimF>MHd9MCpCO63%Mst)A8naD0z&{+uZ`y(3-dK>+LIYN5`+TIb`kmd>1}8`V z$LJ{wNT3=2IN_=%p4TN|fDxG+sBT%UOd6=Y?vnkdvn#Xk2L>ad!7gh8-z_3|KGdl9Q6>+Gfn}WG zFb|58vZd^E9gBMG4BQ+f!*?3}<|7?75mu`g~he*?;LwqaG+-u~j`&5k+ zp@eC3qyO*Kia*(+VuoCLsR{=|*W|_dq(wVLwG-ZfkY*xCk19Gut+vyGwbdf-LAFK; zCwD8O;2$8yLod*8GWq>GV0A+ZRdum8B7cpdoP3P-Ttb%7S)Ap)#(7t%Bl zVr{9$u&C?FyV*e!g-0Qa9JcLCbX5ZZ*MGp=rlP)FFMJSko)XY{QDV@F$swLP-c`6X zgU8_`W`NEOw}hT*^QavMh^f=kb>Wat`r%8|$H*Og!J?@fp$1x&6-Pj{G8|1#~^dfWH3!-*=|E7Ld zyXS1s3MD*Re~Zs%W+l{l@1mJ1d?v?rby14qCAQgbTkNy&@f1x0%w+NK1gnI6io*(& zKDDF#L#cMzXjWK4-2&YJ7wvZ6K^iM5c3X$U{~dH*+Z5r!F3qHb;X`<0F8Wsq*1vlSqdgCqTKDjEupAH~_CJfX^WxK{DzOGO;%0<1=tBm?!8Azf7NnI=A+yS@y*q_O9X>`RX zx&`I%Si33}TEV68SP+MLd|EL6!sT{b5X945{bOJF@y{AD{RkW^pGQ1#?M?g_T`e@c zW3St6f#+1Y;THJqrqEEz){|-0=A~V?&;nl1JxuhWdtT?}Pi*6aH=~CaYA-FlZWaT) zV|4GW=%oJJKa&~`62gYP!NESVv*#bjGVLG1kFtyE*}~$S#TBcdApUwkQRJmALYH{E zl@|Pd7p{b+)*?8GfU&NF)lB0U+qg@L0X9`Z#$dmWPCXe`MBYpOCGh$M-L$v@UU%jN zw5K56q13A+=|}o{-G!5Cv1ukK-ObwShk7+7%b=HtBzBwU&Cj`Sngpriiw`cz@=H^g zG1%5nSF$^cS_%lajF1O*`E`rGZ}bcHD&`bm{cIW!jVhnkwLp~aYFDfl@axo|{!Z{Y z_MzsNZw`L{W$$R0@eR9RPhgO&NHNZTw6%e*uog!dfe5G3?l2a%ZN`#Sf7`%?s9lu4 zZoET{k(Y|E{oJCA&Kyo98j>U<>adE3ZF-+&R3Eff;iPWeC`ovF9eXt#5|DD;l(b8` ziYOl4448_u_+LtUIvjd5Xo;s~WR9@+vj5xm$xDEA5?5w0OqJatq=>^hSZ%dBtcUkY z=M9^oRcv)|?~|Eps1-%@i)=A`=6j_;tN%ziDGQa$Y#I*+Eyk{yo%ne+M{fke^;wX- z9yFq|AvLGz@eW~nQgI)4JlcX{G!qr0hc~K^+-rQe{+y1)iS3DO9JY8ezv4@Ev@G*3 zZ>;~nWT3&Qn=N~XC?i9aqUFmi{l=lMxZ$nmn6gC35FY%X6mF*)~ z^r`nDQ8NfMHPa<+BWaOg|U-0c2(?i7g`kBs;r}eW6@5oO?;dQ8W0Tkdstuo^5yWkzVTHFx8)$ zB8Q;cs9PA$LP#?}Y4&&n.slice(0,4)==="data"&&Ei.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(ft,Ti);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!ft.test(o)){let l=o.replace(Ci,Ai);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=jn}return new i(r,t)}function Ai(e){return"-"+e.toLowerCase()}function Ti(e){return e.charAt(1).toUpperCase()}const vi=Zt([er,bi,rr,ir,lr],"html"),Hn=Zt([er,wi,rr,ir,lr],"svg");function Pi(e){return e.join(" ").trim()}var Pe={},pn,ht;function zi(){if(ht)return pn;ht=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,a=/^\s+|\s+$/g,s=` +`,u="/",f="*",c="",p="comment",h="declaration";pn=function(w,E){if(typeof w!="string")throw new TypeError("First argument must be a string");if(!w)return[];E=E||{};var y=1,I=1;function C(z){var T=z.match(t);T&&(y+=T.length);var L=z.lastIndexOf(s);I=~L?z.length-L:I+z.length}function R(){var z={line:y,column:I};return function(T){return T.position=new _(z),U(),T}}function _(z){this.start=z,this.end={line:y,column:I},this.source=E.source}_.prototype.content=w;function b(z){var T=new Error(E.source+":"+y+":"+I+": "+z);if(T.reason=z,T.filename=E.source,T.line=y,T.column=I,T.source=w,!E.silent)throw T}function M(z){var T=z.exec(w);if(T){var L=T[0];return C(L),w=w.slice(L.length),T}}function U(){M(n)}function H(z){var T;for(z=z||[];T=k();)T!==!1&&z.push(T);return z}function k(){var z=R();if(!(u!=w.charAt(0)||f!=w.charAt(1))){for(var T=2;c!=w.charAt(T)&&(f!=w.charAt(T)||u!=w.charAt(T+1));)++T;if(T+=2,c===w.charAt(T-1))return b("End of comment missing");var L=w.slice(2,T-2);return I+=2,C(L),w=w.slice(T),I+=2,z({type:p,comment:L})}}function v(){var z=R(),T=M(r);if(T){if(k(),!M(i))return b("property missing ':'");var L=M(o),Y=z({type:h,property:d(T[0].replace(e,c)),value:L?d(L[0].replace(e,c)):c});return M(l),Y}}function P(){var z=[];H(z);for(var T;T=v();)T!==!1&&(z.push(T),H(z));return z}return U(),P()};function d(w){return w?w.replace(a,c):c}return pn}var pt;function Di(){if(pt)return Pe;pt=1;var e=Pe&&Pe.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Pe,"__esModule",{value:!0}),Pe.default=n;const t=e(zi());function n(r,i){let o=null;if(!r||typeof r!="string")return o;const l=(0,t.default)(r),a=typeof i=="function";return l.forEach(s=>{if(s.type!=="declaration")return;const{property:u,value:f}=s;a?i(u,f,s):f&&(o=o||{},o[u]=f)}),o}return Pe}var Be={},mt;function Li(){if(mt)return Be;mt=1,Object.defineProperty(Be,"__esModule",{value:!0}),Be.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,t=/-([a-z])/g,n=/^[^-]+$/,r=/^-(webkit|moz|ms|o|khtml)-/,i=/^-(ms)-/,o=function(u){return!u||n.test(u)||e.test(u)},l=function(u,f){return f.toUpperCase()},a=function(u,f){return"".concat(f,"-")},s=function(u,f){return f===void 0&&(f={}),o(u)?u:(u=u.toLowerCase(),f.reactCompat?u=u.replace(i,a):u=u.replace(r,a),u.replace(t,l))};return Be.camelCase=s,Be}var je,gt;function Fi(){if(gt)return je;gt=1;var e=je&&je.__importDefault||function(i){return i&&i.__esModule?i:{default:i}},t=e(Di()),n=Li();function r(i,o){var l={};return!i||typeof i!="string"||(0,t.default)(i,function(a,s){a&&s&&(l[(0,n.camelCase)(a,o)]=s)}),l}return r.default=r,je=r,je}var Ri=Fi();const _i=Kt(Ri),or=ar("end"),Un=ar("start");function ar(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function Oi(e){const t=Un(e),n=or(e);if(t&&n)return{start:t,end:n}}function qe(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?dt(e.position):"start"in e||"end"in e?dt(e):"line"in e||"column"in e?Ln(e):""}function Ln(e){return kt(e&&e.line)+":"+kt(e&&e.column)}function dt(e){return Ln(e&&e.start)+"-"+Ln(e&&e.end)}function kt(e){return e&&typeof e=="number"?e:1}class J extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let i="",o={},l=!1;if(n&&("line"in n&&"column"in n?o={place:n}:"start"in n&&"end"in n?o={place:n}:"type"in n?o={ancestors:[n],place:n.position}:o={...n}),typeof t=="string"?i=t:!o.cause&&t&&(l=!0,i=t.message,o.cause=t),!o.ruleId&&!o.source&&typeof r=="string"){const s=r.indexOf(":");s===-1?o.ruleId=r:(o.source=r.slice(0,s),o.ruleId=r.slice(s+1))}if(!o.place&&o.ancestors&&o.ancestors){const s=o.ancestors[o.ancestors.length-1];s&&(o.place=s.position)}const a=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=a?a.column:void 0,this.fatal=void 0,this.file="",this.message=i,this.line=a?a.line:void 0,this.name=qe(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=l&&o.cause&&typeof o.cause.stack=="string"?o.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}J.prototype.file="";J.prototype.name="";J.prototype.reason="";J.prototype.message="";J.prototype.stack="";J.prototype.column=void 0;J.prototype.line=void 0;J.prototype.ancestors=void 0;J.prototype.cause=void 0;J.prototype.fatal=void 0;J.prototype.place=void 0;J.prototype.ruleId=void 0;J.prototype.source=void 0;const qn={}.hasOwnProperty,Mi=new Map,Ni=/[A-Z]/g,Bi=new Set(["table","tbody","thead","tfoot","tr"]),ji=new Set(["td","th"]),ur="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function Hi(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=Qi(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=Xi(n,t.jsx,t.jsxs)}const i={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?Hn:vi,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},o=sr(i,e,void 0);return o&&typeof o!="string"?o:i.create(e,i.Fragment,{children:o||void 0},void 0)}function sr(e,t,n){if(t.type==="element")return Ui(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return qi(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return $i(e,t,n);if(t.type==="mdxjsEsm")return Vi(e,t);if(t.type==="root")return Wi(e,t,n);if(t.type==="text")return Yi(e,t)}function Ui(e,t,n){const r=e.schema;let i=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(i=Hn,e.schema=i),e.ancestors.push(t);const o=fr(e,t.tagName,!1),l=Gi(e,t);let a=$n(e,t);return Bi.has(t.tagName)&&(a=a.filter(function(s){return typeof s=="string"?!yi(s):!0})),cr(e,l,o,t),Vn(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function qi(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return se(r.type==="ExpressionStatement"),e.evaluater.evaluateExpression(r.expression)}We(e,t.position)}function Vi(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);We(e,t.position)}function $i(e,t,n){const r=e.schema;let i=r;t.name==="svg"&&r.space==="html"&&(i=Hn,e.schema=i),e.ancestors.push(t);const o=t.name===null?e.Fragment:fr(e,t.name,!0),l=Ji(e,t),a=$n(e,t);return cr(e,l,o,t),Vn(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function Wi(e,t,n){const r={};return Vn(r,$n(e,t)),e.create(t,e.Fragment,r,n)}function Yi(e,t){return t.value}function cr(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function Vn(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function Xi(e,t,n){return r;function r(i,o,l,a){const u=Array.isArray(l.children)?n:t;return a?u(o,l,a):u(o,l)}}function Qi(e,t){return n;function n(r,i,o,l){const a=Array.isArray(o.children),s=Un(r);return t(i,o,l,a,{columnNumber:s?s.column-1:void 0,fileName:e,lineNumber:s?s.line:void 0},void 0)}}function Gi(e,t){const n={};let r,i;for(i in t.properties)if(i!=="children"&&qn.call(t.properties,i)){const o=Ki(e,i,t.properties[i]);if(o){const[l,a]=o;e.tableCellAlignToStyle&&l==="align"&&typeof a=="string"&&ji.has(t.tagName)?r=a:n[l]=a}}if(r){const o=n.style||(n.style={});o[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function Ji(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const o=r.data.estree.body[0];se(o.type==="ExpressionStatement");const l=o.expression;se(l.type==="ObjectExpression");const a=l.properties[0];se(a.type==="SpreadElement"),Object.assign(n,e.evaluater.evaluateExpression(a.argument))}else We(e,t.position);else{const i=r.name;let o;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const a=r.value.data.estree.body[0];se(a.type==="ExpressionStatement"),o=e.evaluater.evaluateExpression(a.expression)}else We(e,t.position);else o=r.value===null?!0:r.value;n[i]=o}return n}function $n(e,t){const n=[];let r=-1;const i=e.passKeys?new Map:Mi;for(;++ri?0:i+t:t=t>i?i:t,n=n>0?n:0,r.length<1e4)l=Array.from(r),l.unshift(t,n),e.splice(...l);else for(n&&e.splice(t,n);o0?(re(e,e.length,0,t),e):t}const bt={}.hasOwnProperty;function pr(e){const t={};let n=-1;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}function ce(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const K=be(/[A-Za-z]/),G=be(/[\dA-Za-z]/),al=be(/[#-'*+\--9=?A-Z^-~]/);function rn(e){return e!==null&&(e<32||e===127)}const Fn=be(/\d/),ul=be(/[\dA-Fa-f]/),sl=be(/[!-/:-@[-`{-~]/);function D(e){return e!==null&&e<-2}function V(e){return e!==null&&(e<0||e===32)}function N(e){return e===-2||e===-1||e===32}const un=be(new RegExp("\\p{P}|\\p{S}","u")),Ee=be(/\s/);function be(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function _e(e){const t=[];let n=-1,r=0,i=0;for(;++n55295&&o<57344){const a=e.charCodeAt(n+1);o<56320&&a>56319&&a<57344?(l=String.fromCharCode(o,a),i=1):l="�"}else l=String.fromCharCode(o);l&&(t.push(e.slice(r,n),encodeURIComponent(l)),r=n+i+1,l=""),i&&(n+=i,i=0)}return t.join("")+e.slice(r)}function j(e,t,n,r){const i=r?r-1:Number.POSITIVE_INFINITY;let o=0;return l;function l(s){return N(s)?(e.enter(n),a(s)):t(s)}function a(s){return N(s)&&o++l))return;const M=t.events.length;let U=M,H,k;for(;U--;)if(t.events[U][0]==="exit"&&t.events[U][1].type==="chunkFlow"){if(H){k=t.events[U][1].end;break}H=!0}for(y(r),b=M;bC;){const _=n[R];t.containerState=_[1],_[0].exit.call(t,e)}n.length=C}function I(){i.write([null]),o=void 0,i=void 0,t.containerState._closeFlow=void 0}}function ml(e,t,n){return j(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Fe(e){if(e===null||V(e)||Ee(e))return 1;if(un(e))return 2}function sn(e,t,n){const r=[];let i=-1;for(;++i1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const c={...e[r][1].end},p={...e[n][1].start};St(c,-s),St(p,s),l={type:s>1?"strongSequence":"emphasisSequence",start:c,end:{...e[r][1].end}},a={type:s>1?"strongSequence":"emphasisSequence",start:{...e[n][1].start},end:p},o={type:s>1?"strongText":"emphasisText",start:{...e[r][1].end},end:{...e[n][1].start}},i={type:s>1?"strong":"emphasis",start:{...l.start},end:{...a.end}},e[r][1].end={...l.start},e[n][1].start={...a.end},u=[],e[r][1].end.offset-e[r][1].start.offset&&(u=ie(u,[["enter",e[r][1],t],["exit",e[r][1],t]])),u=ie(u,[["enter",i,t],["enter",l,t],["exit",l,t],["enter",o,t]]),u=ie(u,sn(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),u=ie(u,[["exit",o,t],["enter",a,t],["exit",a,t],["exit",i,t]]),e[n][1].end.offset-e[n][1].start.offset?(f=2,u=ie(u,[["enter",e[n][1],t],["exit",e[n][1],t]])):f=0,re(e,r-1,n-r+3,u),n=r+u.length-f-2;break}}for(n=-1;++n0&&N(b)?j(e,I,"linePrefix",o+1)(b):I(b)}function I(b){return b===null||D(b)?e.check(Ct,w,R)(b):(e.enter("codeFlowValue"),C(b))}function C(b){return b===null||D(b)?(e.exit("codeFlowValue"),I(b)):(e.consume(b),C)}function R(b){return e.exit("codeFenced"),t(b)}function _(b,M,U){let H=0;return k;function k(L){return b.enter("lineEnding"),b.consume(L),b.exit("lineEnding"),v}function v(L){return b.enter("codeFencedFence"),N(L)?j(b,P,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(L):P(L)}function P(L){return L===a?(b.enter("codeFencedFenceSequence"),z(L)):U(L)}function z(L){return L===a?(H++,b.consume(L),z):H>=l?(b.exit("codeFencedFenceSequence"),N(L)?j(b,T,"whitespace")(L):T(L)):U(L)}function T(L){return L===null||D(L)?(b.exit("codeFencedFence"),M(L)):U(L)}}}function Al(e,t,n){const r=this;return i;function i(l){return l===null?n(l):(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}const gn={name:"codeIndented",tokenize:vl},Tl={partial:!0,tokenize:Pl};function vl(e,t,n){const r=this;return i;function i(u){return e.enter("codeIndented"),j(e,o,"linePrefix",5)(u)}function o(u){const f=r.events[r.events.length-1];return f&&f[1].type==="linePrefix"&&f[2].sliceSerialize(f[1],!0).length>=4?l(u):n(u)}function l(u){return u===null?s(u):D(u)?e.attempt(Tl,l,s)(u):(e.enter("codeFlowValue"),a(u))}function a(u){return u===null||D(u)?(e.exit("codeFlowValue"),l(u)):(e.consume(u),a)}function s(u){return e.exit("codeIndented"),t(u)}}function Pl(e,t,n){const r=this;return i;function i(l){return r.parser.lazy[r.now().line]?n(l):D(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),i):j(e,o,"linePrefix",5)(l)}function o(l){const a=r.events[r.events.length-1];return a&&a[1].type==="linePrefix"&&a[2].sliceSerialize(a[1],!0).length>=4?t(l):D(l)?i(l):n(l)}}const zl={name:"codeText",previous:Ll,resolve:Dl,tokenize:Fl};function Dl(e){let t=e.length-4,n=3,r,i;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const i=n||0;this.setCursor(Math.trunc(t));const o=this.right.splice(this.right.length-i,Number.POSITIVE_INFINITY);return r&&He(this.left,r),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),He(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),He(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(l):e.interrupt(r.parser.constructs.flow,n,t)(l)}}function xr(e,t,n,r,i,o,l,a,s){const u=s||Number.POSITIVE_INFINITY;let f=0;return c;function c(y){return y===60?(e.enter(r),e.enter(i),e.enter(o),e.consume(y),e.exit(o),p):y===null||y===32||y===41||rn(y)?n(y):(e.enter(r),e.enter(l),e.enter(a),e.enter("chunkString",{contentType:"string"}),w(y))}function p(y){return y===62?(e.enter(o),e.consume(y),e.exit(o),e.exit(i),e.exit(r),t):(e.enter(a),e.enter("chunkString",{contentType:"string"}),h(y))}function h(y){return y===62?(e.exit("chunkString"),e.exit(a),p(y)):y===null||y===60||D(y)?n(y):(e.consume(y),y===92?d:h)}function d(y){return y===60||y===62||y===92?(e.consume(y),h):h(y)}function w(y){return!f&&(y===null||y===41||V(y))?(e.exit("chunkString"),e.exit(a),e.exit(l),e.exit(r),t(y)):f999||h===null||h===91||h===93&&!s||h===94&&!a&&"_hiddenFootnoteSupport"in l.parser.constructs?n(h):h===93?(e.exit(o),e.enter(i),e.consume(h),e.exit(i),e.exit(r),t):D(h)?(e.enter("lineEnding"),e.consume(h),e.exit("lineEnding"),f):(e.enter("chunkString",{contentType:"string"}),c(h))}function c(h){return h===null||h===91||h===93||D(h)||a++>999?(e.exit("chunkString"),f(h)):(e.consume(h),s||(s=!N(h)),h===92?p:c)}function p(h){return h===91||h===92||h===93?(e.consume(h),a++,c):c(h)}}function wr(e,t,n,r,i,o){let l;return a;function a(p){return p===34||p===39||p===40?(e.enter(r),e.enter(i),e.consume(p),e.exit(i),l=p===40?41:p,s):n(p)}function s(p){return p===l?(e.enter(i),e.consume(p),e.exit(i),e.exit(r),t):(e.enter(o),u(p))}function u(p){return p===l?(e.exit(o),s(l)):p===null?n(p):D(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),j(e,u,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),f(p))}function f(p){return p===l||p===null||D(p)?(e.exit("chunkString"),u(p)):(e.consume(p),p===92?c:f)}function c(p){return p===l||p===92?(e.consume(p),f):f(p)}}function Ve(e,t){let n;return r;function r(i){return D(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),n=!0,r):N(i)?j(e,r,n?"linePrefix":"lineSuffix")(i):t(i)}}const Hl={name:"definition",tokenize:ql},Ul={partial:!0,tokenize:Vl};function ql(e,t,n){const r=this;let i;return o;function o(h){return e.enter("definition"),l(h)}function l(h){return br.call(r,e,a,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(h)}function a(h){return i=ce(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),h===58?(e.enter("definitionMarker"),e.consume(h),e.exit("definitionMarker"),s):n(h)}function s(h){return V(h)?Ve(e,u)(h):u(h)}function u(h){return xr(e,f,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(h)}function f(h){return e.attempt(Ul,c,c)(h)}function c(h){return N(h)?j(e,p,"whitespace")(h):p(h)}function p(h){return h===null||D(h)?(e.exit("definition"),r.parser.defined.push(i),t(h)):n(h)}}function Vl(e,t,n){return r;function r(a){return V(a)?Ve(e,i)(a):n(a)}function i(a){return wr(e,o,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(a)}function o(a){return N(a)?j(e,l,"whitespace")(a):l(a)}function l(a){return a===null||D(a)?t(a):n(a)}}const $l={name:"hardBreakEscape",tokenize:Wl};function Wl(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.consume(o),i}function i(o){return D(o)?(e.exit("hardBreakEscape"),t(o)):n(o)}}const Yl={name:"headingAtx",resolve:Xl,tokenize:Ql};function Xl(e,t){let n=e.length-2,r=3,i,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(i={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},re(e,r,n-r+1,[["enter",i,t],["enter",o,t],["exit",o,t],["exit",i,t]])),e}function Ql(e,t,n){let r=0;return i;function i(f){return e.enter("atxHeading"),o(f)}function o(f){return e.enter("atxHeadingSequence"),l(f)}function l(f){return f===35&&r++<6?(e.consume(f),l):f===null||V(f)?(e.exit("atxHeadingSequence"),a(f)):n(f)}function a(f){return f===35?(e.enter("atxHeadingSequence"),s(f)):f===null||D(f)?(e.exit("atxHeading"),t(f)):N(f)?j(e,a,"whitespace")(f):(e.enter("atxHeadingText"),u(f))}function s(f){return f===35?(e.consume(f),s):(e.exit("atxHeadingSequence"),a(f))}function u(f){return f===null||f===35||V(f)?(e.exit("atxHeadingText"),a(f)):(e.consume(f),u)}}const Gl=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],It=["pre","script","style","textarea"],Jl={concrete:!0,name:"htmlFlow",resolveTo:eo,tokenize:no},Kl={partial:!0,tokenize:ro},Zl={partial:!0,tokenize:to};function eo(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function no(e,t,n){const r=this;let i,o,l,a,s;return u;function u(g){return f(g)}function f(g){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(g),c}function c(g){return g===33?(e.consume(g),p):g===47?(e.consume(g),o=!0,w):g===63?(e.consume(g),i=3,r.interrupt?t:m):K(g)?(e.consume(g),l=String.fromCharCode(g),E):n(g)}function p(g){return g===45?(e.consume(g),i=2,h):g===91?(e.consume(g),i=5,a=0,d):K(g)?(e.consume(g),i=4,r.interrupt?t:m):n(g)}function h(g){return g===45?(e.consume(g),r.interrupt?t:m):n(g)}function d(g){const ae="CDATA[";return g===ae.charCodeAt(a++)?(e.consume(g),a===ae.length?r.interrupt?t:P:d):n(g)}function w(g){return K(g)?(e.consume(g),l=String.fromCharCode(g),E):n(g)}function E(g){if(g===null||g===47||g===62||V(g)){const ae=g===47,we=l.toLowerCase();return!ae&&!o&&It.includes(we)?(i=1,r.interrupt?t(g):P(g)):Gl.includes(l.toLowerCase())?(i=6,ae?(e.consume(g),y):r.interrupt?t(g):P(g)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(g):o?I(g):C(g))}return g===45||G(g)?(e.consume(g),l+=String.fromCharCode(g),E):n(g)}function y(g){return g===62?(e.consume(g),r.interrupt?t:P):n(g)}function I(g){return N(g)?(e.consume(g),I):k(g)}function C(g){return g===47?(e.consume(g),k):g===58||g===95||K(g)?(e.consume(g),R):N(g)?(e.consume(g),C):k(g)}function R(g){return g===45||g===46||g===58||g===95||G(g)?(e.consume(g),R):_(g)}function _(g){return g===61?(e.consume(g),b):N(g)?(e.consume(g),_):C(g)}function b(g){return g===null||g===60||g===61||g===62||g===96?n(g):g===34||g===39?(e.consume(g),s=g,M):N(g)?(e.consume(g),b):U(g)}function M(g){return g===s?(e.consume(g),s=null,H):g===null||D(g)?n(g):(e.consume(g),M)}function U(g){return g===null||g===34||g===39||g===47||g===60||g===61||g===62||g===96||V(g)?_(g):(e.consume(g),U)}function H(g){return g===47||g===62||N(g)?C(g):n(g)}function k(g){return g===62?(e.consume(g),v):n(g)}function v(g){return g===null||D(g)?P(g):N(g)?(e.consume(g),v):n(g)}function P(g){return g===45&&i===2?(e.consume(g),Y):g===60&&i===1?(e.consume(g),X):g===62&&i===4?(e.consume(g),oe):g===63&&i===3?(e.consume(g),m):g===93&&i===5?(e.consume(g),pe):D(g)&&(i===6||i===7)?(e.exit("htmlFlowData"),e.check(Kl,me,z)(g)):g===null||D(g)?(e.exit("htmlFlowData"),z(g)):(e.consume(g),P)}function z(g){return e.check(Zl,T,me)(g)}function T(g){return e.enter("lineEnding"),e.consume(g),e.exit("lineEnding"),L}function L(g){return g===null||D(g)?z(g):(e.enter("htmlFlowData"),P(g))}function Y(g){return g===45?(e.consume(g),m):P(g)}function X(g){return g===47?(e.consume(g),l="",le):P(g)}function le(g){if(g===62){const ae=l.toLowerCase();return It.includes(ae)?(e.consume(g),oe):P(g)}return K(g)&&l.length<8?(e.consume(g),l+=String.fromCharCode(g),le):P(g)}function pe(g){return g===93?(e.consume(g),m):P(g)}function m(g){return g===62?(e.consume(g),oe):g===45&&i===2?(e.consume(g),m):P(g)}function oe(g){return g===null||D(g)?(e.exit("htmlFlowData"),me(g)):(e.consume(g),oe)}function me(g){return e.exit("htmlFlow"),t(g)}}function to(e,t,n){const r=this;return i;function i(l){return D(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o):n(l)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}function ro(e,t,n){return r;function r(i){return e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),e.attempt(Qe,t,n)}}const io={name:"htmlText",tokenize:lo};function lo(e,t,n){const r=this;let i,o,l;return a;function a(m){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(m),s}function s(m){return m===33?(e.consume(m),u):m===47?(e.consume(m),_):m===63?(e.consume(m),C):K(m)?(e.consume(m),U):n(m)}function u(m){return m===45?(e.consume(m),f):m===91?(e.consume(m),o=0,d):K(m)?(e.consume(m),I):n(m)}function f(m){return m===45?(e.consume(m),h):n(m)}function c(m){return m===null?n(m):m===45?(e.consume(m),p):D(m)?(l=c,X(m)):(e.consume(m),c)}function p(m){return m===45?(e.consume(m),h):c(m)}function h(m){return m===62?Y(m):m===45?p(m):c(m)}function d(m){const oe="CDATA[";return m===oe.charCodeAt(o++)?(e.consume(m),o===oe.length?w:d):n(m)}function w(m){return m===null?n(m):m===93?(e.consume(m),E):D(m)?(l=w,X(m)):(e.consume(m),w)}function E(m){return m===93?(e.consume(m),y):w(m)}function y(m){return m===62?Y(m):m===93?(e.consume(m),y):w(m)}function I(m){return m===null||m===62?Y(m):D(m)?(l=I,X(m)):(e.consume(m),I)}function C(m){return m===null?n(m):m===63?(e.consume(m),R):D(m)?(l=C,X(m)):(e.consume(m),C)}function R(m){return m===62?Y(m):C(m)}function _(m){return K(m)?(e.consume(m),b):n(m)}function b(m){return m===45||G(m)?(e.consume(m),b):M(m)}function M(m){return D(m)?(l=M,X(m)):N(m)?(e.consume(m),M):Y(m)}function U(m){return m===45||G(m)?(e.consume(m),U):m===47||m===62||V(m)?H(m):n(m)}function H(m){return m===47?(e.consume(m),Y):m===58||m===95||K(m)?(e.consume(m),k):D(m)?(l=H,X(m)):N(m)?(e.consume(m),H):Y(m)}function k(m){return m===45||m===46||m===58||m===95||G(m)?(e.consume(m),k):v(m)}function v(m){return m===61?(e.consume(m),P):D(m)?(l=v,X(m)):N(m)?(e.consume(m),v):H(m)}function P(m){return m===null||m===60||m===61||m===62||m===96?n(m):m===34||m===39?(e.consume(m),i=m,z):D(m)?(l=P,X(m)):N(m)?(e.consume(m),P):(e.consume(m),T)}function z(m){return m===i?(e.consume(m),i=void 0,L):m===null?n(m):D(m)?(l=z,X(m)):(e.consume(m),z)}function T(m){return m===null||m===34||m===39||m===60||m===61||m===96?n(m):m===47||m===62||V(m)?H(m):(e.consume(m),T)}function L(m){return m===47||m===62||V(m)?H(m):n(m)}function Y(m){return m===62?(e.consume(m),e.exit("htmlTextData"),e.exit("htmlText"),t):n(m)}function X(m){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),le}function le(m){return N(m)?j(e,pe,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(m):pe(m)}function pe(m){return e.enter("htmlTextData"),l(m)}}const Xn={name:"labelEnd",resolveAll:so,resolveTo:co,tokenize:fo},oo={tokenize:ho},ao={tokenize:po},uo={tokenize:mo};function so(e){let t=-1;const n=[];for(;++t=3&&(u===null||D(u))?(e.exit("thematicBreak"),t(u)):n(u)}function s(u){return u===i?(e.consume(u),r++,s):(e.exit("thematicBreakSequence"),N(u)?j(e,a,"whitespace")(u):a(u))}}const Z={continuation:{tokenize:Io},exit:To,name:"list",tokenize:Eo},So={partial:!0,tokenize:vo},Co={partial:!0,tokenize:Ao};function Eo(e,t,n){const r=this,i=r.events[r.events.length-1];let o=i&&i[1].type==="linePrefix"?i[2].sliceSerialize(i[1],!0).length:0,l=0;return a;function a(h){const d=r.containerState.type||(h===42||h===43||h===45?"listUnordered":"listOrdered");if(d==="listUnordered"?!r.containerState.marker||h===r.containerState.marker:Fn(h)){if(r.containerState.type||(r.containerState.type=d,e.enter(d,{_container:!0})),d==="listUnordered")return e.enter("listItemPrefix"),h===42||h===45?e.check(tn,n,u)(h):u(h);if(!r.interrupt||h===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),s(h)}return n(h)}function s(h){return Fn(h)&&++l<10?(e.consume(h),s):(!r.interrupt||l<2)&&(r.containerState.marker?h===r.containerState.marker:h===41||h===46)?(e.exit("listItemValue"),u(h)):n(h)}function u(h){return e.enter("listItemMarker"),e.consume(h),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||h,e.check(Qe,r.interrupt?n:f,e.attempt(So,p,c))}function f(h){return r.containerState.initialBlankLine=!0,o++,p(h)}function c(h){return N(h)?(e.enter("listItemPrefixWhitespace"),e.consume(h),e.exit("listItemPrefixWhitespace"),p):n(h)}function p(h){return r.containerState.size=o+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(h)}}function Io(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Qe,i,o);function i(a){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,j(e,t,"listItemIndent",r.containerState.size+1)(a)}function o(a){return r.containerState.furtherBlankLines||!N(a)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,l(a)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Co,t,l)(a))}function l(a){return r.containerState._closeFlow=!0,r.interrupt=void 0,j(e,e.attempt(Z,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(a)}}function Ao(e,t,n){const r=this;return j(e,i,"listItemIndent",r.containerState.size+1);function i(o){const l=r.events[r.events.length-1];return l&&l[1].type==="listItemIndent"&&l[2].sliceSerialize(l[1],!0).length===r.containerState.size?t(o):n(o)}}function To(e){e.exit(this.containerState.type)}function vo(e,t,n){const r=this;return j(e,i,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function i(o){const l=r.events[r.events.length-1];return!N(o)&&l&&l[1].type==="listItemPrefixWhitespace"?t(o):n(o)}}const At={name:"setextUnderline",resolveTo:Po,tokenize:zo};function Po(e,t){let n=e.length,r,i,o;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(i=n)}else e[n][1].type==="content"&&e.splice(n,1),!o&&e[n][1].type==="definition"&&(o=n);const l={type:"setextHeading",start:{...e[r][1].start},end:{...e[e.length-1][1].end}};return e[i][1].type="setextHeadingText",o?(e.splice(i,0,["enter",l,t]),e.splice(o+1,0,["exit",e[r][1],t]),e[r][1].end={...e[o][1].end}):e[r][1]=l,e.push(["exit",l,t]),e}function zo(e,t,n){const r=this;let i;return o;function o(u){let f=r.events.length,c;for(;f--;)if(r.events[f][1].type!=="lineEnding"&&r.events[f][1].type!=="linePrefix"&&r.events[f][1].type!=="content"){c=r.events[f][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||c)?(e.enter("setextHeadingLine"),i=u,l(u)):n(u)}function l(u){return e.enter("setextHeadingLineSequence"),a(u)}function a(u){return u===i?(e.consume(u),a):(e.exit("setextHeadingLineSequence"),N(u)?j(e,s,"lineSuffix")(u):s(u))}function s(u){return u===null||D(u)?(e.exit("setextHeadingLine"),t(u)):n(u)}}const Do={tokenize:Lo};function Lo(e){const t=this,n=e.attempt(Qe,r,e.attempt(this.parser.constructs.flowInitial,i,j(e,e.attempt(this.parser.constructs.flow,i,e.attempt(Ol,i)),"linePrefix")));return n;function r(o){if(o===null){e.consume(o);return}return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function i(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const Fo={resolveAll:Cr()},Ro=Sr("string"),_o=Sr("text");function Sr(e){return{resolveAll:Cr(e==="text"?Oo:void 0),tokenize:t};function t(n){const r=this,i=this.parser.constructs[e],o=n.attempt(i,l,a);return l;function l(f){return u(f)?o(f):a(f)}function a(f){if(f===null){n.consume(f);return}return n.enter("data"),n.consume(f),s}function s(f){return u(f)?(n.exit("data"),o(f)):(n.consume(f),s)}function u(f){if(f===null)return!0;const c=i[f];let p=-1;if(c)for(;++p-1){const a=l[0];typeof a=="string"?l[0]=a.slice(r):l.shift()}o>0&&l.push(e[i].slice(0,o))}return l}function Qo(e,t){let n=-1;const r=[];let i;for(;++n0){const ue=F.tokenStack[F.tokenStack.length-1];(ue[1]||vt).call(F,void 0,ue[0])}for(A.position={start:xe(x.length>0?x[0][1].start:{line:1,column:1,offset:0}),end:xe(x.length>0?x[x.length-2][1].end:{line:1,column:1,offset:0})},q=-1;++q1?"-"+a:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(l)}]};e.patch(t,s);const u={type:"element",tagName:"sup",properties:{},children:[s]};return e.patch(t,u),e.applyData(t,u)}function ha(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function pa(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function Ar(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const i=e.all(t),o=i[0];o&&o.type==="text"?o.value="["+o.value:i.unshift({type:"text",value:"["});const l=i[i.length-1];return l&&l.type==="text"?l.value+=r:i.push({type:"text",value:r}),i}function ma(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Ar(e,t);const i={src:_e(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(i.title=r.title);const o={type:"element",tagName:"img",properties:i,children:[]};return e.patch(t,o),e.applyData(t,o)}function ga(e,t){const n={src:_e(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function da(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function ka(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Ar(e,t);const i={href:_e(r.url||"")};r.title!==null&&r.title!==void 0&&(i.title=r.title);const o={type:"element",tagName:"a",properties:i,children:e.all(t)};return e.patch(t,o),e.applyData(t,o)}function ya(e,t){const n={href:_e(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function xa(e,t,n){const r=e.all(t),i=n?ba(n):Tr(t),o={},l=[];if(typeof t.checked=="boolean"){const f=r[0];let c;f&&f.type==="element"&&f.tagName==="p"?c=f:(c={type:"element",tagName:"p",properties:{},children:[]},r.unshift(c)),c.children.length>0&&c.children.unshift({type:"text",value:" "}),c.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),o.className=["task-list-item"]}let a=-1;for(;++a1}function wa(e,t){const n={},r=e.all(t);let i=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++i0){const l={type:"element",tagName:"tbody",properties:{},children:e.wrap(n,!0)},a=Un(t.children[1]),s=or(t.children[t.children.length-1]);a&&s&&(l.position={start:a,end:s}),i.push(l)}const o={type:"element",tagName:"table",properties:{},children:e.wrap(i,!0)};return e.patch(t,o),e.applyData(t,o)}function Aa(e,t,n){const r=n?n.children:void 0,o=(r?r.indexOf(t):1)===0?"th":"td",l=n&&n.type==="table"?n.align:void 0,a=l?l.length:t.children.length;let s=-1;const u=[];for(;++s0,!0),r[0]),i=r.index+r[0].length,r=n.exec(t);return o.push(Dt(t.slice(i),i>0,!1)),o.join("")}function Dt(e,t,n){let r=0,i=e.length;if(t){let o=e.codePointAt(r);for(;o===Pt||o===zt;)r++,o=e.codePointAt(r)}if(n){let o=e.codePointAt(i-1);for(;o===Pt||o===zt;)i--,o=e.codePointAt(i-1)}return i>r?e.slice(r,i):""}function Pa(e,t){const n={type:"text",value:va(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function za(e,t){const n={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}const Da={blockquote:oa,break:aa,code:ua,delete:sa,emphasis:ca,footnoteReference:fa,heading:ha,html:pa,imageReference:ma,image:ga,inlineCode:da,linkReference:ka,link:ya,listItem:xa,list:wa,paragraph:Sa,root:Ca,strong:Ea,table:Ia,tableCell:Ta,tableRow:Aa,text:Pa,thematicBreak:za,toml:Ke,yaml:Ke,definition:Ke,footnoteDefinition:Ke};function Ke(){}const vr=-1,cn=0,$e=1,ln=2,Qn=3,Gn=4,Jn=5,Kn=6,Pr=7,zr=8,Lt=typeof self=="object"?self:globalThis,La=(e,t)=>{const n=(i,o)=>(e.set(o,i),i),r=i=>{if(e.has(i))return e.get(i);const[o,l]=t[i];switch(o){case cn:case vr:return n(l,i);case $e:{const a=n([],i);for(const s of l)a.push(r(s));return a}case ln:{const a=n({},i);for(const[s,u]of l)a[r(s)]=r(u);return a}case Qn:return n(new Date(l),i);case Gn:{const{source:a,flags:s}=l;return n(new RegExp(a,s),i)}case Jn:{const a=n(new Map,i);for(const[s,u]of l)a.set(r(s),r(u));return a}case Kn:{const a=n(new Set,i);for(const s of l)a.add(r(s));return a}case Pr:{const{name:a,message:s}=l;return n(new Lt[a](s),i)}case zr:return n(BigInt(l),i);case"BigInt":return n(Object(BigInt(l)),i);case"ArrayBuffer":return n(new Uint8Array(l).buffer,l);case"DataView":{const{buffer:a}=new Uint8Array(l);return n(new DataView(a),l)}}return n(new Lt[o](l),i)};return r},Ft=e=>La(new Map,e)(0),ze="",{toString:Fa}={},{keys:Ra}=Object,Ue=e=>{const t=typeof e;if(t!=="object"||!e)return[cn,t];const n=Fa.call(e).slice(8,-1);switch(n){case"Array":return[$e,ze];case"Object":return[ln,ze];case"Date":return[Qn,ze];case"RegExp":return[Gn,ze];case"Map":return[Jn,ze];case"Set":return[Kn,ze];case"DataView":return[$e,n]}return n.includes("Array")?[$e,n]:n.includes("Error")?[Pr,n]:[ln,n]},Ze=([e,t])=>e===cn&&(t==="function"||t==="symbol"),_a=(e,t,n,r)=>{const i=(l,a)=>{const s=r.push(l)-1;return n.set(a,s),s},o=l=>{if(n.has(l))return n.get(l);let[a,s]=Ue(l);switch(a){case cn:{let f=l;switch(s){case"bigint":a=zr,f=l.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+s);f=null;break;case"undefined":return i([vr],l)}return i([a,f],l)}case $e:{if(s){let p=l;return s==="DataView"?p=new Uint8Array(l.buffer):s==="ArrayBuffer"&&(p=new Uint8Array(l)),i([s,[...p]],l)}const f=[],c=i([a,f],l);for(const p of l)f.push(o(p));return c}case ln:{if(s)switch(s){case"BigInt":return i([s,l.toString()],l);case"Boolean":case"Number":case"String":return i([s,l.valueOf()],l)}if(t&&"toJSON"in l)return o(l.toJSON());const f=[],c=i([a,f],l);for(const p of Ra(l))(e||!Ze(Ue(l[p])))&&f.push([o(p),o(l[p])]);return c}case Qn:return i([a,l.toISOString()],l);case Gn:{const{source:f,flags:c}=l;return i([a,{source:f,flags:c}],l)}case Jn:{const f=[],c=i([a,f],l);for(const[p,h]of l)(e||!(Ze(Ue(p))||Ze(Ue(h))))&&f.push([o(p),o(h)]);return c}case Kn:{const f=[],c=i([a,f],l);for(const p of l)(e||!Ze(Ue(p)))&&f.push(o(p));return c}}const{message:u}=l;return i([a,{name:s,message:u}],l)};return o},Rt=(e,{json:t,lossy:n}={})=>{const r=[];return _a(!(t||n),!!t,new Map,r)(e),r},on=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?Ft(Rt(e,t)):structuredClone(e):(e,t)=>Ft(Rt(e,t));function Oa(e,t){const n=[{type:"text",value:"↩"}];return t>1&&n.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),n}function Ma(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function Na(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=e.options.footnoteBackContent||Oa,r=e.options.footnoteBackLabel||Ma,i=e.options.footnoteLabel||"Footnotes",o=e.options.footnoteLabelTagName||"h2",l=e.options.footnoteLabelProperties||{className:["sr-only"]},a=[];let s=-1;for(;++s0&&d.push({type:"text",value:" "});let I=typeof n=="string"?n:n(s,h);typeof I=="string"&&(I={type:"text",value:I}),d.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+p+(h>1?"-"+h:""),dataFootnoteBackref:"",ariaLabel:typeof r=="string"?r:r(s,h),className:["data-footnote-backref"]},children:Array.isArray(I)?I:[I]})}const E=f[f.length-1];if(E&&E.type==="element"&&E.tagName==="p"){const I=E.children[E.children.length-1];I&&I.type==="text"?I.value+=" ":E.children.push({type:"text",value:" "}),E.children.push(...d)}else f.push(...d);const y={type:"element",tagName:"li",properties:{id:t+"fn-"+p},children:e.wrap(f,!0)};e.patch(u,y),a.push(y)}if(a.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:o,properties:{...on(l),id:"footnote-label"},children:[{type:"text",value:i}]},{type:"text",value:` +`},{type:"element",tagName:"ol",properties:{},children:e.wrap(a,!0)},{type:"text",value:` +`}]}}const _n={}.hasOwnProperty,Ba={};function ja(e,t){const n=t||Ba,r=new Map,i=new Map,o=new Map,l={...Da,...n.handlers},a={all:u,applyData:Ua,definitionById:r,footnoteById:i,footnoteCounts:o,footnoteOrder:[],handlers:l,one:s,options:n,patch:Ha,wrap:Va};return Bn(e,function(f){if(f.type==="definition"||f.type==="footnoteDefinition"){const c=f.type==="definition"?r:i,p=String(f.identifier).toUpperCase();c.has(p)||c.set(p,f)}}),a;function s(f,c){const p=f.type,h=a.handlers[p];if(_n.call(a.handlers,p)&&h)return h(a,f,c);if(a.options.passThrough&&a.options.passThrough.includes(p)){if("children"in f){const{children:w,...E}=f,y=on(E);return y.children=a.all(f),y}return on(f)}return(a.options.unknownHandler||qa)(a,f,c)}function u(f){const c=[];if("children"in f){const p=f.children;let h=-1;for(;++h0&&n.push({type:"text",value:` +`}),n}function _t(e){let t=0,n=e.charCodeAt(t);for(;n===9||n===32;)t++,n=e.charCodeAt(t);return e.slice(t)}function Ot(e,t){const n=ja(e,t),r=n.one(e,void 0),i=Na(n),o=Array.isArray(r)?{type:"root",children:r}:r||{type:"root",children:[]};return i&&o.children.push({type:"text",value:` +`},i),o}function $a(e,t){return e&&"run"in e?async function(n,r){const i=Ot(n,{file:r,...t});await e.run(i,r)}:function(n,r){return Ot(n,{file:r,...e||t})}}function Mt(e){if(e)throw e}var kn,Nt;function Wa(){if(Nt)return kn;Nt=1;var e=Object.prototype.hasOwnProperty,t=Object.prototype.toString,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=function(u){return typeof Array.isArray=="function"?Array.isArray(u):t.call(u)==="[object Array]"},o=function(u){if(!u||t.call(u)!=="[object Object]")return!1;var f=e.call(u,"constructor"),c=u.constructor&&u.constructor.prototype&&e.call(u.constructor.prototype,"isPrototypeOf");if(u.constructor&&!f&&!c)return!1;var p;for(p in u);return typeof p>"u"||e.call(u,p)},l=function(u,f){n&&f.name==="__proto__"?n(u,f.name,{enumerable:!0,configurable:!0,value:f.newValue,writable:!0}):u[f.name]=f.newValue},a=function(u,f){if(f==="__proto__")if(e.call(u,f)){if(r)return r(u,f).value}else return;return u[f]};return kn=function s(){var u,f,c,p,h,d,w=arguments[0],E=1,y=arguments.length,I=!1;for(typeof w=="boolean"&&(I=w,w=arguments[1]||{},E=2),(w==null||typeof w!="object"&&typeof w!="function")&&(w={});El.length;let s;a&&l.push(i);try{s=e.apply(this,l)}catch(u){const f=u;if(a&&n)throw f;return i(f)}a||(s&&s.then&&typeof s.then=="function"?s.then(o,i):s instanceof Error?i(s):o(s))}function i(l,...a){n||(n=!0,t(l,...a))}function o(l){i(null,l)}}const fe={basename:Ga,dirname:Ja,extname:Ka,join:Za,sep:"/"};function Ga(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');Ge(e);let n=0,r=-1,i=e.length,o;if(t===void 0||t.length===0||t.length>e.length){for(;i--;)if(e.codePointAt(i)===47){if(o){n=i+1;break}}else r<0&&(o=!0,r=i+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let l=-1,a=t.length-1;for(;i--;)if(e.codePointAt(i)===47){if(o){n=i+1;break}}else l<0&&(o=!0,l=i+1),a>-1&&(e.codePointAt(i)===t.codePointAt(a--)?a<0&&(r=i):(a=-1,r=l));return n===r?r=l:r<0&&(r=e.length),e.slice(n,r)}function Ja(e){if(Ge(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.codePointAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.codePointAt(0)===47?"/":".":t===1&&e.codePointAt(0)===47?"//":e.slice(0,t)}function Ka(e){Ge(e);let t=e.length,n=-1,r=0,i=-1,o=0,l;for(;t--;){const a=e.codePointAt(t);if(a===47){if(l){r=t+1;break}continue}n<0&&(l=!0,n=t+1),a===46?i<0?i=t:o!==1&&(o=1):i>-1&&(o=-1)}return i<0||n<0||o===0||o===1&&i===n-1&&i===r+1?"":e.slice(i,n)}function Za(...e){let t=-1,n;for(;++t0&&e.codePointAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function nu(e,t){let n="",r=0,i=-1,o=0,l=-1,a,s;for(;++l<=e.length;){if(l2){if(s=n.lastIndexOf("/"),s!==n.length-1){s<0?(n="",r=0):(n=n.slice(0,s),r=n.length-1-n.lastIndexOf("/")),i=l,o=0;continue}}else if(n.length>0){n="",r=0,i=l,o=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(i+1,l):n=e.slice(i+1,l),r=l-i-1;i=l,o=0}else a===46&&o>-1?o++:o=-1}return n}function Ge(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const tu={cwd:ru};function ru(){return"/"}function Mn(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function iu(e){if(typeof e=="string")e=new URL(e);else if(!Mn(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return lu(e)}function lu(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n0){let[h,...d]=f;const w=r[p][1];On(w)&&On(h)&&(h=yn(!0,w,h)),r[p]=[u,h,...d]}}}}const su=new Zn().freeze();function Sn(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function Cn(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function En(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function jt(e){if(!On(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function Ht(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function en(e){return cu(e)?e:new Dr(e)}function cu(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function fu(e){return typeof e=="string"||hu(e)}function hu(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const pu="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",Ut=[],qt={allowDangerousHtml:!0},mu=/^(https?|ircs?|mailto|xmpp)$/i,gu=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"className",id:"remove-classname"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function zc(e){const t=du(e),n=ku(e);return yu(t.runSync(t.parse(n),n),e)}function du(e){const t=e.rehypePlugins||Ut,n=e.remarkPlugins||Ut,r=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...qt}:qt;return su().use(la).use(n).use($a,r).use(t)}function ku(e){const t=e.children||"",n=new Dr;return typeof t=="string"&&(n.value=t),n}function yu(e,t){const n=t.allowedElements,r=t.allowElement,i=t.components,o=t.disallowedElements,l=t.skipHtml,a=t.unwrapDisallowed,s=t.urlTransform||xu;for(const f of gu)Object.hasOwn(t,f.from)&&ci("Unexpected `"+f.from+"` prop, "+(f.to?"use `"+f.to+"` instead":"remove it")+" (see <"+pu+"#"+f.id+"> for more info)");return Bn(e,u),Hi(e,{Fragment:fn.Fragment,components:i,ignoreInvalidStyle:!0,jsx:fn.jsx,jsxs:fn.jsxs,passKeys:!0,passNode:!0});function u(f,c,p){if(f.type==="raw"&&p&&typeof c=="number")return l?p.children.splice(c,1):p.children[c]={type:"text",value:f.value},c;if(f.type==="element"){let h;for(h in mn)if(Object.hasOwn(mn,h)&&Object.hasOwn(f.properties,h)){const d=f.properties[h],w=mn[h];(w===null||w.includes(f.tagName))&&(f.properties[h]=s(String(d||""),h,f))}}if(f.type==="element"){let h=n?!n.includes(f.tagName):o?o.includes(f.tagName):!1;if(!h&&r&&typeof c=="number"&&(h=!r(f,c,p)),h&&p&&typeof c=="number")return a&&f.children?p.children.splice(c,1,...f.children):p.children.splice(c,1),c}}}function xu(e){const t=e.indexOf(":"),n=e.indexOf("?"),r=e.indexOf("#"),i=e.indexOf("/");return t===-1||i!==-1&&t>i||n!==-1&&t>n||r!==-1&&t>r||mu.test(e.slice(0,t))?e:""}function Vt(e,t){const n=String(e);if(typeof t!="string")throw new TypeError("Expected character");let r=0,i=n.indexOf(t);for(;i!==-1;)r++,i=n.indexOf(t,i+t.length);return r}function bu(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function wu(e,t,n){const i=Jt((n||{}).ignore||[]),o=Su(t);let l=-1;for(;++l0?{type:"text",value:b}:void 0),b===!1?p.lastIndex=R+1:(d!==R&&I.push({type:"text",value:u.value.slice(d,R)}),Array.isArray(b)?I.push(...b):b&&I.push(b),d=R+C[0].length,y=!0),!p.global)break;C=p.exec(u.value)}return y?(d?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let n=t[0],r=n.indexOf(")");const i=Vt(e,"(");let o=Vt(e,")");for(;r!==-1&&i>o;)e+=n.slice(0,r+1),n=n.slice(r+1),r=n.indexOf(")"),o++;return[e,n]}function Lr(e,t){const n=e.input.charCodeAt(e.index-1);return(e.index===0||Ee(n)||un(n))&&(!t||n!==47)}Fr.peek=$u;function Mu(){this.buffer()}function Nu(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Bu(){this.buffer()}function ju(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Hu(e){const t=this.resume(),n=this.stack[this.stack.length-1];se(n.type==="footnoteReference"),n.identifier=ce(this.sliceSerialize(e)).toLowerCase(),n.label=t}function Uu(e){this.exit(e)}function qu(e){const t=this.resume(),n=this.stack[this.stack.length-1];se(n.type==="footnoteDefinition"),n.identifier=ce(this.sliceSerialize(e)).toLowerCase(),n.label=t}function Vu(e){this.exit(e)}function $u(){return"["}function Fr(e,t,n,r){const i=n.createTracker(r);let o=i.move("[^");const l=n.enter("footnoteReference"),a=n.enter("reference");return o+=i.move(n.safe(n.associationId(e),{after:"]",before:o})),a(),l(),o+=i.move("]"),o}function Wu(){return{enter:{gfmFootnoteCallString:Mu,gfmFootnoteCall:Nu,gfmFootnoteDefinitionLabelString:Bu,gfmFootnoteDefinition:ju},exit:{gfmFootnoteCallString:Hu,gfmFootnoteCall:Uu,gfmFootnoteDefinitionLabelString:qu,gfmFootnoteDefinition:Vu}}}function Yu(e){let t=!1;return e&&e.firstLineBlank&&(t=!0),{handlers:{footnoteDefinition:n,footnoteReference:Fr},unsafe:[{character:"[",inConstruct:["label","phrasing","reference"]}]};function n(r,i,o,l){const a=o.createTracker(l);let s=a.move("[^");const u=o.enter("footnoteDefinition"),f=o.enter("label");return s+=a.move(o.safe(o.associationId(r),{before:s,after:"]"})),f(),s+=a.move("]:"),r.children&&r.children.length>0&&(a.shift(4),s+=a.move((t?` +`:" ")+o.indentLines(o.containerFlow(r,a.current()),t?Rr:Xu))),u(),s}}function Xu(e,t,n){return t===0?e:Rr(e,t,n)}function Rr(e,t,n){return(n?"":" ")+e}const Qu=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];_r.peek=es;function Gu(){return{canContainEols:["delete"],enter:{strikethrough:Ku},exit:{strikethrough:Zu}}}function Ju(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:Qu}],handlers:{delete:_r}}}function Ku(e){this.enter({type:"delete",children:[]},e)}function Zu(e){this.exit(e)}function _r(e,t,n,r){const i=n.createTracker(r),o=n.enter("strikethrough");let l=i.move("~~");return l+=n.containerPhrasing(e,{...i.current(),before:l,after:"~"}),l+=i.move("~~"),o(),l}function es(){return"~"}function ns(e){return e.length}function ts(e,t){const n=t||{},r=(n.align||[]).concat(),i=n.stringLength||ns,o=[],l=[],a=[],s=[];let u=0,f=-1;for(;++fu&&(u=e[f].length);++ys[y])&&(s[y]=C)}w.push(I)}l[f]=w,a[f]=E}let c=-1;if(typeof r=="object"&&"length"in r)for(;++cs[c]&&(s[c]=I),h[c]=I),p[c]=C}l.splice(1,0,p),a.splice(1,0,h),f=-1;const d=[];for(;++f "),o.shift(2);const l=n.indentLines(n.containerFlow(e,o.current()),ls);return i(),l}function ls(e,t,n){return">"+(n?"":" ")+e}function os(e,t){return Wt(e,t.inConstruct,!0)&&!Wt(e,t.notInConstruct,!1)}function Wt(e,t,n){if(typeof t=="string"&&(t=[t]),!t||t.length===0)return n;let r=-1;for(;++rl&&(l=o):o=1,i=r+t.length,r=n.indexOf(t,i);return l}function us(e,t){return!!(t.options.fences===!1&&e.value&&!e.lang&&/[^ \r\n]/.test(e.value)&&!/^[\t ]*(?:[\r\n]|$)|(?:^|[\r\n])[\t ]*$/.test(e.value))}function ss(e){const t=e.options.fence||"`";if(t!=="`"&&t!=="~")throw new Error("Cannot serialize code with `"+t+"` for `options.fence`, expected `` ` `` or `~`");return t}function cs(e,t,n,r){const i=ss(n),o=e.value||"",l=i==="`"?"GraveAccent":"Tilde";if(us(e,n)){const c=n.enter("codeIndented"),p=n.indentLines(o,fs);return c(),p}const a=n.createTracker(r),s=i.repeat(Math.max(as(o,i)+1,3)),u=n.enter("codeFenced");let f=a.move(s);if(e.lang){const c=n.enter(`codeFencedLang${l}`);f+=a.move(n.safe(e.lang,{before:f,after:" ",encode:["`"],...a.current()})),c()}if(e.lang&&e.meta){const c=n.enter(`codeFencedMeta${l}`);f+=a.move(" "),f+=a.move(n.safe(e.meta,{before:f,after:` +`,encode:["`"],...a.current()})),c()}return f+=a.move(` +`),o&&(f+=a.move(o+` +`)),f+=a.move(s),u(),f}function fs(e,t,n){return(n?"":" ")+e}function et(e){const t=e.options.quote||'"';if(t!=='"'&&t!=="'")throw new Error("Cannot serialize title with `"+t+"` for `options.quote`, expected `\"`, or `'`");return t}function hs(e,t,n,r){const i=et(n),o=i==='"'?"Quote":"Apostrophe",l=n.enter("definition");let a=n.enter("label");const s=n.createTracker(r);let u=s.move("[");return u+=s.move(n.safe(n.associationId(e),{before:u,after:"]",...s.current()})),u+=s.move("]: "),a(),!e.url||/[\0- \u007F]/.test(e.url)?(a=n.enter("destinationLiteral"),u+=s.move("<"),u+=s.move(n.safe(e.url,{before:u,after:">",...s.current()})),u+=s.move(">")):(a=n.enter("destinationRaw"),u+=s.move(n.safe(e.url,{before:u,after:e.title?" ":` +`,...s.current()}))),a(),e.title&&(a=n.enter(`title${o}`),u+=s.move(" "+i),u+=s.move(n.safe(e.title,{before:u,after:i,...s.current()})),u+=s.move(i),a()),l(),u}function ps(e){const t=e.options.emphasis||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize emphasis with `"+t+"` for `options.emphasis`, expected `*`, or `_`");return t}function Ye(e){return"&#x"+e.toString(16).toUpperCase()+";"}function an(e,t,n){const r=Fe(e),i=Fe(t);return r===void 0?i===void 0?n==="_"?{inside:!0,outside:!0}:{inside:!1,outside:!1}:i===1?{inside:!0,outside:!0}:{inside:!1,outside:!0}:r===1?i===void 0?{inside:!1,outside:!1}:i===1?{inside:!0,outside:!0}:{inside:!1,outside:!1}:i===void 0?{inside:!1,outside:!1}:i===1?{inside:!0,outside:!1}:{inside:!1,outside:!1}}Or.peek=ms;function Or(e,t,n,r){const i=ps(n),o=n.enter("emphasis"),l=n.createTracker(r),a=l.move(i);let s=l.move(n.containerPhrasing(e,{after:i,before:a,...l.current()}));const u=s.charCodeAt(0),f=an(r.before.charCodeAt(r.before.length-1),u,i);f.inside&&(s=Ye(u)+s.slice(1));const c=s.charCodeAt(s.length-1),p=an(r.after.charCodeAt(0),c,i);p.inside&&(s=s.slice(0,-1)+Ye(c));const h=l.move(i);return o(),n.attentionEncodeSurroundingInfo={after:p.outside,before:f.outside},a+s+h}function ms(e,t,n){return n.options.emphasis||"*"}function gs(e,t){let n=!1;return Bn(e,function(r){if("value"in r&&/\r?\n|\r/.test(r.value)||r.type==="break")return n=!0,hi}),!!((!e.depth||e.depth<3)&&Wn(e)&&(t.options.setext||n))}function ds(e,t,n,r){const i=Math.max(Math.min(6,e.depth||1),1),o=n.createTracker(r);if(gs(e,n)){const f=n.enter("headingSetext"),c=n.enter("phrasing"),p=n.containerPhrasing(e,{...o.current(),before:` +`,after:` +`});return c(),f(),p+` +`+(i===1?"=":"-").repeat(p.length-(Math.max(p.lastIndexOf("\r"),p.lastIndexOf(` +`))+1))}const l="#".repeat(i),a=n.enter("headingAtx"),s=n.enter("phrasing");o.move(l+" ");let u=n.containerPhrasing(e,{before:"# ",after:` +`,...o.current()});return/^[\t ]/.test(u)&&(u=Ye(u.charCodeAt(0))+u.slice(1)),u=u?l+" "+u:l,n.options.closeAtx&&(u+=" "+l),s(),a(),u}Mr.peek=ks;function Mr(e){return e.value||""}function ks(){return"<"}Nr.peek=ys;function Nr(e,t,n,r){const i=et(n),o=i==='"'?"Quote":"Apostrophe",l=n.enter("image");let a=n.enter("label");const s=n.createTracker(r);let u=s.move("![");return u+=s.move(n.safe(e.alt,{before:u,after:"]",...s.current()})),u+=s.move("]("),a(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(a=n.enter("destinationLiteral"),u+=s.move("<"),u+=s.move(n.safe(e.url,{before:u,after:">",...s.current()})),u+=s.move(">")):(a=n.enter("destinationRaw"),u+=s.move(n.safe(e.url,{before:u,after:e.title?" ":")",...s.current()}))),a(),e.title&&(a=n.enter(`title${o}`),u+=s.move(" "+i),u+=s.move(n.safe(e.title,{before:u,after:i,...s.current()})),u+=s.move(i),a()),u+=s.move(")"),l(),u}function ys(){return"!"}Br.peek=xs;function Br(e,t,n,r){const i=e.referenceType,o=n.enter("imageReference");let l=n.enter("label");const a=n.createTracker(r);let s=a.move("![");const u=n.safe(e.alt,{before:s,after:"]",...a.current()});s+=a.move(u+"]["),l();const f=n.stack;n.stack=[],l=n.enter("reference");const c=n.safe(n.associationId(e),{before:s,after:"]",...a.current()});return l(),n.stack=f,o(),i==="full"||!u||u!==c?s+=a.move(c+"]"):i==="shortcut"?s=s.slice(0,-1):s+=a.move("]"),s}function xs(){return"!"}jr.peek=bs;function jr(e,t,n){let r=e.value||"",i="`",o=-1;for(;new RegExp("(^|[^`])"+i+"([^`]|$)").test(r);)i+="`";for(/[^ \r\n]/.test(r)&&(/^[ \r\n]/.test(r)&&/[ \r\n]$/.test(r)||/^`|`$/.test(r))&&(r=" "+r+" ");++o\u007F]/.test(e.url))}Ur.peek=ws;function Ur(e,t,n,r){const i=et(n),o=i==='"'?"Quote":"Apostrophe",l=n.createTracker(r);let a,s;if(Hr(e,n)){const f=n.stack;n.stack=[],a=n.enter("autolink");let c=l.move("<");return c+=l.move(n.containerPhrasing(e,{before:c,after:">",...l.current()})),c+=l.move(">"),a(),n.stack=f,c}a=n.enter("link"),s=n.enter("label");let u=l.move("[");return u+=l.move(n.containerPhrasing(e,{before:u,after:"](",...l.current()})),u+=l.move("]("),s(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(s=n.enter("destinationLiteral"),u+=l.move("<"),u+=l.move(n.safe(e.url,{before:u,after:">",...l.current()})),u+=l.move(">")):(s=n.enter("destinationRaw"),u+=l.move(n.safe(e.url,{before:u,after:e.title?" ":")",...l.current()}))),s(),e.title&&(s=n.enter(`title${o}`),u+=l.move(" "+i),u+=l.move(n.safe(e.title,{before:u,after:i,...l.current()})),u+=l.move(i),s()),u+=l.move(")"),a(),u}function ws(e,t,n){return Hr(e,n)?"<":"["}qr.peek=Ss;function qr(e,t,n,r){const i=e.referenceType,o=n.enter("linkReference");let l=n.enter("label");const a=n.createTracker(r);let s=a.move("[");const u=n.containerPhrasing(e,{before:s,after:"]",...a.current()});s+=a.move(u+"]["),l();const f=n.stack;n.stack=[],l=n.enter("reference");const c=n.safe(n.associationId(e),{before:s,after:"]",...a.current()});return l(),n.stack=f,o(),i==="full"||!u||u!==c?s+=a.move(c+"]"):i==="shortcut"?s=s.slice(0,-1):s+=a.move("]"),s}function Ss(){return"["}function nt(e){const t=e.options.bullet||"*";if(t!=="*"&&t!=="+"&&t!=="-")throw new Error("Cannot serialize items with `"+t+"` for `options.bullet`, expected `*`, `+`, or `-`");return t}function Cs(e){const t=nt(e),n=e.options.bulletOther;if(!n)return t==="*"?"-":"*";if(n!=="*"&&n!=="+"&&n!=="-")throw new Error("Cannot serialize items with `"+n+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(n===t)throw new Error("Expected `bullet` (`"+t+"`) and `bulletOther` (`"+n+"`) to be different");return n}function Es(e){const t=e.options.bulletOrdered||".";if(t!=="."&&t!==")")throw new Error("Cannot serialize items with `"+t+"` for `options.bulletOrdered`, expected `.` or `)`");return t}function Vr(e){const t=e.options.rule||"*";if(t!=="*"&&t!=="-"&&t!=="_")throw new Error("Cannot serialize rules with `"+t+"` for `options.rule`, expected `*`, `-`, or `_`");return t}function Is(e,t,n,r){const i=n.enter("list"),o=n.bulletCurrent;let l=e.ordered?Es(n):nt(n);const a=e.ordered?l==="."?")":".":Cs(n);let s=t&&n.bulletLastUsed?l===n.bulletLastUsed:!1;if(!e.ordered){const f=e.children?e.children[0]:void 0;if((l==="*"||l==="-")&&f&&(!f.children||!f.children[0])&&n.stack[n.stack.length-1]==="list"&&n.stack[n.stack.length-2]==="listItem"&&n.stack[n.stack.length-3]==="list"&&n.stack[n.stack.length-4]==="listItem"&&n.indexStack[n.indexStack.length-1]===0&&n.indexStack[n.indexStack.length-2]===0&&n.indexStack[n.indexStack.length-3]===0&&(s=!0),Vr(n)===l&&f){let c=-1;for(;++c-1?t.start:1)+(n.options.incrementListMarker===!1?0:t.children.indexOf(e))+o);let l=o.length+1;(i==="tab"||i==="mixed"&&(t&&t.type==="list"&&t.spread||e.spread))&&(l=Math.ceil(l/4)*4);const a=n.createTracker(r);a.move(o+" ".repeat(l-o.length)),a.shift(l);const s=n.enter("listItem"),u=n.indentLines(n.containerFlow(e,a.current()),f);return s(),u;function f(c,p,h){return p?(h?"":" ".repeat(l))+c:(h?o:o+" ".repeat(l-o.length))+c}}function vs(e,t,n,r){const i=n.enter("paragraph"),o=n.enter("phrasing"),l=n.containerPhrasing(e,r);return o(),i(),l}const Ps=Jt(["break","delete","emphasis","footnote","footnoteReference","image","imageReference","inlineCode","inlineMath","link","linkReference","mdxJsxTextElement","mdxTextExpression","strong","text","textDirective"]);function zs(e,t,n,r){return(e.children.some(function(l){return Ps(l)})?n.containerPhrasing:n.containerFlow).call(n,e,r)}function Ds(e){const t=e.options.strong||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize strong with `"+t+"` for `options.strong`, expected `*`, or `_`");return t}$r.peek=Ls;function $r(e,t,n,r){const i=Ds(n),o=n.enter("strong"),l=n.createTracker(r),a=l.move(i+i);let s=l.move(n.containerPhrasing(e,{after:i,before:a,...l.current()}));const u=s.charCodeAt(0),f=an(r.before.charCodeAt(r.before.length-1),u,i);f.inside&&(s=Ye(u)+s.slice(1));const c=s.charCodeAt(s.length-1),p=an(r.after.charCodeAt(0),c,i);p.inside&&(s=s.slice(0,-1)+Ye(c));const h=l.move(i+i);return o(),n.attentionEncodeSurroundingInfo={after:p.outside,before:f.outside},a+s+h}function Ls(e,t,n){return n.options.strong||"*"}function Fs(e,t,n,r){return n.safe(e.value,r)}function Rs(e){const t=e.options.ruleRepetition||3;if(t<3)throw new Error("Cannot serialize rules with repetition `"+t+"` for `options.ruleRepetition`, expected `3` or more");return t}function _s(e,t,n){const r=(Vr(n)+(n.options.ruleSpaces?" ":"")).repeat(Rs(n));return n.options.ruleSpaces?r.slice(0,-1):r}const Wr={blockquote:is,break:Yt,code:cs,definition:hs,emphasis:Or,hardBreak:Yt,heading:ds,html:Mr,image:Nr,imageReference:Br,inlineCode:jr,link:Ur,linkReference:qr,list:Is,listItem:Ts,paragraph:vs,root:zs,strong:$r,text:Fs,thematicBreak:_s};function Os(){return{enter:{table:Ms,tableData:Xt,tableHeader:Xt,tableRow:Bs},exit:{codeText:js,table:Ns,tableData:vn,tableHeader:vn,tableRow:vn}}}function Ms(e){const t=e._align;this.enter({type:"table",align:t.map(function(n){return n==="none"?null:n}),children:[]},e),this.data.inTable=!0}function Ns(e){this.exit(e),this.data.inTable=void 0}function Bs(e){this.enter({type:"tableRow",children:[]},e)}function vn(e){this.exit(e)}function Xt(e){this.enter({type:"tableCell",children:[]},e)}function js(e){let t=this.resume();this.data.inTable&&(t=t.replace(/\\([\\|])/g,Hs));const n=this.stack[this.stack.length-1];se(n.type==="inlineCode"),n.value=t,this.exit(e)}function Hs(e,t){return t==="|"?t:e}function Us(e){const t=e||{},n=t.tableCellPadding,r=t.tablePipeAlign,i=t.stringLength,o=n?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:` +`,inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[ :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{inlineCode:p,table:l,tableCell:s,tableRow:a}};function l(h,d,w,E){return u(f(h,w,E),h.align)}function a(h,d,w,E){const y=c(h,w,E),I=u([y]);return I.slice(0,I.indexOf(` +`))}function s(h,d,w,E){const y=w.enter("tableCell"),I=w.enter("phrasing"),C=w.containerPhrasing(h,{...E,before:o,after:o});return I(),y(),C}function u(h,d){return ts(h,{align:d,alignDelimiters:r,padding:n,stringLength:i})}function f(h,d,w){const E=h.children;let y=-1;const I=[],C=d.enter("table");for(;++y0&&!n&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),n}const oc={tokenize:mc,partial:!0};function ac(){return{document:{91:{name:"gfmFootnoteDefinition",tokenize:fc,continuation:{tokenize:hc},exit:pc}},text:{91:{name:"gfmFootnoteCall",tokenize:cc},93:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:uc,resolveTo:sc}}}}function uc(e,t,n){const r=this;let i=r.events.length;const o=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let l;for(;i--;){const s=r.events[i][1];if(s.type==="labelImage"){l=s;break}if(s.type==="gfmFootnoteCall"||s.type==="labelLink"||s.type==="label"||s.type==="image"||s.type==="link")break}return a;function a(s){if(!l||!l._balanced)return n(s);const u=ce(r.sliceSerialize({start:l.end,end:r.now()}));return u.codePointAt(0)!==94||!o.includes(u.slice(1))?n(s):(e.enter("gfmFootnoteCallLabelMarker"),e.consume(s),e.exit("gfmFootnoteCallLabelMarker"),t(s))}}function sc(e,t){let n=e.length;for(;n--;)if(e[n][1].type==="labelImage"&&e[n][0]==="enter"){e[n][1];break}e[n+1][1].type="data",e[n+3][1].type="gfmFootnoteCallLabelMarker";const r={type:"gfmFootnoteCall",start:Object.assign({},e[n+3][1].start),end:Object.assign({},e[e.length-1][1].end)},i={type:"gfmFootnoteCallMarker",start:Object.assign({},e[n+3][1].end),end:Object.assign({},e[n+3][1].end)};i.end.column++,i.end.offset++,i.end._bufferIndex++;const o={type:"gfmFootnoteCallString",start:Object.assign({},i.end),end:Object.assign({},e[e.length-1][1].start)},l={type:"chunkString",contentType:"string",start:Object.assign({},o.start),end:Object.assign({},o.end)},a=[e[n+1],e[n+2],["enter",r,t],e[n+3],e[n+4],["enter",i,t],["exit",i,t],["enter",o,t],["enter",l,t],["exit",l,t],["exit",o,t],e[e.length-2],e[e.length-1],["exit",r,t]];return e.splice(n,e.length-n+1,...a),e}function cc(e,t,n){const r=this,i=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o=0,l;return a;function a(c){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(c),e.exit("gfmFootnoteCallLabelMarker"),s}function s(c){return c!==94?n(c):(e.enter("gfmFootnoteCallMarker"),e.consume(c),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",u)}function u(c){if(o>999||c===93&&!l||c===null||c===91||V(c))return n(c);if(c===93){e.exit("chunkString");const p=e.exit("gfmFootnoteCallString");return i.includes(ce(r.sliceSerialize(p)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(c),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),t):n(c)}return V(c)||(l=!0),o++,e.consume(c),c===92?f:u}function f(c){return c===91||c===92||c===93?(e.consume(c),o++,u):u(c)}}function fc(e,t,n){const r=this,i=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o,l=0,a;return s;function s(d){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(d),e.exit("gfmFootnoteDefinitionLabelMarker"),u}function u(d){return d===94?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(d),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",f):n(d)}function f(d){if(l>999||d===93&&!a||d===null||d===91||V(d))return n(d);if(d===93){e.exit("chunkString");const w=e.exit("gfmFootnoteDefinitionLabelString");return o=ce(r.sliceSerialize(w)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(d),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),p}return V(d)||(a=!0),l++,e.consume(d),d===92?c:f}function c(d){return d===91||d===92||d===93?(e.consume(d),l++,f):f(d)}function p(d){return d===58?(e.enter("definitionMarker"),e.consume(d),e.exit("definitionMarker"),i.includes(o)||i.push(o),j(e,h,"gfmFootnoteDefinitionWhitespace")):n(d)}function h(d){return t(d)}}function hc(e,t,n){return e.check(Qe,t,e.attempt(oc,t,n))}function pc(e){e.exit("gfmFootnoteDefinition")}function mc(e,t,n){const r=this;return j(e,i,"gfmFootnoteDefinitionIndent",5);function i(o){const l=r.events[r.events.length-1];return l&&l[1].type==="gfmFootnoteDefinitionIndent"&&l[2].sliceSerialize(l[1],!0).length===4?t(o):n(o)}}function gc(e){let n=(e||{}).singleTilde;const r={name:"strikethrough",tokenize:o,resolveAll:i};return n==null&&(n=!0),{text:{126:r},insideSpan:{null:[r]},attentionMarkers:{null:[126]}};function i(l,a){let s=-1;for(;++s1?s(d):(l.consume(d),c++,h);if(c<2&&!n)return s(d);const E=l.exit("strikethroughSequenceTemporary"),y=Fe(d);return E._open=!y||y===2&&!!w,E._close=!w||w===2&&!!y,a(d)}}}class dc{constructor(){this.map=[]}add(t,n,r){kc(this,t,n,r)}consume(t){if(this.map.sort(function(o,l){return o[0]-l[0]}),this.map.length===0)return;let n=this.map.length;const r=[];for(;n>0;)n-=1,r.push(t.slice(this.map[n][0]+this.map[n][1]),this.map[n][2]),t.length=this.map[n][0];r.push(t.slice()),t.length=0;let i=r.pop();for(;i;){for(const o of i)t.push(o);i=r.pop()}this.map.length=0}}function kc(e,t,n,r){let i=0;if(!(n===0&&r.length===0)){for(;i-1;){const T=r.events[v][1].type;if(T==="lineEnding"||T==="linePrefix")v--;else break}const P=v>-1?r.events[v][1].type:null,z=P==="tableHead"||P==="tableRow"?b:s;return z===b&&r.parser.lazy[r.now().line]?n(k):z(k)}function s(k){return e.enter("tableHead"),e.enter("tableRow"),u(k)}function u(k){return k===124||(l=!0,o+=1),f(k)}function f(k){return k===null?n(k):D(k)?o>1?(o=0,r.interrupt=!0,e.exit("tableRow"),e.enter("lineEnding"),e.consume(k),e.exit("lineEnding"),h):n(k):N(k)?j(e,f,"whitespace")(k):(o+=1,l&&(l=!1,i+=1),k===124?(e.enter("tableCellDivider"),e.consume(k),e.exit("tableCellDivider"),l=!0,f):(e.enter("data"),c(k)))}function c(k){return k===null||k===124||V(k)?(e.exit("data"),f(k)):(e.consume(k),k===92?p:c)}function p(k){return k===92||k===124?(e.consume(k),c):c(k)}function h(k){return r.interrupt=!1,r.parser.lazy[r.now().line]?n(k):(e.enter("tableDelimiterRow"),l=!1,N(k)?j(e,d,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(k):d(k))}function d(k){return k===45||k===58?E(k):k===124?(l=!0,e.enter("tableCellDivider"),e.consume(k),e.exit("tableCellDivider"),w):_(k)}function w(k){return N(k)?j(e,E,"whitespace")(k):E(k)}function E(k){return k===58?(o+=1,l=!0,e.enter("tableDelimiterMarker"),e.consume(k),e.exit("tableDelimiterMarker"),y):k===45?(o+=1,y(k)):k===null||D(k)?R(k):_(k)}function y(k){return k===45?(e.enter("tableDelimiterFiller"),I(k)):_(k)}function I(k){return k===45?(e.consume(k),I):k===58?(l=!0,e.exit("tableDelimiterFiller"),e.enter("tableDelimiterMarker"),e.consume(k),e.exit("tableDelimiterMarker"),C):(e.exit("tableDelimiterFiller"),C(k))}function C(k){return N(k)?j(e,R,"whitespace")(k):R(k)}function R(k){return k===124?d(k):k===null||D(k)?!l||i!==o?_(k):(e.exit("tableDelimiterRow"),e.exit("tableHead"),t(k)):_(k)}function _(k){return n(k)}function b(k){return e.enter("tableRow"),M(k)}function M(k){return k===124?(e.enter("tableCellDivider"),e.consume(k),e.exit("tableCellDivider"),M):k===null||D(k)?(e.exit("tableRow"),t(k)):N(k)?j(e,M,"whitespace")(k):(e.enter("data"),U(k))}function U(k){return k===null||k===124||V(k)?(e.exit("data"),M(k)):(e.consume(k),k===92?H:U)}function H(k){return k===92||k===124?(e.consume(k),U):U(k)}}function wc(e,t){let n=-1,r=!0,i=0,o=[0,0,0,0],l=[0,0,0,0],a=!1,s=0,u,f,c;const p=new dc;for(;++nn[2]+1){const d=n[2]+1,w=n[3]-n[2]-1;e.add(d,w,[])}}e.add(n[3]+1,0,[["exit",c,t]])}return i!==void 0&&(o.end=Object.assign({},De(t.events,i)),e.add(i,0,[["exit",o,t]]),o=void 0),o}function Gt(e,t,n,r,i){const o=[],l=De(t.events,n);i&&(i.end=Object.assign({},l),o.push(["exit",i,t])),r.end=Object.assign({},l),o.push(["exit",r,t]),e.add(n+1,0,o)}function De(e,t){const n=e[t],r=n[0]==="enter"?"start":"end";return n[1][r]}const Sc={name:"tasklistCheck",tokenize:Ec};function Cc(){return{text:{91:Sc}}}function Ec(e,t,n){const r=this;return i;function i(s){return r.previous!==null||!r._gfmTasklistFirstContentOfListItem?n(s):(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(s),e.exit("taskListCheckMarker"),o)}function o(s){return V(s)?(e.enter("taskListCheckValueUnchecked"),e.consume(s),e.exit("taskListCheckValueUnchecked"),l):s===88||s===120?(e.enter("taskListCheckValueChecked"),e.consume(s),e.exit("taskListCheckValueChecked"),l):n(s)}function l(s){return s===93?(e.enter("taskListCheckMarker"),e.consume(s),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),a):n(s)}function a(s){return D(s)?t(s):N(s)?e.check({tokenize:Ic},t,n)(s):n(s)}}function Ic(e,t,n){return j(e,r,"whitespace");function r(i){return i===null?n(i):t(i)}}function Ac(e){return pr([Js(),ac(),gc(e),xc(),Cc()])}const Tc={};function Dc(e){const t=this,n=e||Tc,r=t.data(),i=r.micromarkExtensions||(r.micromarkExtensions=[]),o=r.fromMarkdownExtensions||(r.fromMarkdownExtensions=[]),l=r.toMarkdownExtensions||(r.toMarkdownExtensions=[]);i.push(Ac(n)),o.push(Ys()),l.push(Xs(n))}export{zc as M,Dc as r}; diff --git a/service/dist/assets/markdown-XJO5hUeu.js.br b/service/dist/assets/markdown-XJO5hUeu.js.br new file mode 100644 index 0000000000000000000000000000000000000000..ec340b6ed32574b1f14df9f9ecd6f2ded270fdc1 GIT binary patch literal 41073 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¥!a-k9u{)7dVi^OQQP}ss?3)4=CAp;F zHV{skxMV2HDQJo&EDn(b1*m^eN4YVU^6(fp0dCD$^~$>N6);pHdo8Y>L~yTX(TvNK zUWmn1*6H?SYSAaNxE3QsXt+2*GK8R!fbz(T+i4|oCaOG zjkB zpCunG>QxSZ>TGdNO^$=p#AXD71G)JbJ{wh)Quvj*)}n0Hbp;^^OJ)Uj zI(L9Yiaa@O3@Jwjbipc!xbv;>5IU}U=Qx_$itdJQU=BR}wA2q>wq=}x##JxTHiGNt zZWy;P-hC{omC=c}&EVc&1KTxe@7PuU7oXgI;_bv0>b&YP z9vr70{P!kY5!H-w-Y~jk;!*f~&8(wiXyP~%1+!#*2vgQWKR-WSE&NFFKL63w_sqPM z<29Mq3`%B<>)_<5bk}cAN^{_>;5jg<{Wuj~js4_u|3rT}mt2f*lfUgS-=i&YH!lW( z-WEv3ZYgl8ltt*FFm5G~BWf6f5>u4;*JFC4U_l3bm7;|S4hg^E1Yvh}w=kiBpt z$XO6ju;$7>NKKs4RM$?@bQs+Ur_&ifo1p}|{6ys+!FnpseTj2bcv&wT4;jWR0{}&2 z8WlR^p`5exjG6*JNiLcHTJFXdpGuy8#DP!qeA}cj72_i62{dtQWAd+DkQLw<*Ws+m%3JWEb5nT*{|wb z93YdRDCo%Xt+aapHpuWhbQy@D{9lyr_j<%|EqF%Nr>$QWxU2+?Gcllq37nYotCM0M z+$eEzz`tB?WB8{&)t<=%wzwbvS$BAyF=-d$lb#ZnUMkJAk z7WLq}PgZiTJUSMv!QnvBD-t?U3lObPm7#>!TG67)DkyKw07mSCv``MMmrb9#lOSs6 z5ZKZT0gHdohTjoxsh&}XNE<4G@}*hF&;-xCb2~-wv zhQd7}aNclyN5FNCrqx(5*Wtcmx>LOmQ*k=Om%xOD>OgNLBg{L|uU&}&{ip*Gk3m@b z0Hc*p+m-d)UF88);|Z1_rh=+F2w|s8yy{f2NaO(tSf!AkqE{9^P2PR|_D?i_+PN?YRlxXIJR`QCeU}27F=uFQR+@!w zi!8gMSqvl*m$P=1OI^s?0CMR-jWVnEXM%R&*Q#wYljD5q6Qn1?r64g4=H2xmBR$V( z-9B0~q3e04cc}(tQ|B=|Qx2sknuewdVQX5X`YZW=jZ;X5!VVEJL)0Ua#ae~=Ctsf7 z7xOtd|FG*P$ujF)+v-%-_3-sy&ehRRQ$aBnBgsl?ubB$YmSh!~_eFWU&}7|9e?_^u zoDU9XqurLqd}(6J5pv9|IL!>DlfQCO(2SwWMz z?6O*6=?li-(1oYW>qOz_Mz1m2dqE`_<4>j491q5az+ zq5cl-(zS00FeYH?btE$}m=F1v~OUaUD5 zWV|}4wp}7kEVU7aBcuBZ-TP!v!4Prz&1ohdeexHJ?`)hjKl;6JF!*DO>9uUttb`J( ze5J7l@SBK?`OI>--8g$qK-=pqhDso2m1R&0 z(!4?`=Tl~3iqBJ6o?{%iKh0SJf>3;cTHuCCcCbYf)nP#^N6=KyR%A@3EON^(dd%V2 z3y2Td&9XaUaWHF3_$JaMiEZ-S#&>q^Z!cc2SB&sqD!(cd!&aWb)n)JGw~%$$jLka1 zkg}5_nt#ln1n|vDgTccO!dj6&wQ-wSf5l^{*M`z+DcJJv#skKtKJq0$?>Qm%4~7-u z0T|_<)1c^!9kZ(gJ_ibvbw^i=?>-+ROEHC`+Ux_|N83kjIC3Gi5wE48K&T2~M35>r zb8P~~b^~OH1YfcTs4S}-*e+f`Y@k59f*^0c%Rt5B{wLj%E@Z<3ho)dxV7b-^u2L~x z&Z#eW-X~+vYDkbN<&BSu+gMxQBcx05Iib!QVOm2+MHfTt?F>sF+QP3tD&7`GG^C~2 zmgv=&jf@ZqH+t>VVy+5?qFt_ncOT0njG(R?7n%-q2^X{UA{AdN?Fi!$A%E1p@om$X zq0(6W*V`7u9MCJtT0ME}3%?|m_@T9Kea;6AHUK?PQhYFY+P8m>v*cNB{M~+L5>z;X z%g>KnDE%5(9ocv4zCl_cAlMN05AaoX)s2R+m>-jJXX8zpIi)kCn`W0;_7=IFI`E?6 znKkrM0u-vyZhVvG>xu4P9y&oSih+rUchy8eaqLTIt=v! z1#RQu;w88+?M%Z|*BQ(}_9LW=&)rTuyOnr%shVo63-kVr@3R^)#t)8S-H#);*Jkrk z?%USNR4f+CU2_=<9n99aF*7R(m_|2Uv{thjtLr0hs4H!_byM{}RM^rBJVckqA&W(bd4Fsh(!tca;)NFA| zhojqfz}YAw?NtCgV|t{~~8EzGOWW>P zaTDtYSo+Q0ZgqWp4RWql37A%AE5BOw;l%TA;kP>|$;+&099okLd!m2;8pl$ezOarp zHK;a2qeq7Hngtze@+r&rn+)8w#7_+d4}%^?RtK93~2X@MU0kSaKKJv!gk_5Di`8cyE5~1__EoO_vhng^_0Jj!X*h@9p>s3 zH*I-dZEL;IhiQx1WyG)w85LYSGx6~LBQ$#elWj{C@j3Y^d zecZ6P`>~V%4LlTad1FA%KNPA$7$h<@;Il7cjIk!k2O2*+>Y?O*3}2BK_q^8%IYP@T zDW>h`dTRd+!&EA7b|gVn&UrP7H`xr)%4e4Y1n~ZBO-9y$5Ot?^QNr)Vh!|j}!JxgQ z2)sPv*-sI|gW!ymhEzpo-}L}Vu+&sp>8Og`x>-ds;xS5eSw1s8FGMA?$4X(h*6GDr zMh%>JzjB9$^#nJLD08)`D7L2dg1|=gPO#O+;vgJL3XT9|w7QyQvIDL{m%G-VY6QjG z8rxBh*W1`g`LFN)o6Ysl>+)}(k3YTPZr(Y%J)LmgZf=01lwl>Y|KdNnzcuH=ZGAOs zyRk^5Ei9zVUlxSNP4w))NbzL4pbd!1h1LpkuMoDge%>}>lPT-mW+4$P7`(5AAm>AC4cXYo#rAuLL3`B8-OewD0kd9 z61YQ&HnW8usfV!iW)Jsz3Kkk2)!042LJbExur(V#4#^UP+w7llmGCyaghfJXvsE_c z*L+MR!!{}X(jDYZdylm4nf^58tiA+f8o4tLmv*zS^CLk{KeIUg1&B1KwPg?lHHKpQ z1w}(cCJp1_JiWZteuxl#=5v#Ej%rKbYI9lEq(S?Jt?ko_Y@=xaaT9~CNc`>xnZo8n zMop$&(?@jeVkSt37@H3_wnT+bMkzP(UVe(Inbj7BmvZ)Oxh5`JS?FwKZFTzeI#-#t zJp4%EL>C$#<&#XpNMhT`T1~mz>l%0GQ-6$yE(v=x8!?mB-}dYE+kCtR4>Mbfs6#(B zm(brCuAg$c^Bleh`hPyzUEiZ9ip3Yj5?u z|DmauAGbSC_U+c%WybmrSe89zBBXZ;=Sd$0p;<*>csb~qTM=7F04;PaPWX87h_NN# z(;fndiM|!WQ*=dE0Iyb>2#ILnqz1^(0NZcei^X1@g%LW{Uu9Knr)xd7E6OTMwXPc? z|9$)Ociq1sqi3)=Q~&kBaC3YV zv^g2GE@r=t{Z>nHtQ4Y3;71mlSSV~R5aZkpx+2mj*O2Uxc`tREoBVYrm=2-jI|3{g zR|emFy1qXA^FTlVDUL0dDcW>2B)(WdakIAqjUQ)RuPwL&jX5Q$Mpb(T#rIWpliRWj z1Z<#=PP@#P4so~CJ=LEarK->16O}PGgtuPWq(*NwQ>|q?d^>(t`$I#(&e+tprbIA& zR-FAFN@smgsHX^d*OeX0q+n^seu)FVMq=>&=0Yp5zOk?_c|kMfHD~^B{dl}&`!6*Lb-}7v{8ryMQb_y}FMDZSL{53~MplV%E1XY8GeUBur z)p|yPSYS9rg{%{h!^0rP1e88h1@Hdj^Yz?+?uM)RHYhU@L2)&jLjq(qMSmGLi_2`rB@?e*6k)LS2#pP8Py3!@3Wf7@l<*v1+O9nIqK!48;-9)I4Rc@%@b zX6JPzF~=TA4k&RZDa3LeJ8gaW)Q-FIX~}x-WkdvBIW6hRZx5zj0&E|)eYB~obaYkj zdBIhd#+NtmEiTgK7hs90JZLYIG9%Aj*KMXQkfTe|alM2{TF0VML6iYf zb2dCro$c#?EXe`W8N;b6DZlkFiagcXmgk9J|s8mFcF6oAW7ZlNfERC{7(^ zhdm1Hw~wzU1B>kBxUfOm?6l}r3cvm9l)Mj3k##?j#jTjXM#860`v_x4qG9yj{Y^wF zJe)B)sw6t*{iO71KkPJaplLU;d>@`!llT8qa++ChOq7&d?^l%QG^5@mh`hZSx$-1t znwH?#(bbYFo^@_JNn6623mhnmUQkJJJ%q=rIr!s7lWjb0usH;ZJA3J${Vq|C-jZG7 zH_>selbzeQ{x)H(mkw#a#7Dg+oOrFTHu1^G}4Ab8EdRUBlw4gAgSae5hk+Y+veQJAqs(x`2F<5# z7^w8K2bQA#i`wvwgxC6QwUtem!E#iLyiBRH0bf>mE`0k?)mMSYIT;P2M4`$z`({}! zlqONqU-ltA;+iF3JUlA3C6_^_eB5u@HV*$Uy?+fIw#zw;1S&kGms9e{XP&yJF(OnL zZft@0x}29+`n8R?v1Sj%03gPqL;hC^ByLV4Jea?RR&Mxvk;%*7*JR>~SfX?oF01GF z1MI$kFNk^^gI(dsUdd3|$kzr#S(_mhx8)H|R%$FR4VCP<%Xl6GHbT4hf7ncGlry`R zp}M7&KJT`-r9OXbS=}_vR?Dx-aINRJ=RxJ@R(<{6uodhG$;VkX$+2nXhxnt;I#z(q z_TfZ$-_2(!wARyVx$KJA^0L`b3(3Z+l)16rj4x`yWv}nl@`quJNGHF(-!;B`APOl# z{VBxX@%0^uhV|Cx(hkGv%qKBR)X1~BrO;YXq&e9;&hKO~&Rwhu=>@l1@_Qh)!{=WP zWr~dTve*WEvXtd9xTESZC6rkDF654d72YPc)QVhE7FY0@S#V)ogQ&HG_cWvMNew9? zdN-Wq%+^DsqX(gbevf#txC)<2;I;441Ixmd*p`gNG|dDlE-2c^vRgw%a`CS!3V)*1 z%pFpTwh+hCShb0@Y%Iq_!q24z?^$iy&;GX;H~|L0BlOPx3y_S=J=}VD0`j@EFf@Vv zB}M`+9Qq?%|4(7*0Lwt zb_T4HKF2kzU@085?#pZ7tVzlaJeI!nha7vm{88Twv4?!sY&Fo)c;aZ$yFSUlK%GU- zDL5ZYgd6H^n(<+(#yjnK@9kMLCx3guw$Jcvt-gK337piSJRS3isHWS0s3H1kt%Vg` zXK*sz^j+ARBulm%Ahg*H4Fq?EC9KPlJS)nTCLYkgP-@ZqhO9)a`fbTBq((`M7EW#t z;xVB{AiA9oo!>yCWveh`sPJVmv=7-QU3KomA10wfdPF3;#@fQ7Ywny0p{+qLi$#y+ z{FToaAzJ`ja<<5{5NS=}%dZf7jM-%H4ym-ifVshq@XL>{egE8k0`0KP4xo+sw>Y^r zpnuSS>}EoX(quYnYV!Ke^KA0jG2bYC((X!1nf{EPoo8_4UK0FvKWImfADfwobZGU# zaa$UICAo@b77+XEIs%()6F1Q@G%?QjmO1YFR`ay{CJsWpq*wgcDNA`4Y{50zcC{V- z^6jJw(yfwX4Poiq)|9G zR9M?&AHOl9YOZvDy2O5I`wOu##+~{TPL?~;M|i{=yvo1nC#-_g`yVL}YtP5fR2~<% zg7=*PH@Zg1(u3Z-UO-X}vQ_zxB4tQ1AzGd>)_%ndNOr)AicoPUG1D~n71qc&?u56R zZnG$I#N3dk)lPi#(Psm-;txR_w8#$x$nH;c{Li#y*jQ|YHFtX1N!?nB$*vIJ2$j^}Zd z6q9r2=x-lwrw@a;DAkFhOM|mpB}YwFS?Us{ybQXPNG`@^hg0lqK*1%IA4o?Z2}c=R za>!@U6J!-l#;G7rHXwFg!~Qp-ZNDR*BP)B`ypG#XOqs8CHhBC;jT$bfId4I-IsH=Z zzep3k_oY4Dd1x((jz^+h1MFMTFE#SMu>Bialmy7m8(oSloL?Be(0eR7X4iAOK#}J^ zkxG#Ne+pvxA2nmRSPGQxOB81J6W{edPy5S2VVhP$(5c-}(RM~WJ?P!%kI%I|w$?~h zy%U|+=d-ij-@E~*SC(yV(egEPwpoEeuy~NN%GJGX0^a>OiI^kMB!g zuR1N|=q$dyFptF|3Ib;l{fpBF#*9a*K-AKyHf67z7% zd~Wf+^ewMAeWQ|H&>FKiiNZpD42BSH1L$vRL8Go(ICwD$;0T$u`+KSiZI;<(QLvq{ zz#)T7bI==m_ulh2C^;q3Uh3o* zwUQ7%^0-|f*^crH7bK7&H4V;$K_(M5&m%hP2-$)_fL2k0hb|l~3jX36cO<)wA%T^m zFwZ-7J$v4kRC@hG^z}YHZ`b*(JrQaGW5eKCEeqOH4G$pH31~Ee;(QDXcCnM`qL`F} z`C1KO=;1*iQR&BSFR;^4N;(YIthh%Xv+L!AV7=6qDn72|7)uR4PF!26`54NFfon;1 znOUjH$BAo8g(r%aYe4Q;jg&jaTH3QYor%#u_Db*Z_P-V#^oaVqyB_R9U6!H{j5QiWTFlU#B7U43H?2Z_`t zkb5{G2@yMSGEL?WN1iUDUAl0m_+cvQSnZ-O9@aiU?_4{)>x&c`1oGu9Q9~o~zQiv* zsk$}$A&~oaB+*upVX}H#h&X_T>E0BM9ilV99&XI?%!-)EJ1LL(hHIAk#MM|H6T=L? z74G0efVw`Bw1UsbqlYh3)C8%o^B=YAUUF)fl2xk0?_znWDv4iQ&AB;M8oTTU1~jke zn8?F6MhS)d0d=NRP!c2#dTEl5dv7gdM_W(qv@?C)hSor4Ey5QmAa(F%IT+!Po9;+? zU^;bWj|5q#RJ+}kezn(7vJZdRfC}ig+-|A(xcG@xQws2W>!wb0Gs*_23COkBaO7%! zw=87HF%2vm3?+ZfsmY)i-ed5Xp18eOTZ-xSCgkK>@gYvQv1y#y0{Tz==E=s=QOr#koFeg< z?kf4YbDNWmR$>alC)>~ioV!u&*J9ehE{R~|^OwoDJ`*HEnq{xxvYyNqKBRR(*JMWATB`4Bct6r(U{=M^8dypeTfsnBPfLD zoD3FQ7GnHFELzbj1@1U6PB=(j6(n>nmG}DGBs*2M`o555FY%04JOgd@RN6~FS)D7= zC<0HN-{^;a!rl!s6Ukb)7eE$*5zl>>yxrJ$6eWx{ptQ{6xEcBu>kbkH0>0KIk<>O6 z;DNpeU_f&(j-XF34sR7M&<{|-$d~Y$ue$H}!N3r@w%l_>u#1WB#d2&7s;A7;c=}x; zZdFPT&Epso3(6a^@4VAYt3}pH8`%Da!3=;dX&<1d+eh@Q8tH}8eaT(-NP{U|KK|#o z`FeXdw;4hjC+X17O2Vz6A}yP!_2|z0bOrm%c5oPrE&l!cISMd4I4H^|qb{ZxZ#PMg z`N66_a(5<*%g|(mbP3FIo6IoL1aYu0y{Bv~3$g}J)Zplb{~%rRIp!9KVOZ$%=8Ygcr!|!Td=e+%CaEW!t8l;`uA*@9 z-fr}%8ay#Ak4wuyTE^Sup|~3)Loagw8-RyIe+ngy5EC1ce4`=)_UWG>q`)P5O5y!a zL-sN(FT{V;SzlDm(EBuw&%BXkEh6sChPuV2!_$r%{Oy!w520&~q%EfXdB;l|zQCaP z{3(W$!~g=E45}YHgTG_A0VbrMp zPQsXU=|9+ax}uUTJyp1%ROm>f8+_Bp|IgZ(SeisddEa)0l1itX`=KW;O|i6U46x-r zL7nH<7I8S0KIZ~%q6Wal&G%X-w<9g3W=WTXk9H%$@lY+NDbdr3`W)B3*H~izeKi_` z2(*;6NDZXFIoci#hbLrYNn@F^lZfn}Izgf}EO1EKCL8m?< zlY*7s(#spowg-MS=6vkNJfwZgcUdeVWZxT+z38AwpK_1+N~N`QLfChLO450V3nK}4 z?6d(8QD}Say@9~+tuS;EwZuEV6Uf3cN7PSfD^+jm@_!Ho_IyNH_@vN4iY;{DCh z$HyvPqgH*WVO1A3`0=M_Ey05~aF@fc!^MHC==*f?z~HGj)l+$`hzhW6__$#$eR|I^ z-_?BfTqF56P{V~6_-CA#wc2<2D(fc4exIqy&MlhE zCDD4mu<&;c$$mg#q@F% zVC-oM9LGu*C_QzCfr8ElPfroU2mwh;Y5>w0Ld#Q(B&x~lx^AD%J7w@vpov}I3oB9` zksP~>(r7_&zfJf%z2Kh`TJr3%`gJz^{GD9MzBDhY_a9fm3UMj+fc+OIKqLJhs{;G5 zsvvzk%qjpr4`pPdlU{%s5#4WlSZQBj?!C~MQ$KhW3QWi9R~=~hF39~2=CYMS#EORN z^VaM_|3)2vAl?|`M;X@njc@w&KvkvL{xe*;HI~P7uO~R`Babi(guU58RjDg5`TH#c zC=T6p>7ZL7hH+?iUHv>o-mt`s?qEC*OHvnn{;ByWU#8|F6SkBAvrIY>M(G13`dj*I z6|&SVRHKtJkD_?|q03GWiiWcMvBaEvWwODrG}k1zAdFa8Kn66Us&9%$IhE-moYv@Y zvp_3cf;j=kB>Gpos44{Jt^+?Bx=)ooe85Hc^js)_0^gW!GcP2-x&X=9V!9_6EIU?v zlO5#ETfR@eS#Fx%XX}Efa%LLpBip0ju?$exEtEW~Bv&oT_f{0w26p-L#F$uYgCY4m zp%Y^~qNQPCslD8vrQPx9dEEC^8s770r84o#xNHb=nl5N=NfV&Zfo8{3nKJGkeb@+u zGZCXGl!-VIC*nk$h!e3KgXJo@itxmeO{k=*9t&hV2fuXvw>@ zYPXTRSDRP;H~O~Gfz}10u((*5H{2qzi(b^A|(^u#IlZ08rkL*QG&_LQP|>J+$`;_eAyyk$2Q)Zgx{& zq3vw4LtD4~1#Wd>&u;)Mn}#KulU8Elg(w35Z8bfTE3WhNJn9NFT&5r1$b{xr-<|QM zCzY}p8lUv`iWR=1G_(46U8^7H-fEn6{tV$-;Gm(%**<$^u5|YAFtie|R_~7MxxCKB zL$_P6Tb9~7i{Adfn_fIwqzr~O;5Bd;n-L58eFb7@Us>lO!57F^EaLF+0ubIF$~4Cx z**>nV>O=n0aEy}_-GVcm3UIwj$Py)D6G_u&7Tc{S$M9NX)K&eFjQ$LHrIet@u_Ef& zKYG)2;T^M-^k}Ejq8vA!;07m_Hn7|_8kb09&`o^(Bui$JjFKsG1!GvHq&9_J{e>^P zmKC!jGg?Qf;HlfK0m>u!K@d9{>a>@6e8zZIsTtRgmB$vn(i|T)lF^S5+pN=y&CyE{ z1yhuKrKgKl;VrGc`3k<00$7(Zm_a22bR|+MGf|imOT{PH+ODiLKz{I}yB?p%2=>yUu=XtxD!`zLAnR2e)m$=c6F0@f2K6_y z+rg9pD8An&uHO>GiSUb7m7UOHPe$;uMJdcNV)|Za5y>8w{MqSmA!#&#HrnGss!j)a zypEGZ%k%m2ymt%nrqLZglmE-3jDYoH3}A4XJzx zeKws&isYT-6beQ}%k0E1J`D6iM3DLr?c~KEN}!-uiCr(W0h{@3zM<&j?L;vwZ4a;% z4tKq_dkRoKlr*F^BBXwkAf0yKtc0%3Qa^CrP0gT~x(#7tYdJt;-8*pWGc-ggtZ#SD4)v}3)8Fpf>#t!hq10XG4s zhL5PXRYpr(1g!5^fj%;dL|=#dTE*D7wJ`0B1!n0v3`hgku`QC=8_imnQ8bd{>&DDk zaW3R0zgSw{uOv8k5NMaKN?o%0aTZKsEAd3;rAHdj;lM~ zgJDQoyGdmuyiCfluDiAmh~4>V-rIoj^cwTxD3tVTs@WB^J@rfrb@|;zfkgP))2Rue zCFyTCALeENE*~QTibJS_*W#dQokb=X&1LTnY|C(oGUsw;e*dHuOTkDfuJ}9YPFVmz z=#BS$6q5&EDk!|YbfpeQ>+hTiWQFIueH+V~U6#oiTO9vPw*Nqtl2 zc7>z{X{LDfAj{V2T**bhHfp=BMt*wbeM91BR&?15nJ{+aLJlu}jo^fxRjjXP>-iqw zB}SIK^L(2YoyeX?=N54$hXcAp>JH%gai7|uOvAe5&YyTlg0$ndyS&0n6zw^c)8?FQ zFL^zAUYk5$xFk$@WoLvuF|6{f@sM_PvRPlehE^-hA6NVcNhv7zVGH+^IewNFlg$rS zl=9El-Y^h*&g=*y#@hJdeOQtvbN5Pqa(bS>%f}&9IOgDCSSiC$#Fp8VZd)I5DW51V z3}*AfW_PJODT{}p@y1ZBTOZgqhj(PU%y^SsO2R~Lxjs`u0F=A#J0L2%z!kRK&J>ZU zR_G2agRF#y2-UXcY1WcsANX*33&NXwa`?#D(BmgBvUgSwGz5FDGBIbtCcQdPvlrQr zLM=0V2u5?b1k}AGJ#zhI#2!w12m$z7*Nbb8%UtUxq_z1jf;V;{t@uevh4aKI9P6NU zBQ7?-_nZZd{fAbJ9K?yQcgyqhnPiVuydWL1S~#TAV8WEW>BhLqi#4KpqowHu?&E@; zHQN0l`xV(6*h%w!1O0l*85f+)xZh*RvbN|5bcb>2ipu3Z{q2dA&CXSZI{D^3qA%sm zkas9mM4D~!Uqj{nAX5eT6Q|LuY?h}pK|_aj;RaeuFsTUl(~#R~PGR<``XX)(z#wMF z*{4J+VW!SAgyZWTX~x*8+E?%@@r6`F4p4a6fLH zoS#Bgx`kqPCdY*c(=4C!8LT|Q<&hoz1^Xd)2eMWu*)h_E2bT<6t-xt7SzzM9u2%>N z0Yax}vCU%BQNOSWt&=G2mCyFLHX+(mra>?G>3!^j0G$BL=%Z70EBIQIx@UT$?qN5l z42bA(YqAp{cJ!gQSHM(|bFnYjqoAt;EWZzb7G3y{jG$bE*WK_iaQg@!Wa=GJ06p5^ znQcvaTgfzpU!7Uo6eKmncKwSJEFDQCn8Fzel_CoJ@42i#cqe5^8s0wi1MhaWn?}2) z@2DG=J6H-?NjB_s9v=CyW;+X#IZdGJ+4%T0yXu{Hr-CI9zDBQTnXXMI4fS$F{_HUh z$J3O*SM>w$A)Cf}d+Ri#dh6XjJgI8_Rus81Bd6^*K~xJuA;HG!On z-b~nB_1sGD zNahuT$YCd&Tx~N&s4=o^mh4h;`mbf+=qx#ipF(yIo1@0*@UUEPnNRYoY)pCmK-~~Z zHOJf2IbDTha(6J5;CB!43P$BM(s_185~y)XQq3=v=WJtED}pa@aLs zni~?7yyDBn*`nqT{3!(mG*cc_#5W^_Rk##T2HW&)vOW10YZAi_$_3yl0aM@`v1}PO zj@AcSTP7BTB#Fo^i37?dW%lG+KhTN`DV#V5n>t5FVgGj{x0IeU7B=+D)Vl#Y_qZd622Oy(&JO}ZYYwv$zXy2w3Oo7-u zN2w?u77zM$4@X`g4!y2&p8rSHG`P!%QI@W2r~81i{`gGV3MMPJdFRd=8}Ok-#lLP z&N|q zc~AtRY(>?px#E84^X0&bOYWo_JicYk(sF3WD_zkYi*0NSy}Wqy!#SOR{@Ct|)1KL;*i?>BUMys>a9ZFA5Q0A9x8we)xWyPfs7` Nt`BZMY}Qrl@e6kLmtX(@ literal 0 HcmV?d00001 diff --git a/service/dist/assets/misc-GeCjUSSS.js b/service/dist/assets/misc-GeCjUSSS.js new file mode 100644 index 000000000..0c4167989 --- /dev/null +++ b/service/dist/assets/misc-GeCjUSSS.js @@ -0,0 +1,344 @@ +import{r as Vt,R as be,a as w,j as Ft}from"./motion-Dp9wOFzY.js";var Ne={exports:{}},K={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ke;function Ht(){if(Ke)return K;Ke=1;var s=Vt();function e(l){var i="https://react.dev/errors/"+l;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(s)}catch(e){console.error(e)}}return s(),Ne.exports=Ht(),Ne.exports}const Ge=s=>{let e;const t=new Set,r=(i,d)=>{const u=typeof i=="function"?i(e):i;if(!Object.is(u,e)){const p=e;e=d??(typeof u!="object"||u===null)?u:Object.assign({},e,u),t.forEach(h=>h(e,p))}},n=()=>e,c={setState:r,getState:n,getInitialState:()=>l,subscribe:i=>(t.add(i),()=>t.delete(i))},l=e=s(r,n,c);return c},Dt=(s=>s?Ge(s):Ge),Ut=s=>s;function Kt(s,e=Ut){const t=be.useSyncExternalStore(s.subscribe,be.useCallback(()=>e(s.getState()),[s,e]),be.useCallback(()=>e(s.getInitialState()),[s,e]));return be.useDebugValue(t),t}const qe=s=>{const e=Dt(s),t=r=>Kt(e,r);return Object.assign(t,e),t},In=(s=>s?qe(s):qe);function xt(s){var e,t,r="";if(typeof s=="string"||typeof s=="number")r+=s;else if(typeof s=="object")if(Array.isArray(s)){var n=s.length;for(e=0;e{const e=Wt(s),{conflictingClassGroups:t,conflictingClassGroupModifiers:r}=s;return{getClassGroupId:a=>{const c=a.split(He);return c[0]===""&&c.length!==1&&c.shift(),kt(c,e)||qt(a)},getConflictingClassGroupIds:(a,c)=>{const l=t[a]||[];return c&&r[a]?[...l,...r[a]]:l}}},kt=(s,e)=>{if(s.length===0)return e.classGroupId;const t=s[0],r=e.nextPart.get(t),n=r?kt(s.slice(1),r):void 0;if(n)return n;if(e.validators.length===0)return;const o=s.join(He);return e.validators.find(({validator:a})=>a(o))?.classGroupId},We=/^\[(.+)\]$/,qt=s=>{if(We.test(s)){const e=We.exec(s)[1],t=e?.substring(0,e.indexOf(":"));if(t)return"arbitrary.."+t}},Wt=s=>{const{theme:e,classGroups:t}=s,r={nextPart:new Map,validators:[]};for(const n in t)ze(t[n],r,n,e);return r},ze=(s,e,t,r)=>{s.forEach(n=>{if(typeof n=="string"){const o=n===""?e:Je(e,n);o.classGroupId=t;return}if(typeof n=="function"){if(Jt(n)){ze(n(r),e,t,r);return}e.validators.push({validator:n,classGroupId:t});return}Object.entries(n).forEach(([o,a])=>{ze(a,Je(e,o),t,r)})})},Je=(s,e)=>{let t=s;return e.split(He).forEach(r=>{t.nextPart.has(r)||t.nextPart.set(r,{nextPart:new Map,validators:[]}),t=t.nextPart.get(r)}),t},Jt=s=>s.isThemeGetter,Yt=s=>{if(s<1)return{get:()=>{},set:()=>{}};let e=0,t=new Map,r=new Map;const n=(o,a)=>{t.set(o,a),e++,e>s&&(e=0,r=t,t=new Map)};return{get(o){let a=t.get(o);if(a!==void 0)return a;if((a=r.get(o))!==void 0)return n(o,a),a},set(o,a){t.has(o)?t.set(o,a):n(o,a)}}},Pe="!",Ee=":",Zt=Ee.length,Qt=s=>{const{prefix:e,experimentalParseClassName:t}=s;let r=n=>{const o=[];let a=0,c=0,l=0,i;for(let f=0;fl?i-l:void 0;return{modifiers:o,hasImportantModifier:p,baseClassName:u,maybePostfixModifierPosition:h}};if(e){const n=e+Ee,o=r;r=a=>a.startsWith(n)?o(a.substring(n.length)):{isExternal:!0,modifiers:[],hasImportantModifier:!1,baseClassName:a,maybePostfixModifierPosition:void 0}}if(t){const n=r;r=o=>t({className:o,parseClassName:n})}return r},Xt=s=>s.endsWith(Pe)?s.substring(0,s.length-1):s.startsWith(Pe)?s.substring(1):s,es=s=>{const e=Object.fromEntries(s.orderSensitiveModifiers.map(r=>[r,!0]));return r=>{if(r.length<=1)return r;const n=[];let o=[];return r.forEach(a=>{a[0]==="["||e[a]?(n.push(...o.sort(),a),o=[]):o.push(a)}),n.push(...o.sort()),n}},ts=s=>({cache:Yt(s.cacheSize),parseClassName:Qt(s),sortModifiers:es(s),...Gt(s)}),ss=/\s+/,rs=(s,e)=>{const{parseClassName:t,getClassGroupId:r,getConflictingClassGroupIds:n,sortModifiers:o}=e,a=[],c=s.trim().split(ss);let l="";for(let i=c.length-1;i>=0;i-=1){const d=c[i],{isExternal:u,modifiers:p,hasImportantModifier:h,baseClassName:f,maybePostfixModifierPosition:b}=t(d);if(u){l=d+(l.length>0?" "+l:l);continue}let x=!!b,C=r(x?f.substring(0,b):f);if(!C){if(!x){l=d+(l.length>0?" "+l:l);continue}if(C=r(f),!C){l=d+(l.length>0?" "+l:l);continue}x=!1}const N=o(p).join(":"),E=h?N+Pe:N,O=E+C;if(a.includes(O))continue;a.push(O);const L=n(C,x);for(let z=0;z0?" "+l:l)}return l};function ns(){let s=0,e,t,r="";for(;s{if(typeof s=="string")return s;let e,t="";for(let r=0;ru(d),s());return t=ts(i),r=t.cache.get,n=t.cache.set,o=c,c(l)}function c(l){const i=r(l);if(i)return i;const d=rs(l,t);return n(l,d),d}return function(){return o(ns.apply(null,arguments))}}const V=s=>{const e=t=>t[s]||[];return e.isThemeGetter=!0,e},wt=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,St=/^\((?:(\w[\w-]*):)?(.+)\)$/i,is=/^\d+\/\d+$/,as=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,ls=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,cs=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,ds=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,us=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,se=s=>is.test(s),M=s=>!!s&&!Number.isNaN(Number(s)),Q=s=>!!s&&Number.isInteger(Number(s)),Le=s=>s.endsWith("%")&&M(s.slice(0,-1)),Y=s=>as.test(s),hs=()=>!0,fs=s=>ls.test(s)&&!cs.test(s),Ot=()=>!1,ps=s=>ds.test(s),gs=s=>us.test(s),ms=s=>!g(s)&&!m(s),ys=s=>ne(s,Nt,Ot),g=s=>wt.test(s),ee=s=>ne(s,Lt,fs),Re=s=>ne(s,ws,M),Ye=s=>ne(s,Ct,Ot),bs=s=>ne(s,Mt,gs),xe=s=>ne(s,Rt,ps),m=s=>St.test(s),ae=s=>oe(s,Lt),xs=s=>oe(s,Ss),Ze=s=>oe(s,Ct),ks=s=>oe(s,Nt),vs=s=>oe(s,Mt),ke=s=>oe(s,Rt,!0),ne=(s,e,t)=>{const r=wt.exec(s);return r?r[1]?e(r[1]):t(r[2]):!1},oe=(s,e,t=!1)=>{const r=St.exec(s);return r?r[1]?e(r[1]):t:!1},Ct=s=>s==="position"||s==="percentage",Mt=s=>s==="image"||s==="url",Nt=s=>s==="length"||s==="size"||s==="bg-size",Lt=s=>s==="length",ws=s=>s==="number",Ss=s=>s==="family-name",Rt=s=>s==="shadow",Os=()=>{const s=V("color"),e=V("font"),t=V("text"),r=V("font-weight"),n=V("tracking"),o=V("leading"),a=V("breakpoint"),c=V("container"),l=V("spacing"),i=V("radius"),d=V("shadow"),u=V("inset-shadow"),p=V("text-shadow"),h=V("drop-shadow"),f=V("blur"),b=V("perspective"),x=V("aspect"),C=V("ease"),N=V("animate"),E=()=>["auto","avoid","all","avoid-page","page","left","right","column"],O=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],L=()=>[...O(),m,g],z=()=>["auto","hidden","clip","visible","scroll"],_=()=>["auto","contain","none"],v=()=>[m,g,l],I=()=>[se,"full","auto",...v()],R=()=>[Q,"none","subgrid",m,g],G=()=>["auto",{span:["full",Q,m,g]},Q,m,g],q=()=>[Q,"auto",m,g],P=()=>["auto","min","max","fr",m,g],$=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],j=()=>["start","end","center","stretch","center-safe","end-safe"],A=()=>["auto",...v()],H=()=>[se,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...v()],k=()=>[s,m,g],X=()=>[...O(),Ze,Ye,{position:[m,g]}],ie=()=>["no-repeat",{repeat:["","x","y","space","round"]}],D=()=>["auto","cover","contain",ks,ys,{size:[m,g]}],W=()=>[Le,ae,ee],T=()=>["","none","full",i,m,g],U=()=>["",M,ae,ee],pe=()=>["solid","dashed","dotted","double"],De=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],F=()=>[M,Le,Ze,Ye],Ue=()=>["","none",f,m,g],ge=()=>["none",M,m,g],me=()=>["none",M,m,g],Me=()=>[M,m,g],ye=()=>[se,"full",...v()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[Y],breakpoint:[Y],color:[hs],container:[Y],"drop-shadow":[Y],ease:["in","out","in-out"],font:[ms],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[Y],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[Y],shadow:[Y],spacing:["px",M],text:[Y],"text-shadow":[Y],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",se,g,m,x]}],container:["container"],columns:[{columns:[M,g,m,c]}],"break-after":[{"break-after":E()}],"break-before":[{"break-before":E()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:L()}],overflow:[{overflow:z()}],"overflow-x":[{"overflow-x":z()}],"overflow-y":[{"overflow-y":z()}],overscroll:[{overscroll:_()}],"overscroll-x":[{"overscroll-x":_()}],"overscroll-y":[{"overscroll-y":_()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:I()}],"inset-x":[{"inset-x":I()}],"inset-y":[{"inset-y":I()}],start:[{start:I()}],end:[{end:I()}],top:[{top:I()}],right:[{right:I()}],bottom:[{bottom:I()}],left:[{left:I()}],visibility:["visible","invisible","collapse"],z:[{z:[Q,"auto",m,g]}],basis:[{basis:[se,"full","auto",c,...v()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[M,se,"auto","initial","none",g]}],grow:[{grow:["",M,m,g]}],shrink:[{shrink:["",M,m,g]}],order:[{order:[Q,"first","last","none",m,g]}],"grid-cols":[{"grid-cols":R()}],"col-start-end":[{col:G()}],"col-start":[{"col-start":q()}],"col-end":[{"col-end":q()}],"grid-rows":[{"grid-rows":R()}],"row-start-end":[{row:G()}],"row-start":[{"row-start":q()}],"row-end":[{"row-end":q()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":P()}],"auto-rows":[{"auto-rows":P()}],gap:[{gap:v()}],"gap-x":[{"gap-x":v()}],"gap-y":[{"gap-y":v()}],"justify-content":[{justify:[...$(),"normal"]}],"justify-items":[{"justify-items":[...j(),"normal"]}],"justify-self":[{"justify-self":["auto",...j()]}],"align-content":[{content:["normal",...$()]}],"align-items":[{items:[...j(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...j(),{baseline:["","last"]}]}],"place-content":[{"place-content":$()}],"place-items":[{"place-items":[...j(),"baseline"]}],"place-self":[{"place-self":["auto",...j()]}],p:[{p:v()}],px:[{px:v()}],py:[{py:v()}],ps:[{ps:v()}],pe:[{pe:v()}],pt:[{pt:v()}],pr:[{pr:v()}],pb:[{pb:v()}],pl:[{pl:v()}],m:[{m:A()}],mx:[{mx:A()}],my:[{my:A()}],ms:[{ms:A()}],me:[{me:A()}],mt:[{mt:A()}],mr:[{mr:A()}],mb:[{mb:A()}],ml:[{ml:A()}],"space-x":[{"space-x":v()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":v()}],"space-y-reverse":["space-y-reverse"],size:[{size:H()}],w:[{w:[c,"screen",...H()]}],"min-w":[{"min-w":[c,"screen","none",...H()]}],"max-w":[{"max-w":[c,"screen","none","prose",{screen:[a]},...H()]}],h:[{h:["screen","lh",...H()]}],"min-h":[{"min-h":["screen","lh","none",...H()]}],"max-h":[{"max-h":["screen","lh",...H()]}],"font-size":[{text:["base",t,ae,ee]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[r,m,Re]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Le,g]}],"font-family":[{font:[xs,g,e]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[n,m,g]}],"line-clamp":[{"line-clamp":[M,"none",m,Re]}],leading:[{leading:[o,...v()]}],"list-image":[{"list-image":["none",m,g]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",m,g]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:k()}],"text-color":[{text:k()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...pe(),"wavy"]}],"text-decoration-thickness":[{decoration:[M,"from-font","auto",m,ee]}],"text-decoration-color":[{decoration:k()}],"underline-offset":[{"underline-offset":[M,"auto",m,g]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:v()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",m,g]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",m,g]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:X()}],"bg-repeat":[{bg:ie()}],"bg-size":[{bg:D()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},Q,m,g],radial:["",m,g],conic:[Q,m,g]},vs,bs]}],"bg-color":[{bg:k()}],"gradient-from-pos":[{from:W()}],"gradient-via-pos":[{via:W()}],"gradient-to-pos":[{to:W()}],"gradient-from":[{from:k()}],"gradient-via":[{via:k()}],"gradient-to":[{to:k()}],rounded:[{rounded:T()}],"rounded-s":[{"rounded-s":T()}],"rounded-e":[{"rounded-e":T()}],"rounded-t":[{"rounded-t":T()}],"rounded-r":[{"rounded-r":T()}],"rounded-b":[{"rounded-b":T()}],"rounded-l":[{"rounded-l":T()}],"rounded-ss":[{"rounded-ss":T()}],"rounded-se":[{"rounded-se":T()}],"rounded-ee":[{"rounded-ee":T()}],"rounded-es":[{"rounded-es":T()}],"rounded-tl":[{"rounded-tl":T()}],"rounded-tr":[{"rounded-tr":T()}],"rounded-br":[{"rounded-br":T()}],"rounded-bl":[{"rounded-bl":T()}],"border-w":[{border:U()}],"border-w-x":[{"border-x":U()}],"border-w-y":[{"border-y":U()}],"border-w-s":[{"border-s":U()}],"border-w-e":[{"border-e":U()}],"border-w-t":[{"border-t":U()}],"border-w-r":[{"border-r":U()}],"border-w-b":[{"border-b":U()}],"border-w-l":[{"border-l":U()}],"divide-x":[{"divide-x":U()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":U()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...pe(),"hidden","none"]}],"divide-style":[{divide:[...pe(),"hidden","none"]}],"border-color":[{border:k()}],"border-color-x":[{"border-x":k()}],"border-color-y":[{"border-y":k()}],"border-color-s":[{"border-s":k()}],"border-color-e":[{"border-e":k()}],"border-color-t":[{"border-t":k()}],"border-color-r":[{"border-r":k()}],"border-color-b":[{"border-b":k()}],"border-color-l":[{"border-l":k()}],"divide-color":[{divide:k()}],"outline-style":[{outline:[...pe(),"none","hidden"]}],"outline-offset":[{"outline-offset":[M,m,g]}],"outline-w":[{outline:["",M,ae,ee]}],"outline-color":[{outline:k()}],shadow:[{shadow:["","none",d,ke,xe]}],"shadow-color":[{shadow:k()}],"inset-shadow":[{"inset-shadow":["none",u,ke,xe]}],"inset-shadow-color":[{"inset-shadow":k()}],"ring-w":[{ring:U()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:k()}],"ring-offset-w":[{"ring-offset":[M,ee]}],"ring-offset-color":[{"ring-offset":k()}],"inset-ring-w":[{"inset-ring":U()}],"inset-ring-color":[{"inset-ring":k()}],"text-shadow":[{"text-shadow":["none",p,ke,xe]}],"text-shadow-color":[{"text-shadow":k()}],opacity:[{opacity:[M,m,g]}],"mix-blend":[{"mix-blend":[...De(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":De()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[M]}],"mask-image-linear-from-pos":[{"mask-linear-from":F()}],"mask-image-linear-to-pos":[{"mask-linear-to":F()}],"mask-image-linear-from-color":[{"mask-linear-from":k()}],"mask-image-linear-to-color":[{"mask-linear-to":k()}],"mask-image-t-from-pos":[{"mask-t-from":F()}],"mask-image-t-to-pos":[{"mask-t-to":F()}],"mask-image-t-from-color":[{"mask-t-from":k()}],"mask-image-t-to-color":[{"mask-t-to":k()}],"mask-image-r-from-pos":[{"mask-r-from":F()}],"mask-image-r-to-pos":[{"mask-r-to":F()}],"mask-image-r-from-color":[{"mask-r-from":k()}],"mask-image-r-to-color":[{"mask-r-to":k()}],"mask-image-b-from-pos":[{"mask-b-from":F()}],"mask-image-b-to-pos":[{"mask-b-to":F()}],"mask-image-b-from-color":[{"mask-b-from":k()}],"mask-image-b-to-color":[{"mask-b-to":k()}],"mask-image-l-from-pos":[{"mask-l-from":F()}],"mask-image-l-to-pos":[{"mask-l-to":F()}],"mask-image-l-from-color":[{"mask-l-from":k()}],"mask-image-l-to-color":[{"mask-l-to":k()}],"mask-image-x-from-pos":[{"mask-x-from":F()}],"mask-image-x-to-pos":[{"mask-x-to":F()}],"mask-image-x-from-color":[{"mask-x-from":k()}],"mask-image-x-to-color":[{"mask-x-to":k()}],"mask-image-y-from-pos":[{"mask-y-from":F()}],"mask-image-y-to-pos":[{"mask-y-to":F()}],"mask-image-y-from-color":[{"mask-y-from":k()}],"mask-image-y-to-color":[{"mask-y-to":k()}],"mask-image-radial":[{"mask-radial":[m,g]}],"mask-image-radial-from-pos":[{"mask-radial-from":F()}],"mask-image-radial-to-pos":[{"mask-radial-to":F()}],"mask-image-radial-from-color":[{"mask-radial-from":k()}],"mask-image-radial-to-color":[{"mask-radial-to":k()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":O()}],"mask-image-conic-pos":[{"mask-conic":[M]}],"mask-image-conic-from-pos":[{"mask-conic-from":F()}],"mask-image-conic-to-pos":[{"mask-conic-to":F()}],"mask-image-conic-from-color":[{"mask-conic-from":k()}],"mask-image-conic-to-color":[{"mask-conic-to":k()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:X()}],"mask-repeat":[{mask:ie()}],"mask-size":[{mask:D()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",m,g]}],filter:[{filter:["","none",m,g]}],blur:[{blur:Ue()}],brightness:[{brightness:[M,m,g]}],contrast:[{contrast:[M,m,g]}],"drop-shadow":[{"drop-shadow":["","none",h,ke,xe]}],"drop-shadow-color":[{"drop-shadow":k()}],grayscale:[{grayscale:["",M,m,g]}],"hue-rotate":[{"hue-rotate":[M,m,g]}],invert:[{invert:["",M,m,g]}],saturate:[{saturate:[M,m,g]}],sepia:[{sepia:["",M,m,g]}],"backdrop-filter":[{"backdrop-filter":["","none",m,g]}],"backdrop-blur":[{"backdrop-blur":Ue()}],"backdrop-brightness":[{"backdrop-brightness":[M,m,g]}],"backdrop-contrast":[{"backdrop-contrast":[M,m,g]}],"backdrop-grayscale":[{"backdrop-grayscale":["",M,m,g]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[M,m,g]}],"backdrop-invert":[{"backdrop-invert":["",M,m,g]}],"backdrop-opacity":[{"backdrop-opacity":[M,m,g]}],"backdrop-saturate":[{"backdrop-saturate":[M,m,g]}],"backdrop-sepia":[{"backdrop-sepia":["",M,m,g]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":v()}],"border-spacing-x":[{"border-spacing-x":v()}],"border-spacing-y":[{"border-spacing-y":v()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",m,g]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[M,"initial",m,g]}],ease:[{ease:["linear","initial",C,m,g]}],delay:[{delay:[M,m,g]}],animate:[{animate:["none",N,m,g]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[b,m,g]}],"perspective-origin":[{"perspective-origin":L()}],rotate:[{rotate:ge()}],"rotate-x":[{"rotate-x":ge()}],"rotate-y":[{"rotate-y":ge()}],"rotate-z":[{"rotate-z":ge()}],scale:[{scale:me()}],"scale-x":[{"scale-x":me()}],"scale-y":[{"scale-y":me()}],"scale-z":[{"scale-z":me()}],"scale-3d":["scale-3d"],skew:[{skew:Me()}],"skew-x":[{"skew-x":Me()}],"skew-y":[{"skew-y":Me()}],transform:[{transform:[m,g,"","none","gpu","cpu"]}],"transform-origin":[{origin:L()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:ye()}],"translate-x":[{"translate-x":ye()}],"translate-y":[{"translate-y":ye()}],"translate-z":[{"translate-z":ye()}],"translate-none":["translate-none"],accent:[{accent:k()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:k()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",m,g]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":v()}],"scroll-mx":[{"scroll-mx":v()}],"scroll-my":[{"scroll-my":v()}],"scroll-ms":[{"scroll-ms":v()}],"scroll-me":[{"scroll-me":v()}],"scroll-mt":[{"scroll-mt":v()}],"scroll-mr":[{"scroll-mr":v()}],"scroll-mb":[{"scroll-mb":v()}],"scroll-ml":[{"scroll-ml":v()}],"scroll-p":[{"scroll-p":v()}],"scroll-px":[{"scroll-px":v()}],"scroll-py":[{"scroll-py":v()}],"scroll-ps":[{"scroll-ps":v()}],"scroll-pe":[{"scroll-pe":v()}],"scroll-pt":[{"scroll-pt":v()}],"scroll-pr":[{"scroll-pr":v()}],"scroll-pb":[{"scroll-pb":v()}],"scroll-pl":[{"scroll-pl":v()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",m,g]}],fill:[{fill:["none",...k()]}],"stroke-w":[{stroke:[M,ae,ee,Re]}],stroke:[{stroke:["none",...k()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},An=os(Os),S=s=>typeof s=="string",le=()=>{let s,e;const t=new Promise((r,n)=>{s=r,e=n});return t.resolve=s,t.reject=e,t},Qe=s=>s==null?"":""+s,Cs=(s,e,t)=>{s.forEach(r=>{e[r]&&(t[r]=e[r])})},Ms=/###/g,Xe=s=>s&&s.indexOf("###")>-1?s.replace(Ms,"."):s,et=s=>!s||S(s),ce=(s,e,t)=>{const r=S(e)?e.split("."):e;let n=0;for(;n{const{obj:r,k:n}=ce(s,e,Object);if(r!==void 0||e.length===1){r[n]=t;return}let o=e[e.length-1],a=e.slice(0,e.length-1),c=ce(s,a,Object);for(;c.obj===void 0&&a.length;)o=`${a[a.length-1]}.${o}`,a=a.slice(0,a.length-1),c=ce(s,a,Object),c?.obj&&typeof c.obj[`${c.k}.${o}`]<"u"&&(c.obj=void 0);c.obj[`${c.k}.${o}`]=t},Ns=(s,e,t,r)=>{const{obj:n,k:o}=ce(s,e,Object);n[o]=n[o]||[],n[o].push(t)},we=(s,e)=>{const{obj:t,k:r}=ce(s,e);if(t&&Object.prototype.hasOwnProperty.call(t,r))return t[r]},Ls=(s,e,t)=>{const r=we(s,t);return r!==void 0?r:we(e,t)},_t=(s,e,t)=>{for(const r in e)r!=="__proto__"&&r!=="constructor"&&(r in s?S(s[r])||s[r]instanceof String||S(e[r])||e[r]instanceof String?t&&(s[r]=e[r]):_t(s[r],e[r],t):s[r]=e[r]);return s},re=s=>s.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var Rs={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const _s=s=>S(s)?s.replace(/[&<>"'\/]/g,e=>Rs[e]):s;class $s{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const t=this.regExpMap.get(e);if(t!==void 0)return t;const r=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,r),this.regExpQueue.push(e),r}}const zs=[" ",",","?","!",";"],Ps=new $s(20),Es=(s,e,t)=>{e=e||"",t=t||"";const r=zs.filter(a=>e.indexOf(a)<0&&t.indexOf(a)<0);if(r.length===0)return!0;const n=Ps.getRegExp(`(${r.map(a=>a==="?"?"\\?":a).join("|")})`);let o=!n.test(s);if(!o){const a=s.indexOf(t);a>0&&!n.test(s.substring(0,a))&&(o=!0)}return o},Ie=(s,e,t=".")=>{if(!s)return;if(s[e])return Object.prototype.hasOwnProperty.call(s,e)?s[e]:void 0;const r=e.split(t);let n=s;for(let o=0;o-1&&ls?.replace("_","-"),Is={type:"logger",log(s){this.output("log",s)},warn(s){this.output("warn",s)},error(s){this.output("error",s)},output(s,e){console?.[s]?.apply?.(console,e)}};class Se{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||"i18next:",this.logger=e||Is,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,t,r,n){return n&&!this.debug?null:(S(e[0])&&(e[0]=`${r}${this.prefix} ${e[0]}`),this.logger[t](e))}create(e){return new Se(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new Se(this.logger,e)}}var J=new Se;class Ce{constructor(){this.observers={}}on(e,t){return e.split(" ").forEach(r=>{this.observers[r]||(this.observers[r]=new Map);const n=this.observers[r].get(t)||0;this.observers[r].set(t,n+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([n,o])=>{for(let a=0;a{for(let a=0;a-1&&this.options.ns.splice(t,1)}getResource(e,t,r,n={}){const o=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,a=n.ignoreJSONStructure!==void 0?n.ignoreJSONStructure:this.options.ignoreJSONStructure;let c;e.indexOf(".")>-1?c=e.split("."):(c=[e,t],r&&(Array.isArray(r)?c.push(...r):S(r)&&o?c.push(...r.split(o)):c.push(r)));const l=we(this.data,c);return!l&&!t&&!r&&e.indexOf(".")>-1&&(e=c[0],t=c[1],r=c.slice(2).join(".")),l||!a||!S(r)?l:Ie(this.data?.[e]?.[t],r,o)}addResource(e,t,r,n,o={silent:!1}){const a=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator;let c=[e,t];r&&(c=c.concat(a?r.split(a):r)),e.indexOf(".")>-1&&(c=e.split("."),n=t,t=c[1]),this.addNamespaces(t),tt(this.data,c,n),o.silent||this.emit("added",e,t,r,n)}addResources(e,t,r,n={silent:!1}){for(const o in r)(S(r[o])||Array.isArray(r[o]))&&this.addResource(e,t,o,r[o],{silent:!0});n.silent||this.emit("added",e,t,r)}addResourceBundle(e,t,r,n,o,a={silent:!1,skipCopy:!1}){let c=[e,t];e.indexOf(".")>-1&&(c=e.split("."),n=r,r=t,t=c[1]),this.addNamespaces(t);let l=we(this.data,c)||{};a.skipCopy||(r=JSON.parse(JSON.stringify(r))),n?_t(l,r,o):l={...l,...r},tt(this.data,c,l),a.silent||this.emit("added",e,t,r)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit("removed",e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||(t=this.options.defaultNS),this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(n=>t[n]&&Object.keys(t[n]).length>0)}toJSON(){return this.data}}var $t={processors:{},addPostProcessor(s){this.processors[s.name]=s},handle(s,e,t,r,n){return s.forEach(o=>{e=this.processors[o]?.process(e,t,r,n)??e}),e}};const zt=Symbol("i18next/PATH_KEY");function As(){const s=[],e=Object.create(null);let t;return e.get=(r,n)=>(t?.revoke?.(),n===zt?s:(s.push(n),t=Proxy.revocable(r,e),t.proxy)),Proxy.revocable(Object.create(null),e).proxy}function Ae(s,e){const{[zt]:t}=s(As());return t.join(e?.keySeparator??".")}const rt={},nt=s=>!S(s)&&typeof s!="boolean"&&typeof s!="number";class Oe extends Ce{constructor(e,t={}){super(),Cs(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=J.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){const r={...t};return e==null?!1:this.resolve(e,r)?.res!==void 0}extractFromKey(e,t){let r=t.nsSeparator!==void 0?t.nsSeparator:this.options.nsSeparator;r===void 0&&(r=":");const n=t.keySeparator!==void 0?t.keySeparator:this.options.keySeparator;let o=t.ns||this.options.defaultNS||[];const a=r&&e.indexOf(r)>-1,c=!this.options.userDefinedKeySeparator&&!t.keySeparator&&!this.options.userDefinedNsSeparator&&!t.nsSeparator&&!Es(e,r,n);if(a&&!c){const l=e.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:e,namespaces:S(o)?[o]:o};const i=e.split(r);(r!==n||r===n&&this.options.ns.indexOf(i[0])>-1)&&(o=i.shift()),e=i.join(n)}return{key:e,namespaces:S(o)?[o]:o}}translate(e,t,r){let n=typeof t=="object"?{...t}:t;if(typeof n!="object"&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),typeof n=="object"&&(n={...n}),n||(n={}),e==null)return"";typeof e=="function"&&(e=Ae(e,{...this.options,...n})),Array.isArray(e)||(e=[String(e)]);const o=n.returnDetails!==void 0?n.returnDetails:this.options.returnDetails,a=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,{key:c,namespaces:l}=this.extractFromKey(e[e.length-1],n),i=l[l.length-1];let d=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;d===void 0&&(d=":");const u=n.lng||this.language,p=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(u?.toLowerCase()==="cimode")return p?o?{res:`${i}${d}${c}`,usedKey:c,exactUsedKey:c,usedLng:u,usedNS:i,usedParams:this.getUsedParamsDetails(n)}:`${i}${d}${c}`:o?{res:c,usedKey:c,exactUsedKey:c,usedLng:u,usedNS:i,usedParams:this.getUsedParamsDetails(n)}:c;const h=this.resolve(e,n);let f=h?.res;const b=h?.usedKey||c,x=h?.exactUsedKey||c,C=["[object Number]","[object Function]","[object RegExp]"],N=n.joinArrays!==void 0?n.joinArrays:this.options.joinArrays,E=!this.i18nFormat||this.i18nFormat.handleAsObject,O=n.count!==void 0&&!S(n.count),L=Oe.hasDefaultValue(n),z=O?this.pluralResolver.getSuffix(u,n.count,n):"",_=n.ordinal&&O?this.pluralResolver.getSuffix(u,n.count,{ordinal:!1}):"",v=O&&!n.ordinal&&n.count===0,I=v&&n[`defaultValue${this.options.pluralSeparator}zero`]||n[`defaultValue${z}`]||n[`defaultValue${_}`]||n.defaultValue;let R=f;E&&!f&&L&&(R=I);const G=nt(R),q=Object.prototype.toString.apply(R);if(E&&R&&G&&C.indexOf(q)<0&&!(S(N)&&Array.isArray(R))){if(!n.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const P=this.options.returnedObjectHandler?this.options.returnedObjectHandler(b,R,{...n,ns:l}):`key '${c} (${this.language})' returned an object instead of string.`;return o?(h.res=P,h.usedParams=this.getUsedParamsDetails(n),h):P}if(a){const P=Array.isArray(R),$=P?[]:{},j=P?x:b;for(const A in R)if(Object.prototype.hasOwnProperty.call(R,A)){const H=`${j}${a}${A}`;L&&!f?$[A]=this.translate(H,{...n,defaultValue:nt(I)?I[A]:void 0,joinArrays:!1,ns:l}):$[A]=this.translate(H,{...n,joinArrays:!1,ns:l}),$[A]===H&&($[A]=R[A])}f=$}}else if(E&&S(N)&&Array.isArray(f))f=f.join(N),f&&(f=this.extendTranslation(f,e,n,r));else{let P=!1,$=!1;!this.isValidLookup(f)&&L&&(P=!0,f=I),this.isValidLookup(f)||($=!0,f=c);const A=(n.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&$?void 0:f,H=L&&I!==f&&this.options.updateMissing;if($||P||H){if(this.logger.log(H?"updateKey":"missingKey",u,i,c,H?I:f),a){const D=this.resolve(c,{...n,keySeparator:!1});D&&D.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let k=[];const X=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if(this.options.saveMissingTo==="fallback"&&X&&X[0])for(let D=0;D{const U=L&&T!==f?T:A;this.options.missingKeyHandler?this.options.missingKeyHandler(D,i,W,U,H,n):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(D,i,W,U,H,n),this.emit("missingKey",D,i,W,f)};this.options.saveMissing&&(this.options.saveMissingPlurals&&O?k.forEach(D=>{const W=this.pluralResolver.getSuffixes(D,n);v&&n[`defaultValue${this.options.pluralSeparator}zero`]&&W.indexOf(`${this.options.pluralSeparator}zero`)<0&&W.push(`${this.options.pluralSeparator}zero`),W.forEach(T=>{ie([D],c+T,n[`defaultValue${T}`]||I)})}):ie(k,c,I))}f=this.extendTranslation(f,e,n,h,r),$&&f===c&&this.options.appendNamespaceToMissingKey&&(f=`${i}${d}${c}`),($||P)&&this.options.parseMissingKeyHandler&&(f=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${i}${d}${c}`:c,P?f:void 0,n))}return o?(h.res=f,h.usedParams=this.getUsedParamsDetails(n),h):f}extendTranslation(e,t,r,n,o){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...r},r.lng||this.language||n.usedLng,n.usedNS,n.usedKey,{resolved:n});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});const l=S(e)&&(r?.interpolation?.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let i;if(l){const u=e.match(this.interpolator.nestingRegexp);i=u&&u.length}let d=r.replace&&!S(r.replace)?r.replace:r;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),e=this.interpolator.interpolate(e,d,r.lng||this.language||n.usedLng,r),l){const u=e.match(this.interpolator.nestingRegexp),p=u&&u.length;io?.[0]===u[0]&&!r.context?(this.logger.warn(`It seems you are nesting recursively key: ${u[0]} in key: ${t[0]}`),null):this.translate(...u,t),r)),r.interpolation&&this.interpolator.reset()}const a=r.postProcess||this.options.postProcess,c=S(a)?[a]:a;return e!=null&&c?.length&&r.applyPostProcessor!==!1&&(e=$t.handle(c,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...n,usedParams:this.getUsedParamsDetails(r)},...r}:r,this)),e}resolve(e,t={}){let r,n,o,a,c;return S(e)&&(e=[e]),e.forEach(l=>{if(this.isValidLookup(r))return;const i=this.extractFromKey(l,t),d=i.key;n=d;let u=i.namespaces;this.options.fallbackNS&&(u=u.concat(this.options.fallbackNS));const p=t.count!==void 0&&!S(t.count),h=p&&!t.ordinal&&t.count===0,f=t.context!==void 0&&(S(t.context)||typeof t.context=="number")&&t.context!=="",b=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);u.forEach(x=>{this.isValidLookup(r)||(c=x,!rt[`${b[0]}-${x}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(c)&&(rt[`${b[0]}-${x}`]=!0,this.logger.warn(`key "${n}" for languages "${b.join(", ")}" won't get resolved as namespace "${c}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),b.forEach(C=>{if(this.isValidLookup(r))return;a=C;const N=[d];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(N,d,C,x,t);else{let O;p&&(O=this.pluralResolver.getSuffix(C,t.count,t));const L=`${this.options.pluralSeparator}zero`,z=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(p&&(t.ordinal&&O.indexOf(z)===0&&N.push(d+O.replace(z,this.options.pluralSeparator)),N.push(d+O),h&&N.push(d+L)),f){const _=`${d}${this.options.contextSeparator||"_"}${t.context}`;N.push(_),p&&(t.ordinal&&O.indexOf(z)===0&&N.push(_+O.replace(z,this.options.pluralSeparator)),N.push(_+O),h&&N.push(_+L))}}let E;for(;E=N.pop();)this.isValidLookup(r)||(o=E,r=this.getResource(C,x,E,t))}))})}),{res:r,usedKey:n,exactUsedKey:o,usedLng:a,usedNS:c}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,t,r,n={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,r,n):this.resourceStore.getResource(e,t,r,n)}getUsedParamsDetails(e={}){const t=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],r=e.replace&&!S(e.replace);let n=r?e.replace:e;if(r&&typeof e.count<"u"&&(n.count=e.count),this.options.interpolation.defaultVariables&&(n={...this.options.interpolation.defaultVariables,...n}),!r){n={...n};for(const o of t)delete n[o]}return n}static hasDefaultValue(e){const t="defaultValue";for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&t===r.substring(0,t.length)&&e[r]!==void 0)return!0;return!1}}class ot{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=J.create("languageUtils")}getScriptPartFromCode(e){if(e=ue(e),!e||e.indexOf("-")<0)return null;const t=e.split("-");return t.length===2||(t.pop(),t[t.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(t.join("-"))}getLanguagePartFromCode(e){if(e=ue(e),!e||e.indexOf("-")<0)return e;const t=e.split("-");return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(S(e)&&e.indexOf("-")>-1){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(r=>{if(t)return;const n=this.formatLanguageCode(r);(!this.options.supportedLngs||this.isSupportedCode(n))&&(t=n)}),!t&&this.options.supportedLngs&&e.forEach(r=>{if(t)return;const n=this.getScriptPartFromCode(r);if(this.isSupportedCode(n))return t=n;const o=this.getLanguagePartFromCode(r);if(this.isSupportedCode(o))return t=o;t=this.options.supportedLngs.find(a=>{if(a===o)return a;if(!(a.indexOf("-")<0&&o.indexOf("-")<0)&&(a.indexOf("-")>0&&o.indexOf("-")<0&&a.substring(0,a.indexOf("-"))===o||a.indexOf(o)===0&&o.length>1))return a})}),t||(t=this.getFallbackCodes(this.options.fallbackLng)[0]),t}getFallbackCodes(e,t){if(!e)return[];if(typeof e=="function"&&(e=e(t)),S(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let r=e[t];return r||(r=e[this.getScriptPartFromCode(t)]),r||(r=e[this.formatLanguageCode(t)]),r||(r=e[this.getLanguagePartFromCode(t)]),r||(r=e.default),r||[]}toResolveHierarchy(e,t){const r=this.getFallbackCodes((t===!1?[]:t)||this.options.fallbackLng||[],e),n=[],o=a=>{a&&(this.isSupportedCode(a)?n.push(a):this.logger.warn(`rejecting language code not found in supportedLngs: ${a}`))};return S(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&o(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&o(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&o(this.getLanguagePartFromCode(e))):S(e)&&o(this.formatLanguageCode(e)),r.forEach(a=>{n.indexOf(a)<0&&o(this.formatLanguageCode(a))}),n}}const it={zero:0,one:1,two:2,few:3,many:4,other:5},at={select:s=>s===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class Ts{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=J.create("pluralResolver"),this.pluralRulesCache={}}addRule(e,t){this.rules[e]=t}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){const r=ue(e==="dev"?"en":e),n=t.ordinal?"ordinal":"cardinal",o=JSON.stringify({cleanedCode:r,type:n});if(o in this.pluralRulesCache)return this.pluralRulesCache[o];let a;try{a=new Intl.PluralRules(r,{type:n})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),at;if(!e.match(/-|_/))return at;const l=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(l,t)}return this.pluralRulesCache[o]=a,a}needsPlural(e,t={}){let r=this.getRule(e,t);return r||(r=this.getRule("dev",t)),r?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,r={}){return this.getSuffixes(e,r).map(n=>`${t}${n}`)}getSuffixes(e,t={}){let r=this.getRule(e,t);return r||(r=this.getRule("dev",t)),r?r.resolvedOptions().pluralCategories.sort((n,o)=>it[n]-it[o]).map(n=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:""}${n}`):[]}getSuffix(e,t,r={}){const n=this.getRule(e,r);return n?`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${n.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",t,r))}}const lt=(s,e,t,r=".",n=!0)=>{let o=Ls(s,e,t);return!o&&n&&S(t)&&(o=Ie(s,t,r),o===void 0&&(o=Ie(e,t,r))),o},_e=s=>s.replace(/\$/g,"$$$$");class js{constructor(e={}){this.logger=J.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(t=>t),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:t,escapeValue:r,useRawValueToEscape:n,prefix:o,prefixEscaped:a,suffix:c,suffixEscaped:l,formatSeparator:i,unescapeSuffix:d,unescapePrefix:u,nestingPrefix:p,nestingPrefixEscaped:h,nestingSuffix:f,nestingSuffixEscaped:b,nestingOptionsSeparator:x,maxReplaces:C,alwaysFormat:N}=e.interpolation;this.escape=t!==void 0?t:_s,this.escapeValue=r!==void 0?r:!0,this.useRawValueToEscape=n!==void 0?n:!1,this.prefix=o?re(o):a||"{{",this.suffix=c?re(c):l||"}}",this.formatSeparator=i||",",this.unescapePrefix=d?"":u||"-",this.unescapeSuffix=this.unescapePrefix?"":d||"",this.nestingPrefix=p?re(p):h||re("$t("),this.nestingSuffix=f?re(f):b||re(")"),this.nestingOptionsSeparator=x||",",this.maxReplaces=C||1e3,this.alwaysFormat=N!==void 0?N:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(t,r)=>t?.source===r?(t.lastIndex=0,t):new RegExp(r,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,t,r,n){let o,a,c;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},i=h=>{if(h.indexOf(this.formatSeparator)<0){const C=lt(t,l,h,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(C,void 0,r,{...n,...t,interpolationkey:h}):C}const f=h.split(this.formatSeparator),b=f.shift().trim(),x=f.join(this.formatSeparator).trim();return this.format(lt(t,l,b,this.options.keySeparator,this.options.ignoreJSONStructure),x,r,{...n,...t,interpolationkey:b})};this.resetRegExp();const d=n?.missingInterpolationHandler||this.options.missingInterpolationHandler,u=n?.interpolation?.skipOnVariables!==void 0?n.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:h=>_e(h)},{regex:this.regexp,safeValue:h=>this.escapeValue?_e(this.escape(h)):_e(h)}].forEach(h=>{for(c=0;o=h.regex.exec(e);){const f=o[1].trim();if(a=i(f),a===void 0)if(typeof d=="function"){const x=d(e,o,n);a=S(x)?x:""}else if(n&&Object.prototype.hasOwnProperty.call(n,f))a="";else if(u){a=o[0];continue}else this.logger.warn(`missed to pass in variable ${f} for interpolating ${e}`),a="";else!S(a)&&!this.useRawValueToEscape&&(a=Qe(a));const b=h.safeValue(a);if(e=e.replace(o[0],b),u?(h.regex.lastIndex+=a.length,h.regex.lastIndex-=o[0].length):h.regex.lastIndex=0,c++,c>=this.maxReplaces)break}}),e}nest(e,t,r={}){let n,o,a;const c=(l,i)=>{const d=this.nestingOptionsSeparator;if(l.indexOf(d)<0)return l;const u=l.split(new RegExp(`${d}[ ]*{`));let p=`{${u[1]}`;l=u[0],p=this.interpolate(p,a);const h=p.match(/'/g),f=p.match(/"/g);((h?.length??0)%2===0&&!f||f.length%2!==0)&&(p=p.replace(/'/g,'"'));try{a=JSON.parse(p),i&&(a={...i,...a})}catch(b){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,b),`${l}${d}${p}`}return a.defaultValue&&a.defaultValue.indexOf(this.prefix)>-1&&delete a.defaultValue,l};for(;n=this.nestingRegexp.exec(e);){let l=[];a={...r},a=a.replace&&!S(a.replace)?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;const i=/{.*}/.test(n[1])?n[1].lastIndexOf("}")+1:n[1].indexOf(this.formatSeparator);if(i!==-1&&(l=n[1].slice(i).split(this.formatSeparator).map(d=>d.trim()).filter(Boolean),n[1]=n[1].slice(0,i)),o=t(c.call(this,n[1].trim(),a),a),o&&n[0]===e&&!S(o))return o;S(o)||(o=Qe(o)),o||(this.logger.warn(`missed to resolve ${n[1]} for nesting ${e}`),o=""),l.length&&(o=l.reduce((d,u)=>this.format(d,u,r.lng,{...r,interpolationkey:n[1].trim()}),o.trim())),e=e.replace(n[0],o),this.regexp.lastIndex=0}return e}}const Vs=s=>{let e=s.toLowerCase().trim();const t={};if(s.indexOf("(")>-1){const r=s.split("(");e=r[0].toLowerCase().trim();const n=r[1].substring(0,r[1].length-1);e==="currency"&&n.indexOf(":")<0?t.currency||(t.currency=n.trim()):e==="relativetime"&&n.indexOf(":")<0?t.range||(t.range=n.trim()):n.split(";").forEach(a=>{if(a){const[c,...l]=a.split(":"),i=l.join(":").trim().replace(/^'+|'+$/g,""),d=c.trim();t[d]||(t[d]=i),i==="false"&&(t[d]=!1),i==="true"&&(t[d]=!0),isNaN(i)||(t[d]=parseInt(i,10))}})}return{formatName:e,formatOptions:t}},ct=s=>{const e={};return(t,r,n)=>{let o=n;n&&n.interpolationkey&&n.formatParams&&n.formatParams[n.interpolationkey]&&n[n.interpolationkey]&&(o={...o,[n.interpolationkey]:void 0});const a=r+JSON.stringify(o);let c=e[a];return c||(c=s(ue(r),n),e[a]=c),c(t)}},Fs=s=>(e,t,r)=>s(ue(t),r)(e);class Hs{constructor(e={}){this.logger=J.create("formatter"),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||",";const r=t.cacheInBuiltFormats?ct:Fs;this.formats={number:r((n,o)=>{const a=new Intl.NumberFormat(n,{...o});return c=>a.format(c)}),currency:r((n,o)=>{const a=new Intl.NumberFormat(n,{...o,style:"currency"});return c=>a.format(c)}),datetime:r((n,o)=>{const a=new Intl.DateTimeFormat(n,{...o});return c=>a.format(c)}),relativetime:r((n,o)=>{const a=new Intl.RelativeTimeFormat(n,{...o});return c=>a.format(c,o.range||"day")}),list:r((n,o)=>{const a=new Intl.ListFormat(n,{...o});return c=>a.format(c)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=ct(t)}format(e,t,r,n={}){const o=t.split(this.formatSeparator);if(o.length>1&&o[0].indexOf("(")>1&&o[0].indexOf(")")<0&&o.find(c=>c.indexOf(")")>-1)){const c=o.findIndex(l=>l.indexOf(")")>-1);o[0]=[o[0],...o.splice(1,c)].join(this.formatSeparator)}return o.reduce((c,l)=>{const{formatName:i,formatOptions:d}=Vs(l);if(this.formats[i]){let u=c;try{const p=n?.formatParams?.[n.interpolationkey]||{},h=p.locale||p.lng||n.locale||n.lng||r;u=this.formats[i](c,h,{...d,...n,...p})}catch(p){this.logger.warn(p)}return u}else this.logger.warn(`there was no format function for ${i}`);return c},e)}}const Ds=(s,e)=>{s.pending[e]!==void 0&&(delete s.pending[e],s.pendingCount--)};class Us extends Ce{constructor(e,t,r,n={}){super(),this.backend=e,this.store=t,this.services=r,this.languageUtils=r.languageUtils,this.options=n,this.logger=J.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=n.maxParallelReads||10,this.readingCalls=0,this.maxRetries=n.maxRetries>=0?n.maxRetries:5,this.retryTimeout=n.retryTimeout>=1?n.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(r,n.backend,n)}queueLoad(e,t,r,n){const o={},a={},c={},l={};return e.forEach(i=>{let d=!0;t.forEach(u=>{const p=`${i}|${u}`;!r.reload&&this.store.hasResourceBundle(i,u)?this.state[p]=2:this.state[p]<0||(this.state[p]===1?a[p]===void 0&&(a[p]=!0):(this.state[p]=1,d=!1,a[p]===void 0&&(a[p]=!0),o[p]===void 0&&(o[p]=!0),l[u]===void 0&&(l[u]=!0)))}),d||(c[i]=!0)}),(Object.keys(o).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:n}),{toLoad:Object.keys(o),pending:Object.keys(a),toLoadLanguages:Object.keys(c),toLoadNamespaces:Object.keys(l)}}loaded(e,t,r){const n=e.split("|"),o=n[0],a=n[1];t&&this.emit("failedLoading",o,a,t),!t&&r&&this.store.addResourceBundle(o,a,r,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&r&&(this.state[e]=0);const c={};this.queue.forEach(l=>{Ns(l.loaded,[o],a),Ds(l,e),t&&l.errors.push(t),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(i=>{c[i]||(c[i]={});const d=l.loaded[i];d.length&&d.forEach(u=>{c[i][u]===void 0&&(c[i][u]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",c),this.queue=this.queue.filter(l=>!l.done)}read(e,t,r,n=0,o=this.retryTimeout,a){if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:r,tried:n,wait:o,callback:a});return}this.readingCalls++;const c=(i,d)=>{if(this.readingCalls--,this.waitingReads.length>0){const u=this.waitingReads.shift();this.read(u.lng,u.ns,u.fcName,u.tried,u.wait,u.callback)}if(i&&d&&n{this.read.call(this,e,t,r,n+1,o*2,a)},o);return}a(i,d)},l=this.backend[r].bind(this.backend);if(l.length===2){try{const i=l(e,t);i&&typeof i.then=="function"?i.then(d=>c(null,d)).catch(c):c(null,i)}catch(i){c(i)}return}return l(e,t,c)}prepareLoading(e,t,r={},n){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),n&&n();S(e)&&(e=this.languageUtils.toResolveHierarchy(e)),S(t)&&(t=[t]);const o=this.queueLoad(e,t,r,n);if(!o.toLoad.length)return o.pending.length||n(),null;o.toLoad.forEach(a=>{this.loadOne(a)})}load(e,t,r){this.prepareLoading(e,t,{},r)}reload(e,t,r){this.prepareLoading(e,t,{reload:!0},r)}loadOne(e,t=""){const r=e.split("|"),n=r[0],o=r[1];this.read(n,o,"read",void 0,void 0,(a,c)=>{a&&this.logger.warn(`${t}loading namespace ${o} for language ${n} failed`,a),!a&&c&&this.logger.log(`${t}loaded namespace ${o} for language ${n}`,c),this.loaded(e,a,c)})}saveMissing(e,t,r,n,o,a={},c=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${r}" as the namespace "${t}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(r==null||r==="")){if(this.backend?.create){const l={...a,isUpdate:o},i=this.backend.create.bind(this.backend);if(i.length<6)try{let d;i.length===5?d=i(e,t,r,n,l):d=i(e,t,r,n),d&&typeof d.then=="function"?d.then(u=>c(null,u)).catch(c):c(null,d)}catch(d){c(d)}else i(e,t,r,n,c,l)}!e||!e[0]||this.store.addResource(e[0],t,r,n)}}}const dt=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:s=>{let e={};if(typeof s[1]=="object"&&(e=s[1]),S(s[1])&&(e.defaultValue=s[1]),S(s[2])&&(e.tDescription=s[2]),typeof s[2]=="object"||typeof s[3]=="object"){const t=s[3]||s[2];Object.keys(t).forEach(r=>{e[r]=t[r]})}return e},interpolation:{escapeValue:!0,format:s=>s,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),ut=s=>(S(s.ns)&&(s.ns=[s.ns]),S(s.fallbackLng)&&(s.fallbackLng=[s.fallbackLng]),S(s.fallbackNS)&&(s.fallbackNS=[s.fallbackNS]),s.supportedLngs?.indexOf?.("cimode")<0&&(s.supportedLngs=s.supportedLngs.concat(["cimode"])),typeof s.initImmediate=="boolean"&&(s.initAsync=s.initImmediate),s),ve=()=>{},Ks=s=>{Object.getOwnPropertyNames(Object.getPrototypeOf(s)).forEach(t=>{typeof s[t]=="function"&&(s[t]=s[t].bind(s))})};class he extends Ce{constructor(e={},t){if(super(),this.options=ut(e),this.services={},this.logger=J,this.modules={external:[]},Ks(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},t){this.isInitializing=!0,typeof e=="function"&&(t=e,e={}),e.defaultNS==null&&e.ns&&(S(e.ns)?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const r=dt();this.options={...r,...this.options,...ut(e)},this.options.interpolation={...r.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator);const n=i=>i?typeof i=="function"?new i:i:null;if(!this.options.isClone){this.modules.logger?J.init(n(this.modules.logger),this.options):J.init(null,this.options);let i;this.modules.formatter?i=this.modules.formatter:i=Hs;const d=new ot(this.options);this.store=new st(this.options.resources,this.options);const u=this.services;u.logger=J,u.resourceStore=this.store,u.languageUtils=d,u.pluralResolver=new Ts(d,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==r.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),i&&(!this.options.interpolation.format||this.options.interpolation.format===r.interpolation.format)&&(u.formatter=n(i),u.formatter.init&&u.formatter.init(u,this.options),this.options.interpolation.format=u.formatter.format.bind(u.formatter)),u.interpolator=new js(this.options),u.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},u.backendConnector=new Us(n(this.modules.backend),u.resourceStore,u,this.options),u.backendConnector.on("*",(h,...f)=>{this.emit(h,...f)}),this.modules.languageDetector&&(u.languageDetector=n(this.modules.languageDetector),u.languageDetector.init&&u.languageDetector.init(u,this.options.detection,this.options)),this.modules.i18nFormat&&(u.i18nFormat=n(this.modules.i18nFormat),u.i18nFormat.init&&u.i18nFormat.init(this)),this.translator=new Oe(this.services,this.options),this.translator.on("*",(h,...f)=>{this.emit(h,...f)}),this.modules.external.forEach(h=>{h.init&&h.init(this)})}if(this.format=this.options.interpolation.format,t||(t=ve),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const i=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);i.length>0&&i[0]!=="dev"&&(this.options.lng=i[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(i=>{this[i]=(...d)=>this.store[i](...d)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(i=>{this[i]=(...d)=>(this.store[i](...d),this)});const c=le(),l=()=>{const i=(d,u)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),c.resolve(u),t(d,u)};if(this.languages&&!this.isInitialized)return i(null,this.t.bind(this));this.changeLanguage(this.options.lng,i)};return this.options.resources||!this.options.initAsync?l():setTimeout(l,0),c}loadResources(e,t=ve){let r=t;const n=S(e)?e:this.language;if(typeof e=="function"&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(n?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return r();const o=[],a=c=>{if(!c||c==="cimode")return;this.services.languageUtils.toResolveHierarchy(c).forEach(i=>{i!=="cimode"&&o.indexOf(i)<0&&o.push(i)})};n?a(n):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>a(l)),this.options.preload?.forEach?.(c=>a(c)),this.services.backendConnector.load(o,this.options.ns,c=>{!c&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(c)})}else r(null)}reloadResources(e,t,r){const n=le();return typeof e=="function"&&(r=e,e=void 0),typeof t=="function"&&(r=t,t=void 0),e||(e=this.languages),t||(t=this.options.ns),r||(r=ve),this.services.backendConnector.reload(e,t,o=>{n.resolve(),r(o)}),n}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&$t.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1)){for(let t=0;t-1)&&this.store.hasLanguageSomeTranslations(r)){this.resolvedLanguage=r;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,t){this.isLanguageChangingTo=e;const r=le();this.emit("languageChanging",e);const n=c=>{this.language=c,this.languages=this.services.languageUtils.toResolveHierarchy(c),this.resolvedLanguage=void 0,this.setResolvedLanguage(c)},o=(c,l)=>{l?this.isLanguageChangingTo===e&&(n(l),this.translator.changeLanguage(l),this.isLanguageChangingTo=void 0,this.emit("languageChanged",l),this.logger.log("languageChanged",l)):this.isLanguageChangingTo=void 0,r.resolve((...i)=>this.t(...i)),t&&t(c,(...i)=>this.t(...i))},a=c=>{!e&&!c&&this.services.languageDetector&&(c=[]);const l=S(c)?c:c&&c[0],i=this.store.hasLanguageSomeTranslations(l)?l:this.services.languageUtils.getBestMatchFromCodes(S(c)?[c]:c);i&&(this.language||n(i),this.translator.language||this.translator.changeLanguage(i),this.services.languageDetector?.cacheUserLanguage?.(i)),this.loadResources(i,d=>{o(d,i)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?a(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(e),r}getFixedT(e,t,r){const n=(o,a,...c)=>{let l;typeof a!="object"?l=this.options.overloadTranslationOptionHandler([o,a].concat(c)):l={...a},l.lng=l.lng||n.lng,l.lngs=l.lngs||n.lngs,l.ns=l.ns||n.ns,l.keyPrefix!==""&&(l.keyPrefix=l.keyPrefix||r||n.keyPrefix);const i=this.options.keySeparator||".";let d;return l.keyPrefix&&Array.isArray(o)?d=o.map(u=>(typeof u=="function"&&(u=Ae(u,{...this.options,...a})),`${l.keyPrefix}${i}${u}`)):(typeof o=="function"&&(o=Ae(o,{...this.options,...a})),d=l.keyPrefix?`${l.keyPrefix}${i}${o}`:o),this.t(d,l)};return S(e)?n.lng=e:n.lngs=e,n.ns=t,n.keyPrefix=r,n}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const r=t.lng||this.resolvedLanguage||this.languages[0],n=this.options?this.options.fallbackLng:!1,o=this.languages[this.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const a=(c,l)=>{const i=this.services.backendConnector.state[`${c}|${l}`];return i===-1||i===0||i===2};if(t.precheck){const c=t.precheck(this,a);if(c!==void 0)return c}return!!(this.hasResourceBundle(r,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(r,e)&&(!n||a(o,e)))}loadNamespaces(e,t){const r=le();return this.options.ns?(S(e)&&(e=[e]),e.forEach(n=>{this.options.ns.indexOf(n)<0&&this.options.ns.push(n)}),this.loadResources(n=>{r.resolve(),t&&t(n)}),r):(t&&t(),Promise.resolve())}loadLanguages(e,t){const r=le();S(e)&&(e=[e]);const n=this.options.preload||[],o=e.filter(a=>n.indexOf(a)<0&&this.services.languageUtils.isSupportedCode(a));return o.length?(this.options.preload=n.concat(o),this.loadResources(a=>{r.resolve(),t&&t(a)}),r):(t&&t(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const n=new Intl.Locale(e);if(n&&n.getTextInfo){const o=n.getTextInfo();if(o&&o.direction)return o.direction}}catch{}const t=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],r=this.services?.languageUtils||new ot(dt());return e.toLowerCase().indexOf("-latn")>1?"ltr":t.indexOf(r.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},t){return new he(e,t)}cloneInstance(e={},t=ve){const r=e.forkResourceStore;r&&delete e.forkResourceStore;const n={...this.options,...e,isClone:!0},o=new he(n);if((e.debug!==void 0||e.prefix!==void 0)&&(o.logger=o.logger.clone(e)),["store","services","language"].forEach(c=>{o[c]=this[c]}),o.services={...this.services},o.services.utils={hasLoadedNamespace:o.hasLoadedNamespace.bind(o)},r){const c=Object.keys(this.store.data).reduce((l,i)=>(l[i]={...this.store.data[i]},l[i]=Object.keys(l[i]).reduce((d,u)=>(d[u]={...l[i][u]},d),l[i]),l),{});o.store=new st(c,n),o.services.resourceStore=o.store}return o.translator=new Oe(o.services,n),o.translator.on("*",(c,...l)=>{o.emit(c,...l)}),o.init(n,t),o.translator.options=n,o.translator.backendConnector.services.utils={hasLoadedNamespace:o.hasLoadedNamespace.bind(o)},o}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const B=he.createInstance();B.createInstance=he.createInstance;B.createInstance;B.dir;B.init;B.loadResources;B.reloadResources;B.use;B.changeLanguage;B.getFixedT;const Tn=B.t;B.exists;B.setDefaultNamespace;B.hasLoadedNamespace;B.loadNamespaces;B.loadLanguages;const Bs=(s,e,t,r)=>{const n=[t,{code:e,...r||{}}];if(s?.services?.logger?.forward)return s.services.logger.forward(n,"warn","react-i18next::",!0);te(n[0])&&(n[0]=`react-i18next:: ${n[0]}`),s?.services?.logger?.warn?s.services.logger.warn(...n):console?.warn&&console.warn(...n)},ht={},Te=(s,e,t,r)=>{te(t)&&ht[t]||(te(t)&&(ht[t]=new Date),Bs(s,e,t,r))},Pt=(s,e)=>()=>{if(s.isInitialized)e();else{const t=()=>{setTimeout(()=>{s.off("initialized",t)},0),e()};s.on("initialized",t)}},je=(s,e,t)=>{s.loadNamespaces(e,Pt(s,t))},ft=(s,e,t,r)=>{if(te(t)&&(t=[t]),s.options.preload&&s.options.preload.indexOf(e)>-1)return je(s,t,r);t.forEach(n=>{s.options.ns.indexOf(n)<0&&s.options.ns.push(n)}),s.loadLanguages(e,Pt(s,r))},Gs=(s,e,t={})=>!e.languages||!e.languages.length?(Te(e,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:e.languages}),!0):e.hasLoadedNamespace(s,{lng:t.lng,precheck:(r,n)=>{if(t.bindI18n&&t.bindI18n.indexOf("languageChanging")>-1&&r.services.backendConnector.backend&&r.isLanguageChangingTo&&!n(r.isLanguageChangingTo,s))return!1}}),te=s=>typeof s=="string",qs=s=>typeof s=="object"&&s!==null,Ws=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,Js={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},Ys=s=>Js[s],Zs=s=>s.replace(Ws,Ys);let Ve={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:Zs};const Qs=(s={})=>{Ve={...Ve,...s}},Xs=()=>Ve;let Et;const er=s=>{Et=s},tr=()=>Et,jn={type:"3rdParty",init(s){Qs(s.options.react),er(s)}},sr=w.createContext();class rr{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(t=>{this.usedNamespaces[t]||(this.usedNamespaces[t]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}const nr=(s,e)=>{const t=w.useRef();return w.useEffect(()=>{t.current=s},[s,e]),t.current},It=(s,e,t,r)=>s.getFixedT(e,t,r),or=(s,e,t,r)=>w.useCallback(It(s,e,t,r),[s,e,t,r]),Vn=(s,e={})=>{const{i18n:t}=e,{i18n:r,defaultNS:n}=w.useContext(sr)||{},o=t||r||tr();if(o&&!o.reportNamespaces&&(o.reportNamespaces=new rr),!o){Te(o,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const O=(z,_)=>te(_)?_:qs(_)&&te(_.defaultValue)?_.defaultValue:Array.isArray(z)?z[z.length-1]:z,L=[O,{},!1];return L.t=O,L.i18n={},L.ready=!1,L}o.options.react?.wait&&Te(o,"DEPRECATED_OPTION","useTranslation: It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const a={...Xs(),...o.options.react,...e},{useSuspense:c,keyPrefix:l}=a;let i=n||o.options?.defaultNS;i=te(i)?[i]:i||["translation"],o.reportNamespaces.addUsedNamespaces?.(i);const d=(o.isInitialized||o.initializedStoreOnce)&&i.every(O=>Gs(O,o,a)),u=or(o,e.lng||null,a.nsMode==="fallback"?i:i[0],l),p=()=>u,h=()=>It(o,e.lng||null,a.nsMode==="fallback"?i:i[0],l),[f,b]=w.useState(p);let x=i.join();e.lng&&(x=`${e.lng}${x}`);const C=nr(x),N=w.useRef(!0);w.useEffect(()=>{const{bindI18n:O,bindI18nStore:L}=a;N.current=!0,!d&&!c&&(e.lng?ft(o,e.lng,i,()=>{N.current&&b(h)}):je(o,i,()=>{N.current&&b(h)})),d&&C&&C!==x&&N.current&&b(h);const z=()=>{N.current&&b(h)};return O&&o?.on(O,z),L&&o?.store.on(L,z),()=>{N.current=!1,o&&O&&O?.split(" ").forEach(_=>o.off(_,z)),L&&o&&L.split(" ").forEach(_=>o.store.off(_,z))}},[o,x]),w.useEffect(()=>{N.current&&d&&b(p)},[o,l,d]);const E=[f,o,d];if(E.t=f,E.i18n=o,E.ready=d,d||!d&&!c)return E;throw new Promise(O=>{e.lng?ft(o,e.lng,i,()=>O()):je(o,i,()=>O())})};/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ir=s=>s.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),ar=s=>s.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase()),pt=s=>{const e=ar(s);return e.charAt(0).toUpperCase()+e.slice(1)},At=(...s)=>s.filter((e,t,r)=>!!e&&e.trim()!==""&&r.indexOf(e)===t).join(" ").trim(),lr=s=>{for(const e in s)if(e.startsWith("aria-")||e==="role"||e==="title")return!0};/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var cr={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const dr=w.forwardRef(({color:s="currentColor",size:e=24,strokeWidth:t=2,absoluteStrokeWidth:r,className:n="",children:o,iconNode:a,...c},l)=>w.createElement("svg",{ref:l,...cr,width:e,height:e,stroke:s,strokeWidth:r?Number(t)*24/Number(e):t,className:At("lucide",n),...!o&&!lr(c)&&{"aria-hidden":"true"},...c},[...a.map(([i,d])=>w.createElement(i,d)),...Array.isArray(o)?o:[o]]));/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const y=(s,e)=>{const t=w.forwardRef(({className:r,...n},o)=>w.createElement(dr,{ref:o,iconNode:e,className:At(`lucide-${ir(pt(s))}`,`lucide-${s}`,r),...n}));return t.displayName=pt(s),t};/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ur=[["path",{d:"M10 2v5.632c0 .424-.272.795-.653.982A6 6 0 0 0 6 14c.006 4 3 7 5 8",key:"1h8rid"}],["path",{d:"M10 5H8a2 2 0 0 0 0 4h.68",key:"3ezsi6"}],["path",{d:"M14 2v5.632c0 .424.272.795.652.982A6 6 0 0 1 18 14c0 4-3 7-5 8",key:"yt6q09"}],["path",{d:"M14 5h2a2 2 0 0 1 0 4h-.68",key:"8f95yk"}],["path",{d:"M18 22H6",key:"mg6kv4"}],["path",{d:"M9 2h6",key:"1jrp98"}]],Fn=y("amphora",ur);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hr=[["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",key:"izxlao"}],["path",{d:"M10 4v4",key:"pp8u80"}],["path",{d:"M2 8h20",key:"d11cs7"}],["path",{d:"M6 4v4",key:"1svtjw"}]],Hn=y("app-window",hr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fr=[["path",{d:"M9 13a1 1 0 0 0-1-1H5.061a1 1 0 0 1-.75-1.811l6.836-6.835a1.207 1.207 0 0 1 1.707 0l6.835 6.835a1 1 0 0 1-.75 1.811H16a1 1 0 0 0-1 1v2a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1z",key:"pnzqmc"}],["path",{d:"M9 20h6",key:"s66wpe"}]],Dn=y("arrow-big-up-dash",fr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const pr=[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]],Un=y("arrow-down",pr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gr=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],Kn=y("arrow-left",gr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mr=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],Bn=y("arrow-right",mr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yr=[["path",{d:"m18 9-6-6-6 6",key:"kcunyi"}],["path",{d:"M12 3v14",key:"7cf3v8"}],["path",{d:"M5 21h14",key:"11awu3"}]],Gn=y("arrow-up-from-line",yr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const br=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],qn=y("arrow-up",br);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xr=[["path",{d:"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",key:"3c2336"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["line",{x1:"12",x2:"12.01",y1:"17",y2:"17",key:"io3f8k"}]],Wn=y("badge-question-mark",xr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const kr=[["path",{d:"M4.929 4.929 19.07 19.071",key:"196cmz"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],Jn=y("ban",kr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vr=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M16 12h2",key:"7q9ll5"}],["path",{d:"M16 8h2",key:"msurwy"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}],["path",{d:"M6 12h2",key:"32wvfc"}],["path",{d:"M6 8h2",key:"30oboj"}]],Yn=y("book-open-text",vr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wr=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],Zn=y("book-open",wr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Sr=[["path",{d:"m16 22-1-4",key:"1ow2iv"}],["path",{d:"M19 13.99a1 1 0 0 0 1-1V12a2 2 0 0 0-2-2h-3a1 1 0 0 1-1-1V4a2 2 0 0 0-4 0v5a1 1 0 0 1-1 1H6a2 2 0 0 0-2 2v.99a1 1 0 0 0 1 1",key:"iw8jdu"}],["path",{d:"M5 14h14l1.973 6.767A1 1 0 0 1 20 22H4a1 1 0 0 1-.973-1.233z",key:"1soew8"}],["path",{d:"m8 22 1-4",key:"s3unb"}]],Qn=y("brush-cleaning",Sr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Or=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Xn=y("check",Or);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Cr=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],eo=y("chevron-down",Cr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Mr=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],to=y("chevron-left",Mr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Nr=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],so=y("chevron-right",Nr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Lr=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],ro=y("chevron-up",Lr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Rr=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],no=y("circle-check",Rr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _r=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}]],oo=y("circle-minus",_r);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $r=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],io=y("circle-x",$r);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zr=[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]],ao=y("cloud",zr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Pr=[["path",{d:"M10 2v2",key:"7u0qdc"}],["path",{d:"M14 2v2",key:"6buw04"}],["path",{d:"M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1",key:"pwadti"}],["path",{d:"M6 2v2",key:"colzsn"}]],lo=y("coffee",Pr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Er=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]],co=y("database",Er);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ir=[["rect",{width:"12",height:"12",x:"2",y:"10",rx:"2",ry:"2",key:"6agr2n"}],["path",{d:"m17.92 14 3.5-3.5a2.24 2.24 0 0 0 0-3l-5-4.92a2.24 2.24 0 0 0-3 0L10 6",key:"1o487t"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"M10 14h.01",key:"ssrbsk"}],["path",{d:"M15 6h.01",key:"cblpky"}],["path",{d:"M18 9h.01",key:"2061c0"}]],uo=y("dices",Ir);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ar=[["path",{d:"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"1pf5j1"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"m5 12-3 3 3 3",key:"oke12k"}],["path",{d:"m9 18 3-3-3-3",key:"112psh"}]],ho=y("file-code-2",Ar);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Tr=[["path",{d:"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"1pf5j1"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M3 15h6",key:"4e2qda"}],["path",{d:"M6 12v6",key:"1u72j0"}]],fo=y("file-plus-2",Tr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jr=[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"m15 15-3-3-3 3",key:"15xj92"}]],po=y("file-up",jr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Vr=[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]],go=y("git-branch",Vr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Fr=[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]],mo=y("hard-drive",Fr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Hr=[["path",{d:"M5 22h14",key:"ehvnwv"}],["path",{d:"M5 2h14",key:"pdyrp9"}],["path",{d:"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22",key:"1d314k"}],["path",{d:"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2",key:"1vvvr6"}]],yo=y("hourglass",Hr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Dr=[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"1d0kgt"}]],bo=y("house",Dr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ur=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],xo=y("info",Ur);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Kr=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],ko=y("key-round",Kr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Br=[["path",{d:"m3 17 2 2 4-4",key:"1jhpwq"}],["path",{d:"m3 7 2 2 4-4",key:"1obspn"}],["path",{d:"M13 6h8",key:"15sg57"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 18h8",key:"oe0vm4"}]],vo=y("list-checks",Br);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Gr=[["path",{d:"M16 12H3",key:"1a2rj7"}],["path",{d:"M16 6H3",key:"1wxfjs"}],["path",{d:"M10 18H3",key:"13769t"}],["path",{d:"M21 6v10a2 2 0 0 1-2 2h-5",key:"ilrcs8"}],["path",{d:"m16 16-2 2 2 2",key:"kkc6pm"}]],wo=y("list-end",Gr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const qr=[["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 18h.01",key:"1tta3j"}],["path",{d:"M3 6h.01",key:"1rqtza"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 18h13",key:"1lx6n3"}],["path",{d:"M8 6h13",key:"ik3vkj"}]],So=y("list",qr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Wr=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],Oo=y("loader-circle",Wr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Jr=[["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 18h8",key:"oe0vm4"}],["path",{d:"M13 6h8",key:"15sg57"}],["path",{d:"M3 12h1",key:"lp3yf2"}],["path",{d:"M3 18h1",key:"1eiwyy"}],["path",{d:"M3 6h1",key:"rgxa97"}],["path",{d:"M8 12h1",key:"1con00"}],["path",{d:"M8 18h1",key:"13wk12"}],["path",{d:"M8 6h1",key:"tn6mkg"}]],Co=y("logs",Jr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Yr=[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]],Mo=y("map",Yr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Zr=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],No=y("pencil",Zr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Qr=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]],Lo=y("play",Qr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Xr=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],Ro=y("plus",Xr);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const en=[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]],_o=y("refresh-ccw",en);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const tn=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],$o=y("refresh-cw",tn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const sn=[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]],zo=y("scroll-text",sn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rn=[["path",{d:"m13 13.5 2-2.5-2-2.5",key:"1rvxrh"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}],["path",{d:"M9 8.5 7 11l2 2.5",key:"6ffwbx"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Po=y("search-code",rn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nn=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Eo=y("search",nn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const on=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],Io=y("server",on);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const an=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Ao=y("settings-2",an);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ln=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],To=y("settings",ln);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cn=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],jo=y("shield",cn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const dn=[["circle",{cx:"8",cy:"21",r:"1",key:"jimo8o"}],["circle",{cx:"19",cy:"21",r:"1",key:"13723u"}],["path",{d:"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12",key:"9zh506"}]],Vo=y("shopping-cart",dn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const un=[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]],Fo=y("sliders-horizontal",un);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hn=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],Ho=y("square",hn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fn=[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}]],Do=y("sword",fn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const pn=[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}],["polyline",{points:"14.5 6.5 18 3 21 3 21 6 17.5 9.5",key:"hbey2j"}],["line",{x1:"5",x2:"9",y1:"14",y2:"18",key:"1hf58s"}],["line",{x1:"7",x2:"4",y1:"17",y2:"20",key:"pidxm4"}],["line",{x1:"3",x2:"5",y1:"19",y2:"21",key:"1pehsh"}]],Uo=y("swords",pn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gn=[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]],Ko=y("tag",gn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mn=[["path",{d:"M14.5 2v17.5c0 1.4-1.1 2.5-2.5 2.5c-1.4 0-2.5-1.1-2.5-2.5V2",key:"125lnx"}],["path",{d:"M8.5 2h7",key:"csnxdl"}],["path",{d:"M14.5 16h-5",key:"1ox875"}]],Bo=y("test-tube",mn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yn=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],Go=y("trash-2",yn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const bn=[["circle",{cx:"10",cy:"7",r:"4",key:"e45bow"}],["path",{d:"M10.3 15H7a4 4 0 0 0-4 4v2",key:"3bnktk"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["path",{d:"m21 21-1.9-1.9",key:"1g2n9r"}]],qo=y("user-search",bn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xn=[["path",{d:"M18 21a8 8 0 0 0-16 0",key:"3ypg7q"}],["circle",{cx:"10",cy:"8",r:"5",key:"o932ke"}],["path",{d:"M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3",key:"10s06x"}]],Wo=y("users-round",xn);/** + * @license lucide-react v0.542.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const kn=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Jo=y("x",kn),fe=typeof window<"u"?w.useLayoutEffect:w.useEffect;function gt(s){if(s!==void 0)switch(typeof s){case"number":return s;case"string":{if(s.endsWith("px"))return parseFloat(s);break}}}function vn({box:s,defaultHeight:e,defaultWidth:t,disabled:r,element:n,mode:o,style:a}){const{styleHeight:c,styleWidth:l}=w.useMemo(()=>({styleHeight:gt(a?.height),styleWidth:gt(a?.width)}),[a?.height,a?.width]),[i,d]=w.useState({height:e,width:t}),u=r||c!==void 0||o==="only-width"||c!==void 0&&l!==void 0;return fe(()=>{if(n===null||u)return;const p=new ResizeObserver(h=>{for(const f of h){const{contentRect:b,target:x}=f;n===x&&d(C=>C.height===b.height&&C.width===b.width?C:{height:b.height,width:b.width})}});return p.observe(n,{box:s}),()=>{p?.unobserve(n)}},[s,u,n,c,l]),w.useMemo(()=>({height:c??i.height,width:l??i.width}),[i,c,l])}function Tt(s){const e=w.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return fe(()=>{e.current=s},[s]),w.useCallback(t=>e.current?.(t),[e])}function $e({containerElement:s,direction:e,isRtl:t,scrollOffset:r}){return r}function Z(s,e="Assertion error"){if(!s)throw console.error(e),Error(e)}function de(s,e){if(s===e)return!0;if(!!s!=!!e||(Z(s!==void 0),Z(e!==void 0),Object.keys(s).length!==Object.keys(e).length))return!1;for(const t in s)if(!Object.is(e[t],s[t]))return!1;return!0}function jt({cachedBounds:s,itemCount:e,itemSize:t}){if(e===0)return 0;if(typeof t=="number")return e*t;{const r=s.get(s.size===0?0:s.size-1);Z(r!==void 0,"Unexpected bounds cache miss");const n=(r.scrollOffset+r.size)/s.size;return e*n}}function wn({align:s,cachedBounds:e,index:t,itemCount:r,itemSize:n,containerScrollOffset:o,containerSize:a}){const c=jt({cachedBounds:e,itemCount:r,itemSize:n}),l=e.get(t),i=Math.max(0,Math.min(c-a,l.scrollOffset)),d=Math.max(0,l.scrollOffset-a+l.size);switch(s==="smart"&&(o>=d&&o<=i?s="auto":s="center"),s){case"start":return i;case"end":return d;case"center":return l.scrollOffset<=a/2?0:l.scrollOffset+l.size/2>=c-a/2?c-a:l.scrollOffset+l.size/2-a/2;case"auto":default:return o>=d&&o<=i?o:oe)break;d++}for(a=d,l=Math.max(0,a-n);d=e+t)break;d++}return c=Math.min(o,d),i=Math.min(r-1,c+n),a<0&&(a=0,c=-1,l=0,i=-1),{startIndexVisible:a,stopIndexVisible:c,startIndexOverscan:l,stopIndexOverscan:i}}function Sn({itemCount:s,itemProps:e,itemSize:t}){const r=new Map;return{get(n){for(Z(nSn({itemCount:s,itemProps:e,itemSize:t}),[s,e,t])}function Cn({containerSize:s,itemSize:e}){let t;switch(typeof e){case"string":{Z(e.endsWith("%"),`Invalid item size: "${e}"; string values must be percentages (e.g. "100%")`),Z(s!==void 0,"Container size must be defined if a percentage item size is specified"),t=s*parseInt(e)/100;break}default:{t=e;break}}return t}function Mn({containerElement:s,containerStyle:e,defaultContainerSize:t=0,direction:r,isRtl:n=!1,itemCount:o,itemProps:a,itemSize:c,onResize:l,overscanCount:i}){const[d,u]=w.useState({startIndexVisible:0,startIndexOverscan:0,stopIndexVisible:-1,stopIndexOverscan:-1}),{startIndexVisible:p,startIndexOverscan:h,stopIndexVisible:f,stopIndexOverscan:b}={startIndexVisible:Math.min(o-1,d.startIndexVisible),startIndexOverscan:Math.min(o-1,d.startIndexOverscan),stopIndexVisible:Math.min(o-1,d.stopIndexVisible),stopIndexOverscan:Math.min(o-1,d.stopIndexOverscan)},{height:x=t,width:C=t}=vn({defaultHeight:t,defaultWidth:void 0,element:s,mode:"only-height",style:e}),N=w.useRef({height:0,width:0}),E=x,O=Cn({containerSize:E,itemSize:c});w.useLayoutEffect(()=>{if(typeof l=="function"){const R=N.current;(R.height!==x||R.width!==C)&&(l({height:x,width:C},{...R}),R.height=x,R.width=C)}},[x,l,C]);const L=On({itemCount:o,itemProps:a,itemSize:O}),z=w.useCallback(R=>L.get(R),[L]),_=w.useCallback(()=>jt({cachedBounds:L,itemCount:o,itemSize:O}),[L,o,O]),v=w.useCallback(R=>{const G=$e({containerElement:s,direction:r,isRtl:n,scrollOffset:R});return mt({cachedBounds:L,containerScrollOffset:G,containerSize:E,itemCount:o,overscanCount:i})},[L,s,E,r,n,o,i]);fe(()=>{const R=s?.scrollTop??0;u(v(R))},[s,r,v]),fe(()=>{if(!s)return;const R=()=>{u(G=>{const{scrollLeft:q,scrollTop:P}=s,$=$e({containerElement:s,direction:r,isRtl:n,scrollOffset:P}),j=mt({cachedBounds:L,containerScrollOffset:$,containerSize:E,itemCount:o,overscanCount:i});return de(j,G)?G:j})};return s.addEventListener("scroll",R),()=>{s.removeEventListener("scroll",R)}},[L,s,E,r,o,i]);const I=Tt(({align:R="auto",containerScrollOffset:G,index:q})=>{let P=wn({align:R,cachedBounds:L,containerScrollOffset:G,containerSize:E,index:q,itemCount:o,itemSize:O});if(s){if(P=$e({containerElement:s,direction:r,isRtl:n,scrollOffset:P}),typeof s.scrollTo!="function"){const $=v(P);de(d,$)||u($)}return P}});return{getCellBounds:z,getEstimatedSize:_,scrollToIndex:I,startIndexOverscan:h,startIndexVisible:p,stopIndexOverscan:b,stopIndexVisible:f}}function Nn(s){return w.useMemo(()=>s,Object.values(s))}function Ln(s,e){const{ariaAttributes:t,style:r,...n}=s,{ariaAttributes:o,style:a,...c}=e;return de(t,o)&&de(r,a)&&de(n,c)}function Rn(s){return s!=null&&typeof s=="object"&&"getAverageRowHeight"in s&&typeof s.getAverageRowHeight=="function"}const Fe="data-react-window-index";function Yo({children:s,className:e,defaultHeight:t=0,listRef:r,onResize:n,onRowsRendered:o,overscanCount:a=3,rowComponent:c,rowCount:l,rowHeight:i,rowProps:d,tagName:u="div",style:p,...h}){const f=Nn(d),b=w.useMemo(()=>w.memo(c,Ln),[c]),[x,C]=w.useState(null),N=Rn(i),E=w.useMemo(()=>N?P=>i.getRowHeight(P)??i.getAverageRowHeight():i,[N,i]),{getCellBounds:O,getEstimatedSize:L,scrollToIndex:z,startIndexOverscan:_,startIndexVisible:v,stopIndexOverscan:I,stopIndexVisible:R}=Mn({containerElement:x,containerStyle:p,defaultContainerSize:t,direction:"vertical",itemCount:l,itemProps:f,itemSize:E,onResize:n,overscanCount:a});w.useImperativeHandle(r,()=>({get element(){return x},scrollToRow({align:P="auto",behavior:$="auto",index:j}){const A=z({align:P,containerScrollOffset:x?.scrollTop??0,index:j});typeof x?.scrollTo=="function"&&x.scrollTo({behavior:$,top:A})}}),[x,z]),fe(()=>{if(!x)return;const P=Array.from(x.children).filter(($,j)=>{if($.hasAttribute("aria-hidden"))return!1;const A=`${_+j}`;return $.setAttribute(Fe,A),!0});if(N)return i.observeRowElements(P)},[x,N,i,_,I]),w.useEffect(()=>{_>=0&&I>=0&&o&&o({startIndex:v,stopIndex:R},{startIndex:_,stopIndex:I})},[o,_,v,I,R]);const G=w.useMemo(()=>{const P=[];if(l>0)for(let $=_;$<=I;$++){const j=O($);P.push(w.createElement(b,{...f,ariaAttributes:{"aria-posinset":$+1,"aria-setsize":l,role:"listitem"},key:$,index:$,style:{position:"absolute",left:0,transform:`translateY(${j.scrollOffset}px)`,height:N?void 0:j.size,width:"100%"}}))}return P},[b,O,N,l,f,_,I]),q=Ft.jsx("div",{"aria-hidden":!0,style:{height:L(),width:"100%",zIndex:-1}});return w.createElement(u,{role:"list",...h,className:e,ref:C,style:{position:"relative",maxHeight:"100%",flexGrow:1,overflowY:"auto",...p}},G,s,q)}function Zo({defaultRowHeight:s,key:e}){const[t,r]=w.useState({key:e,map:new Map});t.key!==e&&r({key:e,map:new Map});const{map:n}=t,o=w.useCallback(()=>{let u=0;return n.forEach(p=>{u+=p}),u===0?s:u/n.size},[s,n]),a=w.useCallback(u=>n.get(u),[n]),c=w.useCallback((u,p)=>{r(h=>{if(h.map.get(u)===p)return h;const f=new Map(h.map);return f.set(u,p),{...h,map:f}})},[]),l=Tt(u=>{u.length!==0&&u.forEach(p=>{const{borderBoxSize:h,target:f}=p,b=f.getAttribute(Fe);Z(b!==null,`Invalid ${Fe} attribute value`);const x=parseInt(b),{blockSize:C}=h[0];C&&c(x,C)})}),[i]=w.useState(()=>new ResizeObserver(l));w.useEffect(()=>()=>{i.disconnect()},[i]);const d=w.useCallback(u=>(u.forEach(p=>i.observe(p)),()=>{u.forEach(p=>i.unobserve(p))}),[i]);return w.useMemo(()=>({getAverageRowHeight:o,getRowHeight:a,setRowHeight:c,observeRowElements:d}),[o,a,c,d])}const yt=s=>typeof s=="boolean"?`${s}`:s===0?"0":s,bt=Bt,Qo=(s,e)=>t=>{var r;if(e?.variants==null)return bt(s,t?.class,t?.className);const{variants:n,defaultVariants:o}=e,a=Object.keys(n).map(i=>{const d=t?.[i],u=o?.[i];if(d===null)return null;const p=yt(d)||yt(u);return n[i][p]}),c=t&&Object.entries(t).reduce((i,d)=>{let[u,p]=d;return p===void 0||(i[u]=p),i},{}),l=e==null||(r=e.compoundVariants)===null||r===void 0?void 0:r.reduce((i,d)=>{let{class:u,className:p,...h}=d;return Object.entries(h).every(f=>{let[b,x]=f;return Array.isArray(x)?x.includes({...o,...c}[b]):{...o,...c}[b]===x})?[...i,u,p]:i},[]);return bt(s,a,l,t?.class,t?.className)};var _n=(s,e,t,r,n,o,a,c)=>{let l=document.documentElement,i=["light","dark"];function d(h){(Array.isArray(s)?s:[s]).forEach(f=>{let b=f==="class",x=b&&o?n.map(C=>o[C]||C):n;b?(l.classList.remove(...x),l.classList.add(o&&o[h]?o[h]:h)):l.setAttribute(f,h)}),u(h)}function u(h){c&&i.includes(h)&&(l.style.colorScheme=h)}function p(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(r)d(r);else try{let h=localStorage.getItem(e)||t,f=a&&h==="system"?p():h;d(f)}catch{}},$n=w.createContext(void 0),zn={setTheme:s=>{},themes:[]},Xo=()=>{var s;return(s=w.useContext($n))!=null?s:zn};w.memo(({forcedTheme:s,storageKey:e,attribute:t,enableSystem:r,enableColorScheme:n,defaultTheme:o,value:a,themes:c,nonce:l,scriptProps:i})=>{let d=JSON.stringify([t,e,o,s,c,a,r,n]).slice(1,-1);return w.createElement("script",{...i,suppressHydrationWarning:!0,nonce:typeof window>"u"?l:"",dangerouslySetInnerHTML:{__html:`(${_n.toString()})(${d})`}})});export{zo as $,Dn as A,Yn as B,io as C,Bn as D,Un as E,fo as F,Kn as G,bo as H,xo as I,qn as J,Eo as K,vo as L,Jn as M,Po as N,Ao as O,No as P,Gn as Q,$o as R,Fo as S,Go as T,Wo as U,Mo as V,co as W,Jo as X,ho as Y,Io as Z,Fn as _,In as a,Do as a0,jo as a1,Qn as a2,Uo as a3,Vo as a4,uo as a5,lo as a6,B as a7,jn as a8,mo as a9,ao as aa,_o as ab,Hn as ac,go as ad,qo as ae,Bo as af,oo as ag,Zn as ah,Ko as ai,ko as aj,Xo as ak,Tn as b,Bt as c,To as d,no as e,eo as f,Xn as g,ro as h,Wn as i,to as j,so as k,Oo as l,Zo as m,Yo as n,yo as o,So as p,Ho as q,En as r,Lo as s,An as t,Vn as u,Co as v,po as w,wo as x,Ro as y,Qo as z}; diff --git a/service/dist/assets/misc-GeCjUSSS.js.br b/service/dist/assets/misc-GeCjUSSS.js.br new file mode 100644 index 0000000000000000000000000000000000000000..90bfe62824fb98768261840425329ec10b31bbac GIT binary patch literal 29974 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 literal 0 HcmV?d00001 diff --git a/service/dist/assets/motion-Dp9wOFzY.js b/service/dist/assets/motion-Dp9wOFzY.js new file mode 100644 index 000000000..9a2cac4f5 --- /dev/null +++ b/service/dist/assets/motion-Dp9wOFzY.js @@ -0,0 +1,25 @@ +function so(t,e){for(var n=0;ns[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}function io(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Pe={exports:{}},Ft={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Wn;function ro(){if(Wn)return Ft;Wn=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(s,i,o){var r=null;if(o!==void 0&&(r=""+o),i.key!==void 0&&(r=""+i.key),"key"in i){o={};for(var a in i)a!=="key"&&(o[a]=i[a])}else o=i;return i=o.ref,{$$typeof:t,type:s,key:r,ref:i!==void 0?i:null,props:o}}return Ft.Fragment=e,Ft.jsx=n,Ft.jsxs=n,Ft}var Kn;function oo(){return Kn||(Kn=1,Pe.exports=ro()),Pe.exports}var tt=oo(),Ae={exports:{}},D={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Hn;function ao(){if(Hn)return D;Hn=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),o=Symbol.for("react.consumer"),r=Symbol.for("react.context"),a=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),c=Symbol.for("react.memo"),l=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),d=Symbol.iterator;function p(h){return h===null||typeof h!="object"?null:(h=d&&h[d]||h["@@iterator"],typeof h=="function"?h:null)}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,T={};function y(h,g,R){this.props=h,this.context=g,this.refs=T,this.updater=R||m}y.prototype.isReactComponent={},y.prototype.setState=function(h,g){if(typeof h!="object"&&typeof h!="function"&&h!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,h,g,"setState")},y.prototype.forceUpdate=function(h){this.updater.enqueueForceUpdate(this,h,"forceUpdate")};function P(){}P.prototype=y.prototype;function x(h,g,R){this.props=h,this.context=g,this.refs=T,this.updater=R||m}var C=x.prototype=new P;C.constructor=x,v(C,y.prototype),C.isPureReactComponent=!0;var w=Array.isArray;function V(){}var S={H:null,A:null,T:null,S:null},b=Object.prototype.hasOwnProperty;function L(h,g,R){var M=R.ref;return{$$typeof:t,type:h,key:g,ref:M!==void 0?M:null,props:R}}function W(h,g){return L(h.type,g,h.props)}function N(h){return typeof h=="object"&&h!==null&&h.$$typeof===t}function dt(h){var g={"=":"=0",":":"=2"};return"$"+h.replace(/[=:]/g,function(R){return g[R]})}var at=/\/+/g;function yt(h,g){return typeof h=="object"&&h!==null&&h.key!=null?dt(""+h.key):g.toString(36)}function jt(h){switch(h.status){case"fulfilled":return h.value;case"rejected":throw h.reason;default:switch(typeof h.status=="string"?h.then(V,V):(h.status="pending",h.then(function(g){h.status==="pending"&&(h.status="fulfilled",h.value=g)},function(g){h.status==="pending"&&(h.status="rejected",h.reason=g)})),h.status){case"fulfilled":return h.value;case"rejected":throw h.reason}}throw h}function ut(h,g,R,M,k){var I=typeof h;(I==="undefined"||I==="boolean")&&(h=null);var j=!1;if(h===null)j=!0;else switch(I){case"bigint":case"string":case"number":j=!0;break;case"object":switch(h.$$typeof){case t:case e:j=!0;break;case l:return j=h._init,ut(j(h._payload),g,R,M,k)}}if(j)return k=k(h),j=M===""?"."+yt(h,0):M,w(k)?(R="",j!=null&&(R=j.replace(at,"$&/")+"/"),ut(k,g,R,"",function(no){return no})):k!=null&&(N(k)&&(k=W(k,R+(k.key==null||h&&h.key===k.key?"":(""+k.key).replace(at,"$&/")+"/")+j)),g.push(k)),1;j=0;var z=M===""?".":M+":";if(w(h))for(var K=0;K-1&&t.splice(n,1)}function co([...t],e,n){const s=e<0?t.length+e:e;if(s>=0&&sn>e?e:n{};const ft={},ci=t=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(t);function fi(t){return typeof t=="object"&&t!==null}const hi=t=>/^0[^.\s]+$/u.test(t);function hn(t){let e;return()=>(e===void 0&&(e=t()),e)}const et=t=>t,fo=(t,e)=>n=>e(t(n)),te=(...t)=>t.reduce(fo),Dt=(t,e,n)=>{const s=e-t;return s===0?1:(n-t)/s};class dn{constructor(){this.subscriptions=[]}add(e){return cn(this.subscriptions,e),()=>Qt(this.subscriptions,e)}notify(e,n,s){const i=this.subscriptions.length;if(i)if(i===1)this.subscriptions[0](e,n,s);else for(let o=0;ot*1e3,rt=t=>t/1e3;function di(t,e){return e?t*(1e3/e):0}const ho=(t,e,n)=>{const s=e-t;return((n-t)%s+s)%s+t},pi=(t,e,n)=>(((1-3*n+3*e)*t+(3*n-6*e))*t+3*e)*t,po=1e-7,mo=12;function go(t,e,n,s,i){let o,r,a=0;do r=e+(n-e)/2,o=pi(r,s,i)-t,o>0?n=r:e=r;while(Math.abs(o)>po&&++ago(o,0,1,t,n);return o=>o===0||o===1?o:pi(i(o),e,s)}const mi=t=>e=>e<=.5?t(2*e)/2:(2-t(2*(1-e)))/2,gi=t=>e=>1-t(1-e),yi=ee(.33,1.53,.69,.99),pn=gi(yi),vi=mi(pn),Ti=t=>(t*=2)<1?.5*pn(t):.5*(2-Math.pow(2,-10*(t-1))),mn=t=>1-Math.sin(Math.acos(t)),xi=gi(mn),Pi=mi(mn),yo=ee(.42,0,1,1),vo=ee(0,0,.58,1),Ai=ee(.42,0,.58,1),Si=t=>Array.isArray(t)&&typeof t[0]!="number";function wi(t,e){return Si(t)?t[ho(0,t.length,e)]:t}const bi=t=>Array.isArray(t)&&typeof t[0]=="number",To={linear:et,easeIn:yo,easeInOut:Ai,easeOut:vo,circIn:mn,circInOut:Pi,circOut:xi,backIn:pn,backInOut:vi,backOut:yi,anticipate:Ti},xo=t=>typeof t=="string",Be=t=>{if(bi(t)){fn(t.length===4);const[e,n,s,i]=t;return ee(e,n,s,i)}else if(xo(t))return To[t];return t},ie=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function Po(t,e){let n=new Set,s=new Set,i=!1,o=!1;const r=new WeakSet;let a={delta:0,timestamp:0,isProcessing:!1};function u(l){r.has(l)&&(c.schedule(l),t()),l(a)}const c={schedule:(l,f=!1,d=!1)=>{const m=d&&i?n:s;return f&&r.add(l),m.has(l)||m.add(l),l},cancel:l=>{s.delete(l),r.delete(l)},process:l=>{if(a=l,i){o=!0;return}i=!0,[n,s]=[s,n],n.forEach(u),n.clear(),i=!1,o&&(o=!1,c.process(l))}};return c}const Ao=40;function Ci(t,e){let n=!1,s=!0;const i={delta:0,timestamp:0,isProcessing:!1},o=()=>n=!0,r=ie.reduce((x,C)=>(x[C]=Po(o),x),{}),{setup:a,read:u,resolveKeyframes:c,preUpdate:l,update:f,preRender:d,render:p,postRender:m}=r,v=()=>{const x=ft.useManualTiming?i.timestamp:performance.now();n=!1,ft.useManualTiming||(i.delta=s?1e3/60:Math.max(Math.min(x-i.timestamp,Ao),1)),i.timestamp=x,i.isProcessing=!0,a.process(i),u.process(i),c.process(i),l.process(i),f.process(i),d.process(i),p.process(i),m.process(i),i.isProcessing=!1,n&&e&&(s=!1,t(v))},T=()=>{n=!0,s=!0,i.isProcessing||t(v)};return{schedule:ie.reduce((x,C)=>{const w=r[C];return x[C]=(V,S=!1,b=!1)=>(n||T(),w.schedule(V,S,b)),x},{}),cancel:x=>{for(let C=0;C(ue===void 0&&q.set(Y.isProcessing||ft.useManualTiming?Y.timestamp:performance.now()),ue),set:t=>{ue=t,queueMicrotask(So)}},Vi=t=>e=>typeof e=="string"&&e.startsWith(t),gn=Vi("--"),wo=Vi("var(--"),yn=t=>wo(t)?bo.test(t.split("/*")[0].trim()):!1,bo=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu,kt={test:t=>typeof t=="number",parse:parseFloat,transform:t=>t},Gt={...kt,transform:t=>ct(0,1,t)},re={...kt,default:1},Nt=t=>Math.round(t*1e5)/1e5,vn=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function Co(t){return t==null}const Vo=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,Tn=(t,e)=>n=>!!(typeof n=="string"&&Vo.test(n)&&n.startsWith(t)||e&&!Co(n)&&Object.prototype.hasOwnProperty.call(n,e)),Ei=(t,e,n)=>s=>{if(typeof s!="string")return s;const[i,o,r,a]=s.match(vn);return{[t]:parseFloat(i),[e]:parseFloat(o),[n]:parseFloat(r),alpha:a!==void 0?parseFloat(a):1}},Eo=t=>ct(0,255,t),we={...kt,transform:t=>Math.round(Eo(t))},xt={test:Tn("rgb","red"),parse:Ei("red","green","blue"),transform:({red:t,green:e,blue:n,alpha:s=1})=>"rgba("+we.transform(t)+", "+we.transform(e)+", "+we.transform(n)+", "+Nt(Gt.transform(s))+")"};function Mo(t){let e="",n="",s="",i="";return t.length>5?(e=t.substring(1,3),n=t.substring(3,5),s=t.substring(5,7),i=t.substring(7,9)):(e=t.substring(1,2),n=t.substring(2,3),s=t.substring(3,4),i=t.substring(4,5),e+=e,n+=n,s+=s,i+=i),{red:parseInt(e,16),green:parseInt(n,16),blue:parseInt(s,16),alpha:i?parseInt(i,16)/255:1}}const _e={test:Tn("#"),parse:Mo,transform:xt.transform},ne=t=>({test:e=>typeof e=="string"&&e.endsWith(t)&&e.split(" ").length===1,parse:parseFloat,transform:e=>`${e}${t}`}),pt=ne("deg"),ot=ne("%"),E=ne("px"),Ro=ne("vh"),Do=ne("vw"),Yn={...ot,parse:t=>ot.parse(t)/100,transform:t=>ot.transform(t*100)},bt={test:Tn("hsl","hue"),parse:Ei("hue","saturation","lightness"),transform:({hue:t,saturation:e,lightness:n,alpha:s=1})=>"hsla("+Math.round(t)+", "+ot.transform(Nt(e))+", "+ot.transform(Nt(n))+", "+Nt(Gt.transform(s))+")"},H={test:t=>xt.test(t)||_e.test(t)||bt.test(t),parse:t=>xt.test(t)?xt.parse(t):bt.test(t)?bt.parse(t):_e.parse(t),transform:t=>typeof t=="string"?t:t.hasOwnProperty("red")?xt.transform(t):bt.transform(t),getAnimatableNone:t=>{const e=H.parse(t);return e.alpha=0,H.transform(e)}},Lo=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function ko(t){return isNaN(t)&&typeof t=="string"&&(t.match(vn)?.length||0)+(t.match(Lo)?.length||0)>0}const Mi="number",Ri="color",Io="var",Oo="var(",zn="${}",jo=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function Yt(t){const e=t.toString(),n=[],s={color:[],number:[],var:[]},i=[];let o=0;const a=e.replace(jo,u=>(H.test(u)?(s.color.push(o),i.push(Ri),n.push(H.parse(u))):u.startsWith(Oo)?(s.var.push(o),i.push(Io),n.push(u)):(s.number.push(o),i.push(Mi),n.push(parseFloat(u))),++o,zn)).split(zn);return{values:n,split:a,indexes:s,types:i}}function Di(t){return Yt(t).values}function Li(t){const{split:e,types:n}=Yt(t),s=e.length;return i=>{let o="";for(let r=0;rtypeof t=="number"?0:H.test(t)?H.getAnimatableNone(t):t;function Bo(t){const e=Di(t);return Li(t)(e.map(Fo))}const mt={test:ko,parse:Di,createTransformer:Li,getAnimatableNone:Bo};function be(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+(e-t)*6*n:n<1/2?e:n<2/3?t+(e-t)*(2/3-n)*6:t}function _o({hue:t,saturation:e,lightness:n,alpha:s}){t/=360,e/=100,n/=100;let i=0,o=0,r=0;if(!e)i=o=r=n;else{const a=n<.5?n*(1+e):n+e-n*e,u=2*n-a;i=be(u,a,t+1/3),o=be(u,a,t),r=be(u,a,t-1/3)}return{red:Math.round(i*255),green:Math.round(o*255),blue:Math.round(r*255),alpha:s}}function he(t,e){return n=>n>0?e:t}const F=(t,e,n)=>t+(e-t)*n,Ce=(t,e,n)=>{const s=t*t,i=n*(e*e-s)+s;return i<0?0:Math.sqrt(i)},No=[_e,xt,bt],Uo=t=>No.find(e=>e.test(t));function Xn(t){const e=Uo(t);if(!e)return!1;let n=e.parse(t);return e===bt&&(n=_o(n)),n}const qn=(t,e)=>{const n=Xn(t),s=Xn(e);if(!n||!s)return he(t,e);const i={...n};return o=>(i.red=Ce(n.red,s.red,o),i.green=Ce(n.green,s.green,o),i.blue=Ce(n.blue,s.blue,o),i.alpha=F(n.alpha,s.alpha,o),xt.transform(i))},Ne=new Set(["none","hidden"]);function $o(t,e){return Ne.has(t)?n=>n<=0?t:e:n=>n>=1?e:t}function Wo(t,e){return n=>F(t,e,n)}function xn(t){return typeof t=="number"?Wo:typeof t=="string"?yn(t)?he:H.test(t)?qn:Go:Array.isArray(t)?ki:typeof t=="object"?H.test(t)?qn:Ko:he}function ki(t,e){const n=[...t],s=n.length,i=t.map((o,r)=>xn(o)(o,e[r]));return o=>{for(let r=0;r{for(const o in s)n[o]=s[o](i);return n}}function Ho(t,e){const n=[],s={color:0,var:0,number:0};for(let i=0;i{const n=mt.createTransformer(e),s=Yt(t),i=Yt(e);return s.indexes.var.length===i.indexes.var.length&&s.indexes.color.length===i.indexes.color.length&&s.indexes.number.length>=i.indexes.number.length?Ne.has(t)&&!i.values.length||Ne.has(e)&&!s.values.length?$o(t,e):te(ki(Ho(s,i),i.values),n):he(t,e)};function Ii(t,e,n){return typeof t=="number"&&typeof e=="number"&&typeof n=="number"?F(t,e,n):xn(t)(t,e)}const Yo=t=>{const e=({timestamp:n})=>t(n);return{start:(n=!0)=>B.update(e,n),stop:()=>ht(e),now:()=>Y.isProcessing?Y.timestamp:q.now()}},Oi=(t,e,n=10)=>{let s="";const i=Math.max(Math.round(e/n),2);for(let o=0;o=de?1/0:e}function ji(t,e=100,n){const s=n({...t,keyframes:[0,e]}),i=Math.min(Pn(s),de);return{type:"keyframes",ease:o=>s.next(i*o).value/e,duration:rt(i)}}const zo=5;function Fi(t,e,n){const s=Math.max(e-zo,0);return di(n-t(s),e-s)}const $={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1},Ve=.001;function Xo({duration:t=$.duration,bounce:e=$.bounce,velocity:n=$.velocity,mass:s=$.mass}){let i,o,r=1-e;r=ct($.minDamping,$.maxDamping,r),t=ct($.minDuration,$.maxDuration,rt(t)),r<1?(i=c=>{const l=c*r,f=l*t,d=l-n,p=Ue(c,r),m=Math.exp(-f);return Ve-d/p*m},o=c=>{const f=c*r*t,d=f*n+n,p=Math.pow(r,2)*Math.pow(c,2)*t,m=Math.exp(-f),v=Ue(Math.pow(c,2),r);return(-i(c)+Ve>0?-1:1)*((d-p)*m)/v}):(i=c=>{const l=Math.exp(-c*t),f=(c-n)*t+1;return-Ve+l*f},o=c=>{const l=Math.exp(-c*t),f=(n-c)*(t*t);return l*f});const a=5/t,u=Zo(i,o,a);if(t=it(t),isNaN(u))return{stiffness:$.stiffness,damping:$.damping,duration:t};{const c=Math.pow(u,2)*s;return{stiffness:c,damping:r*2*Math.sqrt(s*c),duration:t}}}const qo=12;function Zo(t,e,n){let s=n;for(let i=1;it[n]!==void 0)}function ta(t){let e={velocity:$.velocity,stiffness:$.stiffness,damping:$.damping,mass:$.mass,isResolvedFromDuration:!1,...t};if(!Zn(t,Qo)&&Zn(t,Jo))if(t.visualDuration){const n=t.visualDuration,s=2*Math.PI/(n*1.2),i=s*s,o=2*ct(.05,1,1-(t.bounce||0))*Math.sqrt(i);e={...e,mass:$.mass,stiffness:i,damping:o}}else{const n=Xo(t);e={...e,...n,mass:$.mass},e.isResolvedFromDuration=!0}return e}function zt(t=$.visualDuration,e=$.bounce){const n=typeof t!="object"?{visualDuration:t,keyframes:[0,1],bounce:e}:t;let{restSpeed:s,restDelta:i}=n;const o=n.keyframes[0],r=n.keyframes[n.keyframes.length-1],a={done:!1,value:o},{stiffness:u,damping:c,mass:l,duration:f,velocity:d,isResolvedFromDuration:p}=ta({...n,velocity:-rt(n.velocity||0)}),m=d||0,v=c/(2*Math.sqrt(u*l)),T=r-o,y=rt(Math.sqrt(u/l)),P=Math.abs(T)<5;s||(s=P?$.restSpeed.granular:$.restSpeed.default),i||(i=P?$.restDelta.granular:$.restDelta.default);let x;if(v<1){const w=Ue(y,v);x=V=>{const S=Math.exp(-v*y*V);return r-S*((m+v*y*T)/w*Math.sin(w*V)+T*Math.cos(w*V))}}else if(v===1)x=w=>r-Math.exp(-y*w)*(T+(m+y*T)*w);else{const w=y*Math.sqrt(v*v-1);x=V=>{const S=Math.exp(-v*y*V),b=Math.min(w*V,300);return r-S*((m+v*y*T)*Math.sinh(b)+w*T*Math.cosh(b))/w}}const C={calculatedDuration:p&&f||null,next:w=>{const V=x(w);if(p)a.done=w>=f;else{let S=w===0?m:0;v<1&&(S=w===0?it(m):Fi(x,w,V));const b=Math.abs(S)<=s,L=Math.abs(r-V)<=i;a.done=b&&L}return a.value=a.done?r:V,a},toString:()=>{const w=Math.min(Pn(C),de),V=Oi(S=>C.next(w*S).value,w,30);return w+"ms "+V},toTransition:()=>{}};return C}zt.applyToOptions=t=>{const e=ji(t,100,zt);return t.ease=e.ease,t.duration=it(e.duration),t.type="keyframes",t};function $e({keyframes:t,velocity:e=0,power:n=.8,timeConstant:s=325,bounceDamping:i=10,bounceStiffness:o=500,modifyTarget:r,min:a,max:u,restDelta:c=.5,restSpeed:l}){const f=t[0],d={done:!1,value:f},p=b=>a!==void 0&&bu,m=b=>a===void 0?u:u===void 0||Math.abs(a-b)-v*Math.exp(-b/s),x=b=>y+P(b),C=b=>{const L=P(b),W=x(b);d.done=Math.abs(L)<=c,d.value=d.done?y:W};let w,V;const S=b=>{p(d.value)&&(w=b,V=zt({keyframes:[d.value,m(d.value)],velocity:Fi(x,b,d.value),damping:i,stiffness:o,restDelta:c,restSpeed:l}))};return S(0),{calculatedDuration:null,next:b=>{let L=!1;return!V&&w===void 0&&(L=!0,C(b),S(b)),w!==void 0&&b>=w?V.next(b-w):(!L&&C(b),d)}}}function ea(t,e,n){const s=[],i=n||ft.mix||Ii,o=t.length-1;for(let r=0;re[0];if(o===2&&e[0]===e[1])return()=>e[1];const r=t[0]===t[1];t[0]>t[o-1]&&(t=[...t].reverse(),e=[...e].reverse());const a=ea(e,s,i),u=a.length,c=l=>{if(r&&l1)for(;fc(ct(t[0],t[o-1],l)):c}function _i(t,e){const n=t[t.length-1];for(let s=1;s<=e;s++){const i=Dt(0,e,s);t.push(F(n,1,i))}}function Ni(t){const e=[0];return _i(e,t.length-1),e}function na(t,e){return t.map(n=>n*e)}function sa(t,e){return t.map(()=>e||Ai).splice(0,t.length-1)}function Ut({duration:t=300,keyframes:e,times:n,ease:s="easeInOut"}){const i=Si(s)?s.map(Be):Be(s),o={done:!1,value:e[0]},r=na(n&&n.length===e.length?n:Ni(e),t),a=Bi(r,e,{ease:Array.isArray(i)?i:sa(e,i)});return{calculatedDuration:t,next:u=>(o.value=a(u),o.done=u>=t,o)}}const ia=t=>t!==null;function An(t,{repeat:e,repeatType:n="loop"},s,i=1){const o=t.filter(ia),a=i<0||e&&n!=="loop"&&e%2===1?0:o.length-1;return!a||s===void 0?o[a]:s}const ra={decay:$e,inertia:$e,tween:Ut,keyframes:Ut,spring:zt};function Ui(t){typeof t.type=="string"&&(t.type=ra[t.type])}class Sn{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(e=>{this.resolve=e})}notifyFinished(){this.resolve()}then(e,n){return this.finished.then(e,n)}}const oa=t=>t/100;class wn extends Sn{constructor(e){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.stop=()=>{const{motionValue:n}=this.options;n&&n.updatedAt!==q.now()&&this.tick(q.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),this.options.onStop?.())},this.options=e,this.initAnimation(),this.play(),e.autoplay===!1&&this.pause()}initAnimation(){const{options:e}=this;Ui(e);const{type:n=Ut,repeat:s=0,repeatDelay:i=0,repeatType:o,velocity:r=0}=e;let{keyframes:a}=e;const u=n||Ut;u!==Ut&&typeof a[0]!="number"&&(this.mixKeyframes=te(oa,Ii(a[0],a[1])),a=[0,100]);const c=u({...e,keyframes:a});o==="mirror"&&(this.mirroredGenerator=u({...e,keyframes:[...a].reverse(),velocity:-r})),c.calculatedDuration===null&&(c.calculatedDuration=Pn(c));const{calculatedDuration:l}=c;this.calculatedDuration=l,this.resolvedDuration=l+i,this.totalDuration=this.resolvedDuration*(s+1)-i,this.generator=c}updateTime(e){const n=Math.round(e-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=n}tick(e,n=!1){const{generator:s,totalDuration:i,mixKeyframes:o,mirroredGenerator:r,resolvedDuration:a,calculatedDuration:u}=this;if(this.startTime===null)return s.next(0);const{delay:c=0,keyframes:l,repeat:f,repeatType:d,repeatDelay:p,type:m,onUpdate:v,finalKeyframe:T}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,e):this.speed<0&&(this.startTime=Math.min(e-i/this.speed,this.startTime)),n?this.currentTime=e:this.updateTime(e);const y=this.currentTime-c*(this.playbackSpeed>=0?1:-1),P=this.playbackSpeed>=0?y<0:y>i;this.currentTime=Math.max(y,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=i);let x=this.currentTime,C=s;if(f){const b=Math.min(this.currentTime,i)/a;let L=Math.floor(b),W=b%1;!W&&b>=1&&(W=1),W===1&&L--,L=Math.min(L,f+1),!!(L%2)&&(d==="reverse"?(W=1-W,p&&(W-=p/a)):d==="mirror"&&(C=r)),x=ct(0,1,W)*a}const w=P?{done:!1,value:l[0]}:C.next(x);o&&(w.value=o(w.value));let{done:V}=w;!P&&u!==null&&(V=this.playbackSpeed>=0?this.currentTime>=i:this.currentTime<=0);const S=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&V);return S&&m!==$e&&(w.value=An(l,this.options,T,this.speed)),v&&v(w.value),S&&this.finish(),w}then(e,n){return this.finished.then(e,n)}get duration(){return rt(this.calculatedDuration)}get time(){return rt(this.currentTime)}set time(e){e=it(e),this.currentTime=e,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=e:this.driver&&(this.startTime=this.driver.now()-e/this.playbackSpeed),this.driver?.start(!1)}get speed(){return this.playbackSpeed}set speed(e){this.updateTime(q.now());const n=this.playbackSpeed!==e;this.playbackSpeed=e,n&&(this.time=rt(this.currentTime))}play(){if(this.isStopped)return;const{driver:e=Yo,startTime:n}=this.options;this.driver||(this.driver=e(i=>this.tick(i))),this.options.onPlay?.();const s=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=s):this.holdTime!==null?this.startTime=s-this.holdTime:this.startTime||(this.startTime=n??s),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(q.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){this.notifyFinished(),this.teardown(),this.state="finished",this.options.onComplete?.()}cancel(){this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),this.options.onCancel?.()}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(e){return this.startTime=0,this.tick(e,!0)}attachTimeline(e){return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),this.driver?.stop(),e.observe(this)}}function aa(t){for(let e=1;et*180/Math.PI,We=t=>{const e=Pt(Math.atan2(t[1],t[0]));return Ke(e)},ua={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:t=>(Math.abs(t[0])+Math.abs(t[3]))/2,rotate:We,rotateZ:We,skewX:t=>Pt(Math.atan(t[1])),skewY:t=>Pt(Math.atan(t[2])),skew:t=>(Math.abs(t[1])+Math.abs(t[2]))/2},Ke=t=>(t=t%360,t<0&&(t+=360),t),Jn=We,Qn=t=>Math.sqrt(t[0]*t[0]+t[1]*t[1]),ts=t=>Math.sqrt(t[4]*t[4]+t[5]*t[5]),la={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:Qn,scaleY:ts,scale:t=>(Qn(t)+ts(t))/2,rotateX:t=>Ke(Pt(Math.atan2(t[6],t[5]))),rotateY:t=>Ke(Pt(Math.atan2(-t[2],t[0]))),rotateZ:Jn,rotate:Jn,skewX:t=>Pt(Math.atan(t[4])),skewY:t=>Pt(Math.atan(t[1])),skew:t=>(Math.abs(t[1])+Math.abs(t[4]))/2};function He(t){return t.includes("scale")?1:0}function Ge(t,e){if(!t||t==="none")return He(e);const n=t.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let s,i;if(n)s=la,i=n;else{const a=t.match(/^matrix\(([-\d.e\s,]+)\)$/u);s=ua,i=a}if(!i)return He(e);const o=s[e],r=i[1].split(",").map(fa);return typeof o=="function"?o(r):r[o]}const ca=(t,e)=>{const{transform:n="none"}=getComputedStyle(t);return Ge(n,e)};function fa(t){return parseFloat(t.trim())}const It=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Ot=new Set(It),es=t=>t===kt||t===E,ha=new Set(["x","y","z"]),da=It.filter(t=>!ha.has(t));function pa(t){const e=[];return da.forEach(n=>{const s=t.getValue(n);s!==void 0&&(e.push([n,s.get()]),s.set(n.startsWith("scale")?1:0))}),e}const At={width:({x:t},{paddingLeft:e="0",paddingRight:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),height:({y:t},{paddingTop:e="0",paddingBottom:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),top:(t,{top:e})=>parseFloat(e),left:(t,{left:e})=>parseFloat(e),bottom:({y:t},{top:e})=>parseFloat(e)+(t.max-t.min),right:({x:t},{left:e})=>parseFloat(e)+(t.max-t.min),x:(t,{transform:e})=>Ge(e,"x"),y:(t,{transform:e})=>Ge(e,"y")};At.translateX=At.x;At.translateY=At.y;const St=new Set;let Ye=!1,ze=!1,Xe=!1;function $i(){if(ze){const t=Array.from(St).filter(s=>s.needsMeasurement),e=new Set(t.map(s=>s.element)),n=new Map;e.forEach(s=>{const i=pa(s);i.length&&(n.set(s,i),s.render())}),t.forEach(s=>s.measureInitialState()),e.forEach(s=>{s.render();const i=n.get(s);i&&i.forEach(([o,r])=>{s.getValue(o)?.set(r)})}),t.forEach(s=>s.measureEndState()),t.forEach(s=>{s.suspendedScrollY!==void 0&&window.scrollTo(0,s.suspendedScrollY)})}ze=!1,Ye=!1,St.forEach(t=>t.complete(Xe)),St.clear()}function Wi(){St.forEach(t=>{t.readKeyframes(),t.needsMeasurement&&(ze=!0)})}function ma(){Xe=!0,Wi(),$i(),Xe=!1}class bn{constructor(e,n,s,i,o,r=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...e],this.onComplete=n,this.name=s,this.motionValue=i,this.element=o,this.isAsync=r}scheduleResolve(){this.state="scheduled",this.isAsync?(St.add(this),Ye||(Ye=!0,B.read(Wi),B.resolveKeyframes($i))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:e,name:n,element:s,motionValue:i}=this;if(e[0]===null){const o=i?.get(),r=e[e.length-1];if(o!==void 0)e[0]=o;else if(s&&n){const a=s.readValue(n,r);a!=null&&(e[0]=a)}e[0]===void 0&&(e[0]=r),i&&o===void 0&&i.set(e[0])}aa(e)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(e=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,e),St.delete(this)}cancel(){this.state==="scheduled"&&(St.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const ga=t=>t.startsWith("--");function ya(t,e,n){ga(e)?t.style.setProperty(e,n):t.style[e]=n}const va=hn(()=>window.ScrollTimeline!==void 0),Ta={};function xa(t,e){const n=hn(t);return()=>Ta[e]??n()}const Ki=xa(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),_t=([t,e,n,s])=>`cubic-bezier(${t}, ${e}, ${n}, ${s})`,ns={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:_t([0,.65,.55,1]),circOut:_t([.55,0,1,.45]),backIn:_t([.31,.01,.66,-.59]),backOut:_t([.33,1.53,.69,.99])};function Hi(t,e){if(t)return typeof t=="function"?Ki()?Oi(t,e):"ease-out":bi(t)?_t(t):Array.isArray(t)?t.map(n=>Hi(n,e)||ns.easeOut):ns[t]}function Pa(t,e,n,{delay:s=0,duration:i=300,repeat:o=0,repeatType:r="loop",ease:a="easeOut",times:u}={},c=void 0){const l={[e]:n};u&&(l.offset=u);const f=Hi(a,i);Array.isArray(f)&&(l.easing=f);const d={delay:s,duration:i,easing:Array.isArray(f)?"linear":f,fill:"both",iterations:o+1,direction:r==="reverse"?"alternate":"normal"};return c&&(d.pseudoElement=c),t.animate(l,d)}function Cn(t){return typeof t=="function"&&"applyToOptions"in t}function Aa({type:t,...e}){return Cn(t)&&Ki()?t.applyToOptions(e):(e.duration??(e.duration=300),e.ease??(e.ease="easeOut"),e)}class Sa extends Sn{constructor(e){if(super(),this.finishedTime=null,this.isStopped=!1,!e)return;const{element:n,name:s,keyframes:i,pseudoElement:o,allowFlatten:r=!1,finalKeyframe:a,onComplete:u}=e;this.isPseudoElement=!!o,this.allowFlatten=r,this.options=e,fn(typeof e.type!="string");const c=Aa(e);this.animation=Pa(n,s,i,c,o),c.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!o){const l=An(i,this.options,a,this.speed);this.updateMotionValue?this.updateMotionValue(l):ya(n,s,l),this.animation.cancel()}u?.(),this.notifyFinished()}}play(){this.isStopped||(this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){this.animation.finish?.()}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:e}=this;e==="idle"||e==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){this.isPseudoElement||this.animation.commitStyles?.()}get duration(){const e=this.animation.effect?.getComputedTiming?.().duration||0;return rt(Number(e))}get time(){return rt(Number(this.animation.currentTime)||0)}set time(e){this.finishedTime=null,this.animation.currentTime=it(e)}get speed(){return this.animation.playbackRate}set speed(e){e<0&&(this.finishedTime=null),this.animation.playbackRate=e}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return Number(this.animation.startTime)}set startTime(e){this.animation.startTime=e}attachTimeline({timeline:e,observe:n}){return this.allowFlatten&&this.animation.effect?.updateTiming({easing:"linear"}),this.animation.onfinish=null,e&&va()?(this.animation.timeline=e,et):n(this)}}const Gi={anticipate:Ti,backInOut:vi,circInOut:Pi};function wa(t){return t in Gi}function ba(t){typeof t.ease=="string"&&wa(t.ease)&&(t.ease=Gi[t.ease])}const ss=10;class Ca extends Sa{constructor(e){ba(e),Ui(e),super(e),e.startTime&&(this.startTime=e.startTime),this.options=e}updateMotionValue(e){const{motionValue:n,onUpdate:s,onComplete:i,element:o,...r}=this.options;if(!n)return;if(e!==void 0){n.set(e);return}const a=new wn({...r,autoplay:!1}),u=it(this.finishedTime??this.time);n.setWithVelocity(a.sample(u-ss).value,a.sample(u).value,ss),a.stop()}}const is=(t,e)=>e==="zIndex"?!1:!!(typeof t=="number"||Array.isArray(t)||typeof t=="string"&&(mt.test(t)||t==="0")&&!t.startsWith("url("));function Va(t){const e=t[0];if(t.length===1)return!0;for(let n=0;nObject.hasOwnProperty.call(Element.prototype,"animate"));function Da(t){const{motionValue:e,name:n,repeatDelay:s,repeatType:i,damping:o,type:r}=t;if(!(e?.owner?.current instanceof HTMLElement))return!1;const{onUpdate:u,transformTemplate:c}=e.owner.getProps();return Ra()&&n&&Ma.has(n)&&(n!=="transform"||!c)&&!u&&!s&&i!=="mirror"&&o!==0&&r!=="inertia"}const La=40;class ka extends Sn{constructor({autoplay:e=!0,delay:n=0,type:s="keyframes",repeat:i=0,repeatDelay:o=0,repeatType:r="loop",keyframes:a,name:u,motionValue:c,element:l,...f}){super(),this.stop=()=>{this._animation&&(this._animation.stop(),this.stopTimeline?.()),this.keyframeResolver?.cancel()},this.createdAt=q.now();const d={autoplay:e,delay:n,type:s,repeat:i,repeatDelay:o,repeatType:r,name:u,motionValue:c,element:l,...f},p=l?.KeyframeResolver||bn;this.keyframeResolver=new p(a,(m,v,T)=>this.onKeyframesResolved(m,v,d,!T),u,c,l),this.keyframeResolver?.scheduleResolve()}onKeyframesResolved(e,n,s,i){this.keyframeResolver=void 0;const{name:o,type:r,velocity:a,delay:u,isHandoff:c,onUpdate:l}=s;this.resolvedAt=q.now(),Ea(e,o,r,a)||((ft.instantAnimations||!u)&&l?.(An(e,s,n)),e[0]=e[e.length-1],qe(s),s.repeat=0);const d={startTime:i?this.resolvedAt?this.resolvedAt-this.createdAt>La?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:n,...s,keyframes:e},p=!c&&Da(d)?new Ca({...d,element:d.motionValue.owner.current}):new wn(d);p.finished.then(()=>this.notifyFinished()).catch(et),this.pendingTimeline&&(this.stopTimeline=p.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=p}get finished(){return this._animation?this.animation.finished:this._finished}then(e,n){return this.finished.finally(e).then(()=>{})}get animation(){return this._animation||(this.keyframeResolver?.resume(),ma()),this._animation}get duration(){return this.animation.duration}get time(){return this.animation.time}set time(e){this.animation.time=e}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(e){this.animation.speed=e}get startTime(){return this.animation.startTime}attachTimeline(e){return this._animation?this.stopTimeline=this.animation.attachTimeline(e):this.pendingTimeline=e,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){this._animation&&this.animation.cancel(),this.keyframeResolver?.cancel()}}class Ia{constructor(e){this.stop=()=>this.runAll("stop"),this.animations=e.filter(Boolean)}get finished(){return Promise.all(this.animations.map(e=>e.finished))}getAll(e){return this.animations[0][e]}setAll(e,n){for(let s=0;ss.attachTimeline(e));return()=>{n.forEach((s,i)=>{s&&s(),this.animations[i].stop()})}}get time(){return this.getAll("time")}set time(e){this.setAll("time",e)}get speed(){return this.getAll("speed")}set speed(e){this.setAll("speed",e)}get state(){return this.getAll("state")}get startTime(){return this.getAll("startTime")}get duration(){let e=0;for(let n=0;nn[e]())}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}class Oa extends Ia{then(e,n){return this.finished.finally(e).then(()=>{})}}const ja=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function Fa(t){const e=ja.exec(t);if(!e)return[,];const[,n,s,i]=e;return[`--${n??s}`,i]}function Yi(t,e,n=1){const[s,i]=Fa(t);if(!s)return;const o=window.getComputedStyle(e).getPropertyValue(s);if(o){const r=o.trim();return ci(r)?parseFloat(r):r}return yn(i)?Yi(i,e,n+1):i}function Vn(t,e){return t?.[e]??t?.default??t}const zi=new Set(["width","height","top","left","right","bottom",...It]),Ba={test:t=>t==="auto",parse:t=>t},Xi=t=>e=>e.test(t),qi=[kt,E,ot,pt,Do,Ro,Ba],rs=t=>qi.find(Xi(t));function _a(t){return typeof t=="number"?t===0:t!==null?t==="none"||t==="0"||hi(t):!0}const Na=new Set(["brightness","contrast","saturate","opacity"]);function Ua(t){const[e,n]=t.slice(0,-1).split("(");if(e==="drop-shadow")return t;const[s]=n.match(vn)||[];if(!s)return t;const i=n.replace(s,"");let o=Na.has(e)?1:0;return s!==n&&(o*=100),e+"("+o+i+")"}const $a=/\b([a-z-]*)\(.*?\)/gu,Ze={...mt,getAnimatableNone:t=>{const e=t.match($a);return e?e.map(Ua).join(" "):t}},os={...kt,transform:Math.round},Wa={rotate:pt,rotateX:pt,rotateY:pt,rotateZ:pt,scale:re,scaleX:re,scaleY:re,scaleZ:re,skew:pt,skewX:pt,skewY:pt,distance:E,translateX:E,translateY:E,translateZ:E,x:E,y:E,z:E,perspective:E,transformPerspective:E,opacity:Gt,originX:Yn,originY:Yn,originZ:E},En={borderWidth:E,borderTopWidth:E,borderRightWidth:E,borderBottomWidth:E,borderLeftWidth:E,borderRadius:E,radius:E,borderTopLeftRadius:E,borderTopRightRadius:E,borderBottomRightRadius:E,borderBottomLeftRadius:E,width:E,maxWidth:E,height:E,maxHeight:E,top:E,right:E,bottom:E,left:E,padding:E,paddingTop:E,paddingRight:E,paddingBottom:E,paddingLeft:E,margin:E,marginTop:E,marginRight:E,marginBottom:E,marginLeft:E,backgroundPositionX:E,backgroundPositionY:E,...Wa,zIndex:os,fillOpacity:Gt,strokeOpacity:Gt,numOctaves:os},Ka={...En,color:H,backgroundColor:H,outlineColor:H,fill:H,stroke:H,borderColor:H,borderTopColor:H,borderRightColor:H,borderBottomColor:H,borderLeftColor:H,filter:Ze,WebkitFilter:Ze},Zi=t=>Ka[t];function Ji(t,e){let n=Zi(t);return n!==Ze&&(n=mt),n.getAnimatableNone?n.getAnimatableNone(e):void 0}const Ha=new Set(["auto","none","0"]);function Ga(t,e,n){let s=0,i;for(;s{e.getValue(a).set(u)}),this.resolveNoneKeyframes()}}function Qi(t,e,n){if(t instanceof EventTarget)return[t];if(typeof t=="string"){let s=document;e&&(s=e.current);const i=n?.[t]??s.querySelectorAll(t);return i?Array.from(i):[]}return Array.from(t)}const tr=(t,e)=>e&&typeof t=="number"?e.transform(t):t;function er(t){return fi(t)&&"offsetHeight"in t}const as=30,za=t=>!isNaN(parseFloat(t)),$t={current:void 0};class Xa{constructor(e,n={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=s=>{const i=q.now();if(this.updatedAt!==i&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(s),this.current!==this.prev&&(this.events.change?.notify(this.current),this.dependents))for(const o of this.dependents)o.dirty()},this.hasAnimated=!1,this.setCurrent(e),this.owner=n.owner}setCurrent(e){this.current=e,this.updatedAt=q.now(),this.canTrackVelocity===null&&e!==void 0&&(this.canTrackVelocity=za(this.current))}setPrevFrameValue(e=this.current){this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt}onChange(e){return this.on("change",e)}on(e,n){this.events[e]||(this.events[e]=new dn);const s=this.events[e].add(n);return e==="change"?()=>{s(),B.read(()=>{this.events.change.getSize()||this.stop()})}:s}clearListeners(){for(const e in this.events)this.events[e].clear()}attach(e,n){this.passiveEffect=e,this.stopPassiveEffect=n}set(e){this.passiveEffect?this.passiveEffect(e,this.updateAndNotify):this.updateAndNotify(e)}setWithVelocity(e,n,s){this.set(n),this.prev=void 0,this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt-s}jump(e,n=!0){this.updateAndNotify(e),this.prev=e,this.prevUpdatedAt=this.prevFrameValue=void 0,n&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){this.events.change?.notify(this.current)}addDependent(e){this.dependents||(this.dependents=new Set),this.dependents.add(e)}removeDependent(e){this.dependents&&this.dependents.delete(e)}get(){return $t.current&&$t.current.push(this),this.current}getPrevious(){return this.prev}getVelocity(){const e=q.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||e-this.updatedAt>as)return 0;const n=Math.min(this.updatedAt-this.prevUpdatedAt,as);return di(parseFloat(this.current)-parseFloat(this.prevFrameValue),n)}start(e){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=e(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.dependents?.clear(),this.events.destroy?.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function wt(t,e){return new Xa(t,e)}const{schedule:Mn}=Ci(queueMicrotask,!1),st={x:!1,y:!1};function nr(){return st.x||st.y}function qa(t){return t==="x"||t==="y"?st[t]?null:(st[t]=!0,()=>{st[t]=!1}):st.x||st.y?null:(st.x=st.y=!0,()=>{st.x=st.y=!1})}function sr(t,e){const n=Qi(t),s=new AbortController,i={passive:!0,...e,signal:s.signal};return[n,i,()=>s.abort()]}function us(t){return!(t.pointerType==="touch"||nr())}function Za(t,e,n={}){const[s,i,o]=sr(t,n),r=a=>{if(!us(a))return;const{target:u}=a,c=e(u,a);if(typeof c!="function"||!u)return;const l=f=>{us(f)&&(c(f),u.removeEventListener("pointerleave",l))};u.addEventListener("pointerleave",l,i)};return s.forEach(a=>{a.addEventListener("pointerenter",r,i)}),o}const ir=(t,e)=>e?t===e?!0:ir(t,e.parentElement):!1,Rn=t=>t.pointerType==="mouse"?typeof t.button!="number"||t.button<=0:t.isPrimary!==!1,Ja=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function Qa(t){return Ja.has(t.tagName)||t.tabIndex!==-1}const le=new WeakSet;function ls(t){return e=>{e.key==="Enter"&&t(e)}}function Ee(t,e){t.dispatchEvent(new PointerEvent("pointer"+e,{isPrimary:!0,bubbles:!0}))}const tu=(t,e)=>{const n=t.currentTarget;if(!n)return;const s=ls(()=>{if(le.has(n))return;Ee(n,"down");const i=ls(()=>{Ee(n,"up")}),o=()=>Ee(n,"cancel");n.addEventListener("keyup",i,e),n.addEventListener("blur",o,e)});n.addEventListener("keydown",s,e),n.addEventListener("blur",()=>n.removeEventListener("keydown",s),e)};function cs(t){return Rn(t)&&!nr()}function eu(t,e,n={}){const[s,i,o]=sr(t,n),r=a=>{const u=a.currentTarget;if(!cs(a))return;le.add(u);const c=e(u,a),l=(p,m)=>{window.removeEventListener("pointerup",f),window.removeEventListener("pointercancel",d),le.has(u)&&le.delete(u),cs(p)&&typeof c=="function"&&c(p,{success:m})},f=p=>{l(p,u===window||u===document||n.useGlobalTarget||ir(u,p.target))},d=p=>{l(p,!1)};window.addEventListener("pointerup",f,i),window.addEventListener("pointercancel",d,i)};return s.forEach(a=>{(n.useGlobalTarget?window:a).addEventListener("pointerdown",r,i),er(a)&&(a.addEventListener("focus",c=>tu(c,i)),!Qa(a)&&!a.hasAttribute("tabindex")&&(a.tabIndex=0))}),o}function Dn(t){return fi(t)&&"ownerSVGElement"in t}function rr(t){return Dn(t)&&t.tagName==="svg"}function nu(t,e){if(t==="first")return 0;{const n=e-1;return t==="last"?n:n/2}}function pf(t=.1,{startDelay:e=0,from:n=0,ease:s}={}){return(i,o)=>{const r=typeof n=="number"?n:nu(n,o),a=Math.abs(r-i);let u=t*a;if(s){const c=o*t;u=Be(s)(u/c)*c}return e+u}}function su(...t){const e=!Array.isArray(t[0]),n=e?0:-1,s=t[0+n],i=t[1+n],o=t[2+n],r=t[3+n],a=Bi(i,o,r);return e?a(s):a}const G=t=>!!(t&&t.getVelocity),iu=[...qi,H,mt],ru=t=>iu.find(Xi(t)),ye=A.createContext({transformPagePoint:t=>t,isStatic:!1,reducedMotion:"never"});function fs(t,e){if(typeof t=="function")return t(e);t!=null&&(t.current=e)}function ou(...t){return e=>{let n=!1;const s=t.map(i=>{const o=fs(i,e);return!n&&typeof o=="function"&&(n=!0),o});if(n)return()=>{for(let i=0;i{const{width:c,height:l,top:f,left:d,right:p}=r.current;if(e||!o.current||!c||!l)return;const m=n==="left"?`left: ${d}`:`right: ${p}`;o.current.dataset.motionPopId=i;const v=document.createElement("style");a&&(v.nonce=a);const T=s??document.head;return T.appendChild(v),v.sheet&&v.sheet.insertRule(` + [data-motion-pop-id="${i}"] { + position: absolute !important; + width: ${c}px !important; + height: ${l}px !important; + ${m}px !important; + top: ${f}px !important; + } + `),()=>{T.contains(v)&&T.removeChild(v)}},[e]),tt.jsx(uu,{isPresent:e,childRef:o,sizeRef:r,children:A.cloneElement(t,{ref:u})})}const cu=({children:t,initial:e,isPresent:n,onExitComplete:s,custom:i,presenceAffectsLayout:o,mode:r,anchorX:a,root:u})=>{const c=lt(fu),l=A.useId();let f=!0,d=A.useMemo(()=>(f=!1,{id:l,initial:e,isPresent:n,custom:i,onExitComplete:p=>{c.set(p,!0);for(const m of c.values())if(!m)return;s&&s()},register:p=>(c.set(p,!1),()=>c.delete(p))}),[n,c,s]);return o&&f&&(d={...d}),A.useMemo(()=>{c.forEach((p,m)=>c.set(m,!1))},[n]),A.useEffect(()=>{!n&&!c.size&&s&&s()},[n]),r==="popLayout"&&(t=tt.jsx(lu,{isPresent:n,anchorX:a,root:u,children:t})),tt.jsx(ge.Provider,{value:d,children:t})};function fu(){return new Map}function or(t=!0){const e=A.useContext(ge);if(e===null)return[!0,null];const{isPresent:n,onExitComplete:s,register:i}=e,o=A.useId();A.useEffect(()=>{if(t)return i(o)},[t]);const r=A.useCallback(()=>t&&s&&s(o),[o,s,t]);return!n&&s?[!1,r]:[!0]}const oe=t=>t.key||"";function hs(t){const e=[];return A.Children.forEach(t,n=>{A.isValidElement(n)&&e.push(n)}),e}const mf=({children:t,custom:e,initial:n=!0,onExitComplete:s,presenceAffectsLayout:i=!0,mode:o="sync",propagate:r=!1,anchorX:a="left",root:u})=>{const[c,l]=or(r),f=A.useMemo(()=>hs(t),[t]),d=r&&!c?[]:f.map(oe),p=A.useRef(!0),m=A.useRef(f),v=lt(()=>new Map),[T,y]=A.useState(f),[P,x]=A.useState(f);ln(()=>{p.current=!1,m.current=f;for(let V=0;V{const S=oe(V),b=r&&!c?!1:f===P||d.includes(S),L=()=>{if(v.has(S))v.set(S,!0);else return;let W=!0;v.forEach(N=>{N||(W=!1)}),W&&(w?.(),x(m.current),r&&l?.(),s&&s())};return tt.jsx(cu,{isPresent:b,initial:!p.current||n?void 0:!1,custom:e,presenceAffectsLayout:i,mode:o,root:u,onExitComplete:b?void 0:L,anchorX:a,children:V},S)})})},ar=A.createContext({strict:!1}),ds={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},Lt={};for(const t in ds)Lt[t]={isEnabled:e=>ds[t].some(n=>!!e[n])};function hu(t){for(const e in t)Lt[e]={...Lt[e],...t[e]}}const du=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function pe(t){return t.startsWith("while")||t.startsWith("drag")&&t!=="draggable"||t.startsWith("layout")||t.startsWith("onTap")||t.startsWith("onPan")||t.startsWith("onLayout")||du.has(t)}let ur=t=>!pe(t);function pu(t){typeof t=="function"&&(ur=e=>e.startsWith("on")?!pe(e):t(e))}try{pu(require("@emotion/is-prop-valid").default)}catch{}function mu(t,e,n){const s={};for(const i in t)i==="values"&&typeof t.values=="object"||(ur(i)||n===!0&&pe(i)||!e&&!pe(i)||t.draggable&&i.startsWith("onDrag"))&&(s[i]=t[i]);return s}const ve=A.createContext({});function Te(t){return t!==null&&typeof t=="object"&&typeof t.start=="function"}function Xt(t){return typeof t=="string"||Array.isArray(t)}const Ln=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],kn=["initial",...Ln];function xe(t){return Te(t.animate)||kn.some(e=>Xt(t[e]))}function lr(t){return!!(xe(t)||t.variants)}function gu(t,e){if(xe(t)){const{initial:n,animate:s}=t;return{initial:n===!1||Xt(n)?n:void 0,animate:Xt(s)?s:void 0}}return t.inherit!==!1?e:{}}function yu(t){const{initial:e,animate:n}=gu(t,A.useContext(ve));return A.useMemo(()=>({initial:e,animate:n}),[ps(e),ps(n)])}function ps(t){return Array.isArray(t)?t.join(" "):t}const qt={};function vu(t){for(const e in t)qt[e]=t[e],gn(e)&&(qt[e].isCSSVariable=!0)}function cr(t,{layout:e,layoutId:n}){return Ot.has(t)||t.startsWith("origin")||(e||n!==void 0)&&(!!qt[t]||t==="opacity")}const Tu={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},xu=It.length;function Pu(t,e,n){let s="",i=!0;for(let o=0;o({style:{},transform:{},transformOrigin:{},vars:{}});function fr(t,e,n){for(const s in e)!G(e[s])&&!cr(s,n)&&(t[s]=e[s])}function Au({transformTemplate:t},e){return A.useMemo(()=>{const n=On();return In(n,e,t),Object.assign({},n.vars,n.style)},[e])}function Su(t,e){const n=t.style||{},s={};return fr(s,n,t),Object.assign(s,Au(t,e)),s}function wu(t,e){const n={},s=Su(t,e);return t.drag&&t.dragListener!==!1&&(n.draggable=!1,s.userSelect=s.WebkitUserSelect=s.WebkitTouchCallout="none",s.touchAction=t.drag===!0?"none":`pan-${t.drag==="x"?"y":"x"}`),t.tabIndex===void 0&&(t.onTap||t.onTapStart||t.whileTap)&&(n.tabIndex=0),n.style=s,n}const bu={offset:"stroke-dashoffset",array:"stroke-dasharray"},Cu={offset:"strokeDashoffset",array:"strokeDasharray"};function Vu(t,e,n=1,s=0,i=!0){t.pathLength=1;const o=i?bu:Cu;t[o.offset]=E.transform(-s);const r=E.transform(e),a=E.transform(n);t[o.array]=`${r} ${a}`}function hr(t,{attrX:e,attrY:n,attrScale:s,pathLength:i,pathSpacing:o=1,pathOffset:r=0,...a},u,c,l){if(In(t,a,c),u){t.style.viewBox&&(t.attrs.viewBox=t.style.viewBox);return}t.attrs=t.style,t.style={};const{attrs:f,style:d}=t;f.transform&&(d.transform=f.transform,delete f.transform),(d.transform||f.transformOrigin)&&(d.transformOrigin=f.transformOrigin??"50% 50%",delete f.transformOrigin),d.transform&&(d.transformBox=l?.transformBox??"fill-box",delete f.transformBox),e!==void 0&&(f.x=e),n!==void 0&&(f.y=n),s!==void 0&&(f.scale=s),i!==void 0&&Vu(f,i,o,r,!1)}const dr=()=>({...On(),attrs:{}}),pr=t=>typeof t=="string"&&t.toLowerCase()==="svg";function Eu(t,e,n,s){const i=A.useMemo(()=>{const o=dr();return hr(o,e,pr(s),t.transformTemplate,t.style),{...o.attrs,style:{...o.style}}},[e]);if(t.style){const o={};fr(o,t.style,t),i.style={...o,...i.style}}return i}const Mu=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function jn(t){return typeof t!="string"||t.includes("-")?!1:!!(Mu.indexOf(t)>-1||/[A-Z]/u.test(t))}function Ru(t,e,n,{latestValues:s},i,o=!1){const a=(jn(t)?Eu:wu)(e,s,i,t),u=mu(e,typeof t=="string",o),c=t!==A.Fragment?{...u,...a,ref:n}:{},{children:l}=e,f=A.useMemo(()=>G(l)?l.get():l,[l]);return A.createElement(t,{...c,children:f})}function ms(t){const e=[{},{}];return t?.values.forEach((n,s)=>{e[0][s]=n.get(),e[1][s]=n.getVelocity()}),e}function Fn(t,e,n,s){if(typeof e=="function"){const[i,o]=ms(s);e=e(n!==void 0?n:t.custom,i,o)}if(typeof e=="string"&&(e=t.variants&&t.variants[e]),typeof e=="function"){const[i,o]=ms(s);e=e(n!==void 0?n:t.custom,i,o)}return e}function ce(t){return G(t)?t.get():t}function Du({scrapeMotionValuesFromProps:t,createRenderState:e},n,s,i){return{latestValues:Lu(n,s,i,t),renderState:e()}}function Lu(t,e,n,s){const i={},o=s(t,{});for(const d in o)i[d]=ce(o[d]);let{initial:r,animate:a}=t;const u=xe(t),c=lr(t);e&&c&&!u&&t.inherit!==!1&&(r===void 0&&(r=e.initial),a===void 0&&(a=e.animate));let l=n?n.initial===!1:!1;l=l||r===!1;const f=l?a:r;if(f&&typeof f!="boolean"&&!Te(f)){const d=Array.isArray(f)?f:[f];for(let p=0;p(e,n)=>{const s=A.useContext(ve),i=A.useContext(ge),o=()=>Du(t,e,s,i);return n?o():lt(o)};function Bn(t,e,n){const{style:s}=t,i={};for(const o in s)(G(s[o])||e.style&&G(e.style[o])||cr(o,t)||n?.getValue(o)?.liveStyle!==void 0)&&(i[o]=s[o]);return i}const ku=mr({scrapeMotionValuesFromProps:Bn,createRenderState:On});function gr(t,e,n){const s=Bn(t,e,n);for(const i in t)if(G(t[i])||G(e[i])){const o=It.indexOf(i)!==-1?"attr"+i.charAt(0).toUpperCase()+i.substring(1):i;s[o]=t[i]}return s}const Iu=mr({scrapeMotionValuesFromProps:gr,createRenderState:dr}),Ou=Symbol.for("motionComponentSymbol");function Ct(t){return t&&typeof t=="object"&&Object.prototype.hasOwnProperty.call(t,"current")}function ju(t,e,n){return A.useCallback(s=>{s&&t.onMount&&t.onMount(s),e&&(s?e.mount(s):e.unmount()),n&&(typeof n=="function"?n(s):Ct(n)&&(n.current=s))},[e])}const _n=t=>t.replace(/([a-z])([A-Z])/gu,"$1-$2").toLowerCase(),Fu="framerAppearId",yr="data-"+_n(Fu),vr=A.createContext({});function Bu(t,e,n,s,i){const{visualElement:o}=A.useContext(ve),r=A.useContext(ar),a=A.useContext(ge),u=A.useContext(ye).reducedMotion,c=A.useRef(null);s=s||r.renderer,!c.current&&s&&(c.current=s(t,{visualState:e,parent:o,props:n,presenceContext:a,blockInitialAnimation:a?a.initial===!1:!1,reducedMotionConfig:u}));const l=c.current,f=A.useContext(vr);l&&!l.projection&&i&&(l.type==="html"||l.type==="svg")&&_u(c.current,n,i,f);const d=A.useRef(!1);A.useInsertionEffect(()=>{l&&d.current&&l.update(n,a)});const p=n[yr],m=A.useRef(!!p&&!window.MotionHandoffIsComplete?.(p)&&window.MotionHasOptimisedAnimation?.(p));return ln(()=>{l&&(d.current=!0,window.MotionIsMounted=!0,l.updateFeatures(),l.scheduleRenderMicrotask(),m.current&&l.animationState&&l.animationState.animateChanges())}),A.useEffect(()=>{l&&(!m.current&&l.animationState&&l.animationState.animateChanges(),m.current&&(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(p)}),m.current=!1),l.enteringChildren=void 0)}),l}function _u(t,e,n,s){const{layoutId:i,layout:o,drag:r,dragConstraints:a,layoutScroll:u,layoutRoot:c,layoutCrossfade:l}=e;t.projection=new n(t.latestValues,e["data-framer-portal-id"]?void 0:Tr(t.parent)),t.projection.setOptions({layoutId:i,layout:o,alwaysMeasureLayout:!!r||a&&Ct(a),visualElement:t,animationType:typeof o=="string"?o:"both",initialPromotionConfig:s,crossfade:l,layoutScroll:u,layoutRoot:c})}function Tr(t){if(t)return t.options.allowProjection!==!1?t.projection:Tr(t.parent)}function Me(t,{forwardMotionProps:e=!1}={},n,s){n&&hu(n);const i=jn(t)?Iu:ku;function o(a,u){let c;const l={...A.useContext(ye),...a,layoutId:Nu(a)},{isStatic:f}=l,d=yu(a),p=i(a,f);if(!f&&un){Uu();const m=$u(l);c=m.MeasureLayout,d.visualElement=Bu(t,p,l,s,m.ProjectionNode)}return tt.jsxs(ve.Provider,{value:d,children:[c&&d.visualElement?tt.jsx(c,{visualElement:d.visualElement,...l}):null,Ru(t,a,ju(p,d.visualElement,u),p,f,e)]})}o.displayName=`motion.${typeof t=="string"?t:`create(${t.displayName??t.name??""})`}`;const r=A.forwardRef(o);return r[Ou]=t,r}function Nu({layoutId:t}){const e=A.useContext(an).id;return e&&t!==void 0?e+"-"+t:t}function Uu(t,e){A.useContext(ar).strict}function $u(t){const{drag:e,layout:n}=Lt;if(!e&&!n)return{};const s={...e,...n};return{MeasureLayout:e?.isEnabled(t)||n?.isEnabled(t)?s.MeasureLayout:void 0,ProjectionNode:s.ProjectionNode}}function Wu(t,e){if(typeof Proxy>"u")return Me;const n=new Map,s=(o,r)=>Me(o,r,t,e),i=(o,r)=>s(o,r);return new Proxy(i,{get:(o,r)=>r==="create"?s:(n.has(r)||n.set(r,Me(r,void 0,t,e)),n.get(r))})}function xr({top:t,left:e,right:n,bottom:s}){return{x:{min:e,max:n},y:{min:t,max:s}}}function Ku({x:t,y:e}){return{top:e.min,right:t.max,bottom:e.max,left:t.min}}function Hu(t,e){if(!e)return t;const n=e({x:t.left,y:t.top}),s=e({x:t.right,y:t.bottom});return{top:n.y,left:n.x,bottom:s.y,right:s.x}}function Re(t){return t===void 0||t===1}function Je({scale:t,scaleX:e,scaleY:n}){return!Re(t)||!Re(e)||!Re(n)}function Tt(t){return Je(t)||Pr(t)||t.z||t.rotate||t.rotateX||t.rotateY||t.skewX||t.skewY}function Pr(t){return gs(t.x)||gs(t.y)}function gs(t){return t&&t!=="0%"}function me(t,e,n){const s=t-n,i=e*s;return n+i}function ys(t,e,n,s,i){return i!==void 0&&(t=me(t,i,s)),me(t,n,s)+e}function Qe(t,e=0,n=1,s,i){t.min=ys(t.min,e,n,s,i),t.max=ys(t.max,e,n,s,i)}function Ar(t,{x:e,y:n}){Qe(t.x,e.translate,e.scale,e.originPoint),Qe(t.y,n.translate,n.scale,n.originPoint)}const vs=.999999999999,Ts=1.0000000000001;function Gu(t,e,n,s=!1){const i=n.length;if(!i)return;e.x=e.y=1;let o,r;for(let a=0;avs&&(e.x=1),e.yvs&&(e.y=1)}function Vt(t,e){t.min=t.min+e,t.max=t.max+e}function xs(t,e,n,s,i=.5){const o=F(t.min,t.max,i);Qe(t,e,n,o,s)}function Et(t,e){xs(t.x,e.x,e.scaleX,e.scale,e.originX),xs(t.y,e.y,e.scaleY,e.scale,e.originY)}function Sr(t,e){return xr(Hu(t.getBoundingClientRect(),e))}function Yu(t,e,n){const s=Sr(t,n),{scroll:i}=e;return i&&(Vt(s.x,i.offset.x),Vt(s.y,i.offset.y)),s}const Ps=()=>({translate:0,scale:1,origin:0,originPoint:0}),Mt=()=>({x:Ps(),y:Ps()}),As=()=>({min:0,max:0}),U=()=>({x:As(),y:As()}),tn={current:null},wr={current:!1};function zu(){if(wr.current=!0,!!un)if(window.matchMedia){const t=window.matchMedia("(prefers-reduced-motion)"),e=()=>tn.current=t.matches;t.addEventListener("change",e),e()}else tn.current=!1}const Zt=new WeakMap;function Xu(t,e,n){for(const s in e){const i=e[s],o=n[s];if(G(i))t.addValue(s,i);else if(G(o))t.addValue(s,wt(i,{owner:t}));else if(o!==i)if(t.hasValue(s)){const r=t.getValue(s);r.liveStyle===!0?r.jump(i):r.hasAnimated||r.set(i)}else{const r=t.getStaticValue(s);t.addValue(s,wt(r!==void 0?r:i,{owner:t}))}}for(const s in n)e[s]===void 0&&t.removeValue(s);return e}const Ss=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];class br{scrapeMotionValuesFromProps(e,n,s){return{}}constructor({parent:e,props:n,presenceContext:s,reducedMotionConfig:i,blockInitialAnimation:o,visualState:r},a={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=bn,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const d=q.now();this.renderScheduledAtthis.bindToMotionValue(s,n)),wr.current||zu(),this.shouldReduceMotion=this.reducedMotionConfig==="never"?!1:this.reducedMotionConfig==="always"?!0:tn.current,this.parent?.addChild(this),this.update(this.props,this.presenceContext)}unmount(){this.projection&&this.projection.unmount(),ht(this.notifyUpdate),ht(this.render),this.valueSubscriptions.forEach(e=>e()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent?.removeChild(this);for(const e in this.events)this.events[e].clear();for(const e in this.features){const n=this.features[e];n&&(n.unmount(),n.isMounted=!1)}this.current=null}addChild(e){this.children.add(e),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(e)}removeChild(e){this.children.delete(e),this.enteringChildren&&this.enteringChildren.delete(e)}bindToMotionValue(e,n){this.valueSubscriptions.has(e)&&this.valueSubscriptions.get(e)();const s=Ot.has(e);s&&this.onBindTransform&&this.onBindTransform();const i=n.on("change",r=>{this.latestValues[e]=r,this.props.onUpdate&&B.preRender(this.notifyUpdate),s&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let o;window.MotionCheckAppearSync&&(o=window.MotionCheckAppearSync(this,e,n)),this.valueSubscriptions.set(e,()=>{i(),o&&o(),n.owner&&n.stop()})}sortNodePosition(e){return!this.current||!this.sortInstanceNodePosition||this.type!==e.type?0:this.sortInstanceNodePosition(this.current,e.current)}updateFeatures(){let e="animation";for(e in Lt){const n=Lt[e];if(!n)continue;const{isEnabled:s,Feature:i}=n;if(!this.features[e]&&i&&s(this.props)&&(this.features[e]=new i(this)),this.features[e]){const o=this.features[e];o.isMounted?o.update():(o.mount(),o.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):U()}getStaticValue(e){return this.latestValues[e]}setStaticValue(e,n){this.latestValues[e]=n}update(e,n){(e.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=e,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let s=0;sn.variantChildren.delete(e)}addValue(e,n){const s=this.values.get(e);n!==s&&(s&&this.removeValue(e),this.bindToMotionValue(e,n),this.values.set(e,n),this.latestValues[e]=n.get())}removeValue(e){this.values.delete(e);const n=this.valueSubscriptions.get(e);n&&(n(),this.valueSubscriptions.delete(e)),delete this.latestValues[e],this.removeValueFromRenderState(e,this.renderState)}hasValue(e){return this.values.has(e)}getValue(e,n){if(this.props.values&&this.props.values[e])return this.props.values[e];let s=this.values.get(e);return s===void 0&&n!==void 0&&(s=wt(n===null?void 0:n,{owner:this}),this.addValue(e,s)),s}readValue(e,n){let s=this.latestValues[e]!==void 0||!this.current?this.latestValues[e]:this.getBaseTargetFromProps(this.props,e)??this.readValueFromInstance(this.current,e,this.options);return s!=null&&(typeof s=="string"&&(ci(s)||hi(s))?s=parseFloat(s):!ru(s)&&mt.test(n)&&(s=Ji(e,n)),this.setBaseTarget(e,G(s)?s.get():s)),G(s)?s.get():s}setBaseTarget(e,n){this.baseTarget[e]=n}getBaseTarget(e){const{initial:n}=this.props;let s;if(typeof n=="string"||typeof n=="object"){const o=Fn(this.props,n,this.presenceContext?.custom);o&&(s=o[e])}if(n&&s!==void 0)return s;const i=this.getBaseTargetFromProps(this.props,e);return i!==void 0&&!G(i)?i:this.initialValues[e]!==void 0&&s===void 0?void 0:this.baseTarget[e]}on(e,n){return this.events[e]||(this.events[e]=new dn),this.events[e].add(n)}notify(e,...n){this.events[e]&&this.events[e].notify(...n)}scheduleRenderMicrotask(){Mn.render(this.render)}}class Cr extends br{constructor(){super(...arguments),this.KeyframeResolver=Ya}sortInstanceNodePosition(e,n){return e.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(e,n){return e.style?e.style[n]:void 0}removeValueFromRenderState(e,{vars:n,style:s}){delete n[e],delete s[e]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:e}=this.props;G(e)&&(this.childSubscription=e.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}}function Vr(t,{style:e,vars:n},s,i){const o=t.style;let r;for(r in e)o[r]=e[r];i?.applyProjectionStyles(o,s);for(r in n)o.setProperty(r,n[r])}function qu(t){return window.getComputedStyle(t)}class Er extends Cr{constructor(){super(...arguments),this.type="html",this.renderInstance=Vr}readValueFromInstance(e,n){if(Ot.has(n))return this.projection?.isProjecting?He(n):ca(e,n);{const s=qu(e),i=(gn(n)?s.getPropertyValue(n):s[n])||0;return typeof i=="string"?i.trim():i}}measureInstanceViewportBox(e,{transformPagePoint:n}){return Sr(e,n)}build(e,n,s){In(e,n,s.transformTemplate)}scrapeMotionValuesFromProps(e,n,s){return Bn(e,n,s)}}const Mr=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function Zu(t,e,n,s){Vr(t,e,void 0,s);for(const i in e.attrs)t.setAttribute(Mr.has(i)?i:_n(i),e.attrs[i])}class Rr extends Cr{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=U}getBaseTargetFromProps(e,n){return e[n]}readValueFromInstance(e,n){if(Ot.has(n)){const s=Zi(n);return s&&s.default||0}return n=Mr.has(n)?n:_n(n),e.getAttribute(n)}scrapeMotionValuesFromProps(e,n,s){return gr(e,n,s)}build(e,n,s){hr(e,n,this.isSVGTag,s.transformTemplate,s.style)}renderInstance(e,n,s,i){Zu(e,n,s,i)}mount(e){this.isSVGTag=pr(e.tagName),super.mount(e)}}const Ju=(t,e)=>jn(t)?new Rr(e):new Er(e,{allowProjection:t!==A.Fragment});function Rt(t,e,n){const s=t.getProps();return Fn(s,e,n!==void 0?n:s.custom,t)}const en=t=>Array.isArray(t);function Qu(t,e,n){t.hasValue(e)?t.getValue(e).set(n):t.addValue(e,wt(n))}function tl(t){return en(t)?t[t.length-1]||0:t}function el(t,e){const n=Rt(t,e);let{transitionEnd:s={},transition:i={},...o}=n||{};o={...o,...s};for(const r in o){const a=tl(o[r]);Qu(t,r,a)}}function nl(t){return!!(G(t)&&t.add)}function nn(t,e){const n=t.getValue("willChange");if(nl(n))return n.add(e);if(!n&&ft.WillChange){const s=new ft.WillChange("auto");t.addValue("willChange",s),s.add(e)}}function Dr(t){return t.props[yr]}const sl=t=>t!==null;function il(t,{repeat:e,repeatType:n="loop"},s){const i=t.filter(sl),o=e&&n!=="loop"&&e%2===1?0:i.length-1;return i[o]}const rl={type:"spring",stiffness:500,damping:25,restSpeed:10},ol=t=>({type:"spring",stiffness:550,damping:t===0?2*Math.sqrt(550):30,restSpeed:10}),al={type:"keyframes",duration:.8},ul={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},ll=(t,{keyframes:e})=>e.length>2?al:Ot.has(t)?t.startsWith("scale")?ol(e[1]):rl:ul;function cl({when:t,delay:e,delayChildren:n,staggerChildren:s,staggerDirection:i,repeat:o,repeatType:r,repeatDelay:a,from:u,elapsed:c,...l}){return!!Object.keys(l).length}const Nn=(t,e,n,s={},i,o)=>r=>{const a=Vn(s,t)||{},u=a.delay||s.delay||0;let{elapsed:c=0}=s;c=c-it(u);const l={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:e.getVelocity(),...a,delay:-c,onUpdate:d=>{e.set(d),a.onUpdate&&a.onUpdate(d)},onComplete:()=>{r(),a.onComplete&&a.onComplete()},name:t,motionValue:e,element:o?void 0:i};cl(a)||Object.assign(l,ll(t,l)),l.duration&&(l.duration=it(l.duration)),l.repeatDelay&&(l.repeatDelay=it(l.repeatDelay)),l.from!==void 0&&(l.keyframes[0]=l.from);let f=!1;if((l.type===!1||l.duration===0&&!l.repeatDelay)&&(qe(l),l.delay===0&&(f=!0)),(ft.instantAnimations||ft.skipAnimations)&&(f=!0,qe(l),l.delay=0),l.allowFlatten=!a.type&&!a.ease,f&&!o&&e.get()!==void 0){const d=il(l.keyframes,a);if(d!==void 0){B.update(()=>{l.onUpdate(d),l.onComplete()});return}}return a.isSync?new wn(l):new ka(l)};function fl({protectedKeys:t,needsAnimating:e},n){const s=t.hasOwnProperty(n)&&e[n]!==!0;return e[n]=!1,s}function Un(t,e,{delay:n=0,transitionOverride:s,type:i}={}){let{transition:o=t.getDefaultTransition(),transitionEnd:r,...a}=e;s&&(o=s);const u=[],c=i&&t.animationState&&t.animationState.getState()[i];for(const l in a){const f=t.getValue(l,t.latestValues[l]??null),d=a[l];if(d===void 0||c&&fl(c,l))continue;const p={delay:n,...Vn(o||{},l)},m=f.get();if(m!==void 0&&!f.isAnimating&&!Array.isArray(d)&&d===m&&!p.velocity)continue;let v=!1;if(window.MotionHandoffAnimation){const y=Dr(t);if(y){const P=window.MotionHandoffAnimation(y,l,B);P!==null&&(p.startTime=P,v=!0)}}nn(t,l),f.start(Nn(l,f,d,t.shouldReduceMotion&&zi.has(l)?{type:!1}:p,t,v));const T=f.animation;T&&u.push(T)}return r&&Promise.all(u).then(()=>{B.update(()=>{r&&el(t,r)})}),u}function Lr(t,e,n,s=0,i=1){const o=Array.from(t).sort((c,l)=>c.sortNodePosition(l)).indexOf(e),r=t.size,a=(r-1)*s;return typeof n=="function"?n(o,r):i===1?o*s:a-o*s}function sn(t,e,n={}){const s=Rt(t,e,n.type==="exit"?t.presenceContext?.custom:void 0);let{transition:i=t.getDefaultTransition()||{}}=s||{};n.transitionOverride&&(i=n.transitionOverride);const o=s?()=>Promise.all(Un(t,s,n)):()=>Promise.resolve(),r=t.variantChildren&&t.variantChildren.size?(u=0)=>{const{delayChildren:c=0,staggerChildren:l,staggerDirection:f}=i;return hl(t,e,u,c,l,f,n)}:()=>Promise.resolve(),{when:a}=i;if(a){const[u,c]=a==="beforeChildren"?[o,r]:[r,o];return u().then(()=>c())}else return Promise.all([o(),r(n.delay)])}function hl(t,e,n=0,s=0,i=0,o=1,r){const a=[];for(const u of t.variantChildren)u.notify("AnimationStart",e),a.push(sn(u,e,{...r,delay:n+(typeof s=="function"?0:s)+Lr(t.variantChildren,u,s,i,o)}).then(()=>u.notify("AnimationComplete",e)));return Promise.all(a)}function dl(t,e,n={}){t.notify("AnimationStart",e);let s;if(Array.isArray(e)){const i=e.map(o=>sn(t,o,n));s=Promise.all(i)}else if(typeof e=="string")s=sn(t,e,n);else{const i=typeof e=="function"?Rt(t,e,n.custom):e;s=Promise.all(Un(t,i,n))}return s.then(()=>{t.notify("AnimationComplete",e)})}function kr(t,e){if(!Array.isArray(e))return!1;const n=e.length;if(n!==t.length)return!1;for(let s=0;sPromise.all(e.map(({animation:n,options:s})=>dl(t,n,s)))}function vl(t){let e=yl(t),n=ws(),s=!0;const i=u=>(c,l)=>{const f=Rt(t,l,u==="exit"?t.presenceContext?.custom:void 0);if(f){const{transition:d,transitionEnd:p,...m}=f;c={...c,...m,...p}}return c};function o(u){e=u(t)}function r(u){const{props:c}=t,l=Ir(t.parent)||{},f=[],d=new Set;let p={},m=1/0;for(let T=0;Tm&&C,L=!1;const W=Array.isArray(x)?x:[x];let N=W.reduce(i(y),{});w===!1&&(N={});const{prevResolvedValues:dt={}}=P,at={...dt,...N},yt=O=>{b=!0,d.has(O)&&(L=!0,d.delete(O)),P.needsAnimating[O]=!0;const _=t.getValue(O);_&&(_.liveStyle=!1)};for(const O in at){const _=N[O],Z=dt[O];if(p.hasOwnProperty(O))continue;let nt=!1;en(_)&&en(Z)?nt=!kr(_,Z):nt=_!==Z,nt?_!=null?yt(O):d.add(O):_!==void 0&&d.has(O)?yt(O):P.protectedKeys[O]=!0}P.prevProp=x,P.prevResolvedValues=N,P.isActive&&(p={...p,...N}),s&&t.blockInitialAnimation&&(b=!1);const jt=V&&S;b&&(!jt||L)&&f.push(...W.map(O=>{const _={type:y};if(typeof O=="string"&&s&&!jt&&t.manuallyAnimateOnMount&&t.parent){const{parent:Z}=t,nt=Rt(Z,O);if(Z.enteringChildren&&nt){const{delayChildren:h}=nt.transition||{};_.delay=Lr(Z.enteringChildren,t,h)}}return{animation:O,options:_}}))}if(d.size){const T={};if(typeof c.initial!="boolean"){const y=Rt(t,Array.isArray(c.initial)?c.initial[0]:c.initial);y&&y.transition&&(T.transition=y.transition)}d.forEach(y=>{const P=t.getBaseTarget(y),x=t.getValue(y);x&&(x.liveStyle=!0),T[y]=P??null}),f.push({animation:T})}let v=!!f.length;return s&&(c.initial===!1||c.initial===c.animate)&&!t.manuallyAnimateOnMount&&(v=!1),s=!1,v?e(f):Promise.resolve()}function a(u,c){if(n[u].isActive===c)return Promise.resolve();t.variantChildren?.forEach(f=>f.animationState?.setActive(u,c)),n[u].isActive=c;const l=r(u);for(const f in n)n[f].protectedKeys={};return l}return{animateChanges:r,setActive:a,setAnimateFunction:o,getState:()=>n,reset:()=>{n=ws(),s=!0}}}function Tl(t,e){return typeof e=="string"?e!==t:Array.isArray(e)?!kr(e,t):!1}function vt(t=!1){return{isActive:t,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function ws(){return{animate:vt(!0),whileInView:vt(),whileHover:vt(),whileTap:vt(),whileDrag:vt(),whileFocus:vt(),exit:vt()}}class gt{constructor(e){this.isMounted=!1,this.node=e}update(){}}class xl extends gt{constructor(e){super(e),e.animationState||(e.animationState=vl(e))}updateAnimationControlsSubscription(){const{animate:e}=this.node.getProps();Te(e)&&(this.unmountControls=e.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:e}=this.node.getProps(),{animate:n}=this.node.prevProps||{};e!==n&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}}let Pl=0;class Al extends gt{constructor(){super(...arguments),this.id=Pl++}update(){if(!this.node.presenceContext)return;const{isPresent:e,onExitComplete:n}=this.node.presenceContext,{isPresent:s}=this.node.prevPresenceContext||{};if(!this.node.animationState||e===s)return;const i=this.node.animationState.setActive("exit",!e);n&&!e&&i.then(()=>{n(this.id)})}mount(){const{register:e,onExitComplete:n}=this.node.presenceContext||{};n&&n(this.id),e&&(this.unmount=e(this.id))}unmount(){}}const Sl={animation:{Feature:xl},exit:{Feature:Al}};function Jt(t,e,n,s={passive:!0}){return t.addEventListener(e,n,s),()=>t.removeEventListener(e,n)}function se(t){return{point:{x:t.pageX,y:t.pageY}}}const wl=t=>e=>Rn(e)&&t(e,se(e));function Wt(t,e,n,s){return Jt(t,e,wl(n),s)}const Or=1e-4,bl=1-Or,Cl=1+Or,jr=.01,Vl=0-jr,El=0+jr;function X(t){return t.max-t.min}function Ml(t,e,n){return Math.abs(t-e)<=n}function bs(t,e,n,s=.5){t.origin=s,t.originPoint=F(e.min,e.max,t.origin),t.scale=X(n)/X(e),t.translate=F(n.min,n.max,t.origin)-t.originPoint,(t.scale>=bl&&t.scale<=Cl||isNaN(t.scale))&&(t.scale=1),(t.translate>=Vl&&t.translate<=El||isNaN(t.translate))&&(t.translate=0)}function Kt(t,e,n,s){bs(t.x,e.x,n.x,s?s.originX:void 0),bs(t.y,e.y,n.y,s?s.originY:void 0)}function Cs(t,e,n){t.min=n.min+e.min,t.max=t.min+X(e)}function Rl(t,e,n){Cs(t.x,e.x,n.x),Cs(t.y,e.y,n.y)}function Vs(t,e,n){t.min=e.min-n.min,t.max=t.min+X(e)}function Ht(t,e,n){Vs(t.x,e.x,n.x),Vs(t.y,e.y,n.y)}function Q(t){return[t("x"),t("y")]}const Fr=({current:t})=>t?t.ownerDocument.defaultView:null,Es=(t,e)=>Math.abs(t-e);function Dl(t,e){const n=Es(t.x,e.x),s=Es(t.y,e.y);return Math.sqrt(n**2+s**2)}class Br{constructor(e,n,{transformPagePoint:s,contextWindow:i=window,dragSnapToOrigin:o=!1,distanceThreshold:r=3}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const d=Le(this.lastMoveEventInfo,this.history),p=this.startEvent!==null,m=Dl(d.offset,{x:0,y:0})>=this.distanceThreshold;if(!p&&!m)return;const{point:v}=d,{timestamp:T}=Y;this.history.push({...v,timestamp:T});const{onStart:y,onMove:P}=this.handlers;p||(y&&y(this.lastMoveEvent,d),this.startEvent=this.lastMoveEvent),P&&P(this.lastMoveEvent,d)},this.handlePointerMove=(d,p)=>{this.lastMoveEvent=d,this.lastMoveEventInfo=De(p,this.transformPagePoint),B.update(this.updatePoint,!0)},this.handlePointerUp=(d,p)=>{this.end();const{onEnd:m,onSessionEnd:v,resumeAnimation:T}=this.handlers;if(this.dragSnapToOrigin&&T&&T(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const y=Le(d.type==="pointercancel"?this.lastMoveEventInfo:De(p,this.transformPagePoint),this.history);this.startEvent&&m&&m(d,y),v&&v(d,y)},!Rn(e))return;this.dragSnapToOrigin=o,this.handlers=n,this.transformPagePoint=s,this.distanceThreshold=r,this.contextWindow=i||window;const a=se(e),u=De(a,this.transformPagePoint),{point:c}=u,{timestamp:l}=Y;this.history=[{...c,timestamp:l}];const{onSessionStart:f}=n;f&&f(e,Le(u,this.history)),this.removeListeners=te(Wt(this.contextWindow,"pointermove",this.handlePointerMove),Wt(this.contextWindow,"pointerup",this.handlePointerUp),Wt(this.contextWindow,"pointercancel",this.handlePointerUp))}updateHandlers(e){this.handlers=e}end(){this.removeListeners&&this.removeListeners(),ht(this.updatePoint)}}function De(t,e){return e?{point:e(t.point)}:t}function Ms(t,e){return{x:t.x-e.x,y:t.y-e.y}}function Le({point:t},e){return{point:t,delta:Ms(t,_r(e)),offset:Ms(t,Ll(e)),velocity:kl(e,.1)}}function Ll(t){return t[0]}function _r(t){return t[t.length-1]}function kl(t,e){if(t.length<2)return{x:0,y:0};let n=t.length-1,s=null;const i=_r(t);for(;n>=0&&(s=t[n],!(i.timestamp-s.timestamp>it(e)));)n--;if(!s)return{x:0,y:0};const o=rt(i.timestamp-s.timestamp);if(o===0)return{x:0,y:0};const r={x:(i.x-s.x)/o,y:(i.y-s.y)/o};return r.x===1/0&&(r.x=0),r.y===1/0&&(r.y=0),r}function Il(t,{min:e,max:n},s){return e!==void 0&&tn&&(t=s?F(n,t,s.max):Math.min(t,n)),t}function Rs(t,e,n){return{min:e!==void 0?t.min+e:void 0,max:n!==void 0?t.max+n-(t.max-t.min):void 0}}function Ol(t,{top:e,left:n,bottom:s,right:i}){return{x:Rs(t.x,n,i),y:Rs(t.y,e,s)}}function Ds(t,e){let n=e.min-t.min,s=e.max-t.max;return e.max-e.mins?n=Dt(e.min,e.max-s,t.min):s>i&&(n=Dt(t.min,t.max-i,e.min)),ct(0,1,n)}function Bl(t,e){const n={};return e.min!==void 0&&(n.min=e.min-t.min),e.max!==void 0&&(n.max=e.max-t.min),n}const rn=.35;function _l(t=rn){return t===!1?t=0:t===!0&&(t=rn),{x:Ls(t,"left","right"),y:Ls(t,"top","bottom")}}function Ls(t,e,n){return{min:ks(t,e),max:ks(t,n)}}function ks(t,e){return typeof t=="number"?t:t[e]||0}const Nl=new WeakMap;class Ul{constructor(e){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=U(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=e}start(e,{snapToCursor:n=!1,distanceThreshold:s}={}){const{presenceContext:i}=this.visualElement;if(i&&i.isPresent===!1)return;const o=f=>{const{dragSnapToOrigin:d}=this.getProps();d?this.pauseAnimation():this.stopAnimation(),n&&this.snapToCursor(se(f).point)},r=(f,d)=>{const{drag:p,dragPropagation:m,onDragStart:v}=this.getProps();if(p&&!m&&(this.openDragLock&&this.openDragLock(),this.openDragLock=qa(p),!this.openDragLock))return;this.latestPointerEvent=f,this.latestPanInfo=d,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Q(y=>{let P=this.getAxisMotionValue(y).get()||0;if(ot.test(P)){const{projection:x}=this.visualElement;if(x&&x.layout){const C=x.layout.layoutBox[y];C&&(P=X(C)*(parseFloat(P)/100))}}this.originPoint[y]=P}),v&&B.postRender(()=>v(f,d)),nn(this.visualElement,"transform");const{animationState:T}=this.visualElement;T&&T.setActive("whileDrag",!0)},a=(f,d)=>{this.latestPointerEvent=f,this.latestPanInfo=d;const{dragPropagation:p,dragDirectionLock:m,onDirectionLock:v,onDrag:T}=this.getProps();if(!p&&!this.openDragLock)return;const{offset:y}=d;if(m&&this.currentDirection===null){this.currentDirection=$l(y),this.currentDirection!==null&&v&&v(this.currentDirection);return}this.updateAxis("x",d.point,y),this.updateAxis("y",d.point,y),this.visualElement.render(),T&&T(f,d)},u=(f,d)=>{this.latestPointerEvent=f,this.latestPanInfo=d,this.stop(f,d),this.latestPointerEvent=null,this.latestPanInfo=null},c=()=>Q(f=>this.getAnimationState(f)==="paused"&&this.getAxisMotionValue(f).animation?.play()),{dragSnapToOrigin:l}=this.getProps();this.panSession=new Br(e,{onSessionStart:o,onStart:r,onMove:a,onSessionEnd:u,resumeAnimation:c},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:l,distanceThreshold:s,contextWindow:Fr(this.visualElement)})}stop(e,n){const s=e||this.latestPointerEvent,i=n||this.latestPanInfo,o=this.isDragging;if(this.cancel(),!o||!i||!s)return;const{velocity:r}=i;this.startAnimation(r);const{onDragEnd:a}=this.getProps();a&&B.postRender(()=>a(s,i))}cancel(){this.isDragging=!1;const{projection:e,animationState:n}=this.visualElement;e&&(e.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:s}=this.getProps();!s&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),n&&n.setActive("whileDrag",!1)}updateAxis(e,n,s){const{drag:i}=this.getProps();if(!s||!ae(e,i,this.currentDirection))return;const o=this.getAxisMotionValue(e);let r=this.originPoint[e]+s[e];this.constraints&&this.constraints[e]&&(r=Il(r,this.constraints[e],this.elastic[e])),o.set(r)}resolveConstraints(){const{dragConstraints:e,dragElastic:n}=this.getProps(),s=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):this.visualElement.projection?.layout,i=this.constraints;e&&Ct(e)?this.constraints||(this.constraints=this.resolveRefConstraints()):e&&s?this.constraints=Ol(s.layoutBox,e):this.constraints=!1,this.elastic=_l(n),i!==this.constraints&&s&&this.constraints&&!this.hasMutatedConstraints&&Q(o=>{this.constraints!==!1&&this.getAxisMotionValue(o)&&(this.constraints[o]=Bl(s.layoutBox[o],this.constraints[o]))})}resolveRefConstraints(){const{dragConstraints:e,onMeasureDragConstraints:n}=this.getProps();if(!e||!Ct(e))return!1;const s=e.current,{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const o=Yu(s,i.root,this.visualElement.getTransformPagePoint());let r=jl(i.layout.layoutBox,o);if(n){const a=n(Ku(r));this.hasMutatedConstraints=!!a,a&&(r=xr(a))}return r}startAnimation(e){const{drag:n,dragMomentum:s,dragElastic:i,dragTransition:o,dragSnapToOrigin:r,onDragTransitionEnd:a}=this.getProps(),u=this.constraints||{},c=Q(l=>{if(!ae(l,n,this.currentDirection))return;let f=u&&u[l]||{};r&&(f={min:0,max:0});const d=i?200:1e6,p=i?40:1e7,m={type:"inertia",velocity:s?e[l]:0,bounceStiffness:d,bounceDamping:p,timeConstant:750,restDelta:1,restSpeed:10,...o,...f};return this.startAxisValueAnimation(l,m)});return Promise.all(c).then(a)}startAxisValueAnimation(e,n){const s=this.getAxisMotionValue(e);return nn(this.visualElement,e),s.start(Nn(e,s,0,n,this.visualElement,!1))}stopAnimation(){Q(e=>this.getAxisMotionValue(e).stop())}pauseAnimation(){Q(e=>this.getAxisMotionValue(e).animation?.pause())}getAnimationState(e){return this.getAxisMotionValue(e).animation?.state}getAxisMotionValue(e){const n=`_drag${e.toUpperCase()}`,s=this.visualElement.getProps(),i=s[n];return i||this.visualElement.getValue(e,(s.initial?s.initial[e]:void 0)||0)}snapToCursor(e){Q(n=>{const{drag:s}=this.getProps();if(!ae(n,s,this.currentDirection))return;const{projection:i}=this.visualElement,o=this.getAxisMotionValue(n);if(i&&i.layout){const{min:r,max:a}=i.layout.layoutBox[n];o.set(e[n]-F(r,a,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:e,dragConstraints:n}=this.getProps(),{projection:s}=this.visualElement;if(!Ct(n)||!s||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Q(r=>{const a=this.getAxisMotionValue(r);if(a&&this.constraints!==!1){const u=a.get();i[r]=Fl({min:u,max:u},this.constraints[r])}});const{transformTemplate:o}=this.visualElement.getProps();this.visualElement.current.style.transform=o?o({},""):"none",s.root&&s.root.updateScroll(),s.updateLayout(),this.resolveConstraints(),Q(r=>{if(!ae(r,e,null))return;const a=this.getAxisMotionValue(r),{min:u,max:c}=this.constraints[r];a.set(F(u,c,i[r]))})}addListeners(){if(!this.visualElement.current)return;Nl.set(this.visualElement,this);const e=this.visualElement.current,n=Wt(e,"pointerdown",u=>{const{drag:c,dragListener:l=!0}=this.getProps();c&&l&&this.start(u)}),s=()=>{const{dragConstraints:u}=this.getProps();Ct(u)&&u.current&&(this.constraints=this.resolveRefConstraints())},{projection:i}=this.visualElement,o=i.addEventListener("measure",s);i&&!i.layout&&(i.root&&i.root.updateScroll(),i.updateLayout()),B.read(s);const r=Jt(window,"resize",()=>this.scalePositionWithinConstraints()),a=i.addEventListener("didUpdate",(({delta:u,hasLayoutChanged:c})=>{this.isDragging&&c&&(Q(l=>{const f=this.getAxisMotionValue(l);f&&(this.originPoint[l]+=u[l].translate,f.set(f.get()+u[l].translate))}),this.visualElement.render())}));return()=>{r(),n(),o(),a&&a()}}getProps(){const e=this.visualElement.getProps(),{drag:n=!1,dragDirectionLock:s=!1,dragPropagation:i=!1,dragConstraints:o=!1,dragElastic:r=rn,dragMomentum:a=!0}=e;return{...e,drag:n,dragDirectionLock:s,dragPropagation:i,dragConstraints:o,dragElastic:r,dragMomentum:a}}}function ae(t,e,n){return(e===!0||e===t)&&(n===null||n===t)}function $l(t,e=10){let n=null;return Math.abs(t.y)>e?n="y":Math.abs(t.x)>e&&(n="x"),n}class Wl extends gt{constructor(e){super(e),this.removeGroupControls=et,this.removeListeners=et,this.controls=new Ul(e)}mount(){const{dragControls:e}=this.node.getProps();e&&(this.removeGroupControls=e.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||et}unmount(){this.removeGroupControls(),this.removeListeners()}}const Is=t=>(e,n)=>{t&&B.postRender(()=>t(e,n))};class Kl extends gt{constructor(){super(...arguments),this.removePointerDownListener=et}onPointerDown(e){this.session=new Br(e,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:Fr(this.node)})}createPanHandlers(){const{onPanSessionStart:e,onPanStart:n,onPan:s,onPanEnd:i}=this.node.getProps();return{onSessionStart:Is(e),onStart:Is(n),onMove:s,onEnd:(o,r)=>{delete this.session,i&&B.postRender(()=>i(o,r))}}}mount(){this.removePointerDownListener=Wt(this.node.current,"pointerdown",e=>this.onPointerDown(e))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}const fe={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function Os(t,e){return e.max===e.min?0:t/(e.max-e.min)*100}const Bt={correct:(t,e)=>{if(!e.target)return t;if(typeof t=="string")if(E.test(t))t=parseFloat(t);else return t;const n=Os(t,e.target.x),s=Os(t,e.target.y);return`${n}% ${s}%`}},Hl={correct:(t,{treeScale:e,projectionDelta:n})=>{const s=t,i=mt.parse(t);if(i.length>5)return s;const o=mt.createTransformer(t),r=typeof i[0]!="number"?1:0,a=n.x.scale*e.x,u=n.y.scale*e.y;i[0+r]/=a,i[1+r]/=u;const c=F(a,u,.5);return typeof i[2+r]=="number"&&(i[2+r]/=c),typeof i[3+r]=="number"&&(i[3+r]/=c),o(i)}};let ke=!1;class Gl extends A.Component{componentDidMount(){const{visualElement:e,layoutGroup:n,switchLayoutGroup:s,layoutId:i}=this.props,{projection:o}=e;vu(Yl),o&&(n.group&&n.group.add(o),s&&s.register&&i&&s.register(o),ke&&o.root.didUpdate(),o.addEventListener("animationComplete",()=>{this.safeToRemove()}),o.setOptions({...o.options,onExitComplete:()=>this.safeToRemove()})),fe.hasEverUpdated=!0}getSnapshotBeforeUpdate(e){const{layoutDependency:n,visualElement:s,drag:i,isPresent:o}=this.props,{projection:r}=s;return r&&(r.isPresent=o,ke=!0,i||e.layoutDependency!==n||n===void 0||e.isPresent!==o?r.willUpdate():this.safeToRemove(),e.isPresent!==o&&(o?r.promote():r.relegate()||B.postRender(()=>{const a=r.getStack();(!a||!a.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:e}=this.props.visualElement;e&&(e.root.didUpdate(),Mn.postRender(()=>{!e.currentAnimation&&e.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:e,layoutGroup:n,switchLayoutGroup:s}=this.props,{projection:i}=e;ke=!0,i&&(i.scheduleCheckAfterUnmount(),n&&n.group&&n.group.remove(i),s&&s.deregister&&s.deregister(i))}safeToRemove(){const{safeToRemove:e}=this.props;e&&e()}render(){return null}}function Nr(t){const[e,n]=or(),s=A.useContext(an);return tt.jsx(Gl,{...t,layoutGroup:s,switchLayoutGroup:A.useContext(vr),isPresent:e,safeToRemove:n})}const Yl={borderRadius:{...Bt,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:Bt,borderTopRightRadius:Bt,borderBottomLeftRadius:Bt,borderBottomRightRadius:Bt,boxShadow:Hl};function Ur(t,e,n){const s=G(t)?t:wt(t);return s.start(Nn("",s,e,n)),s.animation}const zl=(t,e)=>t.depth-e.depth;class Xl{constructor(){this.children=[],this.isDirty=!1}add(e){cn(this.children,e),this.isDirty=!0}remove(e){Qt(this.children,e),this.isDirty=!0}forEach(e){this.isDirty&&this.children.sort(zl),this.isDirty=!1,this.children.forEach(e)}}function ql(t,e){const n=q.now(),s=({timestamp:i})=>{const o=i-n;o>=e&&(ht(s),t(o-e))};return B.setup(s,!0),()=>ht(s)}const $r=["TopLeft","TopRight","BottomLeft","BottomRight"],Zl=$r.length,js=t=>typeof t=="string"?parseFloat(t):t,Fs=t=>typeof t=="number"||E.test(t);function Jl(t,e,n,s,i,o){i?(t.opacity=F(0,n.opacity??1,Ql(s)),t.opacityExit=F(e.opacity??1,0,tc(s))):o&&(t.opacity=F(e.opacity??1,n.opacity??1,s));for(let r=0;rse?1:n(Dt(t,e,s))}function _s(t,e){t.min=e.min,t.max=e.max}function J(t,e){_s(t.x,e.x),_s(t.y,e.y)}function Ns(t,e){t.translate=e.translate,t.scale=e.scale,t.originPoint=e.originPoint,t.origin=e.origin}function Us(t,e,n,s,i){return t-=e,t=me(t,1/n,s),i!==void 0&&(t=me(t,1/i,s)),t}function ec(t,e=0,n=1,s=.5,i,o=t,r=t){if(ot.test(e)&&(e=parseFloat(e),e=F(r.min,r.max,e/100)-r.min),typeof e!="number")return;let a=F(o.min,o.max,s);t===o&&(a-=e),t.min=Us(t.min,e,n,a,i),t.max=Us(t.max,e,n,a,i)}function $s(t,e,[n,s,i],o,r){ec(t,e[n],e[s],e[i],e.scale,o,r)}const nc=["x","scaleX","originX"],sc=["y","scaleY","originY"];function Ws(t,e,n,s){$s(t.x,e,nc,n?n.x:void 0,s?s.x:void 0),$s(t.y,e,sc,n?n.y:void 0,s?s.y:void 0)}function Ks(t){return t.translate===0&&t.scale===1}function Kr(t){return Ks(t.x)&&Ks(t.y)}function Hs(t,e){return t.min===e.min&&t.max===e.max}function ic(t,e){return Hs(t.x,e.x)&&Hs(t.y,e.y)}function Gs(t,e){return Math.round(t.min)===Math.round(e.min)&&Math.round(t.max)===Math.round(e.max)}function Hr(t,e){return Gs(t.x,e.x)&&Gs(t.y,e.y)}function Ys(t){return X(t.x)/X(t.y)}function zs(t,e){return t.translate===e.translate&&t.scale===e.scale&&t.originPoint===e.originPoint}class rc{constructor(){this.members=[]}add(e){cn(this.members,e),e.scheduleRender()}remove(e){if(Qt(this.members,e),e===this.prevLead&&(this.prevLead=void 0),e===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(e){const n=this.members.findIndex(i=>e===i);if(n===0)return!1;let s;for(let i=n;i>=0;i--){const o=this.members[i];if(o.isPresent!==!1){s=o;break}}return s?(this.promote(s),!0):!1}promote(e,n){const s=this.lead;if(e!==s&&(this.prevLead=s,this.lead=e,e.show(),s)){s.instance&&s.scheduleRender(),e.scheduleRender(),e.resumeFrom=s,n&&(e.resumeFrom.preserveOpacity=!0),s.snapshot&&(e.snapshot=s.snapshot,e.snapshot.latestValues=s.animationValues||s.latestValues),e.root&&e.root.isUpdating&&(e.isLayoutDirty=!0);const{crossfade:i}=e.options;i===!1&&s.hide()}}exitAnimationComplete(){this.members.forEach(e=>{const{options:n,resumingFrom:s}=e;n.onExitComplete&&n.onExitComplete(),s&&s.options.onExitComplete&&s.options.onExitComplete()})}scheduleRender(){this.members.forEach(e=>{e.instance&&e.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function oc(t,e,n){let s="";const i=t.x.translate/e.x,o=t.y.translate/e.y,r=n?.z||0;if((i||o||r)&&(s=`translate3d(${i}px, ${o}px, ${r}px) `),(e.x!==1||e.y!==1)&&(s+=`scale(${1/e.x}, ${1/e.y}) `),n){const{transformPerspective:c,rotate:l,rotateX:f,rotateY:d,skewX:p,skewY:m}=n;c&&(s=`perspective(${c}px) ${s}`),l&&(s+=`rotate(${l}deg) `),f&&(s+=`rotateX(${f}deg) `),d&&(s+=`rotateY(${d}deg) `),p&&(s+=`skewX(${p}deg) `),m&&(s+=`skewY(${m}deg) `)}const a=t.x.scale*e.x,u=t.y.scale*e.y;return(a!==1||u!==1)&&(s+=`scale(${a}, ${u})`),s||"none"}const Ie=["","X","Y","Z"],ac=1e3;let uc=0;function Oe(t,e,n,s){const{latestValues:i}=e;i[t]&&(n[t]=i[t],e.setStaticValue(t,0),s&&(s[t]=0))}function Gr(t){if(t.hasCheckedOptimisedAppear=!0,t.root===t)return;const{visualElement:e}=t.options;if(!e)return;const n=Dr(e);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:i,layoutId:o}=t.options;window.MotionCancelOptimisedAnimation(n,"transform",B,!(i||o))}const{parent:s}=t;s&&!s.hasCheckedOptimisedAppear&&Gr(s)}function Yr({attachResizeListener:t,defaultParent:e,measureScroll:n,checkIsScrollRoot:s,resetTransform:i}){return class{constructor(r={},a=e?.()){this.id=uc++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(fc),this.nodes.forEach(mc),this.nodes.forEach(gc),this.nodes.forEach(hc)},this.resolvedRelativeTargetAt=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=r,this.root=a?a.root||a:this,this.path=a?[...a.path,a]:[],this.parent=a,this.depth=a?a.depth+1:0;for(let u=0;uthis.root.updateBlockedByResize=!1;B.read(()=>{f=window.innerWidth}),t(r,()=>{const p=window.innerWidth;p!==f&&(f=p,this.root.updateBlockedByResize=!0,l&&l(),l=ql(d,250),fe.hasAnimatedSinceResize&&(fe.hasAnimatedSinceResize=!1,this.nodes.forEach(Zs)))})}a&&this.root.registerSharedNode(a,this),this.options.animate!==!1&&c&&(a||u)&&this.addEventListener("didUpdate",({delta:l,hasLayoutChanged:f,hasRelativeLayoutChanged:d,layout:p})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const m=this.options.transition||c.getDefaultTransition()||Pc,{onLayoutAnimationStart:v,onLayoutAnimationComplete:T}=c.getProps(),y=!this.targetLayout||!Hr(this.targetLayout,p),P=!f&&d;if(this.options.layoutRoot||this.resumeFrom||P||f&&(y||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const x={...Vn(m,"layout"),onPlay:v,onComplete:T};(c.shouldReduceMotion||this.options.layoutRoot)&&(x.delay=0,x.type=!1),this.startAnimation(x),this.setAnimationOrigin(l,P)}else f||Zs(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=p})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const r=this.getStack();r&&r.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),ht(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(yc),this.animationId++)}getTransformTemplate(){const{visualElement:r}=this.options;return r&&r.getProps().transformTemplate}willUpdate(r=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&Gr(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let l=0;l{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!X(this.snapshot.measuredBox.x)&&!X(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let u=0;u{const w=C/1e3;Js(f.x,r.x,w),Js(f.y,r.y,w),this.setTargetDelta(f),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(Ht(d,this.layout.layoutBox,this.relativeParent.layout.layoutBox),Tc(this.relativeTarget,this.relativeTargetOrigin,d,w),x&&ic(this.relativeTarget,x)&&(this.isProjectionDirty=!1),x||(x=U()),J(x,this.relativeTarget)),v&&(this.animationValues=l,Jl(l,c,this.latestValues,w,P,y)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=w},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(r){this.notifyListeners("animationStart"),this.currentAnimation?.stop(),this.resumingFrom?.currentAnimation?.stop(),this.pendingAnimation&&(ht(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=B.update(()=>{fe.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=wt(0)),this.currentAnimation=Ur(this.motionValue,[0,1e3],{...r,velocity:0,isSync:!0,onUpdate:a=>{this.mixTargetDelta(a),r.onUpdate&&r.onUpdate(a)},onStop:()=>{},onComplete:()=>{r.onComplete&&r.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const r=this.getStack();r&&r.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(ac),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const r=this.getLead();let{targetWithTransforms:a,target:u,layout:c,latestValues:l}=r;if(!(!a||!u||!c)){if(this!==r&&this.layout&&c&&zr(this.options.animationType,this.layout.layoutBox,c.layoutBox)){u=this.target||U();const f=X(this.layout.layoutBox.x);u.x.min=r.target.x.min,u.x.max=u.x.min+f;const d=X(this.layout.layoutBox.y);u.y.min=r.target.y.min,u.y.max=u.y.min+d}J(a,u),Et(a,l),Kt(this.projectionDeltaWithTransform,this.layoutCorrected,a,l)}}registerSharedNode(r,a){this.sharedNodes.has(r)||this.sharedNodes.set(r,new rc),this.sharedNodes.get(r).add(a);const c=a.options.initialPromotionConfig;a.promote({transition:c?c.transition:void 0,preserveFollowOpacity:c&&c.shouldPreserveFollowOpacity?c.shouldPreserveFollowOpacity(a):void 0})}isLead(){const r=this.getStack();return r?r.lead===this:!0}getLead(){const{layoutId:r}=this.options;return r?this.getStack()?.lead||this:this}getPrevLead(){const{layoutId:r}=this.options;return r?this.getStack()?.prevLead:void 0}getStack(){const{layoutId:r}=this.options;if(r)return this.root.sharedNodes.get(r)}promote({needsReset:r,transition:a,preserveFollowOpacity:u}={}){const c=this.getStack();c&&c.promote(this,u),r&&(this.projectionDelta=void 0,this.needsReset=!0),a&&this.setOptions({transition:a})}relegate(){const r=this.getStack();return r?r.relegate(this):!1}resetSkewAndRotation(){const{visualElement:r}=this.options;if(!r)return;let a=!1;const{latestValues:u}=r;if((u.z||u.rotate||u.rotateX||u.rotateY||u.rotateZ||u.skewX||u.skewY)&&(a=!0),!a)return;const c={};u.z&&Oe("z",r,c,this.animationValues);for(let l=0;lr.currentAnimation?.stop()),this.root.nodes.forEach(Xs),this.root.sharedNodes.clear()}}}function lc(t){t.updateLayout()}function cc(t){const e=t.resumeFrom?.snapshot||t.snapshot;if(t.isLead()&&t.layout&&e&&t.hasListeners("didUpdate")){const{layoutBox:n,measuredBox:s}=t.layout,{animationType:i}=t.options,o=e.source!==t.layout.source;i==="size"?Q(l=>{const f=o?e.measuredBox[l]:e.layoutBox[l],d=X(f);f.min=n[l].min,f.max=f.min+d}):zr(i,e.layoutBox,n)&&Q(l=>{const f=o?e.measuredBox[l]:e.layoutBox[l],d=X(n[l]);f.max=f.min+d,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[l].max=t.relativeTarget[l].min+d)});const r=Mt();Kt(r,n,e.layoutBox);const a=Mt();o?Kt(a,t.applyTransform(s,!0),e.measuredBox):Kt(a,n,e.layoutBox);const u=!Kr(r);let c=!1;if(!t.resumeFrom){const l=t.getClosestProjectingParent();if(l&&!l.resumeFrom){const{snapshot:f,layout:d}=l;if(f&&d){const p=U();Ht(p,e.layoutBox,f.layoutBox);const m=U();Ht(m,n,d.layoutBox),Hr(p,m)||(c=!0),l.options.layoutRoot&&(t.relativeTarget=m,t.relativeTargetOrigin=p,t.relativeParent=l)}}}t.notifyListeners("didUpdate",{layout:n,snapshot:e,delta:a,layoutDelta:r,hasLayoutChanged:u,hasRelativeLayoutChanged:c})}else if(t.isLead()){const{onExitComplete:n}=t.options;n&&n()}t.options.transition=void 0}function fc(t){t.parent&&(t.isProjecting()||(t.isProjectionDirty=t.parent.isProjectionDirty),t.isSharedProjectionDirty||(t.isSharedProjectionDirty=!!(t.isProjectionDirty||t.parent.isProjectionDirty||t.parent.isSharedProjectionDirty)),t.isTransformDirty||(t.isTransformDirty=t.parent.isTransformDirty))}function hc(t){t.isProjectionDirty=t.isSharedProjectionDirty=t.isTransformDirty=!1}function dc(t){t.clearSnapshot()}function Xs(t){t.clearMeasurements()}function qs(t){t.isLayoutDirty=!1}function pc(t){const{visualElement:e}=t.options;e&&e.getProps().onBeforeLayoutMeasure&&e.notify("BeforeLayoutMeasure"),t.resetTransform()}function Zs(t){t.finishAnimation(),t.targetDelta=t.relativeTarget=t.target=void 0,t.isProjectionDirty=!0}function mc(t){t.resolveTargetDelta()}function gc(t){t.calcProjection()}function yc(t){t.resetSkewAndRotation()}function vc(t){t.removeLeadSnapshot()}function Js(t,e,n){t.translate=F(e.translate,0,n),t.scale=F(e.scale,1,n),t.origin=e.origin,t.originPoint=e.originPoint}function Qs(t,e,n,s){t.min=F(e.min,n.min,s),t.max=F(e.max,n.max,s)}function Tc(t,e,n,s){Qs(t.x,e.x,n.x,s),Qs(t.y,e.y,n.y,s)}function xc(t){return t.animationValues&&t.animationValues.opacityExit!==void 0}const Pc={duration:.45,ease:[.4,0,.1,1]},ti=t=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(t),ei=ti("applewebkit/")&&!ti("chrome/")?Math.round:et;function ni(t){t.min=ei(t.min),t.max=ei(t.max)}function Ac(t){ni(t.x),ni(t.y)}function zr(t,e,n){return t==="position"||t==="preserve-aspect"&&!Ml(Ys(e),Ys(n),.2)}function Sc(t){return t!==t.root&&t.scroll?.wasRoot}const wc=Yr({attachResizeListener:(t,e)=>Jt(t,"resize",e),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),je={current:void 0},Xr=Yr({measureScroll:t=>({x:t.scrollLeft,y:t.scrollTop}),defaultParent:()=>{if(!je.current){const t=new wc({});t.mount(window),t.setOptions({layoutScroll:!0}),je.current=t}return je.current},resetTransform:(t,e)=>{t.style.transform=e!==void 0?e:"none"},checkIsScrollRoot:t=>window.getComputedStyle(t).position==="fixed"}),bc={pan:{Feature:Kl},drag:{Feature:Wl,ProjectionNode:Xr,MeasureLayout:Nr}};function si(t,e,n){const{props:s}=t;t.animationState&&s.whileHover&&t.animationState.setActive("whileHover",n==="Start");const i="onHover"+n,o=s[i];o&&B.postRender(()=>o(e,se(e)))}class Cc extends gt{mount(){const{current:e}=this.node;e&&(this.unmount=Za(e,(n,s)=>(si(this.node,s,"Start"),i=>si(this.node,i,"End"))))}unmount(){}}class Vc extends gt{constructor(){super(...arguments),this.isActive=!1}onFocus(){let e=!1;try{e=this.node.current.matches(":focus-visible")}catch{e=!0}!e||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=te(Jt(this.node.current,"focus",()=>this.onFocus()),Jt(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function ii(t,e,n){const{props:s}=t;if(t.current instanceof HTMLButtonElement&&t.current.disabled)return;t.animationState&&s.whileTap&&t.animationState.setActive("whileTap",n==="Start");const i="onTap"+(n==="End"?"":n),o=s[i];o&&B.postRender(()=>o(e,se(e)))}class Ec extends gt{mount(){const{current:e}=this.node;e&&(this.unmount=eu(e,(n,s)=>(ii(this.node,s,"Start"),(i,{success:o})=>ii(this.node,i,o?"End":"Cancel")),{useGlobalTarget:this.node.props.globalTapTarget}))}unmount(){}}const on=new WeakMap,Fe=new WeakMap,Mc=t=>{const e=on.get(t.target);e&&e(t)},Rc=t=>{t.forEach(Mc)};function Dc({root:t,...e}){const n=t||document;Fe.has(n)||Fe.set(n,{});const s=Fe.get(n),i=JSON.stringify(e);return s[i]||(s[i]=new IntersectionObserver(Rc,{root:t,...e})),s[i]}function Lc(t,e,n){const s=Dc(e);return on.set(t,n),s.observe(t),()=>{on.delete(t),s.unobserve(t)}}const kc={some:0,all:1};class Ic extends gt{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:e={}}=this.node.getProps(),{root:n,margin:s,amount:i="some",once:o}=e,r={root:n?n.current:void 0,rootMargin:s,threshold:typeof i=="number"?i:kc[i]},a=u=>{const{isIntersecting:c}=u;if(this.isInView===c||(this.isInView=c,o&&!c&&this.hasEnteredView))return;c&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",c);const{onViewportEnter:l,onViewportLeave:f}=this.node.getProps(),d=c?l:f;d&&d(u)};return Lc(this.node.current,r,a)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:e,prevProps:n}=this.node;["amount","margin","root"].some(Oc(e,n))&&this.startObserver()}unmount(){}}function Oc({viewport:t={}},{viewport:e={}}={}){return n=>t[n]!==e[n]}const jc={inView:{Feature:Ic},tap:{Feature:Ec},focus:{Feature:Vc},hover:{Feature:Cc}},Fc={layout:{ProjectionNode:Xr,MeasureLayout:Nr}},Bc={...Sl,...jc,...bc,...Fc},qr=Wu(Bc,Ju);function _c(t){return A.useEffect(()=>()=>t(),[])}function Zr(t){const e=lt(()=>wt(t)),{isStatic:n}=A.useContext(ye);if(n){const[,s]=A.useState(t);A.useEffect(()=>e.on("change",s),[])}return e}function Jr(t,e){const n=Zr(e()),s=()=>n.set(e());return s(),ln(()=>{const i=()=>B.preRender(s,!1,!0),o=t.map(r=>r.on("change",i));return()=>{o.forEach(r=>r()),ht(s)}}),n}function Nc(t){$t.current=[],t();const e=Jr($t.current,t);return $t.current=void 0,e}function Uc(t,e,n,s){if(typeof t=="function")return Nc(t);const i=typeof e=="function"?e:su(e,n,s);return Array.isArray(t)?ri(t,i):ri([t],([o])=>i(o))}function ri(t,e){const n=lt(()=>[]);return Jr(t,()=>{n.length=0;const s=t.length;for(let i=0;ie&&i.at{const L=Xc(C),{delay:W=0,times:N=Ni(L),type:dt="keyframes",repeat:at,repeatType:yt,repeatDelay:jt=0,...ut}=w;let{ease:O=e.ease||"easeOut",duration:_}=w;const Z=typeof W=="function"?W(S,b):W,nt=L.length,h=Cn(dt)?dt:i?.[dt||"keyframes"];if(nt<=2&&h){let k=100;if(nt===2&&Jc(L)){const z=L[1]-L[0];k=Math.abs(z)}const I={...ut};_!==void 0&&(I.duration=it(_));const j=ji(I,k,h);O=j.ease,_=j.duration}_??(_=o);const g=f+Z;N.length===1&&N[0]===0&&(N[1]=1);const R=N.length-L.length;if(R>0&&_i(N,R),L.length===1&&L.unshift(null),at){_=$c(_,at);const k=[...L],I=[...N];O=Array.isArray(O)?[...O]:[O];const j=[...O];for(let z=0;z{for(const v in p){const T=p[v];T.sort(Gc);const y=[],P=[],x=[];for(let w=0;wtypeof t=="number",Jc=t=>t.every(Zc);function Qc(t,e){return t in e}class tf extends br{constructor(){super(...arguments),this.type="object"}readValueFromInstance(e,n){if(Qc(n,e)){const s=e[n];if(typeof s=="string"||typeof s=="number")return s}}getBaseTargetFromProps(){}removeValueFromRenderState(e,n){delete n.output[e]}measureInstanceViewportBox(){return U()}build(e,n){Object.assign(e.output,n)}renderInstance(e,{output:n}){Object.assign(e,n)}sortInstanceNodePosition(){return 0}}function ef(t){const e={presenceContext:null,props:{},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{}}},n=Dn(t)&&!rr(t)?new Rr(e):new Er(e);n.mount(t),Zt.set(t,n)}function nf(t){const e={presenceContext:null,props:{},visualState:{renderState:{output:{}},latestValues:{}}},n=new tf(e);n.mount(t),Zt.set(t,n)}function sf(t,e){return G(t)||typeof t=="number"||typeof t=="string"&&!$n(e)}function to(t,e,n,s){const i=[];if(sf(t,e))i.push(Ur(t,$n(e)&&e.default||e,n&&(n.default||n)));else{const o=Qr(t,e,s),r=o.length;for(let a=0;a{s.push(...to(a,o,r))}),s}function of(t){return Array.isArray(t)&&t.some(Array.isArray)}function af(t){function e(n,s,i){let o=[];of(n)?o=rf(n,s,t):o=to(n,s,i,t);const r=new Oa(o);return t&&(t.animations.push(r),r.finished.then(()=>{Qt(t.animations,r)})),r}return e}function yf(){const t=lt(()=>({current:null,animations:[]})),e=lt(()=>af(t));return _c(()=>{t.animations.forEach(n=>n.stop()),t.animations.length=0}),[t,e]}const eo=A.createContext(null);function uf(t,e,n,s){if(!s)return t;const i=t.findIndex(l=>l.value===e);if(i===-1)return t;const o=s>0?1:-1,r=t[i+o];if(!r)return t;const a=t[i],u=r.layout,c=F(u.min,u.max,.5);return o===1&&a.layout.max+n>c||o===-1&&a.layout.min+nqr[e]),u=[],c=A.useRef(!1),l={axis:n,registerItem:(f,d)=>{const p=u.findIndex(m=>f===m.value);p!==-1?u[p].layout=d[n]:u.push({value:f,layout:d[n]}),u.sort(ff)},updateOrder:(f,d,p)=>{if(c.current)return;const m=uf(u,f,d,p);u!==m&&(c.current=!0,s(m.map(cf).filter(v=>i.indexOf(v)!==-1)))}};return A.useEffect(()=>{c.current=!1}),tt.jsx(a,{...o,ref:r,ignoreStrict:!0,children:tt.jsx(eo.Provider,{value:l,children:t})})}const vf=A.forwardRef(lf);function cf(t){return t.value}function ff(t,e){return t.layout.min-e.layout.min}function li(t,e=0){return G(t)?t:Zr(e)}function hf({children:t,style:e={},value:n,as:s="li",onDrag:i,layout:o=!0,...r},a){const u=lt(()=>qr[s]),c=A.useContext(eo),l={x:li(e.x),y:li(e.y)},f=Uc([l.x,l.y],([v,T])=>v||T?1:"unset"),{axis:d,registerItem:p,updateOrder:m}=c;return tt.jsx(u,{drag:d,...r,dragSnapToOrigin:!0,style:{...e,x:l.x,y:l.y,zIndex:f},layout:o,onDrag:(v,T)=>{const{velocity:y}=T;y[d]&&m(n,l[d].get(),y[d]),i&&i(v,T)},onLayoutMeasure:v=>p(n,v),ref:a,ignoreStrict:!0,children:t})}const Tf=A.forwardRef(hf);export{mf as A,lo as R,A as a,vf as b,Tf as c,io as g,tt as j,qr as m,uo as r,pf as s,df as t,yf as u}; diff --git a/service/dist/assets/motion-Dp9wOFzY.js.br b/service/dist/assets/motion-Dp9wOFzY.js.br new file mode 100644 index 0000000000000000000000000000000000000000..7061521290d861d6aa160951ff1d2473a7390228 GIT binary patch literal 39726 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

S2ol(&$tx8VIwo~U= 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 SyDYJ|&4}siv&`dsXZbU}m7?MR literal 0 HcmV?d00001 diff --git a/service/dist/assets/ui-CImlNgPE.js b/service/dist/assets/ui-CImlNgPE.js new file mode 100644 index 000000000..728a61cd4 --- /dev/null +++ b/service/dist/assets/ui-CImlNgPE.js @@ -0,0 +1,53 @@ +import{g as ql,R as w,a as d,j as O,t as Kn,r as Gl}from"./motion-Dp9wOFzY.js";import{r as Kl}from"./misc-GeCjUSSS.js";var Qt=Kl();const Qs=ql(Qt);function Xl(e){if(typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}const Zl=e=>{switch(e){case"success":return ec;case"info":return nc;case"warning":return tc;case"error":return rc;default:return null}},Ql=Array(12).fill(0),Jl=({visible:e,className:t})=>w.createElement("div",{className:["sonner-loading-wrapper",t].filter(Boolean).join(" "),"data-visible":e},w.createElement("div",{className:"sonner-spinner"},Ql.map((n,r)=>w.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${r}`})))),ec=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},w.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),tc=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},w.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),nc=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},w.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),rc=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},w.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),oc=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},w.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),w.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),sc=()=>{const[e,t]=w.useState(document.hidden);return w.useEffect(()=>{const n=()=>{t(document.hidden)};return document.addEventListener("visibilitychange",n),()=>window.removeEventListener("visibilitychange",n)},[]),e};let no=1;class ac{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{const n=this.subscribers.indexOf(t);this.subscribers.splice(n,1)}),this.publish=t=>{this.subscribers.forEach(n=>n(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var n;const{message:r,...o}=t,s=typeof t?.id=="number"||((n=t.id)==null?void 0:n.length)>0?t.id:no++,i=this.toasts.find(l=>l.id===s),a=t.dismissible===void 0?!0:t.dismissible;return this.dismissedToasts.has(s)&&this.dismissedToasts.delete(s),i?this.toasts=this.toasts.map(l=>l.id===s?(this.publish({...l,...t,id:s,title:r}),{...l,...t,id:s,dismissible:a,title:r}):l):this.addToast({title:r,...o,dismissible:a,id:s}),s},this.dismiss=t=>(t?(this.dismissedToasts.add(t),requestAnimationFrame(()=>this.subscribers.forEach(n=>n({id:t,dismiss:!0})))):this.toasts.forEach(n=>{this.subscribers.forEach(r=>r({id:n.id,dismiss:!0}))}),t),this.message=(t,n)=>this.create({...n,message:t}),this.error=(t,n)=>this.create({...n,message:t,type:"error"}),this.success=(t,n)=>this.create({...n,type:"success",message:t}),this.info=(t,n)=>this.create({...n,type:"info",message:t}),this.warning=(t,n)=>this.create({...n,type:"warning",message:t}),this.loading=(t,n)=>this.create({...n,type:"loading",message:t}),this.promise=(t,n)=>{if(!n)return;let r;n.loading!==void 0&&(r=this.create({...n,promise:t,type:"loading",message:n.loading,description:typeof n.description!="function"?n.description:void 0}));const o=Promise.resolve(t instanceof Function?t():t);let s=r!==void 0,i;const a=o.then(async u=>{if(i=["resolve",u],w.isValidElement(u))s=!1,this.create({id:r,type:"default",message:u});else if(lc(u)&&!u.ok){s=!1;const c=typeof n.error=="function"?await n.error(`HTTP error! status: ${u.status}`):n.error,m=typeof n.description=="function"?await n.description(`HTTP error! status: ${u.status}`):n.description,g=typeof c=="object"&&!w.isValidElement(c)?c:{message:c};this.create({id:r,type:"error",description:m,...g})}else if(u instanceof Error){s=!1;const c=typeof n.error=="function"?await n.error(u):n.error,m=typeof n.description=="function"?await n.description(u):n.description,g=typeof c=="object"&&!w.isValidElement(c)?c:{message:c};this.create({id:r,type:"error",description:m,...g})}else if(n.success!==void 0){s=!1;const c=typeof n.success=="function"?await n.success(u):n.success,m=typeof n.description=="function"?await n.description(u):n.description,g=typeof c=="object"&&!w.isValidElement(c)?c:{message:c};this.create({id:r,type:"success",description:m,...g})}}).catch(async u=>{if(i=["reject",u],n.error!==void 0){s=!1;const f=typeof n.error=="function"?await n.error(u):n.error,c=typeof n.description=="function"?await n.description(u):n.description,h=typeof f=="object"&&!w.isValidElement(f)?f:{message:f};this.create({id:r,type:"error",description:c,...h})}}).finally(()=>{s&&(this.dismiss(r),r=void 0),n.finally==null||n.finally.call(n)}),l=()=>new Promise((u,f)=>a.then(()=>i[0]==="reject"?f(i[1]):u(i[1])).catch(f));return typeof r!="string"&&typeof r!="number"?{unwrap:l}:Object.assign(r,{unwrap:l})},this.custom=(t,n)=>{const r=n?.id||no++;return this.create({jsx:t(r),id:r,...n}),r},this.getActiveToasts=()=>this.toasts.filter(t=>!this.dismissedToasts.has(t.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}}const Ce=new ac,ic=(e,t)=>{const n=t?.id||no++;return Ce.addToast({title:e,...t,id:n}),n},lc=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",cc=ic,uc=()=>Ce.toasts,dc=()=>Ce.getActiveToasts(),Dy=Object.assign(cc,{success:Ce.success,info:Ce.info,warning:Ce.warning,error:Ce.error,custom:Ce.custom,message:Ce.message,promise:Ce.promise,dismiss:Ce.dismiss,loading:Ce.loading},{getHistory:uc,getToasts:dc});Xl("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");function Wn(e){return e.label!==void 0}const fc=3,mc="24px",hc="16px",Qo=4e3,pc=356,vc=14,gc=45,yc=200;function Ye(...e){return e.filter(Boolean).join(" ")}function wc(e){const[t,n]=e.split("-"),r=[];return t&&r.push(t),n&&r.push(n),r}const bc=e=>{var t,n,r,o,s,i,a,l,u;const{invert:f,toast:c,unstyled:m,interacting:h,setHeights:g,visibleToasts:p,heights:v,index:y,toasts:x,expanded:b,removeToast:E,defaultRichColors:S,closeButton:T,style:C,cancelButtonStyle:M,actionButtonStyle:I,className:N="",descriptionClassName:_="",duration:B,position:R,gap:$,expandByDefault:H,classNames:P,icons:F,closeButtonAriaLabel:k="Close toast"}=e,[j,U]=w.useState(null),[oe,me]=w.useState(null),[D,q]=w.useState(!1),[K,le]=w.useState(!1),[A,L]=w.useState(!1),[Z,J]=w.useState(!1),[ee,ne]=w.useState(!1),[ge,Ee]=w.useState(0),[Ot,ct]=w.useState(0),Ae=w.useRef(c.duration||B||Qo),Rn=w.useRef(null),Ie=w.useRef(null),Dr=y===0,kr=y+1<=p,ye=c.type,He=c.dismissible!==!1,sn=c.className||"",Nr=c.descriptionClassName||"",$t=w.useMemo(()=>v.findIndex(V=>V.toastId===c.id)||0,[v,c.id]),Rr=w.useMemo(()=>{var V;return(V=c.closeButton)!=null?V:T},[c.closeButton,T]),An=w.useMemo(()=>c.duration||B||Qo,[c.duration,B]),an=w.useRef(0),ut=w.useRef(0),In=w.useRef(0),dt=w.useRef(null),[Ar,Ir]=R.split("-"),_n=w.useMemo(()=>v.reduce((V,de,he)=>he>=$t?V:V+de.height,0),[v,$t]),ln=sc(),_r=c.invert||f,z=ye==="loading";ut.current=w.useMemo(()=>$t*$+_n,[$t,_n]),w.useEffect(()=>{Ae.current=An},[An]),w.useEffect(()=>{q(!0)},[]),w.useEffect(()=>{const V=Ie.current;if(V){const de=V.getBoundingClientRect().height;return ct(de),g(he=>[{toastId:c.id,height:de,position:c.position},...he]),()=>g(he=>he.filter(pe=>pe.toastId!==c.id))}},[g,c.id]),w.useLayoutEffect(()=>{if(!D)return;const V=Ie.current,de=V.style.height;V.style.height="auto";const he=V.getBoundingClientRect().height;V.style.height=de,ct(he),g(pe=>pe.find(ve=>ve.toastId===c.id)?pe.map(ve=>ve.toastId===c.id?{...ve,height:he}:ve):[{toastId:c.id,height:he,position:c.position},...pe])},[D,c.title,c.description,g,c.id,c.jsx,c.action,c.cancel]);const Q=w.useCallback(()=>{le(!0),Ee(ut.current),g(V=>V.filter(de=>de.toastId!==c.id)),setTimeout(()=>{E(c)},yc)},[c,E,g,ut]);w.useEffect(()=>{if(c.promise&&ye==="loading"||c.duration===1/0||c.type==="loading")return;let V;return b||h||ln?(()=>{if(In.current{Ae.current!==1/0&&(an.current=new Date().getTime(),V=setTimeout(()=>{c.onAutoClose==null||c.onAutoClose.call(c,c),Q()},Ae.current))})(),()=>clearTimeout(V)},[b,h,c,ye,ln,Q]),w.useEffect(()=>{c.delete&&(Q(),c.onDismiss==null||c.onDismiss.call(c,c))},[Q,c.delete]);function Y(){var V;if(F?.loading){var de;return w.createElement("div",{className:Ye(P?.loader,c==null||(de=c.classNames)==null?void 0:de.loader,"sonner-loader"),"data-visible":ye==="loading"},F.loading)}return w.createElement(Jl,{className:Ye(P?.loader,c==null||(V=c.classNames)==null?void 0:V.loader),visible:ye==="loading"})}const se=c.icon||F?.[ye]||Zl(ye);var we,X;return w.createElement("li",{tabIndex:0,ref:Ie,className:Ye(N,sn,P?.toast,c==null||(t=c.classNames)==null?void 0:t.toast,P?.default,P?.[ye],c==null||(n=c.classNames)==null?void 0:n[ye]),"data-sonner-toast":"","data-rich-colors":(we=c.richColors)!=null?we:S,"data-styled":!(c.jsx||c.unstyled||m),"data-mounted":D,"data-promise":!!c.promise,"data-swiped":ee,"data-removed":K,"data-visible":kr,"data-y-position":Ar,"data-x-position":Ir,"data-index":y,"data-front":Dr,"data-swiping":A,"data-dismissible":He,"data-type":ye,"data-invert":_r,"data-swipe-out":Z,"data-swipe-direction":oe,"data-expanded":!!(b||H&&D),"data-testid":c.testId,style:{"--index":y,"--toasts-before":y,"--z-index":x.length-y,"--offset":`${K?ge:ut.current}px`,"--initial-height":H?"auto":`${Ot}px`,...C,...c.style},onDragEnd:()=>{L(!1),U(null),dt.current=null},onPointerDown:V=>{V.button!==2&&(z||!He||(Rn.current=new Date,Ee(ut.current),V.target.setPointerCapture(V.pointerId),V.target.tagName!=="BUTTON"&&(L(!0),dt.current={x:V.clientX,y:V.clientY})))},onPointerUp:()=>{var V,de,he;if(Z||!He)return;dt.current=null;const pe=Number(((V=Ie.current)==null?void 0:V.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),ft=Number(((de=Ie.current)==null?void 0:de.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),ve=new Date().getTime()-((he=Rn.current)==null?void 0:he.getTime()),ke=j==="x"?pe:ft,Fn=Math.abs(ke)/ve;if(Math.abs(ke)>=gc||Fn>.11){Ee(ut.current),c.onDismiss==null||c.onDismiss.call(c,c),me(j==="x"?pe>0?"right":"left":ft>0?"down":"up"),Q(),J(!0);return}else{var _e,Fe;(_e=Ie.current)==null||_e.style.setProperty("--swipe-amount-x","0px"),(Fe=Ie.current)==null||Fe.style.setProperty("--swipe-amount-y","0px")}ne(!1),L(!1),U(null)},onPointerMove:V=>{var de,he,pe;if(!dt.current||!He||((de=window.getSelection())==null?void 0:de.toString().length)>0)return;const ve=V.clientY-dt.current.y,ke=V.clientX-dt.current.x;var Fn;const _e=(Fn=e.swipeDirections)!=null?Fn:wc(R);!j&&(Math.abs(ke)>1||Math.abs(ve)>1)&&U(Math.abs(ke)>Math.abs(ve)?"x":"y");let Fe={x:0,y:0};const Zo=Tt=>1/(1.5+Math.abs(Tt)/20);if(j==="y"){if(_e.includes("top")||_e.includes("bottom"))if(_e.includes("top")&&ve<0||_e.includes("bottom")&&ve>0)Fe.y=ve;else{const Tt=ve*Zo(ve);Fe.y=Math.abs(Tt)0)Fe.x=ke;else{const Tt=ke*Zo(ke);Fe.x=Math.abs(Tt)0||Math.abs(Fe.y)>0)&&ne(!0),(he=Ie.current)==null||he.style.setProperty("--swipe-amount-x",`${Fe.x}px`),(pe=Ie.current)==null||pe.style.setProperty("--swipe-amount-y",`${Fe.y}px`)}},Rr&&!c.jsx&&ye!=="loading"?w.createElement("button",{"aria-label":k,"data-disabled":z,"data-close-button":!0,onClick:z||!He?()=>{}:()=>{Q(),c.onDismiss==null||c.onDismiss.call(c,c)},className:Ye(P?.closeButton,c==null||(r=c.classNames)==null?void 0:r.closeButton)},(X=F?.close)!=null?X:oc):null,(ye||c.icon||c.promise)&&c.icon!==null&&(F?.[ye]!==null||c.icon)?w.createElement("div",{"data-icon":"",className:Ye(P?.icon,c==null||(o=c.classNames)==null?void 0:o.icon)},c.promise||c.type==="loading"&&!c.icon?c.icon||Y():null,c.type!=="loading"?se:null):null,w.createElement("div",{"data-content":"",className:Ye(P?.content,c==null||(s=c.classNames)==null?void 0:s.content)},w.createElement("div",{"data-title":"",className:Ye(P?.title,c==null||(i=c.classNames)==null?void 0:i.title)},c.jsx?c.jsx:typeof c.title=="function"?c.title():c.title),c.description?w.createElement("div",{"data-description":"",className:Ye(_,Nr,P?.description,c==null||(a=c.classNames)==null?void 0:a.description)},typeof c.description=="function"?c.description():c.description):null),w.isValidElement(c.cancel)?c.cancel:c.cancel&&Wn(c.cancel)?w.createElement("button",{"data-button":!0,"data-cancel":!0,style:c.cancelButtonStyle||M,onClick:V=>{Wn(c.cancel)&&He&&(c.cancel.onClick==null||c.cancel.onClick.call(c.cancel,V),Q())},className:Ye(P?.cancelButton,c==null||(l=c.classNames)==null?void 0:l.cancelButton)},c.cancel.label):null,w.isValidElement(c.action)?c.action:c.action&&Wn(c.action)?w.createElement("button",{"data-button":!0,"data-action":!0,style:c.actionButtonStyle||I,onClick:V=>{Wn(c.action)&&(c.action.onClick==null||c.action.onClick.call(c.action,V),!V.defaultPrevented&&Q())},className:Ye(P?.actionButton,c==null||(u=c.classNames)==null?void 0:u.actionButton)},c.action.label):null)};function Jo(){if(typeof window>"u"||typeof document>"u")return"ltr";const e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}function xc(e,t){const n={};return[e,t].forEach((r,o)=>{const s=o===1,i=s?"--mobile-offset":"--offset",a=s?hc:mc;function l(u){["top","right","bottom","left"].forEach(f=>{n[`${i}-${f}`]=typeof u=="number"?`${u}px`:u})}typeof r=="number"||typeof r=="string"?l(r):typeof r=="object"?["top","right","bottom","left"].forEach(u=>{r[u]===void 0?n[`${i}-${u}`]=a:n[`${i}-${u}`]=typeof r[u]=="number"?`${r[u]}px`:r[u]}):l(a)}),n}const ky=w.forwardRef(function(t,n){const{id:r,invert:o,position:s="bottom-right",hotkey:i=["altKey","KeyT"],expand:a,closeButton:l,className:u,offset:f,mobileOffset:c,theme:m="light",richColors:h,duration:g,style:p,visibleToasts:v=fc,toastOptions:y,dir:x=Jo(),gap:b=vc,icons:E,containerAriaLabel:S="Notifications"}=t,[T,C]=w.useState([]),M=w.useMemo(()=>r?T.filter(D=>D.toasterId===r):T.filter(D=>!D.toasterId),[T,r]),I=w.useMemo(()=>Array.from(new Set([s].concat(M.filter(D=>D.position).map(D=>D.position)))),[M,s]),[N,_]=w.useState([]),[B,R]=w.useState(!1),[$,H]=w.useState(!1),[P,F]=w.useState(m!=="system"?m:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),k=w.useRef(null),j=i.join("+").replace(/Key/g,"").replace(/Digit/g,""),U=w.useRef(null),oe=w.useRef(!1),me=w.useCallback(D=>{C(q=>{var K;return(K=q.find(le=>le.id===D.id))!=null&&K.delete||Ce.dismiss(D.id),q.filter(({id:le})=>le!==D.id)})},[]);return w.useEffect(()=>Ce.subscribe(D=>{if(D.dismiss){requestAnimationFrame(()=>{C(q=>q.map(K=>K.id===D.id?{...K,delete:!0}:K))});return}setTimeout(()=>{Qs.flushSync(()=>{C(q=>{const K=q.findIndex(le=>le.id===D.id);return K!==-1?[...q.slice(0,K),{...q[K],...D},...q.slice(K+1)]:[D,...q]})})})}),[T]),w.useEffect(()=>{if(m!=="system"){F(m);return}if(m==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?F("dark"):F("light")),typeof window>"u")return;const D=window.matchMedia("(prefers-color-scheme: dark)");try{D.addEventListener("change",({matches:q})=>{F(q?"dark":"light")})}catch{D.addListener(({matches:K})=>{try{F(K?"dark":"light")}catch(le){console.error(le)}})}},[m]),w.useEffect(()=>{T.length<=1&&R(!1)},[T]),w.useEffect(()=>{const D=q=>{var K;if(i.every(L=>q[L]||q.code===L)){var A;R(!0),(A=k.current)==null||A.focus()}q.code==="Escape"&&(document.activeElement===k.current||(K=k.current)!=null&&K.contains(document.activeElement))&&R(!1)};return document.addEventListener("keydown",D),()=>document.removeEventListener("keydown",D)},[i]),w.useEffect(()=>{if(k.current)return()=>{U.current&&(U.current.focus({preventScroll:!0}),U.current=null,oe.current=!1)}},[k.current]),w.createElement("section",{ref:n,"aria-label":`${S} ${j}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},I.map((D,q)=>{var K;const[le,A]=D.split("-");return M.length?w.createElement("ol",{key:D,dir:x==="auto"?Jo():x,tabIndex:-1,ref:k,className:u,"data-sonner-toaster":!0,"data-sonner-theme":P,"data-y-position":le,"data-x-position":A,style:{"--front-toast-height":`${((K=N[0])==null?void 0:K.height)||0}px`,"--width":`${pc}px`,"--gap":`${b}px`,...p,...xc(f,c)},onBlur:L=>{oe.current&&!L.currentTarget.contains(L.relatedTarget)&&(oe.current=!1,U.current&&(U.current.focus({preventScroll:!0}),U.current=null))},onFocus:L=>{L.target instanceof HTMLElement&&L.target.dataset.dismissible==="false"||oe.current||(oe.current=!0,U.current=L.relatedTarget)},onMouseEnter:()=>R(!0),onMouseMove:()=>R(!0),onMouseLeave:()=>{$||R(!1)},onDragEnd:()=>R(!1),onPointerDown:L=>{L.target instanceof HTMLElement&&L.target.dataset.dismissible==="false"||H(!0)},onPointerUp:()=>H(!1)},M.filter(L=>!L.position&&q===0||L.position===D).map((L,Z)=>{var J,ee;return w.createElement(bc,{key:L.id,icons:E,index:Z,toast:L,defaultRichColors:h,duration:(J=y?.duration)!=null?J:g,className:y?.className,descriptionClassName:y?.descriptionClassName,invert:o,visibleToasts:v,closeButton:(ee=y?.closeButton)!=null?ee:l,interacting:$,position:D,style:y?.style,unstyled:y?.unstyled,classNames:y?.classNames,cancelButtonStyle:y?.cancelButtonStyle,actionButtonStyle:y?.actionButtonStyle,closeButtonAriaLabel:y?.closeButtonAriaLabel,removeToast:me,toasts:M.filter(ne=>ne.position==L.position),heights:N.filter(ne=>ne.position==L.position),setHeights:_,expandByDefault:a,gap:b,expanded:B,swipeDirections:t.swipeDirections})})):null}))});function es(e,[t,n]){return Math.min(n,Math.max(t,e))}function G(e,t,{checkForDefaultPrevented:n=!0}={}){return function(o){if(e?.(o),n===!1||!o.defaultPrevented)return t?.(o)}}function Ft(e,t=[]){let n=[];function r(s,i){const a=d.createContext(i),l=n.length;n=[...n,i];const u=c=>{const{scope:m,children:h,...g}=c,p=m?.[e]?.[l]||a,v=d.useMemo(()=>g,Object.values(g));return O.jsx(p.Provider,{value:v,children:h})};u.displayName=s+"Provider";function f(c,m){const h=m?.[e]?.[l]||a,g=d.useContext(h);if(g)return g;if(i!==void 0)return i;throw new Error(`\`${c}\` must be used within \`${s}\``)}return[u,f]}const o=()=>{const s=n.map(i=>d.createContext(i));return function(a){const l=a?.[e]||s;return d.useMemo(()=>({[`__scope${e}`]:{...a,[e]:l}}),[a,l])}};return o.scopeName=e,[r,Sc(o,...t)]}function Sc(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(o=>({useScope:o(),scopeName:o.scopeName}));return function(s){const i=r.reduce((a,{useScope:l,scopeName:u})=>{const c=l(s)[`__scope${u}`];return{...a,...c}},{});return d.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}function ts(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Js(...e){return t=>{let n=!1;const r=e.map(o=>{const s=ts(o,t);return!n&&typeof s=="function"&&(n=!0),s});if(n)return()=>{for(let o=0;o{const{children:s,...i}=r,a=d.Children.toArray(s),l=a.find(Oc);if(l){const u=l.props.children,f=a.map(c=>c===l?d.Children.count(u)>1?d.Children.only(null):d.isValidElement(u)?u.props.children:null:c);return O.jsx(t,{...i,ref:o,children:d.isValidElement(u)?d.cloneElement(u,void 0,f):null})}return O.jsx(t,{...i,ref:o,children:s})});return n.displayName=`${e}.Slot`,n}var Ny=zt("Slot");function Ec(e){const t=d.forwardRef((n,r)=>{const{children:o,...s}=n;if(d.isValidElement(o)){const i=Mc(o),a=Tc(s,o.props);return o.type!==d.Fragment&&(a.ref=r?Js(r,i):i),d.cloneElement(o,a)}return d.Children.count(o)>1?d.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var ea=Symbol("radix.slottable");function Cc(e){const t=({children:n})=>O.jsx(O.Fragment,{children:n});return t.displayName=`${e}.Slottable`,t.__radixId=ea,t}function Oc(e){return d.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===ea}function Tc(e,t){const n={...t};for(const r in t){const o=e[r],s=t[r];/^on[A-Z]/.test(r)?o&&s?n[r]=(...a)=>{const l=s(...a);return o(...a),l}:o&&(n[r]=o):r==="style"?n[r]={...o,...s}:r==="className"&&(n[r]=[o,s].filter(Boolean).join(" "))}return{...e,...n}}function Mc(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}function ta(e){const t=e+"CollectionProvider",[n,r]=Ft(t),[o,s]=n(t,{collectionRef:{current:null},itemMap:new Map}),i=p=>{const{scope:v,children:y}=p,x=w.useRef(null),b=w.useRef(new Map).current;return O.jsx(o,{scope:v,itemMap:b,collectionRef:x,children:y})};i.displayName=t;const a=e+"CollectionSlot",l=zt(a),u=w.forwardRef((p,v)=>{const{scope:y,children:x}=p,b=s(a,y),E=ue(v,b.collectionRef);return O.jsx(l,{ref:E,children:x})});u.displayName=a;const f=e+"CollectionItemSlot",c="data-radix-collection-item",m=zt(f),h=w.forwardRef((p,v)=>{const{scope:y,children:x,...b}=p,E=w.useRef(null),S=ue(v,E),T=s(f,y);return w.useEffect(()=>(T.itemMap.set(E,{ref:E,...b}),()=>void T.itemMap.delete(E))),O.jsx(m,{[c]:"",ref:S,children:x})});h.displayName=f;function g(p){const v=s(e+"CollectionConsumer",p);return w.useCallback(()=>{const x=v.collectionRef.current;if(!x)return[];const b=Array.from(x.querySelectorAll(`[${c}]`));return Array.from(v.itemMap.values()).sort((T,C)=>b.indexOf(T.ref.current)-b.indexOf(C.ref.current))},[v.collectionRef,v.itemMap])}return[{Provider:i,Slot:u,ItemSlot:h},g,r]}var Pc=d.createContext(void 0);function Co(e){const t=d.useContext(Pc);return e||t||"ltr"}var Dc=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],te=Dc.reduce((e,t)=>{const n=zt(`Primitive.${t}`),r=d.forwardRef((o,s)=>{const{asChild:i,...a}=o,l=i?n:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),O.jsx(l,{...a,ref:s})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function kc(e,t){e&&Qt.flushSync(()=>e.dispatchEvent(t))}function wt(e){const t=d.useRef(e);return d.useEffect(()=>{t.current=e}),d.useMemo(()=>(...n)=>t.current?.(...n),[])}function Nc(e,t=globalThis?.document){const n=wt(e);d.useEffect(()=>{const r=o=>{o.key==="Escape"&&n(o)};return t.addEventListener("keydown",r,{capture:!0}),()=>t.removeEventListener("keydown",r,{capture:!0})},[n,t])}var Rc="DismissableLayer",ro="dismissableLayer.update",Ac="dismissableLayer.pointerDownOutside",Ic="dismissableLayer.focusOutside",ns,na=d.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),or=d.forwardRef((e,t)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:o,onFocusOutside:s,onInteractOutside:i,onDismiss:a,...l}=e,u=d.useContext(na),[f,c]=d.useState(null),m=f?.ownerDocument??globalThis?.document,[,h]=d.useState({}),g=ue(t,C=>c(C)),p=Array.from(u.layers),[v]=[...u.layersWithOutsidePointerEventsDisabled].slice(-1),y=p.indexOf(v),x=f?p.indexOf(f):-1,b=u.layersWithOutsidePointerEventsDisabled.size>0,E=x>=y,S=Wc(C=>{const M=C.target,I=[...u.branches].some(N=>N.contains(M));!E||I||(o?.(C),i?.(C),C.defaultPrevented||a?.())},m),T=Lc(C=>{const M=C.target;[...u.branches].some(N=>N.contains(M))||(s?.(C),i?.(C),C.defaultPrevented||a?.())},m);return Nc(C=>{x===u.layers.size-1&&(r?.(C),!C.defaultPrevented&&a&&(C.preventDefault(),a()))},m),d.useEffect(()=>{if(f)return n&&(u.layersWithOutsidePointerEventsDisabled.size===0&&(ns=m.body.style.pointerEvents,m.body.style.pointerEvents="none"),u.layersWithOutsidePointerEventsDisabled.add(f)),u.layers.add(f),rs(),()=>{n&&u.layersWithOutsidePointerEventsDisabled.size===1&&(m.body.style.pointerEvents=ns)}},[f,m,n,u]),d.useEffect(()=>()=>{f&&(u.layers.delete(f),u.layersWithOutsidePointerEventsDisabled.delete(f),rs())},[f,u]),d.useEffect(()=>{const C=()=>h({});return document.addEventListener(ro,C),()=>document.removeEventListener(ro,C)},[]),O.jsx(te.div,{...l,ref:g,style:{pointerEvents:b?E?"auto":"none":void 0,...e.style},onFocusCapture:G(e.onFocusCapture,T.onFocusCapture),onBlurCapture:G(e.onBlurCapture,T.onBlurCapture),onPointerDownCapture:G(e.onPointerDownCapture,S.onPointerDownCapture)})});or.displayName=Rc;var _c="DismissableLayerBranch",Fc=d.forwardRef((e,t)=>{const n=d.useContext(na),r=d.useRef(null),o=ue(t,r);return d.useEffect(()=>{const s=r.current;if(s)return n.branches.add(s),()=>{n.branches.delete(s)}},[n.branches]),O.jsx(te.div,{...e,ref:o})});Fc.displayName=_c;function Wc(e,t=globalThis?.document){const n=wt(e),r=d.useRef(!1),o=d.useRef(()=>{});return d.useEffect(()=>{const s=a=>{if(a.target&&!r.current){let l=function(){ra(Ac,n,u,{discrete:!0})};const u={originalEvent:a};a.pointerType==="touch"?(t.removeEventListener("click",o.current),o.current=l,t.addEventListener("click",o.current,{once:!0})):l()}else t.removeEventListener("click",o.current);r.current=!1},i=window.setTimeout(()=>{t.addEventListener("pointerdown",s)},0);return()=>{window.clearTimeout(i),t.removeEventListener("pointerdown",s),t.removeEventListener("click",o.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function Lc(e,t=globalThis?.document){const n=wt(e),r=d.useRef(!1);return d.useEffect(()=>{const o=s=>{s.target&&!r.current&&ra(Ic,n,{originalEvent:s},{discrete:!1})};return t.addEventListener("focusin",o),()=>t.removeEventListener("focusin",o)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function rs(){const e=new CustomEvent(ro);document.dispatchEvent(e)}function ra(e,t,n,{discrete:r}){const o=n.originalEvent.target,s=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),r?kc(o,s):o.dispatchEvent(s)}var Fr=0;function oa(){d.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??os()),document.body.insertAdjacentElement("beforeend",e[1]??os()),Fr++,()=>{Fr===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(t=>t.remove()),Fr--}},[])}function os(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var Wr="focusScope.autoFocusOnMount",Lr="focusScope.autoFocusOnUnmount",ss={bubbles:!1,cancelable:!0},$c="FocusScope",Oo=d.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:o,onUnmountAutoFocus:s,...i}=e,[a,l]=d.useState(null),u=wt(o),f=wt(s),c=d.useRef(null),m=ue(t,p=>l(p)),h=d.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;d.useEffect(()=>{if(r){let p=function(b){if(h.paused||!a)return;const E=b.target;a.contains(E)?c.current=E:ht(c.current,{select:!0})},v=function(b){if(h.paused||!a)return;const E=b.relatedTarget;E!==null&&(a.contains(E)||ht(c.current,{select:!0}))},y=function(b){if(document.activeElement===document.body)for(const S of b)S.removedNodes.length>0&&ht(a)};document.addEventListener("focusin",p),document.addEventListener("focusout",v);const x=new MutationObserver(y);return a&&x.observe(a,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",p),document.removeEventListener("focusout",v),x.disconnect()}}},[r,a,h.paused]),d.useEffect(()=>{if(a){is.add(h);const p=document.activeElement;if(!a.contains(p)){const y=new CustomEvent(Wr,ss);a.addEventListener(Wr,u),a.dispatchEvent(y),y.defaultPrevented||(jc(Uc(sa(a)),{select:!0}),document.activeElement===p&&ht(a))}return()=>{a.removeEventListener(Wr,u),setTimeout(()=>{const y=new CustomEvent(Lr,ss);a.addEventListener(Lr,f),a.dispatchEvent(y),y.defaultPrevented||ht(p??document.body,{select:!0}),a.removeEventListener(Lr,f),is.remove(h)},0)}}},[a,u,f,h]);const g=d.useCallback(p=>{if(!n&&!r||h.paused)return;const v=p.key==="Tab"&&!p.altKey&&!p.ctrlKey&&!p.metaKey,y=document.activeElement;if(v&&y){const x=p.currentTarget,[b,E]=Bc(x);b&&E?!p.shiftKey&&y===E?(p.preventDefault(),n&&ht(b,{select:!0})):p.shiftKey&&y===b&&(p.preventDefault(),n&&ht(E,{select:!0})):y===x&&p.preventDefault()}},[n,r,h.paused]);return O.jsx(te.div,{tabIndex:-1,...i,ref:m,onKeyDown:g})});Oo.displayName=$c;function jc(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(ht(r,{select:t}),document.activeElement!==n)return}function Bc(e){const t=sa(e),n=as(t,e),r=as(t.reverse(),e);return[n,r]}function sa(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function as(e,t){for(const n of e)if(!Hc(n,{upTo:t}))return n}function Hc(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function Yc(e){return e instanceof HTMLInputElement&&"select"in e}function ht(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&Yc(e)&&t&&e.select()}}var is=Vc();function Vc(){let e=[];return{add(t){const n=e[0];t!==n&&n?.pause(),e=ls(e,t),e.unshift(t)},remove(t){e=ls(e,t),e[0]?.resume()}}}function ls(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function Uc(e){return e.filter(t=>t.tagName!=="A")}var Se=globalThis?.document?d.useLayoutEffect:()=>{},zc=Kn[" useId ".trim().toString()]||(()=>{}),qc=0;function Wt(e){const[t,n]=d.useState(zc());return Se(()=>{n(r=>r??String(qc++))},[e]),e||(t?`radix-${t}`:"")}const Gc=["top","right","bottom","left"],bt=Math.min,Me=Math.max,Xn=Math.round,Ln=Math.floor,Ke=e=>({x:e,y:e}),Kc={left:"right",right:"left",bottom:"top",top:"bottom"},Xc={start:"end",end:"start"};function oo(e,t,n){return Me(e,bt(t,n))}function st(e,t){return typeof e=="function"?e(t):e}function at(e){return e.split("-")[0]}function Jt(e){return e.split("-")[1]}function To(e){return e==="x"?"y":"x"}function Mo(e){return e==="y"?"height":"width"}const Zc=new Set(["top","bottom"]);function qe(e){return Zc.has(at(e))?"y":"x"}function Po(e){return To(qe(e))}function Qc(e,t,n){n===void 0&&(n=!1);const r=Jt(e),o=Po(e),s=Mo(o);let i=o==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(i=Zn(i)),[i,Zn(i)]}function Jc(e){const t=Zn(e);return[so(e),t,so(t)]}function so(e){return e.replace(/start|end/g,t=>Xc[t])}const cs=["left","right"],us=["right","left"],eu=["top","bottom"],tu=["bottom","top"];function nu(e,t,n){switch(e){case"top":case"bottom":return n?t?us:cs:t?cs:us;case"left":case"right":return t?eu:tu;default:return[]}}function ru(e,t,n,r){const o=Jt(e);let s=nu(at(e),n==="start",r);return o&&(s=s.map(i=>i+"-"+o),t&&(s=s.concat(s.map(so)))),s}function Zn(e){return e.replace(/left|right|bottom|top/g,t=>Kc[t])}function ou(e){return{top:0,right:0,bottom:0,left:0,...e}}function aa(e){return typeof e!="number"?ou(e):{top:e,right:e,bottom:e,left:e}}function Qn(e){const{x:t,y:n,width:r,height:o}=e;return{width:r,height:o,top:n,left:t,right:t+r,bottom:n+o,x:t,y:n}}function ds(e,t,n){let{reference:r,floating:o}=e;const s=qe(t),i=Po(t),a=Mo(i),l=at(t),u=s==="y",f=r.x+r.width/2-o.width/2,c=r.y+r.height/2-o.height/2,m=r[a]/2-o[a]/2;let h;switch(l){case"top":h={x:f,y:r.y-o.height};break;case"bottom":h={x:f,y:r.y+r.height};break;case"right":h={x:r.x+r.width,y:c};break;case"left":h={x:r.x-o.width,y:c};break;default:h={x:r.x,y:r.y}}switch(Jt(t)){case"start":h[i]-=m*(n&&u?-1:1);break;case"end":h[i]+=m*(n&&u?-1:1);break}return h}const su=async(e,t,n)=>{const{placement:r="bottom",strategy:o="absolute",middleware:s=[],platform:i}=n,a=s.filter(Boolean),l=await(i.isRTL==null?void 0:i.isRTL(t));let u=await i.getElementRects({reference:e,floating:t,strategy:o}),{x:f,y:c}=ds(u,r,l),m=r,h={},g=0;for(let p=0;p({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:o,rects:s,platform:i,elements:a,middlewareData:l}=t,{element:u,padding:f=0}=st(e,t)||{};if(u==null)return{};const c=aa(f),m={x:n,y:r},h=Po(o),g=Mo(h),p=await i.getDimensions(u),v=h==="y",y=v?"top":"left",x=v?"bottom":"right",b=v?"clientHeight":"clientWidth",E=s.reference[g]+s.reference[h]-m[h]-s.floating[g],S=m[h]-s.reference[h],T=await(i.getOffsetParent==null?void 0:i.getOffsetParent(u));let C=T?T[b]:0;(!C||!await(i.isElement==null?void 0:i.isElement(T)))&&(C=a.floating[b]||s.floating[g]);const M=E/2-S/2,I=C/2-p[g]/2-1,N=bt(c[y],I),_=bt(c[x],I),B=N,R=C-p[g]-_,$=C/2-p[g]/2+M,H=oo(B,$,R),P=!l.arrow&&Jt(o)!=null&&$!==H&&s.reference[g]/2-($$<=0)){var _,B;const $=(((_=s.flip)==null?void 0:_.index)||0)+1,H=C[$];if(H&&(!(c==="alignment"?x!==qe(H):!1)||N.every(k=>qe(k.placement)===x?k.overflows[0]>0:!0)))return{data:{index:$,overflows:N},reset:{placement:H}};let P=(B=N.filter(F=>F.overflows[0]<=0).sort((F,k)=>F.overflows[1]-k.overflows[1])[0])==null?void 0:B.placement;if(!P)switch(h){case"bestFit":{var R;const F=(R=N.filter(k=>{if(T){const j=qe(k.placement);return j===x||j==="y"}return!0}).map(k=>[k.placement,k.overflows.filter(j=>j>0).reduce((j,U)=>j+U,0)]).sort((k,j)=>k[1]-j[1])[0])==null?void 0:R[0];F&&(P=F);break}case"initialPlacement":P=a;break}if(o!==P)return{reset:{placement:P}}}return{}}}};function fs(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function ms(e){return Gc.some(t=>e[t]>=0)}const lu=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...o}=st(e,t);switch(r){case"referenceHidden":{const s=await yn(t,{...o,elementContext:"reference"}),i=fs(s,n.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:ms(i)}}}case"escaped":{const s=await yn(t,{...o,altBoundary:!0}),i=fs(s,n.floating);return{data:{escapedOffsets:i,escaped:ms(i)}}}default:return{}}}}},ia=new Set(["left","top"]);async function cu(e,t){const{placement:n,platform:r,elements:o}=e,s=await(r.isRTL==null?void 0:r.isRTL(o.floating)),i=at(n),a=Jt(n),l=qe(n)==="y",u=ia.has(i)?-1:1,f=s&&l?-1:1,c=st(t,e);let{mainAxis:m,crossAxis:h,alignmentAxis:g}=typeof c=="number"?{mainAxis:c,crossAxis:0,alignmentAxis:null}:{mainAxis:c.mainAxis||0,crossAxis:c.crossAxis||0,alignmentAxis:c.alignmentAxis};return a&&typeof g=="number"&&(h=a==="end"?g*-1:g),l?{x:h*f,y:m*u}:{x:m*u,y:h*f}}const uu=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,r;const{x:o,y:s,placement:i,middlewareData:a}=t,l=await cu(t,e);return i===((n=a.offset)==null?void 0:n.placement)&&(r=a.arrow)!=null&&r.alignmentOffset?{}:{x:o+l.x,y:s+l.y,data:{...l,placement:i}}}}},du=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:o}=t,{mainAxis:s=!0,crossAxis:i=!1,limiter:a={fn:v=>{let{x:y,y:x}=v;return{x:y,y:x}}},...l}=st(e,t),u={x:n,y:r},f=await yn(t,l),c=qe(at(o)),m=To(c);let h=u[m],g=u[c];if(s){const v=m==="y"?"top":"left",y=m==="y"?"bottom":"right",x=h+f[v],b=h-f[y];h=oo(x,h,b)}if(i){const v=c==="y"?"top":"left",y=c==="y"?"bottom":"right",x=g+f[v],b=g-f[y];g=oo(x,g,b)}const p=a.fn({...t,[m]:h,[c]:g});return{...p,data:{x:p.x-n,y:p.y-r,enabled:{[m]:s,[c]:i}}}}}},fu=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:o,rects:s,middlewareData:i}=t,{offset:a=0,mainAxis:l=!0,crossAxis:u=!0}=st(e,t),f={x:n,y:r},c=qe(o),m=To(c);let h=f[m],g=f[c];const p=st(a,t),v=typeof p=="number"?{mainAxis:p,crossAxis:0}:{mainAxis:0,crossAxis:0,...p};if(l){const b=m==="y"?"height":"width",E=s.reference[m]-s.floating[b]+v.mainAxis,S=s.reference[m]+s.reference[b]-v.mainAxis;hS&&(h=S)}if(u){var y,x;const b=m==="y"?"width":"height",E=ia.has(at(o)),S=s.reference[c]-s.floating[b]+(E&&((y=i.offset)==null?void 0:y[c])||0)+(E?0:v.crossAxis),T=s.reference[c]+s.reference[b]+(E?0:((x=i.offset)==null?void 0:x[c])||0)-(E?v.crossAxis:0);gT&&(g=T)}return{[m]:h,[c]:g}}}},mu=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var n,r;const{placement:o,rects:s,platform:i,elements:a}=t,{apply:l=()=>{},...u}=st(e,t),f=await yn(t,u),c=at(o),m=Jt(o),h=qe(o)==="y",{width:g,height:p}=s.floating;let v,y;c==="top"||c==="bottom"?(v=c,y=m===(await(i.isRTL==null?void 0:i.isRTL(a.floating))?"start":"end")?"left":"right"):(y=c,v=m==="end"?"top":"bottom");const x=p-f.top-f.bottom,b=g-f.left-f.right,E=bt(p-f[v],x),S=bt(g-f[y],b),T=!t.middlewareData.shift;let C=E,M=S;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(M=b),(r=t.middlewareData.shift)!=null&&r.enabled.y&&(C=x),T&&!m){const N=Me(f.left,0),_=Me(f.right,0),B=Me(f.top,0),R=Me(f.bottom,0);h?M=g-2*(N!==0||_!==0?N+_:Me(f.left,f.right)):C=p-2*(B!==0||R!==0?B+R:Me(f.top,f.bottom))}await l({...t,availableWidth:M,availableHeight:C});const I=await i.getDimensions(a.floating);return g!==I.width||p!==I.height?{reset:{rects:!0}}:{}}}};function sr(){return typeof window<"u"}function en(e){return la(e)?(e.nodeName||"").toLowerCase():"#document"}function Pe(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Qe(e){var t;return(t=(la(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function la(e){return sr()?e instanceof Node||e instanceof Pe(e).Node:!1}function je(e){return sr()?e instanceof Element||e instanceof Pe(e).Element:!1}function Ze(e){return sr()?e instanceof HTMLElement||e instanceof Pe(e).HTMLElement:!1}function hs(e){return!sr()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof Pe(e).ShadowRoot}const hu=new Set(["inline","contents"]);function En(e){const{overflow:t,overflowX:n,overflowY:r,display:o}=Be(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!hu.has(o)}const pu=new Set(["table","td","th"]);function vu(e){return pu.has(en(e))}const gu=[":popover-open",":modal"];function ar(e){return gu.some(t=>{try{return e.matches(t)}catch{return!1}})}const yu=["transform","translate","scale","rotate","perspective"],wu=["transform","translate","scale","rotate","perspective","filter"],bu=["paint","layout","strict","content"];function Do(e){const t=ko(),n=je(e)?Be(e):e;return yu.some(r=>n[r]?n[r]!=="none":!1)||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||wu.some(r=>(n.willChange||"").includes(r))||bu.some(r=>(n.contain||"").includes(r))}function xu(e){let t=xt(e);for(;Ze(t)&&!qt(t);){if(Do(t))return t;if(ar(t))return null;t=xt(t)}return null}function ko(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}const Su=new Set(["html","body","#document"]);function qt(e){return Su.has(en(e))}function Be(e){return Pe(e).getComputedStyle(e)}function ir(e){return je(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function xt(e){if(en(e)==="html")return e;const t=e.assignedSlot||e.parentNode||hs(e)&&e.host||Qe(e);return hs(t)?t.host:t}function ca(e){const t=xt(e);return qt(t)?e.ownerDocument?e.ownerDocument.body:e.body:Ze(t)&&En(t)?t:ca(t)}function wn(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const o=ca(e),s=o===((r=e.ownerDocument)==null?void 0:r.body),i=Pe(o);if(s){const a=ao(i);return t.concat(i,i.visualViewport||[],En(o)?o:[],a&&n?wn(a):[])}return t.concat(o,wn(o,[],n))}function ao(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function ua(e){const t=Be(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const o=Ze(e),s=o?e.offsetWidth:n,i=o?e.offsetHeight:r,a=Xn(n)!==s||Xn(r)!==i;return a&&(n=s,r=i),{width:n,height:r,$:a}}function No(e){return je(e)?e:e.contextElement}function Vt(e){const t=No(e);if(!Ze(t))return Ke(1);const n=t.getBoundingClientRect(),{width:r,height:o,$:s}=ua(t);let i=(s?Xn(n.width):n.width)/r,a=(s?Xn(n.height):n.height)/o;return(!i||!Number.isFinite(i))&&(i=1),(!a||!Number.isFinite(a))&&(a=1),{x:i,y:a}}const Eu=Ke(0);function da(e){const t=Pe(e);return!ko()||!t.visualViewport?Eu:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Cu(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==Pe(e)?!1:t}function Rt(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const o=e.getBoundingClientRect(),s=No(e);let i=Ke(1);t&&(r?je(r)&&(i=Vt(r)):i=Vt(e));const a=Cu(s,n,r)?da(s):Ke(0);let l=(o.left+a.x)/i.x,u=(o.top+a.y)/i.y,f=o.width/i.x,c=o.height/i.y;if(s){const m=Pe(s),h=r&&je(r)?Pe(r):r;let g=m,p=ao(g);for(;p&&r&&h!==g;){const v=Vt(p),y=p.getBoundingClientRect(),x=Be(p),b=y.left+(p.clientLeft+parseFloat(x.paddingLeft))*v.x,E=y.top+(p.clientTop+parseFloat(x.paddingTop))*v.y;l*=v.x,u*=v.y,f*=v.x,c*=v.y,l+=b,u+=E,g=Pe(p),p=ao(g)}}return Qn({width:f,height:c,x:l,y:u})}function lr(e,t){const n=ir(e).scrollLeft;return t?t.left+n:Rt(Qe(e)).left+n}function fa(e,t){const n=e.getBoundingClientRect(),r=n.left+t.scrollLeft-lr(e,n),o=n.top+t.scrollTop;return{x:r,y:o}}function Ou(e){let{elements:t,rect:n,offsetParent:r,strategy:o}=e;const s=o==="fixed",i=Qe(r),a=t?ar(t.floating):!1;if(r===i||a&&s)return n;let l={scrollLeft:0,scrollTop:0},u=Ke(1);const f=Ke(0),c=Ze(r);if((c||!c&&!s)&&((en(r)!=="body"||En(i))&&(l=ir(r)),Ze(r))){const h=Rt(r);u=Vt(r),f.x=h.x+r.clientLeft,f.y=h.y+r.clientTop}const m=i&&!c&&!s?fa(i,l):Ke(0);return{width:n.width*u.x,height:n.height*u.y,x:n.x*u.x-l.scrollLeft*u.x+f.x+m.x,y:n.y*u.y-l.scrollTop*u.y+f.y+m.y}}function Tu(e){return Array.from(e.getClientRects())}function Mu(e){const t=Qe(e),n=ir(e),r=e.ownerDocument.body,o=Me(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),s=Me(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let i=-n.scrollLeft+lr(e);const a=-n.scrollTop;return Be(r).direction==="rtl"&&(i+=Me(t.clientWidth,r.clientWidth)-o),{width:o,height:s,x:i,y:a}}const ps=25;function Pu(e,t){const n=Pe(e),r=Qe(e),o=n.visualViewport;let s=r.clientWidth,i=r.clientHeight,a=0,l=0;if(o){s=o.width,i=o.height;const f=ko();(!f||f&&t==="fixed")&&(a=o.offsetLeft,l=o.offsetTop)}const u=lr(r);if(u<=0){const f=r.ownerDocument,c=f.body,m=getComputedStyle(c),h=f.compatMode==="CSS1Compat"&&parseFloat(m.marginLeft)+parseFloat(m.marginRight)||0,g=Math.abs(r.clientWidth-c.clientWidth-h);g<=ps&&(s-=g)}else u<=ps&&(s+=u);return{width:s,height:i,x:a,y:l}}const Du=new Set(["absolute","fixed"]);function ku(e,t){const n=Rt(e,!0,t==="fixed"),r=n.top+e.clientTop,o=n.left+e.clientLeft,s=Ze(e)?Vt(e):Ke(1),i=e.clientWidth*s.x,a=e.clientHeight*s.y,l=o*s.x,u=r*s.y;return{width:i,height:a,x:l,y:u}}function vs(e,t,n){let r;if(t==="viewport")r=Pu(e,n);else if(t==="document")r=Mu(Qe(e));else if(je(t))r=ku(t,n);else{const o=da(e);r={x:t.x-o.x,y:t.y-o.y,width:t.width,height:t.height}}return Qn(r)}function ma(e,t){const n=xt(e);return n===t||!je(n)||qt(n)?!1:Be(n).position==="fixed"||ma(n,t)}function Nu(e,t){const n=t.get(e);if(n)return n;let r=wn(e,[],!1).filter(a=>je(a)&&en(a)!=="body"),o=null;const s=Be(e).position==="fixed";let i=s?xt(e):e;for(;je(i)&&!qt(i);){const a=Be(i),l=Do(i);!l&&a.position==="fixed"&&(o=null),(s?!l&&!o:!l&&a.position==="static"&&!!o&&Du.has(o.position)||En(i)&&!l&&ma(e,i))?r=r.filter(f=>f!==i):o=a,i=xt(i)}return t.set(e,r),r}function Ru(e){let{element:t,boundary:n,rootBoundary:r,strategy:o}=e;const i=[...n==="clippingAncestors"?ar(t)?[]:Nu(t,this._c):[].concat(n),r],a=i[0],l=i.reduce((u,f)=>{const c=vs(t,f,o);return u.top=Me(c.top,u.top),u.right=bt(c.right,u.right),u.bottom=bt(c.bottom,u.bottom),u.left=Me(c.left,u.left),u},vs(t,a,o));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function Au(e){const{width:t,height:n}=ua(e);return{width:t,height:n}}function Iu(e,t,n){const r=Ze(t),o=Qe(t),s=n==="fixed",i=Rt(e,!0,s,t);let a={scrollLeft:0,scrollTop:0};const l=Ke(0);function u(){l.x=lr(o)}if(r||!r&&!s)if((en(t)!=="body"||En(o))&&(a=ir(t)),r){const h=Rt(t,!0,s,t);l.x=h.x+t.clientLeft,l.y=h.y+t.clientTop}else o&&u();s&&!r&&o&&u();const f=o&&!r&&!s?fa(o,a):Ke(0),c=i.left+a.scrollLeft-l.x-f.x,m=i.top+a.scrollTop-l.y-f.y;return{x:c,y:m,width:i.width,height:i.height}}function $r(e){return Be(e).position==="static"}function gs(e,t){if(!Ze(e)||Be(e).position==="fixed")return null;if(t)return t(e);let n=e.offsetParent;return Qe(e)===n&&(n=n.ownerDocument.body),n}function ha(e,t){const n=Pe(e);if(ar(e))return n;if(!Ze(e)){let o=xt(e);for(;o&&!qt(o);){if(je(o)&&!$r(o))return o;o=xt(o)}return n}let r=gs(e,t);for(;r&&vu(r)&&$r(r);)r=gs(r,t);return r&&qt(r)&&$r(r)&&!Do(r)?n:r||xu(e)||n}const _u=async function(e){const t=this.getOffsetParent||ha,n=this.getDimensions,r=await n(e.floating);return{reference:Iu(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function Fu(e){return Be(e).direction==="rtl"}const Wu={convertOffsetParentRelativeRectToViewportRelativeRect:Ou,getDocumentElement:Qe,getClippingRect:Ru,getOffsetParent:ha,getElementRects:_u,getClientRects:Tu,getDimensions:Au,getScale:Vt,isElement:je,isRTL:Fu};function pa(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function Lu(e,t){let n=null,r;const o=Qe(e);function s(){var a;clearTimeout(r),(a=n)==null||a.disconnect(),n=null}function i(a,l){a===void 0&&(a=!1),l===void 0&&(l=1),s();const u=e.getBoundingClientRect(),{left:f,top:c,width:m,height:h}=u;if(a||t(),!m||!h)return;const g=Ln(c),p=Ln(o.clientWidth-(f+m)),v=Ln(o.clientHeight-(c+h)),y=Ln(f),b={rootMargin:-g+"px "+-p+"px "+-v+"px "+-y+"px",threshold:Me(0,bt(1,l))||1};let E=!0;function S(T){const C=T[0].intersectionRatio;if(C!==l){if(!E)return i();C?i(!1,C):r=setTimeout(()=>{i(!1,1e-7)},1e3)}C===1&&!pa(u,e.getBoundingClientRect())&&i(),E=!1}try{n=new IntersectionObserver(S,{...b,root:o.ownerDocument})}catch{n=new IntersectionObserver(S,b)}n.observe(e)}return i(!0),s}function $u(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:o=!0,ancestorResize:s=!0,elementResize:i=typeof ResizeObserver=="function",layoutShift:a=typeof IntersectionObserver=="function",animationFrame:l=!1}=r,u=No(e),f=o||s?[...u?wn(u):[],...wn(t)]:[];f.forEach(y=>{o&&y.addEventListener("scroll",n,{passive:!0}),s&&y.addEventListener("resize",n)});const c=u&&a?Lu(u,n):null;let m=-1,h=null;i&&(h=new ResizeObserver(y=>{let[x]=y;x&&x.target===u&&h&&(h.unobserve(t),cancelAnimationFrame(m),m=requestAnimationFrame(()=>{var b;(b=h)==null||b.observe(t)})),n()}),u&&!l&&h.observe(u),h.observe(t));let g,p=l?Rt(e):null;l&&v();function v(){const y=Rt(e);p&&!pa(p,y)&&n(),p=y,g=requestAnimationFrame(v)}return n(),()=>{var y;f.forEach(x=>{o&&x.removeEventListener("scroll",n),s&&x.removeEventListener("resize",n)}),c?.(),(y=h)==null||y.disconnect(),h=null,l&&cancelAnimationFrame(g)}}const ju=uu,Bu=du,Hu=iu,Yu=mu,Vu=lu,ys=au,Uu=fu,zu=(e,t,n)=>{const r=new Map,o={platform:Wu,...n},s={...o.platform,_c:r};return su(e,t,{...o,platform:s})};var qu=typeof document<"u",Gu=function(){},zn=qu?d.useLayoutEffect:Gu;function Jn(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,o;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!Jn(e[r],t[r]))return!1;return!0}if(o=Object.keys(e),n=o.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,o[r]))return!1;for(r=n;r--!==0;){const s=o[r];if(!(s==="_owner"&&e.$$typeof)&&!Jn(e[s],t[s]))return!1}return!0}return e!==e&&t!==t}function va(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function ws(e,t){const n=va(e);return Math.round(t*n)/n}function jr(e){const t=d.useRef(e);return zn(()=>{t.current=e}),t}function Ku(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:o,elements:{reference:s,floating:i}={},transform:a=!0,whileElementsMounted:l,open:u}=e,[f,c]=d.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[m,h]=d.useState(r);Jn(m,r)||h(r);const[g,p]=d.useState(null),[v,y]=d.useState(null),x=d.useCallback(k=>{k!==T.current&&(T.current=k,p(k))},[]),b=d.useCallback(k=>{k!==C.current&&(C.current=k,y(k))},[]),E=s||g,S=i||v,T=d.useRef(null),C=d.useRef(null),M=d.useRef(f),I=l!=null,N=jr(l),_=jr(o),B=jr(u),R=d.useCallback(()=>{if(!T.current||!C.current)return;const k={placement:t,strategy:n,middleware:m};_.current&&(k.platform=_.current),zu(T.current,C.current,k).then(j=>{const U={...j,isPositioned:B.current!==!1};$.current&&!Jn(M.current,U)&&(M.current=U,Qt.flushSync(()=>{c(U)}))})},[m,t,n,_,B]);zn(()=>{u===!1&&M.current.isPositioned&&(M.current.isPositioned=!1,c(k=>({...k,isPositioned:!1})))},[u]);const $=d.useRef(!1);zn(()=>($.current=!0,()=>{$.current=!1}),[]),zn(()=>{if(E&&(T.current=E),S&&(C.current=S),E&&S){if(N.current)return N.current(E,S,R);R()}},[E,S,R,N,I]);const H=d.useMemo(()=>({reference:T,floating:C,setReference:x,setFloating:b}),[x,b]),P=d.useMemo(()=>({reference:E,floating:S}),[E,S]),F=d.useMemo(()=>{const k={position:n,left:0,top:0};if(!P.floating)return k;const j=ws(P.floating,f.x),U=ws(P.floating,f.y);return a?{...k,transform:"translate("+j+"px, "+U+"px)",...va(P.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:j,top:U}},[n,a,P.floating,f.x,f.y]);return d.useMemo(()=>({...f,update:R,refs:H,elements:P,floatingStyles:F}),[f,R,H,P,F])}const Xu=e=>{function t(n){return{}.hasOwnProperty.call(n,"current")}return{name:"arrow",options:e,fn(n){const{element:r,padding:o}=typeof e=="function"?e(n):e;return r&&t(r)?r.current!=null?ys({element:r.current,padding:o}).fn(n):{}:r?ys({element:r,padding:o}).fn(n):{}}}},Zu=(e,t)=>({...ju(e),options:[e,t]}),Qu=(e,t)=>({...Bu(e),options:[e,t]}),Ju=(e,t)=>({...Uu(e),options:[e,t]}),ed=(e,t)=>({...Hu(e),options:[e,t]}),td=(e,t)=>({...Yu(e),options:[e,t]}),nd=(e,t)=>({...Vu(e),options:[e,t]}),rd=(e,t)=>({...Xu(e),options:[e,t]});var od="Arrow",ga=d.forwardRef((e,t)=>{const{children:n,width:r=10,height:o=5,...s}=e;return O.jsx(te.svg,{...s,ref:t,width:r,height:o,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?n:O.jsx("polygon",{points:"0,0 30,0 15,10"})})});ga.displayName=od;var sd=ga;function ad(e){const[t,n]=d.useState(void 0);return Se(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(o=>{if(!Array.isArray(o)||!o.length)return;const s=o[0];let i,a;if("borderBoxSize"in s){const l=s.borderBoxSize,u=Array.isArray(l)?l[0]:l;i=u.inlineSize,a=u.blockSize}else i=e.offsetWidth,a=e.offsetHeight;n({width:i,height:a})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else n(void 0)},[e]),t}var Ro="Popper",[ya,tn]=Ft(Ro),[id,wa]=ya(Ro),ba=e=>{const{__scopePopper:t,children:n}=e,[r,o]=d.useState(null);return O.jsx(id,{scope:t,anchor:r,onAnchorChange:o,children:n})};ba.displayName=Ro;var xa="PopperAnchor",Sa=d.forwardRef((e,t)=>{const{__scopePopper:n,virtualRef:r,...o}=e,s=wa(xa,n),i=d.useRef(null),a=ue(t,i),l=d.useRef(null);return d.useEffect(()=>{const u=l.current;l.current=r?.current||i.current,u!==l.current&&s.onAnchorChange(l.current)}),r?null:O.jsx(te.div,{...o,ref:a})});Sa.displayName=xa;var Ao="PopperContent",[ld,cd]=ya(Ao),Ea=d.forwardRef((e,t)=>{const{__scopePopper:n,side:r="bottom",sideOffset:o=0,align:s="center",alignOffset:i=0,arrowPadding:a=0,avoidCollisions:l=!0,collisionBoundary:u=[],collisionPadding:f=0,sticky:c="partial",hideWhenDetached:m=!1,updatePositionStrategy:h="optimized",onPlaced:g,...p}=e,v=wa(Ao,n),[y,x]=d.useState(null),b=ue(t,A=>x(A)),[E,S]=d.useState(null),T=ad(E),C=T?.width??0,M=T?.height??0,I=r+(s!=="center"?"-"+s:""),N=typeof f=="number"?f:{top:0,right:0,bottom:0,left:0,...f},_=Array.isArray(u)?u:[u],B=_.length>0,R={padding:N,boundary:_.filter(dd),altBoundary:B},{refs:$,floatingStyles:H,placement:P,isPositioned:F,middlewareData:k}=Ku({strategy:"fixed",placement:I,whileElementsMounted:(...A)=>$u(...A,{animationFrame:h==="always"}),elements:{reference:v.anchor},middleware:[Zu({mainAxis:o+M,alignmentAxis:i}),l&&Qu({mainAxis:!0,crossAxis:!1,limiter:c==="partial"?Ju():void 0,...R}),l&&ed({...R}),td({...R,apply:({elements:A,rects:L,availableWidth:Z,availableHeight:J})=>{const{width:ee,height:ne}=L.reference,ge=A.floating.style;ge.setProperty("--radix-popper-available-width",`${Z}px`),ge.setProperty("--radix-popper-available-height",`${J}px`),ge.setProperty("--radix-popper-anchor-width",`${ee}px`),ge.setProperty("--radix-popper-anchor-height",`${ne}px`)}}),E&&rd({element:E,padding:a}),fd({arrowWidth:C,arrowHeight:M}),m&&nd({strategy:"referenceHidden",...R})]}),[j,U]=Ta(P),oe=wt(g);Se(()=>{F&&oe?.()},[F,oe]);const me=k.arrow?.x,D=k.arrow?.y,q=k.arrow?.centerOffset!==0,[K,le]=d.useState();return Se(()=>{y&&le(window.getComputedStyle(y).zIndex)},[y]),O.jsx("div",{ref:$.setFloating,"data-radix-popper-content-wrapper":"",style:{...H,transform:F?H.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:K,"--radix-popper-transform-origin":[k.transformOrigin?.x,k.transformOrigin?.y].join(" "),...k.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:O.jsx(ld,{scope:n,placedSide:j,onArrowChange:S,arrowX:me,arrowY:D,shouldHideArrow:q,children:O.jsx(te.div,{"data-side":j,"data-align":U,...p,ref:b,style:{...p.style,animation:F?void 0:"none"}})})})});Ea.displayName=Ao;var Ca="PopperArrow",ud={top:"bottom",right:"left",bottom:"top",left:"right"},Oa=d.forwardRef(function(t,n){const{__scopePopper:r,...o}=t,s=cd(Ca,r),i=ud[s.placedSide];return O.jsx("span",{ref:s.onArrowChange,style:{position:"absolute",left:s.arrowX,top:s.arrowY,[i]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[s.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[s.placedSide],visibility:s.shouldHideArrow?"hidden":void 0},children:O.jsx(sd,{...o,ref:n,style:{...o.style,display:"block"}})})});Oa.displayName=Ca;function dd(e){return e!==null}var fd=e=>({name:"transformOrigin",options:e,fn(t){const{placement:n,rects:r,middlewareData:o}=t,i=o.arrow?.centerOffset!==0,a=i?0:e.arrowWidth,l=i?0:e.arrowHeight,[u,f]=Ta(n),c={start:"0%",center:"50%",end:"100%"}[f],m=(o.arrow?.x??0)+a/2,h=(o.arrow?.y??0)+l/2;let g="",p="";return u==="bottom"?(g=i?c:`${m}px`,p=`${-l}px`):u==="top"?(g=i?c:`${m}px`,p=`${r.floating.height+l}px`):u==="right"?(g=`${-l}px`,p=i?c:`${h}px`):u==="left"&&(g=`${r.floating.width+l}px`,p=i?c:`${h}px`),{data:{x:g,y:p}}}});function Ta(e){const[t,n="center"]=e.split("-");return[t,n]}var Io=ba,cr=Sa,_o=Ea,Fo=Oa,md="Portal",ur=d.forwardRef((e,t)=>{const{container:n,...r}=e,[o,s]=d.useState(!1);Se(()=>s(!0),[]);const i=n||o&&globalThis?.document?.body;return i?Qs.createPortal(O.jsx(te.div,{...r,ref:t}),i):null});ur.displayName=md;var hd=Kn[" useInsertionEffect ".trim().toString()]||Se;function Gt({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){const[o,s,i]=pd({defaultProp:t,onChange:n}),a=e!==void 0,l=a?e:o;{const f=d.useRef(e!==void 0);d.useEffect(()=>{const c=f.current;c!==a&&console.warn(`${r} is changing from ${c?"controlled":"uncontrolled"} to ${a?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),f.current=a},[a,r])}const u=d.useCallback(f=>{if(a){const c=vd(f)?f(e):f;c!==e&&i.current?.(c)}else s(f)},[a,e,s,i]);return[l,u]}function pd({defaultProp:e,onChange:t}){const[n,r]=d.useState(e),o=d.useRef(n),s=d.useRef(t);return hd(()=>{s.current=t},[t]),d.useEffect(()=>{o.current!==n&&(s.current?.(n),o.current=n)},[n,o]),[n,r,s]}function vd(e){return typeof e=="function"}function gd(e){const t=d.useRef({value:e,previous:e});return d.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}var Ma=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),yd="VisuallyHidden",Pa=d.forwardRef((e,t)=>O.jsx(te.span,{...e,ref:t,style:{...Ma,...e.style}}));Pa.displayName=yd;var wd=Pa,bd=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},jt=new WeakMap,$n=new WeakMap,jn={},Br=0,Da=function(e){return e&&(e.host||Da(e.parentNode))},xd=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=Da(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},Sd=function(e,t,n,r){var o=xd(t,Array.isArray(e)?e:[e]);jn[n]||(jn[n]=new WeakMap);var s=jn[n],i=[],a=new Set,l=new Set(o),u=function(c){!c||a.has(c)||(a.add(c),u(c.parentNode))};o.forEach(u);var f=function(c){!c||l.has(c)||Array.prototype.forEach.call(c.children,function(m){if(a.has(m))f(m);else try{var h=m.getAttribute(r),g=h!==null&&h!=="false",p=(jt.get(m)||0)+1,v=(s.get(m)||0)+1;jt.set(m,p),s.set(m,v),i.push(m),p===1&&g&&$n.set(m,!0),v===1&&m.setAttribute(n,"true"),g||m.setAttribute(r,"true")}catch(y){console.error("aria-hidden: cannot operate on ",m,y)}})};return f(t),a.clear(),Br++,function(){i.forEach(function(c){var m=jt.get(c)-1,h=s.get(c)-1;jt.set(c,m),s.set(c,h),m||($n.has(c)||c.removeAttribute(r),$n.delete(c)),h||c.removeAttribute(n)}),Br--,Br||(jt=new WeakMap,jt=new WeakMap,$n=new WeakMap,jn={})}},ka=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),o=bd(e);return o?(r.push.apply(r,Array.from(o.querySelectorAll("[aria-live], script"))),Sd(r,o,n,"aria-hidden")):function(){return null}},ze=function(){return ze=Object.assign||function(t){for(var n,r=1,o=arguments.length;r"u")return $d;var t=jd(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},Hd=Ia(),Ut="data-scroll-locked",Yd=function(e,t,n,r){var o=e.left,s=e.top,i=e.right,a=e.gap;return n===void 0&&(n="margin"),` + .`.concat(Cd,` { + overflow: hidden `).concat(r,`; + padding-right: `).concat(a,"px ").concat(r,`; + } + body[`).concat(Ut,`] { + overflow: hidden `).concat(r,`; + overscroll-behavior: contain; + `).concat([t&&"position: relative ".concat(r,";"),n==="margin"&&` + padding-left: `.concat(o,`px; + padding-top: `).concat(s,`px; + padding-right: `).concat(i,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(a,"px ").concat(r,`; + `),n==="padding"&&"padding-right: ".concat(a,"px ").concat(r,";")].filter(Boolean).join(""),` + } + + .`).concat(qn,` { + right: `).concat(a,"px ").concat(r,`; + } + + .`).concat(Gn,` { + margin-right: `).concat(a,"px ").concat(r,`; + } + + .`).concat(qn," .").concat(qn,` { + right: 0 `).concat(r,`; + } + + .`).concat(Gn," .").concat(Gn,` { + margin-right: 0 `).concat(r,`; + } + + body[`).concat(Ut,`] { + `).concat(Od,": ").concat(a,`px; + } +`)},xs=function(){var e=parseInt(document.body.getAttribute(Ut)||"0",10);return isFinite(e)?e:0},Vd=function(){d.useEffect(function(){return document.body.setAttribute(Ut,(xs()+1).toString()),function(){var e=xs()-1;e<=0?document.body.removeAttribute(Ut):document.body.setAttribute(Ut,e.toString())}},[])},Ud=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,o=r===void 0?"margin":r;Vd();var s=d.useMemo(function(){return Bd(o)},[o]);return d.createElement(Hd,{styles:Yd(s,!t,o,n?"":"!important")})},io=!1;if(typeof window<"u")try{var Bn=Object.defineProperty({},"passive",{get:function(){return io=!0,!0}});window.addEventListener("test",Bn,Bn),window.removeEventListener("test",Bn,Bn)}catch{io=!1}var Bt=io?{passive:!1}:!1,zd=function(e){return e.tagName==="TEXTAREA"},_a=function(e,t){if(!(e instanceof Element))return!1;var n=window.getComputedStyle(e);return n[t]!=="hidden"&&!(n.overflowY===n.overflowX&&!zd(e)&&n[t]==="visible")},qd=function(e){return _a(e,"overflowY")},Gd=function(e){return _a(e,"overflowX")},Ss=function(e,t){var n=t.ownerDocument,r=t;do{typeof ShadowRoot<"u"&&r instanceof ShadowRoot&&(r=r.host);var o=Fa(e,r);if(o){var s=Wa(e,r),i=s[1],a=s[2];if(i>a)return!0}r=r.parentNode}while(r&&r!==n.body);return!1},Kd=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},Xd=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},Fa=function(e,t){return e==="v"?qd(t):Gd(t)},Wa=function(e,t){return e==="v"?Kd(t):Xd(t)},Zd=function(e,t){return e==="h"&&t==="rtl"?-1:1},Qd=function(e,t,n,r,o){var s=Zd(e,window.getComputedStyle(t).direction),i=s*r,a=n.target,l=t.contains(a),u=!1,f=i>0,c=0,m=0;do{if(!a)break;var h=Wa(e,a),g=h[0],p=h[1],v=h[2],y=p-v-s*g;(g||y)&&Fa(e,a)&&(c+=y,m+=g);var x=a.parentNode;a=x&&x.nodeType===Node.DOCUMENT_FRAGMENT_NODE?x.host:x}while(!l&&a!==document.body||l&&(t.contains(a)||t===a));return(f&&Math.abs(c)<1||!f&&Math.abs(m)<1)&&(u=!0),u},Hn=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Es=function(e){return[e.deltaX,e.deltaY]},Cs=function(e){return e&&"current"in e?e.current:e},Jd=function(e,t){return e[0]===t[0]&&e[1]===t[1]},ef=function(e){return` + .block-interactivity-`.concat(e,` {pointer-events: none;} + .allow-interactivity-`).concat(e,` {pointer-events: all;} +`)},tf=0,Ht=[];function nf(e){var t=d.useRef([]),n=d.useRef([0,0]),r=d.useRef(),o=d.useState(tf++)[0],s=d.useState(Ia)[0],i=d.useRef(e);d.useEffect(function(){i.current=e},[e]),d.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(o));var p=Ed([e.lockRef.current],(e.shards||[]).map(Cs),!0).filter(Boolean);return p.forEach(function(v){return v.classList.add("allow-interactivity-".concat(o))}),function(){document.body.classList.remove("block-interactivity-".concat(o)),p.forEach(function(v){return v.classList.remove("allow-interactivity-".concat(o))})}}},[e.inert,e.lockRef.current,e.shards]);var a=d.useCallback(function(p,v){if("touches"in p&&p.touches.length===2||p.type==="wheel"&&p.ctrlKey)return!i.current.allowPinchZoom;var y=Hn(p),x=n.current,b="deltaX"in p?p.deltaX:x[0]-y[0],E="deltaY"in p?p.deltaY:x[1]-y[1],S,T=p.target,C=Math.abs(b)>Math.abs(E)?"h":"v";if("touches"in p&&C==="h"&&T.type==="range")return!1;var M=Ss(C,T);if(!M)return!0;if(M?S=C:(S=C==="v"?"h":"v",M=Ss(C,T)),!M)return!1;if(!r.current&&"changedTouches"in p&&(b||E)&&(r.current=S),!S)return!0;var I=r.current||S;return Qd(I,v,p,I==="h"?b:E)},[]),l=d.useCallback(function(p){var v=p;if(!(!Ht.length||Ht[Ht.length-1]!==s)){var y="deltaY"in v?Es(v):Hn(v),x=t.current.filter(function(S){return S.name===v.type&&(S.target===v.target||v.target===S.shadowParent)&&Jd(S.delta,y)})[0];if(x&&x.should){v.cancelable&&v.preventDefault();return}if(!x){var b=(i.current.shards||[]).map(Cs).filter(Boolean).filter(function(S){return S.contains(v.target)}),E=b.length>0?a(v,b[0]):!i.current.noIsolation;E&&v.cancelable&&v.preventDefault()}}},[]),u=d.useCallback(function(p,v,y,x){var b={name:p,delta:v,target:y,should:x,shadowParent:rf(y)};t.current.push(b),setTimeout(function(){t.current=t.current.filter(function(E){return E!==b})},1)},[]),f=d.useCallback(function(p){n.current=Hn(p),r.current=void 0},[]),c=d.useCallback(function(p){u(p.type,Es(p),p.target,a(p,e.lockRef.current))},[]),m=d.useCallback(function(p){u(p.type,Hn(p),p.target,a(p,e.lockRef.current))},[]);d.useEffect(function(){return Ht.push(s),e.setCallbacks({onScrollCapture:c,onWheelCapture:c,onTouchMoveCapture:m}),document.addEventListener("wheel",l,Bt),document.addEventListener("touchmove",l,Bt),document.addEventListener("touchstart",f,Bt),function(){Ht=Ht.filter(function(p){return p!==s}),document.removeEventListener("wheel",l,Bt),document.removeEventListener("touchmove",l,Bt),document.removeEventListener("touchstart",f,Bt)}},[]);var h=e.removeScrollBar,g=e.inert;return d.createElement(d.Fragment,null,g?d.createElement(s,{styles:ef(o)}):null,h?d.createElement(Ud,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function rf(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const of=Rd(Aa,nf);var Wo=d.forwardRef(function(e,t){return d.createElement(dr,ze({},e,{ref:t,sideCar:of}))});Wo.classNames=dr.classNames;var sf=[" ","Enter","ArrowUp","ArrowDown"],af=[" ","Enter"],At="Select",[fr,mr,lf]=ta(At),[nn,Ry]=Ft(At,[lf,tn]),hr=tn(),[cf,St]=nn(At),[uf,df]=nn(At),La=e=>{const{__scopeSelect:t,children:n,open:r,defaultOpen:o,onOpenChange:s,value:i,defaultValue:a,onValueChange:l,dir:u,name:f,autoComplete:c,disabled:m,required:h,form:g}=e,p=hr(t),[v,y]=d.useState(null),[x,b]=d.useState(null),[E,S]=d.useState(!1),T=Co(u),[C,M]=Gt({prop:r,defaultProp:o??!1,onChange:s,caller:At}),[I,N]=Gt({prop:i,defaultProp:a,onChange:l,caller:At}),_=d.useRef(null),B=v?g||!!v.closest("form"):!0,[R,$]=d.useState(new Set),H=Array.from(R).map(P=>P.props.value).join(";");return O.jsx(Io,{...p,children:O.jsxs(cf,{required:h,scope:t,trigger:v,onTriggerChange:y,valueNode:x,onValueNodeChange:b,valueNodeHasChildren:E,onValueNodeHasChildrenChange:S,contentId:Wt(),value:I,onValueChange:N,open:C,onOpenChange:M,dir:T,triggerPointerDownPosRef:_,disabled:m,children:[O.jsx(fr.Provider,{scope:t,children:O.jsx(uf,{scope:e.__scopeSelect,onNativeOptionAdd:d.useCallback(P=>{$(F=>new Set(F).add(P))},[]),onNativeOptionRemove:d.useCallback(P=>{$(F=>{const k=new Set(F);return k.delete(P),k})},[]),children:n})}),B?O.jsxs(ai,{"aria-hidden":!0,required:h,tabIndex:-1,name:f,autoComplete:c,value:I,onChange:P=>N(P.target.value),disabled:m,form:g,children:[I===void 0?O.jsx("option",{value:""}):null,Array.from(R)]},H):null]})})};La.displayName=At;var $a="SelectTrigger",ja=d.forwardRef((e,t)=>{const{__scopeSelect:n,disabled:r=!1,...o}=e,s=hr(n),i=St($a,n),a=i.disabled||r,l=ue(t,i.onTriggerChange),u=mr(n),f=d.useRef("touch"),[c,m,h]=li(p=>{const v=u().filter(b=>!b.disabled),y=v.find(b=>b.value===i.value),x=ci(v,p,y);x!==void 0&&i.onValueChange(x.value)}),g=p=>{a||(i.onOpenChange(!0),h()),p&&(i.triggerPointerDownPosRef.current={x:Math.round(p.pageX),y:Math.round(p.pageY)})};return O.jsx(cr,{asChild:!0,...s,children:O.jsx(te.button,{type:"button",role:"combobox","aria-controls":i.contentId,"aria-expanded":i.open,"aria-required":i.required,"aria-autocomplete":"none",dir:i.dir,"data-state":i.open?"open":"closed",disabled:a,"data-disabled":a?"":void 0,"data-placeholder":ii(i.value)?"":void 0,...o,ref:l,onClick:G(o.onClick,p=>{p.currentTarget.focus(),f.current!=="mouse"&&g(p)}),onPointerDown:G(o.onPointerDown,p=>{f.current=p.pointerType;const v=p.target;v.hasPointerCapture(p.pointerId)&&v.releasePointerCapture(p.pointerId),p.button===0&&p.ctrlKey===!1&&p.pointerType==="mouse"&&(g(p),p.preventDefault())}),onKeyDown:G(o.onKeyDown,p=>{const v=c.current!=="";!(p.ctrlKey||p.altKey||p.metaKey)&&p.key.length===1&&m(p.key),!(v&&p.key===" ")&&sf.includes(p.key)&&(g(),p.preventDefault())})})})});ja.displayName=$a;var Ba="SelectValue",Ha=d.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:o,children:s,placeholder:i="",...a}=e,l=St(Ba,n),{onValueNodeHasChildrenChange:u}=l,f=s!==void 0,c=ue(t,l.onValueNodeChange);return Se(()=>{u(f)},[u,f]),O.jsx(te.span,{...a,ref:c,style:{pointerEvents:"none"},children:ii(l.value)?O.jsx(O.Fragment,{children:i}):s})});Ha.displayName=Ba;var ff="SelectIcon",Ya=d.forwardRef((e,t)=>{const{__scopeSelect:n,children:r,...o}=e;return O.jsx(te.span,{"aria-hidden":!0,...o,ref:t,children:r||"▼"})});Ya.displayName=ff;var mf="SelectPortal",Va=e=>O.jsx(ur,{asChild:!0,...e});Va.displayName=mf;var It="SelectContent",Ua=d.forwardRef((e,t)=>{const n=St(It,e.__scopeSelect),[r,o]=d.useState();if(Se(()=>{o(new DocumentFragment)},[]),!n.open){const s=r;return s?Qt.createPortal(O.jsx(za,{scope:e.__scopeSelect,children:O.jsx(fr.Slot,{scope:e.__scopeSelect,children:O.jsx("div",{children:e.children})})}),s):null}return O.jsx(qa,{...e,ref:t})});Ua.displayName=It;var We=10,[za,Et]=nn(It),hf="SelectContentImpl",pf=zt("SelectContent.RemoveScroll"),qa=d.forwardRef((e,t)=>{const{__scopeSelect:n,position:r="item-aligned",onCloseAutoFocus:o,onEscapeKeyDown:s,onPointerDownOutside:i,side:a,sideOffset:l,align:u,alignOffset:f,arrowPadding:c,collisionBoundary:m,collisionPadding:h,sticky:g,hideWhenDetached:p,avoidCollisions:v,...y}=e,x=St(It,n),[b,E]=d.useState(null),[S,T]=d.useState(null),C=ue(t,A=>E(A)),[M,I]=d.useState(null),[N,_]=d.useState(null),B=mr(n),[R,$]=d.useState(!1),H=d.useRef(!1);d.useEffect(()=>{if(b)return ka(b)},[b]),oa();const P=d.useCallback(A=>{const[L,...Z]=B().map(ne=>ne.ref.current),[J]=Z.slice(-1),ee=document.activeElement;for(const ne of A)if(ne===ee||(ne?.scrollIntoView({block:"nearest"}),ne===L&&S&&(S.scrollTop=0),ne===J&&S&&(S.scrollTop=S.scrollHeight),ne?.focus(),document.activeElement!==ee))return},[B,S]),F=d.useCallback(()=>P([M,b]),[P,M,b]);d.useEffect(()=>{R&&F()},[R,F]);const{onOpenChange:k,triggerPointerDownPosRef:j}=x;d.useEffect(()=>{if(b){let A={x:0,y:0};const L=J=>{A={x:Math.abs(Math.round(J.pageX)-(j.current?.x??0)),y:Math.abs(Math.round(J.pageY)-(j.current?.y??0))}},Z=J=>{A.x<=10&&A.y<=10?J.preventDefault():b.contains(J.target)||k(!1),document.removeEventListener("pointermove",L),j.current=null};return j.current!==null&&(document.addEventListener("pointermove",L),document.addEventListener("pointerup",Z,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",L),document.removeEventListener("pointerup",Z,{capture:!0})}}},[b,k,j]),d.useEffect(()=>{const A=()=>k(!1);return window.addEventListener("blur",A),window.addEventListener("resize",A),()=>{window.removeEventListener("blur",A),window.removeEventListener("resize",A)}},[k]);const[U,oe]=li(A=>{const L=B().filter(ee=>!ee.disabled),Z=L.find(ee=>ee.ref.current===document.activeElement),J=ci(L,A,Z);J&&setTimeout(()=>J.ref.current.focus())}),me=d.useCallback((A,L,Z)=>{const J=!H.current&&!Z;(x.value!==void 0&&x.value===L||J)&&(I(A),J&&(H.current=!0))},[x.value]),D=d.useCallback(()=>b?.focus(),[b]),q=d.useCallback((A,L,Z)=>{const J=!H.current&&!Z;(x.value!==void 0&&x.value===L||J)&&_(A)},[x.value]),K=r==="popper"?lo:Ga,le=K===lo?{side:a,sideOffset:l,align:u,alignOffset:f,arrowPadding:c,collisionBoundary:m,collisionPadding:h,sticky:g,hideWhenDetached:p,avoidCollisions:v}:{};return O.jsx(za,{scope:n,content:b,viewport:S,onViewportChange:T,itemRefCallback:me,selectedItem:M,onItemLeave:D,itemTextRefCallback:q,focusSelectedItem:F,selectedItemText:N,position:r,isPositioned:R,searchRef:U,children:O.jsx(Wo,{as:pf,allowPinchZoom:!0,children:O.jsx(Oo,{asChild:!0,trapped:x.open,onMountAutoFocus:A=>{A.preventDefault()},onUnmountAutoFocus:G(o,A=>{x.trigger?.focus({preventScroll:!0}),A.preventDefault()}),children:O.jsx(or,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:s,onPointerDownOutside:i,onFocusOutside:A=>A.preventDefault(),onDismiss:()=>x.onOpenChange(!1),children:O.jsx(K,{role:"listbox",id:x.contentId,"data-state":x.open?"open":"closed",dir:x.dir,onContextMenu:A=>A.preventDefault(),...y,...le,onPlaced:()=>$(!0),ref:C,style:{display:"flex",flexDirection:"column",outline:"none",...y.style},onKeyDown:G(y.onKeyDown,A=>{const L=A.ctrlKey||A.altKey||A.metaKey;if(A.key==="Tab"&&A.preventDefault(),!L&&A.key.length===1&&oe(A.key),["ArrowUp","ArrowDown","Home","End"].includes(A.key)){let J=B().filter(ee=>!ee.disabled).map(ee=>ee.ref.current);if(["ArrowUp","End"].includes(A.key)&&(J=J.slice().reverse()),["ArrowUp","ArrowDown"].includes(A.key)){const ee=A.target,ne=J.indexOf(ee);J=J.slice(ne+1)}setTimeout(()=>P(J)),A.preventDefault()}})})})})})})});qa.displayName=hf;var vf="SelectItemAlignedPosition",Ga=d.forwardRef((e,t)=>{const{__scopeSelect:n,onPlaced:r,...o}=e,s=St(It,n),i=Et(It,n),[a,l]=d.useState(null),[u,f]=d.useState(null),c=ue(t,C=>f(C)),m=mr(n),h=d.useRef(!1),g=d.useRef(!0),{viewport:p,selectedItem:v,selectedItemText:y,focusSelectedItem:x}=i,b=d.useCallback(()=>{if(s.trigger&&s.valueNode&&a&&u&&p&&v&&y){const C=s.trigger.getBoundingClientRect(),M=u.getBoundingClientRect(),I=s.valueNode.getBoundingClientRect(),N=y.getBoundingClientRect();if(s.dir!=="rtl"){const ee=N.left-M.left,ne=I.left-ee,ge=C.left-ne,Ee=C.width+ge,Ot=Math.max(Ee,M.width),ct=window.innerWidth-We,Ae=es(ne,[We,Math.max(We,ct-Ot)]);a.style.minWidth=Ee+"px",a.style.left=Ae+"px"}else{const ee=M.right-N.right,ne=window.innerWidth-I.right-ee,ge=window.innerWidth-C.right-ne,Ee=C.width+ge,Ot=Math.max(Ee,M.width),ct=window.innerWidth-We,Ae=es(ne,[We,Math.max(We,ct-Ot)]);a.style.minWidth=Ee+"px",a.style.right=Ae+"px"}const _=m(),B=window.innerHeight-We*2,R=p.scrollHeight,$=window.getComputedStyle(u),H=parseInt($.borderTopWidth,10),P=parseInt($.paddingTop,10),F=parseInt($.borderBottomWidth,10),k=parseInt($.paddingBottom,10),j=H+P+R+k+F,U=Math.min(v.offsetHeight*5,j),oe=window.getComputedStyle(p),me=parseInt(oe.paddingTop,10),D=parseInt(oe.paddingBottom,10),q=C.top+C.height/2-We,K=B-q,le=v.offsetHeight/2,A=v.offsetTop+le,L=H+P+A,Z=j-L;if(L<=q){const ee=_.length>0&&v===_[_.length-1].ref.current;a.style.bottom="0px";const ne=u.clientHeight-p.offsetTop-p.offsetHeight,ge=Math.max(K,le+(ee?D:0)+ne+F),Ee=L+ge;a.style.height=Ee+"px"}else{const ee=_.length>0&&v===_[0].ref.current;a.style.top="0px";const ge=Math.max(q,H+p.offsetTop+(ee?me:0)+le)+Z;a.style.height=ge+"px",p.scrollTop=L-q+p.offsetTop}a.style.margin=`${We}px 0`,a.style.minHeight=U+"px",a.style.maxHeight=B+"px",r?.(),requestAnimationFrame(()=>h.current=!0)}},[m,s.trigger,s.valueNode,a,u,p,v,y,s.dir,r]);Se(()=>b(),[b]);const[E,S]=d.useState();Se(()=>{u&&S(window.getComputedStyle(u).zIndex)},[u]);const T=d.useCallback(C=>{C&&g.current===!0&&(b(),x?.(),g.current=!1)},[b,x]);return O.jsx(yf,{scope:n,contentWrapper:a,shouldExpandOnScrollRef:h,onScrollButtonChange:T,children:O.jsx("div",{ref:l,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:E},children:O.jsx(te.div,{...o,ref:c,style:{boxSizing:"border-box",maxHeight:"100%",...o.style}})})})});Ga.displayName=vf;var gf="SelectPopperPosition",lo=d.forwardRef((e,t)=>{const{__scopeSelect:n,align:r="start",collisionPadding:o=We,...s}=e,i=hr(n);return O.jsx(_o,{...i,...s,ref:t,align:r,collisionPadding:o,style:{boxSizing:"border-box",...s.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});lo.displayName=gf;var[yf,Lo]=nn(It,{}),co="SelectViewport",Ka=d.forwardRef((e,t)=>{const{__scopeSelect:n,nonce:r,...o}=e,s=Et(co,n),i=Lo(co,n),a=ue(t,s.onViewportChange),l=d.useRef(0);return O.jsxs(O.Fragment,{children:[O.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),O.jsx(fr.Slot,{scope:n,children:O.jsx(te.div,{"data-radix-select-viewport":"",role:"presentation",...o,ref:a,style:{position:"relative",flex:1,overflow:"hidden auto",...o.style},onScroll:G(o.onScroll,u=>{const f=u.currentTarget,{contentWrapper:c,shouldExpandOnScrollRef:m}=i;if(m?.current&&c){const h=Math.abs(l.current-f.scrollTop);if(h>0){const g=window.innerHeight-We*2,p=parseFloat(c.style.minHeight),v=parseFloat(c.style.height),y=Math.max(p,v);if(y0?E:0,c.style.justifyContent="flex-end")}}}l.current=f.scrollTop})})})]})});Ka.displayName=co;var Xa="SelectGroup",[wf,bf]=nn(Xa),xf=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,o=Wt();return O.jsx(wf,{scope:n,id:o,children:O.jsx(te.div,{role:"group","aria-labelledby":o,...r,ref:t})})});xf.displayName=Xa;var Za="SelectLabel",Sf=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,o=bf(Za,n);return O.jsx(te.div,{id:o.id,...r,ref:t})});Sf.displayName=Za;var er="SelectItem",[Ef,Qa]=nn(er),Ja=d.forwardRef((e,t)=>{const{__scopeSelect:n,value:r,disabled:o=!1,textValue:s,...i}=e,a=St(er,n),l=Et(er,n),u=a.value===r,[f,c]=d.useState(s??""),[m,h]=d.useState(!1),g=ue(t,x=>l.itemRefCallback?.(x,r,o)),p=Wt(),v=d.useRef("touch"),y=()=>{o||(a.onValueChange(r),a.onOpenChange(!1))};if(r==="")throw new Error("A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return O.jsx(Ef,{scope:n,value:r,disabled:o,textId:p,isSelected:u,onItemTextChange:d.useCallback(x=>{c(b=>b||(x?.textContent??"").trim())},[]),children:O.jsx(fr.ItemSlot,{scope:n,value:r,disabled:o,textValue:f,children:O.jsx(te.div,{role:"option","aria-labelledby":p,"data-highlighted":m?"":void 0,"aria-selected":u&&m,"data-state":u?"checked":"unchecked","aria-disabled":o||void 0,"data-disabled":o?"":void 0,tabIndex:o?void 0:-1,...i,ref:g,onFocus:G(i.onFocus,()=>h(!0)),onBlur:G(i.onBlur,()=>h(!1)),onClick:G(i.onClick,()=>{v.current!=="mouse"&&y()}),onPointerUp:G(i.onPointerUp,()=>{v.current==="mouse"&&y()}),onPointerDown:G(i.onPointerDown,x=>{v.current=x.pointerType}),onPointerMove:G(i.onPointerMove,x=>{v.current=x.pointerType,o?l.onItemLeave?.():v.current==="mouse"&&x.currentTarget.focus({preventScroll:!0})}),onPointerLeave:G(i.onPointerLeave,x=>{x.currentTarget===document.activeElement&&l.onItemLeave?.()}),onKeyDown:G(i.onKeyDown,x=>{l.searchRef?.current!==""&&x.key===" "||(af.includes(x.key)&&y(),x.key===" "&&x.preventDefault())})})})})});Ja.displayName=er;var dn="SelectItemText",ei=d.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:o,...s}=e,i=St(dn,n),a=Et(dn,n),l=Qa(dn,n),u=df(dn,n),[f,c]=d.useState(null),m=ue(t,y=>c(y),l.onItemTextChange,y=>a.itemTextRefCallback?.(y,l.value,l.disabled)),h=f?.textContent,g=d.useMemo(()=>O.jsx("option",{value:l.value,disabled:l.disabled,children:h},l.value),[l.disabled,l.value,h]),{onNativeOptionAdd:p,onNativeOptionRemove:v}=u;return Se(()=>(p(g),()=>v(g)),[p,v,g]),O.jsxs(O.Fragment,{children:[O.jsx(te.span,{id:l.textId,...s,ref:m}),l.isSelected&&i.valueNode&&!i.valueNodeHasChildren?Qt.createPortal(s.children,i.valueNode):null]})});ei.displayName=dn;var ti="SelectItemIndicator",ni=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return Qa(ti,n).isSelected?O.jsx(te.span,{"aria-hidden":!0,...r,ref:t}):null});ni.displayName=ti;var uo="SelectScrollUpButton",ri=d.forwardRef((e,t)=>{const n=Et(uo,e.__scopeSelect),r=Lo(uo,e.__scopeSelect),[o,s]=d.useState(!1),i=ue(t,r.onScrollButtonChange);return Se(()=>{if(n.viewport&&n.isPositioned){let a=function(){const u=l.scrollTop>0;s(u)};const l=n.viewport;return a(),l.addEventListener("scroll",a),()=>l.removeEventListener("scroll",a)}},[n.viewport,n.isPositioned]),o?O.jsx(si,{...e,ref:i,onAutoScroll:()=>{const{viewport:a,selectedItem:l}=n;a&&l&&(a.scrollTop=a.scrollTop-l.offsetHeight)}}):null});ri.displayName=uo;var fo="SelectScrollDownButton",oi=d.forwardRef((e,t)=>{const n=Et(fo,e.__scopeSelect),r=Lo(fo,e.__scopeSelect),[o,s]=d.useState(!1),i=ue(t,r.onScrollButtonChange);return Se(()=>{if(n.viewport&&n.isPositioned){let a=function(){const u=l.scrollHeight-l.clientHeight,f=Math.ceil(l.scrollTop)l.removeEventListener("scroll",a)}},[n.viewport,n.isPositioned]),o?O.jsx(si,{...e,ref:i,onAutoScroll:()=>{const{viewport:a,selectedItem:l}=n;a&&l&&(a.scrollTop=a.scrollTop+l.offsetHeight)}}):null});oi.displayName=fo;var si=d.forwardRef((e,t)=>{const{__scopeSelect:n,onAutoScroll:r,...o}=e,s=Et("SelectScrollButton",n),i=d.useRef(null),a=mr(n),l=d.useCallback(()=>{i.current!==null&&(window.clearInterval(i.current),i.current=null)},[]);return d.useEffect(()=>()=>l(),[l]),Se(()=>{a().find(f=>f.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:"nearest"})},[a]),O.jsx(te.div,{"aria-hidden":!0,...o,ref:t,style:{flexShrink:0,...o.style},onPointerDown:G(o.onPointerDown,()=>{i.current===null&&(i.current=window.setInterval(r,50))}),onPointerMove:G(o.onPointerMove,()=>{s.onItemLeave?.(),i.current===null&&(i.current=window.setInterval(r,50))}),onPointerLeave:G(o.onPointerLeave,()=>{l()})})}),Cf="SelectSeparator",Of=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return O.jsx(te.div,{"aria-hidden":!0,...r,ref:t})});Of.displayName=Cf;var mo="SelectArrow",Tf=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,o=hr(n),s=St(mo,n),i=Et(mo,n);return s.open&&i.position==="popper"?O.jsx(Fo,{...o,...r,ref:t}):null});Tf.displayName=mo;var Mf="SelectBubbleInput",ai=d.forwardRef(({__scopeSelect:e,value:t,...n},r)=>{const o=d.useRef(null),s=ue(r,o),i=gd(t);return d.useEffect(()=>{const a=o.current;if(!a)return;const l=window.HTMLSelectElement.prototype,f=Object.getOwnPropertyDescriptor(l,"value").set;if(i!==t&&f){const c=new Event("change",{bubbles:!0});f.call(a,t),a.dispatchEvent(c)}},[i,t]),O.jsx(te.select,{...n,style:{...Ma,...n.style},ref:s,defaultValue:t})});ai.displayName=Mf;function ii(e){return e===""||e===void 0}function li(e){const t=wt(e),n=d.useRef(""),r=d.useRef(0),o=d.useCallback(i=>{const a=n.current+i;t(a),(function l(u){n.current=u,window.clearTimeout(r.current),u!==""&&(r.current=window.setTimeout(()=>l(""),1e3))})(a)},[t]),s=d.useCallback(()=>{n.current="",window.clearTimeout(r.current)},[]);return d.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,o,s]}function ci(e,t,n){const o=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,s=n?e.indexOf(n):-1;let i=Pf(e,Math.max(s,0));o.length===1&&(i=i.filter(u=>u!==n));const l=i.find(u=>u.textValue.toLowerCase().startsWith(o.toLowerCase()));return l!==n?l:void 0}function Pf(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var Ay=La,Iy=ja,_y=Ha,Fy=Ya,Wy=Va,Ly=Ua,$y=Ka,jy=Ja,By=ei,Hy=ni,Yy=ri,Vy=oi;function Df(e,t){return d.useReducer((n,r)=>t[n][r]??n,e)}var rn=e=>{const{present:t,children:n}=e,r=kf(t),o=typeof n=="function"?n({present:r.isPresent}):d.Children.only(n),s=ue(r.ref,Nf(o));return typeof n=="function"||r.isPresent?d.cloneElement(o,{ref:s}):null};rn.displayName="Presence";function kf(e){const[t,n]=d.useState(),r=d.useRef(null),o=d.useRef(e),s=d.useRef("none"),i=e?"mounted":"unmounted",[a,l]=Df(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return d.useEffect(()=>{const u=Yn(r.current);s.current=a==="mounted"?u:"none"},[a]),Se(()=>{const u=r.current,f=o.current;if(f!==e){const m=s.current,h=Yn(u);e?l("MOUNT"):h==="none"||u?.display==="none"?l("UNMOUNT"):l(f&&m!==h?"ANIMATION_OUT":"UNMOUNT"),o.current=e}},[e,l]),Se(()=>{if(t){let u;const f=t.ownerDocument.defaultView??window,c=h=>{const p=Yn(r.current).includes(CSS.escape(h.animationName));if(h.target===t&&p&&(l("ANIMATION_END"),!o.current)){const v=t.style.animationFillMode;t.style.animationFillMode="forwards",u=f.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=v)})}},m=h=>{h.target===t&&(s.current=Yn(r.current))};return t.addEventListener("animationstart",m),t.addEventListener("animationcancel",c),t.addEventListener("animationend",c),()=>{f.clearTimeout(u),t.removeEventListener("animationstart",m),t.removeEventListener("animationcancel",c),t.removeEventListener("animationend",c)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(a),ref:d.useCallback(u=>{r.current=u?getComputedStyle(u):null,n(u)},[])}}function Yn(e){return e?.animationName||"none"}function Nf(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var[pr,Uy]=Ft("Tooltip",[tn]),vr=tn(),ui="TooltipProvider",Rf=700,ho="tooltip.open",[Af,$o]=pr(ui),di=e=>{const{__scopeTooltip:t,delayDuration:n=Rf,skipDelayDuration:r=300,disableHoverableContent:o=!1,children:s}=e,i=d.useRef(!0),a=d.useRef(!1),l=d.useRef(0);return d.useEffect(()=>{const u=l.current;return()=>window.clearTimeout(u)},[]),O.jsx(Af,{scope:t,isOpenDelayedRef:i,delayDuration:n,onOpen:d.useCallback(()=>{window.clearTimeout(l.current),i.current=!1},[]),onClose:d.useCallback(()=>{window.clearTimeout(l.current),l.current=window.setTimeout(()=>i.current=!0,r)},[r]),isPointerInTransitRef:a,onPointerInTransitChange:d.useCallback(u=>{a.current=u},[]),disableHoverableContent:o,children:s})};di.displayName=ui;var bn="Tooltip",[If,Cn]=pr(bn),fi=e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:o,onOpenChange:s,disableHoverableContent:i,delayDuration:a}=e,l=$o(bn,e.__scopeTooltip),u=vr(t),[f,c]=d.useState(null),m=Wt(),h=d.useRef(0),g=i??l.disableHoverableContent,p=a??l.delayDuration,v=d.useRef(!1),[y,x]=Gt({prop:r,defaultProp:o??!1,onChange:C=>{C?(l.onOpen(),document.dispatchEvent(new CustomEvent(ho))):l.onClose(),s?.(C)},caller:bn}),b=d.useMemo(()=>y?v.current?"delayed-open":"instant-open":"closed",[y]),E=d.useCallback(()=>{window.clearTimeout(h.current),h.current=0,v.current=!1,x(!0)},[x]),S=d.useCallback(()=>{window.clearTimeout(h.current),h.current=0,x(!1)},[x]),T=d.useCallback(()=>{window.clearTimeout(h.current),h.current=window.setTimeout(()=>{v.current=!0,x(!0),h.current=0},p)},[p,x]);return d.useEffect(()=>()=>{h.current&&(window.clearTimeout(h.current),h.current=0)},[]),O.jsx(Io,{...u,children:O.jsx(If,{scope:t,contentId:m,open:y,stateAttribute:b,trigger:f,onTriggerChange:c,onTriggerEnter:d.useCallback(()=>{l.isOpenDelayedRef.current?T():E()},[l.isOpenDelayedRef,T,E]),onTriggerLeave:d.useCallback(()=>{g?S():(window.clearTimeout(h.current),h.current=0)},[S,g]),onOpen:E,onClose:S,disableHoverableContent:g,children:n})})};fi.displayName=bn;var po="TooltipTrigger",mi=d.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,o=Cn(po,n),s=$o(po,n),i=vr(n),a=d.useRef(null),l=ue(t,a,o.onTriggerChange),u=d.useRef(!1),f=d.useRef(!1),c=d.useCallback(()=>u.current=!1,[]);return d.useEffect(()=>()=>document.removeEventListener("pointerup",c),[c]),O.jsx(cr,{asChild:!0,...i,children:O.jsx(te.button,{"aria-describedby":o.open?o.contentId:void 0,"data-state":o.stateAttribute,...r,ref:l,onPointerMove:G(e.onPointerMove,m=>{m.pointerType!=="touch"&&!f.current&&!s.isPointerInTransitRef.current&&(o.onTriggerEnter(),f.current=!0)}),onPointerLeave:G(e.onPointerLeave,()=>{o.onTriggerLeave(),f.current=!1}),onPointerDown:G(e.onPointerDown,()=>{o.open&&o.onClose(),u.current=!0,document.addEventListener("pointerup",c,{once:!0})}),onFocus:G(e.onFocus,()=>{u.current||o.onOpen()}),onBlur:G(e.onBlur,o.onClose),onClick:G(e.onClick,o.onClose)})})});mi.displayName=po;var jo="TooltipPortal",[_f,Ff]=pr(jo,{forceMount:void 0}),hi=e=>{const{__scopeTooltip:t,forceMount:n,children:r,container:o}=e,s=Cn(jo,t);return O.jsx(_f,{scope:t,forceMount:n,children:O.jsx(rn,{present:n||s.open,children:O.jsx(ur,{asChild:!0,container:o,children:r})})})};hi.displayName=jo;var Kt="TooltipContent",pi=d.forwardRef((e,t)=>{const n=Ff(Kt,e.__scopeTooltip),{forceMount:r=n.forceMount,side:o="top",...s}=e,i=Cn(Kt,e.__scopeTooltip);return O.jsx(rn,{present:r||i.open,children:i.disableHoverableContent?O.jsx(vi,{side:o,...s,ref:t}):O.jsx(Wf,{side:o,...s,ref:t})})}),Wf=d.forwardRef((e,t)=>{const n=Cn(Kt,e.__scopeTooltip),r=$o(Kt,e.__scopeTooltip),o=d.useRef(null),s=ue(t,o),[i,a]=d.useState(null),{trigger:l,onClose:u}=n,f=o.current,{onPointerInTransitChange:c}=r,m=d.useCallback(()=>{a(null),c(!1)},[c]),h=d.useCallback((g,p)=>{const v=g.currentTarget,y={x:g.clientX,y:g.clientY},x=Bf(y,v.getBoundingClientRect()),b=Hf(y,x),E=Yf(p.getBoundingClientRect()),S=Uf([...b,...E]);a(S),c(!0)},[c]);return d.useEffect(()=>()=>m(),[m]),d.useEffect(()=>{if(l&&f){const g=v=>h(v,f),p=v=>h(v,l);return l.addEventListener("pointerleave",g),f.addEventListener("pointerleave",p),()=>{l.removeEventListener("pointerleave",g),f.removeEventListener("pointerleave",p)}}},[l,f,h,m]),d.useEffect(()=>{if(i){const g=p=>{const v=p.target,y={x:p.clientX,y:p.clientY},x=l?.contains(v)||f?.contains(v),b=!Vf(y,i);x?m():b&&(m(),u())};return document.addEventListener("pointermove",g),()=>document.removeEventListener("pointermove",g)}},[l,f,i,u,m]),O.jsx(vi,{...e,ref:s})}),[Lf,$f]=pr(bn,{isInside:!1}),jf=Cc("TooltipContent"),vi=d.forwardRef((e,t)=>{const{__scopeTooltip:n,children:r,"aria-label":o,onEscapeKeyDown:s,onPointerDownOutside:i,...a}=e,l=Cn(Kt,n),u=vr(n),{onClose:f}=l;return d.useEffect(()=>(document.addEventListener(ho,f),()=>document.removeEventListener(ho,f)),[f]),d.useEffect(()=>{if(l.trigger){const c=m=>{m.target?.contains(l.trigger)&&f()};return window.addEventListener("scroll",c,{capture:!0}),()=>window.removeEventListener("scroll",c,{capture:!0})}},[l.trigger,f]),O.jsx(or,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:s,onPointerDownOutside:i,onFocusOutside:c=>c.preventDefault(),onDismiss:f,children:O.jsxs(_o,{"data-state":l.stateAttribute,...u,...a,ref:t,style:{...a.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[O.jsx(jf,{children:r}),O.jsx(Lf,{scope:n,isInside:!0,children:O.jsx(wd,{id:l.contentId,role:"tooltip",children:o||r})})]})})});pi.displayName=Kt;var gi="TooltipArrow",yi=d.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,o=vr(n);return $f(gi,n).isInside?null:O.jsx(Fo,{...o,...r,ref:t})});yi.displayName=gi;function Bf(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),o=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(n,r,o,s)){case s:return"left";case o:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function Hf(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function Yf(e){const{top:t,right:n,bottom:r,left:o}=e;return[{x:o,y:t},{x:n,y:t},{x:n,y:r},{x:o,y:r}]}function Vf(e,t){const{x:n,y:r}=e;let o=!1;for(let s=0,i=t.length-1;sr!=m>r&&n<(c-u)*(r-f)/(m-f)+u&&(o=!o)}return o}function Uf(e){const t=e.slice();return t.sort((n,r)=>n.xr.x?1:n.yr.y?1:0),zf(t)}function zf(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r=2;){const s=t[t.length-1],i=t[t.length-2];if((s.x-i.x)*(o.y-i.y)>=(s.y-i.y)*(o.x-i.x))t.pop();else break}t.push(o)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const o=e[r];for(;n.length>=2;){const s=n[n.length-1],i=n[n.length-2];if((s.x-i.x)*(o.y-i.y)>=(s.y-i.y)*(o.x-i.x))n.pop();else break}n.push(o)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var zy=di,qy=fi,Gy=mi,Ky=hi,Xy=pi,Zy=yi,gr="Popover",[wi,Qy]=Ft(gr,[tn]),On=tn(),[qf,Ct]=wi(gr),bi=e=>{const{__scopePopover:t,children:n,open:r,defaultOpen:o,onOpenChange:s,modal:i=!1}=e,a=On(t),l=d.useRef(null),[u,f]=d.useState(!1),[c,m]=Gt({prop:r,defaultProp:o??!1,onChange:s,caller:gr});return O.jsx(Io,{...a,children:O.jsx(qf,{scope:t,contentId:Wt(),triggerRef:l,open:c,onOpenChange:m,onOpenToggle:d.useCallback(()=>m(h=>!h),[m]),hasCustomAnchor:u,onCustomAnchorAdd:d.useCallback(()=>f(!0),[]),onCustomAnchorRemove:d.useCallback(()=>f(!1),[]),modal:i,children:n})})};bi.displayName=gr;var xi="PopoverAnchor",Gf=d.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,o=Ct(xi,n),s=On(n),{onCustomAnchorAdd:i,onCustomAnchorRemove:a}=o;return d.useEffect(()=>(i(),()=>a()),[i,a]),O.jsx(cr,{...s,...r,ref:t})});Gf.displayName=xi;var Si="PopoverTrigger",Ei=d.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,o=Ct(Si,n),s=On(n),i=ue(t,o.triggerRef),a=O.jsx(te.button,{type:"button","aria-haspopup":"dialog","aria-expanded":o.open,"aria-controls":o.contentId,"data-state":Pi(o.open),...r,ref:i,onClick:G(e.onClick,o.onOpenToggle)});return o.hasCustomAnchor?a:O.jsx(cr,{asChild:!0,...s,children:a})});Ei.displayName=Si;var Bo="PopoverPortal",[Kf,Xf]=wi(Bo,{forceMount:void 0}),Ci=e=>{const{__scopePopover:t,forceMount:n,children:r,container:o}=e,s=Ct(Bo,t);return O.jsx(Kf,{scope:t,forceMount:n,children:O.jsx(rn,{present:n||s.open,children:O.jsx(ur,{asChild:!0,container:o,children:r})})})};Ci.displayName=Bo;var Xt="PopoverContent",Oi=d.forwardRef((e,t)=>{const n=Xf(Xt,e.__scopePopover),{forceMount:r=n.forceMount,...o}=e,s=Ct(Xt,e.__scopePopover);return O.jsx(rn,{present:r||s.open,children:s.modal?O.jsx(Qf,{...o,ref:t}):O.jsx(Jf,{...o,ref:t})})});Oi.displayName=Xt;var Zf=zt("PopoverContent.RemoveScroll"),Qf=d.forwardRef((e,t)=>{const n=Ct(Xt,e.__scopePopover),r=d.useRef(null),o=ue(t,r),s=d.useRef(!1);return d.useEffect(()=>{const i=r.current;if(i)return ka(i)},[]),O.jsx(Wo,{as:Zf,allowPinchZoom:!0,children:O.jsx(Ti,{...e,ref:o,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:G(e.onCloseAutoFocus,i=>{i.preventDefault(),s.current||n.triggerRef.current?.focus()}),onPointerDownOutside:G(e.onPointerDownOutside,i=>{const a=i.detail.originalEvent,l=a.button===0&&a.ctrlKey===!0,u=a.button===2||l;s.current=u},{checkForDefaultPrevented:!1}),onFocusOutside:G(e.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1})})})}),Jf=d.forwardRef((e,t)=>{const n=Ct(Xt,e.__scopePopover),r=d.useRef(!1),o=d.useRef(!1);return O.jsx(Ti,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:s=>{e.onCloseAutoFocus?.(s),s.defaultPrevented||(r.current||n.triggerRef.current?.focus(),s.preventDefault()),r.current=!1,o.current=!1},onInteractOutside:s=>{e.onInteractOutside?.(s),s.defaultPrevented||(r.current=!0,s.detail.originalEvent.type==="pointerdown"&&(o.current=!0));const i=s.target;n.triggerRef.current?.contains(i)&&s.preventDefault(),s.detail.originalEvent.type==="focusin"&&o.current&&s.preventDefault()}})}),Ti=d.forwardRef((e,t)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:o,onCloseAutoFocus:s,disableOutsidePointerEvents:i,onEscapeKeyDown:a,onPointerDownOutside:l,onFocusOutside:u,onInteractOutside:f,...c}=e,m=Ct(Xt,n),h=On(n);return oa(),O.jsx(Oo,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:o,onUnmountAutoFocus:s,children:O.jsx(or,{asChild:!0,disableOutsidePointerEvents:i,onInteractOutside:f,onEscapeKeyDown:a,onPointerDownOutside:l,onFocusOutside:u,onDismiss:()=>m.onOpenChange(!1),children:O.jsx(_o,{"data-state":Pi(m.open),role:"dialog",id:m.contentId,...h,...c,ref:t,style:{...c.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),Mi="PopoverClose",em=d.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,o=Ct(Mi,n);return O.jsx(te.button,{type:"button",...r,ref:t,onClick:G(e.onClick,()=>o.onOpenChange(!1))})});em.displayName=Mi;var tm="PopoverArrow",nm=d.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,o=On(n);return O.jsx(Fo,{...o,...r,ref:t})});nm.displayName=tm;function Pi(e){return e?"open":"closed"}var Jy=bi,ew=Ei,tw=Ci,nw=Oi,rm="Separator",Os="horizontal",om=["horizontal","vertical"],Di=d.forwardRef((e,t)=>{const{decorative:n,orientation:r=Os,...o}=e,s=sm(r)?r:Os,a=n?{role:"none"}:{"aria-orientation":s==="vertical"?s:void 0,role:"separator"};return O.jsx(te.div,{"data-orientation":s,...a,...o,ref:t})});Di.displayName=rm;function sm(e){return om.includes(e)}var rw=Di,am=Object.defineProperty,im=(e,t,n)=>t in e?am(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ur=(e,t,n)=>(im(e,typeof t!="symbol"?t+"":t,n),n);let lm=class{constructor(){Ur(this,"current",this.detect()),Ur(this,"handoffState","pending"),Ur(this,"currentId",0)}set(t){this.current!==t&&(this.handoffState="pending",this.currentId=0,this.current=t)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current==="server"}get isClient(){return this.current==="client"}detect(){return typeof window>"u"||typeof document>"u"?"server":"client"}handoff(){this.handoffState==="pending"&&(this.handoffState="complete")}get isHandoffComplete(){return this.handoffState==="complete"}},Xe=new lm;function yr(e){var t,n;return Xe.isServer?null:e?"ownerDocument"in e?e.ownerDocument:"current"in e?(n=(t=e.current)==null?void 0:t.ownerDocument)!=null?n:document:null:document}function wr(e){typeof queueMicrotask=="function"?queueMicrotask(e):Promise.resolve().then(e).catch(t=>setTimeout(()=>{throw t}))}function lt(){let e=[],t={addEventListener(n,r,o,s){return n.addEventListener(r,o,s),t.add(()=>n.removeEventListener(r,o,s))},requestAnimationFrame(...n){let r=requestAnimationFrame(...n);return t.add(()=>cancelAnimationFrame(r))},nextFrame(...n){return t.requestAnimationFrame(()=>t.requestAnimationFrame(...n))},setTimeout(...n){let r=setTimeout(...n);return t.add(()=>clearTimeout(r))},microTask(...n){let r={current:!0};return wr(()=>{r.current&&n[0]()}),t.add(()=>{r.current=!1})},style(n,r,o){let s=n.style.getPropertyValue(r);return Object.assign(n.style,{[r]:o}),this.add(()=>{Object.assign(n.style,{[r]:s})})},group(n){let r=lt();return n(r),this.add(()=>r.dispose())},add(n){return e.includes(n)||e.push(n),()=>{let r=e.indexOf(n);if(r>=0)for(let o of e.splice(r,1))o()}},dispose(){for(let n of e.splice(0))n()}};return t}function Ho(){let[e]=d.useState(lt);return d.useEffect(()=>()=>e.dispose(),[e]),e}let xe=(e,t)=>{Xe.isServer?d.useEffect(e,t):d.useLayoutEffect(e,t)};function Lt(e){let t=d.useRef(e);return xe(()=>{t.current=e},[e]),t}let ie=function(e){let t=Lt(e);return w.useCallback((...n)=>t.current(...n),[t])},cm=d.createContext(void 0);function um(){return d.useContext(cm)}function vo(...e){return Array.from(new Set(e.flatMap(t=>typeof t=="string"?t.split(" "):[]))).filter(Boolean).join(" ")}function it(e,t,...n){if(e in t){let o=t[e];return typeof o=="function"?o(...n):o}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map(o=>`"${o}"`).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,it),r}var tr=(e=>(e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static",e))(tr||{}),vt=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(vt||{});function Re(){let e=fm();return d.useCallback(t=>dm({mergeRefs:e,...t}),[e])}function dm({ourProps:e,theirProps:t,slot:n,defaultTag:r,features:o,visible:s=!0,name:i,mergeRefs:a}){a=a??mm;let l=ki(t,e);if(s)return Vn(l,n,r,i,a);let u=o??0;if(u&2){let{static:f=!1,...c}=l;if(f)return Vn(c,n,r,i,a)}if(u&1){let{unmount:f=!0,...c}=l;return it(f?0:1,{0(){return null},1(){return Vn({...c,hidden:!0,style:{display:"none"}},n,r,i,a)}})}return Vn(l,n,r,i,a)}function Vn(e,t={},n,r,o){let{as:s=n,children:i,refName:a="ref",...l}=zr(e,["unmount","static"]),u=e.ref!==void 0?{[a]:e.ref}:{},f=typeof i=="function"?i(t):i;"className"in l&&l.className&&typeof l.className=="function"&&(l.className=l.className(t)),l["aria-labelledby"]&&l["aria-labelledby"]===l.id&&(l["aria-labelledby"]=void 0);let c={};if(t){let m=!1,h=[];for(let[g,p]of Object.entries(t))typeof p=="boolean"&&(m=!0),p===!0&&h.push(g.replace(/([A-Z])/g,v=>`-${v.toLowerCase()}`));if(m){c["data-headlessui-state"]=h.join(" ");for(let g of h)c[`data-${g}`]=""}}if(s===d.Fragment&&(Object.keys(Mt(l)).length>0||Object.keys(Mt(c)).length>0))if(!d.isValidElement(f)||Array.isArray(f)&&f.length>1){if(Object.keys(Mt(l)).length>0)throw new Error(['Passing props on "Fragment"!',"",`The current component <${r} /> is rendering a "Fragment".`,"However we need to passthrough the following props:",Object.keys(Mt(l)).concat(Object.keys(Mt(c))).map(m=>` - ${m}`).join(` +`),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map(m=>` - ${m}`).join(` +`)].join(` +`))}else{let m=f.props,h=m?.className,g=typeof h=="function"?(...y)=>vo(h(...y),l.className):vo(h,l.className),p=g?{className:g}:{},v=ki(f.props,Mt(zr(l,["ref"])));for(let y in c)y in v&&delete c[y];return d.cloneElement(f,Object.assign({},v,c,u,{ref:o(hm(f),u.ref)},p))}return d.createElement(s,Object.assign({},zr(l,["ref"]),s!==d.Fragment&&u,s!==d.Fragment&&c),f)}function fm(){let e=d.useRef([]),t=d.useCallback(n=>{for(let r of e.current)r!=null&&(typeof r=="function"?r(n):r.current=n)},[]);return(...n)=>{if(!n.every(r=>r==null))return e.current=n,t}}function mm(...e){return e.every(t=>t==null)?void 0:t=>{for(let n of e)n!=null&&(typeof n=="function"?n(t):n.current=t)}}function ki(...e){if(e.length===0)return{};if(e.length===1)return e[0];let t={},n={};for(let r of e)for(let o in r)o.startsWith("on")&&typeof r[o]=="function"?(n[o]!=null||(n[o]=[]),n[o].push(r[o])):t[o]=r[o];if(t.disabled||t["aria-disabled"])for(let r in n)/^(on(?:Click|Pointer|Mouse|Key)(?:Down|Up|Press)?)$/.test(r)&&(n[r]=[o=>{var s;return(s=o?.preventDefault)==null?void 0:s.call(o)}]);for(let r in n)Object.assign(t,{[r](o,...s){let i=n[r];for(let a of i){if((o instanceof Event||o?.nativeEvent instanceof Event)&&o.defaultPrevented)return;a(o,...s)}}});return t}function Oe(e){var t;return Object.assign(d.forwardRef(e),{displayName:(t=e.displayName)!=null?t:e.name})}function Mt(e){let t=Object.assign({},e);for(let n in t)t[n]===void 0&&delete t[n];return t}function zr(e,t=[]){let n=Object.assign({},e);for(let r of t)r in n&&delete n[r];return n}function hm(e){return w.version.split(".")[0]>="19"?e.props.ref:e.ref}let pm="span";var nr=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(nr||{});function vm(e,t){var n;let{features:r=1,...o}=e,s={ref:t,"aria-hidden":(r&2)===2?!0:(n=o["aria-hidden"])!=null?n:void 0,hidden:(r&4)===4?!0:void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...(r&4)===4&&(r&2)!==2&&{display:"none"}}};return Re()({ourProps:s,theirProps:o,slot:{},defaultTag:pm,name:"Hidden"})}let go=Oe(vm);function Ni(e){return typeof e!="object"||e===null?!1:"nodeType"in e}function yt(e){return Ni(e)&&"tagName"in e}function _t(e){return yt(e)&&"accessKey"in e}function gt(e){return yt(e)&&"tabIndex"in e}function gm(e){return yt(e)&&"style"in e}function ym(e){return _t(e)&&e.nodeName==="IFRAME"}function wm(e){return _t(e)&&e.nodeName==="INPUT"}let Ri=Symbol();function bm(e,t=!0){return Object.assign(e,{[Ri]:t})}function Je(...e){let t=d.useRef(e);d.useEffect(()=>{t.current=e},[e]);let n=ie(r=>{for(let o of t.current)o!=null&&(typeof o=="function"?o(r):o.current=r)});return e.every(r=>r==null||r?.[Ri])?void 0:n}let Yo=d.createContext(null);Yo.displayName="DescriptionContext";function Ai(){let e=d.useContext(Yo);if(e===null){let t=new Error("You used a component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(t,Ai),t}return e}function xm(){let[e,t]=d.useState([]);return[e.length>0?e.join(" "):void 0,d.useMemo(()=>function(n){let r=ie(s=>(t(i=>[...i,s]),()=>t(i=>{let a=i.slice(),l=a.indexOf(s);return l!==-1&&a.splice(l,1),a}))),o=d.useMemo(()=>({register:r,slot:n.slot,name:n.name,props:n.props,value:n.value}),[r,n.slot,n.name,n.props,n.value]);return w.createElement(Yo.Provider,{value:o},n.children)},[t])]}let Sm="p";function Em(e,t){let n=d.useId(),r=um(),{id:o=`headlessui-description-${n}`,...s}=e,i=Ai(),a=Je(t);xe(()=>i.register(o),[o,i.register]);let l=r||!1,u=d.useMemo(()=>({...i.slot,disabled:l}),[i.slot,l]),f={ref:a,...i.props,id:o};return Re()({ourProps:f,theirProps:s,slot:u,defaultTag:Sm,name:i.name||"Description"})}let Cm=Oe(Em),Om=Object.assign(Cm,{});var Ii=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(Ii||{});let Tm=d.createContext(()=>{});function Mm({value:e,children:t}){return w.createElement(Tm.Provider,{value:e},t)}let _i=class extends Map{constructor(t){super(),this.factory=t}get(t){let n=super.get(t);return n===void 0&&(n=this.factory(t),this.set(t,n)),n}};var Pm=Object.defineProperty,Dm=(e,t,n)=>t in e?Pm(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,km=(e,t,n)=>(Dm(e,t+"",n),n),Fi=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},Ne=(e,t,n)=>(Fi(e,t,"read from private field"),n?n.call(e):t.get(e)),qr=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},Ts=(e,t,n,r)=>(Fi(e,t,"write to private field"),t.set(e,n),n),Ve,fn,mn;let Nm=class{constructor(t){qr(this,Ve,{}),qr(this,fn,new _i(()=>new Set)),qr(this,mn,new Set),km(this,"disposables",lt()),Ts(this,Ve,t),Xe.isServer&&this.disposables.microTask(()=>{this.dispose()})}dispose(){this.disposables.dispose()}get state(){return Ne(this,Ve)}subscribe(t,n){if(Xe.isServer)return()=>{};let r={selector:t,callback:n,current:t(Ne(this,Ve))};return Ne(this,mn).add(r),this.disposables.add(()=>{Ne(this,mn).delete(r)})}on(t,n){return Xe.isServer?()=>{}:(Ne(this,fn).get(t).add(n),this.disposables.add(()=>{Ne(this,fn).get(t).delete(n)}))}send(t){let n=this.reduce(Ne(this,Ve),t);if(n!==Ne(this,Ve)){Ts(this,Ve,n);for(let r of Ne(this,mn)){let o=r.selector(Ne(this,Ve));Wi(r.current,o)||(r.current=o,r.callback(o))}for(let r of Ne(this,fn).get(t.type))r(Ne(this,Ve),t)}}};Ve=new WeakMap,fn=new WeakMap,mn=new WeakMap;function Wi(e,t){return Object.is(e,t)?!0:typeof e!="object"||e===null||typeof t!="object"||t===null?!1:Array.isArray(e)&&Array.isArray(t)?e.length!==t.length?!1:Gr(e[Symbol.iterator](),t[Symbol.iterator]()):e instanceof Map&&t instanceof Map||e instanceof Set&&t instanceof Set?e.size!==t.size?!1:Gr(e.entries(),t.entries()):Ms(e)&&Ms(t)?Gr(Object.entries(e)[Symbol.iterator](),Object.entries(t)[Symbol.iterator]()):!1}function Gr(e,t){do{let n=e.next(),r=t.next();if(n.done&&r.done)return!0;if(n.done||r.done||!Object.is(n.value,r.value))return!1}while(!0)}function Ms(e){if(Object.prototype.toString.call(e)!=="[object Object]")return!1;let t=Object.getPrototypeOf(e);return t===null||Object.getPrototypeOf(t)===null}var Rm=Object.defineProperty,Am=(e,t,n)=>t in e?Rm(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ps=(e,t,n)=>(Am(e,typeof t!="symbol"?t+"":t,n),n),Im=(e=>(e[e.Push=0]="Push",e[e.Pop=1]="Pop",e))(Im||{});let _m={0(e,t){let n=t.id,r=e.stack,o=e.stack.indexOf(n);if(o!==-1){let s=e.stack.slice();return s.splice(o,1),s.push(n),r=s,{...e,stack:r}}return{...e,stack:[...e.stack,n]}},1(e,t){let n=t.id,r=e.stack.indexOf(n);if(r===-1)return e;let o=e.stack.slice();return o.splice(r,1),{...e,stack:o}}},Fm=class Li extends Nm{constructor(){super(...arguments),Ps(this,"actions",{push:t=>this.send({type:0,id:t}),pop:t=>this.send({type:1,id:t})}),Ps(this,"selectors",{isTop:(t,n)=>t.stack[t.stack.length-1]===n,inStack:(t,n)=>t.stack.includes(n)})}static new(){return new Li({stack:[]})}reduce(t,n){return it(n.type,_m,t,n)}};const $i=new _i(()=>Fm.new());var Kr={exports:{}},Xr={};/** + * @license React + * use-sync-external-store-with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ds;function Wm(){if(Ds)return Xr;Ds=1;var e=Gl();function t(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var n=typeof Object.is=="function"?Object.is:t,r=e.useSyncExternalStore,o=e.useRef,s=e.useEffect,i=e.useMemo,a=e.useDebugValue;return Xr.useSyncExternalStoreWithSelector=function(l,u,f,c,m){var h=o(null);if(h.current===null){var g={hasValue:!1,value:null};h.current=g}else g=h.current;h=i(function(){function v(S){if(!y){if(y=!0,x=S,S=c(S),m!==void 0&&g.hasValue){var T=g.value;if(m(T,S))return b=T}return b=S}if(T=b,n(x,S))return T;var C=c(S);return m!==void 0&&m(T,C)?(x=S,T):(x=S,b=C)}var y=!1,x,b,E=f===void 0?null:f;return[function(){return v(u())},E===null?void 0:function(){return v(E())}]},[u,f,c,m]);var p=r(l,h[0],h[1]);return s(function(){g.hasValue=!0,g.value=p},[p]),a(p),p},Xr}var ks;function Lm(){return ks||(ks=1,Kr.exports=Wm()),Kr.exports}var $m=Lm();function ji(e,t,n=Wi){return $m.useSyncExternalStoreWithSelector(ie(r=>e.subscribe(jm,r)),ie(()=>e.state),ie(()=>e.state),ie(t),n)}function jm(e){return e}function Tn(e,t){let n=d.useId(),r=$i.get(t),[o,s]=ji(r,d.useCallback(i=>[r.selectors.isTop(i,n),r.selectors.inStack(i,n)],[r,n]));return xe(()=>{if(e)return r.actions.push(n),()=>r.actions.pop(n)},[r,e,n]),e?s?o:!0:!1}let yo=new Map,vn=new Map;function Ns(e){var t;let n=(t=vn.get(e))!=null?t:0;return vn.set(e,n+1),n!==0?()=>Rs(e):(yo.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),e.setAttribute("aria-hidden","true"),e.inert=!0,()=>Rs(e))}function Rs(e){var t;let n=(t=vn.get(e))!=null?t:1;if(n===1?vn.delete(e):vn.set(e,n-1),n!==1)return;let r=yo.get(e);r&&(r["aria-hidden"]===null?e.removeAttribute("aria-hidden"):e.setAttribute("aria-hidden",r["aria-hidden"]),e.inert=r.inert,yo.delete(e))}function Bm(e,{allowed:t,disallowed:n}={}){let r=Tn(e,"inert-others");xe(()=>{var o,s;if(!r)return;let i=lt();for(let l of(o=n?.())!=null?o:[])l&&i.add(Ns(l));let a=(s=t?.())!=null?s:[];for(let l of a){if(!l)continue;let u=yr(l);if(!u)continue;let f=l.parentElement;for(;f&&f!==u.body;){for(let c of f.children)a.some(m=>c.contains(m))||i.add(Ns(c));f=f.parentElement}}return i.dispose},[r,t,n])}function Hm(e,t,n){let r=Lt(o=>{let s=o.getBoundingClientRect();s.x===0&&s.y===0&&s.width===0&&s.height===0&&n()});d.useEffect(()=>{if(!e)return;let o=t===null?null:_t(t)?t:t.current;if(!o)return;let s=lt();if(typeof ResizeObserver<"u"){let i=new ResizeObserver(()=>r.current(o));i.observe(o),s.add(()=>i.disconnect())}if(typeof IntersectionObserver<"u"){let i=new IntersectionObserver(()=>r.current(o));i.observe(o),s.add(()=>i.disconnect())}return()=>s.dispose()},[t,r,e])}let rr=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(e=>`${e}:not([tabindex='-1'])`).join(","),Ym=["[data-autofocus]"].map(e=>`${e}:not([tabindex='-1'])`).join(",");var tt=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e[e.AutoFocus=64]="AutoFocus",e))(tt||{}),wo=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(wo||{}),Vm=(e=>(e[e.Previous=-1]="Previous",e[e.Next=1]="Next",e))(Vm||{});function Um(e=document.body){return e==null?[]:Array.from(e.querySelectorAll(rr)).sort((t,n)=>Math.sign((t.tabIndex||Number.MAX_SAFE_INTEGER)-(n.tabIndex||Number.MAX_SAFE_INTEGER)))}function zm(e=document.body){return e==null?[]:Array.from(e.querySelectorAll(Ym)).sort((t,n)=>Math.sign((t.tabIndex||Number.MAX_SAFE_INTEGER)-(n.tabIndex||Number.MAX_SAFE_INTEGER)))}var Bi=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(Bi||{});function qm(e,t=0){var n;return e===((n=yr(e))==null?void 0:n.body)?!1:it(t,{0(){return e.matches(rr)},1(){let r=e;for(;r!==null;){if(r.matches(rr))return!0;r=r.parentElement}return!1}})}var Gm=(e=>(e[e.Keyboard=0]="Keyboard",e[e.Mouse=1]="Mouse",e))(Gm||{});typeof window<"u"&&typeof document<"u"&&(document.addEventListener("keydown",e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",e=>{e.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:e.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0));function ot(e){e?.focus({preventScroll:!0})}let Km=["textarea","input"].join(",");function Xm(e){var t,n;return(n=(t=e?.matches)==null?void 0:t.call(e,Km))!=null?n:!1}function Zm(e,t=n=>n){return e.slice().sort((n,r)=>{let o=t(n),s=t(r);if(o===null||s===null)return 0;let i=o.compareDocumentPosition(s);return i&Node.DOCUMENT_POSITION_FOLLOWING?-1:i&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function gn(e,t,{sorted:n=!0,relativeTo:r=null,skipElements:o=[]}={}){let s=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e.ownerDocument,i=Array.isArray(e)?n?Zm(e):e:t&64?zm(e):Um(e);o.length>0&&i.length>1&&(i=i.filter(h=>!o.some(g=>g!=null&&"current"in g?g?.current===h:g===h))),r=r??s.activeElement;let a=(()=>{if(t&5)return 1;if(t&10)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),l=(()=>{if(t&1)return 0;if(t&2)return Math.max(0,i.indexOf(r))-1;if(t&4)return Math.max(0,i.indexOf(r))+1;if(t&8)return i.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),u=t&32?{preventScroll:!0}:{},f=0,c=i.length,m;do{if(f>=c||f+c<=0)return 0;let h=l+f;if(t&16)h=(h+c)%c;else{if(h<0)return 3;if(h>=c)return 1}m=i[h],m?.focus(u),f+=a}while(m!==s.activeElement);return t&6&&Xm(m)&&m.select(),2}function Hi(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function Qm(){return/Android/gi.test(window.navigator.userAgent)}function As(){return Hi()||Qm()}function Un(e,t,n,r){let o=Lt(n);d.useEffect(()=>{if(!e)return;function s(i){o.current(i)}return document.addEventListener(t,s,r),()=>document.removeEventListener(t,s,r)},[e,t,r])}function Yi(e,t,n,r){let o=Lt(n);d.useEffect(()=>{if(!e)return;function s(i){o.current(i)}return window.addEventListener(t,s,r),()=>window.removeEventListener(t,s,r)},[e,t,r])}const Is=30;function Jm(e,t,n){let r=Lt(n),o=d.useCallback(function(a,l){if(a.defaultPrevented)return;let u=l(a);if(u===null||!u.getRootNode().contains(u)||!u.isConnected)return;let f=(function c(m){return typeof m=="function"?c(m()):Array.isArray(m)||m instanceof Set?m:[m]})(t);for(let c of f)if(c!==null&&(c.contains(u)||a.composed&&a.composedPath().includes(c)))return;return!qm(u,Bi.Loose)&&u.tabIndex!==-1&&a.preventDefault(),r.current(a,u)},[r,t]),s=d.useRef(null);Un(e,"pointerdown",a=>{var l,u;As()||(s.current=((u=(l=a.composedPath)==null?void 0:l.call(a))==null?void 0:u[0])||a.target)},!0),Un(e,"pointerup",a=>{if(As()||!s.current)return;let l=s.current;return s.current=null,o(a,()=>l)},!0);let i=d.useRef({x:0,y:0});Un(e,"touchstart",a=>{i.current.x=a.touches[0].clientX,i.current.y=a.touches[0].clientY},!0),Un(e,"touchend",a=>{let l={x:a.changedTouches[0].clientX,y:a.changedTouches[0].clientY};if(!(Math.abs(l.x-i.current.x)>=Is||Math.abs(l.y-i.current.y)>=Is))return o(a,()=>gt(a.target)?a.target:null)},!0),Yi(e,"blur",a=>o(a,()=>ym(window.document.activeElement)?window.document.activeElement:null),!0)}function br(...e){return d.useMemo(()=>yr(...e),[...e])}function Vi(e,t,n,r){let o=Lt(n);d.useEffect(()=>{e=e??window;function s(i){o.current(i)}return e.addEventListener(t,s,r),()=>e.removeEventListener(t,s,r)},[e,t,r])}function eh(e){return d.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getSnapshot)}function th(e,t){let n=e(),r=new Set;return{getSnapshot(){return n},subscribe(o){return r.add(o),()=>r.delete(o)},dispatch(o,...s){let i=t[o].call(n,...s);i&&(n=i,r.forEach(a=>a()))}}}function nh(){let e;return{before({doc:t}){var n;let r=t.documentElement,o=(n=t.defaultView)!=null?n:window;e=Math.max(0,o.innerWidth-r.clientWidth)},after({doc:t,d:n}){let r=t.documentElement,o=Math.max(0,r.clientWidth-r.offsetWidth),s=Math.max(0,e-o);n.style(r,"paddingRight",`${s}px`)}}}function rh(){return Hi()?{before({doc:e,d:t,meta:n}){function r(o){return n.containers.flatMap(s=>s()).some(s=>s.contains(o))}t.microTask(()=>{var o;if(window.getComputedStyle(e.documentElement).scrollBehavior!=="auto"){let a=lt();a.style(e.documentElement,"scrollBehavior","auto"),t.add(()=>t.microTask(()=>a.dispose()))}let s=(o=window.scrollY)!=null?o:window.pageYOffset,i=null;t.addEventListener(e,"click",a=>{if(gt(a.target))try{let l=a.target.closest("a");if(!l)return;let{hash:u}=new URL(l.href),f=e.querySelector(u);gt(f)&&!r(f)&&(i=f)}catch{}},!0),t.addEventListener(e,"touchstart",a=>{if(gt(a.target)&&gm(a.target))if(r(a.target)){let l=a.target;for(;l.parentElement&&r(l.parentElement);)l=l.parentElement;t.style(l,"overscrollBehavior","contain")}else t.style(a.target,"touchAction","none")}),t.addEventListener(e,"touchmove",a=>{if(gt(a.target)){if(wm(a.target))return;if(r(a.target)){let l=a.target;for(;l.parentElement&&l.dataset.headlessuiPortal!==""&&!(l.scrollHeight>l.clientHeight||l.scrollWidth>l.clientWidth);)l=l.parentElement;l.dataset.headlessuiPortal===""&&a.preventDefault()}else a.preventDefault()}},{passive:!1}),t.add(()=>{var a;let l=(a=window.scrollY)!=null?a:window.pageYOffset;s!==l&&window.scrollTo(0,s),i&&i.isConnected&&(i.scrollIntoView({block:"nearest"}),i=null)})})}}:{}}function oh(){return{before({doc:e,d:t}){t.style(e.documentElement,"overflow","hidden")}}}function sh(e){let t={};for(let n of e)Object.assign(t,n(t));return t}let kt=th(()=>new Map,{PUSH(e,t){var n;let r=(n=this.get(e))!=null?n:{doc:e,count:0,d:lt(),meta:new Set};return r.count++,r.meta.add(t),this.set(e,r),this},POP(e,t){let n=this.get(e);return n&&(n.count--,n.meta.delete(t)),this},SCROLL_PREVENT({doc:e,d:t,meta:n}){let r={doc:e,d:t,meta:sh(n)},o=[rh(),nh(),oh()];o.forEach(({before:s})=>s?.(r)),o.forEach(({after:s})=>s?.(r))},SCROLL_ALLOW({d:e}){e.dispose()},TEARDOWN({doc:e}){this.delete(e)}});kt.subscribe(()=>{let e=kt.getSnapshot(),t=new Map;for(let[n]of e)t.set(n,n.documentElement.style.overflow);for(let n of e.values()){let r=t.get(n.doc)==="hidden",o=n.count!==0;(o&&!r||!o&&r)&&kt.dispatch(n.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",n),n.count===0&&kt.dispatch("TEARDOWN",n)}});function ah(e,t,n=()=>({containers:[]})){let r=eh(kt),o=t?r.get(t):void 0,s=o?o.count>0:!1;return xe(()=>{if(!(!t||!e))return kt.dispatch("PUSH",t,n),()=>kt.dispatch("POP",t,n)},[e,t]),s}function ih(e,t,n=()=>[document.body]){let r=Tn(e,"scroll-lock");ah(r,t,o=>{var s;return{containers:[...(s=o.containers)!=null?s:[],n]}})}function lh(e=0){let[t,n]=d.useState(e),r=d.useCallback(l=>n(l),[t]),o=d.useCallback(l=>n(u=>u|l),[t]),s=d.useCallback(l=>(t&l)===l,[t]),i=d.useCallback(l=>n(u=>u&~l),[n]),a=d.useCallback(l=>n(u=>u^l),[n]);return{flags:t,setFlag:r,addFlag:o,hasFlag:s,removeFlag:i,toggleFlag:a}}var ch={},_s,Fs;typeof process<"u"&&typeof globalThis<"u"&&typeof Element<"u"&&((_s=process==null?void 0:ch)==null?void 0:_s.NODE_ENV)==="test"&&typeof((Fs=Element?.prototype)==null?void 0:Fs.getAnimations)>"u"&&(Element.prototype.getAnimations=function(){return console.warn(["Headless UI has polyfilled `Element.prototype.getAnimations` for your tests.","Please install a proper polyfill e.g. `jsdom-testing-mocks`, to silence these warnings.","","Example usage:","```js","import { mockAnimationsApi } from 'jsdom-testing-mocks'","mockAnimationsApi()","```"].join(` +`)),[]});var uh=(e=>(e[e.None=0]="None",e[e.Closed=1]="Closed",e[e.Enter=2]="Enter",e[e.Leave=4]="Leave",e))(uh||{});function dh(e){let t={};for(let n in e)e[n]===!0&&(t[`data-${n}`]="");return t}function fh(e,t,n,r){let[o,s]=d.useState(n),{hasFlag:i,addFlag:a,removeFlag:l}=lh(e&&o?3:0),u=d.useRef(!1),f=d.useRef(!1),c=Ho();return xe(()=>{var m;if(e){if(n&&s(!0),!t){n&&a(3);return}return(m=r?.start)==null||m.call(r,n),mh(t,{inFlight:u,prepare(){f.current?f.current=!1:f.current=u.current,u.current=!0,!f.current&&(n?(a(3),l(4)):(a(4),l(2)))},run(){f.current?n?(l(3),a(4)):(l(4),a(3)):n?l(1):a(1)},done(){var h;f.current&&typeof t.getAnimations=="function"&&t.getAnimations().length>0||(u.current=!1,l(7),n||s(!1),(h=r?.end)==null||h.call(r,n))}})}},[e,n,t,c]),e?[o,{closed:i(1),enter:i(2),leave:i(4),transition:i(2)||i(4)}]:[n,{closed:void 0,enter:void 0,leave:void 0,transition:void 0}]}function mh(e,{prepare:t,run:n,done:r,inFlight:o}){let s=lt();return ph(e,{prepare:t,inFlight:o}),s.nextFrame(()=>{n(),s.requestAnimationFrame(()=>{s.add(hh(e,r))})}),s.dispose}function hh(e,t){var n,r;let o=lt();if(!e)return o.dispose;let s=!1;o.add(()=>{s=!0});let i=(r=(n=e.getAnimations)==null?void 0:n.call(e).filter(a=>a instanceof CSSTransition))!=null?r:[];return i.length===0?(t(),o.dispose):(Promise.allSettled(i.map(a=>a.finished)).then(()=>{s||t()}),o.dispose)}function ph(e,{inFlight:t,prepare:n}){if(t!=null&&t.current){n();return}let r=e.style.transition;e.style.transition="none",n(),e.offsetHeight,e.style.transition=r}function Vo(e,t){let n=d.useRef([]),r=ie(e);d.useEffect(()=>{let o=[...n.current];for(let[s,i]of t.entries())if(n.current[s]!==i){let a=r(t,o);return n.current=t,a}},[r,...t])}let xr=d.createContext(null);xr.displayName="OpenClosedContext";var Le=(e=>(e[e.Open=1]="Open",e[e.Closed=2]="Closed",e[e.Closing=4]="Closing",e[e.Opening=8]="Opening",e))(Le||{});function Sr(){return d.useContext(xr)}function vh({value:e,children:t}){return w.createElement(xr.Provider,{value:e},t)}function gh({children:e}){return w.createElement(xr.Provider,{value:null},e)}function yh(e){function t(){document.readyState!=="loading"&&(e(),document.removeEventListener("DOMContentLoaded",t))}typeof window<"u"&&typeof document<"u"&&(document.addEventListener("DOMContentLoaded",t),t())}let pt=[];yh(()=>{function e(t){if(!gt(t.target)||t.target===document.body||pt[0]===t.target)return;let n=t.target;n=n.closest(rr),pt.unshift(n??t.target),pt=pt.filter(r=>r!=null&&r.isConnected),pt.splice(10)}window.addEventListener("click",e,{capture:!0}),window.addEventListener("mousedown",e,{capture:!0}),window.addEventListener("focus",e,{capture:!0}),document.body.addEventListener("click",e,{capture:!0}),document.body.addEventListener("mousedown",e,{capture:!0}),document.body.addEventListener("focus",e,{capture:!0})});function Ui(e){let t=ie(e),n=d.useRef(!1);d.useEffect(()=>(n.current=!1,()=>{n.current=!0,wr(()=>{n.current&&t()})}),[t])}function wh(){let e=typeof document>"u";return"useSyncExternalStore"in Kn?(t=>t.useSyncExternalStore)(Kn)(()=>()=>{},()=>!1,()=>!e):!1}function Mn(){let e=wh(),[t,n]=d.useState(Xe.isHandoffComplete);return t&&Xe.isHandoffComplete===!1&&n(!1),d.useEffect(()=>{t!==!0&&n(!0)},[t]),d.useEffect(()=>Xe.handoff(),[]),e?!1:t}let zi=d.createContext(!1);function bh(){return d.useContext(zi)}function Ws(e){return w.createElement(zi.Provider,{value:e.force},e.children)}function xh(e){let t=bh(),n=d.useContext(Gi),[r,o]=d.useState(()=>{var s;if(!t&&n!==null)return(s=n.current)!=null?s:null;if(Xe.isServer)return null;let i=e?.getElementById("headlessui-portal-root");if(i)return i;if(e===null)return null;let a=e.createElement("div");return a.setAttribute("id","headlessui-portal-root"),e.body.appendChild(a)});return d.useEffect(()=>{r!==null&&(e!=null&&e.body.contains(r)||e==null||e.body.appendChild(r))},[r,e]),d.useEffect(()=>{t||n!==null&&o(n.current)},[n,o,t]),r}let qi=d.Fragment,Sh=Oe(function(e,t){let{ownerDocument:n=null,...r}=e,o=d.useRef(null),s=Je(bm(h=>{o.current=h}),t),i=br(o),a=n??i,l=xh(a),[u]=d.useState(()=>{var h;return Xe.isServer?null:(h=a?.createElement("div"))!=null?h:null}),f=d.useContext(bo),c=Mn();xe(()=>{!l||!u||l.contains(u)||(u.setAttribute("data-headlessui-portal",""),l.appendChild(u))},[l,u]),xe(()=>{if(u&&f)return f.register(u)},[f,u]),Ui(()=>{var h;!l||!u||(Ni(u)&&l.contains(u)&&l.removeChild(u),l.childNodes.length<=0&&((h=l.parentElement)==null||h.removeChild(l)))});let m=Re();return c?!l||!u?null:Qt.createPortal(m({ourProps:{ref:s},theirProps:r,slot:{},defaultTag:qi,name:"Portal"}),u):null});function Eh(e,t){let n=Je(t),{enabled:r=!0,ownerDocument:o,...s}=e,i=Re();return r?w.createElement(Sh,{...s,ownerDocument:o,ref:n}):i({ourProps:{ref:n},theirProps:s,slot:{},defaultTag:qi,name:"Portal"})}let Ch=d.Fragment,Gi=d.createContext(null);function Oh(e,t){let{target:n,...r}=e,o={ref:Je(t)},s=Re();return w.createElement(Gi.Provider,{value:n},s({ourProps:o,theirProps:r,defaultTag:Ch,name:"Popover.Group"}))}let bo=d.createContext(null);function Th(){let e=d.useContext(bo),t=d.useRef([]),n=ie(s=>(t.current.push(s),e&&e.register(s),()=>r(s))),r=ie(s=>{let i=t.current.indexOf(s);i!==-1&&t.current.splice(i,1),e&&e.unregister(s)}),o=d.useMemo(()=>({register:n,unregister:r,portals:t}),[n,r,t]);return[t,d.useMemo(()=>function({children:s}){return w.createElement(bo.Provider,{value:o},s)},[o])]}let Mh=Oe(Eh),Ki=Oe(Oh),Ph=Object.assign(Mh,{Group:Ki});function Dh(e,t=typeof document<"u"?document.defaultView:null,n){let r=Tn(e,"escape");Vi(t,"keydown",o=>{r&&(o.defaultPrevented||o.key===Ii.Escape&&n(o))})}function kh(){var e;let[t]=d.useState(()=>typeof window<"u"&&typeof window.matchMedia=="function"?window.matchMedia("(pointer: coarse)"):null),[n,r]=d.useState((e=t?.matches)!=null?e:!1);return xe(()=>{if(!t)return;function o(s){r(s.matches)}return t.addEventListener("change",o),()=>t.removeEventListener("change",o)},[t]),n}function Nh({defaultContainers:e=[],portals:t,mainTreeNode:n}={}){let r=br(n),o=ie(()=>{var s,i;let a=[];for(let l of e)l!==null&&(yt(l)?a.push(l):"current"in l&&yt(l.current)&&a.push(l.current));if(t!=null&&t.current)for(let l of t.current)a.push(l);for(let l of(s=r?.querySelectorAll("html > *, body > *"))!=null?s:[])l!==document.body&&l!==document.head&&yt(l)&&l.id!=="headlessui-portal-root"&&(n&&(l.contains(n)||l.contains((i=n?.getRootNode())==null?void 0:i.host))||a.some(u=>l.contains(u))||a.push(l));return a});return{resolveContainers:o,contains:ie(s=>o().some(i=>i.contains(s)))}}let Xi=d.createContext(null);function Ls({children:e,node:t}){let[n,r]=d.useState(null),o=Zi(t??n);return w.createElement(Xi.Provider,{value:o},e,o===null&&w.createElement(go,{features:nr.Hidden,ref:s=>{var i,a;if(s){for(let l of(a=(i=yr(s))==null?void 0:i.querySelectorAll("html > *, body > *"))!=null?a:[])if(l!==document.body&&l!==document.head&&yt(l)&&l!=null&&l.contains(s)){r(l);break}}}}))}function Zi(e=null){var t;return(t=d.useContext(Xi))!=null?t:e}function Uo(){let e=d.useRef(!1);return xe(()=>(e.current=!0,()=>{e.current=!1}),[]),e}var hn=(e=>(e[e.Forwards=0]="Forwards",e[e.Backwards=1]="Backwards",e))(hn||{});function Rh(){let e=d.useRef(0);return Yi(!0,"keydown",t=>{t.key==="Tab"&&(e.current=t.shiftKey?1:0)},!0),e}function Qi(e){if(!e)return new Set;if(typeof e=="function")return new Set(e());let t=new Set;for(let n of e.current)yt(n.current)&&t.add(n.current);return t}let Ah="div";var Dt=(e=>(e[e.None=0]="None",e[e.InitialFocus=1]="InitialFocus",e[e.TabLock=2]="TabLock",e[e.FocusLock=4]="FocusLock",e[e.RestoreFocus=8]="RestoreFocus",e[e.AutoFocus=16]="AutoFocus",e))(Dt||{});function Ih(e,t){let n=d.useRef(null),r=Je(n,t),{initialFocus:o,initialFocusFallback:s,containers:i,features:a=15,...l}=e;Mn()||(a=0);let u=br(n);Lh(a,{ownerDocument:u});let f=$h(a,{ownerDocument:u,container:n,initialFocus:o,initialFocusFallback:s});jh(a,{ownerDocument:u,container:n,containers:i,previousActiveElement:f});let c=Rh(),m=ie(x=>{if(!_t(n.current))return;let b=n.current;(E=>E())(()=>{it(c.current,{[hn.Forwards]:()=>{gn(b,tt.First,{skipElements:[x.relatedTarget,s]})},[hn.Backwards]:()=>{gn(b,tt.Last,{skipElements:[x.relatedTarget,s]})}})})}),h=Tn(!!(a&2),"focus-trap#tab-lock"),g=Ho(),p=d.useRef(!1),v={ref:r,onKeyDown(x){x.key=="Tab"&&(p.current=!0,g.requestAnimationFrame(()=>{p.current=!1}))},onBlur(x){if(!(a&4))return;let b=Qi(i);_t(n.current)&&b.add(n.current);let E=x.relatedTarget;gt(E)&&E.dataset.headlessuiFocusGuard!=="true"&&(Ji(b,E)||(p.current?gn(n.current,it(c.current,{[hn.Forwards]:()=>tt.Next,[hn.Backwards]:()=>tt.Previous})|tt.WrapAround,{relativeTo:x.target}):gt(x.target)&&ot(x.target)))}},y=Re();return w.createElement(w.Fragment,null,h&&w.createElement(go,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:m,features:nr.Focusable}),y({ourProps:v,theirProps:l,defaultTag:Ah,name:"FocusTrap"}),h&&w.createElement(go,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:m,features:nr.Focusable}))}let _h=Oe(Ih),Fh=Object.assign(_h,{features:Dt});function Wh(e=!0){let t=d.useRef(pt.slice());return Vo(([n],[r])=>{r===!0&&n===!1&&wr(()=>{t.current.splice(0)}),r===!1&&n===!0&&(t.current=pt.slice())},[e,pt,t]),ie(()=>{var n;return(n=t.current.find(r=>r!=null&&r.isConnected))!=null?n:null})}function Lh(e,{ownerDocument:t}){let n=!!(e&8),r=Wh(n);Vo(()=>{n||t?.activeElement===t?.body&&ot(r())},[n]),Ui(()=>{n&&ot(r())})}function $h(e,{ownerDocument:t,container:n,initialFocus:r,initialFocusFallback:o}){let s=d.useRef(null),i=Tn(!!(e&1),"focus-trap#initial-focus"),a=Uo();return Vo(()=>{if(e===0)return;if(!i){o!=null&&o.current&&ot(o.current);return}let l=n.current;l&&wr(()=>{if(!a.current)return;let u=t?.activeElement;if(r!=null&&r.current){if(r?.current===u){s.current=u;return}}else if(l.contains(u)){s.current=u;return}if(r!=null&&r.current)ot(r.current);else{if(e&16){if(gn(l,tt.First|tt.AutoFocus)!==wo.Error)return}else if(gn(l,tt.First)!==wo.Error)return;if(o!=null&&o.current&&(ot(o.current),t?.activeElement===o.current))return;console.warn("There are no focusable elements inside the ")}s.current=t?.activeElement})},[o,i,e]),s}function jh(e,{ownerDocument:t,container:n,containers:r,previousActiveElement:o}){let s=Uo(),i=!!(e&4);Vi(t?.defaultView,"focus",a=>{if(!i||!s.current)return;let l=Qi(r);_t(n.current)&&l.add(n.current);let u=o.current;if(!u)return;let f=a.target;_t(f)?Ji(l,f)?(o.current=f,ot(f)):(a.preventDefault(),a.stopPropagation(),ot(u)):ot(o.current)},!0)}function Ji(e,t){for(let n of e)if(n.contains(t))return!0;return!1}function el(e){var t;return!!(e.enter||e.enterFrom||e.enterTo||e.leave||e.leaveFrom||e.leaveTo)||((t=e.as)!=null?t:nl)!==d.Fragment||w.Children.count(e.children)===1}let Er=d.createContext(null);Er.displayName="TransitionContext";var Bh=(e=>(e.Visible="visible",e.Hidden="hidden",e))(Bh||{});function Hh(){let e=d.useContext(Er);if(e===null)throw new Error("A is used but it is missing a parent or .");return e}function Yh(){let e=d.useContext(Cr);if(e===null)throw new Error("A is used but it is missing a parent or .");return e}let Cr=d.createContext(null);Cr.displayName="NestingContext";function Or(e){return"children"in e?Or(e.children):e.current.filter(({el:t})=>t.current!==null).filter(({state:t})=>t==="visible").length>0}function tl(e,t){let n=Lt(e),r=d.useRef([]),o=Uo(),s=Ho(),i=ie((h,g=vt.Hidden)=>{let p=r.current.findIndex(({el:v})=>v===h);p!==-1&&(it(g,{[vt.Unmount](){r.current.splice(p,1)},[vt.Hidden](){r.current[p].state="hidden"}}),s.microTask(()=>{var v;!Or(r)&&o.current&&((v=n.current)==null||v.call(n))}))}),a=ie(h=>{let g=r.current.find(({el:p})=>p===h);return g?g.state!=="visible"&&(g.state="visible"):r.current.push({el:h,state:"visible"}),()=>i(h,vt.Unmount)}),l=d.useRef([]),u=d.useRef(Promise.resolve()),f=d.useRef({enter:[],leave:[]}),c=ie((h,g,p)=>{l.current.splice(0),t&&(t.chains.current[g]=t.chains.current[g].filter(([v])=>v!==h)),t?.chains.current[g].push([h,new Promise(v=>{l.current.push(v)})]),t?.chains.current[g].push([h,new Promise(v=>{Promise.all(f.current[g].map(([y,x])=>x)).then(()=>v())})]),g==="enter"?u.current=u.current.then(()=>t?.wait.current).then(()=>p(g)):p(g)}),m=ie((h,g,p)=>{Promise.all(f.current[g].splice(0).map(([v,y])=>y)).then(()=>{var v;(v=l.current.shift())==null||v()}).then(()=>p(g))});return d.useMemo(()=>({children:r,register:a,unregister:i,onStart:c,onStop:m,wait:u,chains:f}),[a,i,r,c,m,f,u])}let nl=d.Fragment,rl=tr.RenderStrategy;function Vh(e,t){var n,r;let{transition:o=!0,beforeEnter:s,afterEnter:i,beforeLeave:a,afterLeave:l,enter:u,enterFrom:f,enterTo:c,entered:m,leave:h,leaveFrom:g,leaveTo:p,...v}=e,[y,x]=d.useState(null),b=d.useRef(null),E=el(e),S=Je(...E?[b,t,x]:t===null?[]:[t]),T=(n=v.unmount)==null||n?vt.Unmount:vt.Hidden,{show:C,appear:M,initial:I}=Hh(),[N,_]=d.useState(C?"visible":"hidden"),B=Yh(),{register:R,unregister:$}=B;xe(()=>R(b),[R,b]),xe(()=>{if(T===vt.Hidden&&b.current){if(C&&N!=="visible"){_("visible");return}return it(N,{hidden:()=>$(b),visible:()=>R(b)})}},[N,b,R,$,C,T]);let H=Mn();xe(()=>{if(E&&H&&N==="visible"&&b.current===null)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")},[b,N,H,E]);let P=I&&!M,F=M&&C&&I,k=d.useRef(!1),j=tl(()=>{k.current||(_("hidden"),$(b))},B),U=ie(A=>{k.current=!0;let L=A?"enter":"leave";j.onStart(b,L,Z=>{Z==="enter"?s?.():Z==="leave"&&a?.()})}),oe=ie(A=>{let L=A?"enter":"leave";k.current=!1,j.onStop(b,L,Z=>{Z==="enter"?i?.():Z==="leave"&&l?.()}),L==="leave"&&!Or(j)&&(_("hidden"),$(b))});d.useEffect(()=>{E&&o||(U(C),oe(C))},[C,E,o]);let me=!(!o||!E||!H||P),[,D]=fh(me,y,C,{start:U,end:oe}),q=Mt({ref:S,className:((r=vo(v.className,F&&u,F&&f,D.enter&&u,D.enter&&D.closed&&f,D.enter&&!D.closed&&c,D.leave&&h,D.leave&&!D.closed&&g,D.leave&&D.closed&&p,!D.transition&&C&&m))==null?void 0:r.trim())||void 0,...dh(D)}),K=0;N==="visible"&&(K|=Le.Open),N==="hidden"&&(K|=Le.Closed),C&&N==="hidden"&&(K|=Le.Opening),!C&&N==="visible"&&(K|=Le.Closing);let le=Re();return w.createElement(Cr.Provider,{value:j},w.createElement(vh,{value:K},le({ourProps:q,theirProps:v,defaultTag:nl,features:rl,visible:N==="visible",name:"Transition.Child"})))}function Uh(e,t){let{show:n,appear:r=!1,unmount:o=!0,...s}=e,i=d.useRef(null),a=el(e),l=Je(...a?[i,t]:t===null?[]:[t]);Mn();let u=Sr();if(n===void 0&&u!==null&&(n=(u&Le.Open)===Le.Open),n===void 0)throw new Error("A is used but it is missing a `show={true | false}` prop.");let[f,c]=d.useState(n?"visible":"hidden"),m=tl(()=>{n||c("hidden")}),[h,g]=d.useState(!0),p=d.useRef([n]);xe(()=>{h!==!1&&p.current[p.current.length-1]!==n&&(p.current.push(n),g(!1))},[p,n]);let v=d.useMemo(()=>({show:n,appear:r,initial:h}),[n,r,h]);xe(()=>{n?c("visible"):!Or(m)&&i.current!==null&&c("hidden")},[n,m]);let y={unmount:o},x=ie(()=>{var S;h&&g(!1),(S=e.beforeEnter)==null||S.call(e)}),b=ie(()=>{var S;h&&g(!1),(S=e.beforeLeave)==null||S.call(e)}),E=Re();return w.createElement(Cr.Provider,{value:m},w.createElement(Er.Provider,{value:v},E({ourProps:{...y,as:d.Fragment,children:w.createElement(ol,{ref:l,...y,...s,beforeEnter:x,beforeLeave:b})},theirProps:{},defaultTag:d.Fragment,features:rl,visible:f==="visible",name:"Transition"})))}function zh(e,t){let n=d.useContext(Er)!==null,r=Sr()!==null;return w.createElement(w.Fragment,null,!n&&r?w.createElement(xo,{ref:t,...e}):w.createElement(ol,{ref:t,...e}))}let xo=Oe(Uh),ol=Oe(Vh),zo=Oe(zh),qh=Object.assign(xo,{Child:zo,Root:xo});var Gh=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Gh||{}),Kh=(e=>(e[e.SetTitleId=0]="SetTitleId",e))(Kh||{});let Xh={0(e,t){return e.titleId===t.id?e:{...e,titleId:t.id}}},qo=d.createContext(null);qo.displayName="DialogContext";function Tr(e){let t=d.useContext(qo);if(t===null){let n=new Error(`<${e} /> is missing a parent

component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,Tr),n}return t}function Zh(e,t){return it(t.type,Xh,e,t)}let $s=Oe(function(e,t){let n=d.useId(),{id:r=`headlessui-dialog-${n}`,open:o,onClose:s,initialFocus:i,role:a="dialog",autoFocus:l=!0,__demoMode:u=!1,unmount:f=!1,...c}=e,m=d.useRef(!1);a=(function(){return a==="dialog"||a==="alertdialog"?a:(m.current||(m.current=!0,console.warn(`Invalid role [${a}] passed to . Only \`dialog\` and and \`alertdialog\` are supported. Using \`dialog\` instead.`)),"dialog")})();let h=Sr();o===void 0&&h!==null&&(o=(h&Le.Open)===Le.Open);let g=d.useRef(null),p=Je(g,t),v=br(g),y=o?0:1,[x,b]=d.useReducer(Zh,{titleId:null,descriptionId:null,panelRef:d.createRef()}),E=ie(()=>s(!1)),S=ie(D=>b({type:0,id:D})),T=Mn()?y===0:!1,[C,M]=Th(),I={get current(){var D;return(D=x.panelRef.current)!=null?D:g.current}},N=Zi(),{resolveContainers:_}=Nh({mainTreeNode:N,portals:C,defaultContainers:[I]}),B=h!==null?(h&Le.Closing)===Le.Closing:!1;Bm(u||B?!1:T,{allowed:ie(()=>{var D,q;return[(q=(D=g.current)==null?void 0:D.closest("[data-headlessui-portal]"))!=null?q:null]}),disallowed:ie(()=>{var D;return[(D=N?.closest("body > *:not(#headlessui-portal-root)"))!=null?D:null]})});let R=$i.get(null);xe(()=>{if(T)return R.actions.push(r),()=>R.actions.pop(r)},[R,r,T]);let $=ji(R,d.useCallback(D=>R.selectors.isTop(D,r),[R,r]));Jm($,_,D=>{D.preventDefault(),E()}),Dh($,v?.defaultView,D=>{D.preventDefault(),D.stopPropagation(),document.activeElement&&"blur"in document.activeElement&&typeof document.activeElement.blur=="function"&&document.activeElement.blur(),E()}),ih(u||B?!1:T,v,_),Hm(T,g,E);let[H,P]=xm(),F=d.useMemo(()=>[{dialogState:y,close:E,setTitleId:S,unmount:f},x],[y,x,E,S,f]),k=d.useMemo(()=>({open:y===0}),[y]),j={ref:p,id:r,role:a,tabIndex:-1,"aria-modal":u?void 0:y===0?!0:void 0,"aria-labelledby":x.titleId,"aria-describedby":H,unmount:f},U=!kh(),oe=Dt.None;T&&!u&&(oe|=Dt.RestoreFocus,oe|=Dt.TabLock,l&&(oe|=Dt.AutoFocus),U&&(oe|=Dt.InitialFocus));let me=Re();return w.createElement(gh,null,w.createElement(Ws,{force:!0},w.createElement(Ph,null,w.createElement(qo.Provider,{value:F},w.createElement(Ki,{target:g},w.createElement(Ws,{force:!1},w.createElement(P,{slot:k},w.createElement(M,null,w.createElement(Fh,{initialFocus:i,initialFocusFallback:g,containers:_,features:oe},w.createElement(Mm,{value:E},me({ourProps:j,theirProps:c,slot:k,defaultTag:Qh,features:Jh,visible:y===0,name:"Dialog"})))))))))))}),Qh="div",Jh=tr.RenderStrategy|tr.Static;function ep(e,t){let{transition:n=!1,open:r,...o}=e,s=Sr(),i=e.hasOwnProperty("open")||s!==null,a=e.hasOwnProperty("onClose");if(!i&&!a)throw new Error("You have to provide an `open` and an `onClose` prop to the `Dialog` component.");if(!i)throw new Error("You provided an `onClose` prop to the `Dialog`, but forgot an `open` prop.");if(!a)throw new Error("You provided an `open` prop to the `Dialog`, but forgot an `onClose` prop.");if(!s&&typeof e.open!="boolean")throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${e.open}`);if(typeof e.onClose!="function")throw new Error(`You provided an \`onClose\` prop to the \`Dialog\`, but the value is not a function. Received: ${e.onClose}`);return(r!==void 0||n)&&!o.static?w.createElement(Ls,null,w.createElement(qh,{show:r,transition:n,unmount:o.unmount},w.createElement($s,{ref:t,...o}))):w.createElement(Ls,null,w.createElement($s,{ref:t,open:r,...o}))}let tp="div";function np(e,t){let n=d.useId(),{id:r=`headlessui-dialog-panel-${n}`,transition:o=!1,...s}=e,[{dialogState:i,unmount:a},l]=Tr("Dialog.Panel"),u=Je(t,l.panelRef),f=d.useMemo(()=>({open:i===0}),[i]),c=ie(v=>{v.stopPropagation()}),m={ref:u,id:r,onClick:c},h=o?zo:d.Fragment,g=o?{unmount:a}:{},p=Re();return w.createElement(h,{...g},p({ourProps:m,theirProps:s,slot:f,defaultTag:tp,name:"Dialog.Panel"}))}let rp="div";function op(e,t){let{transition:n=!1,...r}=e,[{dialogState:o,unmount:s}]=Tr("Dialog.Backdrop"),i=d.useMemo(()=>({open:o===0}),[o]),a={ref:t,"aria-hidden":!0},l=n?zo:d.Fragment,u=n?{unmount:s}:{},f=Re();return w.createElement(l,{...u},f({ourProps:a,theirProps:r,slot:i,defaultTag:rp,name:"Dialog.Backdrop"}))}let sp="h2";function ap(e,t){let n=d.useId(),{id:r=`headlessui-dialog-title-${n}`,...o}=e,[{dialogState:s,setTitleId:i}]=Tr("Dialog.Title"),a=Je(t);d.useEffect(()=>(i(r),()=>i(null)),[r,i]);let l=d.useMemo(()=>({open:s===0}),[s]),u={ref:a,id:r};return Re()({ourProps:u,theirProps:o,slot:l,defaultTag:sp,name:"Dialog.Title"})}let ip=Oe(ep),lp=Oe(np);Oe(op);let cp=Oe(ap),iw=Object.assign(ip,{Panel:lp,Title:cp,Description:Om});function up(e,t,n="long"){return new Intl.DateTimeFormat("en-US",{hour:"numeric",timeZone:e,timeZoneName:n}).format(t).split(/\s/g).slice(2).join(" ")}const dp={},pn={};function Nt(e,t){try{const r=(dp[e]||=new Intl.DateTimeFormat("en-US",{timeZone:e,timeZoneName:"longOffset"}).format)(t).split("GMT")[1];return r in pn?pn[r]:js(r,r.split(":"))}catch{if(e in pn)return pn[e];const n=e?.match(fp);return n?js(e,n.slice(1)):NaN}}const fp=/([+-]\d\d):?(\d\d)?/;function js(e,t){const n=+(t[0]||0),r=+(t[1]||0),o=+(t[2]||0)/60;return pn[e]=n*60+r>0?n*60+r+o:n*60-r-o}class Ge extends Date{constructor(...t){super(),t.length>1&&typeof t[t.length-1]=="string"&&(this.timeZone=t.pop()),this.internal=new Date,isNaN(Nt(this.timeZone,this))?this.setTime(NaN):t.length?typeof t[0]=="number"&&(t.length===1||t.length===2&&typeof t[1]!="number")?this.setTime(t[0]):typeof t[0]=="string"?this.setTime(+new Date(t[0])):t[0]instanceof Date?this.setTime(+t[0]):(this.setTime(+new Date(...t)),sl(this),So(this)):this.setTime(Date.now())}static tz(t,...n){return n.length?new Ge(...n,t):new Ge(Date.now(),t)}withTimeZone(t){return new Ge(+this,t)}getTimezoneOffset(){const t=-Nt(this.timeZone,this);return t>0?Math.floor(t):Math.ceil(t)}setTime(t){return Date.prototype.setTime.apply(this,arguments),So(this),+this}[Symbol.for("constructDateFrom")](t){return new Ge(+new Date(t),this.timeZone)}}const Bs=/^(get|set)(?!UTC)/;Object.getOwnPropertyNames(Date.prototype).forEach(e=>{if(!Bs.test(e))return;const t=e.replace(Bs,"$1UTC");Ge.prototype[t]&&(e.startsWith("get")?Ge.prototype[e]=function(){return this.internal[t]()}:(Ge.prototype[e]=function(){return Date.prototype[t].apply(this.internal,arguments),mp(this),+this},Ge.prototype[t]=function(){return Date.prototype[t].apply(this,arguments),So(this),+this}))});function So(e){e.internal.setTime(+e),e.internal.setUTCSeconds(e.internal.getUTCSeconds()-Math.round(-Nt(e.timeZone,e)*60))}function mp(e){Date.prototype.setFullYear.call(e,e.internal.getUTCFullYear(),e.internal.getUTCMonth(),e.internal.getUTCDate()),Date.prototype.setHours.call(e,e.internal.getUTCHours(),e.internal.getUTCMinutes(),e.internal.getUTCSeconds(),e.internal.getUTCMilliseconds()),sl(e)}function sl(e){const t=Nt(e.timeZone,e),n=t>0?Math.floor(t):Math.ceil(t),r=new Date(+e);r.setUTCHours(r.getUTCHours()-1);const o=-new Date(+e).getTimezoneOffset(),s=-new Date(+r).getTimezoneOffset(),i=o-s,a=Date.prototype.getHours.apply(e)!==e.internal.getUTCHours();i&&a&&e.internal.setUTCMinutes(e.internal.getUTCMinutes()+i);const l=o-n;l&&Date.prototype.setUTCMinutes.call(e,Date.prototype.getUTCMinutes.call(e)+l);const u=new Date(+e);u.setUTCSeconds(0);const f=o>0?u.getSeconds():(u.getSeconds()-60)%60,c=Math.round(-(Nt(e.timeZone,e)*60))%60;(c||f)&&(e.internal.setUTCSeconds(e.internal.getUTCSeconds()+c),Date.prototype.setUTCSeconds.call(e,Date.prototype.getUTCSeconds.call(e)+c+f));const m=Nt(e.timeZone,e),h=m>0?Math.floor(m):Math.ceil(m),p=-new Date(+e).getTimezoneOffset()-h,v=h!==n,y=p-l;if(v&&y){Date.prototype.setUTCMinutes.call(e,Date.prototype.getUTCMinutes.call(e)+y);const x=Nt(e.timeZone,e),b=x>0?Math.floor(x):Math.ceil(x),E=h-b;E&&(e.internal.setUTCMinutes(e.internal.getUTCMinutes()+E),Date.prototype.setUTCMinutes.call(e,Date.prototype.getUTCMinutes.call(e)+E))}}class be extends Ge{static tz(t,...n){return n.length?new be(...n,t):new be(Date.now(),t)}toISOString(){const[t,n,r]=this.tzComponents(),o=`${t}${n}:${r}`;return this.internal.toISOString().slice(0,-1)+o}toString(){return`${this.toDateString()} ${this.toTimeString()}`}toDateString(){const[t,n,r,o]=this.internal.toUTCString().split(" ");return`${t?.slice(0,-1)} ${r} ${n} ${o}`}toTimeString(){const t=this.internal.toUTCString().split(" ")[4],[n,r,o]=this.tzComponents();return`${t} GMT${n}${r}${o} (${up(this.timeZone,this)})`}toLocaleString(t,n){return Date.prototype.toLocaleString.call(this,t,{...n,timeZone:n?.timeZone||this.timeZone})}toLocaleDateString(t,n){return Date.prototype.toLocaleDateString.call(this,t,{...n,timeZone:n?.timeZone||this.timeZone})}toLocaleTimeString(t,n){return Date.prototype.toLocaleTimeString.call(this,t,{...n,timeZone:n?.timeZone||this.timeZone})}tzComponents(){const t=this.getTimezoneOffset(),n=t>0?"-":"+",r=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),o=String(Math.abs(t)%60).padStart(2,"0");return[n,r,o]}withTimeZone(t){return new be(+this,t)}[Symbol.for("constructDateFrom")](t){return new be(+new Date(t),this.timeZone)}}const al=6048e5,hp=864e5,Hs=Symbol.for("constructDateFrom");function fe(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&Hs in e?e[Hs](t):e instanceof Date?new e.constructor(t):new Date(t)}function ae(e,t){return fe(t||e,e)}function il(e,t,n){const r=ae(e,n?.in);return isNaN(t)?fe(e,NaN):(t&&r.setDate(r.getDate()+t),r)}function ll(e,t,n){const r=ae(e,n?.in);if(isNaN(t))return fe(e,NaN);if(!t)return r;const o=r.getDate(),s=fe(e,r.getTime());s.setMonth(r.getMonth()+t+1,0);const i=s.getDate();return o>=i?s:(r.setFullYear(s.getFullYear(),s.getMonth(),o),r)}let pp={};function Pn(){return pp}function Zt(e,t){const n=Pn(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,o=ae(e,t?.in),s=o.getDay(),i=(s=s.getTime()?r+1:n.getTime()>=a.getTime()?r:r-1}function Ys(e){const t=ae(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}function on(e,...t){const n=fe.bind(null,t.find(r=>typeof r=="object"));return t.map(n)}function Sn(e,t){const n=ae(e,t?.in);return n.setHours(0,0,0,0),n}function ul(e,t,n){const[r,o]=on(n?.in,e,t),s=Sn(r),i=Sn(o),a=+s-Ys(s),l=+i-Ys(i);return Math.round((a-l)/hp)}function vp(e,t){const n=cl(e,t),r=fe(e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),xn(r)}function gp(e,t,n){return il(e,t*7,n)}function yp(e,t,n){return ll(e,t*12,n)}function wp(e,t){let n,r=t?.in;return e.forEach(o=>{!r&&typeof o=="object"&&(r=fe.bind(null,o));const s=ae(o,r);(!n||n{!r&&typeof o=="object"&&(r=fe.bind(null,o));const s=ae(o,r);(!n||n>s||isNaN(+s))&&(n=s)}),fe(r,n||NaN)}function xp(e,t,n){const[r,o]=on(n?.in,e,t);return+Sn(r)==+Sn(o)}function dl(e){return e instanceof Date||typeof e=="object"&&Object.prototype.toString.call(e)==="[object Date]"}function Sp(e){return!(!dl(e)&&typeof e!="number"||isNaN(+ae(e)))}function Ep(e,t,n){const[r,o]=on(n?.in,e,t),s=r.getFullYear()-o.getFullYear(),i=r.getMonth()-o.getMonth();return s*12+i}function Cp(e,t){const n=ae(e,t?.in),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function Op(e,t){const[n,r]=on(e,t.start,t.end);return{start:n,end:r}}function Tp(e,t){const{start:n,end:r}=Op(t?.in,e);let o=+n>+r;const s=o?+n:+r,i=o?r:n;i.setHours(0,0,0,0),i.setDate(1);let a=1;const l=[];for(;+i<=s;)l.push(fe(n,i)),i.setMonth(i.getMonth()+a);return o?l.reverse():l}function Mp(e,t){const n=ae(e,t?.in);return n.setDate(1),n.setHours(0,0,0,0),n}function Pp(e,t){const n=ae(e,t?.in),r=n.getFullYear();return n.setFullYear(r+1,0,0),n.setHours(23,59,59,999),n}function fl(e,t){const n=ae(e,t?.in);return n.setFullYear(n.getFullYear(),0,1),n.setHours(0,0,0,0),n}function ml(e,t){const n=Pn(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,o=ae(e,t?.in),s=o.getDay(),i=(s{let r;const o=kp[e];return typeof o=="string"?r=o:t===1?r=o.one:r=o.other.replace("{{count}}",t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r};function Zr(e){return(t={})=>{const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const Rp={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Ap={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Ip={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},_p={date:Zr({formats:Rp,defaultWidth:"full"}),time:Zr({formats:Ap,defaultWidth:"full"}),dateTime:Zr({formats:Ip,defaultWidth:"full"})},Fp={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Wp=(e,t,n,r)=>Fp[e];function cn(e){return(t,n)=>{const r=n?.context?String(n.context):"standalone";let o;if(r==="formatting"&&e.formattingValues){const i=e.defaultFormattingWidth||e.defaultWidth,a=n?.width?String(n.width):i;o=e.formattingValues[a]||e.formattingValues[i]}else{const i=e.defaultWidth,a=n?.width?String(n.width):e.defaultWidth;o=e.values[a]||e.values[i]}const s=e.argumentCallback?e.argumentCallback(t):t;return o[s]}}const Lp={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},$p={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},jp={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},Bp={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},Hp={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Yp={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Vp=(e,t)=>{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},Up={ordinalNumber:Vp,era:cn({values:Lp,defaultWidth:"wide"}),quarter:cn({values:$p,defaultWidth:"wide",argumentCallback:e=>e-1}),month:cn({values:jp,defaultWidth:"wide"}),day:cn({values:Bp,defaultWidth:"wide"}),dayPeriod:cn({values:Hp,defaultWidth:"wide",formattingValues:Yp,defaultFormattingWidth:"wide"})};function un(e){return(t,n={})=>{const r=n.width,o=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],s=t.match(o);if(!s)return null;const i=s[0],a=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(a)?qp(a,c=>c.test(i)):zp(a,c=>c.test(i));let u;u=e.valueCallback?e.valueCallback(l):l,u=n.valueCallback?n.valueCallback(u):u;const f=t.slice(i.length);return{value:u,rest:f}}}function zp(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function qp(e,t){for(let n=0;n{const r=t.match(e.matchPattern);if(!r)return null;const o=r[0],s=t.match(e.parsePattern);if(!s)return null;let i=e.valueCallback?e.valueCallback(s[0]):s[0];i=n.valueCallback?n.valueCallback(i):i;const a=t.slice(o.length);return{value:i,rest:a}}}const Kp=/^(\d+)(th|st|nd|rd)?/i,Xp=/\d+/i,Zp={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Qp={any:[/^b/i,/^(a|c)/i]},Jp={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},ev={any:[/1/i,/2/i,/3/i,/4/i]},tv={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},nv={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},rv={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},ov={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},sv={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},av={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},iv={ordinalNumber:Gp({matchPattern:Kp,parsePattern:Xp,valueCallback:e=>parseInt(e,10)}),era:un({matchPatterns:Zp,defaultMatchWidth:"wide",parsePatterns:Qp,defaultParseWidth:"any"}),quarter:un({matchPatterns:Jp,defaultMatchWidth:"wide",parsePatterns:ev,defaultParseWidth:"any",valueCallback:e=>e+1}),month:un({matchPatterns:tv,defaultMatchWidth:"wide",parsePatterns:nv,defaultParseWidth:"any"}),day:un({matchPatterns:rv,defaultMatchWidth:"wide",parsePatterns:ov,defaultParseWidth:"any"}),dayPeriod:un({matchPatterns:sv,defaultMatchWidth:"any",parsePatterns:av,defaultParseWidth:"any"})},Go={code:"en-US",formatDistance:Np,formatLong:_p,formatRelative:Wp,localize:Up,match:iv,options:{weekStartsOn:0,firstWeekContainsDate:1}};function lv(e,t){const n=ae(e,t?.in);return ul(n,fl(n))+1}function hl(e,t){const n=ae(e,t?.in),r=+xn(n)-+vp(n);return Math.round(r/al)+1}function pl(e,t){const n=ae(e,t?.in),r=n.getFullYear(),o=Pn(),s=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??o.firstWeekContainsDate??o.locale?.options?.firstWeekContainsDate??1,i=fe(t?.in||e,0);i.setFullYear(r+1,0,s),i.setHours(0,0,0,0);const a=Zt(i,t),l=fe(t?.in||e,0);l.setFullYear(r,0,s),l.setHours(0,0,0,0);const u=Zt(l,t);return+n>=+a?r+1:+n>=+u?r:r-1}function cv(e,t){const n=Pn(),r=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??n.firstWeekContainsDate??n.locale?.options?.firstWeekContainsDate??1,o=pl(e,t),s=fe(t?.in||e,0);return s.setFullYear(o,0,r),s.setHours(0,0,0,0),Zt(s,t)}function vl(e,t){const n=ae(e,t?.in),r=+Zt(n,t)-+cv(n,t);return Math.round(r/al)+1}function re(e,t){const n=e<0?"-":"",r=Math.abs(e).toString().padStart(t,"0");return n+r}const mt={y(e,t){const n=e.getFullYear(),r=n>0?n:1-n;return re(t==="yy"?r%100:r,t.length)},M(e,t){const n=e.getMonth();return t==="M"?String(n+1):re(n+1,2)},d(e,t){return re(e.getDate(),t.length)},a(e,t){const n=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.toUpperCase();case"aaa":return n;case"aaaaa":return n[0];case"aaaa":default:return n==="am"?"a.m.":"p.m."}},h(e,t){return re(e.getHours()%12||12,t.length)},H(e,t){return re(e.getHours(),t.length)},m(e,t){return re(e.getMinutes(),t.length)},s(e,t){return re(e.getSeconds(),t.length)},S(e,t){const n=t.length,r=e.getMilliseconds(),o=Math.trunc(r*Math.pow(10,n-3));return re(o,t.length)}},Yt={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},Vs={G:function(e,t,n){const r=e.getFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});case"GGGG":default:return n.era(r,{width:"wide"})}},y:function(e,t,n){if(t==="yo"){const r=e.getFullYear(),o=r>0?r:1-r;return n.ordinalNumber(o,{unit:"year"})}return mt.y(e,t)},Y:function(e,t,n,r){const o=pl(e,r),s=o>0?o:1-o;if(t==="YY"){const i=s%100;return re(i,2)}return t==="Yo"?n.ordinalNumber(s,{unit:"year"}):re(s,t.length)},R:function(e,t){const n=cl(e);return re(n,t.length)},u:function(e,t){const n=e.getFullYear();return re(n,t.length)},Q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"Q":return String(r);case"QQ":return re(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"q":return String(r);case"qq":return re(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(e,t,n){const r=e.getMonth();switch(t){case"M":case"MM":return mt.M(e,t);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(e,t,n){const r=e.getMonth();switch(t){case"L":return String(r+1);case"LL":return re(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){const o=vl(e,r);return t==="wo"?n.ordinalNumber(o,{unit:"week"}):re(o,t.length)},I:function(e,t,n){const r=hl(e);return t==="Io"?n.ordinalNumber(r,{unit:"week"}):re(r,t.length)},d:function(e,t,n){return t==="do"?n.ordinalNumber(e.getDate(),{unit:"date"}):mt.d(e,t)},D:function(e,t,n){const r=lv(e);return t==="Do"?n.ordinalNumber(r,{unit:"dayOfYear"}):re(r,t.length)},E:function(e,t,n){const r=e.getDay();switch(t){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});case"EEEE":default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){const o=e.getDay(),s=(o-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(s);case"ee":return re(s,2);case"eo":return n.ordinalNumber(s,{unit:"day"});case"eee":return n.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(o,{width:"short",context:"formatting"});case"eeee":default:return n.day(o,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){const o=e.getDay(),s=(o-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(s);case"cc":return re(s,t.length);case"co":return n.ordinalNumber(s,{unit:"day"});case"ccc":return n.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(o,{width:"narrow",context:"standalone"});case"cccccc":return n.day(o,{width:"short",context:"standalone"});case"cccc":default:return n.day(o,{width:"wide",context:"standalone"})}},i:function(e,t,n){const r=e.getDay(),o=r===0?7:r;switch(t){case"i":return String(o);case"ii":return re(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});case"iiii":default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(e,t,n){const o=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},b:function(e,t,n){const r=e.getHours();let o;switch(r===12?o=Yt.noon:r===0?o=Yt.midnight:o=r/12>=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},B:function(e,t,n){const r=e.getHours();let o;switch(r>=17?o=Yt.evening:r>=12?o=Yt.afternoon:r>=4?o=Yt.morning:o=Yt.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},h:function(e,t,n){if(t==="ho"){let r=e.getHours()%12;return r===0&&(r=12),n.ordinalNumber(r,{unit:"hour"})}return mt.h(e,t)},H:function(e,t,n){return t==="Ho"?n.ordinalNumber(e.getHours(),{unit:"hour"}):mt.H(e,t)},K:function(e,t,n){const r=e.getHours()%12;return t==="Ko"?n.ordinalNumber(r,{unit:"hour"}):re(r,t.length)},k:function(e,t,n){let r=e.getHours();return r===0&&(r=24),t==="ko"?n.ordinalNumber(r,{unit:"hour"}):re(r,t.length)},m:function(e,t,n){return t==="mo"?n.ordinalNumber(e.getMinutes(),{unit:"minute"}):mt.m(e,t)},s:function(e,t,n){return t==="so"?n.ordinalNumber(e.getSeconds(),{unit:"second"}):mt.s(e,t)},S:function(e,t){return mt.S(e,t)},X:function(e,t,n){const r=e.getTimezoneOffset();if(r===0)return"Z";switch(t){case"X":return zs(r);case"XXXX":case"XX":return Pt(r);case"XXXXX":case"XXX":default:return Pt(r,":")}},x:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"x":return zs(r);case"xxxx":case"xx":return Pt(r);case"xxxxx":case"xxx":default:return Pt(r,":")}},O:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+Us(r,":");case"OOOO":default:return"GMT"+Pt(r,":")}},z:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+Us(r,":");case"zzzz":default:return"GMT"+Pt(r,":")}},t:function(e,t,n){const r=Math.trunc(+e/1e3);return re(r,t.length)},T:function(e,t,n){return re(+e,t.length)}};function Us(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),o=Math.trunc(r/60),s=r%60;return s===0?n+String(o):n+String(o)+t+re(s,2)}function zs(e,t){return e%60===0?(e>0?"-":"+")+re(Math.abs(e)/60,2):Pt(e,t)}function Pt(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),o=re(Math.trunc(r/60),2),s=re(r%60,2);return n+o+t+s}const qs=(e,t)=>{switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}},gl=(e,t)=>{switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}},uv=(e,t)=>{const n=e.match(/(P+)(p+)?/)||[],r=n[1],o=n[2];if(!o)return qs(e,t);let s;switch(r){case"P":s=t.dateTime({width:"short"});break;case"PP":s=t.dateTime({width:"medium"});break;case"PPP":s=t.dateTime({width:"long"});break;case"PPPP":default:s=t.dateTime({width:"full"});break}return s.replace("{{date}}",qs(r,t)).replace("{{time}}",gl(o,t))},dv={p:gl,P:uv},fv=/^D+$/,mv=/^Y+$/,hv=["D","DD","YY","YYYY"];function pv(e){return fv.test(e)}function vv(e){return mv.test(e)}function gv(e,t,n){const r=yv(e,t,n);if(console.warn(r),hv.includes(e))throw new RangeError(r)}function yv(e,t,n){const r=e[0]==="Y"?"years":"days of the month";return`Use \`${e.toLowerCase()}\` instead of \`${e}\` (in \`${t}\`) for formatting ${r} to the input \`${n}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const wv=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,bv=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,xv=/^'([^]*?)'?$/,Sv=/''/g,Ev=/[a-zA-Z]/;function Cv(e,t,n){const r=Pn(),o=n?.locale??r.locale??Go,s=n?.firstWeekContainsDate??n?.locale?.options?.firstWeekContainsDate??r.firstWeekContainsDate??r.locale?.options?.firstWeekContainsDate??1,i=n?.weekStartsOn??n?.locale?.options?.weekStartsOn??r.weekStartsOn??r.locale?.options?.weekStartsOn??0,a=ae(e,n?.in);if(!Sp(a))throw new RangeError("Invalid time value");let l=t.match(bv).map(f=>{const c=f[0];if(c==="p"||c==="P"){const m=dv[c];return m(f,o.formatLong)}return f}).join("").match(wv).map(f=>{if(f==="''")return{isToken:!1,value:"'"};const c=f[0];if(c==="'")return{isToken:!1,value:Ov(f)};if(Vs[c])return{isToken:!0,value:f};if(c.match(Ev))throw new RangeError("Format string contains an unescaped latin alphabet character `"+c+"`");return{isToken:!1,value:f}});o.localize.preprocessor&&(l=o.localize.preprocessor(a,l));const u={firstWeekContainsDate:s,weekStartsOn:i,locale:o};return l.map(f=>{if(!f.isToken)return f.value;const c=f.value;(!n?.useAdditionalWeekYearTokens&&vv(c)||!n?.useAdditionalDayOfYearTokens&&pv(c))&&gv(c,t,String(e));const m=Vs[c[0]];return m(a,c,o.localize,u)}).join("")}function Ov(e){const t=e.match(xv);return t?t[1].replace(Sv,"'"):e}function Tv(e,t){const n=ae(e,t?.in),r=n.getFullYear(),o=n.getMonth(),s=fe(n,0);return s.setFullYear(r,o+1,0),s.setHours(0,0,0,0),s.getDate()}function Mv(e,t){return ae(e,t?.in).getMonth()}function Pv(e,t){return ae(e,t?.in).getFullYear()}function Dv(e,t){return+ae(e)>+ae(t)}function kv(e,t){return+ae(e)<+ae(t)}function Nv(e,t,n){const[r,o]=on(n?.in,e,t);return r.getFullYear()===o.getFullYear()&&r.getMonth()===o.getMonth()}function Rv(e,t,n){const[r,o]=on(n?.in,e,t);return r.getFullYear()===o.getFullYear()}function Av(e,t,n){const r=ae(e,n?.in),o=r.getFullYear(),s=r.getDate(),i=fe(e,0);i.setFullYear(o,t,15),i.setHours(0,0,0,0);const a=Tv(i);return r.setMonth(t,Math.min(s,a)),r}function Iv(e,t,n){const r=ae(e,n?.in);return isNaN(+r)?fe(e,NaN):(r.setFullYear(t),r)}const Gs=5,_v=4;function Fv(e,t){const n=t.startOfMonth(e),r=n.getDay()>0?n.getDay():7,o=t.addDays(e,-r+1),s=t.addDays(o,Gs*7-1);return t.getMonth(e)===t.getMonth(s)?Gs:_v}function yl(e,t){const n=t.startOfMonth(e),r=n.getDay();return r===1?n:r===0?t.addDays(n,-6):t.addDays(n,-1*(r-1))}function Wv(e,t){const n=yl(e,t),r=Fv(e,t);return t.addDays(n,r*7-1)}class De{constructor(t,n){this.Date=Date,this.today=()=>this.overrides?.today?this.overrides.today():this.options.timeZone?be.tz(this.options.timeZone):new this.Date,this.newDate=(r,o,s)=>this.overrides?.newDate?this.overrides.newDate(r,o,s):this.options.timeZone?new be(r,o,s,this.options.timeZone):new Date(r,o,s),this.addDays=(r,o)=>this.overrides?.addDays?this.overrides.addDays(r,o):il(r,o),this.addMonths=(r,o)=>this.overrides?.addMonths?this.overrides.addMonths(r,o):ll(r,o),this.addWeeks=(r,o)=>this.overrides?.addWeeks?this.overrides.addWeeks(r,o):gp(r,o),this.addYears=(r,o)=>this.overrides?.addYears?this.overrides.addYears(r,o):yp(r,o),this.differenceInCalendarDays=(r,o)=>this.overrides?.differenceInCalendarDays?this.overrides.differenceInCalendarDays(r,o):ul(r,o),this.differenceInCalendarMonths=(r,o)=>this.overrides?.differenceInCalendarMonths?this.overrides.differenceInCalendarMonths(r,o):Ep(r,o),this.eachMonthOfInterval=r=>this.overrides?.eachMonthOfInterval?this.overrides.eachMonthOfInterval(r):Tp(r),this.endOfBroadcastWeek=r=>this.overrides?.endOfBroadcastWeek?this.overrides.endOfBroadcastWeek(r):Wv(r,this),this.endOfISOWeek=r=>this.overrides?.endOfISOWeek?this.overrides.endOfISOWeek(r):Dp(r),this.endOfMonth=r=>this.overrides?.endOfMonth?this.overrides.endOfMonth(r):Cp(r),this.endOfWeek=(r,o)=>this.overrides?.endOfWeek?this.overrides.endOfWeek(r,o):ml(r,this.options),this.endOfYear=r=>this.overrides?.endOfYear?this.overrides.endOfYear(r):Pp(r),this.format=(r,o,s)=>{const i=this.overrides?.format?this.overrides.format(r,o,this.options):Cv(r,o,this.options);return this.options.numerals&&this.options.numerals!=="latn"?this.replaceDigits(i):i},this.getISOWeek=r=>this.overrides?.getISOWeek?this.overrides.getISOWeek(r):hl(r),this.getMonth=(r,o)=>this.overrides?.getMonth?this.overrides.getMonth(r,this.options):Mv(r,this.options),this.getYear=(r,o)=>this.overrides?.getYear?this.overrides.getYear(r,this.options):Pv(r,this.options),this.getWeek=(r,o)=>this.overrides?.getWeek?this.overrides.getWeek(r,this.options):vl(r,this.options),this.isAfter=(r,o)=>this.overrides?.isAfter?this.overrides.isAfter(r,o):Dv(r,o),this.isBefore=(r,o)=>this.overrides?.isBefore?this.overrides.isBefore(r,o):kv(r,o),this.isDate=r=>this.overrides?.isDate?this.overrides.isDate(r):dl(r),this.isSameDay=(r,o)=>this.overrides?.isSameDay?this.overrides.isSameDay(r,o):xp(r,o),this.isSameMonth=(r,o)=>this.overrides?.isSameMonth?this.overrides.isSameMonth(r,o):Nv(r,o),this.isSameYear=(r,o)=>this.overrides?.isSameYear?this.overrides.isSameYear(r,o):Rv(r,o),this.max=r=>this.overrides?.max?this.overrides.max(r):wp(r),this.min=r=>this.overrides?.min?this.overrides.min(r):bp(r),this.setMonth=(r,o)=>this.overrides?.setMonth?this.overrides.setMonth(r,o):Av(r,o),this.setYear=(r,o)=>this.overrides?.setYear?this.overrides.setYear(r,o):Iv(r,o),this.startOfBroadcastWeek=(r,o)=>this.overrides?.startOfBroadcastWeek?this.overrides.startOfBroadcastWeek(r,this):yl(r,this),this.startOfDay=r=>this.overrides?.startOfDay?this.overrides.startOfDay(r):Sn(r),this.startOfISOWeek=r=>this.overrides?.startOfISOWeek?this.overrides.startOfISOWeek(r):xn(r),this.startOfMonth=r=>this.overrides?.startOfMonth?this.overrides.startOfMonth(r):Mp(r),this.startOfWeek=(r,o)=>this.overrides?.startOfWeek?this.overrides.startOfWeek(r,this.options):Zt(r,this.options),this.startOfYear=r=>this.overrides?.startOfYear?this.overrides.startOfYear(r):fl(r),this.options={locale:Go,...t},this.overrides=n}getDigitMap(){const{numerals:t="latn"}=this.options,n=new Intl.NumberFormat("en-US",{numberingSystem:t}),r={};for(let o=0;o<10;o++)r[o.toString()]=n.format(o);return r}replaceDigits(t){const n=this.getDigitMap();return t.replace(/\d/g,r=>n[r]||r)}formatNumber(t){return this.replaceDigits(t.toString())}getMonthYearOrder(){const t=this.options.locale?.code;return t&&De.yearFirstLocales.has(t)?"year-first":"month-first"}formatMonthYear(t){const{locale:n,timeZone:r,numerals:o}=this.options,s=n?.code;if(s&&De.yearFirstLocales.has(s))try{return new Intl.DateTimeFormat(s,{month:"long",year:"numeric",timeZone:r,numberingSystem:o}).format(t)}catch{}const i=this.getMonthYearOrder()==="year-first"?"y LLLL":"LLLL y";return this.format(t,i)}}De.yearFirstLocales=new Set(["eu","hu","ja","ja-Hira","ja-JP","ko","ko-KR","lt","lt-LT","lv","lv-LV","mn","mn-MN","zh","zh-CN","zh-HK","zh-TW"]);const et=new De;class wl{constructor(t,n,r=et){this.date=t,this.displayMonth=n,this.outside=!!(n&&!r.isSameMonth(t,n)),this.dateLib=r}isEqualTo(t){return this.dateLib.isSameDay(t.date,this.date)&&this.dateLib.isSameMonth(t.displayMonth,this.displayMonth)}}class Lv{constructor(t,n){this.date=t,this.weeks=n}}class $v{constructor(t,n){this.days=n,this.weekNumber=t}}function jv(e){return w.createElement("button",{...e})}function Bv(e){return w.createElement("span",{...e})}function Hv(e){const{size:t=24,orientation:n="left",className:r}=e;return w.createElement("svg",{className:r,width:t,height:t,viewBox:"0 0 24 24"},n==="up"&&w.createElement("polygon",{points:"6.77 17 12.5 11.43 18.24 17 20 15.28 12.5 8 5 15.28"}),n==="down"&&w.createElement("polygon",{points:"6.77 8 12.5 13.57 18.24 8 20 9.72 12.5 17 5 9.72"}),n==="left"&&w.createElement("polygon",{points:"16 18.112 9.81111111 12 16 5.87733333 14.0888889 4 6 12 14.0888889 20"}),n==="right"&&w.createElement("polygon",{points:"8 18.112 14.18888889 12 8 5.87733333 9.91111111 4 18 12 9.91111111 20"}))}function Yv(e){const{day:t,modifiers:n,...r}=e;return w.createElement("td",{...r})}function Vv(e){const{day:t,modifiers:n,...r}=e,o=w.useRef(null);return w.useEffect(()=>{n.focused&&o.current?.focus()},[n.focused]),w.createElement("button",{ref:o,...r})}var W;(function(e){e.Root="root",e.Chevron="chevron",e.Day="day",e.DayButton="day_button",e.CaptionLabel="caption_label",e.Dropdowns="dropdowns",e.Dropdown="dropdown",e.DropdownRoot="dropdown_root",e.Footer="footer",e.MonthGrid="month_grid",e.MonthCaption="month_caption",e.MonthsDropdown="months_dropdown",e.Month="month",e.Months="months",e.Nav="nav",e.NextMonthButton="button_next",e.PreviousMonthButton="button_previous",e.Week="week",e.Weeks="weeks",e.Weekday="weekday",e.Weekdays="weekdays",e.WeekNumber="week_number",e.WeekNumberHeader="week_number_header",e.YearsDropdown="years_dropdown"})(W||(W={}));var ce;(function(e){e.disabled="disabled",e.hidden="hidden",e.outside="outside",e.focused="focused",e.today="today"})(ce||(ce={}));var $e;(function(e){e.range_end="range_end",e.range_middle="range_middle",e.range_start="range_start",e.selected="selected"})($e||($e={}));var Te;(function(e){e.weeks_before_enter="weeks_before_enter",e.weeks_before_exit="weeks_before_exit",e.weeks_after_enter="weeks_after_enter",e.weeks_after_exit="weeks_after_exit",e.caption_after_enter="caption_after_enter",e.caption_after_exit="caption_after_exit",e.caption_before_enter="caption_before_enter",e.caption_before_exit="caption_before_exit"})(Te||(Te={}));function Uv(e){const{options:t,className:n,components:r,classNames:o,...s}=e,i=[o[W.Dropdown],n].join(" "),a=t?.find(({value:l})=>l===s.value);return w.createElement("span",{"data-disabled":s.disabled,className:o[W.DropdownRoot]},w.createElement(r.Select,{className:i,...s},t?.map(({value:l,label:u,disabled:f})=>w.createElement(r.Option,{key:l,value:l,disabled:f},u))),w.createElement("span",{className:o[W.CaptionLabel],"aria-hidden":!0},a?.label,w.createElement(r.Chevron,{orientation:"down",size:18,className:o[W.Chevron]})))}function zv(e){return w.createElement("div",{...e})}function qv(e){return w.createElement("div",{...e})}function Gv(e){const{calendarMonth:t,displayIndex:n,...r}=e;return w.createElement("div",{...r},e.children)}function Kv(e){const{calendarMonth:t,displayIndex:n,...r}=e;return w.createElement("div",{...r})}function Xv(e){return w.createElement("table",{...e})}function Zv(e){return w.createElement("div",{...e})}const bl=d.createContext(void 0);function Dn(){const e=d.useContext(bl);if(e===void 0)throw new Error("useDayPicker() must be used within a custom component.");return e}function Qv(e){const{components:t}=Dn();return w.createElement(t.Dropdown,{...e})}function Jv(e){const{onPreviousClick:t,onNextClick:n,previousMonth:r,nextMonth:o,...s}=e,{components:i,classNames:a,labels:{labelPrevious:l,labelNext:u}}=Dn(),f=d.useCallback(m=>{o&&n?.(m)},[o,n]),c=d.useCallback(m=>{r&&t?.(m)},[r,t]);return w.createElement("nav",{...s},w.createElement(i.PreviousMonthButton,{type:"button",className:a[W.PreviousMonthButton],tabIndex:r?void 0:-1,"aria-disabled":r?void 0:!0,"aria-label":l(r),onClick:c},w.createElement(i.Chevron,{disabled:r?void 0:!0,className:a[W.Chevron],orientation:"left"})),w.createElement(i.NextMonthButton,{type:"button",className:a[W.NextMonthButton],tabIndex:o?void 0:-1,"aria-disabled":o?void 0:!0,"aria-label":u(o),onClick:f},w.createElement(i.Chevron,{disabled:o?void 0:!0,orientation:"right",className:a[W.Chevron]})))}function eg(e){const{components:t}=Dn();return w.createElement(t.Button,{...e})}function tg(e){return w.createElement("option",{...e})}function ng(e){const{components:t}=Dn();return w.createElement(t.Button,{...e})}function rg(e){const{rootRef:t,...n}=e;return w.createElement("div",{...n,ref:t})}function og(e){return w.createElement("select",{...e})}function sg(e){const{week:t,...n}=e;return w.createElement("tr",{...n})}function ag(e){return w.createElement("th",{...e})}function ig(e){return w.createElement("thead",{"aria-hidden":!0},w.createElement("tr",{...e}))}function lg(e){const{week:t,...n}=e;return w.createElement("th",{...n})}function cg(e){return w.createElement("th",{...e})}function ug(e){return w.createElement("tbody",{...e})}function dg(e){const{components:t}=Dn();return w.createElement(t.Dropdown,{...e})}const fg=Object.freeze(Object.defineProperty({__proto__:null,Button:jv,CaptionLabel:Bv,Chevron:Hv,Day:Yv,DayButton:Vv,Dropdown:Uv,DropdownNav:zv,Footer:qv,Month:Gv,MonthCaption:Kv,MonthGrid:Xv,Months:Zv,MonthsDropdown:Qv,Nav:Jv,NextMonthButton:eg,Option:tg,PreviousMonthButton:ng,Root:rg,Select:og,Week:sg,WeekNumber:lg,WeekNumberHeader:cg,Weekday:ag,Weekdays:ig,Weeks:ug,YearsDropdown:dg},Symbol.toStringTag,{value:"Module"}));function nt(e,t,n=!1,r=et){let{from:o,to:s}=e;const{differenceInCalendarDays:i,isSameDay:a}=r;return o&&s?(i(s,o)<0&&([o,s]=[s,o]),i(t,o)>=(n?1:0)&&i(s,t)>=(n?1:0)):!n&&s?a(s,t):!n&&o?a(o,t):!1}function xl(e){return!!(e&&typeof e=="object"&&"before"in e&&"after"in e)}function Ko(e){return!!(e&&typeof e=="object"&&"from"in e)}function Sl(e){return!!(e&&typeof e=="object"&&"after"in e)}function El(e){return!!(e&&typeof e=="object"&&"before"in e)}function Cl(e){return!!(e&&typeof e=="object"&&"dayOfWeek"in e)}function Ol(e,t){return Array.isArray(e)&&e.every(t.isDate)}function rt(e,t,n=et){const r=Array.isArray(t)?t:[t],{isSameDay:o,differenceInCalendarDays:s,isAfter:i}=n;return r.some(a=>{if(typeof a=="boolean")return a;if(n.isDate(a))return o(e,a);if(Ol(a,n))return a.includes(e);if(Ko(a))return nt(a,e,!1,n);if(Cl(a))return Array.isArray(a.dayOfWeek)?a.dayOfWeek.includes(e.getDay()):a.dayOfWeek===e.getDay();if(xl(a)){const l=s(a.before,e),u=s(a.after,e),f=l>0,c=u<0;return i(a.before,a.after)?c&&f:f||c}return Sl(a)?s(e,a.after)>0:El(a)?s(a.before,e)>0:typeof a=="function"?a(e):!1})}function mg(e,t,n,r,o){const{disabled:s,hidden:i,modifiers:a,showOutsideDays:l,broadcastCalendar:u,today:f}=t,{isSameDay:c,isSameMonth:m,startOfMonth:h,isBefore:g,endOfMonth:p,isAfter:v}=o,y=n&&h(n),x=r&&p(r),b={[ce.focused]:[],[ce.outside]:[],[ce.disabled]:[],[ce.hidden]:[],[ce.today]:[]},E={};for(const S of e){const{date:T,displayMonth:C}=S,M=!!(C&&!m(T,C)),I=!!(y&&g(T,y)),N=!!(x&&v(T,x)),_=!!(s&&rt(T,s,o)),B=!!(i&&rt(T,i,o))||I||N||!u&&!l&&M||u&&l===!1&&M,R=c(T,f??o.today());M&&b.outside.push(S),_&&b.disabled.push(S),B&&b.hidden.push(S),R&&b.today.push(S),a&&Object.keys(a).forEach($=>{const H=a?.[$];H&&rt(T,H,o)&&(E[$]?E[$].push(S):E[$]=[S])})}return S=>{const T={[ce.focused]:!1,[ce.disabled]:!1,[ce.hidden]:!1,[ce.outside]:!1,[ce.today]:!1},C={};for(const M in b){const I=b[M];T[M]=I.some(N=>N===S)}for(const M in E)C[M]=E[M].some(I=>I===S);return{...T,...C}}}function hg(e,t,n={}){return Object.entries(e).filter(([,o])=>o===!0).reduce((o,[s])=>(n[s]?o.push(n[s]):t[ce[s]]?o.push(t[ce[s]]):t[$e[s]]&&o.push(t[$e[s]]),o),[t[W.Day]])}function pg(e){return{...fg,...e}}function vg(e){const t={"data-mode":e.mode??void 0,"data-required":"required"in e?e.required:void 0,"data-multiple-months":e.numberOfMonths&&e.numberOfMonths>1||void 0,"data-week-numbers":e.showWeekNumber||void 0,"data-broadcast-calendar":e.broadcastCalendar||void 0,"data-nav-layout":e.navLayout||void 0};return Object.entries(e).forEach(([n,r])=>{n.startsWith("data-")&&(t[n]=r)}),t}function gg(){const e={};for(const t in W)e[W[t]]=`rdp-${W[t]}`;for(const t in ce)e[ce[t]]=`rdp-${ce[t]}`;for(const t in $e)e[$e[t]]=`rdp-${$e[t]}`;for(const t in Te)e[Te[t]]=`rdp-${Te[t]}`;return e}function Tl(e,t,n){return(n??new De(t)).formatMonthYear(e)}const yg=Tl;function wg(e,t,n){return(n??new De(t)).format(e,"d")}function bg(e,t=et){return t.format(e,"LLLL")}function xg(e,t,n){return(n??new De(t)).format(e,"cccccc")}function Sg(e,t=et){return e<10?t.formatNumber(`0${e.toLocaleString()}`):t.formatNumber(`${e.toLocaleString()}`)}function Eg(){return""}function Ml(e,t=et){return t.format(e,"yyyy")}const Cg=Ml,Og=Object.freeze(Object.defineProperty({__proto__:null,formatCaption:Tl,formatDay:wg,formatMonthCaption:yg,formatMonthDropdown:bg,formatWeekNumber:Sg,formatWeekNumberHeader:Eg,formatWeekdayName:xg,formatYearCaption:Cg,formatYearDropdown:Ml},Symbol.toStringTag,{value:"Module"}));function Tg(e){return e?.formatMonthCaption&&!e.formatCaption&&(e.formatCaption=e.formatMonthCaption),e?.formatYearCaption&&!e.formatYearDropdown&&(e.formatYearDropdown=e.formatYearCaption),{...Og,...e}}function Mg(e,t,n,r,o){const{startOfMonth:s,startOfYear:i,endOfYear:a,eachMonthOfInterval:l,getMonth:u}=o;return l({start:i(e),end:a(e)}).map(m=>{const h=r.formatMonthDropdown(m,o),g=u(m),p=t&&ms(n)||!1;return{value:g,label:h,disabled:p}})}function Pg(e,t={},n={}){let r={...t?.[W.Day]};return Object.entries(e).filter(([,o])=>o===!0).forEach(([o])=>{r={...r,...n?.[o]}}),r}function Dg(e,t,n){const r=e.today(),o=t?e.startOfISOWeek(r):e.startOfWeek(r),s=[];for(let i=0;i<7;i++){const a=e.addDays(o,i);s.push(a)}return s}function kg(e,t,n,r,o=!1){if(!e||!t)return;const{startOfYear:s,endOfYear:i,addYears:a,getYear:l,isBefore:u,isSameYear:f}=r,c=s(e),m=i(t),h=[];let g=c;for(;u(g,m)||f(g,m);)h.push(g),g=a(g,1);return o&&h.reverse(),h.map(p=>{const v=n.formatYearDropdown(p,r);return{value:l(p),label:v,disabled:!1}})}function Pl(e,t,n,r){let o=(r??new De(n)).format(e,"PPPP");return t.today&&(o=`Today, ${o}`),t.selected&&(o=`${o}, selected`),o}const Ng=Pl;function Dl(e,t,n){return(n??new De(t)).formatMonthYear(e)}const Rg=Dl;function Ag(e,t,n,r){let o=(r??new De(n)).format(e,"PPPP");return t?.today&&(o=`Today, ${o}`),o}function Ig(e){return"Choose the Month"}function _g(){return""}function Fg(e){return"Go to the Next Month"}function Wg(e){return"Go to the Previous Month"}function Lg(e,t,n){return(n??new De(t)).format(e,"cccc")}function $g(e,t){return`Week ${e}`}function jg(e){return"Week Number"}function Bg(e){return"Choose the Year"}const Hg=Object.freeze(Object.defineProperty({__proto__:null,labelCaption:Rg,labelDay:Ng,labelDayButton:Pl,labelGrid:Dl,labelGridcell:Ag,labelMonthDropdown:Ig,labelNav:_g,labelNext:Fg,labelPrevious:Wg,labelWeekNumber:$g,labelWeekNumberHeader:jg,labelWeekday:Lg,labelYearDropdown:Bg},Symbol.toStringTag,{value:"Module"})),kn=e=>e instanceof HTMLElement?e:null,Qr=e=>[...e.querySelectorAll("[data-animated-month]")??[]],Yg=e=>kn(e.querySelector("[data-animated-month]")),Jr=e=>kn(e.querySelector("[data-animated-caption]")),eo=e=>kn(e.querySelector("[data-animated-weeks]")),Vg=e=>kn(e.querySelector("[data-animated-nav]")),Ug=e=>kn(e.querySelector("[data-animated-weekdays]"));function zg(e,t,{classNames:n,months:r,focused:o,dateLib:s}){const i=d.useRef(null),a=d.useRef(r),l=d.useRef(!1);d.useLayoutEffect(()=>{const u=a.current;if(a.current=r,!t||!e.current||!(e.current instanceof HTMLElement)||r.length===0||u.length===0||r.length!==u.length)return;const f=s.isSameMonth(r[0].date,u[0].date),c=s.isAfter(r[0].date,u[0].date),m=c?n[Te.caption_after_enter]:n[Te.caption_before_enter],h=c?n[Te.weeks_after_enter]:n[Te.weeks_before_enter],g=i.current,p=e.current.cloneNode(!0);if(p instanceof HTMLElement?(Qr(p).forEach(b=>{if(!(b instanceof HTMLElement))return;const E=Yg(b);E&&b.contains(E)&&b.removeChild(E);const S=Jr(b);S&&S.classList.remove(m);const T=eo(b);T&&T.classList.remove(h)}),i.current=p):i.current=null,l.current||f||o)return;const v=g instanceof HTMLElement?Qr(g):[],y=Qr(e.current);if(y?.every(x=>x instanceof HTMLElement)&&v&&v.every(x=>x instanceof HTMLElement)){l.current=!0,e.current.style.isolation="isolate";const x=Vg(e.current);x&&(x.style.zIndex="1"),y.forEach((b,E)=>{const S=v[E];if(!S)return;b.style.position="relative",b.style.overflow="hidden";const T=Jr(b);T&&T.classList.add(m);const C=eo(b);C&&C.classList.add(h);const M=()=>{l.current=!1,e.current&&(e.current.style.isolation=""),x&&(x.style.zIndex=""),T&&T.classList.remove(m),C&&C.classList.remove(h),b.style.position="",b.style.overflow="",b.contains(S)&&b.removeChild(S)};S.style.pointerEvents="none",S.style.position="absolute",S.style.overflow="hidden",S.setAttribute("aria-hidden","true");const I=Ug(S);I&&(I.style.opacity="0");const N=Jr(S);N&&(N.classList.add(c?n[Te.caption_before_exit]:n[Te.caption_after_exit]),N.addEventListener("animationend",M));const _=eo(S);_&&_.classList.add(c?n[Te.weeks_before_exit]:n[Te.weeks_after_exit]),b.insertBefore(S,b.firstChild)})}})}function qg(e,t,n,r){const o=e[0],s=e[e.length-1],{ISOWeek:i,fixedWeeks:a,broadcastCalendar:l}=n??{},{addDays:u,differenceInCalendarDays:f,differenceInCalendarMonths:c,endOfBroadcastWeek:m,endOfISOWeek:h,endOfMonth:g,endOfWeek:p,isAfter:v,startOfBroadcastWeek:y,startOfISOWeek:x,startOfWeek:b}=r,E=l?y(o,r):i?x(o):b(o),S=l?m(s):i?h(g(s)):p(g(s)),T=f(S,E),C=c(s,o)+1,M=[];for(let _=0;_<=T;_++){const B=u(E,_);if(t&&v(B,t))break;M.push(B)}const N=(l?35:42)*C;if(a&&M.length{const o=r.weeks.reduce((s,i)=>s.concat(i.days.slice()),t.slice());return n.concat(o.slice())},t.slice())}function Kg(e,t,n,r){const{numberOfMonths:o=1}=n,s=[];for(let i=0;it)break;s.push(a)}return s}function Ks(e,t,n,r){const{month:o,defaultMonth:s,today:i=r.today(),numberOfMonths:a=1}=e;let l=o||s||i;const{differenceInCalendarMonths:u,addMonths:f,startOfMonth:c}=r;if(n&&u(n,l){const y=n.broadcastCalendar?c(v,r):n.ISOWeek?m(v):h(v),x=n.broadcastCalendar?s(v):n.ISOWeek?i(a(v)):l(a(v)),b=t.filter(C=>C>=y&&C<=x),E=n.broadcastCalendar?35:42;if(n.fixedWeeks&&b.length{const I=E-b.length;return M>x&&M<=o(x,I)});b.push(...C)}const S=b.reduce((C,M)=>{const I=n.ISOWeek?u(M):f(M),N=C.find(B=>B.weekNumber===I),_=new wl(M,v,r);return N?N.days.push(_):C.push(new $v(I,[_])),C},[]),T=new Lv(v,S);return p.push(T),p},[]);return n.reverseMonths?g.reverse():g}function Zg(e,t){let{startMonth:n,endMonth:r}=e;const{startOfYear:o,startOfDay:s,startOfMonth:i,endOfMonth:a,addYears:l,endOfYear:u,newDate:f,today:c}=t,{fromYear:m,toYear:h,fromMonth:g,toMonth:p}=e;!n&&g&&(n=g),!n&&m&&(n=t.newDate(m,0,1)),!r&&p&&(r=p),!r&&h&&(r=f(h,11,31));const v=e.captionLayout==="dropdown"||e.captionLayout==="dropdown-years";return n?n=i(n):m?n=f(m,0,1):!n&&v&&(n=o(l(e.today??c(),-100))),r?r=a(r):h?r=f(h,11,31):!r&&v&&(r=u(e.today??c())),[n&&s(n),r&&s(r)]}function Qg(e,t,n,r){if(n.disableNavigation)return;const{pagedNavigation:o,numberOfMonths:s=1}=n,{startOfMonth:i,addMonths:a,differenceInCalendarMonths:l}=r,u=o?s:1,f=i(e);if(!t)return a(f,u);if(!(l(t,e)n.concat(r.weeks.slice()),t.slice())}function Mr(e,t){const[n,r]=d.useState(e);return[t===void 0?n:t,r]}function ty(e,t){const[n,r]=Zg(e,t),{startOfMonth:o,endOfMonth:s}=t,i=Ks(e,n,r,t),[a,l]=Mr(i,e.month?i:void 0);d.useEffect(()=>{const T=Ks(e,n,r,t);l(T)},[e.timeZone]);const u=Kg(a,r,e,t),f=qg(u,e.endMonth?s(e.endMonth):void 0,e,t),c=Xg(u,f,e,t),m=ey(c),h=Gg(c),g=Jg(a,n,e,t),p=Qg(a,r,e,t),{disableNavigation:v,onMonthChange:y}=e,x=T=>m.some(C=>C.days.some(M=>M.isEqualTo(T))),b=T=>{if(v)return;let C=o(T);n&&Co(r)&&(C=o(r)),l(C),y?.(C)};return{months:c,weeks:m,days:h,navStart:n,navEnd:r,previousMonth:g,nextMonth:p,goToMonth:b,goToDay:T=>{x(T)||b(T.date)}}}var Ue;(function(e){e[e.Today=0]="Today",e[e.Selected=1]="Selected",e[e.LastFocused=2]="LastFocused",e[e.FocusedModifier=3]="FocusedModifier"})(Ue||(Ue={}));function Xs(e){return!e[ce.disabled]&&!e[ce.hidden]&&!e[ce.outside]}function ny(e,t,n,r){let o,s=-1;for(const i of e){const a=t(i);Xs(a)&&(a[ce.focused]&&sXs(t(i)))),o}function ry(e,t,n,r,o,s,i){const{ISOWeek:a,broadcastCalendar:l}=s,{addDays:u,addMonths:f,addWeeks:c,addYears:m,endOfBroadcastWeek:h,endOfISOWeek:g,endOfWeek:p,max:v,min:y,startOfBroadcastWeek:x,startOfISOWeek:b,startOfWeek:E}=i;let T={day:u,week:c,month:f,year:m,startOfWeek:C=>l?x(C,i):a?b(C):E(C),endOfWeek:C=>l?h(C):a?g(C):p(C)}[e](n,t==="after"?1:-1);return t==="before"&&r?T=v([r,T]):t==="after"&&o&&(T=y([o,T])),T}function kl(e,t,n,r,o,s,i,a=0){if(a>365)return;const l=ry(e,t,n.date,r,o,s,i),u=!!(s.disabled&&rt(l,s.disabled,i)),f=!!(s.hidden&&rt(l,s.hidden,i)),c=l,m=new wl(l,c,i);return!u&&!f?m:kl(e,t,m,r,o,s,i,a+1)}function oy(e,t,n,r,o){const{autoFocus:s}=e,[i,a]=d.useState(),l=ny(t.days,n,r||(()=>!1),i),[u,f]=d.useState(s?l:void 0);return{isFocusTarget:p=>!!l?.isEqualTo(p),setFocused:f,focused:u,blur:()=>{a(u),f(void 0)},moveFocus:(p,v)=>{if(!u)return;const y=kl(p,v,u,t.navStart,t.navEnd,e,o);y&&(t.goToDay(y),f(y))}}}function sy(e,t){const{selected:n,required:r,onSelect:o}=e,[s,i]=Mr(n,o?n:void 0),a=o?n:s,{isSameDay:l}=t,u=h=>a?.some(g=>l(g,h))??!1,{min:f,max:c}=e;return{selected:a,select:(h,g,p)=>{let v=[...a??[]];if(u(h)){if(a?.length===f||r&&a?.length===1)return;v=a?.filter(y=>!l(y,h))}else a?.length===c?v=[h]:v=[...v,h];return o||i(v),o?.(v,h,g,p),v},isSelected:u}}function ay(e,t,n=0,r=0,o=!1,s=et){const{from:i,to:a}=t||{},{isSameDay:l,isAfter:u,isBefore:f}=s;let c;if(!i&&!a)c={from:e,to:n>0?void 0:e};else if(i&&!a)l(i,e)?n===0?c={from:i,to:e}:o?c={from:i,to:void 0}:c=void 0:f(e,i)?c={from:e,to:i}:c={from:i,to:e};else if(i&&a)if(l(i,e)&&l(a,e))o?c={from:i,to:a}:c=void 0;else if(l(i,e))c={from:i,to:n>0?void 0:e};else if(l(a,e))c={from:e,to:n>0?void 0:e};else if(f(e,i))c={from:e,to:a};else if(u(e,i))c={from:i,to:e};else if(u(e,a))c={from:i,to:e};else throw new Error("Invalid range");if(c?.from&&c?.to){const m=s.differenceInCalendarDays(c.to,c.from);r>0&&m>r?c={from:e,to:void 0}:n>1&&mtypeof a!="function").some(a=>typeof a=="boolean"?a:n.isDate(a)?nt(e,a,!1,n):Ol(a,n)?a.some(l=>nt(e,l,!1,n)):Ko(a)?a.from&&a.to?Zs(e,{from:a.from,to:a.to},n):!1:Cl(a)?iy(e,a.dayOfWeek,n):xl(a)?n.isAfter(a.before,a.after)?Zs(e,{from:n.addDays(a.after,1),to:n.addDays(a.before,-1)},n):rt(e.from,a,n)||rt(e.to,a,n):Sl(a)||El(a)?rt(e.from,a,n)||rt(e.to,a,n):!1))return!0;const i=r.filter(a=>typeof a=="function");if(i.length){let a=e.from;const l=n.differenceInCalendarDays(e.to,e.from);for(let u=0;u<=l;u++){if(i.some(f=>f(a)))return!0;a=n.addDays(a,1)}}return!1}function cy(e,t){const{disabled:n,excludeDisabled:r,selected:o,required:s,onSelect:i}=e,[a,l]=Mr(o,i?o:void 0),u=i?o:a;return{selected:u,select:(m,h,g)=>{const{min:p,max:v}=e,y=m?ay(m,u,p,v,s,t):void 0;return r&&n&&y?.from&&y.to&&ly({from:y.from,to:y.to},n,t)&&(y.from=m,y.to=void 0),i||l(y),i?.(y,m,h,g),y},isSelected:m=>u&&nt(u,m,!1,t)}}function uy(e,t){const{selected:n,required:r,onSelect:o}=e,[s,i]=Mr(n,o?n:void 0),a=o?n:s,{isSameDay:l}=t;return{selected:a,select:(c,m,h)=>{let g=c;return!r&&a&&a&&l(c,a)&&(g=void 0),o||i(g),o?.(g,c,m,h),g},isSelected:c=>a?l(a,c):!1}}function dy(e,t){const n=uy(e,t),r=sy(e,t),o=cy(e,t);switch(e.mode){case"single":return n;case"multiple":return r;case"range":return o;default:return}}function lw(e){let t=e;t.timeZone&&(t={...e},t.today&&(t.today=new be(t.today,t.timeZone)),t.month&&(t.month=new be(t.month,t.timeZone)),t.defaultMonth&&(t.defaultMonth=new be(t.defaultMonth,t.timeZone)),t.startMonth&&(t.startMonth=new be(t.startMonth,t.timeZone)),t.endMonth&&(t.endMonth=new be(t.endMonth,t.timeZone)),t.mode==="single"&&t.selected?t.selected=new be(t.selected,t.timeZone):t.mode==="multiple"&&t.selected?t.selected=t.selected?.map(z=>new be(z,t.timeZone)):t.mode==="range"&&t.selected&&(t.selected={from:t.selected.from?new be(t.selected.from,t.timeZone):void 0,to:t.selected.to?new be(t.selected.to,t.timeZone):void 0}));const{components:n,formatters:r,labels:o,dateLib:s,locale:i,classNames:a}=d.useMemo(()=>{const z={...Go,...t.locale};return{dateLib:new De({locale:z,weekStartsOn:t.broadcastCalendar?1:t.weekStartsOn,firstWeekContainsDate:t.firstWeekContainsDate,useAdditionalWeekYearTokens:t.useAdditionalWeekYearTokens,useAdditionalDayOfYearTokens:t.useAdditionalDayOfYearTokens,timeZone:t.timeZone,numerals:t.numerals},t.dateLib),components:pg(t.components),formatters:Tg(t.formatters),labels:{...Hg,...t.labels},locale:z,classNames:{...gg(),...t.classNames}}},[t.locale,t.broadcastCalendar,t.weekStartsOn,t.firstWeekContainsDate,t.useAdditionalWeekYearTokens,t.useAdditionalDayOfYearTokens,t.timeZone,t.numerals,t.dateLib,t.components,t.formatters,t.labels,t.classNames]),{captionLayout:l,mode:u,navLayout:f,numberOfMonths:c=1,onDayBlur:m,onDayClick:h,onDayFocus:g,onDayKeyDown:p,onDayMouseEnter:v,onDayMouseLeave:y,onNextClick:x,onPrevClick:b,showWeekNumber:E,styles:S}=t,{formatCaption:T,formatDay:C,formatMonthDropdown:M,formatWeekNumber:I,formatWeekNumberHeader:N,formatWeekdayName:_,formatYearDropdown:B}=r,R=ty(t,s),{days:$,months:H,navStart:P,navEnd:F,previousMonth:k,nextMonth:j,goToMonth:U}=R,oe=mg($,t,P,F,s),{isSelected:me,select:D,selected:q}=dy(t,s)??{},{blur:K,focused:le,isFocusTarget:A,moveFocus:L,setFocused:Z}=oy(t,R,oe,me??(()=>!1),s),{labelDayButton:J,labelGridcell:ee,labelGrid:ne,labelMonthDropdown:ge,labelNav:Ee,labelPrevious:Ot,labelNext:ct,labelWeekday:Ae,labelWeekNumber:Rn,labelWeekNumberHeader:Ie,labelYearDropdown:Dr}=o,kr=d.useMemo(()=>Dg(s,t.ISOWeek),[s,t.ISOWeek]),ye=u!==void 0||h!==void 0,He=d.useCallback(()=>{k&&(U(k),b?.(k))},[k,U,b]),sn=d.useCallback(()=>{j&&(U(j),x?.(j))},[U,j,x]),Nr=d.useCallback((z,Q)=>Y=>{Y.preventDefault(),Y.stopPropagation(),Z(z),D?.(z.date,Q,Y),h?.(z.date,Q,Y)},[D,h,Z]),$t=d.useCallback((z,Q)=>Y=>{Z(z),g?.(z.date,Q,Y)},[g,Z]),Rr=d.useCallback((z,Q)=>Y=>{K(),m?.(z.date,Q,Y)},[K,m]),An=d.useCallback((z,Q)=>Y=>{const se={ArrowLeft:[Y.shiftKey?"month":"day",t.dir==="rtl"?"after":"before"],ArrowRight:[Y.shiftKey?"month":"day",t.dir==="rtl"?"before":"after"],ArrowDown:[Y.shiftKey?"year":"week","after"],ArrowUp:[Y.shiftKey?"year":"week","before"],PageUp:[Y.shiftKey?"year":"month","before"],PageDown:[Y.shiftKey?"year":"month","after"],Home:["startOfWeek","before"],End:["endOfWeek","after"]};if(se[Y.key]){Y.preventDefault(),Y.stopPropagation();const[we,X]=se[Y.key];L(we,X)}p?.(z.date,Q,Y)},[L,p,t.dir]),an=d.useCallback((z,Q)=>Y=>{v?.(z.date,Q,Y)},[v]),ut=d.useCallback((z,Q)=>Y=>{y?.(z.date,Q,Y)},[y]),In=d.useCallback(z=>Q=>{const Y=Number(Q.target.value),se=s.setMonth(s.startOfMonth(z),Y);U(se)},[s,U]),dt=d.useCallback(z=>Q=>{const Y=Number(Q.target.value),se=s.setYear(s.startOfMonth(z),Y);U(se)},[s,U]),{className:Ar,style:Ir}=d.useMemo(()=>({className:[a[W.Root],t.className].filter(Boolean).join(" "),style:{...S?.[W.Root],...t.style}}),[a,t.className,t.style,S]),_n=vg(t),ln=d.useRef(null);zg(ln,!!t.animate,{classNames:a,months:H,focused:le,dateLib:s});const _r={dayPickerProps:t,selected:q,select:D,isSelected:me,months:H,nextMonth:j,previousMonth:k,goToMonth:U,getModifiers:oe,components:n,classNames:a,styles:S,labels:o,formatters:r};return w.createElement(bl.Provider,{value:_r},w.createElement(n.Root,{rootRef:t.animate?ln:void 0,className:Ar,style:Ir,dir:t.dir,id:t.id,lang:t.lang,nonce:t.nonce,title:t.title,role:t.role,"aria-label":t["aria-label"],"aria-labelledby":t["aria-labelledby"],..._n},w.createElement(n.Months,{className:a[W.Months],style:S?.[W.Months]},!t.hideNavigation&&!f&&w.createElement(n.Nav,{"data-animated-nav":t.animate?"true":void 0,className:a[W.Nav],style:S?.[W.Nav],"aria-label":Ee(),onPreviousClick:He,onNextClick:sn,previousMonth:k,nextMonth:j}),H.map((z,Q)=>w.createElement(n.Month,{"data-animated-month":t.animate?"true":void 0,className:a[W.Month],style:S?.[W.Month],key:Q,displayIndex:Q,calendarMonth:z},f==="around"&&!t.hideNavigation&&Q===0&&w.createElement(n.PreviousMonthButton,{type:"button",className:a[W.PreviousMonthButton],tabIndex:k?void 0:-1,"aria-disabled":k?void 0:!0,"aria-label":Ot(k),onClick:He,"data-animated-button":t.animate?"true":void 0},w.createElement(n.Chevron,{disabled:k?void 0:!0,className:a[W.Chevron],orientation:t.dir==="rtl"?"right":"left"})),w.createElement(n.MonthCaption,{"data-animated-caption":t.animate?"true":void 0,className:a[W.MonthCaption],style:S?.[W.MonthCaption],calendarMonth:z,displayIndex:Q},l?.startsWith("dropdown")?w.createElement(n.DropdownNav,{className:a[W.Dropdowns],style:S?.[W.Dropdowns]},(()=>{const Y=l==="dropdown"||l==="dropdown-months"?w.createElement(n.MonthsDropdown,{key:"month",className:a[W.MonthsDropdown],"aria-label":ge(),classNames:a,components:n,disabled:!!t.disableNavigation,onChange:In(z.date),options:Mg(z.date,P,F,r,s),style:S?.[W.Dropdown],value:s.getMonth(z.date)}):w.createElement("span",{key:"month"},M(z.date,s)),se=l==="dropdown"||l==="dropdown-years"?w.createElement(n.YearsDropdown,{key:"year",className:a[W.YearsDropdown],"aria-label":Dr(s.options),classNames:a,components:n,disabled:!!t.disableNavigation,onChange:dt(z.date),options:kg(P,F,r,s,!!t.reverseYears),style:S?.[W.Dropdown],value:s.getYear(z.date)}):w.createElement("span",{key:"year"},B(z.date,s));return s.getMonthYearOrder()==="year-first"?[se,Y]:[Y,se]})(),w.createElement("span",{role:"status","aria-live":"polite",style:{border:0,clip:"rect(0 0 0 0)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap",wordWrap:"normal"}},T(z.date,s.options,s))):w.createElement(n.CaptionLabel,{className:a[W.CaptionLabel],role:"status","aria-live":"polite"},T(z.date,s.options,s))),f==="around"&&!t.hideNavigation&&Q===c-1&&w.createElement(n.NextMonthButton,{type:"button",className:a[W.NextMonthButton],tabIndex:j?void 0:-1,"aria-disabled":j?void 0:!0,"aria-label":ct(j),onClick:sn,"data-animated-button":t.animate?"true":void 0},w.createElement(n.Chevron,{disabled:j?void 0:!0,className:a[W.Chevron],orientation:t.dir==="rtl"?"left":"right"})),Q===c-1&&f==="after"&&!t.hideNavigation&&w.createElement(n.Nav,{"data-animated-nav":t.animate?"true":void 0,className:a[W.Nav],style:S?.[W.Nav],"aria-label":Ee(),onPreviousClick:He,onNextClick:sn,previousMonth:k,nextMonth:j}),w.createElement(n.MonthGrid,{role:"grid","aria-multiselectable":u==="multiple"||u==="range","aria-label":ne(z.date,s.options,s)||void 0,className:a[W.MonthGrid],style:S?.[W.MonthGrid]},!t.hideWeekdays&&w.createElement(n.Weekdays,{"data-animated-weekdays":t.animate?"true":void 0,className:a[W.Weekdays],style:S?.[W.Weekdays]},E&&w.createElement(n.WeekNumberHeader,{"aria-label":Ie(s.options),className:a[W.WeekNumberHeader],style:S?.[W.WeekNumberHeader],scope:"col"},N()),kr.map(Y=>w.createElement(n.Weekday,{"aria-label":Ae(Y,s.options,s),className:a[W.Weekday],key:String(Y),style:S?.[W.Weekday],scope:"col"},_(Y,s.options,s)))),w.createElement(n.Weeks,{"data-animated-weeks":t.animate?"true":void 0,className:a[W.Weeks],style:S?.[W.Weeks]},z.weeks.map(Y=>w.createElement(n.Week,{className:a[W.Week],key:Y.weekNumber,style:S?.[W.Week],week:Y},E&&w.createElement(n.WeekNumber,{week:Y,style:S?.[W.WeekNumber],"aria-label":Rn(Y.weekNumber,{locale:i}),className:a[W.WeekNumber],scope:"row",role:"rowheader"},I(Y.weekNumber,s)),Y.days.map(se=>{const{date:we}=se,X=oe(se);if(X[ce.focused]=!X.hidden&&!!le?.isEqualTo(se),X[$e.selected]=me?.(we)||X.selected,Ko(q)){const{from:pe,to:ft}=q;X[$e.range_start]=!!(pe&&ft&&s.isSameDay(we,pe)),X[$e.range_end]=!!(pe&&ft&&s.isSameDay(we,ft)),X[$e.range_middle]=nt(q,we,!0,s)}const V=Pg(X,S,t.modifiersStyles),de=hg(X,a,t.modifiersClassNames),he=!ye&&!X.hidden?ee(we,X,s.options,s):void 0;return w.createElement(n.Day,{key:`${s.format(we,"yyyy-MM-dd")}_${s.format(se.displayMonth,"yyyy-MM")}`,day:se,modifiers:X,className:de.join(" "),style:V,role:"gridcell","aria-selected":X.selected||void 0,"aria-label":he,"data-day":s.format(we,"yyyy-MM-dd"),"data-month":se.outside?s.format(we,"yyyy-MM"):void 0,"data-selected":X.selected||void 0,"data-disabled":X.disabled||void 0,"data-hidden":X.hidden||void 0,"data-outside":se.outside||void 0,"data-focused":X.focused||void 0,"data-today":X.today||void 0},!X.hidden&&ye?w.createElement(n.DayButton,{className:a[W.DayButton],style:S?.[W.DayButton],type:"button",day:se,modifiers:X,disabled:X.disabled||void 0,tabIndex:A(se)?0:-1,"aria-label":J(we,X,s.options,s),onClick:Nr(se,X),onBlur:Rr(se,X),onFocus:$t(se,X),onKeyDown:An(se,X),onMouseEnter:an(se,X),onMouseLeave:ut(se,X)},C(we,s.options,s)):!X.hidden&&C(se.date,s.options,s))})))))))),t.footer&&w.createElement(n.Footer,{className:a[W.Footer],style:S?.[W.Footer],role:"status","aria-live":"polite"},t.footer)))}var to="rovingFocusGroup.onEntryFocus",fy={bubbles:!1,cancelable:!0},Nn="RovingFocusGroup",[Eo,Nl,my]=ta(Nn),[hy,Rl]=Ft(Nn,[my]),[py,vy]=hy(Nn),Al=d.forwardRef((e,t)=>O.jsx(Eo.Provider,{scope:e.__scopeRovingFocusGroup,children:O.jsx(Eo.Slot,{scope:e.__scopeRovingFocusGroup,children:O.jsx(gy,{...e,ref:t})})}));Al.displayName=Nn;var gy=d.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:o=!1,dir:s,currentTabStopId:i,defaultCurrentTabStopId:a,onCurrentTabStopIdChange:l,onEntryFocus:u,preventScrollOnEntryFocus:f=!1,...c}=e,m=d.useRef(null),h=ue(t,m),g=Co(s),[p,v]=Gt({prop:i,defaultProp:a??null,onChange:l,caller:Nn}),[y,x]=d.useState(!1),b=wt(u),E=Nl(n),S=d.useRef(!1),[T,C]=d.useState(0);return d.useEffect(()=>{const M=m.current;if(M)return M.addEventListener(to,b),()=>M.removeEventListener(to,b)},[b]),O.jsx(py,{scope:n,orientation:r,dir:g,loop:o,currentTabStopId:p,onItemFocus:d.useCallback(M=>v(M),[v]),onItemShiftTab:d.useCallback(()=>x(!0),[]),onFocusableItemAdd:d.useCallback(()=>C(M=>M+1),[]),onFocusableItemRemove:d.useCallback(()=>C(M=>M-1),[]),children:O.jsx(te.div,{tabIndex:y||T===0?-1:0,"data-orientation":r,...c,ref:h,style:{outline:"none",...e.style},onMouseDown:G(e.onMouseDown,()=>{S.current=!0}),onFocus:G(e.onFocus,M=>{const I=!S.current;if(M.target===M.currentTarget&&I&&!y){const N=new CustomEvent(to,fy);if(M.currentTarget.dispatchEvent(N),!N.defaultPrevented){const _=E().filter(P=>P.focusable),B=_.find(P=>P.active),R=_.find(P=>P.id===p),H=[B,R,..._].filter(Boolean).map(P=>P.ref.current);Fl(H,f)}}S.current=!1}),onBlur:G(e.onBlur,()=>x(!1))})})}),Il="RovingFocusGroupItem",_l=d.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:o=!1,tabStopId:s,children:i,...a}=e,l=Wt(),u=s||l,f=vy(Il,n),c=f.currentTabStopId===u,m=Nl(n),{onFocusableItemAdd:h,onFocusableItemRemove:g,currentTabStopId:p}=f;return d.useEffect(()=>{if(r)return h(),()=>g()},[r,h,g]),O.jsx(Eo.ItemSlot,{scope:n,id:u,focusable:r,active:o,children:O.jsx(te.span,{tabIndex:c?0:-1,"data-orientation":f.orientation,...a,ref:t,onMouseDown:G(e.onMouseDown,v=>{r?f.onItemFocus(u):v.preventDefault()}),onFocus:G(e.onFocus,()=>f.onItemFocus(u)),onKeyDown:G(e.onKeyDown,v=>{if(v.key==="Tab"&&v.shiftKey){f.onItemShiftTab();return}if(v.target!==v.currentTarget)return;const y=by(v,f.orientation,f.dir);if(y!==void 0){if(v.metaKey||v.ctrlKey||v.altKey||v.shiftKey)return;v.preventDefault();let b=m().filter(E=>E.focusable).map(E=>E.ref.current);if(y==="last")b.reverse();else if(y==="prev"||y==="next"){y==="prev"&&b.reverse();const E=b.indexOf(v.currentTarget);b=f.loop?xy(b,E+1):b.slice(E+1)}setTimeout(()=>Fl(b))}}),children:typeof i=="function"?i({isCurrentTabStop:c,hasTabStop:p!=null}):i})})});_l.displayName=Il;var yy={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function wy(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function by(e,t,n){const r=wy(e.key,n);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return yy[r]}function Fl(e,t=!1){const n=document.activeElement;for(const r of e)if(r===n||(r.focus({preventScroll:t}),document.activeElement!==n))return}function xy(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var Sy=Al,Ey=_l,Pr="Tabs",[Cy,cw]=Ft(Pr,[Rl]),Wl=Rl(),[Oy,Xo]=Cy(Pr),Ll=d.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,onValueChange:o,defaultValue:s,orientation:i="horizontal",dir:a,activationMode:l="automatic",...u}=e,f=Co(a),[c,m]=Gt({prop:r,onChange:o,defaultProp:s??"",caller:Pr});return O.jsx(Oy,{scope:n,baseId:Wt(),value:c,onValueChange:m,orientation:i,dir:f,activationMode:l,children:O.jsx(te.div,{dir:f,"data-orientation":i,...u,ref:t})})});Ll.displayName=Pr;var $l="TabsList",jl=d.forwardRef((e,t)=>{const{__scopeTabs:n,loop:r=!0,...o}=e,s=Xo($l,n),i=Wl(n);return O.jsx(Sy,{asChild:!0,...i,orientation:s.orientation,dir:s.dir,loop:r,children:O.jsx(te.div,{role:"tablist","aria-orientation":s.orientation,...o,ref:t})})});jl.displayName=$l;var Bl="TabsTrigger",Hl=d.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,disabled:o=!1,...s}=e,i=Xo(Bl,n),a=Wl(n),l=Ul(i.baseId,r),u=zl(i.baseId,r),f=r===i.value;return O.jsx(Ey,{asChild:!0,...a,focusable:!o,active:f,children:O.jsx(te.button,{type:"button",role:"tab","aria-selected":f,"aria-controls":u,"data-state":f?"active":"inactive","data-disabled":o?"":void 0,disabled:o,id:l,...s,ref:t,onMouseDown:G(e.onMouseDown,c=>{!o&&c.button===0&&c.ctrlKey===!1?i.onValueChange(r):c.preventDefault()}),onKeyDown:G(e.onKeyDown,c=>{[" ","Enter"].includes(c.key)&&i.onValueChange(r)}),onFocus:G(e.onFocus,()=>{const c=i.activationMode!=="manual";!f&&!o&&c&&i.onValueChange(r)})})})});Hl.displayName=Bl;var Yl="TabsContent",Vl=d.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,forceMount:o,children:s,...i}=e,a=Xo(Yl,n),l=Ul(a.baseId,r),u=zl(a.baseId,r),f=r===a.value,c=d.useRef(f);return d.useEffect(()=>{const m=requestAnimationFrame(()=>c.current=!1);return()=>cancelAnimationFrame(m)},[]),O.jsx(rn,{present:o||f,children:({present:m})=>O.jsx(te.div,{"data-state":f?"active":"inactive","data-orientation":a.orientation,role:"tabpanel","aria-labelledby":l,hidden:!m,id:u,tabIndex:0,...i,ref:t,style:{...e.style,animationDuration:c.current?"0s":void 0},children:m&&s})})});Vl.displayName=Yl;function Ul(e,t){return`${e}-trigger-${t}`}function zl(e,t){return`${e}-content-${t}`}var uw=Ll,dw=jl,fw=Hl,mw=Vl;export{Zy as A,Ly as C,lw as D,Fy as I,iw as L,Wy as P,Ay as R,Yy as S,Iy as T,_y as V,$y as a,jy as b,Hy as c,By as d,Vy as e,qy as f,Gy as g,Ky as h,Xy as i,zy as j,Jy as k,ew as l,tw as m,nw as n,rw as o,Ny as p,lp as q,gg as r,uw as s,Dy as t,dw as u,fw as v,mw as w,ky as x,cp as z}; diff --git a/service/dist/assets/ui-CImlNgPE.js.br b/service/dist/assets/ui-CImlNgPE.js.br new file mode 100644 index 0000000000000000000000000000000000000000..5b249b19f2d4fc5107166d2796c4b81178d73a83 GIT binary patch literal 64249 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 literal 0 HcmV?d00001 diff --git a/service/dist/cursors/areaselect.cur b/service/dist/cursors/areaselect.cur new file mode 100644 index 0000000000000000000000000000000000000000..5f55fdac622bfdc3a2c8b3977d2162ad9676aa6b GIT binary patch literal 607 zcmV-l0-*f>00IC303aX$01p5U07(J>02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0uV_=K~#90?U&7N(?Af%XVzQO@Zn0J-pT{;0;snj5jgV#puhv< z0ebI&BZ|ZWaBa`M_2^@iCqO6%EJX^$IXD~J-5s>)I5JT_Y|~gm&0kts>zSST`D1o$ zfbx=^PUlG&h976M*|+I*dKLu1bEruI01k)4;X7l@h;Ef6N%EC#JJ$gKJXT75AtJ*7 zWQ_UAw$c(Me3AVn06gINtpU+xo7gn~+BHOk{}`+CBIGrH0T5AU+d05oYwkcLiMtB4 z2dF9m_Z>i%0C9M%^A&6_B3rlf+LhgIx6y95UpE?!SBQA9sr0ngj@DYbu6vrdA>yMr zjz2q&qY-f)c#D!WO|N^s-Zg|__{kXaE5EnbAY+?Z6h-f)l=2NCK81RPi1^HLoR&~Z z{UD+g>Q@@a@ptL_{$;b-Jn=m5?WT7izwaaBLqt5xowkoJESlMVLqt(@)$jK&?4Ewi zy`rO_0gqa( t*2!Qn=#0nXi_vIw?)(0W<^RQ^`UBDj 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 Ud}Qs0R{#J207*qoM6N<$g7e|(SpWb4 literal 0 HcmV?d00001 diff --git a/service/dist/cursors/move.cur b/service/dist/cursors/move.cur new file mode 100644 index 0000000000000000000000000000000000000000..8c7fd03ac996aae06966aed26292e86b6d49098e GIT binary patch literal 804 zcmV+<1Ka!n00IC303aX$01p5U01g8H02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0@X=GK~#90?N?1`6G0SyZ+6>lwrLXfU=w0Qo5Hl%;k;`uj${^8@En~^Fv4xK;*Py;WLmzY-n01%ZW3+D+wJ$Zh* zW!Dz~AiEBkqwov;WvumumIa@;upm||nnQo!l)%CmT4m;J=lyR4&{d=g5~wIxW!-HN z*lYsiyf|eCqJ$RV)%$UiSyFATcP)j(8s<|v<2g;EMCYXs)jnIRg9 zfZk{{>Thpv?^G1UM>PMh{AeO(nx^zVSKWLoi3bz%3i~g;9~h?A$b%4(Q_=WXeD&;U zzWZ7pW3kx2*4EY@RaMU-qOF<`DZHEFa6e(f+Z7~i!l1%z*Iaxs%EICBF-1{M*bOcq zIv&v&bTx?8a|HzzPn*>F?hLGf-`Pz0f;{I`ZYE&F_9{j zO5@-XO#ueojS?K1b2yM_lxN1jvrs4$&t|g^Ip?!(2p|G91{lN+NO02bOmH*7e~#Uq zx!CkWl#m{YL>_l^bPUO|tkCLWg2iG{)^%M827}i;9?!WY0|4yzGq~!Vy778A`x%gx z--e74NHT|_F=;%1@^w)!#CX}-BI literal 0 HcmV?d00001 diff --git a/service/dist/cursors/normal.cur b/service/dist/cursors/normal.cur new file mode 100644 index 0000000000000000000000000000000000000000..2b4147757c46c517b3c00ae2004d92ba8074b2da GIT binary patch literal 1021 zcmV{O9RRA{x!f~8~jBCWHHv#-W z@|95l%Vm=4GgoyhAcK41kjD-rk-+1b|2$!5aX+ z2k`o^0NmNxISs?Gu8$8Y$^1nC4@tgH@=7LvX_^-t2!bH;Jnv8+!;lbC3!eh`kmRkN z0613+aOT3%(b2xV18_M_0QguyNM6eVVC;bGS1OgKmvA6`|F;0VngtLg0ZOG(on#xM z(K7&E$O2#zqFSxWP^^szKwj5j|tfd3Xb9V(s&$gKWQL+#>H#eR6`FRV#oetMUuIv7`y}kX_^78VNTCLX7S)b~_ zUYxyYnmyMRh4hVM7izUyyHcrqJ3BjjH=oZ>#4ZIvP^ng{t4m8uk6hOcQ-PDVhrKe7 zl}r9H4CA_cGA(ut4|i%kF*v zqJ*uo!l8!fl=Z-NcTz5Wz%UG1#mM`6LT~dr^V3w|f$i?3LWg4#Oae&&$yOjG%l{tD ruy%J+*VU{3SdG6I&Wdl8fn)s(>X|gjEA#{K00000NkvXXu0mjfAoJT= literal 0 HcmV?d00001 diff --git a/service/dist/cursors/pen.cur b/service/dist/cursors/pen.cur new file mode 100644 index 0000000000000000000000000000000000000000..1f18fe9a2aa5d897bf216a6a8eb629e65d0e884c GIT binary patch literal 859 zcmV-h1El-_00IC303aX$00saV07U};02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0}M$-K~#90?Uqky6jvO_Kkw~kk{CnCq^;Vj5v?KyT7x5kpixT& zK@>p|?4?CLcq&n`w8fx8tB8W4=*cQAlu~-Ax#r|S!8ra$L9yCs5?u?k{tLQqcixki z>|q(Ao!w;gpx@IlznS;>&dm4sdjs#fL{ba8zDkXS@mf&bkmkQ@pF2;7yG|wnZ$7V5 z#?U$dzvT>_wTRtIuH|RGF#~%(kxS+{Vy8B=h0xNk%!Z6I-!*oty2K4EzM`g1tdTo+ zHOr;TYlN&b@LW*+Fl2sXnvW7S(CDki%Q?P2(HqXr8`AB~DOS~s!Jrikx1VTUkd$0s z)w{mh;`-`QQ@7G>7nJ!s6Pg%8L-0kwQQ*_knlao zRdB2H2;mcf9l*j!c>p*D9M8^mvaef5R%!tF7}yMa8F`RA@E33(@LmtE*nsN~4wUu4 zH$YWMDFjXf`+%(DWx`WH8?bd4_&s1Ba4zs1 z`zB&ZlmVB;upIiqo!C z_B;Oq911+=ak=nV23%jcz_-B4NXfQaSMifPs09AM2J8j{d{t~YoBmSScH0$rPONq- zI|C=PVSS5Xof!&ODO}q&vvA=2NZ_wDu(z*JGr3A^+%Qgd)EXv7${BkJa3=7aLLvr^ z^y^6%vU=?oAIJ%7s|8vQr46v7^(Q-OD@lB81CL?#iTk=Wqm0-(J;la4!3-gu%WyF9 zw%6@ulZ;$nrCeWixxO-Ux|Qkd4NdP0UAX#8U+w5AOdV~WjGm}BG)Nd{k8ev%dtVqH z{wM5urp)#gO=3iek2Q){-ptqb447XtAq#SF2e_Cw{9GmI4?IUFZoq2s_58F)IX>(O l&0Qb}JSVxo+4tft>m~U(9S|;NWrF|!002ovPDHLkV1jo-g7^Rc literal 0 HcmV?d00001 diff --git a/service/dist/cursors/resizeDIAG1.cur b/service/dist/cursors/resizeDIAG1.cur new file mode 100644 index 0000000000000000000000000000000000000000..a56743ac1146d56fdd6266aa141caf7b22e66cf7 GIT binary patch literal 874 zcmV-w1C{&$00IC303aX$01p5U08|4202TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0~<+1K~#90?Ur3g6j2m_&z*69&}|pT--SRa7R!Ao)YQ-*qS%*G zL9tfCo_wz!q6d+EjqHzl>OsoPr+VzEdPz!m_v&s&XjcA(u!Ss?Kf8Np=AO9bif-!$ zt3wbS7??RT%=zwj@0mLQ|Kl$QNtd+UdnV=VtF)5*A`6jCdbHN^!zh59)P$rI%X0Yv zH*pj+fh4<;fT~b-BU)pAYdC;ZR$X=lqQO4GtqbLrT%fe8#Q$%gNge9(2z~>?Ep3)*o!AitJg0M z=`#~PRGEN)G!RD|9Pi#-(008=lhcuBsy|g~?;mceK2Yc0AN!e%<&>XvKYZPq|7K~T zI>5LnuH%*v5EF=abi0jirw}%?=d9B{;P>`T$7Yu`dtx?mFCrr?>F>gE` z7o$xVNfXsZnaJ~cy-vU1-^v)9Lrk5CEhe&V(LYXyFcA)iI}?e-R0b383|*KlEiKMq zFxZwzBtB&@K@stoQ4ltd$5SdyFvg}cn4pH5sH>|h2?PSd#N;+6bk6y6&Uvv>5VrRA zc4sIQI?ouJ6{AkIpzC^A)3h=p0JgR$rDxY$bOVBOuBxi~G!}~$fPong9=jiBY zyI2#P^SG|-E2^qaGR98FVlnZIp&_rED5R90i9{m4#l^*|kw~Pmr>Ez)j}kEmLTvM< z=H})cm&-+5E|(@rQlhJ?Ye&Ct*#t3gknnHBPXtV4oiRLFSpWb407*qoM6N<$f;)|c A2mk;8 literal 0 HcmV?d00001 diff --git a/service/dist/cursors/resizeDIAG2.cur b/service/dist/cursors/resizeDIAG2.cur new file mode 100644 index 0000000000000000000000000000000000000000..25048ba3616b9b0ec1e573191b09154aa08f54aa GIT binary patch literal 898 zcmV-|1AY7e00IC303aX$01p5U0Bi#Q02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ12aiPK~#90?Uq4E6j2z*|L@JDAq4BRtx0uAqYTPR9ikMXC?P>B zjG(1cw<5H}LwV>>>@6xHIwTR@JasP>1aYxl)K#~%)`B7;&DD0*-5KY-FQz8ha#q)x ztxJEH%g$qd|Nr;i`@RMK>mQ5d^W&*higC^rDJ67W7aos?eqF=!X+Txg{fx0ojIoQV zs_tuUZq94qMG=ugL#sK3nCKP;Gt0Hw9n_;44^o3 z3;tMk@{w%G)9LhBXJ=<^2E5SC16M^vv1O7E^!4?f@_N0QaCb^Chz=7`BwKP_*JIt? z-E}1;C0lIxT35hY*ihDojKh!LnXhL}l39}X_w@9fsHmuLKe-k*s@{yctVWUP18!;_xko9=O23aO%&Bf${9UUFDnx<{C;Xk!qC#ku@0UWTK z%+?>jO8|F2N^k<5^qQkDqay*o-#-+O$LFnK2*6nB+bjpTwdN>*TL5-CETMI}K3el3 z*z)9pKQcKvIS0Tppyv{ftpHc-_S$9*7KheNq^F0(_(&kpSl^53MYxrG$?SI$U*Y{B z0QUfFcZ3_pTQkzznrJ#6%z*2;!Y#37l2_YPtt?COLGdaQNHo<4@#Wi|uPXUU6{xo7 zd3l!PZ^X;~>xq_zJ{z7|ZSt(QKnoj{0PX|W;WSc7Pe;sX=-PbXd_O*avdTV}%W2Qa zfcE{mS*c4M;fDTN#D)XOD`y5U^$niWRa;Jc2}H^y5zQ}!r=w=1_j01KE{Lg5v-X~+ z{{+6oKzwfjL5e7(cnV2LYvx$}#)6Aj^hUDvYy>k?t|VXf7I>b0*o8F(4dA>ILXsF8 zY)fAC428vp4E4+BaI$AJ_DKX9F9|mSI{n^M!PI)zu@lMV73vJrZf5A8aSM*si- literal 0 HcmV?d00001 diff --git a/service/dist/cursors/resizeNS.cur b/service/dist/cursors/resizeNS.cur new file mode 100644 index 0000000000000000000000000000000000000000..43d2d2e62b7d17b8f0a5c908ed8a498e82d292d7 GIT binary patch literal 359 zcmV-t0hs;(00IC303aX$01p5U08s$|02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0T@X{K~#90?Uk`g#6S>+|Cvj;L<4|k0=WY4INw&%q(A^*FnpMv@_6+YMBRni z6GRSPx4O?Rfn242ik3Eh9WPl2(a13mt^z+hPA%6iP%B(-oELD1(K74>;06A>Ku~3A zwi%+|4{P~e87;$J0A8SF*bBf5{6PU}TcF7E{9Q!s;-iRsSZhDgFa)3%$MKrh`ra7x zX081yiehSvIXA|1nieQ2TT@ArOwu$x%(CoQYrR`F?Hko^P0p#QLl6J}002ovPDHLk FV1iBhkG22+ literal 0 HcmV?d00001 diff --git a/service/dist/cursors/resizeWE.cur b/service/dist/cursors/resizeWE.cur new file mode 100644 index 0000000000000000000000000000000000000000..5204c602e3b41a3968eef4e974dd2f1ec2af81a3 GIT binary patch literal 309 zcmV-50m}XW00IC303aX$01p5U03QJW02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0OmWJJpmAK;|oCNA^Vx za&dGK2M0Gt7xg=62j?zQ4_p-$6kWP_f++RcOC*x26u|^~X2}EZ65jmYC)_PBfj-`k zDh+HO_4#wllL*2HoZqMO!#4nO6a)nj0*C;x>Gj=-k+ZjbmSndq$r>!lE-JOxm5q}t zDQ5)H?32NPk_d-t=^E)TZ>sYS4FC&IGr^_l%XIr>mDJGjuHlj~0A;PTu3%lh1%xoU z_h+an1VX@;05SM)3K8fzwD*xtzzhn@P$vKWKJ-~=o~odBGGIl`uZ_$)%K2yj(7 z2;u)NAijnJZ2;*ni|7l0tSAAl2Dapo)%x+lXtQ++;8_ZJ0uPJL_SRvLUYiQ&eoWaX z*D}Aeo-gfH+4kxeiV!iH?-92v>NDi%AEm}XuG3`v-InC<|Z=K=5m>;X6k!*G-& z$yJtRH?!I70>Bn}Oaa&iun*uk2!gYsC?1-oNtpRvYyG@fEbihsHppJ`0PF%d0&tS1 z>6n?9vKBMHX{|5+vhk)jpxSHpeBVDMqHkADL?a?HNUN0Pzh3}mHf#Fvoql=ODPWcL zAzcD!Xh7$w?zeORyA%daIRG4B;FJTv0R~Pv035(R!GHi662R@FiHQFjAgjXxG+OJA zcD-I9B6VK?ZVy}nsHfBEV^vj8B9a@Bh`iQyJxW*9MZx=;1Sd#*fyWX%8o002ovPDHLkV1gUpp{D=< literal 0 HcmV?d00001 diff --git a/service/dist/docs/de_DE/Auto clear mainline plot settings.md b/service/dist/docs/de_DE/Auto clear mainline plot settings.md new file mode 100644 index 000000000..6e4b95877 --- /dev/null +++ b/service/dist/docs/de_DE/Auto clear mainline plot settings.md @@ -0,0 +1,46 @@ + +# 🧩 Einstellungen für automatisches Freischalten der Hauptstory + +### 🎮 Autoplay und Kampf-Hinweise + +**Autoplay** kann dir helfen, automatisch durch das Raster zu navigieren. +Allerdings **können manche Kämpfe im Final-Episode nicht automatisch ausgeführt werden.** + +--- + +### 📘 Episoden-Nummerierung + +| Nummer | Episodenname | +| :----: | :------------- | +| 1 | Episode I | +| 2 | Episode II | +| 3 | Episode III | +| 4 | Episode IV | +| 5 | Finale Episode | +| 6 | Episode V | + +--- + +### 🔢 Eingabeformat + +Verwende ein Komma („,“) zur Trennung der Zahlen, die jeweils eine Episode repräsentieren, die freigeschaltet werden soll. + +**Beispiel:** + +```text +1,2,3 +``` + +Das bedeutet, dass das Skript die Episoden **Episode I → Episode II → Episode III** in Reihenfolge durchführt. + +--- + +### ⚙️ Standardkonfiguration + +Wenn das Eingabefeld leer gelassen wird und du auf **„Run“** klickst, wird folgende Standardabfolge verwendet: + +| Region | Standardepisoden | +| :----- | :--------------- | +| CN | `1,2,3,4` | +| Global | `1,2,3,4,5,4` | +| JP | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/de_DE/Commonly used emulator adb address.md b/service/dist/docs/de_DE/Commonly used emulator adb address.md new file mode 100644 index 000000000..63f28f18c --- /dev/null +++ b/service/dist/docs/de_DE/Commonly used emulator adb address.md @@ -0,0 +1,26 @@ + +# 🧠 Referenz für Emulator-Ports + +### ⚙️ Allgemeiner Hinweis + +**Für die Multi-Instanz von Stimulator** solltest du die Konfiguration selbst prüfen. + +--- + +### 🎮 Einzelner Emulator-Port + +| Emulator | Port(s) | +| :------------------------ | :--------------- | +| **MuMu** | `7555` | +| **BlueStacks / LDPlayer** | `5555` | +| **NoxPlayer** | `62001`, `59865` | +| **MuMu 12** | `16384` | +| **MEmuPlay** | `21503` | + +> ⚠️ **Wenn du BlueStacks nutzt**, stelle sicher, dass +> **die ADB-Port-Debug-Funktion** in den Einstellungen aktiviert ist. + +--- + +💡 *Tipp:* Diese Ports werden für ADB-Verbindungen zwischen PC und Emulator verwendet. +Solltest du Verbindungsprobleme haben, vergewissere dich, dass die **ADB-Debugging-Option** im Emulator aktiviert ist und kein anderer Emulator dieselbe Portnummer belegt. diff --git a/service/dist/docs/de_DE/Description of normal graphs.md b/service/dist/docs/de_DE/Description of normal graphs.md new file mode 100644 index 000000000..ba27b80d5 --- /dev/null +++ b/service/dist/docs/de_DE/Description of normal graphs.md @@ -0,0 +1,113 @@ + +# 📊 Beschreibung normaler Graphen + +--- + +## 🧩 1. Nutzungsbeschreibung + +### (1) Freischaltung und Auto-Kampf Anforderung + +Du **musst aktivieren**: + +* 🟡 **Automatisch Runden beenden freischalten** +* 🟡 **Autofight** + +> Das System erkennt und aktiviert diese Funktionen gegebenenfalls automatisch. + +--- + +### (2) Unterstützte Level + +Unterstützte Hauptstory-Normallevel: +🟡 **4 – 25** + +--- + +### (3) Bewegungslogik + +Wenn BAAS-Slides fixiert sind, werden alle Teambewegungen mit **einem einzigen Klick** ausgeführt. +Da die Anzahl der Teams in *Blue Archive* Slides variiert, +unterscheiden sich die **Nummerierungskoordinaten** und die **Bewegungsreihenfolge** je nach Teamzusammenstellung. + +--- + +### (4) Hinweise zur automatischen Extrapolation + +Bei Durchführung der **automatischen Extrapolation** +🟡 **musst du sicherstellen, dass Teams mit kleineren und größeren Nummern korrekt zugeordnet sind.** +(Falls unsicher: Überprüfe die Teamnummern, bevor du fortfährst.) + +--- + +### (5) Einstellungen für normale Thumbnails + +BAAS legt Konfigurationen fest basierend auf: + +* 🟢 **< Einstellungen für normale Thumbnails >** +* 🟢 **Ausgewählte Gruppenattribute** +* 🟢 **♪ Team-Logik ♪** + +Diese bestimmen die korrekte Konfiguration für jeden Slide. + +> Die zuerst entsprechende Eigenschaft im Diagramm ist **[1]**, die zweite ist **[2]**. + +--- + +## 🤖 2. Team-Logik + +1. Priorisiere die Teamwahl basierend auf **Gegenbeziehungen (Restraint / Counter)**, und verringere schrittweise die Abhängigkeit vom Attributs-Matching für verbleibende Gegner. +2. Bei Teamwahl gilt: + `4 – (Teamnummer) ≥ Anzahl der noch benötigten Teams`. +3. Wenn weder (1) noch (2) erfüllt wird, lockere nach und nach die Gegenbeziehungen zwischen [1] Partnern. +4. Wenn bereits einige Teams ausgewählt sind und `4 – max(ausgewählte Teams) ≥ verbleibende Teams`, + fülle die restlichen mit **optional möglichen Nummern**. +5. Wenn keine der obigen Bedingungen zutrifft, wähle standardmäßig **Team 1, 2, 3**. + +--- + +### 🧠 Beispiel + +Wahlreihenfolge für **23 [Explosion, Crossing] Task Force**: + +* Ein Team, eine Operation. +* Wenn *Explosion Team 3* nicht im obigen Ablauf gewählt wurde, wähle **4** als zweites. +* Wenn immer noch nicht verfügbar, wähle **12** als letztes Team. + +--- + +## 🚀 3. Beschreibung von Normal-Push-Chart-Leveln + +### (1) Gebiet Push-Verhalten + +Wenn du auf +🟡 **„Could not close temporary folder: %s“** stößt, +stellt jede eingegebene Zahl ein **Gebiet dar, das gepusht werden soll**. +Das Programm prüft, ob jeder Level innerhalb dieses Gebiets neu gespielt werden muss, +abhängig davon, ob das aktuelle Level bereits eine `SSS` Bewertung erreicht hat. + +**Beispiel:** + +```text +15, 16, 14 +``` + +Das bedeutet, dass das Programm die Gebiete **15 → 16 → 14** der Reihe nach durchläuft. + +--- + +### (2) Erzwingungs-Treffer Konfiguration + +Wenn 🟡 **Erzwinge Treffer auf jedem angegebenen Level** aktiviert ist: + +* Gib eine einzelne Zahl ein → pushe ein ganzes Gebiet einmal. +* Gib `Nummer-Nummer` ein → wähle ein genaues Unterlevel. + +**Beispiel:** + +```text +15, 16-3 +``` + +--- + +✅ *Tipp:* Verifiziere stets, dass Levelnummern und Teamzuordnungen mit deiner **BAAS-Konfiguration** übereinstimmen, bevor du automatisierte Skripte ausführst, um Fehlverhalten zu vermeiden. diff --git a/service/dist/docs/de_DE/Difficult Chart Configuration Description.md b/service/dist/docs/de_DE/Difficult Chart Configuration Description.md new file mode 100644 index 000000000..ec5417b59 --- /dev/null +++ b/service/dist/docs/de_DE/Difficult Chart Configuration Description.md @@ -0,0 +1,102 @@ + +# 💀 Bedienungsanleitung für das Hardship Map + +Die **Hardship Map** funktioniert ähnlich wie die Modi **Team-Logik** und **Normale Graphen**. +Einige schwierige Karten erfordern **drei Teams**, die alle **das gleiche Attribut** wie das zuerst im Gebiet zugeordnete Team teilen. + +--- + +## 🧾 Ausfüllanleitung + +### ⚠️ Erlaubte Zeichen + +Der **String**, den du für den Slide-Level eingibst, darf **nur** folgende Zeichen oder Wörter enthalten: + +``` +"-", "sss", "present", "task", ",", [Zahlen] +``` + +Jede Segmentgruppe soll durch Kommas (`,`) getrennt sein. + +> ❌ Füge **nicht** irgendwelche Schlüsselwörter wie `"sss"`, `"present"` oder `"task"` außerhalb gültiger Syntax ein. + +--- + +### 🧩 Beispiel 1: Grundlegende Nutzung + +**Eingabe:** + +```text +15,12-2 +``` + +**Interpretation:** +BAAS führt die Aufrufe durch: + +```text +15-1, 15-2, 15-3, 12-2 +``` + +und agiert gemäß der Hard Map Einstellungen: + +* `sss` → Sternebewertung +* `present` → Belohnung einholen +* `task` → Herausforderung durchführen + +--- + +### 🧩 Beispiel 2: Zahl + Schlüsselwort + +**Eingabe:** + +```text +15-sss-present +``` + +**Bedeutung:** +BAAS führt die Levelgruppen **15-1, 15-2, 15-3** aus +und führt sowohl `sss` (Sternebewertung) als auch `present` (Geschenke einsammeln) aus. + +--- + +### 🧩 Beispiel 3: Zwei Zahlen + Schlüsselwörter + +**Eingabe:** + +```text +15-3-sss-task +``` + +**Bedeutung:** +Dies ruft **Level 15-3** auf, um: + +* die `sss` Bewertung zu erreichen +* die `task` Herausforderung abzuschließen + +--- + +### 🧩 Beispiel 4: Komplexes Beispiel + +**Eingabe:** + +``` +7,8-sss,9-3-task +``` + +**Bedeutung:** + +* Ruft `(7-1, 7-2, 7-3)` auf → führe `sss`, Geschenke einsammeln und Herausforderungen aus +* Ruft `(8-1, 8-2, 8-3)` auf → führe `sss` +* Ruft `9-3` auf → absolviere die `task` Herausforderung + +--- + +## 🧠 Systemverhalten + +> 🟡 **Hinweis:** +> BAAS bestimmt automatisch, ob: +> +> * ein Level bereits **`sss`** erreicht hat, oder +> * ein **Geschenk / present** bereits eingesammelt wurde. + +Falls eine dieser Bedingungen bereits erfüllt ist, **wird das Level automatisch übersprungen**, um Laufzeit zu optimieren. diff --git a/service/dist/docs/de_DE/Frontend Development Guide.md b/service/dist/docs/de_DE/Frontend Development Guide.md new file mode 100644 index 000000000..bcf0a4f5c --- /dev/null +++ b/service/dist/docs/de_DE/Frontend Development Guide.md @@ -0,0 +1,103 @@ + +# 🏗️ Frontend-Entwicklungsleitfaden + +Dieses Dokument beschreibt, wie die **BAAS Desktop-Applikation** strukturiert ist, wie Daten zwischen Client-Modulen und dem Backend fließen, und was bei Erweiterung der Plattform erwartet wird. +Es richtet sich an **Engineering- und Delivery-Teams**, die eine kanonische Referenz beim Onboarding oder der Implementierung neuer Features benötigen. + +--- + +## 🧩 Anwendungsschale + +Die React-Applikation wird über `App.tsx` gerendert. Sie verbindet den **ThemeProvider**, den **AppProvider** und das persistente Layout-Gerüst (`MainLayout`). +Seiten werden über einen leichten **framer-motion Router** gewechselt, der inaktive Seiten gemountet hält, sodass sie ihren Zustand beim Tab-Wechsel behalten. + +* **Einstiegspunkt:** `main.tsx` initialisiert i18n, das Theme und rendert ``. +* **Provider:** `AppProvider` lädt UI-Präferenzen, stellt WebSocket-Verbindungen her, injiziert das Profilkatalog und stellt Setter über Context zur Verfügung. +* **Layout:** `MainLayout` enthält die persistente Seitenleiste (`Sidebar.tsx`) und den Header (`Header.tsx`). + +--- + +## 🧱 Schlüsselmodule + +| Modul | Verantwortung | Wichtige Dateien | +| :------------------ | :------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------- | +| **Context** | Teilt UI-Einstellungen, aktives Profil und Profilkatalog in der App. | `contexts/AppContext.tsx` | +| **State Stores** | Zustand-Stores normalisieren Remote-State (Konfig, Events, Status, Logs). | `store/websocketStore.ts`, `store/globalLogStore.ts` | +| **Remote Services** | Kapselt Backend-Verträge wie Hotkey-Persistenz und verschlüsselte WebSocket-Sessions. | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | +| **Pages** | Container auf Routenebene für `Home`, `Scheduler`, `Configuration`, `Settings`, `Wiki`. | `pages/*.tsx` | +| **Feature Forms** | Modulare Konfigurationspanel, das auf einem Ausschnitt von `DynamicConfig` arbeitet. | `features/*Config.tsx`, `features/DailySweep.tsx` | +| **Shared UI** | Wiederverwendbare visuelle Primitiven und Komponenten für Publikum (Inputs, Selectors, Modals, Logger). | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | +| **Hooks** | Business-Logic Hooks, etwa Hotkey-Orchestrierung und Theme-Handling. | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | + +--- + +## 🔄 Datenflussübersicht + +### 🔌 WebSocket-Initialisierung + +1. `AppProvider` ruft `useWebSocketStore.getState().init()` beim Start auf. +2. `init()` verbindet sich nacheinander mit **Heartbeat**, **Provider** und **Sync** Channels via `SecureWebSocket`. +3. Sobald verbunden, lädt der Store statische Daten, Konfigurationsmanifeste und Live-Event-Queues. +4. Store-Setter senden Updates an abonnierte Komponenten via Zustand-Selektoren. + +--- + +### ⚙️ Konfigurations-Update-Zyklus + +1. Feature-Forms arbeiten auf einer lokalen Entwurfs-Kopie von `DynamicConfig`. +2. Beim Speichern erzeugt das Formular ein minimalen `patch`-Objekt und ruft `modify(path, patch, showToast)` auf. +3. Der Store sendet einen `sync` Befehl mit JSON-Patch-Semantik und registriert einen Callback in `pendingCallbacks`. +4. Wenn das Backend den Befehl bestätigt, leert der Callback den Pending-Status und zeigt optional einen Toast via `sonner` an. +5. Eingehende `config` Nachrichten synchronisieren den lokalen Store, sodass alle Abonnenten automatisch aktualisiert werden. + +--- + +### 📡 Scheduler-Telemetry + +* **Home**- und **Scheduler**-Seiten abonnieren `statusStore` und `logStore`, um Laufzeitkennzahlen anzuzeigen. +* Die Log-Pipeline dedupliziert Einträge und spiegelt globale Logs in `globalLogStore` für das Terminal des Ladescreens. +* Alle ausgehenden Befehle (Start/Stop Trigger, Patches) werden mit Zeitstempeln versehen, um Konsistenz bei der Reconciliation zu erleichtern. + +--- + +## ⚙️ Querschnittliche Anliegen + +### 🌐 Internationalisierung + +Übersetzungen werden in `assets/locales/*.json` gespeichert und über `react-i18next` geladen. +Die Standardsprache ist **Chinesisch (`zh`)**, mit **Englisch** als Fallback. +UI-Texte sind nach Domänen (Scheduler, Artifact etc.) organisiert, um Lokalisierungsupdates zu vereinfachen. + +--- + +### ⚡ Leistung & UX + +* **Mount Preservation** (siehe `App.tsx`) verhindert, dass teure Komponenten bei Tabwechseln neu initialisiert werden. +* Feature-Forms verwenden `useMemo` und `useCallback`, um unnötige Re-Renders zu vermeiden. +* Scroll-Bereiche nutzen `scroll-embedded` Utility-Klassen für konsistentes Styling. +* Echtzeit-Updates verwenden **gebündelte Zustand-Setter**; große Updates (z. B. Logs) werden unveränderlich angehängt, um Referenz-Churn zu minimieren. + +--- + +### 🧰 Tooling + +* **Build:** Vite + React 19 + TypeScript 5 +* **Styling:** Tailwind CSS mit benutzerdefinierten Token und wiederverwendbaren UI-Komponenten +* **Animationen:** `framer-motion` für Übergänge, `ogl` für Partikeleffekte + +--- + +## 🚀 Erweiterbarkeitscheckliste + +1. Erstelle oder aktualisiere eine Feature-Komponente unter `features/` und binde sie in die `featureMap` (Konfigurationsseite) ein. +2. Erweitere die Übersetzungswörterbücher mit neuen Labels sowohl in `en.json` als auch `zh.json`. +3. Persistiere Server-Kommunikation über `modify`, `patch` oder `trigger`, um konsistentes Acknowledgement-Handling zu gewährleisten. +4. Exponiere UI-Einstellungen über `AppContext`, falls sie vom Anwender konfigurierbar sein sollen. + +--- + +Das Einhalten dieses Kontrakts stellt sicher, dass: + +* Die Anwendung konsistent und erweiterbar bleibt. +* **Tastatursteuerung** und **Telemetry-Synchronisation** korrekt funktionieren. +* Der **WebSocket-State** über alle Seiten hinweg kohärent bleibt. diff --git a/service/dist/docs/de_DE/Guide for activity sweep fill in.md b/service/dist/docs/de_DE/Guide for activity sweep fill in.md new file mode 100644 index 000000000..e940894b4 --- /dev/null +++ b/service/dist/docs/de_DE/Guide for activity sweep fill in.md @@ -0,0 +1,53 @@ + +# ⚔️ Leitfaden zur Konfiguration der Activity-Sweep + +Diese Anleitung erklärt, wie du korrekt **Activity-Sweep-Parameter** für die BAAS-Automatisierung einstellst. + +--- + +## 🧾 Einzelne Quest sweepen + +**Parameter:** +`Sweep Quest Number` + +* Typ: **Ganzzahl** +* Bereich: `1` – *Maximale Schwierigkeit* in der aktuellen Aktivität. + +**Parameter:** +`Anzahl der Sweeps` + +1. **Ganzzahl** → exakte Anzahl der Durchführungen. + z. B. `3` bedeutet drei Durchläufe. +2. **Dezimalzahl** → Prozentsatz der aktuellen AP (Aktionspunkte) verwendet. + z. B. `0.5` bedeutet `AP × 0.5`. +3. **Bruch** → anteilige AP-Nutzung. + z. B. `1/3` bedeutet `AP × (1/3)`. + +--- + +## 🔁 Mehrere Quests sweepen + +Um mehrere Quests nacheinander zu sweepen, +verwende Kommas (`,`) zur Trennung der Questnummern. + +**Beispiel:** + +```text +Sweep Quest: 9, 10, 11 +Anzahl der Sweeps: 0.5, 3, 1/3 +AP: 999 +``` + +**Interpretation:** + +| Quest | Berechnung | Ergebnis | +| :----- | :--------------- | :----------- | +| **9** | (999 × 0.5) / 20 | 25 Mal | +| **10** | Fix 3 Mal | 3 Durchläufe | +| **11** | (999 × 1/3) / 20 | 16 Mal (ca.) | + +➡️ BAAS sweept diese Quests **in der Reihenfolge**: Quest 9 → Quest 10 → Quest 11. + +--- + +✅ *Tipp:* Vergewissere dich, dass dein **AP-Wert** dem im Spiel verfügbaren Ausdauerwert entspricht, bevor du mehrere Sweeps ausführst. diff --git a/service/dist/docs/de_DE/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/de_DE/Internal settings in BlueArchive game (first-use must read).md new file mode 100644 index 000000000..489023f87 --- /dev/null +++ b/service/dist/docs/de_DE/Internal settings in BlueArchive game (first-use must read).md @@ -0,0 +1,30 @@ + +# ⚙️ Blanche Files — Interne Spieleinstellungen + +Dieser Leitfaden beschreibt die **obligatorischen** und **empfohlenen** Spieleinstellungen für einen reibungslosen Betrieb von **Blanche Files** mit dem BAAS Automatisierungssystem. + +--- + +## 🧩 **Erforderliche Einstellungen** + +| Kategorie | Einstellung | Wert / Anweisung | +| :-------------------------- | :------------------------------- | :----------------------------------- | +| **Grafik** | Vertikaler Kampf-Screen Text Box | **Aus** | +| **Wiedererinnerung Lüfte** | Charakterauswahl | **Wähle nicht** Ako, Aru oder Wakamo | +| **Sprache (Global-Server)** | — | **Englisch** | + +--- + +## 💡 Empfohlene Einstellungen *(optional, beeinflusst nicht das Skript)* + +| Einstellung | Empfohlener Wert | +| :--------------------------------- | :--------------- | +| **Auflösung** | Höchstmöglich | +| **FPS** | 60 | +| **Beschleunigter Rendermodus** | Kompatibilität | +| **Post-Processing** | Ein | +| **Kantenglättung** (Anti-Aliasing) | Ein | + +--- + +✅ *Tipp:* Hochwertige Grafikeinstellungen gewährleisten konsistentere visuelle Erkennung für automatisierte Aufgaben, sind aber **nicht unbedingt erforderlich** für stabile Ausführung. diff --git a/service/dist/docs/de_DE/Normal Sweeping Scanning Description.md b/service/dist/docs/de_DE/Normal Sweeping Scanning Description.md new file mode 100644 index 000000000..05ce9b2f8 --- /dev/null +++ b/service/dist/docs/de_DE/Normal Sweeping Scanning Description.md @@ -0,0 +1,62 @@ + +# 🧹 Konfigurationsanleitung für Sweeping + +Jede **Sweep-Konfiguration** folgt dem allgemeinen Format: + +``` +Region - Task-Nummer - Sweep-Anzahl +``` + +--- + +## 🧩 Aufbau + +| Komponente | Beschreibung | +| :--------------- | :------------------------------------ | +| **Region** | Identifikator der Karte oder Gebietes | +| **Task-Nummer** | Level oder Stufe in dieser Region | +| **Sweep-Anzahl** | Anzahl der Durchläufe für das Sweepen | + +Jede Konfigurationsangabe sollte durch Kommas (`,`) getrennt sein. + +--- + +## 🗺️ 1. Verfügbare Sweep-Levels + +Alle Karten **nach Academy 1 und Academy 5** werden vom automatischen Sweepen unterstützt. + +> 🟡 **Beispiel gültiger Sweep-Strings:** +> +> ``` +> 12-1-3, 13-2-2, 14-4-1 +> ``` + +--- + +## ⚙️ 2. Spezifische Besonderheit + +Auf dem **Internationalen Server** kann das Feld für `Sweep-Anzahl` das Schlüsselwort **`max`** enthalten. + +* BAAS entscheidet automatisch, ob das Level beendet werden kann, abhängig von: + + * aktueller **Ausdauer (AP)** + * Level-Schwierigkeit und Abschlussstatus + +--- + +### 🧮 Beispiel + +Wenn genug Ausdauer vorhanden ist: + +``` +15-3, 20-3-max +``` + +**Bedeutung:** + +* Sweepen von **15-3** → dreimal +* Dann Sweepen von **20-3** → mit **der gesamten verbleibenden Ausdauer** (`max`) + +--- + +✅ *Tipp:* Nutze `max` nur, wenn du willst, dass BAAS selbständig alle verbleibende Ausdauer auf diesem Level einsetzt. Ansonsten gib explizite Sweep-Anzahlen für genaue Steuerung an. diff --git a/service/dist/docs/de_DE/Scheduling Configuration Filling Guide.md b/service/dist/docs/de_DE/Scheduling Configuration Filling Guide.md new file mode 100644 index 000000000..bb6f1a321 --- /dev/null +++ b/service/dist/docs/de_DE/Scheduling Configuration Filling Guide.md @@ -0,0 +1,83 @@ + +# 🕒 Leitfaden für Zeitplan-Konfigurationsfelder + +Diese Anleitung beschreibt, wie du Zeitplan-Konfigurationsfelder korrekt ausfüllst und interpretierst, um automatisierte Aufgaben auszuführen. + +--- + +## ⚙️ 1. Priorität + +Wenn mehrere Aufgaben in der Warteschlange sind: + +* Aufgaben mit **niedrigeren Prioritätswerten** werden **zuerst** ausgeführt. + +> Beispiel: +> Aufgabe A (Priorität 1) läuft vor Aufgabe B (Priorität 2). + +--- + +## ⏳ 2. Ausführungsintervall + +* **Ganzzahl `0`** bedeutet, dass die Aufgabe **jeden Tag** (Intervall von einem Tag) wiederholt wird. +* Größere Ganzzahlen stehen für längere Intervalle zwischen den Ausführungen (in Tagen). + +--- + +## 🕐 3. Täglicher Reset + +Aufgaben werden täglich zu festen Zeiten automatisch ausgeführt. Das lässt sich in der **Neuen UI** einfach einstellen. + +* **Format:** + +``` +[ [ h, m, s ] ] +``` + +*(UTC Zeit)* + +* **Mehrere Zeitpunkte** können angegeben werden, getrennt durch Kommas. + +**Beispiel:** + +``` +[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] +``` + +**Bedeutung:** +Läuft um **0:00 UTC** und **20:00 UTC** (entspricht 8 Uhr und 4 Uhr Pekinger Zeit bei UTC+8). + +--- + +## 🚫 4. Deaktivierte Zeitbereiche + +Aufgaben **werden nicht ausgeführt** während festgelegter deaktivierter Zeitfenster. Das lässt sich ebenfalls in der **Neuen UI** einstellen. + +* **Format:** + +``` +[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] +``` + +*(UTC Zeit)* + +* **Mehrere Intervalle** möglich, separat durch Kommas. + +**Beispiel:** + +``` +[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] +``` + +**Bedeutung:** +Aufgaben sind für den ganzen Tag deaktiviert. + +--- + +## 🔁 5. Vor- und Nachaufgaben + +Du kannst zusammenhängende Operationen verketten: + +* **Pre-Tasks:** ausgeführt **vor** der aktuellen Aufgabe +* **Post-Tasks:** ausgeführt **nach** der aktuellen Aufgabe + +> Dies stellt sicher, dass abhängige Aktionen in der richtigen Reihenfolge ausgeführt werden. diff --git a/service/dist/docs/de_DE/Task force attributes required by region.md b/service/dist/docs/de_DE/Task force attributes required by region.md new file mode 100644 index 000000000..7bae1e733 --- /dev/null +++ b/service/dist/docs/de_DE/Task force attributes required by region.md @@ -0,0 +1,38 @@ + +# 🎯 Referenztabelle der Stufenattribute + +Diese Tabelle zeigt jede Stufe und deren zugehörige **zwei Hauptattribute**, in getrennten Spalten dargestellt. + +| Stufe | Attribut ① | Attribut ② | +| :----- | :--------- | :--------- | +| **25** | Sonic | Piercing | +| **24** | Sonic | Explosive | +| **23** | Explosive | Piercing | +| **22** | Piercing | Mystic | +| **21** | Mystic | Explosive | +| **20** | Explosive | Piercing | +| **19** | Piercing | Mystic | +| **18** | Mystic | Explosive | +| **17** | Explosive | Piercing | +| **16** | Piercing | Mystic | +| **15** | Mystic | Mystic | +| **14** | Explosive | Mystic | +| **13** | Piercing | Piercing | +| **12** | Mystic | Explosive | +| **11** | Piercing | Mystic | +| **10** | Explosive | Mystic | +| **9** | Explosive | Piercing | +| **8** | Piercing | Piercing | +| **7** | Explosive | Explosive | +| **6** | Piercing | Piercing | +| **5** | Explosive | — | +| **4** | Piercing | — | +| **3** | Piercing | — | +| **2** | Explosive | — | +| **1** | Explosive | — | + +--- + +✅ *Tipp:* +Beim Planen von Kämpfen solltest du den **Angriffstyp deines Teams** mit der **Schwäche des Gegners** abgleichen. +Stufen mit zwei Attributen erfordern oft **ausgeglichene Teamzusammensetzungen**, um Stabilität über die Unterstufen zu gewährleisten. diff --git a/service/dist/docs/de_DE/reporting guidelines on issues (important).md b/service/dist/docs/de_DE/reporting guidelines on issues (important).md new file mode 100644 index 000000000..92c521756 --- /dev/null +++ b/service/dist/docs/de_DE/reporting guidelines on issues (important).md @@ -0,0 +1,60 @@ + +# 🧭 Leitfaden zur Fehlerberichterstattung und Selbstdiagnose + +Bevor du ein Problem meldest, **halte inne und prüfe** die folgende Checkliste. +So stellst du sicher, dass dein Problem reproduzierbar, klar und für andere leichter nachzuvollziehen ist. + +--- + +## 💡 Vor der Meldung + +1. **Ist das Problem schon einmal aufgetreten?** + Versuche zuerst selbstständig Lösungen zu finden — nutze **Baidu** oder das **Handbuch / die Dokumentation**. + + > Wenn das Problem weiterhin besteht, fahre mit der Meldung fort. + +2. **Tritt das Problem jedes Mal auf, wenn du das Programm ausführst?** + Konsistenz hilft dabei zu unterscheiden, ob es sich um ein Umweltproblem oder einen Zufallsfehler handelt. + +3. **Kannst du genügend Informationen bereitstellen, damit andere den Fehler nachstellen können?** + Füge Logs, Screenshots und relevante Einstellungen hinzu. + +4. **Formuliere deinen Bericht lesbar und ansprechend.** + Gut formatierte farbige Logs oder Screenshots (z. B. in einer QQ-Gruppe gepostet) erleichtern das Helfen. + +--- + +## 🎨 Problemtyp vs. nötige Angaben + +*(🟡 Gelbe Punkte sind **erforderlich**)* + +--- + +### 🧱 „Ich hänge auf Seite XXX fest!“ + +🟡 **(1)** Screenshot in 1280×720 Spielauflösung (z. B. MuMu im F9 Modus). +(2) Ein vollständiges Log als Screenshot. +(3) Wechsel zwischen Seiten testen, um zu prüfen, ob der Freeze nur auf einer Seite auftritt. + +--- + +### 🧍 „Ich kann mich nicht bewegen!“ + +(1) Versuche die Aktion ein oder zwei Mal erneut, um zu testen, ob der Freeze an derselben Stelle auftritt. +🟡 **(2)** Nimm ein vollständiges Video von *Start bis Freeze-Punkt* auf, +sodass sowohl der Emulator als auch das BAAS-Loginterface sichtbar sind. + +--- + +### ⚙️ „Ich habe XXX konfiguriert, aber es wurde nicht ausgeführt!“ + +oder +„Ich habe nichts konfiguriert, und es wurde trotzdem ausgeführt!“ + +(1) Lies sorgfältig die Konfigurationsanleitung erneut, um sicherzugehen, dass alle Parameter korrekt ausgefüllt sind. +🟡 **(2)** Füge Konfigurations-Screenshots und Programm-Logs hinzu. + +--- + +✅ *Tipp:* Ein vollständiger Bericht sollte es einer anderen Person ermöglichen, dein Problem **ohne Raten** nachzustellen. +Logs, Screenshots und klarer Kontext sparen allen Zeit und führen zu schnelleren Lösungen. diff --git a/service/dist/docs/en_US/Auto clear mainline plot settings.md b/service/dist/docs/en_US/Auto clear mainline plot settings.md new file mode 100644 index 000000000..c7e414831 --- /dev/null +++ b/service/dist/docs/en_US/Auto clear mainline plot settings.md @@ -0,0 +1,46 @@ +# 🧩 Auto Clear Mainline Plot Settings + +### 🎮 Autoplay and Battle Notes + +**Autoplay** can help you **walk through the grid** automatically. +However, **some battles in the Final Episode cannot be fought automatically.** + +--- + +### 📘 Episode Numbering + +| Number | Episode Name | +|:------:|:--------------| +| 1 | Episode I | +| 2 | Episode II | +| 3 | Episode III | +| 4 | Episode IV | +| 5 | Final Episode | +| 6 | Episode V | + +--- + +### 🔢 Input Format + +Use a comma (`,`) to separate the numbers indicating each episode to be cleared. + +**Example:** + +```text +1,2,3 +``` + +This means the script will clear **Episode I → Episode II → Episode III** sequentially. + +--- + +### ⚙️ Default Configuration + +If the input box is left empty and you click **“Run”**, the default sequence is used: + +| Region | Default Episodes | +|:-------|:-----------------| +| CN | `1,2,3,4` | +| Global | `1,2,3,4,5,4` | +| JP | `1,2,3,4,5,4,6` | + diff --git a/service/dist/docs/en_US/Commonly used emulator adb address.md b/service/dist/docs/en_US/Commonly used emulator adb address.md new file mode 100644 index 000000000..7a7f01cd7 --- /dev/null +++ b/service/dist/docs/en_US/Commonly used emulator adb address.md @@ -0,0 +1,24 @@ +# 🧠 Emulator Port Reference + +### ⚙️ General Note + +**For Stimulator multi-instance**, please check the configuration yourself. + +--- + +### 🎮 Single Emulator Port List + +| Emulator | Port(s) | +|:--------------------------|:-----------------| +| **MuMu** | `7555` | +| **BlueStacks / LDPlayer** | `5555` | +| **NoxPlayer** | `62001`, `59865` | +| **MuMu 12** | `16384` | +| **MEmuPlay** | `21503` | + +> ⚠️ **If you use BlueStacks**, make sure the \ +> **ADB port debug function** is enabled in settings. +--- + +💡 *Tip:* These ports are used for ADB connections between your PC and the emulator. +If you encounter connection issues, verify that the emulator’s **ADB debugging option** is turned on and that no other emulator instance is occupying the same port. diff --git a/service/dist/docs/en_US/Description of normal graphs.md b/service/dist/docs/en_US/Description of normal graphs.md new file mode 100644 index 000000000..34e1a1145 --- /dev/null +++ b/service/dist/docs/en_US/Description of normal graphs.md @@ -0,0 +1,113 @@ +# 📊 Description of Normal Graphs + +--- + +## 🧩 1. Description of Use + +### (1) Unlock and Autofight Requirement + +You **must enable** both: + +- 🟡 **Unlock Automatically End Rounds** +- 🟡 **Autofight** + +> The system will automatically detect and enable these functions if possible. + +--- + +### (2) Supported Levels + +Supported mainline ordinary levels: +🟡 **4 – 25** + +--- + +### (3) Movement Logic + +When BAAS slides are fixed, all team movements are executed with **a single click**. +Because the number of teams in *Blue Archive* slides varies, +the **numbering coordinates** and **movement order** also differ depending on the team composition. + +--- + +### (4) Automatic Extrapolation Notes + +When performing **automatic extrapolation**, +🟡 **you must ensure that smaller-numbered teams and larger-numbered teams are correctly assigned.** +(If uncertain, double-check team numbering before proceeding.) + +--- + +### (5) Normal Thumbnail Settings + +BAAS will determine configurations based on: + +- 🟢 **< Normal Thumbnail Settings >** +- 🟢 **Selected Group Properties** +- 🟢 **♪ Team Logic ♪** + +These determine the correct configuration for each slide. + +> The first corresponding property in the diagrams is **[1]**, and the second is **[2]**. + +--- + +## 🤖 2. Team Logic + +1. Prioritize team selection based on **restraint relationships** (counter relationships), + gradually reducing reliance on attribute matching for remaining opponents. +2. When selecting a team: + `4 - (team number) >= number of remaining required teams`. +3. If neither condition (1) nor (2) can be satisfied, gradually weaken the restraint relationships among [1] counterparts. +4. If some teams are already selected and `4 - max(selected teams) >= remaining teams required`, + fill the remaining with **optional numbers**. +5. If none of the above conditions are met, default to **team 1, 2, 3**. + +--- + +### 🧠 Example + +Selecting order for **23 [Explosion, Crossing] Task Force**: + +- One team, one operation. +- If *Explosion team 3* is not selected in the above order, select **4** as the second. +- If still unavailable, choose **12** as the final team. + +--- + +## 🚀 3. Description of Normal Graph Push-Chart Level + +### (1) Area Push Behavior + +If you encounter +🟡 **“Could not close temporary folder: %s”**, +each entered number represents an **area to be pushed**. +The program will check whether each level within that area should be replayed +based on whether the current level has reached an `SSS` rating. + +**Example:** +```text +15, 16, 14 +``` + +This means the program will roll through areas **15 → 16 → 14** sequentially. + +--- + +### (2) Mandatory Hit Configuration + +If 🟡 **Enable Mandatory Hits at Each Specified Level** is turned on: + +- Enter a single number → push one entire area once. +- Enter `number-number` → specify an exact sub-level. + +**Example:** + +```text +15, 16-3 +``` + +--- + +✅ *Tip:* Always verify that level numbering and team assignments align with your **BAAS configuration** before running automated scripts to prevent mismatched behavior. + diff --git a/service/dist/docs/en_US/Difficult Chart Configuration Description.md b/service/dist/docs/en_US/Difficult Chart Configuration Description.md new file mode 100644 index 000000000..d29f7ef66 --- /dev/null +++ b/service/dist/docs/en_US/Difficult Chart Configuration Description.md @@ -0,0 +1,103 @@ +# 💀 Hardship Map Usage Guide + +The **Hardship Map** operates similarly to **Team Logic** and **Normal Figure** modes. +Some of the difficult maps require **three teams**, all of which share the **same attribute** as the first team assigned for that region. + +--- + +## 🧾 Fill-in Instructions + +### ⚠️ Allowed Characters + +The **string** you fill in for the slide level **must not contain characters or words other than**: + +``` + +"-", "sss", "present", "task", ",", [numbers] + +``` + +Each segment should be **split by commas (`,`)**. + +> ❌ Do **not** include any keywords like `"sss"`, `"present"`, or `"task"` outside of valid syntax. + +--- + +### 🧩 Example 1: Basic Usage + +**Input:** +``` + +15,12-2 + +``` + +**Interpretation:** + +BAAS will perform calls: +``` + +15-1, 15-2, 15-3, 12-2 + +``` +and execute according to **Hard Map** settings: +- `sss` → evaluate star completion +- `present` → collect rewards +- `task` → perform challenge missions + +--- + +### 🧩 Example 2: Number + String + +**Input:** +``` + +15-sss-present + +``` + +**Meaning:** +BAAS will run level group **15-1, 15-2, 15-3** +and execute both `sss` (star evaluation) and `present` (gift collection). + +--- + +### 🧩 Example 3: Two Numbers + Keywords + +**Input:** +``` + +15-3-sss-task + +``` + +**Meaning:** +This calls **level 15-3** to: +- achieve `sss` rating +- complete the `task` challenge. + +--- + +### 🧩 Example 4: Complex Case + +**Input:** + +``` +7,8-sss,9-3-task +``` + +**Meaning:** +- Calls `(7-1, 7-2, 7-3)` → perform `sss`, collect gifts, and complete challenges. +- Calls `(8-1, 8-2, 8-3)` → perform `sss`. +- Calls `9-3` → complete the challenge task. + +--- + +## 🧠 System Behaviour + +> 🟡 **Note:** +> BAAS automatically determines whether: +> - a level has already reached **`sss`**, or +> - a **gift/present** has been collected. + +If either condition is already satisfied, **the level will be skipped automatically** to optimise runtime efficiency. diff --git a/service/dist/docs/en_US/Frontend Development Guide.md b/service/dist/docs/en_US/Frontend Development Guide.md new file mode 100644 index 000000000..bf8cb1df1 --- /dev/null +++ b/service/dist/docs/en_US/Frontend Development Guide.md @@ -0,0 +1,104 @@ +# 🏗️ Frontend Development Guide + +This document describes how the **BAAS desktop application** is organised, how data flows between client modules and the backend, and the operational expectations when extending the platform. +It targets **engineering and delivery teams** that need a canonical reference while onboarding or implementing new features. + +--- + +## 🧩 Application Shell + +The React application is rendered through `App.tsx`. It wires the **ThemeProvider**, **AppProvider**, and the persistent layout frame (`MainLayout`). +Pages are swapped using a lightweight **framer-motion router** that keeps inactive pages mounted, allowing them to retain state while users change tabs. + +- **Entry point:** `main.tsx` bootstraps i18n, theme, and renders ``. +- **Providers:** `AppProvider` loads UI preferences, establishes WebSocket connectivity, injects the profile catalogue, and exposes setters via context. +- **Layout:** `MainLayout` contains the persistent sidebar (`Sidebar.tsx`) and header (`Header.tsx`). + +--- + +## 🧱 Key Modules + +| Module | Responsibility | Key Files | +|:--------------------|:--------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------| +| **Context** | Shares UI settings, active profile, and profile catalogue across the app. | `contexts/AppContext.tsx` | +| **State Stores** | Zustand stores normalise remote state (config, events, status, logs) for components. | `store/websocketStore.ts`, `store/globalLogStore.ts` | +| **Remote Services** | Encapsulate back-end contracts such as hotkey persistence and encrypted WebSocket sessions. | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | +| **Pages** | Route-level containers for `Home`, `Scheduler`, `Configuration`, `Settings`, and `Wiki`. | `pages/*.tsx` | +| **Feature Forms** | Modular configuration panels that operate on a slice of `DynamicConfig`. | `features/*Config.tsx`, `features/DailySweep.tsx` | +| **Shared UI** | Reusable visual primitives and audience components (inputs, selectors, modals, loggers). | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | +| **Hooks** | Business logic hooks, including hotkey orchestration and theme handling. | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | + +--- + +## 🔄 Data Flow Overview + +### 🔌 WebSocket Initialisation + +1. `AppProvider` calls `useWebSocketStore.getState().init()` during boot. +2. `init()` connects sequentially to **heartbeat**, **provider**, and **sync** channels using `SecureWebSocket`. +3. Once connected, the store pulls static data, configuration manifests, and live event queues. +4. Store setters broadcast updates to subscribed components via Zustand selectors. + +--- + +### ⚙️ Configuration Update Cycle + +1. Feature forms operate on a local draft copy of `DynamicConfig`. +2. On save, the form generates a minimal `patch` object and invokes `modify(path, patch, showToast)`. +3. The store emits a `sync` command with JSON patch semantics and registers a callback on `pendingCallbacks`. +4. When the backend acknowledges the command, the callback clears the pending state and optionally displays a toast via `sonner`. +5. Incoming `config` messages reconcile the local store so all subscribers refresh automatically. + +--- + +### 📡 Scheduler Telemetry + +- **Home** and **Scheduler** pages subscribe to `statusStore` and `logStore` to present runtime metrics. +- The log pipeline deduplicates entries and mirrors global logs into `globalLogStore` for the loading screen terminal. +- All outgoing commands (start/stop triggers, patches) are timestamped to simplify reconciliation. + +--- + +## ⚙️ Cross-Cutting Concerns + +### 🌐 Internationalisation + +Translations are stored in `assets/locales/*.json` and loaded via `react-i18next`. +The default language is **Chinese (`zh`)**, with **English fallback**. +UI copy is organised by domain (scheduler, artifact, etc.) to simplify localisation updates. + +--- + +### ⚡ Performance & UX + +- **Mount preservation** (see `App.tsx`) prevents expensive components from reinitialising on tab changes. +- Feature forms apply `useMemo` and `useCallback` to prevent unnecessary re-renders. +- Scrolling areas use `scroll-embedded` utility classes for consistent styling. +- Real-time updates rely on **batched Zustand setters**; heavy updates (e.g., logs) append immutably to reduce reference churn. + +--- + +### 🧰 Tooling + +- **Build:** Vite + React 19 + TypeScript 5 +- **Styling:** Tailwind CSS with custom tokens and reusable UI components +- **Animations:** `framer-motion` for transitions and `ogl` for particle effects + +--- + +## 🚀 Extensibility Checklist + +1. Create or update a feature component under `features/` and wire it into `featureMap` (Configuration page). +2. Expand translation dictionaries with new labels in both `en.json` and `zh.json`. +3. Persist server communication through `modify`, `patch`, or `trigger` to maintain consistent acknowledgement handling. +4. Expose UI settings via `AppContext` if they should be user-configurable. + +--- + +Following this contract ensures that: + +- The application remains **consistent and extensible**. +- **Keyboard navigation** and **telemetry synchronisation** function correctly. +- **WebSocket state** stays coherent across all pages. + +--- diff --git a/service/dist/docs/en_US/Guide for activity sweep fill in.md b/service/dist/docs/en_US/Guide for activity sweep fill in.md new file mode 100644 index 000000000..86ca94f3d --- /dev/null +++ b/service/dist/docs/en_US/Guide for activity sweep fill in.md @@ -0,0 +1,53 @@ +# ⚔️ Activity Sweep Fill-In Guide + +This guide explains how to correctly configure **activity sweep parameters** for BAAS automation. + +--- + +## 🧾 Sweep One Quest + +**Parameter:** +`Sweep Quest Number` + +- Type: **Integer** +- Range: `1` – *maximum difficulty* in the current activity. + +**Parameter:** +`Number of Sweeps` + +1. **Integer** → Represents *exact sweep times*. + e.g. `3` means perform the quest 3 times. +2. **Decimal** → Represents a *percentage of current AP* (Action Points) used. + e.g. `0.5` means use **AP × 0.5** for sweeping. +3. **Fraction** → Represents a *fractional AP usage*. + e.g. `1/3` means use **AP × (1/3)** for sweeping. + +--- + +## 🔁 Sweep Multiple Quests + +To sweep multiple quests sequentially, +use commas (`,`) to separate quest numbers. + +**Example:** +``` + +Sweep Quest: 9, 10, 11 +Number of Sweeps: 0.5, 3, 1/3 +AP: 999 + +``` + +**Interpretation:** + +| Quest | Calculation | Result | +|:-------|:-----------------|:---------| +| **9** | (999 × 0.5) / 20 | 25 times | +| **10** | Fixed 3 times | 3 times | +| **11** | (999 × 1/3) / 20 | 16 times | + +➡️ BAAS will sweep these quests **in order**: Quest 9 → Quest 10 → Quest 11. + +--- + +✅ *Tip:* Always verify that your **AP value** corresponds to the in-game available stamina before executing multiple sweeps. diff --git a/service/dist/docs/en_US/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/en_US/Internal settings in BlueArchive game (first-use must read).md new file mode 100644 index 000000000..0f9c1c729 --- /dev/null +++ b/service/dist/docs/en_US/Internal settings in BlueArchive game (first-use must read).md @@ -0,0 +1,29 @@ +# ⚙️ Blanche Files — Game Internal Settings + +This guide outlines the **mandatory** and **recommended** in-game settings required for proper operation of **Blanche Files** with the BAAS automation system. + +--- + +## 🧩 **Required Settings** + +| Category | Setting | Value / Instruction | +|:-----------------------------|:--------------------------------|:--------------------------------------| +| **Graphics** | Vertical Battle Screen Text Box | **Off** | +| **Recollection Lobby** | Character Selection | **Do not choose** Ako, Aru, or Wakamo | +| **Language (Global Server)** | — | **English** | + +--- + +## 💡 Recommended Selections *(Optional, does not affect script execution)* + +| Setting | Recommended Value | +|:------------------------------|:------------------| +| **Resolution** | Highest | +| **FPS** | 60 | +| **Accelerate Rendering Mode** | Compatibility | +| **Post-Processing** | ON | +| **Anti-Aliasing** | ON | + +--- + +✅ *Tip:* Keeping graphics settings at high quality ensures more consistent visual recognition for automated tasks, though it is **not required** for stable execution. diff --git a/service/dist/docs/en_US/Normal Sweeping Scanning Description.md b/service/dist/docs/en_US/Normal Sweeping Scanning Description.md new file mode 100644 index 000000000..5fc99f553 --- /dev/null +++ b/service/dist/docs/en_US/Normal Sweeping Scanning Description.md @@ -0,0 +1,61 @@ +# 🧹 Sweep Configuration Guide + +Each **sweep configuration** follows the general format: + +``` +region - task-number - sweep-times +``` + +--- + +## 🧩 Structure + +| Component | Description | +|:----------------|:------------------------------------------| +| **Region** | The map or area identifier. | +| **Task Number** | The level or stage within that region. | +| **Sweep Times** | The number of times to perform the sweep. | + +Each configuration should be **separated by commas (`,`)**. + +--- + +## 🗺️ 1. Available Sweep Levels + +All maps **after Academy 1 and Academy 5** are supported for automated sweeping. + +> 🟡 **Example of valid sweep strings:** +> ``` +> 12-1-3, 13-2-2, 14-4-1 +> ``` + +--- + +## ⚙️ 2. Special Description + +On the **International Server**, +the field for `sweep times` can take the keyword **`max`**. + +- BAAS automatically determines whether the level can be cleared, + depending on: + - current **stamina (AP)** + - level difficulty and completion status + +--- + +### 🧮 Example + +When stamina is sufficient: + +``` +15-3, 20-3-max +``` + +**Meaning:** + +- Sweep **15-3** three times. +- Then sweep **20-3** using **all remaining AP (max)**. + +--- + +✅ *Tip:* Use `max` only when you want BAAS to automatically exhaust available stamina on that level, otherwise specify explicit sweep counts for controlled execution. diff --git a/service/dist/docs/en_US/Scheduling Configuration Filling Guide.md b/service/dist/docs/en_US/Scheduling Configuration Filling Guide.md new file mode 100644 index 000000000..d24789f2f --- /dev/null +++ b/service/dist/docs/en_US/Scheduling Configuration Filling Guide.md @@ -0,0 +1,83 @@ +# 🕒 Scheduling Configuration Filling Guide + +This guide explains how to correctly fill in and interpret scheduling configuration fields for automated task execution. + +--- + +## ⚙️ 1. Priority + +When multiple tasks exist in the queue: + +- Tasks with **lower priority values** are executed **first**. + +> Example: +> Task A (priority 1) runs before Task B (priority 2). + +--- + +## ⏳ 2. Execution Interval + +- **Integer `0`** means the task repeats **every day** (one-day interval). +- Larger integers represent longer gaps between executions (in days). + +--- + +## 🕐 3. Daily Reset + +Tasks execute automatically at fixed times each day. This can be easily set on **New UI**. + +- **Format:** + +``` +[ [ h, m, s ] ] +``` + +*(UTC time)* + +- **Multiple timestamps** can be specified, separated by commas. + +**Example:** + +``` +[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] +``` + +**Meaning:** +Runs at **8 AM** and **4 PM Beijing time (UTC + 8)**. + +--- + +## 🚫 4. Disabled Time Periods + +Tasks **will not run** during specified disabled time windows. This can also be easily set on **New UI**. + +- **Format:** +``` + +[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] + +``` +*(UTC time)* + +- **Multiple periods** may be provided, separated by commas. + +**Example:** +``` + +[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] + +``` + +**Meaning:** +Tasks are disabled for the **entire day**. + +--- + +## 🔁 5. Pre-tasks & Post-tasks + +You can chain related operations: + +- **Pre-tasks:** executed **before** the current task. +- **Post-tasks:** executed **after** the current task. + +> Ensures dependent actions run in correct order within the scheduling system. diff --git a/service/dist/docs/en_US/Task force attributes required by region.md b/service/dist/docs/en_US/Task force attributes required by region.md new file mode 100644 index 000000000..552000234 --- /dev/null +++ b/service/dist/docs/en_US/Task force attributes required by region.md @@ -0,0 +1,37 @@ +# 🎯 Stage Attribute Reference Table + +This table lists each stage and its corresponding **two main attributes**, divided into separate columns for clarity. + +| Stage | Attribute ① | Attribute ② | +|:------:|:------------|:------------| +| **25** | Sonic | Piercing | +| **24** | Sonic | Explosive | +| **23** | Explosive | Piercing | +| **22** | Piercing | Mystic | +| **21** | Mystic | Explosive | +| **20** | Explosive | Piercing | +| **19** | Piercing | Mystic | +| **18** | Mystic | Explosive | +| **17** | Explosive | Piercing | +| **16** | Piercing | Mystic | +| **15** | Mystic | Mystic | +| **14** | Explosive | Mystic | +| **13** | Piercing | Piercing | +| **12** | Mystic | Explosive | +| **11** | Piercing | Mystic | +| **10** | Explosive | Mystic | +| **9** | Explosive | Piercing | +| **8** | Piercing | Piercing | +| **7** | Explosive | Explosive | +| **6** | Piercing | Piercing | +| **5** | Explosive | — | +| **4** | Piercing | — | +| **3** | Piercing | — | +| **2** | Explosive | — | +| **1** | Explosive | — | + +--- + +✅ *Tip:* +When planning battles, consider pairing your team’s **attack type** with the **enemy’s weakness** attribute. +Stages featuring two attributes generally require **balanced team compositions** to maintain stability across sub-stages. diff --git a/service/dist/docs/en_US/reporting guidelines on issues (important).md b/service/dist/docs/en_US/reporting guidelines on issues (important).md new file mode 100644 index 000000000..f5fff6121 --- /dev/null +++ b/service/dist/docs/en_US/reporting guidelines on issues (important).md @@ -0,0 +1,57 @@ +# 🧭 Problem Reporting and Self-Diagnosis Guide + +Before submitting a report, please **pause and think** through the following checklist. +Doing so helps ensure that your issue is reproducible, clear, and easy for others to assist with. + +--- + +## 💡 Before You Report + +1. **Has this issue occurred before?** + Try solving it yourself first — search on **Baidu** or refer to the **curriculum / documentation**. + + > If it still cannot be solved, proceed to report. + +2. **Does the problem occur every time you run the program?** + Consistency helps identify whether it’s an environment issue or a random glitch. + +3. **Can you provide enough information for others to reproduce the issue?** + Include logs, screenshots, and any relevant settings. + +4. **Make your report readable and attractive.** + Well-formatted colour-coded logs or screenshots (for example, posted in the QQ group) encourage others to help. + +--- + +## 🎨 Problem Type vs. Reporting Requirements +*(🟡 Yellow items are **required**)* + +--- + +### 🧱 “I’m stuck on page XXX!” + +🟡 **(1)** 1280×720 game resolution when stuck (e.g., *MuMu on F9*). +(2) Provide a **BAAS log screenshot**. +(3) Try switching between pages to confirm if the freeze happens only on one page. + +--- + +### 🧍 “I can’t move!” + +(1) Try repeating the operation one or two times to see if the freeze occurs at the same position. +🟡 **(2)** Record a **complete video** from *startup slide → freeze point*, +ensuring both the **emulator** and the **BAAS log interface** are visible on the same screen. + +--- + +### ⚙️ “I set up the XXX configuration but it didn’t execute!” +or +“I didn’t set up XXX but it executed anyway!” + +(1) Carefully re-read the **configuration instructions** to confirm that the parameters were filled correctly. +🟡 **(2)** Attach **configuration screenshots** and **program logs**. + +--- + +✅ *Tip:* A complete report should allow another person to reproduce your issue **without guessing**. +Providing logs, screenshots, and clear context saves everyone time and ensures faster fixes. diff --git a/service/dist/docs/entry.json b/service/dist/docs/entry.json new file mode 100644 index 000000000..aefb74edc --- /dev/null +++ b/service/dist/docs/entry.json @@ -0,0 +1,304 @@ +[ + { + "id": "frontend-development", + "category": "architecture", + "title": { + "en": "Frontend Development Guide", + "zh": "前端开发指南", + "ja": "フロントエンド開発ガイド", + "ko": "프론트엔드 개발 가이드", + "fr": "Guide de développement Frontend", + "ru": "Руководство по фронтенд-разработке", + "de": "Leitfaden für die Frontend-Entwicklung" + }, + "summary": { + "en": "System-level overview covering application shell, module responsibilities, state management, and extensibility checklist.", + "zh": "从系统层面梳理应用外壳、模块职责、状态管理与扩展检查要点。", + "ja": "アプリケーションシェル、モジュールの責務、状態管理、拡張性チェックリストを網羅したシステムレベルの概要。", + "ko": "애플리케이션 셸, 모듈 책임, 상태 관리 및 확장성 체크리스트를 다루는 시스템 수준 개요.", + "fr": "Vue d'ensemble au niveau du système couvrant le shell de l'application, les responsabilités des modules, la gestion de l'état et la liste de contrôle d'extensibilité.", + "ru": "Обзор на системном уровне, охватывающий оболочку приложения, обязанности модулей, управление состоянием и контрольный список расширяемости.", + "de": "Systemübergreifende Übersicht über die Anwendungs-Shell, Modulverantwortlichkeiten, Zustandsverwaltung und eine Checkliste für die Erweiterbarkeit." + }, + "tags": [ + "architecture", + "state-management", + "websocket" + ], + "basename": "Frontend Development Guide" + }, + { + "id": "internal-settings", + "category": "getting-started", + "title": { + "en": "Internal Settings (First Use)", + "zh": "首次使用必看:游戏内设置说明", + "ja": "ゲーム内設定(初回必須)", + "ko": "게임 내 설정 (최초 사용 필독)", + "fr": "Paramètres internes (Première utilisation)", + "ru": "Внутренние настройки (обязательно при первом использовании)", + "de": "Interne Einstellungen (Erste Verwendung)" + }, + "summary": { + "en": "Mandatory in-game configuration checklist that must be completed before running automation.", + "zh": "首次运行自动化脚本前必须完成的游戏内设置清单。", + "ja": "自動化を実行する前に完了する必要がある、必須のゲーム内設定チェックリスト。", + "ko": "자동화를 실행하기 전에 완료해야 하는 필수 게임 내 설정 체크리스트.", + "fr": "Liste de contrôle de configuration obligatoire en jeu à compléter avant d'exécuter l'automatisation.", + "ru": "Обязательный список настроек в игре, который необходимо выполнить перед запуском автоматизации.", + "de": "Obligatorische Checkliste für die Konfiguration im Spiel, die vor dem Ausführen der Automatisierung abgeschlossen werden muss." + }, + "tags": [ + "setup", + "prerequisite" + ], + "basename": "Internal settings in BlueArchive game (first-use must read)" + }, + { + "id": "emulator-adb", + "category": "environment", + "title": { + "en": "Common Emulator ADB Addresses", + "zh": "常用模拟器 ADB 地址", + "ja": "一般的なエミュレータのADBアドレス", + "ko": "일반적인 에뮬레이터 ADB 주소", + "fr": "Adresses ADB courantes des émulateurs", + "ru": "Распространенные ADB-адреса эмуляторов", + "de": "Gängige Emulator-ADB-Adressen" + }, + "summary": { + "en": "Reference table for ADB host/port values across popular Android emulators.", + "zh": "各类常见安卓模拟器的 ADB 主机与端口速查表。", + "ja": "一般的なAndroidエミュレータにおけるADBホスト/ポート値の参照表。", + "ko": "널리 사용되는 안드로이드 에뮬레이터의 ADB 호스트/포트 값 참조 테이블.", + "fr": "Tableau de référence pour les valeurs d'hôte/port ADB des émulateurs Android populaires.", + "ru": "Справочная таблица значений хоста/порта ADB для популярных эмуляторов Android.", + "de": "Referenztabelle für ADB-Host-/Port-Werte für gängige Android-Emulatoren." + }, + "tags": [ + "environment", + "adb", + "emulator" + ], + "basename": "Commonly used emulator adb address" + }, + { + "id": "auto-clear-mainline", + "category": "configuration", + "title": { + "en": "Auto Clear Mainline Plot", + "zh": "主线剧情自动清理设置", + "ja": "メインストーリーの自動クリア設定", + "ko": "메인 스토리 자동 클리어 설정", + "fr": "Configuration de la suppression automatique de la trame principale", + "ru": "Настройки автоматической зачистки основной сюжетной линии", + "de": "Einstellungen für das automatische Abschließen der Hauptstory" + }, + "summary": { + "en": "Detailed walkthrough for configuring automated main story clearing.", + "zh": "主线剧情自动清理的完整配置步骤与注意事项。", + "ja": "メインストーリーの自動クリアを設定するための詳細な手順。", + "ko": "자동화된 메인 스토리 클리어를 구성하기 위한 상세한 안내.", + "fr": "Guide détaillé pour configurer le nettoyage automatique de l'histoire principale.", + "ru": "Подробное руководство по настройке автоматической зачистки основной сюжетной линии.", + "de": "Detaillierte Anleitung zur Konfiguration des automatischen Abschließens der Hauptstory." + }, + "tags": [ + "configuration", + "story", + "automation" + ], + "basename": "Auto clear mainline plot settings" + }, + { + "id": "normal-graphs", + "category": "configuration", + "title": { + "en": "Normal Stage Strategy", + "zh": "普通图说明", + "ja": "ノーマルステージ攻略", + "ko": "일반 스테이지 공략", + "fr": "Stratégie pour les niveaux normaux", + "ru": "Стратегия для обычных этапов", + "de": "Strategie für normale Stufen" + }, + "summary": { + "en": "Stage-specific notes, rewards, and recommended tactics for normal campaigns.", + "zh": "普通关卡的掉落、策略与推荐配置说明。", + "ja": "ノーマルキャンペーンのステージごとの注記、報酬、推奨戦術。", + "ko": "일반 캠페인에 대한 스테이지별 참고 사항, 보상 및 권장 전술.", + "fr": "Notes spécifiques aux niveaux, récompenses et tactiques recommandées pour les campagnes normales.", + "ru": "Примечания к этапам, награды и рекомендуемые тактики для обычных кампаний.", + "de": "Stufenspezifische Hinweise, Belohnungen und empfohlene Taktiken für normale Kampagnen." + }, + "tags": [ + "stages", + "normal", + "strategy" + ], + "basename": "Description of normal graphs" + }, + { + "id": "difficult-chart", + "category": "configuration", + "title": { + "en": "Hard Stage Configuration", + "zh": "困难图配置说明", + "ja": "ハードステージの設定", + "ko": "하드 스테이지 설정", + "fr": "Configuration des niveaux difficiles", + "ru": "Настройка сложных этапов", + "de": "Konfiguration für schwere Stufen" + }, + "summary": { + "en": "How to prepare auto-farming for hard stages, including team composition and retry rules.", + "zh": "困难图自动扫荡的准备流程、编队搭配与重试策略。", + "ja": "チーム編成やリトライのルールなど、ハードステージの自動周回の準備方法。", + "ko": "팀 구성 및 재시도 규칙을 포함하여 하드 스테이지 자동 파밍을 준비하는 방법.", + "fr": "Comment préparer le farm automatique pour les niveaux difficiles, y compris la composition de l'équipe et les règles de nouvelle tentative.", + "ru": "Как подготовиться к авто-фарму на сложных этапах, включая состав команды и правила повторных попыток.", + "de": "Wie man das Auto-Farming für schwere Stufen vorbereitet, einschließlich Teamzusammenstellung und Wiederholungsregeln." + }, + "tags": [ + "stages", + "hard", + "strategy" + ], + "basename": "Difficult Chart Configuration Description" + }, + { + "id": "activity-sweep", + "category": "operations", + "title": { + "en": "Activity Sweep Guide", + "zh": "活动扫荡填写指南", + "ja": "イベント掃討ガイド", + "ko": "이벤트 소탕 가이드", + "fr": "Guide de balayage d'activité", + "ru": "Руководство по зачистке событий", + "de": "Leitfaden zur Aktivitäts-Säuberung" + }, + "summary": { + "en": "Templates for configuring event sweep parameters and monitoring resource usage.", + "zh": "活动扫荡参数填写示例与资源消耗监控建议。", + "ja": "イベント掃討パラメータの設定テンプレートとリソース使用状況の監視。", + "ko": "이벤트 소탕 매개변수 구성 및 자원 사용량 모니터링을 위한 템플릿.", + "fr": "Modèles pour configurer les paramètres de balayage d'événements et surveiller l'utilisation des ressources.", + "ru": "Шаблоны для настройки параметров зачистки событий и мониторинга использования ресурсов.", + "de": "Vorlagen zur Konfiguration von Event-Sweep-Parametern und zur Überwachung des Ressourcenverbrauchs." + }, + "tags": [ + "events", + "operations" + ], + "basename": "Guide for activity sweep fill in" + }, + { + "id": "normal-sweep", + "category": "operations", + "title": { + "en": "Normal Sweep Scanning", + "zh": "普通扫荡扫描说明", + "ja": "通常掃討スキャン", + "ko": "일반 소탕 스캔", + "fr": "Balayage normal", + "ru": "Сканирование при обычной зачистке", + "de": "Normales Scannen beim Sweepen" + }, + "summary": { + "en": "Explains the scanning workflow and optimisation points for daily sweeps.", + "zh": "日常扫荡的扫描流程及优化要点。", + "ja": "日常掃討のスキャンワークフローと最適化ポイントについて説明します。", + "ko": "일일 소탕을 위한 스캔 워크플로우 및 최적화 지점을 설명합니다.", + "fr": "Explique le flux de travail de numérisation et les points d'optimisation pour les balayages quotidiens.", + "ru": "Объясняет рабочий процесс сканирования и точки оптимизации для ежедневных зачисток.", + "de": "Erklärt den Scan-Workflow und die Optimierungspunkte für tägliche Sweeps." + }, + "tags": [ + "daily", + "operations" + ], + "basename": "Normal Sweeping Scanning Description" + }, + { + "id": "reporting-guidelines", + "category": "support", + "title": { + "en": "Issue Reporting Guidelines", + "zh": "问题反馈指南", + "ja": "問題報告ガイドライン", + "ko": "문제 보고 가이드라인", + "fr": "Directives pour le signalement de problèmes", + "ru": "Руководство по сообщению о проблемах", + "de": "Richtlinien für die Meldung von Problemen" + }, + "summary": { + "en": "Defines the canonical process for logging defects, required evidence, and escalation path.", + "zh": "规范问题反馈流程、所需证据及升级路径。", + "ja": "不具合の記録、必要な証拠、エスカレーションパスに関する正式なプロセスを定義します。", + "ko": "결함 기록, 필요한 증거 및 에스컬레이션 경로에 대한 표준 프로세스를 정의합니다.", + "fr": "Définit le processus canonique pour consigner les défauts, les preuves requises et le chemin d'escalade.", + "ru": "Определяет канонический процесс регистрации дефектов, необходимые доказательства и путь эскалации.", + "de": "Definiert den kanonischen Prozess zur Protokollierung von Fehlern, die erforderlichen Nachweise und den Eskalationspfad." + }, + "tags": [ + "support", + "qa" + ], + "basename": "reporting guidelines on issues (important)" + }, + { + "id": "scheduling-guide", + "category": "configuration", + "title": { + "en": "Scheduling Configuration Guide", + "zh": "调度配置填写指南", + "ja": "スケジュール設定ガイド", + "ko": "스케줄링 설정 가이드", + "fr": "Guide de configuration de la planification", + "ru": "Руководство по настройке планировщика", + "de": "Anleitung zur Planungskonfiguration" + }, + "summary": { + "en": "Explains every scheduling field and how they map to automation behaviour.", + "zh": "逐项说明调度配置字段及其在自动化中的行为。", + "ja": "すべてのスケジュールフィールドと、それらが自動化の動作にどのようにマッピングされるかを説明します。", + "ko": "모든 스케줄링 필드와 그것들이 자동화 동작에 어떻게 매핑되는지 설명합니다。", + "fr": "Explique chaque champ de planification et comment ils correspondent au comportement de l'automatisation.", + "ru": "Объясняет каждое поле планирования и как они соотносятся с поведением автоматизации.", + "de": "Erklärt jedes Planungsfeld und wie es sich auf das Automatisierungsverhalten auswirkt." + }, + "tags": [ + "scheduler", + "configuration" + ], + "basename": "Scheduling Configuration Filling Guide" + }, + { + "id": "task-force-attributes", + "category": "formation", + "title": { + "en": "Task Force Attributes by Region", + "zh": "各区域所需编队属性", + "ja": "地域別の部隊属性", + "ko": "지역별 부대 속성", + "fr": "Attributs des équipes par région", + "ru": "Атрибуты отрядов по регионам", + "de": "Team-Attribute nach Region" + }, + "summary": { + "en": "Attribute requirements and recommended squads per combat region.", + "zh": "各作战区域的编队属性需求与推荐队伍。", + "ja": "各戦闘地域ごとの属性要件と推奨部隊。", + "ko": "각 전투 지역별 속성 요구 사항 및 추천 분대.", + "fr": "Exigences d'attributs et escouades recommandées par région de combat.", + "ru": "Требования к атрибутам и рекомендуемые отряды для каждого боевого региона.", + "de": "Attributanforderungen und empfohlene Trupps pro Kampfregion." + }, + "tags": [ + "formation", + "strategy" + ], + "basename": "Task force attributes required by region" + } +] \ No newline at end of file diff --git a/service/dist/docs/entry.json.br b/service/dist/docs/entry.json.br new file mode 100644 index 0000000000000000000000000000000000000000..ac8ae36e62f1e0535d79b740875f9bdced62474c GIT binary patch literal 5361 zcmV3 z_p|8>tZ&65N7& z(D#kN;*V3!6|#}c)HO}u(!Jm%Ui)N!pR&knqZIkvacs#cf9)b=1Lyoq{a><=f|r*8kUp5)I#u0ASg_*OXCfnad1KmeNZKnd3G}6`5A% zNR)FMW5ZSBD+7zjGFD=lU)7z4dpo$@)NA8a7W{jFBvDp-!? zbY0G0fKlIK)o78--=VY^($w+23hoT3)pVf8k3bQQJs?&MC|y(%=x`Qop>8N>iur__ zvNnq61!N^pf*T)V{G{y~hm2SyQiL~G>RNcmHnH~#6uee8YvT;^GM&}kquaKifZB{0 zGOq{TZsjjvHW?~VU_~DpWE;8rp{Kw6LK74Fl&)?S<-=473v+Kb6@0b~zybqAJ|6E3cGdFD9E!;eHpOw)*!ox8hl} zUKFSH)h7T1bX`h+a`ix8STEZ_s^i&Vt?V&4iPmw@4xuBD($A(hor)(SkHm`{XC{~J zfrV`)j7f?lhL$L@N#(=|b7@~r^A9;;@0VT1qe-nW>O*H8q0STCC+Q7|+b+dk~{c0^-1VwAO0|FU)3E&}z{-)I5I&SlL2aj%2 ziQlLN`UNXAD~Pv}P)-$jP(pdKDi{9a@u+9?#po zLI0gPAuZYSuv->*Y0nnETf7s`DukAcCN!D3Sk0u-AMg4~=F8?|gyy_A1&iZ_dA9SQ z^{KG?>HEu8cN!i9MQVP?hkz3y2o_#X5v2zIF{ceV@76NmR3R2P1(n&ZNUzwP_50$$ zNJ;1$6>c~}yw+=3L;qF9V2gIgqG#3TB7-g?Wb5JmY*~67lr68fW~8Z6al35g8Wcu# zCu+GT36y`71(bi^xhu6vqGySsvtvudC1@APM*tdh9yC%KaP4%(N5X8H*NgGDq8G9q zm_f5*QsG}ETPS1YpiDuL$4A55P&O2m6W_5;i*!pD6Sx96A2=tTY9Nu#uD+^og^KKr zK}Tp2c8pPMQ7&?ZA|s~FAoJFND7I}|=$ds`)X5O@rTb`ql;5`5z*1i0faU2?@+KiP zBFng(xRNjom_KGn+WhIM(Pkj!SkQvAB3l4%^J}Ypn^U=Us$aBsm7I>0zIIZ*H#*iT zr>i}1PYWG8QMM5K!j-S)z$*jQoA28MYz-5J7TIHY?-nFG*R{lGsNDIZxp-)osZmPW zU+Q&e$Ss=mFnm&h!5wG8d+E8tlPZf}I~6M|@7~I7!k>mMe<7(UX2A7MRrAKC&JlU=u{QeGGq4Ihbai1nR0`Rf$#7hwXEPnX~CX7;fB<=}l|h zA(>GM*+B@V^R=$L**9H7R2c>@2#P0P*)>SMpV~EX*7NB>Y$cD;dvsui)A+iW2bOzD zaff-2K=8y;16^pH)!`Yz!Pkpt*tzI82T&{w##z5wogwc=TqeR|n2R?G#<-GRbgWOHuKVnM$kH4Y2y!rg87VH*A#(EDwQZybUiCZ zQl_a>?T=DOw`Vp6eL7R1XCM1FDCtDE}+#B1Gr>aYDE00LN-BbMJqJbJ#pu zKzGGK9yM5+vG{yy0r^+F!%QlH7xv$AiOjlr@EdrMb*D4F;rK|X6PbPfQx2gg8`+e+ zE=-E9SkPI;A;mZnkF9~!*)6wI0(c$!1&g!VhC3}*E{V5TT)E;Lf@os2o9T#7XQb30 zM~~ZS{eE88^7j}WF2kJJDhy+@k*!YP-&YcRv1}PQ>t8_Kk3j}pyUA9r)AkqlID|2j zLXi5;*kdEwu5+4w9)}2sDrpK{5)YS=mU}Gps)dAay{JLCf8U@Gy|K8SHf{y&?Tv6`>h<(g|6fNr_W(NOuW5?eTM!!5Ec0P)1&x(DNBkH4d09S} zLU%7@@*qXH2dDE|^gu{G*SH{9i#7Q!2=R1v)OjG+$2!5Csgn|*sguL=_jKsKthQh6 zFP9R>9Bja}3WGfDjq3h;1ZTnweIbMSJ?nz7`;muH4P>@nKkE0&U1+Vf|I_lQ#6CJA zGRjV->CKoSrKqn1EH{40gpicgUp}lBNTS?;3m?nrS*w)}%hGMIS5(%RX;b*ZlpEG{ zaI1~!rfU^DwW`)0kyE&m}lcf8o zN2Xp!0{j4B>A$uYQ^co3%iE78^%Z8s%P@L;7Zh8N$&+qY;9R zGwa0AEuA<<@c>f^oqi#lOj8oC*Hd9fS)-~e?k*?3D$P!3^Z*26Fknf z?FI*J;lMDQO)ad%#9zyOHprGN=iWWi{$I>4GnvLKlxIXuE%ui zXX%L@fcn4??_-?a4_jTmdc^F!m2|xrF4G|x8ribmblkGeDBN;DYE5DfoKCwz1_t1@ zUloYx7rQpu*=%oj{Kwp(e4QvT0j>v9qrEneh=VnjGsOvO%Z4_0#B45C%xK=+Ye0f@ z>Y>`v@2pOL;oijUZ>zpxr1o^TQ5u15d&Pp-+mYYk8Q5TG4^5rw zhlXt#gdqpZ+?Jpi@aw>!U32yX&L<~ksN7zs8JTs7MPhjvCrA9)qgLFSo<#JZH(E>X z_pm!;3MY^U_PqUFX7JhL<%qIm$U#mdXi~ zs?9h_HquraD@;5q1DqDERz)MM1YmN`kSUi43- zTZL%S9OA6WmHh09E(*`Uit1*RT3*pgH=hJRJ>_6XrOI-Vc&0PQBb-QsTpP9ylxK%s(&u%RIBAm3piBq`UX?iIP>-t_9ZQ}8bx?&@Tvy8m+h%KuCo|zg1Fw+ zHB?uPZb4T)$0^Z?4l1HNN;TCUDG(mOWlCALYPE%;(@pe$yO?-Fw;#>jq;Y+L^Yv^i z<$oDtOM5lXV5$9hSzYuR_;j)YfvqHq>!jISbv@}>UZkeb=9>ht5Yys6W|~de~L(ErK(eqyB#P&m#U>T z8RhAlwR6ykZguRbd?Pz{Gt#;!Yc0+hb zT*|Q~?les=-=E36+o;(foB<~_JM^TQ?U~7f`&n$|;b|v=_+d7wv)Q9eEN+Mdq=J!d zdi<3T_-Ac+Zmf&Vxi4ao7<)<5=IX2Xy(sEJn-apuf_90@iIk0DNqK?$@}`MZMwA8e z#^4K+;|n$d<(!=T*|;;6;I) zR&B>K9Iouo7u-BV-YTYkO}0vh_ozR{ROI^`7je&HsqQ1C>8)PW2LK;~DWEb>&4Xxf z;?v(fGeEQe*FqN9s;oIHDtbRWk~BY@ddGE%T_ZrJ#BW$7E%1ZBF9U)i0%llnMM-)t z$v;8vikZaSAKh^!XkGhKyCWw{WdlMkB7|)nwrv4IEC%6wca~kGQ^7X2j$V>1VdwPy z2S9fszuLzsta`7>x>^&`n>dyT4=VbB;6O1Yn^bNzm7 zI21=>90hFK*70wZEoE+Iqr=W=*^p;HXFus;L8?%Hg)Q%E72K{cFQ-_mkvcD+87VYt z`=2PBu=1&KWXI^7)<*2}V6+gf7e~-kQ#++ZJ`A#MV@^Vy<0M-@u!l*j)!2rn~9a1}P?V+QKx+Apt*zwqmv+-Ze(n>dH&eu8gX!k{T_P>Ar zBU%X3ZP9kG=aS*bbi~jK2rv5T_Xr+)2%RcxiG*d4NhEKHWS`rGEJj54#icD02M0xi zm(h?ynfK>u!L(CECOJ4i-oj+b ⚠️ **Si vous utilisez BlueStacks**, assurez-vous que la +> **fonction de débogage ADB** est activée dans les paramètres. + +--- + +💡 *Astuce :* Ces ports servent à la connexion ADB entre votre PC et l’émulateur. +Si vous rencontrez des problèmes de connexion, vérifiez que l’option **débogage ADB** de l’émulateur est activée et qu’aucune autre instance n’utilise le même port. diff --git a/service/dist/docs/fr_FR/Description of normal graphs.md b/service/dist/docs/fr_FR/Description of normal graphs.md new file mode 100644 index 000000000..f4c435cd6 --- /dev/null +++ b/service/dist/docs/fr_FR/Description of normal graphs.md @@ -0,0 +1,111 @@ + +# 📊 Description des cartes normales + +--- + +## 🧩 1. Description d’utilisation + +### (1) Déblocage et combat automatique requis + +Vous **devez activer** : + +* 🟡 **Débloquer automatiquement les manches terminées** +* 🟡 **Combat automatique** + +> Le système détectera et activera automatiquement ces fonctions si possible. + +--- + +### (2) Niveaux pris en charge + +Niveaux principaux normaux pris en charge : +🟡 **4 – 25** + +--- + +### (3) Logique de mouvement + +Lorsque les diapositives BAAS sont fixées, tous les mouvements d’équipe sont exécutés en **un seul clic**. +Comme le nombre d’équipes dans *Blue Archive* varie, +les **coordonnées numérotées** et **l’ordre des mouvements** diffèrent selon la composition. + +--- + +### (4) Notes sur l’extrapolation automatique + +Lors de l’**extrapolation automatique**, +🟡 **assurez-vous que les équipes à petits numéros et à grands numéros sont correctement assignées.** +(En cas de doute, revérifiez la numérotation avant de continuer.) + +--- + +### (5) Paramètres des miniatures normales + +BAAS détermine les configurations en se basant sur : + +* 🟢 **< Paramètres des miniatures normales >** +* 🟢 **Propriétés du groupe sélectionné** +* 🟢 **♪ Logique d’équipe ♪** + +Ces éléments définissent la configuration correcte pour chaque diapositive. + +> La première propriété correspondante dans les diagrammes est **[1]**, la seconde **[2]**. + +--- + +## 🤖 2. Logique d’équipe + +1. Prioriser la sélection d’équipe selon les **relations de contre-attaque**. +2. Lors de la sélection : `4 - (numéro d’équipe) >= nombre d’équipes restantes requises`. +3. Si les conditions (1) et (2) échouent, réduire progressivement les contraintes entre homologues [1]. +4. Si certaines équipes sont déjà choisies et `4 - max(sélectionnées) >= restantes`, + compléter avec des **numéros optionnels**. +5. Sinon, par défaut : **équipes 1, 2, 3**. + +--- + +### 🧠 Exemple + +Ordre de sélection pour **23 [Explosion, Croisement] Task Force** : + +* Une équipe, une opération. +* Si *Équipe Explosion 3* n’est pas choisie, sélectionner **4** en second. +* Sinon, **12** en dernier. + +--- + +## 🚀 3. Description du niveau de progression des cartes normales + +### (1) Comportement de progression + +Si vous rencontrez +🟡 **« Impossible de fermer le dossier temporaire : %s »**, +chaque nombre représente une **zone à parcourir**. +Le programme vérifie si chaque niveau doit être rejoué selon le score `SSS`. + +**Exemple :** + +```text +15, 16, 14 +``` + +Signifie : **15 → 16 → 14** séquentiellement. + +--- + +### (2) Configuration des coups obligatoires + +Si 🟡 **Activer les coups obligatoires** est activé : + +* Un seul nombre → parcourir toute la zone. +* `nombre-nombre` → sous-niveau exact. + +**Exemple :** + +```text +15, 16-3 +``` + +--- + +✅ *Astuce :* Vérifiez toujours la numérotation et les équipes avant d’exécuter les scripts automatiques BAAS. diff --git a/service/dist/docs/fr_FR/Difficult Chart Configuration Description.md b/service/dist/docs/fr_FR/Difficult Chart Configuration Description.md new file mode 100644 index 000000000..fcde343b7 --- /dev/null +++ b/service/dist/docs/fr_FR/Difficult Chart Configuration Description.md @@ -0,0 +1,103 @@ + +# 💀 Guide d’utilisation des cartes de difficulté + +La **carte de difficulté** fonctionne de manière similaire aux modes **Logique d’équipe** et **Carte normale**. +Certaines cartes difficiles nécessitent **trois équipes**, partageant toutes **le même attribut** que la première équipe assignée à cette région. + +--- + +## 🧾 Instructions de remplissage + +### ⚠️ Caractères autorisés + +La **chaîne** que vous saisissez pour le niveau de la diapositive **ne doit contenir aucun caractère ou mot autre que** : + +``` +"-", "sss", "present", "task", ",", [nombres] +``` + +Chaque segment doit être **séparé par des virgules (`,`)**. + +> ❌ N’incluez **aucun mot-clé** comme `"sss"`, `"present"` ou `"task"` en dehors d’une syntaxe valide. + +--- + +### 🧩 Exemple 1 : Utilisation de base + +**Entrée :** + +``` +15,12-2 +``` + +**Interprétation :** + +BAAS exécutera les appels suivants : + +``` +15-1, 15-2, 15-3, 12-2 +``` + +et appliquera les paramètres de la **carte difficile** : + +* `sss` → évaluation du score maximal +* `present` → collecte des récompenses +* `task` → exécution des missions spéciales + +--- + +### 🧩 Exemple 2 : Nombre + chaîne + +**Entrée :** + +``` +15-sss-present +``` + +**Signification :** +BAAS exécutera le groupe de niveaux **15-1, 15-2, 15-3** +et réalisera à la fois l’évaluation `sss` (score maximal) et la collecte `present` (cadeaux). + +--- + +### 🧩 Exemple 3 : Deux nombres + mots-clés + +**Entrée :** + +``` +15-3-sss-task +``` + +**Signification :** +BAAS appellera **le niveau 15-3** pour : + +* obtenir la note `sss`, +* accomplir la mission `task`. + +--- + +### 🧩 Exemple 4 : Cas complexe + +**Entrée :** + +``` +7,8-sss,9-3-task +``` + +**Signification :** + +* Appelle `(7-1, 7-2, 7-3)` → réalise `sss`, collecte les cadeaux et accomplit les missions. +* Appelle `(8-1, 8-2, 8-3)` → réalise uniquement `sss`. +* Appelle `9-3` → accomplit la mission `task`. + +--- + +## 🧠 Comportement du système + +> 🟡 **Remarque :** +> BAAS détermine automatiquement si : +> +> * un niveau a déjà atteint **`sss`**, ou +> * un **cadeau (present)** a déjà été collecté. + +Si l’une de ces conditions est remplie, **le niveau sera ignoré automatiquement** afin d’optimiser le temps d’exécution. diff --git a/service/dist/docs/fr_FR/Frontend Development Guide.md b/service/dist/docs/fr_FR/Frontend Development Guide.md new file mode 100644 index 000000000..f0bc94148 --- /dev/null +++ b/service/dist/docs/fr_FR/Frontend Development Guide.md @@ -0,0 +1,101 @@ + +# 🏗️ Guide de développement frontal + +Ce document décrit la structure de l’application de bureau **BAAS**, le flux de données entre les modules clients et le serveur, ainsi que les exigences opérationnelles lors de l’extension de la plateforme. +Il s’adresse aux **équipes d’ingénierie et de déploiement** nécessitant une référence standard lors de l’intégration ou du développement de nouvelles fonctionnalités. + +--- + +## 🧩 Structure de l’application + +L’application React est rendue via `App.tsx`. Elle relie le **ThemeProvider**, **AppProvider** et la structure persistante (`MainLayout`). +Les pages sont commutées à l’aide d’un **routeur framer-motion** léger qui garde les pages inactives montées pour préserver leur état lors du changement d’onglet. + +* **Point d’entrée :** `main.tsx` initialise i18n, le thème et rend ``. +* **Providers :** `AppProvider` charge les préférences UI, établit la connexion WebSocket, injecte le catalogue de profils et expose les fonctions via le contexte. +* **Mise en page :** `MainLayout` contient la barre latérale persistante (`Sidebar.tsx`) et l’en-tête (`Header.tsx`). + +--- + +## 🧱 Modules clés + +| Module | Responsabilité | Fichiers principaux | +| :------------------ | :-------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| **Context** | Partage les paramètres UI, le profil actif et le catalogue de profils. | `contexts/AppContext.tsx` | +| **State Stores** | Les magasins Zustand normalisent l’état distant (config, événements, statut, journaux). | `store/websocketStore.ts`, `store/globalLogStore.ts` | +| **Remote Services** | Encapsulent les interactions serveur (raccourcis, WebSocket chiffré). | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | +| **Pages** | Conteneurs de niveau route : `Home`, `Scheduler`, `Configuration`, `Settings`, `Wiki`. | `pages/*.tsx` | +| **Feature Forms** | Panneaux modulaires opérant sur un fragment de `DynamicConfig`. | `features/*Config.tsx`, `features/DailySweep.tsx` | +| **Shared UI** | Composants visuels réutilisables (entrées, sélecteurs, modales, journaux). | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | +| **Hooks** | Logique métier, incluant la gestion des raccourcis et du thème. | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | + +--- + +## 🔄 Vue d’ensemble du flux de données + +### 🔌 Initialisation du WebSocket + +1. `AppProvider` appelle `useWebSocketStore.getState().init()` au démarrage. +2. `init()` se connecte successivement aux canaux **heartbeat**, **provider** et **sync** via `SecureWebSocket`. +3. Une fois connecté, le store récupère les données statiques, les manifestes de configuration et les files d’événements. +4. Les setters diffusent les mises à jour aux composants abonnés via des sélecteurs Zustand. + +--- + +### ⚙️ Cycle de mise à jour de configuration + +1. Les formulaires fonctionnent sur une copie locale de `DynamicConfig`. +2. Lors de l’enregistrement, ils génèrent un objet `patch` minimal et appellent `modify(path, patch, showToast)`. +3. Le store envoie une commande `sync` avec sémantique JSON Patch et enregistre un callback. +4. Quand le backend confirme, le callback supprime l’état en attente et affiche une notification (`sonner`). +5. Les messages `config` entrants synchronisent le store local pour rafraîchir tous les abonnés. + +--- + +### 📡 Télémétrie du planificateur + +* Les pages **Home** et **Scheduler** s’abonnent à `statusStore` et `logStore` pour afficher les métriques d’exécution. +* Le pipeline de logs déduplique et copie les journaux dans `globalLogStore`. +* Toutes les commandes sortantes (démarrage, arrêt, patchs) sont horodatées pour faciliter la corrélation. + +--- + +### 🌐 Internationalisation + +Les traductions sont stockées dans `assets/locales/*.json` et chargées via `react-i18next`. +Langue par défaut : **chinois (`zh`)**, avec **anglais en secours**. +Le contenu est organisé par domaine (scheduler, artifact, etc.) pour simplifier la localisation. + +--- + +### ⚡ Performance et UX + +* **Préservation du montage** empêche la réinitialisation des composants lors du changement d’onglet. +* `useMemo` et `useCallback` limitent les re-rendus inutiles. +* Les zones de défilement utilisent des classes `scroll-embedded` pour un style uniforme. +* Les mises à jour en temps réel utilisent des setters Zustand groupés. + +--- + +### 🧰 Outils + +* **Build :** Vite + React 19 + TypeScript 5 +* **Style :** Tailwind CSS + composants réutilisables +* **Animations :** `framer-motion` (transitions), `ogl` (effets de particules) + +--- + +### 🚀 Extensibilité + +1. Créez ou mettez à jour un composant dans `features/` et reliez-le à `featureMap`. +2. Ajoutez les nouvelles étiquettes dans `en.json` et `zh.json`. +3. Persistez les communications serveur via `modify`, `patch`, ou `trigger`. +4. Exposez les réglages UI via `AppContext` si nécessaires. + +--- + +✅ *En suivant ce contrat, vous garantissez que :* + +* L’application reste **cohérente et extensible**. +* La **navigation au clavier** et la **synchronisation télémétrique** fonctionnent correctement. +* L’état **WebSocket** reste cohérent sur toutes les pages. diff --git a/service/dist/docs/fr_FR/Guide for activity sweep fill in.md b/service/dist/docs/fr_FR/Guide for activity sweep fill in.md new file mode 100644 index 000000000..daabe77d0 --- /dev/null +++ b/service/dist/docs/fr_FR/Guide for activity sweep fill in.md @@ -0,0 +1,53 @@ + +# ⚔️ Guide de remplissage des paramètres de balayage d’activité + +Ce guide explique comment configurer correctement les **paramètres de balayage d’activité** pour l’automatisation BAAS. + +--- + +## 🧾 Balayer une seule mission + +**Paramètre :** +`Numéro de mission à balayer` + +* Type : **Entier** +* Plage : de `1` au *niveau de difficulté maximal* de l’activité actuelle. + +**Paramètre :** +`Nombre de balayages` + +1. **Entier** → indique le *nombre exact de balayages*. + Exemple : `3` signifie effectuer la mission 3 fois. +2. **Décimal** → indique un *pourcentage des points d’action (AP)* utilisés. + Exemple : `0.5` signifie utiliser **AP × 0,5** pour le balayage. +3. **Fraction** → indique une *fraction d’AP* à utiliser. + Exemple : `1/3` signifie utiliser **AP × (1/3)** pour le balayage. + +--- + +## 🔁 Balayer plusieurs missions + +Pour balayer plusieurs missions de suite, +séparez leurs numéros par des virgules (`,`). + +**Exemple :** + +``` +Mission : 9, 10, 11 +Nombre de balayages : 0.5, 3, 1/3 +AP : 999 +``` + +**Interprétation :** + +| Mission | Calcul | Résultat | +| :------ | :--------------- | :------- | +| **9** | (999 × 0.5) / 20 | 25 fois | +| **10** | Fixé à 3 | 3 fois | +| **11** | (999 × 1/3) / 20 | 16 fois | + +➡️ BAAS effectuera les balayages dans l’ordre : **9 → 10 → 11**. + +--- + +✅ *Astuce :* Vérifiez toujours que la valeur de vos **AP** correspond à l’endurance disponible avant d’exécuter plusieurs balayages. diff --git a/service/dist/docs/fr_FR/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/fr_FR/Internal settings in BlueArchive game (first-use must read).md new file mode 100644 index 000000000..930d57636 --- /dev/null +++ b/service/dist/docs/fr_FR/Internal settings in BlueArchive game (first-use must read).md @@ -0,0 +1,30 @@ + +# ⚙️ Fichiers Blanche — Paramètres internes du jeu + +Ce guide répertorie les **paramètres obligatoires** et **recommandés** à activer dans le jeu *Blue Archive* afin d’assurer le bon fonctionnement de **Blanche Files** avec le système d’automatisation BAAS. + +--- + +## 🧩 **Paramètres obligatoires** + +| Catégorie | Réglage | Valeur / Instruction | +| :-------------------------- | :---------------------------------- | :------------------------------------ | +| **Graphismes** | Fenêtre de texte en combat vertical | **Désactivée** | +| **Hall de souvenirs** | Sélection de personnage | **Ne pas choisir** Ako, Aru ou Wakamo | +| **Langue (serveur global)** | — | **Anglais** | + +--- + +## 💡 Sélections recommandées *(facultatives, sans impact sur l’exécution du script)* + +| Réglage | Valeur recommandée | +| :------------------------- | :----------------- | +| **Résolution** | La plus élevée | +| **FPS** | 60 | +| **Mode de rendu accéléré** | Compatibilité | +| **Post-traitement** | Activé | +| **Anticrénelage** | Activé | + +--- + +✅ *Astuce :* Maintenir une qualité graphique élevée permet une reconnaissance visuelle plus stable pour les tâches automatisées, même si ce n’est **pas obligatoire** pour une exécution correcte. diff --git a/service/dist/docs/fr_FR/Normal Sweeping Scanning Description.md b/service/dist/docs/fr_FR/Normal Sweeping Scanning Description.md new file mode 100644 index 000000000..cbc9387d3 --- /dev/null +++ b/service/dist/docs/fr_FR/Normal Sweeping Scanning Description.md @@ -0,0 +1,63 @@ + +# 🧹 Guide de configuration du balayage normal + +Chaque **configuration de balayage** suit le format général suivant : + +``` +région - numéro_mission - nombre_balayages +``` + +--- + +## 🧩 Structure + +| Élément | Description | +| :------------------- | :------------------------------- | +| **Région** | Identifiant de la carte ou zone. | +| **Numéro mission** | Niveau ou étape à balayer. | +| **Nombre balayages** | Nombre d’exécutions du balayage. | + +Chaque configuration doit être **séparée par des virgules (`,`)**. + +--- + +## 🗺️ 1. Niveaux disponibles + +Toutes les cartes **postérieures à Académie 1 et Académie 5** sont prises en charge pour le balayage automatique. + +> 🟡 **Exemple valide :** +> +> ``` +> 12-1-3, 13-2-2, 14-4-1 +> ``` + +--- + +## ⚙️ 2. Description spéciale + +Sur le **serveur international**, +le champ `nombre_balayages` peut prendre le mot-clé **`max`**. + +* BAAS détermine automatiquement si le niveau peut être terminé, selon : + + * les **points d’action (AP)** actuels, + * la difficulté du niveau et son statut de complétion. + +--- + +### 🧮 Exemple + +Quand l’endurance est suffisante : + +``` +15-3, 20-3-max +``` + +**Signification :** + +* Balaye **15-3** trois fois. +* Puis balaye **20-3** jusqu’à épuisement de l’endurance (**max**). + +--- + +✅ *Astuce :* Utilisez `max` uniquement si vous souhaitez que BAAS consomme automatiquement toute l’endurance restante sur un niveau. Sinon, indiquez un nombre fixe pour garder le contrôle. diff --git a/service/dist/docs/fr_FR/Scheduling Configuration Filling Guide.md b/service/dist/docs/fr_FR/Scheduling Configuration Filling Guide.md new file mode 100644 index 000000000..b80212eb8 --- /dev/null +++ b/service/dist/docs/fr_FR/Scheduling Configuration Filling Guide.md @@ -0,0 +1,85 @@ + +# 🕒 Guide de remplissage de la configuration de planification + +Ce guide explique comment remplir et interpréter correctement les champs de configuration de planification pour l’exécution automatique des tâches. + +--- + +## ⚙️ 1. Priorité + +Lorsque plusieurs tâches sont dans la file d’attente : + +* Les tâches avec une **valeur de priorité plus faible** s’exécutent **en premier**. + +> Exemple : +> La tâche A (priorité 1) sera exécutée avant la tâche B (priorité 2). + +--- + +## ⏳ 2. Intervalle d’exécution + +* **Entier `0`** → la tâche se répète **chaque jour** (intervalle d’un jour). +* Des entiers plus grands représentent des intervalles plus longs (en jours). + +--- + +## 🕐 3. Réinitialisation quotidienne + +Les tâches s’exécutent automatiquement à des heures fixes chaque jour. +Ceci peut être facilement défini dans la **nouvelle interface (New UI)**. + +**Format :** + +``` +[ [ h, m, s ] ] +``` + +*(Temps UTC)* + +Vous pouvez spécifier **plusieurs horaires**, séparés par des virgules. + +**Exemple :** + +``` +[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] +``` + +**Signification :** +S’exécute à **8 h et 16 h heure de Pékin (UTC +8)**. + +--- + +## 🚫 4. Périodes désactivées + +Les tâches **ne s’exécuteront pas** pendant les plages horaires spécifiées. +Elles peuvent aussi être définies facilement dans la **nouvelle interface (New UI)**. + +**Format :** + +``` +[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] +``` + +*(Temps UTC)* + +Vous pouvez définir **plusieurs périodes**, séparées par des virgules. + +**Exemple :** + +``` +[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] +``` + +**Signification :** +Les tâches sont désactivées pour **toute la journée**. + +--- + +## 🔁 5. Tâches préalables et ultérieures + +Vous pouvez enchaîner des opérations liées : + +* **Pré-tâches :** exécutées **avant** la tâche actuelle. +* **Post-tâches :** exécutées **après** la tâche actuelle. + +> Cela garantit que les actions dépendantes s’exécutent dans le bon ordre au sein du système de planification. diff --git a/service/dist/docs/fr_FR/Task force attributes required by region.md b/service/dist/docs/fr_FR/Task force attributes required by region.md new file mode 100644 index 000000000..951f66b18 --- /dev/null +++ b/service/dist/docs/fr_FR/Task force attributes required by region.md @@ -0,0 +1,37 @@ +# 🎯 Tableau de référence des attributs par région + +Ce tableau liste chaque zone et ses **deux attributs principaux**, affichés séparément pour plus de clarté. + +| Zone | Attribut ① | Attribut ② | +| :----- | :--------- | :--------- | +| **25** | Sonique | Perforant | +| **24** | Sonique | Explosif | +| **23** | Explosif | Perforant | +| **22** | Perforant | Mystique | +| **21** | Mystique | Explosif | +| **20** | Explosif | Perforant | +| **19** | Perforant | Mystique | +| **18** | Mystique | Explosif | +| **17** | Explosif | Perforant | +| **16** | Perforant | Mystique | +| **15** | Mystique | Mystique | +| **14** | Explosif | Mystique | +| **13** | Perforant | Perforant | +| **12** | Mystique | Explosif | +| **11** | Perforant | Mystique | +| **10** | Explosif | Mystique | +| **9** | Explosif | Perforant | +| **8** | Perforant | Perforant | +| **7** | Explosif | Explosif | +| **6** | Perforant | Perforant | +| **5** | Explosif | — | +| **4** | Perforant | — | +| **3** | Perforant | — | +| **2** | Explosif | — | +| **1** | Explosif | — | + +--- + +✅ *Astuce :* +Lors de la planification des combats, associez le **type d’attaque** de votre équipe à la **faiblesse** de l’ennemi. +Les zones à double attribut nécessitent généralement une **composition équilibrée** pour conserver la stabilité entre les sous-niveaux. diff --git a/service/dist/docs/fr_FR/reporting guidelines on issues (important).md b/service/dist/docs/fr_FR/reporting guidelines on issues (important).md new file mode 100644 index 000000000..0fe30c343 --- /dev/null +++ b/service/dist/docs/fr_FR/reporting guidelines on issues (important).md @@ -0,0 +1,60 @@ + +# 🧭 Guide de signalement et d’auto-diagnostic des problèmes + +Avant de soumettre un rapport, prenez un moment pour **réfléchir et vérifier** la liste suivante. +Cela permet de s’assurer que votre problème est clair, reproductible et facile à diagnostiquer. + +--- + +## 💡 Avant de signaler + +1. **Le problème s’est-il déjà produit auparavant ?** + Essayez d’abord de le résoudre vous-même — recherchez sur **Baidu** ou consultez la **documentation**. + + > Si cela ne fonctionne pas, vous pouvez alors le signaler. + +2. **Le problème survient-il à chaque exécution ?** + Cela aide à déterminer s’il s’agit d’un problème d’environnement ou d’un bug aléatoire. + +3. **Fournissez-vous suffisamment d’informations pour reproduire l’erreur ?** + Incluez les journaux, captures d’écran et paramètres pertinents. + +4. **Rendez votre rapport clair et agréable à lire.** + Un rapport bien mis en forme avec du texte coloré ou des captures (ex. dans le groupe QQ) incite davantage à l’aide. + +--- + +## 🎨 Type de problème et exigences du rapport + +*(🟡 Les éléments jaunes sont **obligatoires**)* + +--- + +### 🧱 « Je suis bloqué sur la page XXX ! » + +🟡 **(1)** Résolution du jeu en 1280×720 (par ex. *MuMu sur F9*). +(2) Fournissez une **capture du journal BAAS**. +(3) Essayez de changer de page pour voir si le blocage est spécifique. + +--- + +### 🧍 « Je ne peux pas bouger ! » + +(1) Répétez l’action une ou deux fois pour vérifier si le blocage se reproduit. +🟡 **(2)** Enregistrez une **vidéo complète** du démarrage jusqu’au blocage, +en montrant à la fois l’**émulateur** et l’**interface de journal BAAS** sur le même écran. + +--- + +### ⚙️ « J’ai configuré XXX mais rien ne s’exécute ! » + +ou +« Je n’ai pas configuré XXX mais ça s’exécute quand même ! » + +(1) Relisez attentivement les **instructions de configuration** pour vérifier que les paramètres sont corrects. +🟡 **(2)** Joignez des **captures d’écran de la configuration** et les **journaux du programme**. + +--- + +✅ *Astuce :* Un bon rapport doit permettre à une autre personne de **reproduire le problème sans deviner**. +Fournir des journaux, des captures et un contexte clair fait gagner du temps à tout le monde et accélère les correctifs. diff --git a/service/dist/docs/ja_JP/Auto clear mainline plot settings.md b/service/dist/docs/ja_JP/Auto clear mainline plot settings.md new file mode 100644 index 000000000..0c211b931 --- /dev/null +++ b/service/dist/docs/ja_JP/Auto clear mainline plot settings.md @@ -0,0 +1,46 @@ + +# 🧩 メインストーリー自動クリア設定 + +### 🎮 オートプレイとバトルに関する注意 + +**オートプレイ**を有効にすると、ストーリーのマスを自動で進行できます。 +ただし、**最終章の一部のバトルは自動戦闘に対応していません。** + +--- + +### 📘 エピソード番号対応表 + +| 番号 | エピソード名 | +| :-: | :------------ | +| 1 | Episode I | +| 2 | Episode II | +| 3 | Episode III | +| 4 | Episode IV | +| 5 | Final Episode | +| 6 | Episode V | + +--- + +### 🔢 入力形式 + +クリアしたいエピソード番号を「,(カンマ)」で区切って入力します。 + +**例:** + +```text +1,2,3 +``` + +これは **Episode I → Episode II → Episode III** の順に自動で進行することを意味します。 + +--- + +### ⚙️ デフォルト設定 + +入力欄を空のまま **「Run」** をクリックすると、以下のデフォルト順が使用されます。 + +| 地域 | デフォルトのエピソード | +| :----- | :-------------- | +| CN | `1,2,3,4` | +| Global | `1,2,3,4,5,4` | +| JP | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/ja_JP/Commonly used emulator adb address.md b/service/dist/docs/ja_JP/Commonly used emulator adb address.md new file mode 100644 index 000000000..65441ed58 --- /dev/null +++ b/service/dist/docs/ja_JP/Commonly used emulator adb address.md @@ -0,0 +1,28 @@ + +# Commonly used emulator adb address.md + +# 🧠 エミュレーターADBポート参照 + +### ⚙️ 一般注意 + +**複数インスタンス(Stimulatorなど)** を使用している場合は、各自で設定を確認してください。 + +--- + +### 🎮 代表的なエミュレーターのポート一覧 + +| エミュレーター | ポート番号 | +| :------------------------ | :--------------- | +| **MuMu** | `7555` | +| **BlueStacks / LDPlayer** | `5555` | +| **NoxPlayer** | `62001`, `59865` | +| **MuMu 12** | `16384` | +| **MEmuPlay** | `21503` | + +> ⚠️ **BlueStacks**を使用する場合は、設定内で**ADBポートデバッグ機能**を有効にしてください。 + +--- + +💡 **ヒント:** + +これらのポートはPCとエミュレーター間のADB接続に使用されます。接続エラーが発生した場合は、**ADBデバッグオプション**がオンになっているか、同一ポートを他のインスタンスが占有していないかを確認してください。 diff --git a/service/dist/docs/ja_JP/Description of normal graphs.md b/service/dist/docs/ja_JP/Description of normal graphs.md new file mode 100644 index 000000000..4d640c87d --- /dev/null +++ b/service/dist/docs/ja_JP/Description of normal graphs.md @@ -0,0 +1,112 @@ + +# 📊 ノーマルマップ設定説明 + +--- + +## 🧩 1. 使用説明 + +### (1) 自動戦闘およびラウンド終了の設定 + +以下の2つを**必ず有効化**してください: + +* 🟡 **ラウンド自動終了を解除** +* 🟡 **自動戦闘** + +> システムは可能な場合、自動的にこれらの設定を有効にします。 + +--- + +### (2) 対応ステージ範囲 + +対応する通常ステージ: +🟡 **4 – 25** + +--- + +### (3) 移動ロジック + +BAASのスライドが固定されると、全チームの移動は**ワンクリック操作**で実行されます。 +『ブルーアーカイブ』ではチーム数が異なるため、 +**番号座標**や**移動順序**はチーム構成によって変化します。 + +--- + +### (4) 自動推定に関する注意 + +**自動推定**を行う際は、 +🟡 **チーム番号の大小が正しく対応していること**を確認してください。 +(不明な場合はチーム番号を再確認してから進めてください。) + +--- + +### (5) ノーマルサムネイル設定 + +BAASは以下に基づいて設定を判断します: + +* 🟢 **<ノーマルサムネイル設定>** +* 🟢 **選択されたグループ属性** +* 🟢 **♪ チームロジック ♪** + +これらにより、各スライドの最適な設定が決定されます。 + +> 図中の最初の対応要素は **[1]**、2番目は **[2]** です。 + +--- + +## 🤖 2. チームロジック + +1. **有利属性**を優先し、残りの敵に対しては徐々に属性依存度を下げる。 +2. チーム選択時: + `4 - (チーム番号) >= 残り必要チーム数` +3. (1)(2)が満たされない場合、対応関係[1]の優先度を下げる。 +4. 一部チームが選択済みで `4 - max(選択チーム) >= 残り数` の場合、残りを任意番号で補完。 +5. すべての条件に該当しない場合、デフォルトで **チーム1, 2, 3** を使用。 + +--- + +### 🧠 例 + +**23【爆発・交差】タスクフォース**の場合: + +* 一回の操作で一チーム。 +* 既定順で「爆発チーム3」が未選択なら、2番目に**4**を選択。 +* それでも無効なら最終的に**12**を使用。 + +--- + +## 🚀 3. ノーマルマップ進行設定 + +### (1) エリア進行動作 + +もし +🟡 **「一時フォルダを閉じられません:%s」** +と表示された場合、入力された番号は**進行するエリア番号**を意味します。 +各エリア内のレベルが`SSS`評価に達しているかどうかで再挑戦を判断します。 + +**例:** + +```text +15,16,14 +``` + +→ **15 → 16 → 14** の順に進行します。 + +--- + +### (2) 強制挑戦設定 + +🟡 **「指定ステージごとに強制挑戦を有効化」** をオンにした場合: + +* 単一番号 → 該当エリアを一度進行 +* `番号-番号` → サブステージを指定 + +**例:** + +```text +15,16-3 +``` + +--- + +✅ **ヒント:** +自動化スクリプトを実行する前に、ステージ番号とチーム設定が**BAAS設定**と一致しているか確認してください。 diff --git a/service/dist/docs/ja_JP/Difficult Chart Configuration Description.md b/service/dist/docs/ja_JP/Difficult Chart Configuration Description.md new file mode 100644 index 000000000..2b6afbad3 --- /dev/null +++ b/service/dist/docs/ja_JP/Difficult Chart Configuration Description.md @@ -0,0 +1,102 @@ + +# 💀 高難度マップ使用ガイド + +**高難度マップ(Hardship Map)**は、**チームロジック**および**ノーマルマップ構成**と類似した動作原理を持ちます。 +一部の高難度マップでは**3チーム**を必要とし、それらのチームはすべて**最初に設定されたチームと同じ属性**で統一される必要があります。 + +--- + +## 🧾 入力要領 + +### ⚠️ 使用可能な文字 + +スライドのステージ指定に使用できる文字列は、以下に限定されます: + +``` +"-", "sss", "present", "task", ",", [数字] +``` + +各セグメントは**カンマ(`,`)で区切る**必要があります。 + +> ❌ `"sss"`, `"present"`, `"task"` などのキーワードを不正な位置に含めないでください。 + +--- + +### 🧩 例1:基本的な使用法 + +**入力:** + +``` +15,12-2 +``` + +**解釈:** +BAASは以下のコールを実行します: + +``` +15-1, 15-2, 15-3, 12-2 +``` + +そして「高難度マップ設定」に従い以下を実施します: + +* `sss` → 星評価の判定 +* `present` → 報酬の受け取り +* `task` → 任務の実行 + +--- + +### 🧩 例2:数字+キーワード + +**入力:** + +``` +15-sss-present +``` + +**意味:** +BAASはレベル **15-1, 15-2, 15-3** を順に実行し、 +`sss`(星評価)および `present`(報酬受取)を同時に行います。 + +--- + +### 🧩 例3:二つの数字+キーワード + +**入力:** + +``` +15-3-sss-task +``` + +**意味:** +BAASは **15-3** ステージを呼び出し、 + +* `sss` 評価を達成し、 +* `task` 任務を実行します。 + +--- + +### 🧩 例4:複合ケース + +**入力:** + +``` +7,8-sss,9-3-task +``` + +**意味:** + +* `(7-1, 7-2, 7-3)` → `sss`評価、報酬受取、任務実行 +* `(8-1, 8-2, 8-3)` → `sss`評価のみ +* `9-3` → 任務実行 + +--- + +## 🧠 システム動作 + +> 🟡 **注意:** +> BAASは自動的に以下を判定します: +> +> * ステージがすでに **`sss`** 評価を達成しているか +> * **報酬** が受け取られているか + +いずれかが既に完了している場合、そのステージは**自動的にスキップ**され、処理効率が最適化されます。 diff --git a/service/dist/docs/ja_JP/Frontend Development Guide.md b/service/dist/docs/ja_JP/Frontend Development Guide.md new file mode 100644 index 000000000..67f70e516 --- /dev/null +++ b/service/dist/docs/ja_JP/Frontend Development Guide.md @@ -0,0 +1,104 @@ + +# 🏗️ フロントエンド開発ガイド + +このドキュメントでは、**BAASデスクトップアプリケーション**の構造、 +クライアントモジュールとバックエンド間のデータフロー、 +および拡張時の運用設計を説明します。 +対象読者は、**新機能の実装やシステム保守を担当するエンジニアチーム**です。 + +--- + +## 🧩 アプリケーション構成 + +Reactアプリは `App.tsx` でレンダリングされ、 +**ThemeProvider**、**AppProvider**、および永続レイアウト枠(`MainLayout`)が統合されています。 +軽量な **framer-motionルーター** によりページ切替時も状態を保持します。 + +* **エントリーポイント:** `main.tsx` — i18nとテーマ初期化後に `` を描画。 +* **プロバイダー:** `AppProvider` — UI設定、WebSocket接続、プロファイル一覧を管理。 +* **レイアウト:** `MainLayout` — サイドバー (`Sidebar.tsx`) とヘッダー (`Header.tsx`) を保持。 + +--- + +## 🧱 主要モジュール + +| モジュール | 役割 | 主なファイル | +| :------------------ | :------------------------------------------------------- | :------------------------------------------ | +| **Context** | UI設定・アクティブプロファイル共有 | `contexts/AppContext.tsx` | +| **State Stores** | Zustandによりリモート状態を正規化 | `store/websocketStore.ts` | +| **Remote Services** | バックエンドとの暗号通信/ホットキー設定保持 | `services/hotkeyService.ts` | +| **Pages** | `Home`・`Scheduler`・`Configuration`・`Settings`・`Wiki` ページ | `pages/*.tsx` | +| **Feature Forms** | 各機能設定パネル(DynamicConfigに基づく) | `features/*Config.tsx` | +| **Shared UI** | 入力、モーダル、ログなど共通コンポーネント群 | `components/ui` | +| **Hooks** | ビジネスロジック用カスタムフック | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | + +--- + +## 🔄 データフロー概要 + +### 🔌 WebSocket 初期化 + +1. `AppProvider` が起動時に `useWebSocketStore.getState().init()` を実行。 +2. `init()` は順に **heartbeat**, **provider**, **sync** チャンネルを接続。 +3. 接続完了後、設定マニフェストとライブイベントキューを取得。 +4. Zustandのサブスクライバーが更新を受信。 + +--- + +### ⚙️ 設定更新サイクル + +1. 設定フォームは `DynamicConfig` のローカルコピーを操作。 +2. 保存時、変更差分をJSONパッチ形式で送信。 +3. バックエンド確認後、`pendingCallbacks` がクリアされUI更新。 +4. 新しい `config` メッセージによりローカル状態を同期。 + +--- + +### 📡 スケジューラーテレメトリ + +* `Home` および `Scheduler` ページは `statusStore` と `logStore` を購読。 +* ログは重複を排除して `globalLogStore` に反映。 +* すべてのコマンドにはタイムスタンプが付与され、同期を容易に。 + +--- + +## ⚙️ 横断的関心事項 + +### 🌐 国際化(i18n) + +翻訳は `assets/locales/*.json` に格納され、`react-i18next` によりロード。 +既定言語は **中国語(zh)**、フォールバックは **英語**。 + +--- + +### ⚡ パフォーマンスとUX + +* ページ保持により再マウントを防止。 +* `useMemo` / `useCallback` により再描画最小化。 +* スクロール領域は統一クラス `scroll-embedded` を使用。 +* Zustandのバッチ更新で高頻度ログを効率的に処理。 + +--- + +### 🧰 使用技術 + +* **ビルド:** Vite + React 19 + TypeScript 5 +* **スタイル:** Tailwind CSS + カスタムトークン +* **アニメーション:** framer-motion, ogl(粒子効果) + +--- + +## 🚀 拡張手順チェックリスト + +1. `features/` 内に新機能コンポーネントを作成し、`featureMap` に登録。 +2. 翻訳辞書(`en.json`, `zh.json`)に新項目を追加。 +3. `modify` / `patch` / `trigger` 経由で一貫した通信処理を実装。 +4. UI設定項目は必要に応じて `AppContext` に公開。 + +--- + +この方針に従うことで: + +* アプリケーションの**一貫性と拡張性**を保持。 +* **キーボード操作**と**テレメトリ同期**が正確に機能。 +* すべてのページ間で**WebSocket状態が整合的**に保たれます。 diff --git a/service/dist/docs/ja_JP/Guide for activity sweep fill in.md b/service/dist/docs/ja_JP/Guide for activity sweep fill in.md new file mode 100644 index 000000000..bebc8fb61 --- /dev/null +++ b/service/dist/docs/ja_JP/Guide for activity sweep fill in.md @@ -0,0 +1,50 @@ + +# ⚔️ アクティビティ掃討設定ガイド + +このガイドでは、BAAS自動化用の**アクティビティ掃討パラメータ**の正しい入力方法を説明します。 + +--- + +## 🧾 単一クエスト掃討 + +**パラメータ:** +`掃討クエスト番号` + +* 型:**整数** +* 範囲:`1` ~ 現在アクティビティの最大難易度まで + +**パラメータ:** +`掃討回数` + +1. **整数値** → 明示的な回数(例:`3` → 3回実行) +2. **小数値** → 現在のAP(スタミナ)に対する割合(例:`0.5` → APの半分を使用) +3. **分数値** → APの分割使用(例:`1/3` → APの1/3を使用) + +--- + +## 🔁 複数クエストの連続掃討 + +複数のクエストを順に掃討する場合、 +クエスト番号をカンマ(`,`)で区切って指定します。 + +**例:** + +``` +掃討クエスト: 9, 10, 11 +掃討回数: 0.5, 3, 1/3 +AP: 999 +``` + +**解釈:** + +| クエスト | 計算式 | 結果 | +| :----- | :--------------- | :-- | +| **9** | (999 × 0.5) / 20 | 25回 | +| **10** | 固定3回 | 3回 | +| **11** | (999 × 1/3) / 20 | 16回 | + +➡️ 実行順序:**9 → 10 → 11** + +--- + +✅ **ヒント:** 実行前に、**ゲーム内のAP値**と設定値が一致していることを確認してください。 diff --git a/service/dist/docs/ja_JP/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/ja_JP/Internal settings in BlueArchive game (first-use must read).md new file mode 100644 index 000000000..7d2aa36bb --- /dev/null +++ b/service/dist/docs/ja_JP/Internal settings in BlueArchive game (first-use must read).md @@ -0,0 +1,31 @@ + +# ⚙️ Blanche Files — ゲーム内設定ガイド(初回必読) + +本ガイドは、**BAAS自動化システム**と連携させるために必要な +**必須設定**および**推奨設定**を示します。 + +--- + +## 🧩 必須設定 + +| カテゴリ | 設定項目 | 値/指示 | +| :------------- | :------------- | :---------------------- | +| **グラフィック** | 縦画面バトルテキストボックス | **オフ** | +| **回想ロビー** | キャラ選択 | **Ako・Aru・Wakamoを選ばない** | +| **言語(グローバル版)** | — | **English** | + +--- + +## 💡 推奨設定(任意) + +| 設定 | 推奨値 | +| :----------- | :----- | +| **解像度** | 最高 | +| **FPS** | 60 | +| **描画モード** | 互換性モード | +| **ポストプロセス** | ON | +| **アンチエイリアス** | ON | + +--- + +✅ **ヒント:** 高画質設定は認識精度を安定させますが、動作安定性には必須ではありません。 diff --git a/service/dist/docs/ja_JP/Normal Sweeping Scanning Description.md b/service/dist/docs/ja_JP/Normal Sweeping Scanning Description.md new file mode 100644 index 000000000..4c75a3f37 --- /dev/null +++ b/service/dist/docs/ja_JP/Normal Sweeping Scanning Description.md @@ -0,0 +1,64 @@ + +# 🧹 掃討設定ガイド + +各**掃討設定**は以下の基本形式に従います: + +``` +地域番号 - ステージ番号 - 掃討回数 +``` + +--- + +## 🧩 構成要素 + +| 項目 | 説明 | +| :--------- | :----------- | +| **地域番号** | マップまたはエリア識別子 | +| **ステージ番号** | エリア内のステージ番号 | +| **掃討回数** | 掃討を実行する回数 | + +複数設定を入力する場合は、**カンマ(`,`)で区切ります**。 + +--- + +## 🗺️ 1. 掃討可能ステージ + +「アカデミー1」「アカデミー5」以降のすべてのマップで自動掃討が可能です。 + +> 🟡 **有効な入力例:** +> +> ``` +> 12-1-3, 13-2-2, 14-4-1 +> ``` + +--- + +## ⚙️ 2. 特殊設定 + +**国際サーバー版(Global)**では、`掃討回数` に特別キーワード **`max`** を使用できます。 + +BAASは以下を自動的に判断します: + +* 現在の**スタミナ(AP)残量** +* ステージの**難易度**および**クリア状況** + +--- + +### 🧮 例 + +スタミナが十分な場合: + +``` +15-3, 20-3-max +``` + +**意味:** + +* ステージ **15-3** を3回掃討 +* その後、**20-3** を残りのAPすべてで掃討(`max`) + +--- + +✅ **ヒント:** +`max` はスタミナをすべて使い切る掃討を行いたいときのみ使用し、 +一定回数で制御したい場合は具体的な数値を指定してください。 diff --git a/service/dist/docs/ja_JP/Scheduling Configuration Filling Guide.md b/service/dist/docs/ja_JP/Scheduling Configuration Filling Guide.md new file mode 100644 index 000000000..a0232fd70 --- /dev/null +++ b/service/dist/docs/ja_JP/Scheduling Configuration Filling Guide.md @@ -0,0 +1,84 @@ + +# 🕒 スケジューリング設定入力ガイド + +このガイドでは、タスク自動実行のためのスケジューリング設定の正しい入力方法を説明します。 + +--- + +## ⚙️ 1. 優先度 (Priority) + +複数タスクがキュー内に存在する場合、 +**数値が小さいタスク**ほど**優先的に実行**されます。 + +> 例: +> タスクA(優先度1)は、タスクB(優先度2)より先に実行。 + +--- + +## ⏳ 2. 実行間隔 (Interval) + +* **整数値 `0`**:毎日(1日間隔)で繰り返し実行 +* **整数値が大きいほど**、実行間隔(日数)が長くなります。 + +--- + +## 🕐 3. 毎日リセット時間 (Daily Reset) + +指定時刻にタスクを自動実行します。 +新UI上で簡単に設定できます。 + +* **フォーマット:** + +``` +[ [ h, m, s ] ] +``` + +*(UTC時刻)* + +複数時刻を設定する場合は、カンマで区切ります。 + +**例:** + +``` +[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] +``` + +**意味:** +北京時間(UTC+8)では **午前8時** と **午後4時** に実行。 + +--- + +## 🚫 4. 実行禁止期間 (Disabled Periods) + +指定された時間帯ではタスクは**実行されません**。 +これも新UI上で設定可能です。 + +* **フォーマット:** + +``` +[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] +``` + +*(UTC時刻)* + +複数期間を設定する場合はカンマで区切ります。 + +**例:** + +``` +[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] +``` + +**意味:** +1日中すべての時間帯で実行を禁止。 + +--- + +## 🔁 5. 事前タスクと事後タスク (Pre / Post Tasks) + +タスク同士を連結できます。 + +* **Pre-tasks(事前タスク)**:現在のタスクの前に実行 +* **Post-tasks(事後タスク)**:現在のタスクの後に実行 + +> これにより、依存関係を保ちながら正しい順序でタスクを処理できます。 diff --git a/service/dist/docs/ja_JP/Task force attributes required by region.md b/service/dist/docs/ja_JP/Task force attributes required by region.md new file mode 100644 index 000000000..0a769a1c9 --- /dev/null +++ b/service/dist/docs/ja_JP/Task force attributes required by region.md @@ -0,0 +1,40 @@ + +# 🎯 ステージ別属性参照表 + +各ステージの主要な**2種類の属性**を一覧で示します。 + +--- + +| ステージ | 属性① | 属性② | +| :----: | :-- | :-- | +| **25** | 振動 | 貫通 | +| **24** | 振動 | 爆発 | +| **23** | 爆発 | 貫通 | +| **22** | 貫通 | 神秘 | +| **21** | 神秘 | 爆発 | +| **20** | 爆発 | 貫通 | +| **19** | 貫通 | 神秘 | +| **18** | 神秘 | 爆発 | +| **17** | 爆発 | 貫通 | +| **16** | 貫通 | 神秘 | +| **15** | 神秘 | 神秘 | +| **14** | 爆発 | 神秘 | +| **13** | 貫通 | 貫通 | +| **12** | 神秘 | 爆発 | +| **11** | 貫通 | 神秘 | +| **10** | 爆発 | 神秘 | +| **9** | 爆発 | 貫通 | +| **8** | 貫通 | 貫通 | +| **7** | 爆発 | 爆発 | +| **6** | 貫通 | 貫通 | +| **5** | 爆発 | — | +| **4** | 貫通 | — | +| **3** | 貫通 | — | +| **2** | 爆発 | — | +| **1** | 爆発 | — | + +--- + +✅ *ヒント:* +戦闘を計画する際は、チームの**攻撃属性**が敵の**弱点属性**と対応するように調整してください。 +属性が2つあるステージでは、**バランスの取れたチーム構成**が安定攻略に有効です。 diff --git a/service/dist/docs/ja_JP/reporting guidelines on issues (important).md b/service/dist/docs/ja_JP/reporting guidelines on issues (important).md new file mode 100644 index 000000000..c05f84d56 --- /dev/null +++ b/service/dist/docs/ja_JP/reporting guidelines on issues (important).md @@ -0,0 +1,65 @@ + +# 🧭 不具合報告と自己診断ガイド + +報告を行う前に、以下のチェックリストを確認してください。 +これにより、問題の再現性が高く、他者が支援しやすくなります。 + +--- + +## 💡 報告前に確認すべきこと + +1. **同様の問題が以前にも発生したか?** + まず自分で確認・検索(Baiduやドキュメント参照)を行ってください。 + + > 解決できない場合のみ報告へ進みます。 + +2. **毎回同じ状況で発生するか?** + 一貫性があれば環境依存か一時的バグかを切り分け可能です。 + +3. **他人が再現できる情報を提供できるか?** + ログ・スクリーンショット・設定内容を必ず添付してください。 + +4. **読みやすく整理されているか?** + 色分けや整形されたログを提示すると、支援が受けやすくなります。 + +--- + +## 🎨 問題タイプ別の報告要件 + +*(🟡の項目は必須)* + +--- + +### 🧱 「ページXXXで固まりました!」 + +🟡 **(1)** 1280×720の解像度で発生時の画面(例:MuMuエミュレータF9キー) + +(2) **BAASログのスクリーンショット** + +(3) ページ切り替えでフリーズが限定的か確認 + +--- + +### 🧍 「キャラが動けません!」 + +(1) 同操作を1〜2回繰り返し、同じ箇所で再現するか確認。 + +🟡 **(2)** *起動~停止までの完全動画* を記録し、 +画面に**エミュレータとBAASログ**の両方が映るようにしてください。 + +--- + +### ⚙️ 「設定したのに実行されない!」 + +または +「設定していないのに勝手に実行された!」 + +(1) 設定説明を再読し、入力が正しいか確認。 + +🟡 **(2)** 設定画面とプログラムログの**スクリーンショット**を添付。 + +--- + +✅ **ヒント:** +他者が**推測なしで再現できる**報告が理想です。 +ログ・画像・背景情報を揃えることで、迅速かつ正確な対応が可能になります。 diff --git a/service/dist/docs/ko_KR/Auto clear mainline plot settings.md b/service/dist/docs/ko_KR/Auto clear mainline plot settings.md new file mode 100644 index 000000000..a2b6b21c1 --- /dev/null +++ b/service/dist/docs/ko_KR/Auto clear mainline plot settings.md @@ -0,0 +1,46 @@ + +# 🧩 자동 클리어 메인 스토리 설정 + +### 🎮 자동 재생 및 전투 주의사항 + +**자동 재생**은 그리드를 **자동으로 이동**할 수 있게 도와줍니다. +하지만, **최종화 에피소드의 일부 전투는 자동으로 수행할 수 없습니다.** + +--- + +### 📘 에피소드 번호 체계 + +| 번호 | 에피소드 명 | +| :-: | :------------ | +| 1 | Episode I | +| 2 | Episode II | +| 3 | Episode III | +| 4 | Episode IV | +| 5 | Final Episode | +| 6 | Episode V | + +--- + +### 🔢 입력 형식 + +콤마(`,`)를 사용하여 클리어할 에피소드 번호들을 구분합니다. + +**예시:** + +```text +1,2,3 +``` + +이 입력은 스크립트가 순차적으로 **Episode I → Episode II → Episode III**를 클리어함을 의미합니다. + +--- + +### ⚙️ 기본 설정 + +입력란이 비어 있는 상태에서 **“실행(Run)”** 버튼을 누르면 기본 순서가 사용됩니다: + +| 지역 | 기본 에피소드 순서 | +| :----- | :-------------- | +| CN | `1,2,3,4` | +| Global | `1,2,3,4,5,4` | +| JP | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/ko_KR/Commonly used emulator adb address.md b/service/dist/docs/ko_KR/Commonly used emulator adb address.md new file mode 100644 index 000000000..55729a3fb --- /dev/null +++ b/service/dist/docs/ko_KR/Commonly used emulator adb address.md @@ -0,0 +1,26 @@ + +# 🧠 에뮬레이터 포트 참조 + +### ⚙️ 일반 주의 + +**Stimulator 다중 인스턴스**를 사용하는 경우, 설정은 직접 확인해 주세요. + +--- + +### 🎮 단일 에뮬레이터 포트 목록 + +| 에뮬레이터 | 포트 번호 | +| :------------------------ | :--------------- | +| **MuMu** | `7555` | +| **BlueStacks / LDPlayer** | `5555` | +| **NoxPlayer** | `62001`, `59865` | +| **MuMu 12** | `16384` | +| **MEmuPlay** | `21503` | + +> ⚠️ **BlueStacks를 사용할 경우**, +> 설정에서 **ADB 포트 디버그 기능**이 활성화되어 있는지 반드시 확인하세요. + +--- + +💡 *팁:* 이 포트들은 PC와 에뮬레이터 간의 ADB 연결에 사용됩니다. +연결 문제가 발생하면, 에뮬레이터의 **ADB 디버깅 옵션**이 켜져 있는지, 그리고 동일 포트를 사용하는 다른 에뮬레이터 인스턴스가 없는지 확인하세요. diff --git a/service/dist/docs/ko_KR/Description of normal graphs.md b/service/dist/docs/ko_KR/Description of normal graphs.md new file mode 100644 index 000000000..ffc1cf11b --- /dev/null +++ b/service/dist/docs/ko_KR/Description of normal graphs.md @@ -0,0 +1,117 @@ + +# 📊 일반 그래프 설명 + +--- + +## 🧩 1. 사용 설명 + +### (1) 잠금 해제 및 자동 전투 요구사항 + +다음 두 가지를 **반드시 활성화**해야 합니다: + +* 🟡 **자동으로 라운드 종료 잠금 해제** +* 🟡 **자동 전투 (Autofight)** + +> 시스템이 가능하다면 이 기능들을 자동으로 감지해 활성화합니다. + +--- + +### (2) 지원 레벨 + +지원하는 메인 스토리 일반 레벨 범위: +🟡 **4 ~ 25** + +--- + +### (3) 이동 로직 + +BAAS 슬라이드가 고정되면, 모든 팀 이동은 **한 번의 클릭**으로 실행됩니다. +*Blue Archive*의 슬라이드 내 팀 수가 다양하므로, +**번호 좌표**와 **이동 순서**는 팀 구성에 따라 달라질 수 있습니다. + +--- + +### (4) 자동 외삽(Extrapolation) 주의사항 + +**자동 외삽**을 수행할 때는 +🟡 **작은 번호 팀과 큰 번호 팀이 정확히 배치되어야 합니다.** +(확실치 않다면, 진행하기 전에 팀 번호를 다시 확인하세요.) + +--- + +### (5) 일반 썸네일 설정 + +BAAS는 다음 요소를 기준으로 구성값을 결정합니다: + +* 🟢 **< 일반 썸네일 설정 >** +* 🟢 **선택된 그룹 속성** +* 🟢 **♪ 팀 논리 ♪** + +이 요소들이 슬라이드마다 올바른 구성을 결정합니다. + +> 도식에서 첫 번째 대응 속성은 **[1]**, 두 번째는 **[2]**입니다. + +--- + +## 🤖 2. 팀 논리 + +1. **제약 관계(카운터 관계)**를 우선적으로 기준으로 팀을 선택하고, + 남은 상대에 대해서는 속성 일치 여부를 점진적으로 고려합니다. +2. 팀을 선택할 때: + `4 - (팀 번호) ≥ 필요한 나머지 팀 수` 이어야 합니다. +3. (1) 또는 (2) 조건이 만족되지 않을 경우, + [1] 대응군 간의 제약 관계를 점차 완화합니다. +4. 일부 팀이 이미 선택되었고 `4 - max(선택된 팀들) ≥ 남은 필요 팀 수`라면, + 나머지는 **선택 가능한 번호들**로 채웁니다. +5. 위 조건들 중 해당되는 것이 없으면, 기본 팀은 **팀 1, 2, 3**이 됩니다. + +--- + +### 🧠 예시 + +“23 [폭발, 교차] 특공대” 선택 순서: + +* 한 팀, 한 작전. +* 만약 *폭발팀 3*이 위 순서에서 선택되지 않았다면, 두 번째로 **4**를 선택합니다. +* 여전히 선택할 수 없다면, 최종적으로 **12**를 선택합니다. + +--- + +## 🚀 3. 일반 그래프 푸시 차트 레벨 설명 + +### (1) 구역 푸시 동작 + +다음 메시지가 나타날 경우: +🟡 **“임시 폴더를 닫을 수 없음: %s”**, +입력한 각 번호는 **푸시할 구역**을 의미합니다. +프로그램은 각 구역 내 레벨들이 `SSS` 등급에 도달했는지에 따라 +재플레이 여부를 검사합니다. + +**예시:** + +```text +15, 16, 14 +``` + +이는 프로그램이 순차적으로 구역 **15 → 16 → 14**를 푸시함을 의미합니다. + +--- + +### (2) 필수 타격 구성 + +🟡 **각 지정 레벨에서 필수 타격 활성화** 옵션이 켜져 있으면: + +* 단일 번호 입력 → 해당 구역 전체를 한 번 푸시 +* `번호-서브번호` 입력 → 특정 하위 레벨 지정 + +**예시:** + +```text +15, 16-3 +``` + +--- + +✅ *팁:* 자동 스크립트를 실행하기 전에, +레벨 번호와 팀 배치가 당신의 **BAAS 구성**과 일치하는지 항상 확인하세요. +불일치하면 의도치 않은 동작이 발생할 수 있습니다. diff --git a/service/dist/docs/ko_KR/Difficult Chart Configuration Description.md b/service/dist/docs/ko_KR/Difficult Chart Configuration Description.md new file mode 100644 index 000000000..6bc505ad4 --- /dev/null +++ b/service/dist/docs/ko_KR/Difficult Chart Configuration Description.md @@ -0,0 +1,105 @@ + +# 💀 난도 지도 사용 안내 + +**난도 지도(Hardship Map)**는 **팀 논리** 및 **일반 모드**와 유사하게 작동합니다. +어떤 난도 지도는 **세 개의 팀**이 필요하며, +이들 모두는 해당 구역에 처음 할당된 팀과 동일한 **속성**을 공유해야 합니다. + +--- + +## 🧾 입력 방식 안내 + +### ⚠️ 허용 문자 + +슬라이드 레벨을 기입할 문자열에는 다음 문자 및 단어만 허용됩니다: + +``` +"-", "sss", "present", "task", ",", [숫자들] +``` + +각 구역은 **콤마(`,`)로 구분**되어야 합니다. + +> ❌ 올바른 구문 외에 `"sss"`, `"present"`, `"task"` 같은 키워드를 포함하지 마세요. + +--- + +### 🧩 예시 1: 기본 사용법 + +**입력:** + +```text +15,12-2 +``` + +**해석:** + +BAAS는 다음 호출을 수행합니다: + +```text +15-1, 15-2, 15-3, 12-2 +``` + +그리고 **난이도 지도 설정**에 따라 실행: + +* `sss` → 별 평가 +* `present` → 보상 수령 +* `task` → 도전 과제 수행 + +--- + +### 🧩 예시 2: 숫자 + 키워드 + +**입력:** + +```text +15-sss-present +``` + +**의미:** +레벨 그룹 **15-1, 15-2, 15-3**을 실행하며, +`sss` (별 평가) 및 `present` (보상 수령)를 수행합니다. + +--- + +### 🧩 예시 3: 두 숫자 + 키워드 + +**입력:** + +```text +15-3-sss-task +``` + +**의미:** +15-3 레벨을 호출해: + +* `sss` 등급 획득 +* `task` 도전 과제 완료 + +--- + +### 🧩 예시 4: 복합 입력 + +**입력:** + +``` +7,8-sss,9-3-task +``` + +**의미:** + +* `(7-1, 7-2, 7-3)` 실행 → `sss`, 보상 수령, 도전 과제 수행 +* `(8-1, 8-2, 8-3)` 실행 → `sss` +* `9-3` 실행 → 도전 과제 수행 + +--- + +## 🧠 시스템 동작 방식 + +> 🟡 **주의:** +> BAAS는 자동으로 다음을 판단합니다: +> +> * 레벨이 이미 **`sss` 등급**에 도달했는가 +> * **보상(present)**을 이미 수령했는가 + +이 조건 중 하나라도 충족되면, **해당 레벨은 자동으로 건너뜁니다**. +이로써 실행 시간을 최적화합니다. diff --git a/service/dist/docs/ko_KR/Frontend Development Guide.md b/service/dist/docs/ko_KR/Frontend Development Guide.md new file mode 100644 index 000000000..8de12e642 --- /dev/null +++ b/service/dist/docs/ko_KR/Frontend Development Guide.md @@ -0,0 +1,111 @@ + +# 🏗️ 프런트엔드 개발 가이드 + +이 문서는 **BAAS 데스크탑 애플리케이션**의 구조, 클라이언트 모듈과 백엔드 간 데이터 흐름, +그리고 플랫폼 기능 확장 시 기대 동작을 설명합니다. +엔지니어링 및 배포 팀이 온보딩하거나 기능을 구현할 때 참조할 수 있는 기준 문서입니다. + +--- + +## 🧩 애플리케이션 셸 구조 + +React 앱은 `App.tsx`를 통해 렌더링됩니다. +이곳에서 **ThemeProvider**, **AppProvider**, 지속 레이아웃 프레임(`MainLayout`)이 연결됩니다. +사용자는 가벼운 **framer-motion 라우터**를 통해 페이지를 전환하며, +비활성 페이지도 상태를 유지하면서 탭을 전환할 수 있습니다. + +* **진입점:** `main.tsx` — i18n, 테마를 초기화하고 ``을 렌더링 +* **Providers:** `AppProvider`는 UI 설정 로드, WebSocket 연결 설정, 프로필 카탈로그 주입, + 그리고 context를 통한 설정자(setter)를 노출 +* **레이아웃:** `MainLayout`은 지속되는 사이드바(`Sidebar.tsx`)와 헤더(`Header.tsx`)를 포함 + +--- + +## 🧱 주요 모듈 + +| 모듈명 | 책임 범위 | 주요 파일 경로 | +| :------------------ | :---------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| **Context** | UI 설정, 활성 프로필, 프로필 카탈로그를 앱 전반에 공유 | `contexts/AppContext.tsx` | +| **State Stores** | Zustand 상태 저장소가 원격 상태(config, 이벤트, 상태, 로그)을 정규화 | `store/websocketStore.ts`, `store/globalLogStore.ts` | +| **Remote Services** | 핫키 지속성, 암호화된 WebSocket 세션 등 백엔드 계약을 캡슐화 | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | +| **Pages** | `Home`, `Scheduler`, `Configuration`, `Settings`, `Wiki` 등의 페이지 레벨 컨테이너 | `pages/*.tsx` | +| **Feature Forms** | `DynamicConfig`의 일부를 다루는 구성 패널 모듈 | `features/*Config.tsx`, `features/DailySweep.tsx` | +| **Shared UI** | 재사용 가능한 시각 요소 및 구성 요소 (입력, 선택기, 모달, 로거 등) | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | +| **Hooks** | 비즈니스 로직 훅, 핫키 조율, 테마 처리 포함 | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | + +--- + +## 🔄 데이터 흐름 개요 + +### 🔌 WebSocket 초기화 + +1. `AppProvider`는 부팅 시 `useWebSocketStore.getState().init()`을 호출 +2. `init()`는 순차적으로 **heartbeat**, **provider**, **sync** 채널에 `SecureWebSocket`으로 연결 +3. 연결되면, 스토어는 정적 데이터, 구성 매니페스트, 실시간 이벤트 큐를 가져옴 +4. 스토어의 설정자(setter)는 Zustand 선택자를 통해 구독 컴포넌트에 업데이트를 방송 + +--- + +### ⚙️ 구성 업데이트 사이클 + +1. 기능 폼(form)은 `DynamicConfig`의 로컬 드래프트 복사본 위에서 작동 +2. 저장 시, 폼은 최소 `patch` 객체를 생성하고 `modify(path, patch, showToast)`를 호출 +3. 스토어는 JSON patch 방식의 `sync` 명령을 발행하고, + `pendingCallbacks`에 콜백을 등록 +4. 백엔드가 명령을 확인하면 콜백은 대기 상태를 해제하고, + 선택적으로 `sonner`로 토스트 알림을 표시 +5. 수신된 `config` 메시지는 로컬 스토어를 조정해 모든 구독자가 자동으로 새로 고침됨 + +--- + +### 📡 스케줄러 텔레메트리 + +* **Home** 및 **Scheduler** 페이지는 `statusStore` 및 `logStore`를 구독해 런타임 지표를 제공합니다 +* 로그 파이프라인은 중복 항목을 제거하고, 전역 로그를 `globalLogStore`에 미러링해 로딩 화면 터미널에 반영 +* 모든 발신 명령(start/stop triggers, patches 등)은 타임스탬프가 붙어 조정 및 동기화가 쉬워집니다 + +--- + +## ⚙️ 범용 고려사항 + +### 🌐 국제화(i18n) + +번역은 `assets/locales/*.json`에 저장되며 `react-i18next`를 통해 로드됩니다. +기본 언어는 **중국어 (`zh`)**, 보조 언어는 **영어**입니다. +UI 문구는 도메인별로 정리되어 있어 로컬라이제이션 업데이트가 간편합니다. + +--- + +### ⚡ 성능 및 사용자 경험 (UX) + +* **마운트 보존** 기능(예: `App.tsx`)은 탭 변경 시 비싼 컴포넌트 재초기화를 방지 +* 기능 폼은 `useMemo`, `useCallback`을 적용해 불필요한 리렌더링 최소화 +* 스크롤 구역은 `scroll-embedded` 유틸리티 클래스를 사용해 일관된 스타일 유지 +* 실시간 업데이트는 **배치된 Zustand 설정자**를 사용하며, + 로그 같은 대량 업데이트는 참조 변경을 줄이기 위해 비가변 방식으로 추가 + +--- + +### 🧰 도구 구성 + +* **빌드:** Vite + React 19 + TypeScript 5 +* **스타일링:** Tailwind CSS + 커스텀 토큰 + 재사용 UI 컴포넌트 +* **애니메이션:** `framer-motion` for 전환, `ogl` for 파티클 효과 + +--- + +## 🚀 확장성 체크리스트 + +1. `features/` 아래에 기능 컴포넌트를 새로 만들거나 업데이트하고, + `featureMap`에 연결 +2. `en.json` 및 `zh.json` 양쪽에 새로운 레이블에 대한 번역 사전에 항목 추가 +3. `modify`, `patch`, `trigger`를 통해 서버 통신을 유지해 일관된 확인 처리 +4. 사용자 설정 가능해야 할 UI 설정은 `AppContext`를 통해 노출 + +--- + +이를 따르면: + +* 애플리케이션은 **일관성과 확장성**을 유지 +* **키보드 네비게이션** 및 **텔레메트리 동기화**가 정상 작동 +* **WebSocket 상태**가 모든 페이지에 걸쳐 일관되게 유지됨 diff --git a/service/dist/docs/ko_KR/Guide for activity sweep fill in.md b/service/dist/docs/ko_KR/Guide for activity sweep fill in.md new file mode 100644 index 000000000..eafa74706 --- /dev/null +++ b/service/dist/docs/ko_KR/Guide for activity sweep fill in.md @@ -0,0 +1,53 @@ + +# ⚔️ 활동(퀘스트) 스윕 입력 가이드 + +이 가이드는 BAAS 자동화에서 **활동 스윕 파라미터**를 올바르게 구성하는 방법을 설명합니다. + +--- + +## 🧾 단일 퀘스트 스윕 + +**파라미터:** +`Sweep Quest Number` + +* 타입: **정수 (Integer)** +* 범위: 현재 활동의 최대 난이도까지 (`1` ~ 최대 난이도) + +**파라미터:** +`Number of Sweeps` + +1. **정수** → 고정 스윕 횟수 + 예: `3`은 퀘스트를 3회 수행 +2. **소수** → 현재 AP의 비율 사용 + 예: `0.5`는 **AP × 0.5**만큼 사용 +3. **분수** → 분수 비율 사용 + 예: `1/3`은 **AP × (1/3)** 사용 + +--- + +## 🔁 복수 퀘스트 스윕 + +여러 퀘스트를 순차적으로 스윕하려면, +퀘스트 번호를 콤마(`,`)로 구분하여 입력하세요. + +**예시:** + +```text +Sweep Quest: 9, 10, 11 +Number of Sweeps: 0.5, 3, 1/3 +AP: 999 +``` + +**해석:** + +| 퀘스트 | 연산식 | 실행 횟수 | +| :----: | :--------------- | :---- | +| **9** | (999 × 0.5) / 20 | 25회 | +| **10** | 고정 3회 | 3회 | +| **11** | (999 × 1/3) / 20 | 16회 | + +➡️ BAAS는 이 퀘스트들을 순서대로 스윕합니다: 퀘스트 9 → 10 → 11 + +--- + +✅ *팁:* 멀티 스윕 실행 전에, **AP 값**이 실제 게임 내 스태미너와 일치하는지 반드시 확인하세요. diff --git a/service/dist/docs/ko_KR/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/ko_KR/Internal settings in BlueArchive game (first-use must read).md new file mode 100644 index 000000000..a9634311e --- /dev/null +++ b/service/dist/docs/ko_KR/Internal settings in BlueArchive game (first-use must read).md @@ -0,0 +1,32 @@ + +# ⚙️ Blanche 파일 — 게임 내부 설정 + +이 가이드는 **Blanche Files**와 BAAS 자동화 시스템이 정상적으로 작동하기 위해 +필수 및 권장 게임 내 설정을 정리합니다. + +--- + +## 🧩 **필수 설정** + +| 카테고리 | 설정 항목 | 값 / 지침 | +| :-------------------- | :-------------- | :------------------------- | +| **그래픽** | 세로 전투 화면 텍스트 상자 | **Off (끔)** | +| **회상 로비** | 캐릭터 선택 | **Ako, Aru, Wakamo** 선택 금지 | +| **언어 (Global 서버 기준)** | — | **English (영어)** | + +--- + +## 💡 권장 설정 (선택 사항, 스크립트 실행에는 필수 아님) + +| 설정 항목 | 권장 값 | +| :------------------------------------ | :------------------ | +| 해상도 (Resolution) | 최고 수준 | +| FPS | 60 | +| 가속 렌더링 모드 (Accelerate Rendering Mode) | 호환성 (Compatibility) | +| 후처리 (Post-Processing) | ON | +| 안티앨리어싱 (Anti-Aliasing) | ON | + +--- + +✅ *팁:* 그래픽 설정을 고품질로 유지하면 자동화 작업의 시각 인식 일관성이 증가하지만, +안정적인 실행에는 필수 요소는 아닙니다. diff --git a/service/dist/docs/ko_KR/Normal Sweeping Scanning Description.md b/service/dist/docs/ko_KR/Normal Sweeping Scanning Description.md new file mode 100644 index 000000000..8f1d7e888 --- /dev/null +++ b/service/dist/docs/ko_KR/Normal Sweeping Scanning Description.md @@ -0,0 +1,62 @@ + +# 🧹 스윕 구성 가이드 + +각 **스윕 구성**은 다음 형식을 따릅니다: + +``` +region - task-number - sweep-times +``` + +--- + +## 🧩 구성 요소 설명 + +| 구성 요소 | 설명 | +| :-------------- | :--------------------- | +| **Region** | 지도 또는 구역 식별자 | +| **Task Number** | 해당 구역 내의 레벨 또는 스테이지 번호 | +| **Sweep Times** | 스윕 수행 횟수 또는 방식 | + +각 구성은 **콤마(`,`)로 구분**되어야 합니다. + +--- + +## 🗺️ 1. 지원되는 스윕 레벨 범위 + +Academy 1 및 Academy 5 이후 모든 지도에서 자동 스윕이 가능합니다. + +> 🟡 **유효한 스윕 문자열 예시:** +> +> ``` +> 12-1-3, 13-2-2, 14-4-1 +> ``` + +--- + +## ⚙️ 2. 특수 설명 + +국제 서버(Global)에서는 +`sweep times`에 **`max`** 키워드를 사용할 수 있습니다. + +* BAAS는 레벨 난이도, 완료 상태, 현재 **스태미너(AP)** 등에 따라 + 해당 레벨을 클리어 가능한지 자동으로 판단합니다. + +--- + +### 🧮 예시 + +스태미너가 충분할 경우: + +``` +15-3, 20-3-max +``` + +**의미:** + +* 15-3 레벨을 3회 스윕 +* 그 후, 20-3 레벨을 남은 AP를 모두 사용해 스윕 (`max`) + +--- + +✅ *팁:* 자동으로 모든 AP를 사용하는 `max`는 신중하게 사용하고, +가능하면 명시적 스윕 횟수를 지정해 통제된 실행을 유지하세요. diff --git a/service/dist/docs/ko_KR/Scheduling Configuration Filling Guide.md b/service/dist/docs/ko_KR/Scheduling Configuration Filling Guide.md new file mode 100644 index 000000000..dcf65952c --- /dev/null +++ b/service/dist/docs/ko_KR/Scheduling Configuration Filling Guide.md @@ -0,0 +1,86 @@ + +# 🕒 스케줄링 구성 입력 가이드 + +이 가이드는 자동화 작업 실행을 위한 스케줄링 구성 필드의 +올바른 입력 및 해석 방법을 설명합니다. + +--- + +## ⚙️ 1. 우선 순위 (Priority) + +큐에 여러 작업이 있을 경우: + +* **우선 순위 값이 낮은 작업**이 먼저 실행됩니다. + +> 예시: +> 우선 순위 1의 작업이 우선 순위 2의 작업보다 먼저 실행됨 + +--- + +## ⏳ 2. 실행 간격 (Interval) + +* 정수 `0` → **매일 반복 실행** +* 그보다 큰 정수 → 실행 간격을 일(day) 단위로 지정 + +--- + +## 🕐 3. 일일 리셋 타임 + +작업은 매일 고정된 시간에 자동으로 실행됩니다. +이 기능은 **새 UI**에서 쉽게 설정할 수 있습니다. + +* **형식:** + +``` +[ [ h, m, s ] ] +``` + +*(UTC 기준 시간)* + +* 여러 타임스탬프는 콤마(,)로 구분 가능 + +**예시:** + +``` +[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] +``` + +**의미:** +베이징 시간 (UTC+8) 기준 **08:00** 및 **16:00**에 실행 + +--- + +## 🚫 4. 비활성 시간대 설정 + +지정된 기간 동안 작업이 **실행되지 않도록** 설정할 수 있습니다. +이 또한 **새 UI**에서 쉽게 지정 가능합니다. + +* **형식:** + +``` +[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] +``` + +*(UTC 기준 시간)* + +* 여러 기간은 콤마로 구분 + +**예시:** + +``` +[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] +``` + +**의미:** +하루 종일 작업이 비활성화됨 + +--- + +## 🔁 5. 사전 작업 & 사후 작업 + +관련 작업들을 연계할 수 있습니다: + +* **사전 작업 (Pre-tasks):** 현재 작업 전에 실행 +* **사후 작업 (Post-tasks):** 현재 작업 후에 실행 + +> 이로써 종속 작업들이 올바른 순서로 실행되도록 보장할 수 있습니다. diff --git a/service/dist/docs/ko_KR/Task force attributes required by region.md b/service/dist/docs/ko_KR/Task force attributes required by region.md new file mode 100644 index 000000000..cac20b0f4 --- /dev/null +++ b/service/dist/docs/ko_KR/Task force attributes required by region.md @@ -0,0 +1,40 @@ +# 🎯 스테이지 속성 참조표 + +이 표는 각 스테이지와 그에 대응하는 **두 개의 주요 속성**을 나열하며, +구분을 쉽게 하기 위해 별도의 열에 정리되어 있습니다. + +| 스테이지 | 속성 ① | 속성 ② | +| :----: | :------------- | :------------- | +| **25** | 소닉 (Sonic) | 관통 (Piercing) | +| **24** | 소닉 (Sonic) | 폭발 (Explosive) | +| **23** | 폭발 (Explosive) | 관통 (Piercing) | +| **22** | 관통 (Piercing) | 신비 (Mystic) | +| **21** | 신비 (Mystic) | 폭발 (Explosive) | +| **20** | 폭발 (Explosive) | 관통 (Piercing) | +| **19** | 관통 (Piercing) | 신비 (Mystic) | +| **18** | 신비 (Mystic) | 폭발 (Explosive) | +| **17** | 폭발 (Explosive) | 관통 (Piercing) | +| **16** | 관통 (Piercing) | 신비 (Mystic) | +| **15** | 신비 (Mystic) | 신비 (Mystic) | +| **14** | 폭발 (Explosive) | 신비 (Mystic) | +| **13** | 관통 (Piercing) | 관통 (Piercing) | +| **12** | 신비 (Mystic) | 폭발 (Explosive) | +| **11** | 관통 (Piercing) | 신비 (Mystic) | +| **10** | 폭발 (Explosive) | 신비 (Mystic) | +| **9** | 폭발 (Explosive) | 관통 (Piercing) | +| **8** | 관통 (Piercing) | 관통 (Piercing) | +| **7** | 폭발 (Explosive) | 폭발 (Explosive) | +| **6** | 관통 (Piercing) | 관통 (Piercing) | +| **5** | 폭발 (Explosive) | — | +| **4** | 관통 (Piercing) | — | +| **3** | 관통 (Piercing) | — | +| **2** | 폭발 (Explosive) | — | +| **1** | 폭발 (Explosive) | — | + +--- + + +✅ *팁:* 전투를 계획할 때는 전투 팀의 **공격 타입**을 +적의 약점 속성과 맞추는 것을 고려하세요. +두 속성이 있는 스테이지는 하위 구역 간 안정성을 위해 +팀 구성을 균형 있게 유지하는 것이 좋습니다. diff --git a/service/dist/docs/ko_KR/reporting guidelines on issues (important).md b/service/dist/docs/ko_KR/reporting guidelines on issues (important).md new file mode 100644 index 000000000..e0bcf11eb --- /dev/null +++ b/service/dist/docs/ko_KR/reporting guidelines on issues (important).md @@ -0,0 +1,54 @@ + +# 🧭 문제 리포팅 및 자가 진단 가이드 + +리포트를 제출하기 전에, 아래 체크리스트를 **한 번 멈추고 생각**해 보세요. +이 과정을 거치면 문제가 재현 가능하고 명확하며, 다른 사람들이 더 쉽게 대응할 수 있습니다. + +--- + +## 💡 보고 전에 확인할 사항 + +1. **이 문제가 이전에도 발생했는가?** + 스스로 먼저 해결해 보세요 — **Baidu** 검색이나 문서 참고 등을 활용하세요. + + > 그래도 해결되지 않으면 리포트를 진행하세요. +2. **프로그램 실행 시 매번 동일한 문제가 발생하는가?** + 일관성 있는 문제인지 확인하는 것이 환경 문제인지 버그인지 가늠하는 데 도움이 됩니다. +3. **다른 사람이 동일한 문제를 재현할 수 있도록 충분한 정보를 제공할 수 있는가?** + 로그, 스크린샷, 설정 세부사항 등을 포함하세요. +4. **리포트를 보기 좋고 읽기 좋게 작성했는가?** + 색상 코드 로그, 스크린샷 등은 보기 쉽고 직관적이라 도움을 더 받을 수 있습니다. + +--- + +## 🎨 문제 유형별 리포팅 요구사항 + +*(🟡 노란 항목은 **필수**입니다)* + +--- + +### 🧱 “페이지 XXX에서 멈춤” + +🟡 **(1)** 멈췄을 때의 화면 해상도를 1280×720으로 기록 (예: MuMu의 F9 단축키 사용) +(2) BAAS 로그 스크린샷 +(3) 탭 전환 등 다른 페이지로 이동해도 동일한 현상이 반복되는지 확인 + +--- + +### 🧍 “이동 불가” + +(1) 해당 동작을 한두 번 반복해 보세요. +🟡 **(2)** 프로그램 시작부터 멈춘 지점까지 전체 영상 녹화 +— 에뮬레이터 화면과 BAAS 로그 창이 함께 보이도록 녹화 + +--- + +### ⚙️ “XXX 설정을 했는데 실행이 안 됨” 또는 “설정하지 않았는데 실행됨” + +(1) 구성 설명서를 다시 꼼꼼히 읽어 파라미터가 올바르게 입력되었는지 확인 +🟡 **(2)** 구성 설정 화면, 프로그램 로그 스크린샷 함께 첨부 + +--- + +✅ *팁:* 완전한 리포트는 타인이 **추측 없이** 재현할 수 있어야 합니다. +로그, 스크린샷, 명확한 맥락 제공은 모두의 시간을 절약하고 빠른 해결을 돕습니다. diff --git a/service/dist/docs/ru_RU/Auto clear mainline plot settings.md b/service/dist/docs/ru_RU/Auto clear mainline plot settings.md new file mode 100644 index 000000000..3056ae4ba --- /dev/null +++ b/service/dist/docs/ru_RU/Auto clear mainline plot settings.md @@ -0,0 +1,46 @@ + +# 🧩 Настройки автоматического прохождения основной сюжетной линии + +### 🎮 Автоматическая игра и заметки о битвах + +**Автопроигрывание** помогает **автоматически проходить сетку уровней**. +Однако **некоторые сражения в Финальном эпизоде нельзя пройти автоматически.** + +--- + +### 📘 Нумерация эпизодов + +| Номер | Название эпизода | +| :---: | :--------------- | +| 1 | Эпизод I | +| 2 | Эпизод II | +| 3 | Эпизод III | +| 4 | Эпизод IV | +| 5 | Финальный эпизод | +| 6 | Эпизод V | + +--- + +### 🔢 Формат ввода + +Используйте запятую (`,`) для разделения номеров эпизодов, которые нужно пройти. + +**Пример:** + +```text +1,2,3 +``` + +Это означает, что скрипт пройдет **Эпизод I → Эпизод II → Эпизод III** по порядку. + +--- + +### ⚙️ Конфигурация по умолчанию + +Если поле ввода оставлено пустым и вы нажмёте **«Запустить»**, используется последовательность по умолчанию: + +| Регион | Эпизоды по умолчанию | +| :----- | :------------------- | +| CN | `1,2,3,4` | +| Global | `1,2,3,4,5,4` | +| JP | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/ru_RU/Commonly used emulator adb address.md b/service/dist/docs/ru_RU/Commonly used emulator adb address.md new file mode 100644 index 000000000..1707345f8 --- /dev/null +++ b/service/dist/docs/ru_RU/Commonly used emulator adb address.md @@ -0,0 +1,25 @@ +# 🧠 Справочник портов эмуляторов + +### ⚙️ Общие сведения + +**Для мультиэкземпляров Stimulator** проверьте конфигурацию самостоятельно. + +--- + +### 🎮 Порты одиночных эмуляторов + +| Эмулятор | Порт(ы) | +| :------------------------ | :--------------- | +| **MuMu** | `7555` | +| **BlueStacks / LDPlayer** | `5555` | +| **NoxPlayer** | `62001`, `59865` | +| **MuMu 12** | `16384` | +| **MEmuPlay** | `21503` | + +> ⚠️ **Если вы используете BlueStacks**, убедитесь, что в настройках включена +> функция **отладки порта ADB**. + +--- + +💡 *Совет:* Эти порты используются для ADB-соединения между ПК и эмулятором. +Если возникают проблемы с подключением, убедитесь, что включена опция **ADB Debugging**, и ни один другой экземпляр эмулятора не занимает тот же порт. diff --git a/service/dist/docs/ru_RU/Description of normal graphs.md b/service/dist/docs/ru_RU/Description of normal graphs.md new file mode 100644 index 000000000..1fa26e7a2 --- /dev/null +++ b/service/dist/docs/ru_RU/Description of normal graphs.md @@ -0,0 +1,114 @@ + +# 📊 Описание обычных карт + +--- + +## 🧩 1. Описание использования + +### (1) Требования к разблокировке и авто-бою + +Необходимо включить оба параметра: + +* 🟡 **Автоматически завершать раунды** +* 🟡 **Автобой** + +> Система автоматически проверит и включит эти функции, если это возможно. + +--- + +### (2) Поддерживаемые уровни + +Поддерживаются обычные уровни основной линии: +🟡 **4 – 25** + +--- + +### (3) Логика перемещения + +Когда слайды BAAS зафиксированы, перемещения команд выполняются **одним нажатием**. +Так как количество команд в *Blue Archive* различается, +**координаты нумерации** и **порядок движения** также различаются в зависимости от состава команды. + +--- + +### (4) Примечания по автоматической экстраполяции + +При **автоматической экстраполяции** +🟡 **убедитесь, что команды с меньшими и большими номерами назначены правильно.** +(Если не уверены — проверьте нумерацию команд перед запуском.) + +--- + +### (5) Настройки миниатюр обычных уровней + +BAAS определяет конфигурацию на основе: + +* 🟢 **< Настройки миниатюр обычных уровней >** +* 🟢 **Выбранных свойств группы** +* 🟢 **♪ Логики команды ♪** + +Эти параметры определяют правильную конфигурацию для каждого слайда. + +> Первое соответствующее свойство на схемах — **[1]**, второе — **[2]**. + +--- + +## 🤖 2. Логика команд + +1. Приоритет выбора команды определяется **по контротношениям (сдерживаниям)**, + с постепенным снижением зависимости от совпадения атрибутов. +2. При выборе команды: + `4 - (номер команды) >= число требуемых команд`. +3. Если условия (1) и (2) невыполнимы, ослабляются контротношения между эквивалентами [1]. +4. Если некоторые команды уже выбраны и `4 - max(выбранные) >= требуемые`, + оставшиеся заполняются **дополнительными номерами**. +5. Если ни одно условие не выполняется, выбираются **команды 1, 2, 3**. + +--- + +### 🧠 Пример + +Порядок выбора для **отряда 23 [Взрыв, Переправа]**: + +* Одна команда — одна операция. +* Если *Взрывная команда 3* не выбрана в предыдущем порядке, выберите **4** как вторую. +* Если всё ещё недоступна, выберите **12** как финальную. + +--- + +## 🚀 3. Описание уровней Push-карты + +### (1) Поведение при продвижении + +Если появляется сообщение +🟡 **«Не удалось закрыть временную папку: %s»**, +каждое введённое число соответствует **зоне для прохождения**. +Программа проверит, нужно ли переигрывать уровни в этой зоне +на основе достижения рейтинга `SSS`. + +**Пример:** + +```text +15, 16, 14 +``` + +Это означает последовательное прохождение зон **15 → 16 → 14**. + +--- + +### (2) Настройка обязательных атак + +Если включена опция 🟡 **Принудительные атаки на каждом уровне**: + +* Введите одно число → пройти всю зону один раз. +* Введите `число-число` → указать конкретный подуровень. + +**Пример:** + +```text +15, 16-3 +``` + +--- + +✅ *Совет:* Перед запуском убедитесь, что нумерация уровней и назначение команд совпадают с вашей **конфигурацией BAAS**, чтобы избежать несоответствий. diff --git a/service/dist/docs/ru_RU/Difficult Chart Configuration Description.md b/service/dist/docs/ru_RU/Difficult Chart Configuration Description.md new file mode 100644 index 000000000..e49869a4c --- /dev/null +++ b/service/dist/docs/ru_RU/Difficult Chart Configuration Description.md @@ -0,0 +1,103 @@ + +# 💀 Руководство по использованию сложных карт + +Сложные карты работают аналогично режимам **Логика команд** и **Обычные карты**. +Некоторые из них требуют **три команды** с одинаковым атрибутом, как у первой команды в регионе. + +--- + +## 🧾 Правила заполнения + +### ⚠️ Допустимые символы + +Строка для уровня слайда **не должна содержать** ничего, кроме: + +``` +"-", "sss", "present", "task", ",", [чисел] +``` + +Каждый сегмент разделяется **запятой (`,`)**. + +> ❌ Не добавляйте слова `"sss"`, `"present"`, `"task"` вне допустимого синтаксиса. + +--- + +### 🧩 Пример 1: базовое использование + +**Ввод:** + +``` +15,12-2 +``` + +**Интерпретация:** + +BAAS выполнит: + +``` +15-1, 15-2, 15-3, 12-2 +``` + +и запустит режим **Hard Map**: + +* `sss` → проверка звёзд +* `present` → сбор наград +* `task` → выполнение заданий + +--- + +### 🧩 Пример 2: число + строка + +**Ввод:** + +``` +15-sss-present +``` + +**Значение:** +BAAS запустит уровни **15-1, 15-2, 15-3** +и выполнит `sss` (проверка звёзд) и `present` (сбор подарков). + +--- + +### 🧩 Пример 3: два числа + ключевые слова + +**Ввод:** + +``` +15-3-sss-task +``` + +**Значение:** +BAAS запустит **уровень 15-3** для: + +* получения рейтинга `sss` +* завершения `task`. + +--- + +### 🧩 Пример 4: сложный случай + +**Ввод:** + +``` +7,8-sss,9-3-task +``` + +**Значение:** + +* `(7-1,7-2,7-3)` → выполнить `sss`, собрать подарки и задания. +* `(8-1,8-2,8-3)` → выполнить `sss`. +* `9-3` → выполнить задание `task`. + +--- + +## 🧠 Поведение системы + +> 🟡 **Примечание:** +> BAAS автоматически определяет, +> +> * достигнут ли уровень `sss`, +> * собран ли подарок. + +Если одно из условий выполнено, **уровень пропускается** для оптимизации времени. diff --git a/service/dist/docs/ru_RU/Frontend Development Guide.md b/service/dist/docs/ru_RU/Frontend Development Guide.md new file mode 100644 index 000000000..c1df26553 --- /dev/null +++ b/service/dist/docs/ru_RU/Frontend Development Guide.md @@ -0,0 +1,104 @@ + +# 🏗️ Руководство по фронтенд-разработке + +Этот документ описывает, как устроено **настольное приложение BAAS**, как данные проходят между клиентскими модулями и серверной частью, а также какие принципы нужно соблюдать при расширении платформы. +Он предназначен для **инженерных и интеграционных команд**, которым требуется каноническое руководство при внедрении новых функций. + +--- + +## 🧩 Оболочка приложения + +React-приложение рендерится через `App.tsx`. +Оно объединяет **ThemeProvider**, **AppProvider** и постоянный каркас интерфейса (`MainLayout`). +Страницы переключаются при помощи лёгкого **framer-motion router**, который сохраняет неактивные страницы в памяти, чтобы они не теряли состояние при смене вкладок. + +* **Точка входа:** `main.tsx` инициализирует i18n, тему и рендерит ``. +* **Провайдеры:** `AppProvider` загружает пользовательские настройки UI, устанавливает соединение по WebSocket, загружает каталог профилей и предоставляет методы через контекст. +* **Макет:** `MainLayout` включает постоянную боковую панель (`Sidebar.tsx`) и верхний заголовок (`Header.tsx`). + +--- + +## 🧱 Ключевые модули + +| Модуль | Ответственность | Основные файлы | +| :------------------ | :----------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| **Context** | Делится настройками UI, активным профилем и каталогом профилей. | `contexts/AppContext.tsx` | +| **State Stores** | Хранилища Zustand нормализуют удалённое состояние (конфиг, события, статусы, логи) для компонентов. | `store/websocketStore.ts`, `store/globalLogStore.ts` | +| **Remote Services** | Инкапсулируют серверные контракты, включая сохранение горячих клавиш и зашифрованные WebSocket-сессии. | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | +| **Pages** | Контейнеры верхнего уровня для страниц `Home`, `Scheduler`, `Configuration`, `Settings`, `Wiki`. | `pages/*.tsx` | +| **Feature Forms** | Модульные панели конфигурации, работающие с фрагментом `DynamicConfig`. | `features/*Config.tsx`, `features/DailySweep.tsx` | +| **Shared UI** | Повторно используемые визуальные элементы (инпуты, селекторы, модальные окна, логгеры и пр.). | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | +| **Hooks** | Бизнес-логика, включая горячие клавиши и управление темой. | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | + +--- + +## 🔄 Поток данных + +### 🔌 Инициализация WebSocket + +1. `AppProvider` вызывает `useWebSocketStore.getState().init()` при запуске. +2. `init()` поочерёдно подключается к каналам **heartbeat**, **provider** и **sync**, используя `SecureWebSocket`. +3. После установления соединения хранилище загружает статические данные, конфигурации и очереди событий. +4. Сеттеры Zustand обновляют подписанные компоненты в реальном времени. + +--- + +### ⚙️ Цикл обновления конфигурации + +1. Формы редактирования работают с локальной копией `DynamicConfig`. +2. При сохранении создаётся минимальный объект `patch` и вызывается `modify(path, patch, showToast)`. +3. Хранилище отправляет команду `sync` с JSON-патч-семантикой и регистрирует колбэк в `pendingCallbacks`. +4. После подтверждения от сервера колбэк очищает состояние ожидания и при необходимости показывает уведомление через `sonner`. +5. Входящие сообщения `config` синхронизируют локальное состояние. + +--- + +### 📡 Телеметрия планировщика + +* Страницы **Home** и **Scheduler** подписаны на `statusStore` и `logStore` для отображения метрик. +* Лог-поток устраняет дубликаты и зеркалирует глобальные логи в `globalLogStore`. +* Все исходящие команды (запуск, остановка, патчи) имеют метки времени для упрощения отслеживания. + +--- + +## ⚙️ Сквозные аспекты + +### 🌐 Интернационализация + +Переводы хранятся в `assets/locales/*.json` и загружаются через `react-i18next`. +Язык по умолчанию — **китайский (`zh`)**, резервный — **английский (`en`)**. +Тексты интерфейса структурированы по доменам (scheduler, artifact и т. д.) для удобного обновления локализаций. + +--- + +### ⚡ Производительность и UX + +* **Сохранение монтирования** (`App.tsx`) предотвращает повторную инициализацию тяжёлых компонентов при переключении вкладок. +* Формы используют `useMemo` и `useCallback` для минимизации перерисовок. +* Прокручиваемые области применяют классы `scroll-embedded` для единообразного стиля. +* Обновления в реальном времени используют **пакетные сеттеры Zustand**; тяжёлые обновления (логи) добавляются иммутабельно для снижения нагрузки. + +--- + +### 🧰 Инструменты + +* **Сборка:** Vite + React 19 + TypeScript 5 +* **Стили:** Tailwind CSS с пользовательскими токенами и переиспользуемыми компонентами +* **Анимации:** `framer-motion` для переходов и `ogl` для эффектов частиц + +--- + +## 🚀 Контрольный список расширения + +1. Создайте или обновите компонент функции в `features/` и зарегистрируйте его в `featureMap` (страница Configuration). +2. Добавьте новые надписи в словари `en.json` и `zh.json`. +3. Используйте `modify`, `patch` или `trigger` для обмена с сервером, сохраняя единую систему подтверждений. +4. Если настройку нужно сделать доступной пользователю, раскройте её через `AppContext`. + +--- + +Следуя этим правилам, вы обеспечите: + +* **Последовательность и расширяемость** приложения, +* Корректную работу **горячих клавиш** и **телеметрии**, +* Согласованность состояния **WebSocket** на всех страницах. diff --git a/service/dist/docs/ru_RU/Guide for activity sweep fill in.md b/service/dist/docs/ru_RU/Guide for activity sweep fill in.md new file mode 100644 index 000000000..4614f8fc6 --- /dev/null +++ b/service/dist/docs/ru_RU/Guide for activity sweep fill in.md @@ -0,0 +1,53 @@ + +# ⚔️ Руководство по заполнению параметров зачистки активности + +Это руководство объясняет, как правильно задавать параметры **автоматической зачистки активности** в BAAS. + +--- + +## 🧾 Одна зачистка + +**Параметр:** +`Номер задания для зачистки` + +* Тип: **целое число** +* Диапазон: `1` – *максимальная сложность* текущей активности. + +**Параметр:** +`Количество зачисток` + +1. **Целое число** — точное количество проходов. + Например, `3` → выполнить задание 3 раза. +2. **Десятичное число** — доля используемой выносливости (AP). + Например, `0.5` → использовать **AP × 0.5**. +3. **Дробь** — часть AP в виде отношения. + Например, `1/3` → использовать **AP × (1/3)**. + +--- + +## 🔁 Несколько зачисток подряд + +Чтобы зачистить несколько заданий последовательно, +разделяйте номера запятыми. + +**Пример:** + +``` +Задания: 9, 10, 11 +Количество: 0.5, 3, 1/3 +AP: 999 +``` + +**Интерпретация:** + +| Задание | Расчёт | Результат | +| :------ | :------------- | :-------- | +| **9** | (999 × 0.5)/20 | 25 раз | +| **10** | фиксировано 3 | 3 раза | +| **11** | (999 × 1/3)/20 | 16 раз | + +➡️ BAAS выполнит зачистку **9 → 10 → 11** по порядку. + +--- + +✅ *Совет:* Всегда проверяйте, что значение **AP** соответствует фактической выносливости в игре перед запуском множественных зачисток. diff --git a/service/dist/docs/ru_RU/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/ru_RU/Internal settings in BlueArchive game (first-use must read).md new file mode 100644 index 000000000..096bee715 --- /dev/null +++ b/service/dist/docs/ru_RU/Internal settings in BlueArchive game (first-use must read).md @@ -0,0 +1,30 @@ + +# ⚙️ Файлы Blanche — внутренние настройки игры + +В этом руководстве перечислены **обязательные** и **рекомендуемые** игровые настройки для корректной работы системы **Blanche Files** с BAAS-автоматизацией. + +--- + +## 🧩 Обязательные настройки + +| Категория | Параметр | Значение / инструкция | +| :--------------------------- | :---------------------------------------- | :----------------------------------- | +| **Графика** | Вертикальный экран битвы — текстовое окно | **Выкл.** | +| **Лобби воспоминаний** | Выбор персонажа | **Не выбирайте** Ako, Aru или Wakamo | +| **Язык (глобальный сервер)** | — | **Английский** | + +--- + +## 💡 Рекомендуемые параметры *(необязательные)* + +| Настройка | Рекомендованное значение | +| :------------------------------- | :----------------------- | +| **Разрешение** | Максимальное | +| **FPS** | 60 | +| **Режим ускоренного рендеринга** | Совместимость | +| **Пост-обработка** | Вкл. | +| **Сглаживание** | Вкл. | + +--- + +✅ *Совет:* Высокое качество графики обеспечивает более стабильное распознавание изображений автоматикой, хотя это **не обязательно** для корректного выполнения скриптов. diff --git a/service/dist/docs/ru_RU/Normal Sweeping Scanning Description.md b/service/dist/docs/ru_RU/Normal Sweeping Scanning Description.md new file mode 100644 index 000000000..5ebf50ea2 --- /dev/null +++ b/service/dist/docs/ru_RU/Normal Sweeping Scanning Description.md @@ -0,0 +1,63 @@ + +# 🧹 Руководство по настройке зачистки + +Каждая конфигурация зачистки имеет общий формат: + +``` +регион - номер-задания - количество-раз +``` + +--- + +## 🧩 Структура + +| Компонент | Описание | +| :---------------- | :------------------------------- | +| **Регион** | Идентификатор карты или области. | +| **Номер задания** | Уровень внутри региона. | +| **Количество** | Число повторов зачистки. | + +Конфигурации разделяются **запятыми**. + +--- + +## 🗺️ 1. Доступные уровни + +Все карты **после Academy 1 и Academy 5** поддерживают автоматическую зачистку. + +> 🟡 **Пример:** +> +> ``` +> 12-1-3, 13-2-2, 14-4-1 +> ``` + +--- + +## ⚙️ 2. Особые случаи + +На **международном сервере** поле количества может принимать ключевое слово **`max`**. + +* BAAS автоматически определяет, можно ли пройти уровень, + исходя из: + + * текущего **AP** + * сложности и статуса прохождения + +--- + +### 🧮 Пример + +При достаточном запасе выносливости: + +``` +15-3, 20-3-max +``` + +**Значение:** + +* Пройти **15-3** три раза. +* Затем зачистить **20-3** до полного расхода AP (`max`). + +--- + +✅ *Совет:* Используйте `max`, если хотите полностью израсходовать AP на уровне; иначе указывайте точное количество для контролируемого выполнения. diff --git a/service/dist/docs/ru_RU/Scheduling Configuration Filling Guide.md b/service/dist/docs/ru_RU/Scheduling Configuration Filling Guide.md new file mode 100644 index 000000000..914a1a36f --- /dev/null +++ b/service/dist/docs/ru_RU/Scheduling Configuration Filling Guide.md @@ -0,0 +1,79 @@ + +# 🕒 Руководство по заполнению конфигурации планировщика + +Это руководство объясняет, как правильно заполнять и интерпретировать поля планировщика для автоматического выполнения задач. + +--- + +## ⚙️ 1. Приоритет + +Если в очереди несколько задач: + +* Задачи с **меньшим числом приоритета** выполняются **раньше**. + +> Пример: +> Задача A (приоритет 1) выполняется до задачи B (приоритет 2). + +--- + +## ⏳ 2. Интервал выполнения + +* **0** — ежедневное выполнение. +* Большее число — пропуск указанного количества дней. + +--- + +## 🕐 3. Ежедневный запуск + +Задачи запускаются в фиксированные моменты времени (UTC). + +* **Формат:** + +``` +[ [ h, m, s ] ] +``` + +Можно указать несколько времён через запятую. + +**Пример:** + +``` +[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] +``` + +**Значение:** +Запуск в **8 утра и 4 вечера** по пекинскому времени (UTC + 8). + +--- + +## 🚫 4. Периоды блокировки + +В это время задачи **не выполняются**. + +* **Формат:** + +``` +[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] +``` + +Можно задать несколько интервалов. + +**Пример:** + +``` +[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] +``` + +**Значение:** +Задачи отключены на **весь день**. + +--- + +## 🔁 5. Пред- и пост-задачи + +Можно связать операции: + +* **Pre-tasks** — выполняются **до** текущей задачи. +* **Post-tasks** — выполняются **после** текущей. + +> Это обеспечивает правильный порядок зависимых действий. diff --git a/service/dist/docs/ru_RU/Task force attributes required by region.md b/service/dist/docs/ru_RU/Task force attributes required by region.md new file mode 100644 index 000000000..a4b95ac58 --- /dev/null +++ b/service/dist/docs/ru_RU/Task force attributes required by region.md @@ -0,0 +1,36 @@ + +# 🎯 Таблица атрибутов регионов + +| Этап | Атрибут ① | Атрибут ② | +| :--: | :-------- | :-------- | +| 25 | Sonic | Piercing | +| 24 | Sonic | Explosive | +| 23 | Explosive | Piercing | +| 22 | Piercing | Mystic | +| 21 | Mystic | Explosive | +| 20 | Explosive | Piercing | +| 19 | Piercing | Mystic | +| 18 | Mystic | Explosive | +| 17 | Explosive | Piercing | +| 16 | Piercing | Mystic | +| 15 | Mystic | Mystic | +| 14 | Explosive | Mystic | +| 13 | Piercing | Piercing | +| 12 | Mystic | Explosive | +| 11 | Piercing | Mystic | +| 10 | Explosive | Mystic | +| 9 | Explosive | Piercing | +| 8 | Piercing | Piercing | +| 7 | Explosive | Explosive | +| 6 | Piercing | Piercing | +| 5 | Explosive | — | +| 4 | Piercing | — | +| 3 | Piercing | — | +| 2 | Explosive | — | +| 1 | Explosive | — | + +--- + +✅ *Совет:* +При планировании сражений сопоставляйте **тип атаки** команды со **слабостью врага**. +Этапы с двумя атрибутами требуют **сбалансированных составов**, чтобы сохранять устойчивость между подуровнями. diff --git a/service/dist/docs/ru_RU/reporting guidelines on issues (important).md b/service/dist/docs/ru_RU/reporting guidelines on issues (important).md new file mode 100644 index 000000000..5016beda6 --- /dev/null +++ b/service/dist/docs/ru_RU/reporting guidelines on issues (important).md @@ -0,0 +1,65 @@ + +# 🧭 Руководство по сообщению о проблемах и самодиагностике + +Перед отправкой отчёта **остановитесь и проверьте** следующие пункты — +это поможет сделать проблему воспроизводимой и понятной. + +--- + +## 💡 Перед тем как сообщить + +1. **Была ли эта ошибка раньше?** + Попробуйте решить самостоятельно — поищите на **Baidu** или в **документации**. + + > Если не помогает — сообщайте. + +2. **Возникает ли проблема каждый раз?** + Это поможет понять, случайная ли ошибка или системная. + +3. **Есть ли у вас достаточно данных для воспроизведения?** + Приложите логи, скриншоты и настройки. + +4. **Сделайте отчёт читаемым.** + Красиво оформленные логи и изображения (например, в QQ-группе) повышают шанс получить помощь. + +--- + +## 🎨 Тип проблемы и требования к отчёту + +*(🟡 Жёлтые пункты — обязательные)* + +--- + +### 🧱 «Я застрял на странице XXX!» + +🟡 (1) Разрешение 1280×720 в момент зависания (например, MuMu на F9). + +(2) Скриншот лога BAAS. + +(3) Попробуйте переключить страницы — зависает ли только одна. + +--- + +### 🧍 «Я не могу двигаться!» + +(1) Повторите действие пару раз — зависает ли в том же месте. + +🟡 (2) Запишите **видео от старта до момента зависания**, + +чтобы на экране были видны и эмулятор, и окно лога BAAS. + +--- + +### ⚙️ «Я настроил XXX, но оно не выполняется!» + +или +«Я не настраивал XXX, но оно выполняется!» + +(1) Внимательно перечитайте инструкции — проверьте параметры. + +🟡 (2) Приложите **скриншоты настроек** и **логи программы**. + +--- + +✅ *Совет:* Полноценный отчёт должен позволять воспроизвести проблему **без догадок**. +Логи + скриншоты + контекст = быстрая и эффективная помощь. diff --git a/service/dist/docs/zh_CN/Auto clear mainline plot settings.md b/service/dist/docs/zh_CN/Auto clear mainline plot settings.md new file mode 100644 index 000000000..d47fe2e32 --- /dev/null +++ b/service/dist/docs/zh_CN/Auto clear mainline plot settings.md @@ -0,0 +1,46 @@ + +# 🧩 主线剧情自动通关设置 + +### 🎮 自动播放与战斗说明 + +**自动播放**可以帮助你**自动走图**。 +但请注意,**最终章(Final Episode)中的部分战斗无法自动进行。** + +--- + +### 📘 章节编号说明 + +| 数字 | 剧情章节名 | +| :-: | :----------------- | +| 1 | 第一章(Episode I) | +| 2 | 第二章(Episode II) | +| 3 | 第三章(Episode III) | +| 4 | 第四章(Episode IV) | +| 5 | 最终章(Final Episode) | +| 6 | 第五章(Episode V) | + +--- + +### 🔢 输入格式 + +使用英文逗号(`,`)分隔需要通关的章节编号。 + +**示例:** + +```text +1,2,3 +``` + +表示脚本会依次自动通关:**第一章 → 第二章 → 第三章**。 + +--- + +### ⚙️ 默认配置 + +如果输入框留空并点击 **“运行(Run)”**,将采用默认通关顺序: + +| 服务器 | 默认章节顺序 | +| :---------- | :-------------- | +| 国服(CN) | `1,2,3,4` | +| 国际服(Global) | `1,2,3,4,5,4` | +| 日服(JP) | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/zh_CN/Commonly used emulator adb address.md b/service/dist/docs/zh_CN/Commonly used emulator adb address.md new file mode 100644 index 000000000..79a19c7bb --- /dev/null +++ b/service/dist/docs/zh_CN/Commonly used emulator adb address.md @@ -0,0 +1,29 @@ + +# 🧠 模拟器 ADB 端口参考 + +### ⚙️ 通用说明 + +**若使用多开模拟器(Stimulator Multi-instance)**,请自行检查配置。 + +--- + +### 🎮 常用模拟器端口列表 + +| 模拟器 | 端口号 | +| :------------------------ | :--------------- | +| **MuMu** | `7555` | +| **BlueStacks / LDPlayer** | `5555` | +| **NoxPlayer** | `62001`, `59865` | +| **MuMu 12** | `16384` | +| **MEmuPlay** | `21503` | + +> ⚠️ **使用 BlueStacks 时,请确认设置中已启用 ADB 调试端口功能。** + +--- + +💡 *提示:* +这些端口用于在 **PC 与模拟器之间建立 ADB 连接**。 +若连接失败,请检查: + +* 模拟器的 **ADB 调试选项是否开启**; +* 是否存在 **其他实例占用相同端口**。 diff --git a/service/dist/docs/zh_CN/Description of normal graphs.md b/service/dist/docs/zh_CN/Description of normal graphs.md new file mode 100644 index 000000000..ade8464ac --- /dev/null +++ b/service/dist/docs/zh_CN/Description of normal graphs.md @@ -0,0 +1,111 @@ + +# 📊 普通关卡说明文档 + +--- + +## 🧩 一、使用说明 + +### (1) 解锁与自动战斗要求 + +你必须同时开启: + +* 🟡 **自动结束回合(Auto End Rounds)** +* 🟡 **自动战斗(Autofight)** + +> 系统将自动检测并尝试启用这些功能。 + +--- + +### (2) 支持范围 + +普通主线支持的关卡范围: +🟡 **第 4 至第 25 章** + +--- + +### (3) 队伍移动逻辑 + +当 BAAS 的滑动操作固定后,所有队伍的移动均以**单次点击**完成。 +由于《碧蓝档案》不同关卡的队伍数量不同, +因此每队的 **编号坐标与移动顺序** 也随之变化。 + +--- + +### (4) 自动推演注意事项 + +执行 **自动推演** 时, +🟡 **必须确保小编号队伍与大编号队伍的分配正确。** +(若不确定,请在执行前仔细核对队伍编号。) + +--- + +### (5) 普通图缩略设置 + +BAAS 将根据以下信息自动判断关卡配置: + +* 🟢 **< 普通图缩略设置 >** +* 🟢 **所选分组属性** +* 🟢 **♪ 队伍逻辑(Team Logic)♪** + +> 图示中第一个对应属性为 **[1]**,第二个为 **[2]**。 + +--- + +## 🤖 二、队伍逻辑(Team Logic) + +1. 优先依据**克制关系(Restraint)**选择队伍,逐步降低属性匹配优先级; +2. 当选择队伍时,满足: + `4 - (队伍编号) >= 剩余所需队伍数`; +3. 若条件 (1) 与 (2) 均不满足,则逐步弱化 [1] 对应的克制关系; +4. 若部分队伍已被选择,且 `4 - max(已选队伍编号) >= 剩余所需队伍数`, + 则补充其他可选编号; +5. 若仍不满足,默认选择 **1、2、3 队**。 + +--- + +### 🧠 示例 + +在 **23 [爆发, 贯穿] 特种部队** 任务中: + +* 每个小队执行一次操作; +* 若 *爆发队 3* 未被选中,则选 **4 队** 作为第二选择; +* 若仍不可用,则选 **12 队** 作为最终替代。 + +--- + +## 🚀 三、推图说明 + +### (1) 区域推图行为 + +若出现 +🟡 **“无法关闭临时文件夹: %s”**, +每个输入的数字代表一个**区域编号**。 +程序将根据是否达到 `SSS` 评级判断是否重打该区域。 + +**示例:** + +```text +15, 16, 14 +``` + +表示程序依次推图:**15 → 16 → 14**。 + +--- + +### (2) 强制打关设置 + +当开启 🟡 **“在指定关卡强制执行”** 时: + +* 输入单个数字 → 表示整章推图一次; +* 输入 `数字-数字` → 表示指定小关卡。 + +**示例:** + +```text +15, 16-3 +``` + +--- + +✅ *提示:* +执行脚本前,请确认关卡编号与队伍分配均正确,以避免自动化行为错误。 diff --git a/service/dist/docs/zh_CN/Difficult Chart Configuration Description.md b/service/dist/docs/zh_CN/Difficult Chart Configuration Description.md new file mode 100644 index 000000000..21a92ba3a --- /dev/null +++ b/service/dist/docs/zh_CN/Difficult Chart Configuration Description.md @@ -0,0 +1,102 @@ + +# 💀 困难图配置说明 + +困难图(Hardship Map)与普通图、队伍逻辑类似。 +部分高难关卡需要 **三支队伍**,且它们与首支队伍属性相同。 + +--- + +## 🧾 填写说明 + +### ⚠️ 可用字符 + +关卡字符串仅能包含以下内容: + +``` +"-", "sss", "present", "task", ",", 数字 +``` + +各段落使用英文逗号(`,`)分隔。 + +> ❌ 请勿在字符串中出现无效关键字,如 `"sss"`、`"present"`、`"task"` 以外的文字。 + +--- + +### 🧩 示例 1:基础用法 + +**输入:** + +``` +15,12-2 +``` + +**解析:** +BAAS 将依次调用: + +``` +15-1, 15-2, 15-3, 12-2 +``` + +并根据困难图设定执行: + +* `sss` → 星级评价 +* `present` → 领取奖励 +* `task` → 挑战任务 + +--- + +### 🧩 示例 2:数字 + 关键字 + +**输入:** + +``` +15-sss-present +``` + +**解析:** +执行 **15-1, 15-2, 15-3**,并同时进行 +`sss`(评级)与 `present`(奖励)操作。 + +--- + +### 🧩 示例 3:数字 + 子关 + 关键字 + +**输入:** + +``` +15-3-sss-task +``` + +**解析:** +执行 **15-3**,并: + +* 达成 `sss` 评级; +* 完成 `task` 挑战。 + +--- + +### 🧩 示例 4:复杂组合 + +**输入:** + +``` +7,8-sss,9-3-task +``` + +**解析:** + +* `(7-1,7-2,7-3)` → 达成 `sss`、领取奖励并完成挑战; +* `(8-1,8-2,8-3)` → 达成 `sss`; +* `(9-3)` → 执行挑战任务。 + +--- + +## 🧠 系统行为说明 + +> 🟡 **注意:** +> BAAS 会自动判断: +> +> * 关卡是否已达成 **`sss`**; +> * 奖励是否已领取。 + +若以上任一条件满足,则自动**跳过该关卡**,以节约运行时间。 diff --git a/service/dist/docs/zh_CN/Frontend Development Guide.md b/service/dist/docs/zh_CN/Frontend Development Guide.md new file mode 100644 index 000000000..3818855e9 --- /dev/null +++ b/service/dist/docs/zh_CN/Frontend Development Guide.md @@ -0,0 +1,102 @@ + +# 🏗️ 前端开发指南 + +本文档说明了 **BAAS 桌面端应用** 的整体架构、前后端数据流与扩展规范, +主要面向 **工程与交付团队**,用于新功能开发或项目接入参考。 + +--- + +## 🧩 应用壳(Application Shell) + +React 应用由 `App.tsx` 渲染,负责加载 **ThemeProvider**、**AppProvider** 与主框架 `MainLayout`。 +页面切换使用轻量级 **framer-motion 路由**,在切换标签页时保持非活动页挂载以保存状态。 + +* **入口文件:** `main.tsx` → 初始化 i18n、主题并渲染 `` +* **Provider:** `AppProvider` 加载 UI 偏好、建立 WebSocket 连接、注入配置数据并通过 context 提供方法 +* **布局:** `MainLayout` 含侧边栏 (`Sidebar.tsx`) 与顶部栏 (`Header.tsx`) + +--- + +## 🧱 核心模块 + +| 模块 | 功能说明 | 关键文件 | +| :------------------ | :----------------------------------------------------- | :------------------------------------------------------------------------ | +| **Context** | 在全局共享 UI 设置、当前档案及档案目录。 | `contexts/AppContext.tsx` | +| **State Stores** | 使用 Zustand 管理远程状态(配置、事件、状态、日志等)。 | `store/websocketStore.ts`、`store/globalLogStore.ts` | +| **Remote Services** | 封装后端接口,如快捷键持久化、加密 WebSocket 会话等。 | `services/hotkeyService.ts`、`lib/SecureWebSocket.ts` | +| **Pages** | 对应路由的页面容器(Home、Scheduler、Configuration、Settings、Wiki)。 | `pages/*.tsx` | +| **Feature Forms** | 模块化配置面板,对应 `DynamicConfig` 的局部操作。 | `features/*Config.tsx`、`features/DailySweep.tsx` | +| **Shared UI** | 可复用的界面组件(输入框、选择器、模态框、日志面板等)。 | `components/ui`、`components/AssetsDisplay.tsx`、`components/Particles.tsx` | +| **Hooks** | 包含快捷键控制、主题切换等业务逻辑。 | `hooks/useHotkeys.ts`、`hooks/useTheme.tsx` | + +--- + +## 🔄 数据流说明 + +### 🔌 WebSocket 初始化 + +1. 启动时由 `AppProvider` 调用 `useWebSocketStore.getState().init()`; +2. `init()` 依次连接 **heartbeat**、**provider**、**sync** 通道; +3. 建立连接后,拉取静态数据、配置清单及事件队列; +4. Zustand 将更新广播至订阅组件。 + +--- + +### ⚙️ 配置更新循环 + +1. 功能表单在本地维护 `DynamicConfig` 草稿; +2. 点击保存后生成最小 `patch`,并调用 `modify(path, patch, showToast)`; +3. Store 发送 `sync` 指令并注册回调; +4. 后端确认后,清除等待状态并可通过 `sonner` 弹窗提示; +5. 接收到新的 `config` 消息后,自动同步各组件。 + +--- + +### 📡 调度与监控 + +* 首页与调度页订阅 `statusStore` 与 `logStore` 展示运行数据; +* 日志流水去重后同步至全局日志; +* 所有外发命令均带时间戳以便回溯。 + +--- + +## ⚙️ 跨模块事项 + +### 🌐 国际化 + +翻译文件位于 `assets/locales/*.json`,使用 `react-i18next` 加载。 +默认语言为 **中文(zh)**,英文为回退语言。 + +--- + +### ⚡ 性能与体验 + +* 组件挂载保持,避免频繁初始化; +* 使用 `useMemo`、`useCallback` 减少渲染; +* 滚动区域统一使用 `scroll-embedded`; +* 重日志更新采用不可变追加以减少引用变化。 + +--- + +### 🧰 工具栈 + +* **构建:** Vite + React 19 + TypeScript 5 +* **样式:** Tailwind CSS +* **动画:** `framer-motion`、`ogl` + +--- + +## 🚀 扩展流程清单 + +1. 在 `features/` 中创建或更新功能组件并加入 `featureMap`; +2. 更新 `en.json` 与 `zh.json` 翻译字段; +3. 使用 `modify/patch/trigger` 保持后端确认一致性; +4. 若新增用户设置,则在 `AppContext` 暴露接口。 + +--- + +遵守以上规范可确保: + +* 应用结构一致且可扩展; +* 键盘导航与实时状态同步; +* WebSocket 状态在各页面保持一致。 diff --git a/service/dist/docs/zh_CN/Guide for activity sweep fill in.md b/service/dist/docs/zh_CN/Guide for activity sweep fill in.md new file mode 100644 index 000000000..c238eea2e --- /dev/null +++ b/service/dist/docs/zh_CN/Guide for activity sweep fill in.md @@ -0,0 +1,41 @@ + +# ⚔️ 活动扫荡配置指南 + +解释如何在 BAAS 中正确填写**活动扫荡参数**。 + +--- + +## 🧾 单关扫荡 + +**参数:** `Sweep Quest Number` +类型:整数(1 ~ 当前活动最高难度) + +**参数:** `Number of Sweeps` + +1. **整数** → 直接表示扫荡次数; +2. **小数** → 表示使用当前 AP 的比例; +3. **分数** → 表示使用当前 AP 的分数比例。 + +--- + +## 🔁 多关扫荡 + +多个关卡使用英文逗号(`,`)分隔,按顺序依次执行。 + +**示例:** + +``` +关卡: 9, 10, 11 +次数: 0.5, 3, 1/3 +AP: 999 +``` + +| 关卡 | 计算公式 | 执行次数 | +| :-: | :--------------- | :--- | +| 9 | (999 × 0.5) / 20 | 25 次 | +| 10 | 固定 3 次 | 3 次 | +| 11 | (999 × 1/3) / 20 | 16 次 | + +--- + +✅ *提示:* 执行前请确保 AP 数值与游戏内体力一致,避免扫荡次数异常。 diff --git a/service/dist/docs/zh_CN/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/zh_CN/Internal settings in BlueArchive game (first-use must read).md new file mode 100644 index 000000000..47021e09c --- /dev/null +++ b/service/dist/docs/zh_CN/Internal settings in BlueArchive game (first-use must read).md @@ -0,0 +1,29 @@ + +# ⚙️ 游戏内部设置(首次使用必读) + +--- + +## 🧩 必须设置 + +| 分类 | 项目 | 值 / 说明 | +| :------ | :------ | :------------- | +| 图形设置 | 战斗竖屏文本框 | 关闭(Off) | +| 回忆大厅 | 不可选择角色 | Ako、Aru、Wakamo | +| 语言(国际服) | — | 英语(English) | + +--- + +## 💡 推荐设置(可选) + +| 项目 | 建议值 | +| :----- | :----- | +| 分辨率 | 最高 | +| 帧率 | 60 FPS | +| 加速渲染模式 | 兼容模式 | +| 后处理 | 开启 | +| 抗锯齿 | 开启 | + +--- + +✅ *提示:* +高画质有助于脚本识别稳定,但并非必要条件。 diff --git a/service/dist/docs/zh_CN/Normal Sweeping Scanning Description.md b/service/dist/docs/zh_CN/Normal Sweeping Scanning Description.md new file mode 100644 index 000000000..6389cf14f --- /dev/null +++ b/service/dist/docs/zh_CN/Normal Sweeping Scanning Description.md @@ -0,0 +1,47 @@ + +# 🧹 普通扫荡配置说明 + +每组扫荡配置格式如下: + +``` +region - task-number - sweep-times +``` + +| 项 | 含义 | +| :--- | :------- | +| 区域编号 | 地图或章节代号 | +| 关卡编号 | 区域内的小关编号 | +| 扫荡次数 | 执行次数 | + +--- + +### 🗺️ 可扫荡区域 + +支持 **学院 1 与 5 之后** 的所有地图。 +例如: + +``` +12-1-3, 13-2-2, 14-4-1 +``` + +--- + +### ⚙️ 特殊说明 + +国际服中 `sweep-times` 字段可填写 `max`,表示使用全部体力扫荡。 + +示例: + +``` +15-3, 20-3-max +``` + +含义: + +* 15-3 扫 3 次; +* 20-3 用剩余体力扫荡至上限。 + +--- + +✅ *提示:* +仅当希望自动消耗体力时使用 `max`,否则请手动指定次数。 diff --git a/service/dist/docs/zh_CN/Scheduling Configuration Filling Guide.md b/service/dist/docs/zh_CN/Scheduling Configuration Filling Guide.md new file mode 100644 index 000000000..962b7c8e4 --- /dev/null +++ b/service/dist/docs/zh_CN/Scheduling Configuration Filling Guide.md @@ -0,0 +1,66 @@ + +# 🕒 调度配置填写指南 + +--- + +## ⚙️ 1. 优先级 + +队列中存在多个任务时,**优先级数值越小,越先执行**。 + +--- + +## ⏳ 2. 执行间隔 + +* 整数 `0` 表示每日执行一次; +* 更大的整数代表更长天数间隔。 + +--- + +## 🕐 3. 每日定时执行 + +任务每日固定时间执行(可多时段,以逗号分隔)。 + +格式: + +``` +[[h, m, s]] (UTC 时间) +``` + +示例: + +``` +[[0, 0, 0], [20, 0, 0]] +``` + +表示北京时间(UTC+8)上午 8 点与下午 4 点执行。 + +--- + +## 🚫 4. 禁止执行时间段 + +任务在特定时间段内不会运行。 +格式: + +``` +[[[h1, m1, s1], [h2, m2, s2]]] +``` + +示例: + +``` +[[[0,0,0],[24,0,0]]] +``` + +表示全天禁用。 + +--- + +## 🔁 5. 前置与后置任务 + +* **前置任务:** 在当前任务前执行; +* **后置 + + +任务:** 在当前任务后执行。 + +保证依赖任务顺序正确。 diff --git a/service/dist/docs/zh_CN/Task force attributes required by region.md b/service/dist/docs/zh_CN/Task force attributes required by region.md new file mode 100644 index 000000000..0165fde41 --- /dev/null +++ b/service/dist/docs/zh_CN/Task force attributes required by region.md @@ -0,0 +1,35 @@ + +# 🎯 区域对应属性表 +| 区域 | 属性① | 属性② | +|:----:|:------|:------| +| 25 | 振动 | 贯穿 | +| 24 | 振动 | 爆发 | +| 23 | 爆发 | 贯穿 | +| 22 | 贯穿 | 神秘 | +| 21 | 神秘 | 爆发 | +| 20 | 爆发 | 贯穿 | +| 19 | 贯穿 | 神秘 | +| 18 | 神秘 | 爆发 | +| 17 | 爆发 | 贯穿 | +| 16 | 贯穿 | 神秘 | +| 15 | 神秘 | 神秘 | +| 14 | 爆发 | 神秘 | +| 13 | 贯穿 | 贯穿 | +| 12 | 神秘 | 爆发 | +| 11 | 贯穿 | 神秘 | +| 10 | 爆发 | 神秘 | +| 9 | 爆发 | 贯穿 | +| 8 | 贯穿 | 贯穿 | +| 7 | 爆发 | 爆发 | +| 6 | 贯穿 | 贯穿 | +| 5 | 爆发 | — | +| 4 | 贯穿 | — | +| 3 | 贯穿 | — | +| 2 | 爆发 | — | +| 1 | 爆发 | — | + +--- + +✅ *提示:* +规划作战时请根据敌方弱点选择对应属性队伍。 +双属性关卡建议使用**均衡队伍**以保证整体稳定性。 diff --git a/service/dist/docs/zh_CN/reporting guidelines on issues (important).md b/service/dist/docs/zh_CN/reporting guidelines on issues (important).md new file mode 100644 index 000000000..b3d816ec4 --- /dev/null +++ b/service/dist/docs/zh_CN/reporting guidelines on issues (important).md @@ -0,0 +1,59 @@ + +# 🧭 问题汇报与自检指南 + +在提交问题前,请先按以下清单自检,确保问题可复现、描述清晰,方便他人协助。 + +--- + +## 💡 报告前思考 + +1. **此问题以前是否出现过?** + 可先尝试自行解决(百度、文档)。 + 若无法解决,再进行汇报。 + +2. **问题是否每次运行都会出现?** + 稳定复现有助于判断环境或脚本错误。 + +3. **能否提供足够信息让他人复现?** + 包括日志、截图与配置说明。 + +4. **让报告更清晰、吸引人。** + 例如 QQ 群内配色日志截图更容易吸引帮助。 + +--- + +## 🎨 问题类型与对应汇报要求 + +*(🟡 黄色项为必填)* + +### 🧱 “我卡在某个页面!” + +🟡 **(1)** 分辨率设为 1280×720(MuMu 可按 F9)。 + +(2) 提供 **BAAS 日志截图**。 + +(3) 尝试切换页面判断是否仅在该页卡顿。 + +--- + +### 🧍 “我无法移动!” + +(1) 重复尝试 1~2 次,观察是否每次卡在同一位置。 + +🟡 **(2)** 录制**完整视频**(从启动到卡顿), + +并确保 **模拟器与 BAAS 日志界面** 同屏录制。 + +--- + +### ⚙️ “我配置了 XXX 但没有执行!” 或 “我没配置 XXX 却执行了!” + +(1) 请仔细阅读配置说明,确认填写正确; + +🟡 **(2)** 提供配置截图与程序日志。 + +--- + +✅ *提示:* +完整的报告应能让他人无需猜测即可复现问题。 +附带日志、截图与清晰背景说明可显著提高解决效率。 \ No newline at end of file diff --git a/service/dist/favicon.ico b/service/dist/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7c15af56040a813eb5a165e0c4f8ad519d6b168f GIT binary patch literal 15406 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 Hy9NFODW5{e literal 0 HcmV?d00001 diff --git a/service/dist/fonts/JetBrainsMono.ttf b/service/dist/fonts/JetBrainsMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4c96e79855b725416b59ef700f0e2773c444d716 GIT binary patch literal 189028 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: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

hkA|(TNmE{-ab;u^$V$0 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 literal 0 HcmV?d00001 diff --git a/service/dist/fonts/SourceHanSans-Subset-JP.woff2 b/service/dist/fonts/SourceHanSans-Subset-JP.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..559c806a915acb3711837605b8e071db3ffb479b GIT binary patch literal 258428 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

V8SeCCxoGmPo$%3DwL+X+M!VINh_8V=koza!kb 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

    jyxdYHxItyUlAoP4H-Z{SV{IeoxuK&@iQS1=P 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®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 VIxnfS$Ys^-|1&!V(1pAV006$B8T$YL literal 0 HcmV?d00001 diff --git a/service/dist/fonts/SourceHanSans-Subset-SC.woff2 b/service/dist/fonts/SourceHanSans-Subset-SC.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..36ba3affd94765fdb91479b305aa8e200dcdedb5 GIT binary patch literal 266404 zcmV(TTnxmL4jlJ-jO&^Tj@3g&grR{=}eDo6|(ahvUxPRLSmHu z8*0Y3tbxIK5E2A^_c8zf|Np-#nS^X!Qg%s_Z=ui@0E((IRkuyhNO-_K$P5??(E`Dc z1f|1WIIL$nl8$PY#8BAw+P0Jubd^*|wNWX!sXJ<^ldg6iRZ?AW2R#(?Gt{bhr zsWhf0X)Btv6qz5{2~ozFAtNK-4jIGq=h|QI2QCm-9Th~cmc*;08qBT#zL-5_&{~o< zwG^l@%nW!DE0l&ZBC=|J5z~b{y!8(3_-1BUDY8MdoE;A zIl%H{3|dr)M^@ybh!$oZNC5%=^nauKW;$`K30MNl`zt`;@Biogf6m|gyWH!A7Of~6 zBZw9vSb|t7P)N=RrKw?ctRVppF`#0o1PGMUUMMCBP*c1Gb~@`Y-~aw={r~;C<9^29 zwI|>WO&jgBASNZ2S(UoQ*IqisVn_HCU*cOdP0O7U@WKijYi9OXod4

    ie@<&Z^C& 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 z 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 z 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Μ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 Owqdg1nK=!*{R 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 Ui~j%s00U!2Xw4a;G-cob0J#scFaQ7m literal 0 HcmV?d00001 diff --git a/service/dist/icons/property/currency_icon_gold.webp b/service/dist/icons/property/currency_icon_gold.webp new file mode 100644 index 0000000000000000000000000000000000000000..dcc97f66c9da0fd91009daaebb07735845979a61 GIT binary patch literal 9124 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 literal 0 HcmV?d00001 diff --git a/service/dist/icons/property/item_icon_craftitem_1.webp b/service/dist/icons/property/item_icon_craftitem_1.webp new file mode 100644 index 0000000000000000000000000000000000000000..46aa6b97bf33eb4ca46442f0b443dd01898ebe65 GIT binary patch literal 15208 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
    e$6)JisbLG(PYCCG zG5_movBRhoe|9yT*O4 zaJ`vkv+jq~VW0y(;mfD?4Q4Q<_`HUo}$bTiWbDK9pVi{pqe`Y|2R&w}6Il(CUB zFh%Jop9QbsbgD$Y)+bI+hU(Tg+DCE-#o67A=4bae1yumB zgOiv@*7`}aZM1=hjAIaZvgEtvN>9)K5+`)AGMgPs`4tl&P6g&Ctf7#c2{U7i1(@>z zDr)>1112<-*&zh9bdXk4B&smnx{y2Sr41pwL;)X$#%mg{RsLl1MwlS59+;je`7-R^sKKnVL-jb2>jh48c3bm7+1%u$b034M9E-Cj?&CDh%n#5`dVWC5rv25PTq zjo=P~vTUfw*D&RrJC>6-M#4TLFzPExF)mrgYp!YD_w$n;p zR;PjP2J=)Fn=Cp$MxR$XC*H7W*6hF84%Fe!o<#>bqq~kTxfu`iSomTZnQt{uw$jl6 z3TBz#VOD)zd!?|{_8I%+Y*`YN_ilP-jAoU%>U!?*p^(26MM(8>)dKBK0P5{YnDIER zkO3O8&zd1;%vShVrB`YyA|q)po+{$9PYC+w%b}atXC6{tM{@|uTcka6=nC@~x>AhA zwN@(p5rDI7<;z@|f@?z?H%~N|e>Z0A`IaKtSOY*n*6AnOJLf>}GZ*;+gRn>S@v;M1 z8ERq6MO~JFs_k*Vj3Ti<-+wPYi?gT%td@Bm#nRTJX-ooqvBgeTnJ16U-BMu1O$2E)hrHUI#DX=%u` z6(L3#|J$^U4LoZ0eZoreAo65UMWrqhZXbVq#)MS zx-|)_aaj{h1J|wB2?ccY^dEU*3ZDFMb|d>@_Nsv3L%rT?ic^LBmk&t7TUK z(YYUBT;k21N;KT&cv$EPtA}ZbsP<;*e>l$=>4G`~lSJospsD`IAOc;Kp@Dish*Ceb z2@|c9xAiViZew`gKl4uj761SRc19QFd}-QvZMh~EIn>6VPwZV~K%|N)=?X6xqIaRC iK+*mUg9G?B0zdt4I0Co(ndk@?WIu3HAOEWl0001Wikuw) literal 0 HcmV?d00001 diff --git a/service/dist/icons/property/item_icon_pass.webp b/service/dist/icons/property/item_icon_pass.webp new file mode 100644 index 0000000000000000000000000000000000000000..d38149f91f607b2631fc44f46d47ab8695939c60 GIT binary patch literal 15342 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 M4+gKi000000EL#^o&W#< literal 0 HcmV?d00001 diff --git a/service/dist/icons/regular/ic_warning.svg b/service/dist/icons/regular/ic_warning.svg new file mode 100644 index 000000000..0208d9b76 --- /dev/null +++ b/service/dist/icons/regular/ic_warning.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/service/dist/images/bg-dark.webp b/service/dist/images/bg-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..455c4e90b8462d30b1566135fd6e696f899d91df GIT binary patch literal 251202 zcmV(rK<>X%Nk&FG)dK)mMM6+kP&gni)dK*qOcb2~Du4vmPn)`sw^WBO6hphQ3#IXJDCx$Z&pEnL-eOp~m>lcgq*OOCF?VVuMTLaTR+P-ak$A}N+iikkB>w6DbJqX<-(TKpJmEk0diwtd>Jk0d{?}bE_}~7&|NYg!bie=mP5R3JfdA*| z%jyCD|J&E1f5?Azf75#r`JeS)_I#V{ul$eh@5O)efA;yn_doT2`Fb(@+w*Vq|H^x6 z|1p$N{SSV({@?YV@w|9CPx`;LKkEI&eiQq*{g3lM z>i=tgIzKD_cly6se~kZ2|Ev8!`mfusupjL|+`r)ej{K$ioBs!m$K?O;{^tAwe?|Wl z|HJ)9`%j3^^uPRny#I^)$?u!%um1n;z6C#{|Aha^{$KrXzeoT7{yz&pcz^%@?*ISu z5&NP4|NeOVunX;I2&Wpgg|5>Doq5_Qo5fEWUF%LnFxj{pteH%NxXzaA$|4!{DekDU zk5hPwtq89Sg1u3JsJot{5U@ zFbl%_xu5RyUQFoU8=s*T%u|6$(LuiZp>-tD9VH$ZcP)uI5PM(l#;`-T0vO0!= z-fxK%)}*&yBugNJ2YE-j#;6^zQs>5L+D7H-xCd;d;;40_ITaa?I*Hv$*A#X?B4kkI zm-$!xOC6HC-vN^RY-YVxa&`4gh#fEJ3L4%##|TrjcIdOcl%~yKv7 z(`&@a8z(?i62RVNU+3Rh!!9s>>YNT>`4h$sz5yW6>o*vT{6le>f$+^Bl&P)LqIN9q znGqFG4rHKdfrMu!#TbgKT(_%Z?%{FGKu6O|n3#^tG3vHN|B`*C-X$0CbTmUEn)$yI zFiN@prJK}|1d95+|3x%xAlmYfT_16GT4q_Uew|0HAXFc<*@H# z)ARFFqlNovOG9va@Yt~dA$5ywmsW(dlDy2dV`ty4B3~VfLvy-6tj(}S{H5HJ1-G+; zy+kSXNtdp&=5GY{gz|Eq@9_J0gPzBLT*?7e1-@ZH9a~U@NQbe#B|<#d(@8p&eD70E zbEUujsxYFG;I^s5nbZHBBLWY;g~^tx9oUzK)3v^M0Hq~D5$)Ofa5Q-dU9 zOIZw2r6ZSLX@OV$(dtzK+u*pmis&!3@*QbqEFz1<(9nC=pS)I;Ww*8Nn<~B1WfE=8 z!fb=`hL@3&jc}<^tw*5#SMHsod7X)-&oC?~^Hw3o$DhC*K2lRzMF+EKu)Ef@6^TyV zGUI~BmkVjdoH!>)vAFwWAq!}dTrqG5n1rpVrM)_j4xqLPj=k2-g=Rp8okQ^1fJpoL z7=apfZa@+|@upv1fkb#spLi!S6<8+#TFO&5c0-@>8sq=BztYtFR@kVCX85Y{c#c?9 z;%oJkp5iH0Pl_TrykO)VkZsb~yxE@v-)#vftqC!yHrIRytWl`xs1y-B5-y+sc)$nj z7SuF^vl43dkfoAozpPBR9wYHyKTF8_E6H6ul&(C~^VNw3J~s%AYzkm>z=kXPDd@1}l|pVoJT_ecGbPPq^|gw` zvLHx>gJBh@TY)sKA=|u=wZ9JDtf?cP!07;IscF3s=u@Ulp-%Dtz;cicLt{@qVcdaN zEKOVXBeS@8UfvgzPFu_pc{P({T>TOOZEC%0C4mKVr~-pAOu6QT1lKi_rS=-L$uY)r zW#9IKOY@ORQbjIMFD$$b>=BpToNg{}Z#v z8th8Bb^eEZIgk9k#Aq%7zyHXM;bU-LjDM6gSbqSX;@xtw${;+W2ZYTm!=nX&o28p$ z|MPW<<^W#w=K8AXw1F?*9nLMxuRGyZzb9U8>LA*~v|*ad%tuflFCZ+_UniQJ?{!I= z;Vl_iz+yt#!-lTDyvYe6XA6{@_}Ju~>koe%Ri7p6fLFq2+*k^$O{KNhu~Tq*+!|=UHES5FXMj zeR&g7r{b+`^6_^S+ayv1oA!If79J9z6j-Y6VNJz&ylB&ZS;Z-biQczd8f>y@fy5#@ zs&U#?KZ|*Bs2RWJbI(p7nK~sma2F`^6y|1$OB~GWhdOSUJRadsDEV46e2(!y59C^I zII{}{P9>hd9G<#esepY!k14-O>xXosJKX9|zhn1ryyh=Q*A*ABiozSms7Sdhksn?Dd z1@nq6TqJB>Q&66i#*w)hcz7W$Q%O|yA&6;bV^`W0AFEF;9ds6Y2-YSQ0bt7!J$rew z5511NV!32&x*iMZqyaHi%x8DW|^jX$mBph>D}EbrH}jqS#1-`treR8?;^2b%EP_B)F1 z)c)V&EZM~eE5P5GKIW+3pkkYVd3t`i$5-F)(2e0oQWSOiR4lJaoln}F?wWt>jvk8j z*0aP`R@Ck321iH-s(OkL0IB(3Zj4LdVMR~C1GTuzUh0;AU4o#PP#-|vGD0g{UZsf@ z*>!|I8l62sw%?OHlncl;cH}n_2fd;?$CZ`gkN>rl>*?s+E-AVUn$eFKx~z`yb}FIm&fJogK2-wY zOMRX4Bqb8Q%hhqF52N5=GC<{dsJDw4eqPhNzmp^Dw*bxP7!QO<W@QYdyw|{kO!4FMerILzj(F>P2_%DxWChSNdx+R?9AE_l!|9wXdU}q^J z1FV=wK&Oi^zt!B)ZcR|9g1r`(e*Op6l2iSuLAH3#E0#X<&3O|Z&1TQg->K8JZ#dZy zUULtgSg~1{#XUR*J~kT+HA~)F=sFvZhTKXzF*^TNOl0{b zAQ9wwvf&)7yUT;5F6pc%QHYHj?y=Dlt^6!CP{!ob#iWs#Qu7?e+3GKnzjLJjCvGl( zA>zY?RYgwMjRK=H5I3JDd9X69&~YA!cCaQ=3a}daHGX;JJ}J^5wjTRMTUo80Ia11N zyQBy`k1|)Q;qbxQQ)XV>!AQ}naDM8qhbwkv<}=>Bc@tD924x$3Fcwr8 zbb33z-uz?ATI%s!3z=Rxb+c|@chcEso?$r-K`KD`eWZ|fj-YZ=zVy73C zsx#d2L3VY{FwMVA2!};bq55Wzb8Rnlv=aWOj9_wqaHSBgOogBjg3u?YFZc;W$qVLn zN2o<8`U6=ORf(s-{Z;7Q>d0f15fB?4JP~$Ouj|mq%|!ZPF#0?(6@8%?Y`qr8nDYt{ z`+ncI{#|D#3Y+;kokn=4b-^R#oz(#VxREUdiQ>o|eiOkf3n2NDXXUR#1!X?QH`^Jw zl#Sap_LSy5NW~Z?9}=SV(k-^xg3{}51_y$6k2vdlw}j|heWnp_R%#l7!w4CLOnG@; zbl>L^*fSb^aD>Sw&R)cy=%3OeJ*OLuoUG@!GLEyOLKhdsZv7-YJle`yDN4CuUh{r~ z{LDu2snGM}Z2*=)n8JVZ!P;NS4pIt&_4mk?=*WgO4~6mWjz3q`bA(w%p+`5 z)(gC0Z2xJDa@;ry8zVmOu&R3A}WC27eCA zH?nvm-W&p)g;zr?)j#p~@8R!#7yU8=)9L}zOp6EeKIeG0xv_aZb&ZVrawoQO_hO3T zZ|kzC)-znb=I4@je{1>TmD9MLKl51%qKD~PpMDvfwMMv5l_t){dFpb3MX0L)0ROp* zbB>cleJQ7=VP3CnAC^1$u(6{f0_Cv?QwmtCNiGfFkMmm>Es^6i6jh!Io%Dna8wfXZ zsyaG*-IgO1ImAH9duedhnI~ z9r3=z8HtSU3-a2Qc~F#1-H#k$w)HPnv9S+4c!5(8LVKN=Q(*Zt1%p2laMBjHRmmupB0K}{B{mb! zGp~XaH)mYS&V4}T(rnMZwp<&qYiF8+6V}) zx~4)l<@IRToMc;3e0Dtq6-An`wVL1UM|*up9v|Pp@|KG_rUhVSxE*<9w7q3V2m+%y zFlj$*62B=Pz1d&3tNjungV;{}KA3mVPuxD5WrN=UsGs4#MXBZ$x`RTJGYT)n0hk~( z(+MTX7ob8*UhkG;Wl6!h)+S}2uPz%B@}pPLK(wf`nEEa`$8!sG2CQc|N;y@u0w?GX zffCY>T_~x(sIiJvM<2YSa+|tGQnwjHW>YfJC@eQ!H^?V4Q_0I(y#{E&VH?!!Z6F0# z8zJ4DP*|b#=W3gC2#)bWdiF^PjuN2bqJLZnGWqnf$JQ`3-CzkXJ;7aVtE(ZZA63%T zrBn=JdQ^X(7`*J3!aMKW==-l+iby!gIM7rvS>%ANJ$^3AH5#gN&G( zdgaK#j0deHkcpZr7WB>Du7$JsPh}KgU%g^YM^E^?ZmL|&GJo+`v;vEZm%o4{PGW7v z^VVkZ|A=V`OW{f?4R-FkfXt@l0eS~7M7@qS6ku^-iLIYQz6h>;kVyFKgoS2%kNn4u zg%a*^ZS!%%_WYG_%~B=BxCWwxhkF`GAF$GwH0*yQa+&O0?BuTpi@zuy3umiy#lCJT z^u#keHrg(0dKU{iJor9_q=nlM8URu7pMur;&NW=~N17B-7e4t0qTr!eF+TqoObsTo zFCTirL}Q-9a83A8neol_H9-Ku=zEJEPVl=i>0i;Ko~wz}-8M-sK!5yeUR9AS^St@q$8K@G#dWMDFRlODBKvV+^-ilmB~jX-yUzC`BueRbYi!T{ z&1Y7D`F(IZ^>BQ?f6<%6KR>nb^~CTI)^PM>@0`VO_R&AItq(4s&Z6!zM%Ak`ob1eQQ_Ju6|Z zQ=7m-pFhDZHu@CLFXrEPn5NBv9NJy-U$NG=1Q>_D+;%Jc>3cb$HkgzfbJzf{ew5+w zsl0vKH0h`Y>~c|Qio5bNsVR-V0YW-Vj5dQ$19h!a3zXPJo1$UW-AxmCQ?fdDc{PKM zOkH&~7-9*oy-wwM4@!htdXlVPOPX7sz~J4%Cy<5GI@>b_@De3d!s_PNb{YP!Fo zEX;0BcfmVl}fEgcR87orubDNQ?p1@iEP(4;{SRp+wPZjim^j*y>7! zs+9fYglRnQHr{RDhh>f+nQeQ3C+8V8zPDEX(l$R&RC}>ln&idWFYizh%k_~K&1ke* zVGtXgz=CfNWB?XDnX2Mj8U~Ae0(PQbOXiJIM$k|4^VRW3mEt3!xqu&FgT;;Tj&NZj z#WZuDmT-W9)Eg8clQik`9b~Aw25b^~0cPQpC~Zr#H98@1vX_-@7oyZ=%?ChZqit29 zFjAE6>1lsvr8iaHg*tt7_lJDGwg%`7Tb>JM6jLA?K6XklZ-kk_hpyKIP6@nJzGonwSks`EW+ z?)o2{>2Dl%WS3~(dtP8S|HawbnXhA^Fa2-TTK=9|t;3ZhfY@?W==`WQbg6I5{Xuuo z7E>zinCFhWmTg>`QMJ(C(v@K91o(6gkvW>^Nn5MdkF4~Z7Ezz{)@6Q`DrUUJE7=K( zC|P=gI9GD7PCw$-9*P7^Zcv}848pv4zlOuMp^jC}X8hJU;wiKr`C=^*l@kN+#luc| z@unL^`?}%IBW|b2Lh2?h79buIM;kz!KI!;2Aw);Soy+Q_JSKf%gARZCzsZ)1WE+XQ z;;&@Fps-2yum*|D-Zk zZ75PWLYPgGboqhQK*`Jm#POhRNd;bt`K3PEa*=EwaW;p6n1_}o0$BiWI>B+jZREjr zdg0|;Vp~_ZI7L60pmsNA&Og|IzF~U2%GN8O*e^_Y0~DG1Pb~QI@hfeV3ogAik?>U| zG&C0an0=NfFueRHg$UaX;W7A&>31}XAT#0wxf~O^29S#p?VsudWIQo0F&<#@|HzW% z^dBYQMVGldFjpNf>ey3Hsr&hxd;X9Uu%4KI_v)0*H!;00Avjg<*Y_c-#@VunEK&fU z=R%HHydYuh83wRrrOQXbt~ z3$W}4%4|4E@c_PEz>OgY4K!;Fup~zULj_8;f4HdNc)U!6hv$kGM`iv7sorBj53S_Q znKg0Y-;D!1k9u24v|o^RQI2N2`E}&wm=KSOM%Qh->9H9{kfC9{XLGfrO*Lp;1#31? zoZKc655e*4H#*7rPEGzs)BpPz>b7;q#{mSy^xB;bJ|Xuf_BxVS!Q8|m^!P~^nXvP+ zEYjS1)hY0nV=P*0X?_+n29&W(q6&D?PFhI}>Mr6$cJK}SlS@t`C030Op^g0i6NYs;bv^Wi=7G*LzX5=lyY|r=GE5FVt0|9{Li18#(U>1CE3q$ zk!!SZSu3)N)0;Mv+IX0}46*3Cd=y&r^>Th>q)^yK@=tnMU`}|e3GMKoE>F`F<4#Pg zZIzg<$|xpE2NS(J>;ptKjU6)Qtj5-CdX@fz>882a2agy0jcD1B_o95ifx{ab2tDGT znmBk5UKk#(%R;9g{mOjQj)bb7j69!+D&=>W6?KfkhgG^MpC@5zsUtmxnENknz~?;) za@?@d*Ja+T;{9->E-nFc^8sNz zW$xAD1B5D8wZ&d`hrZQ?3ox;31DDxz4i*64SKjvBQO?g- z0pN^FjXr0E^Y;Tf#*9mk2X*0c@dl%QXT-oWi(v(Je zVwP`!O(o~$Q&!SLyHd{%uJjIq)+8`?YZ=Pcayu0GCvjr@gd8?{pks91bn*~nuR{Fi z3Tws)vUk$X-LQ@vYyPk8JMQ1sx^T1jHveH(Xn>JtB$o_XdYsU}9p^|ndxj! zjokIk)GnzwHdHNqi+d-l0>JBLJu6cRuMhEtQkF>ow#TuP=GUxmPzztCY;4oD;4&lb#Ac<~Z~mdB ztP0h-HsRf?O{6neq)QPNB&lW960P~&!btS`-^_bo zC4$}|*U~v98mE(d<~}#Yy-?^V58&q}SuR7kd0fSRfh{G`*#AfMxwl=O>7_}VK8KL+ zkJaE4G8B6VBraXA*4zT_dnMP)ugAWd2o*${;HB{bA^Anri1sB3Dukbb`PxF??}uJa1#;`&|M1Tq}*1m7mDg-Ov{xtU8Xs^o)?>xC0a=+iRzeeuL0 z(`#DuY%_lnKZxhUAtVJm7_ACdb1x#78n6uab@ZvDpUQOO$!sDkwD?|um;!o*)MDj! zN0tg=hEu3x-GQbZ+jtBd1EegWaHuH}7^trnb?h)F8TkilFEZe>6I_hSQ=!Meno%WBH~ytV6{$W;Bf(etb!kG*G{%Mluih>*LPZs+MpIw zg+$}f!Ju4!4TS;chqxFH=U09;4UN*77gDnQP-W|a!1AwNuhC1{|Lm)jM~D zk4#+|QI88ZU9GdVV~ZNNVwSCY={VDOlNvoQxUc%|^XBR<;xuWu1sAh!1m41@K11u+ znTpFy^+m{Nq{?#85^d9$qiAwKm$AP>^EX=ie6a!G;z~ME$d+ZSgP|X&fSw|lfR??< znnd=xW-i#mY|mw*mkuj2Emxi=;(|P#-O{%Th_Mu*qa>@R8qiGR#Qhq=QowNjIm)_5 zarJ^O*VVRlw&mgJ1K_LC+2LIGFA@Oi#)aJu=MfMzWr1O+L(_VUEbH?O*T*FCmKEe_ zI)~0u+YsJ>?1r0qP5fS3dgRh>uP#c9EzwZGQe1ZB1T6&g$EsMg!tyD^AVxJ~umkCmc(4A!3d6ps2}LwsF{IypI56}PboCirfU%S#@0yE4%!dMM9kHJcO(t7VBwSUnM7vMXoS5##?#yej&dy$a*e?zHx=jv+tOnXaVP+puyQNHkouUU=u}XC>hWVeukYHA%Vt zK*NDhvpY6MbDLT!NH~Y~YnOsmc{#n6kAWvw-=N|jog4uMJk>rD^vkm@Ah_tL*91?9 z7(Bq$pLaKd@CO-{mo9J>a-dMB1BwYjh1z`wY&y5>E++A|TLa6=3c|%YuXg`GwIHHP zYb0^|c^F8%+$kx^l9U5DZA4*?LJCsUW3#oMceiS{Jwy1eRYJ+rEIbDv(!3K z&#y0eT|k)-S8BR()p{2>SDwrF7<{|WZjm)Ac|45}Rk*7>`hRZRP_$>OUzwnTQqZMN z_!WyS!P=tLq{(Rz#p3* z-`)JBLckk$r)Aj#HbR_>DBUGaoT+!NyC~S?wTNSs*bLQ>WXFNf6|EF&e&s4#MwKyz zuCWdcg@_(d$HcgqF~cM|@SxqrDefuvqE+d5SMCTQMt`j@{2w~z`YA}rLRAyq%tsKM zhoC;iX26inJA0$PNK3vd^^EET?eJ7}pNnw%gStN9c+40%Ys3k=eGKuq>)CIcYnf3B zOOw~@FzXI&_0udIFs^reJAI35m$r_#=Dg>#ptQ8Y zn|{MZL4$enb@CQB)2a_oK6a_TnkT0qqtepgO@lZzh{V85e~l~g3l%k}98L?Z#r+r(Oen3P zm8k0C=40%E^oL08JZ>r&%|6dN9D?mVj`RM92sh+v&rB|LT8^wl8>Bdoy!tuq4ETLx z)Mf^a386`|oQe%U<%W2=8c0DJCP5?jq@kvt%oq)A_RN&v|{!Z}PTuiza>O_}}J?)y^}Bx0PC?vRqC0Imf)bM0j}0ne#ZcH7QJ{%e-RGWR4Y2u@X8dDPUZr zSj*B)kb(s)<4^KZnee^Vz^4ZBw?Y9v+AxMz(T%5{-mBdTBN(l^U&s7jJYZf$R_BqC zlV;;lh0Ch_dvmJ9xj1!5)GxTP1V4AS%?p##N2u7X&?)_8*_2ac?aT3W5~nPA{oe_L z;GzQoJw%)xE{FC!p*$6|Z%JfJ>Rl3*0v|!6zq7U&`{@3)#&){7AGUPH6woS5g({f6 zua)4G1%6r>ktwicslg8S^o`Sa;=v9ct6{Ho+OO4j!pF<>q`>1UXqd zyV}=#tV;2Ysq61gEX>MZpH~bKrvPuE->2BEk!AZZ(b4(t43_CkKSQx)OhRmQN^;1+ z0OmcLrJNbqrC?415SL-$ag&H0g3#OdKbdPsQXnp6xPYORU`{%kLoUJXrf%?0 z?>Z5+#Icbasz+Nw%1=2`oD3#E4uyT$Rj#KiZP60j_BByFyXdq44k))pU`kwdJMz*8| zh@;_q67~Zx*w}MQ$Vlcq3DaVMN-!ln)2MFnI$Vi=L-&cgENj6!#fJNJa-B0Vau9vo zkN=nH;cq|Dp81FJ`la)1`~78M6y9(XGWXs&91!{wjY6d`h-uf2&+bctSN(4R&qCKqx*G=V=bYX^T zQpgu_TS{K&LdqWG%d;`N50m+e;jdj_ALXYMVs`tF3;9DsAU~6;-AgN@V``tT>B1Mr zFe}~|m|IL7Lf;cL^?UYTn|@fCG?R0eDA`Dgy`wP|bUNRFOMUszqrs3`JEz*g%Ls%WPEwlCH-03V#w1YP zz6iKh;6Oj4%aii%=|r+(j(F8M9`Vx&T-LDHcDc%%8rNv)31xWtT-|(BAL*W_GKH0z zr4o1MOVi_&;wS$Lr-OWIrQ7C9XtJIe2$Rm6I%cy_z1Yz0j8xB19P0M~>X?)fa>Yk1FYz(fC`Ytsxawr^c_UZBr zC14$1)3}MI!H+;3qhdaeb?`@yYk}-jYPhn&BeStVG6t**dy;D^$p#Cx3n^?6sR;Y< zJ7-PR$3S8iiDaWVW-6Mehz|b81T_s2gVDon!{ytA*|35@TZtttNDfYsAxs-7tqK#t zYE3j748)bS_A$QVc)pUT8YgGER0}5L5aA)RwME#nX5)3_UU|>bf5p;*|5L;|B?9j`Mt|vSMvi1 z5-;mV`TXJAG)SdO8(DpySF=Z38iMVkwD8x{tYH)NKp~I-4gD6xafilFQ6KEvb<@$Z zGg97gkQw_G^evFy{a1-q3)q8fz(at%u|_PoT(zi7f!hz9_)XUvbWzZoVaHr}geuiTNiQ7He{W z6m-Yhaj2HdVmdB${vS($HqodmGdcf0&q!Qq%ns-f=zr=>=_evwRdWRb1V7|ZAJ<;U z*gQ){KJ;{ni!anma<4XAKM+CB(npy;Z(!OW$h`(`6Sc#1(6tfnM6h5RnpYET%A`ub za(pE^H7fKUh6WK=o0|EF)RPdfK--2%$*4C*u}k!$LvYpZC6FEacJ*aNBi-!YA8(9I zWIBlZSM<>=$Wm#%O*bz7n{p9>GR{dK4esuiqpOrP6;7?+bXh6uE2~7fFJv7=UCn@% z{~{e~a6>#C>!jQRMtD_h(MB7jN$Hu?D%(o}os9qQ4Z?dZu}j(*xb;~gFWk4$QC z{nKU98z7&kg%nTUE}C0*Xf)(G1cN?YP9Kjff@wum6Zx#--6$xc>WiEK#l7^ z5LdLe_qLxBeaSid5!V zO?66=)61hV4%>-R+Aw!hs|7h?-d>p2SOUK9#Z>dJL5%YamayTsoC#ft>Ij9{d$lwRHr7ljLp4Q2p*u0Qem?P`vwD5-*D}E7B6aQ_(|5_lW zBHA&uA4~lyAbZ>rz@uSiNO3~C0wg+Adzbjuv*A>hFfEbVnsShb=(d*%`I>UVK1A@0&^|#k{p%aZ( z@x+$Z$|QHzjWJGQTK>S@SRP*^zNh3WmT6~RN2D?{lE!orM3d;2=9Clid-mlBsvIv_ zP-xzRLgE$0@{*_P3_|@4Y!RLEc3ERE^s?>v*t%gaS?;M&q}Qe8Ft$x9<5c!crkFTT zEp52-YZPo_r4JFrY5zi_GqwTEyhnd8IW=tg#R*OeSt_PeJ&LC$F-3MSq{{82BZiek z2sZ@w@aT>ND_LO+i_$j5<~-leH?mUqid?7z!_vnxaAp31onAlTs@vFrwYdN zK5(S8o2Y7^EC8;|nG;9yhP7>m^d<{rsvPo~v6lMMF9?RVm~ zCYaPe93*N(xlfr!pp{gJb&D3FYaIyVOEU*@MY2J}=b5cj|J~O8Z-T>76h8Pdf!wjG z#?SVU7x|Hvds`}P?s&7lSCT2hv`C*FqDjhFt4uyYyYL2CzG;+qAlnDLiMbDu7bL(N z-EY*QniVvOZu`V%i!12xk$RkBU?5uFK-;kUZa+qJG8*2|kF>nj7Ux&Af6tJUtqEv>x$bByTZjR2=u;lusZb~Ms@9vo>KJT8gSAn5md zD`>XNgAeTQ(M|X!*mtd@^=hQUB!&uKjxeH4Ytr+_3s$J8V;ZoL351HC-Hl=Xt_uWnRS&UJKU;Xz z-&yr2ZuH?|jE`tl^$s#UWmC!!h_cuRhHgz(fq{1^fDnqA5r6#TAnH`Tr4RmuQNmrO znimI8WS%4aQS1+8DnI=@eUPxIKkhvL0Zx9@til+SGS=*xYB(|<3^QAomO&x|MHKEw z;-tL>@)l#cZT|atwOAu5{)*MZSXaN@ie{x5*I%z}B8w;?Tpl2WbIPKg{{*ZyO{>mL zi1)~?to+Ci+Uw^`mup$J=x>fxfHv z$|6G?4el1#*Us6l=DWlRF5KHTPPaxGIr28`m8qOif4u8`?Rr)q^~*KAP+SWS{0lEg z<%TV_ZELP04?#G!ZTi;5x-x+{Z|@fTHDgnB7<84LtSaS&&Bq4*&-? z#>eVqu^4|DKHK1DXYl^yQDI^=2fn8?~`Me7C1GNiw_2%*#=VdxGDQj=E(PX<>= z@7lOsxR%qW8=VySmT9XhVwPqU3*({~{Dn*w(h#h9 z6ZvYE_W{GOEUMK`7lOv3Rtr*SOFK<%#SwLyP5wyLJq&+LRy~)>u`(<(@LofioO&d+ z7P!O+jfB(KNw3%)od~BFWgiSQ8g*j3GYnqCEHO$)4|eI@AzfU`xD$k z3ttq)1CVTdOY8GxMRQ5F8&ZjZ^WDCbAVs#1828rwd6xf=+F_%`$AWCCmbPxz>f%}S z{@h_^XNYlfl6yuJro>aHZ@kwP`vyc-6pD2FM0UQQu)p2H!ptionjB^$^Q`gPIzRG$cAYJp@=+Hu9QRR1|(ddzc0V|?YtZuA^zm1|G9FN&EbQQ zAkZEzi}ku|C0NNpR4(^WF+QCpj(sU;(QP7>n1_XLnauuOGBejuu7IcqLfb2B=ko^m zzm@NbZ;@}fZX*Azc}oC+hc<=3U+J3)#Z42OnE1bZo`2)}h^y$kT7K*Zt=}pCJ72;_t@hmheG{cgcSTPFo5TCdL{r z7>`QZ3_XG~ha)wHl@C1>T_FwlnDtEy%-{xMA<{jb(@kqj`nR61MdNU-sQnFx!reR~B44dzx5+ zBK@~)mhP?vf3Rbi&jh#?r;hH_Uwv20kYxJOZzIR(J7L}wq!_HD9 zVTPiVypnt;OHmAN$q2ov)TWOc0*1*hC!q!JqpYHu2>7Q!*pyB`>S5C$RYBW#q=ADNH)i3V0J5>@-$pi(4X z0|P=Q(R#0rm79xmBtOKg;$V4o?2XpNOn|N5Y`03D^wVRf{*AapBXogjDSTK>CQINZCgxo}u`^4B$D?{# zErOiNi?k!4o_SUeqNRM&tGelA-f0LUYf8bXxpq-wgwTRR!Y-fJenzOs*Pxg?_nyd5 z``u1|y|MsNtyv*TaG6p%gaD_opeSpZL*!>3{@DEweKCtpolP>!`3^r3{)t*Rn0?6cXpa< z=5qYV7~$}w5iJ|Wukh$5BMUV??Yfq_igWCsL#ReYj-g2+g3LvKwNLl|@X6G_^TYkf zrFGF~80z@>y2eHHam`=&rNoj`|ABVT!3mzxu(=+A{-yz>28uF9d3 zLu}wM6`OpAv%Wp|USpgG((&8IB*0a2`~9)Ze8JN2jY%)Zdw0bPuaG*$l)aP2&6-P2 zil?JcDC9@nz3r1Jo1kftq3pSwLg&rtEt%2-jK|{!fq3dP63)z}+c3Eh^-TTy?ygOq z>Dx6M#)yQ)%;lH?bgKl>VtLv>Vr?#R`q%pX`h_9U=_}-+m`%?Cv zZe!8HZ}<;lGWPAO4$r`mr=ZxB%{!cNkwA z{g&+DP zt|CovipJ;;c6y3OEue&tiA%T<-fy#|JgD4nn#61k7TvI>nW*8-M2@&)Sl)Io|Gw8J z?!=bqp%UC)_>9cBJp4bx`Ok)Y&;t(GUb-9iZZvFZ5A(9&aS@B371k|zq;NhWM@TjJ zONOzI@imVRYDd7XgBS(6ii;kzCCHk6#rP-OLHa&DSBl=qL6y=l0Gr59Fr)!BUpzbi z{|{b+k+d0g+g%<}8~V6)Xyq1A!YEB?h|z&TyPb*FjTcZ*N>5h zjwuHReXxtczq2+mJL0ncuDl#yPI!b|R0V%#pmgCKhn)bd>NHE;NZjESmEZr2$?dD) zajz1#h&1RYx*$Y2#tN-TSX;f@Ft#+#}$^}d@l7YCBhH((uon1x) z9|!b|gGYs`VO6<`5h0lW9;YWi+70vH>zVcw+uQJ1F}YU!^jVufU&5v(sM$l=43Qs? zjGJ#}7fk%#(-;^HqGcvl3V>H=Vf&8BD%mwX+;iGzNH(=enA?vLJ>FoIR7zfY)Q|B* z5$=FovpoRCj(9EF_Dk>zvs{hGHuyy4CPNYupA|K0W-m8OQc3_%8s{ZboGxOidt?D) z{a{ii`_8^$(w--?%8`{buMVEvnORm>KCJ#iR*n2o{_>odaDYcp5Fgh0C1ITUn?>Mq zqjz!py!%M~5a5R!#2PfEGj)xX&Q_0L{L!m=G-t53ZlU*K`o3MSGBEoH5=-IA1<*e* z;FN&`@aghw_Bb)G{}rj6_YAtwQ=V$c*{e_Ld|E#iGm#Vp^j1gbbqe&?gqh4iG(7t- z&CexYj?Xt=AqX+L!~t`76n*sKImBSj8! zv(>Abv0MMqB@i26bd3bdH@v1$kdfPfU8fqRn~^MN0`z5gm#{+eHX3!RF*T#16wm+l z(QlmQi9LR#D)9=ccvNn;GNTHgp;Pzv#**MF&%B2p_hvyGU(oeVaQ6pi1VF{H_@XhS>?xB{Ya>3`kY2lpIev$pvfY-= zofLVCnmwd#h*kyZVV2aWAt8{Ua4~n$Y}v+Aj2DGz1c0!6I=CRy_ef zdr7iGb;HKj!lVZWps??Hr!ntKFNy z!;`>J_7};2#}jDZ8Yy>W5l~u?-@YgH>x#&Lr}L~21|$~+I8@r^DDNl8`PcESQP+p; zkK&G=cjp^Fkq1i5@p)4d(0y-MoyLBQE4pLb*TyvKjj>QVG?;ARmb~O;Tum$~8>`Sb z+!lPg#ei_H6ngJxl#ZN3g)7Xl`fm^arEoZx6%`iEzdf_y_dO3Z3e=vbspZ*DcOkCC zO0w{qhFE$uw^<8yJL53002=^~4o|mw!}-H7PE*yHoj~L$F)kA`({QVQ$iYEAfd8E? zj1eSP`nMgP=*7?_Gu_WB3SjS0aD8$Gl2ty`nfq4*mfkC>ZqgwLw~Jr_W@WtWenyJi zCGklSYqf~7;-ihj5%g9nd|SUfO|$ScO=SK> zK~g;3A0O-c-SSnUO%MI^PAAa!I;7I;SXhJ>*wZXn?coj*ebJ){N)5%a@P>IIbNETg zgjwEC;V2Ehghu_JR1o_6$pst__SFjwc}6=APCwCB`gdbyGKihm<$fah2RQ$WDz#eOyU;?>r8DQerESA)Q5uJkd{eRx z=?apu2ruXovwEcX{4b6BcA79NB`Jp~uCO#zy=3}>x=oTET^LBJaWe95J_sE4a0;w{ zA~0?qW~C5rzf@&Auev%*5^K?&--WzsCeN*q%UpN+O%16Wed@6sRW7Je!MBr^dE?M$ zN+A8?n5hDqL$>Xe8|p)uSY+UI@3bkeTghal-j6thjEmal$NgYbYyW7OR^vF>$n6mT zds(o0Lb;ZzW)OVhFi}D*mrx{M^G0U|v^St~2P-}%ReT$xfB)WcP|K87xaqlw&c%!y zsG?l98G0T+%iOS6m_^*!%5s3=4*JoHZ~w_651kcLDA8Hl|F3XAfsk-2au4zr`0gQt zo9FlkOBqJr2~W=Y-Y}%AANdY`;lzcrB66Fb#ZRF?c1TeB`1Dx05DgN+D~$v- z)85V3>txx94MP`%3`b&A`fCO~xPK(0LtE`7r#kuOX$kP$UfwP{6UdC6ipradJe8PY zwW35SY&G?Ody)V-7&2j}n37e#&+fi_%kHGPAn5^66Ay%-1Y0sX?f3K;6{hJ5kY!qo zww6l2!>G3j+o`uH!m(d+(t$T>eJ|8uZ!!nj;CD#)$)z6W((qm?6YenupeZ{!V!d2c z(sj+#X7y;SUUTd*M@DqsrvfeJ2xqk{fRw6~TmLnBR4(7N;GhAeq_yLot1NkvGntZa z^HV|Qov2DX!a#t2r($1>E7tXh{3{8I)#z^nFe4TeMJ@-0D_83(n}Wv#%2`fd znP=|!>y5GE3hxe7->;cQa+fG6fE=zzk=pQe2jWqpbdCIyY04XjF?)p96(1CAA=niNMyfAMT#lazehjqbSE9!(s8 z12gnh{Hlc4v%0ngZfxV}fpf4e?7rAZ0BR!VrqA5Q!nHJuEd5+0wo-1apXTfmgGH}!4%h?KT-3QW7dNER~NdEFl zJ?zmImpUA`)GifzsS6R0h63XPHXw$l&w+Y)wHibYllS~ryPeYfrfab;FixGSohK?- zx@BLwYs|LoI5R~9qp^WxZ+Y(0yu`G0hgg`txu4-_GH zp55K)n@m${eBDV7W1JsyxPDodpl>SuMUa@LKa9bwm7tf80(RFi_YTNW)EwvKE1VAfBbn640l!|D{YHMG@o=(b!Ccdod@zvKY)Wmp%<~82X*U(*;USdOizr|<{Hjzv zC@VFkVJ}VowmYfZxzHh7>oZhWZE>JX?Sm0RDgXcE=jgB6RTjS87#vduAeRqHObwfm zf#sP;O-aq0tK2D@QBz+_$N?^Aa@1mx0@ic5MY7Iv454qmN^X~7&Ay2~nbW%I2t6LS z;N-5}sx@4oJKb)|t$iC)cG%*<`SxsoPbqRlg4!>alJYD&IcW_?#jRW|E>qW!=O2X% z&DyUhWomLF!uX#MLpBUd50AVJLt+p@)~q`%gG{t&p=@Drlj z&}|%L=XKE5%#8h{5y?wvyz&$a2&1s46b&)?l5$|(&9A#h^tdU=W;{L@xvu{V22`nh z*f+d=++`C`WD67PIL+I60?{wp%?@-!y3-dytZGC#5I?b)uMLZ7yp!|cf5j1J-`*|| zP}RqL4NIRxs78OQRatOunbz@IQOnR@D3Sufypgnij2)Cz+tQ6W(#YJiA3|%v4QVIN z+|_f<48NQ1cgbG@jl5Ji(zT9qpdu^m?h5&{>`jQ}E zzI)i=woJ;x{p6XX>k$l8eNspstGe*|3<=Sir>ea@HosU=NHLeZV%`drFrD*_BwM@O z=}qvR#RC)3f3rD(Iju;oJ!CBFMpH)0f06Awsf{sKfLReVv|Gw~eDUIBnKiTTfm$Gi z#i%nLX#c5gkLeh%phrq2bz*3BPF>OM#TI0tHprh3ncVqwLwMSss*LdKEuF23lldX+ z5li_ZFf~kLpQ14S?(;Zf;LQz)|M*(S0cE=%i9$0;CUW8si?Lf|g?TY~aDrnDwxheA zoCqfhB%}fCJWN+-Y=zTy;Y)r$rL#n-Viu48wQNfS8*56!=%{`TGeB_ANA2Uuz;6aK zE5^xd!Z~{18%1r^rk?Q$_nQKStU+@c-_^U3*1WM$P?ivdP^3qKpHCU%Hq4$1nUxX3 zCZ}vBD9@tjgCz7qIR-@0G5pQc)XE{^h6Mm6)do05P@&oOlzS^UB7bJrpc!FU&(^b% z%-5JC+-zMH0#!dU;+JC2`lLL4*mbKIPLmunHP%5WCj*>4)_LXu@&%pZ$`W=X+!;{! z0a45^gar@dPd%N*ivO$xX4EQ|;i`N} zguPiPJvl6#GwlqwVDSrLlAdnv`?v3NC{`t!>0c3Shi}!A$TXHsISBnPjWtU7wmIYy zYOSZYhiJoX z1gu%1lZa2|VxI*DuZwe6J|B!Hn1(Xq*|g4I(+?CS0szSgdrDS%cD?Ek@TVfwS`8Ie zuKa(s3aR4Far>_yo)%KO4|)@MQ86j-sfak8nf{QWV2C17iKHP^>R+yA80en;5`CUaB6y8wPU>n?m!D212JU0lGJ$$42;AT+!E?QO&UoYLw)_iEstf(J{I6IgF*OOE_= zM%wzug~;zYxvsT?t?R>RXD++1itFnmx-()MbQ@ zGhwoDdczx4c1wk*MD*Y;Y{-oEugOn49FYRc~iCusm=x&i9bGyS>M`Q34mMmA(k=$113*xY)qIyer=Qg9%1A?ANcJF>^Mw! znv>Of)Ds<#-GCML-WrkO`84k7$4R$nTdV5US-LZJ_rE>HQ1#jLZEp3n-)U~G*Eqtt zreR-+0-AJXXhJ0+b|Ck>DZuh$zs44q1~Zwyy%X8yINm_{^Q?Sv`nZJlb>S~xg!|mh zZ%H2fUcWkmXkH2PoBTx1g8=5LmbDkpzv5Lgf3XjDX+zE zCvC{Q-2E`Aqbj^Jv-cJ~K7@tgO(sc(fXAS(^abz}LfBPt)v`}bU2OYOJtxQ80828a znWiC?qvIE@V=I?KYv6WV?>{&vmp{X;>{-X=SA~w$8Y$IIO;T0Tr?r{6ELr1s)%KuP^r<8-I8G#H&7|Vtxo2Y{jXMFoz1+tSuVedULO*G1-8r8-jO;|S%_T=+EEr?b*9^K-GnHwF}slOaOdbl727i( z1@e~vnz1pvMEky7%bUvHMkum`G`KO5oJ?Nf{;P;OaLl>fR$Zt9ArM>^Bk@V>+dDIr z^-T7{YZ?%ip*&Ie7q$kJoI;vv2q$or!;Y=liQ>+7K$Z3_MC?wGf(DWTHcNd5Nk zBq8)2*}6zN=y|@hY#x107IUbr?UxmHpI;&>ZK!Qd3Qs82Y%3(NSE`MOQx5mPMxvsV zxj?E_V0383>!VhhrUkM@K&|)Zo+hHTl`CEhCaenvx}z50cQ9M%zmOu7Z?r+Aqs^+( z5qL4I=O>e--_TvBOa;DzRTK7 z;SAbTc`~(fxlinEQBZ3@!>m6a@(rSt+lleOTJmN3i&~)+CGDZI6YCibp9BYN!#b$X zHTyTCD{1LAYW*w-4FlumRH7}4BSIE@|8xQP;_fjBoE@GLKrOhqVpSagjp&q z8Skxv9#D;F;f~O@SJ`TJxRxpit?W_|y_eIWiuE^k!q3hnMoE&JBr%+pL4RwvfYCw= z<;Kh{s#H#mOl{`bwqHE_G8J|H!Y$^R8cL<*1A=zAzU{^*m(+Gc34395elP)wrpCF^ z2%wXSo#`_i4SDV}Z60XT%z?v~(fD1vesh}{I2x+}kAE2A_`{GidBBuaHEtZLN>kGNzJNmnF6#2AfH_|9pP6`P%TaV zPrxqjAnn5{t!r`*I4#1;50Qnxzz@Bp=@;%z4Pg#!1U@Ar&Yqd!T0P47=rZ`KU~(Xa zXhHj&Vhj=vLPL_+Ts1K8-N2jMD8y-aPzO`7o|+zmfoMLYNbiHz(;w};rD+F`7yL5 zWbe1nJWAucF^l>!xRc_eLxNnDwp`YK$a3{A7Yvto9E4VY{4%aP#jBAMM<*7P~7 z@UYhXIj-|=#qea4UFGpW1suU;{U3u<%Rx zB)QF@V0!frP@<{?UHsS*Gu*C_H3wss9mB}8FF`{6ouvIZsjSq%J* zIx=VZ6bHHxRwEf7LI9A$;hX8s_tOaG0#J7pD4DJ?xid1F;mJSksOj|}aT-gbbxO$Q zFl@T$)}*mMQw-2{HX2u;aH{o`+Tfs6pjt+Dvyo0R5}V7MO?`Z|Vh=}7EpadqpTuzq zwG-*^*ALt(EC^}1cMtG}9mcFSb<8#pmLTId5zFqAoG1MwKX}&t8`~j}k^+$YT zSMAP$L;io?>kx;KYa8}JmlV8#Nk7p8onxU%tZIerIx5S8@P5s<$~`1451n)CP-2=> zcgr29d7)Am_Y88?;cOI$3-tF3ZFAFOT0*y1=?*x`{+hjRD?A^LYLjRroAS~L_ zKEasSF-U9HKg#lyU5fRU64Ywtd!QC1cFlH7EclgJTC*YnkvU&m9gRszb(euKD*9HX zR4PPlyef&PUncOptOqfo`dN{R{d{al@lTOsHPT07&I)`>2o@3u;p9vA4nxp&@-zgC z1{*8eM3-Q+^0J7Xg{s|E{iyo_SQZPJsGlE?Y~mNTB4;Fgu9#y@280l;N4_3JW`(NN z`aDBUchQTl@)!ACxAV>j#^{(_tB`LqbPdPsaKNX;eL5lB zpUaKrg4wp;(b)(6tTi+Vt>-(}Jdq3&6XjZV{?a1Zn`Gw4sft=zN;X!1aoUV)W!(x? z5NasnVmdl2o96Iwt~aE3L2}s)!;kEkjtlpBi!t?4R1!)rn(08#9k)MY{x~L=(N5e` zsTK^i{W6C*hD=d40eSbeoJyv^c@8@Q@XJFm!+15~FrX0)MH^=B>F|)5m60+dvx~dA z&9J!ah3477B*T8lVs6o98s&EEsHFUa|Gf$&Ho`l=siJTJ9?9HGP(;$oy^|#%4x95# z_OmC|B%P~|1Ubj6Szq6565h&P&D=)Huv0nsm;eU+|B0LltB6CWx$~Nj(AyBlvLvC} zj*eD;v&>XrjM+Fnfi+!sRaIJdtBZj>eJfNwB7w7=($1;YuZs^mNk^1#hFdGY zx+?PrxCkX-eRrQ z(74|^JWa4IYJjmjcl)>Vx8v=59S||ay5TREkwiCQaBO`ym$xjf7@8NJ7xbV?`ng&G#JpAA=1 z!u0Cni1EozbpDoa=N!;-FVDlEv*Vhq**|eDIe8;=;NeQ3w$ZmL9K28x|(CaMe6Eay#|-n=%7;qfh+wG{DG4Uu}asTk86 z#_WXPFxHS50EzP(N(nQ&nrM-SGVvc4%(bEwpK-mWv6-w2eMrTJ7+Tb=a!&jP1Yf?C z1DVbEk_CNH!T`YIplfqYY})GBiM+HZs~zsg6*|R~1Dn6l|I97ddUAym&!*i;-Dd%o_=bYoQVKBOzL2R%v3nY#o z5f}JZuIth3N^?e?zM}js15yal8Ns8@T9fES2ns9-P+Fz}SSAk&WpmX;+6rB*nezC@ z`mJEUaJvvx@1rxp0p<>(_3h{PD;;CLHQc=j=pZbMf!D-;bG!q;Y=L_R=HX`}CQZa1e)1e151@0K1N_wGtyO{9TG4 z-gx=+@qt0Rdth+`ae4+nfB56XmF-o6W9)85vb{hIM19od%FY80W11;I9^iEmw?H+_ zEd~F%`l6(}eAn#@sAKw*jcU9(m(ubJgFH@u7z2uQfbj?-S)7S1WJ>gK%H69j(3!i$ z9Rn9Ti5fY@I}_UWJ6N=w*B{Kl>(plOoYpPhx_JN2xobdKf7b1>@cr}6IjFPB@CMMe z!_y1U&ft+bblRn+LkCxT+!z0VdkmAAR+x;DJj=~sb+{1wT154hV)PI%#Pp`qXk z5ciQIeHtj+Td!lqwdfcG04I?EVkR%IUOPRJl2Quz1S#}Xc(jS-IV;VHYY*6eX!gjD z@AlHlRmfCOk8Pnbx$lXd$(+umbCOSclAkHXmN8#Ts{J@7I*DJCSKdfo60~&P#3BV< z$;Ley|5IizcV@1vCr&7{T9)!;`>!P=ORFY$Iao&&aqYo7Z)r!`VLsoz)`mSH- zuvSN)UBM?9232SfyrI|#f}zS7&SotKT1#iu;gFe`2=>=HvS?f8U*f3~?}pO9?MRf! zTSH;M!aQI-$FOmT6|Is-&~)q6^}65pXH!pm#MBRJFb`CHUyMns6&*TT#-BU2VTZm4 zT@C(Hv?qO?yn1@X4O z%Hu@DX1=DAU0-;f=oVe0L z57J}VyD&NBH7_!oRb`G>Q2@hb$o-V{*|}Ov%jSW|NGK7TX*$FP;j+G$&nIQoe*ltB2xoqR{1(9-g_dP;FLtxrrvN)J~ZFM+tLp11Z zoR07e^nQB>SQyX+&(jgw(0KpesOtuT`@KBv= z`t7KGf|D$VY~KC`72`=>4`YupY>*b9;Z4h4Ya?qmrX#&Sks;8fLVuN<2UnW`Hh>SM zs61*C{;oTi4U1(fluOe9>jYQ$h6KR;5*o3(6P!zdqUjZE#yFpvIk7nuazY(g?Ah74 z#R=*=Z6eF$eY|HMtoeLQn2Ekz*mX5NKFIjQdPq@GP6@px$OUfBf!L8BS1k?le4bU3 zULFa~M5w=LcVVYCJzl)YQ=Zz?te;>seL*9A91_HYY*K`~6TSzsudYK&>%j~m7LY$T{N*b3YhpbBA5&|`y||bI zZvSIK^Z(>zPQTr9^UWbWdm^^j^uE_`lUSzdz5s&TjI()$6&$yi!j@>lorkHJH0qTcC3m-z+*x_zDPmYHbM@W2#>gsWrK!iljj?b-m5(8m=%2?a$6Vh8g zqt4ku^O*IH;foYS)d@GK_3p{EXtnRo#vIlitfDI10uB~VN(WO>%61lFvhI)FXTumh z!&%iQ13^|wojKK9S`os8awsXh^3C86!zsc@xVvtP`!1LH|Imy|?0JYj5N)HjO4f=J4iE6TdVwWZi!R zft5bai8jWxOBtdsi_Rj-?TWKGTsFYR#C(gD*Iy;wKCu5(0-hq$#VP-6tm7#7sfy{9 z6%!QUk;oN##4O3phS7ijl3)B2Ve2~jYg^jp26D*%^GFW3T-K{VfRwDu%#yF0c3V4I zVJe`h$ZvZNh~m!T6Xeh0$~r%yaAVS54{el|lqsv1c0|a0%xBbRwNf7y>OIwHvDs*S zl>vGaHoYgUi}X{~=U%j-_HV)$J|cpZ_?>||g_$;$LILvv?a|p2-bLrS8|*zGeF@)D zB4dJ#$-^$epJ}zoHUfnB0YdvTDyI+PfH~pb8d%NzcGM!2gCpusDe#$(DY_JBPmP82 za^Cc*q#+#`>+9%?x5#QD_r|SRsymtZY*MU)t~lgi2M~!LlGcXW@CfkpgmwS2V_ zyY7`8tzlhhcaS$FBT<}!`c#|ac$vqD>U~`MvKf@CI~v{Ihp6t;wSH^ zX^kkC8{E46kf&sG8RXzBqX1C(J$5Jb9CrH#ti)TuttW z+l~w3{5n~=4Tmxhz7v%1yn?^^5W4EsI(2cyBZbj_zhf=*vP9g^%9i>^6O+N$iaVEy zw=B2^$z4P7)=%zQ_UJG_LpoLafh@uj1M%{U##{#_nLI3uJtJvBc~rk&V2T>K>^bpD z4l7#M{^?&N#{uGYo5rt3!E=FY8VaL&rx3 za}H$qD=5HlTOgE`Oh*1b0?@G7Klf!_cMN)Of4{wC@)D(P`gxU%vH|LGK`xKmEgJ*4 z7I0dprN`)qfvj^$>&^YC%WT0Z&l!#h)`+6wVZ(q3aCVR5u;v5if`BpllLTw>e1X)c z7{u$&y-u@MpKuno_2cYLp3j(_K(GPnKeYK@Y@7G~%!4{}Zv#HPT_yDE^ghWY|HrKU z5PCHqUAziXwsCwyyra<7O`V05G`p|N`>=OY5};~`AV;LO97ksA$UMZ}GLQZo)x_aG9R8rXVbiCHnKV>9Z|ZZb^BE~TI^!KX<$k^RkdzBm{C z?kXZ|F7DF0)WvUX{u&Z*N|6=N<{|tDHc@tvS66Yr1yebw5y8jgLIWii_yYH`&S5B0 z_ON}3W?wV!Goq}ZEsY*6ySr4wDdu=@V8ub1Lqs4D+L>`@-K>=a*I^h=3=5IjPv^j6~yWHr*pZshilv$Y%x z)%wgb|JS$b(ekDJksOnYY~hoI&(cJ>L7Qi`wusJ$iMp00hQ&Im-(1E_RC>~>f1de#Y=rxJH6WEY`!9|WZ*H-C z+|Q(cCOuB`!U$^B3DULGb$cg-i`KaniK?&hpxL;zo9cV|`i-wVo^02iyC_d;8x*ei0C-yF-9b{{Fx6 zj>LFPj}{;;!+npP{_vD~C4^cuv-VL@jz3$)tfq%UPb@%X8AAARz#vMpT;c`Lb*v}P z;q8*|v&w9Fk&hyi!wRdggGEyuI7|I&$_ebv!k{$uEa|W7n}&bo8UOm>snoxHYgd2h zfA<0NP8<7lz%3jwYP`hoIW1cXzu3vgk5%rmKkf$vNA*Oi`VIfXl~Ae@)P-xARh!1miPI98 zmIAy5()l;``f%%450EfH^JJWr7u^n^YNiQsAMRBhH{%290F{b{DCy7?SSLjC7Ec9m z3+=LF*&YAG`h$mC=yFkN+Y4RBB^;~bi%tV?w(q_9o5>DNJmvK&>HNX2GpNQ-pS0>8 zOW@m3V+@(Cw695oZj4I%ycATix1v|;>KkE?|Izud3jE^yyD|DkIMZjk z7Q<5Tc|X6SS@hRkKZkAQFZ{cDjC7mqng7z`zw$D3*SKFxhM5Q3E3AYPi-G>97nd|8 zU14EGJ2S8U4r`BJO4HtXE+IrVI9s5Z7|h4>;Ghy%I`(nBVaIqnah1r(19#Nby9_3} zcIcIHaRbYt9RW}h0g4woDfQF8ef2D;6+0`pH=`BkpV?Hbg~3}w-J*)Qi=J>bi3uv6 zmKvL&HId#Fb`R|8aSMT#qc)M3z#m$DLqGOf*V&jCgIAQ{rbaSWv)J83^s=irIvYw3 zZP+f}hX9y@?GS&^;jFw#1n?k6ED#w?WmeaHAWm`@)k829Kw>4>8eKYHk@!2kHiu)T~rgzsybzgL_pf{KR7RAbK=U-FhEZ?SY3V}Y!qTYMUZY$AW zLfv|i7UU%V+uHi9;@BsK4VI}n?Uev|&}q+O6i7_QLmFk1L#R_u?wIJ!7F%y*X@fz} z7?)5-yr5ApQ9Mj%`jrx)Fxk3C79}}pqkeTD(G*m z6FoPqHz$9^9fooo`N)q?%Py=c>@OL|I?_s@waXXlhv)a(YlI)Cja5wQIr=T}BfoV+ zvj*drgzE(q*Y6Kiy#*URxdy>5T*}sB5S=0R4jnjL*58@wpvW)?JW7Sc1L`n5Y4&mj zs)G;a_7m7P97-00-tet-zESdW3V3w`-nJHbfXe;abZE z;kHGr4a774dLJEoSMQIuz#ct!d}S2@&E^{AVrjQz77<$9nwzq}W0`54)DmUQV^DA^ zYx>2!QzZ6sHqK-DgdE%PrHm@nrqw!^GqGuRY_wri`v?n2f-ks60$7ijF)3sO^!zq# zH>N=r4-B2iJo-wW2l`wuK#$bM#`oILgaiv*sbadeCANEcI*-4q7EnflHESHtMEvh$ z0~KMZh`qoDB9Ll`Vcxrey@=7G5}=qkogPt6x>$_00cK6Z`5F39n5NsLTIuTesA?z;sPa*CemQs4H%|5 zik*N7mKh90ru3kCuFpc6dpFP<`}bF$>wgZ-M6o7GmNn~hPs%Q=GjGS0wrk&DDk1te zRI{<%&z<&h=dPG7e0EF z;a^*IAZPiV8A_YZ--o9|o`prF=yAYu`A(^T495(~5|cF@3^-du+Pzi>xbN!d;u7Ws zBh@_?&!E>y#`=E|Nc74{;qHcZmuk`Mkf4V$8-<+7*X(GB&eolM!G8wJx}TKSCC zI_4V0MWqkz{}fwg*&c@?1IB#%Lh<|}cp3V&P$&jB#)afxD$?URD}h_l$oVrWb7x$huXI~_Njrj^T{7;oNr^kho$QV)p6cOF zLd_T0g#CTh+Hv!)2holnO}Z*vj%5U?R@_qsIM7DcGaPAV z9Vz+cukg4Ht8Knc6YR9yu0W1dOPDA!EiM!xM_|!t7aOJKO=@iPZAw%=dIHsK+6}ig zr|ktq^gpaF`+0>39lEBh$39*g23uJ3;)1$NIY$!eG3!VMckAc(VXyDY9%X$SW4|eA zy7O-hD=Z2$Qynkf64aT_%Uz^Z038%81GeZjv!x(ueUMh+k%=i3cUEl2XVNV=R-A&} z{+_Mh5YAaUns*0hLVCnN(X?w=j-5Jy=O>lTzSId~OUqis z*TP4?E1Zaha?~*-RxG5tkoqy#asRRKfyNgUG(tcA4fMBU_JoY+y{WP)ExDP!jh`=~ zW5j!tR@Fu6x@^G8E6>9bNrbODLWd?I4#L5OCv;<9TqS=(>$kKit;0P7z58kuKgK9I z(`?dP3#czAAMBg04-wiNezb#7R82=3IV2S6MVHEv&kDW2M2TA-H0v}EzQqq>spT$jkVhY*@t7gxSZMqbx zLr1jXVOKL-R!io^SUdb)pZ_4vGB^Lw*linlYZI{kNhnA+>L{9WKGa$DhvjR@GyqsH znoU|P1?Rx!)i%^1vzO1f4nZu#!pMorq3IoHfYjv}dXx3`obe)p`NcSZL4lZXDwcNg z?opIm1pJ>a`qhYphhip{EVIeA1(cQVn|=l;tf(;&du- z@a`3cm2L^leHv=(AkEl+rsP3tKWL8${WbpwZvXvw{{&IjMzr-UrE*@QJF=~AU`uj3 zENAlgq_^OLU*R=Vju8n-_*UXe7x}O!|N0kQXU;0=JvMC4RO>(9dp_?={2<*WUZQaz z)qM!fL^7t+MuZEhSS%$Hbdzic$U6&3k$^o-ejUTH7h;EP^?bQ~FYXfcOK3S>6Ll>M zV8gAtFf_|Y6*HhnH;3dr?xNnDj)gi;?p^%fy`sHokMh@A+PAB4 zw|?byVeKT!-SW@sY8~rYO?O&_@}fYlsTAPLkRo(R`$(72%E_GfvDrow&)*dfboAC~ ziDMEHB>%6TBL_Tuvun3hhq`sl* zWV~7N+d(++fsI7D8Ot{w|&n&cE zj6A4R>^v+OU(m?sSfy2ZD_??@*g1)06x`j9h01=Zy3RmI{F$Un06U{s_7jB!EB?nA zqf!3%QLETs`5=+(vq~P>gYfL`yb6o_YRNEQ_@HcRE>`|*2jMgvji-Ytv^bn_sv$?@ z=hkgx?WFs}NB-x4xT1I#>Jx4Mgj`~RAOGwDez>Rh2}1T=G zS{(B1*n*ds=%J86HgO;KI$vHL+c!K0Ez39v`}!n8W8PDG+82*h(xFzp98ysHp8}9w z51D>7)ClD(Z@!9^Vf3j_`#U!{zX(77UO-VM<_eEj-+FJqEzFl!?;?N=?paw`%7wdC z5&SYT5sLBA4`3d_?ICbY^D4)JeieY9`O0(ZTo#%%7p!g5x{!9xbB>)R#95TMDGZ%8 zY9v!4;yEbk_2R;x9VT#87b;{JfU6wE3`&o6=Cbdf@=A2O~l-vf0a;BeO& z{O`es)prgMKuq%Zbb<)&f0|D%d#B#P5r%$=FqPAJO^98Tij=|%k;Wd021>Gr$Fl0o zYw5mR)b8xszS1R}26g+YzUy1}IbWO;f9m>tqL=ySxMuPH_8RCa(EhqJ1qHgjrbDJd z?D>Vb`}YP=qS(v;HP9awdG`j&Jll{N_5oCqpCIaoeJCkSaEzmDau7)5w9hHwGqX4T zEp;4ch_IkH}w%i5dL~S@T;1tSn-V?!G|( zzgReMT7=0D_fmsUatHXE18ds7Zf)?{z;f0;Yv}oT6a2crBmt)vg*p{4Gn`$2_S2e zg|K$dzvxoN;NGFll;AFw)khf7ucq#`Me^Lle@IyhJECD41Dx1GP9pw(!qBorq<7>E zQTAp3_@C2`xTEP&4N2K=6u=KmQp{xuS2y8xcmGH%_vppol?Tm54qkWEBr#>{r2n?` z7`%C8FT1Da*0kvv8wvNuxt*0Ue0(fkC5qdV+OHl+pUDpCb~KwtLqN73FJHY8+~qIh3u_4)*oI8F+Jg3G+((am-rY8PM9i`S#dvw9bF zF{4ekq_~(3=7Yy-FF0Cu7a2DjTE0qqh6?~xm9Ez?d66F%mQS)oaWT|$Hrb7?7=7oP0V5}j_p9Um~<AodUfuL{@ve)Ji-)iE&17Kdd_Bw}Yjtx@dlDhR z3z)(R+r-_7VAv9KYv4QVw|}QFZYi5PlTHJDXap??uH#ov*L)Q=*{AzvrhEj6jFUbP zCeY+GSPs13+P6O>Bt)sd|Cx>VeI+SCX;Q4v0#Fkf`A3a%Ywcz`aZqpn|AfzBeD7~D z`u~JlbG!e%AAzoyYs7dl%)9JW^ASR5ABcOVy<@tc^Bq2>z7-)eTC2GCvOL3oxX8za z^m6V|nV`UYhYOu~J`pdK@tZc!moVFNldonm1V+D@x9s1lPy7CKe*HvX^Chp{k;jrp z<>B9kvy9!iHIcD8iN(-^L$W<1SM|ttr~j|!Sd~MvHM$E0O>_*#8)3bYL^6!b{`w?Y zPJf@iE9;3ANM$8?O07HMvys8ASLU@da0;h~mL7{mHP&cm5s&ny-k{Wnw4N5z^qZBm z*lm||{fxSkybnvxRZ#dLjKfu4Qn_~h#io@0759mVbZsWDuLqR_-EvjT%t-8M*Lwdq z@Tt*d6u0+Q1i7H0*~H=r)cX+1A*;=}rN45W^4(qXGSG%}_b!dYmoo%T5~X|tWwnAC znNx!S8>|n8<0D#NA;_kr314*|5(1|m^kk?eV%Vf{mW`S5xa9P;%TqjVK^*!0@tyuW zo=$&L3au;nFrXu#Kvp*obzAruYyi)0X;$Ph95mEC9pFshcL^Q!SbANv{(duF9ewN_ zLkGNn_LRpc2@Q|`zuxxl)my8$&88%ByD@FAgoJ`O|33ro|NdPuv-oDKMms|INe@}T z0NpV_bHC|PE2`XIk;F@ndt|OHV!wqaT6--6UlX70ziOamj@|m47sO<#lt+~sKyF@W zwu*;RVJDVLK%PvzQ`Az?+p2~v21zJ|S{Q2rMblAlVb{d|MvyT($W*!+%Ui=3n7!`` zTm!i*iJpv?6?pv%=Pdt^h^Gv-`(l||bRLxAExoTW_5RKp*Gf!9DB#g~2Ry-}`qy%) zXfEFC$_keGbQ4HskdDZ*d4B6*t-dVkum{LH&;g08bH1DJQ4@7tCg9-n&Xo= z#E5QPZJosRO6KU}W-K-N6KVL}byQbrvm)fa?Ink<3ryG)HA>0mu;8i(`s1A;11h3aWwOU$^w% z0c3LydVOw?L;t)=NN}vxTsCMwdk{6n#6Gq=x;Ci|<{bLDmAyy!lFp#jFw8#gzcu}= zkzM@>H3q3pEqGtNY2bSB-G|YvMz#E;a2KGhJmuowQ0&LYw}2K?t{5LCIEhNz=i|Y{ zaaru^dz~t6I{my*8E1_!C=Gf0mgTCGeTKj7B@HBAa)~8!<|3kqwZyReaCL|l3@>Xr zr%GU6rN4d5WdIB7dcW6lx6(*nc#(_&`v*A+k_AT^5mHjNG8b)jb)uy+lP7A3UgpQ3 zgVpdwSIesYUgQbJoBvfEDg(mC^AeB?Ve{+tr7dLPKOD}sluTGQXc36WSn4eQI8zU( z10g>W5r zj9$N*rj9K=nAuH)h4J{=K~-Rt@R!2P)y@2yFT3U7YcOh|G~Q*xrsNLLr?YGeVZ9HX)Rm;jSkdvdgvD>3oIAx72~cm|RL#5QKZUWDfc|CI<)TQk ztV({}W)P!eTi@o~3jDz-cz6btTZOFQe)`2|vjP~@L~&`MZ*eSvU4xglG8?0qQ^lox zf<3lPY0OPI@JiR291NGg%XKmnLc%BWhFu>E@=9+>?9_F~dm6RFp$<^yRN6qaWAYsE zAbf5&!V?=77B`5FLK0t1*HUf>vc|O%Ee(0a$2y+;o?qna#mW8|{%158Y)f#e3*{n= zCr&E%Al5(P+Fh2cyh_O~Q07}+E55}t_R;~Z2%$*zDY`;7flcv>caX_=SsW^`Jrg5? zh!kWf)LVZN3|y~Eji^TNgkwMP*k!!d-(AHtdWP331^V^y&i}P_fw%o=yzomcLCj~0 z1>Zb<=s7B^T4hj@9QS?1)rJ19i|RvSBW6)Je_y#Rsbl!-Zm;{2`q?ysPOdD*Z##9( zkDg*K&r0wF`{#K~J3+*xHnTtk(TFK9Pd3-tqD~0{zWFIDmpF=mGX?>3 z*5G3Ke{vb2`dK?J0xR{Y=EM5EFp^}D#7;w8Kg|DBi0`qhTH;40qW{!c0_S$Mdl(Ryn8FOtYDw)j@WtS&q|Z&7~e@m(d6G@CKjtD6ODQTapyYILKwX#g$TZr5q_Hf^A=@*1b-Jo;q# zy51jfNY5xp28IARoG|m6RX}i5t^q~ z)F_(JR0;TrN9I6vz1{ZocM=Wk#p?^9TT23*i6>bD2Wk;!DL+zB_l9#WYW`ja(?V|Q> zae+7hf|L3LL`Ehf4vZRW#RegcMcM;if4;ceprYds#>L5uey=5m;o;@7KjH!hq?`s+ zXEwDKwGquGU`Gi$E4kAQ_nL#jV-NWR%3RwB{*vS;93Bg7LmXV>b3Fvpk%@bj;($x5 zE6>Jdc0`DLDD~DNBQq`ygAn792?0R9FgpPw{`a#rQjV=UM6KPk-kmfMUFZ`BhZ?&A zqDu@4ugQs}++V_TrfKT~W(#P{XfexL)H>`WClulnoAN{Y{!T5DLkX9q9=(^;0yaRS zGc=2>0BN+A*LgR%M)U01yOYnrJF-{a{i4(tV!dg_dIXcmRLw@cYp_p z9KQ0It5e;Lb&vw1HbGTinM%D}ZgLT^$Scp_S!GKjg8v^RFaO+bjG-StBO4-LxXSF( zJ5H$Xrr*Gt&o_0ObEjQGq{pJ_mhjR#_rE@pKt`}7Ep$o4%Kj&A%#rcANq$zhyMW#T)VT8LvP& ziX<{T;3_WG>Ciji7kGji5E;UMcSs_9ji|Qhx0X|xoxfoUTMs3+wAze&yhKtzOJkGzG5I(x zox_6^dDW~=u5m`}i9!tJ9FR$Y=MJOGzBdthWKhC=oOYGnT)E)q#$PL=r^U2qYUZq5Ql*`O``)> zu9c2{EgFDG6S&tF|NH7OqW@f)t+t_5WaGWu29-AaN`_*u$QYrR9ROdn<^}rACC;^)AU_5kgFZ6b0Lu( zZFT;!js|uh1g%aDX>R3A<3%JuBmZGu|158q+yAigG$5YbC_=b^OGwKTb9ML5t5RmTk<&X+cts`+b< zd*X5bL_@;nbkQx%h$6mVluWyBd<1VuV6RFIW5pch(FB zDkj+bN0p)S*6yE*_%$focwg5zn;Fl6MKdca>!X!IXsAEV`4D=PeZQP|d-U=_GzXoH z-*<{Y4c0!&j}84R4)mQ;d*f+?z_O2SL@qPfM7hYT)4UDmJU`Tw$}XFTm?O0TM7 z7$1=qf`Ri6Hl{c)(!Sr)hs*5+xXv{FA?x)gi@iF%PB{mZ8rGLw z=VE(x@!=NQ*XF=z<+-c$eevxyjc^D@DY$DLsPRD=ncRo1`nkB|fzu?4aN2S;P82Z# z2*f2K>=GZ}^bn`$Z5~IfQ@k|)r*ERD(Cq7vzl-0@i%`}XZnB&%OX{&dBC=~!@b)x5f(OO7dTazTd%i<$q;`R*l;iU# zE};R4>~y%Pnc51pozF(t0=|N3E=^v%PtyNrrs=wDEnKeKf|{>&8L2*#pjGA4c;rFZ z#Rh!9uLaP8xKKL zF*np?PbJ2->Mb3vTOeMAW4h2!v1V~Z&|oCm(h6b@$9^k8YKfx%>Bh_K>2!wq1!o|s>QYZ!4lR>cyg@O{DK1Zy@M5Y{<>O9k1tJb@2atjs^E z%Yvs=;SKaf)4VcW_ae0a_nYUkb?7c8ze_77J&1!my%CUnAguMIyiPFKqDJ zowFEanNB}fAWfMPh7p{%Gj{B!^Jh;i#Oem}eRiV`*XC992SYX;bKp??1PT6qbKw@c zj`?)|XK2k zky5fhh1~t6tQGewjzTutlJ3Kc+l>Lf`_jTNXA%GH&t1Hin8WAzhrIxtx;Sbvd_&9s zZ`n8IxW4--3(jTis0#-N9dM1vYh=uoVt3^&(n>d$azQ|enT(oJCzR8r^A{)M{Zx7%C*Z}>(a&St)p%_=v3S|W;as8JvkG6By&G?@@&0_4XSKv7 zg8+K_Mq2Y-tqgjG%vqRFdX1cers6(KQ{W>W2A0Tra*bIupEO^iD2)AU#Mn;XlF_W) zWt6M!_L|sDm1p9ZIxQc5sQ|H6pO+`q9Ng|Y??-nGVDhymh>cbaY)m?5$ytzny^Znc zJdLHS-bx{H70<{U=SxGF-%S?%2W+b+ZHPlg_%Wpis`2V40l*#G%2|LD5;*jwVz@w~ zN#Bqrc$P&izdv-0-QFx!b?Q32JeE-5IMeWrNlC}!#P5Nq!WG9W6pZYwmM&s zQ_ubQ*w3SZVhRlQefk{sD3HwPS9yWq<$z^AJIcCW@v{fIbdgR#er#nrCp9lijZK|Jx=&A- zhzjhTqiYr2vY`}j_Ox;>u4Y?G&EQg4$-~^hgAHJf#psnBrspwF)E5O;i!P(;NfViz zTo|$jbx9O2K}krSl#-@5n|A%KZQm@Z*N;^$89eHKPuDY(i*z+w5!Zn@=bBBGeRt{1 zh1gf?e>loGav$0F)$0dXr*&%4n4-xoj$6HPSacqanGC+RbN5N?7Y^!@eo$87hbN84 zj3=#x817{#Iuh>{pr@a)VxYz>9$Tv&`vw@v5etIyiPa(eYwFvwp?NdwH#BySt4k7K zh0{nCyPpA@`1{O1q5X~`&G+UhdP}0@Aa-704{7SaJtKFQ!zVe`4{i5hPw<(1**(p5 zljd~xP~VhDb*@gM0gV76Hk(PaL$D-H8qLA>hWwW$K?vd46!A5K?$<8o_W)~0WG(U0 z`E7@eJJpub#Gaw$#9=3d%FgoTe6-V3(&M^ZWUGv=q0P!TaTQO z0#rX0{0QDj_~LIRUV+k#xX&hA?Q8miTkskFg*-4H3U<2FJU9T$XxmpN70?{{8+Nr0 z=>jxhQy;9((=>3Q$9trc)kne8D@8CJn!0DiS4J!rN^A8eN;hn3ngK7-+yaS{f&Em3cvrJ z29v?vW{##o$r(W;ocJK@APJe-kk%(}+>Czdub!se`*(5CM@`Y&eOB)eZ1w_CN>-U< zFou>rmx{x1+qO3|`d&wwPN4mCgp`dJn{eQO zBxSskfw?JjiK_`>2<||=IbK(ANfpXePfoQg;?yOl?B>yhh@`ku8Q0HM@o&K3gGB4Y z7`AhdHrkJ4ThwiEDew#=4dli>fvP!yq3DURQ>!LCxYI^5SN$#fhFa40FkUN%CVpCj z;cV<6&3)-_-d_%ndWe7~bGN_%{^F;-n-%vAx1O+?mkcmTiuY@5fILW!&?|ql6wxCy zdg4gRgfq-s6LI-^w6oZ{iSJfk%kLP*lg%DMmYvW?LwTw8z~GmK4d$T)R+J+v1-tYb zzpx)a)o4*{$I1OV)vqC20^IAx^O365{u}E)?i+VwXrD0sd`rYsJI`~5n9tWtKyhY8 zF}f;+P?xuF(gDNz=;>y*kF;)JMnhL^uDKl16;a6Wlj&*Fw}-^$K2AU4UAQt*S?EEf zhxPAm(!ouV5Vz*e8<&Yp2xAO(lnoAsGZD<(3ll#UysmVG_ZUzL?GZrSo6TBJ6MD9y ze)u*!q(c>3Xlndg4lH9Ei-T@?D>JHyF*8qYp~Mgm)H4pJ@=l*#xfHK*KCnv>Ijj6m z6>DOosDcL!fxLP1%874|j=zu%UvzttDo9`57x38M-se8?_Ia#c+@rENI`h_TV4-@B2bX z2m?svD+%&0>bz_$2ED~-0004QPH6B=t$sbUC=Tf{h2`7wM21^@EUTmB;4J~0rVGXm zpYivRqfiN`k8Qyf^xc?pCwlr{O{vj={pb->Fekn&B!?VBwwTj^B;5d=xF-htqEO5j zEjobtrPT#ybw)#d1Qv_$*KV%Xi&08p5ei~*z}ndVn184${Sv1_4;ajkyPxDFs_+Qb z6)*h1$_7c%6u^p?O~d25o2U`DW}5_n4r*d^Hg@J7kjsQG>W`g^#?ShyIZ2itr{BP*enV4p1;(?W*xlTLlo< ztn>4(VRvE3KR6)R-jg$(-BHNCt<1(K76@xae8)mM-T(Rkg|k^1Zm{&k+vN*J!^Ksn zmVM=!A9@sz+vF|*5cG*k2T3>Gon%-*luh_epMTz2>=TvcI3zV|YWW$kIj4J~4xRjv zB3M16Tu0+q%dq2>Z2KF*QZ?v5f_t|L{=&H?m^+jQ61ZMND>m}Lzty0Nx-kuTyht}W zp`;TIm7fh{h1S`efD^(vZFd(rZM%5oiW$!eK?H%vf*QQcGPWd4oS72>nq8rAS@ zDMv_z3ON4*wmh`LJw?C`toia{NXu#{t2YP18XMWa?;a5#n$9?Bv?smc`#>%sGmY)$ zl~p7`64a$#FWOAfqsClqwN#=5ujPicbxhTyddn2P^nuDGjG_aR1BQ1UEJlJ>tBv}# z@hs)WU$qpeBX?A;Dk@?m)3}M21z23O2{h40FMfk9*nk>^r(tEW4T;pkGqbso52wiF zl;BZZzAMB6({`Pqv>M-|;=IasVyv@RDQ*f>7_|74`o1I;CmK}tYCYv4ED#EOB;(Wg zC&HKgA9dgyDzYgH&2v}685i&ECma`ZDXSgRLVYDJuVb=k0#Z}Ao(+M2OIKKx z1H!9Rcq*7?b1@ia*&+3=-8?Uw{^F5Y^s#^#FbqFlw{*t*c25iR0HP1C6$e_f@br|@ zy}~)|r?QE5L)daD+BLM0O^BDXmPIU5whV2bd-iKD&35JC5dJwzA;%C$eWJnERRhv@ zG*03_Trav82J^u$2=cQUYe9~e?tpTF?R)yb@*Xl$i+(7!lf1Xtvey=k(*l|20K?7F zF^y`Z2s%O+oiETcp=nATzj9Bh#)4+YV(IXg+fSb_Hdft4P#wqOr*$l(^uXOo9H%~Y z>f2X&t!n}2RpO$`x?LUS6`N8C!tc5BR{i}VEKERi?XD_!40rpmmuRo}+34Tyv)9jmJVyD`Q2&Ic;pn8J3tA*efRa%$Ay7jqWF z&`aI5z1NEXoQv*GfV}g4Q+}_UO#UE%6o+X3{yE5P$nWY>)|E4Ur~8b|wa{-hEdzJdcG-;Bx-PK-9fudMa9}V?^TC9W3{KK{MlxT11 zplN^nS$Oclnm(io@3SNjxnIkNTv*>SsElunyG94EN$Fdm=tk$L=6S#pQB^nxLksD5 z+0V>EZGbaUsqpboeivgQl^&Ver>(ghDX$zr6$?FJ=hVV!wWfgYWdsIOmCrx)-d6CwA7TWAOt+gQ4Cs5qLC6yA z8_?&MXqQ3oej?9uat)X8bb@xuP}4(Gjm2+_$s3qR$nS=J)Dfenc|O#uI~w1vM@D+r zdex^N(SR&F_WIwZ>d@5!1*9Q9qB_VMhH#o=sjHVP`WF0t@bT;7&*ckQK+-nM3NRiZ z6usS%7oEIM=ndCZHKFLmyU9QRGK}{9Ai~*Ygzi`--J6&YygBf=h*HCQnMfwMwh;i5 zJBFC?<#BZ{n1|I_H(K>05-C>TW@?KQ)+sKvM~8go`$mpH009JAJFG@rLl-I9_m<<0 zwVH$U=RT7#jb*b^_&z`GZi)uL#VqJ6?6FLE-T?xyr7%pM5&LvXq%`ipqJi!3=7420 zHetLdX|l>~zTsPey!H{E?S4>#sLS}dF+*I;nDG4?BuKD8tPO#PDKZ;b`Pb^qDG}s-j#bN*o`)=hq-zabb+u$G6AJBro*5 zugqZn{r`PS1@kQZ2eIR)-}#4(hXI^+@R!Ws5$_J1YOt!$BNwmPFpQi(I?Ub;r~PHT zKjnU6z;1DiEdc56fPj2T@7d3d?5{Y~r*wJe;dROd_Vt@kb#F*s5Y}ZBufa-n)cEy! zCnf*bv8O6#sC+ybwVB%l+tv{s62B6vCJ)eUaPgz!iEvzKOJ=r$hiAtHw67eqCj0 zr7ZYJN-;1WtxyXca|6^vz|BWwswB$5GSKQb(ZbFYS{hLSOHtX~UB2X32I0`49#Sg^ z8xEs2#Hzd86$eY8kMtXXLVhm{guf+^=BS4_jV{mcEzJ~EKC$;f9X_z&j?j5bLo+l_ zGabO7q-}BMIh4s3L&JU{^YHnp*%J)YD+HqcW3I*pwn!s4rAGG(Yw_jKN{cQ|kS5cZ zJqr(#Lr6pKC(l|OZ@xoo5c<#F`Y$aHpgq%pf>5s8D`fp!m5LO){aBUi5xPqT(~>t_ zBV*%>tj{b9ssc~hu8KjETF>JI`^2h>MPH?rUh8?^5dwvcyeLD^IDm>js)symea5&g zJ&-Y?oX6P^B_IoL^p7$mo?)j+iAH1X#}&9J0}PY7Qor;=((rXRH(p~_0fM1g+HJ2{ zYuv=w%WT)wKVS9wfvnN}=LRf!)g8#6pLoik%@vE>;UgGSSTg|pBl^*b;pw+~rW5i& zE+2I*Wfno!TfTRh*K;0faqk7L40j2N_$HgQK2!%4R!i(7y4k_O*Q!67{n!(LtZe%V z@tU5VVW;!&FrMAgp;>0LGEqHe>VA_D<&UrlU)OlnE<4K5QL94{Gh;V%$MuoQ&XC#A z9}nCo96r$%f7(j@^Hc?T%NWYdVFaqx%fp-Hlq_5s2gFbOjG9o zAfGQ;7uGXSbs%!PxDR&F+WG7s4%x8w6Y?rOqyl2tmo4m^C_L-G3;H`3cjY*kHI~=dVa>+ z>Dg+t=6>IYv}h%IOThtqgKog0!rBRdpy@^6p|Bp1{JQ^f@qNGJAl7>%3vzJwttSk< z8j3OzPDqI5_IHdVf(aG=~nIDvk%RNIaW^~y2w^Y*gfV_WcRfHR7yq13HOADu*qvO#=3tuvt zzaHJCMMcy)q`o2-v++$MK5$HxzNgds?lV5NfTD>M{?Xrr<)`qHcyo0P4qB3zQ6V@F zIqwO*6mi$&g(u*|c@!k1NU+VHRhKN(x0+$8{8FK7bJnmBB2)`0PEn_wM9iPtwb{mynY32 zO>D{BE)nzz^vwE|NT0~!twQzyC;&byTB$JoHM#r1XoG8NE|kB>hv!#_xOGF(zPdr} zYFJ9A#bipxrlAd4h0?v?Wrvl((U_TU2V`Yk(AvxE%KrU%$v>_H0g^`p8$8_`(QSZQB*$LWP=bYx1g3C(=vvYps*m9CrPd@ zSCX;X1MD8lw6Tk-Y^nuWzUZZ%r= z$5VHgXz3)~g8W59C=E2F-p%jPt%SnLsN9xk8AcRG|J7`1Q*nxqXTido2>TFNmMXTx zPBJNo&zgN9ggzED3#pTH;s#sW;TrtV+n5DB6PUpzin$+{H_BEgj0YKdme_PX3$?p# zH^uZWhFgy}_R8UdaW=)GaDQR_^Y_QT=gEytM83}#9IwIqas{@dQL3GU5G98S2a3UMUL6TD zh{fiAe)0upnY>ybV@_O5S^1r@eR63_A53WOJpeMV+Xv}`tDH-ay|IO@_lzza8BX)t z6V@eQuMdIsXvL;QpqO6pA4JlZK`vl)^+C3k4y*k|8>Ecgdv89Ovv0qa(Ez)F;G-G} z{4j@d{rE4Ex)@H;AN#WU+1l?CA2-d(9q;k}qF>+F?Jr*oilTvx!?wKHgAm+~Ldoeo zduh+(utR#pSLwDx&4YtT>c>g&?DKsUlGS^Q$r%eKUAK*3lQEBNSjRduE7A!21(jQz zA!PHXF*VahL-_F5M9d||ElkQ=XAEVSg$tP9@EY-DUv1N+Qr zfdMo;j7|mA{KyU>V{U%X%R@mv1Ta)LUlgKTIEHH(Ge z@Y#Pcx#6wHrd2IEBkAF3&ll$@MZI#?o!lvs+XqV{GN89pvirt=Sw!nlDx_fLL<=)S z$%q{r5*o-y!v=*RP#*RDPi#cO3$4iybnCaO zS!6~aLH?gnfT9v2#q7Xv<7|FS1i@Ch?$|>22Y8fTd;JUrkajaiLIPt#840sM$xV+3 zzgMpYWFu~u-VM~aAH!Hu?x&Q2Okr12VD820=L^WwR+0L6l=Q70D?v}QD%7N%g!A&)oRFZjlCVHa1{!%J&7PV{Rk9w{gPm)z&%titZ4-fj}Z) zXwS(x(zQwTSW*)USFv2i6C<85S4NoS79mNjLT{E60EtQlo4kEot(;?mxhDJ)*+JDO2X@w$ zO$O^jy8bbNgtR$#@zY>_vV^=%jlCb@BE1k&d#zl+WMgOX<*XLFwv{ zFuI%ONG7BjboIPuDZew7;h@Q~aZcGiDw^*hkWk}gUb}U7TLxIjr9Sg4A=Pb`l(!Q) ziGC_{3dll?;>xjX+r!#GW?V)DqHDQuZ#a_Lz<_WQ4*a$mC>O3*=TzT_x^soVSKRBk?M`iSgYh<-q=wDV-*%0DiAdKS}=-* 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
  1. 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 V;7TOfQt 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 z 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

    {?Q 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 NLfuN{YF3R10016EZpQ!s literal 0 HcmV?d00001 diff --git a/service/dist/images/logo.png b/service/dist/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f29032f50c369d21b4b99b3c41a39a375d18e89b GIT binary patch literal 126799 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

    0Gf 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 literal 0 HcmV?d00001 diff --git a/service/dist/index.html b/service/dist/index.html new file mode 100644 index 000000000..7b54afa8c --- /dev/null +++ b/service/dist/index.html @@ -0,0 +1,20 @@ + + + + + + Blue Archive Auto Script + + + + + + + + + + + +

    + + diff --git a/service/dist/locales/de.json b/service/dist/locales/de.json new file mode 100644 index 000000000..3f3470719 --- /dev/null +++ b/service/dist/locales/de.json @@ -0,0 +1,449 @@ +{ + "appTitle": "BAAS", + "home": "Startseite", + "scheduler": "Planer", + "configuration": "Konfiguration", + "settings": "Einstellungen", + "updates": "Updates", + "start": "Start", + "stop": "Stopp", + "edit": "Bearbeiten", + "runningTask": "Laufende Aufgabe", + "noTaskRunning": "Derzeit wird keine Aufgabe ausgeführt", + "taskQueue": "Aufgabenwarteschlange", + "noTasksQueued": "Keine Aufgaben in der Warteschlange", + "logs": "Protokolle", + "assets": "Ressourcen", + "lastUpdated": "Zuletzt aktualisiert", + "secondsAgo": "vor {{count}} Sekunden", + "minutesAgo": "vor {{count}} Minuten", + "hoursAgo": "vor {{count}} Stunden", + "daysAgo": "vor {{count}} Tagen", + "configProfile": "Profil: {{name}}", + "addProfile": "Profil hinzufügen", + "switch.on": "Ein", + "switch.off": "Aus", + "confirm": "Bestätigen", + "cancel": "Abbrechen", + "save": "Speichern", + "settingsSaved": "Einstellungen gespeichert!", + "featureSettings": "Funktionseinstellungen", + "cafe": "Café", + "cafeDesc": "Café-Einladungen und Belohnungen verwalten", + "schedule": "Zeitplan", + "scheduleDesc": "Tägliche Zeitpläne konfigurieren", + "shop": "Shop-Käufe", + "shopDesc": "Kaufprioritäten für Gegenstände festlegen", + "arena": "Arena", + "arenaDesc": "Arenakämpfe automatisieren", + "generalSettings": "Allgemeine Einstellungen", + "server": "Server", + "serverDesc": "Spielserver- und Verbindungseinstellungen", + "emulator": "Emulator", + "emulatorDesc": "Emulator-Pfad und Startoptionen", + "push": "Push-Benachrichtigungen", + "pushDesc": "Push-Benachrichtigungen konfigurieren", + "other": "Sonstiges", + "otherDesc": "Verschiedene Funktionen und Einstellungen", + "taskOverview": "Aufgabenübersicht", + "uiSettings": "UI-Einstellungen", + "theme": "Thema", + "light": "Hell", + "dark": "Dunkel", + "system": "System", + "language": "Sprache", + "english": "English", + "chinese": "简体中文", + "japanese": "日本語", + "korean": "한국어", + "russian": "Русский", + "french": "Français", + "deutsch": "Deutsch", + "cafe.useInvitation": "Einladungsticket verwenden", + "cafe.patRounds": "Streichelrunden", + "cafe.patRoundsDesc": "Höhere Runden verringern die Wahrscheinlichkeit, Streicheleinheiten zu verpassen", + "server.server": "Spielserver", + "server.cn.official": "Offiziell (CN)", + "server.cn.bilibili": "Bilibili (CN)", + "server.global": "Global", + "server.global.teen": "Global (Teen)", + "server.kr.one": "Korea (ONE store)", + "server.jp": "Japan", + "server.adbIP": "ADB IP-Adresse", + "server.adbPort": "ADB-Port", + "comingSoon.title": "Demnächst verfügbar", + "comingSoon.desc": "Die Konfiguration für diese Funktion wurde noch nicht implementiert.", + "schedule.title": "Tagesaufgabenplan", + "schedule.desc": "Wählen Sie die täglichen Aufgaben aus, die automatisiert werden sollen.", + "schedule.cafe": "Café-Interaktion", + "schedule.lessons": "Lektionen", + "schedule.bounty": "Kopfgeld", + "schedule.commissions": "Kommissionen", + "schedule.shop": "Shop-Kauf", + "shop.title": "Einstellungen für Shop-Käufe", + "shop.buyAp": "AP mit Pyroxenen kaufen", + "shop.buyApDesc": "AP automatisch kaufen, wenn sie nicht ausreichen.", + "shop.refreshAp": "AP mit Pyroxenen auffrischen", + "shop.refreshApDesc": "Erlaubt das Ausgeben von Pyroxenen zum Auffrischen von AP.", + "arena.title": "Arena-Automatisierung", + "arena.enable": "Arena-Automatisierung aktivieren", + "arena.enableDesc": "Gegner in der Arena automatisch herausfordern.", + "arena.attempts": "Tägliche Herausforderungsversuche", + "emulator.title": "Emulator-Einstellungen", + "emulator.autoStart": "Emulator automatisch starten", + "emulator.autoStartDesc": "Das Skript versucht, den Emulator zu starten, wenn er nicht läuft.", + "emulator.path": "Emulator-Pfad", + "emulator.pathDesc": "Geben Sie den vollständigen Pfad zur ausführbaren Datei des Emulators an.", + "push.title": "Einstellungen für Push-Benachrichtigungen", + "push.enable": "Push-Benachrichtigungen aktivieren", + "push.enableDesc": "Benachrichtigungen senden, wenn Aufgaben abgeschlossen sind oder Probleme auftreten.", + "push.webhookUrl": "Webhook-URL", + "push.webhookUrlPlaceholder": "Geben Sie Ihre Webhook-URL ein (z. B. Bark, ServerChan)", + "other.title": "Andere Einstellungen", + "other.screenshotOnError": "Screenshot bei Fehler", + "other.screenshotOnErrorDesc": "Automatisch einen Screenshot machen, wenn das Skript auf einen Fehler stößt.", + "property.ap": "AP", + "property.credits": "Credits", + "property.pyroxene": "Pyroxen", + "property.coin.arena": "Arena-Münze", + "property.coin.commission": "Kommissions-Münze", + "property.keystone": "Schlussstein", + "property.keystone.piece": "Stück", + "property.pass": "Pass", + "log.scroll": "Nach unten scrollen", + "log.scroll.detail": "Das Protokolltextfeld nach unten scrollen", + "assetsDisplay.detail": "Ressourcendetails anzeigen", + "hotkeys": "Tastenkombinationen", + "Invalid hotkey format": "Ungültiges Tastenkombinationsformat", + "Duplicated hotkey": "Doppelte Tastenkombination", + "Use combinations like": "Verwenden Sie Kombinationen wie", + "Leave empty to unbind": "Leer lassen, um die Bindung aufzuheben", + "Please fix invalid or duplicated hotkeys.": "Bitte beheben Sie ungültige oder doppelte Tastenkombinationen.", + "hotkey.switch.start": "Start/Stopp", + "hotkey.toggle.scroll": "Nach unten scrollen umschalten", + "hotkey.open.settings": "Einstellungen öffnen", + "hotkey.clear.logs": "Protokolle löschen", + "hotkey.focus.search": "Suche fokussieren", + "hotkey.help.about": "Hilfe / Über", + "Search hotkeys": "Tastenkombinationen suchen", + "student.search": "Schüler suchen", + "log.export": "Protokolle exportieren", + "nextTask": "Nächste Aufgabe", + "rename": "Umbenennen", + "delete": "Löschen", + "editProfile": "Profil bearbeiten", + "profileName": "Profilname", + "createProfile": "Profil erstellen", + "creditpoints": "Kreditpunkte", + "pyroxene": "Pyroxen", + "confirmDeleteTitle": "Löschung bestätigen", + "confirmDeleteMessage": "Sind Sie sicher, dass Sie das Profil '{{name}}' löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden!", + "ui.zoom": "UI-Zoom-Einstellungen", + "commonShop.title": "Allgemeiner Shop", + "tacticalShop.title": "Taktischer Herausforderungsshop", + "commonShop.refreshTimes": "Anzahl der Shop-Aktualisierungen", + "commonShop.refreshDesc": "Shop automatisch aktualisieren", + "add": "Hinzufügen", + "Add Student": "Schüler hinzufügen", + "placeholder.config.insert": "Bitte geben Sie hier Ihre Konfiguration ein", + "placeholder.stage": "Schüler auswählen", + "stage.normalLabel": "Tägliches Sweepen normaler Stufen", + "stage.hardLabel": "Tägliches Sweepen schwerer Stufen", + "dailySweep": "Täglich", + "dailySweepDesc": "Einstellungen für tägliches Stufenräumen und Sweepen", + "placeholder.nobinding": "Nicht gebunden", + "tactical": "Großangriff", + "tacticalDesc": "Einstellungen für den Großangriff", + "drill": "Gemeinsame Feuerübung", + "drillDesc": "Einstellungen für die gemeinsame Feuerübung", + "artifact": "Herstellung", + "artifactDesc": "Herstellungseinstellungen", + "whitelist": "Freunde-Whitelist", + "whitelistDesc": "Whitelist für das automatische Löschen von Freunden", + "script": "Skripteinstellungen", + "scriptDesc": "Einstellungen zur Skriptausführung", + "stage": "Stufe abschließen", + "stageDesc": "Hilft Ihnen, Stufen automatisch abzuschließen", + "team": "Formation", + "teamDesc": "Richten Sie Ihre Formationen ein", + "eventName.restart": "Neustart um 4 Uhr morgens", + "eventName.arena": "Arena", + "eventName.cafe_reward": "Café", + "eventName.no1_cafe_invite": "Einladung Café 1", + "eventName.no2_cafe_invite": "Einladung Café 2", + "eventName.lesson": "Lektionen", + "eventName.group": "Clubeinnahmen einsammeln", + "eventName.collect_daily_free_power": "Kostenlose AP einsammeln", + "eventName.mail": "Post prüfen", + "eventName.collect_daily_power": "Tägliche AP einsammeln", + "eventName.common_shop": "Shop-Kauf", + "eventName.tactical_challenge_shop": "Kauf im taktischen Herausforderungsshop", + "eventName.rewarded_task": "Kopfgeld", + "eventName.normal_task": "AP in normalen Stufen verbrauchen", + "eventName.hard_task": "AP in schweren Stufen verbrauchen", + "eventName.scrimmage": "Kommissionen", + "eventName.clear_special_task_power": "Tägliche Spezialmissionen", + "eventName.create": "Automatische Herstellung", + "eventName.total_assault": "Großangriff", + "eventName.activity_sweep": "Event-Sweep", + "eventName.collect_reward": "Belohnungen einsammeln", + "eventName.momo_talk": "Automatisches MomoTalk", + "eventName.dailyGameActivity": "Tägliches Minispiel", + "eventName.friend": "Freundesliste aufräumen", + "eventName.joint_firing_drill": "Gemeinsame Feuerübung", + "eventName.pass": "Pass-Belohnungen beanspruchen", + "scheduler.inactiveTasks": "Inaktive Aufgaben", + "scheduler.activeTasks": "Aktive Aufgaben", + "scheduler.search": "Aufgaben suchen", + "scheduler.sortDefault": "Standard-Sortierung", + "scheduler.sortByTime": "Nach Zeit sortieren", + "scheduler.detailConfig": "Detaillierte Aufgabenplankonfiguration", + "scheduler.eventName": "Aufgabenname", + "scheduler.nextTick": "Nächste Ausführungszeit", + "scheduler.priority": "Priorität", + "scheduler.interval": "Intervall (Sekunden)", + "scheduler.dailyReset": "Tägliche Rücksetzzeit", + "scheduler.disabledRange": "Deaktivierter Zeitbereich", + "scheduler.preTask": "Vorausgehende Aufgabe", + "scheduler.postTask": "Nachfolgende Aufgabe", + "common.confirm": "Bestätigen", + "scheduler.selector": "Aufgabenauswahl", + "cafe.basicSettings": "Grundlegende Café-Einstellungen", + "cafe.cafe1Settings": "Einstellungen Café 1", + "cafe.cafe2Settings": "Einstellungen Café 2", + "cafe.collectReward": "Belohnungen einsammeln", + "cafe.exchangeStudent": "Schüler wechselt Outfit", + "cafe.duplicateInvite": "Doppelte Einladung", + "cafe.hasNo2Cafe": "Café 2", + "cafe.patStyle": "Streichelstil", + "cafe.patStyleDragGift": "Geschenk ziehen", + "cafe.invite1Mode": "Einladungsmodus", + "cafe.invite2Mode": "Einladungsmodus", + "cafe.lowestAffection": "Nach niedrigster Zuneigung", + "cafe.highestAffection": "Nach höchster Zuneigung", + "cafe.starred": "Nach favorisierten Schülern", + "cafe.byName": "Nach Schülernamen", + "cafe.starredPosition": "Position favorisierter Schüler", + "cafe.cafe1Students": "Liste der Schülernamen", + "cafe.cafe2Students": "Liste der Schülernamen", + "lesson.enableFavorStudent": "Favorisierte Schüler bevorzugen", + "lesson.relationshipFirst": "Schüler mit hoher Zuneigung bevorzugen", + "lesson.region": "Lektionsregion", + "lesson.favorStudent": "Favorisierte Schüler", + "artifact.global": "Globale Einstellungen", + "artifact.phase_1": "Phase 1", + "artifact.phase_2": "Phase 2", + "artifact.phase_3": "Phase 3", + "artifact.useTicketDesc": "Herstellungstickets verwenden", + "artifact.createTime": "Anzahl der Herstellungen", + "artifact.phaseCount": "Herstellungsphase", + "artifact.materialSelect": "Materialauswahl", + "artifact.phase2.recommend": "Empfehlung basierend auf Schüler", + "artifact.selectStudent": "Schüler auswählen", + "artifact.priority": "Priorität", + "artifact.default": "Standard", + "artifact.white": "Weiß", + "artifact.blue": "Blau", + "artifact.whiteBlue": "Weiß & Blau", + "artifact.gold": "Gold", + "artifact.purple": "Lila", + "artifact.goldPurple": "Gold & Lila", + "artifact.all": "Alle", + "artifact.saved": "Einstellungen gespeichert", + "artifact.savedDesc": "Ihre Herstellungseinstellungen wurden gespeichert.", + "arena.higherLevel": "Gegnerlevel höher als deins um", + "arena.max_refresh_times": "Maximale Aktualisierungsversuche", + "arena.opponent_no": "Gegnernummer", + "stage.dailyTab": "Stufen-Sweep", + "stage.sweepTab": "Sweep-Details", + "sweep.rewarded": "Anzahl der Kopfgeld-Sweeps", + "sweep.scrimmage": "Anzahl der Kommissions-Sweeps", + "sweep.activityNumber": "Event-Stufe für Sweep", + "sweep.activityTimes": "Anzahl der Event-Stufen-Sweeps", + "sweep.special": "Anzahl der Spezialmissions-Sweeps", + "sweep.purchaseRewarded": "Anzahl der gekauften Kopfgeldtickets", + "sweep.purchaseLesson": "Anzahl der gekauften Lektionstickets", + "sweep.purchaseScrimmage": "Anzahl der gekauften Kommissionstickets", + "stage.normalDesc": "Normale Stufen und Anzahl (z. B. \"1-1-1,1-2-3\" bedeutet Stufe 1-1 einmal, dann 1-2 dreimal)", + "stage.hardDesc": "Einstellungen für schwere Stufen sind gleich. Hinweis: max. 3 Versuche. Englische Kommas verwenden. Für JP/Global-Server kann 'max' verwendet werden.", + "stage.selectStudent": "Schüler auswählen", + "tactical.hardLevel": "Schwierigkeit des Großangriffs", + "drill.out_partyNo": "Teamnummer", + "drill.difficulty": "Übungsschwierigkeit", + "drill.useAllAfterSweep": "Alle Übungstickets nach dem Einsatz verwenden", + "friend.placeholder": "Freundescode eingeben", + "friend.add": "Hinzufügen", + "friend.empty": "Freunde-Whitelist ist leer", + "friend.addFailed": "Hinzufügen fehlgeschlagen", + "friend.alreadyExists": "Freund existiert bereits", + "friend.addedSuccess": "Erfolgreich hinzugefügt", + "friend.added": "Freund hinzugefügt:", + "friend.deletedSuccess": "Erfolgreich gelöscht", + "friend.deleted": "Freund gelöscht:", + "friend.invalidLength": "Ungültige Freundescode-Länge", + "adb.title": "ADB-Erkennungsfeld", + "adb.detectBtn": "ADB erkennen", + "adb.detecting": "Erkenne ADB...", + "adb.noData": "Keine ADB-Daten verfügbar", + "script.screenshotInterval": "Screenshot-Intervall (Sekunden)", + "script.autostart": "Automatischer Start bei Skriptstart", + "script.screenshotMethod": "Screenshot-Methode", + "script.controlMethod": "Steuerungsmethode", + "script.then": "Aktion nach Aufgabenabschluss", + "script.doNothing": "Nichts tun", + "script.exitBaas": "Blue Archive beenden", + "script.exitEmu": "Emulator beenden", + "script.exitBoth": "Blue Archive und Emulator beenden", + "script.shutdown": "Computer herunterfahren", + "emulator.openOnLaunch": "Emulator bei Skriptstart öffnen", + "emulator.multiInstance": "Emulator-Multi-Instanz", + "emulator.waitTime": "Wartezeit für Emulatorstart (Sekunden)", + "emulator.multiType": "Emulatortyp", + "emulator.instanceCount": "Nummer der Multi-Instanz", + "emulator.address": "Emulator-Pfad", + "choose": "Wählen", + "execute": "Ausführen", + "stage.exploreTab": "Hauptgeschichte", + "stage.eventTab": "Event-Stufen", + "stage.manualBoss": "Manueller Bosskampf", + "stage.normalTask": "Normale Mission", + "stage.hardTask": "Schwere Mission", + "stage.currentEvent": "Aktuelles Event", + "stage.story": "Story-Stufen abschließen", + "stage.mission": "Missions-Stufen abschließen", + "stage.challenge": "Herausforderungs-Stufen abschließen", + "stage.attrTable": "Referenztabelle der Stufenattribute", + "stage.noEvent": "Derzeit kein Event", + "team.chooseMethod": "Formationsmethode", + "push.afterError": "Push-Nachricht bei Fehler", + "push.afterCompletion": "Push-Nachricht nach Abschluss aller Aufgaben", + "push.json": "JSON-Push", + "push.serverchan": "ServerChan-Push", + "other.fhx": "Ein-Klick-Anti-Zensur", + "other.fhxDesc": "Versucht, den Anti-Zensur-Patch anzuwenden (CN-exklusiv)", + "versionInfo": "Versionsinformationen", + "localVersion": "Aktuelle Version", + "remoteVersion": "Neueste Version", + "updateMethod": "Aktion", + "globalUpdateSettings": "Update-Einstellungen", + "updateChannel": "Update-Kanal", + "mirrorCdk": "MirrorC CDK (Optional)", + "mirror.verify": "CDK überprüfen", + "mirror.verifying": "Überprüfe", + "mc.verify.success": "MirrorC CDK-Überprüfung erfolgreich!", + "mc.verify.error": "Fehler bei der MirrorC CDK-Überprüfung!", + "enterCdk": "CDK eingeben", + "shaConnectivityTest": "SHA-Abrufmethode", + "shaTest.method": "Methode", + "shaTest.status": "Status", + "shaTest.time": "Benötigte Zeit", + "shaTest.sha": "SHA-Wert", + "shaTest.testing": "Teste SHA...", + "shaTest.testAll": "Alle Methoden testen", + "configAdd.nameRequired": "Profilname darf nicht leer sein", + "configAdd.serverRequired": "Ein Server muss angegeben werden", + "configAdd.nameDuplicate": "Profilname existiert bereits", + "configAdd.selectServer": "Bitte einen Server auswählen", + "create": "Erstellen", + "settings.updateSuccess": "Einstellungen erfolgreich aktualisiert", + "settings.updateSuccessDesc": "Ihre Einstellungen wurden erfolgreich aktualisiert.", + "stage.story.main": "Hauptgeschichte abschließen", + "stage.story.group": "Club-Geschichten abschließen", + "stage.story.mini": "Mini-Geschichten abschließen", + "stage.taskTriggerStart": "Aufgabe wurde verteilt", + "stage.taskTriggered": "Verteilte Aufgabe: {{task}}", + "stage.noHardTask": "Keine schweren Stufen festgelegt!", + "stage.noNormalTask": "Keine normalen Stufen festgelegt!", + "start_hard_task": "Schwere Stufen starten", + "start_normal_task": "Normale Stufen starten", + "start_fhx": "Anti-Zensur anwenden", + "start_main_story": "Hauptgeschichte starten", + "start_group_story": "Club-Geschichten starten", + "start_mini_story": "Mini-Geschichten starten", + "start_explore_activity_story": "Event-Geschichte starten", + "start_explore_activity_mission": "Event-Missionen starten", + "start_explore_activity_challenge": "Event-Herausforderungen starten", + "main_story": "Hauptgeschichte abschließen", + "group_story": "Club-Geschichten abschließen", + "mini_story": "Mini-Geschichten abschließen", + "explore_activity_story": "Event-Geschichte abschließen", + "explore_activity_mission": "Event-Missionen abschließen", + "explore_activity_challenge": "Event-Herausforderungen abschließen", + "de_clothes": "Anti-Zensur", + "explore_hard_task": "Schwere Stufen abschließen", + "explore_normal_task": "Normale Stufen abschließen", + "title.updateSetting": "Update", + "shaMethod.github": "GitHub API", + "shaMethod.mirrorc": "Kostenlose MirrorC API", + "shaMethod.gitee": "Gitee-Repository", + "shaMethod.gitcode": "GitCode-Repository", + "shaMethod.tencent_c_coding": "Tencent Cloud Coding-Repository", + "cdk.noCDKInput": "Bitte geben Sie den MirrorC CDK ein!", + "CDK invalid.": "CDK ungültig.", + "CDK valid.": "CDK gültig.", + "Please confirm that you have entered the correct cdkey": "Bitte bestätigen Sie, dass Sie den korrekten CDK eingegeben haben", + "CDK valid. Expires at {}": "Dieser CDK ist gültig bis {{expire_date}}.", + "CDK expired.": "CDK ist abgelaufen.", + "CDK quota exhausted for today.": "CDK läuft heute ab.", + "CDK mismatched for requested resource.": "CDK stimmt nicht mit dem angeforderten Repository überein.", + "CDK blocked.": "CDK wurde vom Administrator gesperrt.", + "CDK Test OK": "CDK-Überprüfung erfolgreich", + "version.fetching": "Wird abgerufen...", + "version.untested": "Nicht getestet", + "version.testing": "Wird getestet...", + "version.tapToTest": "Auf Updates prüfen", + "version.checkError": "Version konnte nicht abgerufen werden", + "heartbeat.connected": "Dienst verbunden", + "heartbeat.connecting": "Verbinde mit Dienst...", + "updateMethod.github": "GitHub (Haupt-Repository)", + "updateMethod.gitee": "Gitee (China-Spiegel)", + "updateMethod.gitcode": "GitCode (China-Spiegel)", + "updateMethod.tencent": "Tencent Cloud Coding (China-Spiegel)", + "updateMethod.mirrorc": "MirrorC Update", + "update.dueDate": "Ablaufdatum", + "placeholder.profileName": "Geben Sie hier Ihren Profilnamen ein", + "update.available": "Neue Version verfügbar", + "property.burst": "Explosiv", + "property.pierce": "Durchdringend", + "property.mystic": "Mystisch", + "property.shock": "Schall", + "property.Unused": "Unbenutzt", + "team.preset": "Nach voreingestellter Formation", + "team.side": "Nach Seitenleisten-Attributen", + "team.order": "Nach Seitenleisten-Reihenfolge", + "schedule.primary": "Anfänger", + "schedule.normal": "Normal", + "schedule.advanced": "Fortgeschritten", + "schedule.superior": "Experte", + "lesson.times": "Lektionsversuche", + "confirmUpdateTitle": "Update bestätigen", + "updatePrompt": "Eine neue Version wurde erkannt, jetzt aktualisieren?", + "updateNotice": "Bitte stoppen Sie alle laufenden Aufgaben vor dem Update.", + "title.wiki": "Doku", + "wiki": { + "title": "Wiki-Dokumentation", + "subtitle": "Ein standardisierter Leitfaden und ein Betriebshandbuch für die BAAS-Automatisierungsplattform.", + "searchPlaceholder": "Nach Thema, Schlüsselwort oder Tag suchen...", + "clearSearch": "Suche löschen", + "resultsCount": "{{count}} Dokumente gefunden", + "noResults": "Keine Dokumente entsprechen den aktuellen Filterkriterien.", + "selectDocument": "Bitte wählen Sie links ein Dokument aus, um dessen Inhalt anzuzeigen.", + "category": { + "all": "Alle", + "architecture": "Architektur", + "getting-started": "Erste Schritte", + "environment": "Umgebungseinrichtung", + "configuration": "Konfigurationsmanagement", + "operations": "Betrieb", + "support": "Support & Feedback", + "formation": "Formationsstrategie" + } + }, + "enterSecretTitle": "Öffentlichen Schlüssel eingeben", + "enterSecretPrompt": "Der öffentliche Schlüssel ist für die sichere Kommunikation erforderlich.", + "secretLabel": "Öffentlicher Schlüssel", + "secretPlaceholder": "Bitte geben Sie hier Ihren öffentlichen Schlüssel ein", + "secretRequired": "Der öffentliche Schlüssel muss eingegeben werden!", + "secretNotice": "Der öffentliche Schlüssel kann aus der Datei service.secret im Backend-Server abgerufen werden.", + "Confirm": "Bestätigen" +} \ No newline at end of file diff --git a/service/dist/locales/de.json.br b/service/dist/locales/de.json.br new file mode 100644 index 0000000000000000000000000000000000000000..f1ed6bab5b504265aadee70531bc345084777daf GIT binary patch literal 6286 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 E0KS-3!~g&Q literal 0 HcmV?d00001 diff --git a/service/dist/locales/en.json b/service/dist/locales/en.json new file mode 100644 index 000000000..339274a3d --- /dev/null +++ b/service/dist/locales/en.json @@ -0,0 +1,450 @@ +{ + "appTitle": "BAAS", + "home": "Home", + "scheduler": "Scheduler", + "configuration": "Configuration", + "settings": "Settings", + "updates": "Updates", + "start": "Start", + "stop": "Stop", + "edit": "Edit", + "runningTask": "Running Task", + "noTaskRunning": "No task is currently running", + "taskQueue": "Task Queue", + "noTasksQueued": "No tasks in the queue", + "logs": "Logs", + "assets": "Assets", + "lastUpdated": "Last Updated", + "secondsAgo": "{{count}} seconds ago", + "minutesAgo": "{{count}} minutes ago", + "hoursAgo": "{{count}} hours ago", + "daysAgo": "{{count}} days ago", + "configProfile": "Profile: {{name}}", + "addProfile": "Add Profile", + "switch.on": "On", + "switch.off": "Off", + "confirm": "Confirm", + "cancel": "Cancel", + "save": "Save", + "settingsSaved": "Settings saved!", + "featureSettings": "Feature Settings", + "cafe": "Cafe", + "cafeDesc": "Manage cafe invitations and rewards", + "schedule": "Schedule", + "scheduleDesc": "Configure daily schedules", + "shop": "Shop Purchases", + "shopDesc": "Set item purchase priorities", + "arena": "Arena", + "arenaDesc": "Automate arena battles", + "generalSettings": "General Settings", + "server": "Server", + "serverDesc": "Game server and connection settings", + "emulator": "Emulator", + "emulatorDesc": "Emulator path and startup options", + "push": "Push Notifications", + "pushDesc": "Configure push notifications", + "other": "Other", + "otherDesc": "Miscellaneous features and settings", + "taskOverview": "Task Overview", + "uiSettings": "UI Settings", + "theme": "Theme", + "light": "Light", + "dark": "Dark", + "system": "System", + "language": "Language", + "english": "English", + "chinese": "简体中文", + "japanese": "日本語", + "korean": "한국어", + "russian": "Русский", + "french": "Français", + "deutsch": "Deutsch", + "cafe.useInvitation": "Use Invitation Ticket", + "cafe.patRounds": "Patting Rounds", + "cafe.patRoundsDesc": "Higher rounds reduce the chance of missing pats", + "server.server": "Game Server", + "server.cn.official": "Official (CN)", + "server.cn.bilibili": "Bilibili (CN)", + "server.global": "Global", + "server.global.teen": "Global (Teen)", + "server.kr.one": "Korea (ONE store)", + "server.jp": "Japan", + "server.adbIP": "ADB IP Address", + "server.adbPort": "ADB Port", + "comingSoon.title": "Coming Soon", + "comingSoon.desc": "Configuration for this feature has not been implemented yet.", + "schedule.title": "Daily Task Schedule", + "schedule.desc": "Select the daily tasks to be automated.", + "schedule.cafe": "Cafe Interaction", + "schedule.lessons": "Lessons", + "schedule.bounty": "Bounty", + "schedule.commissions": "Commissions", + "schedule.shop": "Shop Purchase", + "shop.title": "Shop Purchase Settings", + "shop.buyAp": "Buy AP with Pyroxenes", + "shop.buyApDesc": "Automatically buy AP when it's insufficient.", + "shop.refreshAp": "Refresh AP with Pyroxenes", + "shop.refreshApDesc": "Allow spending Pyroxenes to refresh AP.", + "arena.title": "Arena Automation", + "arena.enable": "Enable Arena Automation", + "arena.enableDesc": "Automatically challenge opponents in the arena.", + "arena.attempts": "Daily Challenge Attempts", + "emulator.title": "Emulator Settings", + "emulator.autoStart": "Auto-start Emulator", + "emulator.autoStartDesc": "The script will try to start the emulator if it's not running.", + "emulator.path": "Emulator Path", + "emulator.pathDesc": "Provide the full path to the emulator executable.", + "push.title": "Push Notification Settings", + "push.enable": "Enable Push Notifications", + "push.enableDesc": "Send notifications when tasks are completed or issues occur.", + "push.webhookUrl": "Webhook URL", + "push.webhookUrlPlaceholder": "Enter your Webhook URL (e.g., Bark, ServerChan)", + "other.title": "Other Settings", + "other.screenshotOnError": "Screenshot on Error", + "other.screenshotOnErrorDesc": "Automatically take a screenshot when the script encounters an error.", + "property.ap": "AP", + "property.credits": "Credits", + "property.pyroxene": "Pyroxene", + "property.coin.arena": "Arena Coin", + "property.coin.commission": "Commission Coin", + "property.keystone": "Keystone", + "property.keystone.piece": "Piece", + "property.pass": "Pass", + "log.scroll": "Scroll to Bottom", + "log.scroll.detail": "Scroll the log text box to the bottom", + "assetsDisplay.detail": "Display Asset Details", + "hotkeys": "Hotkeys", + "Invalid hotkey format": "Invalid hotkey format", + "Duplicated hotkey": "Duplicated hotkey", + "Use combinations like": "Use combinations like", + "Leave empty to unbind": "Leave empty to unbind", + "Please fix invalid or duplicated hotkeys.": "Please fix invalid or duplicated hotkeys.", + "hotkey.switch.start": "Start/Stop", + "hotkey.toggle.scroll": "Toggle Scroll to Bottom", + "hotkey.open.settings": "Open Settings", + "hotkey.clear.logs": "Clear Logs", + "hotkey.focus.search": "Focus Search", + "hotkey.help.about": "Help / About", + "Search hotkeys": "Search hotkeys", + "student.search": "Search Student", + "log.export": "Export Logs", + "nextTask": "Next Task", + "rename": "Rename", + "delete": "Delete", + "editProfile": "Edit Profile", + "profileName": "Profile Name", + "createProfile": "Create Profile", + "creditpoints": "Credits", + "pyroxene": "Pyroxene", + "confirmDeleteTitle": "Confirm Deletion", + "confirmDeleteMessage": "Are you sure you want to delete the profile '{{name}}'? This action cannot be undone!", + "ui.zoom": "UI Zoom Settings", + "commonShop.title": "Common Shop", + "tacticalShop.title": "Tactical Challenge Shop", + "commonShop.refreshTimes": "Shop Refresh Count", + "commonShop.refreshDesc": "Automatically refresh the shop", + "add": "Add", + "Add Student": "Add Student", + "placeholder.config.insert": "Please type your configuration here", + "placeholder.stage": "Select Student", + "stage.normalLabel": "Normal Stage Daily Sweep", + "stage.hardLabel": "Hard Stage Daily Sweep", + "dailySweep": "Daily", + "dailySweepDesc": "Daily stage clearing and sweep settings", + "placeholder.nobinding": "Not bound", + "tactical": "Total Assault", + "tacticalDesc": "Total Assault settings", + "drill": "Joint Firing Drill", + "drillDesc": "Joint Firing Drill settings", + "artifact": "Crafting", + "artifactDesc": "Crafting settings", + "whitelist": "Friend Whitelist", + "whitelistDesc": "Whitelist for auto-deleting friends", + "script": "Script Settings", + "scriptDesc": "Script execution related settings", + "stage": "Stage Clear", + "stageDesc": "Helps you clear stages automatically", + "team": "Formation", + "teamDesc": "Set up your formations", + "eventName.restart": "Restart at 4 AM", + "eventName.arena": "Arena", + "eventName.cafe_reward": "Cafe", + "eventName.no1_cafe_invite": "Cafe 1 Invitation", + "eventName.no2_cafe_invite": "Cafe 2 Invitation", + "eventName.lesson": "Lessons", + "eventName.group": "Collect Club Earnings", + "eventName.collect_daily_free_power": "Collect Free AP", + "eventName.mail": "Check Mail", + "eventName.collect_daily_power": "Collect Daily AP", + "eventName.common_shop": "Shop Purchase", + "eventName.tactical_challenge_shop": "Tactical Challenge Shop Purchase", + "eventName.rewarded_task": "Bounty", + "eventName.normal_task": "Clear AP on Normal Stages", + "eventName.hard_task": "Clear AP on Hard Stages", + "eventName.scrimmage": "Commissions", + "eventName.clear_special_task_power": "Daily Special Missions", + "eventName.create": "Auto Crafting", + "eventName.total_assault": "Total Assault", + "eventName.activity_sweep": "Event Sweep", + "eventName.collect_reward": "Collect Rewards", + "eventName.momo_talk": "Auto MomoTalk", + "eventName.dailyGameActivity": "Daily Mini-game", + "eventName.friend": "Clean up Friends List", + "eventName.joint_firing_drill": "Joint Firing Drill", + "eventName.pass": "Claim Pass Rewards", + "scheduler.inactiveTasks": "Inactive Tasks", + "scheduler.activeTasks": "Active Tasks", + "scheduler.search": "Search Tasks", + "scheduler.sortDefault": "Default Sort", + "scheduler.sortByTime": "Sort by Time", + "scheduler.detailConfig": "Detailed Task Schedule Configuration", + "scheduler.eventName": "Task Name", + "scheduler.nextTick": "Next Execution Time", + "scheduler.priority": "Priority", + "scheduler.interval": "Interval (seconds)", + "scheduler.dailyReset": "Daily Reset Time", + "scheduler.disabledRange": "Disabled Time Range", + "scheduler.preTask": "Prerequisite Task", + "scheduler.postTask": "Post-Task", + "common.confirm": "Confirm", + "scheduler.selector": "Task Selector", + "cafe.basicSettings": "Basic Cafe Settings", + "cafe.cafe1Settings": "Cafe 1 Settings", + "cafe.cafe2Settings": "Cafe 2 Settings", + "cafe.collectReward": "Collect Rewards", + "cafe.exchangeStudent": "Student Changes Outfit", + "cafe.duplicateInvite": "Duplicate Invite", + "cafe.hasNo2Cafe": "Cafe 2", + "cafe.patStyle": "Patting Style", + "cafe.patStyleDragGift": "Drag Gift", + "cafe.invite1Mode": "Invitation Mode", + "cafe.invite2Mode": "Invitation Mode", + "cafe.lowestAffection": "By Lowest Affection", + "cafe.highestAffection": "By Highest Affection", + "cafe.starred": "By Starred Students", + "cafe.byName": "By Student Name", + "cafe.starredPosition": "Starred Student Position", + "cafe.cafe1Students": "Student Name List", + "cafe.cafe2Students": "Student Name List", + "lesson.enableFavorStudent": "Prioritize starred students", + "lesson.relationshipFirst": "Prioritize students with high affection", + "lesson.region": "Lesson Region", + "lesson.favorStudent": "Starred Students", + "artifact.global": "Global Settings", + "artifact.phase_1": "Phase 1", + "artifact.phase_2": "Phase 2", + "artifact.phase_3": "Phase 3", + "artifact.useTicketDesc": "Use crafting tickets", + "artifact.createTime": "Crafting Count", + "artifact.phaseCount": "Crafting Phase", + "artifact.materialSelect": "Material Selection", + "artifact.phase2.recommend": "Recommend based on student", + "artifact.selectStudent": "Select Student", + "artifact.priority": "Priority", + "artifact.default": "Default", + "artifact.white": "White", + "artifact.blue": "Blue", + "artifact.whiteBlue": "White & Blue", + "artifact.gold": "Gold", + "artifact.purple": "Purple", + "artifact.goldPurple": "Gold & Purple", + "artifact.all": "All", + "artifact.saved": "Settings Saved", + "artifact.savedDesc": "Your crafting settings have been saved.", + "arena.higherLevel": "Opponent level higher than yours by", + "arena.max_refresh_times": "Max Refresh Times", + "arena.opponent_no": "Opponent Number", + "stage.dailyTab": "Stage Sweep", + "stage.sweepTab": "Sweep Details", + "sweep.rewarded": "Bounty Sweep Count", + "sweep.scrimmage": "Commissions Sweep Count", + "sweep.activityNumber": "Event Stage Sweep Stage", + "sweep.activityTimes": "Event Stage Sweep Count", + "sweep.special": "Special Mission Sweep Count", + "sweep.purchaseRewarded": "Bounty Ticket Purchase Count", + "sweep.purchaseLesson": "Lesson Ticket Purchase Count", + "sweep.purchaseScrimmage": "Commissions Ticket Purchase Count", + "stage.normalDesc": "Normal stages and counts (e.g., \"1-1-1,1-2-3\" means stage 1-1 once, then 1-2 three times)", + "stage.hardDesc": "Hard stage settings are the same as above. Note: max 3 attempts. Use English commas. For JP/Global servers, 'max' can be used.", + "stage.selectStudent": "Select Student", + "tactical.hardLevel": "Total Assault Difficulty", + "drill.out_partyNo": "Team Number", + "drill.difficulty": "Drill Difficulty", + "drill.useAllAfterSweep": "Use all drill tickets after sortie", + "friend.placeholder": "Enter Friend Code", + "friend.add": "Add", + "friend.empty": "Friend whitelist is empty", + "friend.addFailed": "Failed to add", + "friend.alreadyExists": "Friend already exists", + "friend.addedSuccess": "Added successfully", + "friend.added": "Friend added:", + "friend.deletedSuccess": "Deleted successfully", + "friend.deleted": "Friend deleted:", + "friend.invalidLength": "Invalid friend code length", + "adb.title": "ADB Detection Panel", + "adb.detectBtn": "Detect ADB", + "adb.detecting": "Detecting ADB...", + "adb.noData": "No ADB data available", + "script.screenshotInterval": "Screenshot Interval (seconds)", + "script.autostart": "Auto-start when script launches", + "script.screenshotMethod": "Screenshot Method", + "script.controlMethod": "Control Method", + "script.then": "Action after task completion", + "script.doNothing": "Do nothing", + "script.exitBaas": "Exit Blue Archive", + "script.exitEmu": "Exit Emulator", + "script.exitBoth": "Exit Blue Archive and Emulator", + "script.shutdown": "Shutdown Computer", + "emulator.openOnLaunch": "Open emulator on script launch", + "emulator.multiInstance": "Emulator Multi-instance", + "emulator.waitTime": "Emulator launch wait time (seconds)", + "emulator.multiType": "Emulator Type", + "emulator.instanceCount": "Multi-instance Emulator Number", + "emulator.address": "Emulator Path", + "choose": "Choose", + "execute": "Execute", + "stage.exploreTab": "Main Story", + "stage.eventTab": "Event Stages", + "stage.manualBoss": "Manual Boss Fight", + "stage.normalTask": "Normal Mission", + "stage.hardTask": "Hard Mission", + "stage.currentEvent": "Current Event", + "stage.story": "Clear Story Stages", + "stage.mission": "Clear Mission Stages", + "stage.challenge": "Clear Challenge Stages", + "stage.attrTable": "Stage Attribute Reference Table", + "stage.noEvent": "No event currently", + "team.chooseMethod": "Formation Method", + "push.afterError": "Push after an error occurs", + "push.afterCompletion": "Push after all tasks are completed", + "push.json": "JSON Push", + "push.serverchan": "ServerChan Push", + "other.fhx": "One-click Anti-Censorship", + "other.fhxDesc": "Attempt to apply anti-censorship patch (CN-exclusive)", + "versionInfo": "Version Information", + "localVersion": "Current Version", + "remoteVersion": "Latest Version", + "updateMethod": "Action", + "globalUpdateSettings": "Update Settings", + "updateChannel": "Update Channel", + "mirrorCdk": "MirrorC CDK (Optional)", + "mirror.verify": "Verify CDK", + "mirror.verifying": "Verifying", + "mc.verify.success": "MirrorC CDK verification successful!", + "mc.verify.error": "MirrorC CDK verification error!", + "enterCdk": "Enter CDK", + "shaConnectivityTest": "SHA Retrieval Method", + "shaTest.method": "Method", + "shaTest.status": "Status", + "shaTest.time": "Time taken", + "shaTest.sha": "SHA Value", + "shaTest.testing": "Testing SHA...", + "shaTest.testAll": "Test All Methods", + "configAdd.nameRequired": "Profile name cannot be empty", + "configAdd.serverRequired": "A server must be specified", + "configAdd.nameDuplicate": "Profile name already exists", + "configAdd.selectServer": "Please select a server", + "create": "Create", + "settings.updateSuccess": "Settings Updated Successfully", + "settings.updateSuccessDesc": "Your settings have been successfully updated.", + "stage.story.main": "Clear Main Story", + "stage.story.group": "Clear Club Stories", + "stage.story.mini": "Clear Mini Stories", + "stage.taskTriggerStart": "Task has been dispatched", + "stage.taskTriggered": "Dispatched task: {{task}}", + "stage.noHardTask": "No hard stages set!", + "stage.noNormalTask": "No normal stages set!", + "start_hard_task": "Start Hard Stages", + "start_normal_task": "Start Normal Stages", + "start_fhx": "Apply Anti-Censorship", + "start_main_story": "Start Main Story", + "start_group_story": "Start Club Stories", + "start_mini_story": "Start Mini Stories", + "start_explore_activity_story": "Start Event Story", + "start_explore_activity_mission": "Start Event Missions", + "start_explore_activity_challenge": "Start Event Challenges", + "main_story": "Clear Main Story", + "group_story": "Clear Club Stories", + "mini_story": "Clear Mini Stories", + "explore_activity_story": "Clear Event Story", + "explore_activity_mission": "Clear Event Missions", + "explore_activity_challenge": "Clear Event Challenges", + "de_clothes": "Anti-Censorship", + "explore_hard_task": "Clear Hard Stages", + "explore_normal_task": "Clear Normal Stages", + "title.updateSetting": "Update", + "shaMethod.github": "GitHub API", + "shaMethod.mirrorc": "MirrorC Free API", + "shaMethod.gitee": "Gitee Repository", + "shaMethod.gitcode": "GitCode Repository", + "shaMethod.tencent_c_coding": "Tencent Cloud Coding Repository", + "cdk.noCDKInput": "Please enter MirrorC CDK!", + "CDK invalid.": "CDK invalid.", + "CDK valid.": "CDK valid.", + "Please confirm that you have entered the correct cdkey": "Please confirm that you have entered the correct CDK", + "CDK valid. Expires at {}": "This CDK is valid until {{expire_date}}.", + "CDK expired.": "CDK has expired.", + "CDK quota exhausted for today.": "CDK will expire today.", + "CDK mismatched for requested resource.": "CDK does not match the requested repository.", + "CDK blocked.": "CDK has been blocked by the administrator.", + "CDK Test OK": "CDK verification successful", + "version.fetching": "Fetching...", + "version.untested": "Not tested", + "version.testing": "Testing...", + "version.tapToTest": "Check for updates", + "version.checkError": "Failed to fetch version", + "heartbeat.connected": "Service connected", + "heartbeat.connecting": "Connecting to service...", + "updateMethod.github": "GitHub (Main repository)", + "updateMethod.gitee": "Gitee (China mirror)", + "updateMethod.gitcode": "GitCode (China mirror)", + "updateMethod.tencent": "Tencent Cloud Coding (China mirror)", + "updateMethod.mirrorc": "MirrorC Update", + "update.dueDate": "Expiration Date", + "placeholder.profileName": "Enter your profile name here", + "update.available": "New version available", + "property.burst": "Explosive", + "property.pierce": "Piercing", + "property.mystic": "Mystic", + "property.shock": "Sonic", + "property.Unused": "Unused", + "team.preset": "By preset formation", + "team.side": "By sidebar attributes", + "team.order": "By sidebar order", + "schedule.primary": "Beginner", + "schedule.normal": "Normal", + "schedule.advanced": "Advanced", + "schedule.superior": "Expert", + "lesson.times": "Lesson attempts", + "confirmUpdateTitle": "Confirm Update", + "updatePrompt": "A new version is detected, update now?", + "updateNotice": "Please stop any running tasks before updating.", + "title.wiki": "Docs", + "wiki": { + "title": "Wiki Docs", + "subtitle": "A standardized guide and operation manual for the BAAS automation platform.", + "searchPlaceholder": "Search by topic, keyword, or tag...", + "clearSearch": "Clear Search", + "resultsCount": "{{count}} documents found", + "noResults": "No documents match the current filter criteria.", + "selectDocument": "Please select a document from the left to view its content.", + "category": { + "all": "All", + "architecture": "Architecture", + "getting-started": "Getting Started", + "environment": "Environment Setup", + "configuration": "Configuration Management", + "operations": "Operations", + "support": "Support & Feedback", + "formation": "Formation Strategy" + } + }, + "enterSecretTitle": "Enter Public Key", + "enterSecretPrompt": "Required for secure Communication.", + "secretLabel": "Public Key", + "secretPlaceholder": "Please enter your public key here", + "secretRequired": "The public key is required!", + "secretNotice": "Obtained from the service.secret file from backend.", + "Confirm": "Confirm", + "export.log.folderSelect": "Choose the Log Export Path" +} diff --git a/service/dist/locales/en.json.br b/service/dist/locales/en.json.br new file mode 100644 index 0000000000000000000000000000000000000000..880d0601c1a1bc784989475da7ba74b3468df042 GIT binary patch literal 5167 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

    S2ol(&$tx8VIwo~U= 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 SyDYJ|&4}siv&`dsXZbU}m7?MR diff --git a/service/dist/assets/ui-CImlNgPE.js b/service/dist/assets/ui-CImlNgPE.js deleted file mode 100644 index 728a61cd4..000000000 --- a/service/dist/assets/ui-CImlNgPE.js +++ /dev/null @@ -1,53 +0,0 @@ -import{g as ql,R as w,a as d,j as O,t as Kn,r as Gl}from"./motion-Dp9wOFzY.js";import{r as Kl}from"./misc-GeCjUSSS.js";var Qt=Kl();const Qs=ql(Qt);function Xl(e){if(typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}const Zl=e=>{switch(e){case"success":return ec;case"info":return nc;case"warning":return tc;case"error":return rc;default:return null}},Ql=Array(12).fill(0),Jl=({visible:e,className:t})=>w.createElement("div",{className:["sonner-loading-wrapper",t].filter(Boolean).join(" "),"data-visible":e},w.createElement("div",{className:"sonner-spinner"},Ql.map((n,r)=>w.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${r}`})))),ec=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},w.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),tc=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},w.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),nc=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},w.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),rc=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},w.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),oc=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},w.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),w.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),sc=()=>{const[e,t]=w.useState(document.hidden);return w.useEffect(()=>{const n=()=>{t(document.hidden)};return document.addEventListener("visibilitychange",n),()=>window.removeEventListener("visibilitychange",n)},[]),e};let no=1;class ac{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{const n=this.subscribers.indexOf(t);this.subscribers.splice(n,1)}),this.publish=t=>{this.subscribers.forEach(n=>n(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var n;const{message:r,...o}=t,s=typeof t?.id=="number"||((n=t.id)==null?void 0:n.length)>0?t.id:no++,i=this.toasts.find(l=>l.id===s),a=t.dismissible===void 0?!0:t.dismissible;return this.dismissedToasts.has(s)&&this.dismissedToasts.delete(s),i?this.toasts=this.toasts.map(l=>l.id===s?(this.publish({...l,...t,id:s,title:r}),{...l,...t,id:s,dismissible:a,title:r}):l):this.addToast({title:r,...o,dismissible:a,id:s}),s},this.dismiss=t=>(t?(this.dismissedToasts.add(t),requestAnimationFrame(()=>this.subscribers.forEach(n=>n({id:t,dismiss:!0})))):this.toasts.forEach(n=>{this.subscribers.forEach(r=>r({id:n.id,dismiss:!0}))}),t),this.message=(t,n)=>this.create({...n,message:t}),this.error=(t,n)=>this.create({...n,message:t,type:"error"}),this.success=(t,n)=>this.create({...n,type:"success",message:t}),this.info=(t,n)=>this.create({...n,type:"info",message:t}),this.warning=(t,n)=>this.create({...n,type:"warning",message:t}),this.loading=(t,n)=>this.create({...n,type:"loading",message:t}),this.promise=(t,n)=>{if(!n)return;let r;n.loading!==void 0&&(r=this.create({...n,promise:t,type:"loading",message:n.loading,description:typeof n.description!="function"?n.description:void 0}));const o=Promise.resolve(t instanceof Function?t():t);let s=r!==void 0,i;const a=o.then(async u=>{if(i=["resolve",u],w.isValidElement(u))s=!1,this.create({id:r,type:"default",message:u});else if(lc(u)&&!u.ok){s=!1;const c=typeof n.error=="function"?await n.error(`HTTP error! status: ${u.status}`):n.error,m=typeof n.description=="function"?await n.description(`HTTP error! status: ${u.status}`):n.description,g=typeof c=="object"&&!w.isValidElement(c)?c:{message:c};this.create({id:r,type:"error",description:m,...g})}else if(u instanceof Error){s=!1;const c=typeof n.error=="function"?await n.error(u):n.error,m=typeof n.description=="function"?await n.description(u):n.description,g=typeof c=="object"&&!w.isValidElement(c)?c:{message:c};this.create({id:r,type:"error",description:m,...g})}else if(n.success!==void 0){s=!1;const c=typeof n.success=="function"?await n.success(u):n.success,m=typeof n.description=="function"?await n.description(u):n.description,g=typeof c=="object"&&!w.isValidElement(c)?c:{message:c};this.create({id:r,type:"success",description:m,...g})}}).catch(async u=>{if(i=["reject",u],n.error!==void 0){s=!1;const f=typeof n.error=="function"?await n.error(u):n.error,c=typeof n.description=="function"?await n.description(u):n.description,h=typeof f=="object"&&!w.isValidElement(f)?f:{message:f};this.create({id:r,type:"error",description:c,...h})}}).finally(()=>{s&&(this.dismiss(r),r=void 0),n.finally==null||n.finally.call(n)}),l=()=>new Promise((u,f)=>a.then(()=>i[0]==="reject"?f(i[1]):u(i[1])).catch(f));return typeof r!="string"&&typeof r!="number"?{unwrap:l}:Object.assign(r,{unwrap:l})},this.custom=(t,n)=>{const r=n?.id||no++;return this.create({jsx:t(r),id:r,...n}),r},this.getActiveToasts=()=>this.toasts.filter(t=>!this.dismissedToasts.has(t.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}}const Ce=new ac,ic=(e,t)=>{const n=t?.id||no++;return Ce.addToast({title:e,...t,id:n}),n},lc=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",cc=ic,uc=()=>Ce.toasts,dc=()=>Ce.getActiveToasts(),Dy=Object.assign(cc,{success:Ce.success,info:Ce.info,warning:Ce.warning,error:Ce.error,custom:Ce.custom,message:Ce.message,promise:Ce.promise,dismiss:Ce.dismiss,loading:Ce.loading},{getHistory:uc,getToasts:dc});Xl("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");function Wn(e){return e.label!==void 0}const fc=3,mc="24px",hc="16px",Qo=4e3,pc=356,vc=14,gc=45,yc=200;function Ye(...e){return e.filter(Boolean).join(" ")}function wc(e){const[t,n]=e.split("-"),r=[];return t&&r.push(t),n&&r.push(n),r}const bc=e=>{var t,n,r,o,s,i,a,l,u;const{invert:f,toast:c,unstyled:m,interacting:h,setHeights:g,visibleToasts:p,heights:v,index:y,toasts:x,expanded:b,removeToast:E,defaultRichColors:S,closeButton:T,style:C,cancelButtonStyle:M,actionButtonStyle:I,className:N="",descriptionClassName:_="",duration:B,position:R,gap:$,expandByDefault:H,classNames:P,icons:F,closeButtonAriaLabel:k="Close toast"}=e,[j,U]=w.useState(null),[oe,me]=w.useState(null),[D,q]=w.useState(!1),[K,le]=w.useState(!1),[A,L]=w.useState(!1),[Z,J]=w.useState(!1),[ee,ne]=w.useState(!1),[ge,Ee]=w.useState(0),[Ot,ct]=w.useState(0),Ae=w.useRef(c.duration||B||Qo),Rn=w.useRef(null),Ie=w.useRef(null),Dr=y===0,kr=y+1<=p,ye=c.type,He=c.dismissible!==!1,sn=c.className||"",Nr=c.descriptionClassName||"",$t=w.useMemo(()=>v.findIndex(V=>V.toastId===c.id)||0,[v,c.id]),Rr=w.useMemo(()=>{var V;return(V=c.closeButton)!=null?V:T},[c.closeButton,T]),An=w.useMemo(()=>c.duration||B||Qo,[c.duration,B]),an=w.useRef(0),ut=w.useRef(0),In=w.useRef(0),dt=w.useRef(null),[Ar,Ir]=R.split("-"),_n=w.useMemo(()=>v.reduce((V,de,he)=>he>=$t?V:V+de.height,0),[v,$t]),ln=sc(),_r=c.invert||f,z=ye==="loading";ut.current=w.useMemo(()=>$t*$+_n,[$t,_n]),w.useEffect(()=>{Ae.current=An},[An]),w.useEffect(()=>{q(!0)},[]),w.useEffect(()=>{const V=Ie.current;if(V){const de=V.getBoundingClientRect().height;return ct(de),g(he=>[{toastId:c.id,height:de,position:c.position},...he]),()=>g(he=>he.filter(pe=>pe.toastId!==c.id))}},[g,c.id]),w.useLayoutEffect(()=>{if(!D)return;const V=Ie.current,de=V.style.height;V.style.height="auto";const he=V.getBoundingClientRect().height;V.style.height=de,ct(he),g(pe=>pe.find(ve=>ve.toastId===c.id)?pe.map(ve=>ve.toastId===c.id?{...ve,height:he}:ve):[{toastId:c.id,height:he,position:c.position},...pe])},[D,c.title,c.description,g,c.id,c.jsx,c.action,c.cancel]);const Q=w.useCallback(()=>{le(!0),Ee(ut.current),g(V=>V.filter(de=>de.toastId!==c.id)),setTimeout(()=>{E(c)},yc)},[c,E,g,ut]);w.useEffect(()=>{if(c.promise&&ye==="loading"||c.duration===1/0||c.type==="loading")return;let V;return b||h||ln?(()=>{if(In.current{Ae.current!==1/0&&(an.current=new Date().getTime(),V=setTimeout(()=>{c.onAutoClose==null||c.onAutoClose.call(c,c),Q()},Ae.current))})(),()=>clearTimeout(V)},[b,h,c,ye,ln,Q]),w.useEffect(()=>{c.delete&&(Q(),c.onDismiss==null||c.onDismiss.call(c,c))},[Q,c.delete]);function Y(){var V;if(F?.loading){var de;return w.createElement("div",{className:Ye(P?.loader,c==null||(de=c.classNames)==null?void 0:de.loader,"sonner-loader"),"data-visible":ye==="loading"},F.loading)}return w.createElement(Jl,{className:Ye(P?.loader,c==null||(V=c.classNames)==null?void 0:V.loader),visible:ye==="loading"})}const se=c.icon||F?.[ye]||Zl(ye);var we,X;return w.createElement("li",{tabIndex:0,ref:Ie,className:Ye(N,sn,P?.toast,c==null||(t=c.classNames)==null?void 0:t.toast,P?.default,P?.[ye],c==null||(n=c.classNames)==null?void 0:n[ye]),"data-sonner-toast":"","data-rich-colors":(we=c.richColors)!=null?we:S,"data-styled":!(c.jsx||c.unstyled||m),"data-mounted":D,"data-promise":!!c.promise,"data-swiped":ee,"data-removed":K,"data-visible":kr,"data-y-position":Ar,"data-x-position":Ir,"data-index":y,"data-front":Dr,"data-swiping":A,"data-dismissible":He,"data-type":ye,"data-invert":_r,"data-swipe-out":Z,"data-swipe-direction":oe,"data-expanded":!!(b||H&&D),"data-testid":c.testId,style:{"--index":y,"--toasts-before":y,"--z-index":x.length-y,"--offset":`${K?ge:ut.current}px`,"--initial-height":H?"auto":`${Ot}px`,...C,...c.style},onDragEnd:()=>{L(!1),U(null),dt.current=null},onPointerDown:V=>{V.button!==2&&(z||!He||(Rn.current=new Date,Ee(ut.current),V.target.setPointerCapture(V.pointerId),V.target.tagName!=="BUTTON"&&(L(!0),dt.current={x:V.clientX,y:V.clientY})))},onPointerUp:()=>{var V,de,he;if(Z||!He)return;dt.current=null;const pe=Number(((V=Ie.current)==null?void 0:V.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),ft=Number(((de=Ie.current)==null?void 0:de.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),ve=new Date().getTime()-((he=Rn.current)==null?void 0:he.getTime()),ke=j==="x"?pe:ft,Fn=Math.abs(ke)/ve;if(Math.abs(ke)>=gc||Fn>.11){Ee(ut.current),c.onDismiss==null||c.onDismiss.call(c,c),me(j==="x"?pe>0?"right":"left":ft>0?"down":"up"),Q(),J(!0);return}else{var _e,Fe;(_e=Ie.current)==null||_e.style.setProperty("--swipe-amount-x","0px"),(Fe=Ie.current)==null||Fe.style.setProperty("--swipe-amount-y","0px")}ne(!1),L(!1),U(null)},onPointerMove:V=>{var de,he,pe;if(!dt.current||!He||((de=window.getSelection())==null?void 0:de.toString().length)>0)return;const ve=V.clientY-dt.current.y,ke=V.clientX-dt.current.x;var Fn;const _e=(Fn=e.swipeDirections)!=null?Fn:wc(R);!j&&(Math.abs(ke)>1||Math.abs(ve)>1)&&U(Math.abs(ke)>Math.abs(ve)?"x":"y");let Fe={x:0,y:0};const Zo=Tt=>1/(1.5+Math.abs(Tt)/20);if(j==="y"){if(_e.includes("top")||_e.includes("bottom"))if(_e.includes("top")&&ve<0||_e.includes("bottom")&&ve>0)Fe.y=ve;else{const Tt=ve*Zo(ve);Fe.y=Math.abs(Tt)0)Fe.x=ke;else{const Tt=ke*Zo(ke);Fe.x=Math.abs(Tt)0||Math.abs(Fe.y)>0)&&ne(!0),(he=Ie.current)==null||he.style.setProperty("--swipe-amount-x",`${Fe.x}px`),(pe=Ie.current)==null||pe.style.setProperty("--swipe-amount-y",`${Fe.y}px`)}},Rr&&!c.jsx&&ye!=="loading"?w.createElement("button",{"aria-label":k,"data-disabled":z,"data-close-button":!0,onClick:z||!He?()=>{}:()=>{Q(),c.onDismiss==null||c.onDismiss.call(c,c)},className:Ye(P?.closeButton,c==null||(r=c.classNames)==null?void 0:r.closeButton)},(X=F?.close)!=null?X:oc):null,(ye||c.icon||c.promise)&&c.icon!==null&&(F?.[ye]!==null||c.icon)?w.createElement("div",{"data-icon":"",className:Ye(P?.icon,c==null||(o=c.classNames)==null?void 0:o.icon)},c.promise||c.type==="loading"&&!c.icon?c.icon||Y():null,c.type!=="loading"?se:null):null,w.createElement("div",{"data-content":"",className:Ye(P?.content,c==null||(s=c.classNames)==null?void 0:s.content)},w.createElement("div",{"data-title":"",className:Ye(P?.title,c==null||(i=c.classNames)==null?void 0:i.title)},c.jsx?c.jsx:typeof c.title=="function"?c.title():c.title),c.description?w.createElement("div",{"data-description":"",className:Ye(_,Nr,P?.description,c==null||(a=c.classNames)==null?void 0:a.description)},typeof c.description=="function"?c.description():c.description):null),w.isValidElement(c.cancel)?c.cancel:c.cancel&&Wn(c.cancel)?w.createElement("button",{"data-button":!0,"data-cancel":!0,style:c.cancelButtonStyle||M,onClick:V=>{Wn(c.cancel)&&He&&(c.cancel.onClick==null||c.cancel.onClick.call(c.cancel,V),Q())},className:Ye(P?.cancelButton,c==null||(l=c.classNames)==null?void 0:l.cancelButton)},c.cancel.label):null,w.isValidElement(c.action)?c.action:c.action&&Wn(c.action)?w.createElement("button",{"data-button":!0,"data-action":!0,style:c.actionButtonStyle||I,onClick:V=>{Wn(c.action)&&(c.action.onClick==null||c.action.onClick.call(c.action,V),!V.defaultPrevented&&Q())},className:Ye(P?.actionButton,c==null||(u=c.classNames)==null?void 0:u.actionButton)},c.action.label):null)};function Jo(){if(typeof window>"u"||typeof document>"u")return"ltr";const e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}function xc(e,t){const n={};return[e,t].forEach((r,o)=>{const s=o===1,i=s?"--mobile-offset":"--offset",a=s?hc:mc;function l(u){["top","right","bottom","left"].forEach(f=>{n[`${i}-${f}`]=typeof u=="number"?`${u}px`:u})}typeof r=="number"||typeof r=="string"?l(r):typeof r=="object"?["top","right","bottom","left"].forEach(u=>{r[u]===void 0?n[`${i}-${u}`]=a:n[`${i}-${u}`]=typeof r[u]=="number"?`${r[u]}px`:r[u]}):l(a)}),n}const ky=w.forwardRef(function(t,n){const{id:r,invert:o,position:s="bottom-right",hotkey:i=["altKey","KeyT"],expand:a,closeButton:l,className:u,offset:f,mobileOffset:c,theme:m="light",richColors:h,duration:g,style:p,visibleToasts:v=fc,toastOptions:y,dir:x=Jo(),gap:b=vc,icons:E,containerAriaLabel:S="Notifications"}=t,[T,C]=w.useState([]),M=w.useMemo(()=>r?T.filter(D=>D.toasterId===r):T.filter(D=>!D.toasterId),[T,r]),I=w.useMemo(()=>Array.from(new Set([s].concat(M.filter(D=>D.position).map(D=>D.position)))),[M,s]),[N,_]=w.useState([]),[B,R]=w.useState(!1),[$,H]=w.useState(!1),[P,F]=w.useState(m!=="system"?m:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),k=w.useRef(null),j=i.join("+").replace(/Key/g,"").replace(/Digit/g,""),U=w.useRef(null),oe=w.useRef(!1),me=w.useCallback(D=>{C(q=>{var K;return(K=q.find(le=>le.id===D.id))!=null&&K.delete||Ce.dismiss(D.id),q.filter(({id:le})=>le!==D.id)})},[]);return w.useEffect(()=>Ce.subscribe(D=>{if(D.dismiss){requestAnimationFrame(()=>{C(q=>q.map(K=>K.id===D.id?{...K,delete:!0}:K))});return}setTimeout(()=>{Qs.flushSync(()=>{C(q=>{const K=q.findIndex(le=>le.id===D.id);return K!==-1?[...q.slice(0,K),{...q[K],...D},...q.slice(K+1)]:[D,...q]})})})}),[T]),w.useEffect(()=>{if(m!=="system"){F(m);return}if(m==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?F("dark"):F("light")),typeof window>"u")return;const D=window.matchMedia("(prefers-color-scheme: dark)");try{D.addEventListener("change",({matches:q})=>{F(q?"dark":"light")})}catch{D.addListener(({matches:K})=>{try{F(K?"dark":"light")}catch(le){console.error(le)}})}},[m]),w.useEffect(()=>{T.length<=1&&R(!1)},[T]),w.useEffect(()=>{const D=q=>{var K;if(i.every(L=>q[L]||q.code===L)){var A;R(!0),(A=k.current)==null||A.focus()}q.code==="Escape"&&(document.activeElement===k.current||(K=k.current)!=null&&K.contains(document.activeElement))&&R(!1)};return document.addEventListener("keydown",D),()=>document.removeEventListener("keydown",D)},[i]),w.useEffect(()=>{if(k.current)return()=>{U.current&&(U.current.focus({preventScroll:!0}),U.current=null,oe.current=!1)}},[k.current]),w.createElement("section",{ref:n,"aria-label":`${S} ${j}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},I.map((D,q)=>{var K;const[le,A]=D.split("-");return M.length?w.createElement("ol",{key:D,dir:x==="auto"?Jo():x,tabIndex:-1,ref:k,className:u,"data-sonner-toaster":!0,"data-sonner-theme":P,"data-y-position":le,"data-x-position":A,style:{"--front-toast-height":`${((K=N[0])==null?void 0:K.height)||0}px`,"--width":`${pc}px`,"--gap":`${b}px`,...p,...xc(f,c)},onBlur:L=>{oe.current&&!L.currentTarget.contains(L.relatedTarget)&&(oe.current=!1,U.current&&(U.current.focus({preventScroll:!0}),U.current=null))},onFocus:L=>{L.target instanceof HTMLElement&&L.target.dataset.dismissible==="false"||oe.current||(oe.current=!0,U.current=L.relatedTarget)},onMouseEnter:()=>R(!0),onMouseMove:()=>R(!0),onMouseLeave:()=>{$||R(!1)},onDragEnd:()=>R(!1),onPointerDown:L=>{L.target instanceof HTMLElement&&L.target.dataset.dismissible==="false"||H(!0)},onPointerUp:()=>H(!1)},M.filter(L=>!L.position&&q===0||L.position===D).map((L,Z)=>{var J,ee;return w.createElement(bc,{key:L.id,icons:E,index:Z,toast:L,defaultRichColors:h,duration:(J=y?.duration)!=null?J:g,className:y?.className,descriptionClassName:y?.descriptionClassName,invert:o,visibleToasts:v,closeButton:(ee=y?.closeButton)!=null?ee:l,interacting:$,position:D,style:y?.style,unstyled:y?.unstyled,classNames:y?.classNames,cancelButtonStyle:y?.cancelButtonStyle,actionButtonStyle:y?.actionButtonStyle,closeButtonAriaLabel:y?.closeButtonAriaLabel,removeToast:me,toasts:M.filter(ne=>ne.position==L.position),heights:N.filter(ne=>ne.position==L.position),setHeights:_,expandByDefault:a,gap:b,expanded:B,swipeDirections:t.swipeDirections})})):null}))});function es(e,[t,n]){return Math.min(n,Math.max(t,e))}function G(e,t,{checkForDefaultPrevented:n=!0}={}){return function(o){if(e?.(o),n===!1||!o.defaultPrevented)return t?.(o)}}function Ft(e,t=[]){let n=[];function r(s,i){const a=d.createContext(i),l=n.length;n=[...n,i];const u=c=>{const{scope:m,children:h,...g}=c,p=m?.[e]?.[l]||a,v=d.useMemo(()=>g,Object.values(g));return O.jsx(p.Provider,{value:v,children:h})};u.displayName=s+"Provider";function f(c,m){const h=m?.[e]?.[l]||a,g=d.useContext(h);if(g)return g;if(i!==void 0)return i;throw new Error(`\`${c}\` must be used within \`${s}\``)}return[u,f]}const o=()=>{const s=n.map(i=>d.createContext(i));return function(a){const l=a?.[e]||s;return d.useMemo(()=>({[`__scope${e}`]:{...a,[e]:l}}),[a,l])}};return o.scopeName=e,[r,Sc(o,...t)]}function Sc(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(o=>({useScope:o(),scopeName:o.scopeName}));return function(s){const i=r.reduce((a,{useScope:l,scopeName:u})=>{const c=l(s)[`__scope${u}`];return{...a,...c}},{});return d.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}function ts(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Js(...e){return t=>{let n=!1;const r=e.map(o=>{const s=ts(o,t);return!n&&typeof s=="function"&&(n=!0),s});if(n)return()=>{for(let o=0;o{const{children:s,...i}=r,a=d.Children.toArray(s),l=a.find(Oc);if(l){const u=l.props.children,f=a.map(c=>c===l?d.Children.count(u)>1?d.Children.only(null):d.isValidElement(u)?u.props.children:null:c);return O.jsx(t,{...i,ref:o,children:d.isValidElement(u)?d.cloneElement(u,void 0,f):null})}return O.jsx(t,{...i,ref:o,children:s})});return n.displayName=`${e}.Slot`,n}var Ny=zt("Slot");function Ec(e){const t=d.forwardRef((n,r)=>{const{children:o,...s}=n;if(d.isValidElement(o)){const i=Mc(o),a=Tc(s,o.props);return o.type!==d.Fragment&&(a.ref=r?Js(r,i):i),d.cloneElement(o,a)}return d.Children.count(o)>1?d.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var ea=Symbol("radix.slottable");function Cc(e){const t=({children:n})=>O.jsx(O.Fragment,{children:n});return t.displayName=`${e}.Slottable`,t.__radixId=ea,t}function Oc(e){return d.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===ea}function Tc(e,t){const n={...t};for(const r in t){const o=e[r],s=t[r];/^on[A-Z]/.test(r)?o&&s?n[r]=(...a)=>{const l=s(...a);return o(...a),l}:o&&(n[r]=o):r==="style"?n[r]={...o,...s}:r==="className"&&(n[r]=[o,s].filter(Boolean).join(" "))}return{...e,...n}}function Mc(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}function ta(e){const t=e+"CollectionProvider",[n,r]=Ft(t),[o,s]=n(t,{collectionRef:{current:null},itemMap:new Map}),i=p=>{const{scope:v,children:y}=p,x=w.useRef(null),b=w.useRef(new Map).current;return O.jsx(o,{scope:v,itemMap:b,collectionRef:x,children:y})};i.displayName=t;const a=e+"CollectionSlot",l=zt(a),u=w.forwardRef((p,v)=>{const{scope:y,children:x}=p,b=s(a,y),E=ue(v,b.collectionRef);return O.jsx(l,{ref:E,children:x})});u.displayName=a;const f=e+"CollectionItemSlot",c="data-radix-collection-item",m=zt(f),h=w.forwardRef((p,v)=>{const{scope:y,children:x,...b}=p,E=w.useRef(null),S=ue(v,E),T=s(f,y);return w.useEffect(()=>(T.itemMap.set(E,{ref:E,...b}),()=>void T.itemMap.delete(E))),O.jsx(m,{[c]:"",ref:S,children:x})});h.displayName=f;function g(p){const v=s(e+"CollectionConsumer",p);return w.useCallback(()=>{const x=v.collectionRef.current;if(!x)return[];const b=Array.from(x.querySelectorAll(`[${c}]`));return Array.from(v.itemMap.values()).sort((T,C)=>b.indexOf(T.ref.current)-b.indexOf(C.ref.current))},[v.collectionRef,v.itemMap])}return[{Provider:i,Slot:u,ItemSlot:h},g,r]}var Pc=d.createContext(void 0);function Co(e){const t=d.useContext(Pc);return e||t||"ltr"}var Dc=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],te=Dc.reduce((e,t)=>{const n=zt(`Primitive.${t}`),r=d.forwardRef((o,s)=>{const{asChild:i,...a}=o,l=i?n:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),O.jsx(l,{...a,ref:s})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function kc(e,t){e&&Qt.flushSync(()=>e.dispatchEvent(t))}function wt(e){const t=d.useRef(e);return d.useEffect(()=>{t.current=e}),d.useMemo(()=>(...n)=>t.current?.(...n),[])}function Nc(e,t=globalThis?.document){const n=wt(e);d.useEffect(()=>{const r=o=>{o.key==="Escape"&&n(o)};return t.addEventListener("keydown",r,{capture:!0}),()=>t.removeEventListener("keydown",r,{capture:!0})},[n,t])}var Rc="DismissableLayer",ro="dismissableLayer.update",Ac="dismissableLayer.pointerDownOutside",Ic="dismissableLayer.focusOutside",ns,na=d.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),or=d.forwardRef((e,t)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:o,onFocusOutside:s,onInteractOutside:i,onDismiss:a,...l}=e,u=d.useContext(na),[f,c]=d.useState(null),m=f?.ownerDocument??globalThis?.document,[,h]=d.useState({}),g=ue(t,C=>c(C)),p=Array.from(u.layers),[v]=[...u.layersWithOutsidePointerEventsDisabled].slice(-1),y=p.indexOf(v),x=f?p.indexOf(f):-1,b=u.layersWithOutsidePointerEventsDisabled.size>0,E=x>=y,S=Wc(C=>{const M=C.target,I=[...u.branches].some(N=>N.contains(M));!E||I||(o?.(C),i?.(C),C.defaultPrevented||a?.())},m),T=Lc(C=>{const M=C.target;[...u.branches].some(N=>N.contains(M))||(s?.(C),i?.(C),C.defaultPrevented||a?.())},m);return Nc(C=>{x===u.layers.size-1&&(r?.(C),!C.defaultPrevented&&a&&(C.preventDefault(),a()))},m),d.useEffect(()=>{if(f)return n&&(u.layersWithOutsidePointerEventsDisabled.size===0&&(ns=m.body.style.pointerEvents,m.body.style.pointerEvents="none"),u.layersWithOutsidePointerEventsDisabled.add(f)),u.layers.add(f),rs(),()=>{n&&u.layersWithOutsidePointerEventsDisabled.size===1&&(m.body.style.pointerEvents=ns)}},[f,m,n,u]),d.useEffect(()=>()=>{f&&(u.layers.delete(f),u.layersWithOutsidePointerEventsDisabled.delete(f),rs())},[f,u]),d.useEffect(()=>{const C=()=>h({});return document.addEventListener(ro,C),()=>document.removeEventListener(ro,C)},[]),O.jsx(te.div,{...l,ref:g,style:{pointerEvents:b?E?"auto":"none":void 0,...e.style},onFocusCapture:G(e.onFocusCapture,T.onFocusCapture),onBlurCapture:G(e.onBlurCapture,T.onBlurCapture),onPointerDownCapture:G(e.onPointerDownCapture,S.onPointerDownCapture)})});or.displayName=Rc;var _c="DismissableLayerBranch",Fc=d.forwardRef((e,t)=>{const n=d.useContext(na),r=d.useRef(null),o=ue(t,r);return d.useEffect(()=>{const s=r.current;if(s)return n.branches.add(s),()=>{n.branches.delete(s)}},[n.branches]),O.jsx(te.div,{...e,ref:o})});Fc.displayName=_c;function Wc(e,t=globalThis?.document){const n=wt(e),r=d.useRef(!1),o=d.useRef(()=>{});return d.useEffect(()=>{const s=a=>{if(a.target&&!r.current){let l=function(){ra(Ac,n,u,{discrete:!0})};const u={originalEvent:a};a.pointerType==="touch"?(t.removeEventListener("click",o.current),o.current=l,t.addEventListener("click",o.current,{once:!0})):l()}else t.removeEventListener("click",o.current);r.current=!1},i=window.setTimeout(()=>{t.addEventListener("pointerdown",s)},0);return()=>{window.clearTimeout(i),t.removeEventListener("pointerdown",s),t.removeEventListener("click",o.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function Lc(e,t=globalThis?.document){const n=wt(e),r=d.useRef(!1);return d.useEffect(()=>{const o=s=>{s.target&&!r.current&&ra(Ic,n,{originalEvent:s},{discrete:!1})};return t.addEventListener("focusin",o),()=>t.removeEventListener("focusin",o)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function rs(){const e=new CustomEvent(ro);document.dispatchEvent(e)}function ra(e,t,n,{discrete:r}){const o=n.originalEvent.target,s=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),r?kc(o,s):o.dispatchEvent(s)}var Fr=0;function oa(){d.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??os()),document.body.insertAdjacentElement("beforeend",e[1]??os()),Fr++,()=>{Fr===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(t=>t.remove()),Fr--}},[])}function os(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var Wr="focusScope.autoFocusOnMount",Lr="focusScope.autoFocusOnUnmount",ss={bubbles:!1,cancelable:!0},$c="FocusScope",Oo=d.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:o,onUnmountAutoFocus:s,...i}=e,[a,l]=d.useState(null),u=wt(o),f=wt(s),c=d.useRef(null),m=ue(t,p=>l(p)),h=d.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;d.useEffect(()=>{if(r){let p=function(b){if(h.paused||!a)return;const E=b.target;a.contains(E)?c.current=E:ht(c.current,{select:!0})},v=function(b){if(h.paused||!a)return;const E=b.relatedTarget;E!==null&&(a.contains(E)||ht(c.current,{select:!0}))},y=function(b){if(document.activeElement===document.body)for(const S of b)S.removedNodes.length>0&&ht(a)};document.addEventListener("focusin",p),document.addEventListener("focusout",v);const x=new MutationObserver(y);return a&&x.observe(a,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",p),document.removeEventListener("focusout",v),x.disconnect()}}},[r,a,h.paused]),d.useEffect(()=>{if(a){is.add(h);const p=document.activeElement;if(!a.contains(p)){const y=new CustomEvent(Wr,ss);a.addEventListener(Wr,u),a.dispatchEvent(y),y.defaultPrevented||(jc(Uc(sa(a)),{select:!0}),document.activeElement===p&&ht(a))}return()=>{a.removeEventListener(Wr,u),setTimeout(()=>{const y=new CustomEvent(Lr,ss);a.addEventListener(Lr,f),a.dispatchEvent(y),y.defaultPrevented||ht(p??document.body,{select:!0}),a.removeEventListener(Lr,f),is.remove(h)},0)}}},[a,u,f,h]);const g=d.useCallback(p=>{if(!n&&!r||h.paused)return;const v=p.key==="Tab"&&!p.altKey&&!p.ctrlKey&&!p.metaKey,y=document.activeElement;if(v&&y){const x=p.currentTarget,[b,E]=Bc(x);b&&E?!p.shiftKey&&y===E?(p.preventDefault(),n&&ht(b,{select:!0})):p.shiftKey&&y===b&&(p.preventDefault(),n&&ht(E,{select:!0})):y===x&&p.preventDefault()}},[n,r,h.paused]);return O.jsx(te.div,{tabIndex:-1,...i,ref:m,onKeyDown:g})});Oo.displayName=$c;function jc(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(ht(r,{select:t}),document.activeElement!==n)return}function Bc(e){const t=sa(e),n=as(t,e),r=as(t.reverse(),e);return[n,r]}function sa(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function as(e,t){for(const n of e)if(!Hc(n,{upTo:t}))return n}function Hc(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function Yc(e){return e instanceof HTMLInputElement&&"select"in e}function ht(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&Yc(e)&&t&&e.select()}}var is=Vc();function Vc(){let e=[];return{add(t){const n=e[0];t!==n&&n?.pause(),e=ls(e,t),e.unshift(t)},remove(t){e=ls(e,t),e[0]?.resume()}}}function ls(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function Uc(e){return e.filter(t=>t.tagName!=="A")}var Se=globalThis?.document?d.useLayoutEffect:()=>{},zc=Kn[" useId ".trim().toString()]||(()=>{}),qc=0;function Wt(e){const[t,n]=d.useState(zc());return Se(()=>{n(r=>r??String(qc++))},[e]),e||(t?`radix-${t}`:"")}const Gc=["top","right","bottom","left"],bt=Math.min,Me=Math.max,Xn=Math.round,Ln=Math.floor,Ke=e=>({x:e,y:e}),Kc={left:"right",right:"left",bottom:"top",top:"bottom"},Xc={start:"end",end:"start"};function oo(e,t,n){return Me(e,bt(t,n))}function st(e,t){return typeof e=="function"?e(t):e}function at(e){return e.split("-")[0]}function Jt(e){return e.split("-")[1]}function To(e){return e==="x"?"y":"x"}function Mo(e){return e==="y"?"height":"width"}const Zc=new Set(["top","bottom"]);function qe(e){return Zc.has(at(e))?"y":"x"}function Po(e){return To(qe(e))}function Qc(e,t,n){n===void 0&&(n=!1);const r=Jt(e),o=Po(e),s=Mo(o);let i=o==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(i=Zn(i)),[i,Zn(i)]}function Jc(e){const t=Zn(e);return[so(e),t,so(t)]}function so(e){return e.replace(/start|end/g,t=>Xc[t])}const cs=["left","right"],us=["right","left"],eu=["top","bottom"],tu=["bottom","top"];function nu(e,t,n){switch(e){case"top":case"bottom":return n?t?us:cs:t?cs:us;case"left":case"right":return t?eu:tu;default:return[]}}function ru(e,t,n,r){const o=Jt(e);let s=nu(at(e),n==="start",r);return o&&(s=s.map(i=>i+"-"+o),t&&(s=s.concat(s.map(so)))),s}function Zn(e){return e.replace(/left|right|bottom|top/g,t=>Kc[t])}function ou(e){return{top:0,right:0,bottom:0,left:0,...e}}function aa(e){return typeof e!="number"?ou(e):{top:e,right:e,bottom:e,left:e}}function Qn(e){const{x:t,y:n,width:r,height:o}=e;return{width:r,height:o,top:n,left:t,right:t+r,bottom:n+o,x:t,y:n}}function ds(e,t,n){let{reference:r,floating:o}=e;const s=qe(t),i=Po(t),a=Mo(i),l=at(t),u=s==="y",f=r.x+r.width/2-o.width/2,c=r.y+r.height/2-o.height/2,m=r[a]/2-o[a]/2;let h;switch(l){case"top":h={x:f,y:r.y-o.height};break;case"bottom":h={x:f,y:r.y+r.height};break;case"right":h={x:r.x+r.width,y:c};break;case"left":h={x:r.x-o.width,y:c};break;default:h={x:r.x,y:r.y}}switch(Jt(t)){case"start":h[i]-=m*(n&&u?-1:1);break;case"end":h[i]+=m*(n&&u?-1:1);break}return h}const su=async(e,t,n)=>{const{placement:r="bottom",strategy:o="absolute",middleware:s=[],platform:i}=n,a=s.filter(Boolean),l=await(i.isRTL==null?void 0:i.isRTL(t));let u=await i.getElementRects({reference:e,floating:t,strategy:o}),{x:f,y:c}=ds(u,r,l),m=r,h={},g=0;for(let p=0;p({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:o,rects:s,platform:i,elements:a,middlewareData:l}=t,{element:u,padding:f=0}=st(e,t)||{};if(u==null)return{};const c=aa(f),m={x:n,y:r},h=Po(o),g=Mo(h),p=await i.getDimensions(u),v=h==="y",y=v?"top":"left",x=v?"bottom":"right",b=v?"clientHeight":"clientWidth",E=s.reference[g]+s.reference[h]-m[h]-s.floating[g],S=m[h]-s.reference[h],T=await(i.getOffsetParent==null?void 0:i.getOffsetParent(u));let C=T?T[b]:0;(!C||!await(i.isElement==null?void 0:i.isElement(T)))&&(C=a.floating[b]||s.floating[g]);const M=E/2-S/2,I=C/2-p[g]/2-1,N=bt(c[y],I),_=bt(c[x],I),B=N,R=C-p[g]-_,$=C/2-p[g]/2+M,H=oo(B,$,R),P=!l.arrow&&Jt(o)!=null&&$!==H&&s.reference[g]/2-($$<=0)){var _,B;const $=(((_=s.flip)==null?void 0:_.index)||0)+1,H=C[$];if(H&&(!(c==="alignment"?x!==qe(H):!1)||N.every(k=>qe(k.placement)===x?k.overflows[0]>0:!0)))return{data:{index:$,overflows:N},reset:{placement:H}};let P=(B=N.filter(F=>F.overflows[0]<=0).sort((F,k)=>F.overflows[1]-k.overflows[1])[0])==null?void 0:B.placement;if(!P)switch(h){case"bestFit":{var R;const F=(R=N.filter(k=>{if(T){const j=qe(k.placement);return j===x||j==="y"}return!0}).map(k=>[k.placement,k.overflows.filter(j=>j>0).reduce((j,U)=>j+U,0)]).sort((k,j)=>k[1]-j[1])[0])==null?void 0:R[0];F&&(P=F);break}case"initialPlacement":P=a;break}if(o!==P)return{reset:{placement:P}}}return{}}}};function fs(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function ms(e){return Gc.some(t=>e[t]>=0)}const lu=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...o}=st(e,t);switch(r){case"referenceHidden":{const s=await yn(t,{...o,elementContext:"reference"}),i=fs(s,n.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:ms(i)}}}case"escaped":{const s=await yn(t,{...o,altBoundary:!0}),i=fs(s,n.floating);return{data:{escapedOffsets:i,escaped:ms(i)}}}default:return{}}}}},ia=new Set(["left","top"]);async function cu(e,t){const{placement:n,platform:r,elements:o}=e,s=await(r.isRTL==null?void 0:r.isRTL(o.floating)),i=at(n),a=Jt(n),l=qe(n)==="y",u=ia.has(i)?-1:1,f=s&&l?-1:1,c=st(t,e);let{mainAxis:m,crossAxis:h,alignmentAxis:g}=typeof c=="number"?{mainAxis:c,crossAxis:0,alignmentAxis:null}:{mainAxis:c.mainAxis||0,crossAxis:c.crossAxis||0,alignmentAxis:c.alignmentAxis};return a&&typeof g=="number"&&(h=a==="end"?g*-1:g),l?{x:h*f,y:m*u}:{x:m*u,y:h*f}}const uu=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,r;const{x:o,y:s,placement:i,middlewareData:a}=t,l=await cu(t,e);return i===((n=a.offset)==null?void 0:n.placement)&&(r=a.arrow)!=null&&r.alignmentOffset?{}:{x:o+l.x,y:s+l.y,data:{...l,placement:i}}}}},du=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:o}=t,{mainAxis:s=!0,crossAxis:i=!1,limiter:a={fn:v=>{let{x:y,y:x}=v;return{x:y,y:x}}},...l}=st(e,t),u={x:n,y:r},f=await yn(t,l),c=qe(at(o)),m=To(c);let h=u[m],g=u[c];if(s){const v=m==="y"?"top":"left",y=m==="y"?"bottom":"right",x=h+f[v],b=h-f[y];h=oo(x,h,b)}if(i){const v=c==="y"?"top":"left",y=c==="y"?"bottom":"right",x=g+f[v],b=g-f[y];g=oo(x,g,b)}const p=a.fn({...t,[m]:h,[c]:g});return{...p,data:{x:p.x-n,y:p.y-r,enabled:{[m]:s,[c]:i}}}}}},fu=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:o,rects:s,middlewareData:i}=t,{offset:a=0,mainAxis:l=!0,crossAxis:u=!0}=st(e,t),f={x:n,y:r},c=qe(o),m=To(c);let h=f[m],g=f[c];const p=st(a,t),v=typeof p=="number"?{mainAxis:p,crossAxis:0}:{mainAxis:0,crossAxis:0,...p};if(l){const b=m==="y"?"height":"width",E=s.reference[m]-s.floating[b]+v.mainAxis,S=s.reference[m]+s.reference[b]-v.mainAxis;hS&&(h=S)}if(u){var y,x;const b=m==="y"?"width":"height",E=ia.has(at(o)),S=s.reference[c]-s.floating[b]+(E&&((y=i.offset)==null?void 0:y[c])||0)+(E?0:v.crossAxis),T=s.reference[c]+s.reference[b]+(E?0:((x=i.offset)==null?void 0:x[c])||0)-(E?v.crossAxis:0);gT&&(g=T)}return{[m]:h,[c]:g}}}},mu=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var n,r;const{placement:o,rects:s,platform:i,elements:a}=t,{apply:l=()=>{},...u}=st(e,t),f=await yn(t,u),c=at(o),m=Jt(o),h=qe(o)==="y",{width:g,height:p}=s.floating;let v,y;c==="top"||c==="bottom"?(v=c,y=m===(await(i.isRTL==null?void 0:i.isRTL(a.floating))?"start":"end")?"left":"right"):(y=c,v=m==="end"?"top":"bottom");const x=p-f.top-f.bottom,b=g-f.left-f.right,E=bt(p-f[v],x),S=bt(g-f[y],b),T=!t.middlewareData.shift;let C=E,M=S;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(M=b),(r=t.middlewareData.shift)!=null&&r.enabled.y&&(C=x),T&&!m){const N=Me(f.left,0),_=Me(f.right,0),B=Me(f.top,0),R=Me(f.bottom,0);h?M=g-2*(N!==0||_!==0?N+_:Me(f.left,f.right)):C=p-2*(B!==0||R!==0?B+R:Me(f.top,f.bottom))}await l({...t,availableWidth:M,availableHeight:C});const I=await i.getDimensions(a.floating);return g!==I.width||p!==I.height?{reset:{rects:!0}}:{}}}};function sr(){return typeof window<"u"}function en(e){return la(e)?(e.nodeName||"").toLowerCase():"#document"}function Pe(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Qe(e){var t;return(t=(la(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function la(e){return sr()?e instanceof Node||e instanceof Pe(e).Node:!1}function je(e){return sr()?e instanceof Element||e instanceof Pe(e).Element:!1}function Ze(e){return sr()?e instanceof HTMLElement||e instanceof Pe(e).HTMLElement:!1}function hs(e){return!sr()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof Pe(e).ShadowRoot}const hu=new Set(["inline","contents"]);function En(e){const{overflow:t,overflowX:n,overflowY:r,display:o}=Be(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!hu.has(o)}const pu=new Set(["table","td","th"]);function vu(e){return pu.has(en(e))}const gu=[":popover-open",":modal"];function ar(e){return gu.some(t=>{try{return e.matches(t)}catch{return!1}})}const yu=["transform","translate","scale","rotate","perspective"],wu=["transform","translate","scale","rotate","perspective","filter"],bu=["paint","layout","strict","content"];function Do(e){const t=ko(),n=je(e)?Be(e):e;return yu.some(r=>n[r]?n[r]!=="none":!1)||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||wu.some(r=>(n.willChange||"").includes(r))||bu.some(r=>(n.contain||"").includes(r))}function xu(e){let t=xt(e);for(;Ze(t)&&!qt(t);){if(Do(t))return t;if(ar(t))return null;t=xt(t)}return null}function ko(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}const Su=new Set(["html","body","#document"]);function qt(e){return Su.has(en(e))}function Be(e){return Pe(e).getComputedStyle(e)}function ir(e){return je(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function xt(e){if(en(e)==="html")return e;const t=e.assignedSlot||e.parentNode||hs(e)&&e.host||Qe(e);return hs(t)?t.host:t}function ca(e){const t=xt(e);return qt(t)?e.ownerDocument?e.ownerDocument.body:e.body:Ze(t)&&En(t)?t:ca(t)}function wn(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const o=ca(e),s=o===((r=e.ownerDocument)==null?void 0:r.body),i=Pe(o);if(s){const a=ao(i);return t.concat(i,i.visualViewport||[],En(o)?o:[],a&&n?wn(a):[])}return t.concat(o,wn(o,[],n))}function ao(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function ua(e){const t=Be(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const o=Ze(e),s=o?e.offsetWidth:n,i=o?e.offsetHeight:r,a=Xn(n)!==s||Xn(r)!==i;return a&&(n=s,r=i),{width:n,height:r,$:a}}function No(e){return je(e)?e:e.contextElement}function Vt(e){const t=No(e);if(!Ze(t))return Ke(1);const n=t.getBoundingClientRect(),{width:r,height:o,$:s}=ua(t);let i=(s?Xn(n.width):n.width)/r,a=(s?Xn(n.height):n.height)/o;return(!i||!Number.isFinite(i))&&(i=1),(!a||!Number.isFinite(a))&&(a=1),{x:i,y:a}}const Eu=Ke(0);function da(e){const t=Pe(e);return!ko()||!t.visualViewport?Eu:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Cu(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==Pe(e)?!1:t}function Rt(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const o=e.getBoundingClientRect(),s=No(e);let i=Ke(1);t&&(r?je(r)&&(i=Vt(r)):i=Vt(e));const a=Cu(s,n,r)?da(s):Ke(0);let l=(o.left+a.x)/i.x,u=(o.top+a.y)/i.y,f=o.width/i.x,c=o.height/i.y;if(s){const m=Pe(s),h=r&&je(r)?Pe(r):r;let g=m,p=ao(g);for(;p&&r&&h!==g;){const v=Vt(p),y=p.getBoundingClientRect(),x=Be(p),b=y.left+(p.clientLeft+parseFloat(x.paddingLeft))*v.x,E=y.top+(p.clientTop+parseFloat(x.paddingTop))*v.y;l*=v.x,u*=v.y,f*=v.x,c*=v.y,l+=b,u+=E,g=Pe(p),p=ao(g)}}return Qn({width:f,height:c,x:l,y:u})}function lr(e,t){const n=ir(e).scrollLeft;return t?t.left+n:Rt(Qe(e)).left+n}function fa(e,t){const n=e.getBoundingClientRect(),r=n.left+t.scrollLeft-lr(e,n),o=n.top+t.scrollTop;return{x:r,y:o}}function Ou(e){let{elements:t,rect:n,offsetParent:r,strategy:o}=e;const s=o==="fixed",i=Qe(r),a=t?ar(t.floating):!1;if(r===i||a&&s)return n;let l={scrollLeft:0,scrollTop:0},u=Ke(1);const f=Ke(0),c=Ze(r);if((c||!c&&!s)&&((en(r)!=="body"||En(i))&&(l=ir(r)),Ze(r))){const h=Rt(r);u=Vt(r),f.x=h.x+r.clientLeft,f.y=h.y+r.clientTop}const m=i&&!c&&!s?fa(i,l):Ke(0);return{width:n.width*u.x,height:n.height*u.y,x:n.x*u.x-l.scrollLeft*u.x+f.x+m.x,y:n.y*u.y-l.scrollTop*u.y+f.y+m.y}}function Tu(e){return Array.from(e.getClientRects())}function Mu(e){const t=Qe(e),n=ir(e),r=e.ownerDocument.body,o=Me(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),s=Me(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let i=-n.scrollLeft+lr(e);const a=-n.scrollTop;return Be(r).direction==="rtl"&&(i+=Me(t.clientWidth,r.clientWidth)-o),{width:o,height:s,x:i,y:a}}const ps=25;function Pu(e,t){const n=Pe(e),r=Qe(e),o=n.visualViewport;let s=r.clientWidth,i=r.clientHeight,a=0,l=0;if(o){s=o.width,i=o.height;const f=ko();(!f||f&&t==="fixed")&&(a=o.offsetLeft,l=o.offsetTop)}const u=lr(r);if(u<=0){const f=r.ownerDocument,c=f.body,m=getComputedStyle(c),h=f.compatMode==="CSS1Compat"&&parseFloat(m.marginLeft)+parseFloat(m.marginRight)||0,g=Math.abs(r.clientWidth-c.clientWidth-h);g<=ps&&(s-=g)}else u<=ps&&(s+=u);return{width:s,height:i,x:a,y:l}}const Du=new Set(["absolute","fixed"]);function ku(e,t){const n=Rt(e,!0,t==="fixed"),r=n.top+e.clientTop,o=n.left+e.clientLeft,s=Ze(e)?Vt(e):Ke(1),i=e.clientWidth*s.x,a=e.clientHeight*s.y,l=o*s.x,u=r*s.y;return{width:i,height:a,x:l,y:u}}function vs(e,t,n){let r;if(t==="viewport")r=Pu(e,n);else if(t==="document")r=Mu(Qe(e));else if(je(t))r=ku(t,n);else{const o=da(e);r={x:t.x-o.x,y:t.y-o.y,width:t.width,height:t.height}}return Qn(r)}function ma(e,t){const n=xt(e);return n===t||!je(n)||qt(n)?!1:Be(n).position==="fixed"||ma(n,t)}function Nu(e,t){const n=t.get(e);if(n)return n;let r=wn(e,[],!1).filter(a=>je(a)&&en(a)!=="body"),o=null;const s=Be(e).position==="fixed";let i=s?xt(e):e;for(;je(i)&&!qt(i);){const a=Be(i),l=Do(i);!l&&a.position==="fixed"&&(o=null),(s?!l&&!o:!l&&a.position==="static"&&!!o&&Du.has(o.position)||En(i)&&!l&&ma(e,i))?r=r.filter(f=>f!==i):o=a,i=xt(i)}return t.set(e,r),r}function Ru(e){let{element:t,boundary:n,rootBoundary:r,strategy:o}=e;const i=[...n==="clippingAncestors"?ar(t)?[]:Nu(t,this._c):[].concat(n),r],a=i[0],l=i.reduce((u,f)=>{const c=vs(t,f,o);return u.top=Me(c.top,u.top),u.right=bt(c.right,u.right),u.bottom=bt(c.bottom,u.bottom),u.left=Me(c.left,u.left),u},vs(t,a,o));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function Au(e){const{width:t,height:n}=ua(e);return{width:t,height:n}}function Iu(e,t,n){const r=Ze(t),o=Qe(t),s=n==="fixed",i=Rt(e,!0,s,t);let a={scrollLeft:0,scrollTop:0};const l=Ke(0);function u(){l.x=lr(o)}if(r||!r&&!s)if((en(t)!=="body"||En(o))&&(a=ir(t)),r){const h=Rt(t,!0,s,t);l.x=h.x+t.clientLeft,l.y=h.y+t.clientTop}else o&&u();s&&!r&&o&&u();const f=o&&!r&&!s?fa(o,a):Ke(0),c=i.left+a.scrollLeft-l.x-f.x,m=i.top+a.scrollTop-l.y-f.y;return{x:c,y:m,width:i.width,height:i.height}}function $r(e){return Be(e).position==="static"}function gs(e,t){if(!Ze(e)||Be(e).position==="fixed")return null;if(t)return t(e);let n=e.offsetParent;return Qe(e)===n&&(n=n.ownerDocument.body),n}function ha(e,t){const n=Pe(e);if(ar(e))return n;if(!Ze(e)){let o=xt(e);for(;o&&!qt(o);){if(je(o)&&!$r(o))return o;o=xt(o)}return n}let r=gs(e,t);for(;r&&vu(r)&&$r(r);)r=gs(r,t);return r&&qt(r)&&$r(r)&&!Do(r)?n:r||xu(e)||n}const _u=async function(e){const t=this.getOffsetParent||ha,n=this.getDimensions,r=await n(e.floating);return{reference:Iu(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function Fu(e){return Be(e).direction==="rtl"}const Wu={convertOffsetParentRelativeRectToViewportRelativeRect:Ou,getDocumentElement:Qe,getClippingRect:Ru,getOffsetParent:ha,getElementRects:_u,getClientRects:Tu,getDimensions:Au,getScale:Vt,isElement:je,isRTL:Fu};function pa(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function Lu(e,t){let n=null,r;const o=Qe(e);function s(){var a;clearTimeout(r),(a=n)==null||a.disconnect(),n=null}function i(a,l){a===void 0&&(a=!1),l===void 0&&(l=1),s();const u=e.getBoundingClientRect(),{left:f,top:c,width:m,height:h}=u;if(a||t(),!m||!h)return;const g=Ln(c),p=Ln(o.clientWidth-(f+m)),v=Ln(o.clientHeight-(c+h)),y=Ln(f),b={rootMargin:-g+"px "+-p+"px "+-v+"px "+-y+"px",threshold:Me(0,bt(1,l))||1};let E=!0;function S(T){const C=T[0].intersectionRatio;if(C!==l){if(!E)return i();C?i(!1,C):r=setTimeout(()=>{i(!1,1e-7)},1e3)}C===1&&!pa(u,e.getBoundingClientRect())&&i(),E=!1}try{n=new IntersectionObserver(S,{...b,root:o.ownerDocument})}catch{n=new IntersectionObserver(S,b)}n.observe(e)}return i(!0),s}function $u(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:o=!0,ancestorResize:s=!0,elementResize:i=typeof ResizeObserver=="function",layoutShift:a=typeof IntersectionObserver=="function",animationFrame:l=!1}=r,u=No(e),f=o||s?[...u?wn(u):[],...wn(t)]:[];f.forEach(y=>{o&&y.addEventListener("scroll",n,{passive:!0}),s&&y.addEventListener("resize",n)});const c=u&&a?Lu(u,n):null;let m=-1,h=null;i&&(h=new ResizeObserver(y=>{let[x]=y;x&&x.target===u&&h&&(h.unobserve(t),cancelAnimationFrame(m),m=requestAnimationFrame(()=>{var b;(b=h)==null||b.observe(t)})),n()}),u&&!l&&h.observe(u),h.observe(t));let g,p=l?Rt(e):null;l&&v();function v(){const y=Rt(e);p&&!pa(p,y)&&n(),p=y,g=requestAnimationFrame(v)}return n(),()=>{var y;f.forEach(x=>{o&&x.removeEventListener("scroll",n),s&&x.removeEventListener("resize",n)}),c?.(),(y=h)==null||y.disconnect(),h=null,l&&cancelAnimationFrame(g)}}const ju=uu,Bu=du,Hu=iu,Yu=mu,Vu=lu,ys=au,Uu=fu,zu=(e,t,n)=>{const r=new Map,o={platform:Wu,...n},s={...o.platform,_c:r};return su(e,t,{...o,platform:s})};var qu=typeof document<"u",Gu=function(){},zn=qu?d.useLayoutEffect:Gu;function Jn(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,o;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!Jn(e[r],t[r]))return!1;return!0}if(o=Object.keys(e),n=o.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,o[r]))return!1;for(r=n;r--!==0;){const s=o[r];if(!(s==="_owner"&&e.$$typeof)&&!Jn(e[s],t[s]))return!1}return!0}return e!==e&&t!==t}function va(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function ws(e,t){const n=va(e);return Math.round(t*n)/n}function jr(e){const t=d.useRef(e);return zn(()=>{t.current=e}),t}function Ku(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:o,elements:{reference:s,floating:i}={},transform:a=!0,whileElementsMounted:l,open:u}=e,[f,c]=d.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[m,h]=d.useState(r);Jn(m,r)||h(r);const[g,p]=d.useState(null),[v,y]=d.useState(null),x=d.useCallback(k=>{k!==T.current&&(T.current=k,p(k))},[]),b=d.useCallback(k=>{k!==C.current&&(C.current=k,y(k))},[]),E=s||g,S=i||v,T=d.useRef(null),C=d.useRef(null),M=d.useRef(f),I=l!=null,N=jr(l),_=jr(o),B=jr(u),R=d.useCallback(()=>{if(!T.current||!C.current)return;const k={placement:t,strategy:n,middleware:m};_.current&&(k.platform=_.current),zu(T.current,C.current,k).then(j=>{const U={...j,isPositioned:B.current!==!1};$.current&&!Jn(M.current,U)&&(M.current=U,Qt.flushSync(()=>{c(U)}))})},[m,t,n,_,B]);zn(()=>{u===!1&&M.current.isPositioned&&(M.current.isPositioned=!1,c(k=>({...k,isPositioned:!1})))},[u]);const $=d.useRef(!1);zn(()=>($.current=!0,()=>{$.current=!1}),[]),zn(()=>{if(E&&(T.current=E),S&&(C.current=S),E&&S){if(N.current)return N.current(E,S,R);R()}},[E,S,R,N,I]);const H=d.useMemo(()=>({reference:T,floating:C,setReference:x,setFloating:b}),[x,b]),P=d.useMemo(()=>({reference:E,floating:S}),[E,S]),F=d.useMemo(()=>{const k={position:n,left:0,top:0};if(!P.floating)return k;const j=ws(P.floating,f.x),U=ws(P.floating,f.y);return a?{...k,transform:"translate("+j+"px, "+U+"px)",...va(P.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:j,top:U}},[n,a,P.floating,f.x,f.y]);return d.useMemo(()=>({...f,update:R,refs:H,elements:P,floatingStyles:F}),[f,R,H,P,F])}const Xu=e=>{function t(n){return{}.hasOwnProperty.call(n,"current")}return{name:"arrow",options:e,fn(n){const{element:r,padding:o}=typeof e=="function"?e(n):e;return r&&t(r)?r.current!=null?ys({element:r.current,padding:o}).fn(n):{}:r?ys({element:r,padding:o}).fn(n):{}}}},Zu=(e,t)=>({...ju(e),options:[e,t]}),Qu=(e,t)=>({...Bu(e),options:[e,t]}),Ju=(e,t)=>({...Uu(e),options:[e,t]}),ed=(e,t)=>({...Hu(e),options:[e,t]}),td=(e,t)=>({...Yu(e),options:[e,t]}),nd=(e,t)=>({...Vu(e),options:[e,t]}),rd=(e,t)=>({...Xu(e),options:[e,t]});var od="Arrow",ga=d.forwardRef((e,t)=>{const{children:n,width:r=10,height:o=5,...s}=e;return O.jsx(te.svg,{...s,ref:t,width:r,height:o,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?n:O.jsx("polygon",{points:"0,0 30,0 15,10"})})});ga.displayName=od;var sd=ga;function ad(e){const[t,n]=d.useState(void 0);return Se(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(o=>{if(!Array.isArray(o)||!o.length)return;const s=o[0];let i,a;if("borderBoxSize"in s){const l=s.borderBoxSize,u=Array.isArray(l)?l[0]:l;i=u.inlineSize,a=u.blockSize}else i=e.offsetWidth,a=e.offsetHeight;n({width:i,height:a})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else n(void 0)},[e]),t}var Ro="Popper",[ya,tn]=Ft(Ro),[id,wa]=ya(Ro),ba=e=>{const{__scopePopper:t,children:n}=e,[r,o]=d.useState(null);return O.jsx(id,{scope:t,anchor:r,onAnchorChange:o,children:n})};ba.displayName=Ro;var xa="PopperAnchor",Sa=d.forwardRef((e,t)=>{const{__scopePopper:n,virtualRef:r,...o}=e,s=wa(xa,n),i=d.useRef(null),a=ue(t,i),l=d.useRef(null);return d.useEffect(()=>{const u=l.current;l.current=r?.current||i.current,u!==l.current&&s.onAnchorChange(l.current)}),r?null:O.jsx(te.div,{...o,ref:a})});Sa.displayName=xa;var Ao="PopperContent",[ld,cd]=ya(Ao),Ea=d.forwardRef((e,t)=>{const{__scopePopper:n,side:r="bottom",sideOffset:o=0,align:s="center",alignOffset:i=0,arrowPadding:a=0,avoidCollisions:l=!0,collisionBoundary:u=[],collisionPadding:f=0,sticky:c="partial",hideWhenDetached:m=!1,updatePositionStrategy:h="optimized",onPlaced:g,...p}=e,v=wa(Ao,n),[y,x]=d.useState(null),b=ue(t,A=>x(A)),[E,S]=d.useState(null),T=ad(E),C=T?.width??0,M=T?.height??0,I=r+(s!=="center"?"-"+s:""),N=typeof f=="number"?f:{top:0,right:0,bottom:0,left:0,...f},_=Array.isArray(u)?u:[u],B=_.length>0,R={padding:N,boundary:_.filter(dd),altBoundary:B},{refs:$,floatingStyles:H,placement:P,isPositioned:F,middlewareData:k}=Ku({strategy:"fixed",placement:I,whileElementsMounted:(...A)=>$u(...A,{animationFrame:h==="always"}),elements:{reference:v.anchor},middleware:[Zu({mainAxis:o+M,alignmentAxis:i}),l&&Qu({mainAxis:!0,crossAxis:!1,limiter:c==="partial"?Ju():void 0,...R}),l&&ed({...R}),td({...R,apply:({elements:A,rects:L,availableWidth:Z,availableHeight:J})=>{const{width:ee,height:ne}=L.reference,ge=A.floating.style;ge.setProperty("--radix-popper-available-width",`${Z}px`),ge.setProperty("--radix-popper-available-height",`${J}px`),ge.setProperty("--radix-popper-anchor-width",`${ee}px`),ge.setProperty("--radix-popper-anchor-height",`${ne}px`)}}),E&&rd({element:E,padding:a}),fd({arrowWidth:C,arrowHeight:M}),m&&nd({strategy:"referenceHidden",...R})]}),[j,U]=Ta(P),oe=wt(g);Se(()=>{F&&oe?.()},[F,oe]);const me=k.arrow?.x,D=k.arrow?.y,q=k.arrow?.centerOffset!==0,[K,le]=d.useState();return Se(()=>{y&&le(window.getComputedStyle(y).zIndex)},[y]),O.jsx("div",{ref:$.setFloating,"data-radix-popper-content-wrapper":"",style:{...H,transform:F?H.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:K,"--radix-popper-transform-origin":[k.transformOrigin?.x,k.transformOrigin?.y].join(" "),...k.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:O.jsx(ld,{scope:n,placedSide:j,onArrowChange:S,arrowX:me,arrowY:D,shouldHideArrow:q,children:O.jsx(te.div,{"data-side":j,"data-align":U,...p,ref:b,style:{...p.style,animation:F?void 0:"none"}})})})});Ea.displayName=Ao;var Ca="PopperArrow",ud={top:"bottom",right:"left",bottom:"top",left:"right"},Oa=d.forwardRef(function(t,n){const{__scopePopper:r,...o}=t,s=cd(Ca,r),i=ud[s.placedSide];return O.jsx("span",{ref:s.onArrowChange,style:{position:"absolute",left:s.arrowX,top:s.arrowY,[i]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[s.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[s.placedSide],visibility:s.shouldHideArrow?"hidden":void 0},children:O.jsx(sd,{...o,ref:n,style:{...o.style,display:"block"}})})});Oa.displayName=Ca;function dd(e){return e!==null}var fd=e=>({name:"transformOrigin",options:e,fn(t){const{placement:n,rects:r,middlewareData:o}=t,i=o.arrow?.centerOffset!==0,a=i?0:e.arrowWidth,l=i?0:e.arrowHeight,[u,f]=Ta(n),c={start:"0%",center:"50%",end:"100%"}[f],m=(o.arrow?.x??0)+a/2,h=(o.arrow?.y??0)+l/2;let g="",p="";return u==="bottom"?(g=i?c:`${m}px`,p=`${-l}px`):u==="top"?(g=i?c:`${m}px`,p=`${r.floating.height+l}px`):u==="right"?(g=`${-l}px`,p=i?c:`${h}px`):u==="left"&&(g=`${r.floating.width+l}px`,p=i?c:`${h}px`),{data:{x:g,y:p}}}});function Ta(e){const[t,n="center"]=e.split("-");return[t,n]}var Io=ba,cr=Sa,_o=Ea,Fo=Oa,md="Portal",ur=d.forwardRef((e,t)=>{const{container:n,...r}=e,[o,s]=d.useState(!1);Se(()=>s(!0),[]);const i=n||o&&globalThis?.document?.body;return i?Qs.createPortal(O.jsx(te.div,{...r,ref:t}),i):null});ur.displayName=md;var hd=Kn[" useInsertionEffect ".trim().toString()]||Se;function Gt({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){const[o,s,i]=pd({defaultProp:t,onChange:n}),a=e!==void 0,l=a?e:o;{const f=d.useRef(e!==void 0);d.useEffect(()=>{const c=f.current;c!==a&&console.warn(`${r} is changing from ${c?"controlled":"uncontrolled"} to ${a?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),f.current=a},[a,r])}const u=d.useCallback(f=>{if(a){const c=vd(f)?f(e):f;c!==e&&i.current?.(c)}else s(f)},[a,e,s,i]);return[l,u]}function pd({defaultProp:e,onChange:t}){const[n,r]=d.useState(e),o=d.useRef(n),s=d.useRef(t);return hd(()=>{s.current=t},[t]),d.useEffect(()=>{o.current!==n&&(s.current?.(n),o.current=n)},[n,o]),[n,r,s]}function vd(e){return typeof e=="function"}function gd(e){const t=d.useRef({value:e,previous:e});return d.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}var Ma=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),yd="VisuallyHidden",Pa=d.forwardRef((e,t)=>O.jsx(te.span,{...e,ref:t,style:{...Ma,...e.style}}));Pa.displayName=yd;var wd=Pa,bd=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},jt=new WeakMap,$n=new WeakMap,jn={},Br=0,Da=function(e){return e&&(e.host||Da(e.parentNode))},xd=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=Da(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},Sd=function(e,t,n,r){var o=xd(t,Array.isArray(e)?e:[e]);jn[n]||(jn[n]=new WeakMap);var s=jn[n],i=[],a=new Set,l=new Set(o),u=function(c){!c||a.has(c)||(a.add(c),u(c.parentNode))};o.forEach(u);var f=function(c){!c||l.has(c)||Array.prototype.forEach.call(c.children,function(m){if(a.has(m))f(m);else try{var h=m.getAttribute(r),g=h!==null&&h!=="false",p=(jt.get(m)||0)+1,v=(s.get(m)||0)+1;jt.set(m,p),s.set(m,v),i.push(m),p===1&&g&&$n.set(m,!0),v===1&&m.setAttribute(n,"true"),g||m.setAttribute(r,"true")}catch(y){console.error("aria-hidden: cannot operate on ",m,y)}})};return f(t),a.clear(),Br++,function(){i.forEach(function(c){var m=jt.get(c)-1,h=s.get(c)-1;jt.set(c,m),s.set(c,h),m||($n.has(c)||c.removeAttribute(r),$n.delete(c)),h||c.removeAttribute(n)}),Br--,Br||(jt=new WeakMap,jt=new WeakMap,$n=new WeakMap,jn={})}},ka=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),o=bd(e);return o?(r.push.apply(r,Array.from(o.querySelectorAll("[aria-live], script"))),Sd(r,o,n,"aria-hidden")):function(){return null}},ze=function(){return ze=Object.assign||function(t){for(var n,r=1,o=arguments.length;r"u")return $d;var t=jd(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},Hd=Ia(),Ut="data-scroll-locked",Yd=function(e,t,n,r){var o=e.left,s=e.top,i=e.right,a=e.gap;return n===void 0&&(n="margin"),` - .`.concat(Cd,` { - overflow: hidden `).concat(r,`; - padding-right: `).concat(a,"px ").concat(r,`; - } - body[`).concat(Ut,`] { - overflow: hidden `).concat(r,`; - overscroll-behavior: contain; - `).concat([t&&"position: relative ".concat(r,";"),n==="margin"&&` - padding-left: `.concat(o,`px; - padding-top: `).concat(s,`px; - padding-right: `).concat(i,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(a,"px ").concat(r,`; - `),n==="padding"&&"padding-right: ".concat(a,"px ").concat(r,";")].filter(Boolean).join(""),` - } - - .`).concat(qn,` { - right: `).concat(a,"px ").concat(r,`; - } - - .`).concat(Gn,` { - margin-right: `).concat(a,"px ").concat(r,`; - } - - .`).concat(qn," .").concat(qn,` { - right: 0 `).concat(r,`; - } - - .`).concat(Gn," .").concat(Gn,` { - margin-right: 0 `).concat(r,`; - } - - body[`).concat(Ut,`] { - `).concat(Od,": ").concat(a,`px; - } -`)},xs=function(){var e=parseInt(document.body.getAttribute(Ut)||"0",10);return isFinite(e)?e:0},Vd=function(){d.useEffect(function(){return document.body.setAttribute(Ut,(xs()+1).toString()),function(){var e=xs()-1;e<=0?document.body.removeAttribute(Ut):document.body.setAttribute(Ut,e.toString())}},[])},Ud=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,o=r===void 0?"margin":r;Vd();var s=d.useMemo(function(){return Bd(o)},[o]);return d.createElement(Hd,{styles:Yd(s,!t,o,n?"":"!important")})},io=!1;if(typeof window<"u")try{var Bn=Object.defineProperty({},"passive",{get:function(){return io=!0,!0}});window.addEventListener("test",Bn,Bn),window.removeEventListener("test",Bn,Bn)}catch{io=!1}var Bt=io?{passive:!1}:!1,zd=function(e){return e.tagName==="TEXTAREA"},_a=function(e,t){if(!(e instanceof Element))return!1;var n=window.getComputedStyle(e);return n[t]!=="hidden"&&!(n.overflowY===n.overflowX&&!zd(e)&&n[t]==="visible")},qd=function(e){return _a(e,"overflowY")},Gd=function(e){return _a(e,"overflowX")},Ss=function(e,t){var n=t.ownerDocument,r=t;do{typeof ShadowRoot<"u"&&r instanceof ShadowRoot&&(r=r.host);var o=Fa(e,r);if(o){var s=Wa(e,r),i=s[1],a=s[2];if(i>a)return!0}r=r.parentNode}while(r&&r!==n.body);return!1},Kd=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},Xd=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},Fa=function(e,t){return e==="v"?qd(t):Gd(t)},Wa=function(e,t){return e==="v"?Kd(t):Xd(t)},Zd=function(e,t){return e==="h"&&t==="rtl"?-1:1},Qd=function(e,t,n,r,o){var s=Zd(e,window.getComputedStyle(t).direction),i=s*r,a=n.target,l=t.contains(a),u=!1,f=i>0,c=0,m=0;do{if(!a)break;var h=Wa(e,a),g=h[0],p=h[1],v=h[2],y=p-v-s*g;(g||y)&&Fa(e,a)&&(c+=y,m+=g);var x=a.parentNode;a=x&&x.nodeType===Node.DOCUMENT_FRAGMENT_NODE?x.host:x}while(!l&&a!==document.body||l&&(t.contains(a)||t===a));return(f&&Math.abs(c)<1||!f&&Math.abs(m)<1)&&(u=!0),u},Hn=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Es=function(e){return[e.deltaX,e.deltaY]},Cs=function(e){return e&&"current"in e?e.current:e},Jd=function(e,t){return e[0]===t[0]&&e[1]===t[1]},ef=function(e){return` - .block-interactivity-`.concat(e,` {pointer-events: none;} - .allow-interactivity-`).concat(e,` {pointer-events: all;} -`)},tf=0,Ht=[];function nf(e){var t=d.useRef([]),n=d.useRef([0,0]),r=d.useRef(),o=d.useState(tf++)[0],s=d.useState(Ia)[0],i=d.useRef(e);d.useEffect(function(){i.current=e},[e]),d.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(o));var p=Ed([e.lockRef.current],(e.shards||[]).map(Cs),!0).filter(Boolean);return p.forEach(function(v){return v.classList.add("allow-interactivity-".concat(o))}),function(){document.body.classList.remove("block-interactivity-".concat(o)),p.forEach(function(v){return v.classList.remove("allow-interactivity-".concat(o))})}}},[e.inert,e.lockRef.current,e.shards]);var a=d.useCallback(function(p,v){if("touches"in p&&p.touches.length===2||p.type==="wheel"&&p.ctrlKey)return!i.current.allowPinchZoom;var y=Hn(p),x=n.current,b="deltaX"in p?p.deltaX:x[0]-y[0],E="deltaY"in p?p.deltaY:x[1]-y[1],S,T=p.target,C=Math.abs(b)>Math.abs(E)?"h":"v";if("touches"in p&&C==="h"&&T.type==="range")return!1;var M=Ss(C,T);if(!M)return!0;if(M?S=C:(S=C==="v"?"h":"v",M=Ss(C,T)),!M)return!1;if(!r.current&&"changedTouches"in p&&(b||E)&&(r.current=S),!S)return!0;var I=r.current||S;return Qd(I,v,p,I==="h"?b:E)},[]),l=d.useCallback(function(p){var v=p;if(!(!Ht.length||Ht[Ht.length-1]!==s)){var y="deltaY"in v?Es(v):Hn(v),x=t.current.filter(function(S){return S.name===v.type&&(S.target===v.target||v.target===S.shadowParent)&&Jd(S.delta,y)})[0];if(x&&x.should){v.cancelable&&v.preventDefault();return}if(!x){var b=(i.current.shards||[]).map(Cs).filter(Boolean).filter(function(S){return S.contains(v.target)}),E=b.length>0?a(v,b[0]):!i.current.noIsolation;E&&v.cancelable&&v.preventDefault()}}},[]),u=d.useCallback(function(p,v,y,x){var b={name:p,delta:v,target:y,should:x,shadowParent:rf(y)};t.current.push(b),setTimeout(function(){t.current=t.current.filter(function(E){return E!==b})},1)},[]),f=d.useCallback(function(p){n.current=Hn(p),r.current=void 0},[]),c=d.useCallback(function(p){u(p.type,Es(p),p.target,a(p,e.lockRef.current))},[]),m=d.useCallback(function(p){u(p.type,Hn(p),p.target,a(p,e.lockRef.current))},[]);d.useEffect(function(){return Ht.push(s),e.setCallbacks({onScrollCapture:c,onWheelCapture:c,onTouchMoveCapture:m}),document.addEventListener("wheel",l,Bt),document.addEventListener("touchmove",l,Bt),document.addEventListener("touchstart",f,Bt),function(){Ht=Ht.filter(function(p){return p!==s}),document.removeEventListener("wheel",l,Bt),document.removeEventListener("touchmove",l,Bt),document.removeEventListener("touchstart",f,Bt)}},[]);var h=e.removeScrollBar,g=e.inert;return d.createElement(d.Fragment,null,g?d.createElement(s,{styles:ef(o)}):null,h?d.createElement(Ud,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function rf(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const of=Rd(Aa,nf);var Wo=d.forwardRef(function(e,t){return d.createElement(dr,ze({},e,{ref:t,sideCar:of}))});Wo.classNames=dr.classNames;var sf=[" ","Enter","ArrowUp","ArrowDown"],af=[" ","Enter"],At="Select",[fr,mr,lf]=ta(At),[nn,Ry]=Ft(At,[lf,tn]),hr=tn(),[cf,St]=nn(At),[uf,df]=nn(At),La=e=>{const{__scopeSelect:t,children:n,open:r,defaultOpen:o,onOpenChange:s,value:i,defaultValue:a,onValueChange:l,dir:u,name:f,autoComplete:c,disabled:m,required:h,form:g}=e,p=hr(t),[v,y]=d.useState(null),[x,b]=d.useState(null),[E,S]=d.useState(!1),T=Co(u),[C,M]=Gt({prop:r,defaultProp:o??!1,onChange:s,caller:At}),[I,N]=Gt({prop:i,defaultProp:a,onChange:l,caller:At}),_=d.useRef(null),B=v?g||!!v.closest("form"):!0,[R,$]=d.useState(new Set),H=Array.from(R).map(P=>P.props.value).join(";");return O.jsx(Io,{...p,children:O.jsxs(cf,{required:h,scope:t,trigger:v,onTriggerChange:y,valueNode:x,onValueNodeChange:b,valueNodeHasChildren:E,onValueNodeHasChildrenChange:S,contentId:Wt(),value:I,onValueChange:N,open:C,onOpenChange:M,dir:T,triggerPointerDownPosRef:_,disabled:m,children:[O.jsx(fr.Provider,{scope:t,children:O.jsx(uf,{scope:e.__scopeSelect,onNativeOptionAdd:d.useCallback(P=>{$(F=>new Set(F).add(P))},[]),onNativeOptionRemove:d.useCallback(P=>{$(F=>{const k=new Set(F);return k.delete(P),k})},[]),children:n})}),B?O.jsxs(ai,{"aria-hidden":!0,required:h,tabIndex:-1,name:f,autoComplete:c,value:I,onChange:P=>N(P.target.value),disabled:m,form:g,children:[I===void 0?O.jsx("option",{value:""}):null,Array.from(R)]},H):null]})})};La.displayName=At;var $a="SelectTrigger",ja=d.forwardRef((e,t)=>{const{__scopeSelect:n,disabled:r=!1,...o}=e,s=hr(n),i=St($a,n),a=i.disabled||r,l=ue(t,i.onTriggerChange),u=mr(n),f=d.useRef("touch"),[c,m,h]=li(p=>{const v=u().filter(b=>!b.disabled),y=v.find(b=>b.value===i.value),x=ci(v,p,y);x!==void 0&&i.onValueChange(x.value)}),g=p=>{a||(i.onOpenChange(!0),h()),p&&(i.triggerPointerDownPosRef.current={x:Math.round(p.pageX),y:Math.round(p.pageY)})};return O.jsx(cr,{asChild:!0,...s,children:O.jsx(te.button,{type:"button",role:"combobox","aria-controls":i.contentId,"aria-expanded":i.open,"aria-required":i.required,"aria-autocomplete":"none",dir:i.dir,"data-state":i.open?"open":"closed",disabled:a,"data-disabled":a?"":void 0,"data-placeholder":ii(i.value)?"":void 0,...o,ref:l,onClick:G(o.onClick,p=>{p.currentTarget.focus(),f.current!=="mouse"&&g(p)}),onPointerDown:G(o.onPointerDown,p=>{f.current=p.pointerType;const v=p.target;v.hasPointerCapture(p.pointerId)&&v.releasePointerCapture(p.pointerId),p.button===0&&p.ctrlKey===!1&&p.pointerType==="mouse"&&(g(p),p.preventDefault())}),onKeyDown:G(o.onKeyDown,p=>{const v=c.current!=="";!(p.ctrlKey||p.altKey||p.metaKey)&&p.key.length===1&&m(p.key),!(v&&p.key===" ")&&sf.includes(p.key)&&(g(),p.preventDefault())})})})});ja.displayName=$a;var Ba="SelectValue",Ha=d.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:o,children:s,placeholder:i="",...a}=e,l=St(Ba,n),{onValueNodeHasChildrenChange:u}=l,f=s!==void 0,c=ue(t,l.onValueNodeChange);return Se(()=>{u(f)},[u,f]),O.jsx(te.span,{...a,ref:c,style:{pointerEvents:"none"},children:ii(l.value)?O.jsx(O.Fragment,{children:i}):s})});Ha.displayName=Ba;var ff="SelectIcon",Ya=d.forwardRef((e,t)=>{const{__scopeSelect:n,children:r,...o}=e;return O.jsx(te.span,{"aria-hidden":!0,...o,ref:t,children:r||"▼"})});Ya.displayName=ff;var mf="SelectPortal",Va=e=>O.jsx(ur,{asChild:!0,...e});Va.displayName=mf;var It="SelectContent",Ua=d.forwardRef((e,t)=>{const n=St(It,e.__scopeSelect),[r,o]=d.useState();if(Se(()=>{o(new DocumentFragment)},[]),!n.open){const s=r;return s?Qt.createPortal(O.jsx(za,{scope:e.__scopeSelect,children:O.jsx(fr.Slot,{scope:e.__scopeSelect,children:O.jsx("div",{children:e.children})})}),s):null}return O.jsx(qa,{...e,ref:t})});Ua.displayName=It;var We=10,[za,Et]=nn(It),hf="SelectContentImpl",pf=zt("SelectContent.RemoveScroll"),qa=d.forwardRef((e,t)=>{const{__scopeSelect:n,position:r="item-aligned",onCloseAutoFocus:o,onEscapeKeyDown:s,onPointerDownOutside:i,side:a,sideOffset:l,align:u,alignOffset:f,arrowPadding:c,collisionBoundary:m,collisionPadding:h,sticky:g,hideWhenDetached:p,avoidCollisions:v,...y}=e,x=St(It,n),[b,E]=d.useState(null),[S,T]=d.useState(null),C=ue(t,A=>E(A)),[M,I]=d.useState(null),[N,_]=d.useState(null),B=mr(n),[R,$]=d.useState(!1),H=d.useRef(!1);d.useEffect(()=>{if(b)return ka(b)},[b]),oa();const P=d.useCallback(A=>{const[L,...Z]=B().map(ne=>ne.ref.current),[J]=Z.slice(-1),ee=document.activeElement;for(const ne of A)if(ne===ee||(ne?.scrollIntoView({block:"nearest"}),ne===L&&S&&(S.scrollTop=0),ne===J&&S&&(S.scrollTop=S.scrollHeight),ne?.focus(),document.activeElement!==ee))return},[B,S]),F=d.useCallback(()=>P([M,b]),[P,M,b]);d.useEffect(()=>{R&&F()},[R,F]);const{onOpenChange:k,triggerPointerDownPosRef:j}=x;d.useEffect(()=>{if(b){let A={x:0,y:0};const L=J=>{A={x:Math.abs(Math.round(J.pageX)-(j.current?.x??0)),y:Math.abs(Math.round(J.pageY)-(j.current?.y??0))}},Z=J=>{A.x<=10&&A.y<=10?J.preventDefault():b.contains(J.target)||k(!1),document.removeEventListener("pointermove",L),j.current=null};return j.current!==null&&(document.addEventListener("pointermove",L),document.addEventListener("pointerup",Z,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",L),document.removeEventListener("pointerup",Z,{capture:!0})}}},[b,k,j]),d.useEffect(()=>{const A=()=>k(!1);return window.addEventListener("blur",A),window.addEventListener("resize",A),()=>{window.removeEventListener("blur",A),window.removeEventListener("resize",A)}},[k]);const[U,oe]=li(A=>{const L=B().filter(ee=>!ee.disabled),Z=L.find(ee=>ee.ref.current===document.activeElement),J=ci(L,A,Z);J&&setTimeout(()=>J.ref.current.focus())}),me=d.useCallback((A,L,Z)=>{const J=!H.current&&!Z;(x.value!==void 0&&x.value===L||J)&&(I(A),J&&(H.current=!0))},[x.value]),D=d.useCallback(()=>b?.focus(),[b]),q=d.useCallback((A,L,Z)=>{const J=!H.current&&!Z;(x.value!==void 0&&x.value===L||J)&&_(A)},[x.value]),K=r==="popper"?lo:Ga,le=K===lo?{side:a,sideOffset:l,align:u,alignOffset:f,arrowPadding:c,collisionBoundary:m,collisionPadding:h,sticky:g,hideWhenDetached:p,avoidCollisions:v}:{};return O.jsx(za,{scope:n,content:b,viewport:S,onViewportChange:T,itemRefCallback:me,selectedItem:M,onItemLeave:D,itemTextRefCallback:q,focusSelectedItem:F,selectedItemText:N,position:r,isPositioned:R,searchRef:U,children:O.jsx(Wo,{as:pf,allowPinchZoom:!0,children:O.jsx(Oo,{asChild:!0,trapped:x.open,onMountAutoFocus:A=>{A.preventDefault()},onUnmountAutoFocus:G(o,A=>{x.trigger?.focus({preventScroll:!0}),A.preventDefault()}),children:O.jsx(or,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:s,onPointerDownOutside:i,onFocusOutside:A=>A.preventDefault(),onDismiss:()=>x.onOpenChange(!1),children:O.jsx(K,{role:"listbox",id:x.contentId,"data-state":x.open?"open":"closed",dir:x.dir,onContextMenu:A=>A.preventDefault(),...y,...le,onPlaced:()=>$(!0),ref:C,style:{display:"flex",flexDirection:"column",outline:"none",...y.style},onKeyDown:G(y.onKeyDown,A=>{const L=A.ctrlKey||A.altKey||A.metaKey;if(A.key==="Tab"&&A.preventDefault(),!L&&A.key.length===1&&oe(A.key),["ArrowUp","ArrowDown","Home","End"].includes(A.key)){let J=B().filter(ee=>!ee.disabled).map(ee=>ee.ref.current);if(["ArrowUp","End"].includes(A.key)&&(J=J.slice().reverse()),["ArrowUp","ArrowDown"].includes(A.key)){const ee=A.target,ne=J.indexOf(ee);J=J.slice(ne+1)}setTimeout(()=>P(J)),A.preventDefault()}})})})})})})});qa.displayName=hf;var vf="SelectItemAlignedPosition",Ga=d.forwardRef((e,t)=>{const{__scopeSelect:n,onPlaced:r,...o}=e,s=St(It,n),i=Et(It,n),[a,l]=d.useState(null),[u,f]=d.useState(null),c=ue(t,C=>f(C)),m=mr(n),h=d.useRef(!1),g=d.useRef(!0),{viewport:p,selectedItem:v,selectedItemText:y,focusSelectedItem:x}=i,b=d.useCallback(()=>{if(s.trigger&&s.valueNode&&a&&u&&p&&v&&y){const C=s.trigger.getBoundingClientRect(),M=u.getBoundingClientRect(),I=s.valueNode.getBoundingClientRect(),N=y.getBoundingClientRect();if(s.dir!=="rtl"){const ee=N.left-M.left,ne=I.left-ee,ge=C.left-ne,Ee=C.width+ge,Ot=Math.max(Ee,M.width),ct=window.innerWidth-We,Ae=es(ne,[We,Math.max(We,ct-Ot)]);a.style.minWidth=Ee+"px",a.style.left=Ae+"px"}else{const ee=M.right-N.right,ne=window.innerWidth-I.right-ee,ge=window.innerWidth-C.right-ne,Ee=C.width+ge,Ot=Math.max(Ee,M.width),ct=window.innerWidth-We,Ae=es(ne,[We,Math.max(We,ct-Ot)]);a.style.minWidth=Ee+"px",a.style.right=Ae+"px"}const _=m(),B=window.innerHeight-We*2,R=p.scrollHeight,$=window.getComputedStyle(u),H=parseInt($.borderTopWidth,10),P=parseInt($.paddingTop,10),F=parseInt($.borderBottomWidth,10),k=parseInt($.paddingBottom,10),j=H+P+R+k+F,U=Math.min(v.offsetHeight*5,j),oe=window.getComputedStyle(p),me=parseInt(oe.paddingTop,10),D=parseInt(oe.paddingBottom,10),q=C.top+C.height/2-We,K=B-q,le=v.offsetHeight/2,A=v.offsetTop+le,L=H+P+A,Z=j-L;if(L<=q){const ee=_.length>0&&v===_[_.length-1].ref.current;a.style.bottom="0px";const ne=u.clientHeight-p.offsetTop-p.offsetHeight,ge=Math.max(K,le+(ee?D:0)+ne+F),Ee=L+ge;a.style.height=Ee+"px"}else{const ee=_.length>0&&v===_[0].ref.current;a.style.top="0px";const ge=Math.max(q,H+p.offsetTop+(ee?me:0)+le)+Z;a.style.height=ge+"px",p.scrollTop=L-q+p.offsetTop}a.style.margin=`${We}px 0`,a.style.minHeight=U+"px",a.style.maxHeight=B+"px",r?.(),requestAnimationFrame(()=>h.current=!0)}},[m,s.trigger,s.valueNode,a,u,p,v,y,s.dir,r]);Se(()=>b(),[b]);const[E,S]=d.useState();Se(()=>{u&&S(window.getComputedStyle(u).zIndex)},[u]);const T=d.useCallback(C=>{C&&g.current===!0&&(b(),x?.(),g.current=!1)},[b,x]);return O.jsx(yf,{scope:n,contentWrapper:a,shouldExpandOnScrollRef:h,onScrollButtonChange:T,children:O.jsx("div",{ref:l,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:E},children:O.jsx(te.div,{...o,ref:c,style:{boxSizing:"border-box",maxHeight:"100%",...o.style}})})})});Ga.displayName=vf;var gf="SelectPopperPosition",lo=d.forwardRef((e,t)=>{const{__scopeSelect:n,align:r="start",collisionPadding:o=We,...s}=e,i=hr(n);return O.jsx(_o,{...i,...s,ref:t,align:r,collisionPadding:o,style:{boxSizing:"border-box",...s.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});lo.displayName=gf;var[yf,Lo]=nn(It,{}),co="SelectViewport",Ka=d.forwardRef((e,t)=>{const{__scopeSelect:n,nonce:r,...o}=e,s=Et(co,n),i=Lo(co,n),a=ue(t,s.onViewportChange),l=d.useRef(0);return O.jsxs(O.Fragment,{children:[O.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),O.jsx(fr.Slot,{scope:n,children:O.jsx(te.div,{"data-radix-select-viewport":"",role:"presentation",...o,ref:a,style:{position:"relative",flex:1,overflow:"hidden auto",...o.style},onScroll:G(o.onScroll,u=>{const f=u.currentTarget,{contentWrapper:c,shouldExpandOnScrollRef:m}=i;if(m?.current&&c){const h=Math.abs(l.current-f.scrollTop);if(h>0){const g=window.innerHeight-We*2,p=parseFloat(c.style.minHeight),v=parseFloat(c.style.height),y=Math.max(p,v);if(y0?E:0,c.style.justifyContent="flex-end")}}}l.current=f.scrollTop})})})]})});Ka.displayName=co;var Xa="SelectGroup",[wf,bf]=nn(Xa),xf=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,o=Wt();return O.jsx(wf,{scope:n,id:o,children:O.jsx(te.div,{role:"group","aria-labelledby":o,...r,ref:t})})});xf.displayName=Xa;var Za="SelectLabel",Sf=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,o=bf(Za,n);return O.jsx(te.div,{id:o.id,...r,ref:t})});Sf.displayName=Za;var er="SelectItem",[Ef,Qa]=nn(er),Ja=d.forwardRef((e,t)=>{const{__scopeSelect:n,value:r,disabled:o=!1,textValue:s,...i}=e,a=St(er,n),l=Et(er,n),u=a.value===r,[f,c]=d.useState(s??""),[m,h]=d.useState(!1),g=ue(t,x=>l.itemRefCallback?.(x,r,o)),p=Wt(),v=d.useRef("touch"),y=()=>{o||(a.onValueChange(r),a.onOpenChange(!1))};if(r==="")throw new Error("A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return O.jsx(Ef,{scope:n,value:r,disabled:o,textId:p,isSelected:u,onItemTextChange:d.useCallback(x=>{c(b=>b||(x?.textContent??"").trim())},[]),children:O.jsx(fr.ItemSlot,{scope:n,value:r,disabled:o,textValue:f,children:O.jsx(te.div,{role:"option","aria-labelledby":p,"data-highlighted":m?"":void 0,"aria-selected":u&&m,"data-state":u?"checked":"unchecked","aria-disabled":o||void 0,"data-disabled":o?"":void 0,tabIndex:o?void 0:-1,...i,ref:g,onFocus:G(i.onFocus,()=>h(!0)),onBlur:G(i.onBlur,()=>h(!1)),onClick:G(i.onClick,()=>{v.current!=="mouse"&&y()}),onPointerUp:G(i.onPointerUp,()=>{v.current==="mouse"&&y()}),onPointerDown:G(i.onPointerDown,x=>{v.current=x.pointerType}),onPointerMove:G(i.onPointerMove,x=>{v.current=x.pointerType,o?l.onItemLeave?.():v.current==="mouse"&&x.currentTarget.focus({preventScroll:!0})}),onPointerLeave:G(i.onPointerLeave,x=>{x.currentTarget===document.activeElement&&l.onItemLeave?.()}),onKeyDown:G(i.onKeyDown,x=>{l.searchRef?.current!==""&&x.key===" "||(af.includes(x.key)&&y(),x.key===" "&&x.preventDefault())})})})})});Ja.displayName=er;var dn="SelectItemText",ei=d.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:o,...s}=e,i=St(dn,n),a=Et(dn,n),l=Qa(dn,n),u=df(dn,n),[f,c]=d.useState(null),m=ue(t,y=>c(y),l.onItemTextChange,y=>a.itemTextRefCallback?.(y,l.value,l.disabled)),h=f?.textContent,g=d.useMemo(()=>O.jsx("option",{value:l.value,disabled:l.disabled,children:h},l.value),[l.disabled,l.value,h]),{onNativeOptionAdd:p,onNativeOptionRemove:v}=u;return Se(()=>(p(g),()=>v(g)),[p,v,g]),O.jsxs(O.Fragment,{children:[O.jsx(te.span,{id:l.textId,...s,ref:m}),l.isSelected&&i.valueNode&&!i.valueNodeHasChildren?Qt.createPortal(s.children,i.valueNode):null]})});ei.displayName=dn;var ti="SelectItemIndicator",ni=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return Qa(ti,n).isSelected?O.jsx(te.span,{"aria-hidden":!0,...r,ref:t}):null});ni.displayName=ti;var uo="SelectScrollUpButton",ri=d.forwardRef((e,t)=>{const n=Et(uo,e.__scopeSelect),r=Lo(uo,e.__scopeSelect),[o,s]=d.useState(!1),i=ue(t,r.onScrollButtonChange);return Se(()=>{if(n.viewport&&n.isPositioned){let a=function(){const u=l.scrollTop>0;s(u)};const l=n.viewport;return a(),l.addEventListener("scroll",a),()=>l.removeEventListener("scroll",a)}},[n.viewport,n.isPositioned]),o?O.jsx(si,{...e,ref:i,onAutoScroll:()=>{const{viewport:a,selectedItem:l}=n;a&&l&&(a.scrollTop=a.scrollTop-l.offsetHeight)}}):null});ri.displayName=uo;var fo="SelectScrollDownButton",oi=d.forwardRef((e,t)=>{const n=Et(fo,e.__scopeSelect),r=Lo(fo,e.__scopeSelect),[o,s]=d.useState(!1),i=ue(t,r.onScrollButtonChange);return Se(()=>{if(n.viewport&&n.isPositioned){let a=function(){const u=l.scrollHeight-l.clientHeight,f=Math.ceil(l.scrollTop)l.removeEventListener("scroll",a)}},[n.viewport,n.isPositioned]),o?O.jsx(si,{...e,ref:i,onAutoScroll:()=>{const{viewport:a,selectedItem:l}=n;a&&l&&(a.scrollTop=a.scrollTop+l.offsetHeight)}}):null});oi.displayName=fo;var si=d.forwardRef((e,t)=>{const{__scopeSelect:n,onAutoScroll:r,...o}=e,s=Et("SelectScrollButton",n),i=d.useRef(null),a=mr(n),l=d.useCallback(()=>{i.current!==null&&(window.clearInterval(i.current),i.current=null)},[]);return d.useEffect(()=>()=>l(),[l]),Se(()=>{a().find(f=>f.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:"nearest"})},[a]),O.jsx(te.div,{"aria-hidden":!0,...o,ref:t,style:{flexShrink:0,...o.style},onPointerDown:G(o.onPointerDown,()=>{i.current===null&&(i.current=window.setInterval(r,50))}),onPointerMove:G(o.onPointerMove,()=>{s.onItemLeave?.(),i.current===null&&(i.current=window.setInterval(r,50))}),onPointerLeave:G(o.onPointerLeave,()=>{l()})})}),Cf="SelectSeparator",Of=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return O.jsx(te.div,{"aria-hidden":!0,...r,ref:t})});Of.displayName=Cf;var mo="SelectArrow",Tf=d.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,o=hr(n),s=St(mo,n),i=Et(mo,n);return s.open&&i.position==="popper"?O.jsx(Fo,{...o,...r,ref:t}):null});Tf.displayName=mo;var Mf="SelectBubbleInput",ai=d.forwardRef(({__scopeSelect:e,value:t,...n},r)=>{const o=d.useRef(null),s=ue(r,o),i=gd(t);return d.useEffect(()=>{const a=o.current;if(!a)return;const l=window.HTMLSelectElement.prototype,f=Object.getOwnPropertyDescriptor(l,"value").set;if(i!==t&&f){const c=new Event("change",{bubbles:!0});f.call(a,t),a.dispatchEvent(c)}},[i,t]),O.jsx(te.select,{...n,style:{...Ma,...n.style},ref:s,defaultValue:t})});ai.displayName=Mf;function ii(e){return e===""||e===void 0}function li(e){const t=wt(e),n=d.useRef(""),r=d.useRef(0),o=d.useCallback(i=>{const a=n.current+i;t(a),(function l(u){n.current=u,window.clearTimeout(r.current),u!==""&&(r.current=window.setTimeout(()=>l(""),1e3))})(a)},[t]),s=d.useCallback(()=>{n.current="",window.clearTimeout(r.current)},[]);return d.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,o,s]}function ci(e,t,n){const o=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,s=n?e.indexOf(n):-1;let i=Pf(e,Math.max(s,0));o.length===1&&(i=i.filter(u=>u!==n));const l=i.find(u=>u.textValue.toLowerCase().startsWith(o.toLowerCase()));return l!==n?l:void 0}function Pf(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var Ay=La,Iy=ja,_y=Ha,Fy=Ya,Wy=Va,Ly=Ua,$y=Ka,jy=Ja,By=ei,Hy=ni,Yy=ri,Vy=oi;function Df(e,t){return d.useReducer((n,r)=>t[n][r]??n,e)}var rn=e=>{const{present:t,children:n}=e,r=kf(t),o=typeof n=="function"?n({present:r.isPresent}):d.Children.only(n),s=ue(r.ref,Nf(o));return typeof n=="function"||r.isPresent?d.cloneElement(o,{ref:s}):null};rn.displayName="Presence";function kf(e){const[t,n]=d.useState(),r=d.useRef(null),o=d.useRef(e),s=d.useRef("none"),i=e?"mounted":"unmounted",[a,l]=Df(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return d.useEffect(()=>{const u=Yn(r.current);s.current=a==="mounted"?u:"none"},[a]),Se(()=>{const u=r.current,f=o.current;if(f!==e){const m=s.current,h=Yn(u);e?l("MOUNT"):h==="none"||u?.display==="none"?l("UNMOUNT"):l(f&&m!==h?"ANIMATION_OUT":"UNMOUNT"),o.current=e}},[e,l]),Se(()=>{if(t){let u;const f=t.ownerDocument.defaultView??window,c=h=>{const p=Yn(r.current).includes(CSS.escape(h.animationName));if(h.target===t&&p&&(l("ANIMATION_END"),!o.current)){const v=t.style.animationFillMode;t.style.animationFillMode="forwards",u=f.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=v)})}},m=h=>{h.target===t&&(s.current=Yn(r.current))};return t.addEventListener("animationstart",m),t.addEventListener("animationcancel",c),t.addEventListener("animationend",c),()=>{f.clearTimeout(u),t.removeEventListener("animationstart",m),t.removeEventListener("animationcancel",c),t.removeEventListener("animationend",c)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(a),ref:d.useCallback(u=>{r.current=u?getComputedStyle(u):null,n(u)},[])}}function Yn(e){return e?.animationName||"none"}function Nf(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var[pr,Uy]=Ft("Tooltip",[tn]),vr=tn(),ui="TooltipProvider",Rf=700,ho="tooltip.open",[Af,$o]=pr(ui),di=e=>{const{__scopeTooltip:t,delayDuration:n=Rf,skipDelayDuration:r=300,disableHoverableContent:o=!1,children:s}=e,i=d.useRef(!0),a=d.useRef(!1),l=d.useRef(0);return d.useEffect(()=>{const u=l.current;return()=>window.clearTimeout(u)},[]),O.jsx(Af,{scope:t,isOpenDelayedRef:i,delayDuration:n,onOpen:d.useCallback(()=>{window.clearTimeout(l.current),i.current=!1},[]),onClose:d.useCallback(()=>{window.clearTimeout(l.current),l.current=window.setTimeout(()=>i.current=!0,r)},[r]),isPointerInTransitRef:a,onPointerInTransitChange:d.useCallback(u=>{a.current=u},[]),disableHoverableContent:o,children:s})};di.displayName=ui;var bn="Tooltip",[If,Cn]=pr(bn),fi=e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:o,onOpenChange:s,disableHoverableContent:i,delayDuration:a}=e,l=$o(bn,e.__scopeTooltip),u=vr(t),[f,c]=d.useState(null),m=Wt(),h=d.useRef(0),g=i??l.disableHoverableContent,p=a??l.delayDuration,v=d.useRef(!1),[y,x]=Gt({prop:r,defaultProp:o??!1,onChange:C=>{C?(l.onOpen(),document.dispatchEvent(new CustomEvent(ho))):l.onClose(),s?.(C)},caller:bn}),b=d.useMemo(()=>y?v.current?"delayed-open":"instant-open":"closed",[y]),E=d.useCallback(()=>{window.clearTimeout(h.current),h.current=0,v.current=!1,x(!0)},[x]),S=d.useCallback(()=>{window.clearTimeout(h.current),h.current=0,x(!1)},[x]),T=d.useCallback(()=>{window.clearTimeout(h.current),h.current=window.setTimeout(()=>{v.current=!0,x(!0),h.current=0},p)},[p,x]);return d.useEffect(()=>()=>{h.current&&(window.clearTimeout(h.current),h.current=0)},[]),O.jsx(Io,{...u,children:O.jsx(If,{scope:t,contentId:m,open:y,stateAttribute:b,trigger:f,onTriggerChange:c,onTriggerEnter:d.useCallback(()=>{l.isOpenDelayedRef.current?T():E()},[l.isOpenDelayedRef,T,E]),onTriggerLeave:d.useCallback(()=>{g?S():(window.clearTimeout(h.current),h.current=0)},[S,g]),onOpen:E,onClose:S,disableHoverableContent:g,children:n})})};fi.displayName=bn;var po="TooltipTrigger",mi=d.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,o=Cn(po,n),s=$o(po,n),i=vr(n),a=d.useRef(null),l=ue(t,a,o.onTriggerChange),u=d.useRef(!1),f=d.useRef(!1),c=d.useCallback(()=>u.current=!1,[]);return d.useEffect(()=>()=>document.removeEventListener("pointerup",c),[c]),O.jsx(cr,{asChild:!0,...i,children:O.jsx(te.button,{"aria-describedby":o.open?o.contentId:void 0,"data-state":o.stateAttribute,...r,ref:l,onPointerMove:G(e.onPointerMove,m=>{m.pointerType!=="touch"&&!f.current&&!s.isPointerInTransitRef.current&&(o.onTriggerEnter(),f.current=!0)}),onPointerLeave:G(e.onPointerLeave,()=>{o.onTriggerLeave(),f.current=!1}),onPointerDown:G(e.onPointerDown,()=>{o.open&&o.onClose(),u.current=!0,document.addEventListener("pointerup",c,{once:!0})}),onFocus:G(e.onFocus,()=>{u.current||o.onOpen()}),onBlur:G(e.onBlur,o.onClose),onClick:G(e.onClick,o.onClose)})})});mi.displayName=po;var jo="TooltipPortal",[_f,Ff]=pr(jo,{forceMount:void 0}),hi=e=>{const{__scopeTooltip:t,forceMount:n,children:r,container:o}=e,s=Cn(jo,t);return O.jsx(_f,{scope:t,forceMount:n,children:O.jsx(rn,{present:n||s.open,children:O.jsx(ur,{asChild:!0,container:o,children:r})})})};hi.displayName=jo;var Kt="TooltipContent",pi=d.forwardRef((e,t)=>{const n=Ff(Kt,e.__scopeTooltip),{forceMount:r=n.forceMount,side:o="top",...s}=e,i=Cn(Kt,e.__scopeTooltip);return O.jsx(rn,{present:r||i.open,children:i.disableHoverableContent?O.jsx(vi,{side:o,...s,ref:t}):O.jsx(Wf,{side:o,...s,ref:t})})}),Wf=d.forwardRef((e,t)=>{const n=Cn(Kt,e.__scopeTooltip),r=$o(Kt,e.__scopeTooltip),o=d.useRef(null),s=ue(t,o),[i,a]=d.useState(null),{trigger:l,onClose:u}=n,f=o.current,{onPointerInTransitChange:c}=r,m=d.useCallback(()=>{a(null),c(!1)},[c]),h=d.useCallback((g,p)=>{const v=g.currentTarget,y={x:g.clientX,y:g.clientY},x=Bf(y,v.getBoundingClientRect()),b=Hf(y,x),E=Yf(p.getBoundingClientRect()),S=Uf([...b,...E]);a(S),c(!0)},[c]);return d.useEffect(()=>()=>m(),[m]),d.useEffect(()=>{if(l&&f){const g=v=>h(v,f),p=v=>h(v,l);return l.addEventListener("pointerleave",g),f.addEventListener("pointerleave",p),()=>{l.removeEventListener("pointerleave",g),f.removeEventListener("pointerleave",p)}}},[l,f,h,m]),d.useEffect(()=>{if(i){const g=p=>{const v=p.target,y={x:p.clientX,y:p.clientY},x=l?.contains(v)||f?.contains(v),b=!Vf(y,i);x?m():b&&(m(),u())};return document.addEventListener("pointermove",g),()=>document.removeEventListener("pointermove",g)}},[l,f,i,u,m]),O.jsx(vi,{...e,ref:s})}),[Lf,$f]=pr(bn,{isInside:!1}),jf=Cc("TooltipContent"),vi=d.forwardRef((e,t)=>{const{__scopeTooltip:n,children:r,"aria-label":o,onEscapeKeyDown:s,onPointerDownOutside:i,...a}=e,l=Cn(Kt,n),u=vr(n),{onClose:f}=l;return d.useEffect(()=>(document.addEventListener(ho,f),()=>document.removeEventListener(ho,f)),[f]),d.useEffect(()=>{if(l.trigger){const c=m=>{m.target?.contains(l.trigger)&&f()};return window.addEventListener("scroll",c,{capture:!0}),()=>window.removeEventListener("scroll",c,{capture:!0})}},[l.trigger,f]),O.jsx(or,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:s,onPointerDownOutside:i,onFocusOutside:c=>c.preventDefault(),onDismiss:f,children:O.jsxs(_o,{"data-state":l.stateAttribute,...u,...a,ref:t,style:{...a.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[O.jsx(jf,{children:r}),O.jsx(Lf,{scope:n,isInside:!0,children:O.jsx(wd,{id:l.contentId,role:"tooltip",children:o||r})})]})})});pi.displayName=Kt;var gi="TooltipArrow",yi=d.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,o=vr(n);return $f(gi,n).isInside?null:O.jsx(Fo,{...o,...r,ref:t})});yi.displayName=gi;function Bf(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),o=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(n,r,o,s)){case s:return"left";case o:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function Hf(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function Yf(e){const{top:t,right:n,bottom:r,left:o}=e;return[{x:o,y:t},{x:n,y:t},{x:n,y:r},{x:o,y:r}]}function Vf(e,t){const{x:n,y:r}=e;let o=!1;for(let s=0,i=t.length-1;sr!=m>r&&n<(c-u)*(r-f)/(m-f)+u&&(o=!o)}return o}function Uf(e){const t=e.slice();return t.sort((n,r)=>n.xr.x?1:n.yr.y?1:0),zf(t)}function zf(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r=2;){const s=t[t.length-1],i=t[t.length-2];if((s.x-i.x)*(o.y-i.y)>=(s.y-i.y)*(o.x-i.x))t.pop();else break}t.push(o)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const o=e[r];for(;n.length>=2;){const s=n[n.length-1],i=n[n.length-2];if((s.x-i.x)*(o.y-i.y)>=(s.y-i.y)*(o.x-i.x))n.pop();else break}n.push(o)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var zy=di,qy=fi,Gy=mi,Ky=hi,Xy=pi,Zy=yi,gr="Popover",[wi,Qy]=Ft(gr,[tn]),On=tn(),[qf,Ct]=wi(gr),bi=e=>{const{__scopePopover:t,children:n,open:r,defaultOpen:o,onOpenChange:s,modal:i=!1}=e,a=On(t),l=d.useRef(null),[u,f]=d.useState(!1),[c,m]=Gt({prop:r,defaultProp:o??!1,onChange:s,caller:gr});return O.jsx(Io,{...a,children:O.jsx(qf,{scope:t,contentId:Wt(),triggerRef:l,open:c,onOpenChange:m,onOpenToggle:d.useCallback(()=>m(h=>!h),[m]),hasCustomAnchor:u,onCustomAnchorAdd:d.useCallback(()=>f(!0),[]),onCustomAnchorRemove:d.useCallback(()=>f(!1),[]),modal:i,children:n})})};bi.displayName=gr;var xi="PopoverAnchor",Gf=d.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,o=Ct(xi,n),s=On(n),{onCustomAnchorAdd:i,onCustomAnchorRemove:a}=o;return d.useEffect(()=>(i(),()=>a()),[i,a]),O.jsx(cr,{...s,...r,ref:t})});Gf.displayName=xi;var Si="PopoverTrigger",Ei=d.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,o=Ct(Si,n),s=On(n),i=ue(t,o.triggerRef),a=O.jsx(te.button,{type:"button","aria-haspopup":"dialog","aria-expanded":o.open,"aria-controls":o.contentId,"data-state":Pi(o.open),...r,ref:i,onClick:G(e.onClick,o.onOpenToggle)});return o.hasCustomAnchor?a:O.jsx(cr,{asChild:!0,...s,children:a})});Ei.displayName=Si;var Bo="PopoverPortal",[Kf,Xf]=wi(Bo,{forceMount:void 0}),Ci=e=>{const{__scopePopover:t,forceMount:n,children:r,container:o}=e,s=Ct(Bo,t);return O.jsx(Kf,{scope:t,forceMount:n,children:O.jsx(rn,{present:n||s.open,children:O.jsx(ur,{asChild:!0,container:o,children:r})})})};Ci.displayName=Bo;var Xt="PopoverContent",Oi=d.forwardRef((e,t)=>{const n=Xf(Xt,e.__scopePopover),{forceMount:r=n.forceMount,...o}=e,s=Ct(Xt,e.__scopePopover);return O.jsx(rn,{present:r||s.open,children:s.modal?O.jsx(Qf,{...o,ref:t}):O.jsx(Jf,{...o,ref:t})})});Oi.displayName=Xt;var Zf=zt("PopoverContent.RemoveScroll"),Qf=d.forwardRef((e,t)=>{const n=Ct(Xt,e.__scopePopover),r=d.useRef(null),o=ue(t,r),s=d.useRef(!1);return d.useEffect(()=>{const i=r.current;if(i)return ka(i)},[]),O.jsx(Wo,{as:Zf,allowPinchZoom:!0,children:O.jsx(Ti,{...e,ref:o,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:G(e.onCloseAutoFocus,i=>{i.preventDefault(),s.current||n.triggerRef.current?.focus()}),onPointerDownOutside:G(e.onPointerDownOutside,i=>{const a=i.detail.originalEvent,l=a.button===0&&a.ctrlKey===!0,u=a.button===2||l;s.current=u},{checkForDefaultPrevented:!1}),onFocusOutside:G(e.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1})})})}),Jf=d.forwardRef((e,t)=>{const n=Ct(Xt,e.__scopePopover),r=d.useRef(!1),o=d.useRef(!1);return O.jsx(Ti,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:s=>{e.onCloseAutoFocus?.(s),s.defaultPrevented||(r.current||n.triggerRef.current?.focus(),s.preventDefault()),r.current=!1,o.current=!1},onInteractOutside:s=>{e.onInteractOutside?.(s),s.defaultPrevented||(r.current=!0,s.detail.originalEvent.type==="pointerdown"&&(o.current=!0));const i=s.target;n.triggerRef.current?.contains(i)&&s.preventDefault(),s.detail.originalEvent.type==="focusin"&&o.current&&s.preventDefault()}})}),Ti=d.forwardRef((e,t)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:o,onCloseAutoFocus:s,disableOutsidePointerEvents:i,onEscapeKeyDown:a,onPointerDownOutside:l,onFocusOutside:u,onInteractOutside:f,...c}=e,m=Ct(Xt,n),h=On(n);return oa(),O.jsx(Oo,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:o,onUnmountAutoFocus:s,children:O.jsx(or,{asChild:!0,disableOutsidePointerEvents:i,onInteractOutside:f,onEscapeKeyDown:a,onPointerDownOutside:l,onFocusOutside:u,onDismiss:()=>m.onOpenChange(!1),children:O.jsx(_o,{"data-state":Pi(m.open),role:"dialog",id:m.contentId,...h,...c,ref:t,style:{...c.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),Mi="PopoverClose",em=d.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,o=Ct(Mi,n);return O.jsx(te.button,{type:"button",...r,ref:t,onClick:G(e.onClick,()=>o.onOpenChange(!1))})});em.displayName=Mi;var tm="PopoverArrow",nm=d.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,o=On(n);return O.jsx(Fo,{...o,...r,ref:t})});nm.displayName=tm;function Pi(e){return e?"open":"closed"}var Jy=bi,ew=Ei,tw=Ci,nw=Oi,rm="Separator",Os="horizontal",om=["horizontal","vertical"],Di=d.forwardRef((e,t)=>{const{decorative:n,orientation:r=Os,...o}=e,s=sm(r)?r:Os,a=n?{role:"none"}:{"aria-orientation":s==="vertical"?s:void 0,role:"separator"};return O.jsx(te.div,{"data-orientation":s,...a,...o,ref:t})});Di.displayName=rm;function sm(e){return om.includes(e)}var rw=Di,am=Object.defineProperty,im=(e,t,n)=>t in e?am(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ur=(e,t,n)=>(im(e,typeof t!="symbol"?t+"":t,n),n);let lm=class{constructor(){Ur(this,"current",this.detect()),Ur(this,"handoffState","pending"),Ur(this,"currentId",0)}set(t){this.current!==t&&(this.handoffState="pending",this.currentId=0,this.current=t)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current==="server"}get isClient(){return this.current==="client"}detect(){return typeof window>"u"||typeof document>"u"?"server":"client"}handoff(){this.handoffState==="pending"&&(this.handoffState="complete")}get isHandoffComplete(){return this.handoffState==="complete"}},Xe=new lm;function yr(e){var t,n;return Xe.isServer?null:e?"ownerDocument"in e?e.ownerDocument:"current"in e?(n=(t=e.current)==null?void 0:t.ownerDocument)!=null?n:document:null:document}function wr(e){typeof queueMicrotask=="function"?queueMicrotask(e):Promise.resolve().then(e).catch(t=>setTimeout(()=>{throw t}))}function lt(){let e=[],t={addEventListener(n,r,o,s){return n.addEventListener(r,o,s),t.add(()=>n.removeEventListener(r,o,s))},requestAnimationFrame(...n){let r=requestAnimationFrame(...n);return t.add(()=>cancelAnimationFrame(r))},nextFrame(...n){return t.requestAnimationFrame(()=>t.requestAnimationFrame(...n))},setTimeout(...n){let r=setTimeout(...n);return t.add(()=>clearTimeout(r))},microTask(...n){let r={current:!0};return wr(()=>{r.current&&n[0]()}),t.add(()=>{r.current=!1})},style(n,r,o){let s=n.style.getPropertyValue(r);return Object.assign(n.style,{[r]:o}),this.add(()=>{Object.assign(n.style,{[r]:s})})},group(n){let r=lt();return n(r),this.add(()=>r.dispose())},add(n){return e.includes(n)||e.push(n),()=>{let r=e.indexOf(n);if(r>=0)for(let o of e.splice(r,1))o()}},dispose(){for(let n of e.splice(0))n()}};return t}function Ho(){let[e]=d.useState(lt);return d.useEffect(()=>()=>e.dispose(),[e]),e}let xe=(e,t)=>{Xe.isServer?d.useEffect(e,t):d.useLayoutEffect(e,t)};function Lt(e){let t=d.useRef(e);return xe(()=>{t.current=e},[e]),t}let ie=function(e){let t=Lt(e);return w.useCallback((...n)=>t.current(...n),[t])},cm=d.createContext(void 0);function um(){return d.useContext(cm)}function vo(...e){return Array.from(new Set(e.flatMap(t=>typeof t=="string"?t.split(" "):[]))).filter(Boolean).join(" ")}function it(e,t,...n){if(e in t){let o=t[e];return typeof o=="function"?o(...n):o}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map(o=>`"${o}"`).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,it),r}var tr=(e=>(e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static",e))(tr||{}),vt=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(vt||{});function Re(){let e=fm();return d.useCallback(t=>dm({mergeRefs:e,...t}),[e])}function dm({ourProps:e,theirProps:t,slot:n,defaultTag:r,features:o,visible:s=!0,name:i,mergeRefs:a}){a=a??mm;let l=ki(t,e);if(s)return Vn(l,n,r,i,a);let u=o??0;if(u&2){let{static:f=!1,...c}=l;if(f)return Vn(c,n,r,i,a)}if(u&1){let{unmount:f=!0,...c}=l;return it(f?0:1,{0(){return null},1(){return Vn({...c,hidden:!0,style:{display:"none"}},n,r,i,a)}})}return Vn(l,n,r,i,a)}function Vn(e,t={},n,r,o){let{as:s=n,children:i,refName:a="ref",...l}=zr(e,["unmount","static"]),u=e.ref!==void 0?{[a]:e.ref}:{},f=typeof i=="function"?i(t):i;"className"in l&&l.className&&typeof l.className=="function"&&(l.className=l.className(t)),l["aria-labelledby"]&&l["aria-labelledby"]===l.id&&(l["aria-labelledby"]=void 0);let c={};if(t){let m=!1,h=[];for(let[g,p]of Object.entries(t))typeof p=="boolean"&&(m=!0),p===!0&&h.push(g.replace(/([A-Z])/g,v=>`-${v.toLowerCase()}`));if(m){c["data-headlessui-state"]=h.join(" ");for(let g of h)c[`data-${g}`]=""}}if(s===d.Fragment&&(Object.keys(Mt(l)).length>0||Object.keys(Mt(c)).length>0))if(!d.isValidElement(f)||Array.isArray(f)&&f.length>1){if(Object.keys(Mt(l)).length>0)throw new Error(['Passing props on "Fragment"!',"",`The current component <${r} /> is rendering a "Fragment".`,"However we need to passthrough the following props:",Object.keys(Mt(l)).concat(Object.keys(Mt(c))).map(m=>` - ${m}`).join(` -`),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map(m=>` - ${m}`).join(` -`)].join(` -`))}else{let m=f.props,h=m?.className,g=typeof h=="function"?(...y)=>vo(h(...y),l.className):vo(h,l.className),p=g?{className:g}:{},v=ki(f.props,Mt(zr(l,["ref"])));for(let y in c)y in v&&delete c[y];return d.cloneElement(f,Object.assign({},v,c,u,{ref:o(hm(f),u.ref)},p))}return d.createElement(s,Object.assign({},zr(l,["ref"]),s!==d.Fragment&&u,s!==d.Fragment&&c),f)}function fm(){let e=d.useRef([]),t=d.useCallback(n=>{for(let r of e.current)r!=null&&(typeof r=="function"?r(n):r.current=n)},[]);return(...n)=>{if(!n.every(r=>r==null))return e.current=n,t}}function mm(...e){return e.every(t=>t==null)?void 0:t=>{for(let n of e)n!=null&&(typeof n=="function"?n(t):n.current=t)}}function ki(...e){if(e.length===0)return{};if(e.length===1)return e[0];let t={},n={};for(let r of e)for(let o in r)o.startsWith("on")&&typeof r[o]=="function"?(n[o]!=null||(n[o]=[]),n[o].push(r[o])):t[o]=r[o];if(t.disabled||t["aria-disabled"])for(let r in n)/^(on(?:Click|Pointer|Mouse|Key)(?:Down|Up|Press)?)$/.test(r)&&(n[r]=[o=>{var s;return(s=o?.preventDefault)==null?void 0:s.call(o)}]);for(let r in n)Object.assign(t,{[r](o,...s){let i=n[r];for(let a of i){if((o instanceof Event||o?.nativeEvent instanceof Event)&&o.defaultPrevented)return;a(o,...s)}}});return t}function Oe(e){var t;return Object.assign(d.forwardRef(e),{displayName:(t=e.displayName)!=null?t:e.name})}function Mt(e){let t=Object.assign({},e);for(let n in t)t[n]===void 0&&delete t[n];return t}function zr(e,t=[]){let n=Object.assign({},e);for(let r of t)r in n&&delete n[r];return n}function hm(e){return w.version.split(".")[0]>="19"?e.props.ref:e.ref}let pm="span";var nr=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(nr||{});function vm(e,t){var n;let{features:r=1,...o}=e,s={ref:t,"aria-hidden":(r&2)===2?!0:(n=o["aria-hidden"])!=null?n:void 0,hidden:(r&4)===4?!0:void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...(r&4)===4&&(r&2)!==2&&{display:"none"}}};return Re()({ourProps:s,theirProps:o,slot:{},defaultTag:pm,name:"Hidden"})}let go=Oe(vm);function Ni(e){return typeof e!="object"||e===null?!1:"nodeType"in e}function yt(e){return Ni(e)&&"tagName"in e}function _t(e){return yt(e)&&"accessKey"in e}function gt(e){return yt(e)&&"tabIndex"in e}function gm(e){return yt(e)&&"style"in e}function ym(e){return _t(e)&&e.nodeName==="IFRAME"}function wm(e){return _t(e)&&e.nodeName==="INPUT"}let Ri=Symbol();function bm(e,t=!0){return Object.assign(e,{[Ri]:t})}function Je(...e){let t=d.useRef(e);d.useEffect(()=>{t.current=e},[e]);let n=ie(r=>{for(let o of t.current)o!=null&&(typeof o=="function"?o(r):o.current=r)});return e.every(r=>r==null||r?.[Ri])?void 0:n}let Yo=d.createContext(null);Yo.displayName="DescriptionContext";function Ai(){let e=d.useContext(Yo);if(e===null){let t=new Error("You used a component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(t,Ai),t}return e}function xm(){let[e,t]=d.useState([]);return[e.length>0?e.join(" "):void 0,d.useMemo(()=>function(n){let r=ie(s=>(t(i=>[...i,s]),()=>t(i=>{let a=i.slice(),l=a.indexOf(s);return l!==-1&&a.splice(l,1),a}))),o=d.useMemo(()=>({register:r,slot:n.slot,name:n.name,props:n.props,value:n.value}),[r,n.slot,n.name,n.props,n.value]);return w.createElement(Yo.Provider,{value:o},n.children)},[t])]}let Sm="p";function Em(e,t){let n=d.useId(),r=um(),{id:o=`headlessui-description-${n}`,...s}=e,i=Ai(),a=Je(t);xe(()=>i.register(o),[o,i.register]);let l=r||!1,u=d.useMemo(()=>({...i.slot,disabled:l}),[i.slot,l]),f={ref:a,...i.props,id:o};return Re()({ourProps:f,theirProps:s,slot:u,defaultTag:Sm,name:i.name||"Description"})}let Cm=Oe(Em),Om=Object.assign(Cm,{});var Ii=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(Ii||{});let Tm=d.createContext(()=>{});function Mm({value:e,children:t}){return w.createElement(Tm.Provider,{value:e},t)}let _i=class extends Map{constructor(t){super(),this.factory=t}get(t){let n=super.get(t);return n===void 0&&(n=this.factory(t),this.set(t,n)),n}};var Pm=Object.defineProperty,Dm=(e,t,n)=>t in e?Pm(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,km=(e,t,n)=>(Dm(e,t+"",n),n),Fi=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},Ne=(e,t,n)=>(Fi(e,t,"read from private field"),n?n.call(e):t.get(e)),qr=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},Ts=(e,t,n,r)=>(Fi(e,t,"write to private field"),t.set(e,n),n),Ve,fn,mn;let Nm=class{constructor(t){qr(this,Ve,{}),qr(this,fn,new _i(()=>new Set)),qr(this,mn,new Set),km(this,"disposables",lt()),Ts(this,Ve,t),Xe.isServer&&this.disposables.microTask(()=>{this.dispose()})}dispose(){this.disposables.dispose()}get state(){return Ne(this,Ve)}subscribe(t,n){if(Xe.isServer)return()=>{};let r={selector:t,callback:n,current:t(Ne(this,Ve))};return Ne(this,mn).add(r),this.disposables.add(()=>{Ne(this,mn).delete(r)})}on(t,n){return Xe.isServer?()=>{}:(Ne(this,fn).get(t).add(n),this.disposables.add(()=>{Ne(this,fn).get(t).delete(n)}))}send(t){let n=this.reduce(Ne(this,Ve),t);if(n!==Ne(this,Ve)){Ts(this,Ve,n);for(let r of Ne(this,mn)){let o=r.selector(Ne(this,Ve));Wi(r.current,o)||(r.current=o,r.callback(o))}for(let r of Ne(this,fn).get(t.type))r(Ne(this,Ve),t)}}};Ve=new WeakMap,fn=new WeakMap,mn=new WeakMap;function Wi(e,t){return Object.is(e,t)?!0:typeof e!="object"||e===null||typeof t!="object"||t===null?!1:Array.isArray(e)&&Array.isArray(t)?e.length!==t.length?!1:Gr(e[Symbol.iterator](),t[Symbol.iterator]()):e instanceof Map&&t instanceof Map||e instanceof Set&&t instanceof Set?e.size!==t.size?!1:Gr(e.entries(),t.entries()):Ms(e)&&Ms(t)?Gr(Object.entries(e)[Symbol.iterator](),Object.entries(t)[Symbol.iterator]()):!1}function Gr(e,t){do{let n=e.next(),r=t.next();if(n.done&&r.done)return!0;if(n.done||r.done||!Object.is(n.value,r.value))return!1}while(!0)}function Ms(e){if(Object.prototype.toString.call(e)!=="[object Object]")return!1;let t=Object.getPrototypeOf(e);return t===null||Object.getPrototypeOf(t)===null}var Rm=Object.defineProperty,Am=(e,t,n)=>t in e?Rm(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ps=(e,t,n)=>(Am(e,typeof t!="symbol"?t+"":t,n),n),Im=(e=>(e[e.Push=0]="Push",e[e.Pop=1]="Pop",e))(Im||{});let _m={0(e,t){let n=t.id,r=e.stack,o=e.stack.indexOf(n);if(o!==-1){let s=e.stack.slice();return s.splice(o,1),s.push(n),r=s,{...e,stack:r}}return{...e,stack:[...e.stack,n]}},1(e,t){let n=t.id,r=e.stack.indexOf(n);if(r===-1)return e;let o=e.stack.slice();return o.splice(r,1),{...e,stack:o}}},Fm=class Li extends Nm{constructor(){super(...arguments),Ps(this,"actions",{push:t=>this.send({type:0,id:t}),pop:t=>this.send({type:1,id:t})}),Ps(this,"selectors",{isTop:(t,n)=>t.stack[t.stack.length-1]===n,inStack:(t,n)=>t.stack.includes(n)})}static new(){return new Li({stack:[]})}reduce(t,n){return it(n.type,_m,t,n)}};const $i=new _i(()=>Fm.new());var Kr={exports:{}},Xr={};/** - * @license React - * use-sync-external-store-with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ds;function Wm(){if(Ds)return Xr;Ds=1;var e=Gl();function t(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var n=typeof Object.is=="function"?Object.is:t,r=e.useSyncExternalStore,o=e.useRef,s=e.useEffect,i=e.useMemo,a=e.useDebugValue;return Xr.useSyncExternalStoreWithSelector=function(l,u,f,c,m){var h=o(null);if(h.current===null){var g={hasValue:!1,value:null};h.current=g}else g=h.current;h=i(function(){function v(S){if(!y){if(y=!0,x=S,S=c(S),m!==void 0&&g.hasValue){var T=g.value;if(m(T,S))return b=T}return b=S}if(T=b,n(x,S))return T;var C=c(S);return m!==void 0&&m(T,C)?(x=S,T):(x=S,b=C)}var y=!1,x,b,E=f===void 0?null:f;return[function(){return v(u())},E===null?void 0:function(){return v(E())}]},[u,f,c,m]);var p=r(l,h[0],h[1]);return s(function(){g.hasValue=!0,g.value=p},[p]),a(p),p},Xr}var ks;function Lm(){return ks||(ks=1,Kr.exports=Wm()),Kr.exports}var $m=Lm();function ji(e,t,n=Wi){return $m.useSyncExternalStoreWithSelector(ie(r=>e.subscribe(jm,r)),ie(()=>e.state),ie(()=>e.state),ie(t),n)}function jm(e){return e}function Tn(e,t){let n=d.useId(),r=$i.get(t),[o,s]=ji(r,d.useCallback(i=>[r.selectors.isTop(i,n),r.selectors.inStack(i,n)],[r,n]));return xe(()=>{if(e)return r.actions.push(n),()=>r.actions.pop(n)},[r,e,n]),e?s?o:!0:!1}let yo=new Map,vn=new Map;function Ns(e){var t;let n=(t=vn.get(e))!=null?t:0;return vn.set(e,n+1),n!==0?()=>Rs(e):(yo.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),e.setAttribute("aria-hidden","true"),e.inert=!0,()=>Rs(e))}function Rs(e){var t;let n=(t=vn.get(e))!=null?t:1;if(n===1?vn.delete(e):vn.set(e,n-1),n!==1)return;let r=yo.get(e);r&&(r["aria-hidden"]===null?e.removeAttribute("aria-hidden"):e.setAttribute("aria-hidden",r["aria-hidden"]),e.inert=r.inert,yo.delete(e))}function Bm(e,{allowed:t,disallowed:n}={}){let r=Tn(e,"inert-others");xe(()=>{var o,s;if(!r)return;let i=lt();for(let l of(o=n?.())!=null?o:[])l&&i.add(Ns(l));let a=(s=t?.())!=null?s:[];for(let l of a){if(!l)continue;let u=yr(l);if(!u)continue;let f=l.parentElement;for(;f&&f!==u.body;){for(let c of f.children)a.some(m=>c.contains(m))||i.add(Ns(c));f=f.parentElement}}return i.dispose},[r,t,n])}function Hm(e,t,n){let r=Lt(o=>{let s=o.getBoundingClientRect();s.x===0&&s.y===0&&s.width===0&&s.height===0&&n()});d.useEffect(()=>{if(!e)return;let o=t===null?null:_t(t)?t:t.current;if(!o)return;let s=lt();if(typeof ResizeObserver<"u"){let i=new ResizeObserver(()=>r.current(o));i.observe(o),s.add(()=>i.disconnect())}if(typeof IntersectionObserver<"u"){let i=new IntersectionObserver(()=>r.current(o));i.observe(o),s.add(()=>i.disconnect())}return()=>s.dispose()},[t,r,e])}let rr=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(e=>`${e}:not([tabindex='-1'])`).join(","),Ym=["[data-autofocus]"].map(e=>`${e}:not([tabindex='-1'])`).join(",");var tt=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e[e.AutoFocus=64]="AutoFocus",e))(tt||{}),wo=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(wo||{}),Vm=(e=>(e[e.Previous=-1]="Previous",e[e.Next=1]="Next",e))(Vm||{});function Um(e=document.body){return e==null?[]:Array.from(e.querySelectorAll(rr)).sort((t,n)=>Math.sign((t.tabIndex||Number.MAX_SAFE_INTEGER)-(n.tabIndex||Number.MAX_SAFE_INTEGER)))}function zm(e=document.body){return e==null?[]:Array.from(e.querySelectorAll(Ym)).sort((t,n)=>Math.sign((t.tabIndex||Number.MAX_SAFE_INTEGER)-(n.tabIndex||Number.MAX_SAFE_INTEGER)))}var Bi=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(Bi||{});function qm(e,t=0){var n;return e===((n=yr(e))==null?void 0:n.body)?!1:it(t,{0(){return e.matches(rr)},1(){let r=e;for(;r!==null;){if(r.matches(rr))return!0;r=r.parentElement}return!1}})}var Gm=(e=>(e[e.Keyboard=0]="Keyboard",e[e.Mouse=1]="Mouse",e))(Gm||{});typeof window<"u"&&typeof document<"u"&&(document.addEventListener("keydown",e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",e=>{e.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:e.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0));function ot(e){e?.focus({preventScroll:!0})}let Km=["textarea","input"].join(",");function Xm(e){var t,n;return(n=(t=e?.matches)==null?void 0:t.call(e,Km))!=null?n:!1}function Zm(e,t=n=>n){return e.slice().sort((n,r)=>{let o=t(n),s=t(r);if(o===null||s===null)return 0;let i=o.compareDocumentPosition(s);return i&Node.DOCUMENT_POSITION_FOLLOWING?-1:i&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function gn(e,t,{sorted:n=!0,relativeTo:r=null,skipElements:o=[]}={}){let s=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e.ownerDocument,i=Array.isArray(e)?n?Zm(e):e:t&64?zm(e):Um(e);o.length>0&&i.length>1&&(i=i.filter(h=>!o.some(g=>g!=null&&"current"in g?g?.current===h:g===h))),r=r??s.activeElement;let a=(()=>{if(t&5)return 1;if(t&10)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),l=(()=>{if(t&1)return 0;if(t&2)return Math.max(0,i.indexOf(r))-1;if(t&4)return Math.max(0,i.indexOf(r))+1;if(t&8)return i.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),u=t&32?{preventScroll:!0}:{},f=0,c=i.length,m;do{if(f>=c||f+c<=0)return 0;let h=l+f;if(t&16)h=(h+c)%c;else{if(h<0)return 3;if(h>=c)return 1}m=i[h],m?.focus(u),f+=a}while(m!==s.activeElement);return t&6&&Xm(m)&&m.select(),2}function Hi(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function Qm(){return/Android/gi.test(window.navigator.userAgent)}function As(){return Hi()||Qm()}function Un(e,t,n,r){let o=Lt(n);d.useEffect(()=>{if(!e)return;function s(i){o.current(i)}return document.addEventListener(t,s,r),()=>document.removeEventListener(t,s,r)},[e,t,r])}function Yi(e,t,n,r){let o=Lt(n);d.useEffect(()=>{if(!e)return;function s(i){o.current(i)}return window.addEventListener(t,s,r),()=>window.removeEventListener(t,s,r)},[e,t,r])}const Is=30;function Jm(e,t,n){let r=Lt(n),o=d.useCallback(function(a,l){if(a.defaultPrevented)return;let u=l(a);if(u===null||!u.getRootNode().contains(u)||!u.isConnected)return;let f=(function c(m){return typeof m=="function"?c(m()):Array.isArray(m)||m instanceof Set?m:[m]})(t);for(let c of f)if(c!==null&&(c.contains(u)||a.composed&&a.composedPath().includes(c)))return;return!qm(u,Bi.Loose)&&u.tabIndex!==-1&&a.preventDefault(),r.current(a,u)},[r,t]),s=d.useRef(null);Un(e,"pointerdown",a=>{var l,u;As()||(s.current=((u=(l=a.composedPath)==null?void 0:l.call(a))==null?void 0:u[0])||a.target)},!0),Un(e,"pointerup",a=>{if(As()||!s.current)return;let l=s.current;return s.current=null,o(a,()=>l)},!0);let i=d.useRef({x:0,y:0});Un(e,"touchstart",a=>{i.current.x=a.touches[0].clientX,i.current.y=a.touches[0].clientY},!0),Un(e,"touchend",a=>{let l={x:a.changedTouches[0].clientX,y:a.changedTouches[0].clientY};if(!(Math.abs(l.x-i.current.x)>=Is||Math.abs(l.y-i.current.y)>=Is))return o(a,()=>gt(a.target)?a.target:null)},!0),Yi(e,"blur",a=>o(a,()=>ym(window.document.activeElement)?window.document.activeElement:null),!0)}function br(...e){return d.useMemo(()=>yr(...e),[...e])}function Vi(e,t,n,r){let o=Lt(n);d.useEffect(()=>{e=e??window;function s(i){o.current(i)}return e.addEventListener(t,s,r),()=>e.removeEventListener(t,s,r)},[e,t,r])}function eh(e){return d.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getSnapshot)}function th(e,t){let n=e(),r=new Set;return{getSnapshot(){return n},subscribe(o){return r.add(o),()=>r.delete(o)},dispatch(o,...s){let i=t[o].call(n,...s);i&&(n=i,r.forEach(a=>a()))}}}function nh(){let e;return{before({doc:t}){var n;let r=t.documentElement,o=(n=t.defaultView)!=null?n:window;e=Math.max(0,o.innerWidth-r.clientWidth)},after({doc:t,d:n}){let r=t.documentElement,o=Math.max(0,r.clientWidth-r.offsetWidth),s=Math.max(0,e-o);n.style(r,"paddingRight",`${s}px`)}}}function rh(){return Hi()?{before({doc:e,d:t,meta:n}){function r(o){return n.containers.flatMap(s=>s()).some(s=>s.contains(o))}t.microTask(()=>{var o;if(window.getComputedStyle(e.documentElement).scrollBehavior!=="auto"){let a=lt();a.style(e.documentElement,"scrollBehavior","auto"),t.add(()=>t.microTask(()=>a.dispose()))}let s=(o=window.scrollY)!=null?o:window.pageYOffset,i=null;t.addEventListener(e,"click",a=>{if(gt(a.target))try{let l=a.target.closest("a");if(!l)return;let{hash:u}=new URL(l.href),f=e.querySelector(u);gt(f)&&!r(f)&&(i=f)}catch{}},!0),t.addEventListener(e,"touchstart",a=>{if(gt(a.target)&&gm(a.target))if(r(a.target)){let l=a.target;for(;l.parentElement&&r(l.parentElement);)l=l.parentElement;t.style(l,"overscrollBehavior","contain")}else t.style(a.target,"touchAction","none")}),t.addEventListener(e,"touchmove",a=>{if(gt(a.target)){if(wm(a.target))return;if(r(a.target)){let l=a.target;for(;l.parentElement&&l.dataset.headlessuiPortal!==""&&!(l.scrollHeight>l.clientHeight||l.scrollWidth>l.clientWidth);)l=l.parentElement;l.dataset.headlessuiPortal===""&&a.preventDefault()}else a.preventDefault()}},{passive:!1}),t.add(()=>{var a;let l=(a=window.scrollY)!=null?a:window.pageYOffset;s!==l&&window.scrollTo(0,s),i&&i.isConnected&&(i.scrollIntoView({block:"nearest"}),i=null)})})}}:{}}function oh(){return{before({doc:e,d:t}){t.style(e.documentElement,"overflow","hidden")}}}function sh(e){let t={};for(let n of e)Object.assign(t,n(t));return t}let kt=th(()=>new Map,{PUSH(e,t){var n;let r=(n=this.get(e))!=null?n:{doc:e,count:0,d:lt(),meta:new Set};return r.count++,r.meta.add(t),this.set(e,r),this},POP(e,t){let n=this.get(e);return n&&(n.count--,n.meta.delete(t)),this},SCROLL_PREVENT({doc:e,d:t,meta:n}){let r={doc:e,d:t,meta:sh(n)},o=[rh(),nh(),oh()];o.forEach(({before:s})=>s?.(r)),o.forEach(({after:s})=>s?.(r))},SCROLL_ALLOW({d:e}){e.dispose()},TEARDOWN({doc:e}){this.delete(e)}});kt.subscribe(()=>{let e=kt.getSnapshot(),t=new Map;for(let[n]of e)t.set(n,n.documentElement.style.overflow);for(let n of e.values()){let r=t.get(n.doc)==="hidden",o=n.count!==0;(o&&!r||!o&&r)&&kt.dispatch(n.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",n),n.count===0&&kt.dispatch("TEARDOWN",n)}});function ah(e,t,n=()=>({containers:[]})){let r=eh(kt),o=t?r.get(t):void 0,s=o?o.count>0:!1;return xe(()=>{if(!(!t||!e))return kt.dispatch("PUSH",t,n),()=>kt.dispatch("POP",t,n)},[e,t]),s}function ih(e,t,n=()=>[document.body]){let r=Tn(e,"scroll-lock");ah(r,t,o=>{var s;return{containers:[...(s=o.containers)!=null?s:[],n]}})}function lh(e=0){let[t,n]=d.useState(e),r=d.useCallback(l=>n(l),[t]),o=d.useCallback(l=>n(u=>u|l),[t]),s=d.useCallback(l=>(t&l)===l,[t]),i=d.useCallback(l=>n(u=>u&~l),[n]),a=d.useCallback(l=>n(u=>u^l),[n]);return{flags:t,setFlag:r,addFlag:o,hasFlag:s,removeFlag:i,toggleFlag:a}}var ch={},_s,Fs;typeof process<"u"&&typeof globalThis<"u"&&typeof Element<"u"&&((_s=process==null?void 0:ch)==null?void 0:_s.NODE_ENV)==="test"&&typeof((Fs=Element?.prototype)==null?void 0:Fs.getAnimations)>"u"&&(Element.prototype.getAnimations=function(){return console.warn(["Headless UI has polyfilled `Element.prototype.getAnimations` for your tests.","Please install a proper polyfill e.g. `jsdom-testing-mocks`, to silence these warnings.","","Example usage:","```js","import { mockAnimationsApi } from 'jsdom-testing-mocks'","mockAnimationsApi()","```"].join(` -`)),[]});var uh=(e=>(e[e.None=0]="None",e[e.Closed=1]="Closed",e[e.Enter=2]="Enter",e[e.Leave=4]="Leave",e))(uh||{});function dh(e){let t={};for(let n in e)e[n]===!0&&(t[`data-${n}`]="");return t}function fh(e,t,n,r){let[o,s]=d.useState(n),{hasFlag:i,addFlag:a,removeFlag:l}=lh(e&&o?3:0),u=d.useRef(!1),f=d.useRef(!1),c=Ho();return xe(()=>{var m;if(e){if(n&&s(!0),!t){n&&a(3);return}return(m=r?.start)==null||m.call(r,n),mh(t,{inFlight:u,prepare(){f.current?f.current=!1:f.current=u.current,u.current=!0,!f.current&&(n?(a(3),l(4)):(a(4),l(2)))},run(){f.current?n?(l(3),a(4)):(l(4),a(3)):n?l(1):a(1)},done(){var h;f.current&&typeof t.getAnimations=="function"&&t.getAnimations().length>0||(u.current=!1,l(7),n||s(!1),(h=r?.end)==null||h.call(r,n))}})}},[e,n,t,c]),e?[o,{closed:i(1),enter:i(2),leave:i(4),transition:i(2)||i(4)}]:[n,{closed:void 0,enter:void 0,leave:void 0,transition:void 0}]}function mh(e,{prepare:t,run:n,done:r,inFlight:o}){let s=lt();return ph(e,{prepare:t,inFlight:o}),s.nextFrame(()=>{n(),s.requestAnimationFrame(()=>{s.add(hh(e,r))})}),s.dispose}function hh(e,t){var n,r;let o=lt();if(!e)return o.dispose;let s=!1;o.add(()=>{s=!0});let i=(r=(n=e.getAnimations)==null?void 0:n.call(e).filter(a=>a instanceof CSSTransition))!=null?r:[];return i.length===0?(t(),o.dispose):(Promise.allSettled(i.map(a=>a.finished)).then(()=>{s||t()}),o.dispose)}function ph(e,{inFlight:t,prepare:n}){if(t!=null&&t.current){n();return}let r=e.style.transition;e.style.transition="none",n(),e.offsetHeight,e.style.transition=r}function Vo(e,t){let n=d.useRef([]),r=ie(e);d.useEffect(()=>{let o=[...n.current];for(let[s,i]of t.entries())if(n.current[s]!==i){let a=r(t,o);return n.current=t,a}},[r,...t])}let xr=d.createContext(null);xr.displayName="OpenClosedContext";var Le=(e=>(e[e.Open=1]="Open",e[e.Closed=2]="Closed",e[e.Closing=4]="Closing",e[e.Opening=8]="Opening",e))(Le||{});function Sr(){return d.useContext(xr)}function vh({value:e,children:t}){return w.createElement(xr.Provider,{value:e},t)}function gh({children:e}){return w.createElement(xr.Provider,{value:null},e)}function yh(e){function t(){document.readyState!=="loading"&&(e(),document.removeEventListener("DOMContentLoaded",t))}typeof window<"u"&&typeof document<"u"&&(document.addEventListener("DOMContentLoaded",t),t())}let pt=[];yh(()=>{function e(t){if(!gt(t.target)||t.target===document.body||pt[0]===t.target)return;let n=t.target;n=n.closest(rr),pt.unshift(n??t.target),pt=pt.filter(r=>r!=null&&r.isConnected),pt.splice(10)}window.addEventListener("click",e,{capture:!0}),window.addEventListener("mousedown",e,{capture:!0}),window.addEventListener("focus",e,{capture:!0}),document.body.addEventListener("click",e,{capture:!0}),document.body.addEventListener("mousedown",e,{capture:!0}),document.body.addEventListener("focus",e,{capture:!0})});function Ui(e){let t=ie(e),n=d.useRef(!1);d.useEffect(()=>(n.current=!1,()=>{n.current=!0,wr(()=>{n.current&&t()})}),[t])}function wh(){let e=typeof document>"u";return"useSyncExternalStore"in Kn?(t=>t.useSyncExternalStore)(Kn)(()=>()=>{},()=>!1,()=>!e):!1}function Mn(){let e=wh(),[t,n]=d.useState(Xe.isHandoffComplete);return t&&Xe.isHandoffComplete===!1&&n(!1),d.useEffect(()=>{t!==!0&&n(!0)},[t]),d.useEffect(()=>Xe.handoff(),[]),e?!1:t}let zi=d.createContext(!1);function bh(){return d.useContext(zi)}function Ws(e){return w.createElement(zi.Provider,{value:e.force},e.children)}function xh(e){let t=bh(),n=d.useContext(Gi),[r,o]=d.useState(()=>{var s;if(!t&&n!==null)return(s=n.current)!=null?s:null;if(Xe.isServer)return null;let i=e?.getElementById("headlessui-portal-root");if(i)return i;if(e===null)return null;let a=e.createElement("div");return a.setAttribute("id","headlessui-portal-root"),e.body.appendChild(a)});return d.useEffect(()=>{r!==null&&(e!=null&&e.body.contains(r)||e==null||e.body.appendChild(r))},[r,e]),d.useEffect(()=>{t||n!==null&&o(n.current)},[n,o,t]),r}let qi=d.Fragment,Sh=Oe(function(e,t){let{ownerDocument:n=null,...r}=e,o=d.useRef(null),s=Je(bm(h=>{o.current=h}),t),i=br(o),a=n??i,l=xh(a),[u]=d.useState(()=>{var h;return Xe.isServer?null:(h=a?.createElement("div"))!=null?h:null}),f=d.useContext(bo),c=Mn();xe(()=>{!l||!u||l.contains(u)||(u.setAttribute("data-headlessui-portal",""),l.appendChild(u))},[l,u]),xe(()=>{if(u&&f)return f.register(u)},[f,u]),Ui(()=>{var h;!l||!u||(Ni(u)&&l.contains(u)&&l.removeChild(u),l.childNodes.length<=0&&((h=l.parentElement)==null||h.removeChild(l)))});let m=Re();return c?!l||!u?null:Qt.createPortal(m({ourProps:{ref:s},theirProps:r,slot:{},defaultTag:qi,name:"Portal"}),u):null});function Eh(e,t){let n=Je(t),{enabled:r=!0,ownerDocument:o,...s}=e,i=Re();return r?w.createElement(Sh,{...s,ownerDocument:o,ref:n}):i({ourProps:{ref:n},theirProps:s,slot:{},defaultTag:qi,name:"Portal"})}let Ch=d.Fragment,Gi=d.createContext(null);function Oh(e,t){let{target:n,...r}=e,o={ref:Je(t)},s=Re();return w.createElement(Gi.Provider,{value:n},s({ourProps:o,theirProps:r,defaultTag:Ch,name:"Popover.Group"}))}let bo=d.createContext(null);function Th(){let e=d.useContext(bo),t=d.useRef([]),n=ie(s=>(t.current.push(s),e&&e.register(s),()=>r(s))),r=ie(s=>{let i=t.current.indexOf(s);i!==-1&&t.current.splice(i,1),e&&e.unregister(s)}),o=d.useMemo(()=>({register:n,unregister:r,portals:t}),[n,r,t]);return[t,d.useMemo(()=>function({children:s}){return w.createElement(bo.Provider,{value:o},s)},[o])]}let Mh=Oe(Eh),Ki=Oe(Oh),Ph=Object.assign(Mh,{Group:Ki});function Dh(e,t=typeof document<"u"?document.defaultView:null,n){let r=Tn(e,"escape");Vi(t,"keydown",o=>{r&&(o.defaultPrevented||o.key===Ii.Escape&&n(o))})}function kh(){var e;let[t]=d.useState(()=>typeof window<"u"&&typeof window.matchMedia=="function"?window.matchMedia("(pointer: coarse)"):null),[n,r]=d.useState((e=t?.matches)!=null?e:!1);return xe(()=>{if(!t)return;function o(s){r(s.matches)}return t.addEventListener("change",o),()=>t.removeEventListener("change",o)},[t]),n}function Nh({defaultContainers:e=[],portals:t,mainTreeNode:n}={}){let r=br(n),o=ie(()=>{var s,i;let a=[];for(let l of e)l!==null&&(yt(l)?a.push(l):"current"in l&&yt(l.current)&&a.push(l.current));if(t!=null&&t.current)for(let l of t.current)a.push(l);for(let l of(s=r?.querySelectorAll("html > *, body > *"))!=null?s:[])l!==document.body&&l!==document.head&&yt(l)&&l.id!=="headlessui-portal-root"&&(n&&(l.contains(n)||l.contains((i=n?.getRootNode())==null?void 0:i.host))||a.some(u=>l.contains(u))||a.push(l));return a});return{resolveContainers:o,contains:ie(s=>o().some(i=>i.contains(s)))}}let Xi=d.createContext(null);function Ls({children:e,node:t}){let[n,r]=d.useState(null),o=Zi(t??n);return w.createElement(Xi.Provider,{value:o},e,o===null&&w.createElement(go,{features:nr.Hidden,ref:s=>{var i,a;if(s){for(let l of(a=(i=yr(s))==null?void 0:i.querySelectorAll("html > *, body > *"))!=null?a:[])if(l!==document.body&&l!==document.head&&yt(l)&&l!=null&&l.contains(s)){r(l);break}}}}))}function Zi(e=null){var t;return(t=d.useContext(Xi))!=null?t:e}function Uo(){let e=d.useRef(!1);return xe(()=>(e.current=!0,()=>{e.current=!1}),[]),e}var hn=(e=>(e[e.Forwards=0]="Forwards",e[e.Backwards=1]="Backwards",e))(hn||{});function Rh(){let e=d.useRef(0);return Yi(!0,"keydown",t=>{t.key==="Tab"&&(e.current=t.shiftKey?1:0)},!0),e}function Qi(e){if(!e)return new Set;if(typeof e=="function")return new Set(e());let t=new Set;for(let n of e.current)yt(n.current)&&t.add(n.current);return t}let Ah="div";var Dt=(e=>(e[e.None=0]="None",e[e.InitialFocus=1]="InitialFocus",e[e.TabLock=2]="TabLock",e[e.FocusLock=4]="FocusLock",e[e.RestoreFocus=8]="RestoreFocus",e[e.AutoFocus=16]="AutoFocus",e))(Dt||{});function Ih(e,t){let n=d.useRef(null),r=Je(n,t),{initialFocus:o,initialFocusFallback:s,containers:i,features:a=15,...l}=e;Mn()||(a=0);let u=br(n);Lh(a,{ownerDocument:u});let f=$h(a,{ownerDocument:u,container:n,initialFocus:o,initialFocusFallback:s});jh(a,{ownerDocument:u,container:n,containers:i,previousActiveElement:f});let c=Rh(),m=ie(x=>{if(!_t(n.current))return;let b=n.current;(E=>E())(()=>{it(c.current,{[hn.Forwards]:()=>{gn(b,tt.First,{skipElements:[x.relatedTarget,s]})},[hn.Backwards]:()=>{gn(b,tt.Last,{skipElements:[x.relatedTarget,s]})}})})}),h=Tn(!!(a&2),"focus-trap#tab-lock"),g=Ho(),p=d.useRef(!1),v={ref:r,onKeyDown(x){x.key=="Tab"&&(p.current=!0,g.requestAnimationFrame(()=>{p.current=!1}))},onBlur(x){if(!(a&4))return;let b=Qi(i);_t(n.current)&&b.add(n.current);let E=x.relatedTarget;gt(E)&&E.dataset.headlessuiFocusGuard!=="true"&&(Ji(b,E)||(p.current?gn(n.current,it(c.current,{[hn.Forwards]:()=>tt.Next,[hn.Backwards]:()=>tt.Previous})|tt.WrapAround,{relativeTo:x.target}):gt(x.target)&&ot(x.target)))}},y=Re();return w.createElement(w.Fragment,null,h&&w.createElement(go,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:m,features:nr.Focusable}),y({ourProps:v,theirProps:l,defaultTag:Ah,name:"FocusTrap"}),h&&w.createElement(go,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:m,features:nr.Focusable}))}let _h=Oe(Ih),Fh=Object.assign(_h,{features:Dt});function Wh(e=!0){let t=d.useRef(pt.slice());return Vo(([n],[r])=>{r===!0&&n===!1&&wr(()=>{t.current.splice(0)}),r===!1&&n===!0&&(t.current=pt.slice())},[e,pt,t]),ie(()=>{var n;return(n=t.current.find(r=>r!=null&&r.isConnected))!=null?n:null})}function Lh(e,{ownerDocument:t}){let n=!!(e&8),r=Wh(n);Vo(()=>{n||t?.activeElement===t?.body&&ot(r())},[n]),Ui(()=>{n&&ot(r())})}function $h(e,{ownerDocument:t,container:n,initialFocus:r,initialFocusFallback:o}){let s=d.useRef(null),i=Tn(!!(e&1),"focus-trap#initial-focus"),a=Uo();return Vo(()=>{if(e===0)return;if(!i){o!=null&&o.current&&ot(o.current);return}let l=n.current;l&&wr(()=>{if(!a.current)return;let u=t?.activeElement;if(r!=null&&r.current){if(r?.current===u){s.current=u;return}}else if(l.contains(u)){s.current=u;return}if(r!=null&&r.current)ot(r.current);else{if(e&16){if(gn(l,tt.First|tt.AutoFocus)!==wo.Error)return}else if(gn(l,tt.First)!==wo.Error)return;if(o!=null&&o.current&&(ot(o.current),t?.activeElement===o.current))return;console.warn("There are no focusable elements inside the ")}s.current=t?.activeElement})},[o,i,e]),s}function jh(e,{ownerDocument:t,container:n,containers:r,previousActiveElement:o}){let s=Uo(),i=!!(e&4);Vi(t?.defaultView,"focus",a=>{if(!i||!s.current)return;let l=Qi(r);_t(n.current)&&l.add(n.current);let u=o.current;if(!u)return;let f=a.target;_t(f)?Ji(l,f)?(o.current=f,ot(f)):(a.preventDefault(),a.stopPropagation(),ot(u)):ot(o.current)},!0)}function Ji(e,t){for(let n of e)if(n.contains(t))return!0;return!1}function el(e){var t;return!!(e.enter||e.enterFrom||e.enterTo||e.leave||e.leaveFrom||e.leaveTo)||((t=e.as)!=null?t:nl)!==d.Fragment||w.Children.count(e.children)===1}let Er=d.createContext(null);Er.displayName="TransitionContext";var Bh=(e=>(e.Visible="visible",e.Hidden="hidden",e))(Bh||{});function Hh(){let e=d.useContext(Er);if(e===null)throw new Error("A is used but it is missing a parent or .");return e}function Yh(){let e=d.useContext(Cr);if(e===null)throw new Error("A is used but it is missing a parent or .");return e}let Cr=d.createContext(null);Cr.displayName="NestingContext";function Or(e){return"children"in e?Or(e.children):e.current.filter(({el:t})=>t.current!==null).filter(({state:t})=>t==="visible").length>0}function tl(e,t){let n=Lt(e),r=d.useRef([]),o=Uo(),s=Ho(),i=ie((h,g=vt.Hidden)=>{let p=r.current.findIndex(({el:v})=>v===h);p!==-1&&(it(g,{[vt.Unmount](){r.current.splice(p,1)},[vt.Hidden](){r.current[p].state="hidden"}}),s.microTask(()=>{var v;!Or(r)&&o.current&&((v=n.current)==null||v.call(n))}))}),a=ie(h=>{let g=r.current.find(({el:p})=>p===h);return g?g.state!=="visible"&&(g.state="visible"):r.current.push({el:h,state:"visible"}),()=>i(h,vt.Unmount)}),l=d.useRef([]),u=d.useRef(Promise.resolve()),f=d.useRef({enter:[],leave:[]}),c=ie((h,g,p)=>{l.current.splice(0),t&&(t.chains.current[g]=t.chains.current[g].filter(([v])=>v!==h)),t?.chains.current[g].push([h,new Promise(v=>{l.current.push(v)})]),t?.chains.current[g].push([h,new Promise(v=>{Promise.all(f.current[g].map(([y,x])=>x)).then(()=>v())})]),g==="enter"?u.current=u.current.then(()=>t?.wait.current).then(()=>p(g)):p(g)}),m=ie((h,g,p)=>{Promise.all(f.current[g].splice(0).map(([v,y])=>y)).then(()=>{var v;(v=l.current.shift())==null||v()}).then(()=>p(g))});return d.useMemo(()=>({children:r,register:a,unregister:i,onStart:c,onStop:m,wait:u,chains:f}),[a,i,r,c,m,f,u])}let nl=d.Fragment,rl=tr.RenderStrategy;function Vh(e,t){var n,r;let{transition:o=!0,beforeEnter:s,afterEnter:i,beforeLeave:a,afterLeave:l,enter:u,enterFrom:f,enterTo:c,entered:m,leave:h,leaveFrom:g,leaveTo:p,...v}=e,[y,x]=d.useState(null),b=d.useRef(null),E=el(e),S=Je(...E?[b,t,x]:t===null?[]:[t]),T=(n=v.unmount)==null||n?vt.Unmount:vt.Hidden,{show:C,appear:M,initial:I}=Hh(),[N,_]=d.useState(C?"visible":"hidden"),B=Yh(),{register:R,unregister:$}=B;xe(()=>R(b),[R,b]),xe(()=>{if(T===vt.Hidden&&b.current){if(C&&N!=="visible"){_("visible");return}return it(N,{hidden:()=>$(b),visible:()=>R(b)})}},[N,b,R,$,C,T]);let H=Mn();xe(()=>{if(E&&H&&N==="visible"&&b.current===null)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")},[b,N,H,E]);let P=I&&!M,F=M&&C&&I,k=d.useRef(!1),j=tl(()=>{k.current||(_("hidden"),$(b))},B),U=ie(A=>{k.current=!0;let L=A?"enter":"leave";j.onStart(b,L,Z=>{Z==="enter"?s?.():Z==="leave"&&a?.()})}),oe=ie(A=>{let L=A?"enter":"leave";k.current=!1,j.onStop(b,L,Z=>{Z==="enter"?i?.():Z==="leave"&&l?.()}),L==="leave"&&!Or(j)&&(_("hidden"),$(b))});d.useEffect(()=>{E&&o||(U(C),oe(C))},[C,E,o]);let me=!(!o||!E||!H||P),[,D]=fh(me,y,C,{start:U,end:oe}),q=Mt({ref:S,className:((r=vo(v.className,F&&u,F&&f,D.enter&&u,D.enter&&D.closed&&f,D.enter&&!D.closed&&c,D.leave&&h,D.leave&&!D.closed&&g,D.leave&&D.closed&&p,!D.transition&&C&&m))==null?void 0:r.trim())||void 0,...dh(D)}),K=0;N==="visible"&&(K|=Le.Open),N==="hidden"&&(K|=Le.Closed),C&&N==="hidden"&&(K|=Le.Opening),!C&&N==="visible"&&(K|=Le.Closing);let le=Re();return w.createElement(Cr.Provider,{value:j},w.createElement(vh,{value:K},le({ourProps:q,theirProps:v,defaultTag:nl,features:rl,visible:N==="visible",name:"Transition.Child"})))}function Uh(e,t){let{show:n,appear:r=!1,unmount:o=!0,...s}=e,i=d.useRef(null),a=el(e),l=Je(...a?[i,t]:t===null?[]:[t]);Mn();let u=Sr();if(n===void 0&&u!==null&&(n=(u&Le.Open)===Le.Open),n===void 0)throw new Error("A is used but it is missing a `show={true | false}` prop.");let[f,c]=d.useState(n?"visible":"hidden"),m=tl(()=>{n||c("hidden")}),[h,g]=d.useState(!0),p=d.useRef([n]);xe(()=>{h!==!1&&p.current[p.current.length-1]!==n&&(p.current.push(n),g(!1))},[p,n]);let v=d.useMemo(()=>({show:n,appear:r,initial:h}),[n,r,h]);xe(()=>{n?c("visible"):!Or(m)&&i.current!==null&&c("hidden")},[n,m]);let y={unmount:o},x=ie(()=>{var S;h&&g(!1),(S=e.beforeEnter)==null||S.call(e)}),b=ie(()=>{var S;h&&g(!1),(S=e.beforeLeave)==null||S.call(e)}),E=Re();return w.createElement(Cr.Provider,{value:m},w.createElement(Er.Provider,{value:v},E({ourProps:{...y,as:d.Fragment,children:w.createElement(ol,{ref:l,...y,...s,beforeEnter:x,beforeLeave:b})},theirProps:{},defaultTag:d.Fragment,features:rl,visible:f==="visible",name:"Transition"})))}function zh(e,t){let n=d.useContext(Er)!==null,r=Sr()!==null;return w.createElement(w.Fragment,null,!n&&r?w.createElement(xo,{ref:t,...e}):w.createElement(ol,{ref:t,...e}))}let xo=Oe(Uh),ol=Oe(Vh),zo=Oe(zh),qh=Object.assign(xo,{Child:zo,Root:xo});var Gh=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Gh||{}),Kh=(e=>(e[e.SetTitleId=0]="SetTitleId",e))(Kh||{});let Xh={0(e,t){return e.titleId===t.id?e:{...e,titleId:t.id}}},qo=d.createContext(null);qo.displayName="DialogContext";function Tr(e){let t=d.useContext(qo);if(t===null){let n=new Error(`<${e} /> is missing a parent

    component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,Tr),n}return t}function Zh(e,t){return it(t.type,Xh,e,t)}let $s=Oe(function(e,t){let n=d.useId(),{id:r=`headlessui-dialog-${n}`,open:o,onClose:s,initialFocus:i,role:a="dialog",autoFocus:l=!0,__demoMode:u=!1,unmount:f=!1,...c}=e,m=d.useRef(!1);a=(function(){return a==="dialog"||a==="alertdialog"?a:(m.current||(m.current=!0,console.warn(`Invalid role [${a}] passed to . Only \`dialog\` and and \`alertdialog\` are supported. Using \`dialog\` instead.`)),"dialog")})();let h=Sr();o===void 0&&h!==null&&(o=(h&Le.Open)===Le.Open);let g=d.useRef(null),p=Je(g,t),v=br(g),y=o?0:1,[x,b]=d.useReducer(Zh,{titleId:null,descriptionId:null,panelRef:d.createRef()}),E=ie(()=>s(!1)),S=ie(D=>b({type:0,id:D})),T=Mn()?y===0:!1,[C,M]=Th(),I={get current(){var D;return(D=x.panelRef.current)!=null?D:g.current}},N=Zi(),{resolveContainers:_}=Nh({mainTreeNode:N,portals:C,defaultContainers:[I]}),B=h!==null?(h&Le.Closing)===Le.Closing:!1;Bm(u||B?!1:T,{allowed:ie(()=>{var D,q;return[(q=(D=g.current)==null?void 0:D.closest("[data-headlessui-portal]"))!=null?q:null]}),disallowed:ie(()=>{var D;return[(D=N?.closest("body > *:not(#headlessui-portal-root)"))!=null?D:null]})});let R=$i.get(null);xe(()=>{if(T)return R.actions.push(r),()=>R.actions.pop(r)},[R,r,T]);let $=ji(R,d.useCallback(D=>R.selectors.isTop(D,r),[R,r]));Jm($,_,D=>{D.preventDefault(),E()}),Dh($,v?.defaultView,D=>{D.preventDefault(),D.stopPropagation(),document.activeElement&&"blur"in document.activeElement&&typeof document.activeElement.blur=="function"&&document.activeElement.blur(),E()}),ih(u||B?!1:T,v,_),Hm(T,g,E);let[H,P]=xm(),F=d.useMemo(()=>[{dialogState:y,close:E,setTitleId:S,unmount:f},x],[y,x,E,S,f]),k=d.useMemo(()=>({open:y===0}),[y]),j={ref:p,id:r,role:a,tabIndex:-1,"aria-modal":u?void 0:y===0?!0:void 0,"aria-labelledby":x.titleId,"aria-describedby":H,unmount:f},U=!kh(),oe=Dt.None;T&&!u&&(oe|=Dt.RestoreFocus,oe|=Dt.TabLock,l&&(oe|=Dt.AutoFocus),U&&(oe|=Dt.InitialFocus));let me=Re();return w.createElement(gh,null,w.createElement(Ws,{force:!0},w.createElement(Ph,null,w.createElement(qo.Provider,{value:F},w.createElement(Ki,{target:g},w.createElement(Ws,{force:!1},w.createElement(P,{slot:k},w.createElement(M,null,w.createElement(Fh,{initialFocus:i,initialFocusFallback:g,containers:_,features:oe},w.createElement(Mm,{value:E},me({ourProps:j,theirProps:c,slot:k,defaultTag:Qh,features:Jh,visible:y===0,name:"Dialog"})))))))))))}),Qh="div",Jh=tr.RenderStrategy|tr.Static;function ep(e,t){let{transition:n=!1,open:r,...o}=e,s=Sr(),i=e.hasOwnProperty("open")||s!==null,a=e.hasOwnProperty("onClose");if(!i&&!a)throw new Error("You have to provide an `open` and an `onClose` prop to the `Dialog` component.");if(!i)throw new Error("You provided an `onClose` prop to the `Dialog`, but forgot an `open` prop.");if(!a)throw new Error("You provided an `open` prop to the `Dialog`, but forgot an `onClose` prop.");if(!s&&typeof e.open!="boolean")throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${e.open}`);if(typeof e.onClose!="function")throw new Error(`You provided an \`onClose\` prop to the \`Dialog\`, but the value is not a function. Received: ${e.onClose}`);return(r!==void 0||n)&&!o.static?w.createElement(Ls,null,w.createElement(qh,{show:r,transition:n,unmount:o.unmount},w.createElement($s,{ref:t,...o}))):w.createElement(Ls,null,w.createElement($s,{ref:t,open:r,...o}))}let tp="div";function np(e,t){let n=d.useId(),{id:r=`headlessui-dialog-panel-${n}`,transition:o=!1,...s}=e,[{dialogState:i,unmount:a},l]=Tr("Dialog.Panel"),u=Je(t,l.panelRef),f=d.useMemo(()=>({open:i===0}),[i]),c=ie(v=>{v.stopPropagation()}),m={ref:u,id:r,onClick:c},h=o?zo:d.Fragment,g=o?{unmount:a}:{},p=Re();return w.createElement(h,{...g},p({ourProps:m,theirProps:s,slot:f,defaultTag:tp,name:"Dialog.Panel"}))}let rp="div";function op(e,t){let{transition:n=!1,...r}=e,[{dialogState:o,unmount:s}]=Tr("Dialog.Backdrop"),i=d.useMemo(()=>({open:o===0}),[o]),a={ref:t,"aria-hidden":!0},l=n?zo:d.Fragment,u=n?{unmount:s}:{},f=Re();return w.createElement(l,{...u},f({ourProps:a,theirProps:r,slot:i,defaultTag:rp,name:"Dialog.Backdrop"}))}let sp="h2";function ap(e,t){let n=d.useId(),{id:r=`headlessui-dialog-title-${n}`,...o}=e,[{dialogState:s,setTitleId:i}]=Tr("Dialog.Title"),a=Je(t);d.useEffect(()=>(i(r),()=>i(null)),[r,i]);let l=d.useMemo(()=>({open:s===0}),[s]),u={ref:a,id:r};return Re()({ourProps:u,theirProps:o,slot:l,defaultTag:sp,name:"Dialog.Title"})}let ip=Oe(ep),lp=Oe(np);Oe(op);let cp=Oe(ap),iw=Object.assign(ip,{Panel:lp,Title:cp,Description:Om});function up(e,t,n="long"){return new Intl.DateTimeFormat("en-US",{hour:"numeric",timeZone:e,timeZoneName:n}).format(t).split(/\s/g).slice(2).join(" ")}const dp={},pn={};function Nt(e,t){try{const r=(dp[e]||=new Intl.DateTimeFormat("en-US",{timeZone:e,timeZoneName:"longOffset"}).format)(t).split("GMT")[1];return r in pn?pn[r]:js(r,r.split(":"))}catch{if(e in pn)return pn[e];const n=e?.match(fp);return n?js(e,n.slice(1)):NaN}}const fp=/([+-]\d\d):?(\d\d)?/;function js(e,t){const n=+(t[0]||0),r=+(t[1]||0),o=+(t[2]||0)/60;return pn[e]=n*60+r>0?n*60+r+o:n*60-r-o}class Ge extends Date{constructor(...t){super(),t.length>1&&typeof t[t.length-1]=="string"&&(this.timeZone=t.pop()),this.internal=new Date,isNaN(Nt(this.timeZone,this))?this.setTime(NaN):t.length?typeof t[0]=="number"&&(t.length===1||t.length===2&&typeof t[1]!="number")?this.setTime(t[0]):typeof t[0]=="string"?this.setTime(+new Date(t[0])):t[0]instanceof Date?this.setTime(+t[0]):(this.setTime(+new Date(...t)),sl(this),So(this)):this.setTime(Date.now())}static tz(t,...n){return n.length?new Ge(...n,t):new Ge(Date.now(),t)}withTimeZone(t){return new Ge(+this,t)}getTimezoneOffset(){const t=-Nt(this.timeZone,this);return t>0?Math.floor(t):Math.ceil(t)}setTime(t){return Date.prototype.setTime.apply(this,arguments),So(this),+this}[Symbol.for("constructDateFrom")](t){return new Ge(+new Date(t),this.timeZone)}}const Bs=/^(get|set)(?!UTC)/;Object.getOwnPropertyNames(Date.prototype).forEach(e=>{if(!Bs.test(e))return;const t=e.replace(Bs,"$1UTC");Ge.prototype[t]&&(e.startsWith("get")?Ge.prototype[e]=function(){return this.internal[t]()}:(Ge.prototype[e]=function(){return Date.prototype[t].apply(this.internal,arguments),mp(this),+this},Ge.prototype[t]=function(){return Date.prototype[t].apply(this,arguments),So(this),+this}))});function So(e){e.internal.setTime(+e),e.internal.setUTCSeconds(e.internal.getUTCSeconds()-Math.round(-Nt(e.timeZone,e)*60))}function mp(e){Date.prototype.setFullYear.call(e,e.internal.getUTCFullYear(),e.internal.getUTCMonth(),e.internal.getUTCDate()),Date.prototype.setHours.call(e,e.internal.getUTCHours(),e.internal.getUTCMinutes(),e.internal.getUTCSeconds(),e.internal.getUTCMilliseconds()),sl(e)}function sl(e){const t=Nt(e.timeZone,e),n=t>0?Math.floor(t):Math.ceil(t),r=new Date(+e);r.setUTCHours(r.getUTCHours()-1);const o=-new Date(+e).getTimezoneOffset(),s=-new Date(+r).getTimezoneOffset(),i=o-s,a=Date.prototype.getHours.apply(e)!==e.internal.getUTCHours();i&&a&&e.internal.setUTCMinutes(e.internal.getUTCMinutes()+i);const l=o-n;l&&Date.prototype.setUTCMinutes.call(e,Date.prototype.getUTCMinutes.call(e)+l);const u=new Date(+e);u.setUTCSeconds(0);const f=o>0?u.getSeconds():(u.getSeconds()-60)%60,c=Math.round(-(Nt(e.timeZone,e)*60))%60;(c||f)&&(e.internal.setUTCSeconds(e.internal.getUTCSeconds()+c),Date.prototype.setUTCSeconds.call(e,Date.prototype.getUTCSeconds.call(e)+c+f));const m=Nt(e.timeZone,e),h=m>0?Math.floor(m):Math.ceil(m),p=-new Date(+e).getTimezoneOffset()-h,v=h!==n,y=p-l;if(v&&y){Date.prototype.setUTCMinutes.call(e,Date.prototype.getUTCMinutes.call(e)+y);const x=Nt(e.timeZone,e),b=x>0?Math.floor(x):Math.ceil(x),E=h-b;E&&(e.internal.setUTCMinutes(e.internal.getUTCMinutes()+E),Date.prototype.setUTCMinutes.call(e,Date.prototype.getUTCMinutes.call(e)+E))}}class be extends Ge{static tz(t,...n){return n.length?new be(...n,t):new be(Date.now(),t)}toISOString(){const[t,n,r]=this.tzComponents(),o=`${t}${n}:${r}`;return this.internal.toISOString().slice(0,-1)+o}toString(){return`${this.toDateString()} ${this.toTimeString()}`}toDateString(){const[t,n,r,o]=this.internal.toUTCString().split(" ");return`${t?.slice(0,-1)} ${r} ${n} ${o}`}toTimeString(){const t=this.internal.toUTCString().split(" ")[4],[n,r,o]=this.tzComponents();return`${t} GMT${n}${r}${o} (${up(this.timeZone,this)})`}toLocaleString(t,n){return Date.prototype.toLocaleString.call(this,t,{...n,timeZone:n?.timeZone||this.timeZone})}toLocaleDateString(t,n){return Date.prototype.toLocaleDateString.call(this,t,{...n,timeZone:n?.timeZone||this.timeZone})}toLocaleTimeString(t,n){return Date.prototype.toLocaleTimeString.call(this,t,{...n,timeZone:n?.timeZone||this.timeZone})}tzComponents(){const t=this.getTimezoneOffset(),n=t>0?"-":"+",r=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),o=String(Math.abs(t)%60).padStart(2,"0");return[n,r,o]}withTimeZone(t){return new be(+this,t)}[Symbol.for("constructDateFrom")](t){return new be(+new Date(t),this.timeZone)}}const al=6048e5,hp=864e5,Hs=Symbol.for("constructDateFrom");function fe(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&Hs in e?e[Hs](t):e instanceof Date?new e.constructor(t):new Date(t)}function ae(e,t){return fe(t||e,e)}function il(e,t,n){const r=ae(e,n?.in);return isNaN(t)?fe(e,NaN):(t&&r.setDate(r.getDate()+t),r)}function ll(e,t,n){const r=ae(e,n?.in);if(isNaN(t))return fe(e,NaN);if(!t)return r;const o=r.getDate(),s=fe(e,r.getTime());s.setMonth(r.getMonth()+t+1,0);const i=s.getDate();return o>=i?s:(r.setFullYear(s.getFullYear(),s.getMonth(),o),r)}let pp={};function Pn(){return pp}function Zt(e,t){const n=Pn(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,o=ae(e,t?.in),s=o.getDay(),i=(s=s.getTime()?r+1:n.getTime()>=a.getTime()?r:r-1}function Ys(e){const t=ae(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}function on(e,...t){const n=fe.bind(null,t.find(r=>typeof r=="object"));return t.map(n)}function Sn(e,t){const n=ae(e,t?.in);return n.setHours(0,0,0,0),n}function ul(e,t,n){const[r,o]=on(n?.in,e,t),s=Sn(r),i=Sn(o),a=+s-Ys(s),l=+i-Ys(i);return Math.round((a-l)/hp)}function vp(e,t){const n=cl(e,t),r=fe(e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),xn(r)}function gp(e,t,n){return il(e,t*7,n)}function yp(e,t,n){return ll(e,t*12,n)}function wp(e,t){let n,r=t?.in;return e.forEach(o=>{!r&&typeof o=="object"&&(r=fe.bind(null,o));const s=ae(o,r);(!n||n{!r&&typeof o=="object"&&(r=fe.bind(null,o));const s=ae(o,r);(!n||n>s||isNaN(+s))&&(n=s)}),fe(r,n||NaN)}function xp(e,t,n){const[r,o]=on(n?.in,e,t);return+Sn(r)==+Sn(o)}function dl(e){return e instanceof Date||typeof e=="object"&&Object.prototype.toString.call(e)==="[object Date]"}function Sp(e){return!(!dl(e)&&typeof e!="number"||isNaN(+ae(e)))}function Ep(e,t,n){const[r,o]=on(n?.in,e,t),s=r.getFullYear()-o.getFullYear(),i=r.getMonth()-o.getMonth();return s*12+i}function Cp(e,t){const n=ae(e,t?.in),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function Op(e,t){const[n,r]=on(e,t.start,t.end);return{start:n,end:r}}function Tp(e,t){const{start:n,end:r}=Op(t?.in,e);let o=+n>+r;const s=o?+n:+r,i=o?r:n;i.setHours(0,0,0,0),i.setDate(1);let a=1;const l=[];for(;+i<=s;)l.push(fe(n,i)),i.setMonth(i.getMonth()+a);return o?l.reverse():l}function Mp(e,t){const n=ae(e,t?.in);return n.setDate(1),n.setHours(0,0,0,0),n}function Pp(e,t){const n=ae(e,t?.in),r=n.getFullYear();return n.setFullYear(r+1,0,0),n.setHours(23,59,59,999),n}function fl(e,t){const n=ae(e,t?.in);return n.setFullYear(n.getFullYear(),0,1),n.setHours(0,0,0,0),n}function ml(e,t){const n=Pn(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,o=ae(e,t?.in),s=o.getDay(),i=(s{let r;const o=kp[e];return typeof o=="string"?r=o:t===1?r=o.one:r=o.other.replace("{{count}}",t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r};function Zr(e){return(t={})=>{const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const Rp={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Ap={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Ip={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},_p={date:Zr({formats:Rp,defaultWidth:"full"}),time:Zr({formats:Ap,defaultWidth:"full"}),dateTime:Zr({formats:Ip,defaultWidth:"full"})},Fp={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Wp=(e,t,n,r)=>Fp[e];function cn(e){return(t,n)=>{const r=n?.context?String(n.context):"standalone";let o;if(r==="formatting"&&e.formattingValues){const i=e.defaultFormattingWidth||e.defaultWidth,a=n?.width?String(n.width):i;o=e.formattingValues[a]||e.formattingValues[i]}else{const i=e.defaultWidth,a=n?.width?String(n.width):e.defaultWidth;o=e.values[a]||e.values[i]}const s=e.argumentCallback?e.argumentCallback(t):t;return o[s]}}const Lp={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},$p={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},jp={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},Bp={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},Hp={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Yp={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Vp=(e,t)=>{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},Up={ordinalNumber:Vp,era:cn({values:Lp,defaultWidth:"wide"}),quarter:cn({values:$p,defaultWidth:"wide",argumentCallback:e=>e-1}),month:cn({values:jp,defaultWidth:"wide"}),day:cn({values:Bp,defaultWidth:"wide"}),dayPeriod:cn({values:Hp,defaultWidth:"wide",formattingValues:Yp,defaultFormattingWidth:"wide"})};function un(e){return(t,n={})=>{const r=n.width,o=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],s=t.match(o);if(!s)return null;const i=s[0],a=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(a)?qp(a,c=>c.test(i)):zp(a,c=>c.test(i));let u;u=e.valueCallback?e.valueCallback(l):l,u=n.valueCallback?n.valueCallback(u):u;const f=t.slice(i.length);return{value:u,rest:f}}}function zp(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function qp(e,t){for(let n=0;n{const r=t.match(e.matchPattern);if(!r)return null;const o=r[0],s=t.match(e.parsePattern);if(!s)return null;let i=e.valueCallback?e.valueCallback(s[0]):s[0];i=n.valueCallback?n.valueCallback(i):i;const a=t.slice(o.length);return{value:i,rest:a}}}const Kp=/^(\d+)(th|st|nd|rd)?/i,Xp=/\d+/i,Zp={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Qp={any:[/^b/i,/^(a|c)/i]},Jp={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},ev={any:[/1/i,/2/i,/3/i,/4/i]},tv={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},nv={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},rv={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},ov={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},sv={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},av={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},iv={ordinalNumber:Gp({matchPattern:Kp,parsePattern:Xp,valueCallback:e=>parseInt(e,10)}),era:un({matchPatterns:Zp,defaultMatchWidth:"wide",parsePatterns:Qp,defaultParseWidth:"any"}),quarter:un({matchPatterns:Jp,defaultMatchWidth:"wide",parsePatterns:ev,defaultParseWidth:"any",valueCallback:e=>e+1}),month:un({matchPatterns:tv,defaultMatchWidth:"wide",parsePatterns:nv,defaultParseWidth:"any"}),day:un({matchPatterns:rv,defaultMatchWidth:"wide",parsePatterns:ov,defaultParseWidth:"any"}),dayPeriod:un({matchPatterns:sv,defaultMatchWidth:"any",parsePatterns:av,defaultParseWidth:"any"})},Go={code:"en-US",formatDistance:Np,formatLong:_p,formatRelative:Wp,localize:Up,match:iv,options:{weekStartsOn:0,firstWeekContainsDate:1}};function lv(e,t){const n=ae(e,t?.in);return ul(n,fl(n))+1}function hl(e,t){const n=ae(e,t?.in),r=+xn(n)-+vp(n);return Math.round(r/al)+1}function pl(e,t){const n=ae(e,t?.in),r=n.getFullYear(),o=Pn(),s=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??o.firstWeekContainsDate??o.locale?.options?.firstWeekContainsDate??1,i=fe(t?.in||e,0);i.setFullYear(r+1,0,s),i.setHours(0,0,0,0);const a=Zt(i,t),l=fe(t?.in||e,0);l.setFullYear(r,0,s),l.setHours(0,0,0,0);const u=Zt(l,t);return+n>=+a?r+1:+n>=+u?r:r-1}function cv(e,t){const n=Pn(),r=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??n.firstWeekContainsDate??n.locale?.options?.firstWeekContainsDate??1,o=pl(e,t),s=fe(t?.in||e,0);return s.setFullYear(o,0,r),s.setHours(0,0,0,0),Zt(s,t)}function vl(e,t){const n=ae(e,t?.in),r=+Zt(n,t)-+cv(n,t);return Math.round(r/al)+1}function re(e,t){const n=e<0?"-":"",r=Math.abs(e).toString().padStart(t,"0");return n+r}const mt={y(e,t){const n=e.getFullYear(),r=n>0?n:1-n;return re(t==="yy"?r%100:r,t.length)},M(e,t){const n=e.getMonth();return t==="M"?String(n+1):re(n+1,2)},d(e,t){return re(e.getDate(),t.length)},a(e,t){const n=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.toUpperCase();case"aaa":return n;case"aaaaa":return n[0];case"aaaa":default:return n==="am"?"a.m.":"p.m."}},h(e,t){return re(e.getHours()%12||12,t.length)},H(e,t){return re(e.getHours(),t.length)},m(e,t){return re(e.getMinutes(),t.length)},s(e,t){return re(e.getSeconds(),t.length)},S(e,t){const n=t.length,r=e.getMilliseconds(),o=Math.trunc(r*Math.pow(10,n-3));return re(o,t.length)}},Yt={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},Vs={G:function(e,t,n){const r=e.getFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});case"GGGG":default:return n.era(r,{width:"wide"})}},y:function(e,t,n){if(t==="yo"){const r=e.getFullYear(),o=r>0?r:1-r;return n.ordinalNumber(o,{unit:"year"})}return mt.y(e,t)},Y:function(e,t,n,r){const o=pl(e,r),s=o>0?o:1-o;if(t==="YY"){const i=s%100;return re(i,2)}return t==="Yo"?n.ordinalNumber(s,{unit:"year"}):re(s,t.length)},R:function(e,t){const n=cl(e);return re(n,t.length)},u:function(e,t){const n=e.getFullYear();return re(n,t.length)},Q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"Q":return String(r);case"QQ":return re(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"q":return String(r);case"qq":return re(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(e,t,n){const r=e.getMonth();switch(t){case"M":case"MM":return mt.M(e,t);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(e,t,n){const r=e.getMonth();switch(t){case"L":return String(r+1);case"LL":return re(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){const o=vl(e,r);return t==="wo"?n.ordinalNumber(o,{unit:"week"}):re(o,t.length)},I:function(e,t,n){const r=hl(e);return t==="Io"?n.ordinalNumber(r,{unit:"week"}):re(r,t.length)},d:function(e,t,n){return t==="do"?n.ordinalNumber(e.getDate(),{unit:"date"}):mt.d(e,t)},D:function(e,t,n){const r=lv(e);return t==="Do"?n.ordinalNumber(r,{unit:"dayOfYear"}):re(r,t.length)},E:function(e,t,n){const r=e.getDay();switch(t){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});case"EEEE":default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){const o=e.getDay(),s=(o-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(s);case"ee":return re(s,2);case"eo":return n.ordinalNumber(s,{unit:"day"});case"eee":return n.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(o,{width:"short",context:"formatting"});case"eeee":default:return n.day(o,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){const o=e.getDay(),s=(o-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(s);case"cc":return re(s,t.length);case"co":return n.ordinalNumber(s,{unit:"day"});case"ccc":return n.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(o,{width:"narrow",context:"standalone"});case"cccccc":return n.day(o,{width:"short",context:"standalone"});case"cccc":default:return n.day(o,{width:"wide",context:"standalone"})}},i:function(e,t,n){const r=e.getDay(),o=r===0?7:r;switch(t){case"i":return String(o);case"ii":return re(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});case"iiii":default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(e,t,n){const o=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},b:function(e,t,n){const r=e.getHours();let o;switch(r===12?o=Yt.noon:r===0?o=Yt.midnight:o=r/12>=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},B:function(e,t,n){const r=e.getHours();let o;switch(r>=17?o=Yt.evening:r>=12?o=Yt.afternoon:r>=4?o=Yt.morning:o=Yt.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},h:function(e,t,n){if(t==="ho"){let r=e.getHours()%12;return r===0&&(r=12),n.ordinalNumber(r,{unit:"hour"})}return mt.h(e,t)},H:function(e,t,n){return t==="Ho"?n.ordinalNumber(e.getHours(),{unit:"hour"}):mt.H(e,t)},K:function(e,t,n){const r=e.getHours()%12;return t==="Ko"?n.ordinalNumber(r,{unit:"hour"}):re(r,t.length)},k:function(e,t,n){let r=e.getHours();return r===0&&(r=24),t==="ko"?n.ordinalNumber(r,{unit:"hour"}):re(r,t.length)},m:function(e,t,n){return t==="mo"?n.ordinalNumber(e.getMinutes(),{unit:"minute"}):mt.m(e,t)},s:function(e,t,n){return t==="so"?n.ordinalNumber(e.getSeconds(),{unit:"second"}):mt.s(e,t)},S:function(e,t){return mt.S(e,t)},X:function(e,t,n){const r=e.getTimezoneOffset();if(r===0)return"Z";switch(t){case"X":return zs(r);case"XXXX":case"XX":return Pt(r);case"XXXXX":case"XXX":default:return Pt(r,":")}},x:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"x":return zs(r);case"xxxx":case"xx":return Pt(r);case"xxxxx":case"xxx":default:return Pt(r,":")}},O:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+Us(r,":");case"OOOO":default:return"GMT"+Pt(r,":")}},z:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+Us(r,":");case"zzzz":default:return"GMT"+Pt(r,":")}},t:function(e,t,n){const r=Math.trunc(+e/1e3);return re(r,t.length)},T:function(e,t,n){return re(+e,t.length)}};function Us(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),o=Math.trunc(r/60),s=r%60;return s===0?n+String(o):n+String(o)+t+re(s,2)}function zs(e,t){return e%60===0?(e>0?"-":"+")+re(Math.abs(e)/60,2):Pt(e,t)}function Pt(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),o=re(Math.trunc(r/60),2),s=re(r%60,2);return n+o+t+s}const qs=(e,t)=>{switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}},gl=(e,t)=>{switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}},uv=(e,t)=>{const n=e.match(/(P+)(p+)?/)||[],r=n[1],o=n[2];if(!o)return qs(e,t);let s;switch(r){case"P":s=t.dateTime({width:"short"});break;case"PP":s=t.dateTime({width:"medium"});break;case"PPP":s=t.dateTime({width:"long"});break;case"PPPP":default:s=t.dateTime({width:"full"});break}return s.replace("{{date}}",qs(r,t)).replace("{{time}}",gl(o,t))},dv={p:gl,P:uv},fv=/^D+$/,mv=/^Y+$/,hv=["D","DD","YY","YYYY"];function pv(e){return fv.test(e)}function vv(e){return mv.test(e)}function gv(e,t,n){const r=yv(e,t,n);if(console.warn(r),hv.includes(e))throw new RangeError(r)}function yv(e,t,n){const r=e[0]==="Y"?"years":"days of the month";return`Use \`${e.toLowerCase()}\` instead of \`${e}\` (in \`${t}\`) for formatting ${r} to the input \`${n}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const wv=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,bv=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,xv=/^'([^]*?)'?$/,Sv=/''/g,Ev=/[a-zA-Z]/;function Cv(e,t,n){const r=Pn(),o=n?.locale??r.locale??Go,s=n?.firstWeekContainsDate??n?.locale?.options?.firstWeekContainsDate??r.firstWeekContainsDate??r.locale?.options?.firstWeekContainsDate??1,i=n?.weekStartsOn??n?.locale?.options?.weekStartsOn??r.weekStartsOn??r.locale?.options?.weekStartsOn??0,a=ae(e,n?.in);if(!Sp(a))throw new RangeError("Invalid time value");let l=t.match(bv).map(f=>{const c=f[0];if(c==="p"||c==="P"){const m=dv[c];return m(f,o.formatLong)}return f}).join("").match(wv).map(f=>{if(f==="''")return{isToken:!1,value:"'"};const c=f[0];if(c==="'")return{isToken:!1,value:Ov(f)};if(Vs[c])return{isToken:!0,value:f};if(c.match(Ev))throw new RangeError("Format string contains an unescaped latin alphabet character `"+c+"`");return{isToken:!1,value:f}});o.localize.preprocessor&&(l=o.localize.preprocessor(a,l));const u={firstWeekContainsDate:s,weekStartsOn:i,locale:o};return l.map(f=>{if(!f.isToken)return f.value;const c=f.value;(!n?.useAdditionalWeekYearTokens&&vv(c)||!n?.useAdditionalDayOfYearTokens&&pv(c))&&gv(c,t,String(e));const m=Vs[c[0]];return m(a,c,o.localize,u)}).join("")}function Ov(e){const t=e.match(xv);return t?t[1].replace(Sv,"'"):e}function Tv(e,t){const n=ae(e,t?.in),r=n.getFullYear(),o=n.getMonth(),s=fe(n,0);return s.setFullYear(r,o+1,0),s.setHours(0,0,0,0),s.getDate()}function Mv(e,t){return ae(e,t?.in).getMonth()}function Pv(e,t){return ae(e,t?.in).getFullYear()}function Dv(e,t){return+ae(e)>+ae(t)}function kv(e,t){return+ae(e)<+ae(t)}function Nv(e,t,n){const[r,o]=on(n?.in,e,t);return r.getFullYear()===o.getFullYear()&&r.getMonth()===o.getMonth()}function Rv(e,t,n){const[r,o]=on(n?.in,e,t);return r.getFullYear()===o.getFullYear()}function Av(e,t,n){const r=ae(e,n?.in),o=r.getFullYear(),s=r.getDate(),i=fe(e,0);i.setFullYear(o,t,15),i.setHours(0,0,0,0);const a=Tv(i);return r.setMonth(t,Math.min(s,a)),r}function Iv(e,t,n){const r=ae(e,n?.in);return isNaN(+r)?fe(e,NaN):(r.setFullYear(t),r)}const Gs=5,_v=4;function Fv(e,t){const n=t.startOfMonth(e),r=n.getDay()>0?n.getDay():7,o=t.addDays(e,-r+1),s=t.addDays(o,Gs*7-1);return t.getMonth(e)===t.getMonth(s)?Gs:_v}function yl(e,t){const n=t.startOfMonth(e),r=n.getDay();return r===1?n:r===0?t.addDays(n,-6):t.addDays(n,-1*(r-1))}function Wv(e,t){const n=yl(e,t),r=Fv(e,t);return t.addDays(n,r*7-1)}class De{constructor(t,n){this.Date=Date,this.today=()=>this.overrides?.today?this.overrides.today():this.options.timeZone?be.tz(this.options.timeZone):new this.Date,this.newDate=(r,o,s)=>this.overrides?.newDate?this.overrides.newDate(r,o,s):this.options.timeZone?new be(r,o,s,this.options.timeZone):new Date(r,o,s),this.addDays=(r,o)=>this.overrides?.addDays?this.overrides.addDays(r,o):il(r,o),this.addMonths=(r,o)=>this.overrides?.addMonths?this.overrides.addMonths(r,o):ll(r,o),this.addWeeks=(r,o)=>this.overrides?.addWeeks?this.overrides.addWeeks(r,o):gp(r,o),this.addYears=(r,o)=>this.overrides?.addYears?this.overrides.addYears(r,o):yp(r,o),this.differenceInCalendarDays=(r,o)=>this.overrides?.differenceInCalendarDays?this.overrides.differenceInCalendarDays(r,o):ul(r,o),this.differenceInCalendarMonths=(r,o)=>this.overrides?.differenceInCalendarMonths?this.overrides.differenceInCalendarMonths(r,o):Ep(r,o),this.eachMonthOfInterval=r=>this.overrides?.eachMonthOfInterval?this.overrides.eachMonthOfInterval(r):Tp(r),this.endOfBroadcastWeek=r=>this.overrides?.endOfBroadcastWeek?this.overrides.endOfBroadcastWeek(r):Wv(r,this),this.endOfISOWeek=r=>this.overrides?.endOfISOWeek?this.overrides.endOfISOWeek(r):Dp(r),this.endOfMonth=r=>this.overrides?.endOfMonth?this.overrides.endOfMonth(r):Cp(r),this.endOfWeek=(r,o)=>this.overrides?.endOfWeek?this.overrides.endOfWeek(r,o):ml(r,this.options),this.endOfYear=r=>this.overrides?.endOfYear?this.overrides.endOfYear(r):Pp(r),this.format=(r,o,s)=>{const i=this.overrides?.format?this.overrides.format(r,o,this.options):Cv(r,o,this.options);return this.options.numerals&&this.options.numerals!=="latn"?this.replaceDigits(i):i},this.getISOWeek=r=>this.overrides?.getISOWeek?this.overrides.getISOWeek(r):hl(r),this.getMonth=(r,o)=>this.overrides?.getMonth?this.overrides.getMonth(r,this.options):Mv(r,this.options),this.getYear=(r,o)=>this.overrides?.getYear?this.overrides.getYear(r,this.options):Pv(r,this.options),this.getWeek=(r,o)=>this.overrides?.getWeek?this.overrides.getWeek(r,this.options):vl(r,this.options),this.isAfter=(r,o)=>this.overrides?.isAfter?this.overrides.isAfter(r,o):Dv(r,o),this.isBefore=(r,o)=>this.overrides?.isBefore?this.overrides.isBefore(r,o):kv(r,o),this.isDate=r=>this.overrides?.isDate?this.overrides.isDate(r):dl(r),this.isSameDay=(r,o)=>this.overrides?.isSameDay?this.overrides.isSameDay(r,o):xp(r,o),this.isSameMonth=(r,o)=>this.overrides?.isSameMonth?this.overrides.isSameMonth(r,o):Nv(r,o),this.isSameYear=(r,o)=>this.overrides?.isSameYear?this.overrides.isSameYear(r,o):Rv(r,o),this.max=r=>this.overrides?.max?this.overrides.max(r):wp(r),this.min=r=>this.overrides?.min?this.overrides.min(r):bp(r),this.setMonth=(r,o)=>this.overrides?.setMonth?this.overrides.setMonth(r,o):Av(r,o),this.setYear=(r,o)=>this.overrides?.setYear?this.overrides.setYear(r,o):Iv(r,o),this.startOfBroadcastWeek=(r,o)=>this.overrides?.startOfBroadcastWeek?this.overrides.startOfBroadcastWeek(r,this):yl(r,this),this.startOfDay=r=>this.overrides?.startOfDay?this.overrides.startOfDay(r):Sn(r),this.startOfISOWeek=r=>this.overrides?.startOfISOWeek?this.overrides.startOfISOWeek(r):xn(r),this.startOfMonth=r=>this.overrides?.startOfMonth?this.overrides.startOfMonth(r):Mp(r),this.startOfWeek=(r,o)=>this.overrides?.startOfWeek?this.overrides.startOfWeek(r,this.options):Zt(r,this.options),this.startOfYear=r=>this.overrides?.startOfYear?this.overrides.startOfYear(r):fl(r),this.options={locale:Go,...t},this.overrides=n}getDigitMap(){const{numerals:t="latn"}=this.options,n=new Intl.NumberFormat("en-US",{numberingSystem:t}),r={};for(let o=0;o<10;o++)r[o.toString()]=n.format(o);return r}replaceDigits(t){const n=this.getDigitMap();return t.replace(/\d/g,r=>n[r]||r)}formatNumber(t){return this.replaceDigits(t.toString())}getMonthYearOrder(){const t=this.options.locale?.code;return t&&De.yearFirstLocales.has(t)?"year-first":"month-first"}formatMonthYear(t){const{locale:n,timeZone:r,numerals:o}=this.options,s=n?.code;if(s&&De.yearFirstLocales.has(s))try{return new Intl.DateTimeFormat(s,{month:"long",year:"numeric",timeZone:r,numberingSystem:o}).format(t)}catch{}const i=this.getMonthYearOrder()==="year-first"?"y LLLL":"LLLL y";return this.format(t,i)}}De.yearFirstLocales=new Set(["eu","hu","ja","ja-Hira","ja-JP","ko","ko-KR","lt","lt-LT","lv","lv-LV","mn","mn-MN","zh","zh-CN","zh-HK","zh-TW"]);const et=new De;class wl{constructor(t,n,r=et){this.date=t,this.displayMonth=n,this.outside=!!(n&&!r.isSameMonth(t,n)),this.dateLib=r}isEqualTo(t){return this.dateLib.isSameDay(t.date,this.date)&&this.dateLib.isSameMonth(t.displayMonth,this.displayMonth)}}class Lv{constructor(t,n){this.date=t,this.weeks=n}}class $v{constructor(t,n){this.days=n,this.weekNumber=t}}function jv(e){return w.createElement("button",{...e})}function Bv(e){return w.createElement("span",{...e})}function Hv(e){const{size:t=24,orientation:n="left",className:r}=e;return w.createElement("svg",{className:r,width:t,height:t,viewBox:"0 0 24 24"},n==="up"&&w.createElement("polygon",{points:"6.77 17 12.5 11.43 18.24 17 20 15.28 12.5 8 5 15.28"}),n==="down"&&w.createElement("polygon",{points:"6.77 8 12.5 13.57 18.24 8 20 9.72 12.5 17 5 9.72"}),n==="left"&&w.createElement("polygon",{points:"16 18.112 9.81111111 12 16 5.87733333 14.0888889 4 6 12 14.0888889 20"}),n==="right"&&w.createElement("polygon",{points:"8 18.112 14.18888889 12 8 5.87733333 9.91111111 4 18 12 9.91111111 20"}))}function Yv(e){const{day:t,modifiers:n,...r}=e;return w.createElement("td",{...r})}function Vv(e){const{day:t,modifiers:n,...r}=e,o=w.useRef(null);return w.useEffect(()=>{n.focused&&o.current?.focus()},[n.focused]),w.createElement("button",{ref:o,...r})}var W;(function(e){e.Root="root",e.Chevron="chevron",e.Day="day",e.DayButton="day_button",e.CaptionLabel="caption_label",e.Dropdowns="dropdowns",e.Dropdown="dropdown",e.DropdownRoot="dropdown_root",e.Footer="footer",e.MonthGrid="month_grid",e.MonthCaption="month_caption",e.MonthsDropdown="months_dropdown",e.Month="month",e.Months="months",e.Nav="nav",e.NextMonthButton="button_next",e.PreviousMonthButton="button_previous",e.Week="week",e.Weeks="weeks",e.Weekday="weekday",e.Weekdays="weekdays",e.WeekNumber="week_number",e.WeekNumberHeader="week_number_header",e.YearsDropdown="years_dropdown"})(W||(W={}));var ce;(function(e){e.disabled="disabled",e.hidden="hidden",e.outside="outside",e.focused="focused",e.today="today"})(ce||(ce={}));var $e;(function(e){e.range_end="range_end",e.range_middle="range_middle",e.range_start="range_start",e.selected="selected"})($e||($e={}));var Te;(function(e){e.weeks_before_enter="weeks_before_enter",e.weeks_before_exit="weeks_before_exit",e.weeks_after_enter="weeks_after_enter",e.weeks_after_exit="weeks_after_exit",e.caption_after_enter="caption_after_enter",e.caption_after_exit="caption_after_exit",e.caption_before_enter="caption_before_enter",e.caption_before_exit="caption_before_exit"})(Te||(Te={}));function Uv(e){const{options:t,className:n,components:r,classNames:o,...s}=e,i=[o[W.Dropdown],n].join(" "),a=t?.find(({value:l})=>l===s.value);return w.createElement("span",{"data-disabled":s.disabled,className:o[W.DropdownRoot]},w.createElement(r.Select,{className:i,...s},t?.map(({value:l,label:u,disabled:f})=>w.createElement(r.Option,{key:l,value:l,disabled:f},u))),w.createElement("span",{className:o[W.CaptionLabel],"aria-hidden":!0},a?.label,w.createElement(r.Chevron,{orientation:"down",size:18,className:o[W.Chevron]})))}function zv(e){return w.createElement("div",{...e})}function qv(e){return w.createElement("div",{...e})}function Gv(e){const{calendarMonth:t,displayIndex:n,...r}=e;return w.createElement("div",{...r},e.children)}function Kv(e){const{calendarMonth:t,displayIndex:n,...r}=e;return w.createElement("div",{...r})}function Xv(e){return w.createElement("table",{...e})}function Zv(e){return w.createElement("div",{...e})}const bl=d.createContext(void 0);function Dn(){const e=d.useContext(bl);if(e===void 0)throw new Error("useDayPicker() must be used within a custom component.");return e}function Qv(e){const{components:t}=Dn();return w.createElement(t.Dropdown,{...e})}function Jv(e){const{onPreviousClick:t,onNextClick:n,previousMonth:r,nextMonth:o,...s}=e,{components:i,classNames:a,labels:{labelPrevious:l,labelNext:u}}=Dn(),f=d.useCallback(m=>{o&&n?.(m)},[o,n]),c=d.useCallback(m=>{r&&t?.(m)},[r,t]);return w.createElement("nav",{...s},w.createElement(i.PreviousMonthButton,{type:"button",className:a[W.PreviousMonthButton],tabIndex:r?void 0:-1,"aria-disabled":r?void 0:!0,"aria-label":l(r),onClick:c},w.createElement(i.Chevron,{disabled:r?void 0:!0,className:a[W.Chevron],orientation:"left"})),w.createElement(i.NextMonthButton,{type:"button",className:a[W.NextMonthButton],tabIndex:o?void 0:-1,"aria-disabled":o?void 0:!0,"aria-label":u(o),onClick:f},w.createElement(i.Chevron,{disabled:o?void 0:!0,orientation:"right",className:a[W.Chevron]})))}function eg(e){const{components:t}=Dn();return w.createElement(t.Button,{...e})}function tg(e){return w.createElement("option",{...e})}function ng(e){const{components:t}=Dn();return w.createElement(t.Button,{...e})}function rg(e){const{rootRef:t,...n}=e;return w.createElement("div",{...n,ref:t})}function og(e){return w.createElement("select",{...e})}function sg(e){const{week:t,...n}=e;return w.createElement("tr",{...n})}function ag(e){return w.createElement("th",{...e})}function ig(e){return w.createElement("thead",{"aria-hidden":!0},w.createElement("tr",{...e}))}function lg(e){const{week:t,...n}=e;return w.createElement("th",{...n})}function cg(e){return w.createElement("th",{...e})}function ug(e){return w.createElement("tbody",{...e})}function dg(e){const{components:t}=Dn();return w.createElement(t.Dropdown,{...e})}const fg=Object.freeze(Object.defineProperty({__proto__:null,Button:jv,CaptionLabel:Bv,Chevron:Hv,Day:Yv,DayButton:Vv,Dropdown:Uv,DropdownNav:zv,Footer:qv,Month:Gv,MonthCaption:Kv,MonthGrid:Xv,Months:Zv,MonthsDropdown:Qv,Nav:Jv,NextMonthButton:eg,Option:tg,PreviousMonthButton:ng,Root:rg,Select:og,Week:sg,WeekNumber:lg,WeekNumberHeader:cg,Weekday:ag,Weekdays:ig,Weeks:ug,YearsDropdown:dg},Symbol.toStringTag,{value:"Module"}));function nt(e,t,n=!1,r=et){let{from:o,to:s}=e;const{differenceInCalendarDays:i,isSameDay:a}=r;return o&&s?(i(s,o)<0&&([o,s]=[s,o]),i(t,o)>=(n?1:0)&&i(s,t)>=(n?1:0)):!n&&s?a(s,t):!n&&o?a(o,t):!1}function xl(e){return!!(e&&typeof e=="object"&&"before"in e&&"after"in e)}function Ko(e){return!!(e&&typeof e=="object"&&"from"in e)}function Sl(e){return!!(e&&typeof e=="object"&&"after"in e)}function El(e){return!!(e&&typeof e=="object"&&"before"in e)}function Cl(e){return!!(e&&typeof e=="object"&&"dayOfWeek"in e)}function Ol(e,t){return Array.isArray(e)&&e.every(t.isDate)}function rt(e,t,n=et){const r=Array.isArray(t)?t:[t],{isSameDay:o,differenceInCalendarDays:s,isAfter:i}=n;return r.some(a=>{if(typeof a=="boolean")return a;if(n.isDate(a))return o(e,a);if(Ol(a,n))return a.includes(e);if(Ko(a))return nt(a,e,!1,n);if(Cl(a))return Array.isArray(a.dayOfWeek)?a.dayOfWeek.includes(e.getDay()):a.dayOfWeek===e.getDay();if(xl(a)){const l=s(a.before,e),u=s(a.after,e),f=l>0,c=u<0;return i(a.before,a.after)?c&&f:f||c}return Sl(a)?s(e,a.after)>0:El(a)?s(a.before,e)>0:typeof a=="function"?a(e):!1})}function mg(e,t,n,r,o){const{disabled:s,hidden:i,modifiers:a,showOutsideDays:l,broadcastCalendar:u,today:f}=t,{isSameDay:c,isSameMonth:m,startOfMonth:h,isBefore:g,endOfMonth:p,isAfter:v}=o,y=n&&h(n),x=r&&p(r),b={[ce.focused]:[],[ce.outside]:[],[ce.disabled]:[],[ce.hidden]:[],[ce.today]:[]},E={};for(const S of e){const{date:T,displayMonth:C}=S,M=!!(C&&!m(T,C)),I=!!(y&&g(T,y)),N=!!(x&&v(T,x)),_=!!(s&&rt(T,s,o)),B=!!(i&&rt(T,i,o))||I||N||!u&&!l&&M||u&&l===!1&&M,R=c(T,f??o.today());M&&b.outside.push(S),_&&b.disabled.push(S),B&&b.hidden.push(S),R&&b.today.push(S),a&&Object.keys(a).forEach($=>{const H=a?.[$];H&&rt(T,H,o)&&(E[$]?E[$].push(S):E[$]=[S])})}return S=>{const T={[ce.focused]:!1,[ce.disabled]:!1,[ce.hidden]:!1,[ce.outside]:!1,[ce.today]:!1},C={};for(const M in b){const I=b[M];T[M]=I.some(N=>N===S)}for(const M in E)C[M]=E[M].some(I=>I===S);return{...T,...C}}}function hg(e,t,n={}){return Object.entries(e).filter(([,o])=>o===!0).reduce((o,[s])=>(n[s]?o.push(n[s]):t[ce[s]]?o.push(t[ce[s]]):t[$e[s]]&&o.push(t[$e[s]]),o),[t[W.Day]])}function pg(e){return{...fg,...e}}function vg(e){const t={"data-mode":e.mode??void 0,"data-required":"required"in e?e.required:void 0,"data-multiple-months":e.numberOfMonths&&e.numberOfMonths>1||void 0,"data-week-numbers":e.showWeekNumber||void 0,"data-broadcast-calendar":e.broadcastCalendar||void 0,"data-nav-layout":e.navLayout||void 0};return Object.entries(e).forEach(([n,r])=>{n.startsWith("data-")&&(t[n]=r)}),t}function gg(){const e={};for(const t in W)e[W[t]]=`rdp-${W[t]}`;for(const t in ce)e[ce[t]]=`rdp-${ce[t]}`;for(const t in $e)e[$e[t]]=`rdp-${$e[t]}`;for(const t in Te)e[Te[t]]=`rdp-${Te[t]}`;return e}function Tl(e,t,n){return(n??new De(t)).formatMonthYear(e)}const yg=Tl;function wg(e,t,n){return(n??new De(t)).format(e,"d")}function bg(e,t=et){return t.format(e,"LLLL")}function xg(e,t,n){return(n??new De(t)).format(e,"cccccc")}function Sg(e,t=et){return e<10?t.formatNumber(`0${e.toLocaleString()}`):t.formatNumber(`${e.toLocaleString()}`)}function Eg(){return""}function Ml(e,t=et){return t.format(e,"yyyy")}const Cg=Ml,Og=Object.freeze(Object.defineProperty({__proto__:null,formatCaption:Tl,formatDay:wg,formatMonthCaption:yg,formatMonthDropdown:bg,formatWeekNumber:Sg,formatWeekNumberHeader:Eg,formatWeekdayName:xg,formatYearCaption:Cg,formatYearDropdown:Ml},Symbol.toStringTag,{value:"Module"}));function Tg(e){return e?.formatMonthCaption&&!e.formatCaption&&(e.formatCaption=e.formatMonthCaption),e?.formatYearCaption&&!e.formatYearDropdown&&(e.formatYearDropdown=e.formatYearCaption),{...Og,...e}}function Mg(e,t,n,r,o){const{startOfMonth:s,startOfYear:i,endOfYear:a,eachMonthOfInterval:l,getMonth:u}=o;return l({start:i(e),end:a(e)}).map(m=>{const h=r.formatMonthDropdown(m,o),g=u(m),p=t&&ms(n)||!1;return{value:g,label:h,disabled:p}})}function Pg(e,t={},n={}){let r={...t?.[W.Day]};return Object.entries(e).filter(([,o])=>o===!0).forEach(([o])=>{r={...r,...n?.[o]}}),r}function Dg(e,t,n){const r=e.today(),o=t?e.startOfISOWeek(r):e.startOfWeek(r),s=[];for(let i=0;i<7;i++){const a=e.addDays(o,i);s.push(a)}return s}function kg(e,t,n,r,o=!1){if(!e||!t)return;const{startOfYear:s,endOfYear:i,addYears:a,getYear:l,isBefore:u,isSameYear:f}=r,c=s(e),m=i(t),h=[];let g=c;for(;u(g,m)||f(g,m);)h.push(g),g=a(g,1);return o&&h.reverse(),h.map(p=>{const v=n.formatYearDropdown(p,r);return{value:l(p),label:v,disabled:!1}})}function Pl(e,t,n,r){let o=(r??new De(n)).format(e,"PPPP");return t.today&&(o=`Today, ${o}`),t.selected&&(o=`${o}, selected`),o}const Ng=Pl;function Dl(e,t,n){return(n??new De(t)).formatMonthYear(e)}const Rg=Dl;function Ag(e,t,n,r){let o=(r??new De(n)).format(e,"PPPP");return t?.today&&(o=`Today, ${o}`),o}function Ig(e){return"Choose the Month"}function _g(){return""}function Fg(e){return"Go to the Next Month"}function Wg(e){return"Go to the Previous Month"}function Lg(e,t,n){return(n??new De(t)).format(e,"cccc")}function $g(e,t){return`Week ${e}`}function jg(e){return"Week Number"}function Bg(e){return"Choose the Year"}const Hg=Object.freeze(Object.defineProperty({__proto__:null,labelCaption:Rg,labelDay:Ng,labelDayButton:Pl,labelGrid:Dl,labelGridcell:Ag,labelMonthDropdown:Ig,labelNav:_g,labelNext:Fg,labelPrevious:Wg,labelWeekNumber:$g,labelWeekNumberHeader:jg,labelWeekday:Lg,labelYearDropdown:Bg},Symbol.toStringTag,{value:"Module"})),kn=e=>e instanceof HTMLElement?e:null,Qr=e=>[...e.querySelectorAll("[data-animated-month]")??[]],Yg=e=>kn(e.querySelector("[data-animated-month]")),Jr=e=>kn(e.querySelector("[data-animated-caption]")),eo=e=>kn(e.querySelector("[data-animated-weeks]")),Vg=e=>kn(e.querySelector("[data-animated-nav]")),Ug=e=>kn(e.querySelector("[data-animated-weekdays]"));function zg(e,t,{classNames:n,months:r,focused:o,dateLib:s}){const i=d.useRef(null),a=d.useRef(r),l=d.useRef(!1);d.useLayoutEffect(()=>{const u=a.current;if(a.current=r,!t||!e.current||!(e.current instanceof HTMLElement)||r.length===0||u.length===0||r.length!==u.length)return;const f=s.isSameMonth(r[0].date,u[0].date),c=s.isAfter(r[0].date,u[0].date),m=c?n[Te.caption_after_enter]:n[Te.caption_before_enter],h=c?n[Te.weeks_after_enter]:n[Te.weeks_before_enter],g=i.current,p=e.current.cloneNode(!0);if(p instanceof HTMLElement?(Qr(p).forEach(b=>{if(!(b instanceof HTMLElement))return;const E=Yg(b);E&&b.contains(E)&&b.removeChild(E);const S=Jr(b);S&&S.classList.remove(m);const T=eo(b);T&&T.classList.remove(h)}),i.current=p):i.current=null,l.current||f||o)return;const v=g instanceof HTMLElement?Qr(g):[],y=Qr(e.current);if(y?.every(x=>x instanceof HTMLElement)&&v&&v.every(x=>x instanceof HTMLElement)){l.current=!0,e.current.style.isolation="isolate";const x=Vg(e.current);x&&(x.style.zIndex="1"),y.forEach((b,E)=>{const S=v[E];if(!S)return;b.style.position="relative",b.style.overflow="hidden";const T=Jr(b);T&&T.classList.add(m);const C=eo(b);C&&C.classList.add(h);const M=()=>{l.current=!1,e.current&&(e.current.style.isolation=""),x&&(x.style.zIndex=""),T&&T.classList.remove(m),C&&C.classList.remove(h),b.style.position="",b.style.overflow="",b.contains(S)&&b.removeChild(S)};S.style.pointerEvents="none",S.style.position="absolute",S.style.overflow="hidden",S.setAttribute("aria-hidden","true");const I=Ug(S);I&&(I.style.opacity="0");const N=Jr(S);N&&(N.classList.add(c?n[Te.caption_before_exit]:n[Te.caption_after_exit]),N.addEventListener("animationend",M));const _=eo(S);_&&_.classList.add(c?n[Te.weeks_before_exit]:n[Te.weeks_after_exit]),b.insertBefore(S,b.firstChild)})}})}function qg(e,t,n,r){const o=e[0],s=e[e.length-1],{ISOWeek:i,fixedWeeks:a,broadcastCalendar:l}=n??{},{addDays:u,differenceInCalendarDays:f,differenceInCalendarMonths:c,endOfBroadcastWeek:m,endOfISOWeek:h,endOfMonth:g,endOfWeek:p,isAfter:v,startOfBroadcastWeek:y,startOfISOWeek:x,startOfWeek:b}=r,E=l?y(o,r):i?x(o):b(o),S=l?m(s):i?h(g(s)):p(g(s)),T=f(S,E),C=c(s,o)+1,M=[];for(let _=0;_<=T;_++){const B=u(E,_);if(t&&v(B,t))break;M.push(B)}const N=(l?35:42)*C;if(a&&M.length{const o=r.weeks.reduce((s,i)=>s.concat(i.days.slice()),t.slice());return n.concat(o.slice())},t.slice())}function Kg(e,t,n,r){const{numberOfMonths:o=1}=n,s=[];for(let i=0;it)break;s.push(a)}return s}function Ks(e,t,n,r){const{month:o,defaultMonth:s,today:i=r.today(),numberOfMonths:a=1}=e;let l=o||s||i;const{differenceInCalendarMonths:u,addMonths:f,startOfMonth:c}=r;if(n&&u(n,l){const y=n.broadcastCalendar?c(v,r):n.ISOWeek?m(v):h(v),x=n.broadcastCalendar?s(v):n.ISOWeek?i(a(v)):l(a(v)),b=t.filter(C=>C>=y&&C<=x),E=n.broadcastCalendar?35:42;if(n.fixedWeeks&&b.length{const I=E-b.length;return M>x&&M<=o(x,I)});b.push(...C)}const S=b.reduce((C,M)=>{const I=n.ISOWeek?u(M):f(M),N=C.find(B=>B.weekNumber===I),_=new wl(M,v,r);return N?N.days.push(_):C.push(new $v(I,[_])),C},[]),T=new Lv(v,S);return p.push(T),p},[]);return n.reverseMonths?g.reverse():g}function Zg(e,t){let{startMonth:n,endMonth:r}=e;const{startOfYear:o,startOfDay:s,startOfMonth:i,endOfMonth:a,addYears:l,endOfYear:u,newDate:f,today:c}=t,{fromYear:m,toYear:h,fromMonth:g,toMonth:p}=e;!n&&g&&(n=g),!n&&m&&(n=t.newDate(m,0,1)),!r&&p&&(r=p),!r&&h&&(r=f(h,11,31));const v=e.captionLayout==="dropdown"||e.captionLayout==="dropdown-years";return n?n=i(n):m?n=f(m,0,1):!n&&v&&(n=o(l(e.today??c(),-100))),r?r=a(r):h?r=f(h,11,31):!r&&v&&(r=u(e.today??c())),[n&&s(n),r&&s(r)]}function Qg(e,t,n,r){if(n.disableNavigation)return;const{pagedNavigation:o,numberOfMonths:s=1}=n,{startOfMonth:i,addMonths:a,differenceInCalendarMonths:l}=r,u=o?s:1,f=i(e);if(!t)return a(f,u);if(!(l(t,e)n.concat(r.weeks.slice()),t.slice())}function Mr(e,t){const[n,r]=d.useState(e);return[t===void 0?n:t,r]}function ty(e,t){const[n,r]=Zg(e,t),{startOfMonth:o,endOfMonth:s}=t,i=Ks(e,n,r,t),[a,l]=Mr(i,e.month?i:void 0);d.useEffect(()=>{const T=Ks(e,n,r,t);l(T)},[e.timeZone]);const u=Kg(a,r,e,t),f=qg(u,e.endMonth?s(e.endMonth):void 0,e,t),c=Xg(u,f,e,t),m=ey(c),h=Gg(c),g=Jg(a,n,e,t),p=Qg(a,r,e,t),{disableNavigation:v,onMonthChange:y}=e,x=T=>m.some(C=>C.days.some(M=>M.isEqualTo(T))),b=T=>{if(v)return;let C=o(T);n&&Co(r)&&(C=o(r)),l(C),y?.(C)};return{months:c,weeks:m,days:h,navStart:n,navEnd:r,previousMonth:g,nextMonth:p,goToMonth:b,goToDay:T=>{x(T)||b(T.date)}}}var Ue;(function(e){e[e.Today=0]="Today",e[e.Selected=1]="Selected",e[e.LastFocused=2]="LastFocused",e[e.FocusedModifier=3]="FocusedModifier"})(Ue||(Ue={}));function Xs(e){return!e[ce.disabled]&&!e[ce.hidden]&&!e[ce.outside]}function ny(e,t,n,r){let o,s=-1;for(const i of e){const a=t(i);Xs(a)&&(a[ce.focused]&&sXs(t(i)))),o}function ry(e,t,n,r,o,s,i){const{ISOWeek:a,broadcastCalendar:l}=s,{addDays:u,addMonths:f,addWeeks:c,addYears:m,endOfBroadcastWeek:h,endOfISOWeek:g,endOfWeek:p,max:v,min:y,startOfBroadcastWeek:x,startOfISOWeek:b,startOfWeek:E}=i;let T={day:u,week:c,month:f,year:m,startOfWeek:C=>l?x(C,i):a?b(C):E(C),endOfWeek:C=>l?h(C):a?g(C):p(C)}[e](n,t==="after"?1:-1);return t==="before"&&r?T=v([r,T]):t==="after"&&o&&(T=y([o,T])),T}function kl(e,t,n,r,o,s,i,a=0){if(a>365)return;const l=ry(e,t,n.date,r,o,s,i),u=!!(s.disabled&&rt(l,s.disabled,i)),f=!!(s.hidden&&rt(l,s.hidden,i)),c=l,m=new wl(l,c,i);return!u&&!f?m:kl(e,t,m,r,o,s,i,a+1)}function oy(e,t,n,r,o){const{autoFocus:s}=e,[i,a]=d.useState(),l=ny(t.days,n,r||(()=>!1),i),[u,f]=d.useState(s?l:void 0);return{isFocusTarget:p=>!!l?.isEqualTo(p),setFocused:f,focused:u,blur:()=>{a(u),f(void 0)},moveFocus:(p,v)=>{if(!u)return;const y=kl(p,v,u,t.navStart,t.navEnd,e,o);y&&(t.goToDay(y),f(y))}}}function sy(e,t){const{selected:n,required:r,onSelect:o}=e,[s,i]=Mr(n,o?n:void 0),a=o?n:s,{isSameDay:l}=t,u=h=>a?.some(g=>l(g,h))??!1,{min:f,max:c}=e;return{selected:a,select:(h,g,p)=>{let v=[...a??[]];if(u(h)){if(a?.length===f||r&&a?.length===1)return;v=a?.filter(y=>!l(y,h))}else a?.length===c?v=[h]:v=[...v,h];return o||i(v),o?.(v,h,g,p),v},isSelected:u}}function ay(e,t,n=0,r=0,o=!1,s=et){const{from:i,to:a}=t||{},{isSameDay:l,isAfter:u,isBefore:f}=s;let c;if(!i&&!a)c={from:e,to:n>0?void 0:e};else if(i&&!a)l(i,e)?n===0?c={from:i,to:e}:o?c={from:i,to:void 0}:c=void 0:f(e,i)?c={from:e,to:i}:c={from:i,to:e};else if(i&&a)if(l(i,e)&&l(a,e))o?c={from:i,to:a}:c=void 0;else if(l(i,e))c={from:i,to:n>0?void 0:e};else if(l(a,e))c={from:e,to:n>0?void 0:e};else if(f(e,i))c={from:e,to:a};else if(u(e,i))c={from:i,to:e};else if(u(e,a))c={from:i,to:e};else throw new Error("Invalid range");if(c?.from&&c?.to){const m=s.differenceInCalendarDays(c.to,c.from);r>0&&m>r?c={from:e,to:void 0}:n>1&&mtypeof a!="function").some(a=>typeof a=="boolean"?a:n.isDate(a)?nt(e,a,!1,n):Ol(a,n)?a.some(l=>nt(e,l,!1,n)):Ko(a)?a.from&&a.to?Zs(e,{from:a.from,to:a.to},n):!1:Cl(a)?iy(e,a.dayOfWeek,n):xl(a)?n.isAfter(a.before,a.after)?Zs(e,{from:n.addDays(a.after,1),to:n.addDays(a.before,-1)},n):rt(e.from,a,n)||rt(e.to,a,n):Sl(a)||El(a)?rt(e.from,a,n)||rt(e.to,a,n):!1))return!0;const i=r.filter(a=>typeof a=="function");if(i.length){let a=e.from;const l=n.differenceInCalendarDays(e.to,e.from);for(let u=0;u<=l;u++){if(i.some(f=>f(a)))return!0;a=n.addDays(a,1)}}return!1}function cy(e,t){const{disabled:n,excludeDisabled:r,selected:o,required:s,onSelect:i}=e,[a,l]=Mr(o,i?o:void 0),u=i?o:a;return{selected:u,select:(m,h,g)=>{const{min:p,max:v}=e,y=m?ay(m,u,p,v,s,t):void 0;return r&&n&&y?.from&&y.to&&ly({from:y.from,to:y.to},n,t)&&(y.from=m,y.to=void 0),i||l(y),i?.(y,m,h,g),y},isSelected:m=>u&&nt(u,m,!1,t)}}function uy(e,t){const{selected:n,required:r,onSelect:o}=e,[s,i]=Mr(n,o?n:void 0),a=o?n:s,{isSameDay:l}=t;return{selected:a,select:(c,m,h)=>{let g=c;return!r&&a&&a&&l(c,a)&&(g=void 0),o||i(g),o?.(g,c,m,h),g},isSelected:c=>a?l(a,c):!1}}function dy(e,t){const n=uy(e,t),r=sy(e,t),o=cy(e,t);switch(e.mode){case"single":return n;case"multiple":return r;case"range":return o;default:return}}function lw(e){let t=e;t.timeZone&&(t={...e},t.today&&(t.today=new be(t.today,t.timeZone)),t.month&&(t.month=new be(t.month,t.timeZone)),t.defaultMonth&&(t.defaultMonth=new be(t.defaultMonth,t.timeZone)),t.startMonth&&(t.startMonth=new be(t.startMonth,t.timeZone)),t.endMonth&&(t.endMonth=new be(t.endMonth,t.timeZone)),t.mode==="single"&&t.selected?t.selected=new be(t.selected,t.timeZone):t.mode==="multiple"&&t.selected?t.selected=t.selected?.map(z=>new be(z,t.timeZone)):t.mode==="range"&&t.selected&&(t.selected={from:t.selected.from?new be(t.selected.from,t.timeZone):void 0,to:t.selected.to?new be(t.selected.to,t.timeZone):void 0}));const{components:n,formatters:r,labels:o,dateLib:s,locale:i,classNames:a}=d.useMemo(()=>{const z={...Go,...t.locale};return{dateLib:new De({locale:z,weekStartsOn:t.broadcastCalendar?1:t.weekStartsOn,firstWeekContainsDate:t.firstWeekContainsDate,useAdditionalWeekYearTokens:t.useAdditionalWeekYearTokens,useAdditionalDayOfYearTokens:t.useAdditionalDayOfYearTokens,timeZone:t.timeZone,numerals:t.numerals},t.dateLib),components:pg(t.components),formatters:Tg(t.formatters),labels:{...Hg,...t.labels},locale:z,classNames:{...gg(),...t.classNames}}},[t.locale,t.broadcastCalendar,t.weekStartsOn,t.firstWeekContainsDate,t.useAdditionalWeekYearTokens,t.useAdditionalDayOfYearTokens,t.timeZone,t.numerals,t.dateLib,t.components,t.formatters,t.labels,t.classNames]),{captionLayout:l,mode:u,navLayout:f,numberOfMonths:c=1,onDayBlur:m,onDayClick:h,onDayFocus:g,onDayKeyDown:p,onDayMouseEnter:v,onDayMouseLeave:y,onNextClick:x,onPrevClick:b,showWeekNumber:E,styles:S}=t,{formatCaption:T,formatDay:C,formatMonthDropdown:M,formatWeekNumber:I,formatWeekNumberHeader:N,formatWeekdayName:_,formatYearDropdown:B}=r,R=ty(t,s),{days:$,months:H,navStart:P,navEnd:F,previousMonth:k,nextMonth:j,goToMonth:U}=R,oe=mg($,t,P,F,s),{isSelected:me,select:D,selected:q}=dy(t,s)??{},{blur:K,focused:le,isFocusTarget:A,moveFocus:L,setFocused:Z}=oy(t,R,oe,me??(()=>!1),s),{labelDayButton:J,labelGridcell:ee,labelGrid:ne,labelMonthDropdown:ge,labelNav:Ee,labelPrevious:Ot,labelNext:ct,labelWeekday:Ae,labelWeekNumber:Rn,labelWeekNumberHeader:Ie,labelYearDropdown:Dr}=o,kr=d.useMemo(()=>Dg(s,t.ISOWeek),[s,t.ISOWeek]),ye=u!==void 0||h!==void 0,He=d.useCallback(()=>{k&&(U(k),b?.(k))},[k,U,b]),sn=d.useCallback(()=>{j&&(U(j),x?.(j))},[U,j,x]),Nr=d.useCallback((z,Q)=>Y=>{Y.preventDefault(),Y.stopPropagation(),Z(z),D?.(z.date,Q,Y),h?.(z.date,Q,Y)},[D,h,Z]),$t=d.useCallback((z,Q)=>Y=>{Z(z),g?.(z.date,Q,Y)},[g,Z]),Rr=d.useCallback((z,Q)=>Y=>{K(),m?.(z.date,Q,Y)},[K,m]),An=d.useCallback((z,Q)=>Y=>{const se={ArrowLeft:[Y.shiftKey?"month":"day",t.dir==="rtl"?"after":"before"],ArrowRight:[Y.shiftKey?"month":"day",t.dir==="rtl"?"before":"after"],ArrowDown:[Y.shiftKey?"year":"week","after"],ArrowUp:[Y.shiftKey?"year":"week","before"],PageUp:[Y.shiftKey?"year":"month","before"],PageDown:[Y.shiftKey?"year":"month","after"],Home:["startOfWeek","before"],End:["endOfWeek","after"]};if(se[Y.key]){Y.preventDefault(),Y.stopPropagation();const[we,X]=se[Y.key];L(we,X)}p?.(z.date,Q,Y)},[L,p,t.dir]),an=d.useCallback((z,Q)=>Y=>{v?.(z.date,Q,Y)},[v]),ut=d.useCallback((z,Q)=>Y=>{y?.(z.date,Q,Y)},[y]),In=d.useCallback(z=>Q=>{const Y=Number(Q.target.value),se=s.setMonth(s.startOfMonth(z),Y);U(se)},[s,U]),dt=d.useCallback(z=>Q=>{const Y=Number(Q.target.value),se=s.setYear(s.startOfMonth(z),Y);U(se)},[s,U]),{className:Ar,style:Ir}=d.useMemo(()=>({className:[a[W.Root],t.className].filter(Boolean).join(" "),style:{...S?.[W.Root],...t.style}}),[a,t.className,t.style,S]),_n=vg(t),ln=d.useRef(null);zg(ln,!!t.animate,{classNames:a,months:H,focused:le,dateLib:s});const _r={dayPickerProps:t,selected:q,select:D,isSelected:me,months:H,nextMonth:j,previousMonth:k,goToMonth:U,getModifiers:oe,components:n,classNames:a,styles:S,labels:o,formatters:r};return w.createElement(bl.Provider,{value:_r},w.createElement(n.Root,{rootRef:t.animate?ln:void 0,className:Ar,style:Ir,dir:t.dir,id:t.id,lang:t.lang,nonce:t.nonce,title:t.title,role:t.role,"aria-label":t["aria-label"],"aria-labelledby":t["aria-labelledby"],..._n},w.createElement(n.Months,{className:a[W.Months],style:S?.[W.Months]},!t.hideNavigation&&!f&&w.createElement(n.Nav,{"data-animated-nav":t.animate?"true":void 0,className:a[W.Nav],style:S?.[W.Nav],"aria-label":Ee(),onPreviousClick:He,onNextClick:sn,previousMonth:k,nextMonth:j}),H.map((z,Q)=>w.createElement(n.Month,{"data-animated-month":t.animate?"true":void 0,className:a[W.Month],style:S?.[W.Month],key:Q,displayIndex:Q,calendarMonth:z},f==="around"&&!t.hideNavigation&&Q===0&&w.createElement(n.PreviousMonthButton,{type:"button",className:a[W.PreviousMonthButton],tabIndex:k?void 0:-1,"aria-disabled":k?void 0:!0,"aria-label":Ot(k),onClick:He,"data-animated-button":t.animate?"true":void 0},w.createElement(n.Chevron,{disabled:k?void 0:!0,className:a[W.Chevron],orientation:t.dir==="rtl"?"right":"left"})),w.createElement(n.MonthCaption,{"data-animated-caption":t.animate?"true":void 0,className:a[W.MonthCaption],style:S?.[W.MonthCaption],calendarMonth:z,displayIndex:Q},l?.startsWith("dropdown")?w.createElement(n.DropdownNav,{className:a[W.Dropdowns],style:S?.[W.Dropdowns]},(()=>{const Y=l==="dropdown"||l==="dropdown-months"?w.createElement(n.MonthsDropdown,{key:"month",className:a[W.MonthsDropdown],"aria-label":ge(),classNames:a,components:n,disabled:!!t.disableNavigation,onChange:In(z.date),options:Mg(z.date,P,F,r,s),style:S?.[W.Dropdown],value:s.getMonth(z.date)}):w.createElement("span",{key:"month"},M(z.date,s)),se=l==="dropdown"||l==="dropdown-years"?w.createElement(n.YearsDropdown,{key:"year",className:a[W.YearsDropdown],"aria-label":Dr(s.options),classNames:a,components:n,disabled:!!t.disableNavigation,onChange:dt(z.date),options:kg(P,F,r,s,!!t.reverseYears),style:S?.[W.Dropdown],value:s.getYear(z.date)}):w.createElement("span",{key:"year"},B(z.date,s));return s.getMonthYearOrder()==="year-first"?[se,Y]:[Y,se]})(),w.createElement("span",{role:"status","aria-live":"polite",style:{border:0,clip:"rect(0 0 0 0)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap",wordWrap:"normal"}},T(z.date,s.options,s))):w.createElement(n.CaptionLabel,{className:a[W.CaptionLabel],role:"status","aria-live":"polite"},T(z.date,s.options,s))),f==="around"&&!t.hideNavigation&&Q===c-1&&w.createElement(n.NextMonthButton,{type:"button",className:a[W.NextMonthButton],tabIndex:j?void 0:-1,"aria-disabled":j?void 0:!0,"aria-label":ct(j),onClick:sn,"data-animated-button":t.animate?"true":void 0},w.createElement(n.Chevron,{disabled:j?void 0:!0,className:a[W.Chevron],orientation:t.dir==="rtl"?"left":"right"})),Q===c-1&&f==="after"&&!t.hideNavigation&&w.createElement(n.Nav,{"data-animated-nav":t.animate?"true":void 0,className:a[W.Nav],style:S?.[W.Nav],"aria-label":Ee(),onPreviousClick:He,onNextClick:sn,previousMonth:k,nextMonth:j}),w.createElement(n.MonthGrid,{role:"grid","aria-multiselectable":u==="multiple"||u==="range","aria-label":ne(z.date,s.options,s)||void 0,className:a[W.MonthGrid],style:S?.[W.MonthGrid]},!t.hideWeekdays&&w.createElement(n.Weekdays,{"data-animated-weekdays":t.animate?"true":void 0,className:a[W.Weekdays],style:S?.[W.Weekdays]},E&&w.createElement(n.WeekNumberHeader,{"aria-label":Ie(s.options),className:a[W.WeekNumberHeader],style:S?.[W.WeekNumberHeader],scope:"col"},N()),kr.map(Y=>w.createElement(n.Weekday,{"aria-label":Ae(Y,s.options,s),className:a[W.Weekday],key:String(Y),style:S?.[W.Weekday],scope:"col"},_(Y,s.options,s)))),w.createElement(n.Weeks,{"data-animated-weeks":t.animate?"true":void 0,className:a[W.Weeks],style:S?.[W.Weeks]},z.weeks.map(Y=>w.createElement(n.Week,{className:a[W.Week],key:Y.weekNumber,style:S?.[W.Week],week:Y},E&&w.createElement(n.WeekNumber,{week:Y,style:S?.[W.WeekNumber],"aria-label":Rn(Y.weekNumber,{locale:i}),className:a[W.WeekNumber],scope:"row",role:"rowheader"},I(Y.weekNumber,s)),Y.days.map(se=>{const{date:we}=se,X=oe(se);if(X[ce.focused]=!X.hidden&&!!le?.isEqualTo(se),X[$e.selected]=me?.(we)||X.selected,Ko(q)){const{from:pe,to:ft}=q;X[$e.range_start]=!!(pe&&ft&&s.isSameDay(we,pe)),X[$e.range_end]=!!(pe&&ft&&s.isSameDay(we,ft)),X[$e.range_middle]=nt(q,we,!0,s)}const V=Pg(X,S,t.modifiersStyles),de=hg(X,a,t.modifiersClassNames),he=!ye&&!X.hidden?ee(we,X,s.options,s):void 0;return w.createElement(n.Day,{key:`${s.format(we,"yyyy-MM-dd")}_${s.format(se.displayMonth,"yyyy-MM")}`,day:se,modifiers:X,className:de.join(" "),style:V,role:"gridcell","aria-selected":X.selected||void 0,"aria-label":he,"data-day":s.format(we,"yyyy-MM-dd"),"data-month":se.outside?s.format(we,"yyyy-MM"):void 0,"data-selected":X.selected||void 0,"data-disabled":X.disabled||void 0,"data-hidden":X.hidden||void 0,"data-outside":se.outside||void 0,"data-focused":X.focused||void 0,"data-today":X.today||void 0},!X.hidden&&ye?w.createElement(n.DayButton,{className:a[W.DayButton],style:S?.[W.DayButton],type:"button",day:se,modifiers:X,disabled:X.disabled||void 0,tabIndex:A(se)?0:-1,"aria-label":J(we,X,s.options,s),onClick:Nr(se,X),onBlur:Rr(se,X),onFocus:$t(se,X),onKeyDown:An(se,X),onMouseEnter:an(se,X),onMouseLeave:ut(se,X)},C(we,s.options,s)):!X.hidden&&C(se.date,s.options,s))})))))))),t.footer&&w.createElement(n.Footer,{className:a[W.Footer],style:S?.[W.Footer],role:"status","aria-live":"polite"},t.footer)))}var to="rovingFocusGroup.onEntryFocus",fy={bubbles:!1,cancelable:!0},Nn="RovingFocusGroup",[Eo,Nl,my]=ta(Nn),[hy,Rl]=Ft(Nn,[my]),[py,vy]=hy(Nn),Al=d.forwardRef((e,t)=>O.jsx(Eo.Provider,{scope:e.__scopeRovingFocusGroup,children:O.jsx(Eo.Slot,{scope:e.__scopeRovingFocusGroup,children:O.jsx(gy,{...e,ref:t})})}));Al.displayName=Nn;var gy=d.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:o=!1,dir:s,currentTabStopId:i,defaultCurrentTabStopId:a,onCurrentTabStopIdChange:l,onEntryFocus:u,preventScrollOnEntryFocus:f=!1,...c}=e,m=d.useRef(null),h=ue(t,m),g=Co(s),[p,v]=Gt({prop:i,defaultProp:a??null,onChange:l,caller:Nn}),[y,x]=d.useState(!1),b=wt(u),E=Nl(n),S=d.useRef(!1),[T,C]=d.useState(0);return d.useEffect(()=>{const M=m.current;if(M)return M.addEventListener(to,b),()=>M.removeEventListener(to,b)},[b]),O.jsx(py,{scope:n,orientation:r,dir:g,loop:o,currentTabStopId:p,onItemFocus:d.useCallback(M=>v(M),[v]),onItemShiftTab:d.useCallback(()=>x(!0),[]),onFocusableItemAdd:d.useCallback(()=>C(M=>M+1),[]),onFocusableItemRemove:d.useCallback(()=>C(M=>M-1),[]),children:O.jsx(te.div,{tabIndex:y||T===0?-1:0,"data-orientation":r,...c,ref:h,style:{outline:"none",...e.style},onMouseDown:G(e.onMouseDown,()=>{S.current=!0}),onFocus:G(e.onFocus,M=>{const I=!S.current;if(M.target===M.currentTarget&&I&&!y){const N=new CustomEvent(to,fy);if(M.currentTarget.dispatchEvent(N),!N.defaultPrevented){const _=E().filter(P=>P.focusable),B=_.find(P=>P.active),R=_.find(P=>P.id===p),H=[B,R,..._].filter(Boolean).map(P=>P.ref.current);Fl(H,f)}}S.current=!1}),onBlur:G(e.onBlur,()=>x(!1))})})}),Il="RovingFocusGroupItem",_l=d.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:o=!1,tabStopId:s,children:i,...a}=e,l=Wt(),u=s||l,f=vy(Il,n),c=f.currentTabStopId===u,m=Nl(n),{onFocusableItemAdd:h,onFocusableItemRemove:g,currentTabStopId:p}=f;return d.useEffect(()=>{if(r)return h(),()=>g()},[r,h,g]),O.jsx(Eo.ItemSlot,{scope:n,id:u,focusable:r,active:o,children:O.jsx(te.span,{tabIndex:c?0:-1,"data-orientation":f.orientation,...a,ref:t,onMouseDown:G(e.onMouseDown,v=>{r?f.onItemFocus(u):v.preventDefault()}),onFocus:G(e.onFocus,()=>f.onItemFocus(u)),onKeyDown:G(e.onKeyDown,v=>{if(v.key==="Tab"&&v.shiftKey){f.onItemShiftTab();return}if(v.target!==v.currentTarget)return;const y=by(v,f.orientation,f.dir);if(y!==void 0){if(v.metaKey||v.ctrlKey||v.altKey||v.shiftKey)return;v.preventDefault();let b=m().filter(E=>E.focusable).map(E=>E.ref.current);if(y==="last")b.reverse();else if(y==="prev"||y==="next"){y==="prev"&&b.reverse();const E=b.indexOf(v.currentTarget);b=f.loop?xy(b,E+1):b.slice(E+1)}setTimeout(()=>Fl(b))}}),children:typeof i=="function"?i({isCurrentTabStop:c,hasTabStop:p!=null}):i})})});_l.displayName=Il;var yy={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function wy(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function by(e,t,n){const r=wy(e.key,n);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return yy[r]}function Fl(e,t=!1){const n=document.activeElement;for(const r of e)if(r===n||(r.focus({preventScroll:t}),document.activeElement!==n))return}function xy(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var Sy=Al,Ey=_l,Pr="Tabs",[Cy,cw]=Ft(Pr,[Rl]),Wl=Rl(),[Oy,Xo]=Cy(Pr),Ll=d.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,onValueChange:o,defaultValue:s,orientation:i="horizontal",dir:a,activationMode:l="automatic",...u}=e,f=Co(a),[c,m]=Gt({prop:r,onChange:o,defaultProp:s??"",caller:Pr});return O.jsx(Oy,{scope:n,baseId:Wt(),value:c,onValueChange:m,orientation:i,dir:f,activationMode:l,children:O.jsx(te.div,{dir:f,"data-orientation":i,...u,ref:t})})});Ll.displayName=Pr;var $l="TabsList",jl=d.forwardRef((e,t)=>{const{__scopeTabs:n,loop:r=!0,...o}=e,s=Xo($l,n),i=Wl(n);return O.jsx(Sy,{asChild:!0,...i,orientation:s.orientation,dir:s.dir,loop:r,children:O.jsx(te.div,{role:"tablist","aria-orientation":s.orientation,...o,ref:t})})});jl.displayName=$l;var Bl="TabsTrigger",Hl=d.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,disabled:o=!1,...s}=e,i=Xo(Bl,n),a=Wl(n),l=Ul(i.baseId,r),u=zl(i.baseId,r),f=r===i.value;return O.jsx(Ey,{asChild:!0,...a,focusable:!o,active:f,children:O.jsx(te.button,{type:"button",role:"tab","aria-selected":f,"aria-controls":u,"data-state":f?"active":"inactive","data-disabled":o?"":void 0,disabled:o,id:l,...s,ref:t,onMouseDown:G(e.onMouseDown,c=>{!o&&c.button===0&&c.ctrlKey===!1?i.onValueChange(r):c.preventDefault()}),onKeyDown:G(e.onKeyDown,c=>{[" ","Enter"].includes(c.key)&&i.onValueChange(r)}),onFocus:G(e.onFocus,()=>{const c=i.activationMode!=="manual";!f&&!o&&c&&i.onValueChange(r)})})})});Hl.displayName=Bl;var Yl="TabsContent",Vl=d.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,forceMount:o,children:s,...i}=e,a=Xo(Yl,n),l=Ul(a.baseId,r),u=zl(a.baseId,r),f=r===a.value,c=d.useRef(f);return d.useEffect(()=>{const m=requestAnimationFrame(()=>c.current=!1);return()=>cancelAnimationFrame(m)},[]),O.jsx(rn,{present:o||f,children:({present:m})=>O.jsx(te.div,{"data-state":f?"active":"inactive","data-orientation":a.orientation,role:"tabpanel","aria-labelledby":l,hidden:!m,id:u,tabIndex:0,...i,ref:t,style:{...e.style,animationDuration:c.current?"0s":void 0},children:m&&s})})});Vl.displayName=Yl;function Ul(e,t){return`${e}-trigger-${t}`}function zl(e,t){return`${e}-content-${t}`}var uw=Ll,dw=jl,fw=Hl,mw=Vl;export{Zy as A,Ly as C,lw as D,Fy as I,iw as L,Wy as P,Ay as R,Yy as S,Iy as T,_y as V,$y as a,jy as b,Hy as c,By as d,Vy as e,qy as f,Gy as g,Ky as h,Xy as i,zy as j,Jy as k,ew as l,tw as m,nw as n,rw as o,Ny as p,lp as q,gg as r,uw as s,Dy as t,dw as u,fw as v,mw as w,ky as x,cp as z}; diff --git a/service/dist/assets/ui-CImlNgPE.js.br b/service/dist/assets/ui-CImlNgPE.js.br deleted file mode 100644 index 5b249b19f2d4fc5107166d2796c4b81178d73a83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64249 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 diff --git a/service/dist/cursors/areaselect.cur b/service/dist/cursors/areaselect.cur deleted file mode 100644 index 5f55fdac622bfdc3a2c8b3977d2162ad9676aa6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmV-l0-*f>00IC303aX$01p5U07(J>02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0uV_=K~#90?U&7N(?Af%XVzQO@Zn0J-pT{;0;snj5jgV#puhv< z0ebI&BZ|ZWaBa`M_2^@iCqO6%EJX^$IXD~J-5s>)I5JT_Y|~gm&0kts>zSST`D1o$ zfbx=^PUlG&h976M*|+I*dKLu1bEruI01k)4;X7l@h;Ef6N%EC#JJ$gKJXT75AtJ*7 zWQ_UAw$c(Me3AVn06gINtpU+xo7gn~+BHOk{}`+CBIGrH0T5AU+d05oYwkcLiMtB4 z2dF9m_Z>i%0C9M%^A&6_B3rlf+LhgIx6y95UpE?!SBQA9sr0ngj@DYbu6vrdA>yMr zjz2q&qY-f)c#D!WO|N^s-Zg|__{kXaE5EnbAY+?Z6h-f)l=2NCK81RPi1^HLoR&~Z z{UD+g>Q@@a@ptL_{$;b-Jn=m5?WT7izwaaBLqt5xowkoJESlMVLqt(@)$jK&?4Ewi zy`rO_0gqa( t*2!Qn=#0nXi_vIw?)(0W<^RQ^`UBDj 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 Ud}Qs0R{#J207*qoM6N<$g7e|(SpWb4 diff --git a/service/dist/cursors/move.cur b/service/dist/cursors/move.cur deleted file mode 100644 index 8c7fd03ac996aae06966aed26292e86b6d49098e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 804 zcmV+<1Ka!n00IC303aX$01p5U01g8H02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0@X=GK~#90?N?1`6G0SyZ+6>lwrLXfU=w0Qo5Hl%;k;`uj${^8@En~^Fv4xK;*Py;WLmzY-n01%ZW3+D+wJ$Zh* zW!Dz~AiEBkqwov;WvumumIa@;upm||nnQo!l)%CmT4m;J=lyR4&{d=g5~wIxW!-HN z*lYsiyf|eCqJ$RV)%$UiSyFATcP)j(8s<|v<2g;EMCYXs)jnIRg9 zfZk{{>Thpv?^G1UM>PMh{AeO(nx^zVSKWLoi3bz%3i~g;9~h?A$b%4(Q_=WXeD&;U zzWZ7pW3kx2*4EY@RaMU-qOF<`DZHEFa6e(f+Z7~i!l1%z*Iaxs%EICBF-1{M*bOcq zIv&v&bTx?8a|HzzPn*>F?hLGf-`Pz0f;{I`ZYE&F_9{j zO5@-XO#ueojS?K1b2yM_lxN1jvrs4$&t|g^Ip?!(2p|G91{lN+NO02bOmH*7e~#Uq zx!CkWl#m{YL>_l^bPUO|tkCLWg2iG{)^%M827}i;9?!WY0|4yzGq~!Vy778A`x%gx z--e74NHT|_F=;%1@^w)!#CX}-BI diff --git a/service/dist/cursors/normal.cur b/service/dist/cursors/normal.cur deleted file mode 100644 index 2b4147757c46c517b3c00ae2004d92ba8074b2da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1021 zcmV{O9RRA{x!f~8~jBCWHHv#-W z@|95l%Vm=4GgoyhAcK41kjD-rk-+1b|2$!5aX+ z2k`o^0NmNxISs?Gu8$8Y$^1nC4@tgH@=7LvX_^-t2!bH;Jnv8+!;lbC3!eh`kmRkN z0613+aOT3%(b2xV18_M_0QguyNM6eVVC;bGS1OgKmvA6`|F;0VngtLg0ZOG(on#xM z(K7&E$O2#zqFSxWP^^szKwj5j|tfd3Xb9V(s&$gKWQL+#>H#eR6`FRV#oetMUuIv7`y}kX_^78VNTCLX7S)b~_ zUYxyYnmyMRh4hVM7izUyyHcrqJ3BjjH=oZ>#4ZIvP^ng{t4m8uk6hOcQ-PDVhrKe7 zl}r9H4CA_cGA(ut4|i%kF*v zqJ*uo!l8!fl=Z-NcTz5Wz%UG1#mM`6LT~dr^V3w|f$i?3LWg4#Oae&&$yOjG%l{tD ruy%J+*VU{3SdG6I&Wdl8fn)s(>X|gjEA#{K00000NkvXXu0mjfAoJT= diff --git a/service/dist/cursors/pen.cur b/service/dist/cursors/pen.cur deleted file mode 100644 index 1f18fe9a2aa5d897bf216a6a8eb629e65d0e884c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 859 zcmV-h1El-_00IC303aX$00saV07U};02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0}M$-K~#90?Uqky6jvO_Kkw~kk{CnCq^;Vj5v?KyT7x5kpixT& zK@>p|?4?CLcq&n`w8fx8tB8W4=*cQAlu~-Ax#r|S!8ra$L9yCs5?u?k{tLQqcixki z>|q(Ao!w;gpx@IlznS;>&dm4sdjs#fL{ba8zDkXS@mf&bkmkQ@pF2;7yG|wnZ$7V5 z#?U$dzvT>_wTRtIuH|RGF#~%(kxS+{Vy8B=h0xNk%!Z6I-!*oty2K4EzM`g1tdTo+ zHOr;TYlN&b@LW*+Fl2sXnvW7S(CDki%Q?P2(HqXr8`AB~DOS~s!Jrikx1VTUkd$0s z)w{mh;`-`QQ@7G>7nJ!s6Pg%8L-0kwQQ*_knlao zRdB2H2;mcf9l*j!c>p*D9M8^mvaef5R%!tF7}yMa8F`RA@E33(@LmtE*nsN~4wUu4 zH$YWMDFjXf`+%(DWx`WH8?bd4_&s1Ba4zs1 z`zB&ZlmVB;upIiqo!C z_B;Oq911+=ak=nV23%jcz_-B4NXfQaSMifPs09AM2J8j{d{t~YoBmSScH0$rPONq- zI|C=PVSS5Xof!&ODO}q&vvA=2NZ_wDu(z*JGr3A^+%Qgd)EXv7${BkJa3=7aLLvr^ z^y^6%vU=?oAIJ%7s|8vQr46v7^(Q-OD@lB81CL?#iTk=Wqm0-(J;la4!3-gu%WyF9 zw%6@ulZ;$nrCeWixxO-Ux|Qkd4NdP0UAX#8U+w5AOdV~WjGm}BG)Nd{k8ev%dtVqH z{wM5urp)#gO=3iek2Q){-ptqb447XtAq#SF2e_Cw{9GmI4?IUFZoq2s_58F)IX>(O l&0Qb}JSVxo+4tft>m~U(9S|;NWrF|!002ovPDHLkV1jo-g7^Rc diff --git a/service/dist/cursors/resizeDIAG1.cur b/service/dist/cursors/resizeDIAG1.cur deleted file mode 100644 index a56743ac1146d56fdd6266aa141caf7b22e66cf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 874 zcmV-w1C{&$00IC303aX$01p5U08|4202TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0~<+1K~#90?Ur3g6j2m_&z*69&}|pT--SRa7R!Ao)YQ-*qS%*G zL9tfCo_wz!q6d+EjqHzl>OsoPr+VzEdPz!m_v&s&XjcA(u!Ss?Kf8Np=AO9bif-!$ zt3wbS7??RT%=zwj@0mLQ|Kl$QNtd+UdnV=VtF)5*A`6jCdbHN^!zh59)P$rI%X0Yv zH*pj+fh4<;fT~b-BU)pAYdC;ZR$X=lqQO4GtqbLrT%fe8#Q$%gNge9(2z~>?Ep3)*o!AitJg0M z=`#~PRGEN)G!RD|9Pi#-(008=lhcuBsy|g~?;mceK2Yc0AN!e%<&>XvKYZPq|7K~T zI>5LnuH%*v5EF=abi0jirw}%?=d9B{;P>`T$7Yu`dtx?mFCrr?>F>gE` z7o$xVNfXsZnaJ~cy-vU1-^v)9Lrk5CEhe&V(LYXyFcA)iI}?e-R0b383|*KlEiKMq zFxZwzBtB&@K@stoQ4ltd$5SdyFvg}cn4pH5sH>|h2?PSd#N;+6bk6y6&Uvv>5VrRA zc4sIQI?ouJ6{AkIpzC^A)3h=p0JgR$rDxY$bOVBOuBxi~G!}~$fPong9=jiBY zyI2#P^SG|-E2^qaGR98FVlnZIp&_rED5R90i9{m4#l^*|kw~Pmr>Ez)j}kEmLTvM< z=H})cm&-+5E|(@rQlhJ?Ye&Ct*#t3gknnHBPXtV4oiRLFSpWb407*qoM6N<$f;)|c A2mk;8 diff --git a/service/dist/cursors/resizeDIAG2.cur b/service/dist/cursors/resizeDIAG2.cur deleted file mode 100644 index 25048ba3616b9b0ec1e573191b09154aa08f54aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmV-|1AY7e00IC303aX$01p5U0Bi#Q02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ12aiPK~#90?Uq4E6j2z*|L@JDAq4BRtx0uAqYTPR9ikMXC?P>B zjG(1cw<5H}LwV>>>@6xHIwTR@JasP>1aYxl)K#~%)`B7;&DD0*-5KY-FQz8ha#q)x ztxJEH%g$qd|Nr;i`@RMK>mQ5d^W&*higC^rDJ67W7aos?eqF=!X+Txg{fx0ojIoQV zs_tuUZq94qMG=ugL#sK3nCKP;Gt0Hw9n_;44^o3 z3;tMk@{w%G)9LhBXJ=<^2E5SC16M^vv1O7E^!4?f@_N0QaCb^Chz=7`BwKP_*JIt? z-E}1;C0lIxT35hY*ihDojKh!LnXhL}l39}X_w@9fsHmuLKe-k*s@{yctVWUP18!;_xko9=O23aO%&Bf${9UUFDnx<{C;Xk!qC#ku@0UWTK z%+?>jO8|F2N^k<5^qQkDqay*o-#-+O$LFnK2*6nB+bjpTwdN>*TL5-CETMI}K3el3 z*z)9pKQcKvIS0Tppyv{ftpHc-_S$9*7KheNq^F0(_(&kpSl^53MYxrG$?SI$U*Y{B z0QUfFcZ3_pTQkzznrJ#6%z*2;!Y#37l2_YPtt?COLGdaQNHo<4@#Wi|uPXUU6{xo7 zd3l!PZ^X;~>xq_zJ{z7|ZSt(QKnoj{0PX|W;WSc7Pe;sX=-PbXd_O*avdTV}%W2Qa zfcE{mS*c4M;fDTN#D)XOD`y5U^$niWRa;Jc2}H^y5zQ}!r=w=1_j01KE{Lg5v-X~+ z{{+6oKzwfjL5e7(cnV2LYvx$}#)6Aj^hUDvYy>k?t|VXf7I>b0*o8F(4dA>ILXsF8 zY)fAC428vp4E4+BaI$AJ_DKX9F9|mSI{n^M!PI)zu@lMV73vJrZf5A8aSM*si- diff --git a/service/dist/cursors/resizeNS.cur b/service/dist/cursors/resizeNS.cur deleted file mode 100644 index 43d2d2e62b7d17b8f0a5c908ed8a498e82d292d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmV-t0hs;(00IC303aX$01p5U08s$|02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0T@X{K~#90?Uk`g#6S>+|Cvj;L<4|k0=WY4INw&%q(A^*FnpMv@_6+YMBRni z6GRSPx4O?Rfn242ik3Eh9WPl2(a13mt^z+hPA%6iP%B(-oELD1(K74>;06A>Ku~3A zwi%+|4{P~e87;$J0A8SF*bBf5{6PU}TcF7E{9Q!s;-iRsSZhDgFa)3%$MKrh`ra7x zX081yiehSvIXA|1nieQ2TT@ArOwu$x%(CoQYrR`F?Hko^P0p#QLl6J}002ovPDHLk FV1iBhkG22+ diff --git a/service/dist/cursors/resizeWE.cur b/service/dist/cursors/resizeWE.cur deleted file mode 100644 index 5204c602e3b41a3968eef4e974dd2f1ec2af81a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmV-50m}XW00IC303aX$01p5U03QJW02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|AOHXW zAP5Ek0047(dh`GQ0OmWJJpmAK;|oCNA^Vx za&dGK2M0Gt7xg=62j?zQ4_p-$6kWP_f++RcOC*x26u|^~X2}EZ65jmYC)_PBfj-`k zDh+HO_4#wllL*2HoZqMO!#4nO6a)nj0*C;x>Gj=-k+ZjbmSndq$r>!lE-JOxm5q}t zDQ5)H?32NPk_d-t=^E)TZ>sYS4FC&IGr^_l%XIr>mDJGjuHlj~0A;PTu3%lh1%xoU z_h+an1VX@;05SM)3K8fzwD*xtzzhn@P$vKWKJ-~=o~odBGGIl`uZ_$)%K2yj(7 z2;u)NAijnJZ2;*ni|7l0tSAAl2Dapo)%x+lXtQ++;8_ZJ0uPJL_SRvLUYiQ&eoWaX z*D}Aeo-gfH+4kxeiV!iH?-92v>NDi%AEm}XuG3`v-InC<|Z=K=5m>;X6k!*G-& z$yJtRH?!I70>Bn}Oaa&iun*uk2!gYsC?1-oNtpRvYyG@fEbihsHppJ`0PF%d0&tS1 z>6n?9vKBMHX{|5+vhk)jpxSHpeBVDMqHkADL?a?HNUN0Pzh3}mHf#Fvoql=ODPWcL zAzcD!Xh7$w?zeORyA%daIRG4B;FJTv0R~Pv035(R!GHi662R@FiHQFjAgjXxG+OJA zcD-I9B6VK?ZVy}nsHfBEV^vj8B9a@Bh`iQyJxW*9MZx=;1Sd#*fyWX%8o002ovPDHLkV1gUpp{D=< diff --git a/service/dist/docs/de_DE/Auto clear mainline plot settings.md b/service/dist/docs/de_DE/Auto clear mainline plot settings.md deleted file mode 100644 index 6e4b95877..000000000 --- a/service/dist/docs/de_DE/Auto clear mainline plot settings.md +++ /dev/null @@ -1,46 +0,0 @@ - -# 🧩 Einstellungen für automatisches Freischalten der Hauptstory - -### 🎮 Autoplay und Kampf-Hinweise - -**Autoplay** kann dir helfen, automatisch durch das Raster zu navigieren. -Allerdings **können manche Kämpfe im Final-Episode nicht automatisch ausgeführt werden.** - ---- - -### 📘 Episoden-Nummerierung - -| Nummer | Episodenname | -| :----: | :------------- | -| 1 | Episode I | -| 2 | Episode II | -| 3 | Episode III | -| 4 | Episode IV | -| 5 | Finale Episode | -| 6 | Episode V | - ---- - -### 🔢 Eingabeformat - -Verwende ein Komma („,“) zur Trennung der Zahlen, die jeweils eine Episode repräsentieren, die freigeschaltet werden soll. - -**Beispiel:** - -```text -1,2,3 -``` - -Das bedeutet, dass das Skript die Episoden **Episode I → Episode II → Episode III** in Reihenfolge durchführt. - ---- - -### ⚙️ Standardkonfiguration - -Wenn das Eingabefeld leer gelassen wird und du auf **„Run“** klickst, wird folgende Standardabfolge verwendet: - -| Region | Standardepisoden | -| :----- | :--------------- | -| CN | `1,2,3,4` | -| Global | `1,2,3,4,5,4` | -| JP | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/de_DE/Commonly used emulator adb address.md b/service/dist/docs/de_DE/Commonly used emulator adb address.md deleted file mode 100644 index 63f28f18c..000000000 --- a/service/dist/docs/de_DE/Commonly used emulator adb address.md +++ /dev/null @@ -1,26 +0,0 @@ - -# 🧠 Referenz für Emulator-Ports - -### ⚙️ Allgemeiner Hinweis - -**Für die Multi-Instanz von Stimulator** solltest du die Konfiguration selbst prüfen. - ---- - -### 🎮 Einzelner Emulator-Port - -| Emulator | Port(s) | -| :------------------------ | :--------------- | -| **MuMu** | `7555` | -| **BlueStacks / LDPlayer** | `5555` | -| **NoxPlayer** | `62001`, `59865` | -| **MuMu 12** | `16384` | -| **MEmuPlay** | `21503` | - -> ⚠️ **Wenn du BlueStacks nutzt**, stelle sicher, dass -> **die ADB-Port-Debug-Funktion** in den Einstellungen aktiviert ist. - ---- - -💡 *Tipp:* Diese Ports werden für ADB-Verbindungen zwischen PC und Emulator verwendet. -Solltest du Verbindungsprobleme haben, vergewissere dich, dass die **ADB-Debugging-Option** im Emulator aktiviert ist und kein anderer Emulator dieselbe Portnummer belegt. diff --git a/service/dist/docs/de_DE/Description of normal graphs.md b/service/dist/docs/de_DE/Description of normal graphs.md deleted file mode 100644 index ba27b80d5..000000000 --- a/service/dist/docs/de_DE/Description of normal graphs.md +++ /dev/null @@ -1,113 +0,0 @@ - -# 📊 Beschreibung normaler Graphen - ---- - -## 🧩 1. Nutzungsbeschreibung - -### (1) Freischaltung und Auto-Kampf Anforderung - -Du **musst aktivieren**: - -* 🟡 **Automatisch Runden beenden freischalten** -* 🟡 **Autofight** - -> Das System erkennt und aktiviert diese Funktionen gegebenenfalls automatisch. - ---- - -### (2) Unterstützte Level - -Unterstützte Hauptstory-Normallevel: -🟡 **4 – 25** - ---- - -### (3) Bewegungslogik - -Wenn BAAS-Slides fixiert sind, werden alle Teambewegungen mit **einem einzigen Klick** ausgeführt. -Da die Anzahl der Teams in *Blue Archive* Slides variiert, -unterscheiden sich die **Nummerierungskoordinaten** und die **Bewegungsreihenfolge** je nach Teamzusammenstellung. - ---- - -### (4) Hinweise zur automatischen Extrapolation - -Bei Durchführung der **automatischen Extrapolation** -🟡 **musst du sicherstellen, dass Teams mit kleineren und größeren Nummern korrekt zugeordnet sind.** -(Falls unsicher: Überprüfe die Teamnummern, bevor du fortfährst.) - ---- - -### (5) Einstellungen für normale Thumbnails - -BAAS legt Konfigurationen fest basierend auf: - -* 🟢 **< Einstellungen für normale Thumbnails >** -* 🟢 **Ausgewählte Gruppenattribute** -* 🟢 **♪ Team-Logik ♪** - -Diese bestimmen die korrekte Konfiguration für jeden Slide. - -> Die zuerst entsprechende Eigenschaft im Diagramm ist **[1]**, die zweite ist **[2]**. - ---- - -## 🤖 2. Team-Logik - -1. Priorisiere die Teamwahl basierend auf **Gegenbeziehungen (Restraint / Counter)**, und verringere schrittweise die Abhängigkeit vom Attributs-Matching für verbleibende Gegner. -2. Bei Teamwahl gilt: - `4 – (Teamnummer) ≥ Anzahl der noch benötigten Teams`. -3. Wenn weder (1) noch (2) erfüllt wird, lockere nach und nach die Gegenbeziehungen zwischen [1] Partnern. -4. Wenn bereits einige Teams ausgewählt sind und `4 – max(ausgewählte Teams) ≥ verbleibende Teams`, - fülle die restlichen mit **optional möglichen Nummern**. -5. Wenn keine der obigen Bedingungen zutrifft, wähle standardmäßig **Team 1, 2, 3**. - ---- - -### 🧠 Beispiel - -Wahlreihenfolge für **23 [Explosion, Crossing] Task Force**: - -* Ein Team, eine Operation. -* Wenn *Explosion Team 3* nicht im obigen Ablauf gewählt wurde, wähle **4** als zweites. -* Wenn immer noch nicht verfügbar, wähle **12** als letztes Team. - ---- - -## 🚀 3. Beschreibung von Normal-Push-Chart-Leveln - -### (1) Gebiet Push-Verhalten - -Wenn du auf -🟡 **„Could not close temporary folder: %s“** stößt, -stellt jede eingegebene Zahl ein **Gebiet dar, das gepusht werden soll**. -Das Programm prüft, ob jeder Level innerhalb dieses Gebiets neu gespielt werden muss, -abhängig davon, ob das aktuelle Level bereits eine `SSS` Bewertung erreicht hat. - -**Beispiel:** - -```text -15, 16, 14 -``` - -Das bedeutet, dass das Programm die Gebiete **15 → 16 → 14** der Reihe nach durchläuft. - ---- - -### (2) Erzwingungs-Treffer Konfiguration - -Wenn 🟡 **Erzwinge Treffer auf jedem angegebenen Level** aktiviert ist: - -* Gib eine einzelne Zahl ein → pushe ein ganzes Gebiet einmal. -* Gib `Nummer-Nummer` ein → wähle ein genaues Unterlevel. - -**Beispiel:** - -```text -15, 16-3 -``` - ---- - -✅ *Tipp:* Verifiziere stets, dass Levelnummern und Teamzuordnungen mit deiner **BAAS-Konfiguration** übereinstimmen, bevor du automatisierte Skripte ausführst, um Fehlverhalten zu vermeiden. diff --git a/service/dist/docs/de_DE/Difficult Chart Configuration Description.md b/service/dist/docs/de_DE/Difficult Chart Configuration Description.md deleted file mode 100644 index ec5417b59..000000000 --- a/service/dist/docs/de_DE/Difficult Chart Configuration Description.md +++ /dev/null @@ -1,102 +0,0 @@ - -# 💀 Bedienungsanleitung für das Hardship Map - -Die **Hardship Map** funktioniert ähnlich wie die Modi **Team-Logik** und **Normale Graphen**. -Einige schwierige Karten erfordern **drei Teams**, die alle **das gleiche Attribut** wie das zuerst im Gebiet zugeordnete Team teilen. - ---- - -## 🧾 Ausfüllanleitung - -### ⚠️ Erlaubte Zeichen - -Der **String**, den du für den Slide-Level eingibst, darf **nur** folgende Zeichen oder Wörter enthalten: - -``` -"-", "sss", "present", "task", ",", [Zahlen] -``` - -Jede Segmentgruppe soll durch Kommas (`,`) getrennt sein. - -> ❌ Füge **nicht** irgendwelche Schlüsselwörter wie `"sss"`, `"present"` oder `"task"` außerhalb gültiger Syntax ein. - ---- - -### 🧩 Beispiel 1: Grundlegende Nutzung - -**Eingabe:** - -```text -15,12-2 -``` - -**Interpretation:** -BAAS führt die Aufrufe durch: - -```text -15-1, 15-2, 15-3, 12-2 -``` - -und agiert gemäß der Hard Map Einstellungen: - -* `sss` → Sternebewertung -* `present` → Belohnung einholen -* `task` → Herausforderung durchführen - ---- - -### 🧩 Beispiel 2: Zahl + Schlüsselwort - -**Eingabe:** - -```text -15-sss-present -``` - -**Bedeutung:** -BAAS führt die Levelgruppen **15-1, 15-2, 15-3** aus -und führt sowohl `sss` (Sternebewertung) als auch `present` (Geschenke einsammeln) aus. - ---- - -### 🧩 Beispiel 3: Zwei Zahlen + Schlüsselwörter - -**Eingabe:** - -```text -15-3-sss-task -``` - -**Bedeutung:** -Dies ruft **Level 15-3** auf, um: - -* die `sss` Bewertung zu erreichen -* die `task` Herausforderung abzuschließen - ---- - -### 🧩 Beispiel 4: Komplexes Beispiel - -**Eingabe:** - -``` -7,8-sss,9-3-task -``` - -**Bedeutung:** - -* Ruft `(7-1, 7-2, 7-3)` auf → führe `sss`, Geschenke einsammeln und Herausforderungen aus -* Ruft `(8-1, 8-2, 8-3)` auf → führe `sss` -* Ruft `9-3` auf → absolviere die `task` Herausforderung - ---- - -## 🧠 Systemverhalten - -> 🟡 **Hinweis:** -> BAAS bestimmt automatisch, ob: -> -> * ein Level bereits **`sss`** erreicht hat, oder -> * ein **Geschenk / present** bereits eingesammelt wurde. - -Falls eine dieser Bedingungen bereits erfüllt ist, **wird das Level automatisch übersprungen**, um Laufzeit zu optimieren. diff --git a/service/dist/docs/de_DE/Frontend Development Guide.md b/service/dist/docs/de_DE/Frontend Development Guide.md deleted file mode 100644 index bcf0a4f5c..000000000 --- a/service/dist/docs/de_DE/Frontend Development Guide.md +++ /dev/null @@ -1,103 +0,0 @@ - -# 🏗️ Frontend-Entwicklungsleitfaden - -Dieses Dokument beschreibt, wie die **BAAS Desktop-Applikation** strukturiert ist, wie Daten zwischen Client-Modulen und dem Backend fließen, und was bei Erweiterung der Plattform erwartet wird. -Es richtet sich an **Engineering- und Delivery-Teams**, die eine kanonische Referenz beim Onboarding oder der Implementierung neuer Features benötigen. - ---- - -## 🧩 Anwendungsschale - -Die React-Applikation wird über `App.tsx` gerendert. Sie verbindet den **ThemeProvider**, den **AppProvider** und das persistente Layout-Gerüst (`MainLayout`). -Seiten werden über einen leichten **framer-motion Router** gewechselt, der inaktive Seiten gemountet hält, sodass sie ihren Zustand beim Tab-Wechsel behalten. - -* **Einstiegspunkt:** `main.tsx` initialisiert i18n, das Theme und rendert ``. -* **Provider:** `AppProvider` lädt UI-Präferenzen, stellt WebSocket-Verbindungen her, injiziert das Profilkatalog und stellt Setter über Context zur Verfügung. -* **Layout:** `MainLayout` enthält die persistente Seitenleiste (`Sidebar.tsx`) und den Header (`Header.tsx`). - ---- - -## 🧱 Schlüsselmodule - -| Modul | Verantwortung | Wichtige Dateien | -| :------------------ | :------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------- | -| **Context** | Teilt UI-Einstellungen, aktives Profil und Profilkatalog in der App. | `contexts/AppContext.tsx` | -| **State Stores** | Zustand-Stores normalisieren Remote-State (Konfig, Events, Status, Logs). | `store/websocketStore.ts`, `store/globalLogStore.ts` | -| **Remote Services** | Kapselt Backend-Verträge wie Hotkey-Persistenz und verschlüsselte WebSocket-Sessions. | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | -| **Pages** | Container auf Routenebene für `Home`, `Scheduler`, `Configuration`, `Settings`, `Wiki`. | `pages/*.tsx` | -| **Feature Forms** | Modulare Konfigurationspanel, das auf einem Ausschnitt von `DynamicConfig` arbeitet. | `features/*Config.tsx`, `features/DailySweep.tsx` | -| **Shared UI** | Wiederverwendbare visuelle Primitiven und Komponenten für Publikum (Inputs, Selectors, Modals, Logger). | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | -| **Hooks** | Business-Logic Hooks, etwa Hotkey-Orchestrierung und Theme-Handling. | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | - ---- - -## 🔄 Datenflussübersicht - -### 🔌 WebSocket-Initialisierung - -1. `AppProvider` ruft `useWebSocketStore.getState().init()` beim Start auf. -2. `init()` verbindet sich nacheinander mit **Heartbeat**, **Provider** und **Sync** Channels via `SecureWebSocket`. -3. Sobald verbunden, lädt der Store statische Daten, Konfigurationsmanifeste und Live-Event-Queues. -4. Store-Setter senden Updates an abonnierte Komponenten via Zustand-Selektoren. - ---- - -### ⚙️ Konfigurations-Update-Zyklus - -1. Feature-Forms arbeiten auf einer lokalen Entwurfs-Kopie von `DynamicConfig`. -2. Beim Speichern erzeugt das Formular ein minimalen `patch`-Objekt und ruft `modify(path, patch, showToast)` auf. -3. Der Store sendet einen `sync` Befehl mit JSON-Patch-Semantik und registriert einen Callback in `pendingCallbacks`. -4. Wenn das Backend den Befehl bestätigt, leert der Callback den Pending-Status und zeigt optional einen Toast via `sonner` an. -5. Eingehende `config` Nachrichten synchronisieren den lokalen Store, sodass alle Abonnenten automatisch aktualisiert werden. - ---- - -### 📡 Scheduler-Telemetry - -* **Home**- und **Scheduler**-Seiten abonnieren `statusStore` und `logStore`, um Laufzeitkennzahlen anzuzeigen. -* Die Log-Pipeline dedupliziert Einträge und spiegelt globale Logs in `globalLogStore` für das Terminal des Ladescreens. -* Alle ausgehenden Befehle (Start/Stop Trigger, Patches) werden mit Zeitstempeln versehen, um Konsistenz bei der Reconciliation zu erleichtern. - ---- - -## ⚙️ Querschnittliche Anliegen - -### 🌐 Internationalisierung - -Übersetzungen werden in `assets/locales/*.json` gespeichert und über `react-i18next` geladen. -Die Standardsprache ist **Chinesisch (`zh`)**, mit **Englisch** als Fallback. -UI-Texte sind nach Domänen (Scheduler, Artifact etc.) organisiert, um Lokalisierungsupdates zu vereinfachen. - ---- - -### ⚡ Leistung & UX - -* **Mount Preservation** (siehe `App.tsx`) verhindert, dass teure Komponenten bei Tabwechseln neu initialisiert werden. -* Feature-Forms verwenden `useMemo` und `useCallback`, um unnötige Re-Renders zu vermeiden. -* Scroll-Bereiche nutzen `scroll-embedded` Utility-Klassen für konsistentes Styling. -* Echtzeit-Updates verwenden **gebündelte Zustand-Setter**; große Updates (z. B. Logs) werden unveränderlich angehängt, um Referenz-Churn zu minimieren. - ---- - -### 🧰 Tooling - -* **Build:** Vite + React 19 + TypeScript 5 -* **Styling:** Tailwind CSS mit benutzerdefinierten Token und wiederverwendbaren UI-Komponenten -* **Animationen:** `framer-motion` für Übergänge, `ogl` für Partikeleffekte - ---- - -## 🚀 Erweiterbarkeitscheckliste - -1. Erstelle oder aktualisiere eine Feature-Komponente unter `features/` und binde sie in die `featureMap` (Konfigurationsseite) ein. -2. Erweitere die Übersetzungswörterbücher mit neuen Labels sowohl in `en.json` als auch `zh.json`. -3. Persistiere Server-Kommunikation über `modify`, `patch` oder `trigger`, um konsistentes Acknowledgement-Handling zu gewährleisten. -4. Exponiere UI-Einstellungen über `AppContext`, falls sie vom Anwender konfigurierbar sein sollen. - ---- - -Das Einhalten dieses Kontrakts stellt sicher, dass: - -* Die Anwendung konsistent und erweiterbar bleibt. -* **Tastatursteuerung** und **Telemetry-Synchronisation** korrekt funktionieren. -* Der **WebSocket-State** über alle Seiten hinweg kohärent bleibt. diff --git a/service/dist/docs/de_DE/Guide for activity sweep fill in.md b/service/dist/docs/de_DE/Guide for activity sweep fill in.md deleted file mode 100644 index e940894b4..000000000 --- a/service/dist/docs/de_DE/Guide for activity sweep fill in.md +++ /dev/null @@ -1,53 +0,0 @@ - -# ⚔️ Leitfaden zur Konfiguration der Activity-Sweep - -Diese Anleitung erklärt, wie du korrekt **Activity-Sweep-Parameter** für die BAAS-Automatisierung einstellst. - ---- - -## 🧾 Einzelne Quest sweepen - -**Parameter:** -`Sweep Quest Number` - -* Typ: **Ganzzahl** -* Bereich: `1` – *Maximale Schwierigkeit* in der aktuellen Aktivität. - -**Parameter:** -`Anzahl der Sweeps` - -1. **Ganzzahl** → exakte Anzahl der Durchführungen. - z. B. `3` bedeutet drei Durchläufe. -2. **Dezimalzahl** → Prozentsatz der aktuellen AP (Aktionspunkte) verwendet. - z. B. `0.5` bedeutet `AP × 0.5`. -3. **Bruch** → anteilige AP-Nutzung. - z. B. `1/3` bedeutet `AP × (1/3)`. - ---- - -## 🔁 Mehrere Quests sweepen - -Um mehrere Quests nacheinander zu sweepen, -verwende Kommas (`,`) zur Trennung der Questnummern. - -**Beispiel:** - -```text -Sweep Quest: 9, 10, 11 -Anzahl der Sweeps: 0.5, 3, 1/3 -AP: 999 -``` - -**Interpretation:** - -| Quest | Berechnung | Ergebnis | -| :----- | :--------------- | :----------- | -| **9** | (999 × 0.5) / 20 | 25 Mal | -| **10** | Fix 3 Mal | 3 Durchläufe | -| **11** | (999 × 1/3) / 20 | 16 Mal (ca.) | - -➡️ BAAS sweept diese Quests **in der Reihenfolge**: Quest 9 → Quest 10 → Quest 11. - ---- - -✅ *Tipp:* Vergewissere dich, dass dein **AP-Wert** dem im Spiel verfügbaren Ausdauerwert entspricht, bevor du mehrere Sweeps ausführst. diff --git a/service/dist/docs/de_DE/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/de_DE/Internal settings in BlueArchive game (first-use must read).md deleted file mode 100644 index 489023f87..000000000 --- a/service/dist/docs/de_DE/Internal settings in BlueArchive game (first-use must read).md +++ /dev/null @@ -1,30 +0,0 @@ - -# ⚙️ Blanche Files — Interne Spieleinstellungen - -Dieser Leitfaden beschreibt die **obligatorischen** und **empfohlenen** Spieleinstellungen für einen reibungslosen Betrieb von **Blanche Files** mit dem BAAS Automatisierungssystem. - ---- - -## 🧩 **Erforderliche Einstellungen** - -| Kategorie | Einstellung | Wert / Anweisung | -| :-------------------------- | :------------------------------- | :----------------------------------- | -| **Grafik** | Vertikaler Kampf-Screen Text Box | **Aus** | -| **Wiedererinnerung Lüfte** | Charakterauswahl | **Wähle nicht** Ako, Aru oder Wakamo | -| **Sprache (Global-Server)** | — | **Englisch** | - ---- - -## 💡 Empfohlene Einstellungen *(optional, beeinflusst nicht das Skript)* - -| Einstellung | Empfohlener Wert | -| :--------------------------------- | :--------------- | -| **Auflösung** | Höchstmöglich | -| **FPS** | 60 | -| **Beschleunigter Rendermodus** | Kompatibilität | -| **Post-Processing** | Ein | -| **Kantenglättung** (Anti-Aliasing) | Ein | - ---- - -✅ *Tipp:* Hochwertige Grafikeinstellungen gewährleisten konsistentere visuelle Erkennung für automatisierte Aufgaben, sind aber **nicht unbedingt erforderlich** für stabile Ausführung. diff --git a/service/dist/docs/de_DE/Normal Sweeping Scanning Description.md b/service/dist/docs/de_DE/Normal Sweeping Scanning Description.md deleted file mode 100644 index 05ce9b2f8..000000000 --- a/service/dist/docs/de_DE/Normal Sweeping Scanning Description.md +++ /dev/null @@ -1,62 +0,0 @@ - -# 🧹 Konfigurationsanleitung für Sweeping - -Jede **Sweep-Konfiguration** folgt dem allgemeinen Format: - -``` -Region - Task-Nummer - Sweep-Anzahl -``` - ---- - -## 🧩 Aufbau - -| Komponente | Beschreibung | -| :--------------- | :------------------------------------ | -| **Region** | Identifikator der Karte oder Gebietes | -| **Task-Nummer** | Level oder Stufe in dieser Region | -| **Sweep-Anzahl** | Anzahl der Durchläufe für das Sweepen | - -Jede Konfigurationsangabe sollte durch Kommas (`,`) getrennt sein. - ---- - -## 🗺️ 1. Verfügbare Sweep-Levels - -Alle Karten **nach Academy 1 und Academy 5** werden vom automatischen Sweepen unterstützt. - -> 🟡 **Beispiel gültiger Sweep-Strings:** -> -> ``` -> 12-1-3, 13-2-2, 14-4-1 -> ``` - ---- - -## ⚙️ 2. Spezifische Besonderheit - -Auf dem **Internationalen Server** kann das Feld für `Sweep-Anzahl` das Schlüsselwort **`max`** enthalten. - -* BAAS entscheidet automatisch, ob das Level beendet werden kann, abhängig von: - - * aktueller **Ausdauer (AP)** - * Level-Schwierigkeit und Abschlussstatus - ---- - -### 🧮 Beispiel - -Wenn genug Ausdauer vorhanden ist: - -``` -15-3, 20-3-max -``` - -**Bedeutung:** - -* Sweepen von **15-3** → dreimal -* Dann Sweepen von **20-3** → mit **der gesamten verbleibenden Ausdauer** (`max`) - ---- - -✅ *Tipp:* Nutze `max` nur, wenn du willst, dass BAAS selbständig alle verbleibende Ausdauer auf diesem Level einsetzt. Ansonsten gib explizite Sweep-Anzahlen für genaue Steuerung an. diff --git a/service/dist/docs/de_DE/Scheduling Configuration Filling Guide.md b/service/dist/docs/de_DE/Scheduling Configuration Filling Guide.md deleted file mode 100644 index bb6f1a321..000000000 --- a/service/dist/docs/de_DE/Scheduling Configuration Filling Guide.md +++ /dev/null @@ -1,83 +0,0 @@ - -# 🕒 Leitfaden für Zeitplan-Konfigurationsfelder - -Diese Anleitung beschreibt, wie du Zeitplan-Konfigurationsfelder korrekt ausfüllst und interpretierst, um automatisierte Aufgaben auszuführen. - ---- - -## ⚙️ 1. Priorität - -Wenn mehrere Aufgaben in der Warteschlange sind: - -* Aufgaben mit **niedrigeren Prioritätswerten** werden **zuerst** ausgeführt. - -> Beispiel: -> Aufgabe A (Priorität 1) läuft vor Aufgabe B (Priorität 2). - ---- - -## ⏳ 2. Ausführungsintervall - -* **Ganzzahl `0`** bedeutet, dass die Aufgabe **jeden Tag** (Intervall von einem Tag) wiederholt wird. -* Größere Ganzzahlen stehen für längere Intervalle zwischen den Ausführungen (in Tagen). - ---- - -## 🕐 3. Täglicher Reset - -Aufgaben werden täglich zu festen Zeiten automatisch ausgeführt. Das lässt sich in der **Neuen UI** einfach einstellen. - -* **Format:** - -``` -[ [ h, m, s ] ] -``` - -*(UTC Zeit)* - -* **Mehrere Zeitpunkte** können angegeben werden, getrennt durch Kommas. - -**Beispiel:** - -``` -[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] -``` - -**Bedeutung:** -Läuft um **0:00 UTC** und **20:00 UTC** (entspricht 8 Uhr und 4 Uhr Pekinger Zeit bei UTC+8). - ---- - -## 🚫 4. Deaktivierte Zeitbereiche - -Aufgaben **werden nicht ausgeführt** während festgelegter deaktivierter Zeitfenster. Das lässt sich ebenfalls in der **Neuen UI** einstellen. - -* **Format:** - -``` -[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] -``` - -*(UTC Zeit)* - -* **Mehrere Intervalle** möglich, separat durch Kommas. - -**Beispiel:** - -``` -[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] -``` - -**Bedeutung:** -Aufgaben sind für den ganzen Tag deaktiviert. - ---- - -## 🔁 5. Vor- und Nachaufgaben - -Du kannst zusammenhängende Operationen verketten: - -* **Pre-Tasks:** ausgeführt **vor** der aktuellen Aufgabe -* **Post-Tasks:** ausgeführt **nach** der aktuellen Aufgabe - -> Dies stellt sicher, dass abhängige Aktionen in der richtigen Reihenfolge ausgeführt werden. diff --git a/service/dist/docs/de_DE/Task force attributes required by region.md b/service/dist/docs/de_DE/Task force attributes required by region.md deleted file mode 100644 index 7bae1e733..000000000 --- a/service/dist/docs/de_DE/Task force attributes required by region.md +++ /dev/null @@ -1,38 +0,0 @@ - -# 🎯 Referenztabelle der Stufenattribute - -Diese Tabelle zeigt jede Stufe und deren zugehörige **zwei Hauptattribute**, in getrennten Spalten dargestellt. - -| Stufe | Attribut ① | Attribut ② | -| :----- | :--------- | :--------- | -| **25** | Sonic | Piercing | -| **24** | Sonic | Explosive | -| **23** | Explosive | Piercing | -| **22** | Piercing | Mystic | -| **21** | Mystic | Explosive | -| **20** | Explosive | Piercing | -| **19** | Piercing | Mystic | -| **18** | Mystic | Explosive | -| **17** | Explosive | Piercing | -| **16** | Piercing | Mystic | -| **15** | Mystic | Mystic | -| **14** | Explosive | Mystic | -| **13** | Piercing | Piercing | -| **12** | Mystic | Explosive | -| **11** | Piercing | Mystic | -| **10** | Explosive | Mystic | -| **9** | Explosive | Piercing | -| **8** | Piercing | Piercing | -| **7** | Explosive | Explosive | -| **6** | Piercing | Piercing | -| **5** | Explosive | — | -| **4** | Piercing | — | -| **3** | Piercing | — | -| **2** | Explosive | — | -| **1** | Explosive | — | - ---- - -✅ *Tipp:* -Beim Planen von Kämpfen solltest du den **Angriffstyp deines Teams** mit der **Schwäche des Gegners** abgleichen. -Stufen mit zwei Attributen erfordern oft **ausgeglichene Teamzusammensetzungen**, um Stabilität über die Unterstufen zu gewährleisten. diff --git a/service/dist/docs/de_DE/reporting guidelines on issues (important).md b/service/dist/docs/de_DE/reporting guidelines on issues (important).md deleted file mode 100644 index 92c521756..000000000 --- a/service/dist/docs/de_DE/reporting guidelines on issues (important).md +++ /dev/null @@ -1,60 +0,0 @@ - -# 🧭 Leitfaden zur Fehlerberichterstattung und Selbstdiagnose - -Bevor du ein Problem meldest, **halte inne und prüfe** die folgende Checkliste. -So stellst du sicher, dass dein Problem reproduzierbar, klar und für andere leichter nachzuvollziehen ist. - ---- - -## 💡 Vor der Meldung - -1. **Ist das Problem schon einmal aufgetreten?** - Versuche zuerst selbstständig Lösungen zu finden — nutze **Baidu** oder das **Handbuch / die Dokumentation**. - - > Wenn das Problem weiterhin besteht, fahre mit der Meldung fort. - -2. **Tritt das Problem jedes Mal auf, wenn du das Programm ausführst?** - Konsistenz hilft dabei zu unterscheiden, ob es sich um ein Umweltproblem oder einen Zufallsfehler handelt. - -3. **Kannst du genügend Informationen bereitstellen, damit andere den Fehler nachstellen können?** - Füge Logs, Screenshots und relevante Einstellungen hinzu. - -4. **Formuliere deinen Bericht lesbar und ansprechend.** - Gut formatierte farbige Logs oder Screenshots (z. B. in einer QQ-Gruppe gepostet) erleichtern das Helfen. - ---- - -## 🎨 Problemtyp vs. nötige Angaben - -*(🟡 Gelbe Punkte sind **erforderlich**)* - ---- - -### 🧱 „Ich hänge auf Seite XXX fest!“ - -🟡 **(1)** Screenshot in 1280×720 Spielauflösung (z. B. MuMu im F9 Modus). -(2) Ein vollständiges Log als Screenshot. -(3) Wechsel zwischen Seiten testen, um zu prüfen, ob der Freeze nur auf einer Seite auftritt. - ---- - -### 🧍 „Ich kann mich nicht bewegen!“ - -(1) Versuche die Aktion ein oder zwei Mal erneut, um zu testen, ob der Freeze an derselben Stelle auftritt. -🟡 **(2)** Nimm ein vollständiges Video von *Start bis Freeze-Punkt* auf, -sodass sowohl der Emulator als auch das BAAS-Loginterface sichtbar sind. - ---- - -### ⚙️ „Ich habe XXX konfiguriert, aber es wurde nicht ausgeführt!“ - -oder -„Ich habe nichts konfiguriert, und es wurde trotzdem ausgeführt!“ - -(1) Lies sorgfältig die Konfigurationsanleitung erneut, um sicherzugehen, dass alle Parameter korrekt ausgefüllt sind. -🟡 **(2)** Füge Konfigurations-Screenshots und Programm-Logs hinzu. - ---- - -✅ *Tipp:* Ein vollständiger Bericht sollte es einer anderen Person ermöglichen, dein Problem **ohne Raten** nachzustellen. -Logs, Screenshots und klarer Kontext sparen allen Zeit und führen zu schnelleren Lösungen. diff --git a/service/dist/docs/en_US/Auto clear mainline plot settings.md b/service/dist/docs/en_US/Auto clear mainline plot settings.md deleted file mode 100644 index c7e414831..000000000 --- a/service/dist/docs/en_US/Auto clear mainline plot settings.md +++ /dev/null @@ -1,46 +0,0 @@ -# 🧩 Auto Clear Mainline Plot Settings - -### 🎮 Autoplay and Battle Notes - -**Autoplay** can help you **walk through the grid** automatically. -However, **some battles in the Final Episode cannot be fought automatically.** - ---- - -### 📘 Episode Numbering - -| Number | Episode Name | -|:------:|:--------------| -| 1 | Episode I | -| 2 | Episode II | -| 3 | Episode III | -| 4 | Episode IV | -| 5 | Final Episode | -| 6 | Episode V | - ---- - -### 🔢 Input Format - -Use a comma (`,`) to separate the numbers indicating each episode to be cleared. - -**Example:** - -```text -1,2,3 -``` - -This means the script will clear **Episode I → Episode II → Episode III** sequentially. - ---- - -### ⚙️ Default Configuration - -If the input box is left empty and you click **“Run”**, the default sequence is used: - -| Region | Default Episodes | -|:-------|:-----------------| -| CN | `1,2,3,4` | -| Global | `1,2,3,4,5,4` | -| JP | `1,2,3,4,5,4,6` | - diff --git a/service/dist/docs/en_US/Commonly used emulator adb address.md b/service/dist/docs/en_US/Commonly used emulator adb address.md deleted file mode 100644 index 7a7f01cd7..000000000 --- a/service/dist/docs/en_US/Commonly used emulator adb address.md +++ /dev/null @@ -1,24 +0,0 @@ -# 🧠 Emulator Port Reference - -### ⚙️ General Note - -**For Stimulator multi-instance**, please check the configuration yourself. - ---- - -### 🎮 Single Emulator Port List - -| Emulator | Port(s) | -|:--------------------------|:-----------------| -| **MuMu** | `7555` | -| **BlueStacks / LDPlayer** | `5555` | -| **NoxPlayer** | `62001`, `59865` | -| **MuMu 12** | `16384` | -| **MEmuPlay** | `21503` | - -> ⚠️ **If you use BlueStacks**, make sure the \ -> **ADB port debug function** is enabled in settings. ---- - -💡 *Tip:* These ports are used for ADB connections between your PC and the emulator. -If you encounter connection issues, verify that the emulator’s **ADB debugging option** is turned on and that no other emulator instance is occupying the same port. diff --git a/service/dist/docs/en_US/Description of normal graphs.md b/service/dist/docs/en_US/Description of normal graphs.md deleted file mode 100644 index 34e1a1145..000000000 --- a/service/dist/docs/en_US/Description of normal graphs.md +++ /dev/null @@ -1,113 +0,0 @@ -# 📊 Description of Normal Graphs - ---- - -## 🧩 1. Description of Use - -### (1) Unlock and Autofight Requirement - -You **must enable** both: - -- 🟡 **Unlock Automatically End Rounds** -- 🟡 **Autofight** - -> The system will automatically detect and enable these functions if possible. - ---- - -### (2) Supported Levels - -Supported mainline ordinary levels: -🟡 **4 – 25** - ---- - -### (3) Movement Logic - -When BAAS slides are fixed, all team movements are executed with **a single click**. -Because the number of teams in *Blue Archive* slides varies, -the **numbering coordinates** and **movement order** also differ depending on the team composition. - ---- - -### (4) Automatic Extrapolation Notes - -When performing **automatic extrapolation**, -🟡 **you must ensure that smaller-numbered teams and larger-numbered teams are correctly assigned.** -(If uncertain, double-check team numbering before proceeding.) - ---- - -### (5) Normal Thumbnail Settings - -BAAS will determine configurations based on: - -- 🟢 **< Normal Thumbnail Settings >** -- 🟢 **Selected Group Properties** -- 🟢 **♪ Team Logic ♪** - -These determine the correct configuration for each slide. - -> The first corresponding property in the diagrams is **[1]**, and the second is **[2]**. - ---- - -## 🤖 2. Team Logic - -1. Prioritize team selection based on **restraint relationships** (counter relationships), - gradually reducing reliance on attribute matching for remaining opponents. -2. When selecting a team: - `4 - (team number) >= number of remaining required teams`. -3. If neither condition (1) nor (2) can be satisfied, gradually weaken the restraint relationships among [1] counterparts. -4. If some teams are already selected and `4 - max(selected teams) >= remaining teams required`, - fill the remaining with **optional numbers**. -5. If none of the above conditions are met, default to **team 1, 2, 3**. - ---- - -### 🧠 Example - -Selecting order for **23 [Explosion, Crossing] Task Force**: - -- One team, one operation. -- If *Explosion team 3* is not selected in the above order, select **4** as the second. -- If still unavailable, choose **12** as the final team. - ---- - -## 🚀 3. Description of Normal Graph Push-Chart Level - -### (1) Area Push Behavior - -If you encounter -🟡 **“Could not close temporary folder: %s”**, -each entered number represents an **area to be pushed**. -The program will check whether each level within that area should be replayed -based on whether the current level has reached an `SSS` rating. - -**Example:** -```text -15, 16, 14 -``` - -This means the program will roll through areas **15 → 16 → 14** sequentially. - ---- - -### (2) Mandatory Hit Configuration - -If 🟡 **Enable Mandatory Hits at Each Specified Level** is turned on: - -- Enter a single number → push one entire area once. -- Enter `number-number` → specify an exact sub-level. - -**Example:** - -```text -15, 16-3 -``` - ---- - -✅ *Tip:* Always verify that level numbering and team assignments align with your **BAAS configuration** before running automated scripts to prevent mismatched behavior. - diff --git a/service/dist/docs/en_US/Difficult Chart Configuration Description.md b/service/dist/docs/en_US/Difficult Chart Configuration Description.md deleted file mode 100644 index d29f7ef66..000000000 --- a/service/dist/docs/en_US/Difficult Chart Configuration Description.md +++ /dev/null @@ -1,103 +0,0 @@ -# 💀 Hardship Map Usage Guide - -The **Hardship Map** operates similarly to **Team Logic** and **Normal Figure** modes. -Some of the difficult maps require **three teams**, all of which share the **same attribute** as the first team assigned for that region. - ---- - -## 🧾 Fill-in Instructions - -### ⚠️ Allowed Characters - -The **string** you fill in for the slide level **must not contain characters or words other than**: - -``` - -"-", "sss", "present", "task", ",", [numbers] - -``` - -Each segment should be **split by commas (`,`)**. - -> ❌ Do **not** include any keywords like `"sss"`, `"present"`, or `"task"` outside of valid syntax. - ---- - -### 🧩 Example 1: Basic Usage - -**Input:** -``` - -15,12-2 - -``` - -**Interpretation:** - -BAAS will perform calls: -``` - -15-1, 15-2, 15-3, 12-2 - -``` -and execute according to **Hard Map** settings: -- `sss` → evaluate star completion -- `present` → collect rewards -- `task` → perform challenge missions - ---- - -### 🧩 Example 2: Number + String - -**Input:** -``` - -15-sss-present - -``` - -**Meaning:** -BAAS will run level group **15-1, 15-2, 15-3** -and execute both `sss` (star evaluation) and `present` (gift collection). - ---- - -### 🧩 Example 3: Two Numbers + Keywords - -**Input:** -``` - -15-3-sss-task - -``` - -**Meaning:** -This calls **level 15-3** to: -- achieve `sss` rating -- complete the `task` challenge. - ---- - -### 🧩 Example 4: Complex Case - -**Input:** - -``` -7,8-sss,9-3-task -``` - -**Meaning:** -- Calls `(7-1, 7-2, 7-3)` → perform `sss`, collect gifts, and complete challenges. -- Calls `(8-1, 8-2, 8-3)` → perform `sss`. -- Calls `9-3` → complete the challenge task. - ---- - -## 🧠 System Behaviour - -> 🟡 **Note:** -> BAAS automatically determines whether: -> - a level has already reached **`sss`**, or -> - a **gift/present** has been collected. - -If either condition is already satisfied, **the level will be skipped automatically** to optimise runtime efficiency. diff --git a/service/dist/docs/en_US/Frontend Development Guide.md b/service/dist/docs/en_US/Frontend Development Guide.md deleted file mode 100644 index bf8cb1df1..000000000 --- a/service/dist/docs/en_US/Frontend Development Guide.md +++ /dev/null @@ -1,104 +0,0 @@ -# 🏗️ Frontend Development Guide - -This document describes how the **BAAS desktop application** is organised, how data flows between client modules and the backend, and the operational expectations when extending the platform. -It targets **engineering and delivery teams** that need a canonical reference while onboarding or implementing new features. - ---- - -## 🧩 Application Shell - -The React application is rendered through `App.tsx`. It wires the **ThemeProvider**, **AppProvider**, and the persistent layout frame (`MainLayout`). -Pages are swapped using a lightweight **framer-motion router** that keeps inactive pages mounted, allowing them to retain state while users change tabs. - -- **Entry point:** `main.tsx` bootstraps i18n, theme, and renders ``. -- **Providers:** `AppProvider` loads UI preferences, establishes WebSocket connectivity, injects the profile catalogue, and exposes setters via context. -- **Layout:** `MainLayout` contains the persistent sidebar (`Sidebar.tsx`) and header (`Header.tsx`). - ---- - -## 🧱 Key Modules - -| Module | Responsibility | Key Files | -|:--------------------|:--------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------| -| **Context** | Shares UI settings, active profile, and profile catalogue across the app. | `contexts/AppContext.tsx` | -| **State Stores** | Zustand stores normalise remote state (config, events, status, logs) for components. | `store/websocketStore.ts`, `store/globalLogStore.ts` | -| **Remote Services** | Encapsulate back-end contracts such as hotkey persistence and encrypted WebSocket sessions. | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | -| **Pages** | Route-level containers for `Home`, `Scheduler`, `Configuration`, `Settings`, and `Wiki`. | `pages/*.tsx` | -| **Feature Forms** | Modular configuration panels that operate on a slice of `DynamicConfig`. | `features/*Config.tsx`, `features/DailySweep.tsx` | -| **Shared UI** | Reusable visual primitives and audience components (inputs, selectors, modals, loggers). | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | -| **Hooks** | Business logic hooks, including hotkey orchestration and theme handling. | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | - ---- - -## 🔄 Data Flow Overview - -### 🔌 WebSocket Initialisation - -1. `AppProvider` calls `useWebSocketStore.getState().init()` during boot. -2. `init()` connects sequentially to **heartbeat**, **provider**, and **sync** channels using `SecureWebSocket`. -3. Once connected, the store pulls static data, configuration manifests, and live event queues. -4. Store setters broadcast updates to subscribed components via Zustand selectors. - ---- - -### ⚙️ Configuration Update Cycle - -1. Feature forms operate on a local draft copy of `DynamicConfig`. -2. On save, the form generates a minimal `patch` object and invokes `modify(path, patch, showToast)`. -3. The store emits a `sync` command with JSON patch semantics and registers a callback on `pendingCallbacks`. -4. When the backend acknowledges the command, the callback clears the pending state and optionally displays a toast via `sonner`. -5. Incoming `config` messages reconcile the local store so all subscribers refresh automatically. - ---- - -### 📡 Scheduler Telemetry - -- **Home** and **Scheduler** pages subscribe to `statusStore` and `logStore` to present runtime metrics. -- The log pipeline deduplicates entries and mirrors global logs into `globalLogStore` for the loading screen terminal. -- All outgoing commands (start/stop triggers, patches) are timestamped to simplify reconciliation. - ---- - -## ⚙️ Cross-Cutting Concerns - -### 🌐 Internationalisation - -Translations are stored in `assets/locales/*.json` and loaded via `react-i18next`. -The default language is **Chinese (`zh`)**, with **English fallback**. -UI copy is organised by domain (scheduler, artifact, etc.) to simplify localisation updates. - ---- - -### ⚡ Performance & UX - -- **Mount preservation** (see `App.tsx`) prevents expensive components from reinitialising on tab changes. -- Feature forms apply `useMemo` and `useCallback` to prevent unnecessary re-renders. -- Scrolling areas use `scroll-embedded` utility classes for consistent styling. -- Real-time updates rely on **batched Zustand setters**; heavy updates (e.g., logs) append immutably to reduce reference churn. - ---- - -### 🧰 Tooling - -- **Build:** Vite + React 19 + TypeScript 5 -- **Styling:** Tailwind CSS with custom tokens and reusable UI components -- **Animations:** `framer-motion` for transitions and `ogl` for particle effects - ---- - -## 🚀 Extensibility Checklist - -1. Create or update a feature component under `features/` and wire it into `featureMap` (Configuration page). -2. Expand translation dictionaries with new labels in both `en.json` and `zh.json`. -3. Persist server communication through `modify`, `patch`, or `trigger` to maintain consistent acknowledgement handling. -4. Expose UI settings via `AppContext` if they should be user-configurable. - ---- - -Following this contract ensures that: - -- The application remains **consistent and extensible**. -- **Keyboard navigation** and **telemetry synchronisation** function correctly. -- **WebSocket state** stays coherent across all pages. - ---- diff --git a/service/dist/docs/en_US/Guide for activity sweep fill in.md b/service/dist/docs/en_US/Guide for activity sweep fill in.md deleted file mode 100644 index 86ca94f3d..000000000 --- a/service/dist/docs/en_US/Guide for activity sweep fill in.md +++ /dev/null @@ -1,53 +0,0 @@ -# ⚔️ Activity Sweep Fill-In Guide - -This guide explains how to correctly configure **activity sweep parameters** for BAAS automation. - ---- - -## 🧾 Sweep One Quest - -**Parameter:** -`Sweep Quest Number` - -- Type: **Integer** -- Range: `1` – *maximum difficulty* in the current activity. - -**Parameter:** -`Number of Sweeps` - -1. **Integer** → Represents *exact sweep times*. - e.g. `3` means perform the quest 3 times. -2. **Decimal** → Represents a *percentage of current AP* (Action Points) used. - e.g. `0.5` means use **AP × 0.5** for sweeping. -3. **Fraction** → Represents a *fractional AP usage*. - e.g. `1/3` means use **AP × (1/3)** for sweeping. - ---- - -## 🔁 Sweep Multiple Quests - -To sweep multiple quests sequentially, -use commas (`,`) to separate quest numbers. - -**Example:** -``` - -Sweep Quest: 9, 10, 11 -Number of Sweeps: 0.5, 3, 1/3 -AP: 999 - -``` - -**Interpretation:** - -| Quest | Calculation | Result | -|:-------|:-----------------|:---------| -| **9** | (999 × 0.5) / 20 | 25 times | -| **10** | Fixed 3 times | 3 times | -| **11** | (999 × 1/3) / 20 | 16 times | - -➡️ BAAS will sweep these quests **in order**: Quest 9 → Quest 10 → Quest 11. - ---- - -✅ *Tip:* Always verify that your **AP value** corresponds to the in-game available stamina before executing multiple sweeps. diff --git a/service/dist/docs/en_US/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/en_US/Internal settings in BlueArchive game (first-use must read).md deleted file mode 100644 index 0f9c1c729..000000000 --- a/service/dist/docs/en_US/Internal settings in BlueArchive game (first-use must read).md +++ /dev/null @@ -1,29 +0,0 @@ -# ⚙️ Blanche Files — Game Internal Settings - -This guide outlines the **mandatory** and **recommended** in-game settings required for proper operation of **Blanche Files** with the BAAS automation system. - ---- - -## 🧩 **Required Settings** - -| Category | Setting | Value / Instruction | -|:-----------------------------|:--------------------------------|:--------------------------------------| -| **Graphics** | Vertical Battle Screen Text Box | **Off** | -| **Recollection Lobby** | Character Selection | **Do not choose** Ako, Aru, or Wakamo | -| **Language (Global Server)** | — | **English** | - ---- - -## 💡 Recommended Selections *(Optional, does not affect script execution)* - -| Setting | Recommended Value | -|:------------------------------|:------------------| -| **Resolution** | Highest | -| **FPS** | 60 | -| **Accelerate Rendering Mode** | Compatibility | -| **Post-Processing** | ON | -| **Anti-Aliasing** | ON | - ---- - -✅ *Tip:* Keeping graphics settings at high quality ensures more consistent visual recognition for automated tasks, though it is **not required** for stable execution. diff --git a/service/dist/docs/en_US/Normal Sweeping Scanning Description.md b/service/dist/docs/en_US/Normal Sweeping Scanning Description.md deleted file mode 100644 index 5fc99f553..000000000 --- a/service/dist/docs/en_US/Normal Sweeping Scanning Description.md +++ /dev/null @@ -1,61 +0,0 @@ -# 🧹 Sweep Configuration Guide - -Each **sweep configuration** follows the general format: - -``` -region - task-number - sweep-times -``` - ---- - -## 🧩 Structure - -| Component | Description | -|:----------------|:------------------------------------------| -| **Region** | The map or area identifier. | -| **Task Number** | The level or stage within that region. | -| **Sweep Times** | The number of times to perform the sweep. | - -Each configuration should be **separated by commas (`,`)**. - ---- - -## 🗺️ 1. Available Sweep Levels - -All maps **after Academy 1 and Academy 5** are supported for automated sweeping. - -> 🟡 **Example of valid sweep strings:** -> ``` -> 12-1-3, 13-2-2, 14-4-1 -> ``` - ---- - -## ⚙️ 2. Special Description - -On the **International Server**, -the field for `sweep times` can take the keyword **`max`**. - -- BAAS automatically determines whether the level can be cleared, - depending on: - - current **stamina (AP)** - - level difficulty and completion status - ---- - -### 🧮 Example - -When stamina is sufficient: - -``` -15-3, 20-3-max -``` - -**Meaning:** - -- Sweep **15-3** three times. -- Then sweep **20-3** using **all remaining AP (max)**. - ---- - -✅ *Tip:* Use `max` only when you want BAAS to automatically exhaust available stamina on that level, otherwise specify explicit sweep counts for controlled execution. diff --git a/service/dist/docs/en_US/Scheduling Configuration Filling Guide.md b/service/dist/docs/en_US/Scheduling Configuration Filling Guide.md deleted file mode 100644 index d24789f2f..000000000 --- a/service/dist/docs/en_US/Scheduling Configuration Filling Guide.md +++ /dev/null @@ -1,83 +0,0 @@ -# 🕒 Scheduling Configuration Filling Guide - -This guide explains how to correctly fill in and interpret scheduling configuration fields for automated task execution. - ---- - -## ⚙️ 1. Priority - -When multiple tasks exist in the queue: - -- Tasks with **lower priority values** are executed **first**. - -> Example: -> Task A (priority 1) runs before Task B (priority 2). - ---- - -## ⏳ 2. Execution Interval - -- **Integer `0`** means the task repeats **every day** (one-day interval). -- Larger integers represent longer gaps between executions (in days). - ---- - -## 🕐 3. Daily Reset - -Tasks execute automatically at fixed times each day. This can be easily set on **New UI**. - -- **Format:** - -``` -[ [ h, m, s ] ] -``` - -*(UTC time)* - -- **Multiple timestamps** can be specified, separated by commas. - -**Example:** - -``` -[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] -``` - -**Meaning:** -Runs at **8 AM** and **4 PM Beijing time (UTC + 8)**. - ---- - -## 🚫 4. Disabled Time Periods - -Tasks **will not run** during specified disabled time windows. This can also be easily set on **New UI**. - -- **Format:** -``` - -[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] - -``` -*(UTC time)* - -- **Multiple periods** may be provided, separated by commas. - -**Example:** -``` - -[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] - -``` - -**Meaning:** -Tasks are disabled for the **entire day**. - ---- - -## 🔁 5. Pre-tasks & Post-tasks - -You can chain related operations: - -- **Pre-tasks:** executed **before** the current task. -- **Post-tasks:** executed **after** the current task. - -> Ensures dependent actions run in correct order within the scheduling system. diff --git a/service/dist/docs/en_US/Task force attributes required by region.md b/service/dist/docs/en_US/Task force attributes required by region.md deleted file mode 100644 index 552000234..000000000 --- a/service/dist/docs/en_US/Task force attributes required by region.md +++ /dev/null @@ -1,37 +0,0 @@ -# 🎯 Stage Attribute Reference Table - -This table lists each stage and its corresponding **two main attributes**, divided into separate columns for clarity. - -| Stage | Attribute ① | Attribute ② | -|:------:|:------------|:------------| -| **25** | Sonic | Piercing | -| **24** | Sonic | Explosive | -| **23** | Explosive | Piercing | -| **22** | Piercing | Mystic | -| **21** | Mystic | Explosive | -| **20** | Explosive | Piercing | -| **19** | Piercing | Mystic | -| **18** | Mystic | Explosive | -| **17** | Explosive | Piercing | -| **16** | Piercing | Mystic | -| **15** | Mystic | Mystic | -| **14** | Explosive | Mystic | -| **13** | Piercing | Piercing | -| **12** | Mystic | Explosive | -| **11** | Piercing | Mystic | -| **10** | Explosive | Mystic | -| **9** | Explosive | Piercing | -| **8** | Piercing | Piercing | -| **7** | Explosive | Explosive | -| **6** | Piercing | Piercing | -| **5** | Explosive | — | -| **4** | Piercing | — | -| **3** | Piercing | — | -| **2** | Explosive | — | -| **1** | Explosive | — | - ---- - -✅ *Tip:* -When planning battles, consider pairing your team’s **attack type** with the **enemy’s weakness** attribute. -Stages featuring two attributes generally require **balanced team compositions** to maintain stability across sub-stages. diff --git a/service/dist/docs/en_US/reporting guidelines on issues (important).md b/service/dist/docs/en_US/reporting guidelines on issues (important).md deleted file mode 100644 index f5fff6121..000000000 --- a/service/dist/docs/en_US/reporting guidelines on issues (important).md +++ /dev/null @@ -1,57 +0,0 @@ -# 🧭 Problem Reporting and Self-Diagnosis Guide - -Before submitting a report, please **pause and think** through the following checklist. -Doing so helps ensure that your issue is reproducible, clear, and easy for others to assist with. - ---- - -## 💡 Before You Report - -1. **Has this issue occurred before?** - Try solving it yourself first — search on **Baidu** or refer to the **curriculum / documentation**. - - > If it still cannot be solved, proceed to report. - -2. **Does the problem occur every time you run the program?** - Consistency helps identify whether it’s an environment issue or a random glitch. - -3. **Can you provide enough information for others to reproduce the issue?** - Include logs, screenshots, and any relevant settings. - -4. **Make your report readable and attractive.** - Well-formatted colour-coded logs or screenshots (for example, posted in the QQ group) encourage others to help. - ---- - -## 🎨 Problem Type vs. Reporting Requirements -*(🟡 Yellow items are **required**)* - ---- - -### 🧱 “I’m stuck on page XXX!” - -🟡 **(1)** 1280×720 game resolution when stuck (e.g., *MuMu on F9*). -(2) Provide a **BAAS log screenshot**. -(3) Try switching between pages to confirm if the freeze happens only on one page. - ---- - -### 🧍 “I can’t move!” - -(1) Try repeating the operation one or two times to see if the freeze occurs at the same position. -🟡 **(2)** Record a **complete video** from *startup slide → freeze point*, -ensuring both the **emulator** and the **BAAS log interface** are visible on the same screen. - ---- - -### ⚙️ “I set up the XXX configuration but it didn’t execute!” -or -“I didn’t set up XXX but it executed anyway!” - -(1) Carefully re-read the **configuration instructions** to confirm that the parameters were filled correctly. -🟡 **(2)** Attach **configuration screenshots** and **program logs**. - ---- - -✅ *Tip:* A complete report should allow another person to reproduce your issue **without guessing**. -Providing logs, screenshots, and clear context saves everyone time and ensures faster fixes. diff --git a/service/dist/docs/entry.json b/service/dist/docs/entry.json deleted file mode 100644 index aefb74edc..000000000 --- a/service/dist/docs/entry.json +++ /dev/null @@ -1,304 +0,0 @@ -[ - { - "id": "frontend-development", - "category": "architecture", - "title": { - "en": "Frontend Development Guide", - "zh": "前端开发指南", - "ja": "フロントエンド開発ガイド", - "ko": "프론트엔드 개발 가이드", - "fr": "Guide de développement Frontend", - "ru": "Руководство по фронтенд-разработке", - "de": "Leitfaden für die Frontend-Entwicklung" - }, - "summary": { - "en": "System-level overview covering application shell, module responsibilities, state management, and extensibility checklist.", - "zh": "从系统层面梳理应用外壳、模块职责、状态管理与扩展检查要点。", - "ja": "アプリケーションシェル、モジュールの責務、状態管理、拡張性チェックリストを網羅したシステムレベルの概要。", - "ko": "애플리케이션 셸, 모듈 책임, 상태 관리 및 확장성 체크리스트를 다루는 시스템 수준 개요.", - "fr": "Vue d'ensemble au niveau du système couvrant le shell de l'application, les responsabilités des modules, la gestion de l'état et la liste de contrôle d'extensibilité.", - "ru": "Обзор на системном уровне, охватывающий оболочку приложения, обязанности модулей, управление состоянием и контрольный список расширяемости.", - "de": "Systemübergreifende Übersicht über die Anwendungs-Shell, Modulverantwortlichkeiten, Zustandsverwaltung und eine Checkliste für die Erweiterbarkeit." - }, - "tags": [ - "architecture", - "state-management", - "websocket" - ], - "basename": "Frontend Development Guide" - }, - { - "id": "internal-settings", - "category": "getting-started", - "title": { - "en": "Internal Settings (First Use)", - "zh": "首次使用必看:游戏内设置说明", - "ja": "ゲーム内設定(初回必須)", - "ko": "게임 내 설정 (최초 사용 필독)", - "fr": "Paramètres internes (Première utilisation)", - "ru": "Внутренние настройки (обязательно при первом использовании)", - "de": "Interne Einstellungen (Erste Verwendung)" - }, - "summary": { - "en": "Mandatory in-game configuration checklist that must be completed before running automation.", - "zh": "首次运行自动化脚本前必须完成的游戏内设置清单。", - "ja": "自動化を実行する前に完了する必要がある、必須のゲーム内設定チェックリスト。", - "ko": "자동화를 실행하기 전에 완료해야 하는 필수 게임 내 설정 체크리스트.", - "fr": "Liste de contrôle de configuration obligatoire en jeu à compléter avant d'exécuter l'automatisation.", - "ru": "Обязательный список настроек в игре, который необходимо выполнить перед запуском автоматизации.", - "de": "Obligatorische Checkliste für die Konfiguration im Spiel, die vor dem Ausführen der Automatisierung abgeschlossen werden muss." - }, - "tags": [ - "setup", - "prerequisite" - ], - "basename": "Internal settings in BlueArchive game (first-use must read)" - }, - { - "id": "emulator-adb", - "category": "environment", - "title": { - "en": "Common Emulator ADB Addresses", - "zh": "常用模拟器 ADB 地址", - "ja": "一般的なエミュレータのADBアドレス", - "ko": "일반적인 에뮬레이터 ADB 주소", - "fr": "Adresses ADB courantes des émulateurs", - "ru": "Распространенные ADB-адреса эмуляторов", - "de": "Gängige Emulator-ADB-Adressen" - }, - "summary": { - "en": "Reference table for ADB host/port values across popular Android emulators.", - "zh": "各类常见安卓模拟器的 ADB 主机与端口速查表。", - "ja": "一般的なAndroidエミュレータにおけるADBホスト/ポート値の参照表。", - "ko": "널리 사용되는 안드로이드 에뮬레이터의 ADB 호스트/포트 값 참조 테이블.", - "fr": "Tableau de référence pour les valeurs d'hôte/port ADB des émulateurs Android populaires.", - "ru": "Справочная таблица значений хоста/порта ADB для популярных эмуляторов Android.", - "de": "Referenztabelle für ADB-Host-/Port-Werte für gängige Android-Emulatoren." - }, - "tags": [ - "environment", - "adb", - "emulator" - ], - "basename": "Commonly used emulator adb address" - }, - { - "id": "auto-clear-mainline", - "category": "configuration", - "title": { - "en": "Auto Clear Mainline Plot", - "zh": "主线剧情自动清理设置", - "ja": "メインストーリーの自動クリア設定", - "ko": "메인 스토리 자동 클리어 설정", - "fr": "Configuration de la suppression automatique de la trame principale", - "ru": "Настройки автоматической зачистки основной сюжетной линии", - "de": "Einstellungen für das automatische Abschließen der Hauptstory" - }, - "summary": { - "en": "Detailed walkthrough for configuring automated main story clearing.", - "zh": "主线剧情自动清理的完整配置步骤与注意事项。", - "ja": "メインストーリーの自動クリアを設定するための詳細な手順。", - "ko": "자동화된 메인 스토리 클리어를 구성하기 위한 상세한 안내.", - "fr": "Guide détaillé pour configurer le nettoyage automatique de l'histoire principale.", - "ru": "Подробное руководство по настройке автоматической зачистки основной сюжетной линии.", - "de": "Detaillierte Anleitung zur Konfiguration des automatischen Abschließens der Hauptstory." - }, - "tags": [ - "configuration", - "story", - "automation" - ], - "basename": "Auto clear mainline plot settings" - }, - { - "id": "normal-graphs", - "category": "configuration", - "title": { - "en": "Normal Stage Strategy", - "zh": "普通图说明", - "ja": "ノーマルステージ攻略", - "ko": "일반 스테이지 공략", - "fr": "Stratégie pour les niveaux normaux", - "ru": "Стратегия для обычных этапов", - "de": "Strategie für normale Stufen" - }, - "summary": { - "en": "Stage-specific notes, rewards, and recommended tactics for normal campaigns.", - "zh": "普通关卡的掉落、策略与推荐配置说明。", - "ja": "ノーマルキャンペーンのステージごとの注記、報酬、推奨戦術。", - "ko": "일반 캠페인에 대한 스테이지별 참고 사항, 보상 및 권장 전술.", - "fr": "Notes spécifiques aux niveaux, récompenses et tactiques recommandées pour les campagnes normales.", - "ru": "Примечания к этапам, награды и рекомендуемые тактики для обычных кампаний.", - "de": "Stufenspezifische Hinweise, Belohnungen und empfohlene Taktiken für normale Kampagnen." - }, - "tags": [ - "stages", - "normal", - "strategy" - ], - "basename": "Description of normal graphs" - }, - { - "id": "difficult-chart", - "category": "configuration", - "title": { - "en": "Hard Stage Configuration", - "zh": "困难图配置说明", - "ja": "ハードステージの設定", - "ko": "하드 스테이지 설정", - "fr": "Configuration des niveaux difficiles", - "ru": "Настройка сложных этапов", - "de": "Konfiguration für schwere Stufen" - }, - "summary": { - "en": "How to prepare auto-farming for hard stages, including team composition and retry rules.", - "zh": "困难图自动扫荡的准备流程、编队搭配与重试策略。", - "ja": "チーム編成やリトライのルールなど、ハードステージの自動周回の準備方法。", - "ko": "팀 구성 및 재시도 규칙을 포함하여 하드 스테이지 자동 파밍을 준비하는 방법.", - "fr": "Comment préparer le farm automatique pour les niveaux difficiles, y compris la composition de l'équipe et les règles de nouvelle tentative.", - "ru": "Как подготовиться к авто-фарму на сложных этапах, включая состав команды и правила повторных попыток.", - "de": "Wie man das Auto-Farming für schwere Stufen vorbereitet, einschließlich Teamzusammenstellung und Wiederholungsregeln." - }, - "tags": [ - "stages", - "hard", - "strategy" - ], - "basename": "Difficult Chart Configuration Description" - }, - { - "id": "activity-sweep", - "category": "operations", - "title": { - "en": "Activity Sweep Guide", - "zh": "活动扫荡填写指南", - "ja": "イベント掃討ガイド", - "ko": "이벤트 소탕 가이드", - "fr": "Guide de balayage d'activité", - "ru": "Руководство по зачистке событий", - "de": "Leitfaden zur Aktivitäts-Säuberung" - }, - "summary": { - "en": "Templates for configuring event sweep parameters and monitoring resource usage.", - "zh": "活动扫荡参数填写示例与资源消耗监控建议。", - "ja": "イベント掃討パラメータの設定テンプレートとリソース使用状況の監視。", - "ko": "이벤트 소탕 매개변수 구성 및 자원 사용량 모니터링을 위한 템플릿.", - "fr": "Modèles pour configurer les paramètres de balayage d'événements et surveiller l'utilisation des ressources.", - "ru": "Шаблоны для настройки параметров зачистки событий и мониторинга использования ресурсов.", - "de": "Vorlagen zur Konfiguration von Event-Sweep-Parametern und zur Überwachung des Ressourcenverbrauchs." - }, - "tags": [ - "events", - "operations" - ], - "basename": "Guide for activity sweep fill in" - }, - { - "id": "normal-sweep", - "category": "operations", - "title": { - "en": "Normal Sweep Scanning", - "zh": "普通扫荡扫描说明", - "ja": "通常掃討スキャン", - "ko": "일반 소탕 스캔", - "fr": "Balayage normal", - "ru": "Сканирование при обычной зачистке", - "de": "Normales Scannen beim Sweepen" - }, - "summary": { - "en": "Explains the scanning workflow and optimisation points for daily sweeps.", - "zh": "日常扫荡的扫描流程及优化要点。", - "ja": "日常掃討のスキャンワークフローと最適化ポイントについて説明します。", - "ko": "일일 소탕을 위한 스캔 워크플로우 및 최적화 지점을 설명합니다.", - "fr": "Explique le flux de travail de numérisation et les points d'optimisation pour les balayages quotidiens.", - "ru": "Объясняет рабочий процесс сканирования и точки оптимизации для ежедневных зачисток.", - "de": "Erklärt den Scan-Workflow und die Optimierungspunkte für tägliche Sweeps." - }, - "tags": [ - "daily", - "operations" - ], - "basename": "Normal Sweeping Scanning Description" - }, - { - "id": "reporting-guidelines", - "category": "support", - "title": { - "en": "Issue Reporting Guidelines", - "zh": "问题反馈指南", - "ja": "問題報告ガイドライン", - "ko": "문제 보고 가이드라인", - "fr": "Directives pour le signalement de problèmes", - "ru": "Руководство по сообщению о проблемах", - "de": "Richtlinien für die Meldung von Problemen" - }, - "summary": { - "en": "Defines the canonical process for logging defects, required evidence, and escalation path.", - "zh": "规范问题反馈流程、所需证据及升级路径。", - "ja": "不具合の記録、必要な証拠、エスカレーションパスに関する正式なプロセスを定義します。", - "ko": "결함 기록, 필요한 증거 및 에스컬레이션 경로에 대한 표준 프로세스를 정의합니다.", - "fr": "Définit le processus canonique pour consigner les défauts, les preuves requises et le chemin d'escalade.", - "ru": "Определяет канонический процесс регистрации дефектов, необходимые доказательства и путь эскалации.", - "de": "Definiert den kanonischen Prozess zur Protokollierung von Fehlern, die erforderlichen Nachweise und den Eskalationspfad." - }, - "tags": [ - "support", - "qa" - ], - "basename": "reporting guidelines on issues (important)" - }, - { - "id": "scheduling-guide", - "category": "configuration", - "title": { - "en": "Scheduling Configuration Guide", - "zh": "调度配置填写指南", - "ja": "スケジュール設定ガイド", - "ko": "스케줄링 설정 가이드", - "fr": "Guide de configuration de la planification", - "ru": "Руководство по настройке планировщика", - "de": "Anleitung zur Planungskonfiguration" - }, - "summary": { - "en": "Explains every scheduling field and how they map to automation behaviour.", - "zh": "逐项说明调度配置字段及其在自动化中的行为。", - "ja": "すべてのスケジュールフィールドと、それらが自動化の動作にどのようにマッピングされるかを説明します。", - "ko": "모든 스케줄링 필드와 그것들이 자동화 동작에 어떻게 매핑되는지 설명합니다。", - "fr": "Explique chaque champ de planification et comment ils correspondent au comportement de l'automatisation.", - "ru": "Объясняет каждое поле планирования и как они соотносятся с поведением автоматизации.", - "de": "Erklärt jedes Planungsfeld und wie es sich auf das Automatisierungsverhalten auswirkt." - }, - "tags": [ - "scheduler", - "configuration" - ], - "basename": "Scheduling Configuration Filling Guide" - }, - { - "id": "task-force-attributes", - "category": "formation", - "title": { - "en": "Task Force Attributes by Region", - "zh": "各区域所需编队属性", - "ja": "地域別の部隊属性", - "ko": "지역별 부대 속성", - "fr": "Attributs des équipes par région", - "ru": "Атрибуты отрядов по регионам", - "de": "Team-Attribute nach Region" - }, - "summary": { - "en": "Attribute requirements and recommended squads per combat region.", - "zh": "各作战区域的编队属性需求与推荐队伍。", - "ja": "各戦闘地域ごとの属性要件と推奨部隊。", - "ko": "각 전투 지역별 속성 요구 사항 및 추천 분대.", - "fr": "Exigences d'attributs et escouades recommandées par région de combat.", - "ru": "Требования к атрибутам и рекомендуемые отряды для каждого боевого региона.", - "de": "Attributanforderungen und empfohlene Trupps pro Kampfregion." - }, - "tags": [ - "formation", - "strategy" - ], - "basename": "Task force attributes required by region" - } -] \ No newline at end of file diff --git a/service/dist/docs/entry.json.br b/service/dist/docs/entry.json.br deleted file mode 100644 index ac8ae36e62f1e0535d79b740875f9bdced62474c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5361 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 ⚠️ **Si vous utilisez BlueStacks**, assurez-vous que la -> **fonction de débogage ADB** est activée dans les paramètres. - ---- - -💡 *Astuce :* Ces ports servent à la connexion ADB entre votre PC et l’émulateur. -Si vous rencontrez des problèmes de connexion, vérifiez que l’option **débogage ADB** de l’émulateur est activée et qu’aucune autre instance n’utilise le même port. diff --git a/service/dist/docs/fr_FR/Description of normal graphs.md b/service/dist/docs/fr_FR/Description of normal graphs.md deleted file mode 100644 index f4c435cd6..000000000 --- a/service/dist/docs/fr_FR/Description of normal graphs.md +++ /dev/null @@ -1,111 +0,0 @@ - -# 📊 Description des cartes normales - ---- - -## 🧩 1. Description d’utilisation - -### (1) Déblocage et combat automatique requis - -Vous **devez activer** : - -* 🟡 **Débloquer automatiquement les manches terminées** -* 🟡 **Combat automatique** - -> Le système détectera et activera automatiquement ces fonctions si possible. - ---- - -### (2) Niveaux pris en charge - -Niveaux principaux normaux pris en charge : -🟡 **4 – 25** - ---- - -### (3) Logique de mouvement - -Lorsque les diapositives BAAS sont fixées, tous les mouvements d’équipe sont exécutés en **un seul clic**. -Comme le nombre d’équipes dans *Blue Archive* varie, -les **coordonnées numérotées** et **l’ordre des mouvements** diffèrent selon la composition. - ---- - -### (4) Notes sur l’extrapolation automatique - -Lors de l’**extrapolation automatique**, -🟡 **assurez-vous que les équipes à petits numéros et à grands numéros sont correctement assignées.** -(En cas de doute, revérifiez la numérotation avant de continuer.) - ---- - -### (5) Paramètres des miniatures normales - -BAAS détermine les configurations en se basant sur : - -* 🟢 **< Paramètres des miniatures normales >** -* 🟢 **Propriétés du groupe sélectionné** -* 🟢 **♪ Logique d’équipe ♪** - -Ces éléments définissent la configuration correcte pour chaque diapositive. - -> La première propriété correspondante dans les diagrammes est **[1]**, la seconde **[2]**. - ---- - -## 🤖 2. Logique d’équipe - -1. Prioriser la sélection d’équipe selon les **relations de contre-attaque**. -2. Lors de la sélection : `4 - (numéro d’équipe) >= nombre d’équipes restantes requises`. -3. Si les conditions (1) et (2) échouent, réduire progressivement les contraintes entre homologues [1]. -4. Si certaines équipes sont déjà choisies et `4 - max(sélectionnées) >= restantes`, - compléter avec des **numéros optionnels**. -5. Sinon, par défaut : **équipes 1, 2, 3**. - ---- - -### 🧠 Exemple - -Ordre de sélection pour **23 [Explosion, Croisement] Task Force** : - -* Une équipe, une opération. -* Si *Équipe Explosion 3* n’est pas choisie, sélectionner **4** en second. -* Sinon, **12** en dernier. - ---- - -## 🚀 3. Description du niveau de progression des cartes normales - -### (1) Comportement de progression - -Si vous rencontrez -🟡 **« Impossible de fermer le dossier temporaire : %s »**, -chaque nombre représente une **zone à parcourir**. -Le programme vérifie si chaque niveau doit être rejoué selon le score `SSS`. - -**Exemple :** - -```text -15, 16, 14 -``` - -Signifie : **15 → 16 → 14** séquentiellement. - ---- - -### (2) Configuration des coups obligatoires - -Si 🟡 **Activer les coups obligatoires** est activé : - -* Un seul nombre → parcourir toute la zone. -* `nombre-nombre` → sous-niveau exact. - -**Exemple :** - -```text -15, 16-3 -``` - ---- - -✅ *Astuce :* Vérifiez toujours la numérotation et les équipes avant d’exécuter les scripts automatiques BAAS. diff --git a/service/dist/docs/fr_FR/Difficult Chart Configuration Description.md b/service/dist/docs/fr_FR/Difficult Chart Configuration Description.md deleted file mode 100644 index fcde343b7..000000000 --- a/service/dist/docs/fr_FR/Difficult Chart Configuration Description.md +++ /dev/null @@ -1,103 +0,0 @@ - -# 💀 Guide d’utilisation des cartes de difficulté - -La **carte de difficulté** fonctionne de manière similaire aux modes **Logique d’équipe** et **Carte normale**. -Certaines cartes difficiles nécessitent **trois équipes**, partageant toutes **le même attribut** que la première équipe assignée à cette région. - ---- - -## 🧾 Instructions de remplissage - -### ⚠️ Caractères autorisés - -La **chaîne** que vous saisissez pour le niveau de la diapositive **ne doit contenir aucun caractère ou mot autre que** : - -``` -"-", "sss", "present", "task", ",", [nombres] -``` - -Chaque segment doit être **séparé par des virgules (`,`)**. - -> ❌ N’incluez **aucun mot-clé** comme `"sss"`, `"present"` ou `"task"` en dehors d’une syntaxe valide. - ---- - -### 🧩 Exemple 1 : Utilisation de base - -**Entrée :** - -``` -15,12-2 -``` - -**Interprétation :** - -BAAS exécutera les appels suivants : - -``` -15-1, 15-2, 15-3, 12-2 -``` - -et appliquera les paramètres de la **carte difficile** : - -* `sss` → évaluation du score maximal -* `present` → collecte des récompenses -* `task` → exécution des missions spéciales - ---- - -### 🧩 Exemple 2 : Nombre + chaîne - -**Entrée :** - -``` -15-sss-present -``` - -**Signification :** -BAAS exécutera le groupe de niveaux **15-1, 15-2, 15-3** -et réalisera à la fois l’évaluation `sss` (score maximal) et la collecte `present` (cadeaux). - ---- - -### 🧩 Exemple 3 : Deux nombres + mots-clés - -**Entrée :** - -``` -15-3-sss-task -``` - -**Signification :** -BAAS appellera **le niveau 15-3** pour : - -* obtenir la note `sss`, -* accomplir la mission `task`. - ---- - -### 🧩 Exemple 4 : Cas complexe - -**Entrée :** - -``` -7,8-sss,9-3-task -``` - -**Signification :** - -* Appelle `(7-1, 7-2, 7-3)` → réalise `sss`, collecte les cadeaux et accomplit les missions. -* Appelle `(8-1, 8-2, 8-3)` → réalise uniquement `sss`. -* Appelle `9-3` → accomplit la mission `task`. - ---- - -## 🧠 Comportement du système - -> 🟡 **Remarque :** -> BAAS détermine automatiquement si : -> -> * un niveau a déjà atteint **`sss`**, ou -> * un **cadeau (present)** a déjà été collecté. - -Si l’une de ces conditions est remplie, **le niveau sera ignoré automatiquement** afin d’optimiser le temps d’exécution. diff --git a/service/dist/docs/fr_FR/Frontend Development Guide.md b/service/dist/docs/fr_FR/Frontend Development Guide.md deleted file mode 100644 index f0bc94148..000000000 --- a/service/dist/docs/fr_FR/Frontend Development Guide.md +++ /dev/null @@ -1,101 +0,0 @@ - -# 🏗️ Guide de développement frontal - -Ce document décrit la structure de l’application de bureau **BAAS**, le flux de données entre les modules clients et le serveur, ainsi que les exigences opérationnelles lors de l’extension de la plateforme. -Il s’adresse aux **équipes d’ingénierie et de déploiement** nécessitant une référence standard lors de l’intégration ou du développement de nouvelles fonctionnalités. - ---- - -## 🧩 Structure de l’application - -L’application React est rendue via `App.tsx`. Elle relie le **ThemeProvider**, **AppProvider** et la structure persistante (`MainLayout`). -Les pages sont commutées à l’aide d’un **routeur framer-motion** léger qui garde les pages inactives montées pour préserver leur état lors du changement d’onglet. - -* **Point d’entrée :** `main.tsx` initialise i18n, le thème et rend ``. -* **Providers :** `AppProvider` charge les préférences UI, établit la connexion WebSocket, injecte le catalogue de profils et expose les fonctions via le contexte. -* **Mise en page :** `MainLayout` contient la barre latérale persistante (`Sidebar.tsx`) et l’en-tête (`Header.tsx`). - ---- - -## 🧱 Modules clés - -| Module | Responsabilité | Fichiers principaux | -| :------------------ | :-------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | -| **Context** | Partage les paramètres UI, le profil actif et le catalogue de profils. | `contexts/AppContext.tsx` | -| **State Stores** | Les magasins Zustand normalisent l’état distant (config, événements, statut, journaux). | `store/websocketStore.ts`, `store/globalLogStore.ts` | -| **Remote Services** | Encapsulent les interactions serveur (raccourcis, WebSocket chiffré). | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | -| **Pages** | Conteneurs de niveau route : `Home`, `Scheduler`, `Configuration`, `Settings`, `Wiki`. | `pages/*.tsx` | -| **Feature Forms** | Panneaux modulaires opérant sur un fragment de `DynamicConfig`. | `features/*Config.tsx`, `features/DailySweep.tsx` | -| **Shared UI** | Composants visuels réutilisables (entrées, sélecteurs, modales, journaux). | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | -| **Hooks** | Logique métier, incluant la gestion des raccourcis et du thème. | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | - ---- - -## 🔄 Vue d’ensemble du flux de données - -### 🔌 Initialisation du WebSocket - -1. `AppProvider` appelle `useWebSocketStore.getState().init()` au démarrage. -2. `init()` se connecte successivement aux canaux **heartbeat**, **provider** et **sync** via `SecureWebSocket`. -3. Une fois connecté, le store récupère les données statiques, les manifestes de configuration et les files d’événements. -4. Les setters diffusent les mises à jour aux composants abonnés via des sélecteurs Zustand. - ---- - -### ⚙️ Cycle de mise à jour de configuration - -1. Les formulaires fonctionnent sur une copie locale de `DynamicConfig`. -2. Lors de l’enregistrement, ils génèrent un objet `patch` minimal et appellent `modify(path, patch, showToast)`. -3. Le store envoie une commande `sync` avec sémantique JSON Patch et enregistre un callback. -4. Quand le backend confirme, le callback supprime l’état en attente et affiche une notification (`sonner`). -5. Les messages `config` entrants synchronisent le store local pour rafraîchir tous les abonnés. - ---- - -### 📡 Télémétrie du planificateur - -* Les pages **Home** et **Scheduler** s’abonnent à `statusStore` et `logStore` pour afficher les métriques d’exécution. -* Le pipeline de logs déduplique et copie les journaux dans `globalLogStore`. -* Toutes les commandes sortantes (démarrage, arrêt, patchs) sont horodatées pour faciliter la corrélation. - ---- - -### 🌐 Internationalisation - -Les traductions sont stockées dans `assets/locales/*.json` et chargées via `react-i18next`. -Langue par défaut : **chinois (`zh`)**, avec **anglais en secours**. -Le contenu est organisé par domaine (scheduler, artifact, etc.) pour simplifier la localisation. - ---- - -### ⚡ Performance et UX - -* **Préservation du montage** empêche la réinitialisation des composants lors du changement d’onglet. -* `useMemo` et `useCallback` limitent les re-rendus inutiles. -* Les zones de défilement utilisent des classes `scroll-embedded` pour un style uniforme. -* Les mises à jour en temps réel utilisent des setters Zustand groupés. - ---- - -### 🧰 Outils - -* **Build :** Vite + React 19 + TypeScript 5 -* **Style :** Tailwind CSS + composants réutilisables -* **Animations :** `framer-motion` (transitions), `ogl` (effets de particules) - ---- - -### 🚀 Extensibilité - -1. Créez ou mettez à jour un composant dans `features/` et reliez-le à `featureMap`. -2. Ajoutez les nouvelles étiquettes dans `en.json` et `zh.json`. -3. Persistez les communications serveur via `modify`, `patch`, ou `trigger`. -4. Exposez les réglages UI via `AppContext` si nécessaires. - ---- - -✅ *En suivant ce contrat, vous garantissez que :* - -* L’application reste **cohérente et extensible**. -* La **navigation au clavier** et la **synchronisation télémétrique** fonctionnent correctement. -* L’état **WebSocket** reste cohérent sur toutes les pages. diff --git a/service/dist/docs/fr_FR/Guide for activity sweep fill in.md b/service/dist/docs/fr_FR/Guide for activity sweep fill in.md deleted file mode 100644 index daabe77d0..000000000 --- a/service/dist/docs/fr_FR/Guide for activity sweep fill in.md +++ /dev/null @@ -1,53 +0,0 @@ - -# ⚔️ Guide de remplissage des paramètres de balayage d’activité - -Ce guide explique comment configurer correctement les **paramètres de balayage d’activité** pour l’automatisation BAAS. - ---- - -## 🧾 Balayer une seule mission - -**Paramètre :** -`Numéro de mission à balayer` - -* Type : **Entier** -* Plage : de `1` au *niveau de difficulté maximal* de l’activité actuelle. - -**Paramètre :** -`Nombre de balayages` - -1. **Entier** → indique le *nombre exact de balayages*. - Exemple : `3` signifie effectuer la mission 3 fois. -2. **Décimal** → indique un *pourcentage des points d’action (AP)* utilisés. - Exemple : `0.5` signifie utiliser **AP × 0,5** pour le balayage. -3. **Fraction** → indique une *fraction d’AP* à utiliser. - Exemple : `1/3` signifie utiliser **AP × (1/3)** pour le balayage. - ---- - -## 🔁 Balayer plusieurs missions - -Pour balayer plusieurs missions de suite, -séparez leurs numéros par des virgules (`,`). - -**Exemple :** - -``` -Mission : 9, 10, 11 -Nombre de balayages : 0.5, 3, 1/3 -AP : 999 -``` - -**Interprétation :** - -| Mission | Calcul | Résultat | -| :------ | :--------------- | :------- | -| **9** | (999 × 0.5) / 20 | 25 fois | -| **10** | Fixé à 3 | 3 fois | -| **11** | (999 × 1/3) / 20 | 16 fois | - -➡️ BAAS effectuera les balayages dans l’ordre : **9 → 10 → 11**. - ---- - -✅ *Astuce :* Vérifiez toujours que la valeur de vos **AP** correspond à l’endurance disponible avant d’exécuter plusieurs balayages. diff --git a/service/dist/docs/fr_FR/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/fr_FR/Internal settings in BlueArchive game (first-use must read).md deleted file mode 100644 index 930d57636..000000000 --- a/service/dist/docs/fr_FR/Internal settings in BlueArchive game (first-use must read).md +++ /dev/null @@ -1,30 +0,0 @@ - -# ⚙️ Fichiers Blanche — Paramètres internes du jeu - -Ce guide répertorie les **paramètres obligatoires** et **recommandés** à activer dans le jeu *Blue Archive* afin d’assurer le bon fonctionnement de **Blanche Files** avec le système d’automatisation BAAS. - ---- - -## 🧩 **Paramètres obligatoires** - -| Catégorie | Réglage | Valeur / Instruction | -| :-------------------------- | :---------------------------------- | :------------------------------------ | -| **Graphismes** | Fenêtre de texte en combat vertical | **Désactivée** | -| **Hall de souvenirs** | Sélection de personnage | **Ne pas choisir** Ako, Aru ou Wakamo | -| **Langue (serveur global)** | — | **Anglais** | - ---- - -## 💡 Sélections recommandées *(facultatives, sans impact sur l’exécution du script)* - -| Réglage | Valeur recommandée | -| :------------------------- | :----------------- | -| **Résolution** | La plus élevée | -| **FPS** | 60 | -| **Mode de rendu accéléré** | Compatibilité | -| **Post-traitement** | Activé | -| **Anticrénelage** | Activé | - ---- - -✅ *Astuce :* Maintenir une qualité graphique élevée permet une reconnaissance visuelle plus stable pour les tâches automatisées, même si ce n’est **pas obligatoire** pour une exécution correcte. diff --git a/service/dist/docs/fr_FR/Normal Sweeping Scanning Description.md b/service/dist/docs/fr_FR/Normal Sweeping Scanning Description.md deleted file mode 100644 index cbc9387d3..000000000 --- a/service/dist/docs/fr_FR/Normal Sweeping Scanning Description.md +++ /dev/null @@ -1,63 +0,0 @@ - -# 🧹 Guide de configuration du balayage normal - -Chaque **configuration de balayage** suit le format général suivant : - -``` -région - numéro_mission - nombre_balayages -``` - ---- - -## 🧩 Structure - -| Élément | Description | -| :------------------- | :------------------------------- | -| **Région** | Identifiant de la carte ou zone. | -| **Numéro mission** | Niveau ou étape à balayer. | -| **Nombre balayages** | Nombre d’exécutions du balayage. | - -Chaque configuration doit être **séparée par des virgules (`,`)**. - ---- - -## 🗺️ 1. Niveaux disponibles - -Toutes les cartes **postérieures à Académie 1 et Académie 5** sont prises en charge pour le balayage automatique. - -> 🟡 **Exemple valide :** -> -> ``` -> 12-1-3, 13-2-2, 14-4-1 -> ``` - ---- - -## ⚙️ 2. Description spéciale - -Sur le **serveur international**, -le champ `nombre_balayages` peut prendre le mot-clé **`max`**. - -* BAAS détermine automatiquement si le niveau peut être terminé, selon : - - * les **points d’action (AP)** actuels, - * la difficulté du niveau et son statut de complétion. - ---- - -### 🧮 Exemple - -Quand l’endurance est suffisante : - -``` -15-3, 20-3-max -``` - -**Signification :** - -* Balaye **15-3** trois fois. -* Puis balaye **20-3** jusqu’à épuisement de l’endurance (**max**). - ---- - -✅ *Astuce :* Utilisez `max` uniquement si vous souhaitez que BAAS consomme automatiquement toute l’endurance restante sur un niveau. Sinon, indiquez un nombre fixe pour garder le contrôle. diff --git a/service/dist/docs/fr_FR/Scheduling Configuration Filling Guide.md b/service/dist/docs/fr_FR/Scheduling Configuration Filling Guide.md deleted file mode 100644 index b80212eb8..000000000 --- a/service/dist/docs/fr_FR/Scheduling Configuration Filling Guide.md +++ /dev/null @@ -1,85 +0,0 @@ - -# 🕒 Guide de remplissage de la configuration de planification - -Ce guide explique comment remplir et interpréter correctement les champs de configuration de planification pour l’exécution automatique des tâches. - ---- - -## ⚙️ 1. Priorité - -Lorsque plusieurs tâches sont dans la file d’attente : - -* Les tâches avec une **valeur de priorité plus faible** s’exécutent **en premier**. - -> Exemple : -> La tâche A (priorité 1) sera exécutée avant la tâche B (priorité 2). - ---- - -## ⏳ 2. Intervalle d’exécution - -* **Entier `0`** → la tâche se répète **chaque jour** (intervalle d’un jour). -* Des entiers plus grands représentent des intervalles plus longs (en jours). - ---- - -## 🕐 3. Réinitialisation quotidienne - -Les tâches s’exécutent automatiquement à des heures fixes chaque jour. -Ceci peut être facilement défini dans la **nouvelle interface (New UI)**. - -**Format :** - -``` -[ [ h, m, s ] ] -``` - -*(Temps UTC)* - -Vous pouvez spécifier **plusieurs horaires**, séparés par des virgules. - -**Exemple :** - -``` -[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] -``` - -**Signification :** -S’exécute à **8 h et 16 h heure de Pékin (UTC +8)**. - ---- - -## 🚫 4. Périodes désactivées - -Les tâches **ne s’exécuteront pas** pendant les plages horaires spécifiées. -Elles peuvent aussi être définies facilement dans la **nouvelle interface (New UI)**. - -**Format :** - -``` -[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] -``` - -*(Temps UTC)* - -Vous pouvez définir **plusieurs périodes**, séparées par des virgules. - -**Exemple :** - -``` -[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] -``` - -**Signification :** -Les tâches sont désactivées pour **toute la journée**. - ---- - -## 🔁 5. Tâches préalables et ultérieures - -Vous pouvez enchaîner des opérations liées : - -* **Pré-tâches :** exécutées **avant** la tâche actuelle. -* **Post-tâches :** exécutées **après** la tâche actuelle. - -> Cela garantit que les actions dépendantes s’exécutent dans le bon ordre au sein du système de planification. diff --git a/service/dist/docs/fr_FR/Task force attributes required by region.md b/service/dist/docs/fr_FR/Task force attributes required by region.md deleted file mode 100644 index 951f66b18..000000000 --- a/service/dist/docs/fr_FR/Task force attributes required by region.md +++ /dev/null @@ -1,37 +0,0 @@ -# 🎯 Tableau de référence des attributs par région - -Ce tableau liste chaque zone et ses **deux attributs principaux**, affichés séparément pour plus de clarté. - -| Zone | Attribut ① | Attribut ② | -| :----- | :--------- | :--------- | -| **25** | Sonique | Perforant | -| **24** | Sonique | Explosif | -| **23** | Explosif | Perforant | -| **22** | Perforant | Mystique | -| **21** | Mystique | Explosif | -| **20** | Explosif | Perforant | -| **19** | Perforant | Mystique | -| **18** | Mystique | Explosif | -| **17** | Explosif | Perforant | -| **16** | Perforant | Mystique | -| **15** | Mystique | Mystique | -| **14** | Explosif | Mystique | -| **13** | Perforant | Perforant | -| **12** | Mystique | Explosif | -| **11** | Perforant | Mystique | -| **10** | Explosif | Mystique | -| **9** | Explosif | Perforant | -| **8** | Perforant | Perforant | -| **7** | Explosif | Explosif | -| **6** | Perforant | Perforant | -| **5** | Explosif | — | -| **4** | Perforant | — | -| **3** | Perforant | — | -| **2** | Explosif | — | -| **1** | Explosif | — | - ---- - -✅ *Astuce :* -Lors de la planification des combats, associez le **type d’attaque** de votre équipe à la **faiblesse** de l’ennemi. -Les zones à double attribut nécessitent généralement une **composition équilibrée** pour conserver la stabilité entre les sous-niveaux. diff --git a/service/dist/docs/fr_FR/reporting guidelines on issues (important).md b/service/dist/docs/fr_FR/reporting guidelines on issues (important).md deleted file mode 100644 index 0fe30c343..000000000 --- a/service/dist/docs/fr_FR/reporting guidelines on issues (important).md +++ /dev/null @@ -1,60 +0,0 @@ - -# 🧭 Guide de signalement et d’auto-diagnostic des problèmes - -Avant de soumettre un rapport, prenez un moment pour **réfléchir et vérifier** la liste suivante. -Cela permet de s’assurer que votre problème est clair, reproductible et facile à diagnostiquer. - ---- - -## 💡 Avant de signaler - -1. **Le problème s’est-il déjà produit auparavant ?** - Essayez d’abord de le résoudre vous-même — recherchez sur **Baidu** ou consultez la **documentation**. - - > Si cela ne fonctionne pas, vous pouvez alors le signaler. - -2. **Le problème survient-il à chaque exécution ?** - Cela aide à déterminer s’il s’agit d’un problème d’environnement ou d’un bug aléatoire. - -3. **Fournissez-vous suffisamment d’informations pour reproduire l’erreur ?** - Incluez les journaux, captures d’écran et paramètres pertinents. - -4. **Rendez votre rapport clair et agréable à lire.** - Un rapport bien mis en forme avec du texte coloré ou des captures (ex. dans le groupe QQ) incite davantage à l’aide. - ---- - -## 🎨 Type de problème et exigences du rapport - -*(🟡 Les éléments jaunes sont **obligatoires**)* - ---- - -### 🧱 « Je suis bloqué sur la page XXX ! » - -🟡 **(1)** Résolution du jeu en 1280×720 (par ex. *MuMu sur F9*). -(2) Fournissez une **capture du journal BAAS**. -(3) Essayez de changer de page pour voir si le blocage est spécifique. - ---- - -### 🧍 « Je ne peux pas bouger ! » - -(1) Répétez l’action une ou deux fois pour vérifier si le blocage se reproduit. -🟡 **(2)** Enregistrez une **vidéo complète** du démarrage jusqu’au blocage, -en montrant à la fois l’**émulateur** et l’**interface de journal BAAS** sur le même écran. - ---- - -### ⚙️ « J’ai configuré XXX mais rien ne s’exécute ! » - -ou -« Je n’ai pas configuré XXX mais ça s’exécute quand même ! » - -(1) Relisez attentivement les **instructions de configuration** pour vérifier que les paramètres sont corrects. -🟡 **(2)** Joignez des **captures d’écran de la configuration** et les **journaux du programme**. - ---- - -✅ *Astuce :* Un bon rapport doit permettre à une autre personne de **reproduire le problème sans deviner**. -Fournir des journaux, des captures et un contexte clair fait gagner du temps à tout le monde et accélère les correctifs. diff --git a/service/dist/docs/ja_JP/Auto clear mainline plot settings.md b/service/dist/docs/ja_JP/Auto clear mainline plot settings.md deleted file mode 100644 index 0c211b931..000000000 --- a/service/dist/docs/ja_JP/Auto clear mainline plot settings.md +++ /dev/null @@ -1,46 +0,0 @@ - -# 🧩 メインストーリー自動クリア設定 - -### 🎮 オートプレイとバトルに関する注意 - -**オートプレイ**を有効にすると、ストーリーのマスを自動で進行できます。 -ただし、**最終章の一部のバトルは自動戦闘に対応していません。** - ---- - -### 📘 エピソード番号対応表 - -| 番号 | エピソード名 | -| :-: | :------------ | -| 1 | Episode I | -| 2 | Episode II | -| 3 | Episode III | -| 4 | Episode IV | -| 5 | Final Episode | -| 6 | Episode V | - ---- - -### 🔢 入力形式 - -クリアしたいエピソード番号を「,(カンマ)」で区切って入力します。 - -**例:** - -```text -1,2,3 -``` - -これは **Episode I → Episode II → Episode III** の順に自動で進行することを意味します。 - ---- - -### ⚙️ デフォルト設定 - -入力欄を空のまま **「Run」** をクリックすると、以下のデフォルト順が使用されます。 - -| 地域 | デフォルトのエピソード | -| :----- | :-------------- | -| CN | `1,2,3,4` | -| Global | `1,2,3,4,5,4` | -| JP | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/ja_JP/Commonly used emulator adb address.md b/service/dist/docs/ja_JP/Commonly used emulator adb address.md deleted file mode 100644 index 65441ed58..000000000 --- a/service/dist/docs/ja_JP/Commonly used emulator adb address.md +++ /dev/null @@ -1,28 +0,0 @@ - -# Commonly used emulator adb address.md - -# 🧠 エミュレーターADBポート参照 - -### ⚙️ 一般注意 - -**複数インスタンス(Stimulatorなど)** を使用している場合は、各自で設定を確認してください。 - ---- - -### 🎮 代表的なエミュレーターのポート一覧 - -| エミュレーター | ポート番号 | -| :------------------------ | :--------------- | -| **MuMu** | `7555` | -| **BlueStacks / LDPlayer** | `5555` | -| **NoxPlayer** | `62001`, `59865` | -| **MuMu 12** | `16384` | -| **MEmuPlay** | `21503` | - -> ⚠️ **BlueStacks**を使用する場合は、設定内で**ADBポートデバッグ機能**を有効にしてください。 - ---- - -💡 **ヒント:** - -これらのポートはPCとエミュレーター間のADB接続に使用されます。接続エラーが発生した場合は、**ADBデバッグオプション**がオンになっているか、同一ポートを他のインスタンスが占有していないかを確認してください。 diff --git a/service/dist/docs/ja_JP/Description of normal graphs.md b/service/dist/docs/ja_JP/Description of normal graphs.md deleted file mode 100644 index 4d640c87d..000000000 --- a/service/dist/docs/ja_JP/Description of normal graphs.md +++ /dev/null @@ -1,112 +0,0 @@ - -# 📊 ノーマルマップ設定説明 - ---- - -## 🧩 1. 使用説明 - -### (1) 自動戦闘およびラウンド終了の設定 - -以下の2つを**必ず有効化**してください: - -* 🟡 **ラウンド自動終了を解除** -* 🟡 **自動戦闘** - -> システムは可能な場合、自動的にこれらの設定を有効にします。 - ---- - -### (2) 対応ステージ範囲 - -対応する通常ステージ: -🟡 **4 – 25** - ---- - -### (3) 移動ロジック - -BAASのスライドが固定されると、全チームの移動は**ワンクリック操作**で実行されます。 -『ブルーアーカイブ』ではチーム数が異なるため、 -**番号座標**や**移動順序**はチーム構成によって変化します。 - ---- - -### (4) 自動推定に関する注意 - -**自動推定**を行う際は、 -🟡 **チーム番号の大小が正しく対応していること**を確認してください。 -(不明な場合はチーム番号を再確認してから進めてください。) - ---- - -### (5) ノーマルサムネイル設定 - -BAASは以下に基づいて設定を判断します: - -* 🟢 **<ノーマルサムネイル設定>** -* 🟢 **選択されたグループ属性** -* 🟢 **♪ チームロジック ♪** - -これらにより、各スライドの最適な設定が決定されます。 - -> 図中の最初の対応要素は **[1]**、2番目は **[2]** です。 - ---- - -## 🤖 2. チームロジック - -1. **有利属性**を優先し、残りの敵に対しては徐々に属性依存度を下げる。 -2. チーム選択時: - `4 - (チーム番号) >= 残り必要チーム数` -3. (1)(2)が満たされない場合、対応関係[1]の優先度を下げる。 -4. 一部チームが選択済みで `4 - max(選択チーム) >= 残り数` の場合、残りを任意番号で補完。 -5. すべての条件に該当しない場合、デフォルトで **チーム1, 2, 3** を使用。 - ---- - -### 🧠 例 - -**23【爆発・交差】タスクフォース**の場合: - -* 一回の操作で一チーム。 -* 既定順で「爆発チーム3」が未選択なら、2番目に**4**を選択。 -* それでも無効なら最終的に**12**を使用。 - ---- - -## 🚀 3. ノーマルマップ進行設定 - -### (1) エリア進行動作 - -もし -🟡 **「一時フォルダを閉じられません:%s」** -と表示された場合、入力された番号は**進行するエリア番号**を意味します。 -各エリア内のレベルが`SSS`評価に達しているかどうかで再挑戦を判断します。 - -**例:** - -```text -15,16,14 -``` - -→ **15 → 16 → 14** の順に進行します。 - ---- - -### (2) 強制挑戦設定 - -🟡 **「指定ステージごとに強制挑戦を有効化」** をオンにした場合: - -* 単一番号 → 該当エリアを一度進行 -* `番号-番号` → サブステージを指定 - -**例:** - -```text -15,16-3 -``` - ---- - -✅ **ヒント:** -自動化スクリプトを実行する前に、ステージ番号とチーム設定が**BAAS設定**と一致しているか確認してください。 diff --git a/service/dist/docs/ja_JP/Difficult Chart Configuration Description.md b/service/dist/docs/ja_JP/Difficult Chart Configuration Description.md deleted file mode 100644 index 2b6afbad3..000000000 --- a/service/dist/docs/ja_JP/Difficult Chart Configuration Description.md +++ /dev/null @@ -1,102 +0,0 @@ - -# 💀 高難度マップ使用ガイド - -**高難度マップ(Hardship Map)**は、**チームロジック**および**ノーマルマップ構成**と類似した動作原理を持ちます。 -一部の高難度マップでは**3チーム**を必要とし、それらのチームはすべて**最初に設定されたチームと同じ属性**で統一される必要があります。 - ---- - -## 🧾 入力要領 - -### ⚠️ 使用可能な文字 - -スライドのステージ指定に使用できる文字列は、以下に限定されます: - -``` -"-", "sss", "present", "task", ",", [数字] -``` - -各セグメントは**カンマ(`,`)で区切る**必要があります。 - -> ❌ `"sss"`, `"present"`, `"task"` などのキーワードを不正な位置に含めないでください。 - ---- - -### 🧩 例1:基本的な使用法 - -**入力:** - -``` -15,12-2 -``` - -**解釈:** -BAASは以下のコールを実行します: - -``` -15-1, 15-2, 15-3, 12-2 -``` - -そして「高難度マップ設定」に従い以下を実施します: - -* `sss` → 星評価の判定 -* `present` → 報酬の受け取り -* `task` → 任務の実行 - ---- - -### 🧩 例2:数字+キーワード - -**入力:** - -``` -15-sss-present -``` - -**意味:** -BAASはレベル **15-1, 15-2, 15-3** を順に実行し、 -`sss`(星評価)および `present`(報酬受取)を同時に行います。 - ---- - -### 🧩 例3:二つの数字+キーワード - -**入力:** - -``` -15-3-sss-task -``` - -**意味:** -BAASは **15-3** ステージを呼び出し、 - -* `sss` 評価を達成し、 -* `task` 任務を実行します。 - ---- - -### 🧩 例4:複合ケース - -**入力:** - -``` -7,8-sss,9-3-task -``` - -**意味:** - -* `(7-1, 7-2, 7-3)` → `sss`評価、報酬受取、任務実行 -* `(8-1, 8-2, 8-3)` → `sss`評価のみ -* `9-3` → 任務実行 - ---- - -## 🧠 システム動作 - -> 🟡 **注意:** -> BAASは自動的に以下を判定します: -> -> * ステージがすでに **`sss`** 評価を達成しているか -> * **報酬** が受け取られているか - -いずれかが既に完了している場合、そのステージは**自動的にスキップ**され、処理効率が最適化されます。 diff --git a/service/dist/docs/ja_JP/Frontend Development Guide.md b/service/dist/docs/ja_JP/Frontend Development Guide.md deleted file mode 100644 index 67f70e516..000000000 --- a/service/dist/docs/ja_JP/Frontend Development Guide.md +++ /dev/null @@ -1,104 +0,0 @@ - -# 🏗️ フロントエンド開発ガイド - -このドキュメントでは、**BAASデスクトップアプリケーション**の構造、 -クライアントモジュールとバックエンド間のデータフロー、 -および拡張時の運用設計を説明します。 -対象読者は、**新機能の実装やシステム保守を担当するエンジニアチーム**です。 - ---- - -## 🧩 アプリケーション構成 - -Reactアプリは `App.tsx` でレンダリングされ、 -**ThemeProvider**、**AppProvider**、および永続レイアウト枠(`MainLayout`)が統合されています。 -軽量な **framer-motionルーター** によりページ切替時も状態を保持します。 - -* **エントリーポイント:** `main.tsx` — i18nとテーマ初期化後に `` を描画。 -* **プロバイダー:** `AppProvider` — UI設定、WebSocket接続、プロファイル一覧を管理。 -* **レイアウト:** `MainLayout` — サイドバー (`Sidebar.tsx`) とヘッダー (`Header.tsx`) を保持。 - ---- - -## 🧱 主要モジュール - -| モジュール | 役割 | 主なファイル | -| :------------------ | :------------------------------------------------------- | :------------------------------------------ | -| **Context** | UI設定・アクティブプロファイル共有 | `contexts/AppContext.tsx` | -| **State Stores** | Zustandによりリモート状態を正規化 | `store/websocketStore.ts` | -| **Remote Services** | バックエンドとの暗号通信/ホットキー設定保持 | `services/hotkeyService.ts` | -| **Pages** | `Home`・`Scheduler`・`Configuration`・`Settings`・`Wiki` ページ | `pages/*.tsx` | -| **Feature Forms** | 各機能設定パネル(DynamicConfigに基づく) | `features/*Config.tsx` | -| **Shared UI** | 入力、モーダル、ログなど共通コンポーネント群 | `components/ui` | -| **Hooks** | ビジネスロジック用カスタムフック | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | - ---- - -## 🔄 データフロー概要 - -### 🔌 WebSocket 初期化 - -1. `AppProvider` が起動時に `useWebSocketStore.getState().init()` を実行。 -2. `init()` は順に **heartbeat**, **provider**, **sync** チャンネルを接続。 -3. 接続完了後、設定マニフェストとライブイベントキューを取得。 -4. Zustandのサブスクライバーが更新を受信。 - ---- - -### ⚙️ 設定更新サイクル - -1. 設定フォームは `DynamicConfig` のローカルコピーを操作。 -2. 保存時、変更差分をJSONパッチ形式で送信。 -3. バックエンド確認後、`pendingCallbacks` がクリアされUI更新。 -4. 新しい `config` メッセージによりローカル状態を同期。 - ---- - -### 📡 スケジューラーテレメトリ - -* `Home` および `Scheduler` ページは `statusStore` と `logStore` を購読。 -* ログは重複を排除して `globalLogStore` に反映。 -* すべてのコマンドにはタイムスタンプが付与され、同期を容易に。 - ---- - -## ⚙️ 横断的関心事項 - -### 🌐 国際化(i18n) - -翻訳は `assets/locales/*.json` に格納され、`react-i18next` によりロード。 -既定言語は **中国語(zh)**、フォールバックは **英語**。 - ---- - -### ⚡ パフォーマンスとUX - -* ページ保持により再マウントを防止。 -* `useMemo` / `useCallback` により再描画最小化。 -* スクロール領域は統一クラス `scroll-embedded` を使用。 -* Zustandのバッチ更新で高頻度ログを効率的に処理。 - ---- - -### 🧰 使用技術 - -* **ビルド:** Vite + React 19 + TypeScript 5 -* **スタイル:** Tailwind CSS + カスタムトークン -* **アニメーション:** framer-motion, ogl(粒子効果) - ---- - -## 🚀 拡張手順チェックリスト - -1. `features/` 内に新機能コンポーネントを作成し、`featureMap` に登録。 -2. 翻訳辞書(`en.json`, `zh.json`)に新項目を追加。 -3. `modify` / `patch` / `trigger` 経由で一貫した通信処理を実装。 -4. UI設定項目は必要に応じて `AppContext` に公開。 - ---- - -この方針に従うことで: - -* アプリケーションの**一貫性と拡張性**を保持。 -* **キーボード操作**と**テレメトリ同期**が正確に機能。 -* すべてのページ間で**WebSocket状態が整合的**に保たれます。 diff --git a/service/dist/docs/ja_JP/Guide for activity sweep fill in.md b/service/dist/docs/ja_JP/Guide for activity sweep fill in.md deleted file mode 100644 index bebc8fb61..000000000 --- a/service/dist/docs/ja_JP/Guide for activity sweep fill in.md +++ /dev/null @@ -1,50 +0,0 @@ - -# ⚔️ アクティビティ掃討設定ガイド - -このガイドでは、BAAS自動化用の**アクティビティ掃討パラメータ**の正しい入力方法を説明します。 - ---- - -## 🧾 単一クエスト掃討 - -**パラメータ:** -`掃討クエスト番号` - -* 型:**整数** -* 範囲:`1` ~ 現在アクティビティの最大難易度まで - -**パラメータ:** -`掃討回数` - -1. **整数値** → 明示的な回数(例:`3` → 3回実行) -2. **小数値** → 現在のAP(スタミナ)に対する割合(例:`0.5` → APの半分を使用) -3. **分数値** → APの分割使用(例:`1/3` → APの1/3を使用) - ---- - -## 🔁 複数クエストの連続掃討 - -複数のクエストを順に掃討する場合、 -クエスト番号をカンマ(`,`)で区切って指定します。 - -**例:** - -``` -掃討クエスト: 9, 10, 11 -掃討回数: 0.5, 3, 1/3 -AP: 999 -``` - -**解釈:** - -| クエスト | 計算式 | 結果 | -| :----- | :--------------- | :-- | -| **9** | (999 × 0.5) / 20 | 25回 | -| **10** | 固定3回 | 3回 | -| **11** | (999 × 1/3) / 20 | 16回 | - -➡️ 実行順序:**9 → 10 → 11** - ---- - -✅ **ヒント:** 実行前に、**ゲーム内のAP値**と設定値が一致していることを確認してください。 diff --git a/service/dist/docs/ja_JP/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/ja_JP/Internal settings in BlueArchive game (first-use must read).md deleted file mode 100644 index 7d2aa36bb..000000000 --- a/service/dist/docs/ja_JP/Internal settings in BlueArchive game (first-use must read).md +++ /dev/null @@ -1,31 +0,0 @@ - -# ⚙️ Blanche Files — ゲーム内設定ガイド(初回必読) - -本ガイドは、**BAAS自動化システム**と連携させるために必要な -**必須設定**および**推奨設定**を示します。 - ---- - -## 🧩 必須設定 - -| カテゴリ | 設定項目 | 値/指示 | -| :------------- | :------------- | :---------------------- | -| **グラフィック** | 縦画面バトルテキストボックス | **オフ** | -| **回想ロビー** | キャラ選択 | **Ako・Aru・Wakamoを選ばない** | -| **言語(グローバル版)** | — | **English** | - ---- - -## 💡 推奨設定(任意) - -| 設定 | 推奨値 | -| :----------- | :----- | -| **解像度** | 最高 | -| **FPS** | 60 | -| **描画モード** | 互換性モード | -| **ポストプロセス** | ON | -| **アンチエイリアス** | ON | - ---- - -✅ **ヒント:** 高画質設定は認識精度を安定させますが、動作安定性には必須ではありません。 diff --git a/service/dist/docs/ja_JP/Normal Sweeping Scanning Description.md b/service/dist/docs/ja_JP/Normal Sweeping Scanning Description.md deleted file mode 100644 index 4c75a3f37..000000000 --- a/service/dist/docs/ja_JP/Normal Sweeping Scanning Description.md +++ /dev/null @@ -1,64 +0,0 @@ - -# 🧹 掃討設定ガイド - -各**掃討設定**は以下の基本形式に従います: - -``` -地域番号 - ステージ番号 - 掃討回数 -``` - ---- - -## 🧩 構成要素 - -| 項目 | 説明 | -| :--------- | :----------- | -| **地域番号** | マップまたはエリア識別子 | -| **ステージ番号** | エリア内のステージ番号 | -| **掃討回数** | 掃討を実行する回数 | - -複数設定を入力する場合は、**カンマ(`,`)で区切ります**。 - ---- - -## 🗺️ 1. 掃討可能ステージ - -「アカデミー1」「アカデミー5」以降のすべてのマップで自動掃討が可能です。 - -> 🟡 **有効な入力例:** -> -> ``` -> 12-1-3, 13-2-2, 14-4-1 -> ``` - ---- - -## ⚙️ 2. 特殊設定 - -**国際サーバー版(Global)**では、`掃討回数` に特別キーワード **`max`** を使用できます。 - -BAASは以下を自動的に判断します: - -* 現在の**スタミナ(AP)残量** -* ステージの**難易度**および**クリア状況** - ---- - -### 🧮 例 - -スタミナが十分な場合: - -``` -15-3, 20-3-max -``` - -**意味:** - -* ステージ **15-3** を3回掃討 -* その後、**20-3** を残りのAPすべてで掃討(`max`) - ---- - -✅ **ヒント:** -`max` はスタミナをすべて使い切る掃討を行いたいときのみ使用し、 -一定回数で制御したい場合は具体的な数値を指定してください。 diff --git a/service/dist/docs/ja_JP/Scheduling Configuration Filling Guide.md b/service/dist/docs/ja_JP/Scheduling Configuration Filling Guide.md deleted file mode 100644 index a0232fd70..000000000 --- a/service/dist/docs/ja_JP/Scheduling Configuration Filling Guide.md +++ /dev/null @@ -1,84 +0,0 @@ - -# 🕒 スケジューリング設定入力ガイド - -このガイドでは、タスク自動実行のためのスケジューリング設定の正しい入力方法を説明します。 - ---- - -## ⚙️ 1. 優先度 (Priority) - -複数タスクがキュー内に存在する場合、 -**数値が小さいタスク**ほど**優先的に実行**されます。 - -> 例: -> タスクA(優先度1)は、タスクB(優先度2)より先に実行。 - ---- - -## ⏳ 2. 実行間隔 (Interval) - -* **整数値 `0`**:毎日(1日間隔)で繰り返し実行 -* **整数値が大きいほど**、実行間隔(日数)が長くなります。 - ---- - -## 🕐 3. 毎日リセット時間 (Daily Reset) - -指定時刻にタスクを自動実行します。 -新UI上で簡単に設定できます。 - -* **フォーマット:** - -``` -[ [ h, m, s ] ] -``` - -*(UTC時刻)* - -複数時刻を設定する場合は、カンマで区切ります。 - -**例:** - -``` -[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] -``` - -**意味:** -北京時間(UTC+8)では **午前8時** と **午後4時** に実行。 - ---- - -## 🚫 4. 実行禁止期間 (Disabled Periods) - -指定された時間帯ではタスクは**実行されません**。 -これも新UI上で設定可能です。 - -* **フォーマット:** - -``` -[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] -``` - -*(UTC時刻)* - -複数期間を設定する場合はカンマで区切ります。 - -**例:** - -``` -[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] -``` - -**意味:** -1日中すべての時間帯で実行を禁止。 - ---- - -## 🔁 5. 事前タスクと事後タスク (Pre / Post Tasks) - -タスク同士を連結できます。 - -* **Pre-tasks(事前タスク)**:現在のタスクの前に実行 -* **Post-tasks(事後タスク)**:現在のタスクの後に実行 - -> これにより、依存関係を保ちながら正しい順序でタスクを処理できます。 diff --git a/service/dist/docs/ja_JP/Task force attributes required by region.md b/service/dist/docs/ja_JP/Task force attributes required by region.md deleted file mode 100644 index 0a769a1c9..000000000 --- a/service/dist/docs/ja_JP/Task force attributes required by region.md +++ /dev/null @@ -1,40 +0,0 @@ - -# 🎯 ステージ別属性参照表 - -各ステージの主要な**2種類の属性**を一覧で示します。 - ---- - -| ステージ | 属性① | 属性② | -| :----: | :-- | :-- | -| **25** | 振動 | 貫通 | -| **24** | 振動 | 爆発 | -| **23** | 爆発 | 貫通 | -| **22** | 貫通 | 神秘 | -| **21** | 神秘 | 爆発 | -| **20** | 爆発 | 貫通 | -| **19** | 貫通 | 神秘 | -| **18** | 神秘 | 爆発 | -| **17** | 爆発 | 貫通 | -| **16** | 貫通 | 神秘 | -| **15** | 神秘 | 神秘 | -| **14** | 爆発 | 神秘 | -| **13** | 貫通 | 貫通 | -| **12** | 神秘 | 爆発 | -| **11** | 貫通 | 神秘 | -| **10** | 爆発 | 神秘 | -| **9** | 爆発 | 貫通 | -| **8** | 貫通 | 貫通 | -| **7** | 爆発 | 爆発 | -| **6** | 貫通 | 貫通 | -| **5** | 爆発 | — | -| **4** | 貫通 | — | -| **3** | 貫通 | — | -| **2** | 爆発 | — | -| **1** | 爆発 | — | - ---- - -✅ *ヒント:* -戦闘を計画する際は、チームの**攻撃属性**が敵の**弱点属性**と対応するように調整してください。 -属性が2つあるステージでは、**バランスの取れたチーム構成**が安定攻略に有効です。 diff --git a/service/dist/docs/ja_JP/reporting guidelines on issues (important).md b/service/dist/docs/ja_JP/reporting guidelines on issues (important).md deleted file mode 100644 index c05f84d56..000000000 --- a/service/dist/docs/ja_JP/reporting guidelines on issues (important).md +++ /dev/null @@ -1,65 +0,0 @@ - -# 🧭 不具合報告と自己診断ガイド - -報告を行う前に、以下のチェックリストを確認してください。 -これにより、問題の再現性が高く、他者が支援しやすくなります。 - ---- - -## 💡 報告前に確認すべきこと - -1. **同様の問題が以前にも発生したか?** - まず自分で確認・検索(Baiduやドキュメント参照)を行ってください。 - - > 解決できない場合のみ報告へ進みます。 - -2. **毎回同じ状況で発生するか?** - 一貫性があれば環境依存か一時的バグかを切り分け可能です。 - -3. **他人が再現できる情報を提供できるか?** - ログ・スクリーンショット・設定内容を必ず添付してください。 - -4. **読みやすく整理されているか?** - 色分けや整形されたログを提示すると、支援が受けやすくなります。 - ---- - -## 🎨 問題タイプ別の報告要件 - -*(🟡の項目は必須)* - ---- - -### 🧱 「ページXXXで固まりました!」 - -🟡 **(1)** 1280×720の解像度で発生時の画面(例:MuMuエミュレータF9キー) - -(2) **BAASログのスクリーンショット** - -(3) ページ切り替えでフリーズが限定的か確認 - ---- - -### 🧍 「キャラが動けません!」 - -(1) 同操作を1〜2回繰り返し、同じ箇所で再現するか確認。 - -🟡 **(2)** *起動~停止までの完全動画* を記録し、 -画面に**エミュレータとBAASログ**の両方が映るようにしてください。 - ---- - -### ⚙️ 「設定したのに実行されない!」 - -または -「設定していないのに勝手に実行された!」 - -(1) 設定説明を再読し、入力が正しいか確認。 - -🟡 **(2)** 設定画面とプログラムログの**スクリーンショット**を添付。 - ---- - -✅ **ヒント:** -他者が**推測なしで再現できる**報告が理想です。 -ログ・画像・背景情報を揃えることで、迅速かつ正確な対応が可能になります。 diff --git a/service/dist/docs/ko_KR/Auto clear mainline plot settings.md b/service/dist/docs/ko_KR/Auto clear mainline plot settings.md deleted file mode 100644 index a2b6b21c1..000000000 --- a/service/dist/docs/ko_KR/Auto clear mainline plot settings.md +++ /dev/null @@ -1,46 +0,0 @@ - -# 🧩 자동 클리어 메인 스토리 설정 - -### 🎮 자동 재생 및 전투 주의사항 - -**자동 재생**은 그리드를 **자동으로 이동**할 수 있게 도와줍니다. -하지만, **최종화 에피소드의 일부 전투는 자동으로 수행할 수 없습니다.** - ---- - -### 📘 에피소드 번호 체계 - -| 번호 | 에피소드 명 | -| :-: | :------------ | -| 1 | Episode I | -| 2 | Episode II | -| 3 | Episode III | -| 4 | Episode IV | -| 5 | Final Episode | -| 6 | Episode V | - ---- - -### 🔢 입력 형식 - -콤마(`,`)를 사용하여 클리어할 에피소드 번호들을 구분합니다. - -**예시:** - -```text -1,2,3 -``` - -이 입력은 스크립트가 순차적으로 **Episode I → Episode II → Episode III**를 클리어함을 의미합니다. - ---- - -### ⚙️ 기본 설정 - -입력란이 비어 있는 상태에서 **“실행(Run)”** 버튼을 누르면 기본 순서가 사용됩니다: - -| 지역 | 기본 에피소드 순서 | -| :----- | :-------------- | -| CN | `1,2,3,4` | -| Global | `1,2,3,4,5,4` | -| JP | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/ko_KR/Commonly used emulator adb address.md b/service/dist/docs/ko_KR/Commonly used emulator adb address.md deleted file mode 100644 index 55729a3fb..000000000 --- a/service/dist/docs/ko_KR/Commonly used emulator adb address.md +++ /dev/null @@ -1,26 +0,0 @@ - -# 🧠 에뮬레이터 포트 참조 - -### ⚙️ 일반 주의 - -**Stimulator 다중 인스턴스**를 사용하는 경우, 설정은 직접 확인해 주세요. - ---- - -### 🎮 단일 에뮬레이터 포트 목록 - -| 에뮬레이터 | 포트 번호 | -| :------------------------ | :--------------- | -| **MuMu** | `7555` | -| **BlueStacks / LDPlayer** | `5555` | -| **NoxPlayer** | `62001`, `59865` | -| **MuMu 12** | `16384` | -| **MEmuPlay** | `21503` | - -> ⚠️ **BlueStacks를 사용할 경우**, -> 설정에서 **ADB 포트 디버그 기능**이 활성화되어 있는지 반드시 확인하세요. - ---- - -💡 *팁:* 이 포트들은 PC와 에뮬레이터 간의 ADB 연결에 사용됩니다. -연결 문제가 발생하면, 에뮬레이터의 **ADB 디버깅 옵션**이 켜져 있는지, 그리고 동일 포트를 사용하는 다른 에뮬레이터 인스턴스가 없는지 확인하세요. diff --git a/service/dist/docs/ko_KR/Description of normal graphs.md b/service/dist/docs/ko_KR/Description of normal graphs.md deleted file mode 100644 index ffc1cf11b..000000000 --- a/service/dist/docs/ko_KR/Description of normal graphs.md +++ /dev/null @@ -1,117 +0,0 @@ - -# 📊 일반 그래프 설명 - ---- - -## 🧩 1. 사용 설명 - -### (1) 잠금 해제 및 자동 전투 요구사항 - -다음 두 가지를 **반드시 활성화**해야 합니다: - -* 🟡 **자동으로 라운드 종료 잠금 해제** -* 🟡 **자동 전투 (Autofight)** - -> 시스템이 가능하다면 이 기능들을 자동으로 감지해 활성화합니다. - ---- - -### (2) 지원 레벨 - -지원하는 메인 스토리 일반 레벨 범위: -🟡 **4 ~ 25** - ---- - -### (3) 이동 로직 - -BAAS 슬라이드가 고정되면, 모든 팀 이동은 **한 번의 클릭**으로 실행됩니다. -*Blue Archive*의 슬라이드 내 팀 수가 다양하므로, -**번호 좌표**와 **이동 순서**는 팀 구성에 따라 달라질 수 있습니다. - ---- - -### (4) 자동 외삽(Extrapolation) 주의사항 - -**자동 외삽**을 수행할 때는 -🟡 **작은 번호 팀과 큰 번호 팀이 정확히 배치되어야 합니다.** -(확실치 않다면, 진행하기 전에 팀 번호를 다시 확인하세요.) - ---- - -### (5) 일반 썸네일 설정 - -BAAS는 다음 요소를 기준으로 구성값을 결정합니다: - -* 🟢 **< 일반 썸네일 설정 >** -* 🟢 **선택된 그룹 속성** -* 🟢 **♪ 팀 논리 ♪** - -이 요소들이 슬라이드마다 올바른 구성을 결정합니다. - -> 도식에서 첫 번째 대응 속성은 **[1]**, 두 번째는 **[2]**입니다. - ---- - -## 🤖 2. 팀 논리 - -1. **제약 관계(카운터 관계)**를 우선적으로 기준으로 팀을 선택하고, - 남은 상대에 대해서는 속성 일치 여부를 점진적으로 고려합니다. -2. 팀을 선택할 때: - `4 - (팀 번호) ≥ 필요한 나머지 팀 수` 이어야 합니다. -3. (1) 또는 (2) 조건이 만족되지 않을 경우, - [1] 대응군 간의 제약 관계를 점차 완화합니다. -4. 일부 팀이 이미 선택되었고 `4 - max(선택된 팀들) ≥ 남은 필요 팀 수`라면, - 나머지는 **선택 가능한 번호들**로 채웁니다. -5. 위 조건들 중 해당되는 것이 없으면, 기본 팀은 **팀 1, 2, 3**이 됩니다. - ---- - -### 🧠 예시 - -“23 [폭발, 교차] 특공대” 선택 순서: - -* 한 팀, 한 작전. -* 만약 *폭발팀 3*이 위 순서에서 선택되지 않았다면, 두 번째로 **4**를 선택합니다. -* 여전히 선택할 수 없다면, 최종적으로 **12**를 선택합니다. - ---- - -## 🚀 3. 일반 그래프 푸시 차트 레벨 설명 - -### (1) 구역 푸시 동작 - -다음 메시지가 나타날 경우: -🟡 **“임시 폴더를 닫을 수 없음: %s”**, -입력한 각 번호는 **푸시할 구역**을 의미합니다. -프로그램은 각 구역 내 레벨들이 `SSS` 등급에 도달했는지에 따라 -재플레이 여부를 검사합니다. - -**예시:** - -```text -15, 16, 14 -``` - -이는 프로그램이 순차적으로 구역 **15 → 16 → 14**를 푸시함을 의미합니다. - ---- - -### (2) 필수 타격 구성 - -🟡 **각 지정 레벨에서 필수 타격 활성화** 옵션이 켜져 있으면: - -* 단일 번호 입력 → 해당 구역 전체를 한 번 푸시 -* `번호-서브번호` 입력 → 특정 하위 레벨 지정 - -**예시:** - -```text -15, 16-3 -``` - ---- - -✅ *팁:* 자동 스크립트를 실행하기 전에, -레벨 번호와 팀 배치가 당신의 **BAAS 구성**과 일치하는지 항상 확인하세요. -불일치하면 의도치 않은 동작이 발생할 수 있습니다. diff --git a/service/dist/docs/ko_KR/Difficult Chart Configuration Description.md b/service/dist/docs/ko_KR/Difficult Chart Configuration Description.md deleted file mode 100644 index 6bc505ad4..000000000 --- a/service/dist/docs/ko_KR/Difficult Chart Configuration Description.md +++ /dev/null @@ -1,105 +0,0 @@ - -# 💀 난도 지도 사용 안내 - -**난도 지도(Hardship Map)**는 **팀 논리** 및 **일반 모드**와 유사하게 작동합니다. -어떤 난도 지도는 **세 개의 팀**이 필요하며, -이들 모두는 해당 구역에 처음 할당된 팀과 동일한 **속성**을 공유해야 합니다. - ---- - -## 🧾 입력 방식 안내 - -### ⚠️ 허용 문자 - -슬라이드 레벨을 기입할 문자열에는 다음 문자 및 단어만 허용됩니다: - -``` -"-", "sss", "present", "task", ",", [숫자들] -``` - -각 구역은 **콤마(`,`)로 구분**되어야 합니다. - -> ❌ 올바른 구문 외에 `"sss"`, `"present"`, `"task"` 같은 키워드를 포함하지 마세요. - ---- - -### 🧩 예시 1: 기본 사용법 - -**입력:** - -```text -15,12-2 -``` - -**해석:** - -BAAS는 다음 호출을 수행합니다: - -```text -15-1, 15-2, 15-3, 12-2 -``` - -그리고 **난이도 지도 설정**에 따라 실행: - -* `sss` → 별 평가 -* `present` → 보상 수령 -* `task` → 도전 과제 수행 - ---- - -### 🧩 예시 2: 숫자 + 키워드 - -**입력:** - -```text -15-sss-present -``` - -**의미:** -레벨 그룹 **15-1, 15-2, 15-3**을 실행하며, -`sss` (별 평가) 및 `present` (보상 수령)를 수행합니다. - ---- - -### 🧩 예시 3: 두 숫자 + 키워드 - -**입력:** - -```text -15-3-sss-task -``` - -**의미:** -15-3 레벨을 호출해: - -* `sss` 등급 획득 -* `task` 도전 과제 완료 - ---- - -### 🧩 예시 4: 복합 입력 - -**입력:** - -``` -7,8-sss,9-3-task -``` - -**의미:** - -* `(7-1, 7-2, 7-3)` 실행 → `sss`, 보상 수령, 도전 과제 수행 -* `(8-1, 8-2, 8-3)` 실행 → `sss` -* `9-3` 실행 → 도전 과제 수행 - ---- - -## 🧠 시스템 동작 방식 - -> 🟡 **주의:** -> BAAS는 자동으로 다음을 판단합니다: -> -> * 레벨이 이미 **`sss` 등급**에 도달했는가 -> * **보상(present)**을 이미 수령했는가 - -이 조건 중 하나라도 충족되면, **해당 레벨은 자동으로 건너뜁니다**. -이로써 실행 시간을 최적화합니다. diff --git a/service/dist/docs/ko_KR/Frontend Development Guide.md b/service/dist/docs/ko_KR/Frontend Development Guide.md deleted file mode 100644 index 8de12e642..000000000 --- a/service/dist/docs/ko_KR/Frontend Development Guide.md +++ /dev/null @@ -1,111 +0,0 @@ - -# 🏗️ 프런트엔드 개발 가이드 - -이 문서는 **BAAS 데스크탑 애플리케이션**의 구조, 클라이언트 모듈과 백엔드 간 데이터 흐름, -그리고 플랫폼 기능 확장 시 기대 동작을 설명합니다. -엔지니어링 및 배포 팀이 온보딩하거나 기능을 구현할 때 참조할 수 있는 기준 문서입니다. - ---- - -## 🧩 애플리케이션 셸 구조 - -React 앱은 `App.tsx`를 통해 렌더링됩니다. -이곳에서 **ThemeProvider**, **AppProvider**, 지속 레이아웃 프레임(`MainLayout`)이 연결됩니다. -사용자는 가벼운 **framer-motion 라우터**를 통해 페이지를 전환하며, -비활성 페이지도 상태를 유지하면서 탭을 전환할 수 있습니다. - -* **진입점:** `main.tsx` — i18n, 테마를 초기화하고 ``을 렌더링 -* **Providers:** `AppProvider`는 UI 설정 로드, WebSocket 연결 설정, 프로필 카탈로그 주입, - 그리고 context를 통한 설정자(setter)를 노출 -* **레이아웃:** `MainLayout`은 지속되는 사이드바(`Sidebar.tsx`)와 헤더(`Header.tsx`)를 포함 - ---- - -## 🧱 주요 모듈 - -| 모듈명 | 책임 범위 | 주요 파일 경로 | -| :------------------ | :---------------------------------------------------------------------- | :-------------------------------------------------------------------------- | -| **Context** | UI 설정, 활성 프로필, 프로필 카탈로그를 앱 전반에 공유 | `contexts/AppContext.tsx` | -| **State Stores** | Zustand 상태 저장소가 원격 상태(config, 이벤트, 상태, 로그)을 정규화 | `store/websocketStore.ts`, `store/globalLogStore.ts` | -| **Remote Services** | 핫키 지속성, 암호화된 WebSocket 세션 등 백엔드 계약을 캡슐화 | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | -| **Pages** | `Home`, `Scheduler`, `Configuration`, `Settings`, `Wiki` 등의 페이지 레벨 컨테이너 | `pages/*.tsx` | -| **Feature Forms** | `DynamicConfig`의 일부를 다루는 구성 패널 모듈 | `features/*Config.tsx`, `features/DailySweep.tsx` | -| **Shared UI** | 재사용 가능한 시각 요소 및 구성 요소 (입력, 선택기, 모달, 로거 등) | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | -| **Hooks** | 비즈니스 로직 훅, 핫키 조율, 테마 처리 포함 | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | - ---- - -## 🔄 데이터 흐름 개요 - -### 🔌 WebSocket 초기화 - -1. `AppProvider`는 부팅 시 `useWebSocketStore.getState().init()`을 호출 -2. `init()`는 순차적으로 **heartbeat**, **provider**, **sync** 채널에 `SecureWebSocket`으로 연결 -3. 연결되면, 스토어는 정적 데이터, 구성 매니페스트, 실시간 이벤트 큐를 가져옴 -4. 스토어의 설정자(setter)는 Zustand 선택자를 통해 구독 컴포넌트에 업데이트를 방송 - ---- - -### ⚙️ 구성 업데이트 사이클 - -1. 기능 폼(form)은 `DynamicConfig`의 로컬 드래프트 복사본 위에서 작동 -2. 저장 시, 폼은 최소 `patch` 객체를 생성하고 `modify(path, patch, showToast)`를 호출 -3. 스토어는 JSON patch 방식의 `sync` 명령을 발행하고, - `pendingCallbacks`에 콜백을 등록 -4. 백엔드가 명령을 확인하면 콜백은 대기 상태를 해제하고, - 선택적으로 `sonner`로 토스트 알림을 표시 -5. 수신된 `config` 메시지는 로컬 스토어를 조정해 모든 구독자가 자동으로 새로 고침됨 - ---- - -### 📡 스케줄러 텔레메트리 - -* **Home** 및 **Scheduler** 페이지는 `statusStore` 및 `logStore`를 구독해 런타임 지표를 제공합니다 -* 로그 파이프라인은 중복 항목을 제거하고, 전역 로그를 `globalLogStore`에 미러링해 로딩 화면 터미널에 반영 -* 모든 발신 명령(start/stop triggers, patches 등)은 타임스탬프가 붙어 조정 및 동기화가 쉬워집니다 - ---- - -## ⚙️ 범용 고려사항 - -### 🌐 국제화(i18n) - -번역은 `assets/locales/*.json`에 저장되며 `react-i18next`를 통해 로드됩니다. -기본 언어는 **중국어 (`zh`)**, 보조 언어는 **영어**입니다. -UI 문구는 도메인별로 정리되어 있어 로컬라이제이션 업데이트가 간편합니다. - ---- - -### ⚡ 성능 및 사용자 경험 (UX) - -* **마운트 보존** 기능(예: `App.tsx`)은 탭 변경 시 비싼 컴포넌트 재초기화를 방지 -* 기능 폼은 `useMemo`, `useCallback`을 적용해 불필요한 리렌더링 최소화 -* 스크롤 구역은 `scroll-embedded` 유틸리티 클래스를 사용해 일관된 스타일 유지 -* 실시간 업데이트는 **배치된 Zustand 설정자**를 사용하며, - 로그 같은 대량 업데이트는 참조 변경을 줄이기 위해 비가변 방식으로 추가 - ---- - -### 🧰 도구 구성 - -* **빌드:** Vite + React 19 + TypeScript 5 -* **스타일링:** Tailwind CSS + 커스텀 토큰 + 재사용 UI 컴포넌트 -* **애니메이션:** `framer-motion` for 전환, `ogl` for 파티클 효과 - ---- - -## 🚀 확장성 체크리스트 - -1. `features/` 아래에 기능 컴포넌트를 새로 만들거나 업데이트하고, - `featureMap`에 연결 -2. `en.json` 및 `zh.json` 양쪽에 새로운 레이블에 대한 번역 사전에 항목 추가 -3. `modify`, `patch`, `trigger`를 통해 서버 통신을 유지해 일관된 확인 처리 -4. 사용자 설정 가능해야 할 UI 설정은 `AppContext`를 통해 노출 - ---- - -이를 따르면: - -* 애플리케이션은 **일관성과 확장성**을 유지 -* **키보드 네비게이션** 및 **텔레메트리 동기화**가 정상 작동 -* **WebSocket 상태**가 모든 페이지에 걸쳐 일관되게 유지됨 diff --git a/service/dist/docs/ko_KR/Guide for activity sweep fill in.md b/service/dist/docs/ko_KR/Guide for activity sweep fill in.md deleted file mode 100644 index eafa74706..000000000 --- a/service/dist/docs/ko_KR/Guide for activity sweep fill in.md +++ /dev/null @@ -1,53 +0,0 @@ - -# ⚔️ 활동(퀘스트) 스윕 입력 가이드 - -이 가이드는 BAAS 자동화에서 **활동 스윕 파라미터**를 올바르게 구성하는 방법을 설명합니다. - ---- - -## 🧾 단일 퀘스트 스윕 - -**파라미터:** -`Sweep Quest Number` - -* 타입: **정수 (Integer)** -* 범위: 현재 활동의 최대 난이도까지 (`1` ~ 최대 난이도) - -**파라미터:** -`Number of Sweeps` - -1. **정수** → 고정 스윕 횟수 - 예: `3`은 퀘스트를 3회 수행 -2. **소수** → 현재 AP의 비율 사용 - 예: `0.5`는 **AP × 0.5**만큼 사용 -3. **분수** → 분수 비율 사용 - 예: `1/3`은 **AP × (1/3)** 사용 - ---- - -## 🔁 복수 퀘스트 스윕 - -여러 퀘스트를 순차적으로 스윕하려면, -퀘스트 번호를 콤마(`,`)로 구분하여 입력하세요. - -**예시:** - -```text -Sweep Quest: 9, 10, 11 -Number of Sweeps: 0.5, 3, 1/3 -AP: 999 -``` - -**해석:** - -| 퀘스트 | 연산식 | 실행 횟수 | -| :----: | :--------------- | :---- | -| **9** | (999 × 0.5) / 20 | 25회 | -| **10** | 고정 3회 | 3회 | -| **11** | (999 × 1/3) / 20 | 16회 | - -➡️ BAAS는 이 퀘스트들을 순서대로 스윕합니다: 퀘스트 9 → 10 → 11 - ---- - -✅ *팁:* 멀티 스윕 실행 전에, **AP 값**이 실제 게임 내 스태미너와 일치하는지 반드시 확인하세요. diff --git a/service/dist/docs/ko_KR/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/ko_KR/Internal settings in BlueArchive game (first-use must read).md deleted file mode 100644 index a9634311e..000000000 --- a/service/dist/docs/ko_KR/Internal settings in BlueArchive game (first-use must read).md +++ /dev/null @@ -1,32 +0,0 @@ - -# ⚙️ Blanche 파일 — 게임 내부 설정 - -이 가이드는 **Blanche Files**와 BAAS 자동화 시스템이 정상적으로 작동하기 위해 -필수 및 권장 게임 내 설정을 정리합니다. - ---- - -## 🧩 **필수 설정** - -| 카테고리 | 설정 항목 | 값 / 지침 | -| :-------------------- | :-------------- | :------------------------- | -| **그래픽** | 세로 전투 화면 텍스트 상자 | **Off (끔)** | -| **회상 로비** | 캐릭터 선택 | **Ako, Aru, Wakamo** 선택 금지 | -| **언어 (Global 서버 기준)** | — | **English (영어)** | - ---- - -## 💡 권장 설정 (선택 사항, 스크립트 실행에는 필수 아님) - -| 설정 항목 | 권장 값 | -| :------------------------------------ | :------------------ | -| 해상도 (Resolution) | 최고 수준 | -| FPS | 60 | -| 가속 렌더링 모드 (Accelerate Rendering Mode) | 호환성 (Compatibility) | -| 후처리 (Post-Processing) | ON | -| 안티앨리어싱 (Anti-Aliasing) | ON | - ---- - -✅ *팁:* 그래픽 설정을 고품질로 유지하면 자동화 작업의 시각 인식 일관성이 증가하지만, -안정적인 실행에는 필수 요소는 아닙니다. diff --git a/service/dist/docs/ko_KR/Normal Sweeping Scanning Description.md b/service/dist/docs/ko_KR/Normal Sweeping Scanning Description.md deleted file mode 100644 index 8f1d7e888..000000000 --- a/service/dist/docs/ko_KR/Normal Sweeping Scanning Description.md +++ /dev/null @@ -1,62 +0,0 @@ - -# 🧹 스윕 구성 가이드 - -각 **스윕 구성**은 다음 형식을 따릅니다: - -``` -region - task-number - sweep-times -``` - ---- - -## 🧩 구성 요소 설명 - -| 구성 요소 | 설명 | -| :-------------- | :--------------------- | -| **Region** | 지도 또는 구역 식별자 | -| **Task Number** | 해당 구역 내의 레벨 또는 스테이지 번호 | -| **Sweep Times** | 스윕 수행 횟수 또는 방식 | - -각 구성은 **콤마(`,`)로 구분**되어야 합니다. - ---- - -## 🗺️ 1. 지원되는 스윕 레벨 범위 - -Academy 1 및 Academy 5 이후 모든 지도에서 자동 스윕이 가능합니다. - -> 🟡 **유효한 스윕 문자열 예시:** -> -> ``` -> 12-1-3, 13-2-2, 14-4-1 -> ``` - ---- - -## ⚙️ 2. 특수 설명 - -국제 서버(Global)에서는 -`sweep times`에 **`max`** 키워드를 사용할 수 있습니다. - -* BAAS는 레벨 난이도, 완료 상태, 현재 **스태미너(AP)** 등에 따라 - 해당 레벨을 클리어 가능한지 자동으로 판단합니다. - ---- - -### 🧮 예시 - -스태미너가 충분할 경우: - -``` -15-3, 20-3-max -``` - -**의미:** - -* 15-3 레벨을 3회 스윕 -* 그 후, 20-3 레벨을 남은 AP를 모두 사용해 스윕 (`max`) - ---- - -✅ *팁:* 자동으로 모든 AP를 사용하는 `max`는 신중하게 사용하고, -가능하면 명시적 스윕 횟수를 지정해 통제된 실행을 유지하세요. diff --git a/service/dist/docs/ko_KR/Scheduling Configuration Filling Guide.md b/service/dist/docs/ko_KR/Scheduling Configuration Filling Guide.md deleted file mode 100644 index dcf65952c..000000000 --- a/service/dist/docs/ko_KR/Scheduling Configuration Filling Guide.md +++ /dev/null @@ -1,86 +0,0 @@ - -# 🕒 스케줄링 구성 입력 가이드 - -이 가이드는 자동화 작업 실행을 위한 스케줄링 구성 필드의 -올바른 입력 및 해석 방법을 설명합니다. - ---- - -## ⚙️ 1. 우선 순위 (Priority) - -큐에 여러 작업이 있을 경우: - -* **우선 순위 값이 낮은 작업**이 먼저 실행됩니다. - -> 예시: -> 우선 순위 1의 작업이 우선 순위 2의 작업보다 먼저 실행됨 - ---- - -## ⏳ 2. 실행 간격 (Interval) - -* 정수 `0` → **매일 반복 실행** -* 그보다 큰 정수 → 실행 간격을 일(day) 단위로 지정 - ---- - -## 🕐 3. 일일 리셋 타임 - -작업은 매일 고정된 시간에 자동으로 실행됩니다. -이 기능은 **새 UI**에서 쉽게 설정할 수 있습니다. - -* **형식:** - -``` -[ [ h, m, s ] ] -``` - -*(UTC 기준 시간)* - -* 여러 타임스탬프는 콤마(,)로 구분 가능 - -**예시:** - -``` -[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] -``` - -**의미:** -베이징 시간 (UTC+8) 기준 **08:00** 및 **16:00**에 실행 - ---- - -## 🚫 4. 비활성 시간대 설정 - -지정된 기간 동안 작업이 **실행되지 않도록** 설정할 수 있습니다. -이 또한 **새 UI**에서 쉽게 지정 가능합니다. - -* **형식:** - -``` -[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] -``` - -*(UTC 기준 시간)* - -* 여러 기간은 콤마로 구분 - -**예시:** - -``` -[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] -``` - -**의미:** -하루 종일 작업이 비활성화됨 - ---- - -## 🔁 5. 사전 작업 & 사후 작업 - -관련 작업들을 연계할 수 있습니다: - -* **사전 작업 (Pre-tasks):** 현재 작업 전에 실행 -* **사후 작업 (Post-tasks):** 현재 작업 후에 실행 - -> 이로써 종속 작업들이 올바른 순서로 실행되도록 보장할 수 있습니다. diff --git a/service/dist/docs/ko_KR/Task force attributes required by region.md b/service/dist/docs/ko_KR/Task force attributes required by region.md deleted file mode 100644 index cac20b0f4..000000000 --- a/service/dist/docs/ko_KR/Task force attributes required by region.md +++ /dev/null @@ -1,40 +0,0 @@ -# 🎯 스테이지 속성 참조표 - -이 표는 각 스테이지와 그에 대응하는 **두 개의 주요 속성**을 나열하며, -구분을 쉽게 하기 위해 별도의 열에 정리되어 있습니다. - -| 스테이지 | 속성 ① | 속성 ② | -| :----: | :------------- | :------------- | -| **25** | 소닉 (Sonic) | 관통 (Piercing) | -| **24** | 소닉 (Sonic) | 폭발 (Explosive) | -| **23** | 폭발 (Explosive) | 관통 (Piercing) | -| **22** | 관통 (Piercing) | 신비 (Mystic) | -| **21** | 신비 (Mystic) | 폭발 (Explosive) | -| **20** | 폭발 (Explosive) | 관통 (Piercing) | -| **19** | 관통 (Piercing) | 신비 (Mystic) | -| **18** | 신비 (Mystic) | 폭발 (Explosive) | -| **17** | 폭발 (Explosive) | 관통 (Piercing) | -| **16** | 관통 (Piercing) | 신비 (Mystic) | -| **15** | 신비 (Mystic) | 신비 (Mystic) | -| **14** | 폭발 (Explosive) | 신비 (Mystic) | -| **13** | 관통 (Piercing) | 관통 (Piercing) | -| **12** | 신비 (Mystic) | 폭발 (Explosive) | -| **11** | 관통 (Piercing) | 신비 (Mystic) | -| **10** | 폭발 (Explosive) | 신비 (Mystic) | -| **9** | 폭발 (Explosive) | 관통 (Piercing) | -| **8** | 관통 (Piercing) | 관통 (Piercing) | -| **7** | 폭발 (Explosive) | 폭발 (Explosive) | -| **6** | 관통 (Piercing) | 관통 (Piercing) | -| **5** | 폭발 (Explosive) | — | -| **4** | 관통 (Piercing) | — | -| **3** | 관통 (Piercing) | — | -| **2** | 폭발 (Explosive) | — | -| **1** | 폭발 (Explosive) | — | - ---- - - -✅ *팁:* 전투를 계획할 때는 전투 팀의 **공격 타입**을 -적의 약점 속성과 맞추는 것을 고려하세요. -두 속성이 있는 스테이지는 하위 구역 간 안정성을 위해 -팀 구성을 균형 있게 유지하는 것이 좋습니다. diff --git a/service/dist/docs/ko_KR/reporting guidelines on issues (important).md b/service/dist/docs/ko_KR/reporting guidelines on issues (important).md deleted file mode 100644 index e0bcf11eb..000000000 --- a/service/dist/docs/ko_KR/reporting guidelines on issues (important).md +++ /dev/null @@ -1,54 +0,0 @@ - -# 🧭 문제 리포팅 및 자가 진단 가이드 - -리포트를 제출하기 전에, 아래 체크리스트를 **한 번 멈추고 생각**해 보세요. -이 과정을 거치면 문제가 재현 가능하고 명확하며, 다른 사람들이 더 쉽게 대응할 수 있습니다. - ---- - -## 💡 보고 전에 확인할 사항 - -1. **이 문제가 이전에도 발생했는가?** - 스스로 먼저 해결해 보세요 — **Baidu** 검색이나 문서 참고 등을 활용하세요. - - > 그래도 해결되지 않으면 리포트를 진행하세요. -2. **프로그램 실행 시 매번 동일한 문제가 발생하는가?** - 일관성 있는 문제인지 확인하는 것이 환경 문제인지 버그인지 가늠하는 데 도움이 됩니다. -3. **다른 사람이 동일한 문제를 재현할 수 있도록 충분한 정보를 제공할 수 있는가?** - 로그, 스크린샷, 설정 세부사항 등을 포함하세요. -4. **리포트를 보기 좋고 읽기 좋게 작성했는가?** - 색상 코드 로그, 스크린샷 등은 보기 쉽고 직관적이라 도움을 더 받을 수 있습니다. - ---- - -## 🎨 문제 유형별 리포팅 요구사항 - -*(🟡 노란 항목은 **필수**입니다)* - ---- - -### 🧱 “페이지 XXX에서 멈춤” - -🟡 **(1)** 멈췄을 때의 화면 해상도를 1280×720으로 기록 (예: MuMu의 F9 단축키 사용) -(2) BAAS 로그 스크린샷 -(3) 탭 전환 등 다른 페이지로 이동해도 동일한 현상이 반복되는지 확인 - ---- - -### 🧍 “이동 불가” - -(1) 해당 동작을 한두 번 반복해 보세요. -🟡 **(2)** 프로그램 시작부터 멈춘 지점까지 전체 영상 녹화 -— 에뮬레이터 화면과 BAAS 로그 창이 함께 보이도록 녹화 - ---- - -### ⚙️ “XXX 설정을 했는데 실행이 안 됨” 또는 “설정하지 않았는데 실행됨” - -(1) 구성 설명서를 다시 꼼꼼히 읽어 파라미터가 올바르게 입력되었는지 확인 -🟡 **(2)** 구성 설정 화면, 프로그램 로그 스크린샷 함께 첨부 - ---- - -✅ *팁:* 완전한 리포트는 타인이 **추측 없이** 재현할 수 있어야 합니다. -로그, 스크린샷, 명확한 맥락 제공은 모두의 시간을 절약하고 빠른 해결을 돕습니다. diff --git a/service/dist/docs/ru_RU/Auto clear mainline plot settings.md b/service/dist/docs/ru_RU/Auto clear mainline plot settings.md deleted file mode 100644 index 3056ae4ba..000000000 --- a/service/dist/docs/ru_RU/Auto clear mainline plot settings.md +++ /dev/null @@ -1,46 +0,0 @@ - -# 🧩 Настройки автоматического прохождения основной сюжетной линии - -### 🎮 Автоматическая игра и заметки о битвах - -**Автопроигрывание** помогает **автоматически проходить сетку уровней**. -Однако **некоторые сражения в Финальном эпизоде нельзя пройти автоматически.** - ---- - -### 📘 Нумерация эпизодов - -| Номер | Название эпизода | -| :---: | :--------------- | -| 1 | Эпизод I | -| 2 | Эпизод II | -| 3 | Эпизод III | -| 4 | Эпизод IV | -| 5 | Финальный эпизод | -| 6 | Эпизод V | - ---- - -### 🔢 Формат ввода - -Используйте запятую (`,`) для разделения номеров эпизодов, которые нужно пройти. - -**Пример:** - -```text -1,2,3 -``` - -Это означает, что скрипт пройдет **Эпизод I → Эпизод II → Эпизод III** по порядку. - ---- - -### ⚙️ Конфигурация по умолчанию - -Если поле ввода оставлено пустым и вы нажмёте **«Запустить»**, используется последовательность по умолчанию: - -| Регион | Эпизоды по умолчанию | -| :----- | :------------------- | -| CN | `1,2,3,4` | -| Global | `1,2,3,4,5,4` | -| JP | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/ru_RU/Commonly used emulator adb address.md b/service/dist/docs/ru_RU/Commonly used emulator adb address.md deleted file mode 100644 index 1707345f8..000000000 --- a/service/dist/docs/ru_RU/Commonly used emulator adb address.md +++ /dev/null @@ -1,25 +0,0 @@ -# 🧠 Справочник портов эмуляторов - -### ⚙️ Общие сведения - -**Для мультиэкземпляров Stimulator** проверьте конфигурацию самостоятельно. - ---- - -### 🎮 Порты одиночных эмуляторов - -| Эмулятор | Порт(ы) | -| :------------------------ | :--------------- | -| **MuMu** | `7555` | -| **BlueStacks / LDPlayer** | `5555` | -| **NoxPlayer** | `62001`, `59865` | -| **MuMu 12** | `16384` | -| **MEmuPlay** | `21503` | - -> ⚠️ **Если вы используете BlueStacks**, убедитесь, что в настройках включена -> функция **отладки порта ADB**. - ---- - -💡 *Совет:* Эти порты используются для ADB-соединения между ПК и эмулятором. -Если возникают проблемы с подключением, убедитесь, что включена опция **ADB Debugging**, и ни один другой экземпляр эмулятора не занимает тот же порт. diff --git a/service/dist/docs/ru_RU/Description of normal graphs.md b/service/dist/docs/ru_RU/Description of normal graphs.md deleted file mode 100644 index 1fa26e7a2..000000000 --- a/service/dist/docs/ru_RU/Description of normal graphs.md +++ /dev/null @@ -1,114 +0,0 @@ - -# 📊 Описание обычных карт - ---- - -## 🧩 1. Описание использования - -### (1) Требования к разблокировке и авто-бою - -Необходимо включить оба параметра: - -* 🟡 **Автоматически завершать раунды** -* 🟡 **Автобой** - -> Система автоматически проверит и включит эти функции, если это возможно. - ---- - -### (2) Поддерживаемые уровни - -Поддерживаются обычные уровни основной линии: -🟡 **4 – 25** - ---- - -### (3) Логика перемещения - -Когда слайды BAAS зафиксированы, перемещения команд выполняются **одним нажатием**. -Так как количество команд в *Blue Archive* различается, -**координаты нумерации** и **порядок движения** также различаются в зависимости от состава команды. - ---- - -### (4) Примечания по автоматической экстраполяции - -При **автоматической экстраполяции** -🟡 **убедитесь, что команды с меньшими и большими номерами назначены правильно.** -(Если не уверены — проверьте нумерацию команд перед запуском.) - ---- - -### (5) Настройки миниатюр обычных уровней - -BAAS определяет конфигурацию на основе: - -* 🟢 **< Настройки миниатюр обычных уровней >** -* 🟢 **Выбранных свойств группы** -* 🟢 **♪ Логики команды ♪** - -Эти параметры определяют правильную конфигурацию для каждого слайда. - -> Первое соответствующее свойство на схемах — **[1]**, второе — **[2]**. - ---- - -## 🤖 2. Логика команд - -1. Приоритет выбора команды определяется **по контротношениям (сдерживаниям)**, - с постепенным снижением зависимости от совпадения атрибутов. -2. При выборе команды: - `4 - (номер команды) >= число требуемых команд`. -3. Если условия (1) и (2) невыполнимы, ослабляются контротношения между эквивалентами [1]. -4. Если некоторые команды уже выбраны и `4 - max(выбранные) >= требуемые`, - оставшиеся заполняются **дополнительными номерами**. -5. Если ни одно условие не выполняется, выбираются **команды 1, 2, 3**. - ---- - -### 🧠 Пример - -Порядок выбора для **отряда 23 [Взрыв, Переправа]**: - -* Одна команда — одна операция. -* Если *Взрывная команда 3* не выбрана в предыдущем порядке, выберите **4** как вторую. -* Если всё ещё недоступна, выберите **12** как финальную. - ---- - -## 🚀 3. Описание уровней Push-карты - -### (1) Поведение при продвижении - -Если появляется сообщение -🟡 **«Не удалось закрыть временную папку: %s»**, -каждое введённое число соответствует **зоне для прохождения**. -Программа проверит, нужно ли переигрывать уровни в этой зоне -на основе достижения рейтинга `SSS`. - -**Пример:** - -```text -15, 16, 14 -``` - -Это означает последовательное прохождение зон **15 → 16 → 14**. - ---- - -### (2) Настройка обязательных атак - -Если включена опция 🟡 **Принудительные атаки на каждом уровне**: - -* Введите одно число → пройти всю зону один раз. -* Введите `число-число` → указать конкретный подуровень. - -**Пример:** - -```text -15, 16-3 -``` - ---- - -✅ *Совет:* Перед запуском убедитесь, что нумерация уровней и назначение команд совпадают с вашей **конфигурацией BAAS**, чтобы избежать несоответствий. diff --git a/service/dist/docs/ru_RU/Difficult Chart Configuration Description.md b/service/dist/docs/ru_RU/Difficult Chart Configuration Description.md deleted file mode 100644 index e49869a4c..000000000 --- a/service/dist/docs/ru_RU/Difficult Chart Configuration Description.md +++ /dev/null @@ -1,103 +0,0 @@ - -# 💀 Руководство по использованию сложных карт - -Сложные карты работают аналогично режимам **Логика команд** и **Обычные карты**. -Некоторые из них требуют **три команды** с одинаковым атрибутом, как у первой команды в регионе. - ---- - -## 🧾 Правила заполнения - -### ⚠️ Допустимые символы - -Строка для уровня слайда **не должна содержать** ничего, кроме: - -``` -"-", "sss", "present", "task", ",", [чисел] -``` - -Каждый сегмент разделяется **запятой (`,`)**. - -> ❌ Не добавляйте слова `"sss"`, `"present"`, `"task"` вне допустимого синтаксиса. - ---- - -### 🧩 Пример 1: базовое использование - -**Ввод:** - -``` -15,12-2 -``` - -**Интерпретация:** - -BAAS выполнит: - -``` -15-1, 15-2, 15-3, 12-2 -``` - -и запустит режим **Hard Map**: - -* `sss` → проверка звёзд -* `present` → сбор наград -* `task` → выполнение заданий - ---- - -### 🧩 Пример 2: число + строка - -**Ввод:** - -``` -15-sss-present -``` - -**Значение:** -BAAS запустит уровни **15-1, 15-2, 15-3** -и выполнит `sss` (проверка звёзд) и `present` (сбор подарков). - ---- - -### 🧩 Пример 3: два числа + ключевые слова - -**Ввод:** - -``` -15-3-sss-task -``` - -**Значение:** -BAAS запустит **уровень 15-3** для: - -* получения рейтинга `sss` -* завершения `task`. - ---- - -### 🧩 Пример 4: сложный случай - -**Ввод:** - -``` -7,8-sss,9-3-task -``` - -**Значение:** - -* `(7-1,7-2,7-3)` → выполнить `sss`, собрать подарки и задания. -* `(8-1,8-2,8-3)` → выполнить `sss`. -* `9-3` → выполнить задание `task`. - ---- - -## 🧠 Поведение системы - -> 🟡 **Примечание:** -> BAAS автоматически определяет, -> -> * достигнут ли уровень `sss`, -> * собран ли подарок. - -Если одно из условий выполнено, **уровень пропускается** для оптимизации времени. diff --git a/service/dist/docs/ru_RU/Frontend Development Guide.md b/service/dist/docs/ru_RU/Frontend Development Guide.md deleted file mode 100644 index c1df26553..000000000 --- a/service/dist/docs/ru_RU/Frontend Development Guide.md +++ /dev/null @@ -1,104 +0,0 @@ - -# 🏗️ Руководство по фронтенд-разработке - -Этот документ описывает, как устроено **настольное приложение BAAS**, как данные проходят между клиентскими модулями и серверной частью, а также какие принципы нужно соблюдать при расширении платформы. -Он предназначен для **инженерных и интеграционных команд**, которым требуется каноническое руководство при внедрении новых функций. - ---- - -## 🧩 Оболочка приложения - -React-приложение рендерится через `App.tsx`. -Оно объединяет **ThemeProvider**, **AppProvider** и постоянный каркас интерфейса (`MainLayout`). -Страницы переключаются при помощи лёгкого **framer-motion router**, который сохраняет неактивные страницы в памяти, чтобы они не теряли состояние при смене вкладок. - -* **Точка входа:** `main.tsx` инициализирует i18n, тему и рендерит ``. -* **Провайдеры:** `AppProvider` загружает пользовательские настройки UI, устанавливает соединение по WebSocket, загружает каталог профилей и предоставляет методы через контекст. -* **Макет:** `MainLayout` включает постоянную боковую панель (`Sidebar.tsx`) и верхний заголовок (`Header.tsx`). - ---- - -## 🧱 Ключевые модули - -| Модуль | Ответственность | Основные файлы | -| :------------------ | :----------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | -| **Context** | Делится настройками UI, активным профилем и каталогом профилей. | `contexts/AppContext.tsx` | -| **State Stores** | Хранилища Zustand нормализуют удалённое состояние (конфиг, события, статусы, логи) для компонентов. | `store/websocketStore.ts`, `store/globalLogStore.ts` | -| **Remote Services** | Инкапсулируют серверные контракты, включая сохранение горячих клавиш и зашифрованные WebSocket-сессии. | `services/hotkeyService.ts`, `lib/SecureWebSocket.ts` | -| **Pages** | Контейнеры верхнего уровня для страниц `Home`, `Scheduler`, `Configuration`, `Settings`, `Wiki`. | `pages/*.tsx` | -| **Feature Forms** | Модульные панели конфигурации, работающие с фрагментом `DynamicConfig`. | `features/*Config.tsx`, `features/DailySweep.tsx` | -| **Shared UI** | Повторно используемые визуальные элементы (инпуты, селекторы, модальные окна, логгеры и пр.). | `components/ui`, `components/AssetsDisplay.tsx`, `components/Particles.tsx` | -| **Hooks** | Бизнес-логика, включая горячие клавиши и управление темой. | `hooks/useHotkeys.ts`, `hooks/useTheme.tsx` | - ---- - -## 🔄 Поток данных - -### 🔌 Инициализация WebSocket - -1. `AppProvider` вызывает `useWebSocketStore.getState().init()` при запуске. -2. `init()` поочерёдно подключается к каналам **heartbeat**, **provider** и **sync**, используя `SecureWebSocket`. -3. После установления соединения хранилище загружает статические данные, конфигурации и очереди событий. -4. Сеттеры Zustand обновляют подписанные компоненты в реальном времени. - ---- - -### ⚙️ Цикл обновления конфигурации - -1. Формы редактирования работают с локальной копией `DynamicConfig`. -2. При сохранении создаётся минимальный объект `patch` и вызывается `modify(path, patch, showToast)`. -3. Хранилище отправляет команду `sync` с JSON-патч-семантикой и регистрирует колбэк в `pendingCallbacks`. -4. После подтверждения от сервера колбэк очищает состояние ожидания и при необходимости показывает уведомление через `sonner`. -5. Входящие сообщения `config` синхронизируют локальное состояние. - ---- - -### 📡 Телеметрия планировщика - -* Страницы **Home** и **Scheduler** подписаны на `statusStore` и `logStore` для отображения метрик. -* Лог-поток устраняет дубликаты и зеркалирует глобальные логи в `globalLogStore`. -* Все исходящие команды (запуск, остановка, патчи) имеют метки времени для упрощения отслеживания. - ---- - -## ⚙️ Сквозные аспекты - -### 🌐 Интернационализация - -Переводы хранятся в `assets/locales/*.json` и загружаются через `react-i18next`. -Язык по умолчанию — **китайский (`zh`)**, резервный — **английский (`en`)**. -Тексты интерфейса структурированы по доменам (scheduler, artifact и т. д.) для удобного обновления локализаций. - ---- - -### ⚡ Производительность и UX - -* **Сохранение монтирования** (`App.tsx`) предотвращает повторную инициализацию тяжёлых компонентов при переключении вкладок. -* Формы используют `useMemo` и `useCallback` для минимизации перерисовок. -* Прокручиваемые области применяют классы `scroll-embedded` для единообразного стиля. -* Обновления в реальном времени используют **пакетные сеттеры Zustand**; тяжёлые обновления (логи) добавляются иммутабельно для снижения нагрузки. - ---- - -### 🧰 Инструменты - -* **Сборка:** Vite + React 19 + TypeScript 5 -* **Стили:** Tailwind CSS с пользовательскими токенами и переиспользуемыми компонентами -* **Анимации:** `framer-motion` для переходов и `ogl` для эффектов частиц - ---- - -## 🚀 Контрольный список расширения - -1. Создайте или обновите компонент функции в `features/` и зарегистрируйте его в `featureMap` (страница Configuration). -2. Добавьте новые надписи в словари `en.json` и `zh.json`. -3. Используйте `modify`, `patch` или `trigger` для обмена с сервером, сохраняя единую систему подтверждений. -4. Если настройку нужно сделать доступной пользователю, раскройте её через `AppContext`. - ---- - -Следуя этим правилам, вы обеспечите: - -* **Последовательность и расширяемость** приложения, -* Корректную работу **горячих клавиш** и **телеметрии**, -* Согласованность состояния **WebSocket** на всех страницах. diff --git a/service/dist/docs/ru_RU/Guide for activity sweep fill in.md b/service/dist/docs/ru_RU/Guide for activity sweep fill in.md deleted file mode 100644 index 4614f8fc6..000000000 --- a/service/dist/docs/ru_RU/Guide for activity sweep fill in.md +++ /dev/null @@ -1,53 +0,0 @@ - -# ⚔️ Руководство по заполнению параметров зачистки активности - -Это руководство объясняет, как правильно задавать параметры **автоматической зачистки активности** в BAAS. - ---- - -## 🧾 Одна зачистка - -**Параметр:** -`Номер задания для зачистки` - -* Тип: **целое число** -* Диапазон: `1` – *максимальная сложность* текущей активности. - -**Параметр:** -`Количество зачисток` - -1. **Целое число** — точное количество проходов. - Например, `3` → выполнить задание 3 раза. -2. **Десятичное число** — доля используемой выносливости (AP). - Например, `0.5` → использовать **AP × 0.5**. -3. **Дробь** — часть AP в виде отношения. - Например, `1/3` → использовать **AP × (1/3)**. - ---- - -## 🔁 Несколько зачисток подряд - -Чтобы зачистить несколько заданий последовательно, -разделяйте номера запятыми. - -**Пример:** - -``` -Задания: 9, 10, 11 -Количество: 0.5, 3, 1/3 -AP: 999 -``` - -**Интерпретация:** - -| Задание | Расчёт | Результат | -| :------ | :------------- | :-------- | -| **9** | (999 × 0.5)/20 | 25 раз | -| **10** | фиксировано 3 | 3 раза | -| **11** | (999 × 1/3)/20 | 16 раз | - -➡️ BAAS выполнит зачистку **9 → 10 → 11** по порядку. - ---- - -✅ *Совет:* Всегда проверяйте, что значение **AP** соответствует фактической выносливости в игре перед запуском множественных зачисток. diff --git a/service/dist/docs/ru_RU/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/ru_RU/Internal settings in BlueArchive game (first-use must read).md deleted file mode 100644 index 096bee715..000000000 --- a/service/dist/docs/ru_RU/Internal settings in BlueArchive game (first-use must read).md +++ /dev/null @@ -1,30 +0,0 @@ - -# ⚙️ Файлы Blanche — внутренние настройки игры - -В этом руководстве перечислены **обязательные** и **рекомендуемые** игровые настройки для корректной работы системы **Blanche Files** с BAAS-автоматизацией. - ---- - -## 🧩 Обязательные настройки - -| Категория | Параметр | Значение / инструкция | -| :--------------------------- | :---------------------------------------- | :----------------------------------- | -| **Графика** | Вертикальный экран битвы — текстовое окно | **Выкл.** | -| **Лобби воспоминаний** | Выбор персонажа | **Не выбирайте** Ako, Aru или Wakamo | -| **Язык (глобальный сервер)** | — | **Английский** | - ---- - -## 💡 Рекомендуемые параметры *(необязательные)* - -| Настройка | Рекомендованное значение | -| :------------------------------- | :----------------------- | -| **Разрешение** | Максимальное | -| **FPS** | 60 | -| **Режим ускоренного рендеринга** | Совместимость | -| **Пост-обработка** | Вкл. | -| **Сглаживание** | Вкл. | - ---- - -✅ *Совет:* Высокое качество графики обеспечивает более стабильное распознавание изображений автоматикой, хотя это **не обязательно** для корректного выполнения скриптов. diff --git a/service/dist/docs/ru_RU/Normal Sweeping Scanning Description.md b/service/dist/docs/ru_RU/Normal Sweeping Scanning Description.md deleted file mode 100644 index 5ebf50ea2..000000000 --- a/service/dist/docs/ru_RU/Normal Sweeping Scanning Description.md +++ /dev/null @@ -1,63 +0,0 @@ - -# 🧹 Руководство по настройке зачистки - -Каждая конфигурация зачистки имеет общий формат: - -``` -регион - номер-задания - количество-раз -``` - ---- - -## 🧩 Структура - -| Компонент | Описание | -| :---------------- | :------------------------------- | -| **Регион** | Идентификатор карты или области. | -| **Номер задания** | Уровень внутри региона. | -| **Количество** | Число повторов зачистки. | - -Конфигурации разделяются **запятыми**. - ---- - -## 🗺️ 1. Доступные уровни - -Все карты **после Academy 1 и Academy 5** поддерживают автоматическую зачистку. - -> 🟡 **Пример:** -> -> ``` -> 12-1-3, 13-2-2, 14-4-1 -> ``` - ---- - -## ⚙️ 2. Особые случаи - -На **международном сервере** поле количества может принимать ключевое слово **`max`**. - -* BAAS автоматически определяет, можно ли пройти уровень, - исходя из: - - * текущего **AP** - * сложности и статуса прохождения - ---- - -### 🧮 Пример - -При достаточном запасе выносливости: - -``` -15-3, 20-3-max -``` - -**Значение:** - -* Пройти **15-3** три раза. -* Затем зачистить **20-3** до полного расхода AP (`max`). - ---- - -✅ *Совет:* Используйте `max`, если хотите полностью израсходовать AP на уровне; иначе указывайте точное количество для контролируемого выполнения. diff --git a/service/dist/docs/ru_RU/Scheduling Configuration Filling Guide.md b/service/dist/docs/ru_RU/Scheduling Configuration Filling Guide.md deleted file mode 100644 index 914a1a36f..000000000 --- a/service/dist/docs/ru_RU/Scheduling Configuration Filling Guide.md +++ /dev/null @@ -1,79 +0,0 @@ - -# 🕒 Руководство по заполнению конфигурации планировщика - -Это руководство объясняет, как правильно заполнять и интерпретировать поля планировщика для автоматического выполнения задач. - ---- - -## ⚙️ 1. Приоритет - -Если в очереди несколько задач: - -* Задачи с **меньшим числом приоритета** выполняются **раньше**. - -> Пример: -> Задача A (приоритет 1) выполняется до задачи B (приоритет 2). - ---- - -## ⏳ 2. Интервал выполнения - -* **0** — ежедневное выполнение. -* Большее число — пропуск указанного количества дней. - ---- - -## 🕐 3. Ежедневный запуск - -Задачи запускаются в фиксированные моменты времени (UTC). - -* **Формат:** - -``` -[ [ h, m, s ] ] -``` - -Можно указать несколько времён через запятую. - -**Пример:** - -``` -[ [ 0, 0, 0 ], [ 20, 0, 0 ] ] -``` - -**Значение:** -Запуск в **8 утра и 4 вечера** по пекинскому времени (UTC + 8). - ---- - -## 🚫 4. Периоды блокировки - -В это время задачи **не выполняются**. - -* **Формат:** - -``` -[ [ [ h1, m1, s1 ], [ h2, m2, s2 ] ] ] -``` - -Можно задать несколько интервалов. - -**Пример:** - -``` -[ [ [ 0, 0, 0 ], [ 24, 0, 0 ] ] ] -``` - -**Значение:** -Задачи отключены на **весь день**. - ---- - -## 🔁 5. Пред- и пост-задачи - -Можно связать операции: - -* **Pre-tasks** — выполняются **до** текущей задачи. -* **Post-tasks** — выполняются **после** текущей. - -> Это обеспечивает правильный порядок зависимых действий. diff --git a/service/dist/docs/ru_RU/Task force attributes required by region.md b/service/dist/docs/ru_RU/Task force attributes required by region.md deleted file mode 100644 index a4b95ac58..000000000 --- a/service/dist/docs/ru_RU/Task force attributes required by region.md +++ /dev/null @@ -1,36 +0,0 @@ - -# 🎯 Таблица атрибутов регионов - -| Этап | Атрибут ① | Атрибут ② | -| :--: | :-------- | :-------- | -| 25 | Sonic | Piercing | -| 24 | Sonic | Explosive | -| 23 | Explosive | Piercing | -| 22 | Piercing | Mystic | -| 21 | Mystic | Explosive | -| 20 | Explosive | Piercing | -| 19 | Piercing | Mystic | -| 18 | Mystic | Explosive | -| 17 | Explosive | Piercing | -| 16 | Piercing | Mystic | -| 15 | Mystic | Mystic | -| 14 | Explosive | Mystic | -| 13 | Piercing | Piercing | -| 12 | Mystic | Explosive | -| 11 | Piercing | Mystic | -| 10 | Explosive | Mystic | -| 9 | Explosive | Piercing | -| 8 | Piercing | Piercing | -| 7 | Explosive | Explosive | -| 6 | Piercing | Piercing | -| 5 | Explosive | — | -| 4 | Piercing | — | -| 3 | Piercing | — | -| 2 | Explosive | — | -| 1 | Explosive | — | - ---- - -✅ *Совет:* -При планировании сражений сопоставляйте **тип атаки** команды со **слабостью врага**. -Этапы с двумя атрибутами требуют **сбалансированных составов**, чтобы сохранять устойчивость между подуровнями. diff --git a/service/dist/docs/ru_RU/reporting guidelines on issues (important).md b/service/dist/docs/ru_RU/reporting guidelines on issues (important).md deleted file mode 100644 index 5016beda6..000000000 --- a/service/dist/docs/ru_RU/reporting guidelines on issues (important).md +++ /dev/null @@ -1,65 +0,0 @@ - -# 🧭 Руководство по сообщению о проблемах и самодиагностике - -Перед отправкой отчёта **остановитесь и проверьте** следующие пункты — -это поможет сделать проблему воспроизводимой и понятной. - ---- - -## 💡 Перед тем как сообщить - -1. **Была ли эта ошибка раньше?** - Попробуйте решить самостоятельно — поищите на **Baidu** или в **документации**. - - > Если не помогает — сообщайте. - -2. **Возникает ли проблема каждый раз?** - Это поможет понять, случайная ли ошибка или системная. - -3. **Есть ли у вас достаточно данных для воспроизведения?** - Приложите логи, скриншоты и настройки. - -4. **Сделайте отчёт читаемым.** - Красиво оформленные логи и изображения (например, в QQ-группе) повышают шанс получить помощь. - ---- - -## 🎨 Тип проблемы и требования к отчёту - -*(🟡 Жёлтые пункты — обязательные)* - ---- - -### 🧱 «Я застрял на странице XXX!» - -🟡 (1) Разрешение 1280×720 в момент зависания (например, MuMu на F9). - -(2) Скриншот лога BAAS. - -(3) Попробуйте переключить страницы — зависает ли только одна. - ---- - -### 🧍 «Я не могу двигаться!» - -(1) Повторите действие пару раз — зависает ли в том же месте. - -🟡 (2) Запишите **видео от старта до момента зависания**, - -чтобы на экране были видны и эмулятор, и окно лога BAAS. - ---- - -### ⚙️ «Я настроил XXX, но оно не выполняется!» - -или -«Я не настраивал XXX, но оно выполняется!» - -(1) Внимательно перечитайте инструкции — проверьте параметры. - -🟡 (2) Приложите **скриншоты настроек** и **логи программы**. - ---- - -✅ *Совет:* Полноценный отчёт должен позволять воспроизвести проблему **без догадок**. -Логи + скриншоты + контекст = быстрая и эффективная помощь. diff --git a/service/dist/docs/zh_CN/Auto clear mainline plot settings.md b/service/dist/docs/zh_CN/Auto clear mainline plot settings.md deleted file mode 100644 index d47fe2e32..000000000 --- a/service/dist/docs/zh_CN/Auto clear mainline plot settings.md +++ /dev/null @@ -1,46 +0,0 @@ - -# 🧩 主线剧情自动通关设置 - -### 🎮 自动播放与战斗说明 - -**自动播放**可以帮助你**自动走图**。 -但请注意,**最终章(Final Episode)中的部分战斗无法自动进行。** - ---- - -### 📘 章节编号说明 - -| 数字 | 剧情章节名 | -| :-: | :----------------- | -| 1 | 第一章(Episode I) | -| 2 | 第二章(Episode II) | -| 3 | 第三章(Episode III) | -| 4 | 第四章(Episode IV) | -| 5 | 最终章(Final Episode) | -| 6 | 第五章(Episode V) | - ---- - -### 🔢 输入格式 - -使用英文逗号(`,`)分隔需要通关的章节编号。 - -**示例:** - -```text -1,2,3 -``` - -表示脚本会依次自动通关:**第一章 → 第二章 → 第三章**。 - ---- - -### ⚙️ 默认配置 - -如果输入框留空并点击 **“运行(Run)”**,将采用默认通关顺序: - -| 服务器 | 默认章节顺序 | -| :---------- | :-------------- | -| 国服(CN) | `1,2,3,4` | -| 国际服(Global) | `1,2,3,4,5,4` | -| 日服(JP) | `1,2,3,4,5,4,6` | diff --git a/service/dist/docs/zh_CN/Commonly used emulator adb address.md b/service/dist/docs/zh_CN/Commonly used emulator adb address.md deleted file mode 100644 index 79a19c7bb..000000000 --- a/service/dist/docs/zh_CN/Commonly used emulator adb address.md +++ /dev/null @@ -1,29 +0,0 @@ - -# 🧠 模拟器 ADB 端口参考 - -### ⚙️ 通用说明 - -**若使用多开模拟器(Stimulator Multi-instance)**,请自行检查配置。 - ---- - -### 🎮 常用模拟器端口列表 - -| 模拟器 | 端口号 | -| :------------------------ | :--------------- | -| **MuMu** | `7555` | -| **BlueStacks / LDPlayer** | `5555` | -| **NoxPlayer** | `62001`, `59865` | -| **MuMu 12** | `16384` | -| **MEmuPlay** | `21503` | - -> ⚠️ **使用 BlueStacks 时,请确认设置中已启用 ADB 调试端口功能。** - ---- - -💡 *提示:* -这些端口用于在 **PC 与模拟器之间建立 ADB 连接**。 -若连接失败,请检查: - -* 模拟器的 **ADB 调试选项是否开启**; -* 是否存在 **其他实例占用相同端口**。 diff --git a/service/dist/docs/zh_CN/Description of normal graphs.md b/service/dist/docs/zh_CN/Description of normal graphs.md deleted file mode 100644 index ade8464ac..000000000 --- a/service/dist/docs/zh_CN/Description of normal graphs.md +++ /dev/null @@ -1,111 +0,0 @@ - -# 📊 普通关卡说明文档 - ---- - -## 🧩 一、使用说明 - -### (1) 解锁与自动战斗要求 - -你必须同时开启: - -* 🟡 **自动结束回合(Auto End Rounds)** -* 🟡 **自动战斗(Autofight)** - -> 系统将自动检测并尝试启用这些功能。 - ---- - -### (2) 支持范围 - -普通主线支持的关卡范围: -🟡 **第 4 至第 25 章** - ---- - -### (3) 队伍移动逻辑 - -当 BAAS 的滑动操作固定后,所有队伍的移动均以**单次点击**完成。 -由于《碧蓝档案》不同关卡的队伍数量不同, -因此每队的 **编号坐标与移动顺序** 也随之变化。 - ---- - -### (4) 自动推演注意事项 - -执行 **自动推演** 时, -🟡 **必须确保小编号队伍与大编号队伍的分配正确。** -(若不确定,请在执行前仔细核对队伍编号。) - ---- - -### (5) 普通图缩略设置 - -BAAS 将根据以下信息自动判断关卡配置: - -* 🟢 **< 普通图缩略设置 >** -* 🟢 **所选分组属性** -* 🟢 **♪ 队伍逻辑(Team Logic)♪** - -> 图示中第一个对应属性为 **[1]**,第二个为 **[2]**。 - ---- - -## 🤖 二、队伍逻辑(Team Logic) - -1. 优先依据**克制关系(Restraint)**选择队伍,逐步降低属性匹配优先级; -2. 当选择队伍时,满足: - `4 - (队伍编号) >= 剩余所需队伍数`; -3. 若条件 (1) 与 (2) 均不满足,则逐步弱化 [1] 对应的克制关系; -4. 若部分队伍已被选择,且 `4 - max(已选队伍编号) >= 剩余所需队伍数`, - 则补充其他可选编号; -5. 若仍不满足,默认选择 **1、2、3 队**。 - ---- - -### 🧠 示例 - -在 **23 [爆发, 贯穿] 特种部队** 任务中: - -* 每个小队执行一次操作; -* 若 *爆发队 3* 未被选中,则选 **4 队** 作为第二选择; -* 若仍不可用,则选 **12 队** 作为最终替代。 - ---- - -## 🚀 三、推图说明 - -### (1) 区域推图行为 - -若出现 -🟡 **“无法关闭临时文件夹: %s”**, -每个输入的数字代表一个**区域编号**。 -程序将根据是否达到 `SSS` 评级判断是否重打该区域。 - -**示例:** - -```text -15, 16, 14 -``` - -表示程序依次推图:**15 → 16 → 14**。 - ---- - -### (2) 强制打关设置 - -当开启 🟡 **“在指定关卡强制执行”** 时: - -* 输入单个数字 → 表示整章推图一次; -* 输入 `数字-数字` → 表示指定小关卡。 - -**示例:** - -```text -15, 16-3 -``` - ---- - -✅ *提示:* -执行脚本前,请确认关卡编号与队伍分配均正确,以避免自动化行为错误。 diff --git a/service/dist/docs/zh_CN/Difficult Chart Configuration Description.md b/service/dist/docs/zh_CN/Difficult Chart Configuration Description.md deleted file mode 100644 index 21a92ba3a..000000000 --- a/service/dist/docs/zh_CN/Difficult Chart Configuration Description.md +++ /dev/null @@ -1,102 +0,0 @@ - -# 💀 困难图配置说明 - -困难图(Hardship Map)与普通图、队伍逻辑类似。 -部分高难关卡需要 **三支队伍**,且它们与首支队伍属性相同。 - ---- - -## 🧾 填写说明 - -### ⚠️ 可用字符 - -关卡字符串仅能包含以下内容: - -``` -"-", "sss", "present", "task", ",", 数字 -``` - -各段落使用英文逗号(`,`)分隔。 - -> ❌ 请勿在字符串中出现无效关键字,如 `"sss"`、`"present"`、`"task"` 以外的文字。 - ---- - -### 🧩 示例 1:基础用法 - -**输入:** - -``` -15,12-2 -``` - -**解析:** -BAAS 将依次调用: - -``` -15-1, 15-2, 15-3, 12-2 -``` - -并根据困难图设定执行: - -* `sss` → 星级评价 -* `present` → 领取奖励 -* `task` → 挑战任务 - ---- - -### 🧩 示例 2:数字 + 关键字 - -**输入:** - -``` -15-sss-present -``` - -**解析:** -执行 **15-1, 15-2, 15-3**,并同时进行 -`sss`(评级)与 `present`(奖励)操作。 - ---- - -### 🧩 示例 3:数字 + 子关 + 关键字 - -**输入:** - -``` -15-3-sss-task -``` - -**解析:** -执行 **15-3**,并: - -* 达成 `sss` 评级; -* 完成 `task` 挑战。 - ---- - -### 🧩 示例 4:复杂组合 - -**输入:** - -``` -7,8-sss,9-3-task -``` - -**解析:** - -* `(7-1,7-2,7-3)` → 达成 `sss`、领取奖励并完成挑战; -* `(8-1,8-2,8-3)` → 达成 `sss`; -* `(9-3)` → 执行挑战任务。 - ---- - -## 🧠 系统行为说明 - -> 🟡 **注意:** -> BAAS 会自动判断: -> -> * 关卡是否已达成 **`sss`**; -> * 奖励是否已领取。 - -若以上任一条件满足,则自动**跳过该关卡**,以节约运行时间。 diff --git a/service/dist/docs/zh_CN/Frontend Development Guide.md b/service/dist/docs/zh_CN/Frontend Development Guide.md deleted file mode 100644 index 3818855e9..000000000 --- a/service/dist/docs/zh_CN/Frontend Development Guide.md +++ /dev/null @@ -1,102 +0,0 @@ - -# 🏗️ 前端开发指南 - -本文档说明了 **BAAS 桌面端应用** 的整体架构、前后端数据流与扩展规范, -主要面向 **工程与交付团队**,用于新功能开发或项目接入参考。 - ---- - -## 🧩 应用壳(Application Shell) - -React 应用由 `App.tsx` 渲染,负责加载 **ThemeProvider**、**AppProvider** 与主框架 `MainLayout`。 -页面切换使用轻量级 **framer-motion 路由**,在切换标签页时保持非活动页挂载以保存状态。 - -* **入口文件:** `main.tsx` → 初始化 i18n、主题并渲染 `` -* **Provider:** `AppProvider` 加载 UI 偏好、建立 WebSocket 连接、注入配置数据并通过 context 提供方法 -* **布局:** `MainLayout` 含侧边栏 (`Sidebar.tsx`) 与顶部栏 (`Header.tsx`) - ---- - -## 🧱 核心模块 - -| 模块 | 功能说明 | 关键文件 | -| :------------------ | :----------------------------------------------------- | :------------------------------------------------------------------------ | -| **Context** | 在全局共享 UI 设置、当前档案及档案目录。 | `contexts/AppContext.tsx` | -| **State Stores** | 使用 Zustand 管理远程状态(配置、事件、状态、日志等)。 | `store/websocketStore.ts`、`store/globalLogStore.ts` | -| **Remote Services** | 封装后端接口,如快捷键持久化、加密 WebSocket 会话等。 | `services/hotkeyService.ts`、`lib/SecureWebSocket.ts` | -| **Pages** | 对应路由的页面容器(Home、Scheduler、Configuration、Settings、Wiki)。 | `pages/*.tsx` | -| **Feature Forms** | 模块化配置面板,对应 `DynamicConfig` 的局部操作。 | `features/*Config.tsx`、`features/DailySweep.tsx` | -| **Shared UI** | 可复用的界面组件(输入框、选择器、模态框、日志面板等)。 | `components/ui`、`components/AssetsDisplay.tsx`、`components/Particles.tsx` | -| **Hooks** | 包含快捷键控制、主题切换等业务逻辑。 | `hooks/useHotkeys.ts`、`hooks/useTheme.tsx` | - ---- - -## 🔄 数据流说明 - -### 🔌 WebSocket 初始化 - -1. 启动时由 `AppProvider` 调用 `useWebSocketStore.getState().init()`; -2. `init()` 依次连接 **heartbeat**、**provider**、**sync** 通道; -3. 建立连接后,拉取静态数据、配置清单及事件队列; -4. Zustand 将更新广播至订阅组件。 - ---- - -### ⚙️ 配置更新循环 - -1. 功能表单在本地维护 `DynamicConfig` 草稿; -2. 点击保存后生成最小 `patch`,并调用 `modify(path, patch, showToast)`; -3. Store 发送 `sync` 指令并注册回调; -4. 后端确认后,清除等待状态并可通过 `sonner` 弹窗提示; -5. 接收到新的 `config` 消息后,自动同步各组件。 - ---- - -### 📡 调度与监控 - -* 首页与调度页订阅 `statusStore` 与 `logStore` 展示运行数据; -* 日志流水去重后同步至全局日志; -* 所有外发命令均带时间戳以便回溯。 - ---- - -## ⚙️ 跨模块事项 - -### 🌐 国际化 - -翻译文件位于 `assets/locales/*.json`,使用 `react-i18next` 加载。 -默认语言为 **中文(zh)**,英文为回退语言。 - ---- - -### ⚡ 性能与体验 - -* 组件挂载保持,避免频繁初始化; -* 使用 `useMemo`、`useCallback` 减少渲染; -* 滚动区域统一使用 `scroll-embedded`; -* 重日志更新采用不可变追加以减少引用变化。 - ---- - -### 🧰 工具栈 - -* **构建:** Vite + React 19 + TypeScript 5 -* **样式:** Tailwind CSS -* **动画:** `framer-motion`、`ogl` - ---- - -## 🚀 扩展流程清单 - -1. 在 `features/` 中创建或更新功能组件并加入 `featureMap`; -2. 更新 `en.json` 与 `zh.json` 翻译字段; -3. 使用 `modify/patch/trigger` 保持后端确认一致性; -4. 若新增用户设置,则在 `AppContext` 暴露接口。 - ---- - -遵守以上规范可确保: - -* 应用结构一致且可扩展; -* 键盘导航与实时状态同步; -* WebSocket 状态在各页面保持一致。 diff --git a/service/dist/docs/zh_CN/Guide for activity sweep fill in.md b/service/dist/docs/zh_CN/Guide for activity sweep fill in.md deleted file mode 100644 index c238eea2e..000000000 --- a/service/dist/docs/zh_CN/Guide for activity sweep fill in.md +++ /dev/null @@ -1,41 +0,0 @@ - -# ⚔️ 活动扫荡配置指南 - -解释如何在 BAAS 中正确填写**活动扫荡参数**。 - ---- - -## 🧾 单关扫荡 - -**参数:** `Sweep Quest Number` -类型:整数(1 ~ 当前活动最高难度) - -**参数:** `Number of Sweeps` - -1. **整数** → 直接表示扫荡次数; -2. **小数** → 表示使用当前 AP 的比例; -3. **分数** → 表示使用当前 AP 的分数比例。 - ---- - -## 🔁 多关扫荡 - -多个关卡使用英文逗号(`,`)分隔,按顺序依次执行。 - -**示例:** - -``` -关卡: 9, 10, 11 -次数: 0.5, 3, 1/3 -AP: 999 -``` - -| 关卡 | 计算公式 | 执行次数 | -| :-: | :--------------- | :--- | -| 9 | (999 × 0.5) / 20 | 25 次 | -| 10 | 固定 3 次 | 3 次 | -| 11 | (999 × 1/3) / 20 | 16 次 | - ---- - -✅ *提示:* 执行前请确保 AP 数值与游戏内体力一致,避免扫荡次数异常。 diff --git a/service/dist/docs/zh_CN/Internal settings in BlueArchive game (first-use must read).md b/service/dist/docs/zh_CN/Internal settings in BlueArchive game (first-use must read).md deleted file mode 100644 index 47021e09c..000000000 --- a/service/dist/docs/zh_CN/Internal settings in BlueArchive game (first-use must read).md +++ /dev/null @@ -1,29 +0,0 @@ - -# ⚙️ 游戏内部设置(首次使用必读) - ---- - -## 🧩 必须设置 - -| 分类 | 项目 | 值 / 说明 | -| :------ | :------ | :------------- | -| 图形设置 | 战斗竖屏文本框 | 关闭(Off) | -| 回忆大厅 | 不可选择角色 | Ako、Aru、Wakamo | -| 语言(国际服) | — | 英语(English) | - ---- - -## 💡 推荐设置(可选) - -| 项目 | 建议值 | -| :----- | :----- | -| 分辨率 | 最高 | -| 帧率 | 60 FPS | -| 加速渲染模式 | 兼容模式 | -| 后处理 | 开启 | -| 抗锯齿 | 开启 | - ---- - -✅ *提示:* -高画质有助于脚本识别稳定,但并非必要条件。 diff --git a/service/dist/docs/zh_CN/Normal Sweeping Scanning Description.md b/service/dist/docs/zh_CN/Normal Sweeping Scanning Description.md deleted file mode 100644 index 6389cf14f..000000000 --- a/service/dist/docs/zh_CN/Normal Sweeping Scanning Description.md +++ /dev/null @@ -1,47 +0,0 @@ - -# 🧹 普通扫荡配置说明 - -每组扫荡配置格式如下: - -``` -region - task-number - sweep-times -``` - -| 项 | 含义 | -| :--- | :------- | -| 区域编号 | 地图或章节代号 | -| 关卡编号 | 区域内的小关编号 | -| 扫荡次数 | 执行次数 | - ---- - -### 🗺️ 可扫荡区域 - -支持 **学院 1 与 5 之后** 的所有地图。 -例如: - -``` -12-1-3, 13-2-2, 14-4-1 -``` - ---- - -### ⚙️ 特殊说明 - -国际服中 `sweep-times` 字段可填写 `max`,表示使用全部体力扫荡。 - -示例: - -``` -15-3, 20-3-max -``` - -含义: - -* 15-3 扫 3 次; -* 20-3 用剩余体力扫荡至上限。 - ---- - -✅ *提示:* -仅当希望自动消耗体力时使用 `max`,否则请手动指定次数。 diff --git a/service/dist/docs/zh_CN/Scheduling Configuration Filling Guide.md b/service/dist/docs/zh_CN/Scheduling Configuration Filling Guide.md deleted file mode 100644 index 962b7c8e4..000000000 --- a/service/dist/docs/zh_CN/Scheduling Configuration Filling Guide.md +++ /dev/null @@ -1,66 +0,0 @@ - -# 🕒 调度配置填写指南 - ---- - -## ⚙️ 1. 优先级 - -队列中存在多个任务时,**优先级数值越小,越先执行**。 - ---- - -## ⏳ 2. 执行间隔 - -* 整数 `0` 表示每日执行一次; -* 更大的整数代表更长天数间隔。 - ---- - -## 🕐 3. 每日定时执行 - -任务每日固定时间执行(可多时段,以逗号分隔)。 - -格式: - -``` -[[h, m, s]] (UTC 时间) -``` - -示例: - -``` -[[0, 0, 0], [20, 0, 0]] -``` - -表示北京时间(UTC+8)上午 8 点与下午 4 点执行。 - ---- - -## 🚫 4. 禁止执行时间段 - -任务在特定时间段内不会运行。 -格式: - -``` -[[[h1, m1, s1], [h2, m2, s2]]] -``` - -示例: - -``` -[[[0,0,0],[24,0,0]]] -``` - -表示全天禁用。 - ---- - -## 🔁 5. 前置与后置任务 - -* **前置任务:** 在当前任务前执行; -* **后置 - - -任务:** 在当前任务后执行。 - -保证依赖任务顺序正确。 diff --git a/service/dist/docs/zh_CN/Task force attributes required by region.md b/service/dist/docs/zh_CN/Task force attributes required by region.md deleted file mode 100644 index 0165fde41..000000000 --- a/service/dist/docs/zh_CN/Task force attributes required by region.md +++ /dev/null @@ -1,35 +0,0 @@ - -# 🎯 区域对应属性表 -| 区域 | 属性① | 属性② | -|:----:|:------|:------| -| 25 | 振动 | 贯穿 | -| 24 | 振动 | 爆发 | -| 23 | 爆发 | 贯穿 | -| 22 | 贯穿 | 神秘 | -| 21 | 神秘 | 爆发 | -| 20 | 爆发 | 贯穿 | -| 19 | 贯穿 | 神秘 | -| 18 | 神秘 | 爆发 | -| 17 | 爆发 | 贯穿 | -| 16 | 贯穿 | 神秘 | -| 15 | 神秘 | 神秘 | -| 14 | 爆发 | 神秘 | -| 13 | 贯穿 | 贯穿 | -| 12 | 神秘 | 爆发 | -| 11 | 贯穿 | 神秘 | -| 10 | 爆发 | 神秘 | -| 9 | 爆发 | 贯穿 | -| 8 | 贯穿 | 贯穿 | -| 7 | 爆发 | 爆发 | -| 6 | 贯穿 | 贯穿 | -| 5 | 爆发 | — | -| 4 | 贯穿 | — | -| 3 | 贯穿 | — | -| 2 | 爆发 | — | -| 1 | 爆发 | — | - ---- - -✅ *提示:* -规划作战时请根据敌方弱点选择对应属性队伍。 -双属性关卡建议使用**均衡队伍**以保证整体稳定性。 diff --git a/service/dist/docs/zh_CN/reporting guidelines on issues (important).md b/service/dist/docs/zh_CN/reporting guidelines on issues (important).md deleted file mode 100644 index b3d816ec4..000000000 --- a/service/dist/docs/zh_CN/reporting guidelines on issues (important).md +++ /dev/null @@ -1,59 +0,0 @@ - -# 🧭 问题汇报与自检指南 - -在提交问题前,请先按以下清单自检,确保问题可复现、描述清晰,方便他人协助。 - ---- - -## 💡 报告前思考 - -1. **此问题以前是否出现过?** - 可先尝试自行解决(百度、文档)。 - 若无法解决,再进行汇报。 - -2. **问题是否每次运行都会出现?** - 稳定复现有助于判断环境或脚本错误。 - -3. **能否提供足够信息让他人复现?** - 包括日志、截图与配置说明。 - -4. **让报告更清晰、吸引人。** - 例如 QQ 群内配色日志截图更容易吸引帮助。 - ---- - -## 🎨 问题类型与对应汇报要求 - -*(🟡 黄色项为必填)* - -### 🧱 “我卡在某个页面!” - -🟡 **(1)** 分辨率设为 1280×720(MuMu 可按 F9)。 - -(2) 提供 **BAAS 日志截图**。 - -(3) 尝试切换页面判断是否仅在该页卡顿。 - ---- - -### 🧍 “我无法移动!” - -(1) 重复尝试 1~2 次,观察是否每次卡在同一位置。 - -🟡 **(2)** 录制**完整视频**(从启动到卡顿), - -并确保 **模拟器与 BAAS 日志界面** 同屏录制。 - ---- - -### ⚙️ “我配置了 XXX 但没有执行!” 或 “我没配置 XXX 却执行了!” - -(1) 请仔细阅读配置说明,确认填写正确; - -🟡 **(2)** 提供配置截图与程序日志。 - ---- - -✅ *提示:* -完整的报告应能让他人无需猜测即可复现问题。 -附带日志、截图与清晰背景说明可显著提高解决效率。 \ No newline at end of file diff --git a/service/dist/favicon.ico b/service/dist/favicon.ico deleted file mode 100644 index 7c15af56040a813eb5a165e0c4f8ad519d6b168f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 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 Hy9NFODW5{e diff --git a/service/dist/fonts/JetBrainsMono.ttf b/service/dist/fonts/JetBrainsMono.ttf deleted file mode 100644 index 4c96e79855b725416b59ef700f0e2773c444d716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189028 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: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

    hkA|(TNmE{-ab;u^$V$0 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 diff --git a/service/dist/fonts/SourceHanSans-Subset-JP.woff2 b/service/dist/fonts/SourceHanSans-Subset-JP.woff2 deleted file mode 100644 index 559c806a915acb3711837605b8e071db3ffb479b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258428 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

    V8SeCCxoGmPo$%3DwL+X+M!VINh_8V=koza!kb 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

      jyxdYHxItyUlAoP4H-Z{SV{IeoxuK&@iQS1=P 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®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 VIxnfS$Ys^-|1&!V(1pAV006$B8T$YL diff --git a/service/dist/fonts/SourceHanSans-Subset-SC.woff2 b/service/dist/fonts/SourceHanSans-Subset-SC.woff2 deleted file mode 100644 index 36ba3affd94765fdb91479b305aa8e200dcdedb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266404 zcmV(TTnxmL4jlJ-jO&^Tj@3g&grR{=}eDo6|(ahvUxPRLSmHu z8*0Y3tbxIK5E2A^_c8zf|Np-#nS^X!Qg%s_Z=ui@0E((IRkuyhNO-_K$P5??(E`Dc z1f|1WIIL$nl8$PY#8BAw+P0Jubd^*|wNWX!sXJ<^ldg6iRZ?AW2R#(?Gt{bhr zsWhf0X)Btv6qz5{2~ozFAtNK-4jIGq=h|QI2QCm-9Th~cmc*;08qBT#zL-5_&{~o< zwG^l@%nW!DE0l&ZBC=|J5z~b{y!8(3_-1BUDY8MdoE;A zIl%H{3|dr)M^@ybh!$oZNC5%=^nauKW;$`K30MNl`zt`;@Biogf6m|gyWH!A7Of~6 zBZw9vSb|t7P)N=RrKw?ctRVppF`#0o1PGMUUMMCBP*c1Gb~@`Y-~aw={r~;C<9^29 zwI|>WO&jgBASNZ2S(UoQ*IqisVn_HCU*cOdP0O7U@WKijYi9OXod4

      ie@<&Z^C& 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 z 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 z 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Μ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 Owqdg1nK=!*{R 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 Ui~j%s00U!2Xw4a;G-cob0J#scFaQ7m diff --git a/service/dist/icons/property/currency_icon_gold.webp b/service/dist/icons/property/currency_icon_gold.webp deleted file mode 100644 index dcc97f66c9da0fd91009daaebb07735845979a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9124 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 diff --git a/service/dist/icons/property/item_icon_craftitem_1.webp b/service/dist/icons/property/item_icon_craftitem_1.webp deleted file mode 100644 index 46aa6b97bf33eb4ca46442f0b443dd01898ebe65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15208 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
      e$6)JisbLG(PYCCG zG5_movBRhoe|9yT*O4 zaJ`vkv+jq~VW0y(;mfD?4Q4Q<_`HUo}$bTiWbDK9pVi{pqe`Y|2R&w}6Il(CUB zFh%Jop9QbsbgD$Y)+bI+hU(Tg+DCE-#o67A=4bae1yumB zgOiv@*7`}aZM1=hjAIaZvgEtvN>9)K5+`)AGMgPs`4tl&P6g&Ctf7#c2{U7i1(@>z zDr)>1112<-*&zh9bdXk4B&smnx{y2Sr41pwL;)X$#%mg{RsLl1MwlS59+;je`7-R^sKKnVL-jb2>jh48c3bm7+1%u$b034M9E-Cj?&CDh%n#5`dVWC5rv25PTq zjo=P~vTUfw*D&RrJC>6-M#4TLFzPExF)mrgYp!YD_w$n;p zR;PjP2J=)Fn=Cp$MxR$XC*H7W*6hF84%Fe!o<#>bqq~kTxfu`iSomTZnQt{uw$jl6 z3TBz#VOD)zd!?|{_8I%+Y*`YN_ilP-jAoU%>U!?*p^(26MM(8>)dKBK0P5{YnDIER zkO3O8&zd1;%vShVrB`YyA|q)po+{$9PYC+w%b}atXC6{tM{@|uTcka6=nC@~x>AhA zwN@(p5rDI7<;z@|f@?z?H%~N|e>Z0A`IaKtSOY*n*6AnOJLf>}GZ*;+gRn>S@v;M1 z8ERq6MO~JFs_k*Vj3Ti<-+wPYi?gT%td@Bm#nRTJX-ooqvBgeTnJ16U-BMu1O$2E)hrHUI#DX=%u` z6(L3#|J$^U4LoZ0eZoreAo65UMWrqhZXbVq#)MS zx-|)_aaj{h1J|wB2?ccY^dEU*3ZDFMb|d>@_Nsv3L%rT?ic^LBmk&t7TUK z(YYUBT;k21N;KT&cv$EPtA}ZbsP<;*e>l$=>4G`~lSJospsD`IAOc;Kp@Dish*Ceb z2@|c9xAiViZew`gKl4uj761SRc19QFd}-QvZMh~EIn>6VPwZV~K%|N)=?X6xqIaRC iK+*mUg9G?B0zdt4I0Co(ndk@?WIu3HAOEWl0001Wikuw) diff --git a/service/dist/icons/property/item_icon_pass.webp b/service/dist/icons/property/item_icon_pass.webp deleted file mode 100644 index d38149f91f607b2631fc44f46d47ab8695939c60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15342 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 M4+gKi000000EL#^o&W#< diff --git a/service/dist/icons/regular/ic_warning.svg b/service/dist/icons/regular/ic_warning.svg deleted file mode 100644 index 0208d9b76..000000000 --- a/service/dist/icons/regular/ic_warning.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/service/dist/images/bg-dark.webp b/service/dist/images/bg-dark.webp deleted file mode 100644 index 455c4e90b8462d30b1566135fd6e696f899d91df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251202 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%0DiAdKS}=-* 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
    1. 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 V;7TOfQt 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 z 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

      {?Q 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 NLfuN{YF3R10016EZpQ!s diff --git a/service/dist/images/logo.png b/service/dist/images/logo.png deleted file mode 100644 index f29032f50c369d21b4b99b3c41a39a375d18e89b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126799 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

      0Gf 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 diff --git a/service/dist/index.html b/service/dist/index.html deleted file mode 100644 index 7b54afa8c..000000000 --- a/service/dist/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - Blue Archive Auto Script - - - - - - - - - - - -

      - - diff --git a/service/dist/locales/de.json b/service/dist/locales/de.json deleted file mode 100644 index 3f3470719..000000000 --- a/service/dist/locales/de.json +++ /dev/null @@ -1,449 +0,0 @@ -{ - "appTitle": "BAAS", - "home": "Startseite", - "scheduler": "Planer", - "configuration": "Konfiguration", - "settings": "Einstellungen", - "updates": "Updates", - "start": "Start", - "stop": "Stopp", - "edit": "Bearbeiten", - "runningTask": "Laufende Aufgabe", - "noTaskRunning": "Derzeit wird keine Aufgabe ausgeführt", - "taskQueue": "Aufgabenwarteschlange", - "noTasksQueued": "Keine Aufgaben in der Warteschlange", - "logs": "Protokolle", - "assets": "Ressourcen", - "lastUpdated": "Zuletzt aktualisiert", - "secondsAgo": "vor {{count}} Sekunden", - "minutesAgo": "vor {{count}} Minuten", - "hoursAgo": "vor {{count}} Stunden", - "daysAgo": "vor {{count}} Tagen", - "configProfile": "Profil: {{name}}", - "addProfile": "Profil hinzufügen", - "switch.on": "Ein", - "switch.off": "Aus", - "confirm": "Bestätigen", - "cancel": "Abbrechen", - "save": "Speichern", - "settingsSaved": "Einstellungen gespeichert!", - "featureSettings": "Funktionseinstellungen", - "cafe": "Café", - "cafeDesc": "Café-Einladungen und Belohnungen verwalten", - "schedule": "Zeitplan", - "scheduleDesc": "Tägliche Zeitpläne konfigurieren", - "shop": "Shop-Käufe", - "shopDesc": "Kaufprioritäten für Gegenstände festlegen", - "arena": "Arena", - "arenaDesc": "Arenakämpfe automatisieren", - "generalSettings": "Allgemeine Einstellungen", - "server": "Server", - "serverDesc": "Spielserver- und Verbindungseinstellungen", - "emulator": "Emulator", - "emulatorDesc": "Emulator-Pfad und Startoptionen", - "push": "Push-Benachrichtigungen", - "pushDesc": "Push-Benachrichtigungen konfigurieren", - "other": "Sonstiges", - "otherDesc": "Verschiedene Funktionen und Einstellungen", - "taskOverview": "Aufgabenübersicht", - "uiSettings": "UI-Einstellungen", - "theme": "Thema", - "light": "Hell", - "dark": "Dunkel", - "system": "System", - "language": "Sprache", - "english": "English", - "chinese": "简体中文", - "japanese": "日本語", - "korean": "한국어", - "russian": "Русский", - "french": "Français", - "deutsch": "Deutsch", - "cafe.useInvitation": "Einladungsticket verwenden", - "cafe.patRounds": "Streichelrunden", - "cafe.patRoundsDesc": "Höhere Runden verringern die Wahrscheinlichkeit, Streicheleinheiten zu verpassen", - "server.server": "Spielserver", - "server.cn.official": "Offiziell (CN)", - "server.cn.bilibili": "Bilibili (CN)", - "server.global": "Global", - "server.global.teen": "Global (Teen)", - "server.kr.one": "Korea (ONE store)", - "server.jp": "Japan", - "server.adbIP": "ADB IP-Adresse", - "server.adbPort": "ADB-Port", - "comingSoon.title": "Demnächst verfügbar", - "comingSoon.desc": "Die Konfiguration für diese Funktion wurde noch nicht implementiert.", - "schedule.title": "Tagesaufgabenplan", - "schedule.desc": "Wählen Sie die täglichen Aufgaben aus, die automatisiert werden sollen.", - "schedule.cafe": "Café-Interaktion", - "schedule.lessons": "Lektionen", - "schedule.bounty": "Kopfgeld", - "schedule.commissions": "Kommissionen", - "schedule.shop": "Shop-Kauf", - "shop.title": "Einstellungen für Shop-Käufe", - "shop.buyAp": "AP mit Pyroxenen kaufen", - "shop.buyApDesc": "AP automatisch kaufen, wenn sie nicht ausreichen.", - "shop.refreshAp": "AP mit Pyroxenen auffrischen", - "shop.refreshApDesc": "Erlaubt das Ausgeben von Pyroxenen zum Auffrischen von AP.", - "arena.title": "Arena-Automatisierung", - "arena.enable": "Arena-Automatisierung aktivieren", - "arena.enableDesc": "Gegner in der Arena automatisch herausfordern.", - "arena.attempts": "Tägliche Herausforderungsversuche", - "emulator.title": "Emulator-Einstellungen", - "emulator.autoStart": "Emulator automatisch starten", - "emulator.autoStartDesc": "Das Skript versucht, den Emulator zu starten, wenn er nicht läuft.", - "emulator.path": "Emulator-Pfad", - "emulator.pathDesc": "Geben Sie den vollständigen Pfad zur ausführbaren Datei des Emulators an.", - "push.title": "Einstellungen für Push-Benachrichtigungen", - "push.enable": "Push-Benachrichtigungen aktivieren", - "push.enableDesc": "Benachrichtigungen senden, wenn Aufgaben abgeschlossen sind oder Probleme auftreten.", - "push.webhookUrl": "Webhook-URL", - "push.webhookUrlPlaceholder": "Geben Sie Ihre Webhook-URL ein (z. B. Bark, ServerChan)", - "other.title": "Andere Einstellungen", - "other.screenshotOnError": "Screenshot bei Fehler", - "other.screenshotOnErrorDesc": "Automatisch einen Screenshot machen, wenn das Skript auf einen Fehler stößt.", - "property.ap": "AP", - "property.credits": "Credits", - "property.pyroxene": "Pyroxen", - "property.coin.arena": "Arena-Münze", - "property.coin.commission": "Kommissions-Münze", - "property.keystone": "Schlussstein", - "property.keystone.piece": "Stück", - "property.pass": "Pass", - "log.scroll": "Nach unten scrollen", - "log.scroll.detail": "Das Protokolltextfeld nach unten scrollen", - "assetsDisplay.detail": "Ressourcendetails anzeigen", - "hotkeys": "Tastenkombinationen", - "Invalid hotkey format": "Ungültiges Tastenkombinationsformat", - "Duplicated hotkey": "Doppelte Tastenkombination", - "Use combinations like": "Verwenden Sie Kombinationen wie", - "Leave empty to unbind": "Leer lassen, um die Bindung aufzuheben", - "Please fix invalid or duplicated hotkeys.": "Bitte beheben Sie ungültige oder doppelte Tastenkombinationen.", - "hotkey.switch.start": "Start/Stopp", - "hotkey.toggle.scroll": "Nach unten scrollen umschalten", - "hotkey.open.settings": "Einstellungen öffnen", - "hotkey.clear.logs": "Protokolle löschen", - "hotkey.focus.search": "Suche fokussieren", - "hotkey.help.about": "Hilfe / Über", - "Search hotkeys": "Tastenkombinationen suchen", - "student.search": "Schüler suchen", - "log.export": "Protokolle exportieren", - "nextTask": "Nächste Aufgabe", - "rename": "Umbenennen", - "delete": "Löschen", - "editProfile": "Profil bearbeiten", - "profileName": "Profilname", - "createProfile": "Profil erstellen", - "creditpoints": "Kreditpunkte", - "pyroxene": "Pyroxen", - "confirmDeleteTitle": "Löschung bestätigen", - "confirmDeleteMessage": "Sind Sie sicher, dass Sie das Profil '{{name}}' löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden!", - "ui.zoom": "UI-Zoom-Einstellungen", - "commonShop.title": "Allgemeiner Shop", - "tacticalShop.title": "Taktischer Herausforderungsshop", - "commonShop.refreshTimes": "Anzahl der Shop-Aktualisierungen", - "commonShop.refreshDesc": "Shop automatisch aktualisieren", - "add": "Hinzufügen", - "Add Student": "Schüler hinzufügen", - "placeholder.config.insert": "Bitte geben Sie hier Ihre Konfiguration ein", - "placeholder.stage": "Schüler auswählen", - "stage.normalLabel": "Tägliches Sweepen normaler Stufen", - "stage.hardLabel": "Tägliches Sweepen schwerer Stufen", - "dailySweep": "Täglich", - "dailySweepDesc": "Einstellungen für tägliches Stufenräumen und Sweepen", - "placeholder.nobinding": "Nicht gebunden", - "tactical": "Großangriff", - "tacticalDesc": "Einstellungen für den Großangriff", - "drill": "Gemeinsame Feuerübung", - "drillDesc": "Einstellungen für die gemeinsame Feuerübung", - "artifact": "Herstellung", - "artifactDesc": "Herstellungseinstellungen", - "whitelist": "Freunde-Whitelist", - "whitelistDesc": "Whitelist für das automatische Löschen von Freunden", - "script": "Skripteinstellungen", - "scriptDesc": "Einstellungen zur Skriptausführung", - "stage": "Stufe abschließen", - "stageDesc": "Hilft Ihnen, Stufen automatisch abzuschließen", - "team": "Formation", - "teamDesc": "Richten Sie Ihre Formationen ein", - "eventName.restart": "Neustart um 4 Uhr morgens", - "eventName.arena": "Arena", - "eventName.cafe_reward": "Café", - "eventName.no1_cafe_invite": "Einladung Café 1", - "eventName.no2_cafe_invite": "Einladung Café 2", - "eventName.lesson": "Lektionen", - "eventName.group": "Clubeinnahmen einsammeln", - "eventName.collect_daily_free_power": "Kostenlose AP einsammeln", - "eventName.mail": "Post prüfen", - "eventName.collect_daily_power": "Tägliche AP einsammeln", - "eventName.common_shop": "Shop-Kauf", - "eventName.tactical_challenge_shop": "Kauf im taktischen Herausforderungsshop", - "eventName.rewarded_task": "Kopfgeld", - "eventName.normal_task": "AP in normalen Stufen verbrauchen", - "eventName.hard_task": "AP in schweren Stufen verbrauchen", - "eventName.scrimmage": "Kommissionen", - "eventName.clear_special_task_power": "Tägliche Spezialmissionen", - "eventName.create": "Automatische Herstellung", - "eventName.total_assault": "Großangriff", - "eventName.activity_sweep": "Event-Sweep", - "eventName.collect_reward": "Belohnungen einsammeln", - "eventName.momo_talk": "Automatisches MomoTalk", - "eventName.dailyGameActivity": "Tägliches Minispiel", - "eventName.friend": "Freundesliste aufräumen", - "eventName.joint_firing_drill": "Gemeinsame Feuerübung", - "eventName.pass": "Pass-Belohnungen beanspruchen", - "scheduler.inactiveTasks": "Inaktive Aufgaben", - "scheduler.activeTasks": "Aktive Aufgaben", - "scheduler.search": "Aufgaben suchen", - "scheduler.sortDefault": "Standard-Sortierung", - "scheduler.sortByTime": "Nach Zeit sortieren", - "scheduler.detailConfig": "Detaillierte Aufgabenplankonfiguration", - "scheduler.eventName": "Aufgabenname", - "scheduler.nextTick": "Nächste Ausführungszeit", - "scheduler.priority": "Priorität", - "scheduler.interval": "Intervall (Sekunden)", - "scheduler.dailyReset": "Tägliche Rücksetzzeit", - "scheduler.disabledRange": "Deaktivierter Zeitbereich", - "scheduler.preTask": "Vorausgehende Aufgabe", - "scheduler.postTask": "Nachfolgende Aufgabe", - "common.confirm": "Bestätigen", - "scheduler.selector": "Aufgabenauswahl", - "cafe.basicSettings": "Grundlegende Café-Einstellungen", - "cafe.cafe1Settings": "Einstellungen Café 1", - "cafe.cafe2Settings": "Einstellungen Café 2", - "cafe.collectReward": "Belohnungen einsammeln", - "cafe.exchangeStudent": "Schüler wechselt Outfit", - "cafe.duplicateInvite": "Doppelte Einladung", - "cafe.hasNo2Cafe": "Café 2", - "cafe.patStyle": "Streichelstil", - "cafe.patStyleDragGift": "Geschenk ziehen", - "cafe.invite1Mode": "Einladungsmodus", - "cafe.invite2Mode": "Einladungsmodus", - "cafe.lowestAffection": "Nach niedrigster Zuneigung", - "cafe.highestAffection": "Nach höchster Zuneigung", - "cafe.starred": "Nach favorisierten Schülern", - "cafe.byName": "Nach Schülernamen", - "cafe.starredPosition": "Position favorisierter Schüler", - "cafe.cafe1Students": "Liste der Schülernamen", - "cafe.cafe2Students": "Liste der Schülernamen", - "lesson.enableFavorStudent": "Favorisierte Schüler bevorzugen", - "lesson.relationshipFirst": "Schüler mit hoher Zuneigung bevorzugen", - "lesson.region": "Lektionsregion", - "lesson.favorStudent": "Favorisierte Schüler", - "artifact.global": "Globale Einstellungen", - "artifact.phase_1": "Phase 1", - "artifact.phase_2": "Phase 2", - "artifact.phase_3": "Phase 3", - "artifact.useTicketDesc": "Herstellungstickets verwenden", - "artifact.createTime": "Anzahl der Herstellungen", - "artifact.phaseCount": "Herstellungsphase", - "artifact.materialSelect": "Materialauswahl", - "artifact.phase2.recommend": "Empfehlung basierend auf Schüler", - "artifact.selectStudent": "Schüler auswählen", - "artifact.priority": "Priorität", - "artifact.default": "Standard", - "artifact.white": "Weiß", - "artifact.blue": "Blau", - "artifact.whiteBlue": "Weiß & Blau", - "artifact.gold": "Gold", - "artifact.purple": "Lila", - "artifact.goldPurple": "Gold & Lila", - "artifact.all": "Alle", - "artifact.saved": "Einstellungen gespeichert", - "artifact.savedDesc": "Ihre Herstellungseinstellungen wurden gespeichert.", - "arena.higherLevel": "Gegnerlevel höher als deins um", - "arena.max_refresh_times": "Maximale Aktualisierungsversuche", - "arena.opponent_no": "Gegnernummer", - "stage.dailyTab": "Stufen-Sweep", - "stage.sweepTab": "Sweep-Details", - "sweep.rewarded": "Anzahl der Kopfgeld-Sweeps", - "sweep.scrimmage": "Anzahl der Kommissions-Sweeps", - "sweep.activityNumber": "Event-Stufe für Sweep", - "sweep.activityTimes": "Anzahl der Event-Stufen-Sweeps", - "sweep.special": "Anzahl der Spezialmissions-Sweeps", - "sweep.purchaseRewarded": "Anzahl der gekauften Kopfgeldtickets", - "sweep.purchaseLesson": "Anzahl der gekauften Lektionstickets", - "sweep.purchaseScrimmage": "Anzahl der gekauften Kommissionstickets", - "stage.normalDesc": "Normale Stufen und Anzahl (z. B. \"1-1-1,1-2-3\" bedeutet Stufe 1-1 einmal, dann 1-2 dreimal)", - "stage.hardDesc": "Einstellungen für schwere Stufen sind gleich. Hinweis: max. 3 Versuche. Englische Kommas verwenden. Für JP/Global-Server kann 'max' verwendet werden.", - "stage.selectStudent": "Schüler auswählen", - "tactical.hardLevel": "Schwierigkeit des Großangriffs", - "drill.out_partyNo": "Teamnummer", - "drill.difficulty": "Übungsschwierigkeit", - "drill.useAllAfterSweep": "Alle Übungstickets nach dem Einsatz verwenden", - "friend.placeholder": "Freundescode eingeben", - "friend.add": "Hinzufügen", - "friend.empty": "Freunde-Whitelist ist leer", - "friend.addFailed": "Hinzufügen fehlgeschlagen", - "friend.alreadyExists": "Freund existiert bereits", - "friend.addedSuccess": "Erfolgreich hinzugefügt", - "friend.added": "Freund hinzugefügt:", - "friend.deletedSuccess": "Erfolgreich gelöscht", - "friend.deleted": "Freund gelöscht:", - "friend.invalidLength": "Ungültige Freundescode-Länge", - "adb.title": "ADB-Erkennungsfeld", - "adb.detectBtn": "ADB erkennen", - "adb.detecting": "Erkenne ADB...", - "adb.noData": "Keine ADB-Daten verfügbar", - "script.screenshotInterval": "Screenshot-Intervall (Sekunden)", - "script.autostart": "Automatischer Start bei Skriptstart", - "script.screenshotMethod": "Screenshot-Methode", - "script.controlMethod": "Steuerungsmethode", - "script.then": "Aktion nach Aufgabenabschluss", - "script.doNothing": "Nichts tun", - "script.exitBaas": "Blue Archive beenden", - "script.exitEmu": "Emulator beenden", - "script.exitBoth": "Blue Archive und Emulator beenden", - "script.shutdown": "Computer herunterfahren", - "emulator.openOnLaunch": "Emulator bei Skriptstart öffnen", - "emulator.multiInstance": "Emulator-Multi-Instanz", - "emulator.waitTime": "Wartezeit für Emulatorstart (Sekunden)", - "emulator.multiType": "Emulatortyp", - "emulator.instanceCount": "Nummer der Multi-Instanz", - "emulator.address": "Emulator-Pfad", - "choose": "Wählen", - "execute": "Ausführen", - "stage.exploreTab": "Hauptgeschichte", - "stage.eventTab": "Event-Stufen", - "stage.manualBoss": "Manueller Bosskampf", - "stage.normalTask": "Normale Mission", - "stage.hardTask": "Schwere Mission", - "stage.currentEvent": "Aktuelles Event", - "stage.story": "Story-Stufen abschließen", - "stage.mission": "Missions-Stufen abschließen", - "stage.challenge": "Herausforderungs-Stufen abschließen", - "stage.attrTable": "Referenztabelle der Stufenattribute", - "stage.noEvent": "Derzeit kein Event", - "team.chooseMethod": "Formationsmethode", - "push.afterError": "Push-Nachricht bei Fehler", - "push.afterCompletion": "Push-Nachricht nach Abschluss aller Aufgaben", - "push.json": "JSON-Push", - "push.serverchan": "ServerChan-Push", - "other.fhx": "Ein-Klick-Anti-Zensur", - "other.fhxDesc": "Versucht, den Anti-Zensur-Patch anzuwenden (CN-exklusiv)", - "versionInfo": "Versionsinformationen", - "localVersion": "Aktuelle Version", - "remoteVersion": "Neueste Version", - "updateMethod": "Aktion", - "globalUpdateSettings": "Update-Einstellungen", - "updateChannel": "Update-Kanal", - "mirrorCdk": "MirrorC CDK (Optional)", - "mirror.verify": "CDK überprüfen", - "mirror.verifying": "Überprüfe", - "mc.verify.success": "MirrorC CDK-Überprüfung erfolgreich!", - "mc.verify.error": "Fehler bei der MirrorC CDK-Überprüfung!", - "enterCdk": "CDK eingeben", - "shaConnectivityTest": "SHA-Abrufmethode", - "shaTest.method": "Methode", - "shaTest.status": "Status", - "shaTest.time": "Benötigte Zeit", - "shaTest.sha": "SHA-Wert", - "shaTest.testing": "Teste SHA...", - "shaTest.testAll": "Alle Methoden testen", - "configAdd.nameRequired": "Profilname darf nicht leer sein", - "configAdd.serverRequired": "Ein Server muss angegeben werden", - "configAdd.nameDuplicate": "Profilname existiert bereits", - "configAdd.selectServer": "Bitte einen Server auswählen", - "create": "Erstellen", - "settings.updateSuccess": "Einstellungen erfolgreich aktualisiert", - "settings.updateSuccessDesc": "Ihre Einstellungen wurden erfolgreich aktualisiert.", - "stage.story.main": "Hauptgeschichte abschließen", - "stage.story.group": "Club-Geschichten abschließen", - "stage.story.mini": "Mini-Geschichten abschließen", - "stage.taskTriggerStart": "Aufgabe wurde verteilt", - "stage.taskTriggered": "Verteilte Aufgabe: {{task}}", - "stage.noHardTask": "Keine schweren Stufen festgelegt!", - "stage.noNormalTask": "Keine normalen Stufen festgelegt!", - "start_hard_task": "Schwere Stufen starten", - "start_normal_task": "Normale Stufen starten", - "start_fhx": "Anti-Zensur anwenden", - "start_main_story": "Hauptgeschichte starten", - "start_group_story": "Club-Geschichten starten", - "start_mini_story": "Mini-Geschichten starten", - "start_explore_activity_story": "Event-Geschichte starten", - "start_explore_activity_mission": "Event-Missionen starten", - "start_explore_activity_challenge": "Event-Herausforderungen starten", - "main_story": "Hauptgeschichte abschließen", - "group_story": "Club-Geschichten abschließen", - "mini_story": "Mini-Geschichten abschließen", - "explore_activity_story": "Event-Geschichte abschließen", - "explore_activity_mission": "Event-Missionen abschließen", - "explore_activity_challenge": "Event-Herausforderungen abschließen", - "de_clothes": "Anti-Zensur", - "explore_hard_task": "Schwere Stufen abschließen", - "explore_normal_task": "Normale Stufen abschließen", - "title.updateSetting": "Update", - "shaMethod.github": "GitHub API", - "shaMethod.mirrorc": "Kostenlose MirrorC API", - "shaMethod.gitee": "Gitee-Repository", - "shaMethod.gitcode": "GitCode-Repository", - "shaMethod.tencent_c_coding": "Tencent Cloud Coding-Repository", - "cdk.noCDKInput": "Bitte geben Sie den MirrorC CDK ein!", - "CDK invalid.": "CDK ungültig.", - "CDK valid.": "CDK gültig.", - "Please confirm that you have entered the correct cdkey": "Bitte bestätigen Sie, dass Sie den korrekten CDK eingegeben haben", - "CDK valid. Expires at {}": "Dieser CDK ist gültig bis {{expire_date}}.", - "CDK expired.": "CDK ist abgelaufen.", - "CDK quota exhausted for today.": "CDK läuft heute ab.", - "CDK mismatched for requested resource.": "CDK stimmt nicht mit dem angeforderten Repository überein.", - "CDK blocked.": "CDK wurde vom Administrator gesperrt.", - "CDK Test OK": "CDK-Überprüfung erfolgreich", - "version.fetching": "Wird abgerufen...", - "version.untested": "Nicht getestet", - "version.testing": "Wird getestet...", - "version.tapToTest": "Auf Updates prüfen", - "version.checkError": "Version konnte nicht abgerufen werden", - "heartbeat.connected": "Dienst verbunden", - "heartbeat.connecting": "Verbinde mit Dienst...", - "updateMethod.github": "GitHub (Haupt-Repository)", - "updateMethod.gitee": "Gitee (China-Spiegel)", - "updateMethod.gitcode": "GitCode (China-Spiegel)", - "updateMethod.tencent": "Tencent Cloud Coding (China-Spiegel)", - "updateMethod.mirrorc": "MirrorC Update", - "update.dueDate": "Ablaufdatum", - "placeholder.profileName": "Geben Sie hier Ihren Profilnamen ein", - "update.available": "Neue Version verfügbar", - "property.burst": "Explosiv", - "property.pierce": "Durchdringend", - "property.mystic": "Mystisch", - "property.shock": "Schall", - "property.Unused": "Unbenutzt", - "team.preset": "Nach voreingestellter Formation", - "team.side": "Nach Seitenleisten-Attributen", - "team.order": "Nach Seitenleisten-Reihenfolge", - "schedule.primary": "Anfänger", - "schedule.normal": "Normal", - "schedule.advanced": "Fortgeschritten", - "schedule.superior": "Experte", - "lesson.times": "Lektionsversuche", - "confirmUpdateTitle": "Update bestätigen", - "updatePrompt": "Eine neue Version wurde erkannt, jetzt aktualisieren?", - "updateNotice": "Bitte stoppen Sie alle laufenden Aufgaben vor dem Update.", - "title.wiki": "Doku", - "wiki": { - "title": "Wiki-Dokumentation", - "subtitle": "Ein standardisierter Leitfaden und ein Betriebshandbuch für die BAAS-Automatisierungsplattform.", - "searchPlaceholder": "Nach Thema, Schlüsselwort oder Tag suchen...", - "clearSearch": "Suche löschen", - "resultsCount": "{{count}} Dokumente gefunden", - "noResults": "Keine Dokumente entsprechen den aktuellen Filterkriterien.", - "selectDocument": "Bitte wählen Sie links ein Dokument aus, um dessen Inhalt anzuzeigen.", - "category": { - "all": "Alle", - "architecture": "Architektur", - "getting-started": "Erste Schritte", - "environment": "Umgebungseinrichtung", - "configuration": "Konfigurationsmanagement", - "operations": "Betrieb", - "support": "Support & Feedback", - "formation": "Formationsstrategie" - } - }, - "enterSecretTitle": "Öffentlichen Schlüssel eingeben", - "enterSecretPrompt": "Der öffentliche Schlüssel ist für die sichere Kommunikation erforderlich.", - "secretLabel": "Öffentlicher Schlüssel", - "secretPlaceholder": "Bitte geben Sie hier Ihren öffentlichen Schlüssel ein", - "secretRequired": "Der öffentliche Schlüssel muss eingegeben werden!", - "secretNotice": "Der öffentliche Schlüssel kann aus der Datei service.secret im Backend-Server abgerufen werden.", - "Confirm": "Bestätigen" -} \ No newline at end of file diff --git a/service/dist/locales/de.json.br b/service/dist/locales/de.json.br deleted file mode 100644 index f1ed6bab5b504265aadee70531bc345084777daf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6286 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 E0KS-3!~g&Q diff --git a/service/dist/locales/en.json b/service/dist/locales/en.json deleted file mode 100644 index 339274a3d..000000000 --- a/service/dist/locales/en.json +++ /dev/null @@ -1,450 +0,0 @@ -{ - "appTitle": "BAAS", - "home": "Home", - "scheduler": "Scheduler", - "configuration": "Configuration", - "settings": "Settings", - "updates": "Updates", - "start": "Start", - "stop": "Stop", - "edit": "Edit", - "runningTask": "Running Task", - "noTaskRunning": "No task is currently running", - "taskQueue": "Task Queue", - "noTasksQueued": "No tasks in the queue", - "logs": "Logs", - "assets": "Assets", - "lastUpdated": "Last Updated", - "secondsAgo": "{{count}} seconds ago", - "minutesAgo": "{{count}} minutes ago", - "hoursAgo": "{{count}} hours ago", - "daysAgo": "{{count}} days ago", - "configProfile": "Profile: {{name}}", - "addProfile": "Add Profile", - "switch.on": "On", - "switch.off": "Off", - "confirm": "Confirm", - "cancel": "Cancel", - "save": "Save", - "settingsSaved": "Settings saved!", - "featureSettings": "Feature Settings", - "cafe": "Cafe", - "cafeDesc": "Manage cafe invitations and rewards", - "schedule": "Schedule", - "scheduleDesc": "Configure daily schedules", - "shop": "Shop Purchases", - "shopDesc": "Set item purchase priorities", - "arena": "Arena", - "arenaDesc": "Automate arena battles", - "generalSettings": "General Settings", - "server": "Server", - "serverDesc": "Game server and connection settings", - "emulator": "Emulator", - "emulatorDesc": "Emulator path and startup options", - "push": "Push Notifications", - "pushDesc": "Configure push notifications", - "other": "Other", - "otherDesc": "Miscellaneous features and settings", - "taskOverview": "Task Overview", - "uiSettings": "UI Settings", - "theme": "Theme", - "light": "Light", - "dark": "Dark", - "system": "System", - "language": "Language", - "english": "English", - "chinese": "简体中文", - "japanese": "日本語", - "korean": "한국어", - "russian": "Русский", - "french": "Français", - "deutsch": "Deutsch", - "cafe.useInvitation": "Use Invitation Ticket", - "cafe.patRounds": "Patting Rounds", - "cafe.patRoundsDesc": "Higher rounds reduce the chance of missing pats", - "server.server": "Game Server", - "server.cn.official": "Official (CN)", - "server.cn.bilibili": "Bilibili (CN)", - "server.global": "Global", - "server.global.teen": "Global (Teen)", - "server.kr.one": "Korea (ONE store)", - "server.jp": "Japan", - "server.adbIP": "ADB IP Address", - "server.adbPort": "ADB Port", - "comingSoon.title": "Coming Soon", - "comingSoon.desc": "Configuration for this feature has not been implemented yet.", - "schedule.title": "Daily Task Schedule", - "schedule.desc": "Select the daily tasks to be automated.", - "schedule.cafe": "Cafe Interaction", - "schedule.lessons": "Lessons", - "schedule.bounty": "Bounty", - "schedule.commissions": "Commissions", - "schedule.shop": "Shop Purchase", - "shop.title": "Shop Purchase Settings", - "shop.buyAp": "Buy AP with Pyroxenes", - "shop.buyApDesc": "Automatically buy AP when it's insufficient.", - "shop.refreshAp": "Refresh AP with Pyroxenes", - "shop.refreshApDesc": "Allow spending Pyroxenes to refresh AP.", - "arena.title": "Arena Automation", - "arena.enable": "Enable Arena Automation", - "arena.enableDesc": "Automatically challenge opponents in the arena.", - "arena.attempts": "Daily Challenge Attempts", - "emulator.title": "Emulator Settings", - "emulator.autoStart": "Auto-start Emulator", - "emulator.autoStartDesc": "The script will try to start the emulator if it's not running.", - "emulator.path": "Emulator Path", - "emulator.pathDesc": "Provide the full path to the emulator executable.", - "push.title": "Push Notification Settings", - "push.enable": "Enable Push Notifications", - "push.enableDesc": "Send notifications when tasks are completed or issues occur.", - "push.webhookUrl": "Webhook URL", - "push.webhookUrlPlaceholder": "Enter your Webhook URL (e.g., Bark, ServerChan)", - "other.title": "Other Settings", - "other.screenshotOnError": "Screenshot on Error", - "other.screenshotOnErrorDesc": "Automatically take a screenshot when the script encounters an error.", - "property.ap": "AP", - "property.credits": "Credits", - "property.pyroxene": "Pyroxene", - "property.coin.arena": "Arena Coin", - "property.coin.commission": "Commission Coin", - "property.keystone": "Keystone", - "property.keystone.piece": "Piece", - "property.pass": "Pass", - "log.scroll": "Scroll to Bottom", - "log.scroll.detail": "Scroll the log text box to the bottom", - "assetsDisplay.detail": "Display Asset Details", - "hotkeys": "Hotkeys", - "Invalid hotkey format": "Invalid hotkey format", - "Duplicated hotkey": "Duplicated hotkey", - "Use combinations like": "Use combinations like", - "Leave empty to unbind": "Leave empty to unbind", - "Please fix invalid or duplicated hotkeys.": "Please fix invalid or duplicated hotkeys.", - "hotkey.switch.start": "Start/Stop", - "hotkey.toggle.scroll": "Toggle Scroll to Bottom", - "hotkey.open.settings": "Open Settings", - "hotkey.clear.logs": "Clear Logs", - "hotkey.focus.search": "Focus Search", - "hotkey.help.about": "Help / About", - "Search hotkeys": "Search hotkeys", - "student.search": "Search Student", - "log.export": "Export Logs", - "nextTask": "Next Task", - "rename": "Rename", - "delete": "Delete", - "editProfile": "Edit Profile", - "profileName": "Profile Name", - "createProfile": "Create Profile", - "creditpoints": "Credits", - "pyroxene": "Pyroxene", - "confirmDeleteTitle": "Confirm Deletion", - "confirmDeleteMessage": "Are you sure you want to delete the profile '{{name}}'? This action cannot be undone!", - "ui.zoom": "UI Zoom Settings", - "commonShop.title": "Common Shop", - "tacticalShop.title": "Tactical Challenge Shop", - "commonShop.refreshTimes": "Shop Refresh Count", - "commonShop.refreshDesc": "Automatically refresh the shop", - "add": "Add", - "Add Student": "Add Student", - "placeholder.config.insert": "Please type your configuration here", - "placeholder.stage": "Select Student", - "stage.normalLabel": "Normal Stage Daily Sweep", - "stage.hardLabel": "Hard Stage Daily Sweep", - "dailySweep": "Daily", - "dailySweepDesc": "Daily stage clearing and sweep settings", - "placeholder.nobinding": "Not bound", - "tactical": "Total Assault", - "tacticalDesc": "Total Assault settings", - "drill": "Joint Firing Drill", - "drillDesc": "Joint Firing Drill settings", - "artifact": "Crafting", - "artifactDesc": "Crafting settings", - "whitelist": "Friend Whitelist", - "whitelistDesc": "Whitelist for auto-deleting friends", - "script": "Script Settings", - "scriptDesc": "Script execution related settings", - "stage": "Stage Clear", - "stageDesc": "Helps you clear stages automatically", - "team": "Formation", - "teamDesc": "Set up your formations", - "eventName.restart": "Restart at 4 AM", - "eventName.arena": "Arena", - "eventName.cafe_reward": "Cafe", - "eventName.no1_cafe_invite": "Cafe 1 Invitation", - "eventName.no2_cafe_invite": "Cafe 2 Invitation", - "eventName.lesson": "Lessons", - "eventName.group": "Collect Club Earnings", - "eventName.collect_daily_free_power": "Collect Free AP", - "eventName.mail": "Check Mail", - "eventName.collect_daily_power": "Collect Daily AP", - "eventName.common_shop": "Shop Purchase", - "eventName.tactical_challenge_shop": "Tactical Challenge Shop Purchase", - "eventName.rewarded_task": "Bounty", - "eventName.normal_task": "Clear AP on Normal Stages", - "eventName.hard_task": "Clear AP on Hard Stages", - "eventName.scrimmage": "Commissions", - "eventName.clear_special_task_power": "Daily Special Missions", - "eventName.create": "Auto Crafting", - "eventName.total_assault": "Total Assault", - "eventName.activity_sweep": "Event Sweep", - "eventName.collect_reward": "Collect Rewards", - "eventName.momo_talk": "Auto MomoTalk", - "eventName.dailyGameActivity": "Daily Mini-game", - "eventName.friend": "Clean up Friends List", - "eventName.joint_firing_drill": "Joint Firing Drill", - "eventName.pass": "Claim Pass Rewards", - "scheduler.inactiveTasks": "Inactive Tasks", - "scheduler.activeTasks": "Active Tasks", - "scheduler.search": "Search Tasks", - "scheduler.sortDefault": "Default Sort", - "scheduler.sortByTime": "Sort by Time", - "scheduler.detailConfig": "Detailed Task Schedule Configuration", - "scheduler.eventName": "Task Name", - "scheduler.nextTick": "Next Execution Time", - "scheduler.priority": "Priority", - "scheduler.interval": "Interval (seconds)", - "scheduler.dailyReset": "Daily Reset Time", - "scheduler.disabledRange": "Disabled Time Range", - "scheduler.preTask": "Prerequisite Task", - "scheduler.postTask": "Post-Task", - "common.confirm": "Confirm", - "scheduler.selector": "Task Selector", - "cafe.basicSettings": "Basic Cafe Settings", - "cafe.cafe1Settings": "Cafe 1 Settings", - "cafe.cafe2Settings": "Cafe 2 Settings", - "cafe.collectReward": "Collect Rewards", - "cafe.exchangeStudent": "Student Changes Outfit", - "cafe.duplicateInvite": "Duplicate Invite", - "cafe.hasNo2Cafe": "Cafe 2", - "cafe.patStyle": "Patting Style", - "cafe.patStyleDragGift": "Drag Gift", - "cafe.invite1Mode": "Invitation Mode", - "cafe.invite2Mode": "Invitation Mode", - "cafe.lowestAffection": "By Lowest Affection", - "cafe.highestAffection": "By Highest Affection", - "cafe.starred": "By Starred Students", - "cafe.byName": "By Student Name", - "cafe.starredPosition": "Starred Student Position", - "cafe.cafe1Students": "Student Name List", - "cafe.cafe2Students": "Student Name List", - "lesson.enableFavorStudent": "Prioritize starred students", - "lesson.relationshipFirst": "Prioritize students with high affection", - "lesson.region": "Lesson Region", - "lesson.favorStudent": "Starred Students", - "artifact.global": "Global Settings", - "artifact.phase_1": "Phase 1", - "artifact.phase_2": "Phase 2", - "artifact.phase_3": "Phase 3", - "artifact.useTicketDesc": "Use crafting tickets", - "artifact.createTime": "Crafting Count", - "artifact.phaseCount": "Crafting Phase", - "artifact.materialSelect": "Material Selection", - "artifact.phase2.recommend": "Recommend based on student", - "artifact.selectStudent": "Select Student", - "artifact.priority": "Priority", - "artifact.default": "Default", - "artifact.white": "White", - "artifact.blue": "Blue", - "artifact.whiteBlue": "White & Blue", - "artifact.gold": "Gold", - "artifact.purple": "Purple", - "artifact.goldPurple": "Gold & Purple", - "artifact.all": "All", - "artifact.saved": "Settings Saved", - "artifact.savedDesc": "Your crafting settings have been saved.", - "arena.higherLevel": "Opponent level higher than yours by", - "arena.max_refresh_times": "Max Refresh Times", - "arena.opponent_no": "Opponent Number", - "stage.dailyTab": "Stage Sweep", - "stage.sweepTab": "Sweep Details", - "sweep.rewarded": "Bounty Sweep Count", - "sweep.scrimmage": "Commissions Sweep Count", - "sweep.activityNumber": "Event Stage Sweep Stage", - "sweep.activityTimes": "Event Stage Sweep Count", - "sweep.special": "Special Mission Sweep Count", - "sweep.purchaseRewarded": "Bounty Ticket Purchase Count", - "sweep.purchaseLesson": "Lesson Ticket Purchase Count", - "sweep.purchaseScrimmage": "Commissions Ticket Purchase Count", - "stage.normalDesc": "Normal stages and counts (e.g., \"1-1-1,1-2-3\" means stage 1-1 once, then 1-2 three times)", - "stage.hardDesc": "Hard stage settings are the same as above. Note: max 3 attempts. Use English commas. For JP/Global servers, 'max' can be used.", - "stage.selectStudent": "Select Student", - "tactical.hardLevel": "Total Assault Difficulty", - "drill.out_partyNo": "Team Number", - "drill.difficulty": "Drill Difficulty", - "drill.useAllAfterSweep": "Use all drill tickets after sortie", - "friend.placeholder": "Enter Friend Code", - "friend.add": "Add", - "friend.empty": "Friend whitelist is empty", - "friend.addFailed": "Failed to add", - "friend.alreadyExists": "Friend already exists", - "friend.addedSuccess": "Added successfully", - "friend.added": "Friend added:", - "friend.deletedSuccess": "Deleted successfully", - "friend.deleted": "Friend deleted:", - "friend.invalidLength": "Invalid friend code length", - "adb.title": "ADB Detection Panel", - "adb.detectBtn": "Detect ADB", - "adb.detecting": "Detecting ADB...", - "adb.noData": "No ADB data available", - "script.screenshotInterval": "Screenshot Interval (seconds)", - "script.autostart": "Auto-start when script launches", - "script.screenshotMethod": "Screenshot Method", - "script.controlMethod": "Control Method", - "script.then": "Action after task completion", - "script.doNothing": "Do nothing", - "script.exitBaas": "Exit Blue Archive", - "script.exitEmu": "Exit Emulator", - "script.exitBoth": "Exit Blue Archive and Emulator", - "script.shutdown": "Shutdown Computer", - "emulator.openOnLaunch": "Open emulator on script launch", - "emulator.multiInstance": "Emulator Multi-instance", - "emulator.waitTime": "Emulator launch wait time (seconds)", - "emulator.multiType": "Emulator Type", - "emulator.instanceCount": "Multi-instance Emulator Number", - "emulator.address": "Emulator Path", - "choose": "Choose", - "execute": "Execute", - "stage.exploreTab": "Main Story", - "stage.eventTab": "Event Stages", - "stage.manualBoss": "Manual Boss Fight", - "stage.normalTask": "Normal Mission", - "stage.hardTask": "Hard Mission", - "stage.currentEvent": "Current Event", - "stage.story": "Clear Story Stages", - "stage.mission": "Clear Mission Stages", - "stage.challenge": "Clear Challenge Stages", - "stage.attrTable": "Stage Attribute Reference Table", - "stage.noEvent": "No event currently", - "team.chooseMethod": "Formation Method", - "push.afterError": "Push after an error occurs", - "push.afterCompletion": "Push after all tasks are completed", - "push.json": "JSON Push", - "push.serverchan": "ServerChan Push", - "other.fhx": "One-click Anti-Censorship", - "other.fhxDesc": "Attempt to apply anti-censorship patch (CN-exclusive)", - "versionInfo": "Version Information", - "localVersion": "Current Version", - "remoteVersion": "Latest Version", - "updateMethod": "Action", - "globalUpdateSettings": "Update Settings", - "updateChannel": "Update Channel", - "mirrorCdk": "MirrorC CDK (Optional)", - "mirror.verify": "Verify CDK", - "mirror.verifying": "Verifying", - "mc.verify.success": "MirrorC CDK verification successful!", - "mc.verify.error": "MirrorC CDK verification error!", - "enterCdk": "Enter CDK", - "shaConnectivityTest": "SHA Retrieval Method", - "shaTest.method": "Method", - "shaTest.status": "Status", - "shaTest.time": "Time taken", - "shaTest.sha": "SHA Value", - "shaTest.testing": "Testing SHA...", - "shaTest.testAll": "Test All Methods", - "configAdd.nameRequired": "Profile name cannot be empty", - "configAdd.serverRequired": "A server must be specified", - "configAdd.nameDuplicate": "Profile name already exists", - "configAdd.selectServer": "Please select a server", - "create": "Create", - "settings.updateSuccess": "Settings Updated Successfully", - "settings.updateSuccessDesc": "Your settings have been successfully updated.", - "stage.story.main": "Clear Main Story", - "stage.story.group": "Clear Club Stories", - "stage.story.mini": "Clear Mini Stories", - "stage.taskTriggerStart": "Task has been dispatched", - "stage.taskTriggered": "Dispatched task: {{task}}", - "stage.noHardTask": "No hard stages set!", - "stage.noNormalTask": "No normal stages set!", - "start_hard_task": "Start Hard Stages", - "start_normal_task": "Start Normal Stages", - "start_fhx": "Apply Anti-Censorship", - "start_main_story": "Start Main Story", - "start_group_story": "Start Club Stories", - "start_mini_story": "Start Mini Stories", - "start_explore_activity_story": "Start Event Story", - "start_explore_activity_mission": "Start Event Missions", - "start_explore_activity_challenge": "Start Event Challenges", - "main_story": "Clear Main Story", - "group_story": "Clear Club Stories", - "mini_story": "Clear Mini Stories", - "explore_activity_story": "Clear Event Story", - "explore_activity_mission": "Clear Event Missions", - "explore_activity_challenge": "Clear Event Challenges", - "de_clothes": "Anti-Censorship", - "explore_hard_task": "Clear Hard Stages", - "explore_normal_task": "Clear Normal Stages", - "title.updateSetting": "Update", - "shaMethod.github": "GitHub API", - "shaMethod.mirrorc": "MirrorC Free API", - "shaMethod.gitee": "Gitee Repository", - "shaMethod.gitcode": "GitCode Repository", - "shaMethod.tencent_c_coding": "Tencent Cloud Coding Repository", - "cdk.noCDKInput": "Please enter MirrorC CDK!", - "CDK invalid.": "CDK invalid.", - "CDK valid.": "CDK valid.", - "Please confirm that you have entered the correct cdkey": "Please confirm that you have entered the correct CDK", - "CDK valid. Expires at {}": "This CDK is valid until {{expire_date}}.", - "CDK expired.": "CDK has expired.", - "CDK quota exhausted for today.": "CDK will expire today.", - "CDK mismatched for requested resource.": "CDK does not match the requested repository.", - "CDK blocked.": "CDK has been blocked by the administrator.", - "CDK Test OK": "CDK verification successful", - "version.fetching": "Fetching...", - "version.untested": "Not tested", - "version.testing": "Testing...", - "version.tapToTest": "Check for updates", - "version.checkError": "Failed to fetch version", - "heartbeat.connected": "Service connected", - "heartbeat.connecting": "Connecting to service...", - "updateMethod.github": "GitHub (Main repository)", - "updateMethod.gitee": "Gitee (China mirror)", - "updateMethod.gitcode": "GitCode (China mirror)", - "updateMethod.tencent": "Tencent Cloud Coding (China mirror)", - "updateMethod.mirrorc": "MirrorC Update", - "update.dueDate": "Expiration Date", - "placeholder.profileName": "Enter your profile name here", - "update.available": "New version available", - "property.burst": "Explosive", - "property.pierce": "Piercing", - "property.mystic": "Mystic", - "property.shock": "Sonic", - "property.Unused": "Unused", - "team.preset": "By preset formation", - "team.side": "By sidebar attributes", - "team.order": "By sidebar order", - "schedule.primary": "Beginner", - "schedule.normal": "Normal", - "schedule.advanced": "Advanced", - "schedule.superior": "Expert", - "lesson.times": "Lesson attempts", - "confirmUpdateTitle": "Confirm Update", - "updatePrompt": "A new version is detected, update now?", - "updateNotice": "Please stop any running tasks before updating.", - "title.wiki": "Docs", - "wiki": { - "title": "Wiki Docs", - "subtitle": "A standardized guide and operation manual for the BAAS automation platform.", - "searchPlaceholder": "Search by topic, keyword, or tag...", - "clearSearch": "Clear Search", - "resultsCount": "{{count}} documents found", - "noResults": "No documents match the current filter criteria.", - "selectDocument": "Please select a document from the left to view its content.", - "category": { - "all": "All", - "architecture": "Architecture", - "getting-started": "Getting Started", - "environment": "Environment Setup", - "configuration": "Configuration Management", - "operations": "Operations", - "support": "Support & Feedback", - "formation": "Formation Strategy" - } - }, - "enterSecretTitle": "Enter Public Key", - "enterSecretPrompt": "Required for secure Communication.", - "secretLabel": "Public Key", - "secretPlaceholder": "Please enter your public key here", - "secretRequired": "The public key is required!", - "secretNotice": "Obtained from the service.secret file from backend.", - "Confirm": "Confirm", - "export.log.folderSelect": "Choose the Log Export Path" -} diff --git a/service/dist/locales/en.json.br b/service/dist/locales/en.json.br deleted file mode 100644 index 880d0601c1a1bc784989475da7ba74b3468df042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5167 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 Z2uVmA=+i;lCLjb%v0e}Di diff --git a/service/dist/locales/ko.json b/service/dist/locales/ko.json deleted file mode 100644 index 7436fbe96..000000000 --- a/service/dist/locales/ko.json +++ /dev/null @@ -1,449 +0,0 @@ -{ - "appTitle": "BAAS", - "home": "홈", - "scheduler": "스케줄러", - "configuration": "구성", - "settings": "설정", - "updates": "업데이트", - "start": "시작", - "stop": "정지", - "edit": "편집", - "runningTask": "실행 중인 작업", - "noTaskRunning": "현재 실행 중인 작업이 없습니다", - "taskQueue": "작업 대기열", - "noTasksQueued": "대기열에 작업이 없습니다", - "logs": "로그", - "assets": "자산", - "lastUpdated": "마지막 업데이트", - "secondsAgo": "{{count}}초 전", - "minutesAgo": "{{count}}분 전", - "hoursAgo": "{{count}}시간 전", - "daysAgo": "{{count}}일 전", - "configProfile": "프로필: {{name}}", - "addProfile": "프로필 추가", - "switch.on": "켜짐", - "switch.off": "꺼짐", - "confirm": "확인", - "cancel": "취소", - "save": "저장", - "settingsSaved": "설정이 저장되었습니다!", - "featureSettings": "기능 설정", - "cafe": "카페", - "cafeDesc": "카페 초대 및 보상 관리", - "schedule": "스케쥴", - "scheduleDesc": "일일 스케쥴 설정", - "shop": "상점 구매", - "shopDesc": "아이템 구매 우선순위 설정", - "arena": "전술 대항전", - "arenaDesc": "전술 대항전 전투 자동화", - "generalSettings": "일반 설정", - "server": "서버", - "serverDesc": "게임 서버 및 연결 설정", - "emulator": "에뮬레이터", - "emulatorDesc": "에뮬레이터 경로 및 시작 옵션", - "push": "푸시 알림", - "pushDesc": "푸시 알림 설정", - "other": "기타", - "otherDesc": "기타 기능 및 설정", - "taskOverview": "작업 개요", - "uiSettings": "UI 설정", - "theme": "테마", - "light": "라이트", - "dark": "다크", - "system": "시스템 설정 따름", - "language": "언어", - "english": "English", - "chinese": "简体中文", - "japanese": "日本語", - "korean": "한국어", - "russian": "Русский", - "french": "Français", - "deutsch": "Deutsch", - "cafe.useInvitation": "초대권 사용", - "cafe.patRounds": "쓰다듬기 횟수", - "cafe.patRoundsDesc": "횟수가 높을수록 놓칠 확률이 줄어듭니다", - "server.server": "게임 서버", - "server.cn.official": "중국 공식 서버", - "server.cn.bilibili": "빌리빌리 서버", - "server.global": "글로벌 서버", - "server.global.teen": "글로벌 서버 (Teen)", - "server.kr.one": "한국 ONE store 서버", - "server.jp": "일본 서버", - "server.adbIP": "ADB IP 주소", - "server.adbPort": "ADB 포트", - "comingSoon.title": "출시 예정", - "comingSoon.desc": "이 기능에 대한 설정은 아직 구현되지 않았습니다.", - "schedule.title": "일일 작업 스케줄", - "schedule.desc": "자동으로 실행할 일일 작업을 선택하세요.", - "schedule.cafe": "카페 상호작용", - "schedule.lessons": "스케쥴", - "schedule.bounty": "현상수배", - "schedule.commissions": "학원 교류회", - "schedule.shop": "상점 구매", - "shop.title": "상점 구매 설정", - "shop.buyAp": "청휘석으로 AP 구매", - "shop.buyApDesc": "AP가 부족할 때 자동으로 구매합니다.", - "shop.refreshAp": "청휘석으로 AP 충전", - "shop.refreshApDesc": "청휘석을 사용하여 AP를 충전할 수 있습니다.", - "arena.title": "전술 대항전 자동화", - "arena.enable": "전술 대항전 자동화 활성화", - "arena.enableDesc": "전술 대항전에서 상대를 자동으로 도전합니다.", - "arena.attempts": "일일 도전 횟수", - "emulator.title": "에뮬레이터 설정", - "emulator.autoStart": "에뮬레이터 자동 시작", - "emulator.autoStartDesc": "에뮬레이터가 실행 중이 아니면 스크립트가 시작을 시도합니다.", - "emulator.path": "에뮬레이터 경로", - "emulator.pathDesc": "에뮬레이터 실행 파일의 전체 경로를 제공하세요.", - "push.title": "푸시 알림 설정", - "push.enable": "푸시 알림 활성화", - "push.enableDesc": "작업 완료 또는 문제 발생 시 알림을 보냅니다.", - "push.webhookUrl": "웹훅 URL", - "push.webhookUrlPlaceholder": "웹훅 URL을 입력하세요 (예: Bark, ServerChan)", - "other.title": "기타 설정", - "other.screenshotOnError": "오류 발생 시 스크린샷", - "other.screenshotOnErrorDesc": "스크립트에서 오류가 발생하면 자동으로 스크린샷을 찍습니다.", - "property.ap": "AP", - "property.credits": "크레딧", - "property.pyroxene": "청휘석", - "property.coin.arena": "대항전 코인", - "property.coin.commission": "교류회 코인", - "property.keystone": "기동석", - "property.keystone.piece": "조각", - "property.pass": "패스", - "log.scroll": "맨 아래로 스크롤", - "log.scroll.detail": "로그 텍스트 상자를 맨 아래로 스크롤합니다", - "assetsDisplay.detail": "자산 세부 정보 표시", - "hotkeys": "단축키", - "Invalid hotkey format": "잘못된 단축키 형식", - "Duplicated hotkey": "중복된 단축키", - "Use combinations like": "다음과 같은 조합을 사용하세요", - "Leave empty to unbind": "비워두면 바인딩 해제", - "Please fix invalid or duplicated hotkeys.": "잘못되었거나 중복된 단축키를 수정하세요.", - "hotkey.switch.start": "시작/정지", - "hotkey.toggle.scroll": "맨 아래로 스크롤 토글", - "hotkey.open.settings": "설정 열기", - "hotkey.clear.logs": "로그 지우기", - "hotkey.focus.search": "검색에 초점", - "hotkey.help.about": "도움말 / 정보", - "Search hotkeys": "단축키 검색", - "student.search": "학생 검색", - "log.export": "로그 내보내기", - "nextTask": "다음 작업", - "rename": "이름 바꾸기", - "delete": "삭제", - "editProfile": "프로필 편집", - "profileName": "프로필 이름", - "createProfile": "프로필 생성", - "creditpoints": "크레딧 포인트", - "pyroxene": "청휘석", - "confirmDeleteTitle": "삭제 확인", - "confirmDeleteMessage": "프로필 '{{name}}'을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다!", - "ui.zoom": "UI 확대/축소 설정", - "commonShop.title": "일반 상점", - "tacticalShop.title": "전술 대항전 상점", - "commonShop.refreshTimes": "상점 새로고침 횟수", - "commonShop.refreshDesc": "자동으로 상점 새로고침", - "add": "추가", - "Add Student": "학생 추가", - "placeholder.config.insert": "여기에 구성을 입력하세요", - "placeholder.stage": "학생 선택", - "stage.normalLabel": "일반 임무 일일 소탕", - "stage.hardLabel": "하드 임무 일일 소탕", - "dailySweep": "일일", - "dailySweepDesc": "일일 임무 및 소탕 설정", - "placeholder.nobinding": "바인딩 없음", - "tactical": "총력전", - "tacticalDesc": "총력전 설정", - "drill": "합동 화력 시험", - "drillDesc": "합동 화력 시험 설정", - "artifact": "제조", - "artifactDesc": "제조 설정", - "whitelist": "친구 화이트리스트", - "whitelistDesc": "친구 자동 삭제 시 화이트리스트", - "script": "스크립트 설정", - "scriptDesc": "스크립트 실행 관련 설정", - "stage": "임무 클리어", - "stageDesc": "임무 자동 클리어를 도와줍니다", - "team": "편성", - "teamDesc": "부대 편성을 설정합니다", - "eventName.restart": "오전 4시에 재시작", - "eventName.arena": "전술 대항전", - "eventName.cafe_reward": "카페", - "eventName.no1_cafe_invite": "1호점 카페 초대", - "eventName.no2_cafe_invite": "2호점 카페 초대", - "eventName.lesson": "스케쥴", - "eventName.group": "서클 AP 수령", - "eventName.collect_daily_free_power": "무료 AP 수령", - "eventName.mail": "우편함 확인", - "eventName.collect_daily_power": "일일 AP 수령", - "eventName.common_shop": "상점 구매", - "eventName.tactical_challenge_shop": "전술 대항전 상점 구매", - "eventName.rewarded_task": "현상수배", - "eventName.normal_task": "일반 임무 AP 소모", - "eventName.hard_task": "하드 임무 AP 소모", - "eventName.scrimmage": "학원 교류회", - "eventName.clear_special_task_power": "특별의뢰", - "eventName.create": "자동 제조", - "eventName.total_assault": "총력전", - "eventName.activity_sweep": "이벤트 소탕", - "eventName.collect_reward": "보상 수령", - "eventName.momo_talk": "자동 모모톡", - "eventName.dailyGameActivity": "일일 미니게임", - "eventName.friend": "친구 정리", - "eventName.joint_firing_drill": "합동 화력 시험", - "eventName.pass": "패스 보상 수령", - "scheduler.inactiveTasks": "비활성 작업", - "scheduler.activeTasks": "활성 작업", - "scheduler.search": "작업 검색", - "scheduler.sortDefault": "기본 정렬", - "scheduler.sortByTime": "시간순 정렬", - "scheduler.detailConfig": "작업 상세 스케줄 설정", - "scheduler.eventName": "작업 이름", - "scheduler.nextTick": "다음 실행 시간", - "scheduler.priority": "우선순위", - "scheduler.interval": "간격 (초)", - "scheduler.dailyReset": "일일 초기화 시간", - "scheduler.disabledRange": "비활성화 시간대", - "scheduler.preTask": "선행 작업", - "scheduler.postTask": "후행 작업", - "common.confirm": "확인", - "scheduler.selector": "작업 선택기", - "cafe.basicSettings": "카페 기본 설정", - "cafe.cafe1Settings": "1호점 카페 설정", - "cafe.cafe2Settings": "2호점 카페 설정", - "cafe.collectReward": "보상 수령", - "cafe.exchangeStudent": "학생 의상 변경", - "cafe.duplicateInvite": "중복 초대", - "cafe.hasNo2Cafe": "2호점 카페", - "cafe.patStyle": "쓰다듬기 스타일", - "cafe.patStyleDragGift": "선물 드래그", - "cafe.invite1Mode": "초대 모드", - "cafe.invite2Mode": "초대 모드", - "cafe.lowestAffection": "가장 낮은 호감도 순", - "cafe.highestAffection": "가장 높은 호감도 순", - "cafe.starred": "즐겨찾기 학생 순", - "cafe.byName": "학생 이름 순", - "cafe.starredPosition": "즐겨찾기 학생 위치", - "cafe.cafe1Students": "학생 이름 목록", - "cafe.cafe2Students": "학생 이름 목록", - "lesson.enableFavorStudent": "즐겨찾기 학생 우선", - "lesson.relationshipFirst": "호감도 높은 학생 우선", - "lesson.region": "스케쥴 지역", - "lesson.favorStudent": "즐겨찾기 학생", - "artifact.global": "전역 설정", - "artifact.phase_1": "1단계", - "artifact.phase_2": "2단계", - "artifact.phase_3": "3단계", - "artifact.useTicketDesc": "제조 티켓 사용", - "artifact.createTime": "제조 횟수", - "artifact.phaseCount": "제조 단계", - "artifact.materialSelect": "재료 선택", - "artifact.phase2.recommend": "학생 기반 추천", - "artifact.selectStudent": "학생 선택", - "artifact.priority": "우선순위", - "artifact.default": "기본값", - "artifact.white": "흰색", - "artifact.blue": "파란색", - "artifact.whiteBlue": "흰색/파란색", - "artifact.gold": "금색", - "artifact.purple": "보라색", - "artifact.goldPurple": "금색/보라색", - "artifact.all": "모두", - "artifact.saved": "설정이 저장되었습니다", - "artifact.savedDesc": "제조 설정이 저장되었습니다.", - "arena.higherLevel": "상대방이 당신보다 높은 레벨", - "arena.max_refresh_times": "최대 새로고침 횟수", - "arena.opponent_no": "상대 번호", - "stage.dailyTab": "임무 소탕", - "stage.sweepTab": "소탕 세부 정보", - "sweep.rewarded": "현상수배 소탕 횟수", - "sweep.scrimmage": "학원 교류회 소탕 횟수", - "sweep.activityNumber": "이벤트 스테이지 소탕 스테이지", - "sweep.activityTimes": "이벤트 스테이지 소탕 횟수", - "sweep.special": "특별의뢰 소탕 횟수", - "sweep.purchaseRewarded": "현상수배 티켓 구매 횟수", - "sweep.purchaseLesson": "스케쥴 티켓 구매 횟수", - "sweep.purchaseScrimmage": "학원 교류회 티켓 구매 횟수", - "stage.normalDesc": "일반 임무 및 횟수 (예: \"1-1-1,1-2-3\"은 1-1 임무 1회, 그 다음 1-2 임무 3회)", - "stage.hardDesc": "하드 임무 설정도 위와 같습니다. 참고: 최대 3회, 쉼표는 영문 쉼표 사용. 일본/글로벌 서버는 'max' 입력 가능.", - "stage.selectStudent": "학생 선택", - "tactical.hardLevel": "총력전 난이도", - "drill.out_partyNo": "부대 번호", - "drill.difficulty": "시험 난이도", - "drill.useAllAfterSweep": "출격 후 모든 시험 티켓 사용", - "friend.placeholder": "친구 코드 입력", - "friend.add": "추가", - "friend.empty": "친구 화이트리스트가 비어 있습니다", - "friend.addFailed": "추가 실패", - "friend.alreadyExists": "친구가 이미 존재합니다", - "friend.addedSuccess": "성공적으로 추가되었습니다", - "friend.added": "추가된 친구:", - "friend.deletedSuccess": "성공적으로 삭제되었습니다", - "friend.deleted": "삭제된 친구:", - "friend.invalidLength": "잘못된 친구 코드 길이", - "adb.title": "ADB 감지 패널", - "adb.detectBtn": "ADB 감지", - "adb.detecting": "ADB 감지 중...", - "adb.noData": "ADB 데이터 없음", - "script.screenshotInterval": "스크린샷 간격 (초)", - "script.autostart": "스크립트 실행 시 자동 시작", - "script.screenshotMethod": "스크린샷 방식", - "script.controlMethod": "제어 방식", - "script.then": "작업 완료 후 작업", - "script.doNothing": "아무것도 안 함", - "script.exitBaas": "블루 아카이브 종료", - "script.exitEmu": "에뮬레이터 종료", - "script.exitBoth": "블루 아카이브 및 에뮬레이터 종료", - "script.shutdown": "컴퓨터 종료", - "emulator.openOnLaunch": "스크립트 실행 시 에뮬레이터 열기", - "emulator.multiInstance": "에뮬레이터 멀티 인스턴스", - "emulator.waitTime": "에뮬레이터 시작 대기 시간 (초)", - "emulator.multiType": "에뮬레이터 종류", - "emulator.instanceCount": "멀티 인스턴스 에뮬레이터 번호", - "emulator.address": "에뮬레이터 경로", - "choose": "선택", - "execute": "실행", - "stage.exploreTab": "메인 스토리", - "stage.eventTab": "이벤트 스테이지", - "stage.manualBoss": "수동 보스전", - "stage.normalTask": "일반 임무", - "stage.hardTask": "하드 임무", - "stage.currentEvent": "현재 이벤트", - "stage.story": "스토리 임무 클리어", - "stage.mission": "미션 임무 클리어", - "stage.challenge": "챌린지 임무 클리어", - "stage.attrTable": "스테이지 속성 참조표", - "stage.noEvent": "현재 이벤트 없음", - "team.chooseMethod": "편성 방식", - "push.afterError": "오류 발생 후 푸시", - "push.afterCompletion": "모든 작업 완료 후 푸시", - "push.json": "JSON 푸시", - "push.serverchan": "ServerChan 푸시", - "other.fhx": "원클릭 검열 해제", - "other.fhxDesc": "검열 해제를 시도합니다 (중국 서버 전용)", - "versionInfo": "버전 정보", - "localVersion": "현재 버전", - "remoteVersion": "최신 버전", - "updateMethod": "작업", - "globalUpdateSettings": "업데이트 설정", - "updateChannel": "업데이트 채널", - "mirrorCdk": "MirrorC CDK (선택 사항)", - "mirror.verify": "CDK 확인", - "mirror.verifying": "확인 중", - "mc.verify.success": "MirrorC CDK 확인 성공!", - "mc.verify.error": "MirrorC CDK 확인 오류!", - "enterCdk": "CDK 입력", - "shaConnectivityTest": "SHA 검색 방법", - "shaTest.method": "방법", - "shaTest.status": "상태", - "shaTest.time": "소요 시간", - "shaTest.sha": "SHA 값", - "shaTest.testing": "SHA 테스트 중...", - "shaTest.testAll": "모든 방법 테스트", - "configAdd.nameRequired": "프로필 이름은 비워둘 수 없습니다", - "configAdd.serverRequired": "서버를 지정해야 합니다", - "configAdd.nameDuplicate": "프로필 이름이 이미 존재합니다", - "configAdd.selectServer": "서버를 선택하세요", - "create": "생성", - "settings.updateSuccess": "설정이 성공적으로 업데이트되었습니다", - "settings.updateSuccessDesc": "설정이 성공적으로 업데이트되었습니다.", - "stage.story.main": "메인 스토리 진행", - "stage.story.group": "서클 스토리 진행", - "stage.story.mini": "미니 스토리 진행", - "stage.taskTriggerStart": "작업이 할당되었습니다", - "stage.taskTriggered": "할당된 작업: {{task}}", - "stage.noHardTask": "하드 임무가 설정되지 않았습니다!", - "stage.noNormalTask": "일반 임무가 설정되지 않았습니다!", - "start_hard_task": "하드 임무 시작", - "start_normal_task": "일반 임무 시작", - "start_fhx": "검열 해제 적용", - "start_main_story": "메인 스토리 시작", - "start_group_story": "서클 스토리 시작", - "start_mini_story": "미니 스토리 시작", - "start_explore_activity_story": "이벤트 스토리 시작", - "start_explore_activity_mission": "이벤트 임무 시작", - "start_explore_activity_challenge": "이벤트 챌린지 시작", - "main_story": "메인 스토리 진행", - "group_story": "서클 스토리 진행", - "mini_story": "미니 스토리 진행", - "explore_activity_story": "이벤트 스토리 진행", - "explore_activity_mission": "이벤트 임무 진행", - "explore_activity_challenge": "이벤트 챌린지 진행", - "de_clothes": "검열 해제", - "explore_hard_task": "하드 임무 진행", - "explore_normal_task": "일반 임무 진행", - "title.updateSetting": "업데이트", - "shaMethod.github": "GitHub API", - "shaMethod.mirrorc": "MirrorC 무료 API", - "shaMethod.gitee": "Gitee 리포지토리", - "shaMethod.gitcode": "GitCode 리포지토리", - "shaMethod.tencent_c_coding": "Tencent Cloud Coding 리포지토리", - "cdk.noCDKInput": "MirrorC CDK를 입력하세요!", - "CDK invalid.": "CDK가 유효하지 않습니다.", - "CDK valid.": "CDK가 유효합니다.", - "Please confirm that you have entered the correct cdkey": "올바른 CDK를 입력했는지 확인하세요", - "CDK valid. Expires at {}": "이 CDK는 {{expire_date}}까지 유효합니다.", - "CDK expired.": "CDK가 만료되었습니다.", - "CDK quota exhausted for today.": "CDK가 오늘 만료됩니다.", - "CDK mismatched for requested resource.": "CDK가 요청된 리포지토리와 일치하지 않습니다.", - "CDK blocked.": "CDK가 관리자에 의해 차단되었습니다.", - "CDK Test OK": "CDK 확인 성공", - "version.fetching": "가져오는 중...", - "version.untested": "테스트 안 됨", - "version.testing": "테스트 중...", - "version.tapToTest": "업데이트 확인", - "version.checkError": "버전 정보를 가져오는 데 실패했습니다", - "heartbeat.connected": "서비스에 연결되었습니다", - "heartbeat.connecting": "서비스에 연결 중...", - "updateMethod.github": "GitHub (메인 리포지토리)", - "updateMethod.gitee": "Gitee (중국 미러)", - "updateMethod.gitcode": "GitCode (중국 미러)", - "updateMethod.tencent": "Tencent Cloud Coding (중국 미러)", - "updateMethod.mirrorc": "MirrorC 업데이트", - "update.dueDate": "만료일", - "placeholder.profileName": "여기에 프로필 이름을 입력하세요", - "update.available": "새 버전 사용 가능", - "property.burst": "폭발", - "property.pierce": "관통", - "property.mystic": "신비", - "property.shock": "진동", - "property.Unused": "미사용", - "team.preset": "사전 설정된 편성", - "team.side": "사이드바 속성별", - "team.order": "사이드바 순서별", - "schedule.primary": "초급", - "schedule.normal": "보통", - "schedule.advanced": "상급", - "schedule.superior": "최상급", - "lesson.times": "스케쥴 횟수", - "confirmUpdateTitle": "업데이트 확인", - "updatePrompt": "새로운 버전이 감지되었습니다. 지금 업데이트하시겠습니까?", - "updateNotice": "업데이트 전에 실행 중인 모든 작업을 중지하세요.", - "title.wiki": "문서", - "wiki": { - "title": "위키 문서", - "subtitle": "BAAS 자동화 플랫폼을 위한 표준화된 가이드 및 운영 매뉴얼.", - "searchPlaceholder": "주제, 키워드 또는 태그로 검색...", - "clearSearch": "검색 지우기", - "resultsCount": "{{count}}개의 문서가 있습니다", - "noResults": "현재 필터 기준과 일치하는 문서가 없습니다.", - "selectDocument": "왼쪽에서 문서를 선택하여 내용을 확인하세요.", - "category": { - "all": "모두", - "architecture": "아키텍처", - "getting-started": "시작하기", - "environment": "환경 설정", - "configuration": "구성 관리", - "operations": "운영", - "support": "지원 및 피드백", - "formation": "편성 전략" - } - }, - "enterSecretTitle": "공개 키 입력", - "enterSecretPrompt": "공개 키는 통신 보안을 위해 필요합니다.", - "secretLabel": "공개 키", - "secretPlaceholder": "여기에 공개 키를 입력하세요", - "secretRequired": "공개 키를 반드시 입력해야 합니다!", - "secretNotice": "공개 키는 서버 백엔드의 service.secret 파일에서 가져올 수 있습니다.", - "Confirm": "확인" -} \ No newline at end of file diff --git a/service/dist/locales/ko.json.br b/service/dist/locales/ko.json.br deleted file mode 100644 index fbd948ac0b1f73d6c8034d59f99f22923ac8f191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5895 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 da*u_Lf39a>a|9D){3z{h%?*t+eA5)awR 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 S6yP;s4CQ;AL|60qUwRYtqxkv& diff --git a/service/dist/locales/zh.json b/service/dist/locales/zh.json deleted file mode 100644 index 39463b594..000000000 --- a/service/dist/locales/zh.json +++ /dev/null @@ -1,454 +0,0 @@ -{ - "appTitle": "蔚蓝档案自动脚本", - "home": "主页", - "scheduler": "调度", - "configuration": "配置", - "settings": "设置", - "updates": "更新", - "start": "启动", - "stop": "停止", - "edit": "编辑", - "runningTask": "执行中任务", - "noTaskRunning": "暂无正在执行的任务", - "taskQueue": "任务队列", - "noTasksQueued": "队列中暂无任务", - "logs": "日志", - "assets": "资产", - "lastUpdated": "上次更新", - "secondsAgo": "{{count}}秒前", - "minutesAgo": "{{count}}分钟前", - "hoursAgo": "{{count}}小时前", - "daysAgo": "{{count}}天前", - "configProfile": "配置: {{name}}", - "addProfile": "新增配置", - "switch.on": "开", - "switch.off": "关", - "confirm": "确定", - "cancel": "取消", - "save": "保存", - "settingsSaved": "设置已保存!", - "featureSettings": "功能设置", - "cafe": "咖啡厅", - "cafeDesc": "管理咖啡厅邀请与奖励", - "schedule": "日程", - "scheduleDesc": "配置每日日程", - "shop": "商店购买", - "shopDesc": "设置物品购买优先级", - "arena": "竞技场", - "arenaDesc": "自动进行竞技场战斗", - "generalSettings": "通用设置", - "server": "服务器", - "serverDesc": "游戏服务器与连接设置", - "emulator": "模拟器", - "emulatorDesc": "模拟器路径与启动项", - "push": "推送通知", - "pushDesc": "配置消息推送", - "other": "其他", - "otherDesc": "杂项功能与设置", - "taskOverview": "任务概览", - "uiSettings": "界面设置", - "theme": "主题", - "light": "浅色", - "dark": "深色", - "system": "跟随系统", - "language": "语言", - "english": "English", - "chinese": "简体中文", - "japanese": "日本語", - "korean": "한국어", - "russian": "Русский", - "french": "Français", - "deutsch": "Deutsch", - "cafe.useInvitation": "使用邀请券", - "cafe.patRounds": "摸头轮数", - "cafe.patRoundsDesc": "轮数越高越不容易漏摸", - "server.server": "游戏服务器", - "server.cn.official": "官服", - "server.cn.bilibili": "B服", - "server.global": "国际服", - "server.global.teen": "国际服青少年", - "server.kr.one": "韩国ONE", - "server.jp": "日服", - "server.adbIP": "ADB IP地址", - "server.adbPort": "ADB 端口", - "comingSoon.title": "即将推出", - "comingSoon.desc": "此功能的配置尚未实现。", - "schedule.title": "每日任务日程", - "schedule.desc": "选择要自动执行的日常任务。", - "schedule.cafe": "咖啡厅互动", - "schedule.lessons": "课程表", - "schedule.bounty": "悬赏通缉", - "schedule.commissions": "学园交流会", - "schedule.shop": "商店购买", - "shop.title": "商店购买设置", - "shop.buyAp": "使用青辉石购买体力", - "shop.buyApDesc": "当体力不足时自动购买。", - "shop.refreshAp": "使用青辉石刷新体力", - "shop.refreshApDesc": "允许花费青辉石刷新体力。", - "arena.title": "竞技场自动化", - "arena.enable": "启用竞技场自动化", - "arena.enableDesc": "自动挑战竞技场中的对手。", - "arena.attempts": "每日挑战次数", - "emulator.title": "模拟器设置", - "emulator.autoStart": "自动启动模拟器", - "emulator.autoStartDesc": "如果模拟器未运行,脚本将尝试启动它。", - "emulator.path": "模拟器路径", - "emulator.pathDesc": "提供模拟器可执行文件的完整路径。", - "push.title": "推送通知设置", - "push.enable": "启用推送通知", - "push.enableDesc": "任务完成或出现问题时发送通知。", - "push.webhookUrl": "Webhook URL", - "push.webhookUrlPlaceholder": "输入您的 Webhook URL (例如 Bark, ServerChan)", - "other.title": "其他设置", - "other.screenshotOnError": "出错时截图", - "other.screenshotOnErrorDesc": "脚本遇到错误时自动进行截图。", - "property.ap": "体力", - "property.credits": "信用点", - "property.pyroxene": "青辉石", - "property.coin.arena": "竞技币", - "property.coin.commission": "委托币", - "property.keystone": "拱心石", - "property.keystone.piece": "碎片", - "property.pass": "通行证", - "log.scroll": "滑动到底部", - "log.scroll.detail": "日志文本框滑动到底部", - "assetsDisplay.detail": "显示资产详细信息", - "hotkeys": "快捷键", - "Invalid hotkey format": "快捷键格式无效", - "Duplicated hotkey": "快捷键重复", - "Use combinations like": "请使用类似的组合键,例如", - "Leave empty to unbind": "留空表示不绑定", - "Please fix invalid or duplicated hotkeys.": "请修复无效或重复的快捷键。", - "hotkey.switch.start": "开始/停止", - "hotkey.toggle.scroll": "切换滚动到底部", - "hotkey.open.settings": "打开设置", - "hotkey.clear.logs": "清空日志", - "hotkey.focus.search": "聚焦搜索", - "hotkey.help.about": "帮助 / 关于", - "Search hotkeys": "搜索快捷键", - "student.search": "搜索学生", - "log.export": "导出日志", - "nextTask": "下一个任务", - "rename": "重命名", - "delete": "删除", - "editProfile": "编辑配置", - "profileName": "配置名", - "createProfile": "新增配置", - "creditpoints": "信用点", - "pyroxene": "青辉石", - "confirmDeleteTitle": "删除确认", - "confirmDeleteMessage": "确认删除配置“{{name}}”?该操作不可撤销!", - "ui.zoom": "UI 缩放设置", - "commonShop.title": "普通商店", - "tacticalShop.title": "竞技场商店", - "commonShop.refreshTimes": "商店刷新次数", - "commonShop.refreshDesc": "自动刷新商店", - "add": "添加", - "Add Student": "添加学生", - "placeholder.config.insert": "请于此键入您的配置", - "placeholder.stage": "选择学生", - "stage.normalLabel": "普通图每日扫荡", - "stage.hardLabel": "困难图每日扫荡", - "dailySweep": "日常", - "dailySweepDesc": "日常推图及扫荡设置", - "placeholder.nobinding": "无绑定", - "tactical": "总力战", - "tacticalDesc": "总力战设置", - "drill": "战术综合测试", - "drillDesc": "战术综合测试设置", - "artifact": "制造", - "artifactDesc": "制造设置", - "whitelist": "好友白名单", - "whitelistDesc": "自动删好友时白名单", - "script": "脚本设置", - "scriptDesc": "脚本运行相关设置", - "stage": "推图", - "stageDesc": "帮你自动推图", - "team": "编队", - "teamDesc": "设置您的编队", - "eventName.restart": "凌晨四点重启", - "eventName.arena": "竞技场", - "eventName.cafe_reward": "咖啡厅", - "eventName.no1_cafe_invite": "1号咖啡厅邀请", - "eventName.no2_cafe_invite": "2号咖啡厅邀请", - "eventName.lesson": "日程", - "eventName.group": "收集小组体力", - "eventName.collect_daily_free_power": "收集免费购买体力", - "eventName.mail": "查收邮箱", - "eventName.collect_daily_power": "收集每日体力", - "eventName.common_shop": "商店购买", - "eventName.tactical_challenge_shop": "竞技场商店购买", - "eventName.rewarded_task": "悬赏通缉", - "eventName.normal_task": "普通关清体力", - "eventName.hard_task": "困难关清体力", - "eventName.scrimmage": "学院交流会", - "eventName.clear_special_task_power": "每日特别委托", - "eventName.create": "自动制造", - "eventName.total_assault": "总力战", - "eventName.activity_sweep": "活动扫荡", - "eventName.collect_reward": "收集奖励", - "eventName.momo_talk": "自动MomoTalk", - "eventName.dailyGameActivity": "日常小游戏", - "eventName.friend": "清理好友", - "eventName.joint_firing_drill": "综合战术测试", - "eventName.pass": "领取pass奖励", - "scheduler.inactiveTasks": "未启用的任务", - "scheduler.activeTasks": "启用的任务", - "scheduler.search": "搜索任务", - "scheduler.sortDefault": "默认排序", - "scheduler.sortByTime": "按时间排序", - "scheduler.detailConfig": "任务详细调度配置", - "scheduler.eventName": "任务名称", - "scheduler.nextTick": "下次执行时间", - "scheduler.priority": "优先级", - "scheduler.interval": "间隔 (秒)", - "scheduler.dailyReset": "每日重置时间", - "scheduler.disabledRange": "禁用时间段", - "scheduler.preTask": "前置任务", - "scheduler.postTask": "后置任务", - "common.confirm": "确认", - "scheduler.selector": "任务选择器", - "cafe.basicSettings": "咖啡厅基础设置", - "cafe.cafe1Settings": "咖啡厅1设置", - "cafe.cafe2Settings": "咖啡厅2设置", - "cafe.collectReward": "收集奖励", - "cafe.exchangeStudent": "学生更换服饰", - "cafe.duplicateInvite": "重复邀请", - "cafe.hasNo2Cafe": "二号咖啡厅", - "cafe.patStyle": "摸头风格", - "cafe.patStyleDragGift": "拖动礼物", - "cafe.invite1Mode": "邀请模式", - "cafe.invite2Mode": "邀请模式", - "cafe.lowestAffection": "按最低好感度", - "cafe.highestAffection": "按最高好感度", - "cafe.starred": "按收藏的学生", - "cafe.byName": "按学生的名字", - "cafe.starredPosition": "收藏学生位置", - "cafe.cafe1Students": "学生姓名列表", - "cafe.cafe2Students": "学生姓名列表", - "lesson.enableFavorStudent": "优先选择收藏的学生", - "lesson.relationshipFirst": "优先选择高好感度学生", - "lesson.region": "日程区域", - "lesson.favorStudent": "收藏的学生", - "artifact.global": "全局设置", - "artifact.phase_1": "第一阶段", - "artifact.phase_2": "第二阶段", - "artifact.phase_3": "第三阶段", - "artifact.useTicketDesc": "使用制造券", - "artifact.createTime": "制造次数", - "artifact.phaseCount": "制造阶数", - "artifact.materialSelect": "材料选择", - "artifact.phase2.recommend": "按照学生进行推荐", - "artifact.selectStudent": "选择学生", - "artifact.priority": "优先级", - "artifact.default": "默认", - "artifact.white": "白色", - "artifact.blue": "蓝色", - "artifact.whiteBlue": "白蓝组合", - "artifact.gold": "金色", - "artifact.purple": "紫色", - "artifact.goldPurple": "金紫组合", - "artifact.all": "全部", - "artifact.saved": "设置已保存", - "artifact.savedDesc": "您的制造设置已保存。", - "arena.higherLevel": "对手高你的级数", - "arena.max_refresh_times": "最大刷新次数", - "arena.opponent_no": "对手编号", - "stage.dailyTab": "地图扫荡", - "stage.sweepTab": "扫荡细节", - "sweep.rewarded": "悬赏通缉扫荡次数", - "sweep.scrimmage": "学院交流会扫荡次数", - "sweep.activityNumber": "活动关卡扫荡关卡", - "sweep.activityTimes": "活动关卡扫荡次数", - "sweep.special": "特殊委托扫荡次数", - "sweep.purchaseRewarded": "悬赏委托扫荡券购买次数", - "sweep.purchaseLesson": "日程券购买次数", - "sweep.purchaseScrimmage": "学院交流会扫荡券购买次数", - "stage.normalDesc": "普通关卡与次数(如\"1-1-1,1-2-3\"表示关卡1-1打一次,然后关卡1-2打三次)", - "stage.hardDesc": "困难关卡设置同上,注意:次数最多为3,逗号均为英文逗号,日服、国际服可填max", - "stage.selectStudent": "选择学生", - "tactical.hardLevel": "总力战难度", - "drill.out_partyNo": "队伍编号", - "drill.difficulty": "测试难度", - "drill.useAllAfterSweep": "出击后使用所有测试挑战券", - "friend.placeholder": "输入好友码", - "friend.add": "添加", - "friend.empty": "好友白名单列表为空", - "friend.addFailed": "添加失败", - "friend.alreadyExists": "该好友已存在", - "friend.addedSuccess": "添加成功", - "friend.added": "已添加好友:", - "friend.deletedSuccess": "删除成功", - "friend.deleted": "已删除好友:", - "friend.invalidLength": "好友码长度无效", - "adb.title": "ADB 检测面板", - "adb.detectBtn": "检测 ADB", - "adb.detecting": "正在检测 ADB...", - "adb.noData": "暂无 ADB 数据", - "script.screenshotInterval": "截图间隔 (秒)", - "script.autostart": "脚本开启时自动启动", - "script.screenshotMethod": "截图方式", - "script.controlMethod": "控制方式", - "script.then": "任务完成后操作", - "script.doNothing": "不做任何操作", - "script.exitBaas": "退出 Baas", - "script.exitEmu": "退出模拟器", - "script.exitBoth": "退出 Baas 和模拟器", - "script.shutdown": "关闭电脑", - "emulator.openOnLaunch": "启动脚本时打开模拟器", - "emulator.multiInstance": "模拟器多开", - "emulator.waitTime": "等待模拟器启动时间 (秒)", - "emulator.multiType": "模拟器类型", - "emulator.instanceCount": "多开模拟器编号", - "emulator.address": "模拟器路径", - "choose": "选择", - "execute": "执行", - "stage.exploreTab": "主线关卡", - "stage.eventTab": "活动关卡", - "stage.manualBoss": "手动打Boss", - "stage.normalTask": "普通关卡", - "stage.hardTask": "困难关卡", - "stage.currentEvent": "当前活动", - "stage.story": "推剧情关卡", - "stage.mission": "推任务关卡", - "stage.challenge": "推挑战关卡", - "stage.attrTable": "关卡参考属性表", - "stage.noEvent": "暂无活动", - "team.chooseMethod": "编队方式", - "push.afterError": "发生错误后推送", - "push.afterCompletion": "所有任务完成后推送", - "push.json": "JSON 推送", - "push.serverchan": "Server酱 推送", - "other.fhx": "一键反和谐", - "other.fhxDesc": "尝试进行反和谐操作(国区特供)", - "versionInfo": "版本信息", - "localVersion": "当前版本", - "remoteVersion": "最新版本", - "updateMethod": "操作", - "globalUpdateSettings": "更新设置", - "updateChannel": "更新通道", - "mirrorCdk": "Mirror酱的CDK (可选)", - "mirror.verify": "验证CDK", - "mirror.verifying": "验证中", - "mc.verify.success": "Mirror酱CDK验证成功!", - "mc.verify.error": "Mirror酱CDK验证错误!", - "enterCdk": "输入CDK", - "shaConnectivityTest": "SHA获取方式", - "shaTest.method": "方式", - "shaTest.status": "状态", - "shaTest.time": "耗时", - "shaTest.sha": "SHA值", - "shaTest.testing": "SHA 测试中", - "shaTest.testAll": "测试所有方法", - "configAdd.nameRequired": "配置名不能为空", - "configAdd.serverRequired": "需要指定服务器", - "configAdd.nameDuplicate": "配置名已存在", - "configAdd.selectServer": "请选择服务器", - "create": "创建", - "settings.updateSuccess": "设置更新成功", - "settings.updateSuccessDesc": "您的设置已成功更新。", - "stage.story.main": "推主线故事", - "stage.story.group": "推社团故事", - "stage.story.mini": "推小故事", - "stage.taskTriggerStart": "任务已经下发", - "stage.taskTriggered": "下发的任务为: {{task}}", - "stage.noHardTask": "没有设置困难关卡!", - "stage.noNormalTask": "没有设置普通关卡!", - "start_hard_task": "推困难关卡", - "start_normal_task": "推普通关卡", - "start_fhx": "反和谐", - "start_main_story": "推主线故事", - "start_group_story": "推社团故事", - "start_mini_story": "推小故事", - "start_explore_activity_story": "推活动故事", - "start_explore_activity_mission": "推活动任务", - "start_explore_activity_challenge": "推活动挑战", - "main_story": "推主线故事", - "group_story": "推社团故事", - "mini_story": "推小故事", - "explore_activity_story": "推活动故事", - "explore_activity_mission": "推活动任务", - "explore_activity_challenge": "推活动挑战", - "de_clothes": "反和谐", - "explore_hard_task": "推困难关卡", - "explore_normal_task": "推普通关卡", - "title.updateSetting": "更新", - "shaMethod.github": "GitHub API", - "shaMethod.mirrorc": "Mirror酱免费API", - "shaMethod.gitee": "Gitee仓库读取", - "shaMethod.gitcode": "GitCode仓库读取", - "shaMethod.tencent_c_coding": "腾讯工蜂仓库读取", - "cdk.noCDKInput": "请输入Mirror酱CDK!", - "CDK invalid.": "CDK 不合法", - "CDK valid.": "CDK 合法", - "Please confirm that you have entered the correct cdkey": "请确认您输入了正确的 CDK", - "CDK valid. Expires at {}": "该 CDK 有效期至 {{expire_date}}。", - "CDK expired.": "CDK 已过期。", - "CDK quota exhausted for today.": "CDK 将在今日过期。", - "CDK mismatched for requested resource.": "CDK 与所请求仓库不一致。", - "CDK blocked.": "CDK 已经被管理员禁用。", - "CDK Test OK": "CDK 验证成功", - "version.fetching": "获取中...", - "version.untested": "未测试", - "version.testing": "测试中...", - "version.tapToTest": "检查更新", - "version.checkError": "版本获取失败", - "heartbeat.connected": "服务已连接", - "heartbeat.connecting": "服务连接中...", - "updateMethod.github": "GitHub(主仓库)", - "updateMethod.gitee": "Gitee(国内镜像)", - "updateMethod.gitcode": "GitCode(国内镜像)", - "updateMethod.tencent": "腾讯工蜂(国内镜像)", - "updateMethod.mirrorc": "Mirror酱更新", - "update.dueDate": "到期时间", - "placeholder.profileName": "在此输入您的配置名", - "update.available": "发现新版本", - "property.burst": "爆发", - "property.pierce": "贯穿", - "property.mystic": "神秘", - "property.shock": "振动", - "property.Unused": "未使用", - "team.preset": "按预设编队", - "team.side": "按侧栏属性编队", - "team.order": "按侧栏顺序编队", - "schedule.primary": "初级", - "schedule.normal": "普通", - "schedule.advanced": "高级", - "schedule.superior": "特级", - "lesson.times": "日程次数", - "confirmUpdateTitle": "确认更新", - "updatePrompt": "检测到新版本,是否现在更新?", - "updateNotice": "更新前请停止当前运行中的任务。", - "title.wiki": "文档", - "wiki": { - "title": "百科文档", - "subtitle": "面向 BAAS 自动化平台的规范化指南与运维手册。", - "searchPlaceholder": "按主题、关键词或标签搜索…", - "clearSearch": "清空搜索", - "resultsCount": "共 {{count}} 篇文档", - "noResults": "暂无符合当前筛选条件的文档。", - "selectDocument": "请选择左侧的文档以查看正文。", - "category": { - "all": "全部", - "architecture": "架构", - "getting-started": "入门", - "environment": "环境配置", - "configuration": "配置管理", - "operations": "运营操作", - "support": "支持与反馈", - "formation": "编队策略" - } - }, - "enterSecretTitle": "输入公钥", - "enterSecretPrompt": "公钥为通信安全保障所需", - "secretLabel": "公钥", - "secretPlaceholder": "请在此输入公钥", - "secretRequired": "公钥必须输入!", - "secretNotice": "公钥可从服务后端的service.secret文件获取", - "Confirm": "确认", - "export.log.folderSelect": "选择日志导出位置", - "export.log.success": "日志保存成功", - "export.log.successDesc": "日志保存于: {{path}}", - "toast.dateUpdated": "日期已更新", - "toast.timeUpdated": "时间已更新" -} diff --git a/service/dist/locales/zh.json.br b/service/dist/locales/zh.json.br deleted file mode 100644 index a893e90e258d525b0e1e758ff81effee0b960ee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5534 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 diff --git a/service/dist/scripts/fernetBrowser.min.js b/service/dist/scripts/fernetBrowser.min.js deleted file mode 100644 index fa2acde26..000000000 --- a/service/dist/scripts/fernetBrowser.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Minified by jsDelivr using Terser v5.37.0. - * Original file: /npm/fernet@0.4.0/fernetBrowser.js - * - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files - */ -!function(t){if("function"==typeof bootstrap)bootstrap("fernet",t);else if("object"==typeof exports)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeFernet=t}else"undefined"!=typeof window?window.fernet=t():global.fernet=t()}((function(){return function t(e,r,n){function o(s,a){if(!r[s]){if(!e[s]){var f="function"==typeof require&&require;if(!a&&f)return f(s,!0);if(i)return i(s,!0);throw new Error("Cannot find module '"+s+"'")}var u=r[s]={exports:{}};e[s][0].call(u.exports,(function(t){var r=e[s][1][t];return o(r||t)}),u,u.exports,t,e,r,n)}return r[s].exports}for(var i="function"==typeof require&&require,s=0;s0){if(u>this.ttl)throw new Error("Invalid Token: TTL");if(f/1e3+this.maxClockSkew0)throw"Invalid string. Length must be a multiple of 4";for(a=[],o=(s=(s=e.indexOf("="))>0?e.length-s:0)>0?e.length-4:e.length,r=0,n=0;r>16),a.push((65280&i)>>8),a.push(255&i);return 2===s?(i=t.indexOf(e[r])<<2|t.indexOf(e[r+1])>>4,a.push(255&i)):1===s&&(i=t.indexOf(e[r])<<10|t.indexOf(e[r+1])<<4|t.indexOf(e[r+2])>>2,a.push(i>>8&255),a.push(255&i)),a},e.exports.fromByteArray=function(e){var r,n,o,i,s=e.length%3,a="";for(r=0,o=e.length-s;r>18&63]+t[i>>12&63]+t[i>>6&63]+t[63&i];switch(s){case 1:n=e[e.length-1],a+=t[n>>2],a+=t[n<<4&63],a+="==";break;case 2:n=(e[e.length-2]<<8)+e[e.length-1],a+=t[n>>10],a+=t[n>>4&63],a+=t[n<<2&63],a+="="}return a}}()},{}],5:[function(t,e,r){var n=t("util"),o=t("buffer").Buffer,i=Array.prototype.slice;function s(t){if(Object.keys)return Object.keys(t);var e=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.push(r);return e}var a=e.exports=h;function f(t,e){return void 0===e?""+e:"number"!=typeof e||!isNaN(e)&&isFinite(e)?"function"==typeof e||e instanceof RegExp?e.toString():e:e.toString()}function u(t,e){return"string"==typeof t?t.length=0;n--)if(o[n]!=a[n])return!1;for(n=o.length-1;n>=0;n--)if(!p(t[r=o[n]],e[r]))return!1;return!0}(t,e)}function l(t){return null==t}function y(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function g(t,e){return!(!t||!e)&&(e instanceof RegExp?e.test(t):t instanceof e||!0===e.call({},t))}function d(t,e,r,n){var o;"string"==typeof r&&(n=r,r=null);try{e()}catch(t){o=t}if(n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),t&&!o&&c("Missing expected exception"+n),!t&&g(o,r)&&c("Got unwanted exception"+n),t&&o&&r&&!g(o,r)||!t&&o)throw o}a.AssertionError=function(t){this.name="AssertionError",this.message=t.message,this.actual=t.actual,this.expected=t.expected,this.operator=t.operator;var e=t.stackStartFunction||c;Error.captureStackTrace&&Error.captureStackTrace(this,e)},n.inherits(a.AssertionError,Error),a.AssertionError.prototype.toString=function(){return this.message?[this.name+":",this.message].join(" "):[this.name+":",u(JSON.stringify(this.actual,f),128),this.operator,u(JSON.stringify(this.expected,f),128)].join(" ")},a.fail=c,a.ok=h,a.equal=function(t,e,r){t!=e&&c(t,e,r,"==",a.equal)},a.notEqual=function(t,e,r){t==e&&c(t,e,r,"!=",a.notEqual)},a.deepEqual=function(t,e,r){p(t,e)||c(t,e,r,"deepEqual",a.deepEqual)},a.notDeepEqual=function(t,e,r){p(t,e)&&c(t,e,r,"notDeepEqual",a.notDeepEqual)},a.strictEqual=function(t,e,r){t!==e&&c(t,e,r,"===",a.strictEqual)},a.notStrictEqual=function(t,e,r){t===e&&c(t,e,r,"!==",a.notStrictEqual)},a.throws=function(t,e,r){d.apply(this,[!0].concat(i.call(arguments)))},a.doesNotThrow=function(t,e,r){d.apply(this,[!1].concat(i.call(arguments)))},a.ifError=function(t){if(t)throw t}},{buffer:9,util:7}],6:[function(t,e,r){var n=t("__browserify_process");n.EventEmitter||(n.EventEmitter=function(){});var o=r.EventEmitter=n.EventEmitter,i="function"==typeof Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};o.prototype.setMaxListeners=function(t){this._events||(this._events={}),this._events.maxListeners=t},o.prototype.emit=function(t){if("error"===t&&(!this._events||!this._events.error||i(this._events.error)&&!this._events.error.length))throw arguments[1]instanceof Error?arguments[1]:new Error("Uncaught, unspecified 'error' event.");if(!this._events)return!1;var e=this._events[t];if(!e)return!1;if("function"==typeof e){switch(arguments.length){case 1:e.call(this);break;case 2:e.call(this,arguments[1]);break;case 3:e.call(this,arguments[1],arguments[2]);break;default:var r=Array.prototype.slice.call(arguments,1);e.apply(this,r)}return!0}if(i(e)){r=Array.prototype.slice.call(arguments,1);for(var n=e.slice(),o=0,s=n.length;o0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),console.trace());this._events[t].push(e)}else this._events[t]=[this._events[t],e];else this._events[t]=e;return this},o.prototype.on=o.prototype.addListener,o.prototype.once=function(t,e){var r=this;return r.on(t,(function n(){r.removeListener(t,n),e.apply(this,arguments)})),this},o.prototype.removeListener=function(t,e){if("function"!=typeof e)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[t])return this;var r=this._events[t];if(i(r)){var n=function(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0;r-1&&(o=n(f)?o.split("\n").map((function(t){return" "+t})).join("\n").substr(2):"\n"+o.split("\n").map((function(t){return" "+t})).join("\n")):o=h("[Circular]","special")),void 0===r){if("Array"===y&&e.match(/^\d+$/))return o;(r=JSON.stringify(""+e)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(r=r.substr(1,r.length-2),r=h(r,"name")):(r=r.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),r=h(r,"string"))}return r+": "+o}));c.pop();var E=m.reduce((function(t,e){return e.indexOf("\n")>=0&&0,t+e.length+1}),0);return m=E>50?g[0]+(""===l?"":l+"\n ")+" "+m.join(",\n ")+" "+g[1]:g[0]+l+" "+m.join(", ")+" "+g[1]}(t,void 0===f?2:f)};r.log=function(t){},r.pump=null;var s=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e},a=Object.getOwnPropertyNames||function(t){var e=[];for(var r in t)Object.hasOwnProperty.call(t,r)&&e.push(r);return e},f=Object.create||function(t,e){var r;if(null===t)r={__proto__:null};else{if("object"!=typeof t)throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var n=function(){};n.prototype=t,(r=new n).__proto__=t}return void 0!==e&&Object.defineProperties&&Object.defineProperties(r,e),r};r.inherits=function(t,e){t.super_=e,t.prototype=f(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})};var u=/%[sdj%]/g;r.format=function(t){if("string"!=typeof t){for(var e=[],n=0;n=i)return t;switch(t){case"%s":return String(o[n++]);case"%d":return Number(o[n++]);case"%j":return JSON.stringify(o[n++]);default:return t}})),a=o[n];n>1,c=-7,h=r?0:o-1,p=r?1:-1,l=t[e+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[e+h],h+=p,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=n;c>0;s=256*s+t[e+h],h+=p,c-=8);if(0===i)i=1-u;else{if(i===f)return s?NaN:1/0*(l?-1:1);s+=Math.pow(2,n),i-=u}return(l?-1:1)*s*Math.pow(2,i-n)},r.writeIEEE754=function(t,e,r,n,o,i){var s,a,f,u=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?i-1:0,y=n?-1:1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(f=Math.pow(2,-s))<1&&(s--,f*=2),(e+=s+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(s++,f/=2),s+h>=c?(a=0,s=c):s+h>=1?(a=(e*f-1)*Math.pow(2,o),s+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,o),s=0));o>=8;t[r+l]=255&a,l+=y,a/=256,o-=8);for(s=s<0;t[r+l]=255&s,l+=y,s/=256,u-=8);t[r+l-y]|=128*g}},{}],9:[function(t,e,r){var n=t("assert");function o(t,e,r){if(!(this instanceof o))return new o(t,e,r);var n;if(this.parent=this,this.offset=0,"number"==typeof r)this.length=i(e),this.offset=r;else{switch(n=typeof t){case"number":this.length=i(t);break;case"string":this.length=o.byteLength(t,e);break;case"object":this.length=i(t.length);break;default:throw new Error("First argument needs to be a number, array or string.")}if(function(t){return s(t)||o.isBuffer(t)||t&&"object"==typeof t&&"number"==typeof t.length}(t))for(var a=0;a=e.length||o>=t.length);)e[o+r]=t[o],o++;return o}function h(t){try{return decodeURIComponent(t)}catch(t){return String.fromCharCode(65533)}}function p(t,e,r,o){var i=0;return o||(n.ok("boolean"==typeof r,"missing or invalid endian"),n.ok(null!=e,"missing offset"),n.ok(e+1=t.length?0:(r?(i=t[e]<<8,e+1=t.length?0:(r?(e+1>>0):(e+2>>0)),i)}function y(t,e,r,o){var i;return o||(n.ok("boolean"==typeof r,"missing or invalid endian"),n.ok(null!=e,"missing offset"),n.ok(e+1=0,"specified a negative value for writing an unsigned value"),n.ok(t<=e,"value is larger than maximum value for type"),n.ok(Math.floor(t)===t,"value has a fractional component")}function b(t,e,r,o,i){i||(n.ok(null!=e,"missing value"),n.ok("boolean"==typeof o,"missing or invalid endian"),n.ok(null!=r,"missing offset"),n.ok(r+1>>8*(o?1-s:s)}function m(t,e,r,o,i){i||(n.ok(null!=e,"missing value"),n.ok("boolean"==typeof o,"missing or invalid endian"),n.ok(null!=r,"missing offset"),n.ok(r+3>>8*(o?3-s:s)&255}function E(t,e,r){n.ok("number"==typeof t,"cannot write a non-number as a number"),n.ok(t<=e,"value larger than maximum allowed value"),n.ok(t>=r,"value smaller than minimum allowed value"),n.ok(Math.floor(t)===t,"value has a fractional component")}function _(t,e,r){n.ok("number"==typeof t,"cannot write a non-number as a number"),n.ok(t<=e,"value larger than maximum allowed value"),n.ok(t>=r,"value smaller than minimum allowed value")}function k(t,e,r,o,i){i||(n.ok(null!=e,"missing value"),n.ok("boolean"==typeof o,"missing or invalid endian"),n.ok(null!=r,"missing offset"),n.ok(r+1=0?e:65535+e+1,r,o,i)}function x(t,e,r,o,i){i||(n.ok(null!=e,"missing value"),n.ok("boolean"==typeof o,"missing or invalid endian"),n.ok(null!=r,"missing offset"),n.ok(r+3=0?e:4294967295+e+1,r,o,i)}function S(e,r,o,i,s){s||(n.ok(null!=r,"missing value"),n.ok("boolean"==typeof i,"missing or invalid endian"),n.ok(null!=o,"missing offset"),n.ok(o+3=this.length)throw new Error("oob");return this[t]},o.prototype.set=function(t,e){if(t<0||t>=this.length)throw new Error("oob");return this[t]=e},o.byteLength=function(t,e){switch(e||"utf8"){case"hex":return t.length/2;case"utf8":case"utf-8":return f(t).length;case"ascii":case"binary":return t.length;case"base64":return u(t).length;default:throw new Error("Unknown encoding")}},o.prototype.utf8Write=function(t,e,r){return o._charsWritten=c(f(t),this,e,r)},o.prototype.asciiWrite=function(t,e,r){return o._charsWritten=c(function(t){for(var e=[],r=0;r"},o.prototype.hexSlice=function(t,e){var r=this.length;(!t||t<0)&&(t=0),(!e||e<0||e>r)&&(e=r);for(var n="",o=t;on&&(r=n):r=n;var i=t.length;if(i%2)throw new Error("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;si&&(r=i):r=i,n=String(n||"utf8").toLowerCase()){case"hex":return this.hexWrite(t,e,r);case"utf8":case"utf-8":return this.utf8Write(t,e,r);case"ascii":return this.asciiWrite(t,e,r);case"binary":return this.binaryWrite(t,e,r);case"base64":return this.base64Write(t,e,r);case"ucs2":case"ucs-2":return this.ucs2Write(t,e,r);default:throw new Error("Unknown encoding")}},o.prototype.slice=function(t,e){if(void 0===e&&(e=this.length),e>this.length)throw new Error("oob");if(t>e)throw new Error("oob");return new o(this,e-t,+t)},o.prototype.copy=function(t,e,r,o){var i=this;if(r||(r=0),(void 0===o||isNaN(o))&&(o=this.length),e||(e=0),o=t.length)throw new Error("targetStart out of bounds");if(r<0||r>=i.length)throw new Error("sourceStart out of bounds");if(o<0||o>i.length)throw new Error("sourceEnd out of bounds");o>this.length&&(o=this.length),t.length-e=this.length)throw new Error("start out of bounds");if(r<0||r>this.length)throw new Error("end out of bounds");for(var n=e;n=r.length))return r[t]},o.prototype.readUInt16LE=function(t,e){return p(this,t,!1,e)},o.prototype.readUInt16BE=function(t,e){return p(this,t,!0,e)},o.prototype.readUInt32LE=function(t,e){return l(this,t,!1,e)},o.prototype.readUInt32BE=function(t,e){return l(this,t,!0,e)},o.prototype.readInt8=function(t,e){var r=this;if(e||(n.ok(null!=t,"missing offset"),n.ok(t=r.length))return 128&r[t]?-1*(255-r[t]+1):r[t]},o.prototype.readInt16LE=function(t,e){return y(this,t,!1,e)},o.prototype.readInt16BE=function(t,e){return y(this,t,!0,e)},o.prototype.readInt32LE=function(t,e){return g(this,t,!1,e)},o.prototype.readInt32BE=function(t,e){return g(this,t,!0,e)},o.prototype.readFloatLE=function(t,e){return d(this,t,!1,e)},o.prototype.readFloatBE=function(t,e){return d(this,t,!0,e)},o.prototype.readDoubleLE=function(t,e){return v(this,t,!1,e)},o.prototype.readDoubleBE=function(t,e){return v(this,t,!0,e)},o.prototype.writeUInt8=function(t,e,r){var o=this;r||(n.ok(null!=t,"missing value"),n.ok(null!=e,"missing offset"),n.ok(e=0?o.writeUInt8(t,e,r):o.writeUInt8(255+t+1,e,r)},o.prototype.writeInt16LE=function(t,e,r){k(this,t,e,!1,r)},o.prototype.writeInt16BE=function(t,e,r){k(this,t,e,!0,r)},o.prototype.writeInt32LE=function(t,e,r){x(this,t,e,!1,r)},o.prototype.writeInt32BE=function(t,e,r){x(this,t,e,!0,r)},o.prototype.writeFloatLE=function(t,e,r){S(this,t,e,!1,r)},o.prototype.writeFloatBE=function(t,e,r){S(this,t,e,!0,r)},o.prototype.writeDoubleLE=function(t,e,r){B(this,t,e,!1,r)},o.prototype.writeDoubleBE=function(t,e,r){B(this,t,e,!0,r)}},{"./buffer_ieee754":8,assert:5,"base64-js":4}],10:[function(t,e,r){var n=t("buffer").Buffer,o=new n(4);o.fill(0);e.exports={hash:function(t,e,r,i){return n.isBuffer(t)||(t=new n(t)),function(t,e,r){for(var o=new n(e),i=r?o.writeInt32BE:o.writeInt32LE,s=0;sf?e=t(e):e.length>5]|=128<>>9<<4)]=e;for(var r=1732584193,n=-271733879,o=-1732584194,i=271733878,h=0;h>>32-a,r);var s,a}function s(t,e,r,n,o,s,a){return i(e&r|~e&n,t,e,o,s,a)}function a(t,e,r,n,o,s,a){return i(e&n|r&~n,t,e,o,s,a)}function f(t,e,r,n,o,s,a){return i(e^r^n,t,e,o,s,a)}function u(t,e,r,n,o,s,a){return i(r^(e|~n),t,e,o,s,a)}function c(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r}e.exports=function(t){return n.hash(t,o,16)}},{"./helpers":10}],13:[function(t,e,r){!function(){var t,r;t=function(t){for(var e,r=new Array(t),n=0;n>>((3&n)<<3)&255;return r},this.crypto&&crypto.getRandomValues&&(r=function(t){var e=new Uint8Array(t);return crypto.getRandomValues(e),e}),e.exports=r||t}()},{}],14:[function(t,e,r){var n=t("./helpers");function o(t,e){t[e>>5]|=128<<24-e%32,t[15+(e+64>>9<<4)]=e;for(var r=Array(80),n=1732584193,o=-271733879,u=-1732584194,c=271733878,h=-1009589776,p=0;p>16)+(e>>16)+(r>>16)<<16|65535&r}function f(t,e){return t<>>32-e}e.exports=function(t){return n.hash(t,o,20,!0)}},{"./helpers":10}],15:[function(t,e,r){var n=t("./helpers"),o=function(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r},i=function(t,e){return t>>>e|t<<32-e},s=function(t,e){return t>>>e},a=function(t,e,r){return t&e^~t&r},f=function(t,e,r){return t&e^t&r^e&r},u=function(t){return i(t,2)^i(t,13)^i(t,22)},c=function(t){return i(t,6)^i(t,11)^i(t,25)},h=function(t){return i(t,7)^i(t,18)^s(t,3)},p=function(t,e){var r,n,p,l,y,g,d,v,w,b,m,E=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),_=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),k=new Array(64);t[e>>5]|=128<<24-e%32,t[15+(e+64>>9<<4)]=e;for(var x=0;x>>8^255&y^99,o[r]=y,i[y]=r;var g=t[r],d=t[g],v=t[d],w=257*t[y]^16843008*y;s[r]=w<<24|w>>>8,a[r]=w<<16|w>>>16,f[r]=w<<8|w>>>24,u[r]=w,w=16843009*v^65537*d^257*g^16843008*r,c[y]=w<<24|w>>>8,h[y]=w<<16|w>>>16,p[y]=w<<8|w>>>24,l[y]=w,r?(r=g^t[t[t[v^g]]],n^=t[t[n]]):r=n=1}}();var y=[0,1,2,4,8,16,32,64,128,27,54],g=n.AES=r.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,n=4*((this._nRounds=r+6)+1),i=this._keySchedule=[],s=0;s6&&s%r==4&&(a=o[a>>>24]<<24|o[a>>>16&255]<<16|o[a>>>8&255]<<8|o[255&a]):(a=o[(a=a<<8|a>>>24)>>>24]<<24|o[a>>>16&255]<<16|o[a>>>8&255]<<8|o[255&a],a^=y[s/r|0]<<24),i[s]=i[s-r]^a}for(var f=this._invKeySchedule=[],u=0;u>>24]]^h[o[a>>>16&255]]^p[o[a>>>8&255]]^l[o[255&a]]}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,s,a,f,u,o)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,c,h,p,l,i),r=t[e+1],t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,n,o,i,s,a){for(var f=this._nRounds,u=t[e]^r[0],c=t[e+1]^r[1],h=t[e+2]^r[2],p=t[e+3]^r[3],l=4,y=1;y>>24]^o[c>>>16&255]^i[h>>>8&255]^s[255&p]^r[l++],d=n[c>>>24]^o[h>>>16&255]^i[p>>>8&255]^s[255&u]^r[l++],v=n[h>>>24]^o[p>>>16&255]^i[u>>>8&255]^s[255&c]^r[l++],w=n[p>>>24]^o[u>>>16&255]^i[c>>>8&255]^s[255&h]^r[l++];u=g,c=d,h=v,p=w}g=(a[u>>>24]<<24|a[c>>>16&255]<<16|a[h>>>8&255]<<8|a[255&p])^r[l++],d=(a[c>>>24]<<24|a[h>>>16&255]<<16|a[p>>>8&255]<<8|a[255&u])^r[l++],v=(a[h>>>24]<<24|a[p>>>16&255]<<16|a[u>>>8&255]<<8|a[255&c])^r[l++],w=(a[p>>>24]<<24|a[u>>>16&255]<<16|a[c>>>8&255]<<8|a[255&h])^r[l++],t[e]=g,t[e+1]=d,t[e+2]=v,t[e+3]=w},keySize:8});e.AES=r._createHelper(g)}(),t.AES},"object"==typeof r?e.exports=r=o(t("./core"),t("./enc-base64"),t("./md5"),t("./evpkdf"),t("./cipher-core")):o(n.CryptoJS)},{"./cipher-core":17,"./core":18,"./enc-base64":19,"./evpkdf":23,"./md5":26}],17:[function(t,e,r){var n,o;n=this,o=function(t){var e,r,n,o,i,s,a,f,u,c,h,p,l,y,g,d,v,w;t.lib.Cipher||(r=(e=t).lib,n=r.Base,o=r.WordArray,i=r.BufferedBlockAlgorithm,(s=e.enc).Utf8,a=s.Base64,f=e.algo.EvpKDF,u=r.Cipher=i.extend({cfg:n.extend(),createEncryptor:function(t,e){return this.create(this._ENC_XFORM_MODE,t,e)},createDecryptor:function(t,e){return this.create(this._DEC_XFORM_MODE,t,e)},init:function(t,e,r){this.cfg=this.cfg.extend(r),this._xformMode=t,this._key=e,this.reset()},reset:function(){i.reset.call(this),this._doReset()},process:function(t){return this._append(t),this._process()},finalize:function(t){return t&&this._append(t),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function t(t){return"string"==typeof t?w:d}return function(e){return{encrypt:function(r,n,o){return t(n).encrypt(e,r,n,o)},decrypt:function(r,n,o){return t(n).decrypt(e,r,n,o)}}}}()}),r.StreamCipher=u.extend({_doFinalize:function(){return this._process(!0)},blockSize:1}),c=e.mode={},h=r.BlockCipherMode=n.extend({createEncryptor:function(t,e){return this.Encryptor.create(t,e)},createDecryptor:function(t,e){return this.Decryptor.create(t,e)},init:function(t,e){this._cipher=t,this._iv=e}}),p=c.CBC=function(){var t=h.extend();function e(t,e,r){var n=this._iv;if(n){var o=n;this._iv=void 0}else o=this._prevBlock;for(var i=0;i>>2];t.sigBytes-=e}},r.BlockCipher=u.extend({cfg:u.cfg.extend({mode:p,padding:l}),reset:function(){u.reset.call(this);var t=this.cfg,e=t.iv,r=t.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=r.createEncryptor;else n=r.createDecryptor,this._minBufferSize=1;this._mode=n.call(r,this,e&&e.words)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){t.pad(this._data,this.blockSize);var e=this._process(!0)}else e=this._process(!0),t.unpad(e);return e},blockSize:4}),y=r.CipherParams=n.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}}),g=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,r=t.salt;if(r)var n=o.create([1398893684,1701076831]).concat(r).concat(e);else n=e;return n.toString(a)},parse:function(t){var e=a.parse(t),r=e.words;if(1398893684==r[0]&&1701076831==r[1]){var n=o.create(r.slice(2,4));r.splice(0,4),e.sigBytes-=16}return y.create({ciphertext:e,salt:n})}},d=r.SerializableCipher=n.extend({cfg:n.extend({format:g}),encrypt:function(t,e,r,n){n=this.cfg.extend(n);var o=t.createEncryptor(r,n),i=o.finalize(e),s=o.cfg;return y.create({ciphertext:i,key:r,iv:s.iv,algorithm:t,mode:s.mode,padding:s.padding,blockSize:t.blockSize,formatter:n.format})},decrypt:function(t,e,r,n){return n=this.cfg.extend(n),e=this._parse(e,n.format),t.createDecryptor(r,n).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),v=(e.kdf={}).OpenSSL={execute:function(t,e,r,n){n||(n=o.random(8));var i=f.create({keySize:e+r}).compute(t,n),s=o.create(i.words.slice(e),4*r);return i.sigBytes=4*e,y.create({key:i,iv:s,salt:n})}},w=r.PasswordBasedCipher=d.extend({cfg:d.cfg.extend({kdf:v}),encrypt:function(t,e,r,n){var o=(n=this.cfg.extend(n)).kdf.execute(r,t.keySize,t.ivSize);n.iv=o.iv;var i=d.encrypt.call(this,t,e,o.key,n);return i.mixIn(o),i},decrypt:function(t,e,r,n){n=this.cfg.extend(n),e=this._parse(e,n.format);var o=n.kdf.execute(r,t.keySize,t.ivSize,e.salt);return n.iv=o.iv,d.decrypt.call(this,t,e,o.key,n)}}))},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],18:[function(t,e,r){var n,o;n=this,o=function(){var t=t||function(t){var e=Object.create||function(){function t(){}return function(e){var r;return t.prototype=e,r=new t,t.prototype=null,r}}(),r={},n=r.lib={},o=n.Base={extend:function(t){var r=e(this);return t&&r.mixIn(t),r.hasOwnProperty("init")&&this.init!==r.init||(r.init=function(){r.$super.init.apply(this,arguments)}),r.init.prototype=r,r.$super=this,r},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},i=n.WordArray=o.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||a).stringify(this)},concat:function(t){var e=this.words,r=t.words,n=this.sigBytes,o=t.sigBytes;if(this.clamp(),n%4)for(var i=0;i>>2]>>>24-i%4*8&255;e[n+i>>>2]|=s<<24-(n+i)%4*8}else for(i=0;i>>2]=r[i>>>2];return this.sigBytes+=o,this},clamp:function(){var e=this.words,r=this.sigBytes;e[r>>>2]&=4294967295<<32-r%4*8,e.length=t.ceil(r/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(e){for(var r,n=[],o=function(e){var r=987654321,n=4294967295;return function(){var o=((r=36969*(65535&r)+(r>>16)&n)<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n;return o/=4294967296,(o+=.5)*(t.random()>.5?1:-1)}},s=0;s>>2]>>>24-o%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n>>3]|=parseInt(t.substr(n,2),16)<<24-n%8*4;return new i.init(r,e/2)}},f=s.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,n=[],o=0;o>>2]>>>24-o%4*8&255;n.push(String.fromCharCode(i))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n>>2]|=(255&t.charCodeAt(n))<<24-n%4*8;return new i.init(r,e)}},u=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(f.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return f.parse(unescape(encodeURIComponent(t)))}},c=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new i.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=u.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var r=this._data,n=r.words,o=r.sigBytes,s=this.blockSize,a=o/(4*s),f=(a=e?t.ceil(a):t.max((0|a)-this._minBufferSize,0))*s,u=t.min(4*f,o);if(f){for(var c=0;c>>2]>>>24-i%4*8&255)<<16|(e[i+1>>>2]>>>24-(i+1)%4*8&255)<<8|e[i+2>>>2]>>>24-(i+2)%4*8&255,a=0;a<4&&i+.75*a>>6*(3-a)&63));var f=n.charAt(64);if(f)for(;o.length%4;)o.push(f);return o.join("")},parse:function(t){var e=t.length,n=this._map,o=this._reverseMap;if(!o){o=this._reverseMap=[];for(var i=0;i>>6-s%4*2;o[i>>>2]|=(a|f)<<24-i%4*8,i++}return r.create(o,i)}(t,e,o)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},t.enc.Base64},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],20:[function(t,e,r){var n,o;n=this,o=function(t){return t.enc.Hex},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],21:[function(t,e,r){var n,o;n=this,o=function(t){return t.enc.Latin1},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],22:[function(t,e,r){var n,o;n=this,o=function(t){return t.enc.Utf8},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],23:[function(t,e,r){var n,o;n=this,o=function(t){var e,r,n,o,i,s,a;return r=(e=t).lib,n=r.Base,o=r.WordArray,i=e.algo,s=i.MD5,a=i.EvpKDF=n.extend({cfg:n.extend({keySize:4,hasher:s,iterations:1}),init:function(t){this.cfg=this.cfg.extend(t)},compute:function(t,e){for(var r=this.cfg,n=r.hasher.create(),i=o.create(),s=i.words,a=r.keySize,f=r.iterations;s.lengtho&&(e=t.finalize(e)),e.clamp();for(var i=this._oKey=e.clone(),s=this._iKey=e.clone(),a=i.words,f=s.words,u=0;u>>24)|4278255360&(o<<24|o>>>8)}var i=this._hash.words,s=t[e+0],f=t[e+1],l=t[e+2],y=t[e+3],g=t[e+4],d=t[e+5],v=t[e+6],w=t[e+7],b=t[e+8],m=t[e+9],E=t[e+10],_=t[e+11],k=t[e+12],x=t[e+13],S=t[e+14],B=t[e+15],I=i[0],L=i[1],A=i[2],j=i[3];I=u(I,L,A,j,s,7,a[0]),j=u(j,I,L,A,f,12,a[1]),A=u(A,j,I,L,l,17,a[2]),L=u(L,A,j,I,y,22,a[3]),I=u(I,L,A,j,g,7,a[4]),j=u(j,I,L,A,d,12,a[5]),A=u(A,j,I,L,v,17,a[6]),L=u(L,A,j,I,w,22,a[7]),I=u(I,L,A,j,b,7,a[8]),j=u(j,I,L,A,m,12,a[9]),A=u(A,j,I,L,E,17,a[10]),L=u(L,A,j,I,_,22,a[11]),I=u(I,L,A,j,k,7,a[12]),j=u(j,I,L,A,x,12,a[13]),A=u(A,j,I,L,S,17,a[14]),I=c(I,L=u(L,A,j,I,B,22,a[15]),A,j,f,5,a[16]),j=c(j,I,L,A,v,9,a[17]),A=c(A,j,I,L,_,14,a[18]),L=c(L,A,j,I,s,20,a[19]),I=c(I,L,A,j,d,5,a[20]),j=c(j,I,L,A,E,9,a[21]),A=c(A,j,I,L,B,14,a[22]),L=c(L,A,j,I,g,20,a[23]),I=c(I,L,A,j,m,5,a[24]),j=c(j,I,L,A,S,9,a[25]),A=c(A,j,I,L,y,14,a[26]),L=c(L,A,j,I,b,20,a[27]),I=c(I,L,A,j,x,5,a[28]),j=c(j,I,L,A,l,9,a[29]),A=c(A,j,I,L,w,14,a[30]),I=h(I,L=c(L,A,j,I,k,20,a[31]),A,j,d,4,a[32]),j=h(j,I,L,A,b,11,a[33]),A=h(A,j,I,L,_,16,a[34]),L=h(L,A,j,I,S,23,a[35]),I=h(I,L,A,j,f,4,a[36]),j=h(j,I,L,A,g,11,a[37]),A=h(A,j,I,L,w,16,a[38]),L=h(L,A,j,I,E,23,a[39]),I=h(I,L,A,j,x,4,a[40]),j=h(j,I,L,A,s,11,a[41]),A=h(A,j,I,L,y,16,a[42]),L=h(L,A,j,I,v,23,a[43]),I=h(I,L,A,j,m,4,a[44]),j=h(j,I,L,A,k,11,a[45]),A=h(A,j,I,L,B,16,a[46]),I=p(I,L=h(L,A,j,I,l,23,a[47]),A,j,s,6,a[48]),j=p(j,I,L,A,w,10,a[49]),A=p(A,j,I,L,S,15,a[50]),L=p(L,A,j,I,d,21,a[51]),I=p(I,L,A,j,k,6,a[52]),j=p(j,I,L,A,y,10,a[53]),A=p(A,j,I,L,E,15,a[54]),L=p(L,A,j,I,f,21,a[55]),I=p(I,L,A,j,b,6,a[56]),j=p(j,I,L,A,B,10,a[57]),A=p(A,j,I,L,v,15,a[58]),L=p(L,A,j,I,x,21,a[59]),I=p(I,L,A,j,g,6,a[60]),j=p(j,I,L,A,_,10,a[61]),A=p(A,j,I,L,l,15,a[62]),L=p(L,A,j,I,m,21,a[63]),i[0]=i[0]+I|0,i[1]=i[1]+L|0,i[2]=i[2]+A|0,i[3]=i[3]+j|0},_doFinalize:function(){var t=this._data,r=t.words,n=8*this._nDataBytes,o=8*t.sigBytes;r[o>>>5]|=128<<24-o%32;var i=e.floor(n/4294967296),s=n;r[15+(o+64>>>9<<4)]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8),r[14+(o+64>>>9<<4)]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),t.sigBytes=4*(r.length+1),this._process();for(var a=this._hash,f=a.words,u=0;u<4;u++){var c=f[u];f[u]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return a},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function u(t,e,r,n,o,i,s){var a=t+(e&r|~e&n)+o+s;return(a<>>32-i)+e}function c(t,e,r,n,o,i,s){var a=t+(e&n|r&~n)+o+s;return(a<>>32-i)+e}function h(t,e,r,n,o,i,s){var a=t+(e^r^n)+o+s;return(a<>>32-i)+e}function p(t,e,r,n,o,i,s){var a=t+(r^(e|~n))+o+s;return(a<>>32-i)+e}r.MD5=i._createHelper(f),r.HmacMD5=i._createHmacHelper(f)}(Math),t.MD5},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],27:[function(t,e,r){var n,o;n=this,o=function(t){var e,r,n,o,i,s,a;return r=(e=t).lib,n=r.WordArray,o=r.Hasher,i=e.algo,s=[],a=i.SHA1=o.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,n=r[0],o=r[1],i=r[2],a=r[3],f=r[4],u=0;u<80;u++){if(u<16)s[u]=0|t[e+u];else{var c=s[u-3]^s[u-8]^s[u-14]^s[u-16];s[u]=c<<1|c>>>31}var h=(n<<5|n>>>27)+f+s[u];h+=u<20?1518500249+(o&i|~o&a):u<40?1859775393+(o^i^a):u<60?(o&i|o&a|i&a)-1894007588:(o^i^a)-899497514,f=a,a=i,i=o<<30|o>>>2,o=n,n=h}r[0]=r[0]+n|0,r[1]=r[1]+o|0,r[2]=r[2]+i|0,r[3]=r[3]+a|0,r[4]=r[4]+f|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,n=8*t.sigBytes;return e[n>>>5]|=128<<24-n%32,e[14+(n+64>>>9<<4)]=Math.floor(r/4294967296),e[15+(n+64>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=o.clone.call(this);return t._hash=this._hash.clone(),t}}),e.SHA1=o._createHelper(a),e.HmacSHA1=o._createHmacHelper(a),t.SHA1},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],28:[function(t,e,r){var n,o;n=this,o=function(t){return function(e){var r=t,n=r.lib,o=n.WordArray,i=n.Hasher,s=r.algo,a=[],f=[];!function(){function t(t){for(var r=e.sqrt(t),n=2;n<=r;n++)if(!(t%n))return!1;return!0}function r(t){return 4294967296*(t-(0|t))|0}for(var n=2,o=0;o<64;)t(n)&&(o<8&&(a[o]=r(e.pow(n,.5))),f[o]=r(e.pow(n,1/3)),o++),n++}();var u=[],c=s.SHA256=i.extend({_doReset:function(){this._hash=new o.init(a.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,n=r[0],o=r[1],i=r[2],s=r[3],a=r[4],c=r[5],h=r[6],p=r[7],l=0;l<64;l++){if(l<16)u[l]=0|t[e+l];else{var y=u[l-15],g=(y<<25|y>>>7)^(y<<14|y>>>18)^y>>>3,d=u[l-2],v=(d<<15|d>>>17)^(d<<13|d>>>19)^d>>>10;u[l]=g+u[l-7]+v+u[l-16]}var w=n&o^n&i^o&i,b=(n<<30|n>>>2)^(n<<19|n>>>13)^(n<<10|n>>>22),m=p+((a<<26|a>>>6)^(a<<21|a>>>11)^(a<<7|a>>>25))+(a&c^~a&h)+f[l]+u[l];p=h,h=c,c=a,a=s+m|0,s=i,i=o,o=n,n=m+(b+w)|0}r[0]=r[0]+n|0,r[1]=r[1]+o|0,r[2]=r[2]+i|0,r[3]=r[3]+s|0,r[4]=r[4]+a|0,r[5]=r[5]+c|0,r[6]=r[6]+h|0,r[7]=r[7]+p|0},_doFinalize:function(){var t=this._data,r=t.words,n=8*this._nDataBytes,o=8*t.sigBytes;return r[o>>>5]|=128<<24-o%32,r[14+(o+64>>>9<<4)]=e.floor(n/4294967296),r[15+(o+64>>>9<<4)]=n,t.sigBytes=4*r.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});r.SHA256=i._createHelper(c),r.HmacSHA256=i._createHmacHelper(c)}(Math),t.SHA256},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],29:[function(t,e,r){t=function(t,e,r,n){function o(n){if(!r[n]){if(!e[n]){if(t)return t(n);throw new Error("Cannot find module '"+n+"'")}var i=r[n]={exports:{}};e[n][0]((function(t){var r=e[n][1][t];return o(r||t)}),i,i.exports)}return r[n].exports}for(var i=0;i=0;n--)if(o[n]!=a[n])return!1;for(n=o.length-1;n>=0;n--)if(!p(t[r=o[n]],e[r]))return!1;return!0}(t,e)}function l(t){return null==t}function y(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function g(t,e){return!(!t||!e)&&(e instanceof RegExp?e.test(t):t instanceof e||!0===e.call({},t))}function d(t,e,r,n){var o;"string"==typeof r&&(n=r,r=null);try{e()}catch(t){o=t}if(n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),t&&!o&&c("Missing expected exception"+n),!t&&g(o,r)&&c("Got unwanted exception"+n),t&&o&&r&&!g(o,r)||!t&&o)throw o}a.AssertionError=function(t){this.name="AssertionError",this.message=t.message,this.actual=t.actual,this.expected=t.expected,this.operator=t.operator;var e=t.stackStartFunction||c;Error.captureStackTrace&&Error.captureStackTrace(this,e)},n.inherits(a.AssertionError,Error),a.AssertionError.prototype.toString=function(){return this.message?[this.name+":",this.message].join(" "):[this.name+":",u(JSON.stringify(this.actual,f),128),this.operator,u(JSON.stringify(this.expected,f),128)].join(" ")},a.AssertionError.__proto__=Error.prototype,a.fail=c,a.ok=h,a.equal=function(t,e,r){t!=e&&c(t,e,r,"==",a.equal)},a.notEqual=function(t,e,r){t==e&&c(t,e,r,"!=",a.notEqual)},a.deepEqual=function(t,e,r){p(t,e)||c(t,e,r,"deepEqual",a.deepEqual)},a.notDeepEqual=function(t,e,r){p(t,e)&&c(t,e,r,"notDeepEqual",a.notDeepEqual)},a.strictEqual=function(t,e,r){t!==e&&c(t,e,r,"===",a.strictEqual)},a.notStrictEqual=function(t,e,r){t===e&&c(t,e,r,"!==",a.notStrictEqual)},a.throws=function(t,e,r){d.apply(this,[!0].concat(i.call(arguments)))},a.doesNotThrow=function(t,e,r){d.apply(this,[!1].concat(i.call(arguments)))},a.ifError=function(t){if(t)throw t}},{util:2,buffer:3}],2:[function(t,e,r){t("events");function n(t){return t instanceof Array||Array.isArray(t)||t&&t!==Object.prototype&&n(t.__proto__)}function o(t){return t instanceof RegExp||"object"==typeof t&&"[object RegExp]"===Object.prototype.toString.call(t)}function i(t){if(t instanceof Date)return!0;if("object"!=typeof t)return!1;var e=Date.prototype&&a(Date.prototype),r=t.__proto__&&a(t.__proto__);return JSON.stringify(r)===JSON.stringify(e)}r.isArray=n,r.isDate=function(t){return"[object Date]"===Object.prototype.toString.call(t)},r.isRegExp=function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},r.print=function(){},r.puts=function(){},r.debug=function(){},r.inspect=function(t,e,f,u){var c=[],h=function(t,e){var r={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},n={special:"cyan",number:"blue",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"}[e];return n?"["+r[n][0]+"m"+t+"["+r[n][1]+"m":t};return u||(h=function(t,e){return t}),function t(f,u){if(f&&"function"==typeof f.inspect&&f!==r&&(!f.constructor||f.constructor.prototype!==f))return f.inspect(u);switch(typeof f){case"undefined":return h("undefined","undefined");case"string":var p="'"+JSON.stringify(f).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return h(p,"string");case"number":return h(""+f,"number");case"boolean":return h(""+f,"boolean")}if(null===f)return h("null","null");var l,y,g,d=s(f),v=e?a(f):d;if("function"==typeof f&&0===v.length){if(o(f))return h(""+f,"regexp");var w=f.name?": "+f.name:"";return h("[Function"+w+"]","special")}if(i(f)&&0===v.length)return h(f.toUTCString(),"date");if(n(f)?(y="Array",g=["[","]"]):(y="Object",g=["{","}"]),"function"==typeof f){var b=f.name?": "+f.name:"";l=o(f)?" "+f:" [Function"+b+"]"}else l="";if(i(f)&&(l=" "+f.toUTCString()),0===v.length)return g[0]+l+g[1];if(u<0)return o(f)?h(""+f,"regexp"):h("[Object]","special");c.push(f);var m=v.map((function(e){var r,o;if(f.__lookupGetter__&&(f.__lookupGetter__(e)?o=f.__lookupSetter__(e)?h("[Getter/Setter]","special"):h("[Getter]","special"):f.__lookupSetter__(e)&&(o=h("[Setter]","special"))),d.indexOf(e)<0&&(r="["+e+"]"),o||(c.indexOf(f[e])<0?(o=null===u?t(f[e]):t(f[e],u-1)).indexOf("\n")>-1&&(o=n(f)?o.split("\n").map((function(t){return" "+t})).join("\n").substr(2):"\n"+o.split("\n").map((function(t){return" "+t})).join("\n")):o=h("[Circular]","special")),void 0===r){if("Array"===y&&e.match(/^\d+$/))return o;(r=JSON.stringify(""+e)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(r=r.substr(1,r.length-2),r=h(r,"name")):(r=r.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),r=h(r,"string"))}return r+": "+o}));c.pop();var E=m.reduce((function(t,e){return e.indexOf("\n")>=0&&0,t+e.length+1}),0);return m=E>50?g[0]+(""===l?"":l+"\n ")+" "+m.join(",\n ")+" "+g[1]:g[0]+l+" "+m.join(", ")+" "+g[1]}(t,void 0===f?2:f)};r.log=function(t){},r.pump=null;var s=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e},a=Object.getOwnPropertyNames||function(t){var e=[];for(var r in t)Object.hasOwnProperty.call(t,r)&&e.push(r);return e},f=Object.create||function(t,e){var r;if(null===t)r={__proto__:null};else{if("object"!=typeof t)throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var n=function(){};n.prototype=t,(r=new n).__proto__=t}return void 0!==e&&Object.defineProperties&&Object.defineProperties(r,e),r};r.inherits=function(t,e){t.super_=e,t.prototype=f(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})};var u=/%[sdj%]/g;r.format=function(t){if("string"!=typeof t){for(var e=[],n=0;n=i)return t;switch(t){case"%s":return String(o[n++]);case"%d":return Number(o[n++]);case"%j":return JSON.stringify(o[n++]);default:return t}})),a=o[n];n>1,c=-7,h=r?0:o-1,p=r?1:-1,l=t[e+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[e+h],h+=p,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=n;c>0;s=256*s+t[e+h],h+=p,c-=8);if(0===i)i=1-u;else{if(i===f)return s?NaN:1/0*(l?-1:1);s+=Math.pow(2,n),i-=u}return(l?-1:1)*s*Math.pow(2,i-n)},r.writeIEEE754=function(t,e,r,n,o,i){var s,a,f,u=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?i-1:0,y=n?-1:1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(f=Math.pow(2,-s))<1&&(s--,f*=2),(e+=s+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(s++,f/=2),s+h>=c?(a=0,s=c):s+h>=1?(a=(e*f-1)*Math.pow(2,o),s+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,o),s=0));o>=8;t[r+l]=255&a,l+=y,a/=256,o-=8);for(s=s<0;t[r+l]=255&s,l+=y,s/=256,u-=8);t[r+l-y]|=128*g}},{}],6:[function(t,e,r){var n=e.exports={};n.nextTick=function(){var t="undefined"!=typeof window&&window.setImmediate,e="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(t)return function(t){return window.setImmediate(t)};if(e){var r=[];return window.addEventListener("message",(function(t){t.source===window&&"process-tick"===t.data&&(t.stopPropagation(),r.length>0&&r.shift()())}),!0),function(t){r.push(t),window.postMessage("process-tick","*")}}return function(t){setTimeout(t,0)}}(),n.title="browser",n.browser=!0,n.env={},n.argv=[],n.binding=function(t){throw new Error("process.binding is not supported")},n.cwd=function(){return"/"},n.chdir=function(t){throw new Error("process.chdir is not supported")}},{}],4:[function(t,e,r){!function(t){t.EventEmitter||(t.EventEmitter=function(){});var e=r.EventEmitter=t.EventEmitter,n="function"==typeof Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};e.prototype.setMaxListeners=function(t){this._events||(this._events={}),this._events.maxListeners=t},e.prototype.emit=function(t){if("error"===t&&(!this._events||!this._events.error||n(this._events.error)&&!this._events.error.length))throw arguments[1]instanceof Error?arguments[1]:new Error("Uncaught, unspecified 'error' event.");if(!this._events)return!1;var e=this._events[t];if(!e)return!1;if("function"==typeof e){switch(arguments.length){case 1:e.call(this);break;case 2:e.call(this,arguments[1]);break;case 3:e.call(this,arguments[1],arguments[2]);break;default:var r=Array.prototype.slice.call(arguments,1);e.apply(this,r)}return!0}if(n(e)){r=Array.prototype.slice.call(arguments,1);for(var o=e.slice(),i=0,s=o.length;i0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),console.trace());this._events[t].push(e)}else this._events[t]=[this._events[t],e];else this._events[t]=e;return this},e.prototype.on=e.prototype.addListener,e.prototype.once=function(t,e){var r=this;return r.on(t,(function n(){r.removeListener(t,n),e.apply(this,arguments)})),this},e.prototype.removeListener=function(t,e){if("function"!=typeof e)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[t])return this;var r=this._events[t];if(n(r)){var o=function(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0;r=e.length||o>=t.length);)e[o+r]=t[o],o++;return o}function c(t){try{return decodeURIComponent(t)}catch(t){return String.fromCharCode(65533)}}function h(t){return(t=~~Math.ceil(+t))<0?0:t}function p(t,e,r){if(!(this instanceof p))return new p(t,e,r);var i;if("number"==typeof r)this.length=h(e),this.parent=t,this.offset=r;else{switch(i=typeof t){case"number":this.length=h(t);break;case"string":this.length=p.byteLength(t,e);break;case"object":this.length=h(t.length);break;default:throw new Error("First argument needs to be a number, array or string.")}if(this.length>p.poolSize?(this.parent=new n(this.length),this.offset=0):((!o||o.length-o.used=t.length?0:(r?(o=t.parent[t.offset+e]<<8,e+1=t.length?0:(r?(e+1>>0):(e+2>>0)),o)}function g(t,e,r,n){var o;return n||(i.ok("boolean"==typeof r,"missing or invalid endian"),i.ok(null!=e,"missing offset"),i.ok(e+1=0,"specified a negative value for writing an unsigned value"),i.ok(t<=e,"value is larger than maximum value for type"),i.ok(Math.floor(t)===t,"value has a fractional component")}function m(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+1>>8*(n?1-s:s)}function E(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+3>>8*(n?3-s:s)&255}function _(t,e,r){i.ok("number"==typeof t,"cannot write a non-number as a number"),i.ok(t<=e,"value larger than maximum allowed value"),i.ok(t>=r,"value smaller than minimum allowed value"),i.ok(Math.floor(t)===t,"value has a fractional component")}function k(t,e,r){i.ok("number"==typeof t,"cannot write a non-number as a number"),i.ok(t<=e,"value larger than maximum allowed value"),i.ok(t>=r,"value smaller than minimum allowed value")}function x(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+1=0?e:65535+e+1,r,n,o)}function S(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+3=0?e:4294967295+e+1,r,n,o)}function B(e,r,n,o,s){s||(i.ok(null!=r,"missing value"),i.ok("boolean"==typeof o,"missing or invalid endian"),i.ok(null!=n,"missing offset"),i.ok(n+3"},n.prototype.hexSlice=function(t,e){var r=this.length;(!t||t<0)&&(t=0),(!e||e<0||e>r)&&(e=r);for(var n="",o=t;oo&&(r=o):r=o;var i=t.length;if(i%2)throw new Error("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;si&&(r=i):r=i,n=String(n||"utf8").toLowerCase()){case"hex":return this.hexWrite(t,e,r);case"utf8":case"utf-8":return this.utf8Write(t,e,r);case"ascii":return this.asciiWrite(t,e,r);case"binary":return this.binaryWrite(t,e,r);case"base64":return this.base64Write(t,e,r);case"ucs2":case"ucs-2":return this.ucs2Write(t,e,r);default:throw new Error("Unknown encoding")}},n.prototype.slice=function(t,e){if(void 0===e&&(e=this.length),e>this.length)throw new Error("oob");if(t>e)throw new Error("oob");return new p(this,e-t,+t)},n.prototype.copy=function(t,e,r,n){for(var o=[],s=r;sthis.length)throw new Error("oob");if(e>r)throw new Error("oob");for(var n=e;n"},p.prototype.get=function(t){if(t<0||t>=this.length)throw new Error("oob");return this.parent[this.offset+t]},p.prototype.set=function(t,e){if(t<0||t>=this.length)throw new Error("oob");return this.parent[this.offset+t]=e},p.prototype.write=function(t,e,r,o){if(isFinite(e))isFinite(r)||(o=r,r=void 0);else{var i=o;o=e,e=r,r=i}e=+e||0;var s,a=this.length-e;switch(r?(r=+r)>a&&(r=a):r=a,o=String(o||"utf8").toLowerCase()){case"hex":s=this.parent.hexWrite(t,this.offset+e,r);break;case"utf8":case"utf-8":s=this.parent.utf8Write(t,this.offset+e,r);break;case"ascii":s=this.parent.asciiWrite(t,this.offset+e,r);break;case"binary":s=this.parent.binaryWrite(t,this.offset+e,r);break;case"base64":s=this.parent.base64Write(t,this.offset+e,r);break;case"ucs2":case"ucs-2":s=this.parent.ucs2Write(t,this.offset+e,r);break;default:throw new Error("Unknown encoding")}return p._charsWritten=n._charsWritten,s},p.prototype.toString=function(t,e,r){switch(t=String(t||"utf8").toLowerCase(),void 0===e||e<0?e=0:e>this.length&&(e=this.length),void 0===r||r>this.length?r=this.length:r<0&&(r=0),e+=this.offset,r+=this.offset,t){case"hex":return this.parent.hexSlice(e,r);case"utf8":case"utf-8":return this.parent.utf8Slice(e,r);case"ascii":return this.parent.asciiSlice(e,r);case"binary":return this.parent.binarySlice(e,r);case"base64":return this.parent.base64Slice(e,r);case"ucs2":case"ucs-2":return this.parent.ucs2Slice(e,r);default:throw new Error("Unknown encoding")}},p.byteLength=n.byteLength,p.prototype.fill=function(t,e,r){if(t||(t=0),e||(e=0),r||(r=this.length),"string"==typeof t&&(t=t.charCodeAt(0)),"number"!=typeof t||isNaN(t))throw new Error("value is not a number");if(r=this.length)throw new Error("start out of bounds");if(r<0||r>this.length)throw new Error("end out of bounds");return this.parent.fill(t,e+this.offset,r+this.offset)},p.prototype.copy=function(t,e,r,n){var o=this;if(r||(r=0),n||(n=this.length),e||(e=0),n=t.length)throw new Error("targetStart out of bounds");if(r<0||r>=o.length)throw new Error("sourceStart out of bounds");if(n<0||n>o.length)throw new Error("sourceEnd out of bounds");return n>this.length&&(n=this.length),t.length-ethis.length)throw new Error("oob");if(t>e)throw new Error("oob");return new p(this.parent,e-t,+t+this.offset)},p.prototype.utf8Slice=function(t,e){return this.toString("utf8",t,e)},p.prototype.binarySlice=function(t,e){return this.toString("binary",t,e)},p.prototype.asciiSlice=function(t,e){return this.toString("ascii",t,e)},p.prototype.utf8Write=function(t,e){return this.write(t,e,"utf8")},p.prototype.binaryWrite=function(t,e){return this.write(t,e,"binary")},p.prototype.asciiWrite=function(t,e){return this.write(t,e,"ascii")},p.prototype.readUInt8=function(t,e){var r=this;if(e||(i.ok(null!=t,"missing offset"),i.ok(t=r.length))return r.parent[r.offset+t]},p.prototype.readUInt16LE=function(t,e){return l(this,t,!1,e)},p.prototype.readUInt16BE=function(t,e){return l(this,t,!0,e)},p.prototype.readUInt32LE=function(t,e){return y(this,t,!1,e)},p.prototype.readUInt32BE=function(t,e){return y(this,t,!0,e)},p.prototype.readInt8=function(t,e){var r=this;if(e||(i.ok(null!=t,"missing offset"),i.ok(t=r.length))return 128&r.parent[r.offset+t]?-1*(255-r.parent[r.offset+t]+1):r.parent[r.offset+t]},p.prototype.readInt16LE=function(t,e){return g(this,t,!1,e)},p.prototype.readInt16BE=function(t,e){return g(this,t,!0,e)},p.prototype.readInt32LE=function(t,e){return d(this,t,!1,e)},p.prototype.readInt32BE=function(t,e){return d(this,t,!0,e)},p.prototype.readFloatLE=function(t,e){return v(this,t,!1,e)},p.prototype.readFloatBE=function(t,e){return v(this,t,!0,e)},p.prototype.readDoubleLE=function(t,e){return w(this,t,!1,e)},p.prototype.readDoubleBE=function(t,e){return w(this,t,!0,e)},p.prototype.writeUInt8=function(t,e,r){var n=this;r||(i.ok(null!=t,"missing value"),i.ok(null!=e,"missing offset"),i.ok(e=0?n.writeUInt8(t,e,r):n.writeUInt8(255+t+1,e,r)},p.prototype.writeInt16LE=function(t,e,r){x(this,t,e,!1,r)},p.prototype.writeInt16BE=function(t,e,r){x(this,t,e,!0,r)},p.prototype.writeInt32LE=function(t,e,r){S(this,t,e,!1,r)},p.prototype.writeInt32BE=function(t,e,r){S(this,t,e,!0,r)},p.prototype.writeFloatLE=function(t,e,r){B(this,t,e,!1,r)},p.prototype.writeFloatBE=function(t,e,r){B(this,t,e,!0,r)},p.prototype.writeDoubleLE=function(t,e,r){I(this,t,e,!1,r)},p.prototype.writeDoubleBE=function(t,e,r){I(this,t,e,!0,r)},n.prototype.readUInt8=p.prototype.readUInt8,n.prototype.readUInt16LE=p.prototype.readUInt16LE,n.prototype.readUInt16BE=p.prototype.readUInt16BE,n.prototype.readUInt32LE=p.prototype.readUInt32LE,n.prototype.readUInt32BE=p.prototype.readUInt32BE,n.prototype.readInt8=p.prototype.readInt8,n.prototype.readInt16LE=p.prototype.readInt16LE,n.prototype.readInt16BE=p.prototype.readInt16BE,n.prototype.readInt32LE=p.prototype.readInt32LE,n.prototype.readInt32BE=p.prototype.readInt32BE,n.prototype.readFloatLE=p.prototype.readFloatLE,n.prototype.readFloatBE=p.prototype.readFloatBE,n.prototype.readDoubleLE=p.prototype.readDoubleLE,n.prototype.readDoubleBE=p.prototype.readDoubleBE,n.prototype.writeUInt8=p.prototype.writeUInt8,n.prototype.writeUInt16LE=p.prototype.writeUInt16LE,n.prototype.writeUInt16BE=p.prototype.writeUInt16BE,n.prototype.writeUInt32LE=p.prototype.writeUInt32LE,n.prototype.writeUInt32BE=p.prototype.writeUInt32BE,n.prototype.writeInt8=p.prototype.writeInt8,n.prototype.writeInt16LE=p.prototype.writeInt16LE,n.prototype.writeInt16BE=p.prototype.writeInt16BE,n.prototype.writeInt32LE=p.prototype.writeInt32LE,n.prototype.writeInt32BE=p.prototype.writeInt32BE,n.prototype.writeFloatLE=p.prototype.writeFloatLE,n.prototype.writeFloatBE=p.prototype.writeFloatBE,n.prototype.writeDoubleLE=p.prototype.writeDoubleLE,n.prototype.writeDoubleBE=p.prototype.writeDoubleBE},{assert:1,"./buffer_ieee754":5,"base64-js":7}],7:[function(t,e,r){!function(){"use strict";var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";e.exports.toByteArray=function(e){var r,n,o,i,s,a;if(e.length%4>0)throw"Invalid string. Length must be a multiple of 4";for(a=[],o=(s=(s=e.indexOf("="))>0?e.length-s:0)>0?e.length-4:e.length,r=0,n=0;r>16),a.push((65280&i)>>8),a.push(255&i);return 2===s?(i=t.indexOf(e[r])<<2|t.indexOf(e[r+1])>>4,a.push(255&i)):1===s&&(i=t.indexOf(e[r])<<10|t.indexOf(e[r+1])<<4|t.indexOf(e[r+2])>>2,a.push(i>>8&255),a.push(255&i)),a},e.exports.fromByteArray=function(e){var r,n,o,i,s=e.length%3,a="";for(r=0,o=e.length-s;r>18&63]+t[i>>12&63]+t[i>>6&63]+t[63&i];switch(s){case 1:n=e[e.length-1],a+=t[n>>2],a+=t[n<<4&63],a+="==";break;case 2:n=(e[e.length-2]<<8)+e[e.length-1],a+=t[n>>10],a+=t[n>>4&63],a+=t[n<<2&63],a+="="}return a}}()},{}],8:[function(t,e,r){r.readIEEE754=function(t,e,r,n,o){var i,s,a=8*o-n-1,f=(1<>1,c=-7,h=r?0:o-1,p=r?1:-1,l=t[e+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[e+h],h+=p,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=n;c>0;s=256*s+t[e+h],h+=p,c-=8);if(0===i)i=1-u;else{if(i===f)return s?NaN:1/0*(l?-1:1);s+=Math.pow(2,n),i-=u}return(l?-1:1)*s*Math.pow(2,i-n)},r.writeIEEE754=function(t,e,r,n,o,i){var s,a,f,u=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?i-1:0,y=n?-1:1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(f=Math.pow(2,-s))<1&&(s--,f*=2),(e+=s+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(s++,f/=2),s+h>=c?(a=0,s=c):s+h>=1?(a=(e*f-1)*Math.pow(2,o),s+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,o),s=0));o>=8;t[r+l]=255&a,l+=y,a/=256,o-=8);for(s=s<0;t[r+l]=255&s,l+=y,s/=256,u-=8);t[r+l-y]|=128*g}},{}],3:[function(t,e,r){function n(t){this.length=t}var o,i=t("assert");function s(t){return t<16?"0"+t.toString(16):t.toString(16)}function a(t){for(var e=[],r=0;r=e.length||o>=t.length);)e[o+r]=t[o],o++;return o}function c(t){try{return decodeURIComponent(t)}catch(t){return String.fromCharCode(65533)}}function h(t){return(t=~~Math.ceil(+t))<0?0:t}function p(t,e,r){if(!(this instanceof p))return new p(t,e,r);var i;if("number"==typeof r)this.length=h(e),this.parent=t,this.offset=r;else{switch(i=typeof t){case"number":this.length=h(t);break;case"string":this.length=p.byteLength(t,e);break;case"object":this.length=h(t.length);break;default:throw new Error("First argument needs to be a number, array or string.")}if(this.length>p.poolSize?(this.parent=new n(this.length),this.offset=0):((!o||o.length-o.used>>0):(o=t.parent[t.offset+e+2]<<16,o|=t.parent[t.offset+e+1]<<8,o|=t.parent[t.offset+e],o+=t.parent[t.offset+e+3]<<24>>>0),o}function g(t,e,r,n){var o;return n||(i.ok("boolean"==typeof r,"missing or invalid endian"),i.ok(null!=e,"missing offset"),i.ok(e+1=0,"specified a negative value for writing an unsigned value"),i.ok(t<=e,"value is larger than maximum value for type"),i.ok(Math.floor(t)===t,"value has a fractional component")}function m(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+1>>8,t.parent[t.offset+r+1]=255&e):(t.parent[t.offset+r+1]=(65280&e)>>>8,t.parent[t.offset+r]=255&e)}function E(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+3>>24&255,t.parent[t.offset+r+1]=e>>>16&255,t.parent[t.offset+r+2]=e>>>8&255,t.parent[t.offset+r+3]=255&e):(t.parent[t.offset+r+3]=e>>>24&255,t.parent[t.offset+r+2]=e>>>16&255,t.parent[t.offset+r+1]=e>>>8&255,t.parent[t.offset+r]=255&e)}function _(t,e,r){i.ok("number"==typeof t,"cannot write a non-number as a number"),i.ok(t<=e,"value larger than maximum allowed value"),i.ok(t>=r,"value smaller than minimum allowed value"),i.ok(Math.floor(t)===t,"value has a fractional component")}function k(t,e,r){i.ok("number"==typeof t,"cannot write a non-number as a number"),i.ok(t<=e,"value larger than maximum allowed value"),i.ok(t>=r,"value smaller than minimum allowed value")}function x(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+1=0?e:65535+e+1,r,n,o)}function S(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+3=0?e:4294967295+e+1,r,n,o)}function B(e,r,n,o,s){s||(i.ok(null!=r,"missing value"),i.ok("boolean"==typeof o,"missing or invalid endian"),i.ok(null!=n,"missing offset"),i.ok(n+3"},n.prototype.hexSlice=function(t,e){var r=this.length;(!t||t<0)&&(t=0),(!e||e<0||e>r)&&(e=r);for(var n="",o=t;oo&&(r=o):r=o;var i=t.length;if(i%2)throw new Error("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;si&&(r=i):r=i,n=String(n||"utf8").toLowerCase()){case"hex":return this.hexWrite(t,e,r);case"utf8":case"utf-8":return this.utf8Write(t,e,r);case"ascii":return this.asciiWrite(t,e,r);case"binary":return this.binaryWrite(t,e,r);case"base64":return this.base64Write(t,e,r);case"ucs2":case"ucs-2":return this.ucs2Write(t,e,r);default:throw new Error("Unknown encoding")}},n.prototype.slice=function(t,e){if(void 0===e&&(e=this.length),e>this.length)throw new Error("oob");if(t>e)throw new Error("oob");return new p(this,e-t,+t)},n.prototype.copy=function(t,e,r,n){for(var o=[],s=r;s"},p.prototype.get=function(t){if(t<0||t>=this.length)throw new Error("oob");return this.parent[this.offset+t]},p.prototype.set=function(t,e){if(t<0||t>=this.length)throw new Error("oob");return this.parent[this.offset+t]=e},p.prototype.write=function(t,e,r,o){if(isFinite(e))isFinite(r)||(o=r,r=void 0);else{var i=o;o=e,e=r,r=i}e=+e||0;var s,a=this.length-e;switch(r?(r=+r)>a&&(r=a):r=a,o=String(o||"utf8").toLowerCase()){case"hex":s=this.parent.hexWrite(t,this.offset+e,r);break;case"utf8":case"utf-8":s=this.parent.utf8Write(t,this.offset+e,r);break;case"ascii":s=this.parent.asciiWrite(t,this.offset+e,r);break;case"binary":s=this.parent.binaryWrite(t,this.offset+e,r);break;case"base64":s=this.parent.base64Write(t,this.offset+e,r);break;case"ucs2":case"ucs-2":s=this.parent.ucs2Write(t,this.offset+e,r);break;default:throw new Error("Unknown encoding")}return p._charsWritten=n._charsWritten,s},p.prototype.toString=function(t,e,r){switch(t=String(t||"utf8").toLowerCase(),void 0===e||e<0?e=0:e>this.length&&(e=this.length),void 0===r||r>this.length?r=this.length:r<0&&(r=0),e+=this.offset,r+=this.offset,t){case"hex":return this.parent.hexSlice(e,r);case"utf8":case"utf-8":return this.parent.utf8Slice(e,r);case"ascii":return this.parent.asciiSlice(e,r);case"binary":return this.parent.binarySlice(e,r);case"base64":return this.parent.base64Slice(e,r);case"ucs2":case"ucs-2":return this.parent.ucs2Slice(e,r);default:throw new Error("Unknown encoding")}},p.byteLength=n.byteLength,p.prototype.fill=function(t,e,r){if(t||(t=0),e||(e=0),r||(r=this.length),"string"==typeof t&&(t=t.charCodeAt(0)),"number"!=typeof t||isNaN(t))throw new Error("value is not a number");if(r=this.length)throw new Error("start out of bounds");if(r<0||r>this.length)throw new Error("end out of bounds");return this.parent.fill(t,e+this.offset,r+this.offset)},p.prototype.copy=function(t,e,r,n){var o=this;if(r||(r=0),n||(n=this.length),e||(e=0),n=t.length)throw new Error("targetStart out of bounds");if(r<0||r>=o.length)throw new Error("sourceStart out of bounds");if(n<0||n>o.length)throw new Error("sourceEnd out of bounds");return n>this.length&&(n=this.length),t.length-ethis.length)throw new Error("oob");if(t>e)throw new Error("oob");return new p(this.parent,e-t,+t+this.offset)},p.prototype.utf8Slice=function(t,e){return this.toString("utf8",t,e)},p.prototype.binarySlice=function(t,e){return this.toString("binary",t,e)},p.prototype.asciiSlice=function(t,e){return this.toString("ascii",t,e)},p.prototype.utf8Write=function(t,e){return this.write(t,e,"utf8")},p.prototype.binaryWrite=function(t,e){return this.write(t,e,"binary")},p.prototype.asciiWrite=function(t,e){return this.write(t,e,"ascii")},p.prototype.readUInt8=function(t,e){var r=this;return e||(i.ok(null!=t,"missing offset"),i.ok(t=0?n.writeUInt8(t,e,r):n.writeUInt8(255+t+1,e,r)},p.prototype.writeInt16LE=function(t,e,r){x(this,t,e,!1,r)},p.prototype.writeInt16BE=function(t,e,r){x(this,t,e,!0,r)},p.prototype.writeInt32LE=function(t,e,r){S(this,t,e,!1,r)},p.prototype.writeInt32BE=function(t,e,r){S(this,t,e,!0,r)},p.prototype.writeFloatLE=function(t,e,r){B(this,t,e,!1,r)},p.prototype.writeFloatBE=function(t,e,r){B(this,t,e,!0,r)},p.prototype.writeDoubleLE=function(t,e,r){I(this,t,e,!1,r)},p.prototype.writeDoubleBE=function(t,e,r){I(this,t,e,!0,r)},n.prototype.readUInt8=p.prototype.readUInt8,n.prototype.readUInt16LE=p.prototype.readUInt16LE,n.prototype.readUInt16BE=p.prototype.readUInt16BE,n.prototype.readUInt32LE=p.prototype.readUInt32LE,n.prototype.readUInt32BE=p.prototype.readUInt32BE,n.prototype.readInt8=p.prototype.readInt8,n.prototype.readInt16LE=p.prototype.readInt16LE,n.prototype.readInt16BE=p.prototype.readInt16BE,n.prototype.readInt32LE=p.prototype.readInt32LE,n.prototype.readInt32BE=p.prototype.readInt32BE,n.prototype.readFloatLE=p.prototype.readFloatLE,n.prototype.readFloatBE=p.prototype.readFloatBE,n.prototype.readDoubleLE=p.prototype.readDoubleLE,n.prototype.readDoubleBE=p.prototype.readDoubleBE,n.prototype.writeUInt8=p.prototype.writeUInt8,n.prototype.writeUInt16LE=p.prototype.writeUInt16LE,n.prototype.writeUInt16BE=p.prototype.writeUInt16BE,n.prototype.writeUInt32LE=p.prototype.writeUInt32LE,n.prototype.writeUInt32BE=p.prototype.writeUInt32BE,n.prototype.writeInt8=p.prototype.writeInt8,n.prototype.writeInt16LE=p.prototype.writeInt16LE,n.prototype.writeInt16BE=p.prototype.writeInt16BE,n.prototype.writeInt32LE=p.prototype.writeInt32LE,n.prototype.writeInt32BE=p.prototype.writeInt32BE,n.prototype.writeFloatLE=p.prototype.writeFloatLE,n.prototype.writeFloatBE=p.prototype.writeFloatBE,n.prototype.writeDoubleLE=p.prototype.writeDoubleLE,n.prototype.writeDoubleBE=p.prototype.writeDoubleBE},{assert:1,"./buffer_ieee754":8,"base64-js":9}],9:[function(t,e,r){!function(){"use strict";var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";e.exports.toByteArray=function(e){var r,n,o,i,s,a;if(e.length%4>0)throw"Invalid string. Length must be a multiple of 4";for(a=[],o=(s=(s=e.indexOf("="))>0?e.length-s:0)>0?e.length-4:e.length,r=0,n=0;r>16),a.push((65280&i)>>8),a.push(255&i);return 2===s?(i=t.indexOf(e[r])<<2|t.indexOf(e[r+1])>>4,a.push(255&i)):1===s&&(i=t.indexOf(e[r])<<10|t.indexOf(e[r+1])<<4|t.indexOf(e[r+2])>>2,a.push(i>>8&255),a.push(255&i)),a},e.exports.fromByteArray=function(e){var r,n,o,i,s=e.length%3,a="";for(r=0,o=e.length-s;r>18&63]+t[i>>12&63]+t[i>>6&63]+t[63&i];switch(s){case 1:n=e[e.length-1],a+=t[n>>2],a+=t[n<<4&63],a+="==";break;case 2:n=(e[e.length-2]<<8)+e[e.length-1],a+=t[n>>10],a+=t[n>>4&63],a+=t[n<<2&63],a+="="}return a}}()},{}]},{},[]),e.exports=t("buffer-browserify")},{}],30:[function(t,e,r){var n=e.exports={};n.nextTick=function(){var t="undefined"!=typeof window&&window.setImmediate,e="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(t)return function(t){return window.setImmediate(t)};if(e){var r=[];return window.addEventListener("message",(function(t){var e=t.source;e!==window&&null!==e||"process-tick"!==t.data||(t.stopPropagation(),r.length>0&&r.shift()())}),!0),function(t){r.push(t),window.postMessage("process-tick","*")}}return function(t){setTimeout(t,0)}}(),n.title="browser",n.browser=!0,n.env={},n.argv=[],n.binding=function(t){throw new Error("process.binding is not supported")},n.cwd=function(){return"/"},n.chdir=function(t){throw new Error("process.chdir is not supported")}},{}],31:[function(t,e,r){e.exports=t("./lib/urlsafe-base64")},{"./lib/urlsafe-base64":32}],32:[function(t,e,r){var n=t("__browserify_Buffer").Buffer; - /*! - * urlsafe-base64 - */r.version="1.0.0",r.encode=function(t){return t.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},r.decode=function(t){return t=(t+=Array(5-t.length%4).join("=")).replace(/\-/g,"+").replace(/\_/g,"/"),new n(t,"base64")},r.validate=function(t){return/^[A-Za-z0-9\-_]+$/.test(t)}},{__browserify_Buffer:29}]},{},[1])(1)})); diff --git a/service/dist/scripts/fernetBrowser.min.js.br b/service/dist/scripts/fernetBrowser.min.js.br deleted file mode 100644 index 767946d7ac4ea8e3d52be93ad765f686af6dd95d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17572 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 Ls4lp3wYR str: + return base64.urlsafe_b64encode(data).decode("ascii") + + +def b64d(value: str) -> bytes: + return base64.urlsafe_b64decode(value.encode("ascii")) + + +def canonical_dumps(payload: dict[str, Any]) -> bytes: + return json.dumps(payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + + +def hkdf_sha256(key_material: bytes, info: bytes, length: int, salt: bytes | None = None) -> bytes: + return HKDF( + algorithm=hashes.SHA256(), + length=length, + salt=salt, + info=info, + ).derive(key_material) + + +def hmac_sha256(key: bytes, data: bytes) -> bytes: + return hmac.new(key, data, hashlib.sha256).digest() + + +def _argon2(password: str, salt: bytes) -> bytes: + if pwhash is None: + raise RuntimeError("PyNaCl is required for Argon2id password derivation") + return pwhash.argon2id.kdf( + ARGON2_HASH_BYTES, + password.encode("utf-8"), + salt, + opslimit=ARGON2_OPSLIMIT, + memlimit=ARGON2_MEMLIMIT, + ) + + +def _session_nonce(seq: int) -> bytes: + if seq < 0: + raise AuthenticationError("Sequence number underflow") + return seq.to_bytes(12, "big", signed=False) + + +@dataclass(slots=True) +class PasswordState: + initialized: bool = False + pwd_epoch: int = 0 + pwd_salt: bytes | None = None + pwd_hash: bytes | None = None + + def as_public_dict(self) -> dict[str, Any]: + return { + "initialized": self.initialized, + "pwd_epoch": self.pwd_epoch, + "pwd_salt": b64e(self.pwd_salt) if self.pwd_salt else None, + "argon2": { + "algorithm": "argon2id", + "opslimit": ARGON2_OPSLIMIT, + "memlimit": ARGON2_MEMLIMIT, + "salt_bytes": ARGON2_SALT_BYTES, + "hash_bytes": ARGON2_HASH_BYTES, + }, + } + + +@dataclass(slots=True) +class ActiveSession: + session_id: str + created_at: float + expires_at: float + pwd_epoch: int + master_secret: bytes + resume_secret: bytes + control_queues: set[asyncio.Queue] = field(default_factory=set) + + +@dataclass(slots=True) +class HandshakeContext: + kind: str + channel: str + client_nonce: bytes + server_nonce: bytes + client_public_key: bytes + server_private_key: X25519PrivateKey + server_public_key: bytes + transcript: bytes + transcript_hash: bytes + shared_key: bytes + preauth_server_tx: bytes + preauth_server_rx: bytes + + +class JsonChaChaChannel: + """Small framed JSON channel using direction-bound ChaCha20-Poly1305 keys.""" + + def __init__(self, *, tx_key: bytes, rx_key: bytes) -> None: + self._tx = ChaCha20Poly1305(tx_key) + self._rx = ChaCha20Poly1305(rx_key) + self._tx_seq = 0 + self._rx_seq = 0 + + def encrypt(self, payload: dict[str, Any]) -> dict[str, Any]: + seq = self._tx_seq + self._tx_seq += 1 + nonce = _session_nonce(seq) + aad = canonical_dumps({"seq": seq, "type": "secure"}) + plaintext = canonical_dumps(payload) + ciphertext = self._tx.encrypt(nonce, plaintext, aad) + return { + "type": "secure", + "seq": seq, + "ciphertext": b64e(ciphertext), + } + + def decrypt(self, message: dict[str, Any]) -> dict[str, Any]: + if message.get("type") != "secure": + raise AuthenticationError("Encrypted control frame expected") + seq = int(message["seq"]) + if seq != self._rx_seq: + raise AuthenticationError("Control frame sequence mismatch") + self._rx_seq += 1 + nonce = _session_nonce(seq) + aad = canonical_dumps({"seq": seq, "type": "secure"}) + plaintext = self._rx.decrypt(nonce, b64d(message["ciphertext"]), aad) + return json.loads(plaintext.decode("utf-8")) + + def set_rx_seq(self, seq: int) -> None: + self._rx_seq = seq + + +class SecretStreamBox: + """Directional XChaCha20 secretstream state with context-bound AAD.""" + def __init__(self, *, tx_key: bytes, rx_key: bytes, aad_prefix: bytes) -> None: + if sodium_bindings is None: + raise RuntimeError("PyNaCl is required for secretstream websocket transport") + self._aad_prefix = aad_prefix + self._tx_seq = 0 + self._rx_seq = 0 + self._tx_state = sodium_bindings.crypto_secretstream_xchacha20poly1305_state() + self._rx_state = sodium_bindings.crypto_secretstream_xchacha20poly1305_state() + self.tx_header = sodium_bindings.crypto_secretstream_xchacha20poly1305_init_push(self._tx_state, tx_key) + self._rx_key = rx_key -@dataclass -class HandshakeChallenge: - challenge: str - algorithm: str = "HMAC-SHA256" + def init_pull(self, header: bytes) -> None: + sodium_bindings.crypto_secretstream_xchacha20poly1305_init_pull(self._rx_state, header, self._rx_key) -@dataclass -class HandshakeResponse: - response: str + def encrypt(self, payload: bytes, *, final: bool = False) -> bytes: + tag = ( + sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_FINAL + if final + else sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE + ) + aad = self._aad(self._tx_seq) + self._tx_seq += 1 + return sodium_bindings.crypto_secretstream_xchacha20poly1305_push(self._tx_state, payload, aad, tag) -class HandshakeSession: - """One-time handshake helper coordinating challenge/response.""" + def decrypt(self, ciphertext: bytes) -> bytes: + aad = self._aad(self._rx_seq) + self._rx_seq += 1 + plaintext, tag = sodium_bindings.crypto_secretstream_xchacha20poly1305_pull(self._rx_state, ciphertext, aad) + if tag not in ( + sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE, + sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_FINAL, + ): + raise AuthenticationError("Unexpected stream tag received") + return plaintext - def __init__(self, shared_secret: str) -> None: - if not shared_secret: - raise AuthenticationError("Shared secret is not configured") - self._shared_secret = shared_secret.encode("utf-8") - self._challenge_bytes: Union[bytes, None] = None + def _aad(self, seq: int) -> bytes: + return self._aad_prefix + seq.to_bytes(8, "big", signed=False) - def issue_challenge(self) -> HandshakeChallenge: - self._challenge_bytes = secrets.token_bytes(32) - challenge = base64.urlsafe_b64encode(self._challenge_bytes).decode("ascii") - return HandshakeChallenge(challenge=challenge) - def verify(self, response: str) -> None: - if self._challenge_bytes is None: - raise AuthenticationError("Handshake challenge was not issued") - expected = hmac.new(self._shared_secret, self._challenge_bytes, hashlib.sha256).hexdigest() - if not hmac.compare_digest(expected, response): - raise AuthenticationError("Invalid handshake response") +class ServiceAuthManager: + """Persists the system password verifier and manages authenticated sessions.""" - def build_cipher(self) -> "CipherBox": - return CipherBox(self._shared_secret.decode("utf-8")) + def __init__(self, project_root: Path) -> None: + self._config_dir = project_root / "config" + self._config_dir.mkdir(exist_ok=True) + self._state_file = self._config_dir / "service_auth.json" + self._ticket_file = self._config_dir / "service_ticket.key" + self._signing_file = self._config_dir / "service_signing_key.bin" + self._lock = threading.RLock() + self._sessions: dict[str, ActiveSession] = {} + self._password_state = self._load_password_state() + self._signing_key = self._load_signing_key() + self._verify_default_public_key() + self._ticket_key = self._load_or_create_key( + self._ticket_file, + env_name="BAAS_SERVICE_TICKET_KEY_B64", + default_factory=lambda: secrets.token_bytes(32), + ) -class CipherBox: - """Symmetric encryption box backed by Fernet.""" + @property + def password_state(self) -> PasswordState: + return self._password_state - def __init__(self, shared_secret: str) -> None: - digest = hashlib.sha256(shared_secret.encode("utf-8")).digest() - key = base64.urlsafe_b64encode(digest) - self._fernet = Fernet(key) + def server_public_key_b64(self) -> str: + public_key = self._signing_key.public_key().public_bytes( + serialization.Encoding.Raw, + serialization.PublicFormat.Raw, + ) + return b64e(public_key) - def encrypt_json(self, payload: dict[str, Any]) -> str: - data = json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") - return self._fernet.encrypt(data).decode("utf-8") + def issue_server_hello(self, hello: dict[str, Any], *, kind: str, channel: str) -> tuple[HandshakeContext, dict[str, Any]]: + if hello.get("type") != "client_hello": + raise AuthenticationError("Expected client_hello") + if int(hello.get("version", 0)) != PROTOCOL_VERSION: + raise AuthenticationError("Unsupported protocol version") - def decrypt_json(self, token: str) -> dict[str, Any]: try: - data = self._fernet.decrypt(token.encode("utf-8")) - except InvalidToken as exc: - raise AuthenticationError("Encrypted payload could not be authenticated") from exc - return json.loads(data.decode("utf-8")) - - def encrypt_bytes(self, data: bytes) -> str: - """ - Encrypt raw bytes -> bytes (Fernet token, already base64-encoded internally). - """ - return self._fernet.encrypt(data).decode("utf-8") + client_nonce = b64d(hello["client_nonce"]) + client_public_bytes = b64d(hello["client_kx_pub"]) + except Exception as exc: # noqa: BLE001 - normalized below + raise AuthenticationError("Malformed client hello") from exc + + server_private = X25519PrivateKey.generate() + server_public_bytes = server_private.public_key().public_bytes( + serialization.Encoding.Raw, + serialization.PublicFormat.Raw, + ) + public_state = self._password_state.as_public_dict() + hello_core = { + "type": "server_hello", + "kind": kind, + "channel": channel, + "version": PROTOCOL_VERSION, + "server_nonce": b64e(secrets.token_bytes(32)), + "server_kx_pub": b64e(server_public_bytes), + **public_state, + } + transcript = canonical_dumps( + { + "kind": kind, + "channel": channel, + "client": hello, + "server": hello_core, + } + ) + signature = self._signing_key.sign(transcript) + response = { + **hello_core, + "signature": b64e(signature), + "server_sign_pub": self.server_public_key_b64(), + } + client_public = X25519PublicKey.from_public_bytes(client_public_bytes) + shared = server_private.exchange(client_public) + transcript_hash = hashlib.sha256(transcript).digest() + preauth_server_tx = hkdf_sha256(shared, b"preauth:server-tx", 32, transcript_hash) + preauth_server_rx = hkdf_sha256(shared, b"preauth:server-rx", 32, transcript_hash) + context = HandshakeContext( + kind=kind, + channel=channel, + client_nonce=client_nonce, + server_nonce=b64d(hello_core["server_nonce"]), + client_public_key=client_public_bytes, + server_private_key=server_private, + server_public_key=server_public_bytes, + transcript=transcript, + transcript_hash=transcript_hash, + shared_key=shared, + preauth_server_tx=preauth_server_tx, + preauth_server_rx=preauth_server_rx, + ) + return context, response + + def build_preauth_channel(self, handshake: HandshakeContext) -> JsonChaChaChannel: + return JsonChaChaChannel( + tx_key=handshake.preauth_server_tx, + rx_key=handshake.preauth_server_rx, + ) + + def initialize_password(self, password: str) -> PasswordState: + if not password.strip(): + raise AuthenticationError("Password is required") + with self._lock: + if self._password_state.initialized: + raise AuthenticationError("Service is already initialized") + self._password_state = self._password_state_for(password=password, epoch=1) + self._save_password_state() + return self._password_state + + def authenticate_control(self, handshake: HandshakeContext, proof: bytes) -> tuple[ActiveSession, JsonChaChaChannel]: + password_state = self._password_state + if not password_state.initialized or password_state.pwd_hash is None: + raise AuthenticationError("Service password is not initialized") + expected = hmac_sha256(password_state.pwd_hash, self._auth_context(handshake, password_state.pwd_epoch)) + if not hmac.compare_digest(expected, proof): + raise AuthenticationError("Password proof verification failed") + session = self._new_session(handshake, password_state) + control_channel = self._build_control_channel(session) + return session, control_channel + + def open_control_session_after_initialize(self, handshake: HandshakeContext) -> tuple[ActiveSession, JsonChaChaChannel]: + password_state = self._password_state + if not password_state.initialized: + raise AuthenticationError("Service password is not initialized") + session = self._new_session(handshake, password_state) + return session, self._build_control_channel(session) + + def derive_password_proof_context(self, handshake: HandshakeContext, pwd_epoch: int) -> bytes: + return self._auth_context(handshake, pwd_epoch) + + def issue_resume_ticket(self, session: ActiveSession) -> str: + body = { + "session_id": session.session_id, + "pwd_epoch": session.pwd_epoch, + "expires_at": session.expires_at, + } + payload = canonical_dumps(body) + signature = hmac_sha256(self._ticket_key, payload) + return f"{b64e(payload)}.{b64e(signature)}" + + def subscribe_control(self, session_id: str) -> asyncio.Queue: + queue: asyncio.Queue = asyncio.Queue() + with self._lock: + session = self._require_session(session_id) + session.control_queues.add(queue) + return queue + + def unsubscribe_control(self, session_id: str, queue: asyncio.Queue) -> None: + with self._lock: + session = self._sessions.get(session_id) + if session is not None: + session.control_queues.discard(queue) + + async def change_password(self, *, session_id: str, new_password: str, reason: str = "password_changed") -> PasswordState: + if not new_password.strip(): + raise AuthenticationError("New password is required") + with self._lock: + session = self._require_session(session_id) + next_epoch = session.pwd_epoch + 1 + self._password_state = self._password_state_for(password=new_password, epoch=next_epoch) + self._save_password_state() + queues = self._collect_revocation_queues(reason=reason, pwd_epoch=next_epoch) + await self._publish_queues(queues) + return self._password_state + + async def force_reset_password(self, new_password: str, *, reason: str = "password_reset") -> PasswordState: + if not new_password.strip(): + raise AuthenticationError("New password is required") + with self._lock: + next_epoch = max(self._password_state.pwd_epoch, 0) + 1 + self._password_state = self._password_state_for(password=new_password, epoch=next_epoch) + self._save_password_state() + queues = self._collect_revocation_queues(reason=reason, pwd_epoch=next_epoch) + await self._publish_queues(queues) + return self._password_state + + def resume_business_session( + self, + *, + handshake: HandshakeContext, + session_id: str, + socket_id: str, + channel: str, + resume_ticket: str, + resume_mac: bytes, + ) -> tuple[ActiveSession, JsonChaChaChannel, SecretStreamBox]: + session = self._verify_resume_ticket(session_id, resume_ticket) + if session.pwd_epoch != self._password_state.pwd_epoch: + raise AuthenticationError("Session epoch is no longer current") + expected = hmac_sha256( + session.resume_secret, + canonical_dumps( + { + "transcript_hash": b64e(handshake.transcript_hash), + "session_id": session_id, + "socket_id": socket_id, + "channel": channel, + "pwd_epoch": session.pwd_epoch, + } + ), + ) + if not hmac.compare_digest(expected, resume_mac): + raise AuthenticationError("Resume proof verification failed") + + secure_channel = self.build_preauth_channel(handshake) + tx_key, rx_key = self.derive_business_stream_keys( + session=session, + socket_id=socket_id, + channel=channel, + transcript_hash=handshake.transcript_hash, + ) + stream_box = SecretStreamBox( + tx_key=tx_key, + rx_key=rx_key, + aad_prefix=canonical_dumps( + { + "session_id": session_id, + "socket_id": socket_id, + "channel": channel, + "pwd_epoch": session.pwd_epoch, + } + ), + ) + return session, secure_channel, stream_box + + def derive_business_stream_keys( + self, + *, + session: ActiveSession, + socket_id: str, + channel: str, + transcript_hash: bytes, + ) -> tuple[bytes, bytes]: + base = hkdf_sha256( + session.master_secret, + canonical_dumps( + { + "scope": "ws", + "session_id": session.session_id, + "socket_id": socket_id, + "channel": channel, + "pwd_epoch": session.pwd_epoch, + } + ), + 64, + transcript_hash, + ) + server_tx = hkdf_sha256(base[:32], b"secretstream:server-tx", 32, transcript_hash) + server_rx = hkdf_sha256(base[32:], b"secretstream:server-rx", 32, transcript_hash) + return server_tx, server_rx + + def close_session(self, session_id: str) -> None: + with self._lock: + self._sessions.pop(session_id, None) + + def _new_session(self, handshake: HandshakeContext, password_state: PasswordState) -> ActiveSession: + master_secret = hkdf_sha256( + handshake.shared_key + password_state.pwd_hash, + b"master-secret", + 32, + handshake.transcript_hash, + ) + resume_secret = hkdf_sha256(master_secret, b"resume-secret", 32, handshake.transcript_hash) + now = time.time() + session = ActiveSession( + session_id=uuid.uuid4().hex, + created_at=now, + expires_at=now + SESSION_TTL_SECONDS, + pwd_epoch=password_state.pwd_epoch, + master_secret=master_secret, + resume_secret=resume_secret, + ) + with self._lock: + self._sessions[session.session_id] = session + return session + + def _build_control_channel(self, session: ActiveSession) -> JsonChaChaChannel: + transcript_salt = hashlib.sha256(session.session_id.encode("utf-8")).digest() + return JsonChaChaChannel( + tx_key=hkdf_sha256(session.master_secret, b"control:server-tx", 32, transcript_salt), + rx_key=hkdf_sha256(session.master_secret, b"control:server-rx", 32, transcript_salt), + ) + + def build_control_channel_for_session(self, session: ActiveSession) -> JsonChaChaChannel: + return self._build_control_channel(session) + + def get_session(self, session_id: str) -> ActiveSession: + with self._lock: + return self._require_session(session_id) + + def _verify_resume_ticket(self, session_id: str, token: str) -> ActiveSession: + try: + payload_b64, signature_b64 = token.split(".", 1) + payload = b64d(payload_b64) + signature = b64d(signature_b64) + except ValueError as exc: + raise AuthenticationError("Malformed resume ticket") from exc + expected_signature = hmac_sha256(self._ticket_key, payload) + if not hmac.compare_digest(expected_signature, signature): + raise AuthenticationError("Resume ticket signature mismatch") + body = json.loads(payload.decode("utf-8")) + if body.get("session_id") != session_id: + raise AuthenticationError("Resume ticket session mismatch") + with self._lock: + session = self._require_session(session_id) + if session.expires_at < time.time(): + raise AuthenticationError("Session has expired") + if int(body.get("pwd_epoch", -1)) != session.pwd_epoch: + raise AuthenticationError("Resume ticket epoch mismatch") + return session + + def _auth_context(self, handshake: HandshakeContext, pwd_epoch: int) -> bytes: + return hkdf_sha256( + handshake.shared_key, + f"auth-proof:{pwd_epoch}".encode("utf-8"), + 32, + handshake.transcript_hash, + ) + + def _password_state_for(self, *, password: str, epoch: int) -> PasswordState: + salt = secrets.token_bytes(ARGON2_SALT_BYTES) + verifier = _argon2(password, salt) + return PasswordState( + initialized=True, + pwd_epoch=epoch, + pwd_salt=salt, + pwd_hash=verifier, + ) + + def _collect_revocation_queues(self, *, reason: str, pwd_epoch: int) -> list[tuple[asyncio.Queue, dict[str, Any]]]: + queues: list[tuple[asyncio.Queue, dict[str, Any]]] = [] + for session in self._sessions.values(): + for queue in session.control_queues: + queues.append( + ( + queue, + { + "type": "auth_revoked", + "reason": reason, + "pwd_epoch": pwd_epoch, + }, + ) + ) + self._sessions.clear() + return queues + + @staticmethod + async def _publish_queues(queues: list[tuple[asyncio.Queue, dict[str, Any]]]) -> None: + for queue, payload in queues: + await queue.put(payload) + + def _require_session(self, session_id: str) -> ActiveSession: + session = self._sessions.get(session_id) + if session is None: + raise AuthenticationError("Unknown or revoked session") + if session.expires_at < time.time(): + self._sessions.pop(session_id, None) + raise AuthenticationError("Session has expired") + if session.pwd_epoch != self._password_state.pwd_epoch: + self._sessions.pop(session_id, None) + raise AuthenticationError("Session epoch is stale") + return session + + def _load_password_state(self) -> PasswordState: + if not self._state_file.exists(): + return PasswordState() + payload = json.loads(self._state_file.read_text(encoding="utf-8")) + return PasswordState( + initialized=bool(payload.get("initialized", False)), + pwd_epoch=int(payload.get("pwd_epoch", 0)), + pwd_salt=b64d(payload["pwd_salt"]) if payload.get("pwd_salt") else None, + pwd_hash=b64d(payload["pwd_hash"]) if payload.get("pwd_hash") else None, + ) + + def _save_password_state(self) -> None: + payload = { + "initialized": self._password_state.initialized, + "pwd_epoch": self._password_state.pwd_epoch, + "pwd_salt": b64e(self._password_state.pwd_salt) if self._password_state.pwd_salt else None, + "pwd_hash": b64e(self._password_state.pwd_hash) if self._password_state.pwd_hash else None, + } + self._state_file.write_text( + json.dumps(payload, indent=2, ensure_ascii=False), + encoding="utf-8", + ) + + def _load_signing_key(self) -> Ed25519PrivateKey: + env_seed = os.getenv("BAAS_SERVICE_SIGN_SEED_B64") + if env_seed: + return Ed25519PrivateKey.from_private_bytes(b64d(env_seed)) + if self._signing_file.exists(): + return Ed25519PrivateKey.from_private_bytes(self._signing_file.read_bytes()) + seed = b64d(DEFAULT_SIGNING_SEED_B64) + self._signing_file.write_bytes(seed) + return Ed25519PrivateKey.from_private_bytes(seed) + + def _verify_default_public_key(self) -> None: + public_key = self._signing_key.public_key().public_bytes( + serialization.Encoding.Raw, + serialization.PublicFormat.Raw, + ) + if ( + not os.getenv("BAAS_SERVICE_SIGN_SEED_B64") + and b64e(public_key) != DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64 + ): + raise RuntimeError( + "Configured service signing key does not match the pinned frontend fallback public key. " + "Provide a matching VITE_BAAS_SERVER_SIGN_PUBLIC_KEY_B64 when building the frontend." + ) + + def _load_or_create_key(self, path: Path, *, env_name: str, default_factory) -> bytes: + env_value = os.getenv(env_name) + if env_value: + return b64d(env_value) + if path.exists(): + return path.read_bytes() + key = default_factory() + path.write_bytes(key) + return key + + +def verify_server_signature( + *, + expected_public_key_b64: str, + transcript: bytes, + signature_b64: str, +) -> None: + try: + public_key = Ed25519PublicKey.from_public_bytes(b64d(expected_public_key_b64)) + public_key.verify(b64d(signature_b64), transcript) + except InvalidSignature as exc: + raise AuthenticationError("Server signature verification failed") from exc diff --git a/service/lib/scrcpy/codec.py b/service/lib/scrcpy/codec.py index 19bf721a9..8d216b0e6 100644 --- a/service/lib/scrcpy/codec.py +++ b/service/lib/scrcpy/codec.py @@ -1,6 +1,722 @@ -import json +# import struct +# from typing import List, Optional, Iterator +# +# START_CODE_3 = b"\x00\x00\x01" +# START_CODE_4 = b"\x00\x00\x00\x01" +# +# +# def find_nal_units_annexb(data: bytes) -> List[bytes]: +# """ +# 从 Annex-B 字节流中提取 NAL(保留 start code)。 +# 注意:这是对单个 buffer 的切分,不处理跨 buffer 的半截 NAL。 +# """ +# positions = [] +# i = 0 +# n = len(data) +# while i < n - 3: +# if data[i:i + 4] == START_CODE_4: +# positions.append(i) +# i += 4 +# elif data[i:i + 3] == START_CODE_3: +# positions.append(i) +# i += 3 +# else: +# i += 1 +# +# if not positions: +# return [] +# +# nals = [] +# for idx, start in enumerate(positions): +# end = positions[idx + 1] if idx + 1 < len(positions) else len(data) +# nals.append(data[start:end]) +# return nals +# +# +# def strip_start_code(nal: bytes) -> bytes: +# if nal.startswith(START_CODE_4): +# return nal[4:] +# if nal.startswith(START_CODE_3): +# return nal[3:] +# return nal +# +# +# def nal_type(nal: bytes) -> int: +# body = strip_start_code(nal) +# if not body: +# return -1 +# return body[0] & 0x1F +# +# +# def is_vcl_nal(t: int) -> bool: +# return t in (1, 5) # non-IDR / IDR +# +# +# def is_parameter_set(t: int) -> bool: +# return t in (7, 8) # SPS / PPS +# +# +# def contains_idr(frame_annexb: bytes) -> bool: +# for nal in find_nal_units_annexb(frame_annexb): +# if nal_type(nal) == 5: +# return True +# return False +# +# +# class H264AnnexBFramer: +# """ +# 把 H264 Annex-B 连续流切成较适合前端解码的 access unit。 +# 这是工程上可用的简化版,不是完整 H264 语法解析器。 +# """ +# +# def __init__(self, max_fps: int): +# self.buffer = bytearray() +# self.pending_nals: List[bytes] = [] +# self.last_sps: Optional[bytes] = None +# self.last_pps: Optional[bytes] = None +# self.frame_interval_us = int(1_000_000 / max(max_fps, 1)) +# self._pts_us = 0 +# +# def construct_return_val(self, frame_annexb: bytes) -> bytes: +# is_key = 1 if contains_idr(frame_annexb) else 0 +# header = struct.pack( +# ">BQ", +# is_key, +# self._pts_us +# ) +# self._pts_us += self.frame_interval_us +# return header + frame_annexb +# +# def decode(self, chunk: bytes) -> Iterator[bytes]: +# self.buffer.extend(chunk) +# units = self._extract_complete_nals() +# +# for nal in units: +# t = nal_type(nal) +# if t == 7: +# self.last_sps = nal +# elif t == 8: +# self.last_pps = nal +# +# if is_vcl_nal(t): +# if self.pending_nals: +# to_send = b"".join(self.pending_nals) +# yield self.construct_return_val(to_send) +# self.pending_nals = [] +# +# # IDR 前把最新 SPS/PPS 带上,方便前端重建解码器或恢复 +# if t == 5: +# if self.last_sps: +# self.pending_nals.append(self.last_sps) +# if self.last_pps: +# self.pending_nals.append(self.last_pps) +# +# self.pending_nals.append(nal) +# else: +# # SEI / SPS / PPS / AUD 等跟到当前帧里 +# self.pending_nals.append(nal) +# +# def flush(self) -> Optional[bytes]: +# if self.pending_nals: +# frame = b"".join(self.pending_nals) +# self.pending_nals = [] +# return frame +# return None +# +# def _extract_complete_nals(self) -> List[bytes]: +# """ +# 从 buffer 中提取“完整 NAL”。 +# 保留最后一个可能不完整的尾巴,等待下一批 chunk。 +# """ +# data = bytes(self.buffer) +# positions = [] +# i = 0 +# n = len(data) +# while i < n - 3: +# if data[i:i + 4] == START_CODE_4: +# positions.append(i) +# i += 4 +# elif data[i:i + 3] == START_CODE_3: +# positions.append(i) +# i += 3 +# else: +# i += 1 +# +# if len(positions) < 2: +# return [] +# +# units = [] +# for idx in range(len(positions) - 1): +# start = positions[idx] +# end = positions[idx + 1] +# units.append(data[start:end]) +# +# self.buffer = bytearray(data[positions[-1]:]) +# return units +# +# +# class H264FMP4Framer: +# """ +# Convert a continuous Annex-B H.264 byte stream into fragmented MP4 segments. +# +# Output packet layout: +# [is_key: 1 byte][pts_us: 8 bytes][segment payload] +# +# Segment emission policy: +# - The first valid video configuration produces one init segment. +# - Each decoded access unit then produces one media segment (moof + mdat). +# - If SPS/PPS changes later, a new init segment is emitted before the next +# keyframe media segment. +# +# Notes: +# - This is a practical low-latency single-track implementation. +# - It is not a full H.264 / ISO-BMFF reference implementation. +# - It assumes no B-frames, so DTS == PTS. +# """ +# +# class _BitReader: +# """Minimal bit reader for SPS parsing.""" +# +# def __init__(self, data: bytes): +# self.data = data +# self.bitpos = 0 +# +# def read_bit(self) -> int: +# if self.bitpos >= len(self.data) * 8: +# return 0 +# byte_idx = self.bitpos // 8 +# bit_idx = 7 - (self.bitpos % 8) +# self.bitpos += 1 +# return (self.data[byte_idx] >> bit_idx) & 1 +# +# def read_bits(self, n: int) -> int: +# v = 0 +# for _ in range(n): +# v = (v << 1) | self.read_bit() +# return v +# +# def read_ue(self) -> int: +# zeros = 0 +# while self.read_bit() == 0: +# zeros += 1 +# if zeros == 0: +# return 0 +# return (1 << zeros) - 1 + self.read_bits(zeros) +# +# def read_se(self) -> int: +# code_num = self.read_ue() +# if code_num & 1: +# return (code_num + 1) // 2 +# return -(code_num // 2) +# +# def __init__(self, max_fps: int): +# """ +# Initialize the fragmented MP4 framer. +# +# Internally, this class reuses H264AnnexBFramer to: +# - split the raw Annex-B stream into access units +# - assign monotonically increasing timestamps +# """ +# self.au_framer = H264AnnexBFramer(max_fps) +# +# self.last_sps: Optional[bytes] = None +# self.last_pps: Optional[bytes] = None +# +# self.init_sps: Optional[bytes] = None +# self.init_pps: Optional[bytes] = None +# +# self.track_id = 1 +# self.sequence_number = 1 +# +# # Use microseconds as MP4 timescale to match the existing transport PTS. +# self.timescale = 1_000_000 +# self.frame_duration = int(1_000_000 / max(max_fps, 1)) +# +# self.width = 640 +# self.height = 360 +# +# self.init_sent = False +# +# def decode(self, chunk: bytes) -> Iterator[bytes]: +# """ +# Feed raw Annex-B bytes and emit one or more fMP4 packets. +# +# Each yielded packet still follows the transport header convention: +# [is_key:1][pts_us:8][segment_bytes] +# +# The first valid stream configuration yields an init segment first. +# """ +# for packet in self.au_framer.decode(chunk): +# is_key, pts_us = struct.unpack(">BQ", packet[:9]) +# frame_annexb = packet[9:] +# +# nals = find_nal_units_annexb(frame_annexb) +# if not nals: +# continue +# +# has_idr = False +# for nal in nals: +# t = nal_type(nal) +# if t == 7: +# self.last_sps = nal +# try: +# self.width, self.height = self._parse_sps_size(nal) +# except Exception: +# # Keep the previous size if SPS parsing fails. +# pass +# elif t == 8: +# self.last_pps = nal +# elif t == 5: +# has_idr = True +# +# # Do not emit media segments before SPS/PPS is known. +# if self.last_sps is None or self.last_pps is None: +# continue +# +# # Emit a new init segment if: +# # 1) we have never emitted one before, or +# # 2) SPS/PPS changed and we are at a clean keyframe boundary. +# need_new_init = ( +# (not self.init_sent) +# or ( +# has_idr +# and ( +# self.init_sps != self.last_sps +# or self.init_pps != self.last_pps +# ) +# ) +# ) +# +# if need_new_init: +# init_segment = self._build_init_segment(self.last_sps, self.last_pps) +# self.init_sps = self.last_sps +# self.init_pps = self.last_pps +# self.init_sent = True +# +# # Init segment is marked as key to make downstream handling simpler. +# yield self._wrap_packet(True, pts_us, init_segment) +# +# sample_nals = [ +# strip_start_code(nal) +# for nal in nals +# if nal_type(nal) not in (7, 8, 9) # SPS / PPS / AUD +# ] +# if not sample_nals: +# continue +# +# sample_data = self._annexb_nals_to_avcc(sample_nals) +# media_segment = self._build_media_segment( +# sample_data=sample_data, +# pts_us=pts_us, +# is_key=bool(has_idr or is_key), +# ) +# +# yield self._wrap_packet(bool(has_idr or is_key), pts_us, media_segment) +# +# def _wrap_packet(self, is_key: bool, pts_us: int, payload: bytes) -> bytes: +# """Wrap one MP4 segment with the existing transport header.""" +# header = struct.pack(">BQ", 1 if is_key else 0, pts_us) +# return header + payload +# +# def _annexb_nals_to_avcc(self, nals: List[bytes]) -> bytes: +# """ +# Convert a list of raw NAL payloads (without start code) into AVCC sample format: +# [length][nal][length][nal]... +# """ +# out = bytearray() +# for nal in nals: +# out.extend(struct.pack(">I", len(nal))) +# out.extend(nal) +# return bytes(out) +# +# def _build_avcc(self, sps: bytes, pps: bytes) -> bytes: +# """ +# Build AVCDecoderConfigurationRecord (avcC) from SPS/PPS. +# """ +# sps_body = strip_start_code(sps) +# pps_body = strip_start_code(pps) +# +# if len(sps_body) < 4: +# raise ValueError("Invalid SPS for avcC") +# +# out = bytearray() +# out.append(0x01) # configurationVersion +# out.append(sps_body[1]) # AVCProfileIndication +# out.append(sps_body[2]) # profile_compatibility +# out.append(sps_body[3]) # AVCLevelIndication +# out.append(0xFF) # lengthSizeMinusOne = 3 (4 bytes) +# out.append(0xE1) # numOfSequenceParameterSets = 1 +# +# out.extend(struct.pack(">H", len(sps_body))) +# out.extend(sps_body) +# +# out.append(0x01) # numOfPictureParameterSets = 1 +# out.extend(struct.pack(">H", len(pps_body))) +# out.extend(pps_body) +# +# return bytes(out) +# +# def _build_init_segment(self, sps: bytes, pps: bytes) -> bytes: +# """ +# Build the MP4 initialization segment: ftyp + moov. +# """ +# avcc = self._build_avcc(sps, pps) +# +# ftyp = self._box( +# b"ftyp", +# b"isom", +# struct.pack(">I", 0x00000200), +# b"isom", +# b"iso6", +# b"mp41", +# ) +# +# avc1 = self._box( +# b"avc1", +# b"\x00" * 6, # reserved +# struct.pack(">H", 1), # data_reference_index +# struct.pack(">H", 0), # pre_defined +# struct.pack(">H", 0), # reserved +# b"\x00" * 12, # pre_defined[3] +# struct.pack(">H", self.width), +# struct.pack(">H", self.height), +# struct.pack(">I", 0x00480000), # horizresolution = 72 dpi +# struct.pack(">I", 0x00480000), # vertresolution = 72 dpi +# struct.pack(">I", 0), # reserved +# struct.pack(">H", 1), # frame_count +# b"\x00" * 32, # compressorname +# struct.pack(">H", 0x0018), # depth +# struct.pack(">H", 0xFFFF), # pre_defined = -1 +# self._box(b"avcC", avcc), +# ) +# +# stsd = self._full_box( +# b"stsd", +# 0, +# 0, +# struct.pack(">I", 1), # entry_count +# avc1, +# ) +# stts = self._full_box(b"stts", 0, 0, struct.pack(">I", 0)) +# stsc = self._full_box(b"stsc", 0, 0, struct.pack(">I", 0)) +# stsz = self._full_box(b"stsz", 0, 0, struct.pack(">I", 0), struct.pack(">I", 0)) +# stco = self._full_box(b"stco", 0, 0, struct.pack(">I", 0)) +# stbl = self._box(b"stbl", stsd, stts, stsc, stsz, stco) +# +# url_ = self._full_box(b"url ", 0, 1) +# dref = self._full_box(b"dref", 0, 0, struct.pack(">I", 1), url_) +# dinf = self._box(b"dinf", dref) +# +# vmhd = self._full_box( +# b"vmhd", +# 0, +# 1, +# struct.pack(">H", 0), +# struct.pack(">H", 0), +# struct.pack(">H", 0), +# struct.pack(">H", 0), +# ) +# +# mdhd = self._full_box( +# b"mdhd", +# 0, +# 0, +# struct.pack(">I", 0), # creation_time +# struct.pack(">I", 0), # modification_time +# struct.pack(">I", self.timescale), +# struct.pack(">I", 0), # duration +# struct.pack(">H", 0x55C4), # language = "und" +# struct.pack(">H", 0), +# ) +# +# hdlr = self._full_box( +# b"hdlr", +# 0, +# 0, +# struct.pack(">I", 0), +# b"vide", +# struct.pack(">I", 0), +# struct.pack(">I", 0), +# struct.pack(">I", 0), +# b"VideoHandler\x00", +# ) +# +# minf = self._box(b"minf", vmhd, dinf, stbl) +# mdia = self._box(b"mdia", mdhd, hdlr, minf) +# +# tkhd = self._full_box( +# b"tkhd", +# 0, +# 7, # track enabled + in movie + in preview +# struct.pack(">I", 0), # creation_time +# struct.pack(">I", 0), # modification_time +# struct.pack(">I", self.track_id), +# struct.pack(">I", 0), # reserved +# struct.pack(">I", 0), # duration +# struct.pack(">I", 0), +# struct.pack(">I", 0), +# struct.pack(">H", 0), # layer +# struct.pack(">H", 0), # alternate_group +# struct.pack(">H", 0), # volume +# struct.pack(">H", 0), # reserved +# self._matrix_bytes(), +# struct.pack(">I", self.width << 16), +# struct.pack(">I", self.height << 16), +# ) +# +# trak = self._box(b"trak", tkhd, mdia) +# +# mvhd = self._full_box( +# b"mvhd", +# 0, +# 0, +# struct.pack(">I", 0), # creation_time +# struct.pack(">I", 0), # modification_time +# struct.pack(">I", self.timescale), +# struct.pack(">I", 0), # duration +# struct.pack(">I", 0x00010000), # rate = 1.0 +# struct.pack(">H", 0x0100), # volume = 1.0 +# struct.pack(">H", 0), +# struct.pack(">I", 0), +# struct.pack(">I", 0), +# self._matrix_bytes(), +# b"\x00" * 24, # pre_defined[6] +# struct.pack(">I", self.track_id + 1), # next_track_id +# ) +# +# trex = self._full_box( +# b"trex", +# 0, +# 0, +# struct.pack(">I", self.track_id), +# struct.pack(">I", 1), # default_sample_description_index +# struct.pack(">I", self.frame_duration), +# struct.pack(">I", 0), # default_sample_size +# struct.pack(">I", 0), # default_sample_flags +# ) +# mvex = self._box(b"mvex", trex) +# +# moov = self._box(b"moov", mvhd, trak, mvex) +# return ftyp + moov +# +# def _build_media_segment(self, sample_data: bytes, pts_us: int, is_key: bool) -> bytes: +# """ +# Build one movie fragment: +# moof + mdat +# +# One sample is packed into one fragment for low-latency streaming. +# """ +# sample_size = len(sample_data) +# sample_flags = 0x02000000 if is_key else 0x01010000 +# +# mfhd = self._full_box( +# b"mfhd", +# 0, +# 0, +# struct.pack(">I", self.sequence_number), +# ) +# +# tfhd = self._full_box( +# b"tfhd", +# 0, +# 0x020000, # default-base-is-moof +# struct.pack(">I", self.track_id), +# ) +# +# tfdt = self._full_box( +# b"tfdt", +# 1, +# 0, +# struct.pack(">Q", pts_us), +# ) +# +# # First pass with placeholder data_offset. +# trun_placeholder = self._full_box( +# b"trun", +# 0, +# 0x000001 | 0x000100 | 0x000200 | 0x000400, +# struct.pack(">I", 1), # sample_count +# struct.pack(">i", 0), # data_offset (patched later) +# struct.pack(">I", self.frame_duration), +# struct.pack(">I", sample_size), +# struct.pack(">I", sample_flags), +# ) +# +# traf_placeholder = self._box(b"traf", tfhd, tfdt, trun_placeholder) +# moof_placeholder = self._box(b"moof", mfhd, traf_placeholder) +# +# # data_offset is from the beginning of moof to the first byte of mdat payload. +# data_offset = len(moof_placeholder) + 8 +# +# trun = self._full_box( +# b"trun", +# 0, +# 0x000001 | 0x000100 | 0x000200 | 0x000400, +# struct.pack(">I", 1), +# struct.pack(">i", data_offset), +# struct.pack(">I", self.frame_duration), +# struct.pack(">I", sample_size), +# struct.pack(">I", sample_flags), +# ) +# +# traf = self._box(b"traf", tfhd, tfdt, trun) +# moof = self._box(b"moof", mfhd, traf) +# mdat = self._box(b"mdat", sample_data) +# +# self.sequence_number += 1 +# return moof + mdat +# +# def _parse_sps_size(self, sps: bytes) -> tuple[int, int]: +# """ +# Parse coded width/height from SPS. +# +# This parser is intentionally limited but sufficient for common AVC streams. +# """ +# sps_body = strip_start_code(sps) +# if len(sps_body) < 4: +# raise ValueError("Invalid SPS") +# +# # Remove NAL header and emulation prevention bytes. +# rbsp = self._ebsp_to_rbsp(sps_body[1:]) +# br = self._BitReader(rbsp) +# +# profile_idc = br.read_bits(8) +# br.read_bits(8) # constraint flags + reserved bits +# br.read_bits(8) # level_idc +# br.read_ue() # seq_parameter_set_id +# +# chroma_format_idc = 1 +# if profile_idc in { +# 100, 110, 122, 244, 44, 83, 86, 118, 128, +# 138, 139, 134, 135 +# }: +# chroma_format_idc = br.read_ue() +# if chroma_format_idc == 3: +# br.read_bits(1) # separate_colour_plane_flag +# br.read_ue() # bit_depth_luma_minus8 +# br.read_ue() # bit_depth_chroma_minus8 +# br.read_bits(1) # qpprime_y_zero_transform_bypass_flag +# seq_scaling_matrix_present_flag = br.read_bits(1) +# if seq_scaling_matrix_present_flag: +# scaling_count = 8 if chroma_format_idc != 3 else 12 +# for idx in range(scaling_count): +# if br.read_bits(1): +# self._skip_scaling_list(br, 16 if idx < 6 else 64) +# +# br.read_ue() # log2_max_frame_num_minus4 +# pic_order_cnt_type = br.read_ue() +# if pic_order_cnt_type == 0: +# br.read_ue() +# elif pic_order_cnt_type == 1: +# br.read_bits(1) +# br.read_se() +# br.read_se() +# num_ref_frames_in_pic_order_cnt_cycle = br.read_ue() +# for _ in range(num_ref_frames_in_pic_order_cnt_cycle): +# br.read_se() +# +# br.read_ue() # max_num_ref_frames +# br.read_bits(1) # gaps_in_frame_num_value_allowed_flag +# +# pic_width_in_mbs_minus1 = br.read_ue() +# pic_height_in_map_units_minus1 = br.read_ue() +# +# frame_mbs_only_flag = br.read_bits(1) +# if not frame_mbs_only_flag: +# br.read_bits(1) # mb_adaptive_frame_field_flag +# +# br.read_bits(1) # direct_8x8_inference_flag +# +# frame_cropping_flag = br.read_bits(1) +# frame_crop_left_offset = 0 +# frame_crop_right_offset = 0 +# frame_crop_top_offset = 0 +# frame_crop_bottom_offset = 0 +# if frame_cropping_flag: +# frame_crop_left_offset = br.read_ue() +# frame_crop_right_offset = br.read_ue() +# frame_crop_top_offset = br.read_ue() +# frame_crop_bottom_offset = br.read_ue() +# +# width = (pic_width_in_mbs_minus1 + 1) * 16 +# height = (pic_height_in_map_units_minus1 + 1) * 16 * (2 - frame_mbs_only_flag) +# +# if chroma_format_idc == 0: +# crop_unit_x = 1 +# crop_unit_y = 2 - frame_mbs_only_flag +# elif chroma_format_idc == 1: +# crop_unit_x = 2 +# crop_unit_y = 2 * (2 - frame_mbs_only_flag) +# elif chroma_format_idc == 2: +# crop_unit_x = 2 +# crop_unit_y = 1 * (2 - frame_mbs_only_flag) +# else: +# crop_unit_x = 1 +# crop_unit_y = 1 * (2 - frame_mbs_only_flag) +# +# width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x +# height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y +# +# return max(width, 16), max(height, 16) +# +# def _skip_scaling_list(self, br: "_BitReader", size_of_scaling_list: int) -> None: +# """Skip one SPS scaling list.""" +# last_scale = 8 +# next_scale = 8 +# for _ in range(size_of_scaling_list): +# if next_scale != 0: +# delta_scale = br.read_se() +# next_scale = (last_scale + delta_scale + 256) % 256 +# last_scale = next_scale if next_scale != 0 else last_scale +# +# def _ebsp_to_rbsp(self, data: bytes) -> bytes: +# """Remove emulation prevention bytes (0x03) from EBSP.""" +# out = bytearray() +# zero_count = 0 +# for b in data: +# if zero_count == 2 and b == 0x03: +# zero_count = 0 +# continue +# out.append(b) +# if b == 0: +# zero_count += 1 +# else: +# zero_count = 0 +# return bytes(out) +# +# def _matrix_bytes(self) -> bytes: +# """Return the standard unity transformation matrix.""" +# return b"".join([ +# struct.pack(">I", 0x00010000), # a +# struct.pack(">I", 0x00000000), # b +# struct.pack(">I", 0x00000000), # u +# struct.pack(">I", 0x00000000), # c +# struct.pack(">I", 0x00010000), # d +# struct.pack(">I", 0x00000000), # v +# struct.pack(">I", 0x00000000), # x +# struct.pack(">I", 0x00000000), # y +# struct.pack(">I", 0x40000000), # w +# ]) +# +# def _box(self, box_type: bytes, *payloads: bytes) -> bytes: +# """Build a generic ISO BMFF box.""" +# payload = b"".join(payloads) +# return struct.pack(">I4s", 8 + len(payload), box_type) + payload +# +# def _full_box(self, box_type: bytes, version: int, flags: int, *payloads: bytes) -> bytes: +# """Build a full box with version and flags.""" +# payload = bytes([version]) + flags.to_bytes(3, "big") + b"".join(payloads) +# return self._box(box_type, payload) + + + +import io import struct -from typing import List, Optional, Iterator +from fractions import Fraction +from typing import Iterator, List, Optional + +import av +from av.codec import CodecContext START_CODE_3 = b"\x00\x00\x01" START_CODE_4 = b"\x00\x00\x00\x01" @@ -8,12 +724,16 @@ def find_nal_units_annexb(data: bytes) -> List[bytes]: """ - 从 Annex-B 字节流中提取 NAL(保留 start code)。 - 注意:这是对单个 buffer 的切分,不处理跨 buffer 的半截 NAL。 + Split one Annex-B byte buffer into NAL units while preserving start codes. + + This helper is intentionally lightweight: + - it is only used on already packetized / parser-produced chunks + - it does not try to repair cross-buffer truncation """ - positions = [] + positions: List[int] = [] i = 0 n = len(data) + while i < n - 3: if data[i:i + 4] == START_CODE_4: positions.append(i) @@ -27,14 +747,17 @@ def find_nal_units_annexb(data: bytes) -> List[bytes]: if not positions: return [] - nals = [] + out: List[bytes] = [] for idx, start in enumerate(positions): end = positions[idx + 1] if idx + 1 < len(positions) else len(data) - nals.append(data[start:end]) - return nals + out.append(data[start:end]) + return out def strip_start_code(nal: bytes) -> bytes: + """ + Remove one Annex-B start code prefix if present. + """ if nal.startswith(START_CODE_4): return nal[4:] if nal.startswith(START_CODE_3): @@ -43,114 +766,439 @@ def strip_start_code(nal: bytes) -> bytes: def nal_type(nal: bytes) -> int: + """ + Return H.264 NAL unit type for one Annex-B NAL. + """ body = strip_start_code(nal) if not body: return -1 return body[0] & 0x1F -def is_vcl_nal(t: int) -> bool: - return t in (1, 5) # non-IDR / IDR - - -def is_parameter_set(t: int) -> bool: - return t in (7, 8) # SPS / PPS +def is_vcl_nal(nal_type_value: int) -> bool: + """ + H.264 VCL slice types used here: + - 1: non-IDR slice + - 5: IDR slice + """ + return nal_type_value in (1, 5) def contains_idr(frame_annexb: bytes) -> bool: + """ + Whether an Annex-B access unit contains an IDR NAL. + """ for nal in find_nal_units_annexb(frame_annexb): if nal_type(nal) == 5: return True return False +def _has_sps(frame_annexb: bytes) -> bool: + for nal in find_nal_units_annexb(frame_annexb): + if nal_type(nal) == 7: + return True + return False + + +def _has_pps(frame_annexb: bytes) -> bool: + for nal in find_nal_units_annexb(frame_annexb): + if nal_type(nal) == 8: + return True + return False + + +def _has_any_vcl(frame_annexb: bytes) -> bool: + for nal in find_nal_units_annexb(frame_annexb): + if is_vcl_nal(nal_type(nal)): + return True + return False + + +def _annexb_frame_to_avcc_sample(frame_annexb: bytes) -> bytes: + """ + Convert one Annex-B access unit into one MP4-compatible H.264 sample payload. + + Output layout: + [len][nal][len][nal]... + + SPS / PPS / AUD are not included in the media sample because the MP4 init + segment should already carry decoder configuration (avcC / extradata). + SEI is preserved. + """ + out = bytearray() + + for nal in find_nal_units_annexb(frame_annexb): + t = nal_type(nal) + if t in (7, 8, 9): # SPS / PPS / AUD + continue + + body = strip_start_code(nal) + if not body: + continue + + out.extend(struct.pack(">I", len(body))) + out.extend(body) + + return bytes(out) + + class H264AnnexBFramer: """ - 把 H264 Annex-B 连续流切成较适合前端解码的 access unit。 - 这是工程上可用的简化版,不是完整 H264 语法解析器。 + Reframe a continuous H.264 Annex-B byte stream into access-unit-like chunks. + + External contract is intentionally kept unchanged: + - constructor signature stays the same + - decode(chunk) still yields: + [is_key: 1 byte][pts_us: 8 bytes][Annex-B access unit bytes] + + Internal strategy: + - PyAV parser is responsible for raw H.264 packet boundary detection + - this class still keeps a small amount of transport-oriented logic: + * cache SPS/PPS + * group non-VCL prefix NALs with the next VCL access unit + * optionally prepend latest SPS/PPS before IDR output """ def __init__(self, max_fps: int): - self.buffer = bytearray() - self.pending_nals: List[bytes] = [] + self.parser = CodecContext.create("h264", "r") + self.last_sps: Optional[bytes] = None self.last_pps: Optional[bytes] = None + + self.pending_prefix: List[bytes] = [] + self.frame_interval_us = int(1_000_000 / max(max_fps, 1)) self._pts_us = 0 def construct_return_val(self, frame_annexb: bytes) -> bytes: + """ + Build the existing transport packet: + [is_key:1][pts_us:8][frame_annexb] + """ is_key = 1 if contains_idr(frame_annexb) else 0 - header = struct.pack( - ">QB", - self._pts_us, - is_key - ) + header = struct.pack(">BQ", is_key, self._pts_us) self._pts_us += self.frame_interval_us return header + frame_annexb - def decode(self, chunk: bytes) -> Iterator[bytes]: - self.buffer.extend(chunk) - units = self._extract_complete_nals() - - for nal in units: + def _remember_parameter_sets(self, frame_annexb: bytes) -> None: + """ + Update cached SPS/PPS from one Annex-B chunk. + """ + for nal in find_nal_units_annexb(frame_annexb): t = nal_type(nal) if t == 7: self.last_sps = nal elif t == 8: self.last_pps = nal - if is_vcl_nal(t): - if self.pending_nals: - to_send = b"".join(self.pending_nals) - yield self.construct_return_val(to_send) - self.pending_nals = [] + def _finalize_access_unit(self, frame_annexb: bytes) -> bytes: + """ + Normalize one output access unit. + + For IDR output, prepend the latest cached SPS/PPS when they are not + already present in the current frame. This keeps browser-side recovery + behaviour close to the original implementation. + """ + self._remember_parameter_sets(frame_annexb) + + if contains_idr(frame_annexb): + prefix = bytearray() + if self.last_sps is not None and not _has_sps(frame_annexb): + prefix.extend(self.last_sps) + if self.last_pps is not None and not _has_pps(frame_annexb): + prefix.extend(self.last_pps) + if prefix: + return bytes(prefix) + frame_annexb + + return frame_annexb + + def decode(self, chunk: bytes) -> Iterator[bytes]: + """ + Feed raw H.264 Annex-B bytes and yield wrapped access units. + + PyAV parser performs the low-level splitting. This method then restores + the previous framing semantics by collecting parameter/AUD/SEI prefix + data until a VCL packet is seen. + """ + for packet in self.parser.parse(chunk): + raw = bytes(packet) + if not raw: + continue + + self._remember_parameter_sets(raw) - # IDR 前把最新 SPS/PPS 带上,方便前端重建解码器或恢复 - if t == 5: - if self.last_sps: - self.pending_nals.append(self.last_sps) - if self.last_pps: - self.pending_nals.append(self.last_pps) + if _has_any_vcl(raw): + # frame_annexb = b"".join(self.pending_prefix) + raw + # self.pending_prefix.clear() + frame_annexb = raw - self.pending_nals.append(nal) + frame_annexb = self._finalize_access_unit(frame_annexb) + yield self.construct_return_val(frame_annexb) else: - # SEI / SPS / PPS / AUD 等跟到当前帧里 - self.pending_nals.append(nal) + self.pending_prefix.append(raw) def flush(self) -> Optional[bytes]: - if self.pending_nals: - frame = b"".join(self.pending_nals) - self.pending_nals = [] - return frame - return None - - def _extract_complete_nals(self) -> List[bytes]: - """ - 从 buffer 中提取“完整 NAL”。 - 保留最后一个可能不完整的尾巴,等待下一批 chunk。 - """ - data = bytes(self.buffer) - positions = [] - i = 0 - n = len(data) - while i < n - 3: - if data[i:i + 4] == START_CODE_4: - positions.append(i) - i += 4 - elif data[i:i + 3] == START_CODE_3: - positions.append(i) - i += 3 + """ + Flush parser tail and pending prefix data. + + The original method returned raw Annex-B bytes (not the wrapped transport + packet), so that behaviour is preserved. + """ + flushed_parts: List[bytes] = [] + + for packet in self.parser.parse(b""): + raw = bytes(packet) + if raw: + flushed_parts.append(raw) + + if self.pending_prefix: + flushed_parts = self.pending_prefix + flushed_parts + self.pending_prefix.clear() + + if not flushed_parts: + return None + + frame_annexb = b"".join(flushed_parts) + return self._finalize_access_unit(frame_annexb) + + +class H264FMP4Framer: + """ + Convert a continuous Annex-B H.264 stream into fragmented MP4 packets. + + External contract is intentionally unchanged: + - constructor signature stays the same + - decode(chunk) still yields: + [is_key: 1 byte][pts_us: 8 bytes][fMP4 bytes] + + Design: + - PyAV parser is used to split the raw Annex-B stream + - PyAV muxer is used to generate the MP4 init segment and media fragments + - a minimal amount of manual logic remains for: + * SPS/PPS tracking + * IDR-aligned muxer reinitialization when stream config changes + * Annex-B -> AVCC sample conversion for one MP4 media sample + """ + + def __init__(self, max_fps: int): + self.parser = av.CodecContext.create("h264", "r") + + self.pending_prefix: List[bytes] = [] + + self.last_sps: Optional[bytes] = None + self.last_pps: Optional[bytes] = None + + self.init_sps: Optional[bytes] = None + self.init_pps: Optional[bytes] = None + + self.timescale = 1_000_000 + self.frame_duration = int(1_000_000 / max(max_fps, 1)) + self._pts_us = 0 + + self._mux_buffer: Optional[io.BytesIO] = None + self._mux_read_pos = 0 + self._mux_container = None + self._mux_stream = None + + def _wrap_packet(self, is_key: bool, pts_us: int, payload: bytes) -> bytes: + """ + Keep the original transport packet format. + """ + header = struct.pack(">BQ", 1 if is_key else 0, pts_us) + return header + payload + + def _remember_parameter_sets(self, frame_annexb: bytes) -> None: + """ + Update cached SPS/PPS from one Annex-B access unit. + """ + for nal in find_nal_units_annexb(frame_annexb): + t = nal_type(nal) + if t == 7: + self.last_sps = nal + elif t == 8: + self.last_pps = nal + + def _with_parameter_sets_for_probe(self, frame_annexb: bytes) -> bytes: + """ + Ensure the probe sample contains SPS/PPS before a keyframe, so that the + temporary raw-H264 input container has enough codec configuration to + produce a correct output stream template. + """ + self._remember_parameter_sets(frame_annexb) + + if not contains_idr(frame_annexb): + return frame_annexb + + prefix = bytearray() + if self.last_sps is not None and not _has_sps(frame_annexb): + prefix.extend(self.last_sps) + if self.last_pps is not None and not _has_pps(frame_annexb): + prefix.extend(self.last_pps) + + return bytes(prefix) + frame_annexb if prefix else frame_annexb + + def _drain_mux_buffer(self) -> bytes: + """ + Read only the newly appended bytes from the output buffer. + """ + if self._mux_buffer is None: + return b"" + + current = self._mux_buffer.getvalue() + if self._mux_read_pos >= len(current): + return b"" + + out = current[self._mux_read_pos:] + self._mux_read_pos = len(current) + return out + + def _close_muxer(self) -> None: + """ + Close the current muxer instance if present. + + Any trailer bytes produced during close are intentionally discarded, + because this class is used for live fragmented streaming, not for + finalized MP4 file writing. + """ + if self._mux_container is not None: + try: + self._mux_container.close() + except Exception: + pass + + self._mux_container = None + self._mux_stream = None + self._mux_buffer = None + self._mux_read_pos = 0 + + def _reset_muxer(self, probe_annexb: bytes) -> bytes: + """ + Recreate the fragmented MP4 muxer from a raw H.264 probe sample. + + The new output stream is created from a temporary raw-H264 input stream + template. This is the most reliable PyAV-level remux setup for preserving + codec parameters without transcoding. + """ + self._close_muxer() + + probe_buffer = io.BytesIO(probe_annexb) + probe_input = av.open(probe_buffer, mode="r", format="h264") + + try: + in_stream = probe_input.streams.video[0] + + self._mux_buffer = io.BytesIO() + self._mux_read_pos = 0 + + self._mux_container = av.open( + self._mux_buffer, + mode="w", + format="mp4", + options={ + "movflags": "empty_moov+frag_every_frame+default_base_moof", + "flush_packets": "1", + }, + ) + + self._mux_stream = self._mux_container.add_stream(template=in_stream) + + # Use the existing transport timestamp unit directly: microseconds. + # Keeping packet time_base explicit avoids implicit rescaling surprises. + self._mux_stream.time_base = Fraction(1, self.timescale) + try: + self._mux_stream.codec_context.time_base = Fraction(1, self.timescale) + except Exception: + # Some builds may not allow touching codec_context.time_base here. + pass + + self._mux_container.start_encoding() + return self._drain_mux_buffer() + + finally: + probe_input.close() + + def decode(self, chunk: bytes) -> Iterator[bytes]: + """ + Feed raw H.264 Annex-B bytes and emit one or more transport packets. + + Emission policy: + - a new init segment is emitted when muxer is first created + - if SPS/PPS changes, a fresh init segment is emitted on the next IDR + - each completed access unit yields one media fragment packet + """ + for parsed_packet in self.parser.parse(chunk): + raw = bytes(parsed_packet) + if not raw: + continue + + self._remember_parameter_sets(raw) + + if _has_any_vcl(raw): + frame_annexb = b"".join(self.pending_prefix) + raw + self.pending_prefix.clear() else: - i += 1 + self.pending_prefix.append(raw) + continue + + frame_annexb = self._with_parameter_sets_for_probe(frame_annexb) + has_idr = contains_idr(frame_annexb) + + pts_us = self._pts_us + self._pts_us += self.frame_duration + + # We cannot initialize an MP4 stream correctly without SPS/PPS. + if self.last_sps is None or self.last_pps is None: + continue + + need_new_init = ( + self._mux_container is None + or ( + has_idr + and ( + self.init_sps != self.last_sps + or self.init_pps != self.last_pps + ) + ) + ) - if len(positions) < 2: - return [] + if need_new_init: + # Reinitialize only at a clean keyframe boundary. + if not has_idr: + continue - units = [] - for idx in range(len(positions) - 1): - start = positions[idx] - end = positions[idx + 1] - units.append(data[start:end]) + init_segment = self._reset_muxer(frame_annexb) + self.init_sps = self.last_sps + self.init_pps = self.last_pps - self.buffer = bytearray(data[positions[-1]:]) - return units + if init_segment: + yield self._wrap_packet(True, pts_us, init_segment) + + if self._mux_container is None or self._mux_stream is None: + continue + + sample_payload = _annexb_frame_to_avcc_sample(frame_annexb) + if not sample_payload: + continue + + pkt = av.Packet(sample_payload) + pkt.stream = self._mux_stream + pkt.pts = pts_us + pkt.dts = pts_us + pkt.duration = self.frame_duration + pkt.time_base = Fraction(1, self.timescale) + + self._mux_container.mux_one(pkt) + + media_segment = self._drain_mux_buffer() + if media_segment: + yield self._wrap_packet(has_idr, pts_us, media_segment) + + def close(self) -> None: + """ + Explicit resource cleanup for the internal muxer. + + Optional to call in your current flow, but harmless and useful if you + later add an explicit shutdown hook. + """ + self._close_muxer() diff --git a/service/lib/scrcpy/const.py b/service/lib/scrcpy/const.py index 4e1c32336..ba89fa4a1 100644 --- a/service/lib/scrcpy/const.py +++ b/service/lib/scrcpy/const.py @@ -297,7 +297,8 @@ # Event EVENT_INIT = "init" EVENT_FRAME = "frame" -EVENT_STREAM = "stream" +EVENT_STREAM_ANNEXB = "stream_annexb" +EVENT_STREAM_FMP4 = "stream_fmp4" EVENT_DISCONNECT = "disconnect" # Type diff --git a/service/lib/scrcpy/core.py b/service/lib/scrcpy/core.py index 0debe1389..cb738a953 100644 --- a/service/lib/scrcpy/core.py +++ b/service/lib/scrcpy/core.py @@ -3,6 +3,7 @@ import socket import struct import threading +import time from pathlib import Path from time import sleep from typing import Any, Callable, Optional, Tuple @@ -10,10 +11,11 @@ import numpy as np from adbutils import AdbConnection, AdbDevice, AdbError, Network -from .codec import H264AnnexBFramer +from .codec import H264AnnexBFramer, H264FMP4Framer from .const import ( EVENT_DISCONNECT, - EVENT_STREAM, + EVENT_STREAM_ANNEXB, + EVENT_STREAM_FMP4, EVENT_INIT, LOCK_SCREEN_ORIENTATION_UNLOCKED, ) @@ -75,9 +77,9 @@ def __init__( # Params self.flip = flip self.device = device - self.max_width = max_width + self.max_width = max_width #= 720 self.bitrate = bitrate - self.max_fps = max_fps + self.max_fps = max_fps = 60 self.block_frame = block_frame self.stay_awake = stay_awake self.lock_screen_orientation = lock_screen_orientation @@ -85,8 +87,11 @@ def __init__( self.encoder_name = encoder_name self.codec_name = codec_name - self.framer = H264AnnexBFramer(max_fps if max_fps > 0 else 30) - self.listeners = dict(frame=[], init=[], disconnect=[], stream=[]) + self.framer = { + "AnnexB": H264AnnexBFramer(max_fps if max_fps > 0 else 30), + "fMP4" : H264FMP4Framer(max_fps if max_fps > 0 else 30), + } + self.listeners = dict(frame=[], init=[], disconnect=[], stream_annexb=[], stream_fmp4=[]) # User accessible self.last_frame: Optional[np.ndarray] = None @@ -235,6 +240,7 @@ def stop(self) -> None: self.stream_loop_thread = None async def __stream_loop(self) -> None: + trace_1 = [0, 0] while self.alive: try: if self.__video_socket is None: @@ -244,8 +250,20 @@ async def __stream_loop(self) -> None: if raw_h264 == b"": raise ConnectionError("Video stream is disconnected") - for to_send_content in self.framer.decode(raw_h264): - await self.__send_to_listeners(EVENT_STREAM, to_send_content) + if self.any_listener(EVENT_STREAM_ANNEXB): + perf_1 = time.perf_counter() + for to_send_content in self.framer["AnnexB"].decode(raw_h264): + await self.__send_to_listeners(EVENT_STREAM_ANNEXB, to_send_content) + perf_2 = time.perf_counter() + trace_1[0] = (trace_1[0] * trace_1[1] + perf_2 - perf_1) / (trace_1[1] + 1) + trace_1[1] = trace_1[1] + 1 + + if trace_1[1] %100 == 0 : + print("trace #1 => ", trace_1[0]) + if self.any_listener(EVENT_STREAM_FMP4): + for to_send_content in self.framer["fMP4"].decode(raw_h264): + await self.__send_to_listeners(EVENT_STREAM_FMP4, to_send_content) + except BlockingIOError: await asyncio.sleep(0.01) @@ -295,13 +313,11 @@ async def __send_to_listeners(self, cls: str, *args, **kwargs) -> None: tasks = [] for fun in list(self.listeners.get(cls, [])): + # noinspection PyBroadException try: result = fun(*args, **kwargs) - if inspect.isawaitable(result): - # 不直接 await,而是绑定到当前 loop - tasks.append(loop.create_task(result)) - + tasks.append(loop.create_task(result)) # type:ignore except Exception: import traceback traceback.print_exc() From dd37166c02c42a56b0f7b9553d30beb30ae5c84c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Fri, 15 May 2026 20:23:36 +0800 Subject: [PATCH 17/98] Fix: Use ws-scrcpy for remote --- core/device/connection.py | 4 +- requirements.txt | 3 +- service/app.py | 191 ++-- service/lib/scrcpy/__init__.py | 569 +++++++++++- service/lib/scrcpy/codec.py | 1204 -------------------------- service/lib/scrcpy/const.py | 328 ------- service/lib/scrcpy/control.py | 259 ------ service/lib/scrcpy/core.py | 326 ------- service/lib/scrcpy/scrcpy-server.jar | Bin 0 -> 114470 bytes 9 files changed, 652 insertions(+), 2232 deletions(-) delete mode 100644 service/lib/scrcpy/codec.py delete mode 100644 service/lib/scrcpy/const.py delete mode 100644 service/lib/scrcpy/control.py delete mode 100644 service/lib/scrcpy/core.py create mode 100644 service/lib/scrcpy/scrcpy-server.jar diff --git a/core/device/connection.py b/core/device/connection.py index c634db829..2dfea17e8 100644 --- a/core/device/connection.py +++ b/core/device/connection.py @@ -247,7 +247,9 @@ def detect_package(self): elif server == '日服': self.server = 'JP' if not package_exist: - self.check_package_exist(server) + # TODO: For test, will be back in formal ver + # self.check_package_exist(server) + pass self.activity = self.static_config.activity_name[server] self.logger.info("Server : " + self.server) diff --git a/requirements.txt b/requirements.txt index 1de2b9018..d715a8a24 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,5 +24,4 @@ tomli_w == 1.2.0 PyAutoGUI == 0.9.54 mss == 10.0.0 -rich >= 14.2.0 -PyNaCl >= 1.6.1 +rich >= 14.2.0 diff --git a/service/app.py b/service/app.py index 4b602fd32..2f6d559d3 100644 --- a/service/app.py +++ b/service/app.py @@ -10,7 +10,7 @@ from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect from starlette.middleware.cors import CORSMiddleware -from starlette.staticfiles import StaticFiles +# from starlette.staticfiles import StaticFiles from .context import ServiceContext from .encryption import ( @@ -23,7 +23,7 @@ b64d, b64e, ) -from .lib.scrcpy.const import EVENT_STREAM_ANNEXB, EVENT_STREAM_FMP4 +from .lib.scrcpy import EVENT_STREAM from .messages import CommandMessage, ProviderRequest, SyncPatchMessage, SyncPullMessage PROJECT_ROOT = Path(__file__).resolve().parent.parent @@ -102,14 +102,14 @@ async def _finalize_control_auth( await websocket.send_json( preauth_channel.encrypt( { - "type" : "auth_ok", + "type": "auth_ok", "protocol_version": PROTOCOL_VERSION, - "session_id" : session.session_id, - "resume_ticket" : context.auth_manager.issue_resume_ticket(session), - "expires_at" : session.expires_at, - "pwd_epoch" : session.pwd_epoch, - "pwd_salt" : context.auth_manager.password_state.as_public_dict()["pwd_salt"], - "argon2" : context.auth_manager.password_state.as_public_dict()["argon2"], + "session_id": session.session_id, + "resume_ticket": context.auth_manager.issue_resume_ticket(session), + "expires_at": session.expires_at, + "pwd_epoch": session.pwd_epoch, + "pwd_salt": context.auth_manager.password_state.as_public_dict()["pwd_salt"], + "argon2": context.auth_manager.password_state.as_public_dict()["argon2"], } ) ) @@ -146,7 +146,7 @@ async def _control_heartbeat_sender( await websocket.send_json( control_channel.encrypt( { - "type" : "heartbeat", + "type": "heartbeat", "timestamp": time.time(), } ) @@ -165,11 +165,11 @@ async def health() -> Dict[str, Any]: statuses = context.runtime.current_status() auth_state = context.auth_manager.password_state return { - "ok" : True, + "ok": True, "statuses": statuses, - "auth" : { - "initialized" : auth_state.initialized, - "pwd_epoch" : auth_state.pwd_epoch, + "auth": { + "initialized": auth_state.initialized, + "pwd_epoch": auth_state.pwd_epoch, "server_sign_public_key": context.auth_manager.server_public_key_b64(), }, } @@ -258,9 +258,9 @@ async def _perform_business_resume( await websocket.send_json( secure_channel.encrypt( { - "type" : "resume_ok", - "session_id" : session.session_id, - "pwd_epoch" : session.pwd_epoch, + "type": "resume_ok", + "session_id": session.session_id, + "pwd_epoch": session.pwd_epoch, "server_header": b64e(stream_box.tx_header), } ) @@ -302,11 +302,11 @@ async def websocket_sync(websocket: WebSocket) -> None: websocket, stream, { - "type" : "snapshot", - "resource" : data.resource, + "type": "snapshot", + "resource": data.resource, "resource_id": data.resource_id, - "timestamp" : snapshot.timestamp, - "data" : snapshot.data, + "timestamp": snapshot.timestamp, + "data": snapshot.data, }, ) elif msg_type == "patch": @@ -322,10 +322,10 @@ async def websocket_sync(websocket: WebSocket) -> None: websocket, stream, { - "type" : "patch_ack", - "resource" : data.resource, + "type": "patch_ack", + "resource": data.resource, "resource_id": data.resource_id, - "timestamp" : data.timestamp, + "timestamp": data.timestamp, }, ) elif msg_type == "list": @@ -334,9 +334,9 @@ async def websocket_sync(websocket: WebSocket) -> None: websocket, stream, { - "type" : "config_list", + "type": "config_list", "timestamp": snapshot.timestamp, - "data" : snapshot.data, + "data": snapshot.data, }, ) else: @@ -403,9 +403,9 @@ async def websocket_provider(websocket: WebSocket) -> None: websocket, stream, { - "type" : "static_snapshot", + "type": "static_snapshot", "timestamp": snapshot.timestamp, - "data" : snapshot.data, + "data": snapshot.data, }, ) elif req_type == "status_request": @@ -524,8 +524,8 @@ async def websocket_trigger(websocket: WebSocket) -> None: websocket, stream, { - "type" : "command_response", - "command" : cmd.command, + "type": "command_response", + "command": cmd.command, **response_payload, "timestamp": cmd.timestamp, }, @@ -545,23 +545,16 @@ async def websocket_remote(websocket: WebSocket) -> None: listener = client = None sender_task = None send_queue: asyncio.Queue[bytes | None] | None = None - EVENT_STREAM = None - MAPPING = { - "AnnexB": EVENT_STREAM_ANNEXB, - "fMP4" : EVENT_STREAM_FMP4 - } + # noinspection PyBroadException try: _, stream = await _perform_business_resume(websocket, channel="remote") message = await _recv_stream_json(websocket, stream) config_id = message.get("config_id") - transfer_type = message.get("transfer_type") - - EVENT_STREAM = MAPPING[transfer_type] # type: ignore + to_encrypt = message.get("decrypt", True) client = await context.runtime.require_remote_(config_id) - loop = asyncio.get_running_loop() send_queue = asyncio.Queue(maxsize=8) async def sender() -> None: @@ -576,33 +569,17 @@ async def sender() -> None: sender_task = asyncio.create_task(sender()) - def listener(encoded_stream: bytes) -> None: - # noinspection PyBroadException - try: - payload = encoded_stream - # payload = stream.encrypt(encoded_stream) - - def _push() -> None: - assert send_queue is not None - if send_queue.full(): - with suppress(asyncio.QueueEmpty): - send_queue.get_nowait() - with suppress(asyncio.QueueFull): - send_queue.put_nowait(payload) - - loop.call_soon_threadsafe(_push) # type: ignore - except Exception: - import traceback - traceback.print_exc() - - client.add_listener(EVENT_STREAM, listener) + client.set_proxy_callbacks( + ws_to_adb=lambda data: stream.decrypt(data), + adb_to_ws=lambda data: stream.encrypt(data) if to_encrypt else data, + ) if not client.alive: await client.init() - await client.start(daemon_threaded=True) + await client.proxy_websocket(websocket) - while client.alive and client.has_listener(EVENT_STREAM, listener=listener): + while client.alive: await asyncio.sleep(1.0) except Exception: import traceback @@ -623,71 +600,64 @@ def _push() -> None: client.stop() # type: ignore[union-attr] - @app.websocket("/ws/remote_test") async def websocket_remote_test(websocket: WebSocket) -> None: listener = client = None sender_task = None send_queue: asyncio.Queue[bytes | None] | None = None - EVENT_STREAM = None - MAPPING = { - "AnnexB": EVENT_STREAM_ANNEXB, - "fMP4" : EVENT_STREAM_FMP4 - } + # noinspection PyBroadException try: await websocket.accept() - frame = await websocket.receive_text() - message = json.loads(frame) - config_id = message.get("config_id") - transfer_type = message.get("transfer_type") - - EVENT_STREAM = MAPPING[transfer_type] # type: ignore + # frame = await websocket.receive_text() + # message = json.loads(frame) + # config_id = message.get("config_id") + config_id = "default_config" client = await context.runtime.require_remote_(config_id) - loop = asyncio.get_running_loop() + # loop = asyncio.get_running_loop() send_queue = asyncio.Queue(maxsize=8) - async def sender() -> None: - try: - while True: - item = await send_queue.get() # type: ignore - if item is None: - break - await websocket.send_bytes(item) - except WebSocketDisconnect: - pass - - sender_task = asyncio.create_task(sender()) - - def listener(encoded_stream: bytes) -> None: - # noinspection PyBroadException - try: - payload = encoded_stream - # payload = stream.encrypt(encoded_stream) - - def _push() -> None: - assert send_queue is not None - if send_queue.full(): - with suppress(asyncio.QueueEmpty): - send_queue.get_nowait() - with suppress(asyncio.QueueFull): - send_queue.put_nowait(payload) - - loop.call_soon_threadsafe(_push) # type: ignore - except Exception: - import traceback - traceback.print_exc() - - client.add_listener(EVENT_STREAM, listener) + # async def sender() -> None: + # try: + # while True: + # item = await send_queue.get() # type: ignore + # if item is None: + # break + # await websocket.send_bytes(item) + # except WebSocketDisconnect: + # pass + # + # sender_task = asyncio.create_task(sender()) + + # def listener(encoded_stream: bytes) -> None: + # # noinspection PyBroadException + # try: + # payload = encoded_stream + # # payload = stream.encrypt(encoded_stream) + # + # def _push() -> None: + # assert send_queue is not None + # if send_queue.full(): + # with suppress(asyncio.QueueEmpty): + # send_queue.get_nowait() + # with suppress(asyncio.QueueFull): + # send_queue.put_nowait(payload) + # + # loop.call_soon_threadsafe(_push) # type: ignore + # except Exception: + # import traceback + # traceback.print_exc() + # + # client.add_listener(EVENT_STREAM, listener) if not client.alive: await client.init() - await client.start(daemon_threaded=True) + await client.proxy_websocket(websocket) - while client.alive and client.has_listener(EVENT_STREAM, listener=listener): + while client.alive: await asyncio.sleep(1.0) except Exception: import traceback @@ -706,6 +676,5 @@ def _push() -> None: if (not client.any_listener(EVENT_STREAM_ANNEXB) and # type: ignore not client.any_listener(EVENT_STREAM_FMP4)): # type: ignore client.stop() # type: ignore[union-attr] - - -app.mount("/", StaticFiles(directory="service/dist", html=True), name="static") +# TODO: Temporarily commented +# app.mount("/", StaticFiles(directory="service/dist", html=True), name="static") diff --git a/service/lib/scrcpy/__init__.py b/service/lib/scrcpy/__init__.py index dc5685ba2..f58bc7811 100644 --- a/service/lib/scrcpy/__init__.py +++ b/service/lib/scrcpy/__init__.py @@ -2,4 +2,571 @@ This module is modified from leng-yue/py-scrcpy-client. Reference URL: https://github.com/leng-yue/py-scrcpy-client """ -from .core import ScrcpyClient +import asyncio +import inspect +import shlex +import socket +import threading +from pathlib import Path +from time import sleep +from typing import Any, Callable, Optional + +import websockets +from adbutils import AdbDevice, AdbError, AdbTimeout, ForwardItem +from websockets import ClientConnection + + +# --------------------------------------------------------------------------- +# ws-scrcpy server constants +# --------------------------------------------------------------------------- +EVENT_INIT = "init" +EVENT_DISCONNECT = "disconnect" +EVENT_STREAM = "stream" +LOCK_SCREEN_ORIENTATION_UNLOCKED = -1 + +SCRCPY_SERVER_PACKAGE = "com.genymobile.scrcpy.Server" +SCRCPY_SERVER_VERSION = "1.19-ws7" +SCRCPY_SERVER_TYPE = "web" +SCRCPY_LOG_LEVEL = "ERROR" +SCRCPY_SERVER_PORT = 8886 +SCRCPY_LISTENS_ON_ALL_INTERFACES = "true" + +SCRCPY_TEMP_PATH = "/data/local/tmp" +SCRCPY_SERVER_JAR_NAME = "scrcpy-server.jar" +SCRCPY_REMOTE_JAR = f"{SCRCPY_TEMP_PATH}/{SCRCPY_SERVER_JAR_NAME}" +SCRCPY_PID_FILE = f"{SCRCPY_TEMP_PATH}/ws_scrcpy.pid" + + +class ScrcpyClient: + """ + ws-scrcpy web-mode client. + + This class no longer implements the classic scrcpy raw socket protocol. + + Old classic mode: + ADB localabstract:scrcpy + Python reads dummy byte, device name, resolution, and raw H264. + + Current web mode: + ADB tcp:8886 + Python only proxies bytes between browser WebSocket and Android server. + + Expected chain: + Browser WebSocket + <-> FastAPI + <-> adbutils create_connection(Network.TCP, 8886) + <-> ws-scrcpy server on Android + """ + + device: AdbDevice + + def __init__( + self, + device: AdbDevice, + max_width: int = 0, + bitrate: int = 8000000, + max_fps: int = 0, + flip: bool = False, + block_frame: bool = False, + stay_awake: bool = False, + lock_screen_orientation: int = LOCK_SCREEN_ORIENTATION_UNLOCKED, + connection_timeout: int = 3000, + encoder_name: Optional[str] = None, + codec_name: Optional[str] = None, + ): + assert max_width >= 0, "max_width must be greater than or equal to 0" + assert bitrate >= 0, "bitrate must be greater than or equal to 0" + assert max_fps >= 0, "max_fps must be greater than or equal to 0" + assert -1 <= lock_screen_orientation <= 3, ( + "lock_screen_orientation must be LOCK_SCREEN_ORIENTATION_*" + ) + assert connection_timeout >= 0, "connection_timeout must be greater than or equal to 0" + + assert encoder_name in [ + None, + "OMX.google.h264.encoder", + "OMX.qcom.video.encoder.avc", + "c2.qti.avc.encoder", + "c2.android.avc.encoder", + ] + + assert codec_name in [None, "h264", "h265", "av1"] + + self.device = device + + # Kept for API compatibility. In web mode these are not used by this + # Python proxy directly; the Android server and frontend protocol handle + # stream configuration. + self.flip = flip + self.max_width = max_width + self.bitrate = bitrate + self.max_fps = max_fps + self.block_frame = block_frame + self.stay_awake = stay_awake + self.lock_screen_orientation = lock_screen_orientation + self.connection_timeout = connection_timeout + self.encoder_name = encoder_name + self.codec_name = codec_name + + self.listeners: dict[str, list[Callable[..., Any]]] = { + EVENT_INIT: [], + EVENT_DISCONNECT: [], + } + + self.alive = False + self.__server_pid: Optional[int] = None + + # adbutils create_connection(Network.TCP, port) returns socket.socket. + self.__remote_socket: Optional[ClientConnection] = None + + # Kept as a compatibility alias. Do not use old ControlSender against + # this socket unless you are certain the message format matches the + # ws-scrcpy web protocol. + self.control_socket: Optional[ClientConnection] = None + self.control_socket_lock = threading.Lock() + + # Middleware + self.on_ws_to_adb: Optional[Callable[[bytes], Optional[bytes]]] = None + self.on_adb_to_ws: Optional[Callable[[bytes], Optional[bytes]]] = None + + # ----------------------------------------------------------------------- + # adb shell helpers + # ----------------------------------------------------------------------- + + @staticmethod + def __to_text(output: Any) -> str: + if output is None: + return "" + if isinstance(output, bytes): + return output.decode("utf-8", errors="replace") + return str(output) + + def __shell(self, command: str, timeout: Optional[float] = None) -> str: + try: + if timeout is None: + return self.__to_text(self.device.shell(command)) + return self.__to_text(self.device.shell(command, timeout=timeout)) + except TypeError: + # Older adbutils may not accept timeout. + return self.__to_text(self.device.shell(command)) + + # ----------------------------------------------------------------------- + # server startup / readiness + # ----------------------------------------------------------------------- + + @staticmethod + def __build_server_command() -> str: + args_string = ( + f"/ {SCRCPY_SERVER_PACKAGE} " + f"{SCRCPY_SERVER_VERSION} " + f"{SCRCPY_SERVER_TYPE} " + f"{SCRCPY_LOG_LEVEL} " + f"{SCRCPY_SERVER_PORT} " + f"{SCRCPY_LISTENS_ON_ALL_INTERFACES} " + "2>&1 > /dev/null" + ) + + return f"CLASSPATH={SCRCPY_REMOTE_JAR} nohup app_process {args_string}" + + @staticmethod + def get_free_tcp_port(): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(('', 0)) + s.listen(1) + port = s.getsockname()[1] + return port + + def __read_server_pid_file(self) -> Optional[int]: + output = self.__shell( + f"test -f {shlex.quote(SCRCPY_PID_FILE)} && cat {shlex.quote(SCRCPY_PID_FILE)}", + timeout=1, + ).strip() + + if not output: + return None + + try: + pid = int(output) + except ValueError: + return None + + return pid if pid > 0 else None + + def __get_cmdline(self, pid: int) -> list[str]: + output = self.__shell(f"cat /proc/{pid}/cmdline", timeout=1) + return [part for part in output.split("\x00") if part] + + def __is_expected_server_pid(self, pid: int) -> bool: + try: + cmdline = self.__get_cmdline(pid) + except Exception: + return False + + if SCRCPY_SERVER_PACKAGE not in cmdline: + return False + + package_index = cmdline.index(SCRCPY_SERVER_PACKAGE) + + expected_args = [ + SCRCPY_SERVER_PACKAGE, + SCRCPY_SERVER_VERSION, + SCRCPY_SERVER_TYPE, + SCRCPY_LOG_LEVEL, + str(SCRCPY_SERVER_PORT), + SCRCPY_LISTENS_ON_ALL_INTERFACES, + ] + + actual_args = cmdline[package_index: package_index + len(expected_args)] + return actual_args == expected_args + + def __read_valid_server_pid_file(self) -> Optional[int]: + pid = self.__read_server_pid_file() + + if pid is None: + return None + + if self.__is_expected_server_pid(pid): + return pid + + # Stale pid file or PID reused by another process. + try: + self.__shell(f"rm -f {shlex.quote(SCRCPY_PID_FILE)}", timeout=1) + except Exception: + pass + + return None + + def __find_expected_server_pids(self) -> list[int]: + script = r""" + for p in /proc/[0-9]*; do + pid="${p##*/}" + first="$(tr '\0' '\n' < "$p/cmdline" 2>/dev/null | head -n 1)" + base="${first##*/}" + + if [ "$base" = "app_process" ] || [ "$base" = "app_process64" ] || [ "$base" = "app_process32" ]; then + echo "$pid" + fi + done + """.strip() + + try: + output = self.__shell(script, timeout=3) + except Exception: + return [] + + pids: list[int] = [] + + for line in output.splitlines(): + line = line.strip() + if not line.isdigit(): + continue + + pid = int(line) + if self.__is_expected_server_pid(pid): + pids.append(pid) + + return pids + + def __wait_server_ready(self) -> int: + attempts = max(1, self.connection_timeout // 100) + + for _ in range(attempts): + pid = self.__read_valid_server_pid_file() + + if pid is not None: + self.__server_pid = pid + return pid + + pids = self.__find_expected_server_pids() + if pids: + self.__server_pid = pids[0] + return pids[0] + + sleep(0.1) + + raise ConnectionError( + f"scrcpy-server did not become ready within {self.connection_timeout} ms" + ) + + async def __deploy_server(self) -> None: + existing_pids = self.__find_expected_server_pids() + if existing_pids: + self.__server_pid = existing_pids[0] + return + + server_file_path = Path(__file__).parent / SCRCPY_SERVER_JAR_NAME + + if not server_file_path.exists(): + raise FileNotFoundError(f"scrcpy-server.jar not found: {server_file_path}") + + self.device.sync.push(server_file_path, SCRCPY_REMOTE_JAR) + + # Remove stale ready marker before starting a new server. + self.__shell(f"rm -f {shlex.quote(SCRCPY_PID_FILE)}", timeout=1) + + background_command = self.__build_server_command() + + async def start_server() -> str: + try: + return await asyncio.to_thread( + self.__shell, + background_command, + timeout=20.0, + ) + except AdbTimeout: + return "pending" + + async def wait_server_ready() -> int: + return await asyncio.to_thread(self.__wait_server_ready) + + start_task = asyncio.create_task(start_server()) + ready_task = asyncio.create_task(wait_server_ready()) + + done, pending = await asyncio.wait( + [start_task, ready_task], + return_when=asyncio.FIRST_COMPLETED, + ) + + for task in pending: + task.cancel() + + for task in pending: + try: + await task + except asyncio.CancelledError: + pass + + # ----------------------------------------------------------------------- + # ADB TCP connection + # ----------------------------------------------------------------------- + + async def __init_server_connection(self) -> None: + last_error: Optional[Exception] = None + attempts = max(1, self.connection_timeout // 100) + + for _ in range(attempts): + try: + items_forward = self.device.forward_list() + remote = f"tcp:{SCRCPY_SERVER_PORT}" + + def _filter_func(x: ForwardItem): + return ( + x.remote == remote + and x.local.startswith("tcp:") + ) + + forwarded_list = list(filter(_filter_func, items_forward)) # type: list[ForwardItem] + + if len(forwarded_list) > 0: + local = forwarded_list[0].local + local_port = int(local.split("tcp:")[1]) + else: + local_port = self.get_free_tcp_port() + local = f"tcp:{local_port}" + self.device.forward(local, remote) + + self.__remote_socket = await websockets.connect( + f"ws://127.0.0.1:{local_port}", + max_size=None, + ping_interval=None, + ping_timeout=None, + ) + + self.control_socket = self.__remote_socket + return + + except AdbError as exc: + last_error = exc + sleep(0.1) + + raise ConnectionError( + f"Failed to connect ws-scrcpy server at tcp:{SCRCPY_SERVER_PORT} " + f"within {self.connection_timeout} ms. Last error: {last_error}" + ) + + # ----------------------------------------------------------------------- + # public lifecycle + # ----------------------------------------------------------------------- + + async def init(self): + if self.alive: + return self + + try: + await self.__deploy_server() + await self.__init_server_connection() + self.alive = True + await self.__send_to_listeners(EVENT_INIT) + return self + + except Exception: + await self.stop(kill_server=False) + raise + + async def start(self, daemon_threaded: bool = False) -> None: + raise RuntimeError( + "start() is deprecated in ws-scrcpy web mode. " + "Use await client.proxy_websocket(websocket) instead." + ) + + async def stop(self, kill_server: bool = True) -> None: + self.alive = False + + if self.__remote_socket is not None: + try: + await self.__remote_socket.close() + except Exception: + pass + self.__remote_socket = None + + self.control_socket = None + + if kill_server: + try: + pid = self.__read_valid_server_pid_file() + if pid is not None: + self.__shell(f"kill {pid} >/dev/null 2>&1 || true", timeout=1) + + self.__shell(f"rm -f {shlex.quote(SCRCPY_PID_FILE)}", timeout=1) + except Exception: + pass + + self.__server_pid = None + + # ----------------------------------------------------------------------- + # websocket proxy + # ----------------------------------------------------------------------- + + def set_proxy_callbacks( + self, + ws_to_adb: Optional[Callable[[bytes], Optional[bytes]]] = None, + adb_to_ws: Optional[Callable[[bytes], Optional[bytes]]] = None, + ) -> None: + self.on_ws_to_adb = ws_to_adb + self.on_adb_to_ws = adb_to_ws + + async def __websocket_to_adb(self, websocket) -> None: + if self.__remote_socket is None: + raise ConnectionError("Remote ADB TCP socket is not initialized") + + while self.alive: + message = await websocket.receive() + + if message.get("type") == "websocket.disconnect": + break + + if message.get("bytes") is not None: + payload = message["bytes"] + elif message.get("text") is not None: + payload = message["text"].encode("utf-8") + else: + continue + + if self.on_ws_to_adb is not None: + result = self.on_ws_to_adb(payload) + if inspect.isawaitable(result): + result = await result + payload = result + + if payload is None: + continue + + await self.__remote_socket.send(payload) + + async def __adb_to_websocket(self, websocket) -> None: + if self.__remote_socket is None: + raise ConnectionError("Remote ADB TCP socket is not initialized") + + while self.alive: + payload = await self.__remote_socket.recv() + + if not payload: + break + + if self.on_adb_to_ws is not None: + result = self.on_adb_to_ws(payload) + if inspect.isawaitable(result): + result = await result + payload = result + + if payload is None: + continue + + await websocket.send_bytes(payload) + + async def proxy_websocket(self, websocket) -> None: + """ + Proxy one accepted FastAPI/Starlette WebSocket to device tcp:8886. + + Important: + The caller should call `await websocket.accept()` before this method. + """ + if self.__remote_socket is None: + raise RuntimeError("ScrcpyClient is not initialized. Call await init() first.") + + self.alive = True + + tasks = [ + asyncio.create_task(self.__adb_to_websocket(websocket)), + asyncio.create_task(self.__websocket_to_adb(websocket)), + ] + + try: + done, pending = await asyncio.wait( + tasks, + return_when=asyncio.FIRST_COMPLETED, + ) + + for task in pending: + task.cancel() + + for task in pending: + try: + await task + except asyncio.CancelledError: + pass + + for task in done: + exc = task.exception() + if exc is not None: + raise exc + + finally: + self.alive = False + await self.__send_to_listeners(EVENT_DISCONNECT) + await self.stop(kill_server=True) + + # ----------------------------------------------------------------------- + # listener API + # ----------------------------------------------------------------------- + + def add_listener(self, cls: str, listener: Callable[..., Any]) -> None: + if cls not in self.listeners: + self.listeners[cls] = [] + + self.listeners[cls].append(listener) + + def remove_listener(self, cls: str, listener: Callable[..., Any]) -> None: + if cls in self.listeners and listener in self.listeners[cls]: + self.listeners[cls].remove(listener) + + def has_listener(self, cls: str, listener: Callable[..., Any]) -> bool: + return cls in self.listeners and listener in self.listeners[cls] + + def any_listener(self, cls: str) -> bool: + return cls in self.listeners and len(self.listeners[cls]) > 0 + + async def __send_to_listeners(self, cls: str, *args, **kwargs) -> None: + tasks = [] + + for func in list(self.listeners.get(cls, [])): + try: + result = func(*args, **kwargs) + if inspect.isawaitable(result): + tasks.append(asyncio.create_task(result)) # type: ignore[arg-type] + except Exception: + import traceback + traceback.print_exc() + + if tasks: + await asyncio.gather(*tasks, return_exceptions=True) diff --git a/service/lib/scrcpy/codec.py b/service/lib/scrcpy/codec.py deleted file mode 100644 index 8d216b0e6..000000000 --- a/service/lib/scrcpy/codec.py +++ /dev/null @@ -1,1204 +0,0 @@ -# import struct -# from typing import List, Optional, Iterator -# -# START_CODE_3 = b"\x00\x00\x01" -# START_CODE_4 = b"\x00\x00\x00\x01" -# -# -# def find_nal_units_annexb(data: bytes) -> List[bytes]: -# """ -# 从 Annex-B 字节流中提取 NAL(保留 start code)。 -# 注意:这是对单个 buffer 的切分,不处理跨 buffer 的半截 NAL。 -# """ -# positions = [] -# i = 0 -# n = len(data) -# while i < n - 3: -# if data[i:i + 4] == START_CODE_4: -# positions.append(i) -# i += 4 -# elif data[i:i + 3] == START_CODE_3: -# positions.append(i) -# i += 3 -# else: -# i += 1 -# -# if not positions: -# return [] -# -# nals = [] -# for idx, start in enumerate(positions): -# end = positions[idx + 1] if idx + 1 < len(positions) else len(data) -# nals.append(data[start:end]) -# return nals -# -# -# def strip_start_code(nal: bytes) -> bytes: -# if nal.startswith(START_CODE_4): -# return nal[4:] -# if nal.startswith(START_CODE_3): -# return nal[3:] -# return nal -# -# -# def nal_type(nal: bytes) -> int: -# body = strip_start_code(nal) -# if not body: -# return -1 -# return body[0] & 0x1F -# -# -# def is_vcl_nal(t: int) -> bool: -# return t in (1, 5) # non-IDR / IDR -# -# -# def is_parameter_set(t: int) -> bool: -# return t in (7, 8) # SPS / PPS -# -# -# def contains_idr(frame_annexb: bytes) -> bool: -# for nal in find_nal_units_annexb(frame_annexb): -# if nal_type(nal) == 5: -# return True -# return False -# -# -# class H264AnnexBFramer: -# """ -# 把 H264 Annex-B 连续流切成较适合前端解码的 access unit。 -# 这是工程上可用的简化版,不是完整 H264 语法解析器。 -# """ -# -# def __init__(self, max_fps: int): -# self.buffer = bytearray() -# self.pending_nals: List[bytes] = [] -# self.last_sps: Optional[bytes] = None -# self.last_pps: Optional[bytes] = None -# self.frame_interval_us = int(1_000_000 / max(max_fps, 1)) -# self._pts_us = 0 -# -# def construct_return_val(self, frame_annexb: bytes) -> bytes: -# is_key = 1 if contains_idr(frame_annexb) else 0 -# header = struct.pack( -# ">BQ", -# is_key, -# self._pts_us -# ) -# self._pts_us += self.frame_interval_us -# return header + frame_annexb -# -# def decode(self, chunk: bytes) -> Iterator[bytes]: -# self.buffer.extend(chunk) -# units = self._extract_complete_nals() -# -# for nal in units: -# t = nal_type(nal) -# if t == 7: -# self.last_sps = nal -# elif t == 8: -# self.last_pps = nal -# -# if is_vcl_nal(t): -# if self.pending_nals: -# to_send = b"".join(self.pending_nals) -# yield self.construct_return_val(to_send) -# self.pending_nals = [] -# -# # IDR 前把最新 SPS/PPS 带上,方便前端重建解码器或恢复 -# if t == 5: -# if self.last_sps: -# self.pending_nals.append(self.last_sps) -# if self.last_pps: -# self.pending_nals.append(self.last_pps) -# -# self.pending_nals.append(nal) -# else: -# # SEI / SPS / PPS / AUD 等跟到当前帧里 -# self.pending_nals.append(nal) -# -# def flush(self) -> Optional[bytes]: -# if self.pending_nals: -# frame = b"".join(self.pending_nals) -# self.pending_nals = [] -# return frame -# return None -# -# def _extract_complete_nals(self) -> List[bytes]: -# """ -# 从 buffer 中提取“完整 NAL”。 -# 保留最后一个可能不完整的尾巴,等待下一批 chunk。 -# """ -# data = bytes(self.buffer) -# positions = [] -# i = 0 -# n = len(data) -# while i < n - 3: -# if data[i:i + 4] == START_CODE_4: -# positions.append(i) -# i += 4 -# elif data[i:i + 3] == START_CODE_3: -# positions.append(i) -# i += 3 -# else: -# i += 1 -# -# if len(positions) < 2: -# return [] -# -# units = [] -# for idx in range(len(positions) - 1): -# start = positions[idx] -# end = positions[idx + 1] -# units.append(data[start:end]) -# -# self.buffer = bytearray(data[positions[-1]:]) -# return units -# -# -# class H264FMP4Framer: -# """ -# Convert a continuous Annex-B H.264 byte stream into fragmented MP4 segments. -# -# Output packet layout: -# [is_key: 1 byte][pts_us: 8 bytes][segment payload] -# -# Segment emission policy: -# - The first valid video configuration produces one init segment. -# - Each decoded access unit then produces one media segment (moof + mdat). -# - If SPS/PPS changes later, a new init segment is emitted before the next -# keyframe media segment. -# -# Notes: -# - This is a practical low-latency single-track implementation. -# - It is not a full H.264 / ISO-BMFF reference implementation. -# - It assumes no B-frames, so DTS == PTS. -# """ -# -# class _BitReader: -# """Minimal bit reader for SPS parsing.""" -# -# def __init__(self, data: bytes): -# self.data = data -# self.bitpos = 0 -# -# def read_bit(self) -> int: -# if self.bitpos >= len(self.data) * 8: -# return 0 -# byte_idx = self.bitpos // 8 -# bit_idx = 7 - (self.bitpos % 8) -# self.bitpos += 1 -# return (self.data[byte_idx] >> bit_idx) & 1 -# -# def read_bits(self, n: int) -> int: -# v = 0 -# for _ in range(n): -# v = (v << 1) | self.read_bit() -# return v -# -# def read_ue(self) -> int: -# zeros = 0 -# while self.read_bit() == 0: -# zeros += 1 -# if zeros == 0: -# return 0 -# return (1 << zeros) - 1 + self.read_bits(zeros) -# -# def read_se(self) -> int: -# code_num = self.read_ue() -# if code_num & 1: -# return (code_num + 1) // 2 -# return -(code_num // 2) -# -# def __init__(self, max_fps: int): -# """ -# Initialize the fragmented MP4 framer. -# -# Internally, this class reuses H264AnnexBFramer to: -# - split the raw Annex-B stream into access units -# - assign monotonically increasing timestamps -# """ -# self.au_framer = H264AnnexBFramer(max_fps) -# -# self.last_sps: Optional[bytes] = None -# self.last_pps: Optional[bytes] = None -# -# self.init_sps: Optional[bytes] = None -# self.init_pps: Optional[bytes] = None -# -# self.track_id = 1 -# self.sequence_number = 1 -# -# # Use microseconds as MP4 timescale to match the existing transport PTS. -# self.timescale = 1_000_000 -# self.frame_duration = int(1_000_000 / max(max_fps, 1)) -# -# self.width = 640 -# self.height = 360 -# -# self.init_sent = False -# -# def decode(self, chunk: bytes) -> Iterator[bytes]: -# """ -# Feed raw Annex-B bytes and emit one or more fMP4 packets. -# -# Each yielded packet still follows the transport header convention: -# [is_key:1][pts_us:8][segment_bytes] -# -# The first valid stream configuration yields an init segment first. -# """ -# for packet in self.au_framer.decode(chunk): -# is_key, pts_us = struct.unpack(">BQ", packet[:9]) -# frame_annexb = packet[9:] -# -# nals = find_nal_units_annexb(frame_annexb) -# if not nals: -# continue -# -# has_idr = False -# for nal in nals: -# t = nal_type(nal) -# if t == 7: -# self.last_sps = nal -# try: -# self.width, self.height = self._parse_sps_size(nal) -# except Exception: -# # Keep the previous size if SPS parsing fails. -# pass -# elif t == 8: -# self.last_pps = nal -# elif t == 5: -# has_idr = True -# -# # Do not emit media segments before SPS/PPS is known. -# if self.last_sps is None or self.last_pps is None: -# continue -# -# # Emit a new init segment if: -# # 1) we have never emitted one before, or -# # 2) SPS/PPS changed and we are at a clean keyframe boundary. -# need_new_init = ( -# (not self.init_sent) -# or ( -# has_idr -# and ( -# self.init_sps != self.last_sps -# or self.init_pps != self.last_pps -# ) -# ) -# ) -# -# if need_new_init: -# init_segment = self._build_init_segment(self.last_sps, self.last_pps) -# self.init_sps = self.last_sps -# self.init_pps = self.last_pps -# self.init_sent = True -# -# # Init segment is marked as key to make downstream handling simpler. -# yield self._wrap_packet(True, pts_us, init_segment) -# -# sample_nals = [ -# strip_start_code(nal) -# for nal in nals -# if nal_type(nal) not in (7, 8, 9) # SPS / PPS / AUD -# ] -# if not sample_nals: -# continue -# -# sample_data = self._annexb_nals_to_avcc(sample_nals) -# media_segment = self._build_media_segment( -# sample_data=sample_data, -# pts_us=pts_us, -# is_key=bool(has_idr or is_key), -# ) -# -# yield self._wrap_packet(bool(has_idr or is_key), pts_us, media_segment) -# -# def _wrap_packet(self, is_key: bool, pts_us: int, payload: bytes) -> bytes: -# """Wrap one MP4 segment with the existing transport header.""" -# header = struct.pack(">BQ", 1 if is_key else 0, pts_us) -# return header + payload -# -# def _annexb_nals_to_avcc(self, nals: List[bytes]) -> bytes: -# """ -# Convert a list of raw NAL payloads (without start code) into AVCC sample format: -# [length][nal][length][nal]... -# """ -# out = bytearray() -# for nal in nals: -# out.extend(struct.pack(">I", len(nal))) -# out.extend(nal) -# return bytes(out) -# -# def _build_avcc(self, sps: bytes, pps: bytes) -> bytes: -# """ -# Build AVCDecoderConfigurationRecord (avcC) from SPS/PPS. -# """ -# sps_body = strip_start_code(sps) -# pps_body = strip_start_code(pps) -# -# if len(sps_body) < 4: -# raise ValueError("Invalid SPS for avcC") -# -# out = bytearray() -# out.append(0x01) # configurationVersion -# out.append(sps_body[1]) # AVCProfileIndication -# out.append(sps_body[2]) # profile_compatibility -# out.append(sps_body[3]) # AVCLevelIndication -# out.append(0xFF) # lengthSizeMinusOne = 3 (4 bytes) -# out.append(0xE1) # numOfSequenceParameterSets = 1 -# -# out.extend(struct.pack(">H", len(sps_body))) -# out.extend(sps_body) -# -# out.append(0x01) # numOfPictureParameterSets = 1 -# out.extend(struct.pack(">H", len(pps_body))) -# out.extend(pps_body) -# -# return bytes(out) -# -# def _build_init_segment(self, sps: bytes, pps: bytes) -> bytes: -# """ -# Build the MP4 initialization segment: ftyp + moov. -# """ -# avcc = self._build_avcc(sps, pps) -# -# ftyp = self._box( -# b"ftyp", -# b"isom", -# struct.pack(">I", 0x00000200), -# b"isom", -# b"iso6", -# b"mp41", -# ) -# -# avc1 = self._box( -# b"avc1", -# b"\x00" * 6, # reserved -# struct.pack(">H", 1), # data_reference_index -# struct.pack(">H", 0), # pre_defined -# struct.pack(">H", 0), # reserved -# b"\x00" * 12, # pre_defined[3] -# struct.pack(">H", self.width), -# struct.pack(">H", self.height), -# struct.pack(">I", 0x00480000), # horizresolution = 72 dpi -# struct.pack(">I", 0x00480000), # vertresolution = 72 dpi -# struct.pack(">I", 0), # reserved -# struct.pack(">H", 1), # frame_count -# b"\x00" * 32, # compressorname -# struct.pack(">H", 0x0018), # depth -# struct.pack(">H", 0xFFFF), # pre_defined = -1 -# self._box(b"avcC", avcc), -# ) -# -# stsd = self._full_box( -# b"stsd", -# 0, -# 0, -# struct.pack(">I", 1), # entry_count -# avc1, -# ) -# stts = self._full_box(b"stts", 0, 0, struct.pack(">I", 0)) -# stsc = self._full_box(b"stsc", 0, 0, struct.pack(">I", 0)) -# stsz = self._full_box(b"stsz", 0, 0, struct.pack(">I", 0), struct.pack(">I", 0)) -# stco = self._full_box(b"stco", 0, 0, struct.pack(">I", 0)) -# stbl = self._box(b"stbl", stsd, stts, stsc, stsz, stco) -# -# url_ = self._full_box(b"url ", 0, 1) -# dref = self._full_box(b"dref", 0, 0, struct.pack(">I", 1), url_) -# dinf = self._box(b"dinf", dref) -# -# vmhd = self._full_box( -# b"vmhd", -# 0, -# 1, -# struct.pack(">H", 0), -# struct.pack(">H", 0), -# struct.pack(">H", 0), -# struct.pack(">H", 0), -# ) -# -# mdhd = self._full_box( -# b"mdhd", -# 0, -# 0, -# struct.pack(">I", 0), # creation_time -# struct.pack(">I", 0), # modification_time -# struct.pack(">I", self.timescale), -# struct.pack(">I", 0), # duration -# struct.pack(">H", 0x55C4), # language = "und" -# struct.pack(">H", 0), -# ) -# -# hdlr = self._full_box( -# b"hdlr", -# 0, -# 0, -# struct.pack(">I", 0), -# b"vide", -# struct.pack(">I", 0), -# struct.pack(">I", 0), -# struct.pack(">I", 0), -# b"VideoHandler\x00", -# ) -# -# minf = self._box(b"minf", vmhd, dinf, stbl) -# mdia = self._box(b"mdia", mdhd, hdlr, minf) -# -# tkhd = self._full_box( -# b"tkhd", -# 0, -# 7, # track enabled + in movie + in preview -# struct.pack(">I", 0), # creation_time -# struct.pack(">I", 0), # modification_time -# struct.pack(">I", self.track_id), -# struct.pack(">I", 0), # reserved -# struct.pack(">I", 0), # duration -# struct.pack(">I", 0), -# struct.pack(">I", 0), -# struct.pack(">H", 0), # layer -# struct.pack(">H", 0), # alternate_group -# struct.pack(">H", 0), # volume -# struct.pack(">H", 0), # reserved -# self._matrix_bytes(), -# struct.pack(">I", self.width << 16), -# struct.pack(">I", self.height << 16), -# ) -# -# trak = self._box(b"trak", tkhd, mdia) -# -# mvhd = self._full_box( -# b"mvhd", -# 0, -# 0, -# struct.pack(">I", 0), # creation_time -# struct.pack(">I", 0), # modification_time -# struct.pack(">I", self.timescale), -# struct.pack(">I", 0), # duration -# struct.pack(">I", 0x00010000), # rate = 1.0 -# struct.pack(">H", 0x0100), # volume = 1.0 -# struct.pack(">H", 0), -# struct.pack(">I", 0), -# struct.pack(">I", 0), -# self._matrix_bytes(), -# b"\x00" * 24, # pre_defined[6] -# struct.pack(">I", self.track_id + 1), # next_track_id -# ) -# -# trex = self._full_box( -# b"trex", -# 0, -# 0, -# struct.pack(">I", self.track_id), -# struct.pack(">I", 1), # default_sample_description_index -# struct.pack(">I", self.frame_duration), -# struct.pack(">I", 0), # default_sample_size -# struct.pack(">I", 0), # default_sample_flags -# ) -# mvex = self._box(b"mvex", trex) -# -# moov = self._box(b"moov", mvhd, trak, mvex) -# return ftyp + moov -# -# def _build_media_segment(self, sample_data: bytes, pts_us: int, is_key: bool) -> bytes: -# """ -# Build one movie fragment: -# moof + mdat -# -# One sample is packed into one fragment for low-latency streaming. -# """ -# sample_size = len(sample_data) -# sample_flags = 0x02000000 if is_key else 0x01010000 -# -# mfhd = self._full_box( -# b"mfhd", -# 0, -# 0, -# struct.pack(">I", self.sequence_number), -# ) -# -# tfhd = self._full_box( -# b"tfhd", -# 0, -# 0x020000, # default-base-is-moof -# struct.pack(">I", self.track_id), -# ) -# -# tfdt = self._full_box( -# b"tfdt", -# 1, -# 0, -# struct.pack(">Q", pts_us), -# ) -# -# # First pass with placeholder data_offset. -# trun_placeholder = self._full_box( -# b"trun", -# 0, -# 0x000001 | 0x000100 | 0x000200 | 0x000400, -# struct.pack(">I", 1), # sample_count -# struct.pack(">i", 0), # data_offset (patched later) -# struct.pack(">I", self.frame_duration), -# struct.pack(">I", sample_size), -# struct.pack(">I", sample_flags), -# ) -# -# traf_placeholder = self._box(b"traf", tfhd, tfdt, trun_placeholder) -# moof_placeholder = self._box(b"moof", mfhd, traf_placeholder) -# -# # data_offset is from the beginning of moof to the first byte of mdat payload. -# data_offset = len(moof_placeholder) + 8 -# -# trun = self._full_box( -# b"trun", -# 0, -# 0x000001 | 0x000100 | 0x000200 | 0x000400, -# struct.pack(">I", 1), -# struct.pack(">i", data_offset), -# struct.pack(">I", self.frame_duration), -# struct.pack(">I", sample_size), -# struct.pack(">I", sample_flags), -# ) -# -# traf = self._box(b"traf", tfhd, tfdt, trun) -# moof = self._box(b"moof", mfhd, traf) -# mdat = self._box(b"mdat", sample_data) -# -# self.sequence_number += 1 -# return moof + mdat -# -# def _parse_sps_size(self, sps: bytes) -> tuple[int, int]: -# """ -# Parse coded width/height from SPS. -# -# This parser is intentionally limited but sufficient for common AVC streams. -# """ -# sps_body = strip_start_code(sps) -# if len(sps_body) < 4: -# raise ValueError("Invalid SPS") -# -# # Remove NAL header and emulation prevention bytes. -# rbsp = self._ebsp_to_rbsp(sps_body[1:]) -# br = self._BitReader(rbsp) -# -# profile_idc = br.read_bits(8) -# br.read_bits(8) # constraint flags + reserved bits -# br.read_bits(8) # level_idc -# br.read_ue() # seq_parameter_set_id -# -# chroma_format_idc = 1 -# if profile_idc in { -# 100, 110, 122, 244, 44, 83, 86, 118, 128, -# 138, 139, 134, 135 -# }: -# chroma_format_idc = br.read_ue() -# if chroma_format_idc == 3: -# br.read_bits(1) # separate_colour_plane_flag -# br.read_ue() # bit_depth_luma_minus8 -# br.read_ue() # bit_depth_chroma_minus8 -# br.read_bits(1) # qpprime_y_zero_transform_bypass_flag -# seq_scaling_matrix_present_flag = br.read_bits(1) -# if seq_scaling_matrix_present_flag: -# scaling_count = 8 if chroma_format_idc != 3 else 12 -# for idx in range(scaling_count): -# if br.read_bits(1): -# self._skip_scaling_list(br, 16 if idx < 6 else 64) -# -# br.read_ue() # log2_max_frame_num_minus4 -# pic_order_cnt_type = br.read_ue() -# if pic_order_cnt_type == 0: -# br.read_ue() -# elif pic_order_cnt_type == 1: -# br.read_bits(1) -# br.read_se() -# br.read_se() -# num_ref_frames_in_pic_order_cnt_cycle = br.read_ue() -# for _ in range(num_ref_frames_in_pic_order_cnt_cycle): -# br.read_se() -# -# br.read_ue() # max_num_ref_frames -# br.read_bits(1) # gaps_in_frame_num_value_allowed_flag -# -# pic_width_in_mbs_minus1 = br.read_ue() -# pic_height_in_map_units_minus1 = br.read_ue() -# -# frame_mbs_only_flag = br.read_bits(1) -# if not frame_mbs_only_flag: -# br.read_bits(1) # mb_adaptive_frame_field_flag -# -# br.read_bits(1) # direct_8x8_inference_flag -# -# frame_cropping_flag = br.read_bits(1) -# frame_crop_left_offset = 0 -# frame_crop_right_offset = 0 -# frame_crop_top_offset = 0 -# frame_crop_bottom_offset = 0 -# if frame_cropping_flag: -# frame_crop_left_offset = br.read_ue() -# frame_crop_right_offset = br.read_ue() -# frame_crop_top_offset = br.read_ue() -# frame_crop_bottom_offset = br.read_ue() -# -# width = (pic_width_in_mbs_minus1 + 1) * 16 -# height = (pic_height_in_map_units_minus1 + 1) * 16 * (2 - frame_mbs_only_flag) -# -# if chroma_format_idc == 0: -# crop_unit_x = 1 -# crop_unit_y = 2 - frame_mbs_only_flag -# elif chroma_format_idc == 1: -# crop_unit_x = 2 -# crop_unit_y = 2 * (2 - frame_mbs_only_flag) -# elif chroma_format_idc == 2: -# crop_unit_x = 2 -# crop_unit_y = 1 * (2 - frame_mbs_only_flag) -# else: -# crop_unit_x = 1 -# crop_unit_y = 1 * (2 - frame_mbs_only_flag) -# -# width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x -# height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y -# -# return max(width, 16), max(height, 16) -# -# def _skip_scaling_list(self, br: "_BitReader", size_of_scaling_list: int) -> None: -# """Skip one SPS scaling list.""" -# last_scale = 8 -# next_scale = 8 -# for _ in range(size_of_scaling_list): -# if next_scale != 0: -# delta_scale = br.read_se() -# next_scale = (last_scale + delta_scale + 256) % 256 -# last_scale = next_scale if next_scale != 0 else last_scale -# -# def _ebsp_to_rbsp(self, data: bytes) -> bytes: -# """Remove emulation prevention bytes (0x03) from EBSP.""" -# out = bytearray() -# zero_count = 0 -# for b in data: -# if zero_count == 2 and b == 0x03: -# zero_count = 0 -# continue -# out.append(b) -# if b == 0: -# zero_count += 1 -# else: -# zero_count = 0 -# return bytes(out) -# -# def _matrix_bytes(self) -> bytes: -# """Return the standard unity transformation matrix.""" -# return b"".join([ -# struct.pack(">I", 0x00010000), # a -# struct.pack(">I", 0x00000000), # b -# struct.pack(">I", 0x00000000), # u -# struct.pack(">I", 0x00000000), # c -# struct.pack(">I", 0x00010000), # d -# struct.pack(">I", 0x00000000), # v -# struct.pack(">I", 0x00000000), # x -# struct.pack(">I", 0x00000000), # y -# struct.pack(">I", 0x40000000), # w -# ]) -# -# def _box(self, box_type: bytes, *payloads: bytes) -> bytes: -# """Build a generic ISO BMFF box.""" -# payload = b"".join(payloads) -# return struct.pack(">I4s", 8 + len(payload), box_type) + payload -# -# def _full_box(self, box_type: bytes, version: int, flags: int, *payloads: bytes) -> bytes: -# """Build a full box with version and flags.""" -# payload = bytes([version]) + flags.to_bytes(3, "big") + b"".join(payloads) -# return self._box(box_type, payload) - - - -import io -import struct -from fractions import Fraction -from typing import Iterator, List, Optional - -import av -from av.codec import CodecContext - -START_CODE_3 = b"\x00\x00\x01" -START_CODE_4 = b"\x00\x00\x00\x01" - - -def find_nal_units_annexb(data: bytes) -> List[bytes]: - """ - Split one Annex-B byte buffer into NAL units while preserving start codes. - - This helper is intentionally lightweight: - - it is only used on already packetized / parser-produced chunks - - it does not try to repair cross-buffer truncation - """ - positions: List[int] = [] - i = 0 - n = len(data) - - while i < n - 3: - if data[i:i + 4] == START_CODE_4: - positions.append(i) - i += 4 - elif data[i:i + 3] == START_CODE_3: - positions.append(i) - i += 3 - else: - i += 1 - - if not positions: - return [] - - out: List[bytes] = [] - for idx, start in enumerate(positions): - end = positions[idx + 1] if idx + 1 < len(positions) else len(data) - out.append(data[start:end]) - return out - - -def strip_start_code(nal: bytes) -> bytes: - """ - Remove one Annex-B start code prefix if present. - """ - if nal.startswith(START_CODE_4): - return nal[4:] - if nal.startswith(START_CODE_3): - return nal[3:] - return nal - - -def nal_type(nal: bytes) -> int: - """ - Return H.264 NAL unit type for one Annex-B NAL. - """ - body = strip_start_code(nal) - if not body: - return -1 - return body[0] & 0x1F - - -def is_vcl_nal(nal_type_value: int) -> bool: - """ - H.264 VCL slice types used here: - - 1: non-IDR slice - - 5: IDR slice - """ - return nal_type_value in (1, 5) - - -def contains_idr(frame_annexb: bytes) -> bool: - """ - Whether an Annex-B access unit contains an IDR NAL. - """ - for nal in find_nal_units_annexb(frame_annexb): - if nal_type(nal) == 5: - return True - return False - - -def _has_sps(frame_annexb: bytes) -> bool: - for nal in find_nal_units_annexb(frame_annexb): - if nal_type(nal) == 7: - return True - return False - - -def _has_pps(frame_annexb: bytes) -> bool: - for nal in find_nal_units_annexb(frame_annexb): - if nal_type(nal) == 8: - return True - return False - - -def _has_any_vcl(frame_annexb: bytes) -> bool: - for nal in find_nal_units_annexb(frame_annexb): - if is_vcl_nal(nal_type(nal)): - return True - return False - - -def _annexb_frame_to_avcc_sample(frame_annexb: bytes) -> bytes: - """ - Convert one Annex-B access unit into one MP4-compatible H.264 sample payload. - - Output layout: - [len][nal][len][nal]... - - SPS / PPS / AUD are not included in the media sample because the MP4 init - segment should already carry decoder configuration (avcC / extradata). - SEI is preserved. - """ - out = bytearray() - - for nal in find_nal_units_annexb(frame_annexb): - t = nal_type(nal) - if t in (7, 8, 9): # SPS / PPS / AUD - continue - - body = strip_start_code(nal) - if not body: - continue - - out.extend(struct.pack(">I", len(body))) - out.extend(body) - - return bytes(out) - - -class H264AnnexBFramer: - """ - Reframe a continuous H.264 Annex-B byte stream into access-unit-like chunks. - - External contract is intentionally kept unchanged: - - constructor signature stays the same - - decode(chunk) still yields: - [is_key: 1 byte][pts_us: 8 bytes][Annex-B access unit bytes] - - Internal strategy: - - PyAV parser is responsible for raw H.264 packet boundary detection - - this class still keeps a small amount of transport-oriented logic: - * cache SPS/PPS - * group non-VCL prefix NALs with the next VCL access unit - * optionally prepend latest SPS/PPS before IDR output - """ - - def __init__(self, max_fps: int): - self.parser = CodecContext.create("h264", "r") - - self.last_sps: Optional[bytes] = None - self.last_pps: Optional[bytes] = None - - self.pending_prefix: List[bytes] = [] - - self.frame_interval_us = int(1_000_000 / max(max_fps, 1)) - self._pts_us = 0 - - def construct_return_val(self, frame_annexb: bytes) -> bytes: - """ - Build the existing transport packet: - [is_key:1][pts_us:8][frame_annexb] - """ - is_key = 1 if contains_idr(frame_annexb) else 0 - header = struct.pack(">BQ", is_key, self._pts_us) - self._pts_us += self.frame_interval_us - return header + frame_annexb - - def _remember_parameter_sets(self, frame_annexb: bytes) -> None: - """ - Update cached SPS/PPS from one Annex-B chunk. - """ - for nal in find_nal_units_annexb(frame_annexb): - t = nal_type(nal) - if t == 7: - self.last_sps = nal - elif t == 8: - self.last_pps = nal - - def _finalize_access_unit(self, frame_annexb: bytes) -> bytes: - """ - Normalize one output access unit. - - For IDR output, prepend the latest cached SPS/PPS when they are not - already present in the current frame. This keeps browser-side recovery - behaviour close to the original implementation. - """ - self._remember_parameter_sets(frame_annexb) - - if contains_idr(frame_annexb): - prefix = bytearray() - if self.last_sps is not None and not _has_sps(frame_annexb): - prefix.extend(self.last_sps) - if self.last_pps is not None and not _has_pps(frame_annexb): - prefix.extend(self.last_pps) - if prefix: - return bytes(prefix) + frame_annexb - - return frame_annexb - - def decode(self, chunk: bytes) -> Iterator[bytes]: - """ - Feed raw H.264 Annex-B bytes and yield wrapped access units. - - PyAV parser performs the low-level splitting. This method then restores - the previous framing semantics by collecting parameter/AUD/SEI prefix - data until a VCL packet is seen. - """ - for packet in self.parser.parse(chunk): - raw = bytes(packet) - if not raw: - continue - - self._remember_parameter_sets(raw) - - if _has_any_vcl(raw): - # frame_annexb = b"".join(self.pending_prefix) + raw - # self.pending_prefix.clear() - frame_annexb = raw - - frame_annexb = self._finalize_access_unit(frame_annexb) - yield self.construct_return_val(frame_annexb) - else: - self.pending_prefix.append(raw) - - def flush(self) -> Optional[bytes]: - """ - Flush parser tail and pending prefix data. - - The original method returned raw Annex-B bytes (not the wrapped transport - packet), so that behaviour is preserved. - """ - flushed_parts: List[bytes] = [] - - for packet in self.parser.parse(b""): - raw = bytes(packet) - if raw: - flushed_parts.append(raw) - - if self.pending_prefix: - flushed_parts = self.pending_prefix + flushed_parts - self.pending_prefix.clear() - - if not flushed_parts: - return None - - frame_annexb = b"".join(flushed_parts) - return self._finalize_access_unit(frame_annexb) - - -class H264FMP4Framer: - """ - Convert a continuous Annex-B H.264 stream into fragmented MP4 packets. - - External contract is intentionally unchanged: - - constructor signature stays the same - - decode(chunk) still yields: - [is_key: 1 byte][pts_us: 8 bytes][fMP4 bytes] - - Design: - - PyAV parser is used to split the raw Annex-B stream - - PyAV muxer is used to generate the MP4 init segment and media fragments - - a minimal amount of manual logic remains for: - * SPS/PPS tracking - * IDR-aligned muxer reinitialization when stream config changes - * Annex-B -> AVCC sample conversion for one MP4 media sample - """ - - def __init__(self, max_fps: int): - self.parser = av.CodecContext.create("h264", "r") - - self.pending_prefix: List[bytes] = [] - - self.last_sps: Optional[bytes] = None - self.last_pps: Optional[bytes] = None - - self.init_sps: Optional[bytes] = None - self.init_pps: Optional[bytes] = None - - self.timescale = 1_000_000 - self.frame_duration = int(1_000_000 / max(max_fps, 1)) - self._pts_us = 0 - - self._mux_buffer: Optional[io.BytesIO] = None - self._mux_read_pos = 0 - self._mux_container = None - self._mux_stream = None - - def _wrap_packet(self, is_key: bool, pts_us: int, payload: bytes) -> bytes: - """ - Keep the original transport packet format. - """ - header = struct.pack(">BQ", 1 if is_key else 0, pts_us) - return header + payload - - def _remember_parameter_sets(self, frame_annexb: bytes) -> None: - """ - Update cached SPS/PPS from one Annex-B access unit. - """ - for nal in find_nal_units_annexb(frame_annexb): - t = nal_type(nal) - if t == 7: - self.last_sps = nal - elif t == 8: - self.last_pps = nal - - def _with_parameter_sets_for_probe(self, frame_annexb: bytes) -> bytes: - """ - Ensure the probe sample contains SPS/PPS before a keyframe, so that the - temporary raw-H264 input container has enough codec configuration to - produce a correct output stream template. - """ - self._remember_parameter_sets(frame_annexb) - - if not contains_idr(frame_annexb): - return frame_annexb - - prefix = bytearray() - if self.last_sps is not None and not _has_sps(frame_annexb): - prefix.extend(self.last_sps) - if self.last_pps is not None and not _has_pps(frame_annexb): - prefix.extend(self.last_pps) - - return bytes(prefix) + frame_annexb if prefix else frame_annexb - - def _drain_mux_buffer(self) -> bytes: - """ - Read only the newly appended bytes from the output buffer. - """ - if self._mux_buffer is None: - return b"" - - current = self._mux_buffer.getvalue() - if self._mux_read_pos >= len(current): - return b"" - - out = current[self._mux_read_pos:] - self._mux_read_pos = len(current) - return out - - def _close_muxer(self) -> None: - """ - Close the current muxer instance if present. - - Any trailer bytes produced during close are intentionally discarded, - because this class is used for live fragmented streaming, not for - finalized MP4 file writing. - """ - if self._mux_container is not None: - try: - self._mux_container.close() - except Exception: - pass - - self._mux_container = None - self._mux_stream = None - self._mux_buffer = None - self._mux_read_pos = 0 - - def _reset_muxer(self, probe_annexb: bytes) -> bytes: - """ - Recreate the fragmented MP4 muxer from a raw H.264 probe sample. - - The new output stream is created from a temporary raw-H264 input stream - template. This is the most reliable PyAV-level remux setup for preserving - codec parameters without transcoding. - """ - self._close_muxer() - - probe_buffer = io.BytesIO(probe_annexb) - probe_input = av.open(probe_buffer, mode="r", format="h264") - - try: - in_stream = probe_input.streams.video[0] - - self._mux_buffer = io.BytesIO() - self._mux_read_pos = 0 - - self._mux_container = av.open( - self._mux_buffer, - mode="w", - format="mp4", - options={ - "movflags": "empty_moov+frag_every_frame+default_base_moof", - "flush_packets": "1", - }, - ) - - self._mux_stream = self._mux_container.add_stream(template=in_stream) - - # Use the existing transport timestamp unit directly: microseconds. - # Keeping packet time_base explicit avoids implicit rescaling surprises. - self._mux_stream.time_base = Fraction(1, self.timescale) - try: - self._mux_stream.codec_context.time_base = Fraction(1, self.timescale) - except Exception: - # Some builds may not allow touching codec_context.time_base here. - pass - - self._mux_container.start_encoding() - return self._drain_mux_buffer() - - finally: - probe_input.close() - - def decode(self, chunk: bytes) -> Iterator[bytes]: - """ - Feed raw H.264 Annex-B bytes and emit one or more transport packets. - - Emission policy: - - a new init segment is emitted when muxer is first created - - if SPS/PPS changes, a fresh init segment is emitted on the next IDR - - each completed access unit yields one media fragment packet - """ - for parsed_packet in self.parser.parse(chunk): - raw = bytes(parsed_packet) - if not raw: - continue - - self._remember_parameter_sets(raw) - - if _has_any_vcl(raw): - frame_annexb = b"".join(self.pending_prefix) + raw - self.pending_prefix.clear() - else: - self.pending_prefix.append(raw) - continue - - frame_annexb = self._with_parameter_sets_for_probe(frame_annexb) - has_idr = contains_idr(frame_annexb) - - pts_us = self._pts_us - self._pts_us += self.frame_duration - - # We cannot initialize an MP4 stream correctly without SPS/PPS. - if self.last_sps is None or self.last_pps is None: - continue - - need_new_init = ( - self._mux_container is None - or ( - has_idr - and ( - self.init_sps != self.last_sps - or self.init_pps != self.last_pps - ) - ) - ) - - if need_new_init: - # Reinitialize only at a clean keyframe boundary. - if not has_idr: - continue - - init_segment = self._reset_muxer(frame_annexb) - self.init_sps = self.last_sps - self.init_pps = self.last_pps - - if init_segment: - yield self._wrap_packet(True, pts_us, init_segment) - - if self._mux_container is None or self._mux_stream is None: - continue - - sample_payload = _annexb_frame_to_avcc_sample(frame_annexb) - if not sample_payload: - continue - - pkt = av.Packet(sample_payload) - pkt.stream = self._mux_stream - pkt.pts = pts_us - pkt.dts = pts_us - pkt.duration = self.frame_duration - pkt.time_base = Fraction(1, self.timescale) - - self._mux_container.mux_one(pkt) - - media_segment = self._drain_mux_buffer() - if media_segment: - yield self._wrap_packet(has_idr, pts_us, media_segment) - - def close(self) -> None: - """ - Explicit resource cleanup for the internal muxer. - - Optional to call in your current flow, but harmless and useful if you - later add an explicit shutdown hook. - """ - self._close_muxer() diff --git a/service/lib/scrcpy/const.py b/service/lib/scrcpy/const.py deleted file mode 100644 index ba89fa4a1..000000000 --- a/service/lib/scrcpy/const.py +++ /dev/null @@ -1,328 +0,0 @@ -""" -This module includes all consts used in this project -""" - -# Action -ACTION_DOWN = 0 -ACTION_UP = 1 -ACTION_MOVE = 2 - -# KeyCode -KEYCODE_UNKNOWN = 0 -KEYCODE_SOFT_LEFT = 1 -KEYCODE_SOFT_RIGHT = 2 -KEYCODE_HOME = 3 -KEYCODE_BACK = 4 -KEYCODE_CALL = 5 -KEYCODE_ENDCALL = 6 -KEYCODE_0 = 7 -KEYCODE_1 = 8 -KEYCODE_2 = 9 -KEYCODE_3 = 10 -KEYCODE_4 = 11 -KEYCODE_5 = 12 -KEYCODE_6 = 13 -KEYCODE_7 = 14 -KEYCODE_8 = 15 -KEYCODE_9 = 16 -KEYCODE_STAR = 17 -KEYCODE_POUND = 18 -KEYCODE_DPAD_UP = 19 -KEYCODE_DPAD_DOWN = 20 -KEYCODE_DPAD_LEFT = 21 -KEYCODE_DPAD_RIGHT = 22 -KEYCODE_DPAD_CENTER = 23 -KEYCODE_VOLUME_UP = 24 -KEYCODE_VOLUME_DOWN = 25 -KEYCODE_POWER = 26 -KEYCODE_CAMERA = 27 -KEYCODE_CLEAR = 28 -KEYCODE_A = 29 -KEYCODE_B = 30 -KEYCODE_C = 31 -KEYCODE_D = 32 -KEYCODE_E = 33 -KEYCODE_F = 34 -KEYCODE_G = 35 -KEYCODE_H = 36 -KEYCODE_I = 37 -KEYCODE_J = 38 -KEYCODE_K = 39 -KEYCODE_L = 40 -KEYCODE_M = 41 -KEYCODE_N = 42 -KEYCODE_O = 43 -KEYCODE_P = 44 -KEYCODE_Q = 45 -KEYCODE_R = 46 -KEYCODE_S = 47 -KEYCODE_T = 48 -KEYCODE_U = 49 -KEYCODE_V = 50 -KEYCODE_W = 51 -KEYCODE_X = 52 -KEYCODE_Y = 53 -KEYCODE_Z = 54 -KEYCODE_COMMA = 55 -KEYCODE_PERIOD = 56 -KEYCODE_ALT_LEFT = 57 -KEYCODE_ALT_RIGHT = 58 -KEYCODE_SHIFT_LEFT = 59 -KEYCODE_SHIFT_RIGHT = 60 -KEYCODE_TAB = 61 -KEYCODE_SPACE = 62 -KEYCODE_SYM = 63 -KEYCODE_EXPLORER = 64 -KEYCODE_ENVELOPE = 65 -KEYCODE_ENTER = 66 -KEYCODE_DEL = 67 -KEYCODE_GRAVE = 68 -KEYCODE_MINUS = 69 -KEYCODE_EQUALS = 70 -KEYCODE_LEFT_BRACKET = 71 -KEYCODE_RIGHT_BRACKET = 72 -KEYCODE_BACKSLASH = 73 -KEYCODE_SEMICOLON = 74 -KEYCODE_APOSTROPHE = 75 -KEYCODE_SLASH = 76 -KEYCODE_AT = 77 -KEYCODE_NUM = 78 -KEYCODE_HEADSETHOOK = 79 -KEYCODE_PLUS = 81 -KEYCODE_MENU = 82 -KEYCODE_NOTIFICATION = 83 -KEYCODE_SEARCH = 84 -KEYCODE_MEDIA_PLAY_PAUSE = 85 -KEYCODE_MEDIA_STOP = 86 -KEYCODE_MEDIA_NEXT = 87 -KEYCODE_MEDIA_PREVIOUS = 88 -KEYCODE_MEDIA_REWIND = 89 -KEYCODE_MEDIA_FAST_FORWARD = 90 -KEYCODE_MUTE = 91 -KEYCODE_PAGE_UP = 92 -KEYCODE_PAGE_DOWN = 93 -KEYCODE_BUTTON_A = 96 -KEYCODE_BUTTON_B = 97 -KEYCODE_BUTTON_C = 98 -KEYCODE_BUTTON_X = 99 -KEYCODE_BUTTON_Y = 100 -KEYCODE_BUTTON_Z = 101 -KEYCODE_BUTTON_L1 = 102 -KEYCODE_BUTTON_R1 = 103 -KEYCODE_BUTTON_L2 = 104 -KEYCODE_BUTTON_R2 = 105 -KEYCODE_BUTTON_THUMBL = 106 -KEYCODE_BUTTON_THUMBR = 107 -KEYCODE_BUTTON_START = 108 -KEYCODE_BUTTON_SELECT = 109 -KEYCODE_BUTTON_MODE = 110 -KEYCODE_ESCAPE = 111 -KEYCODE_FORWARD_DEL = 112 -KEYCODE_CTRL_LEFT = 113 -KEYCODE_CTRL_RIGHT = 114 -KEYCODE_CAPS_LOCK = 115 -KEYCODE_SCROLL_LOCK = 116 -KEYCODE_META_LEFT = 117 -KEYCODE_META_RIGHT = 118 -KEYCODE_FUNCTION = 119 -KEYCODE_SYSRQ = 120 -KEYCODE_BREAK = 121 -KEYCODE_MOVE_HOME = 122 -KEYCODE_MOVE_END = 123 -KEYCODE_INSERT = 124 -KEYCODE_FORWARD = 125 -KEYCODE_MEDIA_PLAY = 126 -KEYCODE_MEDIA_PAUSE = 127 -KEYCODE_MEDIA_CLOSE = 128 -KEYCODE_MEDIA_EJECT = 129 -KEYCODE_MEDIA_RECORD = 130 -KEYCODE_F1 = 131 -KEYCODE_F2 = 132 -KEYCODE_F3 = 133 -KEYCODE_F4 = 134 -KEYCODE_F5 = 135 -KEYCODE_F6 = 136 -KEYCODE_F7 = 137 -KEYCODE_F8 = 138 -KEYCODE_F9 = 139 -KEYCODE_F10 = 140 -KEYCODE_F11 = 141 -KEYCODE_F12 = 142 -KEYCODE_NUM_LOCK = 143 -KEYCODE_NUMPAD_0 = 144 -KEYCODE_NUMPAD_1 = 145 -KEYCODE_NUMPAD_2 = 146 -KEYCODE_NUMPAD_3 = 147 -KEYCODE_NUMPAD_4 = 148 -KEYCODE_NUMPAD_5 = 149 -KEYCODE_NUMPAD_6 = 150 -KEYCODE_NUMPAD_7 = 151 -KEYCODE_NUMPAD_8 = 152 -KEYCODE_NUMPAD_9 = 153 -KEYCODE_NUMPAD_DIVIDE = 154 -KEYCODE_NUMPAD_MULTIPLY = 155 -KEYCODE_NUMPAD_SUBTRACT = 156 -KEYCODE_NUMPAD_ADD = 157 -KEYCODE_NUMPAD_DOT = 158 -KEYCODE_NUMPAD_COMMA = 159 -KEYCODE_NUMPAD_ENTER = 160 -KEYCODE_NUMPAD_EQUALS = 161 -KEYCODE_NUMPAD_LEFT_PAREN = 162 -KEYCODE_NUMPAD_RIGHT_PAREN = 163 -KEYCODE_VOLUME_MUTE = 164 -KEYCODE_INFO = 165 -KEYCODE_CHANNEL_UP = 166 -KEYCODE_CHANNEL_DOWN = 167 -KEYCODE_ZOOM_IN = 168 -KEYCODE_ZOOM_OUT = 169 -KEYCODE_TV = 170 -KEYCODE_WINDOW = 171 -KEYCODE_GUIDE = 172 -KEYCODE_DVR = 173 -KEYCODE_BOOKMARK = 174 -KEYCODE_CAPTIONS = 175 -KEYCODE_SETTINGS = 176 -KEYCODE_TV_POWER = 177 -KEYCODE_TV_INPUT = 178 -KEYCODE_STB_POWER = 179 -KEYCODE_STB_INPUT = 180 -KEYCODE_AVR_POWER = 181 -KEYCODE_AVR_INPUT = 182 -KEYCODE_PROG_RED = 183 -KEYCODE_PROG_GREEN = 184 -KEYCODE_PROG_YELLOW = 185 -KEYCODE_PROG_BLUE = 186 -KEYCODE_APP_SWITCH = 187 -KEYCODE_BUTTON_1 = 188 -KEYCODE_BUTTON_2 = 189 -KEYCODE_BUTTON_3 = 190 -KEYCODE_BUTTON_4 = 191 -KEYCODE_BUTTON_5 = 192 -KEYCODE_BUTTON_6 = 193 -KEYCODE_BUTTON_7 = 194 -KEYCODE_BUTTON_8 = 195 -KEYCODE_BUTTON_9 = 196 -KEYCODE_BUTTON_10 = 197 -KEYCODE_BUTTON_11 = 198 -KEYCODE_BUTTON_12 = 199 -KEYCODE_BUTTON_13 = 200 -KEYCODE_BUTTON_14 = 201 -KEYCODE_BUTTON_15 = 202 -KEYCODE_BUTTON_16 = 203 -KEYCODE_LANGUAGE_SWITCH = 204 -KEYCODE_MANNER_MODE = 205 -KEYCODE_3D_MODE = 206 -KEYCODE_CONTACTS = 207 -KEYCODE_CALENDAR = 208 -KEYCODE_MUSIC = 209 -KEYCODE_CALCULATOR = 210 -KEYCODE_ZENKAKU_HANKAKU = 211 -KEYCODE_EISU = 212 -KEYCODE_MUHENKAN = 213 -KEYCODE_HENKAN = 214 -KEYCODE_KATAKANA_HIRAGANA = 215 -KEYCODE_YEN = 216 -KEYCODE_RO = 217 -KEYCODE_KANA = 218 -KEYCODE_ASSIST = 219 -KEYCODE_BRIGHTNESS_DOWN = 220 -KEYCODE_BRIGHTNESS_UP = 221 -KEYCODE_MEDIA_AUDIO_TRACK = 222 -KEYCODE_SLEEP = 223 -KEYCODE_WAKEUP = 224 -KEYCODE_PAIRING = 225 -KEYCODE_MEDIA_TOP_MENU = 226 -KEYCODE_11 = 227 -KEYCODE_12 = 228 -KEYCODE_LAST_CHANNEL = 229 -KEYCODE_TV_DATA_SERVICE = 230 -KEYCODE_VOICE_ASSIST = 231 -KEYCODE_TV_RADIO_SERVICE = 232 -KEYCODE_TV_TELETEXT = 233 -KEYCODE_TV_NUMBER_ENTRY = 234 -KEYCODE_TV_TERRESTRIAL_ANALOG = 235 -KEYCODE_TV_TERRESTRIAL_DIGITAL = 236 -KEYCODE_TV_SATELLITE = 237 -KEYCODE_TV_SATELLITE_BS = 238 -KEYCODE_TV_SATELLITE_CS = 239 -KEYCODE_TV_SATELLITE_SERVICE = 240 -KEYCODE_TV_NETWORK = 241 -KEYCODE_TV_ANTENNA_CABLE = 242 -KEYCODE_TV_INPUT_HDMI_1 = 243 -KEYCODE_TV_INPUT_HDMI_2 = 244 -KEYCODE_TV_INPUT_HDMI_3 = 245 -KEYCODE_TV_INPUT_HDMI_4 = 246 -KEYCODE_TV_INPUT_COMPOSITE_1 = 247 -KEYCODE_TV_INPUT_COMPOSITE_2 = 248 -KEYCODE_TV_INPUT_COMPONENT_1 = 249 -KEYCODE_TV_INPUT_COMPONENT_2 = 250 -KEYCODE_TV_INPUT_VGA_1 = 251 -KEYCODE_TV_AUDIO_DESCRIPTION = 252 -KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP = 253 -KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN = 254 -KEYCODE_TV_ZOOM_MODE = 255 -KEYCODE_TV_CONTENTS_MENU = 256 -KEYCODE_TV_MEDIA_CONTEXT_MENU = 257 -KEYCODE_TV_TIMER_PROGRAMMING = 258 -KEYCODE_HELP = 259 -KEYCODE_NAVIGATE_PREVIOUS = 260 -KEYCODE_NAVIGATE_NEXT = 261 -KEYCODE_NAVIGATE_IN = 262 -KEYCODE_NAVIGATE_OUT = 263 -KEYCODE_STEM_PRIMARY = 264 -KEYCODE_STEM_1 = 265 -KEYCODE_STEM_2 = 266 -KEYCODE_STEM_3 = 267 -KEYCODE_DPAD_UP_LEFT = 268 -KEYCODE_DPAD_DOWN_LEFT = 269 -KEYCODE_DPAD_UP_RIGHT = 270 -KEYCODE_DPAD_DOWN_RIGHT = 271 -KEYCODE_MEDIA_SKIP_FORWARD = 272 -KEYCODE_MEDIA_SKIP_BACKWARD = 273 -KEYCODE_MEDIA_STEP_FORWARD = 274 -KEYCODE_MEDIA_STEP_BACKWARD = 275 -KEYCODE_SOFT_SLEEP = 276 -KEYCODE_CUT = 277 -KEYCODE_COPY = 278 -KEYCODE_PASTE = 279 -KEYCODE_SYSTEM_NAVIGATION_UP = 280 -KEYCODE_SYSTEM_NAVIGATION_DOWN = 281 -KEYCODE_SYSTEM_NAVIGATION_LEFT = 282 -KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283 -KEYCODE_KEYCODE_ALL_APPS = 284 -KEYCODE_KEYCODE_REFRESH = 285 -KEYCODE_KEYCODE_THUMBS_UP = 286 -KEYCODE_KEYCODE_THUMBS_DOWN = 287 - -# Event -EVENT_INIT = "init" -EVENT_FRAME = "frame" -EVENT_STREAM_ANNEXB = "stream_annexb" -EVENT_STREAM_FMP4 = "stream_fmp4" -EVENT_DISCONNECT = "disconnect" - -# Type -TYPE_INJECT_KEYCODE = 0 -TYPE_INJECT_TEXT = 1 -TYPE_INJECT_TOUCH_EVENT = 2 -TYPE_INJECT_SCROLL_EVENT = 3 -TYPE_BACK_OR_SCREEN_ON = 4 -TYPE_EXPAND_NOTIFICATION_PANEL = 5 -TYPE_EXPAND_SETTINGS_PANEL = 6 -TYPE_COLLAPSE_PANELS = 7 -TYPE_GET_CLIPBOARD = 8 -TYPE_SET_CLIPBOARD = 9 -TYPE_SET_SCREEN_POWER_MODE = 10 -TYPE_ROTATE_DEVICE = 11 - -# Lock screen orientation -LOCK_SCREEN_ORIENTATION_UNLOCKED = -1 -LOCK_SCREEN_ORIENTATION_INITIAL = -2 -LOCK_SCREEN_ORIENTATION_0 = 0 -LOCK_SCREEN_ORIENTATION_1 = 1 -LOCK_SCREEN_ORIENTATION_2 = 2 -LOCK_SCREEN_ORIENTATION_3 = 3 - -# Screen power mode -POWER_MODE_OFF = 0 -POWER_MODE_NORMAL = 2 diff --git a/service/lib/scrcpy/control.py b/service/lib/scrcpy/control.py deleted file mode 100644 index bc8c73ea3..000000000 --- a/service/lib/scrcpy/control.py +++ /dev/null @@ -1,259 +0,0 @@ -import functools -import socket -import struct -from time import sleep - -from .const import * - - -def inject(control_type: int): - """ - Inject control code, with this inject, we will be able to do unit test - - Args: - control_type: event to send, TYPE_* - """ - - def wrapper(f): - @functools.wraps(f) - def inner(*args, **kwargs): - package = struct.pack(">B", control_type) + f(*args, **kwargs) - if args[0].parent.control_socket is not None: - with args[0].parent.control_socket_lock: - args[0].parent.control_socket.send(package) - return package - - return inner - - return wrapper - - -class ControlSender: - def __init__(self, parent): - self.parent = parent - - @inject(TYPE_INJECT_KEYCODE) - def keycode( - self, keycode: int, action: int = ACTION_DOWN, repeat: int = 0 - ) -> bytes: - """ - Send keycode to device - - Args: - keycode: KEYCODE_* - action: ACTION_DOWN | ACTION_UP - repeat: repeat count - """ - return struct.pack(">Biii", action, keycode, repeat, 0) - - @inject(TYPE_INJECT_TEXT) - def text(self, text: str) -> bytes: - """ - Send text to device - - Args: - text: text to send - """ - - buffer = text.encode("utf-8") - return struct.pack(">i", len(buffer)) + buffer - - @inject(TYPE_INJECT_TOUCH_EVENT) - def touch( - self, - x: int, - y: int, - action: int = ACTION_DOWN, - touch_id: int = 0x1234567887654321, - ) -> bytes: - """ - Touch screen - - Args: - x: horizontal position - y: vertical position - action: ACTION_DOWN | ACTION_UP | ACTION_MOVE - touch_id: Default using virtual id -1, you can specify it to emulate multi finger touch - """ - x, y = max(x, 0), max(y, 0) - return struct.pack( - ">BqiiHHHii", - action, - touch_id, - int(x), - int(y), - int(self.parent.resolution[0]), - int(self.parent.resolution[1]), - 0xFFFF, - 1, - 1, - ) - - @inject(TYPE_INJECT_SCROLL_EVENT) - def scroll(self, x: int, y: int, h: int, v: int) -> bytes: - """ - Scroll screen - - Args: - x: horizontal position - y: vertical position - h: horizontal movement - v: vertical movement - """ - - x, y = max(x, 0), max(y, 0) - return struct.pack( - ">iiHHii", - int(x), - int(y), - int(self.parent.resolution[0]), - int(self.parent.resolution[1]), - int(h), - int(v), - ) - - @inject(TYPE_BACK_OR_SCREEN_ON) - def back_or_turn_screen_on(self, action: int = ACTION_DOWN) -> bytes: - """ - If the screen is off, it is turned on only on ACTION_DOWN - - Args: - action: ACTION_DOWN | ACTION_UP - """ - return struct.pack(">B", action) - - @inject(TYPE_EXPAND_NOTIFICATION_PANEL) - def expand_notification_panel(self) -> bytes: - """ - Expand notification panel - """ - return b"" - - @inject(TYPE_EXPAND_SETTINGS_PANEL) - def expand_settings_panel(self) -> bytes: - """ - Expand settings panel - """ - return b"" - - @inject(TYPE_COLLAPSE_PANELS) - def collapse_panels(self) -> bytes: - """ - Collapse all panels - """ - return b"" - - def get_clipboard(self) -> str: - """ - Get clipboard - """ - # Since this function need socket response, we can't auto inject it any more - s: socket.socket = self.parent.control_socket - - with self.parent.control_socket_lock: - # Flush socket - s.setblocking(False) - while True: - try: - s.recv(1024) - except BlockingIOError: - break - s.setblocking(True) - - # Read package - package = struct.pack(">B", TYPE_GET_CLIPBOARD) - s.send(package) - (code,) = struct.unpack(">B", s.recv(1)) - assert code == 0 - (length,) = struct.unpack(">i", s.recv(4)) - - return s.recv(length).decode("utf-8") - - @inject(TYPE_SET_CLIPBOARD) - def set_clipboard(self, text: str, paste: bool = False) -> bytes: - """ - Set clipboard - - Args: - text: the string you want to set - paste: paste now - """ - buffer = text.encode("utf-8") - return struct.pack(">?i", paste, len(buffer)) + buffer - - @inject(TYPE_SET_SCREEN_POWER_MODE) - def set_screen_power_mode(self, mode: int = POWER_MODE_NORMAL) -> bytes: - """ - Set screen power mode - - Args: - mode: POWER_MODE_OFF | POWER_MODE_NORMAL - """ - return struct.pack(">b", mode) - - @inject(TYPE_ROTATE_DEVICE) - def rotate_device(self) -> bytes: - """ - Rotate device - """ - return b"" - - def swipe( - self, - start_x: int, - start_y: int, - end_x: int, - end_y: int, - move_step_length: int = 5, - move_steps_delay: float = 0.005, - ) -> None: - """ - Swipe on screen - - Args: - start_x: start horizontal position - start_y: start vertical position - end_x: start horizontal position - end_y: end vertical position - move_step_length: length per step - move_steps_delay: sleep seconds after each step - :return: - """ - - self.touch(start_x, start_y, ACTION_DOWN) - next_x = start_x - next_y = start_y - - if end_x > self.parent.resolution[0]: - end_x = self.parent.resolution[0] - - if end_y > self.parent.resolution[1]: - end_y = self.parent.resolution[1] - - decrease_x = True if start_x > end_x else False - decrease_y = True if start_y > end_y else False - while True: - if decrease_x: - next_x -= move_step_length - if next_x < end_x: - next_x = end_x - else: - next_x += move_step_length - if next_x > end_x: - next_x = end_x - - if decrease_y: - next_y -= move_step_length - if next_y < end_y: - next_y = end_y - else: - next_y += move_step_length - if next_y > end_y: - next_y = end_y - - self.touch(next_x, next_y, ACTION_MOVE) - - if next_x == end_x and next_y == end_y: - self.touch(next_x, next_y, ACTION_UP) - break - sleep(move_steps_delay) diff --git a/service/lib/scrcpy/core.py b/service/lib/scrcpy/core.py deleted file mode 100644 index cb738a953..000000000 --- a/service/lib/scrcpy/core.py +++ /dev/null @@ -1,326 +0,0 @@ -import asyncio -import inspect -import socket -import struct -import threading -import time -from pathlib import Path -from time import sleep -from typing import Any, Callable, Optional, Tuple - -import numpy as np -from adbutils import AdbConnection, AdbDevice, AdbError, Network - -from .codec import H264AnnexBFramer, H264FMP4Framer -from .const import ( - EVENT_DISCONNECT, - EVENT_STREAM_ANNEXB, - EVENT_STREAM_FMP4, - EVENT_INIT, - LOCK_SCREEN_ORIENTATION_UNLOCKED, -) -from .control import ControlSender - - -class ScrcpyClient: - device: AdbDevice - - def __init__( - self, - device: AdbDevice, - max_width: int = 0, - bitrate: int = 8000000, - max_fps: int = 0, - flip: bool = False, - block_frame: bool = False, - stay_awake: bool = False, - lock_screen_orientation: int = LOCK_SCREEN_ORIENTATION_UNLOCKED, - connection_timeout: int = 3000, - encoder_name: Optional[str] = None, - codec_name: Optional[str] = None, - ): - """ - Create a scrcpy client, this client won't be started until you call the start function - - Args: - device: Android device, required. - max_width: frame width that will be broadcast from android server - bitrate: bitrate - max_fps: maximum fps, 0 means not limited (supported after android 10) - flip: flip the video - block_frame: only return nonempty frames - stay_awake: keep Android device awake - lock_screen_orientation: lock screen orientation, LOCK_SCREEN_ORIENTATION_* - connection_timeout: timeout for connection, unit is ms - encoder_name: encoder name, enum: [OMX.google.h264.encoder, OMX.qcom.video.encoder.avc, c2.qti.avc.encoder, c2.android.avc.encoder], default is None (Auto) - codec_name: codec name, enum: [h264, h265, av1], default is None (Auto) - """ - # Check Params - assert max_width >= 0, "max_width must be greater than or equal to 0" - assert bitrate >= 0, "bitrate must be greater than or equal to 0" - assert max_fps >= 0, "max_fps must be greater than or equal to 0" - assert ( - -1 <= lock_screen_orientation <= 3 - ), "lock_screen_orientation must be LOCK_SCREEN_ORIENTATION_*" - assert ( - connection_timeout >= 0 - ), "connection_timeout must be greater than or equal to 0" - assert encoder_name in [ - None, - "OMX.google.h264.encoder", - "OMX.qcom.video.encoder.avc", - "c2.qti.avc.encoder", - "c2.android.avc.encoder", - ] - assert codec_name in [None, "h264", "h265", "av1"] - - # Params - self.flip = flip - self.device = device - self.max_width = max_width #= 720 - self.bitrate = bitrate - self.max_fps = max_fps = 60 - self.block_frame = block_frame - self.stay_awake = stay_awake - self.lock_screen_orientation = lock_screen_orientation - self.connection_timeout = connection_timeout - self.encoder_name = encoder_name - self.codec_name = codec_name - - self.framer = { - "AnnexB": H264AnnexBFramer(max_fps if max_fps > 0 else 30), - "fMP4" : H264FMP4Framer(max_fps if max_fps > 0 else 30), - } - self.listeners = dict(frame=[], init=[], disconnect=[], stream_annexb=[], stream_fmp4=[]) - - # User accessible - self.last_frame: Optional[np.ndarray] = None - self.resolution: Optional[Tuple[int, int]] = None - self.device_name: Optional[str] = None - self.control = ControlSender(self) - - # Need to destroy - self.alive = False - self.__server_stream: Optional[AdbConnection] = None - self.__video_socket: Optional[socket.socket] = None - self.control_socket: Optional[socket.socket] = None - self.control_socket_lock = threading.Lock() - - self.stream_loop_thread = None - - def __init_server_connection(self) -> None: - """ - Connect to android server, there will be two sockets, video and control socket. - This method will set: video_socket, control_socket, resolution variables - """ - for _ in range(self.connection_timeout // 100): - try: - self.__video_socket = self.device.create_connection( - Network.LOCAL_ABSTRACT, "scrcpy" - ) - break - except AdbError: - sleep(0.1) - pass - else: - raise ConnectionError("Failed to connect scrcpy-server after 3 seconds") - - if self.__video_socket is None: - raise ConnectionError("Unexpected Null Video Socket!") - - dummy_byte = self.__video_socket.recv(1) - if not len(dummy_byte) or dummy_byte != b"\x00": - raise ConnectionError("Did not receive Dummy Byte!") - - self.control_socket = self.device.create_connection( - Network.LOCAL_ABSTRACT, "scrcpy" - ) - self.device_name = self.__video_socket.recv(64).decode("utf-8").rstrip("\x00") - if self.device_name == "": - raise ConnectionError("Did not receive Device Name!") - - res = self.__video_socket.recv(4) - self.resolution = struct.unpack(">HH", res) - self.__video_socket.setblocking(False) - - def __deploy_server(self) -> None: - """ - Deploy server to android device - """ - jar_name = "scrcpy-server.jar" - root_path = Path(__file__).parent.parent.parent.parent - server_file_path = root_path / "src" / "scrcpy_bin" / jar_name - self.device.sync.push(server_file_path, f"/data/local/tmp/{jar_name}") - commands = [ - f"CLASSPATH=/data/local/tmp/{jar_name}", - "app_process", - "/", - "com.genymobile.scrcpy.Server", - "2.4", # Scrcpy server version - "log_level=info", - f"max_size={self.max_width}", - f"max_fps={self.max_fps}", - f"video_bit_rate={self.bitrate}", - f"video_encoder={self.encoder_name}" - if self.encoder_name - else "video_encoder=OMX.google.h264.encoder", - f"video_codec={self.codec_name}" if self.codec_name else "video_codec=h264", - "tunnel_forward=true", - "send_frame_meta=false", - "control=true", - "audio=false", - "show_touches=false", - "stay_awake=false", - "power_off_on_close=false", - "clipboard_autosync=false", - ] - - self.device = self.device - - fetched_response = self.device.shell( - commands, - stream=True, - ) - - assert isinstance(fetched_response, AdbConnection), \ - "Unexpected Type: {}".format(type(fetched_response)) - - self.__server_stream: AdbConnection = fetched_response - - assert self.__server_stream is not None, \ - "Did not receive Server Stream!" - - # Wait for server to start - self.__server_stream.read(10) - - async def start(self, daemon_threaded: bool = False) -> None: - """ - Start listening video stream - - Args: - daemon_threaded: Run stream loop in a daemon thread to avoid blocking - """ - if self.stream_loop_thread: return - self.stream_loop_thread = threading.Thread( - target=asyncio.run, args=(self.__stream_loop(),), daemon=daemon_threaded - ) - self.stream_loop_thread.start() - - async def init(self): - assert self.alive is False - self.__deploy_server() - self.__init_server_connection() - self.alive = True - await self.__send_to_listeners(EVENT_INIT) - return self - - # noinspection PyBroadException - def stop(self) -> None: - """ - Stop listening (both threaded and blocked) - """ - self.alive = False - if self.__server_stream is not None: - try: - self.__server_stream.close() - except Exception: - pass - - if self.control_socket is not None: - try: - self.control_socket.close() - except Exception: - pass - - if self.__video_socket is not None: - try: - self.__video_socket.close() - except Exception: - pass - self.stream_loop_thread = None - - async def __stream_loop(self) -> None: - trace_1 = [0, 0] - while self.alive: - try: - if self.__video_socket is None: - raise ConnectionError("Did not receive Video Stream!") - - raw_h264 = self.__video_socket.recv(0x10000) - if raw_h264 == b"": - raise ConnectionError("Video stream is disconnected") - - if self.any_listener(EVENT_STREAM_ANNEXB): - perf_1 = time.perf_counter() - for to_send_content in self.framer["AnnexB"].decode(raw_h264): - await self.__send_to_listeners(EVENT_STREAM_ANNEXB, to_send_content) - perf_2 = time.perf_counter() - trace_1[0] = (trace_1[0] * trace_1[1] + perf_2 - perf_1) / (trace_1[1] + 1) - trace_1[1] = trace_1[1] + 1 - - if trace_1[1] %100 == 0 : - print("trace #1 => ", trace_1[0]) - if self.any_listener(EVENT_STREAM_FMP4): - for to_send_content in self.framer["fMP4"].decode(raw_h264): - await self.__send_to_listeners(EVENT_STREAM_FMP4, to_send_content) - - - except BlockingIOError: - await asyncio.sleep(0.01) - - except (ConnectionError, OSError): - import traceback - traceback.print_exc() - print("++++++++++++++++++++++++++++++++++++++++") - if self.alive: - await self.__send_to_listeners(EVENT_DISCONNECT) - - except Exception: - import traceback - traceback.print_exc() - print("========================================") - self.alive = False - - def add_listener(self, cls: str, listener: Callable[..., Any]) -> None: - """ - Add a video listener - - Args: - :param cls: Listener category, support: init, frame - :param listener:A function to receive frame np.ndarray - """ - self.listeners[cls].append(listener) - - def remove_listener(self, cls: str, listener: Callable[..., Any]) -> None: - """ - Remove a video listener - - Args: - cls: Listener category, support: init, frame - listener: A function to receive frame np.ndarray - """ - if listener in self.listeners[cls]: - self.listeners[cls].remove(listener) - - def has_listener(self, cls: str, listener: Callable[..., Any]) -> bool: - return listener in self.listeners[cls] - - def any_listener(self, cls: str) -> bool: - return len(self.listeners[cls]) > 0 - - async def __send_to_listeners(self, cls: str, *args, **kwargs) -> None: - loop = asyncio.get_running_loop() - tasks = [] - - for fun in list(self.listeners.get(cls, [])): - # noinspection PyBroadException - try: - result = fun(*args, **kwargs) - if inspect.isawaitable(result): - tasks.append(loop.create_task(result)) # type:ignore - except Exception: - import traceback - traceback.print_exc() - - if tasks: - await asyncio.gather(*tasks, return_exceptions=True) diff --git a/service/lib/scrcpy/scrcpy-server.jar b/service/lib/scrcpy/scrcpy-server.jar new file mode 100644 index 0000000000000000000000000000000000000000..d544a28b4d7ef83405d266feb6e43a6ad895180a GIT binary patch literal 114470 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 Date: Sun, 7 Jun 2026 03:06:42 +0800 Subject: [PATCH 18/98] Feat: Support login persistence --- service/app.py | 122 ++++++++++++++++++++++++++++---- service/encryption.py | 159 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 263 insertions(+), 18 deletions(-) diff --git a/service/app.py b/service/app.py index 2f6d559d3..80d8d06a7 100644 --- a/service/app.py +++ b/service/app.py @@ -3,12 +3,14 @@ import asyncio import contextlib import json +import os import time from contextlib import suppress from pathlib import Path from typing import Any, Dict +from urllib.parse import urlparse -from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect +from fastapi import FastAPI, HTTPException, Request, Response, WebSocket, WebSocketDisconnect from starlette.middleware.cors import CORSMiddleware # from starlette.staticfiles import StaticFiles @@ -27,6 +29,8 @@ from .messages import CommandMessage, ProviderRequest, SyncPatchMessage, SyncPullMessage PROJECT_ROOT = Path(__file__).resolve().parent.parent +REMEMBER_COOKIE_NAME = "baas_remember" +REMEMBER_COOKIE_MAX_AGE = int(os.getenv("BAAS_REMEMBER_TTL_SECONDS", str(60 * 60 * 24 * 180))) context = ServiceContext(PROJECT_ROOT) @@ -41,7 +45,10 @@ async def lifespan(app: FastAPI): app.add_middleware( CORSMiddleware, # type: ignore - allow_origins=["*"], + allow_origin_regex=os.getenv( + "BAAS_SERVICE_CORS_ORIGIN_REGEX", + r"https?://(localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\]|10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3})(:\d+)?", + ), allow_credentials=True, allow_methods=["*"], allow_headers=["*"], @@ -52,6 +59,48 @@ def _json_bytes(payload: dict[str, Any]) -> bytes: return json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") +def _is_allowed_origin(origin: str | None, host: str | None) -> bool: + if not origin: + return True + allowed = {item.strip() for item in os.getenv("BAAS_SERVICE_ALLOWED_ORIGINS", "").split(",") if item.strip()} + if origin in allowed: + return True + parsed = urlparse(origin) + origin_host = parsed.hostname + host_value = host or "" + if host_value.startswith("[") and "]" in host_value: + request_host = host_value[1:].split("]", 1)[0] + else: + request_host = host_value.split(":", 1)[0] + if origin_host in {"localhost", "127.0.0.1", "::1"}: + return True + return bool(origin_host and request_host and origin_host == request_host) + + +def _cookie_secure(request: Request) -> bool: + forced = os.getenv("BAAS_REMEMBER_COOKIE_SECURE") + if forced is not None: + return forced.lower() in {"1", "true", "yes", "on"} + return request.url.scheme == "https" + + +def _auth_ok_payload(session: ActiveSession, *, include_session_secrets: bool = False) -> dict[str, Any]: + payload = { + "type": "auth_ok", + "protocol_version": PROTOCOL_VERSION, + "session_id": session.session_id, + "resume_ticket": context.auth_manager.issue_resume_ticket(session), + "expires_at": session.expires_at, + "pwd_epoch": session.pwd_epoch, + "pwd_salt": context.auth_manager.password_state.as_public_dict()["pwd_salt"], + "argon2": context.auth_manager.password_state.as_public_dict()["argon2"], + } + if include_session_secrets: + payload["master_secret"] = b64e(session.master_secret) + payload["resume_secret"] = b64e(session.resume_secret) + return payload + + async def _send_stream_json(websocket: WebSocket, stream: SecretStreamBox, payload: dict[str, Any]) -> None: await websocket.send_bytes(stream.encrypt(_json_bytes(payload))) @@ -64,6 +113,9 @@ async def _recv_stream_json(websocket: WebSocket, stream: SecretStreamBox) -> di async def _begin_server_hello(websocket: WebSocket, *, kind: str, channel: str) -> tuple[ HandshakeContext, JsonChaChaChannel, dict[str, Any]]: + if not _is_allowed_origin(websocket.headers.get("origin"), websocket.headers.get("host")): + await websocket.close(code=4403, reason="Origin is not allowed") + raise AuthenticationError("Origin is not allowed") await websocket.accept() hello = await websocket.receive_json() handshake, response = context.auth_manager.issue_server_hello(hello, kind=kind, channel=channel) @@ -86,6 +138,25 @@ async def _finalize_control_auth( preauth_channel: JsonChaChaChannel, request: dict[str, Any], ) -> tuple[ActiveSession, JsonChaChaChannel]: + include_session_secrets = False + if request.get("type") == "resume_control": + token = websocket.cookies.get(REMEMBER_COOKIE_NAME, "") + if token: + try: + session, control_channel = context.auth_manager.resume_control_session(handshake, token) + include_session_secrets = True + except AuthenticationError: + session = control_channel = None # type: ignore[assignment] + else: + await websocket.send_json( + preauth_channel.encrypt( + _auth_ok_payload(session, include_session_secrets=include_session_secrets) + ) + ) + return session, control_channel + await websocket.send_json(preauth_channel.encrypt({"type": "resume_unavailable"})) + request = preauth_channel.decrypt(await websocket.receive_json()) + if not context.auth_manager.password_state.initialized: if request.get("type") != "initialize": raise AuthenticationError("Initialization is required") @@ -100,18 +171,7 @@ async def _finalize_control_auth( proof=_decode_control_auth_proof(request), ) await websocket.send_json( - preauth_channel.encrypt( - { - "type": "auth_ok", - "protocol_version": PROTOCOL_VERSION, - "session_id": session.session_id, - "resume_ticket": context.auth_manager.issue_resume_ticket(session), - "expires_at": session.expires_at, - "pwd_epoch": session.pwd_epoch, - "pwd_salt": context.auth_manager.password_state.as_public_dict()["pwd_salt"], - "argon2": context.auth_manager.password_state.as_public_dict()["argon2"], - } - ) + preauth_channel.encrypt(_auth_ok_payload(session, include_session_secrets=include_session_secrets)) ) return session, control_channel @@ -160,6 +220,40 @@ async def _control_heartbeat_sender( pass +@app.post("/auth/remember") +async def remember_auth(request: Request, response: Response, payload: dict[str, Any]) -> Dict[str, Any]: + try: + session_id = str(payload.get("session_id", "")) + proof = b64d(str(payload.get("proof", ""))) + session = context.auth_manager.verify_remember_proof(session_id=session_id, proof=proof) + token, expires_at = context.auth_manager.issue_remember_token(session) + except AuthenticationError as exc: + raise HTTPException(status_code=401, detail=str(exc)) from exc + max_age = max(0, min(REMEMBER_COOKIE_MAX_AGE, int(expires_at - time.time()))) + response.set_cookie( + REMEMBER_COOKIE_NAME, + token, + max_age=max_age, + httponly=True, + secure=_cookie_secure(request), + samesite="lax", + path="/", + ) + return {"ok": True, "expires_at": expires_at} + + +@app.post("/auth/logout") +async def logout_auth(request: Request, response: Response) -> Dict[str, Any]: + response.delete_cookie( + REMEMBER_COOKIE_NAME, + httponly=True, + secure=_cookie_secure(request), + samesite="lax", + path="/", + ) + return {"ok": True} + + @app.get("/health") async def health() -> Dict[str, Any]: statuses = context.runtime.current_status() diff --git a/service/encryption.py b/service/encryption.py index 453af8749..ffb3eef25 100644 --- a/service/encryption.py +++ b/service/encryption.py @@ -31,6 +31,7 @@ PROTOCOL_VERSION = 1 SESSION_TTL_SECONDS = 60 * 60 * 12 +REMEMBER_TTL_SECONDS = int(os.getenv("BAAS_REMEMBER_TTL_SECONDS", str(60 * 60 * 24 * 180))) DEFAULT_SIGNING_SEED_B64 = "SWWTs4OxttQrw_o89jtIM1pj8lhJEomLzfUEbsHjJS4=" DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64 = "_GMKcfOCE-0_erXPJQRQv6mLiNBnT3tdHmAaXwWRis4=" @@ -87,7 +88,7 @@ def _session_nonce(seq: int) -> bytes: return seq.to_bytes(12, "big", signed=False) -@dataclass(slots=True) +@dataclass class PasswordState: initialized: bool = False pwd_epoch: int = 0 @@ -109,7 +110,7 @@ def as_public_dict(self) -> dict[str, Any]: } -@dataclass(slots=True) +@dataclass class ActiveSession: session_id: str created_at: float @@ -120,7 +121,16 @@ class ActiveSession: control_queues: set[asyncio.Queue] = field(default_factory=set) -@dataclass(slots=True) +@dataclass +class RememberedLogin: + token_id: str + token_hash: bytes + created_at: float + expires_at: float + pwd_epoch: int + + +@dataclass class HandshakeContext: kind: str channel: str @@ -224,9 +234,11 @@ def __init__(self, project_root: Path) -> None: self._config_dir.mkdir(exist_ok=True) self._state_file = self._config_dir / "service_auth.json" self._ticket_file = self._config_dir / "service_ticket.key" + self._remembered_file = self._config_dir / "service_remembered_logins.json" self._signing_file = self._config_dir / "service_signing_key.bin" self._lock = threading.RLock() self._sessions: dict[str, ActiveSession] = {} + self._remembered_logins: dict[str, RememberedLogin] = {} self._password_state = self._load_password_state() self._signing_key = self._load_signing_key() @@ -236,6 +248,7 @@ def __init__(self, project_root: Path) -> None: env_name="BAAS_SERVICE_TICKET_KEY_B64", default_factory=lambda: secrets.token_bytes(32), ) + self._remembered_logins = self._load_remembered_logins() @property def password_state(self) -> PasswordState: @@ -357,6 +370,53 @@ def issue_resume_ticket(self, session: ActiveSession) -> str: signature = hmac_sha256(self._ticket_key, payload) return f"{b64e(payload)}.{b64e(signature)}" + def verify_remember_proof(self, *, session_id: str, proof: bytes) -> ActiveSession: + session = self.get_session(session_id) + expected = hmac_sha256( + session.resume_secret, + canonical_dumps( + { + "type": "remember_session", + "session_id": session.session_id, + "pwd_epoch": session.pwd_epoch, + } + ), + ) + if not hmac.compare_digest(expected, proof): + raise AuthenticationError("Remember-session proof verification failed") + return session + + def issue_remember_token(self, session: ActiveSession) -> tuple[str, float]: + token_id = uuid.uuid4().hex + token_secret = secrets.token_bytes(32) + now = time.time() + expires_at = now + REMEMBER_TTL_SECONDS + remembered = RememberedLogin( + token_id=token_id, + token_hash=self._remember_token_hash(token_id, token_secret), + created_at=now, + expires_at=expires_at, + pwd_epoch=session.pwd_epoch, + ) + with self._lock: + self._prune_expired_remembered_locked(now) + self._remembered_logins[token_id] = remembered + self._save_remembered_logins() + return f"v1.{token_id}.{b64e(token_secret)}", expires_at + + def resume_control_session(self, handshake: HandshakeContext, remember_token: str) -> tuple[ActiveSession, JsonChaChaChannel]: + remembered = self._verify_remember_token(remember_token) + if remembered.pwd_epoch != self._password_state.pwd_epoch: + raise AuthenticationError("Remembered login epoch is stale") + master_secret = secrets.token_bytes(32) + resume_secret = hkdf_sha256(master_secret, b"resume-secret", 32, handshake.transcript_hash) + session = self._new_session_from_secrets( + pwd_epoch=remembered.pwd_epoch, + master_secret=master_secret, + resume_secret=resume_secret, + ) + return session, self._build_control_channel(session) + def subscribe_control(self, session_id: str) -> asyncio.Queue: queue: asyncio.Queue = asyncio.Queue() with self._lock: @@ -378,6 +438,8 @@ async def change_password(self, *, session_id: str, new_password: str, reason: s next_epoch = session.pwd_epoch + 1 self._password_state = self._password_state_for(password=new_password, epoch=next_epoch) self._save_password_state() + self._remembered_logins.clear() + self._save_remembered_logins() queues = self._collect_revocation_queues(reason=reason, pwd_epoch=next_epoch) await self._publish_queues(queues) return self._password_state @@ -389,6 +451,8 @@ async def force_reset_password(self, new_password: str, *, reason: str = "passwo next_epoch = max(self._password_state.pwd_epoch, 0) + 1 self._password_state = self._password_state_for(password=new_password, epoch=next_epoch) self._save_password_state() + self._remembered_logins.clear() + self._save_remembered_logins() queues = self._collect_revocation_queues(reason=reason, pwd_epoch=next_epoch) await self._publish_queues(queues) return self._password_state @@ -480,12 +544,19 @@ def _new_session(self, handshake: HandshakeContext, password_state: PasswordStat handshake.transcript_hash, ) resume_secret = hkdf_sha256(master_secret, b"resume-secret", 32, handshake.transcript_hash) + return self._new_session_from_secrets( + pwd_epoch=password_state.pwd_epoch, + master_secret=master_secret, + resume_secret=resume_secret, + ) + + def _new_session_from_secrets(self, *, pwd_epoch: int, master_secret: bytes, resume_secret: bytes) -> ActiveSession: now = time.time() session = ActiveSession( session_id=uuid.uuid4().hex, created_at=now, expires_at=now + SESSION_TTL_SECONDS, - pwd_epoch=password_state.pwd_epoch, + pwd_epoch=pwd_epoch, master_secret=master_secret, resume_secret=resume_secret, ) @@ -528,6 +599,50 @@ def _verify_resume_ticket(self, session_id: str, token: str) -> ActiveSession: raise AuthenticationError("Resume ticket epoch mismatch") return session + def _verify_remember_token(self, token: str) -> RememberedLogin: + try: + version, token_id, secret_b64 = token.split(".", 2) + token_secret = b64d(secret_b64) + except Exception as exc: # noqa: BLE001 - normalized below + raise AuthenticationError("Malformed remember token") from exc + if version != "v1" or not token_id: + raise AuthenticationError("Unsupported remember token") + now = time.time() + with self._lock: + self._prune_expired_remembered_locked(now) + remembered = self._remembered_logins.get(token_id) + if remembered is None: + raise AuthenticationError("Unknown remembered login") + expected = self._remember_token_hash(token_id, token_secret) + if not hmac.compare_digest(expected, remembered.token_hash): + raise AuthenticationError("Remember token verification failed") + if remembered.expires_at < now: + self._remembered_logins.pop(token_id, None) + self._save_remembered_logins() + raise AuthenticationError("Remembered login has expired") + if remembered.pwd_epoch != self._password_state.pwd_epoch: + raise AuthenticationError("Remembered login epoch mismatch") + return remembered + + def _remember_token_hash(self, token_id: str, token_secret: bytes) -> bytes: + return hmac_sha256( + self._ticket_key, + b"remember-token:" + token_id.encode("utf-8") + b":" + token_secret, + ) + + def _prune_expired_remembered_locked(self, now: float | None = None) -> None: + current = time.time() if now is None else now + expired = [ + token_id + for token_id, remembered in self._remembered_logins.items() + if remembered.expires_at < current + ] + if not expired: + return + for token_id in expired: + self._remembered_logins.pop(token_id, None) + self._save_remembered_logins() + def _auth_context(self, handshake: HandshakeContext, pwd_epoch: int) -> bytes: return hkdf_sha256( handshake.shared_key, @@ -603,6 +718,42 @@ def _save_password_state(self) -> None: encoding="utf-8", ) + def _load_remembered_logins(self) -> dict[str, RememberedLogin]: + if not self._remembered_file.exists(): + return {} + payload = json.loads(self._remembered_file.read_text(encoding="utf-8")) + remembered: dict[str, RememberedLogin] = {} + for item in payload.get("logins", []): + token_id = str(item.get("token_id", "")) + if not token_id: + continue + remembered[token_id] = RememberedLogin( + token_id=token_id, + token_hash=b64d(item["token_hash"]), + created_at=float(item.get("created_at", 0)), + expires_at=float(item.get("expires_at", 0)), + pwd_epoch=int(item.get("pwd_epoch", 0)), + ) + return remembered + + def _save_remembered_logins(self) -> None: + payload = { + "logins": [ + { + "token_id": remembered.token_id, + "token_hash": b64e(remembered.token_hash), + "created_at": remembered.created_at, + "expires_at": remembered.expires_at, + "pwd_epoch": remembered.pwd_epoch, + } + for remembered in self._remembered_logins.values() + ] + } + self._remembered_file.write_text( + json.dumps(payload, indent=2, ensure_ascii=False), + encoding="utf-8", + ) + def _load_signing_key(self) -> Ed25519PrivateKey: env_seed = os.getenv("BAAS_SERVICE_SIGN_SEED_B64") if env_seed: From 307c760e4cd797c269a7da1599edde9a860cd14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 11 Jun 2026 15:52:04 +0800 Subject: [PATCH 19/98] Update: Toml Dependency Updated --- pyproject.toml | 49 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8d284906c..5e39c7b36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,10 +3,16 @@ name = "blue_archive_auto_script" version = "1.4.3" description = "用于实现蔚蓝档案自动化" authors = [{ name = "pur1fying", email = "2274916027@qq.com" }] -dependencies = [ +dependencies = [] +requires-python = ">=3.9" +readme = "README.md" +license = { text = "GPL-3.0-only" } + +[project.optional-dependencies] +pyqt = [ + "setuptools <= 80.10.2", "lmdb", - "pyqt5==5.15.11", - "pyqt5-qt5==5.15.2", + "PyQt5 == 5.15.11", "numpy < 2.0", "av == 12.0.0", "imgaug", @@ -17,7 +23,7 @@ dependencies = [ "PyQt-Fluent-Widgets == 1.2.0", "pyinstaller", "requests", - "dulwich", + "pygit2", "psutil", "tqdm", "tomli == 2.2.1", @@ -25,9 +31,34 @@ dependencies = [ "PyAutoGUI == 0.9.54", "mss == 10.0.0", "rich >= 14.2.0", - "PyNaCl >= 1.6.1", - "setuptools <= 80.10.2" ] -requires-python = ">=3.9" -readme = "README.md" -license = { text = "GPL-3.0-only" } + +service = [ + "numpy < 2.0", + "av == 12.0.0", + "setuptools; sys_platform == 'win32'", + "setuptools == 80.10.2; sys_platform == 'linux'", + "adbutils == 2.2.1", + "uiautomator2 == 2.16.23", + "opencv-python == 4.8.1.78", + "psutil", + "requests", + "rich >= 14.2.0", + "tomli == 2.2.1", + "tomli_w == 1.2.0", + "mss == 10.0.0", + "PyAutoGUI == 0.9.54", + "pygit2", + "fastapi", + "uvicorn", + "websockets", + "watchfiles", + "cryptography", + "PyNaCl", +] + +i18n = [ + "bs4", + "lxml", + "translators", +] From 6d5e42fddae5e548a7d65d0f01a82546cb1fbfde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 11 Jun 2026 16:24:50 +0800 Subject: [PATCH 20/98] Fix: Adb requires pkg_resources-equipped setuptools --- deploy/service/requirements.service.windows.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/service/requirements.service.windows.txt b/deploy/service/requirements.service.windows.txt index 62a999f54..5485a6fad 100644 --- a/deploy/service/requirements.service.windows.txt +++ b/deploy/service/requirements.service.windows.txt @@ -2,7 +2,7 @@ # Core Utils # numpy < 2.0 # av == 12.0.0 # -setuptools # +setuptools == 80.10.2 # adbutils == 2.2.1 # uiautomator2 == 2.16.23 # opencv-python == 4.8.1.78 # From 84204cd415eaf6134f2650ddecbd1d882db9264a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sat, 13 Jun 2026 21:33:22 +0800 Subject: [PATCH 21/98] Fix: Tauri Origin Wrongly Banned --- service/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/app.py b/service/app.py index 80d8d06a7..08f56a626 100644 --- a/service/app.py +++ b/service/app.py @@ -47,7 +47,7 @@ async def lifespan(app: FastAPI): CORSMiddleware, # type: ignore allow_origin_regex=os.getenv( "BAAS_SERVICE_CORS_ORIGIN_REGEX", - r"https?://(localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\]|10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3})(:\d+)?", + r"^https?://(localhost|tauri\.localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\]|10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3})(:\d+)?$", ), allow_credentials=True, allow_methods=["*"], @@ -72,7 +72,7 @@ def _is_allowed_origin(origin: str | None, host: str | None) -> bool: request_host = host_value[1:].split("]", 1)[0] else: request_host = host_value.split(":", 1)[0] - if origin_host in {"localhost", "127.0.0.1", "::1"}: + if origin_host in {"localhost", "127.0.0.1", "::1", "tauri.localhost"}: return True return bool(origin_host and request_host and origin_host == request_host) From f71a83cdf192b69f51b101741eb8c4501d2312f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 15 Jun 2026 00:04:32 +0800 Subject: [PATCH 22/98] Refactor: improve service code readability --- docs/develop_doc/service_mode.md | 78 ++ pyproject.toml | 11 +- service/README.md | 46 ++ service/api/__init__.py | 1 + service/api/commands.py | 104 +++ service/api/http.py | 62 ++ service/api/security.py | 229 ++++++ service/api/state.py | 29 + service/api/ws_control.py | 80 ++ service/api/ws_provider.py | 87 ++ service/api/ws_remote.py | 32 + service/api/ws_sync.py | 104 +++ service/api/ws_trigger.py | 46 ++ service/app.py | 759 +----------------- service/auth/__init__.py | 42 + service/auth/channels.py | 96 +++ service/auth/constants.py | 14 + service/auth/crypto.py | 61 ++ service/auth/errors.py | 2 + service/{encryption.py => auth/manager.py} | 224 +----- service/auth/models.py | 70 ++ service/conf/__init__.py | 29 + service/conf/initializer.py | 138 ++++ .../{config_manager.py => conf/manager.py} | 95 ++- service/conf/ops.py | 45 ++ service/conf/paths.py | 48 ++ service/conf/resources.py | 28 + service/context.py | 8 +- service/messages.py | 64 -- service/remote/__init__.py | 4 + .../{lib/scrcpy => remote}/scrcpy-server.jar | Bin .../scrcpy/__init__.py => remote/scrcpy.py} | 9 +- service/remote/scrcpy_proxy.py | 41 + service/runtime.py | 186 +++-- service/types.py | 121 +++ service/update/__init__.py | 25 + service/{utils/update.py => update/checks.py} | 30 +- .../_update.py => update/repository.py} | 0 service/update/setup_io.py | 48 ++ service/utils/__init__.py | 18 +- service/{ => utils}/broadcast.py | 0 service/utils/config_ops.py | 147 ---- service/{ => utils}/diff.py | 0 service/{ => utils}/logging.py | 0 tests/service/test_auth_manager.py | 77 ++ tests/service/test_commands.py | 64 ++ tests/service/test_config_runtime_update.py | 87 ++ tests/service/test_http_contract.py | 96 +++ tests/service/test_remote_proxy.py | 56 ++ tests/service/test_security_contract.py | 161 ++++ tests/service/test_service_logic.py | 51 ++ tests/service/test_ws_behaviors.py | 97 +++ 52 files changed, 2668 insertions(+), 1282 deletions(-) create mode 100644 docs/develop_doc/service_mode.md create mode 100644 service/README.md create mode 100644 service/api/__init__.py create mode 100644 service/api/commands.py create mode 100644 service/api/http.py create mode 100644 service/api/security.py create mode 100644 service/api/state.py create mode 100644 service/api/ws_control.py create mode 100644 service/api/ws_provider.py create mode 100644 service/api/ws_remote.py create mode 100644 service/api/ws_sync.py create mode 100644 service/api/ws_trigger.py create mode 100644 service/auth/__init__.py create mode 100644 service/auth/channels.py create mode 100644 service/auth/constants.py create mode 100644 service/auth/crypto.py create mode 100644 service/auth/errors.py rename service/{encryption.py => auth/manager.py} (78%) create mode 100644 service/auth/models.py create mode 100644 service/conf/__init__.py create mode 100644 service/conf/initializer.py rename service/{config_manager.py => conf/manager.py} (84%) create mode 100644 service/conf/ops.py create mode 100644 service/conf/paths.py create mode 100644 service/conf/resources.py delete mode 100644 service/messages.py create mode 100644 service/remote/__init__.py rename service/{lib/scrcpy => remote}/scrcpy-server.jar (100%) rename service/{lib/scrcpy/__init__.py => remote/scrcpy.py} (98%) create mode 100644 service/remote/scrcpy_proxy.py create mode 100644 service/types.py create mode 100644 service/update/__init__.py rename service/{utils/update.py => update/checks.py} (93%) rename service/{utils/_update.py => update/repository.py} (100%) create mode 100644 service/update/setup_io.py rename service/{ => utils}/broadcast.py (100%) delete mode 100644 service/utils/config_ops.py rename service/{ => utils}/diff.py (100%) rename service/{ => utils}/logging.py (100%) create mode 100644 tests/service/test_auth_manager.py create mode 100644 tests/service/test_commands.py create mode 100644 tests/service/test_config_runtime_update.py create mode 100644 tests/service/test_http_contract.py create mode 100644 tests/service/test_remote_proxy.py create mode 100644 tests/service/test_security_contract.py create mode 100644 tests/service/test_service_logic.py create mode 100644 tests/service/test_ws_behaviors.py diff --git a/docs/develop_doc/service_mode.md b/docs/develop_doc/service_mode.md new file mode 100644 index 000000000..87650df12 --- /dev/null +++ b/docs/develop_doc/service_mode.md @@ -0,0 +1,78 @@ +# Service Mode + +BAAS service mode is started through `main.service.py`. The entry file name and uvicorn target remain stable: + +```bash +python main.service.py --host 0.0.0.0 --port 8190 --log-level info +``` + +The supported CLI flags are `--host`, `--port`, `--reload`, and `--log-level`. + +## Architecture + +`service.app:app` is the public ASGI entrypoint. It only assembles FastAPI, CORS, lifespan, and route modules. Long-lived dependencies are held by `service.api.state.context`. + +Route ownership: + +- `service/api/http.py`: auth remember/logout and health. +- `service/api/ws_control.py`: control-channel authentication, heartbeat, password change, and auth revocation. +- `service/api/ws_sync.py`: config/event/gui/setup snapshots, JSON patch acknowledgements, config list, and filesystem push messages. +- `service/api/ws_provider.py`: log/status provider stream and static/status request replies. +- `service/api/ws_trigger.py`: command response websocket. +- `service/api/commands.py`: command dispatch from trigger messages into `ServiceRuntime`. +- `service/api/ws_remote.py`: scrcpy websocket proxy. +- `service/api/security.py`: shared origin policy, encrypted JSON frame helpers, control auth, and business-channel resume. +- `service/auth/`: owns password state, sessions, remember tokens, signing keys, ChaCha control frames, and secretstream transport. +- `service/conf/`: owns safe config path resolution, config initialization, resource path lookup, snapshots, patching, and filesystem watching. +- `service/update/`: owns setup.toml I/O, remote SHA checks, CDK validation, and update execution. +- `service/remote/`: owns scrcpy client, server jar asset, proxy callback setup, and cleanup. +- `service/types.py`: owns Pydantic message contracts shared by websocket routes. +- `service/utils/`: owns generic diff and log forwarding helpers. + +## Public Interfaces + +HTTP endpoints: + +- `POST /auth/remember`: verifies a remember-session proof and sets `baas_remember`. +- `POST /auth/logout`: deletes `baas_remember`. +- `GET /health`: returns service status and auth public state. + +WebSocket endpoints: + +- `/ws/control`: `client_hello` -> `server_hello` -> initialize/authenticate/resume control messages. Sends `auth_ok`, heartbeat, pong, and auth revocation messages. +- `/ws/sync`: resumes a business session for channel `sync`. Supports `pull`, `patch`, and `list`; emits `snapshot`, `patch_ack`, `config_list`, and filesystem `patch` pushes. +- `/ws/provider`: resumes channel `provider`. Sends initial log history and runtime status; supports `static_request` and `status_request`. +- `/ws/trigger`: resumes channel `trigger`. Accepts `CommandMessage` and returns `command_response` with the original command and timestamp. +- `/ws/remote`: resumes channel `remote`, reads remote config, and proxies encrypted or plain scrcpy bytes according to the existing `decrypt` flag. + +`/ws/remote_test` was a debug endpoint and is intentionally removed. + +## Message Flow + +Business websockets share the same resume pattern: + +1. Client sends `client_hello`. +2. Server replies `server_hello`. +3. Client sends encrypted `resume_proof`. +4. Server replies encrypted `resume_ok` with `server_header`. +5. Client sends encrypted `stream_ready` with `client_header`. +6. The route switches to encrypted binary JSON frames through `SecretStreamBox`. + +## Development Checks + +```bash +python -m compileall -q service +python -m pytest tests/service +``` + +The service test suite uses lightweight fake contexts for protocol contracts so OCR, devices, and emulator state are not required for normal route tests. + +Compatibility checks should continue to cover these imports: + +```python +from service.auth import ServiceAuthManager +from service.conf.manager import ConfigManager +from service.runtime import ServiceRuntime +from service.update import check_for_update, read_setup_toml +from service.remote import ScrcpyClient +``` diff --git a/pyproject.toml b/pyproject.toml index 5e39c7b36..8ba1d9ce0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,8 +36,7 @@ pyqt = [ service = [ "numpy < 2.0", "av == 12.0.0", - "setuptools; sys_platform == 'win32'", - "setuptools == 80.10.2; sys_platform == 'linux'", + "setuptools == 80.10.2", "adbutils == 2.2.1", "uiautomator2 == 2.16.23", "opencv-python == 4.8.1.78", @@ -62,3 +61,11 @@ i18n = [ "lxml", "translators", ] + +test = [ + "pytest", + "httpx", +] + +[tool.pytest.ini_options] +addopts = "-p no:cacheprovider" diff --git a/service/README.md b/service/README.md new file mode 100644 index 000000000..c028567fb --- /dev/null +++ b/service/README.md @@ -0,0 +1,46 @@ +# BAAS Service Mode Internals + +`main.service.py` starts uvicorn with `service.app:app`. Keep that import path stable. + +## Layout + +- `service/app.py`: FastAPI assembly, lifespan, CORS, and router registration. +- `service/api/http.py`: `/auth/remember`, `/auth/logout`, `/health`. +- `service/api/security.py`: websocket origin checks, handshake helpers, stream JSON helpers, and shared auth envelopes. +- `service/api/ws_control.py`: `/ws/control` authentication and password-control channel. +- `service/api/ws_sync.py`: `/ws/sync` config snapshot, patch, list, and filesystem push messages. +- `service/api/ws_provider.py`: `/ws/provider` logs, status, static snapshots, and provider requests. +- `service/api/ws_trigger.py` and `service/api/commands.py`: `/ws/trigger` command envelope and command dispatch. +- `service/api/ws_remote.py`: `/ws/remote` scrcpy websocket proxy. +- `service/context.py`: long-lived service dependencies. +- `service/runtime.py`: async-friendly facade over BAAS core runtime. +- `service/conf/manager.py`: config/resource persistence, patching, and filesystem watching. +- `service/conf/initializer.py`: config file creation and migration. +- `service/auth/`: authentication models, crypto helpers, encrypted channels, and `ServiceAuthManager`. +- `service/update/`: setup.toml I/O, update checks, CDK validation, and update execution. +- `service/remote/`: scrcpy client, jar asset, and websocket proxy lifecycle helpers. +- `service/types.py`: Pydantic message contracts shared by websocket routes. +- `service/utils/`: generic helpers such as JSON patch diffing and log queue forwarding. + +## Compatibility Rules + +- Do not rename `main.service.py`. +- Do not change `service.app:app`. +- Do not change the CLI flags `--host`, `--port`, `--reload`, or `--log-level`. +- Keep formal network contracts compatible for `/auth/remember`, `/auth/logout`, `/health`, `/ws/control`, `/ws/sync`, `/ws/provider`, `/ws/trigger`, and `/ws/remote`. +- `/ws/remote_test` was a debug-only endpoint and has been removed. +- `service.runtime` and `service.remote.scrcpy` are import-light; device-heavy dependencies load only when remote/device features are used. + +## Testing + +Run service tests with: + +```bash +python -m pytest tests/service +``` + +Run a basic import/compile check with: + +```bash +python -m compileall -q service +``` diff --git a/service/api/__init__.py b/service/api/__init__.py new file mode 100644 index 000000000..917576d0d --- /dev/null +++ b/service/api/__init__.py @@ -0,0 +1 @@ +"""HTTP and WebSocket route modules for BAAS service mode.""" diff --git a/service/api/commands.py b/service/api/commands.py new file mode 100644 index 000000000..44c05de7d --- /dev/null +++ b/service/api/commands.py @@ -0,0 +1,104 @@ +from __future__ import annotations + +from typing import Any, Dict + +from service.types import CommandMessage + +from .state import context + + +def _require_config_id(cmd: CommandMessage) -> str: + if not cmd.config_id: + raise ValueError(f"config_id is required for command '{cmd.command}'") + return cmd.config_id + + +async def execute_command(cmd: CommandMessage) -> Dict[str, Any]: + if cmd.command == "start_scheduler": + if not cmd.config_id: + raise ValueError("config_id is required for start_scheduler") + result = await context.runtime.start_scheduler( + cmd.config_id, + set_log=context.ensure_runtime_logger_attached, + ) + return {"status": "ok", "data": result} + + if cmd.command == "stop_scheduler": + if not cmd.config_id: + raise ValueError("config_id is required for stop_scheduler") + result = await context.runtime.stop_scheduler(cmd.config_id) + return {"status": "ok", "data": result} + + if cmd.command == "solve": + if not cmd.config_id: + raise ValueError("config_id is required for solve") + task = cmd.payload.get("task") + if not task: + raise ValueError("task is required for solve command") + result = await context.runtime.solve_task( + cmd.config_id, + task, + set_log=context.ensure_runtime_logger_attached, + ) + return {"status": "ok", "data": result} + + if cmd.command.startswith("start_"): + config_id = _require_config_id(cmd) + result = await context.runtime.solve_task( + config_id=config_id, + task_name=cmd.command, + set_log=context.ensure_runtime_logger_attached, + ) + return {"status": "ok", "data": result} + + if cmd.command.startswith("add_config"): + name = cmd.payload.get("name") + server = cmd.payload.get("server") + if not server or not name: + raise ValueError("server and name are required for add_config") + result = await context.runtime.add_config(name, server) + return {"status": "ok", "data": result} + + if cmd.command.startswith("remove_config"): + config_id = cmd.payload.get("id") + if not config_id: + raise ValueError("id is required for remove_config") + result = await context.runtime.remove_config(config_id) + return {"status": "ok", "data": result} + + if cmd.command == "detect_adb": + result = await context.runtime.detect_adb() + return {"status": "ok", "data": {"addresses": result}} + + if cmd.command == "valid_cdk": + result = await context.runtime.valid_cdk(cmd.payload["cdk"]) + return {"status": "ok", "data": result} + + if cmd.command == "test_all_sha": + result = await context.runtime.test_all_sha() + return {"status": "ok", "data": result} + + if cmd.command == "check_for_update": + result = await context.runtime.check_for_update() + return {"status": "ok", "data": result} + + if cmd.command == "update_setup_toml": + result = await context.runtime.check_for_update() + return {"status": "ok", "data": result} + + if cmd.command == "update_to_latest": + result = await context.runtime.update_to_latest() + return {"status": "ok", "data": result} + + if cmd.command == "control_device": + config_id = _require_config_id(cmd) + operation = cmd.payload.get("operation") + if not operation: + raise ValueError(f"operation is required for command '{cmd.command}'") + result = await context.runtime.control_device_(config_id, operation) + return {"status": "ok", "data": result} + + if cmd.command == "status": + return {"status": "ok", "data": context.runtime.current_status()} + + raise ValueError(f"Unsupported command '{cmd.command}'") diff --git a/service/api/http.py b/service/api/http.py new file mode 100644 index 000000000..5a47cb1b8 --- /dev/null +++ b/service/api/http.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +import time +from typing import Any, Dict + +from fastapi import APIRouter, HTTPException, Request, Response + +from service.auth import AuthenticationError, b64d + +from .security import cookie_secure +from .state import REMEMBER_COOKIE_MAX_AGE, REMEMBER_COOKIE_NAME, context + +router = APIRouter() + + +@router.post("/auth/remember") +async def remember_auth(request: Request, response: Response, payload: dict[str, Any]) -> Dict[str, Any]: + try: + session_id = str(payload.get("session_id", "")) + proof = b64d(str(payload.get("proof", ""))) + session = context.auth_manager.verify_remember_proof(session_id=session_id, proof=proof) + token, expires_at = context.auth_manager.issue_remember_token(session) + except AuthenticationError as exc: + raise HTTPException(status_code=401, detail=str(exc)) from exc + max_age = max(0, min(REMEMBER_COOKIE_MAX_AGE, int(expires_at - time.time()))) + response.set_cookie( + REMEMBER_COOKIE_NAME, + token, + max_age=max_age, + httponly=True, + secure=cookie_secure(request), + samesite="lax", + path="/", + ) + return {"ok": True, "expires_at": expires_at} + + +@router.post("/auth/logout") +async def logout_auth(request: Request, response: Response) -> Dict[str, Any]: + response.delete_cookie( + REMEMBER_COOKIE_NAME, + httponly=True, + secure=cookie_secure(request), + samesite="lax", + path="/", + ) + return {"ok": True} + + +@router.get("/health") +async def health() -> Dict[str, Any]: + statuses = context.runtime.current_status() + auth_state = context.auth_manager.password_state + return { + "ok": True, + "statuses": statuses, + "auth": { + "initialized": auth_state.initialized, + "pwd_epoch": auth_state.pwd_epoch, + "server_sign_public_key": context.auth_manager.server_public_key_b64(), + }, + } diff --git a/service/api/security.py b/service/api/security.py new file mode 100644 index 000000000..1c12c949b --- /dev/null +++ b/service/api/security.py @@ -0,0 +1,229 @@ +from __future__ import annotations + +import asyncio +import json +import os +import time +from urllib.parse import urlparse + +from fastapi import Request, WebSocket, WebSocketDisconnect + +from service.auth import ( + ActiveSession, + AuthenticationError, + HandshakeContext, + JsonChaChaChannel, + PROTOCOL_VERSION, + SecretStreamBox, + b64d, + b64e, +) + +from .state import REMEMBER_COOKIE_NAME, context + + +def json_bytes(payload: dict) -> bytes: + return json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + + +def is_allowed_origin(origin: str | None, host: str | None) -> bool: + if not origin: + return True + allowed = {item.strip() for item in os.getenv("BAAS_SERVICE_ALLOWED_ORIGINS", "").split(",") if item.strip()} + if origin in allowed: + return True + parsed = urlparse(origin) + origin_host = parsed.hostname + host_value = host or "" + if host_value.startswith("[") and "]" in host_value: + request_host = host_value[1:].split("]", 1)[0] + else: + request_host = host_value.split(":", 1)[0] + if origin_host in {"localhost", "127.0.0.1", "::1", "tauri.localhost"}: + return True + return bool(origin_host and request_host and origin_host == request_host) + + +def cookie_secure(request: Request) -> bool: + forced = os.getenv("BAAS_REMEMBER_COOKIE_SECURE") + if forced is not None: + return forced.lower() in {"1", "true", "yes", "on"} + return request.url.scheme == "https" + + +def auth_ok_payload(session: ActiveSession, *, include_session_secrets: bool = False) -> dict: + payload = { + "type": "auth_ok", + "protocol_version": PROTOCOL_VERSION, + "session_id": session.session_id, + "resume_ticket": context.auth_manager.issue_resume_ticket(session), + "expires_at": session.expires_at, + "pwd_epoch": session.pwd_epoch, + "pwd_salt": context.auth_manager.password_state.as_public_dict()["pwd_salt"], + "argon2": context.auth_manager.password_state.as_public_dict()["argon2"], + } + if include_session_secrets: + payload["master_secret"] = b64e(session.master_secret) + payload["resume_secret"] = b64e(session.resume_secret) + return payload + + +async def send_stream_json(websocket: WebSocket, stream: SecretStreamBox, payload: dict) -> None: + await websocket.send_bytes(stream.encrypt(json_bytes(payload))) + + +async def recv_stream_json(websocket: WebSocket, stream: SecretStreamBox) -> dict: + frame = await websocket.receive_bytes() + plaintext = stream.decrypt(frame) + return json.loads(plaintext.decode("utf-8")) + + +async def begin_server_hello( + websocket: WebSocket, + *, + kind: str, + channel: str, +) -> tuple[HandshakeContext, JsonChaChaChannel, dict]: + if not is_allowed_origin(websocket.headers.get("origin"), websocket.headers.get("host")): + await websocket.close(code=4403, reason="Origin is not allowed") + raise AuthenticationError("Origin is not allowed") + await websocket.accept() + hello = await websocket.receive_json() + handshake, response = context.auth_manager.issue_server_hello(hello, kind=kind, channel=channel) + await websocket.send_json(response) + secure = context.auth_manager.build_preauth_channel(handshake) + return handshake, secure, hello + + +def decode_control_auth_proof(request: dict) -> bytes: + proof = request.get("proof") + if not isinstance(proof, str): + raise AuthenticationError("Password proof is missing") + return b64d(proof) + + +async def finalize_control_auth( + websocket: WebSocket, + *, + handshake: HandshakeContext, + preauth_channel: JsonChaChaChannel, + request: dict, +) -> tuple[ActiveSession, JsonChaChaChannel]: + include_session_secrets = False + if request.get("type") == "resume_control": + token = websocket.cookies.get(REMEMBER_COOKIE_NAME, "") + if token: + try: + session, control_channel = context.auth_manager.resume_control_session(handshake, token) + include_session_secrets = True + except AuthenticationError: + session = control_channel = None # type: ignore[assignment] + else: + await websocket.send_json( + preauth_channel.encrypt( + auth_ok_payload(session, include_session_secrets=include_session_secrets) + ) + ) + return session, control_channel + await websocket.send_json(preauth_channel.encrypt({"type": "resume_unavailable"})) + request = preauth_channel.decrypt(await websocket.receive_json()) + + if not context.auth_manager.password_state.initialized: + if request.get("type") != "initialize": + raise AuthenticationError("Initialization is required") + password = str(request.get("password", "")) + context.auth_manager.initialize_password(password) + session, control_channel = context.auth_manager.open_control_session_after_initialize(handshake) + else: + if request.get("type") != "authenticate": + raise AuthenticationError("Password authentication is required") + session, control_channel = context.auth_manager.authenticate_control( + handshake, + proof=decode_control_auth_proof(request), + ) + await websocket.send_json( + preauth_channel.encrypt(auth_ok_payload(session, include_session_secrets=include_session_secrets)) + ) + return session, control_channel + + +async def control_sender( + websocket: WebSocket, + *, + control_channel: JsonChaChaChannel, + revoke_queue: asyncio.Queue, +) -> None: + try: + while True: + payload = await revoke_queue.get() + await websocket.send_json(control_channel.encrypt(payload)) + if payload.get("type") == "auth_revoked": + await websocket.close(code=4401, reason=payload.get("reason", "revoked")) + return + except asyncio.CancelledError: + pass + except WebSocketDisconnect: + pass + + +async def control_heartbeat_sender( + websocket: WebSocket, + *, + control_channel: JsonChaChaChannel, + interval: float, +) -> None: + try: + while True: + await websocket.send_json( + control_channel.encrypt( + { + "type": "heartbeat", + "timestamp": time.time(), + } + ) + ) + await asyncio.sleep(interval) + except asyncio.CancelledError: + pass + except WebSocketDisconnect: + pass + except RuntimeError: + pass + + +async def perform_business_resume( + websocket: WebSocket, + *, + channel: str, +) -> tuple[ActiveSession, SecretStreamBox]: + handshake, preauth_channel, hello = await begin_server_hello(websocket, kind="resume", channel=channel) + if hello.get("channel") != channel: + raise AuthenticationError("Requested channel does not match websocket endpoint") + request = preauth_channel.decrypt(await websocket.receive_json()) + if request.get("type") != "resume_proof": + raise AuthenticationError("Resume proof is required") + session, secure_channel, stream_box = context.auth_manager.resume_business_session( + handshake=handshake, + session_id=str(hello.get("session_id", "")), + socket_id=str(hello.get("socket_id", "")), + channel=channel, + resume_ticket=str(hello.get("resume_ticket", "")), + resume_mac=b64d(str(request.get("resume_mac", ""))), + ) + await websocket.send_json( + secure_channel.encrypt( + { + "type": "resume_ok", + "session_id": session.session_id, + "pwd_epoch": session.pwd_epoch, + "server_header": b64e(stream_box.tx_header), + } + ) + ) + ready_back = await websocket.receive_json() + secure_channel.set_rx_seq(1) + ready = secure_channel.decrypt(ready_back) + if ready.get("type") != "stream_ready": + raise AuthenticationError("Client stream header is required") + stream_box.init_pull(b64d(str(ready.get("client_header", "")))) + return session, stream_box diff --git a/service/api/state.py b/service/api/state.py new file mode 100644 index 000000000..2ea04e0ed --- /dev/null +++ b/service/api/state.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +import os +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent +REMEMBER_COOKIE_NAME = "baas_remember" +REMEMBER_COOKIE_MAX_AGE = int(os.getenv("BAAS_REMEMBER_TTL_SECONDS", str(60 * 60 * 24 * 180))) + + +class LazyServiceContext: + """Delay runtime-heavy service imports until the app actually starts.""" + + def __init__(self, project_root: Path) -> None: + self.project_root = project_root + self._context = None + + def _get_context(self): + if self._context is None: + from service.context import ServiceContext + + self._context = ServiceContext(self.project_root) + return self._context + + def __getattr__(self, name: str): + return getattr(self._get_context(), name) + + +context = LazyServiceContext(PROJECT_ROOT) diff --git a/service/api/ws_control.py b/service/api/ws_control.py new file mode 100644 index 000000000..076d671f8 --- /dev/null +++ b/service/api/ws_control.py @@ -0,0 +1,80 @@ +from __future__ import annotations + +import asyncio +import time +from contextlib import suppress + +from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect + +from service.auth import ActiveSession, AuthenticationError + +from .security import ( + begin_server_hello, + control_heartbeat_sender, + control_sender, + finalize_control_auth, +) +from .state import context + +router = APIRouter() + + +@router.websocket("/ws/control") +async def websocket_control(websocket: WebSocket) -> None: + revoke_queue = None + sender_task = heartbeat_task = None + session: ActiveSession | None = None + try: + handshake, preauth_channel, _ = await begin_server_hello(websocket, kind="control", channel="control") + request = preauth_channel.decrypt(await websocket.receive_json()) + session, control_channel = await finalize_control_auth( + websocket, + handshake=handshake, + preauth_channel=preauth_channel, + request=request, + ) + revoke_queue = context.auth_manager.subscribe_control(session.session_id) + sender_task = asyncio.create_task( + control_sender( + websocket, + control_channel=control_channel, + revoke_queue=revoke_queue, + ) + ) + heartbeat_task = asyncio.create_task( + control_heartbeat_sender( + websocket, + control_channel=control_channel, + interval=3.0, + ) + ) + while True: + message = control_channel.decrypt(await websocket.receive_json()) + msg_type = message.get("type") + if msg_type == "ping": + await websocket.send_json(control_channel.encrypt({"type": "pong", "timestamp": time.time()})) + elif msg_type == "change_password": + new_password = str(message.get("new_password", "")) + await context.auth_manager.change_password(session_id=session.session_id, new_password=new_password) + return + else: + raise AuthenticationError(f"Unsupported control message: {msg_type}") + except (AuthenticationError, HTTPException) as exc: + with suppress(RuntimeError): + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: # noqa: BLE001 - surfaced to caller + import traceback + + traceback.print_exc() + with suppress(RuntimeError): + await websocket.close(code=1011, reason=str(exc)) + finally: + if session is not None and revoke_queue is not None: + context.auth_manager.unsubscribe_control(session.session_id, revoke_queue) + for task in (sender_task, heartbeat_task): + if task: + task.cancel() + with suppress(asyncio.CancelledError): + await task diff --git a/service/api/ws_provider.py b/service/api/ws_provider.py new file mode 100644 index 000000000..4cedfc32e --- /dev/null +++ b/service/api/ws_provider.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +import asyncio +from contextlib import suppress + +from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect + +from service.auth import AuthenticationError, SecretStreamBox +from service.types import ProviderRequest + +from .security import perform_business_resume, recv_stream_json, send_stream_json +from .state import context + +router = APIRouter() + + +async def provider_sender( + websocket: WebSocket, + stream: SecretStreamBox, + queue: asyncio.Queue, + envelope_type: str, +) -> None: + try: + while True: + payload = await queue.get() + if envelope_type == "status": + response = {"type": envelope_type, "status": payload} + else: + response = {"type": envelope_type, "entry": payload} + await send_stream_json(websocket, stream, response) + except asyncio.CancelledError: + pass + + +@router.websocket("/ws/provider") +async def websocket_provider(websocket: WebSocket) -> None: + log_queue = status_queue = None + log_task = status_task = None + try: + _, stream = await perform_business_resume(websocket, channel="provider") + history = context.log_manager.get_history() + scopes = context.log_manager.get_scopes() + await send_stream_json(websocket, stream, {"type": "logs_full", "scopes": scopes, "entries": history}) + await send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) + if context.runtime.is_all_data_initialized: + await send_stream_json(websocket, stream, {"type": "status", "status": {"is_all_data_initialized": True}}) + log_queue = await context.log_manager.subscribe() + status_queue = await context.runtime.subscribe_status() + log_task = asyncio.create_task(provider_sender(websocket, stream, log_queue, "log")) + status_task = asyncio.create_task(provider_sender(websocket, stream, status_queue, "status")) + while True: + message = await recv_stream_json(websocket, stream) + req_type = message.get("type") + if req_type == "static_request": + ProviderRequest(**message) + snapshot = await context.config_manager.get_static_snapshot() + await send_stream_json( + websocket, + stream, + { + "type": "static_snapshot", + "timestamp": snapshot.timestamp, + "data": snapshot.data, + }, + ) + elif req_type == "status_request": + await send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) + else: + raise HTTPException(status_code=400, detail=f"Unsupported provider message: {req_type}") + except (AuthenticationError, HTTPException) as exc: + with suppress(RuntimeError): + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: # noqa: BLE001 - surfaced to caller + with suppress(RuntimeError): + await websocket.close(code=1011, reason=str(exc)) + finally: + for task in (log_task, status_task): + if task: + task.cancel() + with suppress(asyncio.CancelledError): + await task + if log_queue is not None: + context.log_manager.unsubscribe(log_queue) + if status_queue is not None: + context.runtime.unsubscribe_status(status_queue) diff --git a/service/api/ws_remote.py b/service/api/ws_remote.py new file mode 100644 index 000000000..bb5be285b --- /dev/null +++ b/service/api/ws_remote.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from fastapi import APIRouter, WebSocket + +from service.remote import ScrcpyProxySession + +from .security import perform_business_resume, recv_stream_json +from .state import context + +router = APIRouter() + + +@router.websocket("/ws/remote") +async def websocket_remote(websocket: WebSocket) -> None: + proxy = None + + try: + _, stream = await perform_business_resume(websocket, channel="remote") + message = await recv_stream_json(websocket, stream) + config_id = message.get("config_id") + to_encrypt = message.get("decrypt", True) + + client = await context.runtime.require_remote_(config_id) + proxy = ScrcpyProxySession(client, stream, encrypt_adb_to_ws=to_encrypt) + await proxy.run(websocket) + except Exception: + import traceback + + traceback.print_exc() + finally: + if proxy is not None: + await proxy.close() diff --git a/service/api/ws_sync.py b/service/api/ws_sync.py new file mode 100644 index 000000000..3d6d65b99 --- /dev/null +++ b/service/api/ws_sync.py @@ -0,0 +1,104 @@ +from __future__ import annotations + +import asyncio +from contextlib import suppress + +from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect + +from service.auth import AuthenticationError, SecretStreamBox +from service.types import SyncPatchMessage, SyncPullMessage + +from .security import perform_business_resume, recv_stream_json, send_stream_json +from .state import context + +router = APIRouter() + + +async def sync_sender(websocket: WebSocket, stream: SecretStreamBox, queue: asyncio.Queue) -> None: + try: + while True: + payload = dict(await queue.get()) + payload.setdefault("direction", "push") + await send_stream_json(websocket, stream, payload) + except asyncio.CancelledError: + pass + + +@router.websocket("/ws/sync") +async def websocket_sync(websocket: WebSocket) -> None: + queue = None + sender_task = None + try: + _, stream = await perform_business_resume(websocket, channel="sync") + queue = await context.config_manager.subscribe_updates() + sender_task = asyncio.create_task(sync_sender(websocket, stream, queue)) + while True: + message = await recv_stream_json(websocket, stream) + msg_type = message.get("type") + if msg_type == "pull": + data = SyncPullMessage(**message) + snapshot = await context.config_manager.get_snapshot(data.resource, data.resource_id) + await send_stream_json( + websocket, + stream, + { + "type": "snapshot", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": snapshot.timestamp, + "data": snapshot.data, + }, + ) + elif msg_type == "patch": + data = SyncPatchMessage(**message) + await context.config_manager.apply_patch( + data.resource, + data.resource_id, + data.ops, + data.timestamp, + origin="frontend", + ) + await send_stream_json( + websocket, + stream, + { + "type": "patch_ack", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": data.timestamp, + }, + ) + elif msg_type == "list": + snapshot = await context.config_manager.get_config_list() + await send_stream_json( + websocket, + stream, + { + "type": "config_list", + "timestamp": snapshot.timestamp, + "data": snapshot.data, + }, + ) + else: + raise HTTPException(status_code=400, detail=f"Unsupported sync message: {msg_type}") + except (AuthenticationError, HTTPException) as exc: + import traceback + + traceback.print_exc() + with suppress(RuntimeError): + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: # noqa: BLE001 - surfaced to caller + import traceback + + traceback.print_exc() + with suppress(RuntimeError): + await websocket.close(code=1011, reason=str(exc)) + finally: + if sender_task: + sender_task.cancel() + with suppress(asyncio.CancelledError): + await sender_task + if queue is not None: + context.config_manager.unsubscribe_updates(queue) diff --git a/service/api/ws_trigger.py b/service/api/ws_trigger.py new file mode 100644 index 000000000..3a5220ad8 --- /dev/null +++ b/service/api/ws_trigger.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +from contextlib import suppress +from typing import Any, Dict + +from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect + +from service.auth import AuthenticationError +from service.types import CommandMessage + +from .commands import execute_command +from .security import perform_business_resume, recv_stream_json, send_stream_json + +router = APIRouter() + + +@router.websocket("/ws/trigger") +async def websocket_trigger(websocket: WebSocket) -> None: + try: + _, stream = await perform_business_resume(websocket, channel="trigger") + while True: + message = await recv_stream_json(websocket, stream) + cmd = CommandMessage(**message) + response_payload: Dict[str, Any] + try: + response_payload = await execute_command(cmd) + except Exception as inner_exc: # noqa: BLE001 - returned to frontend + response_payload = {"status": "error", "error": str(inner_exc)} + await send_stream_json( + websocket, + stream, + { + "type": "command_response", + "command": cmd.command, + **response_payload, + "timestamp": cmd.timestamp, + }, + ) + except (AuthenticationError, HTTPException) as exc: + with suppress(RuntimeError): + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: # noqa: BLE001 - surfaced to caller + with suppress(RuntimeError): + await websocket.close(code=1011, reason=str(exc)) diff --git a/service/app.py b/service/app.py index 08f56a626..14c9760f3 100644 --- a/service/app.py +++ b/service/app.py @@ -1,37 +1,18 @@ from __future__ import annotations -import asyncio import contextlib -import json import os -import time -from contextlib import suppress -from pathlib import Path -from typing import Any, Dict -from urllib.parse import urlparse -from fastapi import FastAPI, HTTPException, Request, Response, WebSocket, WebSocketDisconnect +from fastapi import FastAPI from starlette.middleware.cors import CORSMiddleware -# from starlette.staticfiles import StaticFiles -from .context import ServiceContext -from .encryption import ( - ActiveSession, - AuthenticationError, - HandshakeContext, - JsonChaChaChannel, - PROTOCOL_VERSION, - SecretStreamBox, - b64d, - b64e, -) -from .lib.scrcpy import EVENT_STREAM -from .messages import CommandMessage, ProviderRequest, SyncPatchMessage, SyncPullMessage - -PROJECT_ROOT = Path(__file__).resolve().parent.parent -REMEMBER_COOKIE_NAME = "baas_remember" -REMEMBER_COOKIE_MAX_AGE = int(os.getenv("BAAS_REMEMBER_TTL_SECONDS", str(60 * 60 * 24 * 180))) -context = ServiceContext(PROJECT_ROOT) +from .api.http import router as http_router +from .api.state import context +from .api.ws_control import router as control_router +from .api.ws_provider import router as provider_router +from .api.ws_remote import router as remote_router +from .api.ws_sync import router as sync_router +from .api.ws_trigger import router as trigger_router @contextlib.asynccontextmanager @@ -54,721 +35,15 @@ async def lifespan(app: FastAPI): allow_headers=["*"], ) +for router in ( + http_router, + control_router, + sync_router, + provider_router, + trigger_router, + remote_router, +): + app.include_router(router) -def _json_bytes(payload: dict[str, Any]) -> bytes: - return json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") - - -def _is_allowed_origin(origin: str | None, host: str | None) -> bool: - if not origin: - return True - allowed = {item.strip() for item in os.getenv("BAAS_SERVICE_ALLOWED_ORIGINS", "").split(",") if item.strip()} - if origin in allowed: - return True - parsed = urlparse(origin) - origin_host = parsed.hostname - host_value = host or "" - if host_value.startswith("[") and "]" in host_value: - request_host = host_value[1:].split("]", 1)[0] - else: - request_host = host_value.split(":", 1)[0] - if origin_host in {"localhost", "127.0.0.1", "::1", "tauri.localhost"}: - return True - return bool(origin_host and request_host and origin_host == request_host) - - -def _cookie_secure(request: Request) -> bool: - forced = os.getenv("BAAS_REMEMBER_COOKIE_SECURE") - if forced is not None: - return forced.lower() in {"1", "true", "yes", "on"} - return request.url.scheme == "https" - - -def _auth_ok_payload(session: ActiveSession, *, include_session_secrets: bool = False) -> dict[str, Any]: - payload = { - "type": "auth_ok", - "protocol_version": PROTOCOL_VERSION, - "session_id": session.session_id, - "resume_ticket": context.auth_manager.issue_resume_ticket(session), - "expires_at": session.expires_at, - "pwd_epoch": session.pwd_epoch, - "pwd_salt": context.auth_manager.password_state.as_public_dict()["pwd_salt"], - "argon2": context.auth_manager.password_state.as_public_dict()["argon2"], - } - if include_session_secrets: - payload["master_secret"] = b64e(session.master_secret) - payload["resume_secret"] = b64e(session.resume_secret) - return payload - - -async def _send_stream_json(websocket: WebSocket, stream: SecretStreamBox, payload: dict[str, Any]) -> None: - await websocket.send_bytes(stream.encrypt(_json_bytes(payload))) - - -async def _recv_stream_json(websocket: WebSocket, stream: SecretStreamBox) -> dict[str, Any]: - frame = await websocket.receive_bytes() - plaintext = stream.decrypt(frame) - return json.loads(plaintext.decode("utf-8")) - - -async def _begin_server_hello(websocket: WebSocket, *, kind: str, channel: str) -> tuple[ - HandshakeContext, JsonChaChaChannel, dict[str, Any]]: - if not _is_allowed_origin(websocket.headers.get("origin"), websocket.headers.get("host")): - await websocket.close(code=4403, reason="Origin is not allowed") - raise AuthenticationError("Origin is not allowed") - await websocket.accept() - hello = await websocket.receive_json() - handshake, response = context.auth_manager.issue_server_hello(hello, kind=kind, channel=channel) - await websocket.send_json(response) - secure = context.auth_manager.build_preauth_channel(handshake) - return handshake, secure, hello - - -def _decode_control_auth_proof(request: dict[str, Any]) -> bytes: - proof = request.get("proof") - if not isinstance(proof, str): - raise AuthenticationError("Password proof is missing") - return b64d(proof) - - -async def _finalize_control_auth( - websocket: WebSocket, - *, - handshake: HandshakeContext, - preauth_channel: JsonChaChaChannel, - request: dict[str, Any], -) -> tuple[ActiveSession, JsonChaChaChannel]: - include_session_secrets = False - if request.get("type") == "resume_control": - token = websocket.cookies.get(REMEMBER_COOKIE_NAME, "") - if token: - try: - session, control_channel = context.auth_manager.resume_control_session(handshake, token) - include_session_secrets = True - except AuthenticationError: - session = control_channel = None # type: ignore[assignment] - else: - await websocket.send_json( - preauth_channel.encrypt( - _auth_ok_payload(session, include_session_secrets=include_session_secrets) - ) - ) - return session, control_channel - await websocket.send_json(preauth_channel.encrypt({"type": "resume_unavailable"})) - request = preauth_channel.decrypt(await websocket.receive_json()) - - if not context.auth_manager.password_state.initialized: - if request.get("type") != "initialize": - raise AuthenticationError("Initialization is required") - password = str(request.get("password", "")) - context.auth_manager.initialize_password(password) - session, control_channel = context.auth_manager.open_control_session_after_initialize(handshake) - else: - if request.get("type") != "authenticate": - raise AuthenticationError("Password authentication is required") - session, control_channel = context.auth_manager.authenticate_control( - handshake, - proof=_decode_control_auth_proof(request), - ) - await websocket.send_json( - preauth_channel.encrypt(_auth_ok_payload(session, include_session_secrets=include_session_secrets)) - ) - return session, control_channel - - -async def _control_sender( - websocket: WebSocket, - *, - control_channel: JsonChaChaChannel, - revoke_queue: asyncio.Queue, -) -> None: - try: - while True: - payload = await revoke_queue.get() - await websocket.send_json(control_channel.encrypt(payload)) - if payload.get("type") == "auth_revoked": - await websocket.close(code=4401, reason=payload.get("reason", "revoked")) - return - except asyncio.CancelledError: - pass - except WebSocketDisconnect: - pass - - -async def _control_heartbeat_sender( - websocket: WebSocket, - *, - control_channel: JsonChaChaChannel, - interval: float, -) -> None: - try: - while True: - await websocket.send_json( - control_channel.encrypt( - { - "type": "heartbeat", - "timestamp": time.time(), - } - ) - ) - await asyncio.sleep(interval) - except asyncio.CancelledError: - pass - except WebSocketDisconnect: - pass - except RuntimeError: - pass - - -@app.post("/auth/remember") -async def remember_auth(request: Request, response: Response, payload: dict[str, Any]) -> Dict[str, Any]: - try: - session_id = str(payload.get("session_id", "")) - proof = b64d(str(payload.get("proof", ""))) - session = context.auth_manager.verify_remember_proof(session_id=session_id, proof=proof) - token, expires_at = context.auth_manager.issue_remember_token(session) - except AuthenticationError as exc: - raise HTTPException(status_code=401, detail=str(exc)) from exc - max_age = max(0, min(REMEMBER_COOKIE_MAX_AGE, int(expires_at - time.time()))) - response.set_cookie( - REMEMBER_COOKIE_NAME, - token, - max_age=max_age, - httponly=True, - secure=_cookie_secure(request), - samesite="lax", - path="/", - ) - return {"ok": True, "expires_at": expires_at} - - -@app.post("/auth/logout") -async def logout_auth(request: Request, response: Response) -> Dict[str, Any]: - response.delete_cookie( - REMEMBER_COOKIE_NAME, - httponly=True, - secure=_cookie_secure(request), - samesite="lax", - path="/", - ) - return {"ok": True} - - -@app.get("/health") -async def health() -> Dict[str, Any]: - statuses = context.runtime.current_status() - auth_state = context.auth_manager.password_state - return { - "ok": True, - "statuses": statuses, - "auth": { - "initialized": auth_state.initialized, - "pwd_epoch": auth_state.pwd_epoch, - "server_sign_public_key": context.auth_manager.server_public_key_b64(), - }, - } - - -@app.websocket("/ws/control") -async def websocket_control(websocket: WebSocket) -> None: - revoke_queue = None - sender_task = heartbeat_task = None - session: ActiveSession | None = None - try: - handshake, preauth_channel, _ = await _begin_server_hello(websocket, kind="control", channel="control") - request = preauth_channel.decrypt(await websocket.receive_json()) - session, control_channel = await _finalize_control_auth( - websocket, - handshake=handshake, - preauth_channel=preauth_channel, - request=request, - ) - revoke_queue = context.auth_manager.subscribe_control(session.session_id) - sender_task = asyncio.create_task( - _control_sender( - websocket, - control_channel=control_channel, - revoke_queue=revoke_queue, - ) - ) - heartbeat_task = asyncio.create_task( - _control_heartbeat_sender( - websocket, - control_channel=control_channel, - interval=3.0, - ) - ) - while True: - message = control_channel.decrypt(await websocket.receive_json()) - msg_type = message.get("type") - if msg_type == "ping": - await websocket.send_json(control_channel.encrypt({"type": "pong", "timestamp": time.time()})) - elif msg_type == "change_password": - new_password = str(message.get("new_password", "")) - await context.auth_manager.change_password(session_id=session.session_id, new_password=new_password) - return - else: - raise AuthenticationError(f"Unsupported control message: {msg_type}") - except (AuthenticationError, HTTPException) as exc: - with suppress(RuntimeError): - await websocket.close(code=4401, reason=str(exc)) - except WebSocketDisconnect: - pass - except Exception as exc: # noqa: BLE001 - surfaced to caller - import traceback - - traceback.print_exc() - with suppress(RuntimeError): - await websocket.close(code=1011, reason=str(exc)) - finally: - if session is not None and revoke_queue is not None: - context.auth_manager.unsubscribe_control(session.session_id, revoke_queue) - for task in (sender_task, heartbeat_task): - if task: - task.cancel() - with suppress(asyncio.CancelledError): - await task - - -async def _perform_business_resume( - websocket: WebSocket, - *, - channel: str, -) -> tuple[ActiveSession, SecretStreamBox]: - handshake, preauth_channel, hello = await _begin_server_hello(websocket, kind="resume", channel=channel) - if hello.get("channel") != channel: - raise AuthenticationError("Requested channel does not match websocket endpoint") - request = preauth_channel.decrypt(await websocket.receive_json()) - if request.get("type") != "resume_proof": - raise AuthenticationError("Resume proof is required") - session, secure_channel, stream_box = context.auth_manager.resume_business_session( - handshake=handshake, - session_id=str(hello.get("session_id", "")), - socket_id=str(hello.get("socket_id", "")), - channel=channel, - resume_ticket=str(hello.get("resume_ticket", "")), - resume_mac=b64d(str(request.get("resume_mac", ""))), - ) - await websocket.send_json( - secure_channel.encrypt( - { - "type": "resume_ok", - "session_id": session.session_id, - "pwd_epoch": session.pwd_epoch, - "server_header": b64e(stream_box.tx_header), - } - ) - ) - ready_back = await websocket.receive_json() - secure_channel.set_rx_seq(1) - ready = secure_channel.decrypt(ready_back) - if ready.get("type") != "stream_ready": - raise AuthenticationError("Client stream header is required") - stream_box.init_pull(b64d(str(ready.get("client_header", "")))) - return session, stream_box - - -async def _sync_sender(websocket: WebSocket, stream: SecretStreamBox, queue: asyncio.Queue) -> None: - try: - while True: - payload = dict(await queue.get()) - payload.setdefault("direction", "push") - await _send_stream_json(websocket, stream, payload) # type: ignore - except asyncio.CancelledError: - pass - - -@app.websocket("/ws/sync") -async def websocket_sync(websocket: WebSocket) -> None: - queue = None - sender_task = None - try: - _, stream = await _perform_business_resume(websocket, channel="sync") - queue = await context.config_manager.subscribe_updates() - sender_task = asyncio.create_task(_sync_sender(websocket, stream, queue)) - while True: - message = await _recv_stream_json(websocket, stream) - msg_type = message.get("type") - if msg_type == "pull": - data = SyncPullMessage(**message) - snapshot = await context.config_manager.get_snapshot(data.resource, data.resource_id) - await _send_stream_json( - websocket, - stream, - { - "type": "snapshot", - "resource": data.resource, - "resource_id": data.resource_id, - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) - elif msg_type == "patch": - data = SyncPatchMessage(**message) - await context.config_manager.apply_patch( - data.resource, - data.resource_id, - data.ops, - data.timestamp, - origin="frontend", - ) - await _send_stream_json( - websocket, - stream, - { - "type": "patch_ack", - "resource": data.resource, - "resource_id": data.resource_id, - "timestamp": data.timestamp, - }, - ) - elif msg_type == "list": - snapshot = await context.config_manager.get_config_list() - await _send_stream_json( - websocket, - stream, - { - "type": "config_list", - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) - else: - raise HTTPException(status_code=400, detail=f"Unsupported sync message: {msg_type}") - except (AuthenticationError, HTTPException) as exc: - import traceback - traceback.print_exc() - with suppress(RuntimeError): - await websocket.close(code=4401, reason=str(exc)) - except WebSocketDisconnect: - pass - except Exception as exc: # noqa: BLE001 - surfaced to caller - import traceback - - traceback.print_exc() - with suppress(RuntimeError): - await websocket.close(code=1011, reason=str(exc)) - finally: - if sender_task: - sender_task.cancel() - with suppress(asyncio.CancelledError): - await sender_task - if queue is not None: - context.config_manager.unsubscribe_updates(queue) - - -async def _provider_sender(websocket: WebSocket, stream: SecretStreamBox, queue: asyncio.Queue, - envelope_type: str) -> None: - try: - while True: - payload = await queue.get() - if envelope_type == "status": - response = {"type": envelope_type, "status": payload} - else: - response = {"type": envelope_type, "entry": payload} - await _send_stream_json(websocket, stream, response) - except asyncio.CancelledError: - pass - - -@app.websocket("/ws/provider") -async def websocket_provider(websocket: WebSocket) -> None: - log_queue = status_queue = None - log_task = status_task = None - try: - _, stream = await _perform_business_resume(websocket, channel="provider") - history = context.log_manager.get_history() - scopes = context.log_manager.get_scopes() - await _send_stream_json(websocket, stream, {"type": "logs_full", "scopes": scopes, "entries": history}) - await _send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) - if context.runtime.is_all_data_initialized: - await _send_stream_json(websocket, stream, {"type": "status", "status": {"is_all_data_initialized": True}}) - log_queue = await context.log_manager.subscribe() - status_queue = await context.runtime.subscribe_status() - log_task = asyncio.create_task(_provider_sender(websocket, stream, log_queue, "log")) - status_task = asyncio.create_task(_provider_sender(websocket, stream, status_queue, "status")) - while True: - message = await _recv_stream_json(websocket, stream) - req_type = message.get("type") - if req_type == "static_request": - ProviderRequest(**message) - snapshot = await context.config_manager.get_static_snapshot() - await _send_stream_json( - websocket, - stream, - { - "type": "static_snapshot", - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) - elif req_type == "status_request": - await _send_stream_json(websocket, stream, - {"type": "status", "status": context.runtime.current_status()}) - else: - raise HTTPException(status_code=400, detail=f"Unsupported provider message: {req_type}") - except (AuthenticationError, HTTPException) as exc: - with suppress(RuntimeError): - await websocket.close(code=4401, reason=str(exc)) - except WebSocketDisconnect: - pass - except Exception as exc: # noqa: BLE001 - surfaced to caller - with suppress(RuntimeError): - await websocket.close(code=1011, reason=str(exc)) - finally: - for task in (log_task, status_task): - if task: - task.cancel() - with suppress(asyncio.CancelledError): - await task - if log_queue is not None: - context.log_manager.unsubscribe(log_queue) - if status_queue is not None: - context.runtime.unsubscribe_status(status_queue) - - -@app.websocket("/ws/trigger") -async def websocket_trigger(websocket: WebSocket) -> None: - try: - _, stream = await _perform_business_resume(websocket, channel="trigger") - while True: - message = await _recv_stream_json(websocket, stream) - cmd = CommandMessage(**message) - response_payload: Dict[str, Any] - try: - if cmd.command == "start_scheduler": - if not cmd.config_id: - raise ValueError("config_id is required for start_scheduler") - result = await context.runtime.start_scheduler( - cmd.config_id, - set_log=context.ensure_runtime_logger_attached, - ) - response_payload = {"status": "ok", "data": result} - elif cmd.command == "stop_scheduler": - if not cmd.config_id: - raise ValueError("config_id is required for stop_scheduler") - result = await context.runtime.stop_scheduler(cmd.config_id) - response_payload = {"status": "ok", "data": result} - elif cmd.command == "solve": - if not cmd.config_id: - raise ValueError("config_id is required for solve") - task = cmd.payload.get("task") - if not task: - raise ValueError("task is required for solve command") - result = await context.runtime.solve_task( - cmd.config_id, - task, - set_log=context.ensure_runtime_logger_attached, - ) - response_payload = {"status": "ok", "data": result} - elif cmd.command.startswith("start_"): - if not cmd.config_id: - raise ValueError(f"config_id is required for command '{cmd.command}'") - result = await context.runtime.solve_task( - config_id=cmd.config_id, - task_name=cmd.command, - set_log=context.ensure_runtime_logger_attached, - ) - response_payload = {"status": "ok", "data": result} - elif cmd.command.startswith("add_config"): - name = cmd.payload.get("name") - server = cmd.payload.get("server") - if not server or not name: - raise ValueError("server and name are required for add_config") - result = await context.runtime.add_config(name, server) - response_payload = {"status": "ok", "data": result} - elif cmd.command.startswith("remove_config"): - config_id = cmd.payload.get("id") - if not config_id: - raise ValueError("id is required for remove_config") - result = await context.runtime.remove_config(config_id) - response_payload = {"status": "ok", "data": result} - elif cmd.command == "detect_adb": - result = await context.runtime.detect_adb() - response_payload = {"status": "ok", "data": {"addresses": result}} - elif cmd.command == "valid_cdk": - result = await context.runtime.valid_cdk(cmd.payload["cdk"]) - response_payload = {"status": "ok", "data": result} - elif cmd.command == "test_all_sha": - result = await context.runtime.test_all_sha() - response_payload = {"status": "ok", "data": result} - elif cmd.command == "check_for_update": - result = await context.runtime.check_for_update() - response_payload = {"status": "ok", "data": result} - elif cmd.command == "update_setup_toml": - result = await context.runtime.check_for_update() - response_payload = {"status": "ok", "data": result} - elif cmd.command == "update_to_latest": - result = await context.runtime.update_to_latest() - response_payload = {"status": "ok", "data": result} - elif cmd.command == "control_device": - if not cmd.config_id: - raise ValueError(f"config_id is required for command '{cmd.command}'") - if not cmd.payload.get("operation"): - raise ValueError(f"operation is required for command '{cmd.command}'") - result = await context.runtime.control_device_(cmd.config_id, cmd.payload.get("operation")) - response_payload = {"status": "ok", "data": result} - elif cmd.command == "status": - response_payload = {"status": "ok", "data": context.runtime.current_status()} - else: - raise ValueError(f"Unsupported command '{cmd.command}'") - except Exception as inner_exc: # noqa: BLE001 - returned to frontend - response_payload = {"status": "error", "error": str(inner_exc)} - await _send_stream_json( - websocket, - stream, - { - "type": "command_response", - "command": cmd.command, - **response_payload, - "timestamp": cmd.timestamp, - }, - ) - except (AuthenticationError, HTTPException) as exc: - with suppress(RuntimeError): - await websocket.close(code=4401, reason=str(exc)) - except WebSocketDisconnect: - pass - except Exception as exc: # noqa: BLE001 - surfaced to caller - with suppress(RuntimeError): - await websocket.close(code=1011, reason=str(exc)) - - -@app.websocket("/ws/remote") -async def websocket_remote(websocket: WebSocket) -> None: - listener = client = None - sender_task = None - send_queue: asyncio.Queue[bytes | None] | None = None - - # noinspection PyBroadException - try: - _, stream = await _perform_business_resume(websocket, channel="remote") - message = await _recv_stream_json(websocket, stream) - config_id = message.get("config_id") - to_encrypt = message.get("decrypt", True) - - client = await context.runtime.require_remote_(config_id) - - send_queue = asyncio.Queue(maxsize=8) - - async def sender() -> None: - try: - while True: - item = await send_queue.get() # type: ignore - if item is None: - break - await websocket.send_bytes(item) - except WebSocketDisconnect: - pass - - sender_task = asyncio.create_task(sender()) - - client.set_proxy_callbacks( - ws_to_adb=lambda data: stream.decrypt(data), - adb_to_ws=lambda data: stream.encrypt(data) if to_encrypt else data, - ) - - if not client.alive: - await client.init() - - await client.proxy_websocket(websocket) - - while client.alive: - await asyncio.sleep(1.0) - except Exception: - import traceback - - traceback.print_exc() - finally: - if sender_task is not None: - with suppress(Exception): - assert send_queue is not None - await send_queue.put(None) - with suppress(Exception): - await sender_task - if client is not None: - client.remove_listener(EVENT_STREAM, listener) # type: ignore - - if (not client.any_listener(EVENT_STREAM_ANNEXB) and # type: ignore - not client.any_listener(EVENT_STREAM_FMP4)): # type: ignore - client.stop() # type: ignore[union-attr] - - -@app.websocket("/ws/remote_test") -async def websocket_remote_test(websocket: WebSocket) -> None: - listener = client = None - sender_task = None - send_queue: asyncio.Queue[bytes | None] | None = None - - # noinspection PyBroadException - try: - await websocket.accept() - # frame = await websocket.receive_text() - # message = json.loads(frame) - # config_id = message.get("config_id") - config_id = "default_config" - - client = await context.runtime.require_remote_(config_id) - - # loop = asyncio.get_running_loop() - send_queue = asyncio.Queue(maxsize=8) - - # async def sender() -> None: - # try: - # while True: - # item = await send_queue.get() # type: ignore - # if item is None: - # break - # await websocket.send_bytes(item) - # except WebSocketDisconnect: - # pass - # - # sender_task = asyncio.create_task(sender()) - - # def listener(encoded_stream: bytes) -> None: - # # noinspection PyBroadException - # try: - # payload = encoded_stream - # # payload = stream.encrypt(encoded_stream) - # - # def _push() -> None: - # assert send_queue is not None - # if send_queue.full(): - # with suppress(asyncio.QueueEmpty): - # send_queue.get_nowait() - # with suppress(asyncio.QueueFull): - # send_queue.put_nowait(payload) - # - # loop.call_soon_threadsafe(_push) # type: ignore - # except Exception: - # import traceback - # traceback.print_exc() - # - # client.add_listener(EVENT_STREAM, listener) - - if not client.alive: - await client.init() - - await client.proxy_websocket(websocket) - - while client.alive: - await asyncio.sleep(1.0) - except Exception: - import traceback - - traceback.print_exc() - finally: - if sender_task is not None: - with suppress(Exception): - assert send_queue is not None - await send_queue.put(None) - with suppress(Exception): - await sender_task - if client is not None: - client.remove_listener(EVENT_STREAM, listener) # type: ignore - - if (not client.any_listener(EVENT_STREAM_ANNEXB) and # type: ignore - not client.any_listener(EVENT_STREAM_FMP4)): # type: ignore - client.stop() # type: ignore[union-attr] # TODO: Temporarily commented # app.mount("/", StaticFiles(directory="service/dist", html=True), name="static") diff --git a/service/auth/__init__.py b/service/auth/__init__.py new file mode 100644 index 000000000..b86d02059 --- /dev/null +++ b/service/auth/__init__.py @@ -0,0 +1,42 @@ +from .channels import JsonChaChaChannel, SecretStreamBox +from .constants import ( + ARGON2_HASH_BYTES, + ARGON2_MEMLIMIT, + ARGON2_OPSLIMIT, + ARGON2_SALT_BYTES, + DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64, + DEFAULT_SIGNING_SEED_B64, + PROTOCOL_VERSION, + REMEMBER_TTL_SECONDS, + SESSION_TTL_SECONDS, +) +from .crypto import b64d, b64e, canonical_dumps, hkdf_sha256, hmac_sha256 +from .errors import AuthenticationError +from .manager import ServiceAuthManager, verify_server_signature +from .models import ActiveSession, HandshakeContext, PasswordState, RememberedLogin + +__all__ = [ + "ARGON2_HASH_BYTES", + "ARGON2_MEMLIMIT", + "ARGON2_OPSLIMIT", + "ARGON2_SALT_BYTES", + "ActiveSession", + "AuthenticationError", + "DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64", + "DEFAULT_SIGNING_SEED_B64", + "HandshakeContext", + "JsonChaChaChannel", + "PROTOCOL_VERSION", + "PasswordState", + "REMEMBER_TTL_SECONDS", + "RememberedLogin", + "SESSION_TTL_SECONDS", + "SecretStreamBox", + "ServiceAuthManager", + "b64d", + "b64e", + "canonical_dumps", + "hkdf_sha256", + "hmac_sha256", + "verify_server_signature", +] diff --git a/service/auth/channels.py b/service/auth/channels.py new file mode 100644 index 000000000..f78d71109 --- /dev/null +++ b/service/auth/channels.py @@ -0,0 +1,96 @@ +from __future__ import annotations + +import json +from typing import Any + +from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305 + +from .crypto import b64d, b64e, canonical_dumps, session_nonce +from .errors import AuthenticationError + +try: + from nacl import bindings as sodium_bindings +except ModuleNotFoundError: # pragma: no cover - surfaced explicitly at runtime + sodium_bindings = None + + +class JsonChaChaChannel: + """Small framed JSON channel using direction-bound ChaCha20-Poly1305 keys.""" + + def __init__(self, *, tx_key: bytes, rx_key: bytes) -> None: + self._tx = ChaCha20Poly1305(tx_key) + self._rx = ChaCha20Poly1305(rx_key) + self._tx_seq = 0 + self._rx_seq = 0 + + def encrypt(self, payload: dict[str, Any]) -> dict[str, Any]: + seq = self._tx_seq + self._tx_seq += 1 + nonce = session_nonce(seq) + aad = canonical_dumps({"seq": seq, "type": "secure"}) + plaintext = canonical_dumps(payload) + ciphertext = self._tx.encrypt(nonce, plaintext, aad) + return { + "type": "secure", + "seq": seq, + "ciphertext": b64e(ciphertext), + } + + def decrypt(self, message: dict[str, Any]) -> dict[str, Any]: + if message.get("type") != "secure": + raise AuthenticationError("Encrypted control frame expected") + seq = int(message["seq"]) + if seq != self._rx_seq: + raise AuthenticationError("Control frame sequence mismatch") + self._rx_seq += 1 + nonce = session_nonce(seq) + aad = canonical_dumps({"seq": seq, "type": "secure"}) + plaintext = self._rx.decrypt(nonce, b64d(message["ciphertext"]), aad) + return json.loads(plaintext.decode("utf-8")) + + def set_rx_seq(self, seq: int) -> None: + self._rx_seq = seq + + +class SecretStreamBox: + """Directional XChaCha20 secretstream state with context-bound AAD.""" + + def __init__(self, *, tx_key: bytes, rx_key: bytes, aad_prefix: bytes) -> None: + if sodium_bindings is None: + raise RuntimeError("PyNaCl is required for secretstream websocket transport") + self._aad_prefix = aad_prefix + self._tx_seq = 0 + self._rx_seq = 0 + self._tx_state = sodium_bindings.crypto_secretstream_xchacha20poly1305_state() + self._rx_state = sodium_bindings.crypto_secretstream_xchacha20poly1305_state() + self.tx_header = sodium_bindings.crypto_secretstream_xchacha20poly1305_init_push(self._tx_state, tx_key) + self._rx_key = rx_key + + def init_pull(self, header: bytes) -> None: + sodium_bindings.crypto_secretstream_xchacha20poly1305_init_pull(self._rx_state, header, self._rx_key) + + def encrypt(self, payload: bytes, *, final: bool = False) -> bytes: + tag = ( + sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_FINAL + if final + else sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE + ) + aad = self._aad(self._tx_seq) + self._tx_seq += 1 + return sodium_bindings.crypto_secretstream_xchacha20poly1305_push(self._tx_state, payload, aad, tag) + + def decrypt(self, ciphertext: bytes) -> bytes: + aad = self._aad(self._rx_seq) + self._rx_seq += 1 + plaintext, tag = sodium_bindings.crypto_secretstream_xchacha20poly1305_pull(self._rx_state, ciphertext, aad) + if tag not in ( + sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE, + sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_FINAL, + ): + raise AuthenticationError("Unexpected stream tag received") + return plaintext + + def _aad(self, seq: int) -> bytes: + return self._aad_prefix + seq.to_bytes(8, "big", signed=False) + + diff --git a/service/auth/constants.py b/service/auth/constants.py new file mode 100644 index 000000000..b5b772251 --- /dev/null +++ b/service/auth/constants.py @@ -0,0 +1,14 @@ +from __future__ import annotations + +import os + +PROTOCOL_VERSION = 1 +SESSION_TTL_SECONDS = 60 * 60 * 12 +REMEMBER_TTL_SECONDS = int(os.getenv("BAAS_REMEMBER_TTL_SECONDS", str(60 * 60 * 24 * 180))) +DEFAULT_SIGNING_SEED_B64 = "SWWTs4OxttQrw_o89jtIM1pj8lhJEomLzfUEbsHjJS4=" +DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64 = "_GMKcfOCE-0_erXPJQRQv6mLiNBnT3tdHmAaXwWRis4=" + +ARGON2_SALT_BYTES = 16 +ARGON2_HASH_BYTES = 32 +ARGON2_OPSLIMIT = 3 +ARGON2_MEMLIMIT = 64 * 1024 * 1024 diff --git a/service/auth/crypto.py b/service/auth/crypto.py new file mode 100644 index 000000000..a4cd45d2a --- /dev/null +++ b/service/auth/crypto.py @@ -0,0 +1,61 @@ +from __future__ import annotations + +import base64 +import hashlib +import hmac +import json +from typing import Any + +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.kdf.hkdf import HKDF + +from .constants import ARGON2_HASH_BYTES, ARGON2_MEMLIMIT, ARGON2_OPSLIMIT +from .errors import AuthenticationError + +try: + from nacl import pwhash +except ModuleNotFoundError: # pragma: no cover - surfaced explicitly at runtime + pwhash = None + + +def b64e(data: bytes) -> str: + return base64.urlsafe_b64encode(data).decode("ascii") + + +def b64d(value: str) -> bytes: + return base64.urlsafe_b64decode(value.encode("ascii")) + + +def canonical_dumps(payload: dict[str, Any]) -> bytes: + return json.dumps(payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + + +def hkdf_sha256(key_material: bytes, info: bytes, length: int, salt: bytes | None = None) -> bytes: + return HKDF( + algorithm=hashes.SHA256(), + length=length, + salt=salt, + info=info, + ).derive(key_material) + + +def hmac_sha256(key: bytes, data: bytes) -> bytes: + return hmac.new(key, data, hashlib.sha256).digest() + + +def argon2(password: str, salt: bytes) -> bytes: + if pwhash is None: + raise RuntimeError("PyNaCl is required for Argon2id password derivation") + return pwhash.argon2id.kdf( + ARGON2_HASH_BYTES, + password.encode("utf-8"), + salt, + opslimit=ARGON2_OPSLIMIT, + memlimit=ARGON2_MEMLIMIT, + ) + + +def session_nonce(seq: int) -> bytes: + if seq < 0: + raise AuthenticationError("Sequence number underflow") + return seq.to_bytes(12, "big", signed=False) diff --git a/service/auth/errors.py b/service/auth/errors.py new file mode 100644 index 000000000..1bda9091e --- /dev/null +++ b/service/auth/errors.py @@ -0,0 +1,2 @@ +class AuthenticationError(Exception): + """Raised when an authentication or session step fails.""" diff --git a/service/encryption.py b/service/auth/manager.py similarity index 78% rename from service/encryption.py rename to service/auth/manager.py index ffb3eef25..2fffc4a78 100644 --- a/service/encryption.py +++ b/service/auth/manager.py @@ -1,7 +1,6 @@ from __future__ import annotations import asyncio -import base64 import hashlib import hmac import json @@ -10,220 +9,25 @@ import threading import time import uuid -from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Optional +from typing import Any from cryptography.exceptions import InvalidSignature -from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey, Ed25519PublicKey from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey, X25519PublicKey -from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305 -from cryptography.hazmat.primitives.kdf.hkdf import HKDF -try: - from nacl import bindings as sodium_bindings - from nacl import pwhash -except ModuleNotFoundError: # pragma: no cover - surfaced explicitly at runtime - sodium_bindings = None - pwhash = None - - -PROTOCOL_VERSION = 1 -SESSION_TTL_SECONDS = 60 * 60 * 12 -REMEMBER_TTL_SECONDS = int(os.getenv("BAAS_REMEMBER_TTL_SECONDS", str(60 * 60 * 24 * 180))) -DEFAULT_SIGNING_SEED_B64 = "SWWTs4OxttQrw_o89jtIM1pj8lhJEomLzfUEbsHjJS4=" -DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64 = "_GMKcfOCE-0_erXPJQRQv6mLiNBnT3tdHmAaXwWRis4=" - -ARGON2_SALT_BYTES = 16 -ARGON2_HASH_BYTES = 32 -ARGON2_OPSLIMIT = 3 -ARGON2_MEMLIMIT = 64 * 1024 * 1024 - - -class AuthenticationError(Exception): - """Raised when an authentication or session step fails.""" - - -def b64e(data: bytes) -> str: - return base64.urlsafe_b64encode(data).decode("ascii") - - -def b64d(value: str) -> bytes: - return base64.urlsafe_b64decode(value.encode("ascii")) - - -def canonical_dumps(payload: dict[str, Any]) -> bytes: - return json.dumps(payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8") - - -def hkdf_sha256(key_material: bytes, info: bytes, length: int, salt: bytes | None = None) -> bytes: - return HKDF( - algorithm=hashes.SHA256(), - length=length, - salt=salt, - info=info, - ).derive(key_material) - - -def hmac_sha256(key: bytes, data: bytes) -> bytes: - return hmac.new(key, data, hashlib.sha256).digest() - - -def _argon2(password: str, salt: bytes) -> bytes: - if pwhash is None: - raise RuntimeError("PyNaCl is required for Argon2id password derivation") - return pwhash.argon2id.kdf( - ARGON2_HASH_BYTES, - password.encode("utf-8"), - salt, - opslimit=ARGON2_OPSLIMIT, - memlimit=ARGON2_MEMLIMIT, - ) - - -def _session_nonce(seq: int) -> bytes: - if seq < 0: - raise AuthenticationError("Sequence number underflow") - return seq.to_bytes(12, "big", signed=False) - - -@dataclass -class PasswordState: - initialized: bool = False - pwd_epoch: int = 0 - pwd_salt: bytes | None = None - pwd_hash: bytes | None = None - - def as_public_dict(self) -> dict[str, Any]: - return { - "initialized": self.initialized, - "pwd_epoch": self.pwd_epoch, - "pwd_salt": b64e(self.pwd_salt) if self.pwd_salt else None, - "argon2": { - "algorithm": "argon2id", - "opslimit": ARGON2_OPSLIMIT, - "memlimit": ARGON2_MEMLIMIT, - "salt_bytes": ARGON2_SALT_BYTES, - "hash_bytes": ARGON2_HASH_BYTES, - }, - } - - -@dataclass -class ActiveSession: - session_id: str - created_at: float - expires_at: float - pwd_epoch: int - master_secret: bytes - resume_secret: bytes - control_queues: set[asyncio.Queue] = field(default_factory=set) - - -@dataclass -class RememberedLogin: - token_id: str - token_hash: bytes - created_at: float - expires_at: float - pwd_epoch: int - - -@dataclass -class HandshakeContext: - kind: str - channel: str - client_nonce: bytes - server_nonce: bytes - client_public_key: bytes - server_private_key: X25519PrivateKey - server_public_key: bytes - transcript: bytes - transcript_hash: bytes - shared_key: bytes - preauth_server_tx: bytes - preauth_server_rx: bytes - - -class JsonChaChaChannel: - """Small framed JSON channel using direction-bound ChaCha20-Poly1305 keys.""" - - def __init__(self, *, tx_key: bytes, rx_key: bytes) -> None: - self._tx = ChaCha20Poly1305(tx_key) - self._rx = ChaCha20Poly1305(rx_key) - self._tx_seq = 0 - self._rx_seq = 0 - - def encrypt(self, payload: dict[str, Any]) -> dict[str, Any]: - seq = self._tx_seq - self._tx_seq += 1 - nonce = _session_nonce(seq) - aad = canonical_dumps({"seq": seq, "type": "secure"}) - plaintext = canonical_dumps(payload) - ciphertext = self._tx.encrypt(nonce, plaintext, aad) - return { - "type": "secure", - "seq": seq, - "ciphertext": b64e(ciphertext), - } - - def decrypt(self, message: dict[str, Any]) -> dict[str, Any]: - if message.get("type") != "secure": - raise AuthenticationError("Encrypted control frame expected") - seq = int(message["seq"]) - if seq != self._rx_seq: - raise AuthenticationError("Control frame sequence mismatch") - self._rx_seq += 1 - nonce = _session_nonce(seq) - aad = canonical_dumps({"seq": seq, "type": "secure"}) - plaintext = self._rx.decrypt(nonce, b64d(message["ciphertext"]), aad) - return json.loads(plaintext.decode("utf-8")) - - def set_rx_seq(self, seq: int) -> None: - self._rx_seq = seq - - -class SecretStreamBox: - """Directional XChaCha20 secretstream state with context-bound AAD.""" - - def __init__(self, *, tx_key: bytes, rx_key: bytes, aad_prefix: bytes) -> None: - if sodium_bindings is None: - raise RuntimeError("PyNaCl is required for secretstream websocket transport") - self._aad_prefix = aad_prefix - self._tx_seq = 0 - self._rx_seq = 0 - self._tx_state = sodium_bindings.crypto_secretstream_xchacha20poly1305_state() - self._rx_state = sodium_bindings.crypto_secretstream_xchacha20poly1305_state() - self.tx_header = sodium_bindings.crypto_secretstream_xchacha20poly1305_init_push(self._tx_state, tx_key) - self._rx_key = rx_key - - def init_pull(self, header: bytes) -> None: - sodium_bindings.crypto_secretstream_xchacha20poly1305_init_pull(self._rx_state, header, self._rx_key) - - def encrypt(self, payload: bytes, *, final: bool = False) -> bytes: - tag = ( - sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_FINAL - if final - else sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE - ) - aad = self._aad(self._tx_seq) - self._tx_seq += 1 - return sodium_bindings.crypto_secretstream_xchacha20poly1305_push(self._tx_state, payload, aad, tag) - - def decrypt(self, ciphertext: bytes) -> bytes: - aad = self._aad(self._rx_seq) - self._rx_seq += 1 - plaintext, tag = sodium_bindings.crypto_secretstream_xchacha20poly1305_pull(self._rx_state, ciphertext, aad) - if tag not in ( - sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE, - sodium_bindings.crypto_secretstream_xchacha20poly1305_TAG_FINAL, - ): - raise AuthenticationError("Unexpected stream tag received") - return plaintext - - def _aad(self, seq: int) -> bytes: - return self._aad_prefix + seq.to_bytes(8, "big", signed=False) +from .channels import JsonChaChaChannel, SecretStreamBox +from .constants import ( + ARGON2_SALT_BYTES, + DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64, + DEFAULT_SIGNING_SEED_B64, + REMEMBER_TTL_SECONDS, + SESSION_TTL_SECONDS, PROTOCOL_VERSION, +) +from .crypto import argon2, b64d, b64e, canonical_dumps, hkdf_sha256, hmac_sha256 +from .errors import AuthenticationError +from .models import ActiveSession, HandshakeContext, PasswordState, RememberedLogin class ServiceAuthManager: @@ -653,7 +457,7 @@ def _auth_context(self, handshake: HandshakeContext, pwd_epoch: int) -> bytes: def _password_state_for(self, *, password: str, epoch: int) -> PasswordState: salt = secrets.token_bytes(ARGON2_SALT_BYTES) - verifier = _argon2(password, salt) + verifier = argon2(password, salt) return PasswordState( initialized=True, pwd_epoch=epoch, diff --git a/service/auth/models.py b/service/auth/models.py new file mode 100644 index 000000000..52ffb5b08 --- /dev/null +++ b/service/auth/models.py @@ -0,0 +1,70 @@ +from __future__ import annotations + +import asyncio +from dataclasses import dataclass, field +from typing import Any + +from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey + +from .constants import ARGON2_HASH_BYTES, ARGON2_MEMLIMIT, ARGON2_OPSLIMIT, ARGON2_SALT_BYTES +from .crypto import b64e + + +@dataclass +class PasswordState: + initialized: bool = False + pwd_epoch: int = 0 + pwd_salt: bytes | None = None + pwd_hash: bytes | None = None + + def as_public_dict(self) -> dict[str, Any]: + return { + "initialized": self.initialized, + "pwd_epoch": self.pwd_epoch, + "pwd_salt": b64e(self.pwd_salt) if self.pwd_salt else None, + "argon2": { + "algorithm": "argon2id", + "opslimit": ARGON2_OPSLIMIT, + "memlimit": ARGON2_MEMLIMIT, + "salt_bytes": ARGON2_SALT_BYTES, + "hash_bytes": ARGON2_HASH_BYTES, + }, + } + + +@dataclass +class ActiveSession: + session_id: str + created_at: float + expires_at: float + pwd_epoch: int + master_secret: bytes + resume_secret: bytes + control_queues: set[asyncio.Queue] = field(default_factory=set) + + +@dataclass +class RememberedLogin: + token_id: str + token_hash: bytes + created_at: float + expires_at: float + pwd_epoch: int + + +@dataclass +class HandshakeContext: + kind: str + channel: str + client_nonce: bytes + server_nonce: bytes + client_public_key: bytes + server_private_key: X25519PrivateKey + server_public_key: bytes + transcript: bytes + transcript_hash: bytes + shared_key: bytes + preauth_server_tx: bytes + preauth_server_rx: bytes + + diff --git a/service/conf/__init__.py b/service/conf/__init__.py new file mode 100644 index 000000000..d02894f13 --- /dev/null +++ b/service/conf/__init__.py @@ -0,0 +1,29 @@ +from .initializer import ConfigInitializer +from .manager import ConfigManager +from .ops import ( + check_and_update_user_config, + check_config, + check_event_config, + check_single_event, + check_static_config, + check_switch_config, + delete_deprecated_config, + update_config_reserve_old, +) +from .paths import ConfigPathError, ensure_safe_config_id, resolve_config_dir + +__all__ = [ + "ConfigInitializer", + "ConfigManager", + "ConfigPathError", + "check_and_update_user_config", + "check_config", + "check_event_config", + "check_single_event", + "check_static_config", + "check_switch_config", + "delete_deprecated_config", + "ensure_safe_config_id", + "resolve_config_dir", + "update_config_reserve_old", +] diff --git a/service/conf/initializer.py b/service/conf/initializer.py new file mode 100644 index 000000000..f61567efd --- /dev/null +++ b/service/conf/initializer.py @@ -0,0 +1,138 @@ +from __future__ import annotations + +import datetime +import json +from pathlib import Path +from typing import Iterable + +from core.config import default_config +from core.config.config_set import ConfigSet + +from .paths import ensure_safe_config_id, resolve_config_dir + + +class ConfigInitializer: + """Create and migrate BAAS config files under one project root.""" + + def __init__(self, project_root: Path | str = ".") -> None: + self.project_root = Path(project_root) + self.config_root = self.project_root / "config" + self.error_log = self.project_root / "error.log" + + def check_config(self, config_ids: str | Iterable[str], server=None, name=None) -> None: + self.config_root.mkdir(exist_ok=True) + self.check_static_config() + ids = [config_ids] if isinstance(config_ids, str) else list(config_ids) + for raw_id in ids: + config_id = ensure_safe_config_id(raw_id) + config_dir = resolve_config_dir(self.config_root, config_id) + config_dir.mkdir(exist_ok=True) + self.delete_deprecated_config("display.json", config_id) + self.check_and_update_user_config(config_id, server=server, name=name) + config = ConfigSet(config_dir=config_id) + config.update_create_quantity_entry() + self.check_event_config(config_id, config) + self.check_switch_config(config_id) + + def check_switch_config(self, config_id: str = "default_config") -> None: + path = resolve_config_dir(self.config_root, config_id) / "switch.json" + path.write_text(default_config.SWITCH_DEFAULT_CONFIG, encoding="utf-8") + + def check_event_config(self, config_id: str = "default_config", user_config=None) -> None: + path = resolve_config_dir(self.config_root, config_id) / "event.json" + default_event_config = json.loads(default_config.EVENT_DEFAULT_CONFIG) + server = user_config.server_mode + enable_state = user_config.config.new_event_enable_state + if server != "CN": + for item in default_event_config: + for reset in item["daily_reset"]: + reset[0] = reset[0] - 1 + if not path.exists(): + self._write_error(f"path not exist\n{config_id}") + self._write_json(path, default_event_config, indent=2) + return + try: + data = json.loads(path.read_text(encoding="utf-8")) + for index, default_item in enumerate(default_event_config): + existing = next((item for item in data if item["func_name"] == default_item["func_name"]), None) + if existing is None: + temp = default_item + if enable_state == "on": + temp["enabled"] = True + elif enable_state == "off": + temp["enabled"] = False + data.insert(index, temp) + continue + for reset_index, reset in enumerate(existing["daily_reset"]): + if len(reset) != 3: + existing["daily_reset"][reset_index] = [0, 0, 0] + self._merge_missing_keys(default_item, existing) + self._write_json(path, data, indent=2) + except Exception as exc: # noqa: BLE001 - preserve recovery behavior + self._write_error(f"{exc}\n{config_id}") + self._write_json(path, default_event_config, indent=2) + + def delete_deprecated_config(self, file_name, config_id: str | None = None) -> None: + names = [file_name] if isinstance(file_name, str) else list(file_name) + base = self.config_root if config_id is None else resolve_config_dir(self.config_root, config_id) + for name in names: + target = (base / name).resolve() + if target.exists() and target.parent == base.resolve(): + target.unlink() + + def check_static_config(self) -> None: + path = self.config_root / "static.json" + try: + path.write_text(default_config.STATIC_DEFAULT_CONFIG, encoding="utf-8") + except Exception: # noqa: BLE001 - preserve recovery behavior + if path.exists(): + path.unlink() + path.write_text(default_config.STATIC_DEFAULT_CONFIG, encoding="utf-8") + + def check_and_update_user_config(self, config_id: str = "default_config", server=None, name=None) -> None: + path = resolve_config_dir(self.config_root, config_id) / "config.json" + if not path.exists(): + path.write_text(default_config.DEFAULT_CONFIG, encoding="utf-8") + try: + data = json.loads(path.read_text(encoding="utf-8")) + data = self.update_config_reserve_old(data, json.loads(default_config.DEFAULT_CONFIG)) + if name is not None: + data["name"] = name + if server is not None: + data["server"] = server + self._write_json(path, data, indent=2) + except Exception: # noqa: BLE001 - preserve recovery behavior + if path.exists(): + path.unlink() + path.write_text(default_config.DEFAULT_CONFIG, encoding="utf-8") + + @staticmethod + def update_config_reserve_old(config_old: dict, config_new: dict) -> dict: + for key in config_new: + if key not in config_old: + config_old[key] = config_new[key] + for key in list(config_old): + if key not in config_new: + del config_old[key] + return config_old + + @staticmethod + def check_single_event(new_event: dict, old_event: dict) -> dict: + return ConfigInitializer._merge_missing_keys(new_event, old_event) + + @staticmethod + def _merge_missing_keys(new_data: dict, old_data: dict) -> dict: + for key in new_data: + if key not in old_data: + old_data[key] = new_data[key] + return old_data + + def _write_error(self, message: str) -> None: + self.error_log.write_text( + f"{message}\n{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n", + encoding="utf-8", + ) + + @staticmethod + def _write_json(path: Path, data, *, indent: int) -> None: + path.write_text(json.dumps(data, ensure_ascii=False, indent=indent), encoding="utf-8") diff --git a/service/config_manager.py b/service/conf/manager.py similarity index 84% rename from service/config_manager.py rename to service/conf/manager.py index 925984d8e..6ada201b2 100644 --- a/service/config_manager.py +++ b/service/conf/manager.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import copy import json import logging import os @@ -11,12 +12,12 @@ from watchfiles import Change, awatch -from .broadcast import BroadcastChannel -from .diff import PatchConflictError, apply_patch, diff_documents -from .messages import PatchOperation, SyncPushPayload -from .utils import read_setup_toml, write_setup_toml +from service.types import PatchOperation, SyncPushPayload +from service.update import read_setup_toml, write_setup_toml +from service.utils.broadcast import BroadcastChannel +from service.utils.diff import PatchConflictError, apply_patch, diff_documents -ResourceKey = Tuple[str, Optional[str]] +from .resources import ResourceKey, ResourcePathResolver @dataclass @@ -43,6 +44,7 @@ class ConfigManager: def __init__(self, project_root: Path, loop: asyncio.AbstractEventLoop | None = None) -> None: self._root = project_root self._config_root = self._root / "config" + self._paths = ResourcePathResolver(project_root) self._lock = asyncio.Lock() self._snapshots: Dict[ResourceKey, ResourceSnapshot] = {} self._mtimes: Dict[ResourceKey, float] = {} @@ -52,6 +54,11 @@ def __init__(self, project_root: Path, loop: asyncio.AbstractEventLoop | None = self._setup_toml: Union[Dict[str, Any], None] = None def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: + """Attach the event loop used for async broadcast delivery. + + Args: + loop: Running asyncio event loop owned by FastAPI lifespan. + """ self._loop = loop self._update_bus.set_loop(loop) @@ -59,19 +66,14 @@ def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: # basic filesystem helpers # ------------------------------------------------------------------ def _file_path(self, resource: str, resource_id: Optional[str]) -> Path: - if resource in ("config", "event"): - if not resource_id: - raise ValueError(f"resource_id required for resource '{resource}'") - return self._config_root / resource_id / f"{resource}.json" - if resource == "gui": - return self._config_root / "gui.json" - if resource == "static": - return self._config_root / "static.json" - if resource == "setup_toml": - return self._root / "setup.toml" - raise ValueError(f"Unsupported resource '{resource}'") + return self._paths.file_path(resource, resource_id) def list_config_ids(self) -> List[str]: + """List config ids that have both `config.json` and `event.json`. + + Returns: + Sorted config directory names under the project config root. + """ ids: List[str] = [] if not self._config_root.exists(): return ids @@ -85,9 +87,14 @@ def list_config_ids(self) -> List[str]: return sorted(ids) async def get_config_list(self) -> ResourceSnapshot: + """Return the current config id list as a snapshot. + + Returns: + ResourceSnapshot whose data is a list of config ids and whose timestamp is current time. + """ async with self._lock: ids = self.list_config_ids() - return ResourceSnapshot(json.loads(json.dumps(ids)), time.time()) + return ResourceSnapshot(copy.deepcopy(ids), time.time()) # ------------------------------------------------------------------ # snapshot helpers @@ -184,7 +191,7 @@ def gen_event_formation_attr(data: dict) -> Union[dict, None]: def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: if self._setup_toml is None: self._setup_toml = {} - merged = json.loads(json.dumps(self._setup_toml)) + merged = copy.deepcopy(self._setup_toml) merged.setdefault("General", {}) merged.setdefault("URLs", {}) merged.setdefault("Paths", {}) @@ -205,7 +212,7 @@ def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: def _merge_gui(self, projection: Dict[str, Any]) -> Dict[str, Any]: if self._gui_full is None: self._gui_full = {} - merged = json.loads(json.dumps(self._gui_full)) # deep copy via json + merged = copy.deepcopy(self._gui_full) merged.setdefault("MainWindow", {}) merged.setdefault("QFluentWidgets", {}) main_window = projection.get("MainWindow", {}) @@ -249,14 +256,24 @@ def _load_from_disk(self, resource: str, resource_id: Optional[str]) -> Resource return snapshot async def get_snapshot(self, resource: str, resource_id: Optional[str]) -> ResourceSnapshot: + """Load or return a cached resource snapshot. + + Args: + resource: Resource family, such as config, event, gui, static, or setup_toml. + resource_id: Config id for config/event resources; otherwise None. + + Returns: + Deep-copied ResourceSnapshot safe for callers to mutate. + """ key = (resource, resource_id) async with self._lock: snapshot = self._snapshots.get(key) if snapshot is None: - snapshot = self._load_from_disk(resource, resource_id) - return ResourceSnapshot(json.loads(json.dumps(snapshot.data)), snapshot.timestamp) + snapshot = await asyncio.to_thread(self._load_from_disk, resource, resource_id) + return ResourceSnapshot(copy.deepcopy(snapshot.data), snapshot.timestamp) async def get_static_snapshot(self) -> ResourceSnapshot: + """Return the static resource snapshot with computed activity metadata.""" snapshot = await self.get_snapshot("static", None) return snapshot @@ -272,16 +289,31 @@ async def apply_patch( timestamp: float, origin: str = "backend", ) -> ResourceSnapshot: + """Apply JSON Patch operations to a mutable resource and publish the change. + + Args: + resource: Mutable resource family. + resource_id: Config id for config/event resources; otherwise None. + operations: PatchOperation instances or raw operation dictionaries. + timestamp: Client snapshot timestamp used for conflict detection. + origin: Source tag included in outbound sync pushes. + + Returns: + Updated resource snapshot. + + Raises: + PatchConflictError: If the patch is stale or cannot be applied. + """ key = (resource, resource_id) async with self._lock: snapshot = self._snapshots.get(key) if snapshot is None: - snapshot = self._load_from_disk(resource, resource_id) + snapshot = await asyncio.to_thread(self._load_from_disk, resource, resource_id) elif timestamp < snapshot.timestamp: raise PatchConflictError("Incoming patch is older than current snapshot") - current_data = json.loads(json.dumps(snapshot.data)) + current_data = copy.deepcopy(snapshot.data) ops_payload = [op.model_dump() if isinstance(op, PatchOperation) else dict(op) for op in operations] updated = apply_patch(current_data, ops_payload) @@ -305,9 +337,9 @@ async def apply_patch( to_dump = updated if resource == "setup_toml": - write_setup_toml(to_dump) + await asyncio.to_thread(write_setup_toml, to_dump) else: - self._write_json(path, to_dump, resource) + await asyncio.to_thread(self._write_json, path, to_dump, resource) new_timestamp = max(timestamp, time.time(), path.stat().st_mtime) new_snapshot = ResourceSnapshot(data=updated, timestamp=new_timestamp) @@ -320,7 +352,7 @@ async def apply_patch( ], origin=origin, ) await self._update_bus.publish(payload.model_dump()) - return ResourceSnapshot(json.loads(json.dumps(new_snapshot.data)), new_snapshot.timestamp) + return ResourceSnapshot(copy.deepcopy(new_snapshot.data), new_snapshot.timestamp) def _write_json(self, path: Path, data: Any, resource: str) -> None: indent = 4 if resource in ("config", "gui") else 2 @@ -328,17 +360,20 @@ def _write_json(self, path: Path, data: Any, resource: str) -> None: json.dump(data, fp, indent=indent, ensure_ascii=False) async def subscribe_updates(self) -> asyncio.Queue: + """Subscribe to filesystem/backend/frontend config update messages.""" if self._loop is None: raise RuntimeError("ConfigManager event loop not configured") return self._update_bus.subscribe() def unsubscribe_updates(self, queue: asyncio.Queue) -> None: + """Remove a queue previously returned by `subscribe_updates`.""" self._update_bus.unsubscribe(queue) # ------------------------------------------------------------------ # disk scanning # ------------------------------------------------------------------ async def scan_once(self) -> None: + """Scan known config resources once and publish add/remove/resource diffs.""" current_ids = set(self.list_config_ids()) previous_ids = set(self._known_config_ids) if hasattr(self, "_known_config_ids") else set() @@ -412,14 +447,20 @@ async def _check_resource(self, resource: str, resource_id: Optional[str]) -> No await self._update_bus.publish(payload.model_dump()) async def watch_filesystem(self) -> None: + """Watch config files and setup.toml, publishing resource-level changes.""" if self._loop is None: self._loop = asyncio.get_running_loop() self._update_bus.set_loop(self._loop) await self.scan_once() + self._config_root.mkdir(exist_ok=True) + watch_paths = [self._config_root] + setup_toml = self._root / "setup.toml" + if setup_toml.exists(): + watch_paths.append(setup_toml) try: - async for changes in awatch(self._root, recursive=True): + async for changes in awatch(*watch_paths, recursive=True): await self._handle_watch_batch(changes) except asyncio.CancelledError: raise diff --git a/service/conf/ops.py b/service/conf/ops.py new file mode 100644 index 000000000..ce9f047ea --- /dev/null +++ b/service/conf/ops.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +from service.conf.initializer import ConfigInitializer + + +def check_switch_config(dir_path="./default_config"): + ConfigInitializer().check_switch_config(_normalize_config_id(dir_path)) + + +def check_single_event(new_event, old_event): + return ConfigInitializer.check_single_event(new_event, old_event) + + +def check_event_config(dir_path="./default_config", user_config=None): + ConfigInitializer().check_event_config(_normalize_config_id(dir_path), user_config) + + +def delete_deprecated_config(file_name, config_name=None): + ConfigInitializer().delete_deprecated_config(file_name, config_name) + + +def check_static_config(): + ConfigInitializer().check_static_config() + + +def update_config_reserve_old(config_old, config_new): + return ConfigInitializer.update_config_reserve_old(config_old, config_new) + + +def check_and_update_user_config(dir_path="./default_config", server=None, name=None): + ConfigInitializer().check_and_update_user_config(_normalize_config_id(dir_path), server=server, name=name) + + +def check_config(dir_path, server=None, name=None): + ConfigInitializer().check_config(_normalize_config_ids(dir_path), server=server, name=name) + + +def _normalize_config_id(config_id: str) -> str: + return str(config_id).replace("./", "", 1) + + +def _normalize_config_ids(config_ids): + if isinstance(config_ids, list): + return [_normalize_config_id(item) for item in config_ids] + return _normalize_config_id(config_ids) diff --git a/service/conf/paths.py b/service/conf/paths.py new file mode 100644 index 000000000..3d6b9b0e7 --- /dev/null +++ b/service/conf/paths.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +from pathlib import Path + + +class ConfigPathError(ValueError): + """Raised when a config id would escape the configured config root.""" + + +def ensure_safe_config_id(config_id: str) -> str: + """Validate and normalize a config id. + + Args: + config_id: User or API supplied config identifier. + + Returns: + The stripped config id if it contains no path separators. + + Raises: + ConfigPathError: If the id is empty or would address nested/parent paths. + """ + value = str(config_id).strip() + if not value: + raise ConfigPathError("config id is required") + if any(sep in value for sep in ("/", "\\")) or value in {".", ".."}: + raise ConfigPathError(f"invalid config id: {config_id!r}") + return value + + +def resolve_config_dir(config_root: Path, config_id: str) -> Path: + """Resolve a config directory under `config_root` without allowing escape. + + Args: + config_root: Directory that owns all config folders. + config_id: Single config identifier. + + Returns: + Absolute path to the config directory. + + Raises: + ConfigPathError: If `config_id` is unsafe or resolves outside `config_root`. + """ + safe_id = ensure_safe_config_id(config_id) + root = config_root.resolve() + target = (root / safe_id).resolve() + if target != root / safe_id: + raise ConfigPathError(f"invalid config path: {config_id!r}") + return target diff --git a/service/conf/resources.py b/service/conf/resources.py new file mode 100644 index 000000000..9f242fa46 --- /dev/null +++ b/service/conf/resources.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Optional + +from .paths import resolve_config_dir + + +ResourceKey = tuple[str, Optional[str]] + + +class ResourcePathResolver: + def __init__(self, project_root: Path) -> None: + self.root = project_root + self.config_root = self.root / "config" + + def file_path(self, resource: str, resource_id: Optional[str]) -> Path: + if resource in ("config", "event"): + if not resource_id: + raise ValueError(f"resource_id required for resource '{resource}'") + return resolve_config_dir(self.config_root, resource_id) / f"{resource}.json" + if resource == "gui": + return self.config_root / "gui.json" + if resource == "static": + return self.config_root / "static.json" + if resource == "setup_toml": + return self.root / "setup.toml" + raise ValueError(f"Unsupported resource '{resource}'") diff --git a/service/context.py b/service/context.py index 2322c2cfd..f2005acae 100644 --- a/service/context.py +++ b/service/context.py @@ -6,9 +6,9 @@ from pathlib import Path from typing import Optional -from .encryption import ServiceAuthManager -from .config_manager import ConfigManager -from .logging import LogManager +from .auth import ServiceAuthManager +from .conf.manager import ConfigManager +from .utils.logging import LogManager from .runtime import ServiceRuntime @@ -37,7 +37,7 @@ async def startup(self) -> None: await self.log_manager.start() self._fs_task = asyncio.create_task(self.config_manager.watch_filesystem(), name="config-fs-watch") - threading.Thread(target=self.runtime.init_all_data).start() + threading.Thread(target=self.runtime.init_all_data, name="service-init-all-data", daemon=True).start() async def shutdown(self) -> None: diff --git a/service/messages.py b/service/messages.py deleted file mode 100644 index 7ad211bb2..000000000 --- a/service/messages.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import annotations - -from typing import Any, Dict, List, Literal, Optional, Union - -from pydantic import AliasChoices, BaseModel, Field, field_validator - - -class PatchOperation(BaseModel): - op: Literal["add", "remove", "replace"] - path: str - value: Union[Any, None] = None - - @field_validator("path") - def validate_path(cls, value: str) -> str: - if value != "" and not value.startswith("/"): - raise ValueError("json-pointer paths must start with '/' or be empty") - return value - - -class SyncPullMessage(BaseModel): - type: Literal["pull"] - resource: Literal["config", "event", "gui", "static", "setup_toml"] - resource_id: Optional[str] = None - is_include_diff_baseline: bool = Field( - default=False, - description="Whether to return baseline timestamp", - validation_alias=AliasChoices("is_include_diff_baseline", "include_diff_baseline"), - ) - - -class SyncPatchMessage(BaseModel): - type: Literal["patch"] - resource: Literal["config", "event", "gui", "setup_toml"] - resource_id: Optional[str] = None - timestamp: float - ops: List[PatchOperation] - - -class ProviderRequest(BaseModel): - type: Literal["static_request", "status_request"] - resource_id: Optional[str] = None - - -class CommandMessage(BaseModel): - type: Literal["command"] - command: str - timestamp: float - config_id: Optional[str] = None - payload: Dict[str, Any] = Field(default_factory=dict) - - -class HandshakeResponse(BaseModel): - type: Literal["handshake_response"] - response: str - timestamp: float - - -class SyncPushPayload(BaseModel): - type: Literal["patch"] = "patch" - resource: Literal["config", "event", "gui", "setup_toml"] - resource_id: Optional[str] = None - timestamp: float - ops: List[PatchOperation] - origin: Literal["backend", "filesystem", "frontend"] = "backend" diff --git a/service/remote/__init__.py b/service/remote/__init__.py new file mode 100644 index 000000000..dcc7e9dd4 --- /dev/null +++ b/service/remote/__init__.py @@ -0,0 +1,4 @@ +from .scrcpy import ScrcpyClient +from .scrcpy_proxy import ScrcpyProxySession + +__all__ = ["ScrcpyClient", "ScrcpyProxySession"] diff --git a/service/lib/scrcpy/scrcpy-server.jar b/service/remote/scrcpy-server.jar similarity index 100% rename from service/lib/scrcpy/scrcpy-server.jar rename to service/remote/scrcpy-server.jar diff --git a/service/lib/scrcpy/__init__.py b/service/remote/scrcpy.py similarity index 98% rename from service/lib/scrcpy/__init__.py rename to service/remote/scrcpy.py index f58bc7811..f2f46cce3 100644 --- a/service/lib/scrcpy/__init__.py +++ b/service/remote/scrcpy.py @@ -12,9 +12,16 @@ from typing import Any, Callable, Optional import websockets -from adbutils import AdbDevice, AdbError, AdbTimeout, ForwardItem from websockets import ClientConnection +try: + from adbutils import AdbDevice, AdbError, AdbTimeout, ForwardItem +except ModuleNotFoundError: # pragma: no cover - remote control dependency is optional at import time + AdbDevice = Any # type: ignore + AdbError = RuntimeError # type: ignore + AdbTimeout = TimeoutError # type: ignore + ForwardItem = Any # type: ignore + # --------------------------------------------------------------------------- # ws-scrcpy server constants diff --git a/service/remote/scrcpy_proxy.py b/service/remote/scrcpy_proxy.py new file mode 100644 index 000000000..b53f3f792 --- /dev/null +++ b/service/remote/scrcpy_proxy.py @@ -0,0 +1,41 @@ +from __future__ import annotations + +from contextlib import suppress +from typing import Any + + +class ScrcpyProxySession: + """Owns callback setup and cleanup for one proxied scrcpy websocket.""" + + def __init__(self, client: Any, stream: Any, *, encrypt_adb_to_ws: bool) -> None: + """Create a proxy session. + + Args: + client: Initialized-compatible `ScrcpyClient` instance. + stream: Secret stream with `encrypt` and `decrypt` methods. + encrypt_adb_to_ws: Whether bytes from ADB should be encrypted before websocket send. + """ + self.client = client + self.stream = stream + self.encrypt_adb_to_ws = encrypt_adb_to_ws + + async def run(self, websocket) -> None: + """Attach stream callbacks, initialize the client if needed, and proxy bytes. + + Args: + websocket: Accepted FastAPI/Starlette websocket. + """ + self.client.set_proxy_callbacks( + ws_to_adb=lambda data: self.stream.decrypt(data), + adb_to_ws=lambda data: self.stream.encrypt(data) if self.encrypt_adb_to_ws else data, + ) + if not self.client.alive: + await self.client.init() + await self.client.proxy_websocket(websocket) + + async def close(self) -> None: + """Clear callbacks and stop the scrcpy client if the proxy is still alive.""" + self.client.set_proxy_callbacks(None, None) + if self.client.alive: + with suppress(Exception): + await self.client.stop() diff --git a/service/runtime.py b/service/runtime.py index ec86520d1..c9640ea67 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import copy import datetime import os import shutil @@ -8,18 +9,23 @@ import time from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Dict, List, Optional, Tuple - -from adbutils import adb - -from core.Baas_thread import Baas_thread -from core.config.config_set import ConfigSet -from core.device import emulator_manager -from core.device.connection import Connection -from main import Main -from .broadcast import BroadcastChannel -from .lib.scrcpy import ScrcpyClient -from .utils import * +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple + +from .conf import ConfigInitializer +from .conf import resolve_config_dir +from .utils.broadcast import BroadcastChannel +from .update import ( + check_for_update, + test_all_repo_sha, + update_to_latest, + validate_cdk, +) + +if TYPE_CHECKING: + from core.Baas_thread import Baas_thread + from core.config.config_set import ConfigSet + from main import Main + from .remote.scrcpy import ScrcpyClient _TASK_ALIAS = { "start_hard_task" : "explore_hard_task", @@ -34,6 +40,19 @@ } +async def run_blocking(func, *args): + """Run a blocking callable in the default executor and return its result. + + Args: + func: Synchronous callable to execute without blocking the event loop. + *args: Positional arguments forwarded to ``func``. + + Returns: + The return value produced by ``func``. + """ + return await asyncio.get_running_loop().run_in_executor(None, func, *args) + + class _SignalHook: def __init__(self, callback) -> None: self._callback = callback @@ -58,12 +77,12 @@ def _default_status(config_id: str) -> Dict[str, Any]: @dataclass class ConfigSession: config_id: str - config_set: ConfigSet - baas: Baas_thread + config_set: "ConfigSet" + baas: "Baas_thread" button_signal: _SignalHook update_signal: _SignalHook exit_signal: _SignalHook - scrcpy_client: ScrcpyClient = None + scrcpy_client: Optional["ScrcpyClient"] = None thread: Optional[threading.Thread] = None status: Dict[str, Any] = field(default_factory=dict) @@ -79,8 +98,8 @@ def __init__(self, project_root: Path, loop: Optional[asyncio.AbstractEventLoop] self._sessions: Dict[str, ConfigSession] = {} self._statuses: Dict[str, Dict[str, Any]] = {} self._lock = asyncio.Lock() - self._main: Optional[Main] = None - self._baas: Optional[Baas_thread] = None + self._main: Optional["Main"] = None + self._baas: Optional["Baas_thread"] = None self._baas_thread: Optional[threading.Thread] = None self._active_config_id: Optional[str] = None self._update_signal: Optional[_SignalHook] = None @@ -88,6 +107,11 @@ def __init__(self, project_root: Path, loop: Optional[asyncio.AbstractEventLoop] self.is_all_data_initialized: bool = False def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: + """Attach the FastAPI event loop used for runtime status broadcasts. + + Args: + loop: Running asyncio event loop. + """ self._loop = loop self._status_bus.set_loop(loop) @@ -95,11 +119,13 @@ def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: # public utility accessors # ------------------------------------------------------------------ def get_main_log_queue(self): + """Return the main BAAS logger queue, initializing `Main` if needed.""" self._ensure_main_sync() assert self._main is not None return self._main.logger.log_collector def init_all_data(self): + """Initialize shared BAAS data and publish readiness when complete.""" assert self._main is not None self._ensure_config() status = self._main.init_all_data() @@ -110,24 +136,32 @@ def init_all_data(self): self.is_all_data_initialized = True def get_log_sources(self) -> List[Tuple[Any, str]]: + """Return per-session logger queues with their provider scopes.""" sources: List[Tuple[Any, str]] = [] for session in self._sessions.values(): sources.append((session.baas.logger.log_collector, f"config:{session.config_id}")) return sources def current_status(self) -> Dict[str, Dict[str, Any]]: + """Return a deep-copied snapshot of all runtime statuses.""" with self._status_lock: - return {cid: dict(status) for cid, status in self._statuses.items()} + return copy.deepcopy(self._statuses) def list_sessions(self) -> List[str]: return list(self._sessions.keys()) async def subscribe_status(self) -> asyncio.Queue: + """Subscribe to runtime status updates. + + Returns: + Queue receiving status push dictionaries. + """ if self._loop is None: raise RuntimeError("ServiceRuntime loop is not configured") return self._status_bus.subscribe() def unsubscribe_status(self, queue_obj: asyncio.Queue) -> None: + """Remove a status queue returned by `subscribe_status`.""" self._status_bus.unsubscribe(queue_obj) # ------------------------------------------------------------------ @@ -136,29 +170,39 @@ def unsubscribe_status(self, queue_obj: asyncio.Queue) -> None: def _ensure_main_sync(self) -> None: if self._main is not None: return + from main import Main + self._main = Main(ocr_needed=["en-us", "zh-cn"], jsonify=True, lazy_data=True) async def _ensure_main(self) -> None: - await asyncio.get_running_loop().run_in_executor(None, self._ensure_main_sync) # type: ignore + await run_blocking(self._ensure_main_sync) - @staticmethod - def _ensure_config() -> None: + def _ensure_config(self) -> None: config_dir_list = [] - for _dir_ in os.listdir('./config'): - if os.path.isdir(f'./config/{_dir_}'): - files = os.listdir(f'./config/{_dir_}') + config_root = self._project_root / "config" + initializer = ConfigInitializer(self._project_root) + config_root.mkdir(exist_ok=True) + for _dir_ in os.listdir(config_root): + config_dir = config_root / _dir_ + if config_dir.is_dir(): + files = os.listdir(config_dir) if 'config.json' in files: - check_config(_dir_) + initializer.check_config(_dir_) + config_dir_list.append(_dir_) if len(config_dir_list) == 0: - check_config('default_config') + initializer.check_config('default_config') async def ensure_ready(self) -> None: + """Ensure lazy core `Main` initialization has completed.""" await self._ensure_main() def _get_or_create_session(self, config_id: str) -> ConfigSession: session = self._sessions.get(config_id) if session is not None: return session + from core.Baas_thread import Baas_thread + from core.config.config_set import ConfigSet + self._ensure_main_sync() assert self._main is not None config = ConfigSet(config_dir=config_id) @@ -191,6 +235,14 @@ def _get_or_create_session(self, config_id: str) -> ConfigSession: return session async def get_session(self, config_id: str): + """Return an existing config session or create one. + + Args: + config_id: BAAS config directory id. + + Returns: + ConfigSession bound to the config id. + """ async with self._lock: session = self._sessions.get(config_id) if session is None: @@ -198,13 +250,21 @@ async def get_session(self, config_id: str): return session async def start_scheduler(self, config_id: str, set_log=None) -> Dict[str, Any]: - loop = asyncio.get_running_loop() + """Start the scheduler thread for a config. + + Args: + config_id: Target config id. + set_log: Optional callback used to register runtime log queues. + + Returns: + Status payload consumed by `/ws/trigger`. + """ async with self._lock: session = self._get_or_create_session(config_id) if set_log: set_log() if session.thread and session.thread.is_alive(): return {"status": "already-running", "config_id": config_id} - init_ok = await loop.run_in_executor(None, session.baas.init_all_data) # type: ignore + init_ok = await run_blocking(session.baas.init_all_data) if not init_ok: raise RuntimeError("Baas_thread initialization failed") @@ -228,6 +288,7 @@ def runner() -> None: return {"status": "started", "config_id": config_id} async def stop_scheduler(self, config_id: str) -> Dict[str, Any]: + """Stop the scheduler thread for a config if it is running.""" async with self._lock: session = self._sessions.get(config_id) if session is None: @@ -244,9 +305,18 @@ async def stop_scheduler(self, config_id: str) -> Dict[str, Any]: return {"status": "stopped", "config_id": config_id} async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict[str, Any]: + """Run one BAAS task in a daemon worker thread. + + Args: + config_id: Target config id. + task_name: Task command or legacy start_* alias. + set_log: Optional callback used to register runtime log queues. + + Returns: + Command result payload with normalized task name. + """ if task_name in _TASK_ALIAS: task_name = _TASK_ALIAS[task_name] - loop = asyncio.get_running_loop() async with self._lock: session = self._sessions.get(config_id) if session is None: @@ -256,7 +326,7 @@ async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict needs_init = session.baas.scheduler is None if needs_init: - await loop.run_in_executor(None, baas.init_all_data) # type: ignore + await run_blocking(baas.init_all_data) def _call() -> None: try: @@ -291,7 +361,19 @@ def _call() -> None: return {"status": "ok", "task": task_name, "result": 0} - async def require_remote_(self, config_id: str) -> ScrcpyClient: + async def require_remote_(self, config_id: str) -> "ScrcpyClient": + """Return a cached or newly initialized scrcpy client for a config. + + Args: + config_id: Target config id whose BAAS connection supplies the device serial. + + Returns: + Initialized ScrcpyClient. + """ + from adbutils import adb + from core.device.connection import Connection + from .remote.scrcpy import ScrcpyClient + session = await self.get_session(config_id) if session.scrcpy_client is not None: return session.scrcpy_client @@ -303,6 +385,15 @@ async def require_remote_(self, config_id: str) -> ScrcpyClient: # noinspection PyBroadException async def control_device_(self, config_id: str, operation: Dict[str, Any]) -> Dict[str, Any]: + """Send a remote control operation to the scrcpy client. + + Args: + config_id: Target config id. + operation: Operation dictionary with type and data fields. + + Returns: + Structured success/failure payload. + """ loop = asyncio.get_running_loop() session = await self.get_session(config_id) @@ -324,45 +415,46 @@ async def control_device_(self, config_id: str, operation: Dict[str, Any]) -> Di @staticmethod async def detect_adb() -> List[str]: - loop = asyncio.get_running_loop() - adb_res = await loop.run_in_executor(None, emulator_manager.autosearch) # type: ignore + from core.device import emulator_manager + + adb_res = await run_blocking(emulator_manager.autosearch) return adb_res @staticmethod async def valid_cdk(cdk): - loop = asyncio.get_running_loop() - cdk_res = await loop.run_in_executor(None, validate_cdk, cdk) # type: ignore + cdk_res = await run_blocking(validate_cdk, cdk) return cdk_res @staticmethod async def test_all_sha(): - loop = asyncio.get_running_loop() - all_sha_res = await loop.run_in_executor(None, test_all_repo_sha) # type: ignore + all_sha_res = await run_blocking(test_all_repo_sha) return all_sha_res @staticmethod async def check_for_update(): - loop = asyncio.get_running_loop() - all_update_res = await loop.run_in_executor(None, check_for_update) # type: ignore + all_update_res = await run_blocking(check_for_update) return all_update_res - @staticmethod - async def add_config(name, server): + async def add_config(self, name, server): + """Create a new config directory with generated timestamp id.""" serial_name = str(int(datetime.datetime.now().timestamp())) - check_config(serial_name, name=name, server=server) + ConfigInitializer(self._project_root).check_config(serial_name, name=name, server=server) return { "serial": serial_name } @staticmethod async def update_to_latest(): - loop = asyncio.get_running_loop() - await loop.run_in_executor(None, update_to_latest, None) + await run_blocking(update_to_latest, None) return {"status": "updated"} - @staticmethod - async def remove_config(_id): - shutil.rmtree(f'./config/{_id}') + async def remove_config(self, _id): + """Remove a config directory after resolving it inside project config root.""" + target = resolve_config_dir(self._project_root / "config", _id) + if target.exists(): + if not target.is_dir(): + raise ValueError(f"config path is not a directory: {_id}") + shutil.rmtree(target) return {} # ------------------------------------------------------------------ diff --git a/service/types.py b/service/types.py new file mode 100644 index 000000000..72e8cb576 --- /dev/null +++ b/service/types.py @@ -0,0 +1,121 @@ +from __future__ import annotations + +from typing import Any, Dict, List, Literal, Optional, Union + +from pydantic import AliasChoices, BaseModel, Field, field_validator + + +class PatchOperation(BaseModel): + """JSON Patch operation sent over sync channels. + + Attributes: + op: Operation name. Supports add, remove, and replace. + path: JSON Pointer path within the target resource. + value: New value for add/replace. Omitted for remove. + """ + + op: Literal["add", "remove", "replace"] + path: str + value: Union[Any, None] = None + + @field_validator("path") + def validate_path(cls, value: str) -> str: + if value != "" and not value.startswith("/"): + raise ValueError("json-pointer paths must start with '/' or be empty") + return value + + +class SyncPullMessage(BaseModel): + """Request a full resource snapshot from the sync websocket. + + Attributes: + type: Literal message discriminator, always ``pull``. + resource: Resource family to load. + resource_id: Config id for config/event resources; otherwise None. + is_include_diff_baseline: Legacy flag accepted from both old and new field names. + """ + + type: Literal["pull"] + resource: Literal["config", "event", "gui", "static", "setup_toml"] + resource_id: Optional[str] = None + is_include_diff_baseline: bool = Field( + default=False, + description="Whether to return baseline timestamp", + validation_alias=AliasChoices("is_include_diff_baseline", "include_diff_baseline"), + ) + + +class SyncPatchMessage(BaseModel): + """Apply a patch to a mutable resource through the sync websocket. + + Attributes: + type: Literal message discriminator, always ``patch``. + resource: Mutable resource family. + resource_id: Config id for config/event resources; otherwise None. + timestamp: Frontend snapshot timestamp used for conflict detection. + ops: JSON Patch operations to apply. + """ + + type: Literal["patch"] + resource: Literal["config", "event", "gui", "setup_toml"] + resource_id: Optional[str] = None + timestamp: float + ops: List[PatchOperation] + + +class ProviderRequest(BaseModel): + """Request provider-side static or status data. + + Attributes: + type: Provider request kind. + resource_id: Optional future extension point for resource-specific requests. + """ + + type: Literal["static_request", "status_request"] + resource_id: Optional[str] = None + + +class CommandMessage(BaseModel): + """Command envelope accepted by `/ws/trigger`. + + Attributes: + type: Literal message discriminator, always ``command``. + command: Runtime command name. + timestamp: Client timestamp echoed in the command response. + config_id: Target config id for config-scoped commands. + payload: Command-specific arguments. + """ + + type: Literal["command"] + command: str + timestamp: float + config_id: Optional[str] = None + payload: Dict[str, Any] = Field(default_factory=dict) + + +class HandshakeResponse(BaseModel): + """Legacy handshake response model retained for typed consumers.""" + + type: Literal["handshake_response"] + response: str + timestamp: float + + +class SyncPushPayload(BaseModel): + """Backend-to-frontend sync push payload. + + Attributes: + type: Literal message discriminator, always ``patch``. + resource: Resource family that changed. + resource_id: Config id for config/event resources; otherwise None. + timestamp: Backend snapshot timestamp. + ops: Patch operations representing the change. + origin: Source that produced the change. + """ + + type: Literal["patch"] = "patch" + resource: Literal["config", "event", "gui", "setup_toml"] + resource_id: Optional[str] = None + timestamp: float + ops: List[PatchOperation] + origin: Literal["backend", "filesystem", "frontend"] = "backend" diff --git a/service/update/__init__.py b/service/update/__init__.py new file mode 100644 index 000000000..ae2f0e3ce --- /dev/null +++ b/service/update/__init__.py @@ -0,0 +1,25 @@ +from .checks import ( + GitOperationHandler, + VersionInfo, + check_for_update, + get_local_version, + read_setup_toml, + test_all_repo_sha, + test_repo_sha, + update_to_latest, + validate_cdk, + write_setup_toml, +) + +__all__ = [ + "GitOperationHandler", + "VersionInfo", + "check_for_update", + "get_local_version", + "read_setup_toml", + "test_all_repo_sha", + "test_repo_sha", + "update_to_latest", + "validate_cdk", + "write_setup_toml", +] diff --git a/service/utils/update.py b/service/update/checks.py similarity index 93% rename from service/utils/update.py rename to service/update/checks.py index f5189d7fe..7441171ff 100644 --- a/service/utils/update.py +++ b/service/update/checks.py @@ -15,17 +15,12 @@ import requests import tomli_w -try: # Python 3.11+ - import tomllib # type: ignore[import] -except ModuleNotFoundError: # pragma: no cover - Python < 3.11 fallback - import tomli as tomllib # type: ignore[import] - from deploy.installer.const import GetShaMethod, get_remote_sha_methods from deploy.installer.mirrorc_update.const import MirrorCErrorCode from deploy.installer.mirrorc_update.mirrorc_updater import MirrorC_Updater -from deploy.installer.toml_config import DEFAULT_SETTINGS -from ._update import update_repo_to_latest +from service.update.repository import update_repo_to_latest +from service.update.setup_io import read_setup_toml, write_setup_toml RepositoryResult = Dict[str, Any] @@ -309,27 +304,6 @@ def get_local_version(setup_path: Optional[Path] = None) -> Tuple["VersionInfo", return VersionInfo(version=version_value, source="setup.toml", path=path), data, _branch -def read_setup_toml(setup_path: Union[Path, None] = None) -> tuple[dict[str, Any], Union[Path, None]]: - path = setup_path or (Path.cwd() / "setup.toml") - if not path.exists(): - with path.open("wb") as file: - tomli_w.dump(DEFAULT_SETTINGS, file) - - with path.open("rb") as fp: - data = tomllib.load(fp) - return data, path - - -def write_setup_toml(content: dict, setup_path: Union[Path, None] = None) -> None: - path = setup_path or (Path.cwd() / "setup.toml") - if not path.exists(): - with path.open("wb") as file: - tomli_w.dump(DEFAULT_SETTINGS, file) - - with path.open("wb") as fp: - tomli_w.dump(content, fp) - - def _select_remote_record( local_version: Optional[str], results: List[RepositoryResult], diff --git a/service/utils/_update.py b/service/update/repository.py similarity index 100% rename from service/utils/_update.py rename to service/update/repository.py diff --git a/service/update/setup_io.py b/service/update/setup_io.py new file mode 100644 index 000000000..ad3afc85c --- /dev/null +++ b/service/update/setup_io.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any, Union + +import tomli_w + +try: # Python 3.11+ + import tomllib # type: ignore[import] +except ModuleNotFoundError: # pragma: no cover - Python < 3.11 fallback + import tomli as tomllib # type: ignore[import] + +from deploy.installer.toml_config import DEFAULT_SETTINGS + + +def read_setup_toml(setup_path: Union[Path, None] = None) -> tuple[dict[str, Any], Union[Path, None]]: + """Load `setup.toml`, creating it from defaults when missing. + + Args: + setup_path: Optional explicit TOML path. Defaults to `Path.cwd() / "setup.toml"`. + + Returns: + A tuple of parsed TOML content and the path that was read. + """ + path = setup_path or (Path.cwd() / "setup.toml") + if not path.exists(): + with path.open("wb") as file: + tomli_w.dump(DEFAULT_SETTINGS, file) + + with path.open("rb") as fp: + data = tomllib.load(fp) + return data, path + + +def write_setup_toml(content: dict, setup_path: Union[Path, None] = None) -> None: + """Persist setup configuration to TOML. + + Args: + content: TOML-serializable setup configuration. + setup_path: Optional explicit TOML path. Defaults to `Path.cwd() / "setup.toml"`. + """ + path = setup_path or (Path.cwd() / "setup.toml") + if not path.exists(): + with path.open("wb") as file: + tomli_w.dump(DEFAULT_SETTINGS, file) + + with path.open("wb") as fp: + tomli_w.dump(content, fp) diff --git a/service/utils/__init__.py b/service/utils/__init__.py index 1e55d8b9d..30fef6f21 100644 --- a/service/utils/__init__.py +++ b/service/utils/__init__.py @@ -1,13 +1,11 @@ -from .update import * -from .config_ops import * +from .broadcast import BroadcastChannel +from .diff import PatchConflictError, apply_patch, diff_documents +from .logging import LogManager __all__ = [ - "VersionInfo", - "check_for_update", - "test_all_repo_sha", - "validate_cdk", - "read_setup_toml", - "write_setup_toml", - "check_config", - "update_to_latest" + "BroadcastChannel", + "LogManager", + "PatchConflictError", + "apply_patch", + "diff_documents", ] diff --git a/service/broadcast.py b/service/utils/broadcast.py similarity index 100% rename from service/broadcast.py rename to service/utils/broadcast.py diff --git a/service/utils/config_ops.py b/service/utils/config_ops.py deleted file mode 100644 index 18b62d076..000000000 --- a/service/utils/config_ops.py +++ /dev/null @@ -1,147 +0,0 @@ -import datetime -import json -import os - -from core.config import default_config -from core.config.config_set import ConfigSet - - -def check_switch_config(dir_path='./default_config'): - path = './config/' + dir_path + '/switch.json' - with open(path, 'w', encoding='utf-8') as f: - f.write(default_config.SWITCH_DEFAULT_CONFIG) - - -def check_single_event(new_event, old_event): - for key in new_event: - if key not in old_event: - old_event[key] = new_event[key] - return old_event - - -def check_event_config(dir_path='./default_config', user_config=None): - path = './config/' + dir_path + '/event.json' - default_event_config = json.loads(default_config.EVENT_DEFAULT_CONFIG) - server = user_config.server_mode - enable_state = user_config.config.new_event_enable_state - if server != "CN": - for i in range(0, len(default_event_config)): - for j in range(0, len(default_event_config[i]['daily_reset'])): - default_event_config[i]['daily_reset'][j][0] = default_event_config[i]['daily_reset'][j][0] - 1 - if not os.path.exists(path): - with open(path, 'w', encoding='utf-8') as f: - with open("error.log", 'w+', encoding='utf-8') as errorfile: - errorfile.write("path not exist" + '\n' + dir_path + '\n' + datetime.datetime.now().strftime( - '%Y-%m-%d %H:%M:%S') + '\n') - f.write(json.dumps(default_event_config, ensure_ascii=False, indent=2)) - return - try: - with open(path, 'r', encoding='utf-8') as f: # 检查是否有新的配置项 - data = json.load(f) - for i in range(0, len(default_event_config)): - exist = False - for j in range(0, len(data)): - if data[j]['func_name'] == default_event_config[i]['func_name']: - for k in range(0, len(data[i]['daily_reset'])): - if len(data[j]['daily_reset'][k]) != 3: - data[j]['daily_reset'][k] = [0, 0, 0] - data[j] = check_single_event(default_event_config[i], data[j]) - exist = True - break - if not exist: - temp = default_event_config[i] - if enable_state == "on": - temp['enabled'] = True - elif enable_state == "off": - temp['enabled'] = False - data.insert(i, temp) - - with open(path, 'w', encoding='utf-8') as f: - f.write(json.dumps(data, ensure_ascii=False, indent=2)) - except Exception as e: - with open("error.log", 'w+', encoding='utf-8') as f: - f.write(str(e) + '\n' + dir_path + '\n' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + '\n') - with open(path, 'w', encoding='utf-8') as f: - f.write(json.dumps(default_event_config, ensure_ascii=False, indent=2)) - return - - -def delete_deprecated_config(file_name, config_name=None): - # delete useless config file - pre = 'config/' - if config_name is not None: - pre += config_name + '/' - if type(file_name) is str: - path = pre + file_name - if os.path.exists(path): - os.remove(path) - elif type(file_name) is list: - for name in file_name: - path = pre + name - if os.path.exists(path): - os.remove(path) - - -def check_static_config(): - if not os.path.exists('./config/static.json'): - with open('./config/static.json', 'w', encoding='utf-8') as f: - f.write(default_config.STATIC_DEFAULT_CONFIG) - return - try: - with open('./config/static.json', 'w', encoding='utf-8') as f: - f.write(default_config.STATIC_DEFAULT_CONFIG) - except Exception: - os.remove('./config/static.json') - with open('./config/static.json', 'w', encoding='utf-8') as f: - f.write(default_config.STATIC_DEFAULT_CONFIG) - - -def update_config_reserve_old(config_old, config_new): # 保留旧配置原有的键,添加新配置中没有的,删除新配置中没有的键 - for key in config_new: - if key not in config_old: - config_old[key] = config_new[key] - dels = [] - for key in config_old: - if key not in config_new: - dels.append(key) - for key in dels: - del config_old[key] - return config_old - - -def check_and_update_user_config(dir_path='./default_config', server=None, name=None): - path = './config/' + dir_path + '/config.json' - if not os.path.exists(path): - with open(path, 'w', encoding='utf-8') as f: - f.write(default_config.DEFAULT_CONFIG) - try: - with open(path, 'r', encoding='utf-8') as f: - data = json.load(f) - data = update_config_reserve_old(data, json.loads(default_config.DEFAULT_CONFIG)) - if name is not None: - data['name'] = name - if server is not None: - data['server'] = server - with open(path, 'w', encoding='utf-8') as f: - f.write(json.dumps(data, ensure_ascii=False, indent=2)) - except Exception: - os.remove(path) - with open(path, 'w', encoding='utf-8') as f: - f.write(default_config.DEFAULT_CONFIG) - - -def check_config(dir_path, server=None, name=None): - delete_deprecated_config("display.json", dir_path) - if not os.path.exists('./config'): - os.mkdir('./config') - check_static_config() - if type(dir_path) is not list: - dir_path = [dir_path] - for path in dir_path: - if not os.path.exists('./config/' + path): - os.mkdir('./config/' + path) - check_and_update_user_config(path, server, name) - config = ConfigSet(config_dir=path) - config.update_create_quantity_entry() - check_event_config(path, config) - check_switch_config(path) diff --git a/service/diff.py b/service/utils/diff.py similarity index 100% rename from service/diff.py rename to service/utils/diff.py diff --git a/service/logging.py b/service/utils/logging.py similarity index 100% rename from service/logging.py rename to service/utils/logging.py diff --git a/tests/service/test_auth_manager.py b/tests/service/test_auth_manager.py new file mode 100644 index 000000000..d65884160 --- /dev/null +++ b/tests/service/test_auth_manager.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +import asyncio +import shutil +import uuid +from pathlib import Path + +import pytest + +from service.auth import manager as auth_manager_module +from service.auth import AuthenticationError, ServiceAuthManager, canonical_dumps, hmac_sha256 + + +def _workspace_tmp() -> Path: + root = Path("tests/service/.tmp") / uuid.uuid4().hex + root.mkdir(parents=True) + return root + + +def _cleanup(path: Path) -> None: + if path.exists(): + shutil.rmtree(path) + + +def test_auth_manager_password_change_revokes_sessions(monkeypatch): + root = _workspace_tmp() + monkeypatch.setattr(auth_manager_module, "argon2", lambda password, salt: (password.encode("utf-8") + b"0" * 32)[:32]) + try: + manager = ServiceAuthManager(root) + state = manager.initialize_password("secret") + session = manager._new_session_from_secrets( + pwd_epoch=state.pwd_epoch, + master_secret=b"m" * 32, + resume_secret=b"r" * 32, + ) + queue = manager.subscribe_control(session.session_id) + + new_state = asyncio.run(manager.change_password(session_id=session.session_id, new_password="new-secret")) + + assert new_state.pwd_epoch == 2 + assert queue.get_nowait()["type"] == "auth_revoked" + with pytest.raises(AuthenticationError, match="Unknown or revoked"): + manager.get_session(session.session_id) + finally: + _cleanup(root) + + +def test_remember_proof_and_token_round_trip(monkeypatch): + root = _workspace_tmp() + monkeypatch.setattr(auth_manager_module, "argon2", lambda password, salt: (password.encode("utf-8") + b"0" * 32)[:32]) + try: + manager = ServiceAuthManager(root) + state = manager.initialize_password("secret") + session = manager._new_session_from_secrets( + pwd_epoch=state.pwd_epoch, + master_secret=b"m" * 32, + resume_secret=b"r" * 32, + ) + proof = hmac_sha256( + session.resume_secret, + canonical_dumps( + { + "type": "remember_session", + "session_id": session.session_id, + "pwd_epoch": session.pwd_epoch, + } + ), + ) + + verified = manager.verify_remember_proof(session_id=session.session_id, proof=proof) + token, expires_at = manager.issue_remember_token(verified) + + assert verified.session_id == session.session_id + assert token.startswith("v1.") + assert expires_at > verified.created_at + finally: + _cleanup(root) diff --git a/tests/service/test_commands.py b/tests/service/test_commands.py new file mode 100644 index 000000000..1ab93874c --- /dev/null +++ b/tests/service/test_commands.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +import asyncio +from types import SimpleNamespace + +import pytest + +from service.api import commands +from service.types import CommandMessage + + +class _Runtime: + def __init__(self) -> None: + self.calls = [] + + def current_status(self): + return {"default_config": {"running": False}} + + async def solve_task(self, config_id, task_name, set_log=None): + self.calls.append(("solve_task", config_id, task_name, bool(set_log))) + return {"status": "ok", "task": task_name, "result": 0} + + async def detect_adb(self): + return ["127.0.0.1:5555"] + + +def _cmd(command: str, **kwargs) -> CommandMessage: + return CommandMessage(type="command", command=command, timestamp=1.0, **kwargs) + + +def test_execute_status_command(monkeypatch): + runtime = _Runtime() + monkeypatch.setattr(commands, "context", SimpleNamespace(runtime=runtime)) + + result = asyncio.run(commands.execute_command(_cmd("status"))) + + assert result == {"status": "ok", "data": {"default_config": {"running": False}}} + + +def test_execute_start_alias_dispatches_to_runtime(monkeypatch): + runtime = _Runtime() + fake_context = SimpleNamespace(runtime=runtime, ensure_runtime_logger_attached=lambda: None) + monkeypatch.setattr(commands, "context", fake_context) + + result = asyncio.run(commands.execute_command(_cmd("start_normal_task", config_id="default_config"))) + + assert result == {"status": "ok", "data": {"status": "ok", "task": "start_normal_task", "result": 0}} + assert runtime.calls == [("solve_task", "default_config", "start_normal_task", True)] + + +def test_execute_detect_adb_envelope(monkeypatch): + runtime = _Runtime() + monkeypatch.setattr(commands, "context", SimpleNamespace(runtime=runtime)) + + result = asyncio.run(commands.execute_command(_cmd("detect_adb"))) + + assert result == {"status": "ok", "data": {"addresses": ["127.0.0.1:5555"]}} + + +def test_execute_unsupported_command_raises(monkeypatch): + monkeypatch.setattr(commands, "context", SimpleNamespace(runtime=_Runtime())) + + with pytest.raises(ValueError, match="Unsupported command"): + asyncio.run(commands.execute_command(_cmd("unknown"))) diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py new file mode 100644 index 000000000..5849abf43 --- /dev/null +++ b/tests/service/test_config_runtime_update.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +import asyncio +import shutil +import uuid +from pathlib import Path + +import pytest + +from service.conf import ConfigPathError, ensure_safe_config_id, resolve_config_dir +from service.runtime import ServiceRuntime +from service.update.setup_io import read_setup_toml, write_setup_toml + + +def _workspace_tmp() -> Path: + root = Path("tests/service/.tmp") / uuid.uuid4().hex + root.mkdir(parents=True) + return root + + +def _cleanup(path: Path) -> None: + if path.exists(): + shutil.rmtree(path) + + +def test_config_id_path_safety(): + assert ensure_safe_config_id("default_config") == "default_config" + with pytest.raises(ConfigPathError): + ensure_safe_config_id("../outside") + with pytest.raises(ConfigPathError): + resolve_config_dir(Path("config"), "..\\outside") + + +def test_remove_config_dir_stays_inside_config_root(): + root = _workspace_tmp() + try: + target = root / "config" / "default_config" + target.mkdir(parents=True) + (target / "config.json").write_text("{}", encoding="utf-8") + + target = resolve_config_dir(root / "config", "default_config") + if target.exists(): + shutil.rmtree(target) + + assert not target.exists() + with pytest.raises(ConfigPathError): + resolve_config_dir(root / "config", "../outside") + finally: + _cleanup(root) + + +def test_runtime_status_snapshot_is_deep_copy(): + runtime = ServiceRuntime(Path("project")) + runtime._statuses["default_config"] = {"nested": {"running": False}} + + snapshot = runtime.current_status() + snapshot["default_config"]["nested"]["running"] = True + + assert runtime.current_status()["default_config"]["nested"]["running"] is False + + +def test_runtime_remove_config_uses_project_root(): + root = _workspace_tmp() + try: + target = root / "config" / "default_config" + target.mkdir(parents=True) + runtime = ServiceRuntime(root) + + asyncio.run(runtime.remove_config("default_config")) + + assert not target.exists() + finally: + _cleanup(root) + + +def test_setup_toml_io_round_trip(): + root = _workspace_tmp() + setup_path = root / "setup.toml" + try: + data, path = read_setup_toml(setup_path) + data.setdefault("General", {})["mirrorc_cdk"] = "abc" + write_setup_toml(data, path) + loaded, _ = read_setup_toml(setup_path) + + assert loaded["General"]["mirrorc_cdk"] == "abc" + finally: + _cleanup(root) diff --git a/tests/service/test_http_contract.py b/tests/service/test_http_contract.py new file mode 100644 index 000000000..65f3fd0f7 --- /dev/null +++ b/tests/service/test_http_contract.py @@ -0,0 +1,96 @@ +from __future__ import annotations + +import time +from types import SimpleNamespace + +from fastapi import FastAPI +from fastapi.testclient import TestClient + +from service.api import http +from service.auth import AuthenticationError, b64e + + +class _PasswordState: + initialized = True + pwd_epoch = 7 + + +class _AuthManager: + password_state = _PasswordState() + + def __init__(self) -> None: + self.fail_remember = False + + def server_public_key_b64(self) -> str: + return "server-key" + + def verify_remember_proof(self, *, session_id: str, proof: bytes): + if self.fail_remember: + raise AuthenticationError("bad proof") + assert session_id == "session-1" + assert proof == b"proof" + return SimpleNamespace(session_id=session_id) + + def issue_remember_token(self, session) -> tuple[str, float]: + assert session.session_id == "session-1" + return "remember-token", time.time() + 120 + + +class _Runtime: + def current_status(self): + return {"default_config": {"running": False}} + + +def _client(monkeypatch, auth_manager: _AuthManager) -> TestClient: + fake_context = SimpleNamespace(auth_manager=auth_manager, runtime=_Runtime()) + monkeypatch.setattr(http, "context", fake_context) + app = FastAPI() + app.include_router(http.router) + return TestClient(app) + + +def test_health_contract(monkeypatch): + client = _client(monkeypatch, _AuthManager()) + + response = client.get("/health") + + assert response.status_code == 200 + payload = response.json() + assert payload["ok"] is True + assert payload["statuses"] == {"default_config": {"running": False}} + assert payload["auth"] == { + "initialized": True, + "pwd_epoch": 7, + "server_sign_public_key": "server-key", + } + + +def test_remember_auth_sets_cookie(monkeypatch): + client = _client(monkeypatch, _AuthManager()) + + response = client.post("/auth/remember", json={"session_id": "session-1", "proof": b64e(b"proof")}) + + assert response.status_code == 200 + assert response.json()["ok"] is True + assert "baas_remember=remember-token" in response.headers["set-cookie"] + + +def test_remember_auth_failure_returns_401(monkeypatch): + auth_manager = _AuthManager() + auth_manager.fail_remember = True + client = _client(monkeypatch, auth_manager) + + response = client.post("/auth/remember", json={"session_id": "session-1", "proof": b64e(b"proof")}) + + assert response.status_code == 401 + assert response.json()["detail"] == "bad proof" + + +def test_logout_deletes_cookie(monkeypatch): + client = _client(monkeypatch, _AuthManager()) + + response = client.post("/auth/logout") + + assert response.status_code == 200 + assert response.json() == {"ok": True} + assert "baas_remember=" in response.headers["set-cookie"] diff --git a/tests/service/test_remote_proxy.py b/tests/service/test_remote_proxy.py new file mode 100644 index 000000000..ddc262370 --- /dev/null +++ b/tests/service/test_remote_proxy.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +import asyncio + +from service.remote import ScrcpyProxySession + + +class _Stream: + def encrypt(self, payload: bytes) -> bytes: + return b"enc:" + payload + + def decrypt(self, payload: bytes) -> bytes: + return payload.removeprefix(b"enc:") + + +class _Client: + def __init__(self) -> None: + self.alive = False + self.callbacks = None + self.initialized = False + self.proxied = False + self.stopped = False + + def set_proxy_callbacks(self, ws_to_adb=None, adb_to_ws=None): + self.callbacks = (ws_to_adb, adb_to_ws) + + async def init(self): + self.initialized = True + self.alive = True + + async def proxy_websocket(self, websocket): + self.proxied = True + + async def stop(self): + self.stopped = True + self.alive = False + + +def test_scrcpy_proxy_session_lifecycle(): + async def scenario(): + client = _Client() + proxy = ScrcpyProxySession(client, _Stream(), encrypt_adb_to_ws=True) + await proxy.run(object()) + encrypted = client.callbacks[1](b"frame") + decrypted = client.callbacks[0](b"enc:touch") + await proxy.close() + return client, encrypted, decrypted + + client, encrypted, decrypted = asyncio.run(scenario()) + + assert client.initialized is True + assert client.proxied is True + assert client.stopped is True + assert client.callbacks == (None, None) + assert encrypted == b"enc:frame" + assert decrypted == b"touch" diff --git a/tests/service/test_security_contract.py b/tests/service/test_security_contract.py new file mode 100644 index 000000000..e76355ab9 --- /dev/null +++ b/tests/service/test_security_contract.py @@ -0,0 +1,161 @@ +from __future__ import annotations + +import asyncio +from types import SimpleNamespace + +import pytest + +from service.api import security +from service.auth import AuthenticationError, JsonChaChaChannel, b64e + + +class _PasswordState: + initialized = False + pwd_epoch = 1 + + def as_public_dict(self): + return {"pwd_salt": "salt", "argon2": {"time_cost": 1}} + + +class _AuthManager: + def __init__(self) -> None: + self.password_state = _PasswordState() + self.initialized_password = None + + def issue_resume_ticket(self, session): + return f"ticket:{session.session_id}" + + def initialize_password(self, password: str): + self.initialized_password = password + self.password_state.initialized = True + + def open_control_session_after_initialize(self, handshake): + return ( + SimpleNamespace( + session_id="session-1", + expires_at=123.0, + pwd_epoch=1, + master_secret=b"master", + resume_secret=b"resume", + ), + SimpleNamespace(name="control-channel"), + ) + + +class _PreauthChannel: + def __init__(self, decrypted=None) -> None: + self._decrypted = decrypted or {} + + def encrypt(self, payload): + return {"encrypted": payload} + + def decrypt(self, payload): + return self._decrypted if payload == "next" else payload + + +class _WebSocket: + def __init__(self) -> None: + self.cookies = {} + self.sent_json = [] + self.received_json = [] + + async def send_json(self, payload): + self.sent_json.append(payload) + + async def receive_json(self): + return self.received_json.pop(0) + + +class _Stream: + def encrypt(self, data: bytes) -> bytes: + return b"enc:" + data + + def decrypt(self, data: bytes) -> bytes: + return data.removeprefix(b"enc:") + + +class _StreamWebSocket: + def __init__(self, inbound: bytes) -> None: + self.inbound = inbound + self.sent = [] + + async def send_bytes(self, payload: bytes) -> None: + self.sent.append(payload) + + async def receive_bytes(self) -> bytes: + return self.inbound + + +def test_origin_policy_allows_local_and_same_host(monkeypatch): + assert security.is_allowed_origin(None, "example.com") is True + assert security.is_allowed_origin("http://localhost:3000", "example.com") is True + assert security.is_allowed_origin("http://192.168.1.10:5173", "192.168.1.10:8190") is True + assert security.is_allowed_origin("http://evil.example", "service.example") is False + + monkeypatch.setenv("BAAS_SERVICE_ALLOWED_ORIGINS", "https://allowed.example") + assert security.is_allowed_origin("https://allowed.example", "service.example") is True + + +def test_stream_json_uses_binary_frames(): + websocket = _StreamWebSocket(b'enc:{"type":"ping"}') + stream = _Stream() + + asyncio.run(security.send_stream_json(websocket, stream, {"type": "pong"})) + payload = asyncio.run(security.recv_stream_json(websocket, stream)) + + assert websocket.sent == [b'enc:{"type":"pong"}'] + assert payload == {"type": "ping"} + + +def test_json_chacha_channel_round_trip(): + server_tx = b"1" * 32 + client_tx = b"2" * 32 + server = JsonChaChaChannel(tx_key=server_tx, rx_key=client_tx) + client = JsonChaChaChannel(tx_key=client_tx, rx_key=server_tx) + + frame = server.encrypt({"type": "hello"}) + + assert client.decrypt(frame) == {"type": "hello"} + + +def test_finalize_control_auth_initialize_envelope(monkeypatch): + auth_manager = _AuthManager() + monkeypatch.setattr(security, "context", SimpleNamespace(auth_manager=auth_manager)) + websocket = _WebSocket() + + session, channel = asyncio.run( + security.finalize_control_auth( + websocket, + handshake=SimpleNamespace(), + preauth_channel=_PreauthChannel(), + request={"type": "initialize", "password": "secret"}, + ) + ) + + assert auth_manager.initialized_password == "secret" + assert session.session_id == "session-1" + assert channel.name == "control-channel" + assert websocket.sent_json[0]["encrypted"]["type"] == "auth_ok" + assert websocket.sent_json[0]["encrypted"]["resume_ticket"] == "ticket:session-1" + + +def test_business_resume_rejects_channel_mismatch(monkeypatch): + async def fake_begin_server_hello(websocket, *, kind, channel): + return SimpleNamespace(), _PreauthChannel(), {"channel": "provider"} + + monkeypatch.setattr(security, "begin_server_hello", fake_begin_server_hello) + + with pytest.raises(AuthenticationError, match="Requested channel"): + asyncio.run(security.perform_business_resume(_WebSocket(), channel="sync")) + + +def test_business_resume_requires_resume_proof(monkeypatch): + async def fake_begin_server_hello(websocket, *, kind, channel): + ws = websocket + ws.received_json.append({"type": "not_resume_proof"}) + return SimpleNamespace(), _PreauthChannel(), {"channel": "sync"} + + monkeypatch.setattr(security, "begin_server_hello", fake_begin_server_hello) + + with pytest.raises(AuthenticationError, match="Resume proof"): + asyncio.run(security.perform_business_resume(_WebSocket(), channel="sync")) diff --git a/tests/service/test_service_logic.py b/tests/service/test_service_logic.py new file mode 100644 index 000000000..b4bd3871e --- /dev/null +++ b/tests/service/test_service_logic.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import asyncio +from pathlib import Path + +from watchfiles import Change + +from service.utils.broadcast import BroadcastChannel +from service.conf.manager import ConfigManager +from service.utils.diff import apply_patch, diff_documents + + +def test_apply_patch_and_diff_documents(): + original = {"a": 1, "nested": {"keep": True}, "items": [1, 2]} + updated = apply_patch( + original, + [ + {"op": "replace", "path": "/a", "value": 2}, + {"op": "add", "path": "/nested/new", "value": "x"}, + {"op": "remove", "path": "/items/0"}, + ], + ) + + assert updated == {"a": 2, "nested": {"keep": True, "new": "x"}, "items": [2]} + assert {"op": "replace", "path": "/a", "value": 3} in diff_documents(updated, {**updated, "a": 3}) + + +def test_broadcast_channel_drops_oldest_when_subscriber_is_full(): + async def scenario(): + channel = BroadcastChannel(max_queue_size=1) + queue = channel.subscribe() + await channel.publish({"seq": 1}) + await channel.publish({"seq": 2}) + return await queue.get() + + assert asyncio.run(scenario()) == {"seq": 2} + + +def test_config_manager_classifies_config_files(): + root = Path("project") + manager = ConfigManager(root) + config_path = root / "config" / "default_config" / "config.json" + event_path = root / "config" / "default_config" / "event.json" + gui_path = root / "config" / "gui.json" + static_path = root / "config" / "static.json" + + assert manager._classify_config_change(Change.modified, config_path) == (False, ("config", "default_config")) + assert manager._classify_config_change(Change.modified, event_path) == (False, ("event", "default_config")) + assert manager._classify_config_change(Change.modified, gui_path) == (False, ("gui", None)) + assert manager._classify_config_change(Change.modified, static_path) == (False, ("static", None)) + assert manager._classify_config_change(Change.added, root / "config" / "new_config") == (True, None) diff --git a/tests/service/test_ws_behaviors.py b/tests/service/test_ws_behaviors.py new file mode 100644 index 000000000..9a41ce3d3 --- /dev/null +++ b/tests/service/test_ws_behaviors.py @@ -0,0 +1,97 @@ +from __future__ import annotations + +import asyncio +from types import SimpleNamespace + +from service.api import ws_provider, ws_remote, ws_sync + + +class _Stream: + def encrypt(self, payload: bytes) -> bytes: + return payload + + def decrypt(self, payload: bytes) -> bytes: + return payload + + +class _WebSocket: + def __init__(self) -> None: + self.sent = [] + + async def send_bytes(self, payload: bytes): + self.sent.append(payload) + + +def test_sync_sender_preserves_push_envelope(): + async def scenario(): + queue = asyncio.Queue() + websocket = _WebSocket() + await queue.put({"type": "patch"}) + task = asyncio.create_task(ws_sync.sync_sender(websocket, _Stream(), queue)) + await asyncio.sleep(0) + task.cancel() + await asyncio.gather(task, return_exceptions=True) + return websocket.sent + + assert asyncio.run(scenario()) == [b'{"type":"patch","direction":"push"}'] + + +def test_provider_sender_wraps_status_payload(): + async def scenario(): + queue = asyncio.Queue() + websocket = _WebSocket() + await queue.put({"running": False}) + task = asyncio.create_task(ws_provider.provider_sender(websocket, _Stream(), queue, "status")) + await asyncio.sleep(0) + task.cancel() + await asyncio.gather(task, return_exceptions=True) + return websocket.sent + + assert asyncio.run(scenario()) == [b'{"type":"status","status":{"running":false}}'] + + +def test_remote_proxy_initializes_and_cleans_client(monkeypatch): + class FakeClient: + def __init__(self) -> None: + self.alive = False + self.callbacks = None + self.initialized = False + self.proxied = False + self.stopped = False + + def set_proxy_callbacks(self, ws_to_adb=None, adb_to_ws=None): + self.callbacks = (ws_to_adb, adb_to_ws) + + async def init(self): + self.initialized = True + self.alive = True + + async def proxy_websocket(self, websocket): + self.proxied = True + + async def stop(self): + self.stopped = True + self.alive = False + + client = FakeClient() + + async def fake_resume(websocket, *, channel): + return SimpleNamespace(), _Stream() + + async def fake_recv(websocket, stream): + return {"config_id": "default_config", "decrypt": True} + + async def fake_require_remote(config_id): + assert config_id == "default_config" + return client + + monkeypatch.setattr(ws_remote, "perform_business_resume", fake_resume) + monkeypatch.setattr(ws_remote, "recv_stream_json", fake_recv) + monkeypatch.setattr(ws_remote, "context", SimpleNamespace(runtime=SimpleNamespace(require_remote_=fake_require_remote))) + + asyncio.run(ws_remote.websocket_remote(SimpleNamespace())) + + assert client.initialized is True + assert client.proxied is True + assert client.callbacks == (None, None) + assert client.stopped is True From fc27f6bd153ce203e6e1da645240809b04c0017c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 15 Jun 2026 15:13:51 +0800 Subject: [PATCH 23/98] Fix: Remove test holder and solve naming bug --- core/device/connection.py | 4 +--- service/runtime.py | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/device/connection.py b/core/device/connection.py index 0efc7ff98..7ef6271f0 100644 --- a/core/device/connection.py +++ b/core/device/connection.py @@ -247,9 +247,7 @@ def detect_package(self): elif server == '日服': self.server = 'JP' if not package_exist: - # TODO: For test, will be back in formal ver - # self.check_package_exist(server) - pass + self.check_package_exist(server) self.activity = self.static_config.activity_name[server] self.logger.info("Server : " + self.server) diff --git a/service/runtime.py b/service/runtime.py index c9640ea67..be46a9717 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -104,6 +104,7 @@ def __init__(self, project_root: Path, loop: Optional[asyncio.AbstractEventLoop] self._active_config_id: Optional[str] = None self._update_signal: Optional[_SignalHook] = None self._exit_signal: Optional[_SignalHook] = None + self._event_map_inv: Dict[str, Dict[str, str]] = {} self.is_all_data_initialized: bool = False def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: @@ -464,9 +465,20 @@ def _handle_button_signal(self, config_id: str, payload: Any) -> None: self._update_status(config_id, button=payload) def _handle_update_signal(self, config_id: str, payload: Any) -> None: + if self._event_map_inv.get(config_id) is None: + self._event_map_inv.setdefault(config_id, { + v: k + for k, v in self._sessions[config_id].baas.scheduler.event_map.items() + }) + _event_map_inv = self._event_map_inv[config_id] if isinstance(payload, list) and payload: - current = payload[0] - waiting = [item for item in payload if item != current] + current = _event_map_inv.get(payload[0], None) + waiting = [ + value + for item in payload + if (value := _event_map_inv.get(item)) is not None + and value != current + ] else: current = None waiting = [] From 05b7359a34d2289a5f983979eb7d2e8487803c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 15 Jun 2026 19:12:38 +0800 Subject: [PATCH 24/98] Update: Support backend self update --- deploy/installer/const.py | 197 +++++++++++++++++++++++++++----- deploy/installer/toml_config.py | 1 + service/api/commands.py | 12 +- service/conf/manager.py | 27 +++-- service/context.py | 20 ++++ service/runtime.py | 50 ++++++-- service/update/__init__.py | 2 + service/update/checks.py | 54 ++++++--- service/update/repository.py | 25 +++- 9 files changed, 313 insertions(+), 75 deletions(-) diff --git a/deploy/installer/const.py b/deploy/installer/const.py index b60511a56..446b0afc8 100644 --- a/deploy/installer/const.py +++ b/deploy/installer/const.py @@ -1,6 +1,7 @@ from enum import Enum, auto REPO_BRANCH = "master" +DEFAULT_UPDATE_CHANNEL = "stable" class GetShaMethod(Enum): GITHUB_API = auto() @@ -8,34 +9,168 @@ class GetShaMethod(Enum): MIRRORC_API = auto() -get_remote_sha_methods = [ - { - "name": "github", - "method": GetShaMethod.GITHUB_API, - "owner": "pur1fying", - "repo": "blue_archive_auto_script", - "branch": REPO_BRANCH, - }, - { - "name": "mirrorc", - "method": GetShaMethod.MIRRORC_API, - }, - { - "name": "gitee", - "method": GetShaMethod.PYGIT2, - "url": "https://gitee.com/pur1fy/blue_archive_auto_script.git", - "branch": REPO_BRANCH, - }, - { - "name": "gitcode", - "method": GetShaMethod.PYGIT2, - "url": "https://gitcode.com/m0_74686738/blue_archive_auto_script.git", - "branch": REPO_BRANCH, - }, - { - "name": "tencent_c_coding", - "method": GetShaMethod.PYGIT2, - "url": "https://e.coding.net/g-jbio0266/baas/blue_archive_auto_script.git", - "branch": REPO_BRANCH, - } -] +CHANNEL_REPO_SHA_METHODS = { + "stable": [ + { + "name": "github", + "method": GetShaMethod.GITHUB_API, + "owner": "pur1fying", + "repo": "blue_archive_auto_script", + "branch": REPO_BRANCH, + "url": "https://github.com/pur1fying/blue_archive_auto_script.git", + }, + { + "name": "mirrorc", + "method": GetShaMethod.MIRRORC_API, + }, + { + "name": "gitee", + "method": GetShaMethod.PYGIT2, + "url": "https://gitee.com/pur1fy/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "gitcode", + "method": GetShaMethod.PYGIT2, + "url": "https://gitcode.com/m0_74686738/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "github_proxy_v4", + "method": GetShaMethod.PYGIT2, + "url": "https://v4.gh-proxy.org/https://github.com/pur1fying/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "github_proxy_v6", + "method": GetShaMethod.PYGIT2, + "url": "https://v6.gh-proxy.org/https://github.com/pur1fying/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "github_proxy_cdn", + "method": GetShaMethod.PYGIT2, + "url": "https://cdn.gh-proxy.org/https://github.com/pur1fying/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "gh_proxy", + "method": GetShaMethod.PYGIT2, + "url": "https://gh-proxy.org/https://github.com/pur1fying/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "sevencdn", + "method": GetShaMethod.PYGIT2, + "url": "https://gh.sevencdn.com/https://github.com/pur1fying/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "githubfast", + "method": GetShaMethod.PYGIT2, + "url": "https://githubfast.com/pur1fying/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "baas_cdn", + "method": GetShaMethod.PYGIT2, + "url": "https://baas-cdn.kiramei.workers.dev/https://github.com/pur1fying/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + { + "name": "tencent_c_coding", + "method": GetShaMethod.PYGIT2, + "url": "https://e.coding.net/g-jbio0266/baas/blue_archive_auto_script.git", + "branch": REPO_BRANCH, + }, + ], + "dev": [ + { + "name": "github", + "method": GetShaMethod.GITHUB_API, + "owner": "Kiramei", + "repo": "baas-dev", + "branch": REPO_BRANCH, + "url": "https://github.com/Kiramei/baas-dev.git", + }, + { + "name": "mirrorc", + "method": GetShaMethod.MIRRORC_API, + }, + { + "name": "gitee", + "method": GetShaMethod.PYGIT2, + "url": "https://gitee.com/kiramei/baas-dev.git", + "branch": REPO_BRANCH, + }, + { + "name": "github_proxy_v4", + "method": GetShaMethod.PYGIT2, + "url": "https://v4.gh-proxy.org/https://github.com/Kiramei/baas-dev.git", + "branch": REPO_BRANCH, + }, + { + "name": "github_proxy_v6", + "method": GetShaMethod.PYGIT2, + "url": "https://v6.gh-proxy.org/https://github.com/Kiramei/baas-dev.git", + "branch": REPO_BRANCH, + }, + { + "name": "github_proxy_cdn", + "method": GetShaMethod.PYGIT2, + "url": "https://cdn.gh-proxy.org/https://github.com/Kiramei/baas-dev.git", + "branch": REPO_BRANCH, + }, + { + "name": "gh_proxy", + "method": GetShaMethod.PYGIT2, + "url": "https://gh-proxy.org/https://github.com/Kiramei/baas-dev.git", + "branch": REPO_BRANCH, + }, + { + "name": "sevencdn", + "method": GetShaMethod.PYGIT2, + "url": "https://gh.sevencdn.com/https://github.com/Kiramei/baas-dev.git", + "branch": REPO_BRANCH, + }, + { + "name": "githubfast", + "method": GetShaMethod.PYGIT2, + "url": "https://githubfast.com/Kiramei/baas-dev.git", + "branch": REPO_BRANCH, + }, + { + "name": "baas_cdn", + "method": GetShaMethod.PYGIT2, + "url": "https://baas-cdn.kiramei.workers.dev/https://github.com/Kiramei/baas-dev.git", + "branch": REPO_BRANCH, + }, + ], +} + + +def normalize_update_channel(channel): + value = str(channel or DEFAULT_UPDATE_CHANNEL).strip().lower() + return value if value in CHANNEL_REPO_SHA_METHODS else DEFAULT_UPDATE_CHANNEL + + +def get_remote_sha_methods_for_channel(channel=DEFAULT_UPDATE_CHANNEL): + return [dict(item) for item in CHANNEL_REPO_SHA_METHODS[normalize_update_channel(channel)]] + + +def repo_url_for_method(method_name, channel=DEFAULT_UPDATE_CHANNEL): + for method in get_remote_sha_methods_for_channel(channel): + if method.get("name") == method_name and method.get("url"): + return method["url"] + return None + + +def method_for_repo_url(url): + for methods in CHANNEL_REPO_SHA_METHODS.values(): + for method in methods: + if method.get("url") == url: + return method["name"] + return None + + +get_remote_sha_methods = get_remote_sha_methods_for_channel(DEFAULT_UPDATE_CHANNEL) diff --git a/deploy/installer/toml_config.py b/deploy/installer/toml_config.py index aec02def8..a738b1a2e 100644 --- a/deploy/installer/toml_config.py +++ b/deploy/installer/toml_config.py @@ -7,6 +7,7 @@ "current_BAAS_version": "", "current_BAAS_Cpp_version": "", "get_remote_sha_method": "", + "channel": "stable", "dev": False, "refresh": False, "launch": False, diff --git a/service/api/commands.py b/service/api/commands.py index 44c05de7d..b3f147005 100644 --- a/service/api/commands.py +++ b/service/api/commands.py @@ -71,25 +71,31 @@ async def execute_command(cmd: CommandMessage) -> Dict[str, Any]: return {"status": "ok", "data": {"addresses": result}} if cmd.command == "valid_cdk": - result = await context.runtime.valid_cdk(cmd.payload["cdk"]) + result = await context.runtime.valid_cdk(cmd.payload["cdk"], cmd.payload.get("channel")) return {"status": "ok", "data": result} if cmd.command == "test_all_sha": - result = await context.runtime.test_all_sha() + result = await context.runtime.test_all_sha(cmd.payload.get("channel")) return {"status": "ok", "data": result} if cmd.command == "check_for_update": + if "channel" in cmd.payload: + await context.runtime.update_setup_toml({"channel": cmd.payload["channel"]}) result = await context.runtime.check_for_update() return {"status": "ok", "data": result} if cmd.command == "update_setup_toml": - result = await context.runtime.check_for_update() + result = await context.runtime.update_setup_toml(cmd.payload) return {"status": "ok", "data": result} if cmd.command == "update_to_latest": result = await context.runtime.update_to_latest() return {"status": "ok", "data": result} + if cmd.command == "stop_all_tasks": + result = await context.runtime.stop_all_tasks() + return {"status": "ok", "data": result} + if cmd.command == "control_device": config_id = _require_config_id(cmd) operation = cmd.payload.get("operation") diff --git a/service/conf/manager.py b/service/conf/manager.py index 6ada201b2..59fef1b7d 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -12,6 +12,7 @@ from watchfiles import Change, awatch +from deploy.installer.const import method_for_repo_url, normalize_update_channel, repo_url_for_method from service.types import PatchOperation, SyncPushPayload from service.update import read_setup_toml, write_setup_toml from service.utils.broadcast import BroadcastChannel @@ -26,18 +27,6 @@ class ResourceSnapshot: timestamp: float -REPO_URL_CHECK_UPDATE_METHOD_MAPPING = { - "https://github.com/pur1fying/blue_archive_auto_script.git": "github", - "https://gitee.com/pur1fy/blue_archive_auto_script.git": "gitee", - "https://gitcode.com/m0_74686738/blue_archive_auto_script.git": "gitcode", - "https://e.coding.net/g-jbio0266/baas/blue_archive_auto_script.git": "tencent_c_coding" -} - -REPO_URL_CHECK_UPDATE_METHOD_MAPPING_REV = { - v: k for k, v in REPO_URL_CHECK_UPDATE_METHOD_MAPPING.items() -} - - class ConfigManager: """Manages persisted configuration resources with diff support.""" @@ -115,8 +104,10 @@ def _project_gui(self, full_gui: Dict[str, Any]) -> Dict[str, Any]: def _project_setup_toml(self, full_setup_toml: Dict[str, Any]) -> Dict[str, Any]: config_URLs = full_setup_toml.get("URLs", {}) config_General = full_setup_toml.get("General", {}) + channel = normalize_update_channel(config_General.get("channel") or ("dev" if config_General.get("dev") else "stable")) return { - "updateMethod": REPO_URL_CHECK_UPDATE_METHOD_MAPPING.get(config_URLs.get("REPO_URL_HTTP")), + "channel": channel, + "updateMethod": method_for_repo_url(config_URLs.get("REPO_URL_HTTP")) or "github", "shaMethod": config_General.get("get_remote_sha_method"), "mirrorcCdk": config_General.get("mirrorc_cdk") } @@ -199,10 +190,18 @@ def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: shaMethod: Optional[str] = projection.get("shaMethod", None) updateMethod: Optional[str] = projection.get("updateMethod", None) mirrorcCdk: Optional[str] = projection.get("mirrorcCdk", None) + channel: Optional[str] = projection.get("channel", None) + if channel is not None: + normalized_channel = normalize_update_channel(channel) + merged["General"]["channel"] = normalized_channel + merged["General"]["dev"] = normalized_channel == "dev" if shaMethod is not None: merged["General"]["get_remote_sha_method"] = shaMethod if updateMethod is not None: - merged["URLs"]["REPO_URL_HTTP"] = REPO_URL_CHECK_UPDATE_METHOD_MAPPING_REV[updateMethod] + effective_channel = normalize_update_channel(merged["General"].get("channel")) + repo_url = repo_url_for_method(updateMethod, effective_channel) + if repo_url is not None: + merged["URLs"]["REPO_URL_HTTP"] = repo_url if mirrorcCdk is not None: merged["General"]["mirrorc_cdk"] = mirrorcCdk diff --git a/service/context.py b/service/context.py index f2005acae..f122d58e4 100644 --- a/service/context.py +++ b/service/context.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import os import threading from contextlib import suppress from pathlib import Path @@ -23,6 +24,7 @@ def __init__(self, project_root: Path) -> None: self.log_manager = LogManager() self._loop: Optional[asyncio.AbstractEventLoop] = None self._fs_task: Optional[asyncio.Task] = None + self._update_check_task: Optional[asyncio.Task] = None async def startup(self) -> None: loop = asyncio.get_running_loop() @@ -37,6 +39,10 @@ async def startup(self) -> None: await self.log_manager.start() self._fs_task = asyncio.create_task(self.config_manager.watch_filesystem(), name="config-fs-watch") + self._update_check_task = asyncio.create_task( + self._periodic_update_check(), + name="periodic-update-check", + ) threading.Thread(target=self.runtime.init_all_data, name="service-init-all-data", daemon=True).start() @@ -46,8 +52,22 @@ async def shutdown(self) -> None: with suppress(asyncio.CancelledError): await self._fs_task self._fs_task = None + if self._update_check_task: + self._update_check_task.cancel() + with suppress(asyncio.CancelledError): + await self._update_check_task + self._update_check_task = None await self.log_manager.stop() def ensure_runtime_logger_attached(self) -> None: for queue, scope in self.runtime.get_log_sources(): self.log_manager.register_queue(queue, scope=scope) + + async def _periodic_update_check(self) -> None: + interval = max(300, int(os.getenv("BAAS_UPDATE_CHECK_INTERVAL_SECONDS", "1800"))) + while True: + try: + await self.runtime.check_for_update() + except Exception: + pass + await asyncio.sleep(interval) diff --git a/service/runtime.py b/service/runtime.py index be46a9717..79117c91d 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -15,10 +15,12 @@ from .conf import resolve_config_dir from .utils.broadcast import BroadcastChannel from .update import ( + read_setup_toml, check_for_update, test_all_repo_sha, update_to_latest, validate_cdk, + write_setup_toml, ) if TYPE_CHECKING: @@ -305,6 +307,14 @@ async def stop_scheduler(self, config_id: str) -> Dict[str, Any]: self._update_status(config_id, running=False, is_flag_run=False, current_task=None, waiting_tasks=[]) return {"status": "stopped", "config_id": config_id} + async def stop_all_tasks(self) -> Dict[str, Any]: + """Stop every running BAAS scheduler/solver session before installation work.""" + config_ids = list(self._sessions.keys()) + results = [] + for config_id in config_ids: + results.append(await self.stop_scheduler(config_id)) + return {"status": "stopped", "results": results} + async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict[str, Any]: """Run one BAAS task in a daemon worker thread. @@ -422,20 +432,40 @@ async def detect_adb() -> List[str]: return adb_res @staticmethod - async def valid_cdk(cdk): - cdk_res = await run_blocking(validate_cdk, cdk) + async def valid_cdk(cdk, channel=None): + cdk_res = await run_blocking(validate_cdk, cdk, 3.0, channel) return cdk_res @staticmethod - async def test_all_sha(): - all_sha_res = await run_blocking(test_all_repo_sha) + async def test_all_sha(channel=None): + all_sha_res = await run_blocking(test_all_repo_sha, 3.0, channel) return all_sha_res - @staticmethod - async def check_for_update(): + async def check_for_update(self): all_update_res = await run_blocking(check_for_update) + self.publish_version_update(all_update_res) return all_update_res + @staticmethod + async def update_setup_toml(payload: Dict[str, Any]) -> Dict[str, Any]: + data, path = await run_blocking(read_setup_toml) + general = data.setdefault("General", {}) + urls = data.setdefault("URLs", {}) + if "channel" in payload: + channel = str(payload["channel"]).strip().lower() + if channel not in {"stable", "dev"}: + raise ValueError(f"Unsupported update channel: {channel}") + general["channel"] = channel + general["dev"] = channel == "dev" + if "shaMethod" in payload: + general["get_remote_sha_method"] = payload["shaMethod"] + if "mirrorcCdk" in payload: + general["mirrorc_cdk"] = payload["mirrorcCdk"] + if "repoUrl" in payload: + urls["REPO_URL_HTTP"] = payload["repoUrl"] + await run_blocking(write_setup_toml, data, path) + return {"status": "ok", "path": str(path), "data": data} + async def add_config(self, name, server): """Create a new config directory with generated timestamp id.""" serial_name = str(int(datetime.datetime.now().timestamp())) @@ -444,11 +474,15 @@ async def add_config(self, name, server): "serial": serial_name } - @staticmethod - async def update_to_latest(): + async def update_to_latest(self): + await self.stop_all_tasks() await run_blocking(update_to_latest, None) return {"status": "updated"} + def publish_version_update(self, payload: Dict[str, Any]) -> None: + if payload: + self._status_bus.publish_threadsafe({"version": payload}) + async def remove_config(self, _id): """Remove a config directory after resolving it inside project config root.""" target = resolve_config_dir(self._project_root / "config", _id) diff --git a/service/update/__init__.py b/service/update/__init__.py index ae2f0e3ce..5d4f59db7 100644 --- a/service/update/__init__.py +++ b/service/update/__init__.py @@ -8,6 +8,7 @@ test_repo_sha, update_to_latest, validate_cdk, + _setup_channel, write_setup_toml, ) @@ -21,5 +22,6 @@ "test_repo_sha", "update_to_latest", "validate_cdk", + "_setup_channel", "write_setup_toml", ] diff --git a/service/update/checks.py b/service/update/checks.py index 7441171ff..ff3726c2f 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -15,7 +15,7 @@ import requests import tomli_w -from deploy.installer.const import GetShaMethod, get_remote_sha_methods +from deploy.installer.const import GetShaMethod, get_remote_sha_methods_for_channel, normalize_update_channel from deploy.installer.mirrorc_update.const import MirrorCErrorCode from deploy.installer.mirrorc_update.mirrorc_updater import MirrorC_Updater @@ -150,8 +150,8 @@ def _github_api_get_latest_sha(config: Dict[str, Any], timeout: float) -> Tuple[ return False, str(exc) -def _mirrorc_api_get_latest_sha(timeout: float) -> Tuple[bool, str]: - mirrorc_inst = MirrorC_Updater(app="BAAS_repo", current_version="") +def _mirrorc_api_get_latest_sha(timeout: float, channel: str = "stable") -> Tuple[bool, str]: + mirrorc_inst = MirrorC_Updater(app="BAAS_repo", current_version="", channel=channel) try: ret = mirrorc_inst.get_latest_version(cdk="", timeout=timeout) if ret.has_data and ret.latest_version_name: @@ -178,11 +178,12 @@ def _git_wrapper_get_latest_sha(config: Dict[str, Any]) -> Tuple[bool, str]: return False, str(exc) -def test_all_repo_sha(timeout: float = 3.0) -> List[RepositoryResult]: +def test_all_repo_sha(timeout: float = 3.0, channel: Optional[str] = None) -> List[RepositoryResult]: """Test every configured repository and return timing + SHA details.""" + channel = normalize_update_channel(channel or _setup_channel()[0]) results: List[RepositoryResult] = [] - for config in get_remote_sha_methods: - result = test_repo_sha(config, timeout) + for config in get_remote_sha_methods_for_channel(channel): + result = test_repo_sha({**config, "channel": channel}, timeout) results.append(result) return results @@ -193,7 +194,7 @@ def test_repo_sha(config: dict[str, Union[str, GetShaMethod]], timeout: float) - if method == GetShaMethod.GITHUB_API: success, value = _github_api_get_latest_sha(config, timeout) elif method == GetShaMethod.MIRRORC_API: - success, value = _mirrorc_api_get_latest_sha(timeout) + success, value = _mirrorc_api_get_latest_sha(timeout, str(config.get("channel") or _setup_channel()[0])) else: # Renamed to indicate it uses the wrapper logic success, value = _git_wrapper_get_latest_sha(config) @@ -216,10 +217,20 @@ def _format_expired_time(timestamp_value: Optional[float]) -> Tuple[Optional[flo return timestamp_value, dt.isoformat() -def validate_cdk(cdk: str, timeout: float = 3.0) -> Dict[str, Any]: +def _setup_channel(setup_path: Optional[Path] = None) -> Tuple[str, Dict[str, Any], Path]: + data, path = read_setup_toml(setup_path) + general = data.setdefault("General", {}) + channel = normalize_update_channel(general.get("channel") or ("dev" if general.get("dev") else "stable")) + general["channel"] = channel + general["dev"] = channel == "dev" + return channel, data, path + + +def validate_cdk(cdk: str, timeout: float = 3.0, channel: Optional[str] = None) -> Dict[str, Any]: """Validate a MirrorC CDK and return structured status information.""" + channel = normalize_update_channel(channel or _setup_channel()[0]) if cdk != "": - updater = MirrorC_Updater(app="BAAS_repo", current_version="") + updater = MirrorC_Updater(app="BAAS_repo", current_version="", channel=channel) try: ret = updater.get_latest_version(cdk=cdk, timeout=timeout) except requests.RequestException as exc: @@ -273,6 +284,8 @@ def validate_cdk(cdk: str, timeout: float = 3.0) -> Dict[str, Any]: data, path_setup_toml = read_setup_toml() data["General"]["mirrorc_cdk"] = cdk if code == MirrorCErrorCode.SUCCESS.value else "" + data["General"]["channel"] = channel + data["General"]["dev"] = channel == "dev" write_setup_toml(data, path_setup_toml) return { @@ -329,19 +342,28 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: """ try: local_info, setup_toml, _branch = get_local_version() + channel = normalize_update_channel( + setup_toml.setdefault("General", {}).get("channel") + or ("dev" if setup_toml.setdefault("General", {}).get("dev") else "stable") + ) + setup_toml["General"]["channel"] = channel + setup_toml["General"]["dev"] = channel == "dev" + repo_methods = get_remote_sha_methods_for_channel(channel) method_name = setup_toml.setdefault("General", {}).get("get_remote_sha_method", None) if not method_name: - repo_results = test_all_repo_sha(timeout=timeout) - method_name = _select_remote_record(local_info.version, repo_results).get("name") + repo_results = test_all_repo_sha(timeout=timeout, channel=channel) + selected = _select_remote_record(local_info.version, repo_results) + method_name = selected.get("name") if selected else "github" setup_toml.setdefault("General", {})["get_remote_sha_method"] = method_name with local_info.path.open("wb") as file: tomli_w.dump(setup_toml, file) - for ind, x in enumerate(get_remote_sha_methods): + for ind, x in enumerate(repo_methods): + x["channel"] = channel if "branch" in x: - get_remote_sha_methods[ind]["branch"] = _branch + repo_methods[ind]["branch"] = _branch - method_config = list(filter(lambda x: x.get('name') == method_name, get_remote_sha_methods))[0] + method_config = next((x for x in repo_methods if x.get('name') == method_name), repo_methods[0]) repo_result = test_repo_sha(method_config, timeout=timeout) remote_version = repo_result.get("value") if repo_result else None @@ -354,7 +376,9 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: return { "local": local_info.version, "remote": remote_version, - "update_available": update_available + "update_available": update_available, + "channel": channel, + "method": method_config.get("name"), } except: diff --git a/service/update/repository.py b/service/update/repository.py index db50944c4..4a70f2a2a 100644 --- a/service/update/repository.py +++ b/service/update/repository.py @@ -20,7 +20,13 @@ from pygit2.enums import ResetMode # External dependencies (assumed to exist based on context) -from deploy.installer.const import GetShaMethod, get_remote_sha_methods, REPO_BRANCH +from deploy.installer.const import ( + GetShaMethod, + REPO_BRANCH, + get_remote_sha_methods_for_channel, + normalize_update_channel, + repo_url_for_method, +) from deploy.installer.mirrorc_update.mirrorc_updater import MirrorC_Updater from deploy.installer.toml_config import DEFAULT_SETTINGS @@ -338,12 +344,17 @@ def __init__(self, setup_data: Dict[str, Any], config_path: Path): self.tmp_path = self.root_path / self.data.Paths.TMP_PATH self.git_ops = GitOperationHandler(self.root_path) - self.mirrorc = MirrorC_Updater(app="BAAS_repo", current_version="") + self.channel = normalize_update_channel( + getattr(self.data.General, "channel", None) + or ("dev" if getattr(self.data.General, "dev", False) else "stable") + ) + self.mirrorc = MirrorC_Updater(app="BAAS_repo", current_version="", channel=self.channel) self.local_sha = "" self.remote_sha = "" self.update_type = "latest" # 'latest', 'full', 'incremental' self.mirrorc_cdk = self.data.General.mirrorc_cdk + self.sha_methods = get_remote_sha_methods_for_channel(self.channel) def save_config(self, key_path: str, value: Any) -> None: """Updates a specific key in the TOML config file.""" @@ -411,13 +422,13 @@ def _fetch_best_remote_sha(self) -> str: # 1. Try saved method first saved_method_name = self.data.General.get_remote_sha_method if saved_method_name: - method_conf = next((m for m in get_remote_sha_methods if m["name"] == saved_method_name), None) + method_conf = next((m for m in self.sha_methods if m["name"] == saved_method_name), None) if method_conf: sha = self._get_sha_from_method(method_conf) if sha: return sha # 2. Try all methods - for method in get_remote_sha_methods: + for method in self.sha_methods: sha = self._get_sha_from_method(method) if sha: logging.info(f"Setting default remote SHA method -> [ {method['name']} ]") @@ -545,6 +556,12 @@ def _try_git_update(self) -> None: logging.info("+--------------------------------+") try: + repo_url = repo_url_for_method(self.data.General.get_remote_sha_method, self.channel) + if repo_url: + self.data.URLs.REPO_URL_HTTP = repo_url + self.save_config("URLs.REPO_URL_HTTP", repo_url) + self.save_config("General.channel", self.channel) + self.save_config("General.dev", self.channel == "dev") # 1. Check/Repair Repo if not self.git_ops.is_valid_repo(): self.git_ops.repair_repo(self.data.URLs.REPO_URL_HTTP) From 1f043119b5a6a5e850d8e8bd761f34e35f4056bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 15 Jun 2026 19:32:54 +0800 Subject: [PATCH 25/98] Fix: Config not compatible --- service/conf/manager.py | 35 ++++++++---------- service/runtime.py | 10 ++--- service/update/checks.py | 41 +++++++++------------ service/update/repository.py | 35 +++++++++++------- service/update/setup_io.py | 12 +++--- tests/service/test_config_runtime_update.py | 6 ++- 6 files changed, 70 insertions(+), 69 deletions(-) diff --git a/service/conf/manager.py b/service/conf/manager.py index 59fef1b7d..bd7b6f2e6 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -12,9 +12,10 @@ from watchfiles import Change, awatch -from deploy.installer.const import method_for_repo_url, normalize_update_channel, repo_url_for_method +from deploy.installer.const import normalize_update_channel from service.types import PatchOperation, SyncPushPayload from service.update import read_setup_toml, write_setup_toml +from service.update.setup_schema import legacy_repo_url, migrate_to_current_schema from service.utils.broadcast import BroadcastChannel from service.utils.diff import PatchConflictError, apply_patch, diff_documents @@ -102,14 +103,14 @@ def _project_gui(self, full_gui: Dict[str, Any]) -> Dict[str, Any]: } def _project_setup_toml(self, full_setup_toml: Dict[str, Any]) -> Dict[str, Any]: - config_URLs = full_setup_toml.get("URLs", {}) - config_General = full_setup_toml.get("General", {}) - channel = normalize_update_channel(config_General.get("channel") or ("dev" if config_General.get("dev") else "stable")) + current = migrate_to_current_schema(full_setup_toml) + config_general = current.get("general", {}) return { - "channel": channel, - "updateMethod": method_for_repo_url(config_URLs.get("REPO_URL_HTTP")) or "github", - "shaMethod": config_General.get("get_remote_sha_method"), - "mirrorcCdk": config_General.get("mirrorc_cdk") + "channel": config_general.get("channel", "stable"), + "updateMethod": config_general.get("get_remote_sha_method") or "github", + "repoUrl": legacy_repo_url(current), + "shaMethod": config_general.get("get_remote_sha_method"), + "mirrorcCdk": config_general.get("mirrorc_cdk") } @staticmethod @@ -182,10 +183,8 @@ def gen_event_formation_attr(data: dict) -> Union[dict, None]: def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: if self._setup_toml is None: self._setup_toml = {} - merged = copy.deepcopy(self._setup_toml) - merged.setdefault("General", {}) - merged.setdefault("URLs", {}) - merged.setdefault("Paths", {}) + merged = migrate_to_current_schema(copy.deepcopy(self._setup_toml)) + merged.setdefault("general", {}) shaMethod: Optional[str] = projection.get("shaMethod", None) updateMethod: Optional[str] = projection.get("updateMethod", None) @@ -193,17 +192,13 @@ def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: channel: Optional[str] = projection.get("channel", None) if channel is not None: normalized_channel = normalize_update_channel(channel) - merged["General"]["channel"] = normalized_channel - merged["General"]["dev"] = normalized_channel == "dev" + merged["general"]["channel"] = normalized_channel if shaMethod is not None: - merged["General"]["get_remote_sha_method"] = shaMethod + merged["general"]["get_remote_sha_method"] = shaMethod if updateMethod is not None: - effective_channel = normalize_update_channel(merged["General"].get("channel")) - repo_url = repo_url_for_method(updateMethod, effective_channel) - if repo_url is not None: - merged["URLs"]["REPO_URL_HTTP"] = repo_url + merged["general"]["get_remote_sha_method"] = updateMethod if mirrorcCdk is not None: - merged["General"]["mirrorc_cdk"] = mirrorcCdk + merged["general"]["mirrorc_cdk"] = mirrorcCdk self._setup_toml = merged return merged diff --git a/service/runtime.py b/service/runtime.py index 79117c91d..afbd52539 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -22,6 +22,7 @@ validate_cdk, write_setup_toml, ) +from .update.setup_schema import migrate_to_current_schema if TYPE_CHECKING: from core.Baas_thread import Baas_thread @@ -449,20 +450,19 @@ async def check_for_update(self): @staticmethod async def update_setup_toml(payload: Dict[str, Any]) -> Dict[str, Any]: data, path = await run_blocking(read_setup_toml) - general = data.setdefault("General", {}) - urls = data.setdefault("URLs", {}) + data = migrate_to_current_schema(data) + general = data.setdefault("general", {}) if "channel" in payload: channel = str(payload["channel"]).strip().lower() if channel not in {"stable", "dev"}: raise ValueError(f"Unsupported update channel: {channel}") general["channel"] = channel - general["dev"] = channel == "dev" if "shaMethod" in payload: general["get_remote_sha_method"] = payload["shaMethod"] + if "updateMethod" in payload: + general["get_remote_sha_method"] = payload["updateMethod"] if "mirrorcCdk" in payload: general["mirrorc_cdk"] = payload["mirrorcCdk"] - if "repoUrl" in payload: - urls["REPO_URL_HTTP"] = payload["repoUrl"] await run_blocking(write_setup_toml, data, path) return {"status": "ok", "path": str(path), "data": data} diff --git a/service/update/checks.py b/service/update/checks.py index ff3726c2f..8cfa89618 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -13,7 +13,6 @@ from pygit2.enums import ResetMode import requests -import tomli_w from deploy.installer.const import GetShaMethod, get_remote_sha_methods_for_channel, normalize_update_channel from deploy.installer.mirrorc_update.const import MirrorCErrorCode @@ -21,6 +20,7 @@ from service.update.repository import update_repo_to_latest from service.update.setup_io import read_setup_toml, write_setup_toml +from service.update.setup_schema import migrate_to_current_schema, setup_channel RepositoryResult = Dict[str, Any] @@ -219,10 +219,7 @@ def _format_expired_time(timestamp_value: Optional[float]) -> Tuple[Optional[flo def _setup_channel(setup_path: Optional[Path] = None) -> Tuple[str, Dict[str, Any], Path]: data, path = read_setup_toml(setup_path) - general = data.setdefault("General", {}) - channel = normalize_update_channel(general.get("channel") or ("dev" if general.get("dev") else "stable")) - general["channel"] = channel - general["dev"] = channel == "dev" + channel = setup_channel(data) return channel, data, path @@ -235,7 +232,8 @@ def validate_cdk(cdk: str, timeout: float = 3.0, channel: Optional[str] = None) ret = updater.get_latest_version(cdk=cdk, timeout=timeout) except requests.RequestException as exc: data, path_setup_toml = read_setup_toml() - data["General"]["mirrorc_cdk"] = "" + data = migrate_to_current_schema(data) + data["general"]["mirrorc_cdk"] = "" write_setup_toml(data, path_setup_toml) return { "success": False, @@ -248,7 +246,8 @@ def validate_cdk(cdk: str, timeout: float = 3.0, channel: Optional[str] = None) } except Exception as exc: # pragma: no cover - unexpected error data, path_setup_toml = read_setup_toml() - data["General"]["mirrorc_cdk"] = "" + data = migrate_to_current_schema(data) + data["general"]["mirrorc_cdk"] = "" write_setup_toml(data, path_setup_toml) return { "success": False, @@ -283,9 +282,9 @@ def validate_cdk(cdk: str, timeout: float = 3.0, channel: Optional[str] = None) message = base_messages.get(code, f"MirrorC returned code {code}.") data, path_setup_toml = read_setup_toml() - data["General"]["mirrorc_cdk"] = cdk if code == MirrorCErrorCode.SUCCESS.value else "" - data["General"]["channel"] = channel - data["General"]["dev"] = channel == "dev" + data = migrate_to_current_schema(data) + data["general"]["mirrorc_cdk"] = cdk if code == MirrorCErrorCode.SUCCESS.value else "" + data["general"]["channel"] = channel write_setup_toml(data, path_setup_toml) return { @@ -307,9 +306,9 @@ def get_local_version(setup_path: Optional[Path] = None) -> Tuple["VersionInfo", try: version_value, _branch = git_ops.get_local_head_info() - data.setdefault("General", {})["current_BAAS_version"] = version_value - with path.open("wb") as file: - tomli_w.dump(data, file) + data = migrate_to_current_schema(data) + data["general"]["current_baas_sha"] = version_value + write_setup_toml(data, path) except Exception: version_value = "" _branch = "master" @@ -342,21 +341,17 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: """ try: local_info, setup_toml, _branch = get_local_version() - channel = normalize_update_channel( - setup_toml.setdefault("General", {}).get("channel") - or ("dev" if setup_toml.setdefault("General", {}).get("dev") else "stable") - ) - setup_toml["General"]["channel"] = channel - setup_toml["General"]["dev"] = channel == "dev" + setup_toml = migrate_to_current_schema(setup_toml) + channel = setup_channel(setup_toml) + setup_toml["general"]["channel"] = channel repo_methods = get_remote_sha_methods_for_channel(channel) - method_name = setup_toml.setdefault("General", {}).get("get_remote_sha_method", None) + method_name = setup_toml["general"].get("get_remote_sha_method", None) if not method_name: repo_results = test_all_repo_sha(timeout=timeout, channel=channel) selected = _select_remote_record(local_info.version, repo_results) method_name = selected.get("name") if selected else "github" - setup_toml.setdefault("General", {})["get_remote_sha_method"] = method_name - with local_info.path.open("wb") as file: - tomli_w.dump(setup_toml, file) + setup_toml["general"]["get_remote_sha_method"] = method_name + write_setup_toml(setup_toml, local_info.path) for ind, x in enumerate(repo_methods): x["channel"] = channel diff --git a/service/update/repository.py b/service/update/repository.py index 4a70f2a2a..a7d6de070 100644 --- a/service/update/repository.py +++ b/service/update/repository.py @@ -24,11 +24,11 @@ GetShaMethod, REPO_BRANCH, get_remote_sha_methods_for_channel, - normalize_update_channel, repo_url_for_method, ) from deploy.installer.mirrorc_update.mirrorc_updater import MirrorC_Updater from deploy.installer.toml_config import DEFAULT_SETTINGS +from service.update.setup_schema import legacy_runtime_view, migrate_to_current_schema, setup_channel # ============================================================================== @@ -333,21 +333,20 @@ class UpdateManager: """ def __init__(self, setup_data: Dict[str, Any], config_path: Path): + self.raw_data = migrate_to_current_schema(setup_data) # Convert dict to SimpleNamespace for dot-access compatibility - if isinstance(setup_data, dict): - self.data = json.loads(json.dumps(setup_data), object_hook=lambda d: SimpleNamespace(**d)) + legacy_data = legacy_runtime_view(self.raw_data) + if isinstance(legacy_data, dict): + self.data = json.loads(json.dumps(legacy_data), object_hook=lambda d: SimpleNamespace(**d)) else: - self.data = setup_data + self.data = legacy_data self.config_path = config_path self.root_path = Path(self.data.Paths.BAAS_ROOT_PATH) self.tmp_path = self.root_path / self.data.Paths.TMP_PATH self.git_ops = GitOperationHandler(self.root_path) - self.channel = normalize_update_channel( - getattr(self.data.General, "channel", None) - or ("dev" if getattr(self.data.General, "dev", False) else "stable") - ) + self.channel = setup_channel(self.raw_data) self.mirrorc = MirrorC_Updater(app="BAAS_repo", current_version="", channel=self.channel) self.local_sha = "" @@ -358,22 +357,30 @@ def __init__(self, setup_data: Dict[str, Any], config_path: Path): def save_config(self, key_path: str, value: Any) -> None: """Updates a specific key in the TOML config file.""" - keys = key_path.split('.') - # Reload raw dict to ensure we don't lose data during simpleNamespace conversion if self.config_path.exists(): with open(self.config_path, "rb") as f: import tomli as tomllib - current_data = tomllib.load(f) + current_data = migrate_to_current_schema(tomllib.load(f)) else: - current_data = DEFAULT_SETTINGS.copy() + current_data = migrate_to_current_schema(DEFAULT_SETTINGS) + + key_map = { + "General.get_remote_sha_method": "general.get_remote_sha_method", + "General.current_BAAS_version": "general.current_baas_sha", + "General.channel": "general.channel", + "General.dev": None, + "URLs.REPO_URL_HTTP": None, + } + key_path = key_map.get(key_path, key_path) + if key_path is None: + return - # Navigate to key + keys = key_path.split('.') ref = current_data for k in keys[:-1]: ref = ref.setdefault(k, {}) ref[keys[-1]] = value - # Write back with open(self.config_path, "wb") as f: tomli_w.dump(current_data, f) diff --git a/service/update/setup_io.py b/service/update/setup_io.py index ad3afc85c..9aa6c4a93 100644 --- a/service/update/setup_io.py +++ b/service/update/setup_io.py @@ -10,7 +10,7 @@ except ModuleNotFoundError: # pragma: no cover - Python < 3.11 fallback import tomli as tomllib # type: ignore[import] -from deploy.installer.toml_config import DEFAULT_SETTINGS +from .setup_schema import CURRENT_DEFAULT_SETTINGS, migrate_to_current_schema def read_setup_toml(setup_path: Union[Path, None] = None) -> tuple[dict[str, Any], Union[Path, None]]: @@ -25,10 +25,12 @@ def read_setup_toml(setup_path: Union[Path, None] = None) -> tuple[dict[str, Any path = setup_path or (Path.cwd() / "setup.toml") if not path.exists(): with path.open("wb") as file: - tomli_w.dump(DEFAULT_SETTINGS, file) + tomli_w.dump(CURRENT_DEFAULT_SETTINGS, file) with path.open("rb") as fp: - data = tomllib.load(fp) + data = migrate_to_current_schema(tomllib.load(fp)) + with path.open("wb") as file: + tomli_w.dump(data, file) return data, path @@ -42,7 +44,7 @@ def write_setup_toml(content: dict, setup_path: Union[Path, None] = None) -> Non path = setup_path or (Path.cwd() / "setup.toml") if not path.exists(): with path.open("wb") as file: - tomli_w.dump(DEFAULT_SETTINGS, file) + tomli_w.dump(CURRENT_DEFAULT_SETTINGS, file) with path.open("wb") as fp: - tomli_w.dump(content, fp) + tomli_w.dump(migrate_to_current_schema(content), fp) diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index 5849abf43..b1855189e 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -78,10 +78,12 @@ def test_setup_toml_io_round_trip(): setup_path = root / "setup.toml" try: data, path = read_setup_toml(setup_path) - data.setdefault("General", {})["mirrorc_cdk"] = "abc" + data.setdefault("general", {})["mirrorc_cdk"] = "abc" write_setup_toml(data, path) loaded, _ = read_setup_toml(setup_path) - assert loaded["General"]["mirrorc_cdk"] == "abc" + assert loaded["general"]["mirrorc_cdk"] == "abc" + assert loaded["general"]["channel"] == "stable" + assert "General" not in loaded finally: _cleanup(root) From a2189ad72f0e12d4a2e2ca5ae1f4f7655dae719a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 15 Jun 2026 19:38:03 +0800 Subject: [PATCH 26/98] Fix: Forgot to upload setup_schema.py --- service/update/setup_schema.py | 180 +++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 service/update/setup_schema.py diff --git a/service/update/setup_schema.py b/service/update/setup_schema.py new file mode 100644 index 000000000..56aa0a8d3 --- /dev/null +++ b/service/update/setup_schema.py @@ -0,0 +1,180 @@ +from __future__ import annotations + +import copy +from pathlib import Path +from typing import Any, Dict + +from deploy.installer.const import method_for_repo_url, normalize_update_channel, repo_url_for_method +from deploy.installer.toml_config import DEFAULT_SETTINGS as LEGACY_DEFAULT_SETTINGS + +CURRENT_SCHEMA_VERSION = 1 + +CURRENT_DEFAULT_SETTINGS: Dict[str, Any] = { + "schema_version": CURRENT_SCHEMA_VERSION, + "general": { + "mirrorc_cdk": "", + "channel": "stable", + "current_baas_sha": "", + "current_baas_cpp_sha": "", + "get_remote_sha_method": "", + "launch": False, + "force_launch": False, + "debug": False, + "source_list": LEGACY_DEFAULT_SETTINGS["General"]["source_list"], + }, + "paths": { + "baas_root_path": "", + "tmp_path": "tmp", + "toolkit_path": "toolkit", + }, + "python": { + "runtime_path": "default", + "python_version": "3.9.0", + }, + "repositories": { + "main_sources": [], + "cpp_sources": [], + }, +} + + +def _table(data: Dict[str, Any], key: str) -> Dict[str, Any]: + value = data.get(key) + return value if isinstance(value, dict) else {} + + +def _first_string(*values: Any) -> str: + for value in values: + if isinstance(value, str) and value: + return value + return "" + + +def setup_channel(data: Dict[str, Any]) -> str: + general = _table(data, "general") + legacy_general = _table(data, "General") + return normalize_update_channel( + general.get("channel") + or legacy_general.get("channel") + or ("dev" if legacy_general.get("dev") else "stable") + ) + + +def migrate_to_current_schema(data: Dict[str, Any]) -> Dict[str, Any]: + current = copy.deepcopy(CURRENT_DEFAULT_SETTINGS) + general = _table(data, "general") + paths = _table(data, "paths") + python = _table(data, "python") + repositories = _table(data, "repositories") + legacy_general = _table(data, "General") + legacy_paths = _table(data, "Paths") + legacy_urls = _table(data, "URLs") + + current["schema_version"] = int(data.get("schema_version") or data.get("schemaVersion") or CURRENT_SCHEMA_VERSION) + + current_general = current["general"] + current_general.update({key: value for key, value in general.items() if key in current_general}) + current_general["mirrorc_cdk"] = _first_string(general.get("mirrorc_cdk"), legacy_general.get("mirrorc_cdk")) + current_general["channel"] = setup_channel(data) + current_general["current_baas_sha"] = _first_string( + general.get("current_baas_sha"), + legacy_general.get("current_baas_sha"), + legacy_general.get("current_baas_version"), + legacy_general.get("current_BAAS_version"), + ) + current_general["current_baas_cpp_sha"] = _first_string( + general.get("current_baas_cpp_sha"), + legacy_general.get("current_baas_cpp_sha"), + legacy_general.get("current_baas_cpp_version"), + legacy_general.get("current_BAAS_Cpp_version"), + ) + current_general["get_remote_sha_method"] = _first_string( + general.get("get_remote_sha_method"), + legacy_general.get("get_remote_sha_method"), + method_for_repo_url(legacy_urls.get("REPO_URL_HTTP")), + ) + for bool_key in ("launch", "force_launch", "debug"): + current_general[bool_key] = bool(general.get(bool_key, legacy_general.get(bool_key, current_general[bool_key]))) + source_list = general.get("source_list") or legacy_general.get("source_list") + if isinstance(source_list, list) and source_list: + current_general["source_list"] = [str(item) for item in source_list] + + current_paths = current["paths"] + current_paths.update({key: value for key, value in paths.items() if key in current_paths}) + current_paths["baas_root_path"] = _first_string(paths.get("baas_root_path"), legacy_paths.get("BAAS_ROOT_PATH")) + current_paths["tmp_path"] = _first_string(paths.get("tmp_path"), legacy_paths.get("TMP_PATH")) or current_paths["tmp_path"] + current_paths["toolkit_path"] = ( + _first_string(paths.get("toolkit_path"), legacy_paths.get("TOOL_KIT_PATH")) + or current_paths["toolkit_path"] + ) + + current_python = current["python"] + current_python.update({key: value for key, value in python.items() if key in current_python}) + current_python["runtime_path"] = _first_string( + python.get("runtime_path"), + legacy_general.get("runtime_path"), + ) or current_python["runtime_path"] + + current_repositories = current["repositories"] + current_repositories.update( + {key: value for key, value in repositories.items() if key in current_repositories} + ) + return current + + +def legacy_repo_url(data: Dict[str, Any]) -> str: + current = migrate_to_current_schema(data) + method = current["general"].get("get_remote_sha_method") or "github" + return repo_url_for_method(method, current["general"].get("channel")) or "" + + +def legacy_runtime_view(data: Dict[str, Any]) -> Dict[str, Any]: + current = migrate_to_current_schema(data) + general = current["general"] + paths = current["paths"] + python = current["python"] + repo_url = legacy_repo_url(current) + return { + "General": { + "mirrorc_cdk": general["mirrorc_cdk"], + "current_BAAS_version": general["current_baas_sha"], + "current_BAAS_Cpp_version": general["current_baas_cpp_sha"], + "get_remote_sha_method": general["get_remote_sha_method"], + "channel": general["channel"], + "dev": general["channel"] == "dev", + "refresh": False, + "launch": general["launch"], + "force_launch": general["force_launch"], + "internal_launch": False, + "no_build": True, + "debug": general["debug"], + "use_dynamic_update": False, + "source_list": general["source_list"], + "package_manager": "pip", + "runtime_path": python["runtime_path"], + "linux_pwd": "", + }, + "URLs": { + **LEGACY_DEFAULT_SETTINGS["URLs"], + "REPO_URL_HTTP": repo_url, + }, + "Paths": { + "BAAS_ROOT_PATH": paths["baas_root_path"] or str(Path.cwd()), + "TMP_PATH": paths["tmp_path"], + "TOOL_KIT_PATH": paths["toolkit_path"], + }, + } + + +def set_general(data: Dict[str, Any], key: str, value: Any) -> Dict[str, Any]: + current = migrate_to_current_schema(data) + current["general"][key] = value + if key == "channel": + current["general"]["channel"] = normalize_update_channel(value) + return current + + +def set_path(data: Dict[str, Any], key: str, value: Any) -> Dict[str, Any]: + current = migrate_to_current_schema(data) + current["paths"][key] = value + return current From 5ed19b027d19e8242c5ed644efd795e5313debc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 15 Jun 2026 20:36:07 +0800 Subject: [PATCH 27/98] Fix: Not running at the checked state --- deploy/installer/const.py | 6 --- service/update/checks.py | 5 +++ tests/service/test_config_runtime_update.py | 45 +++++++++++++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/deploy/installer/const.py b/deploy/installer/const.py index 446b0afc8..c59f893bd 100644 --- a/deploy/installer/const.py +++ b/deploy/installer/const.py @@ -77,12 +77,6 @@ class GetShaMethod(Enum): "url": "https://baas-cdn.kiramei.workers.dev/https://github.com/pur1fying/blue_archive_auto_script.git", "branch": REPO_BRANCH, }, - { - "name": "tencent_c_coding", - "method": GetShaMethod.PYGIT2, - "url": "https://e.coding.net/g-jbio0266/baas/blue_archive_auto_script.git", - "branch": REPO_BRANCH, - }, ], "dev": [ { diff --git a/service/update/checks.py b/service/update/checks.py index 8cfa89618..776663014 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -346,6 +346,11 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: setup_toml["general"]["channel"] = channel repo_methods = get_remote_sha_methods_for_channel(channel) method_name = setup_toml["general"].get("get_remote_sha_method", None) + method_names = {method.get("name") for method in repo_methods} + if method_name and method_name not in method_names: + method_name = "github" + setup_toml["general"]["get_remote_sha_method"] = method_name + write_setup_toml(setup_toml, local_info.path) if not method_name: repo_results = test_all_repo_sha(timeout=timeout, channel=channel) selected = _select_remote_record(local_info.version, repo_results) diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index b1855189e..e84de6dbc 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -87,3 +87,48 @@ def test_setup_toml_io_round_trip(): assert "General" not in loaded finally: _cleanup(root) + + +def test_setup_toml_reads_tauri_camel_case_paths(): + root = _workspace_tmp() + setup_path = root / "setup.toml" + try: + setup_path.write_text( + """ +schema_version = 1 + +[general] +mirrorcCdk = "abc" +channel = "dev" +getRemoteShaMethod = "github" +forceLaunch = true + +[paths] +baasRootPath = "D:/BAAS" +tmpPath = "cache" +toolkitPath = "tools" + +[python] +runtimePath = "C:/Python/python.exe" +pythonVersion = "3.11.0" + +[repositories] +mainSources = [] +cppSources = [] +""".strip(), + encoding="utf-8", + ) + + loaded, _ = read_setup_toml(setup_path) + + assert loaded["general"]["mirrorc_cdk"] == "abc" + assert loaded["general"]["channel"] == "dev" + assert loaded["general"]["get_remote_sha_method"] == "github" + assert loaded["general"]["force_launch"] is True + assert loaded["paths"]["baas_root_path"] == "D:/BAAS" + assert loaded["paths"]["tmp_path"] == "cache" + assert loaded["paths"]["toolkit_path"] == "tools" + assert loaded["python"]["runtime_path"] == "C:/Python/python.exe" + assert loaded["python"]["python_version"] == "3.11.0" + finally: + _cleanup(root) From 25d3db822c4383adb3940b749225c00a0cd5d2ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 15 Jun 2026 21:10:17 +0800 Subject: [PATCH 28/98] Fix: Extract ocr update process --- main.py | 21 +++++++++++---------- main.service.py | 24 ++++++++++++++++++++++++ service/context.py | 17 ++++++++++++++++- service/runtime.py | 4 ++-- 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index 4f2f00294..b7cc0bc3d 100644 --- a/main.py +++ b/main.py @@ -19,22 +19,23 @@ def __init__(self, logger_signal=None, ocr_needed=None, **kwargs): self.init_all_data() self.threads = {} - def init_all_data(self): - if not self.init_ocr(): + def init_all_data(self, need_ocr_update_check=True): + if not self.init_ocr(need_ocr_update_check=need_ocr_update_check): self.logger.error("Ocr Init Incomplete Please restart .") return False self.init_static_config() self.logger.info("-- All Data Initialization Complete Script ready--") return True - def init_ocr(self): - try: - check_git(self.logger) - except Exception as e: - self.logger.error("OCR Update Failed.") - import traceback - self.logger.error(traceback.format_exc()) - self.logger.info("Try to Start OCR Server Without Update.") + def init_ocr(self, need_ocr_update_check=True): + if need_ocr_update_check: + try: + check_git(self.logger) + except Exception as e: + self.logger.error("OCR Update Failed.") + import traceback + self.logger.error(traceback.format_exc()) + self.logger.info("Try to Start OCR Server Without Update.") try: self.ocr = ocr.Baas_ocr(logger=self.logger, ocr_needed=self.ocr_needed) diff --git a/main.service.py b/main.service.py index 8b0d90c68..14e0e5c51 100644 --- a/main.service.py +++ b/main.service.py @@ -1,10 +1,19 @@ import argparse import os + import uvicorn from service import set_log_format DEFAULT_HOST = os.getenv("BAAS_SERVICE_HOST", "0.0.0.0") DEFAULT_PORT = int(os.getenv("BAAS_SERVICE_PORT", "8190")) +OCR_UPDATE_CHECK_ENV = "BAAS_SERVICE_OCR_UPDATE_CHECK" + + +def _env_bool(name: str, default: bool) -> bool: + value = os.getenv(name) + if value is None: + return default + return value.strip().lower() not in {"0", "false", "no", "off"} def save_pid(pid): @@ -23,6 +32,20 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--port", type=int, default=DEFAULT_PORT, help="Port to bind (default: %(default)s)") parser.add_argument("--reload", action="store_true", help="Enable auto-reload (development only)") parser.add_argument("--log-level", default="info", help="Uvicorn log level") + ocr_update_check_default = _env_bool(OCR_UPDATE_CHECK_ENV, True) + parser.add_argument( + "--ocr-update-check", + dest="ocr_update_check", + action="store_true", + default=ocr_update_check_default, + help="Check for OCR server updates during startup (default: %(default)s)", + ) + parser.add_argument( + "--no-ocr-update-check", + dest="ocr_update_check", + action="store_false", + help="Skip OCR server update check during startup", + ) return parser.parse_args() @@ -30,6 +53,7 @@ def main() -> None: try: set_log_format() args = parse_args() + os.environ[OCR_UPDATE_CHECK_ENV] = "1" if args.ocr_update_check else "0" config = uvicorn.Config( "service.app:app", host=args.host, diff --git a/service/context.py b/service/context.py index f122d58e4..9fdb7d35b 100644 --- a/service/context.py +++ b/service/context.py @@ -12,6 +12,15 @@ from .utils.logging import LogManager from .runtime import ServiceRuntime +OCR_UPDATE_CHECK_ENV = "BAAS_SERVICE_OCR_UPDATE_CHECK" + + +def _env_bool(name: str, default: bool) -> bool: + value = os.getenv(name) + if value is None: + return default + return value.strip().lower() not in {"0", "false", "no", "off"} + class ServiceContext: """Aggregates long-lived service components.""" @@ -25,6 +34,7 @@ def __init__(self, project_root: Path) -> None: self._loop: Optional[asyncio.AbstractEventLoop] = None self._fs_task: Optional[asyncio.Task] = None self._update_check_task: Optional[asyncio.Task] = None + self.need_ocr_update_check = _env_bool(OCR_UPDATE_CHECK_ENV, True) async def startup(self) -> None: loop = asyncio.get_running_loop() @@ -43,7 +53,12 @@ async def startup(self) -> None: self._periodic_update_check(), name="periodic-update-check", ) - threading.Thread(target=self.runtime.init_all_data, name="service-init-all-data", daemon=True).start() + threading.Thread( + target=self.runtime.init_all_data, + kwargs={"need_ocr_update_check": self.need_ocr_update_check}, + name="service-init-all-data", + daemon=True, + ).start() async def shutdown(self) -> None: diff --git a/service/runtime.py b/service/runtime.py index afbd52539..1514904d1 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -128,11 +128,11 @@ def get_main_log_queue(self): assert self._main is not None return self._main.logger.log_collector - def init_all_data(self): + def init_all_data(self, need_ocr_update_check=True): """Initialize shared BAAS data and publish readiness when complete.""" assert self._main is not None self._ensure_config() - status = self._main.init_all_data() + status = self._main.init_all_data(need_ocr_update_check=need_ocr_update_check) if status: self._status_bus.publish_threadsafe({ "is_all_data_initialized": True From ba91c3a2943d93f6ba1919c9f7ffecff72823cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 16 Jun 2026 13:14:16 +0800 Subject: [PATCH 29/98] Update: Add fork sync action --- .github/workflows/sync-from-upstream.yml | 109 +++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 .github/workflows/sync-from-upstream.yml diff --git a/.github/workflows/sync-from-upstream.yml b/.github/workflows/sync-from-upstream.yml new file mode 100644 index 000000000..34826c7ea --- /dev/null +++ b/.github/workflows/sync-from-upstream.yml @@ -0,0 +1,109 @@ +name: Open PR and try auto-merge upstream master + +on: + repository_dispatch: + types: [upstream-master-push] + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +concurrency: + group: sync-upstream-master-pr + cancel-in-progress: false + +jobs: + sync-pr-and-auto-merge: + # Run this job only in the fork repository. + if: github.repository == 'Kiramei/baas-dev' + + runs-on: ubuntu-latest + + steps: + - name: Checkout fork + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: master + + - name: Create or update sync PR, then try auto-merge + env: + GH_TOKEN: ${{ github.token }} + EXPECTED_REPOSITORY: Kiramei/baas-dev + UPSTREAM_REPO: pur1fying/blue_archive_auto_script + UPSTREAM_BRANCH: master + BASE_BRANCH: master + SYNC_BRANCH: sync/upstream-master + run: | + set -euo pipefail + + # Extra runtime guard in case this workflow is copied or modified incorrectly. + if [ "${GITHUB_REPOSITORY}" != "${EXPECTED_REPOSITORY}" ]; then + echo "This workflow is intended to run only in ${EXPECTED_REPOSITORY}." + echo "Current repository: ${GITHUB_REPOSITORY}" + exit 0 + fi + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + + git remote add upstream "https://github.com/${UPSTREAM_REPO}.git" + git fetch upstream "${UPSTREAM_BRANCH}" + git fetch origin "${BASE_BRANCH}" + + # Skip if the fork base branch already contains the latest upstream branch. + if git merge-base --is-ancestor "upstream/${UPSTREAM_BRANCH}" "origin/${BASE_BRANCH}"; then + echo "fork ${BASE_BRANCH} already contains upstream/${UPSTREAM_BRANCH}. Nothing to do." + exit 0 + fi + + # Update only the temporary sync branch. Do not modify the base branch directly. + git checkout -B "${SYNC_BRANCH}" "upstream/${UPSTREAM_BRANCH}" + git push origin "HEAD:${SYNC_BRANCH}" --force-with-lease + + existing_pr_url="$(gh pr list \ + --repo "${GITHUB_REPOSITORY}" \ + --head "${SYNC_BRANCH}" \ + --base "${BASE_BRANCH}" \ + --state open \ + --json url \ + --jq '.[0].url // ""')" + + if [ -n "${existing_pr_url}" ]; then + pr_url="${existing_pr_url}" + echo "Existing sync PR updated: ${pr_url}" + else + pr_url="$(gh pr create \ + --repo "${GITHUB_REPOSITORY}" \ + --base "${BASE_BRANCH}" \ + --head "${SYNC_BRANCH}" \ + --title "Sync upstream master" \ + --body "Automated PR to sync changes from pur1fying/blue_archive_auto_script:master into Kiramei/baas-dev:master." \ + --json url \ + --jq '.url')" + + echo "Created sync PR: ${pr_url}" + fi + + # Try to enable auto-merge or merge immediately if all requirements are already satisfied. + # If this fails, keep the PR open for manual review. + set +e + gh pr merge "${pr_url}" \ + --repo "${GITHUB_REPOSITORY}" \ + --merge \ + --auto \ + --delete-branch + + merge_status=$? + set -e + + if [ "${merge_status}" -eq 0 ]; then + echo "Auto-merge enabled or PR merged: ${pr_url}" + else + echo "Auto-merge failed. Leaving PR open for manual review: ${pr_url}" + + gh pr comment "${pr_url}" \ + --repo "${GITHUB_REPOSITORY}" \ + --body "Auto-merge failed. Please review manually. Possible causes: merge conflicts, failing checks, branch protection rules, or auto-merge not enabled for this repository." || true + fi From b8801005148202b03fa526d9c8b6db05ae6e37a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 16 Jun 2026 13:29:52 +0800 Subject: [PATCH 30/98] Fix: Incorrect Workflow Permission --- .github/workflows/android_build.yml | 1 + .github/workflows/docs.yml | 1 + .github/workflows/mirrorchyan_commit.yml | 1 + .github/workflows/mirrorchyan_release.yml | 1 + .github/workflows/mirrorchyan_release_note.yml | 1 + 5 files changed, 5 insertions(+) diff --git a/.github/workflows/android_build.yml b/.github/workflows/android_build.yml index 14e6b84b2..09341fc25 100644 --- a/.github/workflows/android_build.yml +++ b/.github/workflows/android_build.yml @@ -15,6 +15,7 @@ on: jobs: BAAS-Android-apk: + if: github.repository == 'pur1fying/blue_archive_auto_script' env: JAVA_HOME: /opt/java/openjdk-17 strategy: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 6bbdaa5b2..540401391 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -12,6 +12,7 @@ permissions: jobs: build: + if: github.repository == 'pur1fying/blue_archive_auto_script' runs-on: ubuntu-latest steps: diff --git a/.github/workflows/mirrorchyan_commit.yml b/.github/workflows/mirrorchyan_commit.yml index e333722ab..840b60137 100644 --- a/.github/workflows/mirrorchyan_commit.yml +++ b/.github/workflows/mirrorchyan_commit.yml @@ -8,6 +8,7 @@ on: jobs: mirrorchyan: + if: github.repository == 'pur1fying/blue_archive_auto_script' runs-on: macos-latest steps: - name: Cancel run if not owner diff --git a/.github/workflows/mirrorchyan_release.yml b/.github/workflows/mirrorchyan_release.yml index 6c796731f..80636861b 100644 --- a/.github/workflows/mirrorchyan_release.yml +++ b/.github/workflows/mirrorchyan_release.yml @@ -7,6 +7,7 @@ on: jobs: mirrorchyan: + if: github.repository == 'pur1fying/blue_archive_auto_script' runs-on: macos-latest strategy: fail-fast: false diff --git a/.github/workflows/mirrorchyan_release_note.yml b/.github/workflows/mirrorchyan_release_note.yml index 9134d1753..948de02d1 100644 --- a/.github/workflows/mirrorchyan_release_note.yml +++ b/.github/workflows/mirrorchyan_release_note.yml @@ -7,6 +7,7 @@ on: jobs: mirrorchyan: + if: github.repository == 'pur1fying/blue_archive_auto_script' runs-on: macos-latest steps: From 62f0f98354675e6c3e3720619dce63b4f20b199a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 17 Jun 2026 20:07:58 +0800 Subject: [PATCH 31/98] Feat: Add CNB Sync Workflow --- .github/workflows/sync-to-cnb.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/sync-to-cnb.yml diff --git a/.github/workflows/sync-to-cnb.yml b/.github/workflows/sync-to-cnb.yml new file mode 100644 index 000000000..23c284ec7 --- /dev/null +++ b/.github/workflows/sync-to-cnb.yml @@ -0,0 +1,25 @@ +name: Sync to CNB +on: + workflow_dispatch: + push: + +jobs: + sync: + runs-on: ubuntu-latest + if: github.repository == 'Kiramei/baas-dev' + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Sync to CNB Repository + run: | + docker run --rm \ + -v ${{ github.workspace }}:${{ github.workspace }} \ + -w ${{ github.workspace }} \ + -e PLUGIN_TARGET_URL="https://cnb.cool/kiramei/baas-dev.git" \ + -e PLUGIN_AUTH_TYPE="https" \ + -e PLUGIN_USERNAME="cnb" \ + -e PLUGIN_PASSWORD=${{ secrets.CNB_SYNC_TOKEN }} \ + -e PLUGIN_FORCE="true" \ + tencentcom/git-sync From 8e65d258bcf439b3e7090dca00df6ad24112443c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 17 Jun 2026 20:22:41 +0800 Subject: [PATCH 32/98] Update: Separate Dev and Stable Ver --- .github/workflows/sync-to-cnb.yml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sync-to-cnb.yml b/.github/workflows/sync-to-cnb.yml index 23c284ec7..fc274e914 100644 --- a/.github/workflows/sync-to-cnb.yml +++ b/.github/workflows/sync-to-cnb.yml @@ -4,7 +4,8 @@ on: push: jobs: - sync: + sync_dev: + name: Sync the Dev Version runs-on: ubuntu-latest if: github.repository == 'Kiramei/baas-dev' steps: @@ -23,3 +24,24 @@ jobs: -e PLUGIN_PASSWORD=${{ secrets.CNB_SYNC_TOKEN }} \ -e PLUGIN_FORCE="true" \ tencentcom/git-sync + + sync_stable: + name: Sync the Stable Version + runs-on: ubuntu-latest + if: github.repository == 'pur1fying/blue_archive_auto_script.git' + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Sync to CNB Repository + run: | + docker run --rm \ + -v ${{ github.workspace }}:${{ github.workspace }} \ + -w ${{ github.workspace }} \ + -e PLUGIN_TARGET_URL="https://cnb.cool/pur1fying/blue_archive_auto_script.git" \ + -e PLUGIN_AUTH_TYPE="https" \ + -e PLUGIN_USERNAME="cnb" \ + -e PLUGIN_PASSWORD=${{ secrets.CNB_SYNC_TOKEN }} \ + -e PLUGIN_FORCE="true" \ + tencentcom/git-sync From bebf1608eeee39848995bab3ac530132e48525b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 17 Jun 2026 20:59:24 +0800 Subject: [PATCH 33/98] Update: Optimize the Sync flow --- .github/actions/sync-to-cnb/action.yml | 44 +++++++++++++++++++++++ .github/workflows/sync-to-cnb.yml | 48 ++++++++------------------ 2 files changed, 58 insertions(+), 34 deletions(-) create mode 100644 .github/actions/sync-to-cnb/action.yml diff --git a/.github/actions/sync-to-cnb/action.yml b/.github/actions/sync-to-cnb/action.yml new file mode 100644 index 000000000..22a766b30 --- /dev/null +++ b/.github/actions/sync-to-cnb/action.yml @@ -0,0 +1,44 @@ +name: Sync to CNB +description: Sync the checked out repository to a CNB Git repository. + +inputs: + target-url: + description: CNB repository URL to sync to. + required: true + password: + description: Password or token used by git-sync. + required: true + auth-type: + description: Authentication type used by git-sync. + required: false + default: https + username: + description: Username used by git-sync. + required: false + default: cnb + force: + description: Whether git-sync should force push. + required: false + default: "true" + +runs: + using: composite + steps: + - name: Sync to CNB Repository + shell: bash + env: + PLUGIN_TARGET_URL: ${{ inputs.target-url }} + PLUGIN_AUTH_TYPE: ${{ inputs.auth-type }} + PLUGIN_USERNAME: ${{ inputs.username }} + PLUGIN_PASSWORD: ${{ inputs.password }} + PLUGIN_FORCE: ${{ inputs.force }} + run: | + docker run --rm \ + -v "${GITHUB_WORKSPACE}:${GITHUB_WORKSPACE}" \ + -w "${GITHUB_WORKSPACE}" \ + -e PLUGIN_TARGET_URL \ + -e PLUGIN_AUTH_TYPE \ + -e PLUGIN_USERNAME \ + -e PLUGIN_PASSWORD \ + -e PLUGIN_FORCE \ + tencentcom/git-sync diff --git a/.github/workflows/sync-to-cnb.yml b/.github/workflows/sync-to-cnb.yml index fc274e914..57a4cb876 100644 --- a/.github/workflows/sync-to-cnb.yml +++ b/.github/workflows/sync-to-cnb.yml @@ -1,47 +1,27 @@ name: Sync to CNB + on: workflow_dispatch: push: jobs: - sync_dev: - name: Sync the Dev Version + sync: runs-on: ubuntu-latest - if: github.repository == 'Kiramei/baas-dev' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Sync to CNB Repository - run: | - docker run --rm \ - -v ${{ github.workspace }}:${{ github.workspace }} \ - -w ${{ github.workspace }} \ - -e PLUGIN_TARGET_URL="https://cnb.cool/kiramei/baas-dev.git" \ - -e PLUGIN_AUTH_TYPE="https" \ - -e PLUGIN_USERNAME="cnb" \ - -e PLUGIN_PASSWORD=${{ secrets.CNB_SYNC_TOKEN }} \ - -e PLUGIN_FORCE="true" \ - tencentcom/git-sync - - sync_stable: - name: Sync the Stable Version - runs-on: ubuntu-latest - if: github.repository == 'pur1fying/blue_archive_auto_script.git' - steps: - - uses: actions/checkout@v3 + - name: Sync Dev + if: github.repository == 'Kiramei/baas-dev' + uses: ./.github/actions/sync-to-cnb with: - fetch-depth: 0 + target-url: https://cnb.cool/kiramei/baas-dev.git + password: ${{ secrets.CNB_SYNC_TOKEN }} - - name: Sync to CNB Repository - run: | - docker run --rm \ - -v ${{ github.workspace }}:${{ github.workspace }} \ - -w ${{ github.workspace }} \ - -e PLUGIN_TARGET_URL="https://cnb.cool/pur1fying/blue_archive_auto_script.git" \ - -e PLUGIN_AUTH_TYPE="https" \ - -e PLUGIN_USERNAME="cnb" \ - -e PLUGIN_PASSWORD=${{ secrets.CNB_SYNC_TOKEN }} \ - -e PLUGIN_FORCE="true" \ - tencentcom/git-sync + - name: Sync Stable + if: github.repository == 'pur1fying/blue_archive_auto_script' + uses: ./.github/actions/sync-to-cnb + with: + target-url: https://cnb.cool/pur1fying/blue_archive_auto_script.git + password: ${{ secrets.CNB_SYNC_TOKEN }} From f2137af3af1027ec4ddc9483536de9aa53ef5555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 17 Jun 2026 23:01:51 +0800 Subject: [PATCH 34/98] Fix: CNB-Sync lock within master --- .github/workflows/sync-to-cnb.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/sync-to-cnb.yml b/.github/workflows/sync-to-cnb.yml index 57a4cb876..c4790935c 100644 --- a/.github/workflows/sync-to-cnb.yml +++ b/.github/workflows/sync-to-cnb.yml @@ -3,6 +3,8 @@ name: Sync to CNB on: workflow_dispatch: push: + branches: + - master jobs: sync: From 03f85bc6b653567bf65ee4188203bccbdfd9843d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 12:27:08 +0800 Subject: [PATCH 35/98] Fix: Pass Package Check under Remote Mode --- core/device/connection.py | 6 +- service/api/security.py | 4 +- service/api/ws_control.py | 5 +- service/auth/crypto.py | 4 +- service/auth/manager.py | 20 ++++--- service/auth/models.py | 6 +- service/conf/initializer.py | 11 ++-- service/conf/manager.py | 35 ++++++----- service/remote/scrcpy.py | 3 + service/runtime.py | 6 +- tests/service/test_config_runtime_update.py | 65 +++++++++++++++++++++ 11 files changed, 127 insertions(+), 38 deletions(-) diff --git a/core/device/connection.py b/core/device/connection.py index 7ef6271f0..199da3b90 100644 --- a/core/device/connection.py +++ b/core/device/connection.py @@ -9,12 +9,13 @@ # reference : [ https://github.com/LmeSzinc/AzurLaneAutoScript/blob/master/module/device/connection.py ] class Connection: - def __init__(self, Baas_instance): + def __init__(self, Baas_instance, skip_package_detection=False): self.Baas_thread = Baas_instance self.logger = Baas_instance.get_logger() self.config_set = Baas_instance.get_config() self.config = self.config_set.config self.static_config = self.config_set.static_config + self.skip_package_detection = skip_package_detection self.server = None if self.config.server in ["Steam国际服", "日服PC端"]: if self.config.server == "Steam国际服": @@ -46,7 +47,8 @@ def _init_android_device(self): self.check_serial() self.detect_device() self.adb_connect() - self.detect_package() + if not self.skip_package_detection: + self.detect_package() self.check_mumu_keep_alive() def _init_app_process(self): diff --git a/service/api/security.py b/service/api/security.py index 1c12c949b..e3b348700 100644 --- a/service/api/security.py +++ b/service/api/security.py @@ -4,6 +4,7 @@ import json import os import time +from typing import Optional from urllib.parse import urlparse from fastapi import Request, WebSocket, WebSocketDisconnect @@ -26,7 +27,7 @@ def json_bytes(payload: dict) -> bytes: return json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") -def is_allowed_origin(origin: str | None, host: str | None) -> bool: +def is_allowed_origin(origin: Optional[str], host: Optional[str]) -> bool: if not origin: return True allowed = {item.strip() for item in os.getenv("BAAS_SERVICE_ALLOWED_ORIGINS", "").split(",") if item.strip()} @@ -117,6 +118,7 @@ async def finalize_control_auth( session, control_channel = context.auth_manager.resume_control_session(handshake, token) include_session_secrets = True except AuthenticationError: + # noinspection PyUnusedLocal session = control_channel = None # type: ignore[assignment] else: await websocket.send_json( diff --git a/service/api/ws_control.py b/service/api/ws_control.py index 076d671f8..439aa0732 100644 --- a/service/api/ws_control.py +++ b/service/api/ws_control.py @@ -3,6 +3,7 @@ import asyncio import time from contextlib import suppress +from typing import Optional from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect @@ -23,7 +24,7 @@ async def websocket_control(websocket: WebSocket) -> None: revoke_queue = None sender_task = heartbeat_task = None - session: ActiveSession | None = None + session: Optional[ActiveSession] = None try: handshake, preauth_channel, _ = await begin_server_hello(websocket, kind="control", channel="control") request = preauth_channel.decrypt(await websocket.receive_json()) @@ -33,6 +34,8 @@ async def websocket_control(websocket: WebSocket) -> None: preauth_channel=preauth_channel, request=request, ) + if session is None: + raise ValueError("Session not found") revoke_queue = context.auth_manager.subscribe_control(session.session_id) sender_task = asyncio.create_task( control_sender( diff --git a/service/auth/crypto.py b/service/auth/crypto.py index a4cd45d2a..fed7fe4d2 100644 --- a/service/auth/crypto.py +++ b/service/auth/crypto.py @@ -4,7 +4,7 @@ import hashlib import hmac import json -from typing import Any +from typing import Any, Optional from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.hkdf import HKDF @@ -30,7 +30,7 @@ def canonical_dumps(payload: dict[str, Any]) -> bytes: return json.dumps(payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8") -def hkdf_sha256(key_material: bytes, info: bytes, length: int, salt: bytes | None = None) -> bytes: +def hkdf_sha256(key_material: bytes, info: bytes, length: int, salt: Optional[bytes] = None) -> bytes: return HKDF( algorithm=hashes.SHA256(), length=length, diff --git a/service/auth/manager.py b/service/auth/manager.py index 2fffc4a78..c103ae9b8 100644 --- a/service/auth/manager.py +++ b/service/auth/manager.py @@ -10,7 +10,7 @@ import time import uuid from pathlib import Path -from typing import Any +from typing import Any, Optional from cryptography.exceptions import InvalidSignature from cryptography.hazmat.primitives import serialization @@ -115,7 +115,7 @@ def issue_server_hello(self, hello: dict[str, Any], *, kind: str, channel: str) kind=kind, channel=channel, client_nonce=client_nonce, - server_nonce=b64d(hello_core["server_nonce"]), + server_nonce=b64d(str(hello_core["server_nonce"])), client_public_key=client_public_bytes, server_private_key=server_private, server_public_key=server_public_bytes, @@ -341,6 +341,8 @@ def close_session(self, session_id: str) -> None: self._sessions.pop(session_id, None) def _new_session(self, handshake: HandshakeContext, password_state: PasswordState) -> ActiveSession: + if not isinstance(password_state.pwd_hash, bytes): + raise AuthenticationError("Password hash is not bytes") master_secret = hkdf_sha256( handshake.shared_key + password_state.pwd_hash, b"master-secret", @@ -368,7 +370,8 @@ def _new_session_from_secrets(self, *, pwd_epoch: int, master_secret: bytes, res self._sessions[session.session_id] = session return session - def _build_control_channel(self, session: ActiveSession) -> JsonChaChaChannel: + @staticmethod + def _build_control_channel(session: ActiveSession) -> JsonChaChaChannel: transcript_salt = hashlib.sha256(session.session_id.encode("utf-8")).digest() return JsonChaChaChannel( tx_key=hkdf_sha256(session.master_secret, b"control:server-tx", 32, transcript_salt), @@ -434,7 +437,7 @@ def _remember_token_hash(self, token_id: str, token_secret: bytes) -> bytes: b"remember-token:" + token_id.encode("utf-8") + b":" + token_secret, ) - def _prune_expired_remembered_locked(self, now: float | None = None) -> None: + def _prune_expired_remembered_locked(self, now: Optional[float] = None) -> None: current = time.time() if now is None else now expired = [ token_id @@ -447,7 +450,8 @@ def _prune_expired_remembered_locked(self, now: float | None = None) -> None: self._remembered_logins.pop(token_id, None) self._save_remembered_logins() - def _auth_context(self, handshake: HandshakeContext, pwd_epoch: int) -> bytes: + @staticmethod + def _auth_context(handshake: HandshakeContext, pwd_epoch: int) -> bytes: return hkdf_sha256( handshake.shared_key, f"auth-proof:{pwd_epoch}".encode("utf-8"), @@ -455,7 +459,8 @@ def _auth_context(self, handshake: HandshakeContext, pwd_epoch: int) -> bytes: handshake.transcript_hash, ) - def _password_state_for(self, *, password: str, epoch: int) -> PasswordState: + @staticmethod + def _password_state_for(*, password: str, epoch: int) -> PasswordState: salt = secrets.token_bytes(ARGON2_SALT_BYTES) verifier = argon2(password, salt) return PasswordState( @@ -582,7 +587,8 @@ def _verify_default_public_key(self) -> None: "Provide a matching VITE_BAAS_SERVER_SIGN_PUBLIC_KEY_B64 when building the frontend." ) - def _load_or_create_key(self, path: Path, *, env_name: str, default_factory) -> bytes: + @staticmethod + def _load_or_create_key(path: Path, *, env_name: str, default_factory) -> bytes: env_value = os.getenv(env_name) if env_value: return b64d(env_value) diff --git a/service/auth/models.py b/service/auth/models.py index 52ffb5b08..c4fa7bb66 100644 --- a/service/auth/models.py +++ b/service/auth/models.py @@ -2,7 +2,7 @@ import asyncio from dataclasses import dataclass, field -from typing import Any +from typing import Any, Optional from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey @@ -14,8 +14,8 @@ class PasswordState: initialized: bool = False pwd_epoch: int = 0 - pwd_salt: bytes | None = None - pwd_hash: bytes | None = None + pwd_salt: Optional[bytes] = None + pwd_hash: Optional[bytes] = None def as_public_dict(self) -> dict[str, Any]: return { diff --git a/service/conf/initializer.py b/service/conf/initializer.py index f61567efd..9ae55e37f 100644 --- a/service/conf/initializer.py +++ b/service/conf/initializer.py @@ -3,23 +3,22 @@ import datetime import json from pathlib import Path -from typing import Iterable +from typing import Iterable, Union from core.config import default_config from core.config.config_set import ConfigSet - from .paths import ensure_safe_config_id, resolve_config_dir class ConfigInitializer: """Create and migrate BAAS config files under one project root.""" - def __init__(self, project_root: Path | str = ".") -> None: + def __init__(self, project_root: Union[Path, str] = ".") -> None: self.project_root = Path(project_root) self.config_root = self.project_root / "config" self.error_log = self.project_root / "error.log" - def check_config(self, config_ids: str | Iterable[str], server=None, name=None) -> None: + def check_config(self, config_ids: Union[str, Iterable[str]], server=None, name=None) -> None: self.config_root.mkdir(exist_ok=True) self.check_static_config() ids = [config_ids] if isinstance(config_ids, str) else list(config_ids) @@ -63,6 +62,8 @@ def check_event_config(self, config_id: str = "default_config", user_config=None temp["enabled"] = False data.insert(index, temp) continue + if not isinstance(existing, dict): + raise TypeError("expected dict but found {} for existing".format(type(existing))) for reset_index, reset in enumerate(existing["daily_reset"]): if len(reset) != 3: existing["daily_reset"][reset_index] = [0, 0, 0] @@ -72,7 +73,7 @@ def check_event_config(self, config_id: str = "default_config", user_config=None self._write_error(f"{exc}\n{config_id}") self._write_json(path, default_event_config, indent=2) - def delete_deprecated_config(self, file_name, config_id: str | None = None) -> None: + def delete_deprecated_config(self, file_name, config_id: Union[str, None] = None) -> None: names = [file_name] if isinstance(file_name, str) else list(file_name) base = self.config_root if config_id is None else resolve_config_dir(self.config_root, config_id) for name in names: diff --git a/service/conf/manager.py b/service/conf/manager.py index bd7b6f2e6..4af9171c8 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -8,7 +8,7 @@ import time from dataclasses import dataclass from pathlib import Path -from typing import Any, Dict, Iterable, List, Optional, Tuple, Union +from typing import Any, Dict, Iterable, List, Optional, Union from watchfiles import Change, awatch @@ -18,7 +18,6 @@ from service.update.setup_schema import legacy_repo_url, migrate_to_current_schema from service.utils.broadcast import BroadcastChannel from service.utils.diff import PatchConflictError, apply_patch, diff_documents - from .resources import ResourceKey, ResourcePathResolver @@ -31,7 +30,7 @@ class ResourceSnapshot: class ConfigManager: """Manages persisted configuration resources with diff support.""" - def __init__(self, project_root: Path, loop: asyncio.AbstractEventLoop | None = None) -> None: + def __init__(self, project_root: Path, loop: Union[asyncio.AbstractEventLoop, None] = None) -> None: self._root = project_root self._config_root = self._root / "config" self._paths = ResourcePathResolver(project_root) @@ -40,6 +39,7 @@ def __init__(self, project_root: Path, loop: asyncio.AbstractEventLoop | None = self._mtimes: Dict[ResourceKey, float] = {} self._update_bus = BroadcastChannel(loop) self._loop = loop + self._known_config_ids = None self._gui_full: Union[Dict[str, Any], None] = None self._setup_toml: Union[Dict[str, Any], None] = None @@ -89,11 +89,12 @@ async def get_config_list(self) -> ResourceSnapshot: # ------------------------------------------------------------------ # snapshot helpers # ------------------------------------------------------------------ - def _project_gui(self, full_gui: Dict[str, Any]) -> Dict[str, Any]: + @staticmethod + def _project_gui(full_gui: Dict[str, Any]) -> Dict[str, Any]: main_window = full_gui.get("MainWindow", {}) fluent = full_gui.get("QFluentWidgets", {}) return { - "MainWindow": { + "MainWindow" : { "Language": main_window.get("Language"), "DpiScale": main_window.get("DpiScale"), }, @@ -102,15 +103,16 @@ def _project_gui(self, full_gui: Dict[str, Any]) -> Dict[str, Any]: }, } - def _project_setup_toml(self, full_setup_toml: Dict[str, Any]) -> Dict[str, Any]: + @staticmethod + def _project_setup_toml(full_setup_toml: Dict[str, Any]) -> Dict[str, Any]: current = migrate_to_current_schema(full_setup_toml) config_general = current.get("general", {}) return { - "channel": config_general.get("channel", "stable"), + "channel" : config_general.get("channel", "stable"), "updateMethod": config_general.get("get_remote_sha_method") or "github", - "repoUrl": legacy_repo_url(current), - "shaMethod": config_general.get("get_remote_sha_method"), - "mirrorcCdk": config_general.get("mirrorc_cdk") + "repoUrl" : legacy_repo_url(current), + "shaMethod" : config_general.get("get_remote_sha_method"), + "mirrorcCdk" : config_general.get("mirrorc_cdk") } @staticmethod @@ -134,8 +136,8 @@ def gen_event_formation_attr(data: dict) -> Union[dict, None]: ret = dict(activity_name=current_event, story=dict(), mission=dict(), challenge=dict()) en2cn = { - "story": "故事", - "mission": "任务", + "story" : "故事", + "mission" : "任务", "challenge": "挑战", } @@ -183,6 +185,8 @@ def gen_event_formation_attr(data: dict) -> Union[dict, None]: def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: if self._setup_toml is None: self._setup_toml = {} + if self._setup_toml is None: + raise ValueError("_setup_toml is definitely not None") merged = migrate_to_current_schema(copy.deepcopy(self._setup_toml)) merged.setdefault("general", {}) @@ -206,6 +210,8 @@ def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: def _merge_gui(self, projection: Dict[str, Any]) -> Dict[str, Any]: if self._gui_full is None: self._gui_full = {} + if self._gui_full is None: + raise ValueError("_gui_full is definitely not None") merged = copy.deepcopy(self._gui_full) merged.setdefault("MainWindow", {}) merged.setdefault("QFluentWidgets", {}) @@ -279,7 +285,7 @@ async def apply_patch( self, resource: str, resource_id: Optional[str], - operations: Iterable[PatchOperation | dict[str, Any]], + operations: Iterable[Union[PatchOperation, dict[str, Any]]], timestamp: float, origin: str = "backend", ) -> ResourceSnapshot: @@ -348,7 +354,8 @@ async def apply_patch( await self._update_bus.publish(payload.model_dump()) return ResourceSnapshot(copy.deepcopy(new_snapshot.data), new_snapshot.timestamp) - def _write_json(self, path: Path, data: Any, resource: str) -> None: + @staticmethod + def _write_json(path: Path, data: Any, resource: str) -> None: indent = 4 if resource in ("config", "gui") else 2 with path.open("w", encoding="utf-8") as fp: json.dump(data, fp, indent=indent, ensure_ascii=False) diff --git a/service/remote/scrcpy.py b/service/remote/scrcpy.py index f2f46cce3..2509b8991 100644 --- a/service/remote/scrcpy.py +++ b/service/remote/scrcpy.py @@ -490,6 +490,9 @@ async def __adb_to_websocket(self, websocket) -> None: if not payload: break + if isinstance(payload, str): + payload = payload.encode("utf-8") + if self.on_adb_to_ws is not None: result = self.on_adb_to_ws(payload) if inspect.isawaitable(result): diff --git a/service/runtime.py b/service/runtime.py index 1514904d1..5eace6def 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -9,7 +9,7 @@ import time from dataclasses import dataclass, field from pathlib import Path -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union from .conf import ConfigInitializer from .conf import resolve_config_dir @@ -373,7 +373,7 @@ def _call() -> None: return {"status": "ok", "task": task_name, "result": 0} - async def require_remote_(self, config_id: str) -> "ScrcpyClient": + async def require_remote_(self, config_id: str) -> Union["ScrcpyClient", None]: """Return a cached or newly initialized scrcpy client for a config. Args: @@ -390,7 +390,7 @@ async def require_remote_(self, config_id: str) -> "ScrcpyClient": if session.scrcpy_client is not None: return session.scrcpy_client session = await self.get_session(config_id) - connection = Connection(session.baas) + connection = Connection(session.baas, skip_package_detection=True) connection = adb.device(connection.serial) session.scrcpy_client = await ScrcpyClient(connection).init() return session.scrcpy_client diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index e84de6dbc..ef7405bd5 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -2,8 +2,11 @@ import asyncio import shutil +import sys +import types import uuid from pathlib import Path +from types import SimpleNamespace import pytest @@ -73,6 +76,68 @@ def test_runtime_remove_config_uses_project_root(): _cleanup(root) +def test_runtime_remote_connection_skips_package_detection(monkeypatch): + calls = {} + session = SimpleNamespace(baas=object(), scrcpy_client=None) + runtime = ServiceRuntime(Path("project")) + + async def fake_get_session(config_id): + calls["config_id"] = config_id + return session + + class FakeConnection: + def __init__(self, baas, skip_package_detection=False): + calls["baas"] = baas + calls["skip_package_detection"] = skip_package_detection + self.serial = "127.0.0.1:5555" + + class FakeAdb: + def device(self, serial): + calls["serial"] = serial + return "adb-device" + + class FakeScrcpyClient: + def __init__(self, device): + calls["device"] = device + + async def init(self): + calls["scrcpy_initialized"] = True + return "scrcpy-client" + + fake_adbutils = types.ModuleType("adbutils") + fake_adbutils.adb = FakeAdb() + fake_adbutils.AdbDevice = object + fake_adbutils.AdbError = RuntimeError + fake_adbutils.AdbTimeout = TimeoutError + fake_adbutils.ForwardItem = object + fake_errors = types.ModuleType("adbutils.errors") + fake_errors.AdbError = RuntimeError + fake_errors.AdbTimeout = TimeoutError + + monkeypatch.setitem(sys.modules, "adbutils", fake_adbutils) + monkeypatch.setitem(sys.modules, "adbutils.errors", fake_errors) + + import core.device.connection as connection_module + import service.remote.scrcpy as scrcpy_module + + monkeypatch.setattr(runtime, "get_session", fake_get_session) + monkeypatch.setattr(connection_module, "Connection", FakeConnection) + monkeypatch.setattr(scrcpy_module, "ScrcpyClient", FakeScrcpyClient) + + client = asyncio.run(runtime.require_remote_("default_config")) + + assert client == "scrcpy-client" + assert session.scrcpy_client == "scrcpy-client" + assert calls == { + "config_id": "default_config", + "baas": session.baas, + "skip_package_detection": True, + "serial": "127.0.0.1:5555", + "device": "adb-device", + "scrcpy_initialized": True, + } + + def test_setup_toml_io_round_trip(): root = _workspace_tmp() setup_path = root / "setup.toml" From 70fe99a254441e8f3bde04d8f980ea6a8a706238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 13:23:15 +0800 Subject: [PATCH 36/98] Feat: Add config import export commands --- service/api/commands.py | 23 ++- service/api/security.py | 9 ++ service/api/ws_trigger.py | 15 +- service/runtime.py | 154 ++++++++++++++++++++ tests/service/test_config_runtime_update.py | 60 ++++++++ 5 files changed, 258 insertions(+), 3 deletions(-) diff --git a/service/api/commands.py b/service/api/commands.py index b3f147005..222844da4 100644 --- a/service/api/commands.py +++ b/service/api/commands.py @@ -13,7 +13,7 @@ def _require_config_id(cmd: CommandMessage) -> str: return cmd.config_id -async def execute_command(cmd: CommandMessage) -> Dict[str, Any]: +async def execute_command(cmd: CommandMessage, binary_payload: bytes | None = None) -> Dict[str, Any]: if cmd.command == "start_scheduler": if not cmd.config_id: raise ValueError("config_id is required for start_scheduler") @@ -66,6 +66,27 @@ async def execute_command(cmd: CommandMessage) -> Dict[str, Any]: result = await context.runtime.remove_config(config_id) return {"status": "ok", "data": result} + if cmd.command == "copy_config": + config_id = cmd.payload.get("id") + if not config_id: + raise ValueError("id is required for copy_config") + result = await context.runtime.copy_config(config_id) + return {"status": "ok", "data": result} + + if cmd.command == "export_config": + config_id = cmd.payload.get("id") + if not config_id: + raise ValueError("id is required for export_config") + result = await context.runtime.export_config(config_id) + content = result.pop("content") + return {"status": "ok", "data": result, "_binary": content} + + if cmd.command == "import_config": + if binary_payload is None: + raise ValueError("binary archive payload is required for import_config") + result = await context.runtime.import_config(binary_payload) + return {"status": "ok", "data": result} + if cmd.command == "detect_adb": result = await context.runtime.detect_adb() return {"status": "ok", "data": {"addresses": result}} diff --git a/service/api/security.py b/service/api/security.py index e3b348700..b3eaa9902 100644 --- a/service/api/security.py +++ b/service/api/security.py @@ -73,12 +73,21 @@ async def send_stream_json(websocket: WebSocket, stream: SecretStreamBox, payloa await websocket.send_bytes(stream.encrypt(json_bytes(payload))) +async def send_stream_bytes(websocket: WebSocket, stream: SecretStreamBox, payload: bytes) -> None: + await websocket.send_bytes(stream.encrypt(payload)) + + async def recv_stream_json(websocket: WebSocket, stream: SecretStreamBox) -> dict: frame = await websocket.receive_bytes() plaintext = stream.decrypt(frame) return json.loads(plaintext.decode("utf-8")) +async def recv_stream_bytes(websocket: WebSocket, stream: SecretStreamBox) -> bytes: + frame = await websocket.receive_bytes() + return stream.decrypt(frame) + + async def begin_server_hello( websocket: WebSocket, *, diff --git a/service/api/ws_trigger.py b/service/api/ws_trigger.py index 3a5220ad8..0b090b11d 100644 --- a/service/api/ws_trigger.py +++ b/service/api/ws_trigger.py @@ -9,7 +9,7 @@ from service.types import CommandMessage from .commands import execute_command -from .security import perform_business_resume, recv_stream_json, send_stream_json +from .security import perform_business_resume, recv_stream_bytes, recv_stream_json, send_stream_bytes, send_stream_json router = APIRouter() @@ -21,11 +21,20 @@ async def websocket_trigger(websocket: WebSocket) -> None: while True: message = await recv_stream_json(websocket, stream) cmd = CommandMessage(**message) + binary_payload = None + if cmd.command == "import_config" and cmd.payload.get("binary") is True: + binary_payload = await recv_stream_bytes(websocket, stream) response_payload: Dict[str, Any] try: - response_payload = await execute_command(cmd) + response_payload = await execute_command(cmd, binary_payload=binary_payload) except Exception as inner_exc: # noqa: BLE001 - returned to frontend response_payload = {"status": "error", "error": str(inner_exc)} + binary_response = response_payload.pop("_binary", None) + if binary_response is not None: + data = response_payload.setdefault("data", {}) + data["binary"] = { + "size": len(binary_response), + } await send_stream_json( websocket, stream, @@ -36,6 +45,8 @@ async def websocket_trigger(websocket: WebSocket) -> None: "timestamp": cmd.timestamp, }, ) + if binary_response is not None: + await send_stream_bytes(websocket, stream, binary_response) except (AuthenticationError, HTTPException) as exc: with suppress(RuntimeError): await websocket.close(code=4401, reason=str(exc)) diff --git a/service/runtime.py b/service/runtime.py index 5eace6def..534eb7c38 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -3,12 +3,15 @@ import asyncio import copy import datetime +import io +import json import os import shutil import threading import time from dataclasses import dataclass, field from pathlib import Path +from zipfile import ZIP_DEFLATED, BadZipFile, ZipFile from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union from .conf import ConfigInitializer @@ -474,6 +477,157 @@ async def add_config(self, name, server): "serial": serial_name } + def _new_config_id(self) -> str: + config_root = self._project_root / "config" + while True: + config_id = str(int(time.time() * 1000)) + if not (config_root / config_id).exists(): + return config_id + time.sleep(0.001) + + def _config_path(self, config_id: str) -> Path: + return resolve_config_dir(self._project_root / "config", config_id) + + def _read_config_name(self, config_id: str) -> Optional[str]: + path = self._config_path(config_id) / "config.json" + try: + data = json.loads(path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError): + return None + name = data.get("name") + return str(name).strip() if name is not None else None + + def _unique_config_name(self, base_name: str, *, exclude_id: Optional[str] = None) -> str: + existing = { + name + for config_id in self._list_config_ids_sync() + if config_id != exclude_id + for name in [self._read_config_name(config_id)] + if name + } + candidate = f"{base_name}_copy" + index = 2 + while candidate in existing: + candidate = f"{base_name}_copy{index}" + index += 1 + return candidate + + def _list_config_ids_sync(self) -> List[str]: + config_root = self._project_root / "config" + if not config_root.exists(): + return [] + ids: List[str] = [] + for child in config_root.iterdir(): + if child.is_dir() and (child / "config.json").exists() and (child / "event.json").exists(): + ids.append(child.name) + return sorted(ids) + + def _copy_config_sync(self, source_id: str) -> Dict[str, Any]: + source = self._config_path(source_id) + if not source.is_dir(): + raise ValueError(f"config not found: {source_id}") + + target_id = self._new_config_id() + target = self._config_path(target_id) + shutil.copytree(source, target) + + config_path = target / "config.json" + config_data = json.loads(config_path.read_text(encoding="utf-8")) + base_name = str(config_data.get("name") or source_id).strip() or source_id + config_data["name"] = self._unique_config_name(base_name, exclude_id=source_id) + config_path.write_text(json.dumps(config_data, ensure_ascii=False, indent=2), encoding="utf-8") + + ConfigInitializer(self._project_root).check_config(target_id) + return {"serial": target_id, "name": config_data["name"]} + + async def copy_config(self, config_id: str) -> Dict[str, Any]: + return await run_blocking(self._copy_config_sync, config_id) + + def _export_config_sync(self, config_id: str) -> Dict[str, Any]: + source = self._config_path(config_id) + if not source.is_dir(): + raise ValueError(f"config not found: {config_id}") + config_path = source / "config.json" + if not config_path.exists(): + raise ValueError(f"config.json not found for config: {config_id}") + + config_name = self._read_config_name(config_id) or config_id + safe_name = "".join(c if c not in '<>:"/\\|?*' else "_" for c in config_name).strip() or config_id + buffer = io.BytesIO() + with ZipFile(buffer, "w", ZIP_DEFLATED) as archive: + for path in sorted(source.rglob("*")): + if path.is_file(): + archive.write(path, path.relative_to(source).as_posix()) + return { + "filename": f"{safe_name}.zip", + "content": buffer.getvalue(), + } + + async def export_config(self, config_id: str) -> Dict[str, Any]: + return await run_blocking(self._export_config_sync, config_id) + + @staticmethod + def _safe_zip_members(archive: ZipFile) -> List[str]: + members: List[str] = [] + for info in archive.infolist(): + name = info.filename.replace("\\", "/") + parts = [part for part in name.split("/") if part] + if not parts or any(part == ".." for part in parts): + raise ValueError(f"unsafe archive path: {info.filename}") + if Path(name).is_absolute(): + raise ValueError(f"unsafe archive path: {info.filename}") + if not info.is_dir(): + members.append(name) + return members + + @staticmethod + def _archive_root_prefix(members: List[str]) -> str: + if "config.json" in members: + return "" + top_levels = {member.split("/", 1)[0] for member in members if "/" in member} + if len(top_levels) == 1: + prefix = next(iter(top_levels)) + "/" + if f"{prefix}config.json" in members: + return prefix + raise ValueError("archive must contain config.json") + + def _import_config_sync(self, content: bytes) -> Dict[str, Any]: + try: + with ZipFile(io.BytesIO(content)) as archive: + members = self._safe_zip_members(archive) + prefix = self._archive_root_prefix(members) + config_member = f"{prefix}config.json" + config_data = json.loads(archive.read(config_member).decode("utf-8")) + config_name = str(config_data.get("name") or "").strip() + if not config_name: + raise ValueError("imported config.json must contain name") + + target_id = self._new_config_id() + target = self._config_path(target_id) + target.mkdir(parents=True) + for member in members: + if not member.startswith(prefix): + continue + relative = member[len(prefix):] + if not relative: + continue + target_file = target / Path(relative) + target_file.parent.mkdir(parents=True, exist_ok=True) + target_file.write_bytes(archive.read(member)) + except BadZipFile as exc: + raise ValueError("invalid config archive") from exc + except json.JSONDecodeError as exc: + raise ValueError("invalid config.json in archive") from exc + + ConfigInitializer(self._project_root).check_config(target_id) + for existing_id in self._list_config_ids_sync(): + if existing_id != target_id and self._read_config_name(existing_id) == config_name: + shutil.rmtree(self._config_path(existing_id)) + return {"serial": target_id, "name": config_name} + + async def import_config(self, content: bytes) -> Dict[str, Any]: + return await run_blocking(self._import_config_sync, content) + async def update_to_latest(self): await self.stop_all_tasks() await run_blocking(update_to_latest, None) diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index ef7405bd5..80f8c7f4a 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -1,15 +1,19 @@ from __future__ import annotations import asyncio +import io +import json import shutil import sys import types import uuid from pathlib import Path from types import SimpleNamespace +from zipfile import ZipFile import pytest +import service.runtime as runtime_module from service.conf import ConfigPathError, ensure_safe_config_id, resolve_config_dir from service.runtime import ServiceRuntime from service.update.setup_io import read_setup_toml, write_setup_toml @@ -26,6 +30,18 @@ def _cleanup(path: Path) -> None: shutil.rmtree(path) +def _write_config(root: Path, config_id: str, name: str, server: str = "官服") -> Path: + target = root / "config" / config_id + target.mkdir(parents=True) + (target / "config.json").write_text( + json.dumps({"name": name, "server": server}, ensure_ascii=False), + encoding="utf-8", + ) + (target / "event.json").write_text("[]", encoding="utf-8") + (target / "switch.json").write_text("{}", encoding="utf-8") + return target + + def test_config_id_path_safety(): assert ensure_safe_config_id("default_config") == "default_config" with pytest.raises(ConfigPathError): @@ -138,6 +154,50 @@ async def init(self): } +def test_runtime_copy_config_assigns_new_id_and_copy_suffix(monkeypatch): + root = _workspace_tmp() + try: + _write_config(root, "source", "Alpha") + runtime = ServiceRuntime(root) + monkeypatch.setattr(runtime_module.ConfigInitializer, "check_config", lambda *args, **kwargs: None) + + result = runtime._copy_config_sync("source") + + copied = root / "config" / result["serial"] + assert copied.exists() + assert result["serial"] != "source" + assert json.loads((copied / "config.json").read_text(encoding="utf-8"))["name"] == "Alpha_copy" + assert (copied / "event.json").exists() + finally: + _cleanup(root) + + +def test_runtime_import_config_replaces_same_name_with_new_id(monkeypatch): + root = _workspace_tmp() + try: + _write_config(root, "old", "Imported") + runtime = ServiceRuntime(root) + monkeypatch.setattr(runtime_module.ConfigInitializer, "check_config", lambda *args, **kwargs: None) + + buffer = io.BytesIO() + with ZipFile(buffer, "w") as archive: + archive.writestr("config.json", json.dumps({"name": "Imported", "server": "日服"})) + archive.writestr("event.json", "[]") + archive.writestr("switch.json", "{}") + + result = runtime._import_config_sync(buffer.getvalue()) + + assert result["serial"] != "old" + assert not (root / "config" / "old").exists() + imported = root / "config" / result["serial"] + assert imported.exists() + imported_config = json.loads((imported / "config.json").read_text(encoding="utf-8")) + assert imported_config["name"] == "Imported" + assert imported_config["server"] == "日服" + finally: + _cleanup(root) + + def test_setup_toml_io_round_trip(): root = _workspace_tmp() setup_path = root / "setup.toml" From 9e215ea22b3f60c6b29f89763ddc71d97a132b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 13:56:04 +0800 Subject: [PATCH 37/98] Fix: Config Not Sync to Frontend --- service/api/commands.py | 4 ++ service/conf/manager.py | 4 +- tests/service/test_service_logic.py | 83 +++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 2 deletions(-) diff --git a/service/api/commands.py b/service/api/commands.py index 222844da4..02eefdd91 100644 --- a/service/api/commands.py +++ b/service/api/commands.py @@ -57,6 +57,7 @@ async def execute_command(cmd: CommandMessage, binary_payload: bytes | None = No if not server or not name: raise ValueError("server and name are required for add_config") result = await context.runtime.add_config(name, server) + await context.config_manager.scan_once() return {"status": "ok", "data": result} if cmd.command.startswith("remove_config"): @@ -64,6 +65,7 @@ async def execute_command(cmd: CommandMessage, binary_payload: bytes | None = No if not config_id: raise ValueError("id is required for remove_config") result = await context.runtime.remove_config(config_id) + await context.config_manager.scan_once() return {"status": "ok", "data": result} if cmd.command == "copy_config": @@ -71,6 +73,7 @@ async def execute_command(cmd: CommandMessage, binary_payload: bytes | None = No if not config_id: raise ValueError("id is required for copy_config") result = await context.runtime.copy_config(config_id) + await context.config_manager.scan_once() return {"status": "ok", "data": result} if cmd.command == "export_config": @@ -85,6 +88,7 @@ async def execute_command(cmd: CommandMessage, binary_payload: bytes | None = No if binary_payload is None: raise ValueError("binary archive payload is required for import_config") result = await context.runtime.import_config(binary_payload) + await context.config_manager.scan_once() return {"status": "ok", "data": result} if cmd.command == "detect_adb": diff --git a/service/conf/manager.py b/service/conf/manager.py index 4af9171c8..e15088725 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -39,7 +39,7 @@ def __init__(self, project_root: Path, loop: Union[asyncio.AbstractEventLoop, No self._mtimes: Dict[ResourceKey, float] = {} self._update_bus = BroadcastChannel(loop) self._loop = loop - self._known_config_ids = None + self._known_config_ids: set[str] = set() self._gui_full: Union[Dict[str, Any], None] = None self._setup_toml: Union[Dict[str, Any], None] = None @@ -376,7 +376,7 @@ def unsubscribe_updates(self, queue: asyncio.Queue) -> None: async def scan_once(self) -> None: """Scan known config resources once and publish add/remove/resource diffs.""" current_ids = set(self.list_config_ids()) - previous_ids = set(self._known_config_ids) if hasattr(self, "_known_config_ids") else set() + previous_ids = set(self._known_config_ids) for added in current_ids - previous_ids: await self._notify_config_added(added) diff --git a/tests/service/test_service_logic.py b/tests/service/test_service_logic.py index b4bd3871e..92b62ee60 100644 --- a/tests/service/test_service_logic.py +++ b/tests/service/test_service_logic.py @@ -1,6 +1,10 @@ from __future__ import annotations import asyncio +import json +import os +import shutil +import time from pathlib import Path from watchfiles import Change @@ -49,3 +53,82 @@ def test_config_manager_classifies_config_files(): assert manager._classify_config_change(Change.modified, gui_path) == (False, ("gui", None)) assert manager._classify_config_change(Change.modified, static_path) == (False, ("static", None)) assert manager._classify_config_change(Change.added, root / "config" / "new_config") == (True, None) + + +def _write_config_pair(root: Path, config_id: str, name: str) -> Path: + config_dir = root / "config" / config_id + config_dir.mkdir(parents=True) + config_path = config_dir / "config.json" + config_path.write_text(json.dumps({"name": name, "server": "官服"}, ensure_ascii=False), encoding="utf-8") + (config_dir / "event.json").write_text("[]", encoding="utf-8") + return config_path + + +def test_config_manager_initial_scan_publishes_config_add(tmp_path): + async def scenario(): + _write_config_pair(tmp_path, "default_config", "Default") + manager = ConfigManager(tmp_path) + manager.set_loop(asyncio.get_running_loop()) + queue = await manager.subscribe_updates() + + await manager.scan_once() + + return await queue.get() + + payload = asyncio.run(scenario()) + + assert payload["type"] == "patch" + assert payload["resource"] == "config" + assert payload["resource_id"] == "default_config" + assert payload["ops"][0]["op"] == "add" + + +def test_config_manager_scan_publishes_config_remove(tmp_path): + async def scenario(): + _write_config_pair(tmp_path, "default_config", "Default") + manager = ConfigManager(tmp_path) + manager.set_loop(asyncio.get_running_loop()) + queue = await manager.subscribe_updates() + + await manager.scan_once() + await queue.get() + shutil.rmtree(tmp_path / "config" / "default_config") + await manager.scan_once() + + return await queue.get() + + payload = asyncio.run(scenario()) + + assert payload["type"] == "patch" + assert payload["resource"] == "config" + assert payload["resource_id"] == "default_config" + assert payload["ops"][0]["op"] == "remove" + + +def test_config_manager_detects_manual_config_json_change(tmp_path): + async def scenario(): + config_path = _write_config_pair(tmp_path, "default_config", "Before") + manager = ConfigManager(tmp_path) + manager.set_loop(asyncio.get_running_loop()) + queue = await manager.subscribe_updates() + + await manager.scan_once() + await queue.get() + await manager.get_snapshot("config", "default_config") + + config_path.write_text( + json.dumps({"name": "After", "server": "官服"}, ensure_ascii=False), + encoding="utf-8", + ) + future = time.time() + 2 + os.utime(config_path, (future, future)) + + await manager._check_resource("config", "default_config") + return await queue.get() + + payload = asyncio.run(scenario()) + + assert payload["type"] == "patch" + assert payload["resource"] == "config" + assert payload["resource_id"] == "default_config" + assert {"op": "replace", "path": "/name", "value": "After"} in payload["ops"] From 6e3f8416d8be5665fa7d1315d8de7753191915eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 14:43:48 +0800 Subject: [PATCH 38/98] Update: Test Source Stream Mode --- service/api/ws_trigger.py | 29 +++++++++++++++++++++++++ service/runtime.py | 30 ++++++++++++++++++++++++++ service/update/__init__.py | 2 ++ service/update/checks.py | 11 +++++++--- tests/service/test_service_logic.py | 33 +++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 3 deletions(-) diff --git a/service/api/ws_trigger.py b/service/api/ws_trigger.py index 0b090b11d..df1e52d6c 100644 --- a/service/api/ws_trigger.py +++ b/service/api/ws_trigger.py @@ -10,6 +10,7 @@ from .commands import execute_command from .security import perform_business_resume, recv_stream_bytes, recv_stream_json, send_stream_bytes, send_stream_json +from .state import context router = APIRouter() @@ -25,6 +26,34 @@ async def websocket_trigger(websocket: WebSocket) -> None: if cmd.command == "import_config" and cmd.payload.get("binary") is True: binary_payload = await recv_stream_bytes(websocket, stream) response_payload: Dict[str, Any] + if cmd.command == "test_all_sha_stream": + try: + async for result in context.runtime.test_all_sha_stream(cmd.payload.get("channel")): + await send_stream_json( + websocket, + stream, + { + "type": "command_response", + "command": cmd.command, + "status": "ok", + "data": result, + "timestamp": cmd.timestamp, + }, + ) + response_payload = {"status": "ok", "data": {"done": True}} + except Exception as inner_exc: # noqa: BLE001 - returned to frontend + response_payload = {"status": "error", "error": str(inner_exc), "data": {"done": True}} + await send_stream_json( + websocket, + stream, + { + "type": "command_response", + "command": cmd.command, + **response_payload, + "timestamp": cmd.timestamp, + }, + ) + continue try: response_payload = await execute_command(cmd, binary_payload=binary_payload) except Exception as inner_exc: # noqa: BLE001 - returned to frontend diff --git a/service/runtime.py b/service/runtime.py index 534eb7c38..d261067db 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -19,8 +19,10 @@ from .utils.broadcast import BroadcastChannel from .update import ( read_setup_toml, + repo_sha_test_configs, check_for_update, test_all_repo_sha, + test_repo_sha, update_to_latest, validate_cdk, write_setup_toml, @@ -445,6 +447,34 @@ async def test_all_sha(channel=None): all_sha_res = await run_blocking(test_all_repo_sha, 3.0, channel) return all_sha_res + @staticmethod + async def test_all_sha_stream(channel=None): + async def test_one(config: Dict[str, Any]) -> Dict[str, Any]: + try: + return await run_blocking(test_repo_sha, config, 3.0) + except Exception as exc: # noqa: BLE001 - keep one failed source from stopping the stream + method = config.get("method") + return { + "name" : config.get("name"), + "method" : getattr(method, "name", str(method)), + "duration": 0, + "success" : False, + "value" : None, + "error" : str(exc), + } + + tasks = [ + asyncio.create_task(test_one(config)) + for config in repo_sha_test_configs(channel) + ] + try: + for task in asyncio.as_completed(tasks): + yield await task + finally: + for task in tasks: + if not task.done(): + task.cancel() + async def check_for_update(self): all_update_res = await run_blocking(check_for_update) self.publish_version_update(all_update_res) diff --git a/service/update/__init__.py b/service/update/__init__.py index 5d4f59db7..d23a96aaa 100644 --- a/service/update/__init__.py +++ b/service/update/__init__.py @@ -3,6 +3,7 @@ VersionInfo, check_for_update, get_local_version, + repo_sha_test_configs, read_setup_toml, test_all_repo_sha, test_repo_sha, @@ -17,6 +18,7 @@ "VersionInfo", "check_for_update", "get_local_version", + "repo_sha_test_configs", "read_setup_toml", "test_all_repo_sha", "test_repo_sha", diff --git a/service/update/checks.py b/service/update/checks.py index 776663014..9f8e19577 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -178,12 +178,17 @@ def _git_wrapper_get_latest_sha(config: Dict[str, Any]) -> Tuple[bool, str]: return False, str(exc) +def repo_sha_test_configs(channel: Optional[str] = None) -> List[Dict[str, Any]]: + """Return normalized repository SHA test configs for a channel.""" + channel = normalize_update_channel(channel or _setup_channel()[0]) + return [{**config, "channel": channel} for config in get_remote_sha_methods_for_channel(channel)] + + def test_all_repo_sha(timeout: float = 3.0, channel: Optional[str] = None) -> List[RepositoryResult]: """Test every configured repository and return timing + SHA details.""" - channel = normalize_update_channel(channel or _setup_channel()[0]) results: List[RepositoryResult] = [] - for config in get_remote_sha_methods_for_channel(channel): - result = test_repo_sha({**config, "channel": channel}, timeout) + for config in repo_sha_test_configs(channel): + result = test_repo_sha(config, timeout) results.append(result) return results diff --git a/tests/service/test_service_logic.py b/tests/service/test_service_logic.py index 92b62ee60..7642920f4 100644 --- a/tests/service/test_service_logic.py +++ b/tests/service/test_service_logic.py @@ -12,6 +12,8 @@ from service.utils.broadcast import BroadcastChannel from service.conf.manager import ConfigManager from service.utils.diff import apply_patch, diff_documents +from service import runtime as runtime_module +from service.runtime import ServiceRuntime def test_apply_patch_and_diff_documents(): @@ -132,3 +134,34 @@ async def scenario(): assert payload["resource"] == "config" assert payload["resource_id"] == "default_config" assert {"op": "replace", "path": "/name", "value": "After"} in payload["ops"] + + +def test_service_runtime_streams_sha_results_by_completion(monkeypatch, tmp_path): + def fake_configs(channel): + return [ + {"name": "slow", "method": "SLOW", "channel": channel}, + {"name": "fast", "method": "FAST", "channel": channel}, + ] + + def fake_test_repo_sha(config, timeout): + time.sleep(0.05 if config["name"] == "slow" else 0.01) + return { + "name": config["name"], + "method": config["method"], + "duration": timeout, + "success": True, + "value": config["name"], + "error": None, + } + + async def scenario(): + runtime = ServiceRuntime(tmp_path) + results = [] + async for result in runtime.test_all_sha_stream("stable"): + results.append(result["name"]) + return results + + monkeypatch.setattr(runtime_module, "repo_sha_test_configs", fake_configs) + monkeypatch.setattr(runtime_module, "test_repo_sha", fake_test_repo_sha) + + assert asyncio.run(scenario()) == ["fast", "slow"] From cc5665db9257e83556e291f6ea02bf9cab96f1ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 16:48:34 +0800 Subject: [PATCH 39/98] Fix PR review issues --- core/ocr/baas_ocr_client/server_installer.py | 14 ++-- deploy/installer/installer.py | 35 ++++++---- deploy/service/dockerfile | 2 +- gui/components/expand/baasUpdateConfig.py | 7 +- service/api/ws_provider.py | 43 ++++++++----- service/auth/manager.py | 11 ++-- service/runtime.py | 67 ++++++++++---------- service/types.py | 2 +- service/update/checks.py | 3 +- 9 files changed, 105 insertions(+), 79 deletions(-) diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index 5068e0ee6..beec25088 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -5,6 +5,7 @@ import platform import subprocess import time +import tempfile from typing import Optional import pygit2 @@ -105,12 +106,13 @@ def get_remote_sha(self) -> Optional[str]: # Fallback to pygit2 try: - repo = pygit2.Repository() - remote = repo.remotes.create_anonymous(self.remote_url) - target_ref_name = f"refs/heads/{self.branch}" - for head in remote.ls_remotes(): - if head.get("name") == target_ref_name: - return str(head.get("oid")) + with tempfile.TemporaryDirectory() as tmp: + repo = pygit2.init_repository(tmp, bare=True) + remote = repo.remotes.create_anonymous(self.remote_url) + target_ref_name = f"refs/heads/{self.branch}" + for head in remote.ls_remotes(): + if head.get("name") == target_ref_name: + return str(head.get("oid")) except Exception as e: self.logger.error(f"pygit2 failed to get remote info: {e}") return None diff --git a/deploy/installer/installer.py b/deploy/installer/installer.py index eded95a20..df0891b29 100644 --- a/deploy/installer/installer.py +++ b/deploy/installer/installer.py @@ -115,11 +115,19 @@ def _run(self): print(self.char, end="", flush=True) def start(self): + if self._thread.is_alive(): + return + self._stop.clear() + self._thread = threading.Thread( + target=self._run, + daemon=True, + ) self._thread.start() def stop(self): self._stop.set() - self._thread.join() + if self._thread.is_alive(): + self._thread.join() print() class GlobalConfig: @@ -284,7 +292,6 @@ def __init__(self, repo_path: Path, remote_url: str): self.printer = DotPrinter(interval=0.5) def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: - self.printer.start() """Executes a system git command.""" if not self.git_executable: raise RuntimeError("System git not found.") @@ -297,6 +304,8 @@ def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: env = __env__.copy() env["GIT_TERMINAL_PROMPT"] = "0" + printer = DotPrinter(interval=0.5) + printer.start() try: result = subprocess.run( [self.git_executable, *args], @@ -306,11 +315,11 @@ def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: check=True, env=env ) - self.printer.stop() return result.stdout.strip() except subprocess.CalledProcessError as e: - self.printer.stop() raise RuntimeError(f"Git command failed: {e.stderr}") + finally: + printer.stop() def is_valid_repo(self) -> bool: """Checks if the directory is a valid git repository.""" @@ -817,8 +826,8 @@ def _try_mirrorc_update(self) -> bool: def _get_mirror_update_type(self) -> str: local_sha = self.cfg.General.current_BAAS_version if len(local_sha) == 0: - if os.path.exists(self.cfg.Paths.BAAS_ROOT_PATH / ".git"): - repo = Repository(str(self.cfg.Paths.BAAS_ROOT_PATH)) + if os.path.exists(self.cfg.baas_root / ".git"): + repo = Repository(str(self.cfg.baas_root)) # Get local SHA try: local_sha = str(repo.head.target) @@ -826,7 +835,7 @@ def _get_mirror_update_type(self) -> str: logger.error(f"Incorrect Key or corrupted repo: {e}. Remove [ .git ] folder and reinstall.") del repo gc.collect() - shutil.rmtree(self.cfg.Paths.BAAS_ROOT_PATH / ".git") + shutil.rmtree(self.cfg.baas_root / ".git") return "full" else: # first install @@ -864,16 +873,16 @@ def _mirrorc_install_baas(self, latest_mirrorc_return): # Download the repository zip file file_length = latest_mirrorc_return.file_size / (1024 * 1024) logger.info("Downloading the repository zip, total = %.2f MB" % file_length) - with tempfile.TemporaryDirectory(dir=self.cfg.Paths.BAAS_ROOT_PATH) as tmp_dir: + with tempfile.TemporaryDirectory(dir=self.cfg.baas_root) as tmp_dir: zip_path = FileSystemUtils.download_file( latest_mirrorc_return.download_url, tmp_dir ) logger.info("Unzipping the repository...") - FileSystemUtils.unzip_file(zip_path, zip_path) + FileSystemUtils.unzip_file(zip_path, Path(tmp_dir)) logger.info("Moving unzipped files to BAAS root path...") file_dir = Path(tmp_dir) / "blue_archive_auto_script" - FileSystemUtils.copy_directory_structure(file_dir, self.cfg.Paths.BAAS_ROOT_PATH) + FileSystemUtils.copy_directory_structure(file_dir, self.cfg.baas_root) logger.success("Mirrorc Install Success!") @@ -900,17 +909,17 @@ def _mirrorc_update_baas(self, latest_mirrorc_return): file_length = latest_mirrorc_return.file_size / (1024 * 1024) logger.info("Downloading the incremental zip, total = %.2f MB" % file_length) - with tempfile.TemporaryDirectory(dir=self.cfg.Paths.BAAS_ROOT_PATH) as tmp_dir: + with tempfile.TemporaryDirectory(dir=self.cfg.baas_root) as tmp_dir: zip_path = FileSystemUtils.download_file( latest_mirrorc_return.download_url, tmp_dir ) logger.info("Unzipping the incremental update...") - FileSystemUtils.unzip_file(zip_path, zip_path) + FileSystemUtils.unzip_file(zip_path, Path(tmp_dir)) MirrorC_Updater.apply_update( tmp_dir, Path(tmp_dir) / "changes.json", - Path(self.cfg.Paths.BAAS_ROOT_PATH), + self.cfg.baas_root, logger ) logger.success("Mirrorc Incremental Update Success!") diff --git a/deploy/service/dockerfile b/deploy/service/dockerfile index 26c32f4e2..04d7405aa 100644 --- a/deploy/service/dockerfile +++ b/deploy/service/dockerfile @@ -17,7 +17,7 @@ ENV PATH="/root/.local/bin:/root/.cargo/bin:$PATH" RUN uv python install 3.9.0 # ---- Python dependency layer (cache-friendly) ---- -COPY requirements.service.txt /tmp/requirements.service.txt +COPY requirements.service.linux.txt /tmp/requirements.service.txt RUN uv venv /opt/venv --python 3.9.0 \ && . /opt/venv/bin/activate \ diff --git a/gui/components/expand/baasUpdateConfig.py b/gui/components/expand/baasUpdateConfig.py index 6ee585025..31d9bffc7 100644 --- a/gui/components/expand/baasUpdateConfig.py +++ b/gui/components/expand/baasUpdateConfig.py @@ -96,10 +96,9 @@ def pygit2_get_latest_sha(data): remote_refs = remote.ls_remotes() # 遍历匹配分支引用 - for ref_name, oid in remote_refs: - decoded_ref = ref_name - if decoded_ref == target_ref: - sha = str(oid) + for ref in remote_refs: + if ref.get("name") == target_ref: + sha = str(ref.get("oid")) return True, sha # 如果没找到直接尝试 refs/remotes/origin/ diff --git a/service/api/ws_provider.py b/service/api/ws_provider.py index 4cedfc32e..21695b44a 100644 --- a/service/api/ws_provider.py +++ b/service/api/ws_provider.py @@ -2,6 +2,7 @@ import asyncio from contextlib import suppress +from typing import Optional from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect @@ -19,7 +20,10 @@ async def provider_sender( stream: SecretStreamBox, queue: asyncio.Queue, envelope_type: str, + send_lock: Optional[asyncio.Lock] = None, ) -> None: + if send_lock is None: + send_lock = asyncio.Lock() try: while True: payload = await queue.get() @@ -27,7 +31,8 @@ async def provider_sender( response = {"type": envelope_type, "status": payload} else: response = {"type": envelope_type, "entry": payload} - await send_stream_json(websocket, stream, response) + async with send_lock: + await send_stream_json(websocket, stream, response) except asyncio.CancelledError: pass @@ -38,33 +43,39 @@ async def websocket_provider(websocket: WebSocket) -> None: log_task = status_task = None try: _, stream = await perform_business_resume(websocket, channel="provider") + send_lock = asyncio.Lock() history = context.log_manager.get_history() scopes = context.log_manager.get_scopes() - await send_stream_json(websocket, stream, {"type": "logs_full", "scopes": scopes, "entries": history}) - await send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) + async with send_lock: + await send_stream_json(websocket, stream, {"type": "logs_full", "scopes": scopes, "entries": history}) + async with send_lock: + await send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) if context.runtime.is_all_data_initialized: - await send_stream_json(websocket, stream, {"type": "status", "status": {"is_all_data_initialized": True}}) + async with send_lock: + await send_stream_json(websocket, stream, {"type": "status", "status": {"is_all_data_initialized": True}}) log_queue = await context.log_manager.subscribe() status_queue = await context.runtime.subscribe_status() - log_task = asyncio.create_task(provider_sender(websocket, stream, log_queue, "log")) - status_task = asyncio.create_task(provider_sender(websocket, stream, status_queue, "status")) + log_task = asyncio.create_task(provider_sender(websocket, stream, log_queue, "log", send_lock)) + status_task = asyncio.create_task(provider_sender(websocket, stream, status_queue, "status", send_lock)) while True: message = await recv_stream_json(websocket, stream) req_type = message.get("type") if req_type == "static_request": ProviderRequest(**message) snapshot = await context.config_manager.get_static_snapshot() - await send_stream_json( - websocket, - stream, - { - "type": "static_snapshot", - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) + async with send_lock: + await send_stream_json( + websocket, + stream, + { + "type": "static_snapshot", + "timestamp": snapshot.timestamp, + "data": snapshot.data, + }, + ) elif req_type == "status_request": - await send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) + async with send_lock: + await send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) else: raise HTTPException(status_code=400, detail=f"Unsupported provider message: {req_type}") except (AuthenticationError, HTTPException) as exc: diff --git a/service/auth/manager.py b/service/auth/manager.py index c103ae9b8..efdd6e0d8 100644 --- a/service/auth/manager.py +++ b/service/auth/manager.py @@ -21,7 +21,6 @@ from .constants import ( ARGON2_SALT_BYTES, DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64, - DEFAULT_SIGNING_SEED_B64, REMEMBER_TTL_SECONDS, SESSION_TTL_SECONDS, PROTOCOL_VERSION, ) @@ -46,7 +45,6 @@ def __init__(self, project_root: Path) -> None: self._password_state = self._load_password_state() self._signing_key = self._load_signing_key() - self._verify_default_public_key() self._ticket_key = self._load_or_create_key( self._ticket_file, env_name="BAAS_SERVICE_TICKET_KEY_B64", @@ -569,9 +567,14 @@ def _load_signing_key(self) -> Ed25519PrivateKey: return Ed25519PrivateKey.from_private_bytes(b64d(env_seed)) if self._signing_file.exists(): return Ed25519PrivateKey.from_private_bytes(self._signing_file.read_bytes()) - seed = b64d(DEFAULT_SIGNING_SEED_B64) + private_key = Ed25519PrivateKey.generate() + seed = private_key.private_bytes( + serialization.Encoding.Raw, + serialization.PrivateFormat.Raw, + serialization.NoEncryption(), + ) self._signing_file.write_bytes(seed) - return Ed25519PrivateKey.from_private_bytes(seed) + return private_key def _verify_default_public_key(self) -> None: public_key = self._signing_key.public_key().public_bytes( diff --git a/service/runtime.py b/service/runtime.py index d261067db..90d11eff1 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -2,7 +2,6 @@ import asyncio import copy -import datetime import io import json import os @@ -339,42 +338,44 @@ async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict if session is None: session = self._get_or_create_session(config_id) if set_log: set_log() + if session.thread and session.thread.is_alive(): + return {"status": "already-running", "config_id": config_id} baas = session.baas needs_init = session.baas.scheduler is None - if needs_init: - await run_blocking(baas.init_all_data) + if needs_init: + await run_blocking(baas.init_all_data) - def _call() -> None: - try: - self._update_status( - config_id, - running=True, - is_flag_run=True, - exit_code=None, - current_task=task_name, - waiting_tasks=[] - ) - baas.flag_run = True - baas.send("solve", task_name) - finally: - session.thread = None - assert session is not None - self._update_status( - config_id, - running=False, - is_flag_run=session.baas.flag_run, - current_task=None, - waiting_tasks=[] - ) + def _call() -> None: + try: + self._update_status( + config_id, + running=True, + is_flag_run=True, + exit_code=None, + current_task=task_name, + waiting_tasks=[] + ) + baas.flag_run = True + baas.send("solve", task_name) + finally: + session.thread = None + assert session is not None + self._update_status( + config_id, + running=False, + is_flag_run=session.baas.flag_run, + current_task=None, + waiting_tasks=[] + ) - thread = threading.Thread( - target=_call, - name=f"baas-solver-{task_name}-{config_id}", - daemon=True, - ) - session.thread = thread - thread.start() + thread = threading.Thread( + target=_call, + name=f"baas-solver-{task_name}-{config_id}", + daemon=True, + ) + session.thread = thread + thread.start() return {"status": "ok", "task": task_name, "result": 0} @@ -501,7 +502,7 @@ async def update_setup_toml(payload: Dict[str, Any]) -> Dict[str, Any]: async def add_config(self, name, server): """Create a new config directory with generated timestamp id.""" - serial_name = str(int(datetime.datetime.now().timestamp())) + serial_name = self._new_config_id() ConfigInitializer(self._project_root).check_config(serial_name, name=name, server=server) return { "serial": serial_name diff --git a/service/types.py b/service/types.py index 72e8cb576..fe60187a6 100644 --- a/service/types.py +++ b/service/types.py @@ -114,7 +114,7 @@ class SyncPushPayload(BaseModel): """ type: Literal["patch"] = "patch" - resource: Literal["config", "event", "gui", "setup_toml"] + resource: Literal["config", "event", "gui", "static", "setup_toml"] resource_id: Optional[str] = None timestamp: float ops: List[PatchOperation] diff --git a/service/update/checks.py b/service/update/checks.py index 9f8e19577..bdc162ffd 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -315,7 +315,8 @@ def get_local_version(setup_path: Optional[Path] = None) -> Tuple["VersionInfo", data["general"]["current_baas_sha"] = version_value write_setup_toml(data, path) except Exception: - version_value = "" + data = migrate_to_current_schema(data) + version_value = data["general"].get("current_baas_sha", "") _branch = "master" return VersionInfo(version=version_value, source="setup.toml", path=path), data, _branch From d6cb0e10544ffd2e4ef19ed1d2d7b6d22d81683e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 22:14:57 +0800 Subject: [PATCH 40/98] Fix: Unknown Task Displayed on start-tasks --- service/runtime.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/service/runtime.py b/service/runtime.py index 90d11eff1..8faf99536 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -332,6 +332,7 @@ async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict Command result payload with normalized task name. """ if task_name in _TASK_ALIAS: + _original_task_name = task_name task_name = _TASK_ALIAS[task_name] async with self._lock: session = self._sessions.get(config_id) @@ -353,7 +354,7 @@ def _call() -> None: running=True, is_flag_run=True, exit_code=None, - current_task=task_name, + current_task=_original_task_name, waiting_tasks=[] ) baas.flag_run = True From 76650f758bd0e5d304fd232012ee26dedf8117f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 23:26:39 +0800 Subject: [PATCH 41/98] Fix: Auth signing key incorrectly generated --- service/auth/manager.py | 17 ++++++------- tests/service/test_auth_manager.py | 38 +++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/service/auth/manager.py b/service/auth/manager.py index efdd6e0d8..86696f797 100644 --- a/service/auth/manager.py +++ b/service/auth/manager.py @@ -21,8 +21,10 @@ from .constants import ( ARGON2_SALT_BYTES, DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64, + DEFAULT_SIGNING_SEED_B64, + PROTOCOL_VERSION, REMEMBER_TTL_SECONDS, - SESSION_TTL_SECONDS, PROTOCOL_VERSION, + SESSION_TTL_SECONDS, ) from .crypto import argon2, b64d, b64e, canonical_dumps, hkdf_sha256, hmac_sha256 from .errors import AuthenticationError @@ -565,16 +567,11 @@ def _load_signing_key(self) -> Ed25519PrivateKey: env_seed = os.getenv("BAAS_SERVICE_SIGN_SEED_B64") if env_seed: return Ed25519PrivateKey.from_private_bytes(b64d(env_seed)) - if self._signing_file.exists(): - return Ed25519PrivateKey.from_private_bytes(self._signing_file.read_bytes()) - private_key = Ed25519PrivateKey.generate() - seed = private_key.private_bytes( - serialization.Encoding.Raw, - serialization.PrivateFormat.Raw, - serialization.NoEncryption(), - ) + seed = b64d(DEFAULT_SIGNING_SEED_B64) + if self._signing_file.exists() and self._signing_file.read_bytes() == seed: + return Ed25519PrivateKey.from_private_bytes(seed) self._signing_file.write_bytes(seed) - return private_key + return Ed25519PrivateKey.from_private_bytes(seed) def _verify_default_public_key(self) -> None: public_key = self._signing_key.public_key().public_bytes( diff --git a/tests/service/test_auth_manager.py b/tests/service/test_auth_manager.py index d65884160..d48a53d9d 100644 --- a/tests/service/test_auth_manager.py +++ b/tests/service/test_auth_manager.py @@ -8,7 +8,15 @@ import pytest from service.auth import manager as auth_manager_module -from service.auth import AuthenticationError, ServiceAuthManager, canonical_dumps, hmac_sha256 +from service.auth import ( + AuthenticationError, + DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64, + DEFAULT_SIGNING_SEED_B64, + ServiceAuthManager, + b64d, + canonical_dumps, + hmac_sha256, +) def _workspace_tmp() -> Path: @@ -45,6 +53,34 @@ def test_auth_manager_password_change_revokes_sessions(monkeypatch): _cleanup(root) +def test_signing_key_defaults_to_frontend_pin(monkeypatch): + root = _workspace_tmp() + monkeypatch.delenv("BAAS_SERVICE_SIGN_SEED_B64", raising=False) + try: + manager = ServiceAuthManager(root) + + assert manager.server_public_key_b64() == DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64 + assert (root / "config" / "service_signing_key.bin").read_bytes() == b64d(DEFAULT_SIGNING_SEED_B64) + finally: + _cleanup(root) + + +def test_stale_signing_key_is_replaced_with_default(monkeypatch): + root = _workspace_tmp() + monkeypatch.delenv("BAAS_SERVICE_SIGN_SEED_B64", raising=False) + try: + signing_file = root / "config" / "service_signing_key.bin" + signing_file.parent.mkdir(parents=True, exist_ok=True) + signing_file.write_bytes(b"x" * 32) + + manager = ServiceAuthManager(root) + + assert manager.server_public_key_b64() == DEFAULT_SERVER_SIGN_PUBLIC_KEY_B64 + assert signing_file.read_bytes() == b64d(DEFAULT_SIGNING_SEED_B64) + finally: + _cleanup(root) + + def test_remember_proof_and_token_round_trip(monkeypatch): root = _workspace_tmp() monkeypatch.setattr(auth_manager_module, "argon2", lambda password, salt: (password.encode("utf-8") + b"0" * 32)[:32]) From c003da7ec96a86bceac6efaf69d466daf7aac5ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 23:48:16 +0800 Subject: [PATCH 42/98] Fix: Workflow Trigger Pull Error --- .github/workflows/sync-from-upstream.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sync-from-upstream.yml b/.github/workflows/sync-from-upstream.yml index 34826c7ea..f65739be4 100644 --- a/.github/workflows/sync-from-upstream.yml +++ b/.github/workflows/sync-from-upstream.yml @@ -26,10 +26,12 @@ jobs: with: fetch-depth: 0 ref: master + persist-credentials: false - name: Create or update sync PR, then try auto-merge env: - GH_TOKEN: ${{ github.token }} + GH_TOKEN: ${{ secrets.UPSTREAM_TO_KIRAMEI_DEV_PAT || github.token }} + SYNC_TOKEN_KIND: ${{ secrets.UPSTREAM_TO_KIRAMEI_DEV_PAT != '' && 'pat' || 'github_token' }} EXPECTED_REPOSITORY: Kiramei/baas-dev UPSTREAM_REPO: pur1fying/blue_archive_auto_script UPSTREAM_BRANCH: master @@ -49,9 +51,15 @@ jobs: git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git remote add upstream "https://github.com/${UPSTREAM_REPO}.git" + git remote set-url origin "https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" git fetch upstream "${UPSTREAM_BRANCH}" git fetch origin "${BASE_BRANCH}" + if [ "${SYNC_TOKEN_KIND}" != "pat" ] && git diff --name-only "origin/${BASE_BRANCH}" "upstream/${UPSTREAM_BRANCH}" -- .github/workflows | grep -q .; then + echo "::error::Upstream contains workflow file changes, but UPSTREAM_TO_KIRAMEI_DEV_PAT is not configured. Add a PAT with repo and workflow scopes as this repository secret." + exit 1 + fi + # Skip if the fork base branch already contains the latest upstream branch. if git merge-base --is-ancestor "upstream/${UPSTREAM_BRANCH}" "origin/${BASE_BRANCH}"; then echo "fork ${BASE_BRANCH} already contains upstream/${UPSTREAM_BRANCH}. Nothing to do." From 7cb4f9a509da515860b2e1244b44206495263141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Jun 2026 23:54:23 +0800 Subject: [PATCH 43/98] Fix sync PR creation on older gh CLI --- .github/workflows/sync-from-upstream.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/sync-from-upstream.yml b/.github/workflows/sync-from-upstream.yml index f65739be4..8a2a4f18d 100644 --- a/.github/workflows/sync-from-upstream.yml +++ b/.github/workflows/sync-from-upstream.yml @@ -87,9 +87,7 @@ jobs: --base "${BASE_BRANCH}" \ --head "${SYNC_BRANCH}" \ --title "Sync upstream master" \ - --body "Automated PR to sync changes from pur1fying/blue_archive_auto_script:master into Kiramei/baas-dev:master." \ - --json url \ - --jq '.url')" + --body "Automated PR to sync changes from pur1fying/blue_archive_auto_script:master into Kiramei/baas-dev:master.")" echo "Created sync PR: ${pr_url}" fi From 179eccea17c77d132ea863c3d73f3afbb28aec5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 22 Jun 2026 23:30:41 +0800 Subject: [PATCH 44/98] Fix: Unify the timestamp to ms --- service/api/security.py | 4 ++-- service/api/ws_control.py | 4 ++-- service/conf/manager.py | 14 +++++++------- service/runtime.py | 5 +++-- service/utils/__init__.py | 3 +++ service/utils/timestamps.py | 12 ++++++++++++ 6 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 service/utils/timestamps.py diff --git a/service/api/security.py b/service/api/security.py index b3eaa9902..936976cbc 100644 --- a/service/api/security.py +++ b/service/api/security.py @@ -3,7 +3,6 @@ import asyncio import json import os -import time from typing import Optional from urllib.parse import urlparse @@ -19,6 +18,7 @@ b64d, b64e, ) +from service.utils.timestamps import unix_timestamp_ms from .state import REMEMBER_COOKIE_NAME, context @@ -189,7 +189,7 @@ async def control_heartbeat_sender( control_channel.encrypt( { "type": "heartbeat", - "timestamp": time.time(), + "timestamp": unix_timestamp_ms(), } ) ) diff --git a/service/api/ws_control.py b/service/api/ws_control.py index 439aa0732..1d847071c 100644 --- a/service/api/ws_control.py +++ b/service/api/ws_control.py @@ -1,13 +1,13 @@ from __future__ import annotations import asyncio -import time from contextlib import suppress from typing import Optional from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect from service.auth import ActiveSession, AuthenticationError +from service.utils.timestamps import unix_timestamp_ms from .security import ( begin_server_hello, @@ -55,7 +55,7 @@ async def websocket_control(websocket: WebSocket) -> None: message = control_channel.decrypt(await websocket.receive_json()) msg_type = message.get("type") if msg_type == "ping": - await websocket.send_json(control_channel.encrypt({"type": "pong", "timestamp": time.time()})) + await websocket.send_json(control_channel.encrypt({"type": "pong", "timestamp": unix_timestamp_ms()})) elif msg_type == "change_password": new_password = str(message.get("new_password", "")) await context.auth_manager.change_password(session_id=session.session_id, new_password=new_password) diff --git a/service/conf/manager.py b/service/conf/manager.py index e15088725..119d98949 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -5,7 +5,6 @@ import json import logging import os -import time from dataclasses import dataclass from pathlib import Path from typing import Any, Dict, Iterable, List, Optional, Union @@ -18,6 +17,7 @@ from service.update.setup_schema import legacy_repo_url, migrate_to_current_schema from service.utils.broadcast import BroadcastChannel from service.utils.diff import PatchConflictError, apply_patch, diff_documents +from service.utils.timestamps import file_mtime_ms, unix_timestamp_ms from .resources import ResourceKey, ResourcePathResolver @@ -84,7 +84,7 @@ async def get_config_list(self) -> ResourceSnapshot: """ async with self._lock: ids = self.list_config_ids() - return ResourceSnapshot(copy.deepcopy(ids), time.time()) + return ResourceSnapshot(copy.deepcopy(ids), unix_timestamp_ms()) # ------------------------------------------------------------------ # snapshot helpers @@ -249,7 +249,7 @@ def _load_from_disk(self, resource: str, resource_id: Optional[str]) -> Resource event = self.gen_event_formation_attr(data_to_store) data_to_store["current_game_activity"] = event - timestamp = path.stat().st_mtime + timestamp = file_mtime_ms(path) snapshot = ResourceSnapshot(data=data_to_store, timestamp=timestamp) self._snapshots[(resource, resource_id)] = snapshot self._mtimes[(resource, resource_id)] = timestamp @@ -341,7 +341,7 @@ async def apply_patch( else: await asyncio.to_thread(self._write_json, path, to_dump, resource) - new_timestamp = max(timestamp, time.time(), path.stat().st_mtime) + new_timestamp = max(timestamp, unix_timestamp_ms(), file_mtime_ms(path)) new_snapshot = ResourceSnapshot(data=updated, timestamp=new_timestamp) self._snapshots[key] = new_snapshot self._mtimes[key] = new_timestamp @@ -396,7 +396,7 @@ async def _notify_config_added(self, config_id: str): payload = SyncPushPayload( resource="config", resource_id=config_id, - timestamp=time.time(), + timestamp=unix_timestamp_ms(), ops=[PatchOperation(op="add", path="", value={})], origin="filesystem", ) @@ -406,7 +406,7 @@ async def _notify_config_removed(self, config_id: str): payload = SyncPushPayload( resource="config", resource_id=config_id, - timestamp=time.time(), + timestamp=unix_timestamp_ms(), ops=[PatchOperation(op="remove", path="", value=None)], origin="filesystem", ) @@ -422,7 +422,7 @@ async def _check_resource(self, resource: str, resource_id: Optional[str]) -> No path = self._file_path(resource, resource_id) if not path.exists(): return - mtime = path.stat().st_mtime + mtime = file_mtime_ms(path) previous = self._mtimes.get(key) if previous is None: self._mtimes[key] = mtime diff --git a/service/runtime.py b/service/runtime.py index 8faf99536..bd65f4c4c 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -16,6 +16,7 @@ from .conf import ConfigInitializer from .conf import resolve_config_dir from .utils.broadcast import BroadcastChannel +from .utils.timestamps import unix_timestamp_ms from .update import ( read_setup_toml, repo_sha_test_configs, @@ -77,7 +78,7 @@ def _default_status(config_id: str) -> Dict[str, Any]: "current_task" : None, "waiting_tasks": [], "exit_code" : None, - "timestamp" : time.time(), + "timestamp" : unix_timestamp_ms(), } @@ -711,7 +712,7 @@ def _update_status(self, config_id: str, **changes: Any) -> None: with self._status_lock: status = self._statuses.setdefault(config_id, _default_status(config_id)) status.update(changes) - status["timestamp"] = time.time() + status["timestamp"] = unix_timestamp_ms() snapshot = dict(status) self._publish_status(config_id, snapshot) diff --git a/service/utils/__init__.py b/service/utils/__init__.py index 30fef6f21..1f9f1975c 100644 --- a/service/utils/__init__.py +++ b/service/utils/__init__.py @@ -1,6 +1,7 @@ from .broadcast import BroadcastChannel from .diff import PatchConflictError, apply_patch, diff_documents from .logging import LogManager +from .timestamps import file_mtime_ms, unix_timestamp_ms __all__ = [ "BroadcastChannel", @@ -8,4 +9,6 @@ "PatchConflictError", "apply_patch", "diff_documents", + "file_mtime_ms", + "unix_timestamp_ms", ] diff --git a/service/utils/timestamps.py b/service/utils/timestamps.py new file mode 100644 index 000000000..b40e11e5e --- /dev/null +++ b/service/utils/timestamps.py @@ -0,0 +1,12 @@ +from __future__ import annotations + +import time +from pathlib import Path + + +def unix_timestamp_ms() -> float: + return time.time() * 1000 + + +def file_mtime_ms(path: Path) -> float: + return path.stat().st_mtime * 1000 From 5a83f88cd452dd1fe81fa27752b64c3b968b4494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 23 Jun 2026 22:56:21 +0800 Subject: [PATCH 45/98] Update: Support no_update setup option --- deploy/docker/entrypoint.sh | 55 +++++++++++++------ deploy/installer/toml_config.py | 1 + deploy/service/entrypoint.sh | 23 +++++++- service/context.py | 24 ++++++++- service/runtime.py | 8 ++- service/update/checks.py | 13 +++++ service/update/setup_schema.py | 58 ++++++++++++++++++--- tests/service/test_config_runtime_update.py | 2 + 8 files changed, 158 insertions(+), 26 deletions(-) diff --git a/deploy/docker/entrypoint.sh b/deploy/docker/entrypoint.sh index b4b8631c1..95ca27d27 100644 --- a/deploy/docker/entrypoint.sh +++ b/deploy/docker/entrypoint.sh @@ -42,26 +42,49 @@ echo "+--------------------------------+" echo "| UPDATE BAAS |" echo "+--------------------------------+" -remote_sha=$($GIT_HOME ls-remote --heads origin refs/heads/master | awk '{print $1}') -local_sha=$($GIT_HOME rev-parse HEAD) - -echo "[INFO] Remote SHA: $remote_sha" -echo "[INFO] Local SHA: $local_sha" - -if [ "$local_sha" = "$remote_sha" ] && [ -z "$($GIT_HOME diff)" ]; then - echo "[INFO] No updates available" +setup_no_update() { + if [ ! -f "setup.toml" ]; then + return 1 + fi + value="$(awk ' + /^\[.*\]$/ { section=$0 } + (section == "[General]" || section == "[general]") { + line=$0 + gsub(/[[:space:]]/, "", line) + split(line, parts, "=") + if (parts[1] == "no_update") { + print tolower(parts[2]) + exit + } + } + ' setup.toml)" + [ "$value" = "true" ] +} + +if setup_no_update; then + echo "[INFO] no_update is enabled. Skipping repository update." else - echo "[INFO] Pulling updates from the remote repository..." - $GIT_HOME reset --hard HEAD - $GIT_HOME pull "$REPO_URL_HTTP" + remote_sha=$($GIT_HOME ls-remote --heads origin refs/heads/master | awk '{print $1}') + local_sha=$($GIT_HOME rev-parse HEAD) - updated_local_sha=$($GIT_HOME rev-parse HEAD) + echo "[INFO] Remote SHA: $remote_sha" + echo "[INFO] Local SHA: $local_sha" - echo "[INFO] Updated SHA: $updated_local_sha" - if [ "$updated_local_sha" = "$remote_sha" ]; then - echo "[INFO] Update success" + if [ "$local_sha" = "$remote_sha" ] && [ -z "$($GIT_HOME diff)" ]; then + echo "[INFO] No updates available" else - echo "[ERROR] Failed to update the source code, please check your network or for conflicting files" + echo "[INFO] Pulling updates from the remote repository..." + $GIT_HOME reset --hard HEAD + $GIT_HOME pull "$REPO_URL_HTTP" + + updated_local_sha=$($GIT_HOME rev-parse HEAD) + + echo "[INFO] Updated SHA: $updated_local_sha" + if [ "$updated_local_sha" = "$remote_sha" ]; then + echo "[INFO] Update success" + else + echo "[ERROR] Failed to update the source code, please check your network or for conflicting files" + fi fi fi diff --git a/deploy/installer/toml_config.py b/deploy/installer/toml_config.py index a738b1a2e..d9afc8958 100644 --- a/deploy/installer/toml_config.py +++ b/deploy/installer/toml_config.py @@ -16,6 +16,7 @@ "no_build": True, "debug": False, "use_dynamic_update": False, + "no_update": False, "source_list": [ "https://pypi.tuna.tsinghua.edu.cn/simple", "https://mirrors.ustc.edu.cn/pypi/web/simple", diff --git a/deploy/service/entrypoint.sh b/deploy/service/entrypoint.sh index 45ca5c2b0..0c5dbb0a1 100644 --- a/deploy/service/entrypoint.sh +++ b/deploy/service/entrypoint.sh @@ -7,7 +7,28 @@ BRANCH="master" cd "$APP_DIR" -if [ ! -d ".git" ]; then +setup_no_update() { + if [ ! -f "setup.toml" ]; then + return 1 + fi + value="$(awk ' + /^\[.*\]$/ { section=$0 } + (section == "[General]" || section == "[general]") { + line=$0 + gsub(/[[:space:]]/, "", line) + split(line, parts, "=") + if (parts[1] == "no_update") { + print tolower(parts[2]) + exit + } + } + ' setup.toml)" + [ "$value" = "true" ] +} + +if setup_no_update; then + echo "[INFO] no_update is enabled. Skipping repository update." +elif [ ! -d ".git" ]; then echo "[INFO] No git repository found. Cloning repository..." git clone "$REPO_URL" . \ --branch "$BRANCH" \ diff --git a/service/context.py b/service/context.py index 9fdb7d35b..413ad5145 100644 --- a/service/context.py +++ b/service/context.py @@ -3,6 +3,10 @@ import asyncio import os import threading +try: + import tomllib # type: ignore[import] +except ModuleNotFoundError: # pragma: no cover - Python < 3.11 fallback + import tomli as tomllib # type: ignore[import] from contextlib import suppress from pathlib import Path from typing import Optional @@ -22,6 +26,24 @@ def _env_bool(name: str, default: bool) -> bool: return value.strip().lower() not in {"0", "false", "no", "off"} +def _setup_no_update(project_root: Path) -> bool: + setup_path = project_root / "setup.toml" + if not setup_path.exists(): + return False + try: + with setup_path.open("rb") as file: + data = tomllib.load(file) + except Exception: + return False + general = data.get("general") + legacy_general = data.get("General") + if isinstance(general, dict) and isinstance(general.get("no_update"), bool): + return general["no_update"] + if isinstance(legacy_general, dict) and isinstance(legacy_general.get("no_update"), bool): + return legacy_general["no_update"] + return False + + class ServiceContext: """Aggregates long-lived service components.""" @@ -34,7 +56,7 @@ def __init__(self, project_root: Path) -> None: self._loop: Optional[asyncio.AbstractEventLoop] = None self._fs_task: Optional[asyncio.Task] = None self._update_check_task: Optional[asyncio.Task] = None - self.need_ocr_update_check = _env_bool(OCR_UPDATE_CHECK_ENV, True) + self.need_ocr_update_check = _env_bool(OCR_UPDATE_CHECK_ENV, True) and not _setup_no_update(project_root) async def startup(self) -> None: loop = asyncio.get_running_loop() diff --git a/service/runtime.py b/service/runtime.py index bd65f4c4c..78659ef23 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -499,6 +499,10 @@ async def update_setup_toml(payload: Dict[str, Any]) -> Dict[str, Any]: general["get_remote_sha_method"] = payload["updateMethod"] if "mirrorcCdk" in payload: general["mirrorc_cdk"] = payload["mirrorcCdk"] + if "noUpdate" in payload: + general["no_update"] = bool(payload["noUpdate"]) + if "no_update" in payload: + general["no_update"] = bool(payload["no_update"]) await run_blocking(write_setup_toml, data, path) return {"status": "ok", "path": str(path), "data": data} @@ -663,7 +667,9 @@ async def import_config(self, content: bytes) -> Dict[str, Any]: async def update_to_latest(self): await self.stop_all_tasks() - await run_blocking(update_to_latest, None) + result = await run_blocking(update_to_latest, None) + if isinstance(result, dict) and result.get("status") == "skipped": + return result return {"status": "updated"} def publish_version_update(self, payload: Dict[str, Any]) -> None: diff --git a/service/update/checks.py b/service/update/checks.py index bdc162ffd..5af77e7ee 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -348,6 +348,16 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: try: local_info, setup_toml, _branch = get_local_version() setup_toml = migrate_to_current_schema(setup_toml) + if setup_toml["general"].get("no_update", False): + return { + "local": local_info.version, + "remote": local_info.version, + "update_available": False, + "skipped": True, + "reason": "no_update", + "channel": setup_channel(setup_toml), + "method": setup_toml["general"].get("get_remote_sha_method"), + } channel = setup_channel(setup_toml) setup_toml["general"]["channel"] = channel repo_methods = get_remote_sha_methods_for_channel(channel) @@ -395,4 +405,7 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: def update_to_latest(setup_path: Union[Path, None] = None): data, path = read_setup_toml(setup_path) + data = migrate_to_current_schema(data) + if data["general"].get("no_update", False): + return {"status": "skipped", "reason": "no_update"} update_repo_to_latest(data, path) diff --git a/service/update/setup_schema.py b/service/update/setup_schema.py index 56aa0a8d3..6afa75788 100644 --- a/service/update/setup_schema.py +++ b/service/update/setup_schema.py @@ -20,6 +20,7 @@ "launch": False, "force_launch": False, "debug": False, + "no_update": False, "source_list": LEGACY_DEFAULT_SETTINGS["General"]["source_list"], }, "paths": { @@ -50,6 +51,13 @@ def _first_string(*values: Any) -> str: return "" +def _first_bool(default: bool, *values: Any) -> bool: + for value in values: + if isinstance(value, bool): + return value + return default + + def setup_channel(data: Dict[str, Any]) -> str: general = _table(data, "general") legacy_general = _table(data, "General") @@ -74,37 +82,63 @@ def migrate_to_current_schema(data: Dict[str, Any]) -> Dict[str, Any]: current_general = current["general"] current_general.update({key: value for key, value in general.items() if key in current_general}) - current_general["mirrorc_cdk"] = _first_string(general.get("mirrorc_cdk"), legacy_general.get("mirrorc_cdk")) + current_general["mirrorc_cdk"] = _first_string( + general.get("mirrorc_cdk"), + general.get("mirrorcCdk"), + legacy_general.get("mirrorc_cdk"), + ) current_general["channel"] = setup_channel(data) current_general["current_baas_sha"] = _first_string( general.get("current_baas_sha"), + general.get("currentBaasSha"), legacy_general.get("current_baas_sha"), legacy_general.get("current_baas_version"), legacy_general.get("current_BAAS_version"), ) current_general["current_baas_cpp_sha"] = _first_string( general.get("current_baas_cpp_sha"), + general.get("currentBaasCppSha"), legacy_general.get("current_baas_cpp_sha"), legacy_general.get("current_baas_cpp_version"), legacy_general.get("current_BAAS_Cpp_version"), ) current_general["get_remote_sha_method"] = _first_string( general.get("get_remote_sha_method"), + general.get("getRemoteShaMethod"), legacy_general.get("get_remote_sha_method"), method_for_repo_url(legacy_urls.get("REPO_URL_HTTP")), ) - for bool_key in ("launch", "force_launch", "debug"): - current_general[bool_key] = bool(general.get(bool_key, legacy_general.get(bool_key, current_general[bool_key]))) - source_list = general.get("source_list") or legacy_general.get("source_list") + current_general["launch"] = _first_bool(current_general["launch"], general.get("launch"), legacy_general.get("launch")) + current_general["force_launch"] = _first_bool( + current_general["force_launch"], + general.get("force_launch"), + general.get("forceLaunch"), + legacy_general.get("force_launch"), + ) + current_general["debug"] = _first_bool(current_general["debug"], general.get("debug"), legacy_general.get("debug")) + current_general["no_update"] = _first_bool( + current_general["no_update"], + general.get("no_update"), + general.get("noUpdate"), + legacy_general.get("no_update"), + ) + source_list = general.get("source_list") or general.get("sourceList") or legacy_general.get("source_list") if isinstance(source_list, list) and source_list: current_general["source_list"] = [str(item) for item in source_list] current_paths = current["paths"] current_paths.update({key: value for key, value in paths.items() if key in current_paths}) - current_paths["baas_root_path"] = _first_string(paths.get("baas_root_path"), legacy_paths.get("BAAS_ROOT_PATH")) - current_paths["tmp_path"] = _first_string(paths.get("tmp_path"), legacy_paths.get("TMP_PATH")) or current_paths["tmp_path"] + current_paths["baas_root_path"] = _first_string( + paths.get("baas_root_path"), + paths.get("baasRootPath"), + legacy_paths.get("BAAS_ROOT_PATH"), + ) + current_paths["tmp_path"] = ( + _first_string(paths.get("tmp_path"), paths.get("tmpPath"), legacy_paths.get("TMP_PATH")) + or current_paths["tmp_path"] + ) current_paths["toolkit_path"] = ( - _first_string(paths.get("toolkit_path"), legacy_paths.get("TOOL_KIT_PATH")) + _first_string(paths.get("toolkit_path"), paths.get("toolkitPath"), legacy_paths.get("TOOL_KIT_PATH")) or current_paths["toolkit_path"] ) @@ -112,13 +146,22 @@ def migrate_to_current_schema(data: Dict[str, Any]) -> Dict[str, Any]: current_python.update({key: value for key, value in python.items() if key in current_python}) current_python["runtime_path"] = _first_string( python.get("runtime_path"), + python.get("runtimePath"), legacy_general.get("runtime_path"), ) or current_python["runtime_path"] + current_python["python_version"] = ( + _first_string(python.get("python_version"), python.get("pythonVersion")) + or current_python["python_version"] + ) current_repositories = current["repositories"] current_repositories.update( {key: value for key, value in repositories.items() if key in current_repositories} ) + if isinstance(repositories.get("mainSources"), list): + current_repositories["main_sources"] = repositories["mainSources"] + if isinstance(repositories.get("cppSources"), list): + current_repositories["cpp_sources"] = repositories["cppSources"] return current @@ -149,6 +192,7 @@ def legacy_runtime_view(data: Dict[str, Any]) -> Dict[str, Any]: "no_build": True, "debug": general["debug"], "use_dynamic_update": False, + "no_update": general["no_update"], "source_list": general["source_list"], "package_manager": "pip", "runtime_path": python["runtime_path"], diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index 80f8c7f4a..ec82cac7c 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -227,6 +227,7 @@ def test_setup_toml_reads_tauri_camel_case_paths(): channel = "dev" getRemoteShaMethod = "github" forceLaunch = true +noUpdate = true [paths] baasRootPath = "D:/BAAS" @@ -250,6 +251,7 @@ def test_setup_toml_reads_tauri_camel_case_paths(): assert loaded["general"]["channel"] == "dev" assert loaded["general"]["get_remote_sha_method"] == "github" assert loaded["general"]["force_launch"] is True + assert loaded["general"]["no_update"] is True assert loaded["paths"]["baas_root_path"] == "D:/BAAS" assert loaded["paths"]["tmp_path"] == "cache" assert loaded["paths"]["toolkit_path"] == "tools" From 2d0f95f5e140a879528237b3449251a2bbfac804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 23 Jun 2026 23:32:30 +0800 Subject: [PATCH 46/98] Fix: Limit SHA source test timeout --- service/api/commands.py | 5 ++++- service/api/ws_trigger.py | 5 ++++- service/runtime.py | 24 ++++++++++++++++++++---- tests/service/test_service_logic.py | 6 +++--- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/service/api/commands.py b/service/api/commands.py index 02eefdd91..0f8881b29 100644 --- a/service/api/commands.py +++ b/service/api/commands.py @@ -100,7 +100,10 @@ async def execute_command(cmd: CommandMessage, binary_payload: bytes | None = No return {"status": "ok", "data": result} if cmd.command == "test_all_sha": - result = await context.runtime.test_all_sha(cmd.payload.get("channel")) + result = await context.runtime.test_all_sha( + cmd.payload.get("channel"), + cmd.payload.get("timeout"), + ) return {"status": "ok", "data": result} if cmd.command == "check_for_update": diff --git a/service/api/ws_trigger.py b/service/api/ws_trigger.py index df1e52d6c..39c732834 100644 --- a/service/api/ws_trigger.py +++ b/service/api/ws_trigger.py @@ -28,7 +28,10 @@ async def websocket_trigger(websocket: WebSocket) -> None: response_payload: Dict[str, Any] if cmd.command == "test_all_sha_stream": try: - async for result in context.runtime.test_all_sha_stream(cmd.payload.get("channel")): + async for result in context.runtime.test_all_sha_stream( + cmd.payload.get("channel"), + cmd.payload.get("timeout"), + ): await send_stream_json( websocket, stream, diff --git a/service/runtime.py b/service/runtime.py index 78659ef23..f77fd816a 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -47,6 +47,16 @@ "start_explore_activity_challenge": "explore_activity_challenge", } +MAX_SHA_TEST_TIMEOUT = 10.0 + + +def _coerce_sha_test_timeout(timeout: Any = None) -> float: + try: + value = float(timeout) + except (TypeError, ValueError): + return MAX_SHA_TEST_TIMEOUT + return max(0.1, min(value, MAX_SHA_TEST_TIMEOUT)) + async def run_blocking(func, *args): """Run a blocking callable in the default executor and return its result. @@ -446,15 +456,21 @@ async def valid_cdk(cdk, channel=None): return cdk_res @staticmethod - async def test_all_sha(channel=None): - all_sha_res = await run_blocking(test_all_repo_sha, 3.0, channel) + async def test_all_sha(channel=None, timeout=None): + all_sha_res = await run_blocking( + test_all_repo_sha, + _coerce_sha_test_timeout(timeout), + channel, + ) return all_sha_res @staticmethod - async def test_all_sha_stream(channel=None): + async def test_all_sha_stream(channel=None, timeout=None): + request_timeout = _coerce_sha_test_timeout(timeout) + async def test_one(config: Dict[str, Any]) -> Dict[str, Any]: try: - return await run_blocking(test_repo_sha, config, 3.0) + return await run_blocking(test_repo_sha, config, request_timeout) except Exception as exc: # noqa: BLE001 - keep one failed source from stopping the stream method = config.get("method") return { diff --git a/tests/service/test_service_logic.py b/tests/service/test_service_logic.py index 7642920f4..9527173d0 100644 --- a/tests/service/test_service_logic.py +++ b/tests/service/test_service_logic.py @@ -157,11 +157,11 @@ def fake_test_repo_sha(config, timeout): async def scenario(): runtime = ServiceRuntime(tmp_path) results = [] - async for result in runtime.test_all_sha_stream("stable"): - results.append(result["name"]) + async for result in runtime.test_all_sha_stream("stable", timeout=12): + results.append((result["name"], result["duration"])) return results monkeypatch.setattr(runtime_module, "repo_sha_test_configs", fake_configs) monkeypatch.setattr(runtime_module, "test_repo_sha", fake_test_repo_sha) - assert asyncio.run(scenario()) == ["fast", "slow"] + assert asyncio.run(scenario()) == [("fast", 10.0), ("slow", 10.0)] From 8cc7e074af74f9ede9a237d99b62cb04ca6f28c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 25 Jun 2026 13:45:40 +0800 Subject: [PATCH 47/98] Fix: Preserve git_backend setup option --- service/conf/manager.py | 6 ++++- service/runtime.py | 4 +++ service/update/setup_schema.py | 6 +++++ tests/service/test_config_runtime_update.py | 30 +++++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/service/conf/manager.py b/service/conf/manager.py index 119d98949..e70fa1b26 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -112,7 +112,8 @@ def _project_setup_toml(full_setup_toml: Dict[str, Any]) -> Dict[str, Any]: "updateMethod": config_general.get("get_remote_sha_method") or "github", "repoUrl" : legacy_repo_url(current), "shaMethod" : config_general.get("get_remote_sha_method"), - "mirrorcCdk" : config_general.get("mirrorc_cdk") + "mirrorcCdk" : config_general.get("mirrorc_cdk"), + "gitBackend" : config_general.get("git_backend", "auto"), } @staticmethod @@ -193,6 +194,7 @@ def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: shaMethod: Optional[str] = projection.get("shaMethod", None) updateMethod: Optional[str] = projection.get("updateMethod", None) mirrorcCdk: Optional[str] = projection.get("mirrorcCdk", None) + gitBackend: Optional[str] = projection.get("gitBackend", None) channel: Optional[str] = projection.get("channel", None) if channel is not None: normalized_channel = normalize_update_channel(channel) @@ -203,6 +205,8 @@ def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: merged["general"]["get_remote_sha_method"] = updateMethod if mirrorcCdk is not None: merged["general"]["mirrorc_cdk"] = mirrorcCdk + if gitBackend is not None: + merged["general"]["git_backend"] = gitBackend self._setup_toml = merged return merged diff --git a/service/runtime.py b/service/runtime.py index f77fd816a..cbcaceb10 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -519,6 +519,10 @@ async def update_setup_toml(payload: Dict[str, Any]) -> Dict[str, Any]: general["no_update"] = bool(payload["noUpdate"]) if "no_update" in payload: general["no_update"] = bool(payload["no_update"]) + if "gitBackend" in payload: + general["git_backend"] = str(payload["gitBackend"]) + if "git_backend" in payload: + general["git_backend"] = str(payload["git_backend"]) await run_blocking(write_setup_toml, data, path) return {"status": "ok", "path": str(path), "data": data} diff --git a/service/update/setup_schema.py b/service/update/setup_schema.py index 6afa75788..a73b7afcf 100644 --- a/service/update/setup_schema.py +++ b/service/update/setup_schema.py @@ -21,6 +21,7 @@ "force_launch": False, "debug": False, "no_update": False, + "git_backend": "auto", "source_list": LEGACY_DEFAULT_SETTINGS["General"]["source_list"], }, "paths": { @@ -122,6 +123,10 @@ def migrate_to_current_schema(data: Dict[str, Any]) -> Dict[str, Any]: general.get("noUpdate"), legacy_general.get("no_update"), ) + current_general["git_backend"] = ( + _first_string(general.get("git_backend"), general.get("gitBackend")) + or current_general["git_backend"] + ) source_list = general.get("source_list") or general.get("sourceList") or legacy_general.get("source_list") if isinstance(source_list, list) and source_list: current_general["source_list"] = [str(item) for item in source_list] @@ -193,6 +198,7 @@ def legacy_runtime_view(data: Dict[str, Any]) -> Dict[str, Any]: "debug": general["debug"], "use_dynamic_update": False, "no_update": general["no_update"], + "git_backend": general["git_backend"], "source_list": general["source_list"], "package_manager": "pip", "runtime_path": python["runtime_path"], diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index ec82cac7c..f5433d730 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -14,9 +14,11 @@ import pytest import service.runtime as runtime_module +from service.conf.manager import ConfigManager from service.conf import ConfigPathError, ensure_safe_config_id, resolve_config_dir from service.runtime import ServiceRuntime from service.update.setup_io import read_setup_toml, write_setup_toml +from service.update.setup_schema import legacy_runtime_view def _workspace_tmp() -> Path: @@ -209,6 +211,7 @@ def test_setup_toml_io_round_trip(): assert loaded["general"]["mirrorc_cdk"] == "abc" assert loaded["general"]["channel"] == "stable" + assert loaded["general"]["git_backend"] == "auto" assert "General" not in loaded finally: _cleanup(root) @@ -228,6 +231,7 @@ def test_setup_toml_reads_tauri_camel_case_paths(): getRemoteShaMethod = "github" forceLaunch = true noUpdate = true +gitBackend = "git_cli" [paths] baasRootPath = "D:/BAAS" @@ -252,6 +256,8 @@ def test_setup_toml_reads_tauri_camel_case_paths(): assert loaded["general"]["get_remote_sha_method"] == "github" assert loaded["general"]["force_launch"] is True assert loaded["general"]["no_update"] is True + assert loaded["general"]["git_backend"] == "git_cli" + assert legacy_runtime_view(loaded)["General"]["git_backend"] == "git_cli" assert loaded["paths"]["baas_root_path"] == "D:/BAAS" assert loaded["paths"]["tmp_path"] == "cache" assert loaded["paths"]["toolkit_path"] == "tools" @@ -259,3 +265,27 @@ def test_setup_toml_reads_tauri_camel_case_paths(): assert loaded["python"]["python_version"] == "3.11.0" finally: _cleanup(root) + + +def test_setup_toml_projection_preserves_git_backend(): + root = _workspace_tmp() + try: + manager = ConfigManager.__new__(ConfigManager) + manager._setup_toml = { + "general": { + "channel": "stable", + "get_remote_sha_method": "github", + "git_backend": "git2", + } + } + + projection = manager._project_setup_toml(manager._setup_toml) + assert projection["gitBackend"] == "git2" + + merged = manager._merge_setup_toml({**projection, "updateMethod": "gitee"}) + assert merged["general"]["git_backend"] == "git2" + + merged = manager._merge_setup_toml({**projection, "gitBackend": "git_cli"}) + assert merged["general"]["git_backend"] == "git_cli" + finally: + _cleanup(root) From c09627a21731c5bc68aa2d010520ea764ac743c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 25 Jun 2026 14:01:46 +0800 Subject: [PATCH 48/98] Fix: Preserve legacy git_backend setup option --- service/update/setup_schema.py | 7 ++++++- tests/service/test_config_runtime_update.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/service/update/setup_schema.py b/service/update/setup_schema.py index a73b7afcf..1b9e81a6b 100644 --- a/service/update/setup_schema.py +++ b/service/update/setup_schema.py @@ -124,7 +124,12 @@ def migrate_to_current_schema(data: Dict[str, Any]) -> Dict[str, Any]: legacy_general.get("no_update"), ) current_general["git_backend"] = ( - _first_string(general.get("git_backend"), general.get("gitBackend")) + _first_string( + general.get("git_backend"), + general.get("gitBackend"), + legacy_general.get("git_backend"), + legacy_general.get("gitBackend"), + ) or current_general["git_backend"] ) source_list = general.get("source_list") or general.get("sourceList") or legacy_general.get("source_list") diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index f5433d730..aba7a652e 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -267,6 +267,25 @@ def test_setup_toml_reads_tauri_camel_case_paths(): _cleanup(root) +def test_setup_toml_reads_legacy_git_backend(): + root = _workspace_tmp() + setup_path = root / "setup.toml" + try: + setup_path.write_text( + """ +[General] +git_backend = "git2" +""".strip(), + encoding="utf-8", + ) + + loaded, _ = read_setup_toml(setup_path) + + assert loaded["general"]["git_backend"] == "git2" + finally: + _cleanup(root) + + def test_setup_toml_projection_preserves_git_backend(): root = _workspace_tmp() try: From c3127f7d232ac53ddc8ab7fa5408f030272c7afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 25 Jun 2026 14:05:56 +0800 Subject: [PATCH 49/98] Fix: Prefer legacy git_backend over auto --- service/update/setup_schema.py | 18 +++++++++------- tests/service/test_config_runtime_update.py | 24 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/service/update/setup_schema.py b/service/update/setup_schema.py index 1b9e81a6b..9673249de 100644 --- a/service/update/setup_schema.py +++ b/service/update/setup_schema.py @@ -123,15 +123,17 @@ def migrate_to_current_schema(data: Dict[str, Any]) -> Dict[str, Any]: general.get("noUpdate"), legacy_general.get("no_update"), ) - current_general["git_backend"] = ( - _first_string( - general.get("git_backend"), - general.get("gitBackend"), - legacy_general.get("git_backend"), - legacy_general.get("gitBackend"), - ) - or current_general["git_backend"] + git_backend = _first_string(general.get("git_backend"), general.get("gitBackend")) + legacy_git_backend = _first_string( + legacy_general.get("git_backend"), + legacy_general.get("gitBackend"), ) + if git_backend and git_backend != "auto": + current_general["git_backend"] = git_backend + elif legacy_git_backend: + current_general["git_backend"] = legacy_git_backend + elif git_backend: + current_general["git_backend"] = git_backend source_list = general.get("source_list") or general.get("sourceList") or legacy_general.get("source_list") if isinstance(source_list, list) and source_list: current_general["source_list"] = [str(item) for item in source_list] diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index aba7a652e..7b53317ce 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -286,6 +286,30 @@ def test_setup_toml_reads_legacy_git_backend(): _cleanup(root) +def test_setup_toml_legacy_git_backend_overrides_current_auto(): + root = _workspace_tmp() + setup_path = root / "setup.toml" + try: + setup_path.write_text( + """ +schema_version = 1 + +[general] +git_backend = "auto" + +[General] +git_backend = "git2" +""".strip(), + encoding="utf-8", + ) + + loaded, _ = read_setup_toml(setup_path) + + assert loaded["general"]["git_backend"] == "git2" + finally: + _cleanup(root) + + def test_setup_toml_projection_preserves_git_backend(): root = _workspace_tmp() try: From 41ae035670fcf72e8a97b764986e8fbcfa5b15e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 16:21:14 +0800 Subject: [PATCH 50/98] Adapt service backend for Android runtime --- core/ipc_manager.py | 8 +++++++- main.py | 17 ++++++++++------- service/context.py | 12 +++++++----- service/types.py | 39 +++++++++++++++++++++++++++++---------- 4 files changed, 53 insertions(+), 23 deletions(-) diff --git a/core/ipc_manager.py b/core/ipc_manager.py index de0cfa049..64b2dae28 100644 --- a/core/ipc_manager.py +++ b/core/ipc_manager.py @@ -1,9 +1,13 @@ import cv2 import numpy as np import os -from multiprocessing import shared_memory from core.exception import SharedMemoryError +try: + from multiprocessing import shared_memory +except ModuleNotFoundError: + shared_memory = None + class SharedMemory: shm_map = {} @@ -40,6 +44,8 @@ def __init__(self, name): self._init() def _init(self): + if shared_memory is None: + raise SharedMemoryError("multiprocessing.shared_memory is not available in this Python runtime") self.shm = shared_memory.SharedMemory(create=False, name=self.name) if self.shm is None: raise SharedMemoryError(f"Shared memory {self.name} not found") diff --git a/main.py b/main.py index b7cc0bc3d..4b3f7168b 100644 --- a/main.py +++ b/main.py @@ -19,13 +19,16 @@ def __init__(self, logger_signal=None, ocr_needed=None, **kwargs): self.init_all_data() self.threads = {} - def init_all_data(self, need_ocr_update_check=True): - if not self.init_ocr(need_ocr_update_check=need_ocr_update_check): - self.logger.error("Ocr Init Incomplete Please restart .") - return False - self.init_static_config() - self.logger.info("-- All Data Initialization Complete Script ready--") - return True + def init_all_data(self, need_ocr_update_check=True): + if not self.init_ocr(need_ocr_update_check=need_ocr_update_check): + if os.getenv("BAAS_ALLOW_MISSING_OCR", "").strip().lower() in {"1", "true", "yes", "on"}: + self.logger.warning("Ocr Init Incomplete. Continuing because missing OCR is allowed.") + else: + self.logger.error("Ocr Init Incomplete Please restart .") + return False + self.init_static_config() + self.logger.info("-- All Data Initialization Complete Script ready--") + return True def init_ocr(self, need_ocr_update_check=True): if need_ocr_update_check: diff --git a/service/context.py b/service/context.py index 413ad5145..21d080fad 100644 --- a/service/context.py +++ b/service/context.py @@ -56,7 +56,8 @@ def __init__(self, project_root: Path) -> None: self._loop: Optional[asyncio.AbstractEventLoop] = None self._fs_task: Optional[asyncio.Task] = None self._update_check_task: Optional[asyncio.Task] = None - self.need_ocr_update_check = _env_bool(OCR_UPDATE_CHECK_ENV, True) and not _setup_no_update(project_root) + self.no_update = _setup_no_update(project_root) + self.need_ocr_update_check = _env_bool(OCR_UPDATE_CHECK_ENV, True) and not self.no_update async def startup(self) -> None: loop = asyncio.get_running_loop() @@ -71,10 +72,11 @@ async def startup(self) -> None: await self.log_manager.start() self._fs_task = asyncio.create_task(self.config_manager.watch_filesystem(), name="config-fs-watch") - self._update_check_task = asyncio.create_task( - self._periodic_update_check(), - name="periodic-update-check", - ) + if not self.no_update: + self._update_check_task = asyncio.create_task( + self._periodic_update_check(), + name="periodic-update-check", + ) threading.Thread( target=self.runtime.init_all_data, kwargs={"need_ocr_update_check": self.need_ocr_update_check}, diff --git a/service/types.py b/service/types.py index fe60187a6..f21ed75e9 100644 --- a/service/types.py +++ b/service/types.py @@ -2,10 +2,20 @@ from typing import Any, Dict, List, Literal, Optional, Union -from pydantic import AliasChoices, BaseModel, Field, field_validator +from pydantic import BaseModel, Field, root_validator, validator -class PatchOperation(BaseModel): +class ServiceBaseModel(BaseModel): + """Compatibility base for both Pydantic v1 and v2 runtimes.""" + + def model_dump(self, *args, **kwargs): + super_model_dump = getattr(super(), "model_dump", None) + if callable(super_model_dump): + return super_model_dump(*args, **kwargs) + return self.dict(*args, **kwargs) + + +class PatchOperation(ServiceBaseModel): """JSON Patch operation sent over sync channels. Attributes: @@ -18,14 +28,14 @@ class PatchOperation(BaseModel): path: str value: Union[Any, None] = None - @field_validator("path") + @validator("path") def validate_path(cls, value: str) -> str: if value != "" and not value.startswith("/"): raise ValueError("json-pointer paths must start with '/' or be empty") return value -class SyncPullMessage(BaseModel): +class SyncPullMessage(ServiceBaseModel): """Request a full resource snapshot from the sync websocket. Attributes: @@ -41,11 +51,20 @@ class SyncPullMessage(BaseModel): is_include_diff_baseline: bool = Field( default=False, description="Whether to return baseline timestamp", - validation_alias=AliasChoices("is_include_diff_baseline", "include_diff_baseline"), ) + @root_validator(pre=True) + def accept_legacy_include_diff_baseline(cls, values): + if ( + isinstance(values, dict) + and "is_include_diff_baseline" not in values + and "include_diff_baseline" in values + ): + values["is_include_diff_baseline"] = values["include_diff_baseline"] + return values + -class SyncPatchMessage(BaseModel): +class SyncPatchMessage(ServiceBaseModel): """Apply a patch to a mutable resource through the sync websocket. Attributes: @@ -63,7 +82,7 @@ class SyncPatchMessage(BaseModel): ops: List[PatchOperation] -class ProviderRequest(BaseModel): +class ProviderRequest(ServiceBaseModel): """Request provider-side static or status data. Attributes: @@ -75,7 +94,7 @@ class ProviderRequest(BaseModel): resource_id: Optional[str] = None -class CommandMessage(BaseModel): +class CommandMessage(ServiceBaseModel): """Command envelope accepted by `/ws/trigger`. Attributes: @@ -93,7 +112,7 @@ class CommandMessage(BaseModel): payload: Dict[str, Any] = Field(default_factory=dict) -class HandshakeResponse(BaseModel): +class HandshakeResponse(ServiceBaseModel): """Legacy handshake response model retained for typed consumers.""" type: Literal["handshake_response"] @@ -101,7 +120,7 @@ class HandshakeResponse(BaseModel): timestamp: float -class SyncPushPayload(BaseModel): +class SyncPushPayload(ServiceBaseModel): """Backend-to-frontend sync push payload. Attributes: From 4a836173fad310f3984efd43b658710faa3082d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 17:42:47 +0800 Subject: [PATCH 51/98] Adapt Android runtime controls and updates --- core/device/connection.py | 17 ++++++ service/api/http.py | 35 ++++++++++++ service/runtime.py | 31 ++++++++++- service/update/checks.py | 114 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 196 insertions(+), 1 deletion(-) diff --git a/core/device/connection.py b/core/device/connection.py index 199da3b90..f5c154b77 100644 --- a/core/device/connection.py +++ b/core/device/connection.py @@ -1,4 +1,5 @@ import re +import os import sys from adbutils import adb @@ -33,6 +34,13 @@ def _init_android_device(self): self.package = None self.adbIP = self.config.adbIP self.adbPort = self.config.adbPort + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + serial = os.getenv("BAAS_ANDROID_ADB_SERIAL", "").strip() + if not serial and (not self.adbIP or self.adbIP == "auto") and (not self.adbPort or self.adbPort == "auto"): + serial = "127.0.0.1:5555" + if serial: + self.adbIP, self.adbPort = self._split_serial(serial) + self.serial = f"{self.adbIP}:{self.adbPort}" is_usb_or_emulator_device = (self.adbIP == "" or self.adbPort == "") if self.adbIP == "" and self.adbPort != "": self.serial = self.adbPort @@ -102,6 +110,15 @@ def revise_serial(serial): serial = serial.replace('auto127.0.0.1', '127.0.0.1').replace('autoemulator', 'emulator') return str(serial) + @staticmethod + def _split_serial(serial): + serial = Connection.revise_serial(serial) + try: + ip, port = serial.rsplit(':', 1) + except ValueError: + return serial, "" + return ip, port + @staticmethod def serial_port(serial): try: diff --git a/service/api/http.py b/service/api/http.py index 5a47cb1b8..486a66f64 100644 --- a/service/api/http.py +++ b/service/api/http.py @@ -2,8 +2,10 @@ import time from typing import Any, Dict +from urllib.parse import urljoin, urlparse from fastapi import APIRouter, HTTPException, Request, Response +import requests from service.auth import AuthenticationError, b64d @@ -60,3 +62,36 @@ async def health() -> Dict[str, Any]: "server_sign_public_key": context.auth_manager.server_public_key_b64(), }, } + + +@router.post("/android/active-config") +async def android_active_config(payload: dict[str, Any]) -> Dict[str, Any]: + config_id = str(payload.get("config_id") or "").strip() + if not config_id: + raise HTTPException(status_code=400, detail="config_id is required") + return context.runtime.set_android_active_config(config_id) + + +@router.post("/android/toggle") +async def android_toggle() -> Dict[str, Any]: + return await context.runtime.toggle_android_active_config() + + +@router.get("/android/wiki") +async def android_wiki(path: str = "/docs/zh/") -> Dict[str, Any]: + parsed = urlparse(path) + if parsed.scheme or parsed.netloc: + if parsed.scheme != "https" or parsed.netloc != "baas.kiramei.cn": + raise HTTPException(status_code=400, detail="unsupported wiki host") + target = path + else: + normalized_path = "/" + path.lstrip("/") + if not normalized_path.startswith("/docs/"): + normalized_path = "/docs/zh/" + target = urljoin("https://baas.kiramei.cn", normalized_path) + try: + response = requests.get(target, timeout=15) + response.raise_for_status() + except requests.RequestException as exc: + raise HTTPException(status_code=502, detail=str(exc)) from exc + return {"url": target, "html": response.text} diff --git a/service/runtime.py b/service/runtime.py index cbcaceb10..6a1986a41 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -123,6 +123,7 @@ def __init__(self, project_root: Path, loop: Optional[asyncio.AbstractEventLoop] self._update_signal: Optional[_SignalHook] = None self._exit_signal: Optional[_SignalHook] = None self._event_map_inv: Dict[str, Dict[str, str]] = {} + self._android_active_config_id: Optional[str] = None self.is_all_data_initialized: bool = False def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: @@ -323,6 +324,24 @@ async def stop_scheduler(self, config_id: str) -> Dict[str, Any]: self._update_status(config_id, running=False, is_flag_run=False, current_task=None, waiting_tasks=[]) return {"status": "stopped", "config_id": config_id} + def set_android_active_config(self, config_id: str) -> Dict[str, Any]: + self._android_active_config_id = config_id + return {"status": "ok", "config_id": config_id} + + async def toggle_android_active_config(self) -> Dict[str, Any]: + config_id = self._android_active_config_id + if not config_id: + config_ids = self._list_config_ids_sync() + config_id = config_ids[0] if config_ids else None + if not config_id: + return {"status": "no-config"} + running = bool(self.current_status().get(config_id, {}).get("running")) + if running: + result = await self.stop_scheduler(config_id) + return {"status": "stopped", "config_id": config_id, "data": result} + result = await self.start_scheduler(config_id) + return {"status": "started", "config_id": config_id, "data": result} + async def stop_all_tasks(self) -> Dict[str, Any]: """Stop every running BAAS scheduler/solver session before installation work.""" config_ids = list(self._sessions.keys()) @@ -400,6 +419,8 @@ async def require_remote_(self, config_id: str) -> Union["ScrcpyClient", None]: Returns: Initialized ScrcpyClient. """ + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + raise RuntimeError("Remote control is disabled on Android") from adbutils import adb from core.device.connection import Connection from .remote.scrcpy import ScrcpyClient @@ -424,6 +445,8 @@ async def control_device_(self, config_id: str, operation: Dict[str, Any]) -> Di Returns: Structured success/failure payload. """ + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + return {"status": "disabled", "config_id": config_id, "result": 1} loop = asyncio.get_running_loop() session = await self.get_session(config_id) @@ -445,6 +468,12 @@ async def control_device_(self, config_id: str, operation: Dict[str, Any]) -> Di @staticmethod async def detect_adb() -> List[str]: + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + configured = os.getenv("BAAS_ANDROID_ADB_SERIAL", "").strip() + candidates = [configured] if configured else [] + candidates.extend(["127.0.0.1:5555", "localhost:5555"]) + return list(dict.fromkeys(item for item in candidates if item)) + from core.device import emulator_manager adb_res = await run_blocking(emulator_manager.autosearch) @@ -688,7 +717,7 @@ async def import_config(self, content: bytes) -> Dict[str, Any]: async def update_to_latest(self): await self.stop_all_tasks() result = await run_blocking(update_to_latest, None) - if isinstance(result, dict) and result.get("status") == "skipped": + if isinstance(result, dict): return result return {"status": "updated"} diff --git a/service/update/checks.py b/service/update/checks.py index 5af77e7ee..11f2aa987 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -1,9 +1,12 @@ from __future__ import annotations import time +import os import pygit2 import shutil import subprocess +import tempfile +import zipfile from pathlib import Path from typing import Union, List, Tuple from dataclasses import dataclass @@ -346,6 +349,34 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: structured response that can be consumed by service endpoints. """ try: + if _is_android_runtime(): + setup_toml, path = read_setup_toml() + setup_toml = migrate_to_current_schema(setup_toml) + local_version = setup_toml["general"].get("current_baas_sha", "") + if setup_toml["general"].get("no_update", False): + return { + "local": local_version, + "remote": local_version, + "update_available": False, + "skipped": True, + "reason": "no_update", + "channel": setup_channel(setup_toml), + "method": "github", + } + channel = setup_channel(setup_toml) + source = _github_archive_config(channel) + success, remote_version = _github_api_get_latest_sha(source, timeout) + if not success: + remote_version = None + return { + "local": local_version, + "remote": remote_version, + "update_available": bool(local_version and remote_version and local_version != remote_version), + "channel": channel, + "method": "github", + "setup_path": str(path), + } + local_info, setup_toml, _branch = get_local_version() setup_toml = migrate_to_current_schema(setup_toml) if setup_toml["general"].get("no_update", False): @@ -403,7 +434,90 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: return {} +def _is_android_runtime() -> bool: + return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} + + +def _github_archive_config(channel: str) -> Dict[str, Any]: + methods = get_remote_sha_methods_for_channel(channel) + for method in methods: + if method.get("method") == GetShaMethod.GITHUB_API: + return method + raise RuntimeError(f"No GitHub API update source configured for channel: {channel}") + + +def _copy_android_update_tree(source_root: Path, target_root: Path) -> None: + keep_names = { + "config", + "log", + "tmp", + ".git", + ".venv", + ".env", + "__pycache__", + ".pytest_cache", + } + for item in source_root.iterdir(): + if item.name in keep_names: + continue + target = target_root / item.name + if item.is_dir(): + if target.exists(): + shutil.rmtree(target) + shutil.copytree(item, target, ignore=shutil.ignore_patterns("__pycache__", "*.pyc", "*.pyo")) + elif item.is_file() and item.name != "setup.toml": + shutil.copy2(item, target) + + +def _android_update_to_latest(setup_path: Union[Path, None] = None) -> Dict[str, Any]: + data, path = read_setup_toml(setup_path) + data = migrate_to_current_schema(data) + if data["general"].get("no_update", False): + return {"status": "skipped", "reason": "no_update"} + + channel = setup_channel(data) + source = _github_archive_config(channel) + owner = source["owner"] + repo = source["repo"] + branch = source["branch"] + ok, remote_sha = _github_api_get_latest_sha(source, 10.0) + if not ok or not remote_sha: + raise RuntimeError(f"Failed to fetch Android update SHA: {remote_sha}") + + archive_url = f"https://codeload.github.com/{owner}/{repo}/zip/refs/heads/{branch}" + target_root = Path.cwd() + with tempfile.TemporaryDirectory(prefix="baas-android-update-") as tmp_dir: + tmp = Path(tmp_dir) + archive_path = tmp / "repo.zip" + response = requests.get(archive_url, stream=True, timeout=60) + response.raise_for_status() + with archive_path.open("wb") as fp: + for chunk in response.iter_content(chunk_size=1024 * 256): + if chunk: + fp.write(chunk) + with zipfile.ZipFile(archive_path) as archive: + archive.extractall(tmp) + roots = [child for child in tmp.iterdir() if child.is_dir()] + if not roots: + raise RuntimeError("Downloaded Android update archive is empty") + _copy_android_update_tree(roots[0], target_root) + + data["general"]["current_baas_sha"] = remote_sha + data["general"]["channel"] = channel + data["paths"]["baas_root_path"] = "." + write_setup_toml(data, path) + return { + "status": "updated", + "current": remote_sha, + "restart_required": True, + "method": "github-archive", + "channel": channel, + } + + def update_to_latest(setup_path: Union[Path, None] = None): + if _is_android_runtime(): + return _android_update_to_latest(setup_path) data, path = read_setup_toml(setup_path) data = migrate_to_current_schema(data) if data["general"].get("no_update", False): From b4b71a2ee5452685abd454c39b69c4c171a196d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 19:01:04 +0800 Subject: [PATCH 52/98] Add Android wiki proxy --- service/api/http.py | 227 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 217 insertions(+), 10 deletions(-) diff --git a/service/api/http.py b/service/api/http.py index 486a66f64..a2d207269 100644 --- a/service/api/http.py +++ b/service/api/http.py @@ -1,8 +1,10 @@ from __future__ import annotations import time +import re +from html import escape from typing import Any, Dict -from urllib.parse import urljoin, urlparse +from urllib.parse import quote, urljoin, urlparse from fastapi import APIRouter, HTTPException, Request, Response import requests @@ -13,6 +15,7 @@ from .state import REMEMBER_COOKIE_MAX_AGE, REMEMBER_COOKIE_NAME, context router = APIRouter() +WIKI_ORIGIN = "https://baas.kiramei.cn" @router.post("/auth/remember") @@ -79,19 +82,223 @@ async def android_toggle() -> Dict[str, Any]: @router.get("/android/wiki") async def android_wiki(path: str = "/docs/zh/") -> Dict[str, Any]: + target = _resolve_wiki_target(path) + try: + response = requests.get(target, timeout=15) + response.raise_for_status() + except requests.RequestException as exc: + raise HTTPException(status_code=502, detail=str(exc)) from exc + return {"url": target, "html": response.text} + + +@router.get("/android/wiki/proxy") +async def android_wiki_proxy(path: str = "/") -> Response: + target = _resolve_wiki_target(path, allow_assets=True) + try: + upstream = requests.get(target, timeout=15) + upstream.raise_for_status() + except requests.RequestException as exc: + raise HTTPException(status_code=502, detail=str(exc)) from exc + + content_type = upstream.headers.get("content-type", "") + if "text/html" in content_type: + body = _rewrite_wiki_html(upstream.text) + return Response(body, media_type="text/html; charset=utf-8") + if "text/css" in content_type or target.endswith(".css"): + body = _rewrite_wiki_css(upstream.text) + return Response(body, media_type="text/css; charset=utf-8") + + media_type = content_type.split(";", 1)[0] or "application/octet-stream" + return Response(upstream.content, media_type=media_type) + + +def _resolve_wiki_target(path: str, allow_assets: bool = False) -> str: parsed = urlparse(path) if parsed.scheme or parsed.netloc: if parsed.scheme != "https" or parsed.netloc != "baas.kiramei.cn": raise HTTPException(status_code=400, detail="unsupported wiki host") - target = path + return path else: normalized_path = "/" + path.lstrip("/") - if not normalized_path.startswith("/docs/"): + if not allow_assets and not normalized_path.startswith("/docs/"): normalized_path = "/docs/zh/" - target = urljoin("https://baas.kiramei.cn", normalized_path) - try: - response = requests.get(target, timeout=15) - response.raise_for_status() - except requests.RequestException as exc: - raise HTTPException(status_code=502, detail=str(exc)) from exc - return {"url": target, "html": response.text} + return urljoin(WIKI_ORIGIN, normalized_path) + + +def _wiki_proxy_url(value: str) -> str: + if not value or value.startswith("#") or value.startswith("mailto:") or value.startswith("tel:"): + return value + parsed = urlparse(value) + if parsed.scheme and parsed.scheme not in {"http", "https"}: + return value + absolute = urljoin(WIKI_ORIGIN, value) + parsed_absolute = urlparse(absolute) + if parsed_absolute.netloc != "baas.kiramei.cn": + return value + path = parsed_absolute.path or "/" + if parsed_absolute.query: + path = f"{path}?{parsed_absolute.query}" + if parsed_absolute.fragment: + path = f"{path}#{parsed_absolute.fragment}" + return f"/android/wiki/proxy?path={quote(path, safe='')}" + + +def _rewrite_wiki_html(html: str) -> str: + html = re.sub(r"]*>.*?", "", html, flags=re.IGNORECASE | re.DOTALL) + html = re.sub(r"]*/>", "", html, flags=re.IGNORECASE) + html = re.sub( + r"]*\brel=[\"']preload[\"'])(?=[^>]*\bas=[\"']script[\"'])[^>]*>", + "", + html, + flags=re.IGNORECASE, + ) + + def replace_attr(match: re.Match[str]) -> str: + prefix, quote_char, value = match.group(1), match.group(2), match.group(3) + return f'{prefix}{quote_char}{escape(_wiki_proxy_url(value), quote=True)}{quote_char}' + + html = re.sub( + r"(\s(?:href|src|action)=)([\"'])(.*?)\2", + replace_attr, + html, + flags=re.IGNORECASE, + ) + + html = re.sub( + r"(]*>)", + r"\1" + "", + html, + count=1, + flags=re.IGNORECASE, + ) + return html + + +def _rewrite_wiki_css(css: str) -> str: + return _rewrite_css_urls(_unwrap_css_layers(css)) + + +def _rewrite_css_urls(css: str) -> str: + def repl(match: re.Match[str]) -> str: + quote_char = match.group(1) or "" + value = match.group(2) + if value.startswith("data:") or value.startswith("#"): + return match.group(0) + rewritten = _wiki_proxy_url(value) + return f"url({quote_char}{rewritten}{quote_char})" + + return re.sub(r"url\(\s*(['\"]?)(.*?)\1\s*\)", repl, css) + + +def _unwrap_css_layers(css: str) -> str: + output: list[str] = [] + i = 0 + quote_char = "" + escaped = False + in_comment = False + + while i < len(css): + char = css[i] + next_char = css[i + 1] if i + 1 < len(css) else "" + + if in_comment: + output.append(char) + if char == "*" and next_char == "/": + output.append(next_char) + in_comment = False + i += 2 + else: + i += 1 + continue + + if quote_char: + output.append(char) + if escaped: + escaped = False + elif char == "\\": + escaped = True + elif char == quote_char: + quote_char = "" + i += 1 + continue + + if char == "/" and next_char == "*": + output.append(char + next_char) + in_comment = True + i += 2 + continue + if char in {"'", '"'}: + output.append(char) + quote_char = char + i += 1 + continue + + if css.startswith("@layer", i) and not _css_identifier(css[i - 1] if i else ""): + cursor = i + 6 + while cursor < len(css) and css[cursor].isspace(): + cursor += 1 + while cursor < len(css) and css[cursor] not in "{;": + cursor += 1 + if cursor < len(css) and css[cursor] == ";": + i = cursor + 1 + continue + if cursor < len(css) and css[cursor] == "{": + close = _find_css_block_end(css, cursor) + output.append(_unwrap_css_layers(css[cursor + 1 : close])) + i = close + 1 + continue + + output.append(char) + i += 1 + + return "".join(output) + + +def _find_css_block_end(css: str, open_index: int) -> int: + depth = 0 + quote_char = "" + escaped = False + in_comment = False + + for i in range(open_index, len(css)): + char = css[i] + next_char = css[i + 1] if i + 1 < len(css) else "" + if in_comment: + if char == "*" and next_char == "/": + in_comment = False + continue + if quote_char: + if escaped: + escaped = False + elif char == "\\": + escaped = True + elif char == quote_char: + quote_char = "" + continue + if char == "/" and next_char == "*": + in_comment = True + continue + if char in {"'", '"'}: + quote_char = char + continue + if char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + return i + return len(css) - 1 + + +def _css_identifier(char: str) -> bool: + return bool(char) and (char.isalnum() or char in {"_", "-"}) From 8424e67ae8999ed0c90e26e34790e0944e63bfcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:07:13 +0800 Subject: [PATCH 53/98] Add Android runtime backend support --- core/Baas_thread.py | 7 +- core/ocr/baas_ocr_client/Client.py | 23 +++- core/ocr/baas_ocr_client/server_installer.py | 136 ++++++++++++++++++- service/api/http.py | 32 ++++- 4 files changed, 185 insertions(+), 13 deletions(-) diff --git a/core/Baas_thread.py b/core/Baas_thread.py index de15fee5e..9d3beb10a 100644 --- a/core/Baas_thread.py +++ b/core/Baas_thread.py @@ -116,7 +116,9 @@ def __init__(self, config, logger_signal=None, button_signal=None, update_signal def set_ocr(self, ocr): self.ocr = ocr - if self.ocr.client.config.server_is_remote: + ocr_client = getattr(self.ocr, "client", None) + ocr_config = getattr(ocr_client, "config", None) + if ocr_config is not None and ocr_config.server_is_remote: self.ocr_img_pass_method = 1 else: self.ocr_img_pass_method = 0 @@ -304,6 +306,9 @@ def start_check_emulator_stat(self, emulator_strat_stat, wait_time): return True def start_emulator(self): + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + self.logger.info("Android embedded mode detected; skip desktop emulator startup.") + return self.emulator_start_stat = self.config.open_emulator_stat self.wait_time = self.config.emulator_wait_time if not self.start_check_emulator_stat(self.emulator_start_stat, self.wait_time): diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 5aab8ab5c..ecd552480 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -5,8 +5,10 @@ import time import shutil import datetime +import platform import requests import subprocess +from typing import Optional from core.ipc_manager import SharedMemory from core.exception import SharedMemoryError, OcrInternalError @@ -45,8 +47,27 @@ def save(self): with open(self.config_path, "w") as f: json.dump(self.config, f, indent=4) +def _android_ocr_branch() -> Optional[str]: + if os.getenv("BAAS_ANDROID", "").lower() not in {"1", "true", "yes", "on"}: + return None + arch = platform.machine().lower() + if arch in {"aarch64", "arm64"}: + return "android-arm64-v8a" + if arch in {"x86_64", "amd64"}: + return "android-x86_64" + return None + + +def _server_folder_path() -> str: + base = os.path.dirname(__file__) + android_branch = _android_ocr_branch() + if android_branch: + return os.path.join(base, "bin-android", android_branch) + return os.path.join(base, "bin") + + class BaasOcrClient: - server_folder_path = os.path.join(os.path.dirname(__file__), "bin") + server_folder_path = _server_folder_path() executable_name = "BAAS_ocr_server" if sys.platform == "win32": executable_name += ".exe" diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index beec25088..478d946cb 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -6,9 +6,11 @@ import subprocess import time import tempfile +import zipfile from typing import Optional import pygit2 +import requests from pygit2 import Commit from pygit2.enums import ResetMode @@ -29,20 +31,134 @@ raise Exception("Ocr Unsupported platform " + sys.platform) OCR_SERVER_PREBUILD_URL = "https://gitee.com/pur1fy/baas_-cpp_prebuild.git" +OCR_SERVER_PREBUILD_ARCHIVE_URLS = [ + "https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", +] +OCR_SERVER_PREBUILD_API_URL = "https://api.github.com/repos/pur1fying/BAAS_Cpp_prebuild/branches/{branch}" SERVER_INSTALLER_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) -SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, "bin") + + +def _android_ocr_branch() -> Optional[str]: + if os.getenv("BAAS_ANDROID", "").lower() not in {"1", "true", "yes", "on"}: + return None + arch = platform.machine().lower() + if arch in {"aarch64", "arm64"}: + return "android-arm64-v8a" + if arch in {"x86_64", "amd64"}: + return "android-x86_64" + raise Exception("Unsupported Android machine architecture " + arch) + branch_map = { "win32": {"amd64": "windows-x64"}, "linux": {"x86_64": "linux-x64"}, "darwin": {"arm64": "macos-arm64"}, } -arch_map = branch_map[sys.platform] -arch = platform.machine().lower() -if arch not in arch_map: - raise Exception("Unsupported machine architecture " + arch) -TARGET_BRANCH = arch_map[arch] +TARGET_BRANCH = _android_ocr_branch() +if TARGET_BRANCH is None: + arch_map = branch_map[sys.platform] + arch = platform.machine().lower() + if arch not in arch_map: + raise Exception("Unsupported machine architecture " + arch) + TARGET_BRANCH = arch_map[arch] +SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, "bin-android", TARGET_BRANCH) if TARGET_BRANCH.startswith( + "android-" +) else os.path.join(SERVER_INSTALLER_DIR_PATH, "bin") +ANDROID_VERSION_FILE = os.path.join(SERVER_BIN_DIR, ".baas-ocr-prebuild-sha") + + +def _is_android_runtime() -> bool: + return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} + + +def _server_executable_path() -> str: + return os.path.join(SERVER_BIN_DIR, "BAAS_ocr_server.exe" if sys.platform == "win32" else "BAAS_ocr_server") + + +def _read_android_installed_sha() -> str: + try: + with open(ANDROID_VERSION_FILE, "r", encoding="utf-8") as fp: + return fp.read().strip() + except OSError: + return "" + + +def _get_android_remote_sha(branch: str) -> Optional[str]: + try: + response = requests.get(OCR_SERVER_PREBUILD_API_URL.format(branch=branch), timeout=15) + response.raise_for_status() + data = response.json() + sha = data.get("commit", {}).get("sha") + return str(sha) if sha else None + except Exception: + return None + + +def _download_android_archive(branch: str, archive_path: str) -> str: + last_error: Optional[Exception] = None + for template in OCR_SERVER_PREBUILD_ARCHIVE_URLS: + url = template.format(branch=branch) + try: + with requests.get(url, stream=True, timeout=90) as response: + response.raise_for_status() + with open(archive_path, "wb") as fp: + for chunk in response.iter_content(chunk_size=1024 * 256): + if chunk: + fp.write(chunk) + return url + except Exception as exc: + last_error = exc + raise OcrInternalError(f"Failed to download Android OCR prebuild archive: {last_error}") + + +def _find_android_archive_root(extract_root: str) -> str: + executable_name = os.path.basename(_server_executable_path()) + for current_root, _dirs, files in os.walk(extract_root): + if executable_name in files: + return current_root + candidates = [ + os.path.join(extract_root, name) + for name in os.listdir(extract_root) + if os.path.isdir(os.path.join(extract_root, name)) + ] + if len(candidates) == 1: + return candidates[0] + raise OcrInternalError("Android OCR prebuild archive does not contain BAAS_ocr_server") + + +def _install_android_prebuild(logger) -> None: + if not TARGET_BRANCH.startswith("android-"): + raise OcrInternalError(f"Invalid Android OCR branch: {TARGET_BRANCH}") + + remote_sha = _get_android_remote_sha(TARGET_BRANCH) + local_sha = _read_android_installed_sha() + executable_path = _server_executable_path() + if remote_sha and local_sha == remote_sha and os.path.exists(executable_path): + logger.info("Ocr Server No updates available.") + return + + logger.info(f"Installing Android Ocr Server prebuild for {TARGET_BRANCH}.") + with tempfile.TemporaryDirectory(prefix="baas-ocr-android-") as tmp: + archive_path = os.path.join(tmp, "ocr-prebuild.zip") + source_url = _download_android_archive(TARGET_BRANCH, archive_path) + extract_root = os.path.join(tmp, "extract") + os.makedirs(extract_root, exist_ok=True) + with zipfile.ZipFile(archive_path) as archive: + archive.extractall(extract_root) + source_root = _find_android_archive_root(extract_root) + if os.path.exists(SERVER_BIN_DIR): + shutil.rmtree(SERVER_BIN_DIR, ignore_errors=True) + shutil.copytree(source_root, SERVER_BIN_DIR) + + if os.path.exists(executable_path): + os.chmod(executable_path, os.stat(executable_path).st_mode | 0o755) + else: + raise OcrInternalError("Android OCR prebuild did not install BAAS_ocr_server") + + with open(ANDROID_VERSION_FILE, "w", encoding="utf-8") as fp: + fp.write(remote_sha or source_url) + logger.info("Ocr Server Install success.") class OcrRepoManager: @@ -193,6 +309,10 @@ def check_git(logger): """ Main entry point to check and update the OCR Server repo. """ + if _is_android_runtime(): + _install_android_prebuild(logger) + return + manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) # 1. Ensure Repo Exists @@ -246,5 +366,9 @@ def clone_repo(logger): Wrapper for cloning the repo. """ logger.info("Installing Ocr Server, please hang on...") + if _is_android_runtime(): + _install_android_prebuild(logger) + return + manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) manager.clone() diff --git a/service/api/http.py b/service/api/http.py index a2d207269..634db5029 100644 --- a/service/api/http.py +++ b/service/api/http.py @@ -1,5 +1,7 @@ from __future__ import annotations +import ipaddress +import os import time import re from html import escape @@ -68,7 +70,8 @@ async def health() -> Dict[str, Any]: @router.post("/android/active-config") -async def android_active_config(payload: dict[str, Any]) -> Dict[str, Any]: +async def android_active_config(request: Request, payload: dict[str, Any]) -> Dict[str, Any]: + _require_android_loopback(request) config_id = str(payload.get("config_id") or "").strip() if not config_id: raise HTTPException(status_code=400, detail="config_id is required") @@ -76,12 +79,17 @@ async def android_active_config(payload: dict[str, Any]) -> Dict[str, Any]: @router.post("/android/toggle") -async def android_toggle() -> Dict[str, Any]: - return await context.runtime.toggle_android_active_config() +async def android_toggle(request: Request) -> Dict[str, Any]: + _require_android_loopback(request) + try: + return await context.runtime.toggle_android_active_config() + except Exception as exc: + return {"status": "error", "type": exc.__class__.__name__, "error": str(exc)} @router.get("/android/wiki") -async def android_wiki(path: str = "/docs/zh/") -> Dict[str, Any]: +async def android_wiki(request: Request, path: str = "/docs/zh/") -> Dict[str, Any]: + _require_android_loopback(request) target = _resolve_wiki_target(path) try: response = requests.get(target, timeout=15) @@ -92,7 +100,8 @@ async def android_wiki(path: str = "/docs/zh/") -> Dict[str, Any]: @router.get("/android/wiki/proxy") -async def android_wiki_proxy(path: str = "/") -> Response: +async def android_wiki_proxy(request: Request, path: str = "/") -> Response: + _require_android_loopback(request) target = _resolve_wiki_target(path, allow_assets=True) try: upstream = requests.get(target, timeout=15) @@ -112,6 +121,19 @@ async def android_wiki_proxy(path: str = "/") -> Response: return Response(upstream.content, media_type=media_type) +def _require_android_loopback(request: Request) -> None: + if os.environ.get("BAAS_ANDROID") != "1": + raise HTTPException(status_code=404, detail="Not found") + host = request.client.host if request.client else "" + try: + if ipaddress.ip_address(host).is_loopback: + return + except ValueError: + if host == "localhost": + return + raise HTTPException(status_code=404, detail="Not found") + + def _resolve_wiki_target(path: str, allow_assets: bool = False) -> str: parsed = urlparse(path) if parsed.scheme or parsed.netloc: From eababfab016626e4af0122bb44a779ac4ceb34a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:16:57 +0800 Subject: [PATCH 54/98] Use Android OCR shared library runtime --- core/Baas_thread.py | 4 +- core/ocr/baas_ocr_client/Client.py | 102 ++++++++++++++++++- core/ocr/baas_ocr_client/server_installer.py | 30 ++++-- 3 files changed, 124 insertions(+), 12 deletions(-) diff --git a/core/Baas_thread.py b/core/Baas_thread.py index 9d3beb10a..8d866c95b 100644 --- a/core/Baas_thread.py +++ b/core/Baas_thread.py @@ -118,7 +118,9 @@ def set_ocr(self, ocr): self.ocr = ocr ocr_client = getattr(self.ocr, "client", None) ocr_config = getattr(ocr_client, "config", None) - if ocr_config is not None and ocr_config.server_is_remote: + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + self.ocr_img_pass_method = 1 + elif ocr_config is not None and ocr_config.server_is_remote: self.ocr_img_pass_method = 1 else: self.ocr_img_pass_method = 0 diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index ecd552480..f331aaf5d 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -8,6 +8,8 @@ import platform import requests import subprocess +import ctypes +import threading from typing import Optional from core.ipc_manager import SharedMemory @@ -58,6 +60,19 @@ def _android_ocr_branch() -> Optional[str]: return None +def _is_android_runtime() -> bool: + return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} + + +def _android_library_abi_dir() -> str: + android_branch = _android_ocr_branch() + if android_branch == "android-arm64-v8a": + return "arm64-v8a" + if android_branch == "android-x86_64": + return "x86_64" + raise RuntimeError("Unsupported Android OCR architecture.") + + def _server_folder_path() -> str: base = os.path.dirname(__file__) android_branch = _android_ocr_branch() @@ -73,13 +88,57 @@ class BaasOcrClient: executable_name += ".exe" def __init__(self): - self.exe_path = os.path.join(self.server_folder_path, self.executable_name) + self._android_server_lib = None + self._android_server_thread = None + if _is_android_runtime(): + self.server_folder_path = self._prepare_android_runtime_folder() + BaasOcrClient.server_folder_path = self.server_folder_path + self.executable_name = "libBAAS_ocr_server.so" + self.exe_path = self._android_server_library_path(self.server_folder_path) + else: + self.exe_path = os.path.join(self.server_folder_path, self.executable_name) if not os.path.exists(self.exe_path): raise FileNotFoundError("Didn't find ocr server executable.") self.config = ServerConfig() self.server_process = None self.clear_log() + @staticmethod + def _android_server_library_path(root: str) -> str: + return os.path.join(root, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") + + def _prepare_android_runtime_folder(self) -> str: + source_root = _server_folder_path() + source_binary = self._android_server_library_path(source_root) + if not os.path.exists(source_binary): + raise FileNotFoundError("Didn't find Android ocr server library.") + + internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() + if not internal_root: + return source_root + + target_root = os.path.join(internal_root, "ocr-runtime", _android_ocr_branch() or "android") + source_version = os.path.join(source_root, ".baas-ocr-prebuild-sha") + target_version = os.path.join(target_root, ".baas-ocr-prebuild-sha") + try: + source_sha = open(source_version, "r", encoding="utf-8").read().strip() + except OSError: + source_sha = "" + try: + target_sha = open(target_version, "r", encoding="utf-8").read().strip() + except OSError: + target_sha = "" + + target_binary = self._android_server_library_path(target_root) + if source_sha and source_sha == target_sha and os.path.exists(target_binary): + return target_root + + if os.path.exists(target_root): + shutil.rmtree(target_root, ignore_errors=True) + shutil.copytree(source_root, target_root) + os.chmod(self._android_server_library_path(target_root), 0o755) + return target_root + # clear log since time_distance days ago def clear_log(self, time_distance=7): log_folder_path = os.path.join(self.server_folder_path, "output") @@ -130,6 +189,9 @@ def disable_thread_pool(self): def start_server(self): if self.server_process is not None: return + if _is_android_runtime(): + self._start_android_server() + return # chmod +x BAAS_ocr_server if sys.platform == "linux": subprocess.run(["chmod", "+x", self.exe_path]) @@ -162,7 +224,45 @@ def start_server(self): raise RuntimeError("Fail to start ocr server. " + e.__str__()) time.sleep(0.1) + def _start_android_server(self): + lib_dir = os.path.dirname(self.exe_path) + for name in ["libc++_shared.so", "libonnxruntime.so", "libopencv_java4.so"]: + path = os.path.join(lib_dir, name) + if os.path.exists(path): + ctypes.CDLL(path, mode=ctypes.RTLD_GLOBAL) + server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) + server_lib.start_server.argtypes = [] + server_lib.start_server.restype = None + server_lib.stop_server.argtypes = [] + server_lib.stop_server.restype = None + self._android_server_lib = server_lib + self._android_server_thread = threading.Thread( + target=server_lib.start_server, + name="baas-ocr-android-server", + daemon=True, + ) + self._android_server_thread.start() + self.server_process = self._android_server_thread + for _ in range(0, 100): + try: + ret = requests.get(self.config.base_url, timeout=1) + if ret.status_code == 200: + break + except requests.exceptions.RequestException as e: + if _ == 99: + raise RuntimeError("Fail to start ocr server. " + e.__str__()) + time.sleep(0.1) + def stop_server(self): + if _is_android_runtime(): + if self._android_server_lib is not None: + self._android_server_lib.stop_server() + if self._android_server_thread is not None: + self._android_server_thread.join(timeout=10) + self.server_process = None + self._android_server_thread = None + self._android_server_lib = None + return self.server_process.stdin.write("exit\n") self.server_process.stdin.flush() return_code = self.server_process.wait(10) diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index 478d946cb..ff9f03c08 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -72,7 +72,17 @@ def _is_android_runtime() -> bool: return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} -def _server_executable_path() -> str: +def _android_library_abi_dir() -> str: + if TARGET_BRANCH == "android-arm64-v8a": + return "arm64-v8a" + if TARGET_BRANCH == "android-x86_64": + return "x86_64" + raise OcrInternalError(f"Unsupported Android OCR branch: {TARGET_BRANCH}") + + +def _server_binary_path() -> str: + if TARGET_BRANCH.startswith("android-"): + return os.path.join(SERVER_BIN_DIR, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") return os.path.join(SERVER_BIN_DIR, "BAAS_ocr_server.exe" if sys.platform == "win32" else "BAAS_ocr_server") @@ -113,10 +123,10 @@ def _download_android_archive(branch: str, archive_path: str) -> str: def _find_android_archive_root(extract_root: str) -> str: - executable_name = os.path.basename(_server_executable_path()) + library_name = "libBAAS_ocr_server.so" for current_root, _dirs, files in os.walk(extract_root): - if executable_name in files: - return current_root + if library_name in files and os.path.basename(current_root) == _android_library_abi_dir(): + return os.path.dirname(os.path.dirname(current_root)) candidates = [ os.path.join(extract_root, name) for name in os.listdir(extract_root) @@ -124,7 +134,7 @@ def _find_android_archive_root(extract_root: str) -> str: ] if len(candidates) == 1: return candidates[0] - raise OcrInternalError("Android OCR prebuild archive does not contain BAAS_ocr_server") + raise OcrInternalError("Android OCR prebuild archive does not contain libBAAS_ocr_server.so") def _install_android_prebuild(logger) -> None: @@ -133,8 +143,8 @@ def _install_android_prebuild(logger) -> None: remote_sha = _get_android_remote_sha(TARGET_BRANCH) local_sha = _read_android_installed_sha() - executable_path = _server_executable_path() - if remote_sha and local_sha == remote_sha and os.path.exists(executable_path): + server_binary_path = _server_binary_path() + if remote_sha and local_sha == remote_sha and os.path.exists(server_binary_path): logger.info("Ocr Server No updates available.") return @@ -151,10 +161,10 @@ def _install_android_prebuild(logger) -> None: shutil.rmtree(SERVER_BIN_DIR, ignore_errors=True) shutil.copytree(source_root, SERVER_BIN_DIR) - if os.path.exists(executable_path): - os.chmod(executable_path, os.stat(executable_path).st_mode | 0o755) + if os.path.exists(server_binary_path): + os.chmod(server_binary_path, os.stat(server_binary_path).st_mode | 0o755) else: - raise OcrInternalError("Android OCR prebuild did not install BAAS_ocr_server") + raise OcrInternalError("Android OCR prebuild did not install libBAAS_ocr_server.so") with open(ANDROID_VERSION_FILE, "w", encoding="utf-8") as fp: fp.write(remote_sha or source_url) From dd23694daade77fe9b14e4b4d011cc4327a8ee25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:22:50 +0800 Subject: [PATCH 55/98] Load Android libc++ before OCR library --- core/ocr/baas_ocr_client/Client.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index f331aaf5d..37997a3b0 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -226,10 +226,21 @@ def start_server(self): def _start_android_server(self): lib_dir = os.path.dirname(self.exe_path) - for name in ["libc++_shared.so", "libonnxruntime.so", "libopencv_java4.so"]: - path = os.path.join(lib_dir, name) + native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() + dependency_paths = [] + if native_lib_dir: + dependency_paths.append(os.path.join(native_lib_dir, "libc++_shared.so")) + dependency_paths.extend( + os.path.join(lib_dir, name) + for name in ["libc++_shared.so", "libonnxruntime.so", "libopencv_java4.so"] + ) + loaded = set() + for path in dependency_paths: + if path in loaded: + continue if os.path.exists(path): ctypes.CDLL(path, mode=ctypes.RTLD_GLOBAL) + loaded.add(path) server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) server_lib.start_server.argtypes = [] server_lib.start_server.restype = None From 5fd1832f406221bf8f1b029fcaf9ba40bebfa085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:26:37 +0800 Subject: [PATCH 56/98] Use packaged Android libc++ for OCR runtime --- core/ocr/baas_ocr_client/Client.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 37997a3b0..dac059552 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -136,6 +136,11 @@ def _prepare_android_runtime_folder(self) -> str: if os.path.exists(target_root): shutil.rmtree(target_root, ignore_errors=True) shutil.copytree(source_root, target_root) + native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() + native_libcxx = os.path.join(native_lib_dir, "libc++_shared.so") if native_lib_dir else "" + target_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), "libc++_shared.so") + if native_libcxx and os.path.exists(native_libcxx): + shutil.copy2(native_libcxx, target_libcxx) os.chmod(self._android_server_library_path(target_root), 0o755) return target_root @@ -230,10 +235,9 @@ def _start_android_server(self): dependency_paths = [] if native_lib_dir: dependency_paths.append(os.path.join(native_lib_dir, "libc++_shared.so")) - dependency_paths.extend( - os.path.join(lib_dir, name) - for name in ["libc++_shared.so", "libonnxruntime.so", "libopencv_java4.so"] - ) + elif os.path.exists(os.path.join(lib_dir, "libc++_shared.so")): + dependency_paths.append(os.path.join(lib_dir, "libc++_shared.so")) + dependency_paths.extend(os.path.join(lib_dir, name) for name in ["libonnxruntime.so", "libopencv_java4.so"]) loaded = set() for path in dependency_paths: if path in loaded: From f31c79b17df90d476a53a214e80bf6cbbf02fe34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:31:32 +0800 Subject: [PATCH 57/98] Keep Android OCR dependency libraries loaded --- core/ocr/baas_ocr_client/Client.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index dac059552..7d662c3e6 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -101,6 +101,7 @@ def __init__(self): raise FileNotFoundError("Didn't find ocr server executable.") self.config = ServerConfig() self.server_process = None + self._android_dependency_libs = [] self.clear_log() @staticmethod @@ -243,7 +244,7 @@ def _start_android_server(self): if path in loaded: continue if os.path.exists(path): - ctypes.CDLL(path, mode=ctypes.RTLD_GLOBAL) + self._android_dependency_libs.append(ctypes.CDLL(path, mode=ctypes.RTLD_GLOBAL)) loaded.add(path) server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) server_lib.start_server.argtypes = [] @@ -277,6 +278,7 @@ def stop_server(self): self.server_process = None self._android_server_thread = None self._android_server_lib = None + self._android_dependency_libs = [] return self.server_process.stdin.write("exit\n") self.server_process.stdin.flush() From d5a49668b37556df50239dcd1408349bd584a66c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:34:42 +0800 Subject: [PATCH 58/98] Load Android OCR libraries through JVM --- core/ocr/baas_ocr_client/Client.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 7d662c3e6..92c6b9445 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -244,8 +244,10 @@ def _start_android_server(self): if path in loaded: continue if os.path.exists(path): + self._android_system_load(path) self._android_dependency_libs.append(ctypes.CDLL(path, mode=ctypes.RTLD_GLOBAL)) loaded.add(path) + self._android_system_load(self.exe_path) server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) server_lib.start_server.argtypes = [] server_lib.start_server.restype = None @@ -269,6 +271,12 @@ def _start_android_server(self): raise RuntimeError("Fail to start ocr server. " + e.__str__()) time.sleep(0.1) + @staticmethod + def _android_system_load(path: str) -> None: + from java import jclass + + jclass("java.lang.System").load(path) + def stop_server(self): if _is_android_runtime(): if self._android_server_lib is not None: From ca31517d0f3bc07dc10398b308582c3e241ed27a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:37:56 +0800 Subject: [PATCH 59/98] Use app NativeLoader for Android OCR libraries --- core/ocr/baas_ocr_client/Client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 92c6b9445..fd32b105e 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -275,7 +275,7 @@ def _start_android_server(self): def _android_system_load(path: str) -> None: from java import jclass - jclass("java.lang.System").load(path) + jclass("io.github.kiramei.baas_tauri.NativeLoader").load(path) def stop_server(self): if _is_android_runtime(): From c6a6138272e273298e2d399e190e1ab7310decaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:41:21 +0800 Subject: [PATCH 60/98] Fallback to OCR runtime libc++ on Android --- core/ocr/baas_ocr_client/Client.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index fd32b105e..933e93421 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -234,9 +234,10 @@ def _start_android_server(self): lib_dir = os.path.dirname(self.exe_path) native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() dependency_paths = [] - if native_lib_dir: - dependency_paths.append(os.path.join(native_lib_dir, "libc++_shared.so")) - elif os.path.exists(os.path.join(lib_dir, "libc++_shared.so")): + native_libcxx = os.path.join(native_lib_dir, "libc++_shared.so") if native_lib_dir else "" + if native_libcxx and os.path.exists(native_libcxx): + dependency_paths.append(native_libcxx) + if os.path.exists(os.path.join(lib_dir, "libc++_shared.so")): dependency_paths.append(os.path.join(lib_dir, "libc++_shared.so")) dependency_paths.extend(os.path.join(lib_dir, name) for name in ["libonnxruntime.so", "libopencv_java4.so"]) loaded = set() From 842a68f894e65716a3fa7a51ef685a77ce33462d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:45:18 +0800 Subject: [PATCH 61/98] Load Android OCR dependencies globally --- core/ocr/baas_ocr_client/Client.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 933e93421..82dea57b7 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -245,11 +245,13 @@ def _start_android_server(self): if path in loaded: continue if os.path.exists(path): - self._android_system_load(path) self._android_dependency_libs.append(ctypes.CDLL(path, mode=ctypes.RTLD_GLOBAL)) loaded.add(path) - self._android_system_load(self.exe_path) - server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) + try: + server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) + except OSError: + self._android_system_load(self.exe_path) + server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) server_lib.start_server.argtypes = [] server_lib.start_server.restype = None server_lib.stop_server.argtypes = [] From 3c45d2d77dc837d1f5737984fe9e4c4b30660061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:48:55 +0800 Subject: [PATCH 62/98] Isolate Android OCR libc++ runtime --- core/ocr/baas_ocr_client/Client.py | 33 +++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 82dea57b7..9525484c2 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -73,6 +73,9 @@ def _android_library_abi_dir() -> str: raise RuntimeError("Unsupported Android OCR architecture.") +ANDROID_LIBCXX_NAME = "libc++_baasxx.so" + + def _server_folder_path() -> str: base = os.path.dirname(__file__) android_branch = _android_ocr_branch() @@ -140,11 +143,31 @@ def _prepare_android_runtime_folder(self) -> str: native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() native_libcxx = os.path.join(native_lib_dir, "libc++_shared.so") if native_lib_dir else "" target_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), "libc++_shared.so") + target_baas_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), ANDROID_LIBCXX_NAME) if native_libcxx and os.path.exists(native_libcxx): - shutil.copy2(native_libcxx, target_libcxx) + shutil.copy2(native_libcxx, target_baas_libcxx) + self._replace_library_name(target_baas_libcxx, "libc++_shared.so", ANDROID_LIBCXX_NAME) + self._replace_library_name(self._android_server_library_path(target_root), "libc++_shared.so", ANDROID_LIBCXX_NAME) + try: + os.remove(target_libcxx) + except OSError: + pass os.chmod(self._android_server_library_path(target_root), 0o755) return target_root + @staticmethod + def _replace_library_name(path: str, old_name: str, new_name: str) -> None: + old = old_name.encode("utf-8") + new = new_name.encode("utf-8") + if len(old) != len(new): + raise ValueError("Replacement library name must have the same byte length.") + with open(path, "rb") as fp: + data = fp.read() + patched = data.replace(old, new) + if patched != data: + with open(path, "wb") as fp: + fp.write(patched) + # clear log since time_distance days ago def clear_log(self, time_distance=7): log_folder_path = os.path.join(self.server_folder_path, "output") @@ -234,10 +257,10 @@ def _start_android_server(self): lib_dir = os.path.dirname(self.exe_path) native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() dependency_paths = [] - native_libcxx = os.path.join(native_lib_dir, "libc++_shared.so") if native_lib_dir else "" - if native_libcxx and os.path.exists(native_libcxx): - dependency_paths.append(native_libcxx) - if os.path.exists(os.path.join(lib_dir, "libc++_shared.so")): + baas_libcxx = os.path.join(lib_dir, ANDROID_LIBCXX_NAME) + if os.path.exists(baas_libcxx): + dependency_paths.append(baas_libcxx) + elif os.path.exists(os.path.join(lib_dir, "libc++_shared.so")): dependency_paths.append(os.path.join(lib_dir, "libc++_shared.so")) dependency_paths.extend(os.path.join(lib_dir, name) for name in ["libonnxruntime.so", "libopencv_java4.so"]) loaded = set() From 8c0ded82b230076841c839838d3307546bacde85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 21:58:29 +0800 Subject: [PATCH 63/98] Fix Android OCR server start signature --- core/ocr/baas_ocr_client/Client.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 9525484c2..fb21f7047 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -125,11 +125,13 @@ def _prepare_android_runtime_folder(self) -> str: source_version = os.path.join(source_root, ".baas-ocr-prebuild-sha") target_version = os.path.join(target_root, ".baas-ocr-prebuild-sha") try: - source_sha = open(source_version, "r", encoding="utf-8").read().strip() + with open(source_version, "r", encoding="utf-8") as fp: + source_sha = fp.read().strip() except OSError: source_sha = "" try: - target_sha = open(target_version, "r", encoding="utf-8").read().strip() + with open(target_version, "r", encoding="utf-8") as fp: + target_sha = fp.read().strip() except OSError: target_sha = "" @@ -275,13 +277,14 @@ def _start_android_server(self): except OSError: self._android_system_load(self.exe_path) server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) - server_lib.start_server.argtypes = [] + server_lib.start_server.argtypes = [ctypes.c_char_p] server_lib.start_server.restype = None server_lib.stop_server.argtypes = [] server_lib.stop_server.restype = None self._android_server_lib = server_lib + server_root = os.fsencode(self.server_folder_path) self._android_server_thread = threading.Thread( - target=server_lib.start_server, + target=lambda: server_lib.start_server(server_root), name="baas-ocr-android-server", daemon=True, ) From 4a20988560014dfba59babbd0c52383ba7ccdfc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 28 Jun 2026 22:09:22 +0800 Subject: [PATCH 64/98] Use local uiautomator2 for Android embedded control --- core/Baas_thread.py | 14 ++++++++++++++ core/device/Control.py | 3 +++ core/device/Screenshot.py | 3 +++ core/device/connection.py | 39 ++++++++++++++++++++++++++++++++------- 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/core/Baas_thread.py b/core/Baas_thread.py index 8d866c95b..8f6956ff0 100644 --- a/core/Baas_thread.py +++ b/core/Baas_thread.py @@ -376,6 +376,10 @@ def _get_android_device_ocr_language(self): if self.server == "CN": self.ocr_language = "zh-cn" elif self.server == "Global": + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + self.ocr_language = os.getenv("BAAS_ANDROID_GLOBAL_OCR_LANGUAGE", "en-us") + self.logger.warning("Android embedded mode cannot pull DeviceOption through adb; use " + self.ocr_language) + return basic_path = self.u2._adb_device.shell(f"echo $EXTERNAL_STORAGE").strip() src = "/".join([ basic_path, @@ -417,6 +421,16 @@ def _read_DeviceOption_ocr_language(self, _p): def check_atx(self): self.logger.info("--------------Check ATX install ----------------") + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + version_url = self.u2.path2url("/version") + try: + version = requests.get(version_url, timeout=3).text + except requests.RequestException as exc: + raise RuntimeError("Android embedded mode requires local uiautomator2 agent on 127.0.0.1:7912") from exc + self.logger.info("ATX agent version: [ " + version + " ].") + self.wait_uiautomator_start() + self.logger.info("Uiautomator2 service started.") + return _d = self.u2._wait_for_device() if not _d: raise RuntimeError("USB device %s is offline " + self.serial) diff --git a/core/device/Control.py b/core/device/Control.py index 3ad991cd1..11946b064 100644 --- a/core/device/Control.py +++ b/core/device/Control.py @@ -1,4 +1,5 @@ import sys +import os from core.device.control.nemu import NemuControl from core.device.control.adb import AdbControl @@ -20,6 +21,8 @@ def __init__(self, Baas_instance): def init_control_instance(self): self.method = self.config.control_method + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} and self.Baas_instance.is_android_device: + self.method = "uiautomator2" self.logger.info("Control method : " + self.method) if self.Baas_instance.is_android_device: diff --git a/core/device/Screenshot.py b/core/device/Screenshot.py index b981b9130..cbcadde47 100644 --- a/core/device/Screenshot.py +++ b/core/device/Screenshot.py @@ -1,4 +1,5 @@ import sys +import os from core.device.screenshot.scrcpy import ScrcpyScreenshot from core.device.screenshot.nemu import NemuScreenshot @@ -24,6 +25,8 @@ def __init__(self, Baas_instance): def init_screenshot_instance(self): self.method = self.config.screenshot_method + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} and self.Baas_instance.is_android_device: + self.method = "uiautomator2" self.logger.info("Screenshot method : " + self.method) if self.Baas_instance.is_android_device: diff --git a/core/device/connection.py b/core/device/connection.py index f5c154b77..588fc7612 100644 --- a/core/device/connection.py +++ b/core/device/connection.py @@ -8,6 +8,10 @@ from core.exception import RequestHumanTakeOver # reference : [ https://github.com/LmeSzinc/AzurLaneAutoScript/blob/master/module/device/connection.py ] +def _is_android_embedded(): + return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} + + class Connection: def __init__(self, Baas_instance, skip_package_detection=False): @@ -34,13 +38,13 @@ def _init_android_device(self): self.package = None self.adbIP = self.config.adbIP self.adbPort = self.config.adbPort - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - serial = os.getenv("BAAS_ANDROID_ADB_SERIAL", "").strip() - if not serial and (not self.adbIP or self.adbIP == "auto") and (not self.adbPort or self.adbPort == "auto"): - serial = "127.0.0.1:5555" - if serial: - self.adbIP, self.adbPort = self._split_serial(serial) - self.serial = f"{self.adbIP}:{self.adbPort}" + if _is_android_embedded(): + self.serial = os.getenv("BAAS_ANDROID_U2_SERIAL", "127.0.0.1:7912").strip() or "127.0.0.1:7912" + self.adbIP, self.adbPort = self._split_serial(self.serial) + self.logger.info("Android embedded mode detected; use local uiautomator2 agent.") + self.logger.info(f"Serial : {self.serial}") + self._resolve_configured_package() + return is_usb_or_emulator_device = (self.adbIP == "" or self.adbPort == "") if self.adbIP == "" and self.adbPort != "": self.serial = self.adbPort @@ -59,6 +63,27 @@ def _init_android_device(self): self.detect_package() self.check_mumu_keep_alive() + def _resolve_configured_package(self): + server = self.config.server + if server == "auto": + raise RequestHumanTakeOver("Android embedded mode requires an explicit game server.") + if server == '官服' or server == 'B服': + self.server = 'CN' + elif server == '国际服' or server == '国际服青少年' or server == '韩国ONE': + self.server = 'Global' + elif server == '日服': + self.server = 'JP' + else: + raise RequestHumanTakeOver("Unsupported Android game server: " + str(server)) + + try: + self.package = self.static_config.package_name[server] + self.activity = self.static_config.activity_name[server] + except KeyError as exc: + raise RequestHumanTakeOver("Game package is not configured: " + str(server)) from exc + self.logger.info("Package : " + self.package) + self.logger.info("Server : " + self.server) + def _init_app_process(self): self.detect_app_window() From 8e747cfdf3bf9399328780b7ea1407057cf4d3fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 29 Jun 2026 13:15:37 +0800 Subject: [PATCH 65/98] Fix Android uiautomator and cafe matching --- core/Baas_thread.py | 29 ++++- core/device/connection.py | 8 ++ core/device/uiautomator2_client.py | 3 + module/cafe_reward.py | 154 ++++++++++++++++++++----- tests/module/test_cafe_reward_match.py | 62 ++++++++++ 5 files changed, 221 insertions(+), 35 deletions(-) create mode 100644 tests/module/test_cafe_reward_match.py diff --git a/core/Baas_thread.py b/core/Baas_thread.py index 8f6956ff0..a9b8bd0d3 100644 --- a/core/Baas_thread.py +++ b/core/Baas_thread.py @@ -422,9 +422,8 @@ def _read_DeviceOption_ocr_language(self, _p): def check_atx(self): self.logger.info("--------------Check ATX install ----------------") if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - version_url = self.u2.path2url("/version") try: - version = requests.get(version_url, timeout=3).text + version = requests.get("http://127.0.0.1:7912/version", timeout=3).text except requests.RequestException as exc: raise RuntimeError("Android embedded mode requires local uiautomator2 agent on 127.0.0.1:7912") from exc self.logger.info("ATX agent version: [ " + version + " ].") @@ -761,7 +760,16 @@ def u2_swipe(self, fx, fy, tx, ty, duration=None, post_sleep_time=0): if not self.flag_run: raise RequestHumanTakeOver self.logger.info(f"swipe from ( " + str(fx) + " , " + str(fy) + " ) --> ( " + str(tx) + " , " + str(ty) + " )") - self.u2.swipe(fx * self.ratio, fy * self.ratio, tx * self.ratio, ty * self.ratio, duration) + width, height = self.resolution if getattr(self, "resolution", None) else (1280, 720) + max_x = max(0, int(width) - 1) + max_y = max(0, int(height) - 1) + self.u2.swipe( + min(max_x, max(0, int(fx * self.ratio))), + min(max_y, max(0, int(fy * self.ratio))), + min(max_x, max(0, int(tx * self.ratio))), + min(max_y, max(0, int(ty * self.ratio))), + duration, + ) if post_sleep_time > 0: time.sleep(post_sleep_time) @@ -908,6 +916,21 @@ def set_screenshot_interval(self, interval): self.screenshot_interval = self.screenshot.set_screenshot_interval(interval) def wait_uiautomator_start(self): + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + for i in range(0, 10): + try: + self.u2.uiautomator.start() + while not self.u2.uiautomator.running(): + time.sleep(0.1) + self.latest_img_array = self.normalize_screenshot( + cv2.cvtColor(np.array(self.u2.screenshot()), cv2.COLOR_RGB2BGR) + ) + return + except Exception as e: + print(e) + time.sleep(0.3) + raise RuntimeError("Android embedded uiautomator2 agent is not responding") + for i in range(0, 10): try: self.u2.uiautomator.start() diff --git a/core/device/connection.py b/core/device/connection.py index 588fc7612..ae66c10ef 100644 --- a/core/device/connection.py +++ b/core/device/connection.py @@ -369,6 +369,14 @@ def get_activity_name(self): def get_current_package(self): self.logger.info("Get Current Package.") + if _is_android_embedded(): + u2 = getattr(self.Baas_thread, "u2", None) + if u2 is None: + return "" + current = u2.app_current() + if isinstance(current, dict): + return current.get("package", "") + return getattr(current, "package", "") or "" for _ in range(3): d = adb.device(self.serial) try: diff --git a/core/device/uiautomator2_client.py b/core/device/uiautomator2_client.py index 02761bdd8..3dd0b199a 100644 --- a/core/device/uiautomator2_client.py +++ b/core/device/uiautomator2_client.py @@ -19,6 +19,9 @@ class U2Client: def __init__(self, serial): self.serial = serial + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} and not serial.startswith(("http://", "https://")): + self.connection = u2.connect("http://" + serial) + return if ":" in serial: self.connection = u2.connect(serial) else: diff --git a/module/cafe_reward.py b/module/cafe_reward.py index 74992c186..2f3eecd2b 100644 --- a/module/cafe_reward.py +++ b/module/cafe_reward.py @@ -1,16 +1,30 @@ -import cv2 -import time -import queue -import threading +import cv2 +import os +import time +import queue +import threading import numpy as np from core import image, color, picture -from core.utils import merge_nearby_coordinates -from statistics import median - - -def implement(self): +from core.utils import merge_nearby_coordinates +from statistics import median + +_happy_face_templates = None +_happy_face_match_scale = 0.75 +_happy_face_match_roi = (0, 45, 1280, 555) + + +def _resize_for_happy_face_match(img): + height, width = img.shape[:2] + size = ( + max(1, int(round(width * _happy_face_match_scale))), + max(1, int(round(height * _happy_face_match_scale))), + ) + return cv2.resize(img, size, interpolation=cv2.INTER_AREA) + + +def implement(self): self.to_main_page() to_cafe(self, True) if self.config.cafe_reward_collect_hour_reward and get_cafe_earning_status(self): @@ -81,16 +95,83 @@ def to_no2_cafe(self): return -def match(img): - res = [] - for i in range(1, 5): - template = cv2.imread("src/images/CN/cafe/happy_face" + str(i) + ".png") - result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) - threshold = 0.75 - locations = np.where(result >= threshold) - for pt in zip(*locations[::-1]): - res.append([int(pt[0] + template.shape[1] / 2), int(pt[1] + template.shape[0] / 2 + 58)]) - return res +def _get_happy_face_templates(): + global _happy_face_templates + if _happy_face_templates is None: + templates = [] + for i in range(1, 5): + template = cv2.imread("src/images/CN/cafe/happy_face" + str(i) + ".png") + if template is None: + templates.append(None) + continue + template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) + template = _resize_for_happy_face_match(template) + templates.append(template) + _happy_face_templates = templates + return _happy_face_templates + + +def _dedupe_happy_face_points(points): + deduped = [] + for x, y in sorted(points, key=lambda item: (item[1], item[0])): + if any(abs(x - px) <= 24 and abs(y - py) <= 24 for px, py in deduped): + continue + deduped.append([x, y]) + if len(deduped) >= 32: + break + return deduped + + +def _match_happy_faces_by_color(img): + roi_x0, roi_y0, roi_x1, roi_y1 = _happy_face_match_roi + search_img = img[roi_y0:roi_y1, roi_x0:roi_x1] + hsv = cv2.cvtColor(search_img, cv2.COLOR_BGR2HSV) + lower_red = cv2.inRange(hsv, np.array([0, 55, 120]), np.array([12, 255, 255])) + upper_red = cv2.inRange(hsv, np.array([160, 55, 120]), np.array([179, 255, 255])) + mask = cv2.bitwise_or(lower_red, upper_red) + count, _, stats, centers = cv2.connectedComponentsWithStats(mask, 8) + points = [] + for i in range(1, count): + _, _, width, height, area = stats[i] + if not (8 <= area <= 500 and 4 <= width <= 40 and 4 <= height <= 40): + continue + cx, cy = centers[i] + points.append([int(roi_x0 + cx), int(roi_y0 + cy + 58)]) + return _dedupe_happy_face_points(points) + + +def match(img): + color_matches = _match_happy_faces_by_color(img) + if color_matches or os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + return color_matches + + res = [] + roi_x0, roi_y0, roi_x1, roi_y1 = _happy_face_match_roi + search_img = img[roi_y0:roi_y1, roi_x0:roi_x1] + search_img = cv2.cvtColor(search_img, cv2.COLOR_BGR2GRAY) + search_img = _resize_for_happy_face_match(search_img) + for template in _get_happy_face_templates(): + if template is None: + continue + result = cv2.matchTemplate(search_img, template, cv2.TM_CCOEFF_NORMED) + threshold = 0.75 + suppress_x = max(20, template.shape[1]) + suppress_y = max(20, template.shape[0]) + for _ in range(16): + _, max_val, _, max_loc = cv2.minMaxLoc(result) + if max_val < threshold: + break + pt_x, pt_y = max_loc + res.append([ + int(roi_x0 + (pt_x + template.shape[1] / 2) / _happy_face_match_scale), + int(roi_y0 + (pt_y + template.shape[0] / 2) / _happy_face_match_scale + 58), + ]) + left = max(0, pt_x - suppress_x) + right = min(result.shape[1], pt_x + suppress_x + 1) + top = max(0, pt_y - suppress_y) + bottom = min(result.shape[0], pt_y + suppress_y + 1) + result[top:bottom, left:right] = -1 + return res def cafe_to_gift(self): @@ -115,10 +196,15 @@ def screenshot_thread(self, delay): self.update_screenshot_array() cv2.imwrite("cafe_reward_shot.png", self.latest_img_array) -def gift_to_cafe(self): - img_possibles = { - 'cafe_gift': (1240, 574), - } +def gift_to_cafe(self): + if self.is_android_device: + self.click(1240, 574, wait_over=True) + picture.co_detect(self, "cafe", None, None, None, False, time_out=15) + return + + img_possibles = { + 'cafe_gift': (1240, 574), + } rgb_possibles = {"gift": (1240, 574)} rgb_ends = "cafe" picture.co_detect(self, rgb_ends, rgb_possibles, None, img_possibles, True) @@ -141,10 +227,12 @@ def swipe_gift_and_screenshot(self): shotDelay = self.config.cafe_reward_interaction_shot_delay if self.is_android_device: t1 = threading.Thread(target=screenshot_thread, args=(self, shotDelay)) - t1.start() - start_t = time.time() - self.u2_swipe(131, 660, 1280, 660, duration=0.5) - return round(time.time() - start_t, 3) + t1.start() + start_t = time.time() + self.u2_swipe(131, 660, 1280, 660, duration=0.5) + swipe_t = round(time.time() - start_t, 3) + self.logger.info("Gift swipe duration : [ " + str(swipe_t) + " ]") + return swipe_t else: q = queue.Queue() t1 = threading.Thread(target=swipe_gift_thread, args=(self, 1, q)) @@ -154,11 +242,13 @@ def swipe_gift_and_screenshot(self): t1.join() return q.get() -def find_student_position(self): - swipe_t = swipe_gift_and_screenshot(self) - img = cv2.resize(self.latest_img_array, (1280, 720), interpolation=cv2.INTER_AREA) - res = match(img) - if not res: +def find_student_position(self): + swipe_t = swipe_gift_and_screenshot(self) + match_start_t = time.time() + img = cv2.resize(self.latest_img_array, (1280, 720), interpolation=cv2.INTER_AREA) + res = match(img) + self.logger.info("Cafe interaction match duration : [ " + str(round(time.time() - match_start_t, 3)) + " ], candidates : [ " + str(len(res)) + " ]") + if not res: self.logger.info("No interaction found") if swipe_t < self.config.cafe_reward_interaction_shot_delay + 0.3: self.logger.warning( diff --git a/tests/module/test_cafe_reward_match.py b/tests/module/test_cafe_reward_match.py new file mode 100644 index 000000000..136382701 --- /dev/null +++ b/tests/module/test_cafe_reward_match.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +import time +from pathlib import Path + +import pytest + +cv2 = pytest.importorskip("cv2") +np = pytest.importorskip("numpy") + +from module import cafe_reward + + +REPO_ROOT = Path(__file__).resolve().parents[2] + + +def test_cafe_reward_match_maps_scaled_roi_coordinates(monkeypatch): + monkeypatch.chdir(REPO_ROOT) + cafe_reward._happy_face_templates = None + + template_path = REPO_ROOT / "src" / "images" / "CN" / "cafe" / "happy_face1.png" + template = cv2.imread(str(template_path)) + assert template is not None + + image = np.full((720, 1280, 3), 40, dtype=np.uint8) + x, y = 300, 200 + height, width = template.shape[:2] + image[y:y + height, x:x + width] = template + + matches = cafe_reward.match(image) + + expected_x = x + width / 2 + expected_y = y + height / 2 + 58 + assert any(abs(mx - expected_x) <= 4 and abs(my - expected_y) <= 4 for mx, my in matches) + + +def test_cafe_reward_match_is_bounded_on_broad_matches(monkeypatch): + monkeypatch.chdir(REPO_ROOT) + cafe_reward._happy_face_templates = None + + image = np.full((720, 1280, 3), 255, dtype=np.uint8) + start = time.perf_counter() + matches = cafe_reward.match(image) + elapsed = time.perf_counter() - start + + assert elapsed < 3 + assert len(matches) <= 64 + + +def test_cafe_reward_match_android_skips_template_fallback(monkeypatch): + monkeypatch.chdir(REPO_ROOT) + monkeypatch.setenv("BAAS_ANDROID", "1") + cafe_reward._happy_face_templates = None + + image = np.full((720, 1280, 3), 255, dtype=np.uint8) + start = time.perf_counter() + matches = cafe_reward.match(image) + elapsed = time.perf_counter() - start + + assert elapsed < 0.2 + assert matches == [] + assert cafe_reward._happy_face_templates is None From 455caf2a308bf706a99de2d492cc119109acdce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 29 Jun 2026 13:31:45 +0800 Subject: [PATCH 66/98] Fix SHA source probing outside git repos --- service/update/checks.py | 57 ++++++++++++++++++----------- tests/service/test_update_checks.py | 42 +++++++++++++++++++++ 2 files changed, 77 insertions(+), 22 deletions(-) create mode 100644 tests/service/test_update_checks.py diff --git a/service/update/checks.py b/service/update/checks.py index 11f2aa987..8769b3ac8 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -39,50 +39,63 @@ class GitOperationHandler: def __init__(self, repo_path: Union[str, Path] = "."): self.repo_path = Path(repo_path) - self.git_executable = None and shutil.which("git") + self.git_executable = shutil.which("git") - def _run_git_cmd(self, args: List[str]) -> str: + def _run_git_cmd(self, args: List[str], timeout: Optional[float] = None) -> str: """Helper to run system git commands.""" if not self.git_executable: raise FileNotFoundError("Git executable not found.") - # Ensure we run in the correct directory + # Ensure we run in an existing directory. `ls-remote` does not require + # the current BAAS directory to be a Git repository. + cwd = self.repo_path if self.repo_path.exists() else Path.cwd() + env = os.environ.copy() + env["GIT_TERMINAL_PROMPT"] = "0" result = subprocess.run( [self.git_executable, *args], - cwd=self.repo_path, + cwd=cwd, capture_output=True, text=True, - check=True + check=True, + timeout=timeout, + env=env, ) return result.stdout.strip() - def get_remote_latest_sha(self, url: str, branch: str) -> str: + def get_remote_latest_sha(self, url: str, branch: str, timeout: Optional[float] = None) -> str: """ Get the SHA of a remote branch. Uses `git ls-remote` if available, otherwise uses pygit2 anonymous remote. """ + last_error: Optional[Exception] = None if self.git_executable: try: # Command: git ls-remote refs/heads/ # Output format: \trefs/heads/ ref = f"refs/heads/{branch}" - output = self._run_git_cmd(["ls-remote", url, ref]) + output = self._run_git_cmd(["ls-remote", url, ref], timeout=timeout) if output: return output.split()[0] raise ValueError(f"Branch '{branch}' not found at {url} (System Git)") - except (subprocess.CalledProcessError, IndexError, ValueError) as e: - # If system git fails, try fallback or just raise - raise RuntimeError(f"System git failed: {e}") + except (subprocess.CalledProcessError, subprocess.TimeoutExpired, IndexError, ValueError) as e: + last_error = e - # Fallback to pygit2 - repo = pygit2.Repository(self.repo_path) - # Create anonymous remote to avoid modifying config - remote = repo.remotes.create_anonymous(url) - target_ref = f"refs/heads/{branch}" - for head in remote.ls_remotes(): - if head.get("name") == target_ref: - return str(head.get("oid")) - raise ValueError(f"Branch '{branch}' not found at {url} (pygit2)") + # Fallback to pygit2 in a temporary bare repository. Android installs + # may be copied from an archive and have no .git directory, so using + # Path.cwd() as a Repository causes an immediate 0.000s local failure. + try: + with tempfile.TemporaryDirectory(prefix="baas-sha-test-") as tmp_dir: + repo = pygit2.init_repository(tmp_dir, bare=True) + remote = repo.remotes.create_anonymous(url) + target_ref = f"refs/heads/{branch}" + for head in remote.ls_remotes(): + if head.get("name") == target_ref: + return str(head.get("oid")) + except Exception as exc: + last_error = exc + + reason = f": {last_error}" if last_error else "" + raise ValueError(f"Branch '{branch}' not found at {url} (pygit2){reason}") def get_local_head_info(self) -> Tuple[str, str]: """ @@ -164,7 +177,7 @@ def _mirrorc_api_get_latest_sha(timeout: float, channel: str = "stable") -> Tupl return False, str(exc) -def _git_wrapper_get_latest_sha(config: Dict[str, Any]) -> Tuple[bool, str]: +def _git_wrapper_get_latest_sha(config: Dict[str, Any], timeout: Optional[float] = None) -> Tuple[bool, str]: """ Replaces the direct pygit2 call. Uses GitOperationHandler to determine whether to use system git or pygit2. @@ -175,7 +188,7 @@ def _git_wrapper_get_latest_sha(config: Dict[str, Any]) -> Tuple[bool, str]: git_ops = GitOperationHandler(Path.cwd()) try: - sha = git_ops.get_remote_latest_sha(url, branch) + sha = git_ops.get_remote_latest_sha(url, branch, timeout=timeout) return True, sha except Exception as exc: return False, str(exc) @@ -205,7 +218,7 @@ def test_repo_sha(config: dict[str, Union[str, GetShaMethod]], timeout: float) - success, value = _mirrorc_api_get_latest_sha(timeout, str(config.get("channel") or _setup_channel()[0])) else: # Renamed to indicate it uses the wrapper logic - success, value = _git_wrapper_get_latest_sha(config) + success, value = _git_wrapper_get_latest_sha(config, timeout) elapsed = time.perf_counter() - start result: RepositoryResult = { "name": config.get("name"), diff --git a/tests/service/test_update_checks.py b/tests/service/test_update_checks.py new file mode 100644 index 000000000..eb00f223e --- /dev/null +++ b/tests/service/test_update_checks.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from service.update import checks + + +def test_remote_sha_uses_temporary_bare_repo_without_git(monkeypatch, tmp_path): + created = {} + + class FakeRemote: + def ls_remotes(self): + return [ + {"name": "refs/heads/other", "oid": "0" * 40}, + {"name": "refs/heads/master", "oid": "1" * 40}, + ] + + class FakeRemotes: + def create_anonymous(self, url): + created["url"] = url + return FakeRemote() + + class FakeRepo: + remotes = FakeRemotes() + + def fake_repository(_path): + raise AssertionError("remote SHA probing must not require cwd to be a git repository") + + def fake_init_repository(path, bare): + created["path"] = path + created["bare"] = bare + return FakeRepo() + + monkeypatch.setattr(checks.shutil, "which", lambda _name: None) + monkeypatch.setattr(checks.pygit2, "Repository", fake_repository) + monkeypatch.setattr(checks.pygit2, "init_repository", fake_init_repository) + + handler = checks.GitOperationHandler(tmp_path / "not-a-repo") + sha = handler.get_remote_latest_sha("https://example.invalid/repo.git", "master") + + assert sha == "1" * 40 + assert created["url"] == "https://example.invalid/repo.git" + assert created["bare"] is True + From a8ab35362d0cd28ad2b76910663d821edc3a41e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 29 Jun 2026 15:07:48 +0800 Subject: [PATCH 67/98] Fix Android OCR prebuild loading --- core/ocr/baas_ocr_client/Client.py | 10 ++++------ core/ocr/baas_ocr_client/server_installer.py | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index fb21f7047..5f9ddbe4c 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -146,14 +146,12 @@ def _prepare_android_runtime_folder(self) -> str: native_libcxx = os.path.join(native_lib_dir, "libc++_shared.so") if native_lib_dir else "" target_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), "libc++_shared.so") target_baas_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), ANDROID_LIBCXX_NAME) - if native_libcxx and os.path.exists(native_libcxx): - shutil.copy2(native_libcxx, target_baas_libcxx) + source_libcxx = native_libcxx if native_libcxx and os.path.exists(native_libcxx) else target_libcxx + if source_libcxx and os.path.exists(source_libcxx): + if os.path.abspath(source_libcxx) != os.path.abspath(target_baas_libcxx): + shutil.copy2(source_libcxx, target_baas_libcxx) self._replace_library_name(target_baas_libcxx, "libc++_shared.so", ANDROID_LIBCXX_NAME) self._replace_library_name(self._android_server_library_path(target_root), "libc++_shared.so", ANDROID_LIBCXX_NAME) - try: - os.remove(target_libcxx) - except OSError: - pass os.chmod(self._android_server_library_path(target_root), 0o755) return target_root diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index ff9f03c08..57010da5b 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -32,6 +32,14 @@ OCR_SERVER_PREBUILD_URL = "https://gitee.com/pur1fy/baas_-cpp_prebuild.git" OCR_SERVER_PREBUILD_ARCHIVE_URLS = [ + "https://baas-cdn.kiramei.workers.dev/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://codeload.github.com/pur1fying/BAAS_Cpp_prebuild/zip/refs/heads/{branch}", + "https://v4.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://v6.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://cdn.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://gh.sevencdn.com/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://githubfast.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", "https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", ] OCR_SERVER_PREBUILD_API_URL = "https://api.github.com/repos/pur1fying/BAAS_Cpp_prebuild/branches/{branch}" @@ -105,12 +113,12 @@ def _get_android_remote_sha(branch: str) -> Optional[str]: return None -def _download_android_archive(branch: str, archive_path: str) -> str: +def _download_android_archive(branch: str, archive_path: str, logger=None) -> str: last_error: Optional[Exception] = None for template in OCR_SERVER_PREBUILD_ARCHIVE_URLS: url = template.format(branch=branch) try: - with requests.get(url, stream=True, timeout=90) as response: + with requests.get(url, stream=True, timeout=(8, 90)) as response: response.raise_for_status() with open(archive_path, "wb") as fp: for chunk in response.iter_content(chunk_size=1024 * 256): @@ -119,6 +127,8 @@ def _download_android_archive(branch: str, archive_path: str) -> str: return url except Exception as exc: last_error = exc + if logger is not None: + logger.warning(f"Failed to download Android OCR prebuild from {url}: {exc}") raise OcrInternalError(f"Failed to download Android OCR prebuild archive: {last_error}") @@ -147,11 +157,14 @@ def _install_android_prebuild(logger) -> None: if remote_sha and local_sha == remote_sha and os.path.exists(server_binary_path): logger.info("Ocr Server No updates available.") return + if not remote_sha and local_sha and os.path.exists(server_binary_path): + logger.warning("Android OCR remote SHA unavailable; using installed prebuild.") + return logger.info(f"Installing Android Ocr Server prebuild for {TARGET_BRANCH}.") with tempfile.TemporaryDirectory(prefix="baas-ocr-android-") as tmp: archive_path = os.path.join(tmp, "ocr-prebuild.zip") - source_url = _download_android_archive(TARGET_BRANCH, archive_path) + source_url = _download_android_archive(TARGET_BRANCH, archive_path, logger) extract_root = os.path.join(tmp, "extract") os.makedirs(extract_root, exist_ok=True) with zipfile.ZipFile(archive_path) as archive: From 9bd06fe85c893e93e9086435a0f75550b3cb8e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 29 Jun 2026 15:20:56 +0800 Subject: [PATCH 68/98] Fix Android update source probing --- service/update/checks.py | 120 ++++++++++++++++++++++++++-- tests/service/test_update_checks.py | 83 +++++++++++++++++++ 2 files changed, 196 insertions(+), 7 deletions(-) diff --git a/service/update/checks.py b/service/update/checks.py index 8769b3ac8..36d42829c 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -8,6 +8,7 @@ import tempfile import zipfile from pathlib import Path +from urllib.parse import urlparse from typing import Union, List, Tuple from dataclasses import dataclass from datetime import datetime, timezone @@ -194,6 +195,99 @@ def _git_wrapper_get_latest_sha(config: Dict[str, Any], timeout: Optional[float] return False, str(exc) +def _github_repo_from_url(url: str) -> Optional[Tuple[str, str]]: + lower_url = url.lower() + marker = "github.com/" + marker_index = lower_url.find(marker) + if marker_index >= 0: + tail = url[marker_index + len(marker):] + else: + parsed = urlparse(url) + if parsed.netloc.lower() != "githubfast.com": + return None + tail = parsed.path.lstrip("/") + + tail = tail.split("?", 1)[0].split("#", 1)[0].strip("/") + parts = [part for part in tail.split("/") if part] + if len(parts) < 2: + return None + owner, repo = parts[0], parts[1] + if repo.endswith(".git"): + repo = repo[:-4] + return owner, repo + + +def _github_archive_url_for_config(config: Dict[str, Any]) -> Optional[str]: + source_url = str(config.get("url") or "") + repo_parts = _github_repo_from_url(source_url) + if not repo_parts: + owner = config.get("owner") + repo = config.get("repo") + if not owner or not repo: + return None + repo_parts = (str(owner), str(repo)) + + owner, repo = repo_parts + branch = str(config.get("branch") or "master") + github_archive_url = f"https://github.com/{owner}/{repo}/archive/refs/heads/{branch}.zip" + parsed = urlparse(source_url) + host = parsed.netloc.lower() + scheme = parsed.scheme or "https" + + if host in {"v4.gh-proxy.org", "v6.gh-proxy.org", "cdn.gh-proxy.org", "gh-proxy.org", "gh.sevencdn.com"}: + return f"{scheme}://{host}/{github_archive_url}" + if host == "githubfast.com": + return f"{scheme}://{host}/{owner}/{repo}/archive/refs/heads/{branch}.zip" + if host == "baas-cdn.kiramei.workers.dev": + return f"{scheme}://{host}/{github_archive_url}" + return f"https://codeload.github.com/{owner}/{repo}/zip/refs/heads/{branch}" + + +def _probe_android_archive_url(archive_url: str, timeout: float) -> Tuple[bool, str]: + connect_timeout = min(max(float(timeout), 1.0), 8.0) + read_timeout = max(float(timeout), connect_timeout) + headers = { + "User-Agent": "BAAS-Android", + "Range": "bytes=0-0", + } + try: + with requests.get( + archive_url, + stream=True, + timeout=(connect_timeout, read_timeout), + headers=headers, + ) as response: + response.raise_for_status() + for chunk in response.iter_content(chunk_size=1): + if chunk: + break + return True, "" + except requests.RequestException as exc: + return False, str(exc) + + +def _android_http_get_latest_sha(config: Dict[str, Any], timeout: float) -> Tuple[bool, str]: + repo_parts = _github_repo_from_url(str(config.get("url") or "")) + archive_url = _github_archive_url_for_config(config) + if not repo_parts or not archive_url: + return _git_wrapper_get_latest_sha(config, timeout) + + ok, error = _probe_android_archive_url(archive_url, timeout) + if not ok: + return False, error + + owner, repo = repo_parts + github_config = { + "owner": owner, + "repo": repo, + "branch": str(config.get("branch") or "master"), + } + success, sha = _github_api_get_latest_sha(github_config, timeout) + if not success: + return False, f"Archive source reachable, but GitHub API SHA lookup failed: {sha}" + return True, sha + + def repo_sha_test_configs(channel: Optional[str] = None) -> List[Dict[str, Any]]: """Return normalized repository SHA test configs for a channel.""" channel = normalize_update_channel(channel or _setup_channel()[0]) @@ -216,6 +310,8 @@ def test_repo_sha(config: dict[str, Union[str, GetShaMethod]], timeout: float) - success, value = _github_api_get_latest_sha(config, timeout) elif method == GetShaMethod.MIRRORC_API: success, value = _mirrorc_api_get_latest_sha(timeout, str(config.get("channel") or _setup_channel()[0])) + elif _is_android_runtime(): + success, value = _android_http_get_latest_sha(config, timeout) else: # Renamed to indicate it uses the wrapper logic success, value = _git_wrapper_get_latest_sha(config, timeout) @@ -459,6 +555,16 @@ def _github_archive_config(channel: str) -> Dict[str, Any]: raise RuntimeError(f"No GitHub API update source configured for channel: {channel}") +def _android_archive_config(data: Dict[str, Any], channel: str) -> Dict[str, Any]: + methods = get_remote_sha_methods_for_channel(channel) + method_name = data.get("general", {}).get("get_remote_sha_method") + if method_name: + selected = next((method for method in methods if method.get("name") == method_name), None) + if selected and _github_archive_url_for_config(selected): + return selected + return _github_archive_config(channel) + + def _copy_android_update_tree(source_root: Path, target_root: Path) -> None: keep_names = { "config", @@ -489,15 +595,15 @@ def _android_update_to_latest(setup_path: Union[Path, None] = None) -> Dict[str, return {"status": "skipped", "reason": "no_update"} channel = setup_channel(data) - source = _github_archive_config(channel) - owner = source["owner"] - repo = source["repo"] - branch = source["branch"] - ok, remote_sha = _github_api_get_latest_sha(source, 10.0) + github_source = _github_archive_config(channel) + archive_source = _android_archive_config(data, channel) + ok, remote_sha = _github_api_get_latest_sha(github_source, 10.0) if not ok or not remote_sha: raise RuntimeError(f"Failed to fetch Android update SHA: {remote_sha}") - archive_url = f"https://codeload.github.com/{owner}/{repo}/zip/refs/heads/{branch}" + archive_url = _github_archive_url_for_config(archive_source) + if not archive_url: + raise RuntimeError(f"Failed to resolve Android update archive URL for source: {archive_source.get('name')}") target_root = Path.cwd() with tempfile.TemporaryDirectory(prefix="baas-android-update-") as tmp_dir: tmp = Path(tmp_dir) @@ -523,7 +629,7 @@ def _android_update_to_latest(setup_path: Union[Path, None] = None) -> Dict[str, "status": "updated", "current": remote_sha, "restart_required": True, - "method": "github-archive", + "method": archive_source.get("name") or "github-archive", "channel": channel, } diff --git a/tests/service/test_update_checks.py b/tests/service/test_update_checks.py index eb00f223e..6bbc84370 100644 --- a/tests/service/test_update_checks.py +++ b/tests/service/test_update_checks.py @@ -1,5 +1,6 @@ from __future__ import annotations +from deploy.installer.const import GetShaMethod from service.update import checks @@ -40,3 +41,85 @@ def fake_init_repository(path, bare): assert created["url"] == "https://example.invalid/repo.git" assert created["bare"] is True + +def test_android_repo_sha_uses_archive_probe_for_baas_cdn(monkeypatch): + requested_urls = [] + + class FakeResponse: + def __init__(self, url): + self.url = url + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc, tb): + return False + + def raise_for_status(self): + return None + + def iter_content(self, chunk_size=1): + yield b"x" + + def json(self): + return {"commit": {"sha": "455caf" + "0" * 34}} + + def fake_get(url, **kwargs): + requested_urls.append((url, kwargs)) + return FakeResponse(url) + + def fail_git_wrapper(_config, _timeout): + raise AssertionError("Android GitHub proxy checks must not use pygit2/git") + + monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.setattr(checks.requests, "get", fake_get) + monkeypatch.setattr(checks, "_git_wrapper_get_latest_sha", fail_git_wrapper) + + result = checks.test_repo_sha( + { + "name": "baas_cdn", + "method": GetShaMethod.PYGIT2, + "url": "https://baas-cdn.kiramei.workers.dev/https://github.com/Kiramei/baas-dev.git", + "branch": "master", + }, + timeout=3.0, + ) + + assert result["success"] is True + assert result["value"] == "455caf" + "0" * 34 + assert requested_urls[0][0] == ( + "https://baas-cdn.kiramei.workers.dev/" + "https://github.com/Kiramei/baas-dev/archive/refs/heads/master.zip" + ) + assert requested_urls[0][1]["stream"] is True + assert requested_urls[1][0] == "https://api.github.com/repos/Kiramei/baas-dev/branches/master" + + +def test_githubfast_archive_url_is_generated_from_accelerated_repo_url(): + archive_url = checks._github_archive_url_for_config( + { + "name": "githubfast", + "url": "https://githubfast.com/Kiramei/baas-dev.git", + "branch": "master", + } + ) + + assert archive_url == "https://githubfast.com/Kiramei/baas-dev/archive/refs/heads/master.zip" + + +def test_non_github_android_sha_keeps_git_wrapper(monkeypatch): + monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.setattr(checks, "_git_wrapper_get_latest_sha", lambda _config, _timeout: (False, "git failed")) + + result = checks.test_repo_sha( + { + "name": "gitee", + "method": GetShaMethod.PYGIT2, + "url": "https://gitee.com/kiramei/baas-dev.git", + "branch": "master", + }, + timeout=3.0, + ) + + assert result["success"] is False + assert result["error"] == "git failed" From 41805a4dac72076a9a992d157ebf4b044a529a16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 29 Jun 2026 18:58:47 +0800 Subject: [PATCH 69/98] Improve Android runtime update handling --- core/Baas_thread.py | 3 ++ core/ocr/baas_ocr_client/Client.py | 30 +++++++---- core/ocr/baas_ocr_client/server_installer.py | 40 ++++++++++++++ service/api/ws_trigger.py | 28 ++++++++++ service/runtime.py | 26 +++++++++ service/update/__init__.py | 2 + service/update/checks.py | 46 ++++++++++++++-- tests/core/ocr/test_android_runtime.py | 55 ++++++++++++++++++++ 8 files changed, 217 insertions(+), 13 deletions(-) create mode 100644 tests/core/ocr/test_android_runtime.py diff --git a/core/Baas_thread.py b/core/Baas_thread.py index a9b8bd0d3..b258210b2 100644 --- a/core/Baas_thread.py +++ b/core/Baas_thread.py @@ -1135,6 +1135,9 @@ def check_screen_ratio(self, width, height): if screen_ratio == (16, 9): return self.logger.warning(f"Screen Ratio: {width}:{height} is not a precise 16:9 screen, we recommend you to use a precise 16:9 screen.") + if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: + self.logger.warning("Android embedded mode accepts non-16:9 device screens.") + return if self._accept_resolution(width, height, 16, 9, 0.05): self.logger.info(f"Screen Ratio close to 16:9. Accept it.") return diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 5f9ddbe4c..1daf21801 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -113,31 +113,43 @@ def _android_server_library_path(root: str) -> str: def _prepare_android_runtime_folder(self) -> str: source_root = _server_folder_path() + internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() + target_root = os.path.join(internal_root, "ocr-runtime", _android_ocr_branch() or "android") if internal_root else "" + target_binary = self._android_server_library_path(target_root) if target_root else "" + target_version = os.path.join(target_root, ".baas-ocr-prebuild-sha") if target_root else "" + try: + with open(target_version, "r", encoding="utf-8") as fp: + target_sha = fp.read().strip() + except OSError: + target_sha = "" + if target_sha and target_binary and os.path.exists(target_binary): + source_version = os.path.join(source_root, ".baas-ocr-prebuild-sha") + try: + with open(source_version, "r", encoding="utf-8") as fp: + source_sha = fp.read().strip() + except OSError: + source_sha = "" + if not source_sha or source_sha == target_sha: + return target_root + source_binary = self._android_server_library_path(source_root) if not os.path.exists(source_binary): raise FileNotFoundError("Didn't find Android ocr server library.") - internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() if not internal_root: return source_root - target_root = os.path.join(internal_root, "ocr-runtime", _android_ocr_branch() or "android") source_version = os.path.join(source_root, ".baas-ocr-prebuild-sha") - target_version = os.path.join(target_root, ".baas-ocr-prebuild-sha") try: with open(source_version, "r", encoding="utf-8") as fp: source_sha = fp.read().strip() except OSError: source_sha = "" - try: - with open(target_version, "r", encoding="utf-8") as fp: - target_sha = fp.read().strip() - except OSError: - target_sha = "" - target_binary = self._android_server_library_path(target_root) if source_sha and source_sha == target_sha and os.path.exists(target_binary): return target_root + if not source_sha and target_sha and os.path.exists(target_binary): + return target_root if os.path.exists(target_root): shutil.rmtree(target_root, ignore_errors=True) diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index 57010da5b..31b4a0a03 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -94,6 +94,27 @@ def _server_binary_path() -> str: return os.path.join(SERVER_BIN_DIR, "BAAS_ocr_server.exe" if sys.platform == "win32" else "BAAS_ocr_server") +def _android_internal_runtime_root() -> str: + internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() + if not internal_root: + return "" + return os.path.join(internal_root, "ocr-runtime", TARGET_BRANCH) + + +def _android_internal_binary_path() -> str: + runtime_root = _android_internal_runtime_root() + if not runtime_root: + return "" + return os.path.join(runtime_root, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") + + +def _android_internal_version_file() -> str: + runtime_root = _android_internal_runtime_root() + if not runtime_root: + return "" + return os.path.join(runtime_root, ".baas-ocr-prebuild-sha") + + def _read_android_installed_sha() -> str: try: with open(ANDROID_VERSION_FILE, "r", encoding="utf-8") as fp: @@ -102,6 +123,17 @@ def _read_android_installed_sha() -> str: return "" +def _read_android_internal_sha() -> str: + version_file = _android_internal_version_file() + if not version_file: + return "" + try: + with open(version_file, "r", encoding="utf-8") as fp: + return fp.read().strip() + except OSError: + return "" + + def _get_android_remote_sha(branch: str) -> Optional[str]: try: response = requests.get(OCR_SERVER_PREBUILD_API_URL.format(branch=branch), timeout=15) @@ -154,6 +186,14 @@ def _install_android_prebuild(logger) -> None: remote_sha = _get_android_remote_sha(TARGET_BRANCH) local_sha = _read_android_installed_sha() server_binary_path = _server_binary_path() + internal_sha = _read_android_internal_sha() + internal_binary_path = _android_internal_binary_path() + if remote_sha and internal_sha == remote_sha and os.path.exists(internal_binary_path): + logger.info("Android Ocr Server runtime already available.") + return + if not remote_sha and internal_sha and os.path.exists(internal_binary_path): + logger.warning("Android OCR remote SHA unavailable; using internal runtime prebuild.") + return if remote_sha and local_sha == remote_sha and os.path.exists(server_binary_path): logger.info("Ocr Server No updates available.") return diff --git a/service/api/ws_trigger.py b/service/api/ws_trigger.py index 39c732834..c7d172072 100644 --- a/service/api/ws_trigger.py +++ b/service/api/ws_trigger.py @@ -57,6 +57,34 @@ async def websocket_trigger(websocket: WebSocket) -> None: }, ) continue + if cmd.command == "update_to_latest_stream": + try: + async for result in context.runtime.update_to_latest_stream(): + await send_stream_json( + websocket, + stream, + { + "type": "command_response", + "command": cmd.command, + "status": "ok", + "data": result, + "timestamp": cmd.timestamp, + }, + ) + response_payload = {"status": "ok", "data": {"done": True}} + except Exception as inner_exc: # noqa: BLE001 - returned to frontend + response_payload = {"status": "error", "error": str(inner_exc), "data": {"done": True}} + await send_stream_json( + websocket, + stream, + { + "type": "command_response", + "command": cmd.command, + **response_payload, + "timestamp": cmd.timestamp, + }, + ) + continue try: response_payload = await execute_command(cmd, binary_payload=binary_payload) except Exception as inner_exc: # noqa: BLE001 - returned to frontend diff --git a/service/runtime.py b/service/runtime.py index 6a1986a41..191d5778a 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -24,6 +24,7 @@ test_all_repo_sha, test_repo_sha, update_to_latest, + update_to_latest_with_progress, validate_cdk, write_setup_toml, ) @@ -721,6 +722,31 @@ async def update_to_latest(self): return result return {"status": "updated"} + async def update_to_latest_stream(self): + await self.stop_all_tasks() + loop = asyncio.get_running_loop() + queue: asyncio.Queue[Dict[str, Any]] = asyncio.Queue() + + def progress(stage: str, payload: Dict[str, Any]) -> None: + loop.call_soon_threadsafe(queue.put_nowait, {"type": "progress", "stage": stage, **payload}) + + def worker() -> None: + try: + result = update_to_latest_with_progress(None, progress=progress) + if not isinstance(result, dict): + result = {"status": "updated"} + loop.call_soon_threadsafe(queue.put_nowait, {"type": "result", "result": result}) + except Exception as exc: # noqa: BLE001 - surfaced through stream response + loop.call_soon_threadsafe(queue.put_nowait, {"type": "error", "error": str(exc)}) + + thread = threading.Thread(target=worker, name="baas-update-stream", daemon=True) + thread.start() + while True: + event = await queue.get() + yield event + if event.get("type") in {"result", "error"}: + break + def publish_version_update(self, payload: Dict[str, Any]) -> None: if payload: self._status_bus.publish_threadsafe({"version": payload}) diff --git a/service/update/__init__.py b/service/update/__init__.py index d23a96aaa..992d08258 100644 --- a/service/update/__init__.py +++ b/service/update/__init__.py @@ -8,6 +8,7 @@ test_all_repo_sha, test_repo_sha, update_to_latest, + update_to_latest_with_progress, validate_cdk, _setup_channel, write_setup_toml, @@ -23,6 +24,7 @@ "test_all_repo_sha", "test_repo_sha", "update_to_latest", + "update_to_latest_with_progress", "validate_cdk", "_setup_channel", "write_setup_toml", diff --git a/service/update/checks.py b/service/update/checks.py index 36d42829c..1b4e0fa52 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -9,7 +9,7 @@ import zipfile from pathlib import Path from urllib.parse import urlparse -from typing import Union, List, Tuple +from typing import Callable, Union, List, Tuple from dataclasses import dataclass from datetime import datetime, timezone from types import SimpleNamespace @@ -588,18 +588,29 @@ def _copy_android_update_tree(source_root: Path, target_root: Path) -> None: shutil.copy2(item, target) -def _android_update_to_latest(setup_path: Union[Path, None] = None) -> Dict[str, Any]: +def _android_update_to_latest( + setup_path: Union[Path, None] = None, + progress: Optional[Callable[[str, Dict[str, Any]], None]] = None, +) -> Dict[str, Any]: + def emit(stage: str, **payload: Any) -> None: + if progress: + progress(stage, payload) + + emit("read_setup") data, path = read_setup_toml(setup_path) data = migrate_to_current_schema(data) if data["general"].get("no_update", False): + emit("skipped", reason="no_update") return {"status": "skipped", "reason": "no_update"} channel = setup_channel(data) github_source = _github_archive_config(channel) archive_source = _android_archive_config(data, channel) + emit("fetch_sha", channel=channel, method=archive_source.get("name") or "github") ok, remote_sha = _github_api_get_latest_sha(github_source, 10.0) if not ok or not remote_sha: raise RuntimeError(f"Failed to fetch Android update SHA: {remote_sha}") + emit("remote_sha", sha=remote_sha) archive_url = _github_archive_url_for_config(archive_source) if not archive_url: @@ -608,23 +619,37 @@ def _android_update_to_latest(setup_path: Union[Path, None] = None) -> Dict[str, with tempfile.TemporaryDirectory(prefix="baas-android-update-") as tmp_dir: tmp = Path(tmp_dir) archive_path = tmp / "repo.zip" + emit("download_start", url=archive_url) response = requests.get(archive_url, stream=True, timeout=60) response.raise_for_status() + total_size = int(response.headers.get("content-length") or 0) + downloaded = 0 + last_reported = 0 with archive_path.open("wb") as fp: for chunk in response.iter_content(chunk_size=1024 * 256): if chunk: fp.write(chunk) + downloaded += len(chunk) + if total_size and downloaded - last_reported >= 1024 * 1024: + last_reported = downloaded + emit("download_progress", downloaded=downloaded, total=total_size) + emit("download_done", downloaded=downloaded, total=total_size) + emit("extract_start") with zipfile.ZipFile(archive_path) as archive: archive.extractall(tmp) roots = [child for child in tmp.iterdir() if child.is_dir()] if not roots: raise RuntimeError("Downloaded Android update archive is empty") + emit("copy_start", source=str(roots[0]), target=str(target_root)) _copy_android_update_tree(roots[0], target_root) + emit("copy_done") data["general"]["current_baas_sha"] = remote_sha data["general"]["channel"] = channel data["paths"]["baas_root_path"] = "." + emit("write_setup", path=str(path)) write_setup_toml(data, path) + emit("done", sha=remote_sha) return { "status": "updated", "current": remote_sha, @@ -634,11 +659,24 @@ def _android_update_to_latest(setup_path: Union[Path, None] = None) -> Dict[str, } -def update_to_latest(setup_path: Union[Path, None] = None): +def update_to_latest_with_progress( + setup_path: Union[Path, None] = None, + progress: Optional[Callable[[str, Dict[str, Any]], None]] = None, +): if _is_android_runtime(): - return _android_update_to_latest(setup_path) + return _android_update_to_latest(setup_path, progress=progress) + if progress: + progress("update_start", {}) data, path = read_setup_toml(setup_path) data = migrate_to_current_schema(data) if data["general"].get("no_update", False): + if progress: + progress("skipped", {"reason": "no_update"}) return {"status": "skipped", "reason": "no_update"} update_repo_to_latest(data, path) + if progress: + progress("done", {}) + + +def update_to_latest(setup_path: Union[Path, None] = None): + return update_to_latest_with_progress(setup_path) diff --git a/tests/core/ocr/test_android_runtime.py b/tests/core/ocr/test_android_runtime.py new file mode 100644 index 000000000..c45c71090 --- /dev/null +++ b/tests/core/ocr/test_android_runtime.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +from core.ocr.baas_ocr_client import Client +from core.ocr.baas_ocr_client import server_installer + + +class _Logger: + def info(self, _message): + return None + + def warning(self, _message): + return None + + +def test_android_ocr_installer_reuses_internal_runtime(monkeypatch, tmp_path): + branch = "android-x86_64" + remote_sha = "abc123" + internal_root = tmp_path / "files" + runtime_root = internal_root / "ocr-runtime" / branch + runtime_lib = runtime_root / "lib" / "x86_64" / "libBAAS_ocr_server.so" + runtime_lib.parent.mkdir(parents=True) + runtime_lib.write_bytes(b"runtime") + (runtime_root / ".baas-ocr-prebuild-sha").write_text(remote_sha, encoding="utf-8") + + source_root = tmp_path / "source" + monkeypatch.setenv("BAAS_ANDROID_INTERNAL_FILES_DIR", str(internal_root)) + monkeypatch.setattr(server_installer, "TARGET_BRANCH", branch) + monkeypatch.setattr(server_installer, "SERVER_BIN_DIR", str(source_root)) + monkeypatch.setattr(server_installer, "ANDROID_VERSION_FILE", str(source_root / ".baas-ocr-prebuild-sha")) + monkeypatch.setattr(server_installer, "_get_android_remote_sha", lambda _branch: remote_sha) + + def fail_download(*_args, **_kwargs): + raise AssertionError("installed Android OCR runtime should not be downloaded again") + + monkeypatch.setattr(server_installer, "_download_android_archive", fail_download) + + server_installer._install_android_prebuild(_Logger()) + + +def test_android_ocr_client_reuses_internal_runtime_without_source(monkeypatch, tmp_path): + branch = "android-x86_64" + runtime_root = tmp_path / "files" / "ocr-runtime" / branch + runtime_lib = runtime_root / "lib" / "x86_64" / "libBAAS_ocr_server.so" + runtime_lib.parent.mkdir(parents=True) + runtime_lib.write_bytes(b"runtime") + (runtime_root / ".baas-ocr-prebuild-sha").write_text("abc123", encoding="utf-8") + + source_root = tmp_path / "source" + monkeypatch.setenv("BAAS_ANDROID_INTERNAL_FILES_DIR", str(tmp_path / "files")) + monkeypatch.setattr(Client, "_server_folder_path", lambda: str(source_root)) + monkeypatch.setattr(Client, "_android_ocr_branch", lambda: branch) + + client = Client.BaasOcrClient.__new__(Client.BaasOcrClient) + + assert client._prepare_android_runtime_folder() == str(runtime_root) From a157e65f3088722df24e7a000874c27489ed34e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 29 Jun 2026 19:04:41 +0800 Subject: [PATCH 70/98] Report Android update download progress --- service/update/checks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/update/checks.py b/service/update/checks.py index 1b4e0fa52..f279239fc 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -630,7 +630,7 @@ def emit(stage: str, **payload: Any) -> None: if chunk: fp.write(chunk) downloaded += len(chunk) - if total_size and downloaded - last_reported >= 1024 * 1024: + if downloaded - last_reported >= 1024 * 1024: last_reported = downloaded emit("download_progress", downloaded=downloaded, total=total_size) emit("download_done", downloaded=downloaded, total=total_size) From 08d22e53ed86c4dba4525f119bdfdbceaaf214a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 29 Jun 2026 21:29:24 +0800 Subject: [PATCH 71/98] Adjust Android display size during script runs --- service/runtime.py | 86 +++++++++++++++++++- tests/service/test_android_display_resize.py | 65 +++++++++++++++ 2 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 tests/service/test_android_display_resize.py diff --git a/service/runtime.py b/service/runtime.py index 191d5778a..9069c220e 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -51,6 +51,10 @@ MAX_SHA_TEST_TIMEOUT = 10.0 +def _is_android_runtime() -> bool: + return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} + + def _coerce_sha_test_timeout(timeout: Any = None) -> float: try: value = float(timeout) @@ -80,6 +84,68 @@ def emit(self, payload): # noqa: ANN001 - Qt compatible signature self._callback(payload) +class _AndroidDisplayResizeGuard: + def __init__(self) -> None: + self._lock = threading.Lock() + self._active_count = 0 + + @staticmethod + def _target_size() -> str: + return os.getenv("BAAS_ANDROID_WM_SIZE", "720x1280").strip() or "720x1280" + + @staticmethod + def _serial() -> str: + return os.getenv("BAAS_ANDROID_U2_SERIAL", "127.0.0.1:7912").strip() or "127.0.0.1:7912" + + @staticmethod + def _shell(command: str) -> Any: + import uiautomator2 as u2 + + serial = _AndroidDisplayResizeGuard._serial() + target = serial if serial.startswith(("http://", "https://")) else f"http://{serial}" + return u2.connect(target).shell(command) + + def activate(self, logger=None) -> None: + if not _is_android_runtime(): + return + with self._lock: + self._active_count += 1 + if self._active_count != 1: + return + target_size = self._target_size() + try: + current = self._shell("wm size") + if logger is not None: + logger.info(f"Android display size before BAAS run: {current}") + logger.info(f"Set Android display size to {target_size}.") + self._shell(f"wm size {target_size}") + except Exception as exc: + with self._lock: + self._active_count = max(0, self._active_count - 1) + if logger is not None: + logger.error("Failed to set Android display size.") + logger.error(exc) + raise + + def release(self, logger=None) -> None: + if not _is_android_runtime(): + return + with self._lock: + if self._active_count <= 0: + return + self._active_count -= 1 + if self._active_count != 0: + return + try: + if logger is not None: + logger.info("Reset Android display size after BAAS run.") + self._shell("wm size reset") + except Exception as exc: + if logger is not None: + logger.error("Failed to reset Android display size.") + logger.error(exc) + + def _default_status(config_id: str) -> Dict[str, Any]: return { "config_id" : config_id, @@ -125,6 +191,7 @@ def __init__(self, project_root: Path, loop: Optional[asyncio.AbstractEventLoop] self._exit_signal: Optional[_SignalHook] = None self._event_map_inv: Dict[str, Dict[str, str]] = {} self._android_active_config_id: Optional[str] = None + self._android_display_guard = _AndroidDisplayResizeGuard() self.is_all_data_initialized: bool = False def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: @@ -285,14 +352,21 @@ async def start_scheduler(self, config_id: str, set_log=None) -> Dict[str, Any]: if set_log: set_log() if session.thread and session.thread.is_alive(): return {"status": "already-running", "config_id": config_id} - init_ok = await run_blocking(session.baas.init_all_data) + await run_blocking(self._android_display_guard.activate, session.baas.logger) + try: + init_ok = await run_blocking(session.baas.init_all_data) + except Exception: + await run_blocking(self._android_display_guard.release, session.baas.logger) + raise if not init_ok: + await run_blocking(self._android_display_guard.release, session.baas.logger) raise RuntimeError("Baas_thread initialization failed") def runner() -> None: try: session.baas.send("start") finally: + self._android_display_guard.release(session.baas.logger) session.thread = None self._update_status(config_id, running=False, is_flag_run=session.baas.flag_run, current_task=None, waiting_tasks=[]) @@ -376,7 +450,14 @@ async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict needs_init = session.baas.scheduler is None if needs_init: - await run_blocking(baas.init_all_data) + await run_blocking(self._android_display_guard.activate, baas.logger) + try: + await run_blocking(baas.init_all_data) + except Exception: + await run_blocking(self._android_display_guard.release, baas.logger) + raise + elif _is_android_runtime(): + await run_blocking(self._android_display_guard.activate, baas.logger) def _call() -> None: try: @@ -391,6 +472,7 @@ def _call() -> None: baas.flag_run = True baas.send("solve", task_name) finally: + self._android_display_guard.release(baas.logger) session.thread = None assert session is not None self._update_status( diff --git a/tests/service/test_android_display_resize.py b/tests/service/test_android_display_resize.py new file mode 100644 index 000000000..49d8d3cbe --- /dev/null +++ b/tests/service/test_android_display_resize.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import sys +from types import SimpleNamespace + +from service.runtime import _AndroidDisplayResizeGuard + + +class _FakeDevice: + def __init__(self, calls): + self.calls = calls + + def shell(self, command: str): + self.calls.append(command) + if command == "wm size": + return "Physical size: 1080x2400" + return "" + + +def test_android_display_guard_is_noop_outside_android(monkeypatch): + monkeypatch.delenv("BAAS_ANDROID", raising=False) + guard = _AndroidDisplayResizeGuard() + + guard.activate() + guard.release() + + +def test_android_display_guard_sets_and_resets_size(monkeypatch): + calls = [] + + def connect(target): + assert target == "http://127.0.0.1:7912" + return _FakeDevice(calls) + + monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.delenv("BAAS_ANDROID_WM_SIZE", raising=False) + monkeypatch.delenv("BAAS_ANDROID_U2_SERIAL", raising=False) + monkeypatch.setitem(sys.modules, "uiautomator2", SimpleNamespace(connect=connect)) + + guard = _AndroidDisplayResizeGuard() + guard.activate() + guard.release() + + assert calls == ["wm size", "wm size 720x1280", "wm size reset"] + + +def test_android_display_guard_uses_reference_count(monkeypatch): + calls = [] + + monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.setenv("BAAS_ANDROID_WM_SIZE", "800x1280") + monkeypatch.setenv("BAAS_ANDROID_U2_SERIAL", "http://localhost:7912") + monkeypatch.setitem( + sys.modules, + "uiautomator2", + SimpleNamespace(connect=lambda _target: _FakeDevice(calls)), + ) + + guard = _AndroidDisplayResizeGuard() + guard.activate() + guard.activate() + guard.release() + guard.release() + + assert calls == ["wm size", "wm size 800x1280", "wm size reset"] From 585549f7add8d3ffbaa8646adb39e11f61c81208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 30 Jun 2026 23:40:19 +0800 Subject: [PATCH 72/98] Fix: Create service locks lazily --- service/conf/manager.py | 15 ++++++++++----- service/runtime.py | 15 ++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/service/conf/manager.py b/service/conf/manager.py index e70fa1b26..6ff7da4c6 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -34,7 +34,7 @@ def __init__(self, project_root: Path, loop: Union[asyncio.AbstractEventLoop, No self._root = project_root self._config_root = self._root / "config" self._paths = ResourcePathResolver(project_root) - self._lock = asyncio.Lock() + self._lock: Optional[asyncio.Lock] = None self._snapshots: Dict[ResourceKey, ResourceSnapshot] = {} self._mtimes: Dict[ResourceKey, float] = {} self._update_bus = BroadcastChannel(loop) @@ -52,6 +52,11 @@ def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._update_bus.set_loop(loop) + def _async_lock(self) -> asyncio.Lock: + if self._lock is None: + self._lock = asyncio.Lock() + return self._lock + # ------------------------------------------------------------------ # basic filesystem helpers # ------------------------------------------------------------------ @@ -82,7 +87,7 @@ async def get_config_list(self) -> ResourceSnapshot: Returns: ResourceSnapshot whose data is a list of config ids and whose timestamp is current time. """ - async with self._lock: + async with self._async_lock(): ids = self.list_config_ids() return ResourceSnapshot(copy.deepcopy(ids), unix_timestamp_ms()) @@ -270,7 +275,7 @@ async def get_snapshot(self, resource: str, resource_id: Optional[str]) -> Resou Deep-copied ResourceSnapshot safe for callers to mutate. """ key = (resource, resource_id) - async with self._lock: + async with self._async_lock(): snapshot = self._snapshots.get(key) if snapshot is None: snapshot = await asyncio.to_thread(self._load_from_disk, resource, resource_id) @@ -310,7 +315,7 @@ async def apply_patch( """ key = (resource, resource_id) - async with self._lock: + async with self._async_lock(): snapshot = self._snapshots.get(key) if snapshot is None: snapshot = await asyncio.to_thread(self._load_from_disk, resource, resource_id) @@ -433,7 +438,7 @@ async def _check_resource(self, resource: str, resource_id: Optional[str]) -> No return if mtime <= previous: return - async with self._lock: + async with self._async_lock(): old_snapshot = self._snapshots.get(key) fresh_snapshot = self._load_from_disk(resource, resource_id) if old_snapshot is None: diff --git a/service/runtime.py b/service/runtime.py index 9069c220e..e932d7223 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -182,7 +182,7 @@ def __init__(self, project_root: Path, loop: Optional[asyncio.AbstractEventLoop] self._status_lock = threading.Lock() self._sessions: Dict[str, ConfigSession] = {} self._statuses: Dict[str, Dict[str, Any]] = {} - self._lock = asyncio.Lock() + self._lock: Optional[asyncio.Lock] = None self._main: Optional["Main"] = None self._baas: Optional["Baas_thread"] = None self._baas_thread: Optional[threading.Thread] = None @@ -203,6 +203,11 @@ def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._status_bus.set_loop(loop) + def _async_lock(self) -> asyncio.Lock: + if self._lock is None: + self._lock = asyncio.Lock() + return self._lock + # ------------------------------------------------------------------ # public utility accessors # ------------------------------------------------------------------ @@ -331,7 +336,7 @@ async def get_session(self, config_id: str): Returns: ConfigSession bound to the config id. """ - async with self._lock: + async with self._async_lock(): session = self._sessions.get(config_id) if session is None: session = self._get_or_create_session(config_id) @@ -347,7 +352,7 @@ async def start_scheduler(self, config_id: str, set_log=None) -> Dict[str, Any]: Returns: Status payload consumed by `/ws/trigger`. """ - async with self._lock: + async with self._async_lock(): session = self._get_or_create_session(config_id) if set_log: set_log() if session.thread and session.thread.is_alive(): @@ -384,7 +389,7 @@ def runner() -> None: async def stop_scheduler(self, config_id: str) -> Dict[str, Any]: """Stop the scheduler thread for a config if it is running.""" - async with self._lock: + async with self._async_lock(): session = self._sessions.get(config_id) if session is None: return {"status": "unknown-config", "config_id": config_id} @@ -439,7 +444,7 @@ async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict if task_name in _TASK_ALIAS: _original_task_name = task_name task_name = _TASK_ALIAS[task_name] - async with self._lock: + async with self._async_lock(): session = self._sessions.get(config_id) if session is None: session = self._get_or_create_session(config_id) From 35dafe3d4670e7cd94ca8c3623ed38a6744cd875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 30 Jun 2026 23:41:16 +0800 Subject: [PATCH 73/98] Fix: Speed up Android cafe interactions --- module/cafe_reward.py | 13 +++++++------ tests/module/test_cafe_reward_match.py | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/module/cafe_reward.py b/module/cafe_reward.py index 2f3eecd2b..8a1dd6602 100644 --- a/module/cafe_reward.py +++ b/module/cafe_reward.py @@ -199,7 +199,7 @@ def screenshot_thread(self, delay): def gift_to_cafe(self): if self.is_android_device: self.click(1240, 574, wait_over=True) - picture.co_detect(self, "cafe", None, None, None, False, time_out=15) + time.sleep(0.25) return img_possibles = { @@ -223,13 +223,14 @@ def swipe_gift_thread(self, duration, ret_queue): self.swipe(131, 660, 1280, 660, duration=duration) ret_queue.put(round(time.time() - start_t, 3)) -def swipe_gift_and_screenshot(self): - shotDelay = self.config.cafe_reward_interaction_shot_delay - if self.is_android_device: - t1 = threading.Thread(target=screenshot_thread, args=(self, shotDelay)) +def swipe_gift_and_screenshot(self): + shotDelay = self.config.cafe_reward_interaction_shot_delay + if self.is_android_device: + t1 = threading.Thread(target=screenshot_thread, args=(self, shotDelay)) t1.start() start_t = time.time() - self.u2_swipe(131, 660, 1280, 660, duration=0.5) + self.u2_swipe(131, 660, 1280, 660, duration=0.3) + t1.join(timeout=max(1.0, shotDelay + 1.0)) swipe_t = round(time.time() - start_t, 3) self.logger.info("Gift swipe duration : [ " + str(swipe_t) + " ]") return swipe_t diff --git a/tests/module/test_cafe_reward_match.py b/tests/module/test_cafe_reward_match.py index 136382701..b8d65363b 100644 --- a/tests/module/test_cafe_reward_match.py +++ b/tests/module/test_cafe_reward_match.py @@ -60,3 +60,23 @@ def test_cafe_reward_match_android_skips_template_fallback(monkeypatch): assert elapsed < 0.2 assert matches == [] assert cafe_reward._happy_face_templates is None + + +def test_android_gift_to_cafe_avoids_slow_detection(monkeypatch): + calls = [] + + class FakeBaas: + is_android_device = True + + def click(self, *args, **kwargs): + calls.append(("click", args, kwargs)) + + def fail_detect(*_args, **_kwargs): + raise AssertionError("Android gift_to_cafe should not use co_detect") + + monkeypatch.setattr(cafe_reward.picture, "co_detect", fail_detect) + monkeypatch.setattr(cafe_reward.time, "sleep", lambda _seconds: None) + + cafe_reward.gift_to_cafe(FakeBaas()) + + assert calls == [("click", (1240, 574), {"wait_over": True})] From a24aedb0baf0b7870f59b3be1fd01426953e3376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 30 Jun 2026 23:42:29 +0800 Subject: [PATCH 74/98] Refactor: Inject service runtime behavior inside service --- service/injection.py | 157 +++++++++++++++++++++++++++++++++++++++++++ service/runtime.py | 3 + 2 files changed, 160 insertions(+) create mode 100644 service/injection.py diff --git a/service/injection.py b/service/injection.py new file mode 100644 index 000000000..498f4b640 --- /dev/null +++ b/service/injection.py @@ -0,0 +1,157 @@ +from __future__ import annotations + +import os +import queue +import traceback +from datetime import datetime +from functools import wraps +from inspect import signature +from typing import Any + + +_APPLIED = False + + +def _supports_parameter(callable_obj: Any, name: str) -> bool: + try: + return name in signature(callable_obj).parameters + except (TypeError, ValueError): + return False + + +def _ensure_logger_extensions(logger: Any, jsonify: bool = False) -> None: + if not hasattr(logger, "log_collector"): + logger.log_collector = queue.Queue() + if not hasattr(logger, "jsonify"): + logger.jsonify = False + if jsonify: + logger.jsonify = True + + +def _patch_logger() -> None: + from core import utils + + logger_cls = utils.Logger + if getattr(logger_cls, "_baas_service_injected", False): + return + + original_init = logger_cls.__init__ + original_log = logger_cls.log + + @wraps(original_init) + def init(self, logger_signal, jsonify=False): + if _supports_parameter(original_init, "jsonify"): + original_init(self, logger_signal, jsonify=jsonify) + else: + original_init(self, logger_signal) + _ensure_logger_extensions(self, jsonify=jsonify) + + @wraps(original_log) + def log(self, level, message): + _ensure_logger_extensions(self) + if getattr(self, "jsonify", False): + self.log_collector.put({ + "time": datetime.now(), + "level": level, + "message": message, + }) + return + return original_log(self, level, message) + + logger_cls.__init__ = init + logger_cls.log = log + logger_cls._baas_service_injected = True + + +def _patch_main() -> None: + import main as main_module + from core.ocr import ocr + from core.ocr.baas_ocr_client.server_installer import check_git + from core.utils import Logger + from core.config.config_set import ConfigSet + + main_cls = main_module.Main + if getattr(main_cls, "_baas_service_injected", False): + return + + def init(self, logger_signal=None, ocr_needed=None, **kwargs): + self.ocr_needed = ocr_needed + self.ocr = None + self.logger = Logger(logger_signal, jsonify=kwargs.get("jsonify", False)) + self.project_dir = os.path.abspath(os.path.dirname(main_module.__file__)) + self.logger.info(self.project_dir) + if not kwargs.get("lazy_data", False): + self.init_all_data() + self.threads = {} + + def init_all_data(self, need_ocr_update_check=True): + if not self.init_ocr(need_ocr_update_check=need_ocr_update_check): + if os.getenv("BAAS_ALLOW_MISSING_OCR", "").strip().lower() in {"1", "true", "yes", "on"}: + self.logger.warning("Ocr Init Incomplete. Continuing because missing OCR is allowed.") + else: + self.logger.error("Ocr Init Incomplete Please restart .") + return False + self.init_static_config() + self.logger.info("-- All Data Initialization Complete Script ready--") + return True + + def init_ocr(self, need_ocr_update_check=True): + if need_ocr_update_check: + try: + check_git(self.logger) + except Exception: + self.logger.error("OCR Update Failed.") + self.logger.error(traceback.format_exc()) + self.logger.info("Try to Start OCR Server Without Update.") + try: + self.ocr = ocr.Baas_ocr(logger=self.logger, ocr_needed=self.ocr_needed) + return True + except Exception: + self.logger.error("OCR initialization failed") + self.logger.error(traceback.format_exc()) + return False + + def init_static_config(self): + try: + ConfigSet.static_config = ConfigSet.static_config + if ConfigSet.static_config is None: + ConfigSet.static_config = ConfigSet().static_config + return True + except Exception: + self.logger.error("Static Config initialization failed") + self.logger.error(traceback.format_exc()) + return False + + main_cls.__init__ = init + main_cls.init_all_data = init_all_data + main_cls.init_ocr = init_ocr + if not hasattr(main_cls, "init_static_config"): + main_cls.init_static_config = init_static_config + main_cls._baas_service_injected = True + + +def _patch_baas_thread() -> None: + from core.Baas_thread import Baas_thread + + if getattr(Baas_thread, "_baas_service_injected", False): + return + + original_init = Baas_thread.__init__ + + @wraps(original_init) + def init(self, config, logger_signal=None, button_signal=None, update_signal=None, exit_signal=None, **kwargs): + original_init(self, config, logger_signal, button_signal, update_signal, exit_signal) + _ensure_logger_extensions(self.logger, jsonify=kwargs.get("jsonify", False)) + + Baas_thread.__init__ = init + Baas_thread._baas_service_injected = True + + +def apply_service_injections() -> None: + global _APPLIED + if _APPLIED: + return + _patch_logger() + _patch_main() + _patch_baas_thread() + _APPLIED = True diff --git a/service/runtime.py b/service/runtime.py index e932d7223..6e12fddbf 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -15,6 +15,7 @@ from .conf import ConfigInitializer from .conf import resolve_config_dir +from .injection import apply_service_injections from .utils.broadcast import BroadcastChannel from .utils.timestamps import unix_timestamp_ms from .update import ( @@ -263,6 +264,7 @@ def unsubscribe_status(self, queue_obj: asyncio.Queue) -> None: def _ensure_main_sync(self) -> None: if self._main is not None: return + apply_service_injections() from main import Main self._main = Main(ocr_needed=["en-us", "zh-cn"], jsonify=True, lazy_data=True) @@ -293,6 +295,7 @@ def _get_or_create_session(self, config_id: str) -> ConfigSession: session = self._sessions.get(config_id) if session is not None: return session + apply_service_injections() from core.Baas_thread import Baas_thread from core.config.config_set import ConfigSet From 2766c380e12adbef6af59d824bf1fc7c7deced59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 30 Jun 2026 23:49:59 +0800 Subject: [PATCH 75/98] Refactor: Isolate service runtime patches --- service/__init__.py | 4 + service/android_ocr_client.py | 494 +++++++++++++++++++++++++ service/android_ocr_installer.py | 437 ++++++++++++++++++++++ service/conf/initializer.py | 4 + service/injection.py | 314 +++++++++++++++- tests/conftest.py | 37 ++ tests/core/ocr/test_android_runtime.py | 4 +- 7 files changed, 1290 insertions(+), 4 deletions(-) create mode 100644 service/android_ocr_client.py create mode 100644 service/android_ocr_installer.py create mode 100644 tests/conftest.py diff --git a/service/__init__.py b/service/__init__.py index e5ac92168..7607c1a6a 100644 --- a/service/__init__.py +++ b/service/__init__.py @@ -54,6 +54,10 @@ def emit(self, record): category=UserWarning ) +from .injection import prepare_service_imports + +prepare_service_imports() + from .app import app, context __all__ = ['app', 'context', 'set_log_format'] diff --git a/service/android_ocr_client.py b/service/android_ocr_client.py new file mode 100644 index 000000000..395c41637 --- /dev/null +++ b/service/android_ocr_client.py @@ -0,0 +1,494 @@ +import os +import cv2 +import sys +import json +import time +import shutil +import datetime +import platform +import requests +import subprocess +import ctypes +import threading +from typing import Optional + +from core.exception import SharedMemoryError, OcrInternalError + +try: + from core.ipc_manager import SharedMemory +except Exception: # noqa: BLE001 - Android service uses multipart OCR payloads. + class SharedMemory: + @staticmethod + def get(_name): + return None + + @staticmethod + def release(_name): + return None + + @staticmethod + def set_data(*_args, **_kwargs): + raise SharedMemoryError("shared memory is not available in Android service runtime") + + +class ServerConfig: + def __init__(self): + self.config = None + self.config_path = os.path.join(BaasOcrClient.server_folder_path, "config", "global_setting.json") + self.host = None + self.port = None + self.server_is_remote = False + self.base_url = None + self.__init_config() + self.init_url() + + def __init_config(self): + if not os.path.exists(self.config_path): + default_config_file_path = os.path.join(BaasOcrClient.server_folder_path, "resource", "global_setting.json") + if not os.path.exists(default_config_file_path): + raise FileNotFoundError("Didn't find default config file.") + os.mkdir(os.path.dirname(self.config_path)) + shutil.copy(default_config_file_path, self.config_path) + with open(self.config_path, "r") as f: + self.config = json.load(f) + + def init_url(self): + self.host = self.config["ocr"]["server"]["host"] + self.port = self.config["ocr"]["server"]["port"] + self.base_url = f"http://{self.host}:{self.port}" + # check is remote + if self.host != "localhost" and self.host != "127.0.0.1": + self.server_is_remote = True + + def save(self): + with open(self.config_path, "w") as f: + json.dump(self.config, f, indent=4) + +def _android_ocr_branch() -> Optional[str]: + if os.getenv("BAAS_ANDROID", "").lower() not in {"1", "true", "yes", "on"}: + return None + arch = platform.machine().lower() + if arch in {"aarch64", "arm64"}: + return "android-arm64-v8a" + if arch in {"x86_64", "amd64"}: + return "android-x86_64" + return None + + +def _is_android_runtime() -> bool: + return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} + + +def _android_library_abi_dir() -> str: + android_branch = _android_ocr_branch() + if android_branch == "android-arm64-v8a": + return "arm64-v8a" + if android_branch == "android-x86_64": + return "x86_64" + raise RuntimeError("Unsupported Android OCR architecture.") + + +ANDROID_LIBCXX_NAME = "libc++_baasxx.so" + + +def _server_folder_path() -> str: + base = os.path.dirname(__file__) + android_branch = _android_ocr_branch() + if android_branch: + return os.path.join(base, "bin-android", android_branch) + return os.path.join(base, "bin") + + +class BaasOcrClient: + server_folder_path = _server_folder_path() + executable_name = "BAAS_ocr_server" + if sys.platform == "win32": + executable_name += ".exe" + + def __init__(self): + self._android_server_lib = None + self._android_server_thread = None + if _is_android_runtime(): + self.server_folder_path = self._prepare_android_runtime_folder() + BaasOcrClient.server_folder_path = self.server_folder_path + self.executable_name = "libBAAS_ocr_server.so" + self.exe_path = self._android_server_library_path(self.server_folder_path) + else: + self.exe_path = os.path.join(self.server_folder_path, self.executable_name) + if not os.path.exists(self.exe_path): + raise FileNotFoundError("Didn't find ocr server executable.") + self.config = ServerConfig() + self.server_process = None + self._android_dependency_libs = [] + self.clear_log() + + @staticmethod + def _android_server_library_path(root: str) -> str: + return os.path.join(root, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") + + def _prepare_android_runtime_folder(self) -> str: + source_root = _server_folder_path() + internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() + target_root = os.path.join(internal_root, "ocr-runtime", _android_ocr_branch() or "android") if internal_root else "" + target_binary = self._android_server_library_path(target_root) if target_root else "" + target_version = os.path.join(target_root, ".baas-ocr-prebuild-sha") if target_root else "" + try: + with open(target_version, "r", encoding="utf-8") as fp: + target_sha = fp.read().strip() + except OSError: + target_sha = "" + if target_sha and target_binary and os.path.exists(target_binary): + source_version = os.path.join(source_root, ".baas-ocr-prebuild-sha") + try: + with open(source_version, "r", encoding="utf-8") as fp: + source_sha = fp.read().strip() + except OSError: + source_sha = "" + if not source_sha or source_sha == target_sha: + return target_root + + source_binary = self._android_server_library_path(source_root) + if not os.path.exists(source_binary): + raise FileNotFoundError("Didn't find Android ocr server library.") + + if not internal_root: + return source_root + + source_version = os.path.join(source_root, ".baas-ocr-prebuild-sha") + try: + with open(source_version, "r", encoding="utf-8") as fp: + source_sha = fp.read().strip() + except OSError: + source_sha = "" + + if source_sha and source_sha == target_sha and os.path.exists(target_binary): + return target_root + if not source_sha and target_sha and os.path.exists(target_binary): + return target_root + + if os.path.exists(target_root): + shutil.rmtree(target_root, ignore_errors=True) + shutil.copytree(source_root, target_root) + native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() + native_libcxx = os.path.join(native_lib_dir, "libc++_shared.so") if native_lib_dir else "" + target_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), "libc++_shared.so") + target_baas_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), ANDROID_LIBCXX_NAME) + source_libcxx = native_libcxx if native_libcxx and os.path.exists(native_libcxx) else target_libcxx + if source_libcxx and os.path.exists(source_libcxx): + if os.path.abspath(source_libcxx) != os.path.abspath(target_baas_libcxx): + shutil.copy2(source_libcxx, target_baas_libcxx) + self._replace_library_name(target_baas_libcxx, "libc++_shared.so", ANDROID_LIBCXX_NAME) + self._replace_library_name(self._android_server_library_path(target_root), "libc++_shared.so", ANDROID_LIBCXX_NAME) + os.chmod(self._android_server_library_path(target_root), 0o755) + return target_root + + @staticmethod + def _replace_library_name(path: str, old_name: str, new_name: str) -> None: + old = old_name.encode("utf-8") + new = new_name.encode("utf-8") + if len(old) != len(new): + raise ValueError("Replacement library name must have the same byte length.") + with open(path, "rb") as fp: + data = fp.read() + patched = data.replace(old, new) + if patched != data: + with open(path, "wb") as fp: + fp.write(patched) + + # clear log since time_distance days ago + def clear_log(self, time_distance=7): + log_folder_path = os.path.join(self.server_folder_path, "output") + if not os.path.exists(log_folder_path): + return + for name in os.listdir(log_folder_path): + path = os.path.join(log_folder_path, name) + if os.path.isdir(path): + # name is yyyy-mm-dd_hh.mm.ss + name = name.split("_")[0] + year, month, day = map(int, name.split("-")) + time_dis = (datetime.datetime.now() - datetime.datetime(year, month, day)).days + if time_dis >= time_distance: + shutil.rmtree(path) + + def create_shared_memory(self, name, size): + url = self.config.base_url + "/create_shared_memory" + pass_name = "/" + name if sys.platform != "win32" else name + data = { + "shared_memory_name": pass_name, + "size": size + } + ret = requests.post(url, json=data) + if ret.status_code == 200: + SharedMemory.get(name) + return ret + + def release_shared_memory(self, name): + url = self.config.base_url + "/release_shared_memory" + pass_name = "/" + name if sys.platform != "win32" else name + data = { + "name": pass_name + } + SharedMemory.release(name) + return requests.post(url, json=data) + + def enable_thread_pool(self, count=4): + url = self.config.base_url + "/enable_thread_pool" + data = { + "thread_count": count + } + return requests.post(url, json=data) + + def disable_thread_pool(self): + url = self.config.base_url + "/disable_thread_pool" + return requests.post(url) + + def start_server(self): + if self.server_process is not None: + return + if _is_android_runtime(): + self._start_android_server() + return + # chmod +x BAAS_ocr_server + if sys.platform == "linux": + subprocess.run(["chmod", "+x", self.exe_path]) + try: + self.server_process = subprocess.Popen( + self.exe_path, + cwd=self.server_folder_path, + stdin=subprocess.PIPE, + stdout=subprocess.DEVNULL, + creationflags=subprocess.CREATE_NO_WINDOW if sys.platform == "win32" else 0, + text=True + ) + except Exception: + self.server_process = subprocess.Popen( + [self.exe_path], + cwd=self.server_folder_path, + stdin=subprocess.PIPE, + stdout=subprocess.DEVNULL, + creationflags=subprocess.CREATE_NO_WINDOW if sys.platform == "win32" else 0, + text=True + ) + # wait for server start + for _ in range(0, 30): + try: + ret = requests.get(self.config.base_url) + if ret.status_code == 200: + break + except requests.exceptions.ConnectionError as e: + if _ == 29: + raise RuntimeError("Fail to start ocr server. " + e.__str__()) + time.sleep(0.1) + + def _start_android_server(self): + lib_dir = os.path.dirname(self.exe_path) + native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() + dependency_paths = [] + baas_libcxx = os.path.join(lib_dir, ANDROID_LIBCXX_NAME) + if os.path.exists(baas_libcxx): + dependency_paths.append(baas_libcxx) + elif os.path.exists(os.path.join(lib_dir, "libc++_shared.so")): + dependency_paths.append(os.path.join(lib_dir, "libc++_shared.so")) + dependency_paths.extend(os.path.join(lib_dir, name) for name in ["libonnxruntime.so", "libopencv_java4.so"]) + loaded = set() + for path in dependency_paths: + if path in loaded: + continue + if os.path.exists(path): + self._android_dependency_libs.append(ctypes.CDLL(path, mode=ctypes.RTLD_GLOBAL)) + loaded.add(path) + try: + server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) + except OSError: + self._android_system_load(self.exe_path) + server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) + server_lib.start_server.argtypes = [ctypes.c_char_p] + server_lib.start_server.restype = None + server_lib.stop_server.argtypes = [] + server_lib.stop_server.restype = None + self._android_server_lib = server_lib + server_root = os.fsencode(self.server_folder_path) + self._android_server_thread = threading.Thread( + target=lambda: server_lib.start_server(server_root), + name="baas-ocr-android-server", + daemon=True, + ) + self._android_server_thread.start() + self.server_process = self._android_server_thread + for _ in range(0, 100): + try: + ret = requests.get(self.config.base_url, timeout=1) + if ret.status_code == 200: + break + except requests.exceptions.RequestException as e: + if _ == 99: + raise RuntimeError("Fail to start ocr server. " + e.__str__()) + time.sleep(0.1) + + @staticmethod + def _android_system_load(path: str) -> None: + from java import jclass + + jclass("io.github.kiramei.baas_tauri.NativeLoader").load(path) + + def stop_server(self): + if _is_android_runtime(): + if self._android_server_lib is not None: + self._android_server_lib.stop_server() + if self._android_server_thread is not None: + self._android_server_thread.join(timeout=10) + self.server_process = None + self._android_server_thread = None + self._android_server_lib = None + self._android_dependency_libs = [] + return + self.server_process.stdin.write("exit\n") + self.server_process.stdin.flush() + return_code = self.server_process.wait(10) + if return_code != 0: + raise RuntimeError("Fail to stop server.") + self.server_process.stdin.close() + self.server_process = None + + def init_model(self, language: list[str], gpu_id=-1, num_thread=4, EnableCpuMemoryArena=False): + url = self.config.base_url + "/init_model" + data = { + "language": language, + "gpu_id": gpu_id, + "num_thread": num_thread, + "EnableCpuMemoryArena": EnableCpuMemoryArena + } + return requests.post(url, json=data) + + def release_model(self, language: list[str]): + url = self.config.base_url + "/release_model" + data = { + "language": language + } + return requests.post(url, json=data) + + def release_all(self): + url = self.config.base_url + "/release_all" + return requests.get(url) + + def ocr(self, + language: str, + origin_image=None, + candidates: str = "", + pass_method: int = 0, + local_path: str = "", + ret_options: int = 0b100, + shared_memory_name: str = "" + ): + url = self.config.base_url + "/ocr" + data = { + "language": language, + "candidates": candidates, + "image": { + "pass_method": pass_method, + }, + "ret_options": ret_options + } + self.get_request_data(data, pass_method, origin_image, local_path, shared_memory_name) + if pass_method in [0, 2]: + return requests.post(url, json=data) + elif pass_method == 1: + image_bytes = self.get_image_bytes(origin_image) + files = { + "data": (None, json.dumps(data), "application/json"), + "image": ("image.png", image_bytes, "image/png") + } + return requests.post(url, files=files) + + def get_text_boxes( + self, + language: str, + origin_image=None, + pass_method: int = 0, + local_path: str = "", + shared_memory_name: str = "" + ): + url = self.config.base_url + "/get_text_boxes" + data = { + "language": language, + "image": { + "pass_method": pass_method, + }, + } + self.get_request_data(data, pass_method, origin_image, local_path, shared_memory_name) + if pass_method in [0, 2]: + return requests.post(url, json=data) + elif pass_method == 1: + image_bytes = self.get_image_bytes(origin_image) + files = { + "data": (None, json.dumps(data), "application/json"), + "image": ("image.png", image_bytes, "image/png") + } + return requests.post(url, files=files) + + @staticmethod + def get_request_data( + data, + pass_method, + origin_image=None, + local_path: str = "", + shared_memory_name: str = "" + ): + if pass_method == 0: + col = origin_image.shape[1] + row = origin_image.shape[0] + size = col * row * 3 + SharedMemory.set_data(shared_memory_name, origin_image.tobytes(), size) + data["image"]["shared_memory_name"] = "/" + shared_memory_name if sys.platform != "win32" \ + else shared_memory_name + data["image"]["resolution"] = [col, row] + elif pass_method == 1: + pass + elif pass_method == 2: + data["image"]["local_path"] = local_path + else: + raise OcrInternalError(f"Invalid pass_method {pass_method}") + + def ocr_for_single_line(self, + language: str, + origin_image=None, + candidates: str = "", + pass_method: int = 0, + local_path: str = "", + shared_memory_name: str = "" + ): + url = self.config.base_url + "/ocr_for_single_line" + data = { + "language": language, + "candidates": candidates, + "image": { + "pass_method": pass_method, + }, + } + self.get_request_data(data, pass_method, origin_image, local_path, shared_memory_name) + if pass_method in [0, 2]: + return requests.post(url, json=data) + elif pass_method == 1: + image_bytes = self.get_image_bytes(origin_image) + files = { + "data": (None, json.dumps(data), "application/json"), + "image": ("image.png", image_bytes, "image/png") + } + return requests.post(url, files=files) + + @staticmethod + def get_image_bytes(image): + _, encoded_image = cv2.imencode('.png', image) + return encoded_image.tobytes() + + def get_text_box(self): + pass + + +if __name__ == "__main__": + client = BaasOcrClient() + client.start_server() + # time.sleep(500) + + client.init_model(["zh-cn"]) + time.sleep(5) diff --git a/service/android_ocr_installer.py b/service/android_ocr_installer.py new file mode 100644 index 000000000..31b4a0a03 --- /dev/null +++ b/service/android_ocr_installer.py @@ -0,0 +1,437 @@ +import sys +import io +import shutil +import os +import platform +import subprocess +import time +import tempfile +import zipfile +from typing import Optional + +import pygit2 +import requests +from pygit2 import Commit +from pygit2.enums import ResetMode + +# ================================ +# Check the std::in and std::out Status before +# dulwich-related crashes, for dulwich will +# connect to the io, while the io is unset +# by the built window app. + +if sys.stdin is None: + sys.stdin = io.TextIOWrapper(io.BytesIO()) + sys.stdout = io.TextIOWrapper(io.BytesIO()) +# ================================ + +from core.exception import OcrInternalError + +if sys.platform not in ["win32", "linux", "darwin"]: + raise Exception("Ocr Unsupported platform " + sys.platform) + +OCR_SERVER_PREBUILD_URL = "https://gitee.com/pur1fy/baas_-cpp_prebuild.git" +OCR_SERVER_PREBUILD_ARCHIVE_URLS = [ + "https://baas-cdn.kiramei.workers.dev/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://codeload.github.com/pur1fying/BAAS_Cpp_prebuild/zip/refs/heads/{branch}", + "https://v4.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://v6.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://cdn.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://gh.sevencdn.com/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://githubfast.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", +] +OCR_SERVER_PREBUILD_API_URL = "https://api.github.com/repos/pur1fying/BAAS_Cpp_prebuild/branches/{branch}" + +SERVER_INSTALLER_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) + + +def _android_ocr_branch() -> Optional[str]: + if os.getenv("BAAS_ANDROID", "").lower() not in {"1", "true", "yes", "on"}: + return None + arch = platform.machine().lower() + if arch in {"aarch64", "arm64"}: + return "android-arm64-v8a" + if arch in {"x86_64", "amd64"}: + return "android-x86_64" + raise Exception("Unsupported Android machine architecture " + arch) + + +branch_map = { + "win32": {"amd64": "windows-x64"}, + "linux": {"x86_64": "linux-x64"}, + "darwin": {"arm64": "macos-arm64"}, +} +TARGET_BRANCH = _android_ocr_branch() +if TARGET_BRANCH is None: + arch_map = branch_map[sys.platform] + arch = platform.machine().lower() + if arch not in arch_map: + raise Exception("Unsupported machine architecture " + arch) + TARGET_BRANCH = arch_map[arch] +SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, "bin-android", TARGET_BRANCH) if TARGET_BRANCH.startswith( + "android-" +) else os.path.join(SERVER_INSTALLER_DIR_PATH, "bin") +ANDROID_VERSION_FILE = os.path.join(SERVER_BIN_DIR, ".baas-ocr-prebuild-sha") + + +def _is_android_runtime() -> bool: + return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} + + +def _android_library_abi_dir() -> str: + if TARGET_BRANCH == "android-arm64-v8a": + return "arm64-v8a" + if TARGET_BRANCH == "android-x86_64": + return "x86_64" + raise OcrInternalError(f"Unsupported Android OCR branch: {TARGET_BRANCH}") + + +def _server_binary_path() -> str: + if TARGET_BRANCH.startswith("android-"): + return os.path.join(SERVER_BIN_DIR, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") + return os.path.join(SERVER_BIN_DIR, "BAAS_ocr_server.exe" if sys.platform == "win32" else "BAAS_ocr_server") + + +def _android_internal_runtime_root() -> str: + internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() + if not internal_root: + return "" + return os.path.join(internal_root, "ocr-runtime", TARGET_BRANCH) + + +def _android_internal_binary_path() -> str: + runtime_root = _android_internal_runtime_root() + if not runtime_root: + return "" + return os.path.join(runtime_root, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") + + +def _android_internal_version_file() -> str: + runtime_root = _android_internal_runtime_root() + if not runtime_root: + return "" + return os.path.join(runtime_root, ".baas-ocr-prebuild-sha") + + +def _read_android_installed_sha() -> str: + try: + with open(ANDROID_VERSION_FILE, "r", encoding="utf-8") as fp: + return fp.read().strip() + except OSError: + return "" + + +def _read_android_internal_sha() -> str: + version_file = _android_internal_version_file() + if not version_file: + return "" + try: + with open(version_file, "r", encoding="utf-8") as fp: + return fp.read().strip() + except OSError: + return "" + + +def _get_android_remote_sha(branch: str) -> Optional[str]: + try: + response = requests.get(OCR_SERVER_PREBUILD_API_URL.format(branch=branch), timeout=15) + response.raise_for_status() + data = response.json() + sha = data.get("commit", {}).get("sha") + return str(sha) if sha else None + except Exception: + return None + + +def _download_android_archive(branch: str, archive_path: str, logger=None) -> str: + last_error: Optional[Exception] = None + for template in OCR_SERVER_PREBUILD_ARCHIVE_URLS: + url = template.format(branch=branch) + try: + with requests.get(url, stream=True, timeout=(8, 90)) as response: + response.raise_for_status() + with open(archive_path, "wb") as fp: + for chunk in response.iter_content(chunk_size=1024 * 256): + if chunk: + fp.write(chunk) + return url + except Exception as exc: + last_error = exc + if logger is not None: + logger.warning(f"Failed to download Android OCR prebuild from {url}: {exc}") + raise OcrInternalError(f"Failed to download Android OCR prebuild archive: {last_error}") + + +def _find_android_archive_root(extract_root: str) -> str: + library_name = "libBAAS_ocr_server.so" + for current_root, _dirs, files in os.walk(extract_root): + if library_name in files and os.path.basename(current_root) == _android_library_abi_dir(): + return os.path.dirname(os.path.dirname(current_root)) + candidates = [ + os.path.join(extract_root, name) + for name in os.listdir(extract_root) + if os.path.isdir(os.path.join(extract_root, name)) + ] + if len(candidates) == 1: + return candidates[0] + raise OcrInternalError("Android OCR prebuild archive does not contain libBAAS_ocr_server.so") + + +def _install_android_prebuild(logger) -> None: + if not TARGET_BRANCH.startswith("android-"): + raise OcrInternalError(f"Invalid Android OCR branch: {TARGET_BRANCH}") + + remote_sha = _get_android_remote_sha(TARGET_BRANCH) + local_sha = _read_android_installed_sha() + server_binary_path = _server_binary_path() + internal_sha = _read_android_internal_sha() + internal_binary_path = _android_internal_binary_path() + if remote_sha and internal_sha == remote_sha and os.path.exists(internal_binary_path): + logger.info("Android Ocr Server runtime already available.") + return + if not remote_sha and internal_sha and os.path.exists(internal_binary_path): + logger.warning("Android OCR remote SHA unavailable; using internal runtime prebuild.") + return + if remote_sha and local_sha == remote_sha and os.path.exists(server_binary_path): + logger.info("Ocr Server No updates available.") + return + if not remote_sha and local_sha and os.path.exists(server_binary_path): + logger.warning("Android OCR remote SHA unavailable; using installed prebuild.") + return + + logger.info(f"Installing Android Ocr Server prebuild for {TARGET_BRANCH}.") + with tempfile.TemporaryDirectory(prefix="baas-ocr-android-") as tmp: + archive_path = os.path.join(tmp, "ocr-prebuild.zip") + source_url = _download_android_archive(TARGET_BRANCH, archive_path, logger) + extract_root = os.path.join(tmp, "extract") + os.makedirs(extract_root, exist_ok=True) + with zipfile.ZipFile(archive_path) as archive: + archive.extractall(extract_root) + source_root = _find_android_archive_root(extract_root) + if os.path.exists(SERVER_BIN_DIR): + shutil.rmtree(SERVER_BIN_DIR, ignore_errors=True) + shutil.copytree(source_root, SERVER_BIN_DIR) + + if os.path.exists(server_binary_path): + os.chmod(server_binary_path, os.stat(server_binary_path).st_mode | 0o755) + else: + raise OcrInternalError("Android OCR prebuild did not install libBAAS_ocr_server.so") + + with open(ANDROID_VERSION_FILE, "w", encoding="utf-8") as fp: + fp.write(remote_sha or source_url) + logger.info("Ocr Server Install success.") + + +class OcrRepoManager: + """ + Manages the OCR Server git repository. + Priority: System 'git' > pygit2 (except for rollback). + """ + + def __init__(self, repo_path: str, remote_url: str, branch: str, logger): + self.repo_path = repo_path + self.remote_url = remote_url + self.branch = branch + self.logger = logger + self.git_executable = shutil.which("git") + self.git_dir = os.path.join(repo_path, ".git") + + def _run_git_cmd(self, args: list, cwd: Optional[str] = None) -> str: + """Executes a system git command.""" + if not self.git_executable: + raise FileNotFoundError("System git not found") + + target_cwd = cwd if cwd else self.repo_path + + # Ensure directory exists before running command if not cloning + if cwd is None and not os.path.exists(target_cwd): + raise FileNotFoundError(f"Repo directory {target_cwd} does not exist") + + proc = subprocess.run( + [self.git_executable] + args, + cwd=target_cwd, + capture_output=True, + text=True, + check=True + ) + return proc.stdout.strip() + + def get_local_sha(self) -> str: + """Returns the SHA of the current local HEAD.""" + if self.git_executable: + try: + return self._run_git_cmd(["rev-parse", "HEAD"]) + except subprocess.CalledProcessError: + self.logger.warning("System git failed to get local SHA, falling back to pygit2.") + + # Fallback to pygit2 + repo = pygit2.Repository(self.repo_path) + return str(repo.head.target) + + def get_remote_sha(self) -> Optional[str]: + """Returns the SHA of the target branch on the remote.""" + if self.git_executable: + try: + # git ls-remote refs/heads/ + # Output: \trefs/heads/ + ref = f"refs/heads/{self.branch}" + output = self._run_git_cmd(["ls-remote", self.remote_url, ref], cwd=os.getcwd()) + if output: + return output.split()[0] + except Exception as e: + self.logger.warning(f"System git failed to get remote SHA: {e}") + + # Fallback to pygit2 + try: + with tempfile.TemporaryDirectory() as tmp: + repo = pygit2.init_repository(tmp, bare=True) + remote = repo.remotes.create_anonymous(self.remote_url) + target_ref_name = f"refs/heads/{self.branch}" + for head in remote.ls_remotes(): + if head.get("name") == target_ref_name: + return str(head.get("oid")) + except Exception as e: + self.logger.error(f"pygit2 failed to get remote info: {e}") + return None + return None + + def clone(self) -> None: + """Clones the repository.""" + if os.path.exists(self.repo_path): + self.logger.warning("Target directory not empty, removing old files...") + shutil.rmtree(self.repo_path, ignore_errors=True) + + for i in range(1, 4): + try: + if self.git_executable: + self.logger.info(f"Cloning with system git (Attempt {i})...") + # git clone -b + self._run_git_cmd( + ["clone", "-b", self.branch, self.remote_url, self.repo_path], + cwd=os.path.dirname(self.repo_path) + ) + else: + self.logger.info(f"Cloning with pygit2 (Attempt {i})...") + pygit2.clone_repository( + self.remote_url, + self.repo_path, + checkout_branch=self.branch, + ) + self.logger.info("Ocr Server Install success.") + return + except Exception as e: + self.logger.error(f"Failed to clone (Attempt {i}): {e}") + if i == 3: + raise OcrInternalError("Failed to install the BAAS_ocr_server. Please check your network") + time.sleep(1) + + def update(self) -> None: + """Updates the repository to the latest remote state.""" + self.logger.info("Pulling updates from the remote repository...") + + if self.git_executable: + try: + # 1. Fetch + self._run_git_cmd(["fetch", "origin", self.branch]) + # 2. Reset --hard + # We use FETCH_HEAD to ensure we are at the exact state we just fetched + self._run_git_cmd(["reset", "--hard", "FETCH_HEAD"]) + self.logger.info("Ocr Server Update success (System Git).") + return + except Exception as e: + self.logger.error(f"System git update failed: {e}. Falling back to pygit2.") + + # Fallback to pygit2 + try: + repo = pygit2.Repository(self.repo_path) + # Ensure remote exists + remote = repo.remotes["origin"] if "origin" in repo.remotes.names() else repo.remotes.create("origin", + self.remote_url) + + refspec = f"refs/heads/{self.branch}:refs/remotes/origin/{self.branch}" + remote.fetch(refspecs=[refspec]) + + remote_ref = f"refs/remotes/origin/{self.branch}" + remote_commit = repo.revparse_single(remote_ref) + + if not isinstance(remote_commit, Commit): + remote_commit = repo[remote_commit.target] + + repo.reset(remote_commit.id, ResetMode.HARD) + repo.checkout_tree(remote_commit.tree) + self.logger.info("Ocr Server Update success (pygit2).") + except Exception as e: + self.logger.error("Failed to update the BAAS_ocr_server.") + raise OcrInternalError(f"Update failed: {e}") + + + +def check_git(logger): + """ + Main entry point to check and update the OCR Server repo. + """ + if _is_android_runtime(): + _install_android_prebuild(logger) + return + + manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) + + # 1. Ensure Repo Exists + if not os.path.exists(manager.git_dir): + manager.clone() + return + + logger.info("Ocr Server Update check.") + + # 2. Validate Local Repo Integrity + try: + local_sha = manager.get_local_sha() + except Exception: + logger.warning("Git Repo corrupted, remove .git folder and reinstall.") + shutil.rmtree(manager.git_dir, ignore_errors=True) + manager.clone() + return + + # 3. Check Remote + try: + remote_sha = manager.get_remote_sha() + except Exception as e: + raise OcrInternalError(f"Failed to fetch remote info: {e}") + + if not remote_sha: + logger.warning(f"Remote branch '{TARGET_BRANCH}' not found.") + return + + logger.info(f"remote_sha: {remote_sha}") + logger.info(f"local_sha : {local_sha}") + + # 4. Update if necessary + if local_sha == remote_sha: + logger.info("Ocr Server No updates available.") + return + + # Perform update (System git preferred, pygit2 fallback) + manager.update() + + # Verify update + try: + new_local_sha = manager.get_local_sha() + if new_local_sha != remote_sha: + logger.warning("Failed to update the BAAS_ocr_server (SHA mismatch), please check your network.") + except Exception: + pass + + +def clone_repo(logger): + """ + Wrapper for cloning the repo. + """ + logger.info("Installing Ocr Server, please hang on...") + if _is_android_runtime(): + _install_android_prebuild(logger) + return + + manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) + manager.clone() diff --git a/service/conf/initializer.py b/service/conf/initializer.py index 9ae55e37f..59865b7e2 100644 --- a/service/conf/initializer.py +++ b/service/conf/initializer.py @@ -5,6 +5,10 @@ from pathlib import Path from typing import Iterable, Union +from service.injection import prepare_service_imports + +prepare_service_imports() + from core.config import default_config from core.config.config_set import ConfigSet from .paths import ensure_safe_config_id, resolve_config_dir diff --git a/service/injection.py b/service/injection.py index 498f4b640..3293ac12c 100644 --- a/service/injection.py +++ b/service/injection.py @@ -2,7 +2,9 @@ import os import queue +import sys import traceback +import types from datetime import datetime from functools import wraps from inspect import signature @@ -28,7 +30,60 @@ def _ensure_logger_extensions(logger: Any, jsonify: bool = False) -> None: logger.jsonify = True +def _env_enabled(name: str) -> bool: + return os.getenv(name, "").strip().lower() in {"1", "true", "yes", "on"} + + +def _install_gui_stubs() -> None: + if "gui.util.translator" not in sys.modules: + translator = types.ModuleType("gui.util.translator") + + class _Translator: + @staticmethod + def tr(_domain, value): + return value + + @staticmethod + def undo(value): + return value + + translator.baasTranslator = _Translator() + sys.modules["gui.util.translator"] = translator + + if "gui.util.customized_ui" not in sys.modules: + customized_ui = types.ModuleType("gui.util.customized_ui") + + class BoundComponent: + def __init__(self, component, string_rule, config_set, attribute="setText"): + self.component = component + self.string_rule = string_rule + self.config_set = config_set + self.attribute = attribute + + def config_updated(self, _key): + return None + + customized_ui.BoundComponent = BoundComponent + sys.modules["gui.util.customized_ui"] = customized_ui + + +def _install_android_ocr_modules() -> None: + if not _env_enabled("BAAS_ANDROID"): + return + from service import android_ocr_client, android_ocr_installer + + sys.modules["core.ocr.baas_ocr_client.Client"] = android_ocr_client + sys.modules["core.ocr.baas_ocr_client.server_installer"] = android_ocr_installer + + +def prepare_service_imports() -> None: + _install_gui_stubs() + _install_android_ocr_modules() + + def _patch_logger() -> None: + _install_gui_stubs() + _install_android_ocr_modules() from core import utils logger_cls = utils.Logger @@ -64,6 +119,8 @@ def log(self, level, message): def _patch_main() -> None: + _install_gui_stubs() + _install_android_ocr_modules() import main as main_module from core.ocr import ocr from core.ocr.baas_ocr_client.server_installer import check_git @@ -113,9 +170,8 @@ def init_ocr(self, need_ocr_update_check=True): def init_static_config(self): try: - ConfigSet.static_config = ConfigSet.static_config if ConfigSet.static_config is None: - ConfigSet.static_config = ConfigSet().static_config + ConfigSet._init_static_config() return True except Exception: self.logger.error("Static Config initialization failed") @@ -131,27 +187,281 @@ def init_static_config(self): def _patch_baas_thread() -> None: + _install_gui_stubs() + _install_android_ocr_modules() from core.Baas_thread import Baas_thread if getattr(Baas_thread, "_baas_service_injected", False): return original_init = Baas_thread.__init__ + original_set_ocr = Baas_thread.set_ocr + original_start_emulator = Baas_thread.start_emulator + original_android_language = Baas_thread._get_android_device_ocr_language + original_check_atx = Baas_thread.check_atx + original_wait_uiautomator_start = Baas_thread.wait_uiautomator_start + original_check_resolution = Baas_thread.check_resolution + original_swipe = Baas_thread.swipe @wraps(original_init) def init(self, config, logger_signal=None, button_signal=None, update_signal=None, exit_signal=None, **kwargs): original_init(self, config, logger_signal, button_signal, update_signal, exit_signal) _ensure_logger_extensions(self.logger, jsonify=kwargs.get("jsonify", False)) + @wraps(original_set_ocr) + def set_ocr(self, ocr): + self.ocr = ocr + ocr_client = getattr(ocr, "client", None) + ocr_config = getattr(ocr_client, "config", None) + if _env_enabled("BAAS_ANDROID"): + self.ocr_img_pass_method = 1 + elif ocr_config is not None and getattr(ocr_config, "server_is_remote", False): + self.ocr_img_pass_method = 1 + elif ocr is None: + self.ocr_img_pass_method = 1 + else: + self.ocr_img_pass_method = 0 + self.shared_memory_name = os.path.basename(self.config_set.config_dir) + + @wraps(original_start_emulator) + def start_emulator(self): + if _env_enabled("BAAS_ANDROID"): + self.logger.info("Android embedded mode detected; skip desktop emulator startup.") + return + return original_start_emulator(self) + + @wraps(original_android_language) + def _get_android_device_ocr_language(self): + if _env_enabled("BAAS_ANDROID") and self.server == "Global": + self.ocr_language = os.getenv("BAAS_ANDROID_GLOBAL_OCR_LANGUAGE", "en-us") + self.logger.warning( + "Android embedded mode cannot pull DeviceOption through adb; use " + self.ocr_language + ) + return + return original_android_language(self) + + @wraps(original_check_atx) + def check_atx(self): + if not _env_enabled("BAAS_ANDROID"): + return original_check_atx(self) + import requests + + self.logger.info("--------------Check ATX install ----------------") + try: + version = requests.get("http://127.0.0.1:7912/version", timeout=3).text + except requests.RequestException as exc: + raise RuntimeError( + "Android embedded mode requires local uiautomator2 agent on 127.0.0.1:7912" + ) from exc + self.logger.info("ATX agent version: [ " + version + " ].") + self.wait_uiautomator_start() + self.logger.info("Uiautomator2 service started.") + + @wraps(original_wait_uiautomator_start) + def wait_uiautomator_start(self): + if not _env_enabled("BAAS_ANDROID"): + return original_wait_uiautomator_start(self) + import time + import cv2 + import numpy as np + + for _ in range(0, 10): + try: + self.u2.uiautomator.start() + while not self.u2.uiautomator.running(): + time.sleep(0.1) + self.latest_img_array = self.normalize_screenshot( + cv2.cvtColor(np.array(self.u2.screenshot()), cv2.COLOR_RGB2BGR) + ) + return + except Exception as exc: # noqa: BLE001 - retry uiautomator startup + print(exc) + time.sleep(0.3) + raise RuntimeError("Android embedded uiautomator2 agent is not responding") + + @wraps(original_check_resolution) + def check_resolution(self): + try: + return original_check_resolution(self) + except Exception: + if _env_enabled("BAAS_ANDROID"): + self.logger.warning("Android embedded mode accepts non-16:9 device screens.") + return None + raise + + @wraps(original_swipe) + def swipe(self, fx, fy, tx, ty, duration=None, post_sleep_time=0): + if not _env_enabled("BAAS_ANDROID"): + return original_swipe(self, fx, fy, tx, ty, duration, post_sleep_time) + width, height = self.resolution if getattr(self, "resolution", None) else (1280, 720) + max_x = max(0, int(width) - 1) + max_y = max(0, int(height) - 1) + return original_swipe( + self, + min(max_x, max(0, int(fx))), + min(max_y, max(0, int(fy))), + min(max_x, max(0, int(tx))), + min(max_y, max(0, int(ty))), + duration, + post_sleep_time, + ) + Baas_thread.__init__ = init + Baas_thread.set_ocr = set_ocr + Baas_thread.start_emulator = start_emulator + Baas_thread._get_android_device_ocr_language = _get_android_device_ocr_language + Baas_thread.check_atx = check_atx + Baas_thread.wait_uiautomator_start = wait_uiautomator_start + Baas_thread.check_resolution = check_resolution + Baas_thread.swipe = swipe Baas_thread._baas_service_injected = True +def _patch_device_modules() -> None: + _install_gui_stubs() + from core.device.connection import Connection + from core.device.Control import Control + from core.device.Screenshot import Screenshot + from core.device.uiautomator2_client import U2Client + from core.exception import RequestHumanTakeOver + + if not getattr(Connection, "_baas_service_injected", False): + original_connection_init = Connection.__init__ + + @staticmethod + def _split_serial(serial): + serial = Connection.revise_serial(serial) + try: + ip, port = serial.rsplit(":", 1) + except ValueError: + return serial, "" + return ip, port + + def _resolve_configured_package(self): + server = self.config.server + if server == "auto": + raise RequestHumanTakeOver("Android embedded mode requires an explicit game server.") + if server == "官服" or server == "B服": + self.server = "CN" + elif server == "国际服" or server == "国际服青少年" or server == "韩国ONE": + self.server = "Global" + elif server == "日服": + self.server = "JP" + else: + raise RequestHumanTakeOver("Unsupported Android game server: " + str(server)) + try: + self.package = self.static_config.package_name[server] + self.activity = self.static_config.activity_name[server] + except KeyError as exc: + raise RequestHumanTakeOver("Game package is not configured: " + str(server)) from exc + self.logger.info("Package : " + self.package) + self.logger.info("Server : " + self.server) + + @wraps(original_connection_init) + def connection_init(self, Baas_instance, skip_package_detection=False): + if _env_enabled("BAAS_ANDROID"): + self.Baas_thread = Baas_instance + self.logger = Baas_instance.get_logger() + self.config_set = Baas_instance.get_config() + self.config = self.config_set.config + self.static_config = self.config_set.static_config + self.skip_package_detection = skip_package_detection + self.server = None + self.activity = None + self.package = None + self.serial = os.getenv("BAAS_ANDROID_U2_SERIAL", "127.0.0.1:7912").strip() or "127.0.0.1:7912" + self.adbIP, self.adbPort = Connection._split_serial(self.serial) + self._is_android_device = True + self.logger.info("Android embedded mode detected; use local uiautomator2 agent.") + self.logger.info(f"Serial : {self.serial}") + self._resolve_configured_package() + return + if skip_package_detection: + self.Baas_thread = Baas_instance + self.logger = Baas_instance.get_logger() + self.config_set = Baas_instance.get_config() + self.config = self.config_set.config + self.static_config = self.config_set.static_config + self.server = None + original_detect_package = self.detect_package + self.detect_package = lambda: None + try: + self._init_android_device() + finally: + self.detect_package = original_detect_package + self._is_android_device = True + return + return original_connection_init(self, Baas_instance) + + original_get_current_package = Connection.get_current_package + + @wraps(original_get_current_package) + def get_current_package(self): + if _env_enabled("BAAS_ANDROID"): + u2 = getattr(self.Baas_thread, "u2", None) + if u2 is None: + return "" + current = u2.app_current() + if isinstance(current, dict): + return current.get("package", "") + return getattr(current, "package", "") or "" + return original_get_current_package(self) + + Connection._split_serial = _split_serial + Connection._resolve_configured_package = _resolve_configured_package + Connection.__init__ = connection_init + Connection.get_current_package = get_current_package + Connection._baas_service_injected = True + + if not getattr(Control, "_baas_service_injected", False): + original_control_init = Control.init_control_instance + + @wraps(original_control_init) + def init_control_instance(self): + if _env_enabled("BAAS_ANDROID") and self.Baas_instance.is_android_device: + self.config.control_method = "uiautomator2" + return original_control_init(self) + + Control.init_control_instance = init_control_instance + Control._baas_service_injected = True + + if not getattr(Screenshot, "_baas_service_injected", False): + original_screenshot_init = Screenshot.init_screenshot_instance + + @wraps(original_screenshot_init) + def init_screenshot_instance(self): + if _env_enabled("BAAS_ANDROID") and self.Baas_instance.is_android_device: + self.config.screenshot_method = "uiautomator2" + return original_screenshot_init(self) + + Screenshot.init_screenshot_instance = init_screenshot_instance + Screenshot._baas_service_injected = True + + if not getattr(U2Client, "_baas_service_injected", False): + original_u2_init = U2Client.__init__ + + @wraps(original_u2_init) + def u2_init(self, serial): + if _env_enabled("BAAS_ANDROID") and not serial.startswith(("http://", "https://")): + import uiautomator2 as u2 + + self.serial = serial + self.connection = u2.connect("http://" + serial) + return + return original_u2_init(self, serial) + + U2Client.__init__ = u2_init + U2Client._baas_service_injected = True + + def apply_service_injections() -> None: global _APPLIED if _APPLIED: return + _install_gui_stubs() + _install_android_ocr_modules() _patch_logger() _patch_main() + _patch_device_modules() _patch_baas_thread() _APPLIED = True diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..603d7ac4c --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +import sys +import types + + +def pytest_configure(): + if "gui.util.translator" not in sys.modules: + translator = types.ModuleType("gui.util.translator") + + class _Translator: + @staticmethod + def tr(_domain, value): + return value + + @staticmethod + def undo(value): + return value + + translator.baasTranslator = _Translator() + sys.modules["gui.util.translator"] = translator + + if "gui.util.customized_ui" not in sys.modules: + customized_ui = types.ModuleType("gui.util.customized_ui") + + class BoundComponent: + def __init__(self, component, string_rule, config_set, attribute="setText"): + self.component = component + self.string_rule = string_rule + self.config_set = config_set + self.attribute = attribute + + def config_updated(self, _key): + return None + + customized_ui.BoundComponent = BoundComponent + sys.modules["gui.util.customized_ui"] = customized_ui diff --git a/tests/core/ocr/test_android_runtime.py b/tests/core/ocr/test_android_runtime.py index c45c71090..6cafd6f48 100644 --- a/tests/core/ocr/test_android_runtime.py +++ b/tests/core/ocr/test_android_runtime.py @@ -1,7 +1,7 @@ from __future__ import annotations -from core.ocr.baas_ocr_client import Client -from core.ocr.baas_ocr_client import server_installer +from service import android_ocr_client as Client +from service import android_ocr_installer as server_installer class _Logger: From 70aba72e21d1437424903a70234fb191bf22cfb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 00:20:14 +0800 Subject: [PATCH 76/98] Fix: Allow Android start without display resize --- service/runtime.py | 5 ++-- tests/service/test_android_display_resize.py | 26 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/service/runtime.py b/service/runtime.py index 6e12fddbf..2ffa8e420 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -124,9 +124,8 @@ def activate(self, logger=None) -> None: with self._lock: self._active_count = max(0, self._active_count - 1) if logger is not None: - logger.error("Failed to set Android display size.") - logger.error(exc) - raise + logger.warning("Failed to set Android display size; continue without resizing.") + logger.warning(exc) def release(self, logger=None) -> None: if not _is_android_runtime(): diff --git a/tests/service/test_android_display_resize.py b/tests/service/test_android_display_resize.py index 49d8d3cbe..6fc2060be 100644 --- a/tests/service/test_android_display_resize.py +++ b/tests/service/test_android_display_resize.py @@ -17,6 +17,14 @@ def shell(self, command: str): return "" +class _FakeLogger: + def __init__(self): + self.warnings = [] + + def warning(self, message): + self.warnings.append(message) + + def test_android_display_guard_is_noop_outside_android(monkeypatch): monkeypatch.delenv("BAAS_ANDROID", raising=False) guard = _AndroidDisplayResizeGuard() @@ -63,3 +71,21 @@ def test_android_display_guard_uses_reference_count(monkeypatch): guard.release() assert calls == ["wm size", "wm size 800x1280", "wm size reset"] + + +def test_android_display_guard_does_not_block_when_resize_fails(monkeypatch): + monkeypatch.setenv("BAAS_ANDROID", "1") + + def fail_shell(_command): + raise RuntimeError("No adb exe could be found. Install adb on your system") + + monkeypatch.setattr(_AndroidDisplayResizeGuard, "_shell", staticmethod(fail_shell)) + + logger = _FakeLogger() + guard = _AndroidDisplayResizeGuard() + + guard.activate(logger) + guard.release(logger) + + assert guard._active_count == 0 + assert "continue without resizing" in logger.warnings[0] From 4b024ee8debf2c50ba65ba305c9fd5ac14358054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 00:22:53 +0800 Subject: [PATCH 77/98] Fix: Support service logger injection variants --- service/injection.py | 29 ++++++++------- tests/service/test_service_injection.py | 49 +++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 tests/service/test_service_injection.py diff --git a/service/injection.py b/service/injection.py index 3293ac12c..5f595d597 100644 --- a/service/injection.py +++ b/service/injection.py @@ -91,7 +91,7 @@ def _patch_logger() -> None: return original_init = logger_cls.__init__ - original_log = logger_cls.log + original_log = getattr(logger_cls, "log", None) @wraps(original_init) def init(self, logger_signal, jsonify=False): @@ -101,20 +101,21 @@ def init(self, logger_signal, jsonify=False): original_init(self, logger_signal) _ensure_logger_extensions(self, jsonify=jsonify) - @wraps(original_log) - def log(self, level, message): - _ensure_logger_extensions(self) - if getattr(self, "jsonify", False): - self.log_collector.put({ - "time": datetime.now(), - "level": level, - "message": message, - }) - return - return original_log(self, level, message) - logger_cls.__init__ = init - logger_cls.log = log + if original_log is not None: + @wraps(original_log) + def log(self, level, message): + _ensure_logger_extensions(self) + if getattr(self, "jsonify", False): + self.log_collector.put({ + "time": datetime.now(), + "level": level, + "message": message, + }) + return + return original_log(self, level, message) + + logger_cls.log = log logger_cls._baas_service_injected = True diff --git a/tests/service/test_service_injection.py b/tests/service/test_service_injection.py new file mode 100644 index 000000000..dcd59b185 --- /dev/null +++ b/tests/service/test_service_injection.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import sys +import types + +from service import injection + + +def _install_fake_core(monkeypatch, logger_cls): + utils = types.SimpleNamespace(Logger=logger_cls) + core = types.SimpleNamespace(utils=utils) + monkeypatch.setitem(sys.modules, "core", core) + monkeypatch.setitem(sys.modules, "core.utils", utils) + + +def test_patch_logger_supports_core_logger_without_log(monkeypatch): + class Logger: + def __init__(self, logger_signal): + self.logger_signal = logger_signal + + monkeypatch.delenv("BAAS_ANDROID", raising=False) + _install_fake_core(monkeypatch, Logger) + + injection._patch_logger() + logger = Logger(None, jsonify=True) + + assert logger.jsonify is True + assert logger.log_collector.empty() + assert not hasattr(Logger, "log") + + +def test_patch_logger_wraps_legacy_log_when_available(monkeypatch): + class Logger: + def __init__(self, logger_signal): + self.logger_signal = logger_signal + self.messages = [] + + def log(self, level, message): + self.messages.append((level, message)) + + monkeypatch.delenv("BAAS_ANDROID", raising=False) + _install_fake_core(monkeypatch, Logger) + + injection._patch_logger() + logger = Logger(None, jsonify=True) + logger.log(2, "message") + + assert logger.log_collector.get_nowait()["message"] == "message" + From c4423a5262008f6978ba46b96e65260b27a0de92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 00:30:51 +0800 Subject: [PATCH 78/98] Fix: Lock Android local control mode --- service/android_local_device.py | 37 +++++++++++++++++++++++ service/android_modes.py | 2 ++ service/conf/manager.py | 17 +++++++++++ service/injection.py | 13 ++++++-- tests/service/test_service_logic.py | 47 +++++++++++++++++++++++++++++ 5 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 service/android_local_device.py create mode 100644 service/android_modes.py diff --git a/service/android_local_device.py b/service/android_local_device.py new file mode 100644 index 000000000..eb7e87122 --- /dev/null +++ b/service/android_local_device.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from service.android_modes import ANDROID_LOCAL_METHOD +from core.device.uiautomator2_client import U2Client + + +class AndroidLocalControl: + """Android-embedded control adapter backed by the local device agent.""" + + def __init__(self, conn): + self.serial = conn.serial + self.u2 = U2Client.get_instance(self.serial) + + def click(self, x, y): + self.u2.click(x, y) + + def swipe(self, x1, y1, x2, y2, duration): + self.u2.swipe(x1, y1, x2, y2, duration) + + def long_click(self, x, y, duration): + self.u2.swipe(x, y, x, y, duration) + + def scroll(self, x, y, clicks): + direction = -1 if clicks > 0 else 1 + distance = 240 * abs(clicks) + self.swipe(x, y, x, y + direction * distance, 0.2) + + +class AndroidLocalScreenshot: + """Android-embedded screenshot adapter backed by the local device agent.""" + + def __init__(self, conn): + self.serial = conn.serial + self.u2 = U2Client.get_instance(self.serial) + + def screenshot(self): + return self.u2.screenshot() diff --git a/service/android_modes.py b/service/android_modes.py new file mode 100644 index 000000000..ea658eb4a --- /dev/null +++ b/service/android_modes.py @@ -0,0 +1,2 @@ +ANDROID_LOCAL_METHOD = "android_local" + diff --git a/service/conf/manager.py b/service/conf/manager.py index 6ff7da4c6..a83fa5569 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -13,6 +13,7 @@ from deploy.installer.const import normalize_update_channel from service.types import PatchOperation, SyncPushPayload +from service.android_modes import ANDROID_LOCAL_METHOD from service.update import read_setup_toml, write_setup_toml from service.update.setup_schema import legacy_repo_url, migrate_to_current_schema from service.utils.broadcast import BroadcastChannel @@ -121,6 +122,17 @@ def _project_setup_toml(full_setup_toml: Dict[str, Any]) -> Dict[str, Any]: "gitBackend" : config_general.get("git_backend", "auto"), } + @staticmethod + def _normalize_android_config(data: Any) -> Any: + if os.getenv("BAAS_ANDROID", "").lower() not in {"1", "true", "yes", "on"}: + return data + if not isinstance(data, dict): + return data + normalized = copy.deepcopy(data) + normalized["control_method"] = ANDROID_LOCAL_METHOD + normalized["screenshot_method"] = ANDROID_LOCAL_METHOD + return normalized + @staticmethod def gen_event_formation_attr(data: dict) -> Union[dict, None]: result = {} @@ -254,6 +266,9 @@ def _load_from_disk(self, resource: str, resource_id: Optional[str]) -> Resource else: data_to_store = data + if resource == "config": + data_to_store = self._normalize_android_config(data_to_store) + if resource == "static": event = self.gen_event_formation_attr(data_to_store) data_to_store["current_game_activity"] = event @@ -325,6 +340,8 @@ async def apply_patch( current_data = copy.deepcopy(snapshot.data) ops_payload = [op.model_dump() if isinstance(op, PatchOperation) else dict(op) for op in operations] updated = apply_patch(current_data, ops_payload) + if resource == "config": + updated = self._normalize_android_config(updated) if resource == "gui": if not isinstance(updated, dict): diff --git a/service/injection.py b/service/injection.py index 5f595d597..817943738 100644 --- a/service/injection.py +++ b/service/injection.py @@ -320,6 +320,7 @@ def swipe(self, fx, fy, tx, ty, duration=None, post_sleep_time=0): def _patch_device_modules() -> None: _install_gui_stubs() + from service.android_local_device import ANDROID_LOCAL_METHOD, AndroidLocalControl, AndroidLocalScreenshot from core.device.connection import Connection from core.device.Control import Control from core.device.Screenshot import Screenshot @@ -420,7 +421,11 @@ def get_current_package(self): @wraps(original_control_init) def init_control_instance(self): if _env_enabled("BAAS_ANDROID") and self.Baas_instance.is_android_device: - self.config.control_method = "uiautomator2" + self.method = ANDROID_LOCAL_METHOD + self.config.control_method = ANDROID_LOCAL_METHOD + self.logger.info("Control method : " + self.method) + self.control_instance = AndroidLocalControl(self.connection) + return return original_control_init(self) Control.init_control_instance = init_control_instance @@ -432,7 +437,11 @@ def init_control_instance(self): @wraps(original_screenshot_init) def init_screenshot_instance(self): if _env_enabled("BAAS_ANDROID") and self.Baas_instance.is_android_device: - self.config.screenshot_method = "uiautomator2" + self.method = ANDROID_LOCAL_METHOD + self.config.screenshot_method = ANDROID_LOCAL_METHOD + self.logger.info("Screenshot method : " + self.method) + self.screenshot_instance = AndroidLocalScreenshot(self.connection) + return return original_screenshot_init(self) Screenshot.init_screenshot_instance = init_screenshot_instance diff --git a/tests/service/test_service_logic.py b/tests/service/test_service_logic.py index 9527173d0..45a882052 100644 --- a/tests/service/test_service_logic.py +++ b/tests/service/test_service_logic.py @@ -136,6 +136,53 @@ async def scenario(): assert {"op": "replace", "path": "/name", "value": "After"} in payload["ops"] +def test_android_config_snapshot_locks_local_device_methods(monkeypatch, tmp_path): + monkeypatch.setenv("BAAS_ANDROID", "1") + _write_config_pair(tmp_path, "default_config", "Default") + config_path = tmp_path / "config" / "default_config" / "config.json" + config_path.write_text( + json.dumps( + { + "name": "Default", + "server": "官服", + "control_method": "adb", + "screenshot_method": "scrcpy", + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + + manager = ConfigManager(tmp_path) + snapshot = asyncio.run(manager.get_snapshot("config", "default_config")) + + assert snapshot.data["control_method"] == "android_local" + assert snapshot.data["screenshot_method"] == "android_local" + + +def test_android_config_patch_cannot_change_local_device_methods(monkeypatch, tmp_path): + monkeypatch.setenv("BAAS_ANDROID", "1") + _write_config_pair(tmp_path, "default_config", "Default") + manager = ConfigManager(tmp_path) + snapshot = asyncio.run(manager.get_snapshot("config", "default_config")) + + updated = asyncio.run( + manager.apply_patch( + "config", + "default_config", + [ + {"op": "add", "path": "/control_method", "value": "adb"}, + {"op": "add", "path": "/screenshot_method", "value": "scrcpy"}, + ], + snapshot.timestamp, + origin="frontend", + ) + ) + + assert updated.data["control_method"] == "android_local" + assert updated.data["screenshot_method"] == "android_local" + + def test_service_runtime_streams_sha_results_by_completion(monkeypatch, tmp_path): def fake_configs(channel): return [ From 101c60db711a668ecef771736542238a1f50820c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 03:10:11 +0800 Subject: [PATCH 79/98] Fix: Isolate service runtime injections --- core/Baas_thread.py | 58 +-- core/config/config_set.py | 31 +- core/config/default_config.py | 10 +- core/device/Control.py | 3 - core/device/Screenshot.py | 3 - core/device/connection.py | 56 +-- core/device/uiautomator2_client.py | 3 - core/ipc_manager.py | 8 +- core/ocr/baas_ocr_client/Client.py | 189 +------- core/ocr/baas_ocr_client/server_installer.py | 483 +++---------------- core/scheduler.py | 1 - core/utils.py | 23 +- main.py | 43 +- module/cafe_reward.py | 163 ++----- service/injection.py | 144 ++++++ tests/module/test_cafe_reward_match.py | 13 +- 16 files changed, 318 insertions(+), 913 deletions(-) diff --git a/core/Baas_thread.py b/core/Baas_thread.py index b258210b2..a335297b8 100644 --- a/core/Baas_thread.py +++ b/core/Baas_thread.py @@ -71,7 +71,7 @@ class Baas_thread: - def __init__(self, config, logger_signal=None, button_signal=None, update_signal=None, exit_signal=None, **kwargs): + def __init__(self, config, logger_signal=None, button_signal=None, update_signal=None, exit_signal=None): self.project_dir = os.path.abspath(os.path.dirname(__file__)) self.project_dir = os.path.dirname(self.project_dir) self.u2_client = None @@ -100,7 +100,7 @@ def __init__(self, config, logger_signal=None, button_signal=None, update_signal self.task_finish_to_main_page = False self.static_config = ConfigSet.static_config self.ocr = None - self.logger = utils.Logger(logger_signal, jsonify=kwargs.get("jsonify", False)) + self.logger = utils.Logger(logger_signal) self.last_refresh_u2_time = 0 self.latest_img_array = None self.total_assault_difficulty_names = ["NORMAL", "HARD", "VERYHARD", "HARDCORE", "EXTREME", "INSANE", "TORMENT"] @@ -116,11 +116,7 @@ def __init__(self, config, logger_signal=None, button_signal=None, update_signal def set_ocr(self, ocr): self.ocr = ocr - ocr_client = getattr(self.ocr, "client", None) - ocr_config = getattr(ocr_client, "config", None) - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - self.ocr_img_pass_method = 1 - elif ocr_config is not None and ocr_config.server_is_remote: + if self.ocr.client.config.server_is_remote: self.ocr_img_pass_method = 1 else: self.ocr_img_pass_method = 0 @@ -308,9 +304,6 @@ def start_check_emulator_stat(self, emulator_strat_stat, wait_time): return True def start_emulator(self): - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - self.logger.info("Android embedded mode detected; skip desktop emulator startup.") - return self.emulator_start_stat = self.config.open_emulator_stat self.wait_time = self.config.emulator_wait_time if not self.start_check_emulator_stat(self.emulator_start_stat, self.wait_time): @@ -376,10 +369,6 @@ def _get_android_device_ocr_language(self): if self.server == "CN": self.ocr_language = "zh-cn" elif self.server == "Global": - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - self.ocr_language = os.getenv("BAAS_ANDROID_GLOBAL_OCR_LANGUAGE", "en-us") - self.logger.warning("Android embedded mode cannot pull DeviceOption through adb; use " + self.ocr_language) - return basic_path = self.u2._adb_device.shell(f"echo $EXTERNAL_STORAGE").strip() src = "/".join([ basic_path, @@ -421,15 +410,6 @@ def _read_DeviceOption_ocr_language(self, _p): def check_atx(self): self.logger.info("--------------Check ATX install ----------------") - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - try: - version = requests.get("http://127.0.0.1:7912/version", timeout=3).text - except requests.RequestException as exc: - raise RuntimeError("Android embedded mode requires local uiautomator2 agent on 127.0.0.1:7912") from exc - self.logger.info("ATX agent version: [ " + version + " ].") - self.wait_uiautomator_start() - self.logger.info("Uiautomator2 service started.") - return _d = self.u2._wait_for_device() if not _d: raise RuntimeError("USB device %s is offline " + self.serial) @@ -743,9 +723,6 @@ def init_config(self): except Exception as e: self.logger.error("Config initialization failed") self.logger.error(e.__str__()) - - import traceback - traceback.print_exc() return False def swipe(self, fx, fy, tx, ty, duration=None, post_sleep_time=0): @@ -760,16 +737,7 @@ def u2_swipe(self, fx, fy, tx, ty, duration=None, post_sleep_time=0): if not self.flag_run: raise RequestHumanTakeOver self.logger.info(f"swipe from ( " + str(fx) + " , " + str(fy) + " ) --> ( " + str(tx) + " , " + str(ty) + " )") - width, height = self.resolution if getattr(self, "resolution", None) else (1280, 720) - max_x = max(0, int(width) - 1) - max_y = max(0, int(height) - 1) - self.u2.swipe( - min(max_x, max(0, int(fx * self.ratio))), - min(max_y, max(0, int(fy * self.ratio))), - min(max_x, max(0, int(tx * self.ratio))), - min(max_y, max(0, int(ty * self.ratio))), - duration, - ) + self.u2.swipe(fx * self.ratio, fy * self.ratio, tx * self.ratio, ty * self.ratio, duration) if post_sleep_time > 0: time.sleep(post_sleep_time) @@ -916,21 +884,6 @@ def set_screenshot_interval(self, interval): self.screenshot_interval = self.screenshot.set_screenshot_interval(interval) def wait_uiautomator_start(self): - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - for i in range(0, 10): - try: - self.u2.uiautomator.start() - while not self.u2.uiautomator.running(): - time.sleep(0.1) - self.latest_img_array = self.normalize_screenshot( - cv2.cvtColor(np.array(self.u2.screenshot()), cv2.COLOR_RGB2BGR) - ) - return - except Exception as e: - print(e) - time.sleep(0.3) - raise RuntimeError("Android embedded uiautomator2 agent is not responding") - for i in range(0, 10): try: self.u2.uiautomator.start() @@ -1135,9 +1088,6 @@ def check_screen_ratio(self, width, height): if screen_ratio == (16, 9): return self.logger.warning(f"Screen Ratio: {width}:{height} is not a precise 16:9 screen, we recommend you to use a precise 16:9 screen.") - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - self.logger.warning("Android embedded mode accepts non-16:9 device screens.") - return if self._accept_resolution(width, height, 16, 9, 0.05): self.logger.info(f"Screen Ratio close to 16:9. Accept it.") return diff --git a/core/config/config_set.py b/core/config/config_set.py index cbb7156b5..a1d8793ee 100644 --- a/core/config/config_set.py +++ b/core/config/config_set.py @@ -3,6 +3,8 @@ import re from core.config.generated_user_config import Config from core.config.generated_static_config import StaticConfig +from gui.util.customized_ui import BoundComponent +from gui.util.translator import baasTranslator as bt from dataclasses import asdict @@ -52,32 +54,20 @@ def get_server_mode(server): return 'JP' def get(self, key, default=None): - try: - from gui.util.translator import baasTranslator as bt - self._init_config() - value = getattr(self.config, key, default) - return bt.tr('ConfigTranslation', value) - except ModuleNotFoundError: - self._init_config() - return getattr(self.config, key, default) + self._init_config() + value = getattr(self.config, key, default) + return bt.tr('ConfigTranslation', value) def has(self, key): self._init_config() return hasattr(self.config, key) def set(self, key, value): - try: - from gui.util.translator import baasTranslator as bt - self._init_config() - value = bt.undo(value) - setattr(self.config, key, value) - self.save() - self.dynamic_update(key) - except ModuleNotFoundError: - self._init_config() - setattr(self.config, key, value) - self.save() - self.dynamic_update(key) + self._init_config() + value = bt.undo(value) + setattr(self.config, key, value) + self.save() + self.dynamic_update(key) def update(self, key, value): self.set(key, value) @@ -124,7 +114,6 @@ def inject(self, component, string_rule, attribute="setText"): :param attribute: Attribute to inject (default is setText) :return: BoundComponent, which can be ignored """ - from gui.util.customized_ui import BoundComponent bounded = BoundComponent(component, string_rule, self, attribute) self.inject_config_list.extend(re.findall(r'{(.*?)}', string_rule)) self.inject_comp_list.append(bounded) diff --git a/core/config/default_config.py b/core/config/default_config.py index 5a27e2f75..37b2b8792 100644 --- a/core/config/default_config.py +++ b/core/config/default_config.py @@ -338,7 +338,7 @@ DEFAULT_CONFIG = """ { - "name": "New Config", + "name": "新的配置", "purchase_arena_ticket_times": "0", "screenshot_interval": "0.3", "autostart": false, @@ -3644,6 +3644,14 @@ "JP_name": "ホシノ(臨戦)", "JP_implementation": true }, + { + "CN_name": "星野(临战)", + "CN_implementation": false, + "Global_name": "Hoshino (Battle)", + "Global_implementation": false, + "JP_name": "ホシノ(臨戦)", + "JP_implementation": true + }, { "CN_name": "萌绘(泳装)", "CN_implementation": false, diff --git a/core/device/Control.py b/core/device/Control.py index 11946b064..3ad991cd1 100644 --- a/core/device/Control.py +++ b/core/device/Control.py @@ -1,5 +1,4 @@ import sys -import os from core.device.control.nemu import NemuControl from core.device.control.adb import AdbControl @@ -21,8 +20,6 @@ def __init__(self, Baas_instance): def init_control_instance(self): self.method = self.config.control_method - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} and self.Baas_instance.is_android_device: - self.method = "uiautomator2" self.logger.info("Control method : " + self.method) if self.Baas_instance.is_android_device: diff --git a/core/device/Screenshot.py b/core/device/Screenshot.py index cbcadde47..b981b9130 100644 --- a/core/device/Screenshot.py +++ b/core/device/Screenshot.py @@ -1,5 +1,4 @@ import sys -import os from core.device.screenshot.scrcpy import ScrcpyScreenshot from core.device.screenshot.nemu import NemuScreenshot @@ -25,8 +24,6 @@ def __init__(self, Baas_instance): def init_screenshot_instance(self): self.method = self.config.screenshot_method - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} and self.Baas_instance.is_android_device: - self.method = "uiautomator2" self.logger.info("Screenshot method : " + self.method) if self.Baas_instance.is_android_device: diff --git a/core/device/connection.py b/core/device/connection.py index ae66c10ef..7ef6271f0 100644 --- a/core/device/connection.py +++ b/core/device/connection.py @@ -1,5 +1,4 @@ import re -import os import sys from adbutils import adb @@ -8,19 +7,14 @@ from core.exception import RequestHumanTakeOver # reference : [ https://github.com/LmeSzinc/AzurLaneAutoScript/blob/master/module/device/connection.py ] -def _is_android_embedded(): - return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} - - class Connection: - def __init__(self, Baas_instance, skip_package_detection=False): + def __init__(self, Baas_instance): self.Baas_thread = Baas_instance self.logger = Baas_instance.get_logger() self.config_set = Baas_instance.get_config() self.config = self.config_set.config self.static_config = self.config_set.static_config - self.skip_package_detection = skip_package_detection self.server = None if self.config.server in ["Steam国际服", "日服PC端"]: if self.config.server == "Steam国际服": @@ -38,13 +32,6 @@ def _init_android_device(self): self.package = None self.adbIP = self.config.adbIP self.adbPort = self.config.adbPort - if _is_android_embedded(): - self.serial = os.getenv("BAAS_ANDROID_U2_SERIAL", "127.0.0.1:7912").strip() or "127.0.0.1:7912" - self.adbIP, self.adbPort = self._split_serial(self.serial) - self.logger.info("Android embedded mode detected; use local uiautomator2 agent.") - self.logger.info(f"Serial : {self.serial}") - self._resolve_configured_package() - return is_usb_or_emulator_device = (self.adbIP == "" or self.adbPort == "") if self.adbIP == "" and self.adbPort != "": self.serial = self.adbPort @@ -59,31 +46,9 @@ def _init_android_device(self): self.check_serial() self.detect_device() self.adb_connect() - if not self.skip_package_detection: - self.detect_package() + self.detect_package() self.check_mumu_keep_alive() - def _resolve_configured_package(self): - server = self.config.server - if server == "auto": - raise RequestHumanTakeOver("Android embedded mode requires an explicit game server.") - if server == '官服' or server == 'B服': - self.server = 'CN' - elif server == '国际服' or server == '国际服青少年' or server == '韩国ONE': - self.server = 'Global' - elif server == '日服': - self.server = 'JP' - else: - raise RequestHumanTakeOver("Unsupported Android game server: " + str(server)) - - try: - self.package = self.static_config.package_name[server] - self.activity = self.static_config.activity_name[server] - except KeyError as exc: - raise RequestHumanTakeOver("Game package is not configured: " + str(server)) from exc - self.logger.info("Package : " + self.package) - self.logger.info("Server : " + self.server) - def _init_app_process(self): self.detect_app_window() @@ -135,15 +100,6 @@ def revise_serial(serial): serial = serial.replace('auto127.0.0.1', '127.0.0.1').replace('autoemulator', 'emulator') return str(serial) - @staticmethod - def _split_serial(serial): - serial = Connection.revise_serial(serial) - try: - ip, port = serial.rsplit(':', 1) - except ValueError: - return serial, "" - return ip, port - @staticmethod def serial_port(serial): try: @@ -369,14 +325,6 @@ def get_activity_name(self): def get_current_package(self): self.logger.info("Get Current Package.") - if _is_android_embedded(): - u2 = getattr(self.Baas_thread, "u2", None) - if u2 is None: - return "" - current = u2.app_current() - if isinstance(current, dict): - return current.get("package", "") - return getattr(current, "package", "") or "" for _ in range(3): d = adb.device(self.serial) try: diff --git a/core/device/uiautomator2_client.py b/core/device/uiautomator2_client.py index 3dd0b199a..02761bdd8 100644 --- a/core/device/uiautomator2_client.py +++ b/core/device/uiautomator2_client.py @@ -19,9 +19,6 @@ class U2Client: def __init__(self, serial): self.serial = serial - if os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} and not serial.startswith(("http://", "https://")): - self.connection = u2.connect("http://" + serial) - return if ":" in serial: self.connection = u2.connect(serial) else: diff --git a/core/ipc_manager.py b/core/ipc_manager.py index 64b2dae28..de0cfa049 100644 --- a/core/ipc_manager.py +++ b/core/ipc_manager.py @@ -1,13 +1,9 @@ import cv2 import numpy as np import os +from multiprocessing import shared_memory from core.exception import SharedMemoryError -try: - from multiprocessing import shared_memory -except ModuleNotFoundError: - shared_memory = None - class SharedMemory: shm_map = {} @@ -44,8 +40,6 @@ def __init__(self, name): self._init() def _init(self): - if shared_memory is None: - raise SharedMemoryError("multiprocessing.shared_memory is not available in this Python runtime") self.shm = shared_memory.SharedMemory(create=False, name=self.name) if self.shm is None: raise SharedMemoryError(f"Shared memory {self.name} not found") diff --git a/core/ocr/baas_ocr_client/Client.py b/core/ocr/baas_ocr_client/Client.py index 1daf21801..5aab8ab5c 100644 --- a/core/ocr/baas_ocr_client/Client.py +++ b/core/ocr/baas_ocr_client/Client.py @@ -5,12 +5,8 @@ import time import shutil import datetime -import platform import requests import subprocess -import ctypes -import threading -from typing import Optional from core.ipc_manager import SharedMemory from core.exception import SharedMemoryError, OcrInternalError @@ -49,137 +45,20 @@ def save(self): with open(self.config_path, "w") as f: json.dump(self.config, f, indent=4) -def _android_ocr_branch() -> Optional[str]: - if os.getenv("BAAS_ANDROID", "").lower() not in {"1", "true", "yes", "on"}: - return None - arch = platform.machine().lower() - if arch in {"aarch64", "arm64"}: - return "android-arm64-v8a" - if arch in {"x86_64", "amd64"}: - return "android-x86_64" - return None - - -def _is_android_runtime() -> bool: - return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} - - -def _android_library_abi_dir() -> str: - android_branch = _android_ocr_branch() - if android_branch == "android-arm64-v8a": - return "arm64-v8a" - if android_branch == "android-x86_64": - return "x86_64" - raise RuntimeError("Unsupported Android OCR architecture.") - - -ANDROID_LIBCXX_NAME = "libc++_baasxx.so" - - -def _server_folder_path() -> str: - base = os.path.dirname(__file__) - android_branch = _android_ocr_branch() - if android_branch: - return os.path.join(base, "bin-android", android_branch) - return os.path.join(base, "bin") - - class BaasOcrClient: - server_folder_path = _server_folder_path() + server_folder_path = os.path.join(os.path.dirname(__file__), "bin") executable_name = "BAAS_ocr_server" if sys.platform == "win32": executable_name += ".exe" def __init__(self): - self._android_server_lib = None - self._android_server_thread = None - if _is_android_runtime(): - self.server_folder_path = self._prepare_android_runtime_folder() - BaasOcrClient.server_folder_path = self.server_folder_path - self.executable_name = "libBAAS_ocr_server.so" - self.exe_path = self._android_server_library_path(self.server_folder_path) - else: - self.exe_path = os.path.join(self.server_folder_path, self.executable_name) + self.exe_path = os.path.join(self.server_folder_path, self.executable_name) if not os.path.exists(self.exe_path): raise FileNotFoundError("Didn't find ocr server executable.") self.config = ServerConfig() self.server_process = None - self._android_dependency_libs = [] self.clear_log() - @staticmethod - def _android_server_library_path(root: str) -> str: - return os.path.join(root, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") - - def _prepare_android_runtime_folder(self) -> str: - source_root = _server_folder_path() - internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() - target_root = os.path.join(internal_root, "ocr-runtime", _android_ocr_branch() or "android") if internal_root else "" - target_binary = self._android_server_library_path(target_root) if target_root else "" - target_version = os.path.join(target_root, ".baas-ocr-prebuild-sha") if target_root else "" - try: - with open(target_version, "r", encoding="utf-8") as fp: - target_sha = fp.read().strip() - except OSError: - target_sha = "" - if target_sha and target_binary and os.path.exists(target_binary): - source_version = os.path.join(source_root, ".baas-ocr-prebuild-sha") - try: - with open(source_version, "r", encoding="utf-8") as fp: - source_sha = fp.read().strip() - except OSError: - source_sha = "" - if not source_sha or source_sha == target_sha: - return target_root - - source_binary = self._android_server_library_path(source_root) - if not os.path.exists(source_binary): - raise FileNotFoundError("Didn't find Android ocr server library.") - - if not internal_root: - return source_root - - source_version = os.path.join(source_root, ".baas-ocr-prebuild-sha") - try: - with open(source_version, "r", encoding="utf-8") as fp: - source_sha = fp.read().strip() - except OSError: - source_sha = "" - - if source_sha and source_sha == target_sha and os.path.exists(target_binary): - return target_root - if not source_sha and target_sha and os.path.exists(target_binary): - return target_root - - if os.path.exists(target_root): - shutil.rmtree(target_root, ignore_errors=True) - shutil.copytree(source_root, target_root) - native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() - native_libcxx = os.path.join(native_lib_dir, "libc++_shared.so") if native_lib_dir else "" - target_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), "libc++_shared.so") - target_baas_libcxx = os.path.join(target_root, "lib", _android_library_abi_dir(), ANDROID_LIBCXX_NAME) - source_libcxx = native_libcxx if native_libcxx and os.path.exists(native_libcxx) else target_libcxx - if source_libcxx and os.path.exists(source_libcxx): - if os.path.abspath(source_libcxx) != os.path.abspath(target_baas_libcxx): - shutil.copy2(source_libcxx, target_baas_libcxx) - self._replace_library_name(target_baas_libcxx, "libc++_shared.so", ANDROID_LIBCXX_NAME) - self._replace_library_name(self._android_server_library_path(target_root), "libc++_shared.so", ANDROID_LIBCXX_NAME) - os.chmod(self._android_server_library_path(target_root), 0o755) - return target_root - - @staticmethod - def _replace_library_name(path: str, old_name: str, new_name: str) -> None: - old = old_name.encode("utf-8") - new = new_name.encode("utf-8") - if len(old) != len(new): - raise ValueError("Replacement library name must have the same byte length.") - with open(path, "rb") as fp: - data = fp.read() - patched = data.replace(old, new) - if patched != data: - with open(path, "wb") as fp: - fp.write(patched) - # clear log since time_distance days ago def clear_log(self, time_distance=7): log_folder_path = os.path.join(self.server_folder_path, "output") @@ -230,9 +109,6 @@ def disable_thread_pool(self): def start_server(self): if self.server_process is not None: return - if _is_android_runtime(): - self._start_android_server() - return # chmod +x BAAS_ocr_server if sys.platform == "linux": subprocess.run(["chmod", "+x", self.exe_path]) @@ -265,68 +141,7 @@ def start_server(self): raise RuntimeError("Fail to start ocr server. " + e.__str__()) time.sleep(0.1) - def _start_android_server(self): - lib_dir = os.path.dirname(self.exe_path) - native_lib_dir = os.getenv("BAAS_ANDROID_NATIVE_LIBRARY_DIR", "").strip() - dependency_paths = [] - baas_libcxx = os.path.join(lib_dir, ANDROID_LIBCXX_NAME) - if os.path.exists(baas_libcxx): - dependency_paths.append(baas_libcxx) - elif os.path.exists(os.path.join(lib_dir, "libc++_shared.so")): - dependency_paths.append(os.path.join(lib_dir, "libc++_shared.so")) - dependency_paths.extend(os.path.join(lib_dir, name) for name in ["libonnxruntime.so", "libopencv_java4.so"]) - loaded = set() - for path in dependency_paths: - if path in loaded: - continue - if os.path.exists(path): - self._android_dependency_libs.append(ctypes.CDLL(path, mode=ctypes.RTLD_GLOBAL)) - loaded.add(path) - try: - server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) - except OSError: - self._android_system_load(self.exe_path) - server_lib = ctypes.CDLL(self.exe_path, mode=ctypes.RTLD_GLOBAL) - server_lib.start_server.argtypes = [ctypes.c_char_p] - server_lib.start_server.restype = None - server_lib.stop_server.argtypes = [] - server_lib.stop_server.restype = None - self._android_server_lib = server_lib - server_root = os.fsencode(self.server_folder_path) - self._android_server_thread = threading.Thread( - target=lambda: server_lib.start_server(server_root), - name="baas-ocr-android-server", - daemon=True, - ) - self._android_server_thread.start() - self.server_process = self._android_server_thread - for _ in range(0, 100): - try: - ret = requests.get(self.config.base_url, timeout=1) - if ret.status_code == 200: - break - except requests.exceptions.RequestException as e: - if _ == 99: - raise RuntimeError("Fail to start ocr server. " + e.__str__()) - time.sleep(0.1) - - @staticmethod - def _android_system_load(path: str) -> None: - from java import jclass - - jclass("io.github.kiramei.baas_tauri.NativeLoader").load(path) - def stop_server(self): - if _is_android_runtime(): - if self._android_server_lib is not None: - self._android_server_lib.stop_server() - if self._android_server_thread is not None: - self._android_server_thread.join(timeout=10) - self.server_process = None - self._android_server_thread = None - self._android_server_lib = None - self._android_dependency_libs = [] - return self.server_process.stdin.write("exit\n") self.server_process.stdin.flush() return_code = self.server_process.wait(10) diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index 31b4a0a03..fb8f8cb44 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -1,18 +1,4 @@ -import sys -import io -import shutil -import os -import platform -import subprocess -import time -import tempfile -import zipfile -from typing import Optional - -import pygit2 -import requests -from pygit2 import Commit -from pygit2.enums import ResetMode +import sys, io # ================================ # Check the std::in and std::out Status before @@ -25,413 +11,92 @@ sys.stdout = io.TextIOWrapper(io.BytesIO()) # ================================ +import shutil +import os from core.exception import OcrInternalError +from dulwich import porcelain +from dulwich.repo import Repo +import platform -if sys.platform not in ["win32", "linux", "darwin"]: +if sys.platform not in ['win32', 'linux', 'darwin']: raise Exception("Ocr Unsupported platform " + sys.platform) OCR_SERVER_PREBUILD_URL = "https://gitee.com/pur1fy/baas_-cpp_prebuild.git" -OCR_SERVER_PREBUILD_ARCHIVE_URLS = [ - "https://baas-cdn.kiramei.workers.dev/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", - "https://codeload.github.com/pur1fying/BAAS_Cpp_prebuild/zip/refs/heads/{branch}", - "https://v4.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", - "https://v6.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", - "https://cdn.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", - "https://gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", - "https://gh.sevencdn.com/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", - "https://githubfast.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", - "https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", -] -OCR_SERVER_PREBUILD_API_URL = "https://api.github.com/repos/pur1fying/BAAS_Cpp_prebuild/branches/{branch}" SERVER_INSTALLER_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) - - -def _android_ocr_branch() -> Optional[str]: - if os.getenv("BAAS_ANDROID", "").lower() not in {"1", "true", "yes", "on"}: - return None - arch = platform.machine().lower() - if arch in {"aarch64", "arm64"}: - return "android-arm64-v8a" - if arch in {"x86_64", "amd64"}: - return "android-x86_64" - raise Exception("Unsupported Android machine architecture " + arch) - - -branch_map = { - "win32": {"amd64": "windows-x64"}, - "linux": {"x86_64": "linux-x64"}, - "darwin": {"arm64": "macos-arm64"}, +SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, 'bin') + +branch = { + 'win32': { + 'amd64': 'windows-x64', + }, + 'linux': { + 'x86_64': 'linux-x64', + }, + 'darwin': { + 'arm64': 'macos-arm64', + }, } -TARGET_BRANCH = _android_ocr_branch() -if TARGET_BRANCH is None: - arch_map = branch_map[sys.platform] - arch = platform.machine().lower() - if arch not in arch_map: - raise Exception("Unsupported machine architecture " + arch) - TARGET_BRANCH = arch_map[arch] -SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, "bin-android", TARGET_BRANCH) if TARGET_BRANCH.startswith( - "android-" -) else os.path.join(SERVER_INSTALLER_DIR_PATH, "bin") -ANDROID_VERSION_FILE = os.path.join(SERVER_BIN_DIR, ".baas-ocr-prebuild-sha") - - -def _is_android_runtime() -> bool: - return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} - - -def _android_library_abi_dir() -> str: - if TARGET_BRANCH == "android-arm64-v8a": - return "arm64-v8a" - if TARGET_BRANCH == "android-x86_64": - return "x86_64" - raise OcrInternalError(f"Unsupported Android OCR branch: {TARGET_BRANCH}") - - -def _server_binary_path() -> str: - if TARGET_BRANCH.startswith("android-"): - return os.path.join(SERVER_BIN_DIR, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") - return os.path.join(SERVER_BIN_DIR, "BAAS_ocr_server.exe" if sys.platform == "win32" else "BAAS_ocr_server") - - -def _android_internal_runtime_root() -> str: - internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() - if not internal_root: - return "" - return os.path.join(internal_root, "ocr-runtime", TARGET_BRANCH) - - -def _android_internal_binary_path() -> str: - runtime_root = _android_internal_runtime_root() - if not runtime_root: - return "" - return os.path.join(runtime_root, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") +branch = branch[sys.platform] +arch = platform.machine().lower() +if arch not in branch: + raise Exception("Unsupported machine architecture " + arch) +branch = branch[arch] -def _android_internal_version_file() -> str: - runtime_root = _android_internal_runtime_root() - if not runtime_root: - return "" - return os.path.join(runtime_root, ".baas-ocr-prebuild-sha") - - -def _read_android_installed_sha() -> str: - try: - with open(ANDROID_VERSION_FILE, "r", encoding="utf-8") as fp: - return fp.read().strip() - except OSError: - return "" - - -def _read_android_internal_sha() -> str: - version_file = _android_internal_version_file() - if not version_file: - return "" - try: - with open(version_file, "r", encoding="utf-8") as fp: - return fp.read().strip() - except OSError: - return "" - - -def _get_android_remote_sha(branch: str) -> Optional[str]: - try: - response = requests.get(OCR_SERVER_PREBUILD_API_URL.format(branch=branch), timeout=15) - response.raise_for_status() - data = response.json() - sha = data.get("commit", {}).get("sha") - return str(sha) if sha else None - except Exception: - return None - - -def _download_android_archive(branch: str, archive_path: str, logger=None) -> str: - last_error: Optional[Exception] = None - for template in OCR_SERVER_PREBUILD_ARCHIVE_URLS: - url = template.format(branch=branch) - try: - with requests.get(url, stream=True, timeout=(8, 90)) as response: - response.raise_for_status() - with open(archive_path, "wb") as fp: - for chunk in response.iter_content(chunk_size=1024 * 256): - if chunk: - fp.write(chunk) - return url - except Exception as exc: - last_error = exc - if logger is not None: - logger.warning(f"Failed to download Android OCR prebuild from {url}: {exc}") - raise OcrInternalError(f"Failed to download Android OCR prebuild archive: {last_error}") - - -def _find_android_archive_root(extract_root: str) -> str: - library_name = "libBAAS_ocr_server.so" - for current_root, _dirs, files in os.walk(extract_root): - if library_name in files and os.path.basename(current_root) == _android_library_abi_dir(): - return os.path.dirname(os.path.dirname(current_root)) - candidates = [ - os.path.join(extract_root, name) - for name in os.listdir(extract_root) - if os.path.isdir(os.path.join(extract_root, name)) - ] - if len(candidates) == 1: - return candidates[0] - raise OcrInternalError("Android OCR prebuild archive does not contain libBAAS_ocr_server.so") - - -def _install_android_prebuild(logger) -> None: - if not TARGET_BRANCH.startswith("android-"): - raise OcrInternalError(f"Invalid Android OCR branch: {TARGET_BRANCH}") - - remote_sha = _get_android_remote_sha(TARGET_BRANCH) - local_sha = _read_android_installed_sha() - server_binary_path = _server_binary_path() - internal_sha = _read_android_internal_sha() - internal_binary_path = _android_internal_binary_path() - if remote_sha and internal_sha == remote_sha and os.path.exists(internal_binary_path): - logger.info("Android Ocr Server runtime already available.") - return - if not remote_sha and internal_sha and os.path.exists(internal_binary_path): - logger.warning("Android OCR remote SHA unavailable; using internal runtime prebuild.") - return - if remote_sha and local_sha == remote_sha and os.path.exists(server_binary_path): - logger.info("Ocr Server No updates available.") - return - if not remote_sha and local_sha and os.path.exists(server_binary_path): - logger.warning("Android OCR remote SHA unavailable; using installed prebuild.") - return - - logger.info(f"Installing Android Ocr Server prebuild for {TARGET_BRANCH}.") - with tempfile.TemporaryDirectory(prefix="baas-ocr-android-") as tmp: - archive_path = os.path.join(tmp, "ocr-prebuild.zip") - source_url = _download_android_archive(TARGET_BRANCH, archive_path, logger) - extract_root = os.path.join(tmp, "extract") - os.makedirs(extract_root, exist_ok=True) - with zipfile.ZipFile(archive_path) as archive: - archive.extractall(extract_root) - source_root = _find_android_archive_root(extract_root) - if os.path.exists(SERVER_BIN_DIR): - shutil.rmtree(SERVER_BIN_DIR, ignore_errors=True) - shutil.copytree(source_root, SERVER_BIN_DIR) - - if os.path.exists(server_binary_path): - os.chmod(server_binary_path, os.stat(server_binary_path).st_mode | 0o755) +def check_git(logger): + if not os.path.exists(SERVER_BIN_DIR + '/.git'): + clone_repo(logger) else: - raise OcrInternalError("Android OCR prebuild did not install libBAAS_ocr_server.so") - - with open(ANDROID_VERSION_FILE, "w", encoding="utf-8") as fp: - fp.write(remote_sha or source_url) - logger.info("Ocr Server Install success.") - - -class OcrRepoManager: - """ - Manages the OCR Server git repository. - Priority: System 'git' > pygit2 (except for rollback). - """ - - def __init__(self, repo_path: str, remote_url: str, branch: str, logger): - self.repo_path = repo_path - self.remote_url = remote_url - self.branch = branch - self.logger = logger - self.git_executable = shutil.which("git") - self.git_dir = os.path.join(repo_path, ".git") - - def _run_git_cmd(self, args: list, cwd: Optional[str] = None) -> str: - """Executes a system git command.""" - if not self.git_executable: - raise FileNotFoundError("System git not found") - - target_cwd = cwd if cwd else self.repo_path - - # Ensure directory exists before running command if not cloning - if cwd is None and not os.path.exists(target_cwd): - raise FileNotFoundError(f"Repo directory {target_cwd} does not exist") - - proc = subprocess.run( - [self.git_executable] + args, - cwd=target_cwd, - capture_output=True, - text=True, - check=True - ) - return proc.stdout.strip() - - def get_local_sha(self) -> str: - """Returns the SHA of the current local HEAD.""" - if self.git_executable: - try: - return self._run_git_cmd(["rev-parse", "HEAD"]) - except subprocess.CalledProcessError: - self.logger.warning("System git failed to get local SHA, falling back to pygit2.") - - # Fallback to pygit2 - repo = pygit2.Repository(self.repo_path) - return str(repo.head.target) - - def get_remote_sha(self) -> Optional[str]: - """Returns the SHA of the target branch on the remote.""" - if self.git_executable: - try: - # git ls-remote refs/heads/ - # Output: \trefs/heads/ - ref = f"refs/heads/{self.branch}" - output = self._run_git_cmd(["ls-remote", self.remote_url, ref], cwd=os.getcwd()) - if output: - return output.split()[0] - except Exception as e: - self.logger.warning(f"System git failed to get remote SHA: {e}") - - # Fallback to pygit2 + logger.info("Ocr Server Update check.") try: - with tempfile.TemporaryDirectory() as tmp: - repo = pygit2.init_repository(tmp, bare=True) - remote = repo.remotes.create_anonymous(self.remote_url) - target_ref_name = f"refs/heads/{self.branch}" - for head in remote.ls_remotes(): - if head.get("name") == target_ref_name: - return str(head.get("oid")) - except Exception as e: - self.logger.error(f"pygit2 failed to get remote info: {e}") - return None - return None - - def clone(self) -> None: - """Clones the repository.""" - if os.path.exists(self.repo_path): - self.logger.warning("Target directory not empty, removing old files...") - shutil.rmtree(self.repo_path, ignore_errors=True) - - for i in range(1, 4): - try: - if self.git_executable: - self.logger.info(f"Cloning with system git (Attempt {i})...") - # git clone -b - self._run_git_cmd( - ["clone", "-b", self.branch, self.remote_url, self.repo_path], - cwd=os.path.dirname(self.repo_path) - ) - else: - self.logger.info(f"Cloning with pygit2 (Attempt {i})...") - pygit2.clone_repository( - self.remote_url, - self.repo_path, - checkout_branch=self.branch, - ) - self.logger.info("Ocr Server Install success.") - return - except Exception as e: - self.logger.error(f"Failed to clone (Attempt {i}): {e}") - if i == 3: - raise OcrInternalError("Failed to install the BAAS_ocr_server. Please check your network") - time.sleep(1) - - def update(self) -> None: - """Updates the repository to the latest remote state.""" - self.logger.info("Pulling updates from the remote repository...") - - if self.git_executable: - try: - # 1. Fetch - self._run_git_cmd(["fetch", "origin", self.branch]) - # 2. Reset --hard - # We use FETCH_HEAD to ensure we are at the exact state we just fetched - self._run_git_cmd(["reset", "--hard", "FETCH_HEAD"]) - self.logger.info("Ocr Server Update success (System Git).") - return - except Exception as e: - self.logger.error(f"System git update failed: {e}. Falling back to pygit2.") - - # Fallback to pygit2 - try: - repo = pygit2.Repository(self.repo_path) - # Ensure remote exists - remote = repo.remotes["origin"] if "origin" in repo.remotes.names() else repo.remotes.create("origin", - self.remote_url) - - refspec = f"refs/heads/{self.branch}:refs/remotes/origin/{self.branch}" - remote.fetch(refspecs=[refspec]) - - remote_ref = f"refs/remotes/origin/{self.branch}" - remote_commit = repo.revparse_single(remote_ref) - - if not isinstance(remote_commit, Commit): - remote_commit = repo[remote_commit.target] - - repo.reset(remote_commit.id, ResetMode.HARD) - repo.checkout_tree(remote_commit.tree) - self.logger.info("Ocr Server Update success (pygit2).") - except Exception as e: - self.logger.error("Failed to update the BAAS_ocr_server.") - raise OcrInternalError(f"Update failed: {e}") - - - -def check_git(logger): - """ - Main entry point to check and update the OCR Server repo. - """ - if _is_android_runtime(): - _install_android_prebuild(logger) - return - - manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) - - # 1. Ensure Repo Exists - if not os.path.exists(manager.git_dir): - manager.clone() - return - - logger.info("Ocr Server Update check.") - - # 2. Validate Local Repo Integrity - try: - local_sha = manager.get_local_sha() - except Exception: - logger.warning("Git Repo corrupted, remove .git folder and reinstall.") - shutil.rmtree(manager.git_dir, ignore_errors=True) - manager.clone() - return - - # 3. Check Remote - try: - remote_sha = manager.get_remote_sha() - except Exception as e: - raise OcrInternalError(f"Failed to fetch remote info: {e}") - - if not remote_sha: - logger.warning(f"Remote branch '{TARGET_BRANCH}' not found.") - return - - logger.info(f"remote_sha: {remote_sha}") - logger.info(f"local_sha : {local_sha}") - - # 4. Update if necessary - if local_sha == remote_sha: - logger.info("Ocr Server No updates available.") - return - - # Perform update (System git preferred, pygit2 fallback) - manager.update() - - # Verify update - try: - new_local_sha = manager.get_local_sha() - if new_local_sha != remote_sha: - logger.warning("Failed to update the BAAS_ocr_server (SHA mismatch), please check your network.") - except Exception: - pass + repo = Repo(SERVER_BIN_DIR) + # Get local SHA + local_sha = repo.head().decode('ascii') + except Exception: + logger.warning("Git Repo corrupted, remove .git folder and reinstall.") + shutil.rmtree(SERVER_BIN_DIR + '/.git') + clone_repo(logger) + return + # Get remote SHA + remote_refs = porcelain.ls_remote(OCR_SERVER_PREBUILD_URL) + remote_sha = remote_refs.get(b'refs/heads/' + branch.encode('ascii')).decode('ascii') + + logger.info(f"remote_sha: {remote_sha}") + logger.info(f"local_sha : {local_sha}") + + if local_sha == remote_sha: + logger.info("Ocr Server No updates available.") + else: + logger.info("Pulling updates from the remote repository...") + # Reset the local repository to the state of the remote repository + porcelain.reset(repo, mode='hard') + # Pull the latest changes from the remote repository + for i in range(1, 4): + try: + porcelain.pull(repo, OCR_SERVER_PREBUILD_URL, branch, protocol_version=0) + break + except Exception as e: + if i == 3: + raise OcrInternalError("Failed to update the BAAS_ocr_server. Please check your network") + logger.error(f"Failed to update BAAS_ocr_server, retrying... {i}") + logger.error(e) + updated_local_sha = repo.head().decode('ascii') + if updated_local_sha == remote_sha: + logger.info("Ocr Server Update success.") + else: + logger.warning("Failed to update the BAAS_ocr_server, please check your network.") def clone_repo(logger): - """ - Wrapper for cloning the repo. - """ logger.info("Installing Ocr Server, please hang on...") - if _is_android_runtime(): - _install_android_prebuild(logger) - return - - manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) - manager.clone() + for i in range(1, 4): + try: + porcelain.clone(OCR_SERVER_PREBUILD_URL, SERVER_BIN_DIR, branch=branch) + break + except Exception as e: + if i == 3: + raise OcrInternalError("Failed to install the BAAS_ocr_server. Please check your network") + logger.error(f"Failed to install BAAS_ocr_server, retrying... {i}") + logger.error(e.__str__()) + logger.info("Ocr Server Install success.") diff --git a/core/scheduler.py b/core/scheduler.py index 32c59f96d..b02db3b1a 100644 --- a/core/scheduler.py +++ b/core/scheduler.py @@ -118,7 +118,6 @@ def update_valid_task_queue(self): _valid_event = sorted(_valid_event, key=lambda x: x['priority']) # sort by priority self._valid_task_queue = [] - self._waitingTaskDisplayQueue = [] for i in range(0, len(_valid_event)): self._waitingTaskDisplayQueue.append(_valid_event[i]['event_name']) thisTask = { diff --git a/core/utils.py b/core/utils.py index cce2d7375..62bf11825 100644 --- a/core/utils.py +++ b/core/utils.py @@ -1,15 +1,14 @@ import logging import sys import threading -import queue from datetime import datetime, timedelta, timezone from typing import Union from rich.console import Console +from rich.markup import escape console = Console() -levels_str = ["INFO", "WARNING", "ERROR", "CRITICAL"] def delay(wait=1): def decorator(func): @@ -44,15 +43,13 @@ class Logger: Logger class for logging """ - def __init__(self, logger_signal, jsonify=False): + def __init__(self, logger_signal): """ :param logger_signal: Logger signal broadcasts log level and log message """ # Init logger signal, logs and logger, # logger signal is used to output log to logger box or other output self.logs = "" - self.jsonify = jsonify - self.log_collector = queue.Queue() self.logger_signal = logger_signal if not self.logger_signal: # if the logger signal is not configured, we use rich traceback then @@ -83,25 +80,21 @@ def __out__(self, message: str, level: int = 1, raw_print=False) -> None: self.logger_signal.emit(level, message) return - if self.jsonify: - self.log_collector.put({ - "time": datetime.now(), - "level": level, - "message": message - }) - logging.log((level + 1) * 10, message) - return - while len(logging.root.handlers) > 0: logging.root.handlers.pop() + levels_str = ["INFO", "WARNING", "ERROR", "CRITICAL"] # If logger signal is not None, output log to logger signal # else output log to console + levels_color = ["#2d8cf0", "#ff9900", "#ed3f14", "#3e0480"] if self.logger_signal is not None: self.logs += f"{levels_str[level - 1]} | {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | {message}" self.logger_signal.emit(level, message) else: - logging.log((level + 1) * 10, message) + console.print(f'[{levels_color[level - 1]}]' + f'{levels_str[level - 1]} |' + f' {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} |' + f' {escape(message)}[/]', soft_wrap=True) def info(self, message: str) -> None: """ diff --git a/main.py b/main.py index 4b3f7168b..bec4a5a7c 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,5 @@ import json import os -import traceback from core.ocr import ocr from core.utils import Logger @@ -9,36 +8,30 @@ from core.ocr.baas_ocr_client.server_installer import check_git class Main: - def __init__(self, logger_signal=None, ocr_needed=None, **kwargs): + def __init__(self, logger_signal=None, ocr_needed=None): self.ocr_needed = ocr_needed self.ocr = None - self.logger = Logger(logger_signal, jsonify=kwargs.get("jsonify", False)) + self.logger = Logger(logger_signal) self.project_dir = os.path.abspath(os.path.dirname(__file__)) self.logger.info(self.project_dir) - if not kwargs.get("lazy_data", False): - self.init_all_data() + self.init_all_data() self.threads = {} - def init_all_data(self, need_ocr_update_check=True): - if not self.init_ocr(need_ocr_update_check=need_ocr_update_check): - if os.getenv("BAAS_ALLOW_MISSING_OCR", "").strip().lower() in {"1", "true", "yes", "on"}: - self.logger.warning("Ocr Init Incomplete. Continuing because missing OCR is allowed.") - else: - self.logger.error("Ocr Init Incomplete Please restart .") - return False - self.init_static_config() - self.logger.info("-- All Data Initialization Complete Script ready--") - return True + def init_all_data(self): + if not self.init_ocr(): + self.logger.error("Ocr Init Incomplete Please restart .") + return + self.init_static_config() + self.logger.info("-- All Data Initialization Complete Script ready--") - def init_ocr(self, need_ocr_update_check=True): - if need_ocr_update_check: - try: - check_git(self.logger) - except Exception as e: - self.logger.error("OCR Update Failed.") - import traceback - self.logger.error(traceback.format_exc()) - self.logger.info("Try to Start OCR Server Without Update.") + def init_ocr(self): + try: + check_git(self.logger) + except Exception as e: + self.logger.error("OCR Update Failed.") + import traceback + self.logger.error(traceback.format_exc()) + self.logger.info("Try to Start OCR Server Without Update.") try: self.ocr = ocr.Baas_ocr(logger=self.logger, ocr_needed=self.ocr_needed) @@ -77,7 +70,7 @@ def init_static_config(self): return True except Exception as e: self.logger.error("Static Config initialization failed") - self.logger.error(traceback.format_exc()) + self.logger.error(e.__str__()) return False def operate_dict(self, dic): diff --git a/module/cafe_reward.py b/module/cafe_reward.py index 8a1dd6602..74992c186 100644 --- a/module/cafe_reward.py +++ b/module/cafe_reward.py @@ -1,30 +1,16 @@ -import cv2 -import os -import time -import queue -import threading +import cv2 +import time +import queue +import threading import numpy as np from core import image, color, picture -from core.utils import merge_nearby_coordinates -from statistics import median - -_happy_face_templates = None -_happy_face_match_scale = 0.75 -_happy_face_match_roi = (0, 45, 1280, 555) - - -def _resize_for_happy_face_match(img): - height, width = img.shape[:2] - size = ( - max(1, int(round(width * _happy_face_match_scale))), - max(1, int(round(height * _happy_face_match_scale))), - ) - return cv2.resize(img, size, interpolation=cv2.INTER_AREA) - - -def implement(self): +from core.utils import merge_nearby_coordinates +from statistics import median + + +def implement(self): self.to_main_page() to_cafe(self, True) if self.config.cafe_reward_collect_hour_reward and get_cafe_earning_status(self): @@ -95,83 +81,16 @@ def to_no2_cafe(self): return -def _get_happy_face_templates(): - global _happy_face_templates - if _happy_face_templates is None: - templates = [] - for i in range(1, 5): - template = cv2.imread("src/images/CN/cafe/happy_face" + str(i) + ".png") - if template is None: - templates.append(None) - continue - template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) - template = _resize_for_happy_face_match(template) - templates.append(template) - _happy_face_templates = templates - return _happy_face_templates - - -def _dedupe_happy_face_points(points): - deduped = [] - for x, y in sorted(points, key=lambda item: (item[1], item[0])): - if any(abs(x - px) <= 24 and abs(y - py) <= 24 for px, py in deduped): - continue - deduped.append([x, y]) - if len(deduped) >= 32: - break - return deduped - - -def _match_happy_faces_by_color(img): - roi_x0, roi_y0, roi_x1, roi_y1 = _happy_face_match_roi - search_img = img[roi_y0:roi_y1, roi_x0:roi_x1] - hsv = cv2.cvtColor(search_img, cv2.COLOR_BGR2HSV) - lower_red = cv2.inRange(hsv, np.array([0, 55, 120]), np.array([12, 255, 255])) - upper_red = cv2.inRange(hsv, np.array([160, 55, 120]), np.array([179, 255, 255])) - mask = cv2.bitwise_or(lower_red, upper_red) - count, _, stats, centers = cv2.connectedComponentsWithStats(mask, 8) - points = [] - for i in range(1, count): - _, _, width, height, area = stats[i] - if not (8 <= area <= 500 and 4 <= width <= 40 and 4 <= height <= 40): - continue - cx, cy = centers[i] - points.append([int(roi_x0 + cx), int(roi_y0 + cy + 58)]) - return _dedupe_happy_face_points(points) - - -def match(img): - color_matches = _match_happy_faces_by_color(img) - if color_matches or os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"}: - return color_matches - - res = [] - roi_x0, roi_y0, roi_x1, roi_y1 = _happy_face_match_roi - search_img = img[roi_y0:roi_y1, roi_x0:roi_x1] - search_img = cv2.cvtColor(search_img, cv2.COLOR_BGR2GRAY) - search_img = _resize_for_happy_face_match(search_img) - for template in _get_happy_face_templates(): - if template is None: - continue - result = cv2.matchTemplate(search_img, template, cv2.TM_CCOEFF_NORMED) - threshold = 0.75 - suppress_x = max(20, template.shape[1]) - suppress_y = max(20, template.shape[0]) - for _ in range(16): - _, max_val, _, max_loc = cv2.minMaxLoc(result) - if max_val < threshold: - break - pt_x, pt_y = max_loc - res.append([ - int(roi_x0 + (pt_x + template.shape[1] / 2) / _happy_face_match_scale), - int(roi_y0 + (pt_y + template.shape[0] / 2) / _happy_face_match_scale + 58), - ]) - left = max(0, pt_x - suppress_x) - right = min(result.shape[1], pt_x + suppress_x + 1) - top = max(0, pt_y - suppress_y) - bottom = min(result.shape[0], pt_y + suppress_y + 1) - result[top:bottom, left:right] = -1 - return res +def match(img): + res = [] + for i in range(1, 5): + template = cv2.imread("src/images/CN/cafe/happy_face" + str(i) + ".png") + result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) + threshold = 0.75 + locations = np.where(result >= threshold) + for pt in zip(*locations[::-1]): + res.append([int(pt[0] + template.shape[1] / 2), int(pt[1] + template.shape[0] / 2 + 58)]) + return res def cafe_to_gift(self): @@ -196,15 +115,10 @@ def screenshot_thread(self, delay): self.update_screenshot_array() cv2.imwrite("cafe_reward_shot.png", self.latest_img_array) -def gift_to_cafe(self): - if self.is_android_device: - self.click(1240, 574, wait_over=True) - time.sleep(0.25) - return - - img_possibles = { - 'cafe_gift': (1240, 574), - } +def gift_to_cafe(self): + img_possibles = { + 'cafe_gift': (1240, 574), + } rgb_possibles = {"gift": (1240, 574)} rgb_ends = "cafe" picture.co_detect(self, rgb_ends, rgb_possibles, None, img_possibles, True) @@ -223,17 +137,14 @@ def swipe_gift_thread(self, duration, ret_queue): self.swipe(131, 660, 1280, 660, duration=duration) ret_queue.put(round(time.time() - start_t, 3)) -def swipe_gift_and_screenshot(self): - shotDelay = self.config.cafe_reward_interaction_shot_delay - if self.is_android_device: - t1 = threading.Thread(target=screenshot_thread, args=(self, shotDelay)) - t1.start() - start_t = time.time() - self.u2_swipe(131, 660, 1280, 660, duration=0.3) - t1.join(timeout=max(1.0, shotDelay + 1.0)) - swipe_t = round(time.time() - start_t, 3) - self.logger.info("Gift swipe duration : [ " + str(swipe_t) + " ]") - return swipe_t +def swipe_gift_and_screenshot(self): + shotDelay = self.config.cafe_reward_interaction_shot_delay + if self.is_android_device: + t1 = threading.Thread(target=screenshot_thread, args=(self, shotDelay)) + t1.start() + start_t = time.time() + self.u2_swipe(131, 660, 1280, 660, duration=0.5) + return round(time.time() - start_t, 3) else: q = queue.Queue() t1 = threading.Thread(target=swipe_gift_thread, args=(self, 1, q)) @@ -243,13 +154,11 @@ def swipe_gift_and_screenshot(self): t1.join() return q.get() -def find_student_position(self): - swipe_t = swipe_gift_and_screenshot(self) - match_start_t = time.time() - img = cv2.resize(self.latest_img_array, (1280, 720), interpolation=cv2.INTER_AREA) - res = match(img) - self.logger.info("Cafe interaction match duration : [ " + str(round(time.time() - match_start_t, 3)) + " ], candidates : [ " + str(len(res)) + " ]") - if not res: +def find_student_position(self): + swipe_t = swipe_gift_and_screenshot(self) + img = cv2.resize(self.latest_img_array, (1280, 720), interpolation=cv2.INTER_AREA) + res = match(img) + if not res: self.logger.info("No interaction found") if swipe_t < self.config.cafe_reward_interaction_shot_delay + 0.3: self.logger.warning( diff --git a/service/injection.py b/service/injection.py index 817943738..da8f21294 100644 --- a/service/injection.py +++ b/service/injection.py @@ -464,6 +464,149 @@ def u2_init(self, serial): U2Client._baas_service_injected = True +def _patch_cafe_reward() -> None: + import cv2 + import numpy as np + import threading + import time + from module import cafe_reward + + if getattr(cafe_reward, "_baas_service_injected", False): + return + + original_gift_to_cafe = cafe_reward.gift_to_cafe + original_swipe_gift_and_screenshot = cafe_reward.swipe_gift_and_screenshot + + cafe_reward._happy_face_templates = None + cafe_reward._happy_face_match_scale = 0.75 + cafe_reward._happy_face_match_roi = (0, 45, 1280, 555) + + def _resize_for_happy_face_match(img): + height, width = img.shape[:2] + size = ( + max(1, int(round(width * cafe_reward._happy_face_match_scale))), + max(1, int(round(height * cafe_reward._happy_face_match_scale))), + ) + return cv2.resize(img, size, interpolation=cv2.INTER_AREA) + + def _get_happy_face_templates(): + if cafe_reward._happy_face_templates is None: + templates = [] + for i in range(1, 5): + template = cv2.imread("src/images/CN/cafe/happy_face" + str(i) + ".png") + if template is None: + templates.append(None) + continue + template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) + template = _resize_for_happy_face_match(template) + templates.append(template) + cafe_reward._happy_face_templates = templates + return cafe_reward._happy_face_templates + + def _dedupe_happy_face_points(points): + deduped = [] + for x, y in sorted(points, key=lambda item: (item[1], item[0])): + if any(abs(x - px) <= 24 and abs(y - py) <= 24 for px, py in deduped): + continue + deduped.append([x, y]) + if len(deduped) >= 32: + break + return deduped + + def _match_happy_faces_by_color(img): + roi_x0, roi_y0, roi_x1, roi_y1 = cafe_reward._happy_face_match_roi + search_img = img[roi_y0:roi_y1, roi_x0:roi_x1] + hsv = cv2.cvtColor(search_img, cv2.COLOR_BGR2HSV) + lower_red = cv2.inRange(hsv, np.array([0, 55, 120]), np.array([12, 255, 255])) + upper_red = cv2.inRange(hsv, np.array([160, 55, 120]), np.array([179, 255, 255])) + mask = cv2.bitwise_or(lower_red, upper_red) + count, _, stats, centers = cv2.connectedComponentsWithStats(mask, 8) + points = [] + for i in range(1, count): + _, _, width, height, area = stats[i] + if not (8 <= area <= 500 and 4 <= width <= 40 and 4 <= height <= 40): + continue + cx, cy = centers[i] + points.append([int(roi_x0 + cx), int(roi_y0 + cy + 58)]) + return _dedupe_happy_face_points(points) + + def match(img): + color_matches = _match_happy_faces_by_color(img) + if color_matches or _env_enabled("BAAS_ANDROID"): + return color_matches + + res = [] + roi_x0, roi_y0, roi_x1, roi_y1 = cafe_reward._happy_face_match_roi + search_img = img[roi_y0:roi_y1, roi_x0:roi_x1] + search_img = cv2.cvtColor(search_img, cv2.COLOR_BGR2GRAY) + search_img = _resize_for_happy_face_match(search_img) + for template in _get_happy_face_templates(): + if template is None: + continue + result = cv2.matchTemplate(search_img, template, cv2.TM_CCOEFF_NORMED) + threshold = 0.75 + suppress_x = max(20, template.shape[1]) + suppress_y = max(20, template.shape[0]) + for _ in range(16): + _, max_val, _, max_loc = cv2.minMaxLoc(result) + if max_val < threshold: + break + pt_x, pt_y = max_loc + res.append([ + int(roi_x0 + (pt_x + template.shape[1] / 2) / cafe_reward._happy_face_match_scale), + int(roi_y0 + (pt_y + template.shape[0] / 2) / cafe_reward._happy_face_match_scale + 58), + ]) + left = max(0, pt_x - suppress_x) + right = min(result.shape[1], pt_x + suppress_x + 1) + top = max(0, pt_y - suppress_y) + bottom = min(result.shape[0], pt_y + suppress_y + 1) + result[top:bottom, left:right] = -1 + return res + + @wraps(original_gift_to_cafe) + def gift_to_cafe(self): + if getattr(self, "is_android_device", False): + self.click(1240, 574, wait_over=True) + time.sleep(0.25) + return + return original_gift_to_cafe(self) + + @wraps(original_swipe_gift_and_screenshot) + def swipe_gift_and_screenshot(self): + if not getattr(self, "is_android_device", False): + return original_swipe_gift_and_screenshot(self) + shot_delay = self.config.cafe_reward_interaction_shot_delay + thread = threading.Thread(target=cafe_reward.screenshot_thread, args=(self, shot_delay)) + thread.start() + start_t = time.time() + self.u2_swipe(131, 660, 1280, 660, duration=0.3) + thread.join(timeout=max(1.0, shot_delay + 1.0)) + swipe_t = round(time.time() - start_t, 3) + self.logger.info("Gift swipe duration : [ " + str(swipe_t) + " ]") + return swipe_t + + original_find_student_position = cafe_reward.find_student_position + + @wraps(original_find_student_position) + def find_student_position(self): + match_start_t = time.time() + res = original_find_student_position(self) + self.logger.info( + "Cafe interaction total duration : [ " + + str(round(time.time() - match_start_t, 3)) + + " ], candidates : [ " + + str(len(res)) + + " ]" + ) + return res + + cafe_reward.match = match + cafe_reward.gift_to_cafe = gift_to_cafe + cafe_reward.swipe_gift_and_screenshot = swipe_gift_and_screenshot + cafe_reward.find_student_position = find_student_position + cafe_reward._baas_service_injected = True + + def apply_service_injections() -> None: global _APPLIED if _APPLIED: @@ -474,4 +617,5 @@ def apply_service_injections() -> None: _patch_main() _patch_device_modules() _patch_baas_thread() + _patch_cafe_reward() _APPLIED = True diff --git a/tests/module/test_cafe_reward_match.py b/tests/module/test_cafe_reward_match.py index b8d65363b..d8f56e547 100644 --- a/tests/module/test_cafe_reward_match.py +++ b/tests/module/test_cafe_reward_match.py @@ -9,14 +9,20 @@ np = pytest.importorskip("numpy") from module import cafe_reward +from service import injection REPO_ROOT = Path(__file__).resolve().parents[2] +def _install_cafe_injection(): + injection._patch_cafe_reward() + cafe_reward._happy_face_templates = None + + def test_cafe_reward_match_maps_scaled_roi_coordinates(monkeypatch): monkeypatch.chdir(REPO_ROOT) - cafe_reward._happy_face_templates = None + _install_cafe_injection() template_path = REPO_ROOT / "src" / "images" / "CN" / "cafe" / "happy_face1.png" template = cv2.imread(str(template_path)) @@ -36,7 +42,7 @@ def test_cafe_reward_match_maps_scaled_roi_coordinates(monkeypatch): def test_cafe_reward_match_is_bounded_on_broad_matches(monkeypatch): monkeypatch.chdir(REPO_ROOT) - cafe_reward._happy_face_templates = None + _install_cafe_injection() image = np.full((720, 1280, 3), 255, dtype=np.uint8) start = time.perf_counter() @@ -50,7 +56,7 @@ def test_cafe_reward_match_is_bounded_on_broad_matches(monkeypatch): def test_cafe_reward_match_android_skips_template_fallback(monkeypatch): monkeypatch.chdir(REPO_ROOT) monkeypatch.setenv("BAAS_ANDROID", "1") - cafe_reward._happy_face_templates = None + _install_cafe_injection() image = np.full((720, 1280, 3), 255, dtype=np.uint8) start = time.perf_counter() @@ -63,6 +69,7 @@ def test_cafe_reward_match_android_skips_template_fallback(monkeypatch): def test_android_gift_to_cafe_avoids_slow_detection(monkeypatch): + _install_cafe_injection() calls = [] class FakeBaas: From bac43d18941be59d6cfe9cadb01c4cc145c8ef2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 03:15:03 +0800 Subject: [PATCH 80/98] Fix: Restore Android display state after tasks --- service/context.py | 2 + service/runtime.py | 28 +++++++++++-- tests/service/test_android_display_resize.py | 41 +++++++++++++++++++- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/service/context.py b/service/context.py index 21d080fad..b38d07ac0 100644 --- a/service/context.py +++ b/service/context.py @@ -96,6 +96,8 @@ async def shutdown(self) -> None: with suppress(asyncio.CancelledError): await self._update_check_task self._update_check_task = None + with suppress(Exception): + await self.runtime.stop_all_tasks() await self.log_manager.stop() def ensure_runtime_logger_attached(self) -> None: diff --git a/service/runtime.py b/service/runtime.py index 2ffa8e420..823dab2ec 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -89,10 +89,11 @@ class _AndroidDisplayResizeGuard: def __init__(self) -> None: self._lock = threading.Lock() self._active_count = 0 + self._restore_command = "wm size reset" @staticmethod - def _target_size() -> str: - return os.getenv("BAAS_ANDROID_WM_SIZE", "720x1280").strip() or "720x1280" + def _target_size() -> Optional[str]: + return os.getenv("BAAS_ANDROID_WM_SIZE", "").strip() or None @staticmethod def _serial() -> str: @@ -109,11 +110,13 @@ def _shell(command: str) -> Any: def activate(self, logger=None) -> None: if not _is_android_runtime(): return + target_size = self._target_size() + if target_size is None: + return with self._lock: self._active_count += 1 if self._active_count != 1: return - target_size = self._target_size() try: current = self._shell("wm size") if logger is not None: @@ -145,6 +148,20 @@ def release(self, logger=None) -> None: logger.error("Failed to reset Android display size.") logger.error(exc) + def force_restore(self, logger=None) -> None: + if not _is_android_runtime(): + return + with self._lock: + self._active_count = 0 + try: + if logger is not None: + logger.info("Force reset Android display size after BAAS run.") + self._shell(self._restore_command) + except Exception as exc: + if logger is not None: + logger.error("Failed to force reset Android display size.") + logger.error(exc) + def _default_status(config_id: str) -> Dict[str, Any]: return { @@ -391,18 +408,22 @@ def runner() -> None: async def stop_scheduler(self, config_id: str) -> Dict[str, Any]: """Stop the scheduler thread for a config if it is running.""" + logger = None async with self._async_lock(): session = self._sessions.get(config_id) if session is None: return {"status": "unknown-config", "config_id": config_id} + logger = session.baas.logger if not session.thread: self._update_status(config_id, running=False, is_flag_run=False, current_task=None, waiting_tasks=[]) + await run_blocking(self._android_display_guard.force_restore, logger) return {"status": "stopped", "config_id": config_id} session.baas.send("stop") thread = session.thread session.thread = None if thread and thread.is_alive(): thread.join(timeout=10.0) + await run_blocking(self._android_display_guard.force_restore, logger) self._update_status(config_id, running=False, is_flag_run=False, current_task=None, waiting_tasks=[]) return {"status": "stopped", "config_id": config_id} @@ -430,6 +451,7 @@ async def stop_all_tasks(self) -> Dict[str, Any]: results = [] for config_id in config_ids: results.append(await self.stop_scheduler(config_id)) + await run_blocking(self._android_display_guard.force_restore, None) return {"status": "stopped", "results": results} async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict[str, Any]: diff --git a/tests/service/test_android_display_resize.py b/tests/service/test_android_display_resize.py index 6fc2060be..cfccb8a23 100644 --- a/tests/service/test_android_display_resize.py +++ b/tests/service/test_android_display_resize.py @@ -33,7 +33,7 @@ def test_android_display_guard_is_noop_outside_android(monkeypatch): guard.release() -def test_android_display_guard_sets_and_resets_size(monkeypatch): +def test_android_display_guard_does_not_resize_without_explicit_target(monkeypatch): calls = [] def connect(target): @@ -49,6 +49,25 @@ def connect(target): guard.activate() guard.release() + assert calls == [] + + +def test_android_display_guard_sets_and_resets_explicit_size(monkeypatch): + calls = [] + + def connect(target): + assert target == "http://127.0.0.1:7912" + return _FakeDevice(calls) + + monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.setenv("BAAS_ANDROID_WM_SIZE", "720x1280") + monkeypatch.delenv("BAAS_ANDROID_U2_SERIAL", raising=False) + monkeypatch.setitem(sys.modules, "uiautomator2", SimpleNamespace(connect=connect)) + + guard = _AndroidDisplayResizeGuard() + guard.activate() + guard.release() + assert calls == ["wm size", "wm size 720x1280", "wm size reset"] @@ -73,8 +92,28 @@ def test_android_display_guard_uses_reference_count(monkeypatch): assert calls == ["wm size", "wm size 800x1280", "wm size reset"] +def test_android_display_guard_force_restore_ignores_reference_count(monkeypatch): + calls = [] + + monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.setitem( + sys.modules, + "uiautomator2", + SimpleNamespace(connect=lambda _target: _FakeDevice(calls)), + ) + + guard = _AndroidDisplayResizeGuard() + guard.activate() + guard.activate() + guard.force_restore() + + assert guard._active_count == 0 + assert calls == ["wm size reset"] + + def test_android_display_guard_does_not_block_when_resize_fails(monkeypatch): monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.setenv("BAAS_ANDROID_WM_SIZE", "720x1280") def fail_shell(_command): raise RuntimeError("No adb exe could be found. Install adb on your system") From 5f54a201c03f442290f0fb9ea0aa652948564605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 03:26:44 +0800 Subject: [PATCH 81/98] Fix: Restart Android backend after update --- service/runtime.py | 31 ++++++++++++++- tests/service/test_service_logic.py | 61 +++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/service/runtime.py b/service/runtime.py index 823dab2ec..5fd5f2b9b 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -209,6 +209,7 @@ def __init__(self, project_root: Path, loop: Optional[asyncio.AbstractEventLoop] self._event_map_inv: Dict[str, Dict[str, str]] = {} self._android_active_config_id: Optional[str] = None self._android_display_guard = _AndroidDisplayResizeGuard() + self._android_restart_scheduled = False self.is_all_data_initialized: bool = False def set_loop(self, loop: asyncio.AbstractEventLoop) -> None: @@ -830,7 +831,7 @@ async def update_to_latest(self): await self.stop_all_tasks() result = await run_blocking(update_to_latest, None) if isinstance(result, dict): - return result + return self._with_android_backend_restart(result) return {"status": "updated"} async def update_to_latest_stream(self): @@ -846,6 +847,7 @@ def worker() -> None: result = update_to_latest_with_progress(None, progress=progress) if not isinstance(result, dict): result = {"status": "updated"} + result = self._with_android_backend_restart(result) loop.call_soon_threadsafe(queue.put_nowait, {"type": "result", "result": result}) except Exception as exc: # noqa: BLE001 - surfaced through stream response loop.call_soon_threadsafe(queue.put_nowait, {"type": "error", "error": str(exc)}) @@ -862,6 +864,33 @@ def publish_version_update(self, payload: Dict[str, Any]) -> None: if payload: self._status_bus.publish_threadsafe({"version": payload}) + def _with_android_backend_restart(self, result: Dict[str, Any]) -> Dict[str, Any]: + if not (_is_android_runtime() and result.get("restart_required")): + return result + delay = max(0.5, float(os.getenv("BAAS_ANDROID_RESTART_DELAY_SECONDS", "2.0"))) + scheduled = self._schedule_android_backend_restart(delay) + return { + **result, + "backend_restart_scheduled": scheduled, + "backend_restart_delay_seconds": delay, + } + + def _schedule_android_backend_restart(self, delay: float) -> bool: + if self._android_restart_scheduled: + return False + self._android_restart_scheduled = True + + def restart_process() -> None: + time.sleep(delay) + os._exit(0) + + threading.Thread( + target=restart_process, + name="baas-android-backend-restart", + daemon=True, + ).start() + return True + async def remove_config(self, _id): """Remove a config directory after resolving it inside project config root.""" target = resolve_config_dir(self._project_root / "config", _id) diff --git a/tests/service/test_service_logic.py b/tests/service/test_service_logic.py index 45a882052..8fe69b7b0 100644 --- a/tests/service/test_service_logic.py +++ b/tests/service/test_service_logic.py @@ -212,3 +212,64 @@ async def scenario(): monkeypatch.setattr(runtime_module, "test_repo_sha", fake_test_repo_sha) assert asyncio.run(scenario()) == [("fast", 10.0), ("slow", 10.0)] + + +def test_android_update_to_latest_schedules_backend_restart(monkeypatch, tmp_path): + scheduled = [] + + def fake_update(_setup_path): + return {"status": "updated", "restart_required": True, "current": "abc"} + + async def fake_stop_all_tasks(self): + return {"status": "stopped"} + + monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.setattr(runtime_module, "update_to_latest", fake_update) + monkeypatch.setattr(ServiceRuntime, "stop_all_tasks", fake_stop_all_tasks) + monkeypatch.setattr( + ServiceRuntime, + "_schedule_android_backend_restart", + lambda self, delay: scheduled.append(delay) or True, + ) + + runtime = ServiceRuntime(tmp_path) + result = asyncio.run(runtime.update_to_latest()) + + assert result["backend_restart_scheduled"] is True + assert result["backend_restart_delay_seconds"] == 2.0 + assert scheduled == [2.0] + + +def test_android_update_stream_schedules_backend_restart(monkeypatch, tmp_path): + scheduled = [] + + def fake_update_stream(_setup_path, progress=None): + if progress: + progress("done", {"sha": "abc"}) + return {"status": "updated", "restart_required": True, "current": "abc"} + + async def fake_stop_all_tasks(self): + return {"status": "stopped"} + + async def scenario(): + runtime = ServiceRuntime(tmp_path) + events = [] + async for event in runtime.update_to_latest_stream(): + events.append(event) + return events + + monkeypatch.setenv("BAAS_ANDROID", "1") + monkeypatch.setattr(runtime_module, "update_to_latest_with_progress", fake_update_stream) + monkeypatch.setattr(ServiceRuntime, "stop_all_tasks", fake_stop_all_tasks) + monkeypatch.setattr( + ServiceRuntime, + "_schedule_android_backend_restart", + lambda self, delay: scheduled.append(delay) or True, + ) + + events = asyncio.run(scenario()) + + assert events[0]["type"] == "progress" + assert events[1]["type"] == "result" + assert events[1]["result"]["backend_restart_scheduled"] is True + assert scheduled == [2.0] From 2bd364b3bf603e83cea0df8fc3b4bd45a5ebcf85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 04:05:10 +0800 Subject: [PATCH 82/98] Fix: Route Android backend restart through bootstrap --- service/api/commands.py | 4 ++++ service/runtime.py | 18 +++++++++++++++++- tests/service/test_commands.py | 14 ++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/service/api/commands.py b/service/api/commands.py index 0f8881b29..252f18ff0 100644 --- a/service/api/commands.py +++ b/service/api/commands.py @@ -120,6 +120,10 @@ async def execute_command(cmd: CommandMessage, binary_payload: bytes | None = No result = await context.runtime.update_to_latest() return {"status": "ok", "data": result} + if cmd.command == "restart_backend": + result = await context.runtime.restart_backend() + return {"status": "ok", "data": result} + if cmd.command == "stop_all_tasks": result = await context.runtime.stop_all_tasks() return {"status": "ok", "data": result} diff --git a/service/runtime.py b/service/runtime.py index 5fd5f2b9b..166786c9b 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -882,7 +882,13 @@ def _schedule_android_backend_restart(self, delay: float) -> bool: def restart_process() -> None: time.sleep(delay) - os._exit(0) + try: + from android_backend import bootstrap + + bootstrap.restart() + except Exception: + self._android_restart_scheduled = False + raise threading.Thread( target=restart_process, @@ -891,6 +897,16 @@ def restart_process() -> None: ).start() return True + async def restart_backend(self) -> Dict[str, Any]: + return await run_blocking(self._restart_backend_sync) + + def _restart_backend_sync(self) -> Dict[str, Any]: + if not _is_android_runtime(): + return {"status": "skipped", "reason": "restart_backend is only handled inside Android runtime"} + from android_backend import bootstrap + + return {"status": "ok", "restarted": bool(bootstrap.restart())} + async def remove_config(self, _id): """Remove a config directory after resolving it inside project config root.""" target = resolve_config_dir(self._project_root / "config", _id) diff --git a/tests/service/test_commands.py b/tests/service/test_commands.py index 1ab93874c..a7e7b694b 100644 --- a/tests/service/test_commands.py +++ b/tests/service/test_commands.py @@ -23,6 +23,10 @@ async def solve_task(self, config_id, task_name, set_log=None): async def detect_adb(self): return ["127.0.0.1:5555"] + async def restart_backend(self): + self.calls.append(("restart_backend",)) + return {"status": "ok", "restarted": True} + def _cmd(command: str, **kwargs) -> CommandMessage: return CommandMessage(type="command", command=command, timestamp=1.0, **kwargs) @@ -57,6 +61,16 @@ def test_execute_detect_adb_envelope(monkeypatch): assert result == {"status": "ok", "data": {"addresses": ["127.0.0.1:5555"]}} +def test_execute_restart_backend_dispatches_to_runtime(monkeypatch): + runtime = _Runtime() + monkeypatch.setattr(commands, "context", SimpleNamespace(runtime=runtime)) + + result = asyncio.run(commands.execute_command(_cmd("restart_backend"))) + + assert result == {"status": "ok", "data": {"status": "ok", "restarted": True}} + assert runtime.calls == [("restart_backend",)] + + def test_execute_unsupported_command_raises(monkeypatch): monkeypatch.setattr(commands, "context", SimpleNamespace(runtime=_Runtime())) From 05bf879e1f5c6e7b63fbbe5c2f4b04bf3c5bff37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 04:49:18 +0800 Subject: [PATCH 83/98] Fix: Stabilize Android cafe interaction matching --- service/injection.py | 31 +++++++------------------- tests/module/test_cafe_reward_match.py | 30 ++++++++++++++++++++----- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/service/injection.py b/service/injection.py index da8f21294..6a6855a73 100644 --- a/service/injection.py +++ b/service/injection.py @@ -466,7 +466,6 @@ def u2_init(self, serial): def _patch_cafe_reward() -> None: import cv2 - import numpy as np import threading import time from module import cafe_reward @@ -482,6 +481,7 @@ def _patch_cafe_reward() -> None: cafe_reward._happy_face_match_roi = (0, 45, 1280, 555) def _resize_for_happy_face_match(img): + """Resize cafe interaction images before matching to keep template search bounded.""" height, width = img.shape[:2] size = ( max(1, int(round(width * cafe_reward._happy_face_match_scale))), @@ -490,6 +490,7 @@ def _resize_for_happy_face_match(img): return cv2.resize(img, size, interpolation=cv2.INTER_AREA) def _get_happy_face_templates(): + """Load and cache grayscale cafe interaction templates used by the injected matcher.""" if cafe_reward._happy_face_templates is None: templates = [] for i in range(1, 5): @@ -504,6 +505,7 @@ def _get_happy_face_templates(): return cafe_reward._happy_face_templates def _dedupe_happy_face_points(points): + """Merge nearby interaction candidates so one student head is clicked only once.""" deduped = [] for x, y in sorted(points, key=lambda item: (item[1], item[0])): if any(abs(x - px) <= 24 and abs(y - py) <= 24 for px, py in deduped): @@ -513,28 +515,8 @@ def _dedupe_happy_face_points(points): break return deduped - def _match_happy_faces_by_color(img): - roi_x0, roi_y0, roi_x1, roi_y1 = cafe_reward._happy_face_match_roi - search_img = img[roi_y0:roi_y1, roi_x0:roi_x1] - hsv = cv2.cvtColor(search_img, cv2.COLOR_BGR2HSV) - lower_red = cv2.inRange(hsv, np.array([0, 55, 120]), np.array([12, 255, 255])) - upper_red = cv2.inRange(hsv, np.array([160, 55, 120]), np.array([179, 255, 255])) - mask = cv2.bitwise_or(lower_red, upper_red) - count, _, stats, centers = cv2.connectedComponentsWithStats(mask, 8) - points = [] - for i in range(1, count): - _, _, width, height, area = stats[i] - if not (8 <= area <= 500 and 4 <= width <= 40 and 4 <= height <= 40): - continue - cx, cy = centers[i] - points.append([int(roi_x0 + cx), int(roi_y0 + cy + 58)]) - return _dedupe_happy_face_points(points) - def match(img): - color_matches = _match_happy_faces_by_color(img) - if color_matches or _env_enabled("BAAS_ANDROID"): - return color_matches - + """Find cafe interaction icons with template matching on every platform.""" res = [] roi_x0, roi_y0, roi_x1, roi_y1 = cafe_reward._happy_face_match_roi search_img = img[roi_y0:roi_y1, roi_x0:roi_x1] @@ -561,10 +543,11 @@ def match(img): top = max(0, pt_y - suppress_y) bottom = min(result.shape[0], pt_y + suppress_y + 1) result[top:bottom, left:right] = -1 - return res + return _dedupe_happy_face_points(res) @wraps(original_gift_to_cafe) def gift_to_cafe(self): + """Return from the gift screen quickly on Android without slow image co-detection.""" if getattr(self, "is_android_device", False): self.click(1240, 574, wait_over=True) time.sleep(0.25) @@ -573,6 +556,7 @@ def gift_to_cafe(self): @wraps(original_swipe_gift_and_screenshot) def swipe_gift_and_screenshot(self): + """Capture the cafe interaction frame while dragging gifts across the screen.""" if not getattr(self, "is_android_device", False): return original_swipe_gift_and_screenshot(self) shot_delay = self.config.cafe_reward_interaction_shot_delay @@ -589,6 +573,7 @@ def swipe_gift_and_screenshot(self): @wraps(original_find_student_position) def find_student_position(self): + """Log cafe interaction matching duration and candidate count for diagnostics.""" match_start_t = time.time() res = original_find_student_position(self) self.logger.info( diff --git a/tests/module/test_cafe_reward_match.py b/tests/module/test_cafe_reward_match.py index d8f56e547..ebc9b09b6 100644 --- a/tests/module/test_cafe_reward_match.py +++ b/tests/module/test_cafe_reward_match.py @@ -53,19 +53,39 @@ def test_cafe_reward_match_is_bounded_on_broad_matches(monkeypatch): assert len(matches) <= 64 -def test_cafe_reward_match_android_skips_template_fallback(monkeypatch): +def test_cafe_reward_match_android_uses_template_fallback(monkeypatch): monkeypatch.chdir(REPO_ROOT) monkeypatch.setenv("BAAS_ANDROID", "1") _install_cafe_injection() - image = np.full((720, 1280, 3), 255, dtype=np.uint8) + template_path = REPO_ROOT / "src" / "images" / "CN" / "cafe" / "happy_face2.png" + template = cv2.imread(str(template_path)) + assert template is not None + + image = np.full((720, 1280, 3), 40, dtype=np.uint8) + x, y = 420, 260 + height, width = template.shape[:2] + image[y:y + height, x:x + width] = template + start = time.perf_counter() matches = cafe_reward.match(image) elapsed = time.perf_counter() - start - assert elapsed < 0.2 - assert matches == [] - assert cafe_reward._happy_face_templates is None + assert elapsed < 1 + assert cafe_reward._happy_face_templates is not None + assert any(abs(mx - (x + width / 2)) <= 4 and abs(my - (y + height / 2 + 58)) <= 4 for mx, my in matches) + + +def test_cafe_reward_match_rejects_red_ui_noise(monkeypatch): + monkeypatch.chdir(REPO_ROOT) + monkeypatch.setenv("BAAS_ANDROID", "1") + _install_cafe_injection() + + image = np.full((720, 1280, 3), 40, dtype=np.uint8) + cv2.rectangle(image, (80, 80), (115, 115), (0, 0, 255), -1) + cv2.rectangle(image, (1000, 90), (1030, 120), (0, 0, 255), -1) + + assert cafe_reward.match(image) == [] def test_android_gift_to_cafe_avoids_slow_detection(monkeypatch): From 735dceb0cee0e6ec633a14329f5bae85867e0f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 04:54:31 +0800 Subject: [PATCH 84/98] Fix: Attach Android toggle logs to provider --- service/api/http.py | 4 ++- service/runtime.py | 5 ++-- tests/service/test_config_runtime_update.py | 27 +++++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/service/api/http.py b/service/api/http.py index 634db5029..f8c54efc1 100644 --- a/service/api/http.py +++ b/service/api/http.py @@ -82,7 +82,9 @@ async def android_active_config(request: Request, payload: dict[str, Any]) -> Di async def android_toggle(request: Request) -> Dict[str, Any]: _require_android_loopback(request) try: - return await context.runtime.toggle_android_active_config() + return await context.runtime.toggle_android_active_config( + set_log=context.ensure_runtime_logger_attached + ) except Exception as exc: return {"status": "error", "type": exc.__class__.__name__, "error": str(exc)} diff --git a/service/runtime.py b/service/runtime.py index 166786c9b..ce050009a 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -432,7 +432,8 @@ def set_android_active_config(self, config_id: str) -> Dict[str, Any]: self._android_active_config_id = config_id return {"status": "ok", "config_id": config_id} - async def toggle_android_active_config(self) -> Dict[str, Any]: + async def toggle_android_active_config(self, set_log=None) -> Dict[str, Any]: + """Toggle the active Android config while preserving provider log wiring.""" config_id = self._android_active_config_id if not config_id: config_ids = self._list_config_ids_sync() @@ -443,7 +444,7 @@ async def toggle_android_active_config(self) -> Dict[str, Any]: if running: result = await self.stop_scheduler(config_id) return {"status": "stopped", "config_id": config_id, "data": result} - result = await self.start_scheduler(config_id) + result = await self.start_scheduler(config_id, set_log=set_log) return {"status": "started", "config_id": config_id, "data": result} async def stop_all_tasks(self) -> Dict[str, Any]: diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index 7b53317ce..3d93bc072 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -80,6 +80,33 @@ def test_runtime_status_snapshot_is_deep_copy(): assert runtime.current_status()["default_config"]["nested"]["running"] is False +def test_android_toggle_passes_logger_hook_to_scheduler(monkeypatch): + runtime = ServiceRuntime(Path("project")) + calls = [] + + monkeypatch.setattr(runtime, "_list_config_ids_sync", lambda: ["default_config"]) + + async def fake_start_scheduler(config_id, set_log=None): + calls.append((config_id, set_log)) + if set_log: + set_log() + return {"status": "started", "config_id": config_id} + + logger_attached = {"value": False} + monkeypatch.setattr(runtime, "start_scheduler", fake_start_scheduler) + + result = asyncio.run( + runtime.toggle_android_active_config( + set_log=lambda: logger_attached.__setitem__("value", True) + ) + ) + + assert result["status"] == "started" + assert calls[0][0] == "default_config" + assert calls[0][1] is not None + assert logger_attached["value"] is True + + def test_runtime_remove_config_uses_project_root(): root = _workspace_tmp() try: From 467eccd7f120772e5533e55e1d194da67cff8485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 1 Jul 2026 22:40:25 +0800 Subject: [PATCH 85/98] Fix: Incorrect behavior for auto merge --- .github/workflows/sync-from-upstream.yml | 25 ++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/.github/workflows/sync-from-upstream.yml b/.github/workflows/sync-from-upstream.yml index 8a2a4f18d..9426aee51 100644 --- a/.github/workflows/sync-from-upstream.yml +++ b/.github/workflows/sync-from-upstream.yml @@ -15,7 +15,6 @@ concurrency: jobs: sync-pr-and-auto-merge: - # Run this job only in the fork repository. if: github.repository == 'Kiramei/baas-dev' runs-on: ubuntu-latest @@ -40,7 +39,6 @@ jobs: run: | set -euo pipefail - # Extra runtime guard in case this workflow is copied or modified incorrectly. if [ "${GITHUB_REPOSITORY}" != "${EXPECTED_REPOSITORY}" ]; then echo "This workflow is intended to run only in ${EXPECTED_REPOSITORY}." echo "Current repository: ${GITHUB_REPOSITORY}" @@ -60,13 +58,11 @@ jobs: exit 1 fi - # Skip if the fork base branch already contains the latest upstream branch. if git merge-base --is-ancestor "upstream/${UPSTREAM_BRANCH}" "origin/${BASE_BRANCH}"; then echo "fork ${BASE_BRANCH} already contains upstream/${UPSTREAM_BRANCH}. Nothing to do." exit 0 fi - # Update only the temporary sync branch. Do not modify the base branch directly. git checkout -B "${SYNC_BRANCH}" "upstream/${UPSTREAM_BRANCH}" git push origin "HEAD:${SYNC_BRANCH}" --force-with-lease @@ -92,8 +88,6 @@ jobs: echo "Created sync PR: ${pr_url}" fi - # Try to enable auto-merge or merge immediately if all requirements are already satisfied. - # If this fails, keep the PR open for manual review. set +e gh pr merge "${pr_url}" \ --repo "${GITHUB_REPOSITORY}" \ @@ -102,14 +96,25 @@ jobs: --delete-branch merge_status=$? + + if [ "${merge_status}" -ne 0 ]; then + echo "Auto-merge failed or unnecessary. Trying direct merge..." + + gh pr merge "${pr_url}" \ + --repo "${GITHUB_REPOSITORY}" \ + --merge \ + --delete-branch + + merge_status=$? + fi set -e if [ "${merge_status}" -eq 0 ]; then - echo "Auto-merge enabled or PR merged: ${pr_url}" + echo "PR auto-merge enabled or merged: ${pr_url}" else - echo "Auto-merge failed. Leaving PR open for manual review: ${pr_url}" + echo "Auto-merge/direct merge failed. Leaving PR open: ${pr_url}" gh pr comment "${pr_url}" \ --repo "${GITHUB_REPOSITORY}" \ - --body "Auto-merge failed. Please review manually. Possible causes: merge conflicts, failing checks, branch protection rules, or auto-merge not enabled for this repository." || true - fi + --body "Auto-merge/direct merge failed. Please review manually. Possible causes: conflicts, failing required checks, branch protection, or insufficient token permissions." || true + fi \ No newline at end of file From 43b21fd4b8ca85bd45330da86c64462eda3e8b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 2 Jul 2026 00:06:51 +0800 Subject: [PATCH 86/98] Fix: Remove dulwich dependency from git paths --- core/ocr/baas_ocr_client/server_installer.py | 487 ++++++++++++++++--- gui/fragments/history.py | 76 ++- requirements-linux.txt | 1 - service/android_ocr_installer.py | 4 +- service/injection.py | 18 +- tests/core/ocr/test_android_runtime.py | 2 +- tests/service/test_service_injection.py | 10 +- 7 files changed, 497 insertions(+), 101 deletions(-) diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index fb8f8cb44..4760db875 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -1,9 +1,23 @@ -import sys, io +import sys +import io +import shutil +import os +import platform +import subprocess +import time +import tempfile +import zipfile +from typing import Optional + +import pygit2 +import requests +from pygit2 import Commit +from pygit2.enums import ResetMode # ================================ # Check the std::in and std::out Status before -# dulwich-related crashes, for dulwich will -# connect to the io, while the io is unset +# Git library calls may touch stdio while the packaged window app +# leaves the streams unset. # by the built window app. if sys.stdin is None: @@ -11,92 +25,413 @@ sys.stdout = io.TextIOWrapper(io.BytesIO()) # ================================ -import shutil -import os from core.exception import OcrInternalError -from dulwich import porcelain -from dulwich.repo import Repo -import platform -if sys.platform not in ['win32', 'linux', 'darwin']: +if sys.platform not in ["win32", "linux", "darwin"]: raise Exception("Ocr Unsupported platform " + sys.platform) OCR_SERVER_PREBUILD_URL = "https://gitee.com/pur1fy/baas_-cpp_prebuild.git" +OCR_SERVER_PREBUILD_ARCHIVE_URLS = [ + "https://baas-cdn.kiramei.workers.dev/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://codeload.github.com/pur1fying/BAAS_Cpp_prebuild/zip/refs/heads/{branch}", + "https://v4.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://v6.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://cdn.gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://gh-proxy.org/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://gh.sevencdn.com/https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://githubfast.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", + "https://github.com/pur1fying/BAAS_Cpp_prebuild/archive/refs/heads/{branch}.zip", +] +OCR_SERVER_PREBUILD_API_URL = "https://api.github.com/repos/pur1fying/BAAS_Cpp_prebuild/branches/{branch}" SERVER_INSTALLER_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) -SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, 'bin') - -branch = { - 'win32': { - 'amd64': 'windows-x64', - }, - 'linux': { - 'x86_64': 'linux-x64', - }, - 'darwin': { - 'arm64': 'macos-arm64', - }, + + +def _android_ocr_branch() -> Optional[str]: + if os.getenv("BAAS_ANDROID", "").lower() not in {"1", "true", "yes", "on"}: + return None + arch = platform.machine().lower() + if arch in {"aarch64", "arm64"}: + return "android-arm64-v8a" + if arch in {"x86_64", "amd64"}: + return "android-x86_64" + raise Exception("Unsupported Android machine architecture " + arch) + + +branch_map = { + "win32": {"amd64": "windows-x64"}, + "linux": {"x86_64": "linux-x64"}, + "darwin": {"arm64": "macos-arm64"}, } -branch = branch[sys.platform] -arch = platform.machine().lower() -if arch not in branch: - raise Exception("Unsupported machine architecture " + arch) -branch = branch[arch] +TARGET_BRANCH = _android_ocr_branch() +if TARGET_BRANCH is None: + arch_map = branch_map[sys.platform] + arch = platform.machine().lower() + if arch not in arch_map: + raise Exception("Unsupported machine architecture " + arch) + TARGET_BRANCH = arch_map[arch] +SERVER_BIN_DIR = os.path.join(SERVER_INSTALLER_DIR_PATH, "bin-android", TARGET_BRANCH) if TARGET_BRANCH.startswith( + "android-" +) else os.path.join(SERVER_INSTALLER_DIR_PATH, "bin") +ANDROID_VERSION_FILE = os.path.join(SERVER_BIN_DIR, ".baas-ocr-prebuild-sha") -def check_git(logger): - if not os.path.exists(SERVER_BIN_DIR + '/.git'): - clone_repo(logger) +def _is_android_runtime() -> bool: + return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} + + +def _android_library_abi_dir() -> str: + if TARGET_BRANCH == "android-arm64-v8a": + return "arm64-v8a" + if TARGET_BRANCH == "android-x86_64": + return "x86_64" + raise OcrInternalError(f"Unsupported Android OCR branch: {TARGET_BRANCH}") + + +def _server_binary_path() -> str: + if TARGET_BRANCH.startswith("android-"): + return os.path.join(SERVER_BIN_DIR, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") + return os.path.join(SERVER_BIN_DIR, "BAAS_ocr_server.exe" if sys.platform == "win32" else "BAAS_ocr_server") + + +def _android_internal_runtime_root() -> str: + internal_root = os.getenv("BAAS_ANDROID_INTERNAL_FILES_DIR", "").strip() + if not internal_root: + return "" + return os.path.join(internal_root, "ocr-runtime", TARGET_BRANCH) + + +def _android_internal_binary_path() -> str: + runtime_root = _android_internal_runtime_root() + if not runtime_root: + return "" + return os.path.join(runtime_root, "lib", _android_library_abi_dir(), "libBAAS_ocr_server.so") + + +def _android_internal_version_file() -> str: + runtime_root = _android_internal_runtime_root() + if not runtime_root: + return "" + return os.path.join(runtime_root, ".baas-ocr-prebuild-sha") + + +def _read_android_installed_sha() -> str: + try: + with open(ANDROID_VERSION_FILE, "r", encoding="utf-8") as fp: + return fp.read().strip() + except OSError: + return "" + + +def _read_android_internal_sha() -> str: + version_file = _android_internal_version_file() + if not version_file: + return "" + try: + with open(version_file, "r", encoding="utf-8") as fp: + return fp.read().strip() + except OSError: + return "" + + +def _get_android_remote_sha(branch: str) -> Optional[str]: + try: + response = requests.get(OCR_SERVER_PREBUILD_API_URL.format(branch=branch), timeout=15) + response.raise_for_status() + data = response.json() + sha = data.get("commit", {}).get("sha") + return str(sha) if sha else None + except Exception: + return None + + +def _download_android_archive(branch: str, archive_path: str, logger=None) -> str: + last_error: Optional[Exception] = None + for template in OCR_SERVER_PREBUILD_ARCHIVE_URLS: + url = template.format(branch=branch) + try: + with requests.get(url, stream=True, timeout=(8, 90)) as response: + response.raise_for_status() + with open(archive_path, "wb") as fp: + for chunk in response.iter_content(chunk_size=1024 * 256): + if chunk: + fp.write(chunk) + return url + except Exception as exc: + last_error = exc + if logger is not None: + logger.warning(f"Failed to download Android OCR prebuild from {url}: {exc}") + raise OcrInternalError(f"Failed to download Android OCR prebuild archive: {last_error}") + + +def _find_android_archive_root(extract_root: str) -> str: + library_name = "libBAAS_ocr_server.so" + for current_root, _dirs, files in os.walk(extract_root): + if library_name in files and os.path.basename(current_root) == _android_library_abi_dir(): + return os.path.dirname(os.path.dirname(current_root)) + candidates = [ + os.path.join(extract_root, name) + for name in os.listdir(extract_root) + if os.path.isdir(os.path.join(extract_root, name)) + ] + if len(candidates) == 1: + return candidates[0] + raise OcrInternalError("Android OCR prebuild archive does not contain libBAAS_ocr_server.so") + + +def _install_android_prebuild(logger) -> None: + if not TARGET_BRANCH.startswith("android-"): + raise OcrInternalError(f"Invalid Android OCR branch: {TARGET_BRANCH}") + + remote_sha = _get_android_remote_sha(TARGET_BRANCH) + local_sha = _read_android_installed_sha() + server_binary_path = _server_binary_path() + internal_sha = _read_android_internal_sha() + internal_binary_path = _android_internal_binary_path() + if remote_sha and internal_sha == remote_sha and os.path.exists(internal_binary_path): + logger.info("Android Ocr Server runtime already available.") + return + if not remote_sha and internal_sha and os.path.exists(internal_binary_path): + logger.warning("Android OCR remote SHA unavailable; using internal runtime prebuild.") + return + if remote_sha and local_sha == remote_sha and os.path.exists(server_binary_path): + logger.info("Ocr Server No updates available.") + return + if not remote_sha and local_sha and os.path.exists(server_binary_path): + logger.warning("Android OCR remote SHA unavailable; using installed prebuild.") + return + + logger.info(f"Installing Android Ocr Server prebuild for {TARGET_BRANCH}.") + with tempfile.TemporaryDirectory(prefix="baas-ocr-android-") as tmp: + archive_path = os.path.join(tmp, "ocr-prebuild.zip") + source_url = _download_android_archive(TARGET_BRANCH, archive_path, logger) + extract_root = os.path.join(tmp, "extract") + os.makedirs(extract_root, exist_ok=True) + with zipfile.ZipFile(archive_path) as archive: + archive.extractall(extract_root) + source_root = _find_android_archive_root(extract_root) + if os.path.exists(SERVER_BIN_DIR): + shutil.rmtree(SERVER_BIN_DIR, ignore_errors=True) + shutil.copytree(source_root, SERVER_BIN_DIR) + + if os.path.exists(server_binary_path): + os.chmod(server_binary_path, os.stat(server_binary_path).st_mode | 0o755) else: - logger.info("Ocr Server Update check.") + raise OcrInternalError("Android OCR prebuild did not install libBAAS_ocr_server.so") + + with open(ANDROID_VERSION_FILE, "w", encoding="utf-8") as fp: + fp.write(remote_sha or source_url) + logger.info("Ocr Server Install success.") + + +class OcrRepoManager: + """ + Manages the OCR Server git repository. + Priority: System 'git' > pygit2 (except for rollback). + """ + + def __init__(self, repo_path: str, remote_url: str, branch: str, logger): + self.repo_path = repo_path + self.remote_url = remote_url + self.branch = branch + self.logger = logger + self.git_executable = shutil.which("git") + self.git_dir = os.path.join(repo_path, ".git") + + def _run_git_cmd(self, args: list, cwd: Optional[str] = None) -> str: + """Executes a system git command.""" + if not self.git_executable: + raise FileNotFoundError("System git not found") + + target_cwd = cwd if cwd else self.repo_path + + # Ensure directory exists before running command if not cloning + if cwd is None and not os.path.exists(target_cwd): + raise FileNotFoundError(f"Repo directory {target_cwd} does not exist") + + proc = subprocess.run( + [self.git_executable] + args, + cwd=target_cwd, + capture_output=True, + text=True, + check=True + ) + return proc.stdout.strip() + + def get_local_sha(self) -> str: + """Returns the SHA of the current local HEAD.""" + if self.git_executable: + try: + return self._run_git_cmd(["rev-parse", "HEAD"]) + except subprocess.CalledProcessError: + self.logger.warning("System git failed to get local SHA, falling back to pygit2.") + + # Fallback to pygit2 + repo = pygit2.Repository(self.repo_path) + return str(repo.head.target) + + def get_remote_sha(self) -> Optional[str]: + """Returns the SHA of the target branch on the remote.""" + if self.git_executable: + try: + # git ls-remote refs/heads/ + # Output: \trefs/heads/ + ref = f"refs/heads/{self.branch}" + output = self._run_git_cmd(["ls-remote", self.remote_url, ref], cwd=os.getcwd()) + if output: + return output.split()[0] + except Exception as e: + self.logger.warning(f"System git failed to get remote SHA: {e}") + + # Fallback to pygit2 try: - repo = Repo(SERVER_BIN_DIR) - # Get local SHA - local_sha = repo.head().decode('ascii') - except Exception: - logger.warning("Git Repo corrupted, remove .git folder and reinstall.") - shutil.rmtree(SERVER_BIN_DIR + '/.git') - clone_repo(logger) - return - # Get remote SHA - remote_refs = porcelain.ls_remote(OCR_SERVER_PREBUILD_URL) - remote_sha = remote_refs.get(b'refs/heads/' + branch.encode('ascii')).decode('ascii') - - logger.info(f"remote_sha: {remote_sha}") - logger.info(f"local_sha : {local_sha}") - - if local_sha == remote_sha: - logger.info("Ocr Server No updates available.") - else: - logger.info("Pulling updates from the remote repository...") - # Reset the local repository to the state of the remote repository - porcelain.reset(repo, mode='hard') - # Pull the latest changes from the remote repository - for i in range(1, 4): - try: - porcelain.pull(repo, OCR_SERVER_PREBUILD_URL, branch, protocol_version=0) - break - except Exception as e: - if i == 3: - raise OcrInternalError("Failed to update the BAAS_ocr_server. Please check your network") - logger.error(f"Failed to update BAAS_ocr_server, retrying... {i}") - logger.error(e) - updated_local_sha = repo.head().decode('ascii') - if updated_local_sha == remote_sha: - logger.info("Ocr Server Update success.") - else: - logger.warning("Failed to update the BAAS_ocr_server, please check your network.") + with tempfile.TemporaryDirectory() as tmp: + repo = pygit2.init_repository(tmp, bare=True) + remote = repo.remotes.create_anonymous(self.remote_url) + target_ref_name = f"refs/heads/{self.branch}" + for head in remote.ls_remotes(): + if head.get("name") == target_ref_name: + return str(head.get("oid")) + except Exception as e: + self.logger.error(f"pygit2 failed to get remote info: {e}") + return None + return None + def clone(self) -> None: + """Clones the repository.""" + if os.path.exists(self.repo_path): + self.logger.warning("Target directory not empty, removing old files...") + shutil.rmtree(self.repo_path, ignore_errors=True) -def clone_repo(logger): - logger.info("Installing Ocr Server, please hang on...") - for i in range(1, 4): + for i in range(1, 4): + try: + if self.git_executable: + self.logger.info(f"Cloning with system git (Attempt {i})...") + # git clone -b + self._run_git_cmd( + ["clone", "-b", self.branch, self.remote_url, self.repo_path], + cwd=os.path.dirname(self.repo_path) + ) + else: + self.logger.info(f"Cloning with pygit2 (Attempt {i})...") + pygit2.clone_repository( + self.remote_url, + self.repo_path, + checkout_branch=self.branch, + ) + self.logger.info("Ocr Server Install success.") + return + except Exception as e: + self.logger.error(f"Failed to clone (Attempt {i}): {e}") + if i == 3: + raise OcrInternalError("Failed to install the BAAS_ocr_server. Please check your network") + time.sleep(1) + + def update(self) -> None: + """Updates the repository to the latest remote state.""" + self.logger.info("Pulling updates from the remote repository...") + + if self.git_executable: + try: + # 1. Fetch + self._run_git_cmd(["fetch", "origin", self.branch]) + # 2. Reset --hard + # We use FETCH_HEAD to ensure we are at the exact state we just fetched + self._run_git_cmd(["reset", "--hard", "FETCH_HEAD"]) + self.logger.info("Ocr Server Update success (System Git).") + return + except Exception as e: + self.logger.error(f"System git update failed: {e}. Falling back to pygit2.") + + # Fallback to pygit2 try: - porcelain.clone(OCR_SERVER_PREBUILD_URL, SERVER_BIN_DIR, branch=branch) - break + repo = pygit2.Repository(self.repo_path) + # Ensure remote exists + remote = repo.remotes["origin"] if "origin" in repo.remotes.names() else repo.remotes.create("origin", + self.remote_url) + + refspec = f"refs/heads/{self.branch}:refs/remotes/origin/{self.branch}" + remote.fetch(refspecs=[refspec]) + + remote_ref = f"refs/remotes/origin/{self.branch}" + remote_commit = repo.revparse_single(remote_ref) + + if not isinstance(remote_commit, Commit): + remote_commit = repo[remote_commit.target] + + repo.reset(remote_commit.id, ResetMode.HARD) + repo.checkout_tree(remote_commit.tree) + self.logger.info("Ocr Server Update success (pygit2).") except Exception as e: - if i == 3: - raise OcrInternalError("Failed to install the BAAS_ocr_server. Please check your network") - logger.error(f"Failed to install BAAS_ocr_server, retrying... {i}") - logger.error(e.__str__()) - logger.info("Ocr Server Install success.") + self.logger.error("Failed to update the BAAS_ocr_server.") + raise OcrInternalError(f"Update failed: {e}") + + + +def check_git(logger): + """ + Main entry point to check and update the OCR Server repo. + """ + if _is_android_runtime(): + _install_android_prebuild(logger) + return + + manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) + + # 1. Ensure Repo Exists + if not os.path.exists(manager.git_dir): + manager.clone() + return + + logger.info("Ocr Server Update check.") + + # 2. Validate Local Repo Integrity + try: + local_sha = manager.get_local_sha() + except Exception: + logger.warning("Git Repo corrupted, remove .git folder and reinstall.") + shutil.rmtree(manager.git_dir, ignore_errors=True) + manager.clone() + return + + # 3. Check Remote + try: + remote_sha = manager.get_remote_sha() + except Exception as e: + raise OcrInternalError(f"Failed to fetch remote info: {e}") + + if not remote_sha: + logger.warning(f"Remote branch '{TARGET_BRANCH}' not found.") + return + + logger.info(f"remote_sha: {remote_sha}") + logger.info(f"local_sha : {local_sha}") + + # 4. Update if necessary + if local_sha == remote_sha: + logger.info("Ocr Server No updates available.") + return + + # Perform update (System git preferred, pygit2 fallback) + manager.update() + + # Verify update + try: + new_local_sha = manager.get_local_sha() + if new_local_sha != remote_sha: + logger.warning("Failed to update the BAAS_ocr_server (SHA mismatch), please check your network.") + except Exception: + pass + + +def clone_repo(logger): + """ + Wrapper for cloning the repo. + """ + logger.info("Installing Ocr Server, please hang on...") + if _is_android_runtime(): + _install_android_prebuild(logger) + return + + manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) + manager.clone() diff --git a/gui/fragments/history.py b/gui/fragments/history.py index 67f8f9f5a..c71affac9 100644 --- a/gui/fragments/history.py +++ b/gui/fragments/history.py @@ -1,4 +1,6 @@ from random import random +import shutil +import subprocess import threading import time import traceback @@ -6,12 +8,67 @@ from hashlib import md5 from PyQt5.QtWidgets import QAbstractItemView, QTableWidgetItem, QHeaderView -from dulwich.repo import Repo from qfluentwidgets import TableWidget from gui.util.customized_ui import PureWindow +def _read_history_with_git(repo_path): + """Read commit history with the system git executable.""" + git_executable = shutil.which("git") + if not git_executable: + raise FileNotFoundError("System git not found") + result = subprocess.run( + [ + git_executable, + "log", + "--date=format:%Y-%m-%d %H:%M:%S", + "--pretty=format:%h%x1f%an%x1f%ad%x1f%s%x1e", + ], + cwd=repo_path, + capture_output=True, + text=True, + check=True, + ) + entries = [] + for raw_entry in result.stdout.split("\x1e"): + raw_entry = raw_entry.strip() + if not raw_entry: + continue + commit_id, author, commit_time, message = raw_entry.split("\x1f", 3) + entries.append({ + 'id': commit_id, + 'author': author.strip(), + 'date': commit_time, + 'message': message.strip(), + }) + return entries + + +def _read_history_with_pygit2(repo_path): + """Read commit history with pygit2 when system git is unavailable.""" + import pygit2 + + repo = pygit2.Repository(repo_path) + entries = [] + for commit in repo.walk(repo.head.target, pygit2.GIT_SORT_TIME): + entries.append({ + 'id': str(commit.id)[:6], + 'author': commit.author.name.strip(), + 'date': datetime.fromtimestamp(commit.commit_time).strftime("%Y-%m-%d %H:%M:%S"), + 'message': commit.message.strip(), + }) + return entries + + +def read_history_entries(repo_path): + """Read local commit history using system git first and pygit2 as fallback.""" + try: + return _read_history_with_git(repo_path) + except Exception: + return _read_history_with_pygit2(repo_path) + + class HistoryWindow(PureWindow): def __init__(self): super().__init__() @@ -41,22 +98,7 @@ def __init__(self): def fetch_update_info(self): repo_path = '.' # 仓库路径,可根据需要修改 try: - repo = Repo(repo_path) - self.log_entries = [] - - for entry in repo.get_walker(): - commit = entry.commit - commit_id = entry.commit.id.decode("utf-8")[:6] - author = commit.author.decode("utf-8").split('<')[0].strip() - commit_time = datetime.fromtimestamp(commit.commit_time).strftime("%Y-%m-%d %H:%M:%S") - message = commit.message.decode("utf-8").strip() - - self.log_entries.append({ - 'id': commit_id, - 'author': author, - 'date': commit_time, - 'message': message - }) + self.log_entries = read_history_entries(repo_path) self.table_view.setRowCount(len(self.log_entries)) for i, entry in enumerate(self.log_entries): diff --git a/requirements-linux.txt b/requirements-linux.txt index e0ab79a6f..0229fd045 100644 --- a/requirements-linux.txt +++ b/requirements-linux.txt @@ -13,7 +13,6 @@ PyQt-Fluent-Widgets == 1.2.0 # gevent requests -dulwich psutil tqdm diff --git a/service/android_ocr_installer.py b/service/android_ocr_installer.py index 31b4a0a03..4760db875 100644 --- a/service/android_ocr_installer.py +++ b/service/android_ocr_installer.py @@ -16,8 +16,8 @@ # ================================ # Check the std::in and std::out Status before -# dulwich-related crashes, for dulwich will -# connect to the io, while the io is unset +# Git library calls may touch stdio while the packaged window app +# leaves the streams unset. # by the built window app. if sys.stdin is None: diff --git a/service/injection.py b/service/injection.py index 6a6855a73..648ce56aa 100644 --- a/service/injection.py +++ b/service/injection.py @@ -70,10 +70,9 @@ def config_updated(self, _key): def _install_android_ocr_modules() -> None: if not _env_enabled("BAAS_ANDROID"): return - from service import android_ocr_client, android_ocr_installer + from service import android_ocr_client sys.modules["core.ocr.baas_ocr_client.Client"] = android_ocr_client - sys.modules["core.ocr.baas_ocr_client.server_installer"] = android_ocr_installer def prepare_service_imports() -> None: @@ -92,6 +91,7 @@ def _patch_logger() -> None: original_init = logger_cls.__init__ original_log = getattr(logger_cls, "log", None) + original_out = getattr(logger_cls, "__out__", None) @wraps(original_init) def init(self, logger_signal, jsonify=False): @@ -102,6 +102,20 @@ def init(self, logger_signal, jsonify=False): _ensure_logger_extensions(self, jsonify=jsonify) logger_cls.__init__ = init + if original_out is not None: + @wraps(original_out) + def out(self, message, level=1, raw_print=False): + _ensure_logger_extensions(self) + if getattr(self, "jsonify", False): + self.log_collector.put({ + "time": datetime.now(), + "level": level, + "message": str(message), + }) + return + return original_out(self, message, level=level, raw_print=raw_print) + + logger_cls.__out__ = out if original_log is not None: @wraps(original_log) def log(self, level, message): diff --git a/tests/core/ocr/test_android_runtime.py b/tests/core/ocr/test_android_runtime.py index 6cafd6f48..ff8967a20 100644 --- a/tests/core/ocr/test_android_runtime.py +++ b/tests/core/ocr/test_android_runtime.py @@ -1,7 +1,7 @@ from __future__ import annotations +from core.ocr.baas_ocr_client import server_installer from service import android_ocr_client as Client -from service import android_ocr_installer as server_installer class _Logger: diff --git a/tests/service/test_service_injection.py b/tests/service/test_service_injection.py index dcd59b185..c5856bb0c 100644 --- a/tests/service/test_service_injection.py +++ b/tests/service/test_service_injection.py @@ -18,14 +18,21 @@ class Logger: def __init__(self, logger_signal): self.logger_signal = logger_signal + def __out__(self, message, level=1, raw_print=False): + raise AssertionError("json logger should queue instead of writing directly") + + def info(self, message): + self.__out__(message, 1) + monkeypatch.delenv("BAAS_ANDROID", raising=False) _install_fake_core(monkeypatch, Logger) injection._patch_logger() logger = Logger(None, jsonify=True) + logger.info("message") assert logger.jsonify is True - assert logger.log_collector.empty() + assert logger.log_collector.get_nowait()["message"] == "message" assert not hasattr(Logger, "log") @@ -46,4 +53,3 @@ def log(self, level, message): logger.log(2, "message") assert logger.log_collector.get_nowait()["message"] == "message" - From 05b9299d0ee6f069236bdd28987fb4a6359eb40b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 2 Jul 2026 00:22:31 +0800 Subject: [PATCH 87/98] Fix: Suppress interactive git credential prompts --- core/ocr/baas_ocr_client/server_installer.py | 31 ++++++-- deploy/installer/installer.py | 24 +++++- gui/components/expand/baasUpdateConfig.py | 48 +----------- gui/fragments/history.py | 22 ++++++ service/android_ocr_installer.py | 31 ++++++-- service/update/checks.py | 68 ++++++++++++++++- service/update/repository.py | 26 ++++++- tests/service/test_update_checks.py | 79 ++++++++++++++++++++ 8 files changed, 257 insertions(+), 72 deletions(-) diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index 4760db875..4e74ae98e 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -7,7 +7,7 @@ import time import tempfile import zipfile -from typing import Optional +from typing import Dict, Optional import pygit2 import requests @@ -15,10 +15,8 @@ from pygit2.enums import ResetMode # ================================ -# Check the std::in and std::out Status before -# Git library calls may touch stdio while the packaged window app -# leaves the streams unset. -# by the built window app. +# Check stdio before Git libraries touch it; packaged window builds may leave +# these streams unset. if sys.stdin is None: sys.stdin = io.TextIOWrapper(io.BytesIO()) @@ -75,6 +73,24 @@ def _android_ocr_branch() -> Optional[str]: ) else os.path.join(SERVER_INSTALLER_DIR_PATH, "bin") ANDROID_VERSION_FILE = os.path.join(SERVER_BIN_DIR, ".baas-ocr-prebuild-sha") +NONINTERACTIVE_GIT_CONFIG = [ + "-c", "credential.helper=", + "-c", "credential.interactive=never", + "-c", "core.askPass=echo", + "-c", "core.sshCommand=ssh -o BatchMode=yes", +] + + +def noninteractive_git_env(base_env: Optional[Dict[str, str]] = None) -> Dict[str, str]: + """Return a Git environment that prevents GUI credential prompts.""" + env = (base_env or os.environ).copy() + env["GIT_TERMINAL_PROMPT"] = "0" + env["GCM_INTERACTIVE"] = "never" + env["GCM_MODAL_PROMPT"] = "0" + env["GIT_ASKPASS"] = "echo" + env["SSH_ASKPASS"] = "echo" + return env + def _is_android_runtime() -> bool: return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} @@ -250,11 +266,12 @@ def _run_git_cmd(self, args: list, cwd: Optional[str] = None) -> str: raise FileNotFoundError(f"Repo directory {target_cwd} does not exist") proc = subprocess.run( - [self.git_executable] + args, + [self.git_executable, *NONINTERACTIVE_GIT_CONFIG, *args], cwd=target_cwd, capture_output=True, text=True, - check=True + check=True, + env=noninteractive_git_env(), ) return proc.stdout.strip() diff --git a/deploy/installer/installer.py b/deploy/installer/installer.py index df0891b29..543e9a5df 100644 --- a/deploy/installer/installer.py +++ b/deploy/installer/installer.py @@ -74,6 +74,24 @@ os.environ["PDM_IGNORE_ACTIVE_VENV"] = "1" +NONINTERACTIVE_GIT_CONFIG = [ + "-c", "credential.helper=", + "-c", "credential.interactive=never", + "-c", "core.askPass=echo", + "-c", "core.sshCommand=ssh -o BatchMode=yes", +] + + +def noninteractive_git_env(base_env: Optional[dict] = None) -> dict: + """Return a Git environment that prevents GUI credential prompts.""" + env = (base_env or os.environ).copy() + env["GIT_TERMINAL_PROMPT"] = "0" + env["GCM_INTERACTIVE"] = "never" + env["GCM_MODAL_PROMPT"] = "0" + env["GIT_ASKPASS"] = "echo" + env["SSH_ASKPASS"] = "echo" + return env + # ==================== Logging Configuration ==================== logger.remove() @@ -300,15 +318,13 @@ def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: if not target_cwd.exists(): raise FileNotFoundError(f"Target directory {target_cwd} does not exist.") - # Disable interactive prompts - env = __env__.copy() - env["GIT_TERMINAL_PROMPT"] = "0" + env = noninteractive_git_env(__env__) printer = DotPrinter(interval=0.5) printer.start() try: result = subprocess.run( - [self.git_executable, *args], + [self.git_executable, *NONINTERACTIVE_GIT_CONFIG, *args], cwd=target_cwd, capture_output=True, text=True, diff --git a/gui/components/expand/baasUpdateConfig.py b/gui/components/expand/baasUpdateConfig.py index 31d9bffc7..c1ea7ba5a 100644 --- a/gui/components/expand/baasUpdateConfig.py +++ b/gui/components/expand/baasUpdateConfig.py @@ -1,5 +1,4 @@ import binascii -import tempfile import threading import time import webbrowser @@ -20,6 +19,7 @@ from deploy.installer.mirrorc_update.mirrorc_updater import MirrorC_Updater, RequestReturn from gui.util.config_gui import COLOR_THEME, configGui from gui.util.notification import success, error +from service.update.checks import _git_wrapper_get_latest_sha class TestGetRemoteShaMethodWorker(QThread): @@ -74,51 +74,7 @@ def mirrorc_api_get_latest_sha(): @staticmethod def pygit2_get_latest_sha(data): - url = data["url"] - branch = data["branch"] - target_ref = f"refs/heads/{branch}" - - try: - # 创建一个临时 bare 仓库 - tmpdir = tempfile.mkdtemp(prefix="pygit2-remote-") - repo = pygit2.init_repository(tmpdir, bare=True) - - # 添加远程仓库 - try: - remote = repo.remotes["origin"] - except KeyError: - remote = repo.remotes.create("origin", url) - - # 拉取远程引用(不下载对象) - remote.fetch() # 轻量 fetch,默认不会 checkout - - # 获取远程引用表 - remote_refs = remote.ls_remotes() - - # 遍历匹配分支引用 - for ref in remote_refs: - if ref.get("name") == target_ref: - sha = str(ref.get("oid")) - return True, sha - - # 如果没找到直接尝试 refs/remotes/origin/ - ref_full = f"refs/remotes/origin/{branch}" - if ref_full in repo.references: - oid = repo.references[ref_full].target - sha = str(oid) - return True, sha - - return False, f"Branch '{branch}' not found in remote." - - except Exception as e: - return False, str(e) - finally: - # 删除临时目录 - try: - import shutil - shutil.rmtree(tmpdir) - except Exception: - pass + return _git_wrapper_get_latest_sha(data, timeout=3.0) class MirrorCCDKTestThread(QThread): finished = pyqtSignal(RequestReturn, bool) diff --git a/gui/fragments/history.py b/gui/fragments/history.py index c71affac9..485eb9ce1 100644 --- a/gui/fragments/history.py +++ b/gui/fragments/history.py @@ -12,6 +12,26 @@ from gui.util.customized_ui import PureWindow +NONINTERACTIVE_GIT_CONFIG = [ + "-c", "credential.helper=", + "-c", "credential.interactive=never", + "-c", "core.askPass=echo", + "-c", "core.sshCommand=ssh -o BatchMode=yes", +] + + +def _noninteractive_git_env(): + """Return a Git environment that prevents GUI credential prompts.""" + import os + + env = os.environ.copy() + env["GIT_TERMINAL_PROMPT"] = "0" + env["GCM_INTERACTIVE"] = "never" + env["GCM_MODAL_PROMPT"] = "0" + env["GIT_ASKPASS"] = "echo" + env["SSH_ASKPASS"] = "echo" + return env + def _read_history_with_git(repo_path): """Read commit history with the system git executable.""" @@ -21,6 +41,7 @@ def _read_history_with_git(repo_path): result = subprocess.run( [ git_executable, + *NONINTERACTIVE_GIT_CONFIG, "log", "--date=format:%Y-%m-%d %H:%M:%S", "--pretty=format:%h%x1f%an%x1f%ad%x1f%s%x1e", @@ -29,6 +50,7 @@ def _read_history_with_git(repo_path): capture_output=True, text=True, check=True, + env=_noninteractive_git_env(), ) entries = [] for raw_entry in result.stdout.split("\x1e"): diff --git a/service/android_ocr_installer.py b/service/android_ocr_installer.py index 4760db875..4e74ae98e 100644 --- a/service/android_ocr_installer.py +++ b/service/android_ocr_installer.py @@ -7,7 +7,7 @@ import time import tempfile import zipfile -from typing import Optional +from typing import Dict, Optional import pygit2 import requests @@ -15,10 +15,8 @@ from pygit2.enums import ResetMode # ================================ -# Check the std::in and std::out Status before -# Git library calls may touch stdio while the packaged window app -# leaves the streams unset. -# by the built window app. +# Check stdio before Git libraries touch it; packaged window builds may leave +# these streams unset. if sys.stdin is None: sys.stdin = io.TextIOWrapper(io.BytesIO()) @@ -75,6 +73,24 @@ def _android_ocr_branch() -> Optional[str]: ) else os.path.join(SERVER_INSTALLER_DIR_PATH, "bin") ANDROID_VERSION_FILE = os.path.join(SERVER_BIN_DIR, ".baas-ocr-prebuild-sha") +NONINTERACTIVE_GIT_CONFIG = [ + "-c", "credential.helper=", + "-c", "credential.interactive=never", + "-c", "core.askPass=echo", + "-c", "core.sshCommand=ssh -o BatchMode=yes", +] + + +def noninteractive_git_env(base_env: Optional[Dict[str, str]] = None) -> Dict[str, str]: + """Return a Git environment that prevents GUI credential prompts.""" + env = (base_env or os.environ).copy() + env["GIT_TERMINAL_PROMPT"] = "0" + env["GCM_INTERACTIVE"] = "never" + env["GCM_MODAL_PROMPT"] = "0" + env["GIT_ASKPASS"] = "echo" + env["SSH_ASKPASS"] = "echo" + return env + def _is_android_runtime() -> bool: return os.getenv("BAAS_ANDROID", "").lower() in {"1", "true", "yes", "on"} @@ -250,11 +266,12 @@ def _run_git_cmd(self, args: list, cwd: Optional[str] = None) -> str: raise FileNotFoundError(f"Repo directory {target_cwd} does not exist") proc = subprocess.run( - [self.git_executable] + args, + [self.git_executable, *NONINTERACTIVE_GIT_CONFIG, *args], cwd=target_cwd, capture_output=True, text=True, - check=True + check=True, + env=noninteractive_git_env(), ) return proc.stdout.strip() diff --git a/service/update/checks.py b/service/update/checks.py index f279239fc..fdba64fd0 100644 --- a/service/update/checks.py +++ b/service/update/checks.py @@ -28,6 +28,39 @@ RepositoryResult = Dict[str, Any] +NONINTERACTIVE_GIT_CONFIG = [ + "-c", "credential.helper=", + "-c", "credential.interactive=never", + "-c", "core.askPass=echo", + "-c", "core.sshCommand=ssh -o BatchMode=yes", +] + + +def noninteractive_git_env(base_env: Optional[Dict[str, str]] = None) -> Dict[str, str]: + """Return a Git environment that prevents GUI credential prompts.""" + env = (base_env or os.environ).copy() + env["GIT_TERMINAL_PROMPT"] = "0" + env["GCM_INTERACTIVE"] = "never" + env["GCM_MODAL_PROMPT"] = "0" + env["GIT_ASKPASS"] = "echo" + env["SSH_ASKPASS"] = "echo" + return env + + +def _is_noninteractive_auth_failure(exc: Exception) -> bool: + """Return true when Git failed because credentials cannot be requested.""" + stderr = getattr(exc, "stderr", "") or "" + stdout = getattr(exc, "stdout", "") or "" + message = f"{stderr}\n{stdout}\n{exc}".lower() + auth_markers = ( + "authentication failed", + "terminal prompts disabled", + "could not read username", + "credential", + "gcm", + ) + return any(marker in message for marker in auth_markers) + class GitOperationHandler: """ @@ -50,10 +83,9 @@ def _run_git_cmd(self, args: List[str], timeout: Optional[float] = None) -> str: # Ensure we run in an existing directory. `ls-remote` does not require # the current BAAS directory to be a Git repository. cwd = self.repo_path if self.repo_path.exists() else Path.cwd() - env = os.environ.copy() - env["GIT_TERMINAL_PROMPT"] = "0" + env = noninteractive_git_env() result = subprocess.run( - [self.git_executable, *args], + [self.git_executable, *NONINTERACTIVE_GIT_CONFIG, *args], cwd=cwd, capture_output=True, text=True, @@ -79,6 +111,8 @@ def get_remote_latest_sha(self, url: str, branch: str, timeout: Optional[float] return output.split()[0] raise ValueError(f"Branch '{branch}' not found at {url} (System Git)") except (subprocess.CalledProcessError, subprocess.TimeoutExpired, IndexError, ValueError) as e: + if _is_noninteractive_auth_failure(e): + raise ValueError(f"Git authentication failed without prompting: {e}") from e last_error = e # Fallback to pygit2 in a temporary bare repository. Android installs @@ -291,7 +325,10 @@ def _android_http_get_latest_sha(config: Dict[str, Any], timeout: float) -> Tupl def repo_sha_test_configs(channel: Optional[str] = None) -> List[Dict[str, Any]]: """Return normalized repository SHA test configs for a channel.""" channel = normalize_update_channel(channel or _setup_channel()[0]) - return [{**config, "channel": channel} for config in get_remote_sha_methods_for_channel(channel)] + return [ + {**config, "channel": channel, "order": index} + for index, config in enumerate(get_remote_sha_methods_for_channel(channel)) + ] def test_all_repo_sha(timeout: float = 3.0, channel: Optional[str] = None) -> List[RepositoryResult]: @@ -323,6 +360,7 @@ def test_repo_sha(config: dict[str, Union[str, GetShaMethod]], timeout: float) - "success": success, "value": value if success else None, "error": None if success else value, + "order": int(config.get("order", 0)) if success else -1, } return result @@ -521,6 +559,28 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: method_config = next((x for x in repo_methods if x.get('name') == method_name), repo_methods[0]) repo_result = test_repo_sha(method_config, timeout=timeout) + if not repo_result.get("success"): + fallback_results = [] + for candidate in repo_methods: + if candidate.get("name") == method_config.get("name"): + continue + candidate_result = test_repo_sha(candidate, timeout=timeout) + fallback_results.append(candidate_result) + if candidate_result.get("success") and candidate_result.get("value"): + method_config = candidate + repo_result = candidate_result + setup_toml["general"]["get_remote_sha_method"] = candidate.get("name") + write_setup_toml(setup_toml, local_info.path) + break + else: + selected = _select_remote_record(local_info.version, fallback_results) + if selected: + selected_name = selected.get("name") + method_config = next( + (x for x in repo_methods if x.get("name") == selected_name), + method_config, + ) + repo_result = selected remote_version = repo_result.get("value") if repo_result else None update_available = ( diff --git a/service/update/repository.py b/service/update/repository.py index a7d6de070..ea25e37d8 100644 --- a/service/update/repository.py +++ b/service/update/repository.py @@ -19,6 +19,26 @@ import tomli_w from pygit2.enums import ResetMode +# Per-command Git options keep background update checks from invoking GUI +# credential helpers such as Git Credential Manager. +NONINTERACTIVE_GIT_CONFIG = [ + "-c", "credential.helper=", + "-c", "credential.interactive=never", + "-c", "core.askPass=echo", + "-c", "core.sshCommand=ssh -o BatchMode=yes", +] + + +def noninteractive_git_env(base_env: Optional[Dict[str, str]] = None) -> Dict[str, str]: + """Return a Git environment that fails fast instead of opening credential prompts.""" + env = (base_env or os.environ).copy() + env["GIT_TERMINAL_PROMPT"] = "0" + env["GCM_INTERACTIVE"] = "never" + env["GCM_MODAL_PROMPT"] = "0" + env["GIT_ASKPASS"] = "echo" + env["SSH_ASKPASS"] = "echo" + return env + # External dependencies (assumed to exist based on context) from deploy.installer.const import ( GetShaMethod, @@ -137,13 +157,11 @@ def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: if not target_cwd.exists(): raise FileNotFoundError(f"Directory {target_cwd} does not exist.") - # Suppress password prompts - env = os.environ.copy() - env["GIT_TERMINAL_PROMPT"] = "0" + env = noninteractive_git_env() try: result = subprocess.run( - [self.git_executable, *args], + [self.git_executable, *NONINTERACTIVE_GIT_CONFIG, *args], cwd=target_cwd, capture_output=True, text=True, diff --git a/tests/service/test_update_checks.py b/tests/service/test_update_checks.py index 6bbc84370..43020d05e 100644 --- a/tests/service/test_update_checks.py +++ b/tests/service/test_update_checks.py @@ -1,5 +1,7 @@ from __future__ import annotations +import subprocess + from deploy.installer.const import GetShaMethod from service.update import checks @@ -123,3 +125,80 @@ def test_non_github_android_sha_keeps_git_wrapper(monkeypatch): assert result["success"] is False assert result["error"] == "git failed" + assert result["order"] == -1 + + +def test_repo_sha_marks_failed_source_with_disabled_order(monkeypatch): + monkeypatch.setattr(checks, "_git_wrapper_get_latest_sha", lambda _config, _timeout: (False, "auth failed")) + + result = checks.test_repo_sha( + { + "name": "gitee", + "method": GetShaMethod.PYGIT2, + "url": "https://gitee.com/kiramei/baas-dev.git", + "branch": "master", + "order": 2, + }, + timeout=3.0, + ) + + assert result["success"] is False + assert result["order"] == -1 + + +def test_remote_sha_auth_failure_does_not_fallback_to_pygit2(monkeypatch, tmp_path): + def fake_run_git_cmd(_self, _args, timeout=None): + raise subprocess.CalledProcessError( + returncode=128, + cmd="git ls-remote", + stderr="fatal: could not read Username for 'https://gitee.com': terminal prompts disabled", + ) + + def fail_init_repository(*_args, **_kwargs): + raise AssertionError("credential failures should be final for this source") + + monkeypatch.setattr(checks.shutil, "which", lambda _name: "git") + monkeypatch.setattr(checks.GitOperationHandler, "_run_git_cmd", fake_run_git_cmd) + monkeypatch.setattr(checks.pygit2, "init_repository", fail_init_repository) + + handler = checks.GitOperationHandler(tmp_path) + + try: + handler.get_remote_latest_sha("https://gitee.com/kiramei/baas-dev.git", "master") + except ValueError as exc: + assert "authentication failed" in str(exc).lower() + else: + raise AssertionError("credential failure should be reported") + + +def test_check_for_update_switches_failed_saved_sha_method(monkeypatch, tmp_path): + setup_path = tmp_path / "setup.toml" + + def fake_get_local_version(): + return ( + checks.VersionInfo(version="0" * 40, source="setup.toml", path=setup_path), + {"general": {"no_update": False, "get_remote_sha_method": "gitee", "channel": "stable"}}, + "master", + ) + + methods = [ + {"name": "github", "method": GetShaMethod.GITHUB_API, "order": 0}, + {"name": "gitee", "method": GetShaMethod.PYGIT2, "order": 1}, + ] + saved = {} + + def fake_test_repo_sha(config, timeout): + if config["name"] == "gitee": + return {"name": "gitee", "success": False, "value": None, "error": "auth failed", "order": -1} + return {"name": "github", "success": True, "value": "1" * 40, "error": None, "order": 0} + + monkeypatch.setattr(checks, "get_local_version", fake_get_local_version) + monkeypatch.setattr(checks, "get_remote_sha_methods_for_channel", lambda _channel: [dict(item) for item in methods]) + monkeypatch.setattr(checks, "test_repo_sha", fake_test_repo_sha) + monkeypatch.setattr(checks, "write_setup_toml", lambda data, path: saved.update({"data": data, "path": path})) + + result = checks.check_for_update(timeout=3.0) + + assert result["remote"] == "1" * 40 + assert result["method"] == "github" + assert saved["data"]["general"]["get_remote_sha_method"] == "github" From 4efd358f010cb71f1a5da8dad4583153a476492c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 2 Jul 2026 00:44:53 +0800 Subject: [PATCH 88/98] Fix sync workflow merge fallback --- .github/workflows/sync-from-upstream.yml | 34 +++++++++++++----------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/.github/workflows/sync-from-upstream.yml b/.github/workflows/sync-from-upstream.yml index 9426aee51..cb651a03f 100644 --- a/.github/workflows/sync-from-upstream.yml +++ b/.github/workflows/sync-from-upstream.yml @@ -88,33 +88,35 @@ jobs: echo "Created sync PR: ${pr_url}" fi - set +e - gh pr merge "${pr_url}" \ - --repo "${GITHUB_REPOSITORY}" \ - --merge \ - --auto \ - --delete-branch - - merge_status=$? - - if [ "${merge_status}" -ne 0 ]; then - echo "Auto-merge failed or unnecessary. Trying direct merge..." + if gh api "repos/${GITHUB_REPOSITORY}/branches/${BASE_BRANCH}/protection" >/dev/null 2>&1; then + echo "${BASE_BRANCH} has branch protection. Enabling auto-merge..." + set +e + gh pr merge "${pr_url}" \ + --repo "${GITHUB_REPOSITORY}" \ + --merge \ + --auto \ + --delete-branch + merge_status=$? + set -e + else + echo "${BASE_BRANCH} has no branch protection. Merging directly..." + set +e gh pr merge "${pr_url}" \ --repo "${GITHUB_REPOSITORY}" \ --merge \ --delete-branch merge_status=$? + set -e fi - set -e if [ "${merge_status}" -eq 0 ]; then - echo "PR auto-merge enabled or merged: ${pr_url}" + echo "PR auto-merge enabled or merged directly: ${pr_url}" else - echo "Auto-merge/direct merge failed. Leaving PR open: ${pr_url}" + echo "Merge failed. Leaving PR open: ${pr_url}" gh pr comment "${pr_url}" \ --repo "${GITHUB_REPOSITORY}" \ - --body "Auto-merge/direct merge failed. Please review manually. Possible causes: conflicts, failing required checks, branch protection, or insufficient token permissions." || true - fi \ No newline at end of file + --body "Merge failed. Please review manually. Possible causes: conflicts, failing required checks, branch protection, or insufficient token permissions." || true + fi From fee32051735d8fa10ad9d6c0cd2f27bd4852380d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 2 Jul 2026 01:05:44 +0800 Subject: [PATCH 89/98] Fix: Retry Android local UIAutomator operations --- service/android_local_device.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/service/android_local_device.py b/service/android_local_device.py index eb7e87122..5677b679a 100644 --- a/service/android_local_device.py +++ b/service/android_local_device.py @@ -4,6 +4,18 @@ from core.device.uiautomator2_client import U2Client +def _with_uiautomator_retry(u2_client, operation): + """Runs an Android-local UIAutomator operation with one reconnect attempt.""" + try: + return operation() + except Exception: + connection = u2_client.get_connection() + uiautomator = getattr(connection, "uiautomator", None) + if uiautomator is not None: + uiautomator.start() + return operation() + + class AndroidLocalControl: """Android-embedded control adapter backed by the local device agent.""" @@ -12,15 +24,19 @@ def __init__(self, conn): self.u2 = U2Client.get_instance(self.serial) def click(self, x, y): - self.u2.click(x, y) + """Taps the Android screen and retries once if UIAutomator detached.""" + return _with_uiautomator_retry(self.u2, lambda: self.u2.click(x, y)) def swipe(self, x1, y1, x2, y2, duration): - self.u2.swipe(x1, y1, x2, y2, duration) + """Swipes the Android screen and retries once if UIAutomator detached.""" + return _with_uiautomator_retry(self.u2, lambda: self.u2.swipe(x1, y1, x2, y2, duration)) def long_click(self, x, y, duration): - self.u2.swipe(x, y, x, y, duration) + """Presses one Android screen point for the requested duration.""" + return _with_uiautomator_retry(self.u2, lambda: self.u2.swipe(x, y, x, y, duration)) def scroll(self, x, y, clicks): + """Converts wheel-style scroll clicks into Android swipe gestures.""" direction = -1 if clicks > 0 else 1 distance = 240 * abs(clicks) self.swipe(x, y, x, y + direction * distance, 0.2) @@ -34,4 +50,5 @@ def __init__(self, conn): self.u2 = U2Client.get_instance(self.serial) def screenshot(self): - return self.u2.screenshot() + """Captures the Android screen and retries once if UIAutomator detached.""" + return _with_uiautomator_retry(self.u2, lambda: self.u2.screenshot()) From c6abc92025e9985b81e727684dea4ed2e7dacf05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Sun, 12 Jul 2026 17:12:43 +0800 Subject: [PATCH 90/98] Fix service sync recovery and diagnostics --- core/device/connection.py | 9 +- main.service.py | 9 + service/__init__.py | 7 +- service/api/http.py | 31 +++ service/api/ws_control.py | 13 +- service/api/ws_provider.py | 9 +- service/api/ws_remote.py | 17 +- service/api/ws_sync.py | 129 +++++++---- service/api/ws_trigger.py | 14 +- service/app.py | 32 ++- service/conf/manager.py | 4 + service/context.py | 13 +- service/remote/scrcpy.py | 174 ++++++++------- service/runtime.py | 15 +- service/system_logging.py | 227 ++++++++++++++++++++ tests/service/test_config_runtime_update.py | 11 + tests/service/test_scrcpy_client.py | 43 ++++ tests/service/test_service_logic.py | 13 ++ tests/service/test_system_logging.py | 115 ++++++++++ tests/service/test_ws_sync_conflict.py | 60 ++++++ 20 files changed, 802 insertions(+), 143 deletions(-) create mode 100644 service/system_logging.py create mode 100644 tests/service/test_scrcpy_client.py create mode 100644 tests/service/test_system_logging.py create mode 100644 tests/service/test_ws_sync_conflict.py diff --git a/core/device/connection.py b/core/device/connection.py index 7ef6271f0..f448a5cbb 100644 --- a/core/device/connection.py +++ b/core/device/connection.py @@ -9,7 +9,7 @@ # reference : [ https://github.com/LmeSzinc/AzurLaneAutoScript/blob/master/module/device/connection.py ] class Connection: - def __init__(self, Baas_instance): + def __init__(self, Baas_instance, skip_package_detection=False): self.Baas_thread = Baas_instance self.logger = Baas_instance.get_logger() self.config_set = Baas_instance.get_config() @@ -24,10 +24,10 @@ def __init__(self, Baas_instance): self._is_android_device = False self._init_app_process() else: - self._init_android_device() + self._init_android_device(skip_package_detection) self._is_android_device = True - def _init_android_device(self): + def _init_android_device(self, skip_package_detection=False): self.activity = None self.package = None self.adbIP = self.config.adbIP @@ -46,7 +46,8 @@ def _init_android_device(self): self.check_serial() self.detect_device() self.adb_connect() - self.detect_package() + if not skip_package_detection: + self.detect_package() self.check_mumu_keep_alive() def _init_app_process(self): diff --git a/main.service.py b/main.service.py index 14e0e5c51..ed22728ee 100644 --- a/main.service.py +++ b/main.service.py @@ -1,4 +1,5 @@ import argparse +import logging import os import uvicorn @@ -53,6 +54,13 @@ def main() -> None: try: set_log_format() args = parse_args() + logging.getLogger(__name__).info( + "Starting BAAS service host=%s port=%s reload=%s log_level=%s", + args.host, + args.port, + args.reload, + args.log_level, + ) os.environ[OCR_UPDATE_CHECK_ENV] = "1" if args.ocr_update_check else "0" config = uvicorn.Config( "service.app:app", @@ -66,6 +74,7 @@ def main() -> None: save_pid(os.getpid()) server.run() finally: + logging.getLogger(__name__).info("BAAS service process exiting") delete_pid_file() diff --git a/service/__init__.py b/service/__init__.py index 7607c1a6a..3919619d1 100644 --- a/service/__init__.py +++ b/service/__init__.py @@ -1,9 +1,12 @@ def set_log_format(): import logging from datetime import datetime + from pathlib import Path from rich.console import Console from rich.markup import escape + from .system_logging import configure_system_logging + console = Console() levels_label = { @@ -36,10 +39,12 @@ def emit(self, record): # ----------- 使用 ---------- handler = RichHandler() handler.setFormatter(RichFormatter()) + handler.setLevel(logging.INFO) root = logging.getLogger() - root.setLevel(logging.INFO) + root.setLevel(logging.DEBUG) root.handlers = [handler] + configure_system_logging(Path.cwd()) logging.getLogger("watchfiles").setLevel(logging.ERROR) logging.getLogger("watchfiles.main").setLevel(logging.ERROR) diff --git a/service/api/http.py b/service/api/http.py index f8c54efc1..471dd907c 100644 --- a/service/api/http.py +++ b/service/api/http.py @@ -12,6 +12,7 @@ import requests from service.auth import AuthenticationError, b64d +from service.system_logging import clear_system_logs, read_system_logs, system_log_files from .security import cookie_secure from .state import REMEMBER_COOKIE_MAX_AGE, REMEMBER_COOKIE_NAME, context @@ -69,6 +70,32 @@ async def health() -> Dict[str, Any]: } +@router.get("/system/logs") +async def system_logs( + request: Request, + limit: int = 2000, + level: str = "", + query: str = "", +) -> Dict[str, Any]: + _require_loopback(request) + return { + "entries": read_system_logs( + context.project_root, + limit=max(1, min(limit, 10000)), + level=level or None, + query=query or None, + ), + "files": system_log_files(context.project_root), + } + + +@router.post("/system/logs/clear") +async def clear_logs(request: Request) -> Dict[str, Any]: + _require_loopback(request) + clear_system_logs(context.project_root) + return {"ok": True} + + @router.post("/android/active-config") async def android_active_config(request: Request, payload: dict[str, Any]) -> Dict[str, Any]: _require_android_loopback(request) @@ -126,6 +153,10 @@ async def android_wiki_proxy(request: Request, path: str = "/") -> Response: def _require_android_loopback(request: Request) -> None: if os.environ.get("BAAS_ANDROID") != "1": raise HTTPException(status_code=404, detail="Not found") + _require_loopback(request) + + +def _require_loopback(request: Request) -> None: host = request.client.host if request.client else "" try: if ipaddress.ip_address(host).is_loopback: diff --git a/service/api/ws_control.py b/service/api/ws_control.py index 1d847071c..4529ae9fe 100644 --- a/service/api/ws_control.py +++ b/service/api/ws_control.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import logging from contextlib import suppress from typing import Optional @@ -18,6 +19,7 @@ from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) @router.websocket("/ws/control") @@ -26,6 +28,7 @@ async def websocket_control(websocket: WebSocket) -> None: sender_task = heartbeat_task = None session: Optional[ActiveSession] = None try: + _logger.debug("Control websocket connection started") handshake, preauth_channel, _ = await begin_server_hello(websocket, kind="control", channel="control") request = preauth_channel.decrypt(await websocket.receive_json()) session, control_channel = await finalize_control_auth( @@ -36,6 +39,7 @@ async def websocket_control(websocket: WebSocket) -> None: ) if session is None: raise ValueError("Session not found") + _logger.info("Control websocket authenticated session_id=%s", session.session_id) revoke_queue = context.auth_manager.subscribe_control(session.session_id) sender_task = asyncio.create_task( control_sender( @@ -57,20 +61,20 @@ async def websocket_control(websocket: WebSocket) -> None: if msg_type == "ping": await websocket.send_json(control_channel.encrypt({"type": "pong", "timestamp": unix_timestamp_ms()})) elif msg_type == "change_password": + _logger.warning("Password change requested session_id=%s", session.session_id) new_password = str(message.get("new_password", "")) await context.auth_manager.change_password(session_id=session.session_id, new_password=new_password) return else: raise AuthenticationError(f"Unsupported control message: {msg_type}") except (AuthenticationError, HTTPException) as exc: + _logger.warning("Control websocket authentication/protocol failure: %s", exc) with suppress(RuntimeError): await websocket.close(code=4401, reason=str(exc)) except WebSocketDisconnect: - pass + _logger.debug("Control websocket disconnected") except Exception as exc: # noqa: BLE001 - surfaced to caller - import traceback - - traceback.print_exc() + _logger.exception("Control websocket failed: %s", exc) with suppress(RuntimeError): await websocket.close(code=1011, reason=str(exc)) finally: @@ -81,3 +85,4 @@ async def websocket_control(websocket: WebSocket) -> None: task.cancel() with suppress(asyncio.CancelledError): await task + _logger.debug("Control websocket closed") diff --git a/service/api/ws_provider.py b/service/api/ws_provider.py index 21695b44a..2612a7cbb 100644 --- a/service/api/ws_provider.py +++ b/service/api/ws_provider.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import logging from contextlib import suppress from typing import Optional @@ -13,6 +14,7 @@ from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) async def provider_sender( @@ -42,7 +44,9 @@ async def websocket_provider(websocket: WebSocket) -> None: log_queue = status_queue = None log_task = status_task = None try: + _logger.debug("Provider websocket connection started") _, stream = await perform_business_resume(websocket, channel="provider") + _logger.debug("Provider websocket secure session resumed") send_lock = asyncio.Lock() history = context.log_manager.get_history() scopes = context.log_manager.get_scopes() @@ -79,11 +83,13 @@ async def websocket_provider(websocket: WebSocket) -> None: else: raise HTTPException(status_code=400, detail=f"Unsupported provider message: {req_type}") except (AuthenticationError, HTTPException) as exc: + _logger.warning("Provider websocket authentication/protocol failure: %s", exc) with suppress(RuntimeError): await websocket.close(code=4401, reason=str(exc)) except WebSocketDisconnect: - pass + _logger.debug("Provider websocket disconnected") except Exception as exc: # noqa: BLE001 - surfaced to caller + _logger.exception("Provider websocket failed: %s", exc) with suppress(RuntimeError): await websocket.close(code=1011, reason=str(exc)) finally: @@ -96,3 +102,4 @@ async def websocket_provider(websocket: WebSocket) -> None: context.log_manager.unsubscribe(log_queue) if status_queue is not None: context.runtime.unsubscribe_status(status_queue) + _logger.debug("Provider websocket closed") diff --git a/service/api/ws_remote.py b/service/api/ws_remote.py index bb5be285b..b0e26f983 100644 --- a/service/api/ws_remote.py +++ b/service/api/ws_remote.py @@ -1,5 +1,8 @@ from __future__ import annotations +import logging +from contextlib import suppress + from fastapi import APIRouter, WebSocket from service.remote import ScrcpyProxySession @@ -8,6 +11,7 @@ from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) @router.websocket("/ws/remote") @@ -15,18 +19,23 @@ async def websocket_remote(websocket: WebSocket) -> None: proxy = None try: + _logger.info("remote websocket accepted") _, stream = await perform_business_resume(websocket, channel="remote") + _logger.info("remote secure session resumed") message = await recv_stream_json(websocket, stream) config_id = message.get("config_id") to_encrypt = message.get("decrypt", True) + _logger.info("remote client initialization started config_id=%s", config_id) client = await context.runtime.require_remote_(config_id) + _logger.info("remote client ready config_id=%s", config_id) proxy = ScrcpyProxySession(client, stream, encrypt_adb_to_ws=to_encrypt) await proxy.run(websocket) - except Exception: - import traceback - - traceback.print_exc() + except Exception as exc: + _logger.exception("remote websocket failed: %s", exc) + with suppress(Exception): + await websocket.close(code=1011, reason=f"remote: {type(exc).__name__}") finally: if proxy is not None: await proxy.close() + _logger.info("remote websocket closed") diff --git a/service/api/ws_sync.py b/service/api/ws_sync.py index 3d6d65b99..8ef8a0053 100644 --- a/service/api/ws_sync.py +++ b/service/api/ws_sync.py @@ -1,98 +1,138 @@ from __future__ import annotations import asyncio +import logging from contextlib import suppress from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect from service.auth import AuthenticationError, SecretStreamBox from service.types import SyncPatchMessage, SyncPullMessage +from service.utils.diff import PatchConflictError from .security import perform_business_resume, recv_stream_json, send_stream_json from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) -async def sync_sender(websocket: WebSocket, stream: SecretStreamBox, queue: asyncio.Queue) -> None: +async def sync_sender( + websocket: WebSocket, + stream: SecretStreamBox, + queue: asyncio.Queue, + send_lock: asyncio.Lock | None = None, +) -> None: + send_lock = send_lock or asyncio.Lock() try: while True: payload = dict(await queue.get()) payload.setdefault("direction", "push") - await send_stream_json(websocket, stream, payload) + async with send_lock: + await send_stream_json(websocket, stream, payload) except asyncio.CancelledError: pass +async def apply_sync_patch(data: SyncPatchMessage) -> dict: + """Apply one patch and return a recoverable response for stale snapshots.""" + try: + await context.config_manager.apply_patch( + data.resource, + data.resource_id, + data.ops, + data.timestamp, + origin="frontend", + ) + except PatchConflictError as exc: + snapshot = await context.config_manager.get_snapshot(data.resource, data.resource_id) + _logger.info( + "Sync patch conflict resource=%s resource_id=%s request_timestamp=%s snapshot_timestamp=%s", + data.resource, + data.resource_id, + data.timestamp, + snapshot.timestamp, + ) + return { + "type": "patch_conflict", + "resource": data.resource, + "resource_id": data.resource_id, + "request_timestamp": data.timestamp, + "timestamp": snapshot.timestamp, + "data": snapshot.data, + "error": str(exc), + } + return { + "type": "patch_ack", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": data.timestamp, + } + + @router.websocket("/ws/sync") async def websocket_sync(websocket: WebSocket) -> None: queue = None sender_task = None try: + _logger.debug("Sync websocket connection started") _, stream = await perform_business_resume(websocket, channel="sync") + _logger.debug("Sync websocket secure session resumed") + send_lock = asyncio.Lock() queue = await context.config_manager.subscribe_updates() - sender_task = asyncio.create_task(sync_sender(websocket, stream, queue)) + sender_task = asyncio.create_task(sync_sender(websocket, stream, queue, send_lock)) while True: message = await recv_stream_json(websocket, stream) msg_type = message.get("type") if msg_type == "pull": data = SyncPullMessage(**message) + _logger.debug("Sync pull resource=%s resource_id=%s", data.resource, data.resource_id) snapshot = await context.config_manager.get_snapshot(data.resource, data.resource_id) - await send_stream_json( - websocket, - stream, - { - "type": "snapshot", - "resource": data.resource, - "resource_id": data.resource_id, - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) + async with send_lock: + await send_stream_json( + websocket, + stream, + { + "type": "snapshot", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": snapshot.timestamp, + "data": snapshot.data, + }, + ) elif msg_type == "patch": data = SyncPatchMessage(**message) - await context.config_manager.apply_patch( + _logger.debug( + "Sync patch resource=%s resource_id=%s operations=%s", data.resource, data.resource_id, - data.ops, - data.timestamp, - origin="frontend", - ) - await send_stream_json( - websocket, - stream, - { - "type": "patch_ack", - "resource": data.resource, - "resource_id": data.resource_id, - "timestamp": data.timestamp, - }, + len(data.ops), ) + response = await apply_sync_patch(data) + async with send_lock: + await send_stream_json(websocket, stream, response) elif msg_type == "list": snapshot = await context.config_manager.get_config_list() - await send_stream_json( - websocket, - stream, - { - "type": "config_list", - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) + async with send_lock: + await send_stream_json( + websocket, + stream, + { + "type": "config_list", + "timestamp": snapshot.timestamp, + "data": snapshot.data, + }, + ) else: raise HTTPException(status_code=400, detail=f"Unsupported sync message: {msg_type}") except (AuthenticationError, HTTPException) as exc: - import traceback - - traceback.print_exc() + _logger.warning("Sync websocket authentication/protocol failure: %s", exc) with suppress(RuntimeError): await websocket.close(code=4401, reason=str(exc)) except WebSocketDisconnect: - pass + _logger.debug("Sync websocket disconnected") except Exception as exc: # noqa: BLE001 - surfaced to caller - import traceback - - traceback.print_exc() + _logger.exception("Sync websocket failed: %s", exc) with suppress(RuntimeError): await websocket.close(code=1011, reason=str(exc)) finally: @@ -102,3 +142,4 @@ async def websocket_sync(websocket: WebSocket) -> None: await sender_task if queue is not None: context.config_manager.unsubscribe_updates(queue) + _logger.debug("Sync websocket closed") diff --git a/service/api/ws_trigger.py b/service/api/ws_trigger.py index c7d172072..c4afe37ff 100644 --- a/service/api/ws_trigger.py +++ b/service/api/ws_trigger.py @@ -1,5 +1,6 @@ from __future__ import annotations +import logging from contextlib import suppress from typing import Any, Dict @@ -13,15 +14,19 @@ from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) @router.websocket("/ws/trigger") async def websocket_trigger(websocket: WebSocket) -> None: try: + _logger.debug("Trigger websocket connection started") _, stream = await perform_business_resume(websocket, channel="trigger") + _logger.debug("Trigger websocket secure session resumed") while True: message = await recv_stream_json(websocket, stream) cmd = CommandMessage(**message) + _logger.debug("Trigger command received command=%s", cmd.command) binary_payload = None if cmd.command == "import_config" and cmd.payload.get("binary") is True: binary_payload = await recv_stream_bytes(websocket, stream) @@ -45,6 +50,7 @@ async def websocket_trigger(websocket: WebSocket) -> None: ) response_payload = {"status": "ok", "data": {"done": True}} except Exception as inner_exc: # noqa: BLE001 - returned to frontend + _logger.exception("Streaming SHA test command failed: %s", inner_exc) response_payload = {"status": "error", "error": str(inner_exc), "data": {"done": True}} await send_stream_json( websocket, @@ -73,6 +79,7 @@ async def websocket_trigger(websocket: WebSocket) -> None: ) response_payload = {"status": "ok", "data": {"done": True}} except Exception as inner_exc: # noqa: BLE001 - returned to frontend + _logger.exception("Streaming update command failed: %s", inner_exc) response_payload = {"status": "error", "error": str(inner_exc), "data": {"done": True}} await send_stream_json( websocket, @@ -88,6 +95,7 @@ async def websocket_trigger(websocket: WebSocket) -> None: try: response_payload = await execute_command(cmd, binary_payload=binary_payload) except Exception as inner_exc: # noqa: BLE001 - returned to frontend + _logger.exception("Trigger command failed command=%s: %s", cmd.command, inner_exc) response_payload = {"status": "error", "error": str(inner_exc)} binary_response = response_payload.pop("_binary", None) if binary_response is not None: @@ -108,10 +116,14 @@ async def websocket_trigger(websocket: WebSocket) -> None: if binary_response is not None: await send_stream_bytes(websocket, stream, binary_response) except (AuthenticationError, HTTPException) as exc: + _logger.warning("Trigger websocket authentication/protocol failure: %s", exc) with suppress(RuntimeError): await websocket.close(code=4401, reason=str(exc)) except WebSocketDisconnect: - pass + _logger.debug("Trigger websocket disconnected") except Exception as exc: # noqa: BLE001 - surfaced to caller + _logger.exception("Trigger websocket failed: %s", exc) with suppress(RuntimeError): await websocket.close(code=1011, reason=str(exc)) + finally: + _logger.debug("Trigger websocket closed") diff --git a/service/app.py b/service/app.py index 14c9760f3..2278e58a1 100644 --- a/service/app.py +++ b/service/app.py @@ -1,9 +1,11 @@ from __future__ import annotations import contextlib +import logging import os +import time -from fastapi import FastAPI +from fastapi import FastAPI, Request from starlette.middleware.cors import CORSMiddleware from .api.http import router as http_router @@ -24,6 +26,34 @@ async def lifespan(app: FastAPI): app = FastAPI(title="BAAS Service Mode", lifespan=lifespan) + +@app.middleware("http") +async def log_http_request(request: Request, call_next): + logger = logging.getLogger("baas.http") + started = time.perf_counter() + client = request.client.host if request.client else "unknown" + logger.debug("HTTP request started method=%s path=%s client=%s", request.method, request.url.path, client) + try: + response = await call_next(request) + except Exception: + logger.exception( + "HTTP request failed method=%s path=%s client=%s duration_ms=%.2f", + request.method, + request.url.path, + client, + (time.perf_counter() - started) * 1000, + ) + raise + logger.debug( + "HTTP request completed method=%s path=%s status=%s client=%s duration_ms=%.2f", + request.method, + request.url.path, + response.status_code, + client, + (time.perf_counter() - started) * 1000, + ) + return response + app.add_middleware( CORSMiddleware, # type: ignore allow_origin_regex=os.getenv( diff --git a/service/conf/manager.py b/service/conf/manager.py index a83fa5569..5c4243907 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -503,9 +503,13 @@ async def _handle_watch_batch(self, changes: Iterable[tuple[Change, str]]) -> No resource_changes: set[ResourceKey] = set() rescan_configs = False + runtime_log_root = self._config_root / "logs" for change, raw_path in changes: path = Path(raw_path) + if path == runtime_log_root or runtime_log_root in path.parents: + continue + in_watch_dir = any(path == d or d in path.parents for d in watch_dirs) in_watch_file = any(path == f for f in watch_files) diff --git a/service/context.py b/service/context.py index b38d07ac0..e1ca45fb1 100644 --- a/service/context.py +++ b/service/context.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import logging import os import threading try: @@ -15,6 +16,7 @@ from .conf.manager import ConfigManager from .utils.logging import LogManager from .runtime import ServiceRuntime +from .system_logging import install_asyncio_exception_handler OCR_UPDATE_CHECK_ENV = "BAAS_SERVICE_OCR_UPDATE_CHECK" @@ -61,6 +63,13 @@ def __init__(self, project_root: Path) -> None: async def startup(self) -> None: loop = asyncio.get_running_loop() + install_asyncio_exception_handler(loop) + logging.getLogger(__name__).info( + "Service context startup project_root=%s no_update=%s ocr_update_check=%s", + self.project_root, + self.no_update, + self.need_ocr_update_check, + ) self._loop = loop self.config_manager.set_loop(loop) self.runtime.set_loop(loop) @@ -86,6 +95,7 @@ async def startup(self) -> None: async def shutdown(self) -> None: + logging.getLogger(__name__).info("Service context shutdown started") if self._fs_task: self._fs_task.cancel() with suppress(asyncio.CancelledError): @@ -99,6 +109,7 @@ async def shutdown(self) -> None: with suppress(Exception): await self.runtime.stop_all_tasks() await self.log_manager.stop() + logging.getLogger(__name__).info("Service context shutdown completed") def ensure_runtime_logger_attached(self) -> None: for queue, scope in self.runtime.get_log_sources(): @@ -110,5 +121,5 @@ async def _periodic_update_check(self) -> None: try: await self.runtime.check_for_update() except Exception: - pass + logging.getLogger(__name__).exception("Periodic update check failed") await asyncio.sleep(interval) diff --git a/service/remote/scrcpy.py b/service/remote/scrcpy.py index 2509b8991..6ba9875a9 100644 --- a/service/remote/scrcpy.py +++ b/service/remote/scrcpy.py @@ -4,23 +4,26 @@ """ import asyncio import inspect +import logging import shlex import socket +import subprocess import threading from pathlib import Path -from time import sleep +from time import monotonic, sleep from typing import Any, Callable, Optional import websockets from websockets import ClientConnection +from websockets.exceptions import WebSocketException try: - from adbutils import AdbDevice, AdbError, AdbTimeout, ForwardItem + from adbutils import AdbDevice, AdbError, ForwardItem, adb_path except ModuleNotFoundError: # pragma: no cover - remote control dependency is optional at import time AdbDevice = Any # type: ignore AdbError = RuntimeError # type: ignore - AdbTimeout = TimeoutError # type: ignore ForwardItem = Any # type: ignore + adb_path = None # type: ignore # --------------------------------------------------------------------------- @@ -42,6 +45,10 @@ SCRCPY_SERVER_JAR_NAME = "scrcpy-server.jar" SCRCPY_REMOTE_JAR = f"{SCRCPY_TEMP_PATH}/{SCRCPY_SERVER_JAR_NAME}" SCRCPY_PID_FILE = f"{SCRCPY_TEMP_PATH}/ws_scrcpy.pid" +SCRCPY_LOG_FILE = f"{SCRCPY_TEMP_PATH}/ws_scrcpy.log" +SCRCPY_STARTUP_TIMEOUT_MS = 10000 + +_logger = logging.getLogger("baas.service.remote") class ScrcpyClient: @@ -100,6 +107,7 @@ def __init__( assert codec_name in [None, "h264", "h265", "av1"] self.device = device + _logger.info("scrcpy client created serial=%s", getattr(device, "serial", "unknown")) # Kept for API compatibility. In web mode these are not used by this # Python proxy directly; the Android server and frontend protocol handle @@ -122,6 +130,7 @@ def __init__( self.alive = False self.__server_pid: Optional[int] = None + self.__server_process: Optional[subprocess.Popen] = None # adbutils create_connection(Network.TCP, port) returns socket.socket. self.__remote_socket: Optional[ClientConnection] = None @@ -169,11 +178,13 @@ def __build_server_command() -> str: f"{SCRCPY_SERVER_TYPE} " f"{SCRCPY_LOG_LEVEL} " f"{SCRCPY_SERVER_PORT} " - f"{SCRCPY_LISTENS_ON_ALL_INTERFACES} " - "2>&1 > /dev/null" + f"{SCRCPY_LISTENS_ON_ALL_INTERFACES}" ) - return f"CLASSPATH={SCRCPY_REMOTE_JAR} nohup app_process {args_string}" + return ( + f"CLASSPATH={SCRCPY_REMOTE_JAR} app_process {args_string} " + f"> {SCRCPY_LOG_FILE} 2>&1" + ) @staticmethod def get_free_tcp_port(): @@ -244,55 +255,45 @@ def __read_valid_server_pid_file(self) -> Optional[int]: return None def __find_expected_server_pids(self) -> list[int]: - script = r""" - for p in /proc/[0-9]*; do - pid="${p##*/}" - first="$(tr '\0' '\n' < "$p/cmdline" 2>/dev/null | head -n 1)" - base="${first##*/}" - - if [ "$base" = "app_process" ] || [ "$base" = "app_process64" ] || [ "$base" = "app_process32" ]; then - echo "$pid" - fi - done - """.strip() - try: - output = self.__shell(script, timeout=3) + output = self.__shell("ps -A -o PID,ARGS", timeout=3) except Exception: return [] + expected = ( + f"{SCRCPY_SERVER_PACKAGE} {SCRCPY_SERVER_VERSION} " + f"{SCRCPY_SERVER_TYPE} {SCRCPY_LOG_LEVEL} " + f"{SCRCPY_SERVER_PORT} {SCRCPY_LISTENS_ON_ALL_INTERFACES}" + ) pids: list[int] = [] - for line in output.splitlines(): - line = line.strip() - if not line.isdigit(): + parts = line.strip().split(maxsplit=1) + if len(parts) != 2 or not parts[0].isdigit() or expected not in parts[1]: continue + pids.append(int(parts[0])) - pid = int(line) - if self.__is_expected_server_pid(pid): - pids.append(pid) - + _logger.info( + "scrcpy process scan serial=%s pids=%s", + getattr(self.device, "serial", "unknown"), + pids, + ) return pids def __wait_server_ready(self) -> int: - attempts = max(1, self.connection_timeout // 100) + startup_timeout = max(self.connection_timeout, SCRCPY_STARTUP_TIMEOUT_MS) + deadline = monotonic() + startup_timeout / 1000 - for _ in range(attempts): + while monotonic() < deadline: pid = self.__read_valid_server_pid_file() if pid is not None: self.__server_pid = pid return pid - pids = self.__find_expected_server_pids() - if pids: - self.__server_pid = pids[0] - return pids[0] - sleep(0.1) raise ConnectionError( - f"scrcpy-server did not become ready within {self.connection_timeout} ms" + f"scrcpy-server did not become ready within {startup_timeout} ms" ) async def __deploy_server(self) -> None: @@ -312,36 +313,29 @@ async def __deploy_server(self) -> None: self.__shell(f"rm -f {shlex.quote(SCRCPY_PID_FILE)}", timeout=1) background_command = self.__build_server_command() - - async def start_server() -> str: - try: - return await asyncio.to_thread( - self.__shell, - background_command, - timeout=20.0, - ) - except AdbTimeout: - return "pending" - - async def wait_server_ready() -> int: - return await asyncio.to_thread(self.__wait_server_ready) - - start_task = asyncio.create_task(start_server()) - ready_task = asyncio.create_task(wait_server_ready()) - - done, pending = await asyncio.wait( - [start_task, ready_task], - return_when=asyncio.FIRST_COMPLETED, + _logger.info( + "starting scrcpy server serial=%s command=%s", + getattr(self.device, "serial", "unknown"), + background_command, ) - - for task in pending: - task.cancel() - - for task in pending: - try: - await task - except asyncio.CancelledError: - pass + if adb_path is None: + raise RuntimeError("adb executable is unavailable") + + serial = getattr(self.device, "serial", None) + if not serial: + raise RuntimeError("ADB device serial is unavailable") + + self.__server_process = subprocess.Popen( + [adb_path(), "-s", serial, "shell", background_command], + stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + creationflags=getattr(subprocess, "CREATE_NO_WINDOW", 0), + ) + await asyncio.to_thread(self.__wait_server_ready) + # ws-scrcpy writes its PID before the WebSocket room is ready. An + # Upgrade sent in that gap leaves this old server rejecting clients. + await asyncio.sleep(1) # ----------------------------------------------------------------------- # ADB TCP connection @@ -349,16 +343,18 @@ async def wait_server_ready() -> int: async def __init_server_connection(self) -> None: last_error: Optional[Exception] = None - attempts = max(1, self.connection_timeout // 100) + startup_timeout = max(self.connection_timeout, SCRCPY_STARTUP_TIMEOUT_MS) + deadline = monotonic() + startup_timeout / 1000 - for _ in range(attempts): + while monotonic() < deadline: try: items_forward = self.device.forward_list() remote = f"tcp:{SCRCPY_SERVER_PORT}" def _filter_func(x: ForwardItem): return ( - x.remote == remote + x.serial == getattr(self.device, "serial", None) + and x.remote == remote and x.local.startswith("tcp:") ) @@ -377,18 +373,20 @@ def _filter_func(x: ForwardItem): max_size=None, ping_interval=None, ping_timeout=None, + open_timeout=max(1, self.connection_timeout / 1000), + close_timeout=1, ) self.control_socket = self.__remote_socket return - except AdbError as exc: + except (AdbError, OSError, WebSocketException) as exc: last_error = exc - sleep(0.1) + await asyncio.sleep(0.1) raise ConnectionError( f"Failed to connect ws-scrcpy server at tcp:{SCRCPY_SERVER_PORT} " - f"within {self.connection_timeout} ms. Last error: {last_error}" + f"within {startup_timeout} ms. Last error: {last_error}" ) # ----------------------------------------------------------------------- @@ -399,16 +397,19 @@ async def init(self): if self.alive: return self - try: - await self.__deploy_server() - await self.__init_server_connection() - self.alive = True - await self.__send_to_listeners(EVENT_INIT) - return self - - except Exception: - await self.stop(kill_server=False) - raise + for attempt in range(2): + try: + await self.__deploy_server() + await self.__init_server_connection() + self.alive = True + await self.__send_to_listeners(EVENT_INIT) + return self + except Exception: + # A ws-scrcpy process may keep its PID after its WebSocket + # listener becomes unusable. Restart it once before failing. + await self.stop(kill_server=True) + if attempt == 1: + raise async def start(self, daemon_threaded: bool = False) -> None: raise RuntimeError( @@ -430,14 +431,29 @@ async def stop(self, kill_server: bool = True) -> None: if kill_server: try: + pids = set(self.__find_expected_server_pids()) pid = self.__read_valid_server_pid_file() if pid is not None: + pids.add(pid) + for pid in pids: self.__shell(f"kill {pid} >/dev/null 2>&1 || true", timeout=1) self.__shell(f"rm -f {shlex.quote(SCRCPY_PID_FILE)}", timeout=1) except Exception: pass + if self.__server_process is not None: + try: + if self.__server_process.poll() is None: + self.__server_process.terminate() + self.__server_process.wait(timeout=1) + except Exception: + try: + self.__server_process.kill() + except Exception: + pass + self.__server_process = None + self.__server_pid = None # ----------------------------------------------------------------------- diff --git a/service/runtime.py b/service/runtime.py index ce050009a..befda248b 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -172,6 +172,7 @@ def _default_status(config_id: str) -> Dict[str, Any]: "current_task" : None, "waiting_tasks": [], "exit_code" : None, + "run_mode" : None, "timestamp" : unix_timestamp_ms(), } @@ -402,9 +403,16 @@ def runner() -> None: daemon=True, ) session.thread = thread + self._update_status( + config_id, + running=True, + is_flag_run=True, + exit_code=None, + current_task=None, + waiting_tasks=[], + run_mode="scheduler", + ) thread.start() - self._update_status(config_id, running=True, is_flag_run=True, exit_code=None, current_task=None, - waiting_tasks=[]) return {"status": "started", "config_id": config_id} async def stop_scheduler(self, config_id: str) -> Dict[str, Any]: @@ -498,7 +506,8 @@ def _call() -> None: is_flag_run=True, exit_code=None, current_task=_original_task_name, - waiting_tasks=[] + waiting_tasks=[], + run_mode="single", ) baas.flag_run = True baas.send("solve", task_name) diff --git a/service/system_logging.py b/service/system_logging.py new file mode 100644 index 000000000..d09de0763 --- /dev/null +++ b/service/system_logging.py @@ -0,0 +1,227 @@ +from __future__ import annotations + +import asyncio +import json +import logging +import logging.handlers +import os +import sys +import threading +from collections import deque +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Dict, List, Optional + +SYSTEM_LOG_DIR = Path("config") / "logs" +SYSTEM_LOG_FILE = "baas-service.jsonl" +SYSTEM_LOG_MAX_BYTES = 10 * 1024 * 1024 +SYSTEM_LOG_BACKUP_COUNT = 5 +SYSTEM_LOG_HANDLER_MARKER = "_baas_system_log_handler" +_exception_hooks_installed = False + + +class JsonLineFormatter(logging.Formatter): + """Formats one complete, machine-readable log record per line.""" + + def format(self, record: logging.LogRecord) -> str: + payload: Dict[str, Any] = { + "source": "python", + "timestamp": datetime.fromtimestamp(record.created, timezone.utc).isoformat(), + "level": record.levelname, + "logger": record.name, + "message": record.getMessage(), + "module": record.module, + "line": record.lineno, + "process": record.process, + "thread": record.threadName, + } + if record.exc_info: + payload["exception"] = self.formatException(record.exc_info) + if record.stack_info: + payload["stack"] = self.formatStack(record.stack_info) + return json.dumps(payload, ensure_ascii=False, separators=(",", ":")) + + +def system_log_path(project_root: Path) -> Path: + return project_root / SYSTEM_LOG_DIR / SYSTEM_LOG_FILE + + +def configure_system_logging(project_root: Path) -> Path: + """Attach the persistent DEBUG handler and global exception hooks.""" + path = system_log_path(project_root) + path.parent.mkdir(parents=True, exist_ok=True) + + root = logging.getLogger() + root.setLevel(logging.DEBUG) + for handler in root.handlers: + if getattr(handler, SYSTEM_LOG_HANDLER_MARKER, False): + return path + + file_handler = logging.handlers.RotatingFileHandler( + path, + maxBytes=SYSTEM_LOG_MAX_BYTES, + backupCount=SYSTEM_LOG_BACKUP_COUNT, + encoding="utf-8", + delay=True, + ) + setattr(file_handler, SYSTEM_LOG_HANDLER_MARKER, True) + file_handler.setLevel(logging.DEBUG) + file_handler.setFormatter(JsonLineFormatter()) + root.addHandler(file_handler) + + logging.captureWarnings(True) + _install_exception_hooks() + logging.getLogger(__name__).info( + "Python system logging initialized path=%s pid=%s cwd=%s", + path, + os.getpid(), + Path.cwd(), + ) + return path + + +def install_asyncio_exception_handler(loop: asyncio.AbstractEventLoop) -> None: + previous = loop.get_exception_handler() + + def handle_exception(event_loop: asyncio.AbstractEventLoop, context: Dict[str, Any]) -> None: + exception = context.get("exception") + message = str(context.get("message") or "Unhandled asyncio exception") + logging.getLogger("baas.asyncio").error( + "%s context=%s", + message, + {key: repr(value) for key, value in context.items() if key != "exception"}, + exc_info=(type(exception), exception, exception.__traceback__) if exception else None, + ) + if previous is not None: + previous(event_loop, context) + + loop.set_exception_handler(handle_exception) + + +def read_system_logs( + project_root: Path, + limit: int = 2000, + level: Optional[str] = None, + query: Optional[str] = None, +) -> List[Dict[str, Any]]: + limit = max(1, min(int(limit), 10000)) + selected_level = level.strip().upper() if level else "" + selected_query = query.strip().lower() if query else "" + records: deque[Dict[str, Any]] = deque(maxlen=limit) + + path = system_log_path(project_root) + paths = [Path(f"{path}.{index}") for index in range(SYSTEM_LOG_BACKUP_COUNT, 0, -1)] + paths.append(path) + for candidate in paths: + if not candidate.exists(): + continue + try: + with candidate.open("r", encoding="utf-8", errors="replace") as stream: + for raw_line in stream: + entry = _parse_log_line(raw_line) + if selected_level and entry.get("level", "").upper() != selected_level: + continue + if selected_query and selected_query not in json.dumps(entry, ensure_ascii=False).lower(): + continue + records.append(entry) + except OSError as exc: + logging.getLogger(__name__).warning("Failed to read system log %s: %s", candidate, exc) + return list(records) + + +def clear_system_logs(project_root: Path) -> None: + path = system_log_path(project_root) + root = logging.getLogger() + truncated = False + for handler in root.handlers: + if not getattr(handler, SYSTEM_LOG_HANDLER_MARKER, False): + continue + handler.acquire() + try: + if handler.stream is not None: + handler.stream.seek(0) + handler.stream.truncate(0) + handler.flush() + truncated = True + finally: + handler.release() + + if not truncated: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("", encoding="utf-8") + + for index in range(1, SYSTEM_LOG_BACKUP_COUNT + 1): + rotated = Path(f"{path}.{index}") + try: + rotated.unlink(missing_ok=True) + except OSError: + logging.getLogger(__name__).exception("Failed to remove rotated system log %s", rotated) + + +def system_log_files(project_root: Path) -> List[Dict[str, Any]]: + path = system_log_path(project_root) + files = [path] + [Path(f"{path}.{index}") for index in range(1, SYSTEM_LOG_BACKUP_COUNT + 1)] + result: List[Dict[str, Any]] = [] + for candidate in files: + if not candidate.exists(): + continue + try: + stat = candidate.stat() + except OSError: + continue + result.append( + { + "path": str(candidate), + "size": stat.st_size, + "modified": datetime.fromtimestamp(stat.st_mtime, timezone.utc).isoformat(), + } + ) + return result + + +def _parse_log_line(raw_line: str) -> Dict[str, Any]: + line = raw_line.rstrip("\r\n") + try: + value = json.loads(line) + if isinstance(value, dict): + value.setdefault("source", "python") + return value + except json.JSONDecodeError: + pass + return { + "source": "python", + "timestamp": "", + "level": "INFO", + "logger": "legacy", + "message": line, + } + + +def _install_exception_hooks() -> None: + global _exception_hooks_installed + if _exception_hooks_installed: + return + _exception_hooks_installed = True + previous_sys_hook = sys.excepthook + + def sys_hook(exc_type, exc_value, traceback) -> None: + logging.getLogger("baas.unhandled").critical( + "Unhandled process exception", + exc_info=(exc_type, exc_value, traceback), + ) + previous_sys_hook(exc_type, exc_value, traceback) + + sys.excepthook = sys_hook + + if hasattr(threading, "excepthook"): + previous_thread_hook = threading.excepthook + + def thread_hook(args) -> None: + logging.getLogger("baas.unhandled.thread").critical( + "Unhandled thread exception thread=%s", + getattr(args.thread, "name", "unknown"), + exc_info=(args.exc_type, args.exc_value, args.exc_traceback), + ) + previous_thread_hook(args) + + threading.excepthook = thread_hook diff --git a/tests/service/test_config_runtime_update.py b/tests/service/test_config_runtime_update.py index 3d93bc072..fbf52c3e1 100644 --- a/tests/service/test_config_runtime_update.py +++ b/tests/service/test_config_runtime_update.py @@ -80,6 +80,17 @@ def test_runtime_status_snapshot_is_deep_copy(): assert runtime.current_status()["default_config"]["nested"]["running"] is False +def test_runtime_status_preserves_scheduler_run_mode_across_task_updates(): + runtime = ServiceRuntime(Path("project")) + + runtime._update_status("default_config", running=True, run_mode="scheduler") + runtime._update_status("default_config", current_task="arena", waiting_tasks=["lesson"]) + + status = runtime.current_status()["default_config"] + assert status["run_mode"] == "scheduler" + assert status["current_task"] == "arena" + + def test_android_toggle_passes_logger_hook_to_scheduler(monkeypatch): runtime = ServiceRuntime(Path("project")) calls = [] diff --git a/tests/service/test_scrcpy_client.py b/tests/service/test_scrcpy_client.py new file mode 100644 index 000000000..3ed8d15c7 --- /dev/null +++ b/tests/service/test_scrcpy_client.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +import asyncio +from types import SimpleNamespace + +from service.remote import scrcpy + + +class _Device: + serial = "127.0.0.1:5557" + + def forward_list(self): + return iter( + [ + SimpleNamespace( + serial="emulator-5554", + local="tcp:10461", + remote="tcp:8886", + ), + SimpleNamespace( + serial=self.serial, + local="tcp:6154", + remote="tcp:8886", + ), + ] + ) + + +def test_server_connection_uses_forward_for_selected_device(monkeypatch): + connected_urls = [] + remote_socket = object() + + async def fake_connect(url, **kwargs): + connected_urls.append(url) + return remote_socket + + monkeypatch.setattr(scrcpy.websockets, "connect", fake_connect) + client = scrcpy.ScrcpyClient(_Device()) + + asyncio.run(client._ScrcpyClient__init_server_connection()) + + assert connected_urls == ["ws://127.0.0.1:6154"] + assert client.control_socket is remote_socket diff --git a/tests/service/test_service_logic.py b/tests/service/test_service_logic.py index 8fe69b7b0..58a6f8e73 100644 --- a/tests/service/test_service_logic.py +++ b/tests/service/test_service_logic.py @@ -57,6 +57,19 @@ def test_config_manager_classifies_config_files(): assert manager._classify_config_change(Change.added, root / "config" / "new_config") == (True, None) +def test_config_manager_ignores_runtime_log_directory(caplog, tmp_path): + async def scenario(): + manager = ConfigManager(tmp_path) + manager.set_loop(asyncio.get_running_loop()) + log_path = tmp_path / "config" / "logs" / "baas-service.jsonl" + await manager._handle_watch_batch([(Change.modified, str(log_path))]) + + caplog.set_level("INFO") + asyncio.run(scenario()) + + assert not any("baas-service.jsonl" in record.message for record in caplog.records) + + def _write_config_pair(root: Path, config_id: str, name: str) -> Path: config_dir = root / "config" / config_id config_dir.mkdir(parents=True) diff --git a/tests/service/test_system_logging.py b/tests/service/test_system_logging.py new file mode 100644 index 000000000..36c824dbc --- /dev/null +++ b/tests/service/test_system_logging.py @@ -0,0 +1,115 @@ +from __future__ import annotations + +import json +import logging +import logging.handlers +from pathlib import Path +from types import SimpleNamespace + +from fastapi import FastAPI +from fastapi.testclient import TestClient + +from service.api import http +from service.system_logging import ( + JsonLineFormatter, + clear_system_logs, + read_system_logs, + system_log_path, +) + + +def _write_entry(path: Path, **overrides) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + payload = { + "source": "python", + "timestamp": "2026-07-12T12:00:00+00:00", + "level": "INFO", + "logger": "test", + "message": "service ready", + **overrides, + } + with path.open("a", encoding="utf-8") as stream: + stream.write(json.dumps(payload) + "\n") + + +def test_json_formatter_keeps_diagnostic_context(): + formatter = JsonLineFormatter() + record = logging.LogRecord( + name="baas.test", + level=logging.ERROR, + pathname=__file__, + lineno=42, + msg="failure %s", + args=("detail",), + exc_info=None, + ) + + payload = json.loads(formatter.format(record)) + + assert payload["source"] == "python" + assert payload["level"] == "ERROR" + assert payload["logger"] == "baas.test" + assert payload["message"] == "failure detail" + assert payload["line"] == 42 + assert payload["process"] > 0 + + +def test_read_system_logs_merges_rotations_and_filters(tmp_path): + current = system_log_path(tmp_path) + rotated = Path(f"{current}.1") + _write_entry(rotated, level="DEBUG", message="old handshake") + _write_entry(current, level="ERROR", message="backend failed") + _write_entry(current, level="INFO", message="service ready") + + all_entries = read_system_logs(tmp_path, limit=10) + error_entries = read_system_logs(tmp_path, limit=10, level="error") + queried_entries = read_system_logs(tmp_path, limit=10, query="handshake") + + assert [entry["message"] for entry in all_entries] == [ + "old handshake", + "backend failed", + "service ready", + ] + assert [entry["message"] for entry in error_entries] == ["backend failed"] + assert [entry["message"] for entry in queried_entries] == ["old handshake"] + + +def test_clear_system_logs_truncates_active_handler_and_backups(tmp_path): + path = system_log_path(tmp_path) + path.parent.mkdir(parents=True) + handler = logging.handlers.RotatingFileHandler(path, encoding="utf-8") + setattr(handler, "_baas_system_log_handler", True) + handler.setFormatter(JsonLineFormatter()) + root = logging.getLogger() + root.addHandler(handler) + try: + logging.getLogger("baas.test.clear").warning("before clear") + handler.flush() + _write_entry(Path(f"{path}.1"), message="rotated") + + clear_system_logs(tmp_path) + + assert path.read_text(encoding="utf-8") == "" + assert not Path(f"{path}.1").exists() + finally: + root.removeHandler(handler) + handler.close() + + +def test_system_log_http_contract(monkeypatch, tmp_path): + _write_entry(system_log_path(tmp_path), level="WARNING", message="test warning") + monkeypatch.setattr(http, "context", SimpleNamespace(project_root=tmp_path)) + monkeypatch.setattr(http, "_require_loopback", lambda request: None) + app = FastAPI() + app.include_router(http.router) + client = TestClient(app) + + response = client.get("/system/logs?limit=50") + + assert response.status_code == 200 + assert response.json()["entries"][0]["message"] == "test warning" + assert response.json()["files"][0]["path"].endswith("baas-service.jsonl") + + clear_response = client.post("/system/logs/clear") + assert clear_response.status_code == 200 + assert clear_response.json() == {"ok": True} diff --git a/tests/service/test_ws_sync_conflict.py b/tests/service/test_ws_sync_conflict.py new file mode 100644 index 000000000..f0550e9a7 --- /dev/null +++ b/tests/service/test_ws_sync_conflict.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +import asyncio +from types import SimpleNamespace + +from service.api import ws_sync +from service.types import SyncPatchMessage +from service.utils.diff import PatchConflictError + + +class _ConfigManager: + def __init__(self) -> None: + self.conflict = True + self.applied_timestamps: list[float] = [] + + async def apply_patch(self, resource, resource_id, ops, timestamp, origin): + self.applied_timestamps.append(timestamp) + if self.conflict: + raise PatchConflictError("Incoming patch is older than current snapshot") + + async def get_snapshot(self, resource, resource_id): + return SimpleNamespace(timestamp=200.0, data={"channel": "stable"}) + + +def test_stale_sync_patch_returns_snapshot_and_can_retry(monkeypatch): + manager = _ConfigManager() + monkeypatch.setattr(ws_sync, "context", SimpleNamespace(config_manager=manager)) + patch = SyncPatchMessage( + type="patch", + resource="setup_toml", + resource_id="global", + timestamp=100.0, + ops=[{"op": "replace", "path": "/channel", "value": "dev"}], + ) + + conflict = asyncio.run(ws_sync.apply_sync_patch(patch)) + + assert conflict == { + "type": "patch_conflict", + "resource": "setup_toml", + "resource_id": "global", + "request_timestamp": 100.0, + "timestamp": 200.0, + "data": {"channel": "stable"}, + "error": "Incoming patch is older than current snapshot", + } + + manager.conflict = False + retry = SyncPatchMessage( + type="patch", + resource=patch.resource, + resource_id=patch.resource_id, + timestamp=conflict["timestamp"], + ops=patch.ops, + ) + acknowledged = asyncio.run(ws_sync.apply_sync_patch(retry)) + + assert acknowledged["type"] == "patch_ack" + assert acknowledged["timestamp"] == 200.0 + assert manager.applied_timestamps == [100.0, 200.0] From 5b2d069dae2979844ff78a0140362d1f473766a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 13 Jul 2026 12:53:05 +0800 Subject: [PATCH 91/98] Fix: Report abnormal task exits --- core/Baas_thread.py | 7 +- service/runtime.py | 27 +++++-- tests/service/test_runtime_exit_status.py | 95 +++++++++++++++++++++++ 3 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 tests/service/test_runtime_exit_status.py diff --git a/core/Baas_thread.py b/core/Baas_thread.py index de15fee5e..5b22d1a55 100644 --- a/core/Baas_thread.py +++ b/core/Baas_thread.py @@ -433,7 +433,7 @@ def send(self, msg, task=None): if msg == "start": if self.button_signal is not None: self.button_signal.emit("停止") - self.thread_starter() + return self.thread_starter() elif msg == "stop": if self.button_signal is not None: self.button_signal.emit("启动") @@ -479,7 +479,7 @@ def thread_starter(self): if not self.solve(task): self.signal_stop() notify(title='', body='任务已停止') - return + return False if flg: currentTaskNextTime = self.next_time @@ -502,7 +502,8 @@ def thread_starter(self): self.handle_then() except Exception as e: self.logger.error(traceback.format_exc()) - return + return False + return True def genScheduleLog(self, task): self.logger.info("Scheduler : {") diff --git a/service/runtime.py b/service/runtime.py index f77fd816a..530b1e8cc 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -288,12 +288,23 @@ async def start_scheduler(self, config_id: str, set_log=None) -> Dict[str, Any]: raise RuntimeError("Baas_thread initialization failed") def runner() -> None: + failed = False try: - session.baas.send("start") + failed = session.baas.send("start") is False + except BaseException: + failed = True + raise finally: session.thread = None - self._update_status(config_id, running=False, is_flag_run=session.baas.flag_run, current_task=None, - waiting_tasks=[]) + changes = {"exit_code": 1} if failed else {} + self._update_status( + config_id, + running=False, + is_flag_run=session.baas.flag_run, + current_task=None, + waiting_tasks=[], + **changes, + ) thread = threading.Thread( target=runner, @@ -359,6 +370,7 @@ async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict await run_blocking(baas.init_all_data) def _call() -> None: + failed = False try: self._update_status( config_id, @@ -369,16 +381,21 @@ def _call() -> None: waiting_tasks=[] ) baas.flag_run = True - baas.send("solve", task_name) + failed = baas.send("solve", task_name) is False + except BaseException: + failed = True + raise finally: session.thread = None assert session is not None + changes = {"exit_code": 1} if failed else {} self._update_status( config_id, running=False, is_flag_run=session.baas.flag_run, current_task=None, - waiting_tasks=[] + waiting_tasks=[], + **changes, ) thread = threading.Thread( diff --git a/tests/service/test_runtime_exit_status.py b/tests/service/test_runtime_exit_status.py new file mode 100644 index 000000000..8fdfb828d --- /dev/null +++ b/tests/service/test_runtime_exit_status.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import asyncio +import threading +from pathlib import Path +from types import SimpleNamespace + +from service.runtime import ServiceRuntime + + +def test_scheduler_failure_publishes_nonzero_exit_code(): + release = threading.Event() + + class FakeBaas: + flag_run = True + + @staticmethod + def init_all_data(): + return True + + @staticmethod + def send(message): + assert message == "start" + release.wait(timeout=2) + return False + + runtime = ServiceRuntime(Path("project")) + session = SimpleNamespace(baas=FakeBaas(), thread=None) + runtime._get_or_create_session = lambda _config_id: session + + asyncio.run(runtime.start_scheduler("default_config")) + thread = session.thread + release.set() + thread.join(timeout=2) + + status = runtime.current_status()["default_config"] + assert status["running"] is False + assert status["exit_code"] == 1 + + +def test_scheduler_normal_stop_does_not_publish_failure_exit_code(): + release = threading.Event() + + class FakeBaas: + flag_run = False + + @staticmethod + def init_all_data(): + return True + + @staticmethod + def send(message): + assert message == "start" + release.wait(timeout=2) + return True + + runtime = ServiceRuntime(Path("project")) + session = SimpleNamespace(baas=FakeBaas(), thread=None) + runtime._get_or_create_session = lambda _config_id: session + + asyncio.run(runtime.start_scheduler("default_config")) + thread = session.thread + release.set() + thread.join(timeout=2) + + status = runtime.current_status()["default_config"] + assert status["running"] is False + assert status["exit_code"] is None + + +def test_single_task_failure_publishes_nonzero_exit_code(): + release = threading.Event() + + class FakeBaas: + flag_run = True + scheduler = object() + + @staticmethod + def send(message, task): + assert (message, task) == ("solve", "explore_normal_task") + release.wait(timeout=2) + return False + + runtime = ServiceRuntime(Path("project")) + session = SimpleNamespace(baas=FakeBaas(), thread=None) + runtime._get_or_create_session = lambda _config_id: session + + asyncio.run(runtime.solve_task("default_config", "start_normal_task")) + thread = session.thread + release.set() + thread.join(timeout=2) + + status = runtime.current_status()["default_config"] + assert status["running"] is False + assert status["exit_code"] == 1 From d183511a79d68036ba67cafb9f16a245171f1842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 13 Jul 2026 12:54:50 +0800 Subject: [PATCH 92/98] Refactor: Decouple service channel handlers --- service/api/security.py | 6 ++ service/api/ws_control.py | 2 + service/api/ws_provider.py | 79 ++++------------- service/api/ws_remote.py | 33 ++++--- service/api/ws_sync.py | 113 ++++++++---------------- service/api/ws_trigger.py | 83 ++++------------- service/channels/__init__.py | 11 +++ service/channels/provider.py | 72 +++++++++++++++ service/channels/remote.py | 24 +++++ service/channels/sync.py | 92 +++++++++++++++++++ service/channels/trigger.py | 76 ++++++++++++++++ service/remote/scrcpy_proxy.py | 15 ++++ service/transport/base.py | 21 +++++ service/transport/websocket_endpoint.py | 49 ++++++++++ tests/service/test_ws_behaviors.py | 41 +++++---- 15 files changed, 482 insertions(+), 235 deletions(-) create mode 100644 service/channels/__init__.py create mode 100644 service/channels/provider.py create mode 100644 service/channels/remote.py create mode 100644 service/channels/sync.py create mode 100644 service/channels/trigger.py create mode 100644 service/transport/base.py create mode 100644 service/transport/websocket_endpoint.py diff --git a/service/api/security.py b/service/api/security.py index 936976cbc..1720c2eee 100644 --- a/service/api/security.py +++ b/service/api/security.py @@ -2,6 +2,7 @@ import asyncio import json +import logging import os from typing import Optional from urllib.parse import urlparse @@ -22,6 +23,8 @@ from .state import REMEMBER_COOKIE_NAME, context +_logger = logging.getLogger(__name__) + def json_bytes(payload: dict) -> bytes: return json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") @@ -122,6 +125,7 @@ async def finalize_control_auth( include_session_secrets = False if request.get("type") == "resume_control": token = websocket.cookies.get(REMEMBER_COOKIE_NAME, "") + _logger.debug("Control resume requested cookie_present=%s", bool(token)) if token: try: session, control_channel = context.auth_manager.resume_control_session(handshake, token) @@ -137,7 +141,9 @@ async def finalize_control_auth( ) return session, control_channel await websocket.send_json(preauth_channel.encrypt({"type": "resume_unavailable"})) + _logger.debug("Control resume unavailable; waiting for password proof") request = preauth_channel.decrypt(await websocket.receive_json()) + _logger.debug("Control password request received type=%s", request.get("type")) if not context.auth_manager.password_state.initialized: if request.get("type") != "initialize": diff --git a/service/api/ws_control.py b/service/api/ws_control.py index 1d847071c..b21bd659e 100644 --- a/service/api/ws_control.py +++ b/service/api/ws_control.py @@ -27,7 +27,9 @@ async def websocket_control(websocket: WebSocket) -> None: session: Optional[ActiveSession] = None try: handshake, preauth_channel, _ = await begin_server_hello(websocket, kind="control", channel="control") + _logger.debug("Control websocket server hello completed") request = preauth_channel.decrypt(await websocket.receive_json()) + _logger.debug("Control websocket preauth request received type=%s", request.get("type")) session, control_channel = await finalize_control_auth( websocket, handshake=handshake, diff --git a/service/api/ws_provider.py b/service/api/ws_provider.py index 21695b44a..22ce1357b 100644 --- a/service/api/ws_provider.py +++ b/service/api/ws_provider.py @@ -1,18 +1,21 @@ from __future__ import annotations import asyncio +import logging from contextlib import suppress from typing import Optional -from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect +from fastapi import APIRouter, HTTPException, WebSocket from service.auth import AuthenticationError, SecretStreamBox -from service.types import ProviderRequest +from service.channels import ProviderChannelHandler +from service.transport import ChannelClosed, WebSocketChannelEndpoint -from .security import perform_business_resume, recv_stream_json, send_stream_json +from .security import perform_business_resume, send_stream_json from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) async def provider_sender( @@ -22,77 +25,33 @@ async def provider_sender( envelope_type: str, send_lock: Optional[asyncio.Lock] = None, ) -> None: - if send_lock is None: - send_lock = asyncio.Lock() + """Compatibility helper retained for focused WebSocket behavior tests.""" + send_lock = send_lock or asyncio.Lock() try: while True: payload = await queue.get() - if envelope_type == "status": - response = {"type": envelope_type, "status": payload} - else: - response = {"type": envelope_type, "entry": payload} + key = "status" if envelope_type == "status" else "entry" async with send_lock: - await send_stream_json(websocket, stream, response) + await send_stream_json(websocket, stream, {"type": envelope_type, key: payload}) except asyncio.CancelledError: - pass + return @router.websocket("/ws/provider") async def websocket_provider(websocket: WebSocket) -> None: - log_queue = status_queue = None - log_task = status_task = None try: + _logger.debug("Provider websocket connection started") _, stream = await perform_business_resume(websocket, channel="provider") - send_lock = asyncio.Lock() - history = context.log_manager.get_history() - scopes = context.log_manager.get_scopes() - async with send_lock: - await send_stream_json(websocket, stream, {"type": "logs_full", "scopes": scopes, "entries": history}) - async with send_lock: - await send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) - if context.runtime.is_all_data_initialized: - async with send_lock: - await send_stream_json(websocket, stream, {"type": "status", "status": {"is_all_data_initialized": True}}) - log_queue = await context.log_manager.subscribe() - status_queue = await context.runtime.subscribe_status() - log_task = asyncio.create_task(provider_sender(websocket, stream, log_queue, "log", send_lock)) - status_task = asyncio.create_task(provider_sender(websocket, stream, status_queue, "status", send_lock)) - while True: - message = await recv_stream_json(websocket, stream) - req_type = message.get("type") - if req_type == "static_request": - ProviderRequest(**message) - snapshot = await context.config_manager.get_static_snapshot() - async with send_lock: - await send_stream_json( - websocket, - stream, - { - "type": "static_snapshot", - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) - elif req_type == "status_request": - async with send_lock: - await send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) - else: - raise HTTPException(status_code=400, detail=f"Unsupported provider message: {req_type}") - except (AuthenticationError, HTTPException) as exc: + await ProviderChannelHandler(context).handle(WebSocketChannelEndpoint(websocket, stream)) + except (AuthenticationError, HTTPException, ValueError) as exc: + _logger.warning("Provider websocket authentication/protocol failure: %s", exc) with suppress(RuntimeError): await websocket.close(code=4401, reason=str(exc)) - except WebSocketDisconnect: - pass + except ChannelClosed: + _logger.debug("Provider websocket disconnected") except Exception as exc: # noqa: BLE001 - surfaced to caller + _logger.exception("Provider websocket failed: %s", exc) with suppress(RuntimeError): await websocket.close(code=1011, reason=str(exc)) finally: - for task in (log_task, status_task): - if task: - task.cancel() - with suppress(asyncio.CancelledError): - await task - if log_queue is not None: - context.log_manager.unsubscribe(log_queue) - if status_queue is not None: - context.runtime.unsubscribe_status(status_queue) + _logger.debug("Provider websocket closed") diff --git a/service/api/ws_remote.py b/service/api/ws_remote.py index bb5be285b..e9f8736a6 100644 --- a/service/api/ws_remote.py +++ b/service/api/ws_remote.py @@ -1,32 +1,31 @@ from __future__ import annotations +import logging +from contextlib import suppress + from fastapi import APIRouter, WebSocket -from service.remote import ScrcpyProxySession +from service.channels import RemoteChannelHandler +from service.transport import ChannelClosed, WebSocketChannelEndpoint -from .security import perform_business_resume, recv_stream_json +from .security import perform_business_resume from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) @router.websocket("/ws/remote") async def websocket_remote(websocket: WebSocket) -> None: - proxy = None - try: + _logger.info("Remote websocket accepted") _, stream = await perform_business_resume(websocket, channel="remote") - message = await recv_stream_json(websocket, stream) - config_id = message.get("config_id") - to_encrypt = message.get("decrypt", True) - - client = await context.runtime.require_remote_(config_id) - proxy = ScrcpyProxySession(client, stream, encrypt_adb_to_ws=to_encrypt) - await proxy.run(websocket) - except Exception: - import traceback - - traceback.print_exc() + await RemoteChannelHandler(context).handle(WebSocketChannelEndpoint(websocket, stream)) + except ChannelClosed: + _logger.info("Remote websocket disconnected") + except Exception as exc: # noqa: BLE001 - remote failures are scoped to this connection + _logger.exception("Remote websocket failed: %s", exc) + with suppress(Exception): + await websocket.close(code=1011, reason=f"remote: {type(exc).__name__}") finally: - if proxy is not None: - await proxy.close() + _logger.info("Remote websocket closed") diff --git a/service/api/ws_sync.py b/service/api/ws_sync.py index 3d6d65b99..ecd2f8ccf 100644 --- a/service/api/ws_sync.py +++ b/service/api/ws_sync.py @@ -1,104 +1,69 @@ from __future__ import annotations import asyncio +import logging from contextlib import suppress -from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect +from fastapi import APIRouter, HTTPException, WebSocket from service.auth import AuthenticationError, SecretStreamBox -from service.types import SyncPatchMessage, SyncPullMessage +from service.channels import SyncChannelHandler +from service.transport import ChannelClosed, WebSocketChannelEndpoint +from service.types import SyncPatchMessage -from .security import perform_business_resume, recv_stream_json, send_stream_json +from .security import perform_business_resume, send_stream_json from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) -async def sync_sender(websocket: WebSocket, stream: SecretStreamBox, queue: asyncio.Queue) -> None: +async def sync_sender( + websocket: WebSocket, + stream: SecretStreamBox, + queue: asyncio.Queue, + send_lock: asyncio.Lock | None = None, +) -> None: + """Compatibility helper retained for focused WebSocket behavior tests.""" + send_lock = send_lock or asyncio.Lock() try: while True: payload = dict(await queue.get()) payload.setdefault("direction", "push") - await send_stream_json(websocket, stream, payload) + async with send_lock: + await send_stream_json(websocket, stream, payload) except asyncio.CancelledError: - pass + return + + +async def apply_sync_patch(data: SyncPatchMessage) -> dict: + """Compatibility entry point backed by the transport-neutral handler.""" + return await SyncChannelHandler(context)._handle_message( + { + "type": "patch", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": data.timestamp, + "ops": data.ops, + } + ) @router.websocket("/ws/sync") async def websocket_sync(websocket: WebSocket) -> None: - queue = None - sender_task = None try: + _logger.debug("Sync websocket connection started") _, stream = await perform_business_resume(websocket, channel="sync") - queue = await context.config_manager.subscribe_updates() - sender_task = asyncio.create_task(sync_sender(websocket, stream, queue)) - while True: - message = await recv_stream_json(websocket, stream) - msg_type = message.get("type") - if msg_type == "pull": - data = SyncPullMessage(**message) - snapshot = await context.config_manager.get_snapshot(data.resource, data.resource_id) - await send_stream_json( - websocket, - stream, - { - "type": "snapshot", - "resource": data.resource, - "resource_id": data.resource_id, - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) - elif msg_type == "patch": - data = SyncPatchMessage(**message) - await context.config_manager.apply_patch( - data.resource, - data.resource_id, - data.ops, - data.timestamp, - origin="frontend", - ) - await send_stream_json( - websocket, - stream, - { - "type": "patch_ack", - "resource": data.resource, - "resource_id": data.resource_id, - "timestamp": data.timestamp, - }, - ) - elif msg_type == "list": - snapshot = await context.config_manager.get_config_list() - await send_stream_json( - websocket, - stream, - { - "type": "config_list", - "timestamp": snapshot.timestamp, - "data": snapshot.data, - }, - ) - else: - raise HTTPException(status_code=400, detail=f"Unsupported sync message: {msg_type}") - except (AuthenticationError, HTTPException) as exc: - import traceback - - traceback.print_exc() + await SyncChannelHandler(context).handle(WebSocketChannelEndpoint(websocket, stream)) + except (AuthenticationError, HTTPException, ValueError) as exc: + _logger.warning("Sync websocket authentication/protocol failure: %s", exc) with suppress(RuntimeError): await websocket.close(code=4401, reason=str(exc)) - except WebSocketDisconnect: - pass + except ChannelClosed: + _logger.debug("Sync websocket disconnected") except Exception as exc: # noqa: BLE001 - surfaced to caller - import traceback - - traceback.print_exc() + _logger.exception("Sync websocket failed: %s", exc) with suppress(RuntimeError): await websocket.close(code=1011, reason=str(exc)) finally: - if sender_task: - sender_task.cancel() - with suppress(asyncio.CancelledError): - await sender_task - if queue is not None: - context.config_manager.unsubscribe_updates(queue) + _logger.debug("Sync websocket closed") diff --git a/service/api/ws_trigger.py b/service/api/ws_trigger.py index 39c732834..5672d1dfd 100644 --- a/service/api/ws_trigger.py +++ b/service/api/ws_trigger.py @@ -1,89 +1,36 @@ from __future__ import annotations +import logging from contextlib import suppress -from typing import Any, Dict -from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect +from fastapi import APIRouter, HTTPException, WebSocket from service.auth import AuthenticationError -from service.types import CommandMessage +from service.channels import TriggerChannelHandler +from service.transport import ChannelClosed, WebSocketChannelEndpoint -from .commands import execute_command -from .security import perform_business_resume, recv_stream_bytes, recv_stream_json, send_stream_bytes, send_stream_json +from .security import perform_business_resume from .state import context router = APIRouter() +_logger = logging.getLogger(__name__) @router.websocket("/ws/trigger") async def websocket_trigger(websocket: WebSocket) -> None: try: + _logger.debug("Trigger websocket connection started") _, stream = await perform_business_resume(websocket, channel="trigger") - while True: - message = await recv_stream_json(websocket, stream) - cmd = CommandMessage(**message) - binary_payload = None - if cmd.command == "import_config" and cmd.payload.get("binary") is True: - binary_payload = await recv_stream_bytes(websocket, stream) - response_payload: Dict[str, Any] - if cmd.command == "test_all_sha_stream": - try: - async for result in context.runtime.test_all_sha_stream( - cmd.payload.get("channel"), - cmd.payload.get("timeout"), - ): - await send_stream_json( - websocket, - stream, - { - "type": "command_response", - "command": cmd.command, - "status": "ok", - "data": result, - "timestamp": cmd.timestamp, - }, - ) - response_payload = {"status": "ok", "data": {"done": True}} - except Exception as inner_exc: # noqa: BLE001 - returned to frontend - response_payload = {"status": "error", "error": str(inner_exc), "data": {"done": True}} - await send_stream_json( - websocket, - stream, - { - "type": "command_response", - "command": cmd.command, - **response_payload, - "timestamp": cmd.timestamp, - }, - ) - continue - try: - response_payload = await execute_command(cmd, binary_payload=binary_payload) - except Exception as inner_exc: # noqa: BLE001 - returned to frontend - response_payload = {"status": "error", "error": str(inner_exc)} - binary_response = response_payload.pop("_binary", None) - if binary_response is not None: - data = response_payload.setdefault("data", {}) - data["binary"] = { - "size": len(binary_response), - } - await send_stream_json( - websocket, - stream, - { - "type": "command_response", - "command": cmd.command, - **response_payload, - "timestamp": cmd.timestamp, - }, - ) - if binary_response is not None: - await send_stream_bytes(websocket, stream, binary_response) - except (AuthenticationError, HTTPException) as exc: + await TriggerChannelHandler(context).handle(WebSocketChannelEndpoint(websocket, stream)) + except (AuthenticationError, HTTPException, ValueError) as exc: + _logger.warning("Trigger websocket authentication/protocol failure: %s", exc) with suppress(RuntimeError): await websocket.close(code=4401, reason=str(exc)) - except WebSocketDisconnect: - pass + except ChannelClosed: + _logger.debug("Trigger websocket disconnected") except Exception as exc: # noqa: BLE001 - surfaced to caller + _logger.exception("Trigger websocket failed: %s", exc) with suppress(RuntimeError): await websocket.close(code=1011, reason=str(exc)) + finally: + _logger.debug("Trigger websocket closed") diff --git a/service/channels/__init__.py b/service/channels/__init__.py new file mode 100644 index 000000000..8570e062f --- /dev/null +++ b/service/channels/__init__.py @@ -0,0 +1,11 @@ +from .provider import ProviderChannelHandler +from .remote import RemoteChannelHandler +from .sync import SyncChannelHandler +from .trigger import TriggerChannelHandler + +__all__ = [ + "ProviderChannelHandler", + "RemoteChannelHandler", + "SyncChannelHandler", + "TriggerChannelHandler", +] diff --git a/service/channels/provider.py b/service/channels/provider.py new file mode 100644 index 000000000..eb62b5b7f --- /dev/null +++ b/service/channels/provider.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +import asyncio +from contextlib import suppress +from typing import Any + +from service.transport import ChannelClosed, ChannelEndpoint +from service.types import ProviderRequest + + +class ProviderChannelHandler: + def __init__(self, service_context: Any) -> None: + self.context = service_context + + async def handle(self, endpoint: ChannelEndpoint) -> None: + send_lock = asyncio.Lock() + log_queue = await self.context.log_manager.subscribe() + status_queue = await self.context.runtime.subscribe_status() + tasks = [] + try: + history = self.context.log_manager.get_history() + scopes = self.context.log_manager.get_scopes() + await endpoint.send_json({"type": "logs_full", "scopes": scopes, "entries": history}) + await endpoint.send_json({"type": "status", "status": self.context.runtime.current_status()}) + if self.context.runtime.is_all_data_initialized: + await endpoint.send_json({"type": "status", "status": {"is_all_data_initialized": True}}) + tasks.extend( + [ + asyncio.create_task(self._send_queue(endpoint, log_queue, "log", send_lock)), + asyncio.create_task(self._send_queue(endpoint, status_queue, "status", send_lock)), + ] + ) + while True: + message = await endpoint.recv_json() + req_type = message.get("type") + if req_type == "static_request": + ProviderRequest(**message) + snapshot = await self.context.config_manager.get_static_snapshot() + response = { + "type": "static_snapshot", + "timestamp": snapshot.timestamp, + "data": snapshot.data, + } + elif req_type == "status_request": + response = {"type": "status", "status": self.context.runtime.current_status()} + else: + raise ValueError(f"Unsupported provider message: {req_type}") + async with send_lock: + await endpoint.send_json(response) + finally: + for task in tasks: + task.cancel() + with suppress(asyncio.CancelledError): + await task + self.context.log_manager.unsubscribe(log_queue) + self.context.runtime.unsubscribe_status(status_queue) + + @staticmethod + async def _send_queue( + endpoint: ChannelEndpoint, + queue: asyncio.Queue, + envelope_type: str, + send_lock: asyncio.Lock, + ) -> None: + try: + while True: + payload = await queue.get() + key = "status" if envelope_type == "status" else "entry" + async with send_lock: + await endpoint.send_json({"type": envelope_type, key: payload}) + except (asyncio.CancelledError, ChannelClosed): + return diff --git a/service/channels/remote.py b/service/channels/remote.py new file mode 100644 index 000000000..cf623dc6f --- /dev/null +++ b/service/channels/remote.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import Any + +from service.transport import ChannelEndpoint + +class RemoteChannelHandler: + def __init__(self, service_context: Any) -> None: + self.context = service_context + + async def handle(self, endpoint: ChannelEndpoint) -> None: + proxy = None + try: + message = await endpoint.recv_json() + endpoint.configure_binary_encryption(bool(message.get("decrypt", True))) + config_id = message.get("config_id") + client = await self.context.runtime.require_remote_(config_id) + from service.remote import ScrcpyProxySession + + proxy = ScrcpyProxySession(client, None, encrypt_adb_to_ws=False) + await proxy.run_endpoint(endpoint) + finally: + if proxy is not None: + await proxy.close() diff --git a/service/channels/sync.py b/service/channels/sync.py new file mode 100644 index 000000000..fb38b8948 --- /dev/null +++ b/service/channels/sync.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +import asyncio +import logging +from contextlib import suppress +from typing import Any + +from service.transport import ChannelClosed, ChannelEndpoint +from service.types import SyncPatchMessage, SyncPullMessage +from service.utils.diff import PatchConflictError + +_logger = logging.getLogger(__name__) + + +class SyncChannelHandler: + def __init__(self, service_context: Any) -> None: + self.context = service_context + + async def handle(self, endpoint: ChannelEndpoint) -> None: + queue = await self.context.config_manager.subscribe_updates() + send_lock = asyncio.Lock() + sender = asyncio.create_task(self._send_updates(endpoint, queue, send_lock)) + try: + while True: + message = await endpoint.recv_json() + response = await self._handle_message(message) + async with send_lock: + await endpoint.send_json(response) + finally: + sender.cancel() + with suppress(asyncio.CancelledError): + await sender + self.context.config_manager.unsubscribe_updates(queue) + + async def _send_updates( + self, endpoint: ChannelEndpoint, queue: asyncio.Queue, send_lock: asyncio.Lock + ) -> None: + try: + while True: + payload = dict(await queue.get()) + payload.setdefault("direction", "push") + async with send_lock: + await endpoint.send_json(payload) + except (asyncio.CancelledError, ChannelClosed): + return + + async def _handle_message(self, message: dict[str, Any]) -> dict[str, Any]: + msg_type = message.get("type") + if msg_type == "pull": + data = SyncPullMessage(**message) + snapshot = await self.context.config_manager.get_snapshot(data.resource, data.resource_id) + return { + "type": "snapshot", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": snapshot.timestamp, + "data": snapshot.data, + } + if msg_type == "patch": + data = SyncPatchMessage(**message) + try: + await self.context.config_manager.apply_patch( + data.resource, data.resource_id, data.ops, data.timestamp, origin="frontend" + ) + except PatchConflictError as exc: + snapshot = await self.context.config_manager.get_snapshot(data.resource, data.resource_id) + _logger.info( + "Sync patch conflict resource=%s resource_id=%s request_timestamp=%s snapshot_timestamp=%s", + data.resource, + data.resource_id, + data.timestamp, + snapshot.timestamp, + ) + return { + "type": "patch_conflict", + "resource": data.resource, + "resource_id": data.resource_id, + "request_timestamp": data.timestamp, + "timestamp": snapshot.timestamp, + "data": snapshot.data, + "error": str(exc), + } + return { + "type": "patch_ack", + "resource": data.resource, + "resource_id": data.resource_id, + "timestamp": data.timestamp, + } + if msg_type == "list": + snapshot = await self.context.config_manager.get_config_list() + return {"type": "config_list", "timestamp": snapshot.timestamp, "data": snapshot.data} + raise ValueError(f"Unsupported sync message: {msg_type}") diff --git a/service/channels/trigger.py b/service/channels/trigger.py new file mode 100644 index 000000000..eaedca83c --- /dev/null +++ b/service/channels/trigger.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +import asyncio +from typing import Any, Dict, Optional + +from service.api.commands import execute_command +from service.transport import ChannelEndpoint +from service.types import CommandMessage + + +class TriggerChannelHandler: + def __init__(self, service_context: Any) -> None: + self.context = service_context + + async def handle(self, endpoint: ChannelEndpoint) -> None: + send_lock = asyncio.Lock() + while True: + command = CommandMessage(**(await endpoint.recv_json())) + binary = None + if command.command == "import_config" and command.payload.get("binary") is True: + binary = await endpoint.recv_bytes() + await self._dispatch(endpoint, send_lock, command, binary) + + async def _dispatch( + self, + endpoint: ChannelEndpoint, + send_lock: asyncio.Lock, + command: CommandMessage, + binary: Optional[bytes], + ) -> None: + if command.command in ("test_all_sha_stream", "update_to_latest_stream"): + try: + iterator = ( + self.context.runtime.test_all_sha_stream( + command.payload.get("channel"), command.payload.get("timeout") + ) + if command.command == "test_all_sha_stream" + else self.context.runtime.update_to_latest_stream() + ) + async for result in iterator: + await self._send_response( + endpoint, send_lock, command, {"status": "ok", "data": result} + ) + response: Dict[str, Any] = {"status": "ok", "data": {"done": True}} + except Exception as exc: # noqa: BLE001 - returned to the client + response = {"status": "error", "error": str(exc), "data": {"done": True}} + await self._send_response(endpoint, send_lock, command, response) + return + + try: + response = await execute_command(command, binary_payload=binary) + except Exception as exc: # noqa: BLE001 - returned to the client + response = {"status": "error", "error": str(exc)} + await self._send_response(endpoint, send_lock, command, response) + + @staticmethod + async def _send_response( + endpoint: ChannelEndpoint, + send_lock: asyncio.Lock, + command: CommandMessage, + response: Dict[str, Any], + ) -> None: + binary = response.pop("_binary", None) + if binary is not None: + response.setdefault("data", {})["binary"] = {"size": len(binary)} + async with send_lock: + await endpoint.send_json( + { + "type": "command_response", + "command": command.command, + **response, + "timestamp": command.timestamp, + } + ) + if binary is not None: + await endpoint.send_bytes(binary) diff --git a/service/remote/scrcpy_proxy.py b/service/remote/scrcpy_proxy.py index b53f3f792..ee24e4faa 100644 --- a/service/remote/scrcpy_proxy.py +++ b/service/remote/scrcpy_proxy.py @@ -33,6 +33,21 @@ async def run(self, websocket) -> None: await self.client.init() await self.client.proxy_websocket(websocket) + async def run_endpoint(self, endpoint) -> None: + """Proxy scrcpy bytes through a transport-neutral channel endpoint.""" + self.client.set_proxy_callbacks(None, None) + if not self.client.alive: + await self.client.init() + + class EndpointAdapter: + async def receive(self): + return {"bytes": await endpoint.recv_bytes()} + + async def send_bytes(self, payload): + await endpoint.send_bytes(payload) + + await self.client.proxy_websocket(EndpointAdapter()) + async def close(self) -> None: """Clear callbacks and stop the scrcpy client if the proxy is still alive.""" self.client.set_proxy_callbacks(None, None) diff --git a/service/transport/base.py b/service/transport/base.py new file mode 100644 index 000000000..5baa53dc6 --- /dev/null +++ b/service/transport/base.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +from typing import Any, Protocol + + +class ChannelClosed(Exception): + """Raised when a transport endpoint is no longer usable.""" + + +class ChannelEndpoint(Protocol): + async def recv_json(self) -> dict[str, Any]: ... + + async def recv_bytes(self) -> bytes: ... + + async def send_json(self, payload: dict[str, Any]) -> None: ... + + async def send_bytes(self, payload: bytes) -> None: ... + + def configure_binary_encryption(self, enabled: bool) -> None: ... + + async def close(self) -> None: ... diff --git a/service/transport/websocket_endpoint.py b/service/transport/websocket_endpoint.py new file mode 100644 index 000000000..b2b56f31f --- /dev/null +++ b/service/transport/websocket_endpoint.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import json +from contextlib import suppress +from typing import Any + +from fastapi import WebSocket, WebSocketDisconnect + +from service.auth import SecretStreamBox + +from .base import ChannelClosed + + +class WebSocketChannelEndpoint: + def __init__(self, websocket: WebSocket, stream: SecretStreamBox) -> None: + self.websocket = websocket + self.stream = stream + self._encrypt_binary_outbound = True + + async def recv_json(self) -> dict[str, Any]: + return json.loads((await self.recv_bytes()).decode("utf-8")) + + async def recv_bytes(self) -> bytes: + try: + frame = await self.websocket.receive_bytes() + except WebSocketDisconnect as exc: + raise ChannelClosed from exc + return self.stream.decrypt(frame) + + async def send_json(self, payload: dict[str, Any]) -> None: + body = json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + await self._send_frame(self.stream.encrypt(body)) + + async def send_bytes(self, payload: bytes) -> None: + frame = self.stream.encrypt(payload) if self._encrypt_binary_outbound else payload + await self._send_frame(frame) + + async def _send_frame(self, payload: bytes) -> None: + try: + await self.websocket.send_bytes(payload) + except (RuntimeError, WebSocketDisconnect) as exc: + raise ChannelClosed from exc + + def configure_binary_encryption(self, enabled: bool) -> None: + self._encrypt_binary_outbound = enabled + + async def close(self) -> None: + with suppress(RuntimeError): + await self.websocket.close() diff --git a/tests/service/test_ws_behaviors.py b/tests/service/test_ws_behaviors.py index 9a41ce3d3..410872655 100644 --- a/tests/service/test_ws_behaviors.py +++ b/tests/service/test_ws_behaviors.py @@ -1,14 +1,15 @@ from __future__ import annotations import asyncio -from types import SimpleNamespace - -from service.api import ws_provider, ws_remote, ws_sync +from service.api import ws_provider, ws_sync +from service.channels import RemoteChannelHandler +from service.transport import InMemoryChannelEndpoint +from service.transport.websocket_endpoint import WebSocketChannelEndpoint class _Stream: def encrypt(self, payload: bytes) -> bytes: - return payload + return b"encrypted:" + payload def decrypt(self, payload: bytes) -> bytes: return payload @@ -33,7 +34,7 @@ async def scenario(): await asyncio.gather(task, return_exceptions=True) return websocket.sent - assert asyncio.run(scenario()) == [b'{"type":"patch","direction":"push"}'] + assert asyncio.run(scenario()) == [b'encrypted:{"type":"patch","direction":"push"}'] def test_provider_sender_wraps_status_payload(): @@ -47,7 +48,19 @@ async def scenario(): await asyncio.gather(task, return_exceptions=True) return websocket.sent - assert asyncio.run(scenario()) == [b'{"type":"status","status":{"running":false}}'] + assert asyncio.run(scenario()) == [b'encrypted:{"type":"status","status":{"running":false}}'] + + +def test_websocket_endpoint_can_disable_binary_encryption_without_affecting_json(): + async def scenario(): + websocket = _WebSocket() + endpoint = WebSocketChannelEndpoint(websocket, _Stream()) + endpoint.configure_binary_encryption(False) + await endpoint.send_bytes(b"video") + await endpoint.send_json({"type": "control"}) + return websocket.sent + + assert asyncio.run(scenario()) == [b"video", b'encrypted:{"type":"control"}'] def test_remote_proxy_initializes_and_cleans_client(monkeypatch): @@ -75,21 +88,17 @@ async def stop(self): client = FakeClient() - async def fake_resume(websocket, *, channel): - return SimpleNamespace(), _Stream() - - async def fake_recv(websocket, stream): - return {"config_id": "default_config", "decrypt": True} - async def fake_require_remote(config_id): assert config_id == "default_config" return client - monkeypatch.setattr(ws_remote, "perform_business_resume", fake_resume) - monkeypatch.setattr(ws_remote, "recv_stream_json", fake_recv) - monkeypatch.setattr(ws_remote, "context", SimpleNamespace(runtime=SimpleNamespace(require_remote_=fake_require_remote))) + async def scenario(): + endpoint = InMemoryChannelEndpoint() + await endpoint.incoming.put({"config_id": "default_config", "decrypt": True}) + context = type("Context", (), {"runtime": type("Runtime", (), {"require_remote_": staticmethod(fake_require_remote)})()})() + await RemoteChannelHandler(context).handle(endpoint) - asyncio.run(ws_remote.websocket_remote(SimpleNamespace())) + asyncio.run(scenario()) assert client.initialized is True assert client.proxied is True From 292ac6d2b422e6822a32f159822914aa5ba55340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 13 Jul 2026 12:55:01 +0800 Subject: [PATCH 93/98] Feat: Add named pipe service transport --- main.service.py | 12 +++ scripts/tests/pipe_live_smoke.py | 61 +++++++++++++ service/app.py | 46 +++++++++- service/conf/manager.py | 6 ++ service/transport/__init__.py | 11 +++ service/transport/framing.py | 49 +++++++++++ service/transport/pipe_endpoint.py | 127 +++++++++++++++++++++++++++ service/transport/pipe_server.py | 125 ++++++++++++++++++++++++++ service/update/setup_schema.py | 3 + tests/service/test_pipe_transport.py | 81 +++++++++++++++++ 10 files changed, 518 insertions(+), 3 deletions(-) create mode 100644 scripts/tests/pipe_live_smoke.py create mode 100644 service/transport/__init__.py create mode 100644 service/transport/framing.py create mode 100644 service/transport/pipe_endpoint.py create mode 100644 service/transport/pipe_server.py create mode 100644 tests/service/test_pipe_transport.py diff --git a/main.service.py b/main.service.py index 14e0e5c51..7685d003c 100644 --- a/main.service.py +++ b/main.service.py @@ -1,4 +1,5 @@ import argparse +import logging import os import uvicorn @@ -32,6 +33,7 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--port", type=int, default=DEFAULT_PORT, help="Port to bind (default: %(default)s)") parser.add_argument("--reload", action="store_true", help="Enable auto-reload (development only)") parser.add_argument("--log-level", default="info", help="Uvicorn log level") + parser.add_argument("--pipe-name", default="", help="Enable named-pipe transport at this path") ocr_update_check_default = _env_bool(OCR_UPDATE_CHECK_ENV, True) parser.add_argument( "--ocr-update-check", @@ -53,7 +55,16 @@ def main() -> None: try: set_log_format() args = parse_args() + logging.getLogger(__name__).info( + "Starting BAAS service host=%s port=%s reload=%s log_level=%s", + args.host, + args.port, + args.reload, + args.log_level, + ) os.environ[OCR_UPDATE_CHECK_ENV] = "1" if args.ocr_update_check else "0" + if args.pipe_name: + os.environ["BAAS_PIPE_NAME"] = args.pipe_name config = uvicorn.Config( "service.app:app", host=args.host, @@ -66,6 +77,7 @@ def main() -> None: save_pid(os.getpid()) server.run() finally: + logging.getLogger(__name__).info("BAAS service process exiting") delete_pid_file() diff --git a/scripts/tests/pipe_live_smoke.py b/scripts/tests/pipe_live_smoke.py new file mode 100644 index 000000000..68c3e53fe --- /dev/null +++ b/scripts/tests/pipe_live_smoke.py @@ -0,0 +1,61 @@ +from __future__ import annotations + +import argparse +import asyncio +import json +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(ROOT)) + +from service.transport.framing import HEADER, KIND_JSON, encode_json # noqa: E402 + + +async def read_json(reader: asyncio.StreamReader) -> dict: + header = await reader.readexactly(HEADER.size) + _, _, kind, length = HEADER.unpack(header) + payload = await reader.readexactly(length) + if kind != KIND_JSON: + raise RuntimeError(f"Expected JSON frame, received kind={kind}") + return json.loads(payload) + + +async def run(pipe_name: str) -> None: + loop = asyncio.get_running_loop() + reader = asyncio.StreamReader() + protocol = asyncio.StreamReaderProtocol(reader) + transport, _ = await loop.create_pipe_connection(lambda: protocol, pipe_name) + writer = asyncio.StreamWriter(transport, protocol, reader, loop) + try: + writer.write(encode_json({"type": "open", "channel": "provider", "name": "live-smoke"})) + await writer.drain() + opened = await asyncio.wait_for(read_json(reader), timeout=5) + if opened != {"type": "open_ok", "channel": "provider"}: + raise RuntimeError(f"Unexpected open response: {opened}") + + initial_types = {(await asyncio.wait_for(read_json(reader), timeout=5)).get("type") for _ in range(2)} + if initial_types != {"logs_full", "status"}: + raise RuntimeError(f"Unexpected provider initialization: {initial_types}") + + writer.write(encode_json({"type": "status_request"})) + await writer.drain() + for _ in range(4): + response = await asyncio.wait_for(read_json(reader), timeout=5) + if response.get("type") == "status" and isinstance(response.get("status"), dict): + print("pipe provider smoke passed") + return + raise RuntimeError("Provider did not return a status response") + finally: + writer.close() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("pipe_name") + args = parser.parse_args() + asyncio.run(run(args.pipe_name)) + + +if __name__ == "__main__": + main() diff --git a/service/app.py b/service/app.py index 14c9760f3..16cca2cae 100644 --- a/service/app.py +++ b/service/app.py @@ -1,9 +1,11 @@ from __future__ import annotations import contextlib +import logging import os +import time -from fastapi import FastAPI +from fastapi import FastAPI, Request from starlette.middleware.cors import CORSMiddleware from .api.http import router as http_router @@ -13,17 +15,55 @@ from .api.ws_remote import router as remote_router from .api.ws_sync import router as sync_router from .api.ws_trigger import router as trigger_router +from .transport.pipe_server import PipeTransportServer @contextlib.asynccontextmanager async def lifespan(app: FastAPI): await context.startup() - yield - await context.shutdown() + pipe_server = None + pipe_name = os.getenv("BAAS_PIPE_NAME", "").strip() + if pipe_name: + pipe_server = PipeTransportServer(pipe_name, context) + await pipe_server.start() + try: + yield + finally: + if pipe_server is not None: + await pipe_server.close() + await context.shutdown() app = FastAPI(title="BAAS Service Mode", lifespan=lifespan) + +@app.middleware("http") +async def log_http_request(request: Request, call_next): + logger = logging.getLogger("baas.http") + started = time.perf_counter() + client = request.client.host if request.client else "unknown" + logger.debug("HTTP request started method=%s path=%s client=%s", request.method, request.url.path, client) + try: + response = await call_next(request) + except Exception: + logger.exception( + "HTTP request failed method=%s path=%s client=%s duration_ms=%.2f", + request.method, + request.url.path, + client, + (time.perf_counter() - started) * 1000, + ) + raise + logger.debug( + "HTTP request completed method=%s path=%s status=%s client=%s duration_ms=%.2f", + request.method, + request.url.path, + response.status_code, + client, + (time.perf_counter() - started) * 1000, + ) + return response + app.add_middleware( CORSMiddleware, # type: ignore allow_origin_regex=os.getenv( diff --git a/service/conf/manager.py b/service/conf/manager.py index 119d98949..8769b00b7 100644 --- a/service/conf/manager.py +++ b/service/conf/manager.py @@ -108,6 +108,7 @@ def _project_setup_toml(full_setup_toml: Dict[str, Any]) -> Dict[str, Any]: current = migrate_to_current_schema(full_setup_toml) config_general = current.get("general", {}) return { + "transport" : config_general.get("transport", "websocket"), "channel" : config_general.get("channel", "stable"), "updateMethod": config_general.get("get_remote_sha_method") or "github", "repoUrl" : legacy_repo_url(current), @@ -194,6 +195,11 @@ def _merge_setup_toml(self, projection: Dict[str, Any]) -> Dict[str, Any]: updateMethod: Optional[str] = projection.get("updateMethod", None) mirrorcCdk: Optional[str] = projection.get("mirrorcCdk", None) channel: Optional[str] = projection.get("channel", None) + transport: Optional[str] = projection.get("transport", None) + if transport is not None: + if transport not in ("websocket", "pipe"): + raise ValueError(f"Unsupported backend transport: {transport}") + merged["general"]["transport"] = transport if channel is not None: normalized_channel = normalize_update_channel(channel) merged["general"]["channel"] = normalized_channel diff --git a/service/transport/__init__.py b/service/transport/__init__.py new file mode 100644 index 000000000..01ad810e5 --- /dev/null +++ b/service/transport/__init__.py @@ -0,0 +1,11 @@ +from .base import ChannelClosed, ChannelEndpoint +from .pipe_endpoint import InMemoryChannelEndpoint, PipeChannelEndpoint +from .websocket_endpoint import WebSocketChannelEndpoint + +__all__ = [ + "ChannelClosed", + "ChannelEndpoint", + "InMemoryChannelEndpoint", + "PipeChannelEndpoint", + "WebSocketChannelEndpoint", +] diff --git a/service/transport/framing.py b/service/transport/framing.py new file mode 100644 index 000000000..746343c55 --- /dev/null +++ b/service/transport/framing.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import json +import struct +from typing import Any + +MAGIC = b"BPIP" +VERSION = 1 +KIND_JSON = 1 +KIND_BYTES = 2 +KIND_CLOSE = 3 +KIND_ERROR = 4 +HEADER = struct.Struct("<4sBBI") +MAX_PAYLOAD_BYTES = 64 * 1024 * 1024 + + +def encode_frame(kind: int, payload: bytes = b"") -> bytes: + if len(payload) > MAX_PAYLOAD_BYTES: + raise ValueError("Pipe payload exceeds the 64 MiB limit") + return HEADER.pack(MAGIC, VERSION, kind, len(payload)) + payload + + +def encode_json(payload: dict[str, Any]) -> bytes: + body = json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + return encode_frame(KIND_JSON, body) + + +class FrameDecoder: + def __init__(self) -> None: + self._buffer = bytearray() + + def feed(self, data: bytes) -> list[tuple[int, bytes]]: + self._buffer.extend(data) + frames: list[tuple[int, bytes]] = [] + while len(self._buffer) >= HEADER.size: + magic, version, kind, payload_length = HEADER.unpack_from(self._buffer) + if magic != MAGIC: + raise ValueError("Invalid pipe frame magic") + if version != VERSION: + raise ValueError(f"Unsupported pipe protocol version: {version}") + if payload_length > MAX_PAYLOAD_BYTES: + raise ValueError("Pipe payload exceeds the 64 MiB limit") + frame_length = HEADER.size + payload_length + if len(self._buffer) < frame_length: + break + payload = bytes(self._buffer[HEADER.size:frame_length]) + del self._buffer[:frame_length] + frames.append((kind, payload)) + return frames diff --git a/service/transport/pipe_endpoint.py b/service/transport/pipe_endpoint.py new file mode 100644 index 000000000..6fd260815 --- /dev/null +++ b/service/transport/pipe_endpoint.py @@ -0,0 +1,127 @@ +from __future__ import annotations + +import asyncio +import json +from contextlib import suppress +from typing import Any, Optional + +from .base import ChannelClosed +from .framing import KIND_BYTES, KIND_CLOSE, KIND_ERROR, KIND_JSON, encode_frame, encode_json + +_CLOSED = object() + + +class PipeChannelEndpoint: + def __init__(self, transport: asyncio.Transport) -> None: + self._transport = transport + self._incoming: asyncio.Queue[object] = asyncio.Queue() + self._send_lock = asyncio.Lock() + self._writable = asyncio.Event() + self._writable.set() + self._closed = False + + def feed_frame(self, kind: int, payload: bytes) -> None: + if kind == KIND_CLOSE: + self.connection_lost() + elif kind in (KIND_JSON, KIND_BYTES): + self._incoming.put_nowait((kind, payload)) + elif kind == KIND_ERROR: + self._incoming.put_nowait(ChannelClosed(payload.decode("utf-8", errors="replace"))) + else: + self._incoming.put_nowait(ChannelClosed(f"Unsupported pipe frame kind: {kind}")) + + def connection_lost(self) -> None: + if not self._closed: + self._closed = True + self._incoming.put_nowait(_CLOSED) + self._writable.set() + + def pause_writing(self) -> None: + self._writable.clear() + + def resume_writing(self) -> None: + self._writable.set() + + async def _recv(self, expected_kind: int) -> bytes: + item = await self._incoming.get() + if item is _CLOSED: + raise ChannelClosed("Pipe connection closed") + if isinstance(item, Exception): + raise item + kind, payload = item # type: ignore[misc] + if kind != expected_kind: + raise ChannelClosed(f"Unexpected pipe frame kind: expected {expected_kind}, received {kind}") + return payload + + async def recv_json(self) -> dict[str, Any]: + payload = await self._recv(KIND_JSON) + value = json.loads(payload.decode("utf-8")) + if not isinstance(value, dict): + raise ValueError("Pipe JSON frame must contain an object") + return value + + async def recv_bytes(self) -> bytes: + return await self._recv(KIND_BYTES) + + async def _send(self, frame: bytes) -> None: + if self._closed or self._transport.is_closing(): + raise ChannelClosed("Pipe connection closed") + async with self._send_lock: + await self._writable.wait() + if self._closed or self._transport.is_closing(): + raise ChannelClosed("Pipe connection closed") + self._transport.write(frame) + + async def send_json(self, payload: dict[str, Any]) -> None: + await self._send(encode_json(payload)) + + async def send_bytes(self, payload: bytes) -> None: + await self._send(encode_frame(KIND_BYTES, payload)) + + def configure_binary_encryption(self, enabled: bool) -> None: + pass + + async def close(self) -> None: + if self._closed: + return + with suppress(Exception): + await self._send(encode_frame(KIND_CLOSE)) + self._closed = True + self._transport.close() + + +class InMemoryChannelEndpoint: + """Test endpoint that exercises handlers without binding a transport.""" + + def __init__(self) -> None: + self.incoming: asyncio.Queue[object] = asyncio.Queue() + self.outgoing: asyncio.Queue[tuple[int, bytes]] = asyncio.Queue() + self.closed = False + + async def recv_json(self) -> dict[str, Any]: + item = await self.incoming.get() + if item is _CLOSED: + raise ChannelClosed + if not isinstance(item, dict): + raise TypeError("Expected JSON object") + return item + + async def recv_bytes(self) -> bytes: + item = await self.incoming.get() + if item is _CLOSED: + raise ChannelClosed + if not isinstance(item, bytes): + raise TypeError("Expected bytes") + return item + + async def send_json(self, payload: dict[str, Any]) -> None: + await self.outgoing.put((KIND_JSON, json.dumps(payload).encode())) + + async def send_bytes(self, payload: bytes) -> None: + await self.outgoing.put((KIND_BYTES, payload)) + + def configure_binary_encryption(self, enabled: bool) -> None: + pass + + async def close(self) -> None: + self.closed = True diff --git a/service/transport/pipe_server.py b/service/transport/pipe_server.py new file mode 100644 index 000000000..fae8e57f5 --- /dev/null +++ b/service/transport/pipe_server.py @@ -0,0 +1,125 @@ +from __future__ import annotations + +import asyncio +import json +import logging +from contextlib import suppress +from typing import Any, Optional + +from service.channels import ( + ProviderChannelHandler, + RemoteChannelHandler, + SyncChannelHandler, + TriggerChannelHandler, +) + +from .base import ChannelClosed +from .framing import KIND_ERROR, KIND_JSON, FrameDecoder, encode_frame +from .pipe_endpoint import PipeChannelEndpoint + +_logger = logging.getLogger(__name__) +_HANDLERS = { + "provider": ProviderChannelHandler, + "sync": SyncChannelHandler, + "trigger": TriggerChannelHandler, + "remote": RemoteChannelHandler, +} + + +class _PipeProtocol(asyncio.Protocol): + def __init__(self, service_context: Any) -> None: + self._context = service_context + self._transport: Optional[asyncio.Transport] = None + self._endpoint: Optional[PipeChannelEndpoint] = None + self._decoder = FrameDecoder() + self._handler_task: Optional[asyncio.Task[None]] = None + self._opened = False + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + self._transport = transport # type: ignore[assignment] + self._endpoint = PipeChannelEndpoint(self._transport) + + def data_received(self, data: bytes) -> None: + try: + for kind, payload in self._decoder.feed(data): + if not self._opened: + self._open_channel(kind, payload) + elif self._endpoint is not None: + self._endpoint.feed_frame(kind, payload) + except Exception as exc: # noqa: BLE001 - protocol errors close only this client + self._fail(exc) + + def connection_lost(self, exc: Optional[Exception]) -> None: + if self._endpoint is not None: + self._endpoint.connection_lost() + if self._handler_task is not None: + self._handler_task.cancel() + + def pause_writing(self) -> None: + if self._endpoint is not None: + self._endpoint.pause_writing() + + def resume_writing(self) -> None: + if self._endpoint is not None: + self._endpoint.resume_writing() + + def _open_channel(self, kind: int, payload: bytes) -> None: + if kind != KIND_JSON: + raise ValueError("The first pipe frame must be a JSON open request") + request = json.loads(payload.decode("utf-8")) + if request.get("type") != "open": + raise ValueError("The first pipe message must be an open request") + channel = str(request.get("channel", "")) + handler_type = _HANDLERS.get(channel) + if handler_type is None: + raise ValueError(f"Unsupported pipe channel: {channel}") + if self._endpoint is None: + raise RuntimeError("Pipe endpoint was not initialized") + self._opened = True + self._handler_task = asyncio.create_task(self._run_handler(channel, handler_type(self._context))) + + async def _run_handler(self, channel: str, handler: Any) -> None: + assert self._endpoint is not None + try: + await self._endpoint.send_json({"type": "open_ok", "channel": channel}) + await handler.handle(self._endpoint) + except asyncio.CancelledError: + return + except ChannelClosed: + _logger.debug("Pipe channel disconnected channel=%s", channel) + return + except Exception as exc: # noqa: BLE001 - sent to the owning client + _logger.exception("Pipe channel failed channel=%s: %s", channel, exc) + self._fail(exc) + finally: + await self._endpoint.close() + + def _fail(self, exc: Exception) -> None: + if self._transport is None or self._transport.is_closing(): + return + message = str(exc).encode("utf-8", errors="replace") + with suppress(Exception): + self._transport.write(encode_frame(KIND_ERROR, message)) + self._transport.close() + + +class PipeTransportServer: + def __init__(self, pipe_name: str, service_context: Any) -> None: + self.pipe_name = pipe_name + self.service_context = service_context + self._servers: list[Any] = [] + + async def start(self) -> None: + loop = asyncio.get_running_loop() + start_serving_pipe = getattr(loop, "start_serving_pipe", None) + if start_serving_pipe is None: + raise RuntimeError("Named pipe transport requires the Windows Proactor event loop") + self._servers = await start_serving_pipe( + lambda: _PipeProtocol(self.service_context), self.pipe_name + ) + _logger.info("Named pipe transport listening pipe=%s", self.pipe_name) + + async def close(self) -> None: + for server in self._servers: + server.close() + self._servers.clear() diff --git a/service/update/setup_schema.py b/service/update/setup_schema.py index 6afa75788..bd281a618 100644 --- a/service/update/setup_schema.py +++ b/service/update/setup_schema.py @@ -12,6 +12,7 @@ CURRENT_DEFAULT_SETTINGS: Dict[str, Any] = { "schema_version": CURRENT_SCHEMA_VERSION, "general": { + "transport": "websocket", "mirrorc_cdk": "", "channel": "stable", "current_baas_sha": "", @@ -81,6 +82,8 @@ def migrate_to_current_schema(data: Dict[str, Any]) -> Dict[str, Any]: current["schema_version"] = int(data.get("schema_version") or data.get("schemaVersion") or CURRENT_SCHEMA_VERSION) current_general = current["general"] + transport = str(general.get("transport", current_general["transport"])) + current_general["transport"] = transport if transport in ("websocket", "pipe") else "websocket" current_general.update({key: value for key, value in general.items() if key in current_general}) current_general["mirrorc_cdk"] = _first_string( general.get("mirrorc_cdk"), diff --git a/tests/service/test_pipe_transport.py b/tests/service/test_pipe_transport.py new file mode 100644 index 000000000..103c8cb73 --- /dev/null +++ b/tests/service/test_pipe_transport.py @@ -0,0 +1,81 @@ +from __future__ import annotations + +import asyncio +import json +import sys +import uuid +from types import SimpleNamespace + +import pytest + +from service.transport.framing import ( + HEADER, + KIND_BYTES, + KIND_CLOSE, + KIND_JSON, + FrameDecoder, + encode_frame, + encode_json, +) +from service.transport.pipe_server import PipeTransportServer, _HANDLERS + + +def test_frame_decoder_accepts_fragmented_and_coalesced_frames(): + decoder = FrameDecoder() + payload = encode_json({"type": "first"}) + encode_frame(KIND_BYTES, b"second") + + assert decoder.feed(payload[:7]) == [] + frames = decoder.feed(payload[7:]) + + assert frames[0][0] == KIND_JSON + assert json.loads(frames[0][1]) == {"type": "first"} + assert frames[1] == (KIND_BYTES, b"second") + + +async def _read_frame(reader: asyncio.StreamReader) -> tuple[int, bytes]: + header = await reader.readexactly(HEADER.size) + _, _, kind, length = HEADER.unpack(header) + return kind, await reader.readexactly(length) + + +@pytest.mark.skipif(sys.platform != "win32", reason="Windows named pipes only") +def test_named_pipe_channel_round_trip(monkeypatch): + class EchoHandler: + def __init__(self, context): + self.context = context + + async def handle(self, endpoint): + message = await endpoint.recv_json() + binary = await endpoint.recv_bytes() + await endpoint.send_json({"echo": message, "size": len(binary)}) + await endpoint.send_bytes(binary[::-1]) + + async def scenario(): + monkeypatch.setitem(_HANDLERS, "test", EchoHandler) + pipe_name = rf"\\.\pipe\baas-test-{uuid.uuid4().hex}" + server = PipeTransportServer(pipe_name, SimpleNamespace()) + await server.start() + try: + loop = asyncio.get_running_loop() + reader = asyncio.StreamReader() + protocol = asyncio.StreamReaderProtocol(reader) + transport, _ = await loop.create_pipe_connection(lambda: protocol, pipe_name) + writer = asyncio.StreamWriter(transport, protocol, reader, loop) + writer.write(encode_json({"type": "open", "channel": "test", "name": "smoke"})) + await writer.drain() + kind, payload = await _read_frame(reader) + assert kind == KIND_JSON + assert json.loads(payload) == {"type": "open_ok", "channel": "test"} + + writer.write(encode_json({"value": 42}) + encode_frame(KIND_BYTES, b"abcdef")) + await writer.drain() + kind, payload = await _read_frame(reader) + assert kind == KIND_JSON + assert json.loads(payload) == {"echo": {"value": 42}, "size": 6} + assert await _read_frame(reader) == (KIND_BYTES, b"fedcba") + assert (await _read_frame(reader))[0] == KIND_CLOSE + writer.close() + finally: + await server.close() + + asyncio.run(scenario()) From b83f914bb34d8c931aa2f0b26e759cb9c5b72422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 13 Jul 2026 12:55:01 +0800 Subject: [PATCH 94/98] CI: Test service transports across platforms --- .github/workflows/service_transport.yml | 38 +++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/service_transport.yml diff --git a/.github/workflows/service_transport.yml b/.github/workflows/service_transport.yml new file mode 100644 index 000000000..b066d1f21 --- /dev/null +++ b/.github/workflows/service_transport.yml @@ -0,0 +1,38 @@ +name: Service Transport Tests + +on: + pull_request: + branches: + - dev/optim + push: + branches: + - dev/optim + +permissions: + contents: read + +jobs: + service-tests: + name: Service tests (${{ matrix.os }}) + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - windows-latest + runs-on: ${{ matrix.os }} + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup Python + uses: actions/setup-python@v6 + with: + python-version: "3.11" + cache: pip + + - name: Install service test dependencies + run: python -m pip install -e ".[service,test]" + + - name: Run service tests + run: python -m pytest tests/service -q From eb79f29007cf42a1a49a8e30e157da56d4b7a270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Mon, 13 Jul 2026 16:06:50 +0800 Subject: [PATCH 95/98] Feat: Support Pipe transport on Unix --- .github/workflows/service_transport.yml | 1 + service/transport/pipe_server.py | 34 +++++++++++++++---- tests/service/test_pipe_transport.py | 44 +++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/.github/workflows/service_transport.yml b/.github/workflows/service_transport.yml index b066d1f21..38995370c 100644 --- a/.github/workflows/service_transport.yml +++ b/.github/workflows/service_transport.yml @@ -19,6 +19,7 @@ jobs: matrix: os: - ubuntu-latest + - macos-latest - windows-latest runs-on: ${{ matrix.os }} steps: diff --git a/service/transport/pipe_server.py b/service/transport/pipe_server.py index fae8e57f5..e64b5d866 100644 --- a/service/transport/pipe_server.py +++ b/service/transport/pipe_server.py @@ -3,7 +3,9 @@ import asyncio import json import logging +import os from contextlib import suppress +from pathlib import Path from typing import Any, Optional from service.channels import ( @@ -108,18 +110,38 @@ def __init__(self, pipe_name: str, service_context: Any) -> None: self.pipe_name = pipe_name self.service_context = service_context self._servers: list[Any] = [] + self._unix_path: Optional[Path] = None async def start(self) -> None: loop = asyncio.get_running_loop() - start_serving_pipe = getattr(loop, "start_serving_pipe", None) - if start_serving_pipe is None: - raise RuntimeError("Named pipe transport requires the Windows Proactor event loop") - self._servers = await start_serving_pipe( - lambda: _PipeProtocol(self.service_context), self.pipe_name + if os.name == "nt": + start_serving_pipe = getattr(loop, "start_serving_pipe", None) + if start_serving_pipe is None: + raise RuntimeError("Named pipe transport requires the Windows Proactor event loop") + self._servers = await start_serving_pipe( + lambda: _PipeProtocol(self.service_context), self.pipe_name + ) + _logger.info("Named pipe transport listening pipe=%s", self.pipe_name) + return + + socket_path = Path(self.pipe_name) + socket_path.parent.mkdir(parents=True, exist_ok=True) + socket_path.unlink(missing_ok=True) + server = await loop.create_unix_server( + lambda: _PipeProtocol(self.service_context), path=str(socket_path) ) - _logger.info("Named pipe transport listening pipe=%s", self.pipe_name) + os.chmod(socket_path, 0o600) + self._servers = [server] + self._unix_path = socket_path + _logger.info("Unix pipe transport listening path=%s", socket_path) async def close(self) -> None: for server in self._servers: server.close() + wait_closed = getattr(server, "wait_closed", None) + if wait_closed is not None: + await wait_closed() self._servers.clear() + if self._unix_path is not None: + self._unix_path.unlink(missing_ok=True) + self._unix_path = None diff --git a/tests/service/test_pipe_transport.py b/tests/service/test_pipe_transport.py index 103c8cb73..b4f4a8b32 100644 --- a/tests/service/test_pipe_transport.py +++ b/tests/service/test_pipe_transport.py @@ -4,6 +4,7 @@ import json import sys import uuid +from pathlib import Path from types import SimpleNamespace import pytest @@ -79,3 +80,46 @@ async def scenario(): await server.close() asyncio.run(scenario()) + + +@pytest.mark.skipif(sys.platform == "win32", reason="Unix sockets are unavailable on Windows") +def test_unix_pipe_channel_round_trip(monkeypatch): + class EchoHandler: + def __init__(self, context): + self.context = context + + async def handle(self, endpoint): + message = await endpoint.recv_json() + binary = await endpoint.recv_bytes() + await endpoint.send_json({"echo": message, "size": len(binary)}) + await endpoint.send_bytes(binary[::-1]) + + async def scenario(): + monkeypatch.setitem(_HANDLERS, "test", EchoHandler) + socket_path = Path("/tmp") / f"baas-test-{uuid.uuid4().hex}.sock" + socket_path.write_text("stale", encoding="utf-8") + server = PipeTransportServer(str(socket_path), SimpleNamespace()) + await server.start() + assert socket_path.exists() + try: + reader, writer = await asyncio.open_unix_connection(str(socket_path)) + writer.write(encode_json({"type": "open", "channel": "test", "name": "smoke"})) + await writer.drain() + kind, payload = await _read_frame(reader) + assert kind == KIND_JSON + assert json.loads(payload) == {"type": "open_ok", "channel": "test"} + + writer.write(encode_json({"value": 42}) + encode_frame(KIND_BYTES, b"abcdef")) + await writer.drain() + kind, payload = await _read_frame(reader) + assert kind == KIND_JSON + assert json.loads(payload) == {"echo": {"value": 42}, "size": 6} + assert await _read_frame(reader) == (KIND_BYTES, b"fedcba") + assert (await _read_frame(reader))[0] == KIND_CLOSE + writer.close() + await writer.wait_closed() + finally: + await server.close() + assert not socket_path.exists() + + asyncio.run(scenario()) From e735d297f083fc96fead55b6871c4c2803198135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 14 Jul 2026 21:37:05 +0800 Subject: [PATCH 96/98] Fix: Prevent scheduler status queue accumulation --- core/scheduler.py | 3 ++ service/runtime.py | 14 ++++---- tests/service/test_service_logic.py | 52 +++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/core/scheduler.py b/core/scheduler.py index b02db3b1a..e06ff8bed 100644 --- a/core/scheduler.py +++ b/core/scheduler.py @@ -90,6 +90,8 @@ def heartbeat(self): self._current_task = self._valid_task_queue[0] self._currentTaskDisplay = self.event_map[self._current_task['current_task']] self._valid_task_queue.pop(0) + if self._waitingTaskDisplayQueue: + self._waitingTaskDisplayQueue.pop(0) if self.update_signal is not None: self.update_signal.emit([self._currentTaskDisplay, *self._waitingTaskDisplayQueue]) return self._current_task @@ -118,6 +120,7 @@ def update_valid_task_queue(self): _valid_event = sorted(_valid_event, key=lambda x: x['priority']) # sort by priority self._valid_task_queue = [] + self._waitingTaskDisplayQueue = [] for i in range(0, len(_valid_event)): self._waitingTaskDisplayQueue.append(_valid_event[i]['event_name']) thisTask = { diff --git a/service/runtime.py b/service/runtime.py index befda248b..892d02769 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -941,12 +941,14 @@ def _handle_update_signal(self, config_id: str, payload: Any) -> None: _event_map_inv = self._event_map_inv[config_id] if isinstance(payload, list) and payload: current = _event_map_inv.get(payload[0], None) - waiting = [ - value - for item in payload - if (value := _event_map_inv.get(item)) is not None - and value != current - ] + waiting = [] + seen = {current} if current is not None else set() + for item in payload[1:]: + value = _event_map_inv.get(item) + if value is None or value in seen: + continue + seen.add(value) + waiting.append(value) else: current = None waiting = [] diff --git a/tests/service/test_service_logic.py b/tests/service/test_service_logic.py index 58a6f8e73..05691822e 100644 --- a/tests/service/test_service_logic.py +++ b/tests/service/test_service_logic.py @@ -6,9 +6,11 @@ import shutil import time from pathlib import Path +from types import SimpleNamespace from watchfiles import Change +from core.scheduler import Scheduler from service.utils.broadcast import BroadcastChannel from service.conf.manager import ConfigManager from service.utils.diff import apply_patch, diff_documents @@ -42,6 +44,56 @@ async def scenario(): assert asyncio.run(scenario()) == {"seq": 2} +def _schedule_event(name: str, func_name: str, priority: int) -> dict: + return { + "event_name": name, + "func_name": func_name, + "enabled": True, + "next_tick": 0, + "priority": priority, + "pre_task": [], + "post_task": [], + "disabled_time_range": [], + } + + +def test_scheduler_rebuilds_waiting_tasks_without_accumulating(tmp_path): + events = [ + _schedule_event("Task A", "task_a", 1), + _schedule_event("Task B", "task_b", 2), + ] + (tmp_path / "event.json").write_text(json.dumps(events), encoding="utf-8") + emitted = [] + scheduler = Scheduler(SimpleNamespace(emit=emitted.append), str(tmp_path)) + + scheduler.update_valid_task_queue() + scheduler.update_valid_task_queue() + + assert scheduler.getWaitingTaskList() == ["Task A", "Task B"] + assert scheduler.heartbeat()["current_task"] == "task_a" + assert scheduler.getWaitingTaskList() == ["Task B"] + assert emitted[-1] == ["Task A", "Task B"] + + +def test_runtime_normalizes_duplicate_waiting_tasks(tmp_path): + runtime = ServiceRuntime(tmp_path) + runtime._sessions["config"] = SimpleNamespace( + baas=SimpleNamespace( + scheduler=SimpleNamespace(event_map={"task_a": "Task A", "task_b": "Task B"}) + ) + ) + + runtime._handle_update_signal("config", ["Task A", "Task A", "Task B", "Task B"]) + first = runtime.current_status()["config"] + runtime._handle_update_signal("config", ["Task B", "Task B"]) + second = runtime.current_status()["config"] + + assert first["current_task"] == "task_a" + assert first["waiting_tasks"] == ["task_b"] + assert second["current_task"] == "task_b" + assert second["waiting_tasks"] == [] + + def test_config_manager_classifies_config_files(): root = Path("project") manager = ConfigManager(root) From 9049b8c47f4b16134222701ce050cb5cf7ee817e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 14 Jul 2026 21:37:05 +0800 Subject: [PATCH 97/98] Fix: Suppress noisy dependency debug logs --- service/system_logging.py | 11 ++++++++++ tests/service/test_system_logging.py | 30 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/service/system_logging.py b/service/system_logging.py index d09de0763..9e27ab792 100644 --- a/service/system_logging.py +++ b/service/system_logging.py @@ -17,6 +17,10 @@ SYSTEM_LOG_MAX_BYTES = 10 * 1024 * 1024 SYSTEM_LOG_BACKUP_COUNT = 5 SYSTEM_LOG_HANDLER_MARKER = "_baas_system_log_handler" +NOISY_DEPENDENCY_LOG_LEVELS = { + "PIL": logging.WARNING, + "urllib3": logging.WARNING, +} _exception_hooks_installed = False @@ -46,6 +50,12 @@ def system_log_path(project_root: Path) -> Path: return project_root / SYSTEM_LOG_DIR / SYSTEM_LOG_FILE +def configure_dependency_log_levels() -> None: + """Keep high-frequency dependency diagnostics out of the system log.""" + for logger_name, level in NOISY_DEPENDENCY_LOG_LEVELS.items(): + logging.getLogger(logger_name).setLevel(level) + + def configure_system_logging(project_root: Path) -> Path: """Attach the persistent DEBUG handler and global exception hooks.""" path = system_log_path(project_root) @@ -53,6 +63,7 @@ def configure_system_logging(project_root: Path) -> Path: root = logging.getLogger() root.setLevel(logging.DEBUG) + configure_dependency_log_levels() for handler in root.handlers: if getattr(handler, SYSTEM_LOG_HANDLER_MARKER, False): return path diff --git a/tests/service/test_system_logging.py b/tests/service/test_system_logging.py index 36c824dbc..18c87a423 100644 --- a/tests/service/test_system_logging.py +++ b/tests/service/test_system_logging.py @@ -3,6 +3,7 @@ import json import logging import logging.handlers +from io import StringIO from pathlib import Path from types import SimpleNamespace @@ -13,6 +14,7 @@ from service.system_logging import ( JsonLineFormatter, clear_system_logs, + configure_dependency_log_levels, read_system_logs, system_log_path, ) @@ -54,6 +56,34 @@ def test_json_formatter_keeps_diagnostic_context(): assert payload["process"] > 0 +def test_dependency_debug_noise_is_suppressed_without_hiding_baas_debug(): + stream = StringIO() + handler = logging.StreamHandler(stream) + handler.setLevel(logging.DEBUG) + root = logging.getLogger() + previous_root_level = root.level + dependency_loggers = [logging.getLogger("PIL"), logging.getLogger("urllib3")] + previous_dependency_levels = [logger.level for logger in dependency_loggers] + root.addHandler(handler) + try: + root.setLevel(logging.DEBUG) + configure_dependency_log_levels() + + logging.getLogger("PIL.PngImagePlugin").debug("png chunk noise") + logging.getLogger("urllib3.connectionpool").debug("request noise") + logging.getLogger("baas.runtime").debug("runtime detail") + + output = stream.getvalue() + assert "png chunk noise" not in output + assert "request noise" not in output + assert "runtime detail" in output + finally: + root.removeHandler(handler) + root.setLevel(previous_root_level) + for logger, level in zip(dependency_loggers, previous_dependency_levels): + logger.setLevel(level) + + def test_read_system_logs_merges_rotations_and_filters(tmp_path): current = system_log_path(tmp_path) rotated = Path(f"{current}.1") From 8c861fc24edfee9a8bf83ba715d13bf175932991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 14 Jul 2026 23:18:16 +0800 Subject: [PATCH 98/98] Chore: Consolidate tests and workflows --- ...service_transport.yml => code-quality.yml} | 2 +- .github/workflows/notify-fork-sync.yml | 42 ------- .github/workflows/sync-to-cnb.yml | 29 ----- .../{sync-from-upstream.yml => sync.yml} | 106 +++++++++++++++--- .../service}/pipe_live_smoke.py | 0 5 files changed, 90 insertions(+), 89 deletions(-) rename .github/workflows/{service_transport.yml => code-quality.yml} (96%) delete mode 100644 .github/workflows/notify-fork-sync.yml delete mode 100644 .github/workflows/sync-to-cnb.yml rename .github/workflows/{sync-from-upstream.yml => sync.yml} (59%) rename {scripts/tests => tests/service}/pipe_live_smoke.py (100%) diff --git a/.github/workflows/service_transport.yml b/.github/workflows/code-quality.yml similarity index 96% rename from .github/workflows/service_transport.yml rename to .github/workflows/code-quality.yml index 38995370c..84a8aa4f0 100644 --- a/.github/workflows/service_transport.yml +++ b/.github/workflows/code-quality.yml @@ -1,4 +1,4 @@ -name: Service Transport Tests +name: Code Quality on: pull_request: diff --git a/.github/workflows/notify-fork-sync.yml b/.github/workflows/notify-fork-sync.yml deleted file mode 100644 index d200a091d..000000000 --- a/.github/workflows/notify-fork-sync.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Notify Kiramei fork to sync - -on: - push: - branches: - - master - -permissions: {} - -jobs: - dispatch: - # Run this job only in the upstream repository. - if: github.repository == 'pur1fying/blue_archive_auto_script' - - runs-on: ubuntu-latest - - steps: - - name: Trigger fork sync PR - env: - GH_TOKEN: ${{ secrets.UPSTREAM_TO_KIRAMEI_DEV_PAT }} - EXPECTED_REPOSITORY: pur1fying/blue_archive_auto_script - FORK_REPO: Kiramei/baas-dev - EVENT_TYPE: upstream-master-push - run: | - set -euo pipefail - - # Extra runtime guard in case this workflow is copied or modified incorrectly. - if [ "${GITHUB_REPOSITORY}" != "${EXPECTED_REPOSITORY}" ]; then - echo "This workflow is intended to run only in ${EXPECTED_REPOSITORY}." - echo "Current repository: ${GITHUB_REPOSITORY}" - exit 0 - fi - - # Trigger a repository_dispatch event in the fork repository. - gh api \ - --method POST \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/repos/${FORK_REPO}/dispatches" \ - -f event_type="${EVENT_TYPE}" \ - -F client_payload[upstream_sha]="${GITHUB_SHA}" \ - -F client_payload[upstream_ref]="${GITHUB_REF_NAME}" diff --git a/.github/workflows/sync-to-cnb.yml b/.github/workflows/sync-to-cnb.yml deleted file mode 100644 index c4790935c..000000000 --- a/.github/workflows/sync-to-cnb.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Sync to CNB - -on: - workflow_dispatch: - push: - branches: - - master - -jobs: - sync: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Sync Dev - if: github.repository == 'Kiramei/baas-dev' - uses: ./.github/actions/sync-to-cnb - with: - target-url: https://cnb.cool/kiramei/baas-dev.git - password: ${{ secrets.CNB_SYNC_TOKEN }} - - - name: Sync Stable - if: github.repository == 'pur1fying/blue_archive_auto_script' - uses: ./.github/actions/sync-to-cnb - with: - target-url: https://cnb.cool/pur1fying/blue_archive_auto_script.git - password: ${{ secrets.CNB_SYNC_TOKEN }} diff --git a/.github/workflows/sync-from-upstream.yml b/.github/workflows/sync.yml similarity index 59% rename from .github/workflows/sync-from-upstream.yml rename to .github/workflows/sync.yml index cb651a03f..d86263655 100644 --- a/.github/workflows/sync-from-upstream.yml +++ b/.github/workflows/sync.yml @@ -1,24 +1,70 @@ -name: Open PR and try auto-merge upstream master +name: Repository Sync on: + push: + branches: + - master repository_dispatch: - types: [upstream-master-push] + types: + - upstream-master-push workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -concurrency: - group: sync-upstream-master-pr - cancel-in-progress: false + inputs: + operation: + description: Synchronization operation to run + required: true + default: all + type: choice + options: + - all + - upstream + - cnb + +permissions: {} jobs: - sync-pr-and-auto-merge: - if: github.repository == 'Kiramei/baas-dev' - + notify-fork: + name: Notify fork + if: github.event_name == 'push' && github.repository == 'pur1fying/blue_archive_auto_script' runs-on: ubuntu-latest + steps: + - name: Trigger fork sync PR + env: + GH_TOKEN: ${{ secrets.UPSTREAM_TO_KIRAMEI_DEV_PAT }} + EXPECTED_REPOSITORY: pur1fying/blue_archive_auto_script + FORK_REPO: Kiramei/baas-dev + EVENT_TYPE: upstream-master-push + run: | + set -euo pipefail + if [ "${GITHUB_REPOSITORY}" != "${EXPECTED_REPOSITORY}" ]; then + echo "This workflow is intended to run only in ${EXPECTED_REPOSITORY}." + echo "Current repository: ${GITHUB_REPOSITORY}" + exit 0 + fi + + gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "/repos/${FORK_REPO}/dispatches" \ + -f event_type="${EVENT_TYPE}" \ + -F client_payload[upstream_sha]="${GITHUB_SHA}" \ + -F client_payload[upstream_ref]="${GITHUB_REF_NAME}" + + sync-upstream: + name: Sync upstream through PR + if: >- + github.repository == 'Kiramei/baas-dev' && + (github.event_name == 'repository_dispatch' || + (github.event_name == 'workflow_dispatch' && + (inputs.operation == 'all' || inputs.operation == 'upstream'))) + permissions: + contents: write + pull-requests: write + concurrency: + group: sync-upstream-master-pr + cancel-in-progress: false + runs-on: ubuntu-latest steps: - name: Checkout fork uses: actions/checkout@v4 @@ -84,7 +130,6 @@ jobs: --head "${SYNC_BRANCH}" \ --title "Sync upstream master" \ --body "Automated PR to sync changes from pur1fying/blue_archive_auto_script:master into Kiramei/baas-dev:master.")" - echo "Created sync PR: ${pr_url}" fi @@ -96,7 +141,6 @@ jobs: --merge \ --auto \ --delete-branch - merge_status=$? set -e else @@ -106,7 +150,6 @@ jobs: --repo "${GITHUB_REPOSITORY}" \ --merge \ --delete-branch - merge_status=$? set -e fi @@ -115,8 +158,37 @@ jobs: echo "PR auto-merge enabled or merged directly: ${pr_url}" else echo "Merge failed. Leaving PR open: ${pr_url}" - gh pr comment "${pr_url}" \ --repo "${GITHUB_REPOSITORY}" \ --body "Merge failed. Please review manually. Possible causes: conflicts, failing required checks, branch protection, or insufficient token permissions." || true fi + + sync-cnb: + name: Sync to CNB + if: >- + (github.event_name == 'push' || + (github.event_name == 'workflow_dispatch' && + (inputs.operation == 'all' || inputs.operation == 'cnb'))) && + (github.repository == 'Kiramei/baas-dev' || + github.repository == 'pur1fying/blue_archive_auto_script') + permissions: + contents: read + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Sync Dev + if: github.repository == 'Kiramei/baas-dev' + uses: ./.github/actions/sync-to-cnb + with: + target-url: https://cnb.cool/kiramei/baas-dev.git + password: ${{ secrets.CNB_SYNC_TOKEN }} + + - name: Sync Stable + if: github.repository == 'pur1fying/blue_archive_auto_script' + uses: ./.github/actions/sync-to-cnb + with: + target-url: https://cnb.cool/pur1fying/blue_archive_auto_script.git + password: ${{ secrets.CNB_SYNC_TOKEN }} diff --git a/scripts/tests/pipe_live_smoke.py b/tests/service/pipe_live_smoke.py similarity index 100% rename from scripts/tests/pipe_live_smoke.py rename to tests/service/pipe_live_smoke.py

      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 Z2uVmA=+i;lCLjb%v0e}Di literal 0 HcmV?d00001 diff --git a/service/dist/locales/ko.json b/service/dist/locales/ko.json new file mode 100644 index 000000000..7436fbe96 --- /dev/null +++ b/service/dist/locales/ko.json @@ -0,0 +1,449 @@ +{ + "appTitle": "BAAS", + "home": "홈", + "scheduler": "스케줄러", + "configuration": "구성", + "settings": "설정", + "updates": "업데이트", + "start": "시작", + "stop": "정지", + "edit": "편집", + "runningTask": "실행 중인 작업", + "noTaskRunning": "현재 실행 중인 작업이 없습니다", + "taskQueue": "작업 대기열", + "noTasksQueued": "대기열에 작업이 없습니다", + "logs": "로그", + "assets": "자산", + "lastUpdated": "마지막 업데이트", + "secondsAgo": "{{count}}초 전", + "minutesAgo": "{{count}}분 전", + "hoursAgo": "{{count}}시간 전", + "daysAgo": "{{count}}일 전", + "configProfile": "프로필: {{name}}", + "addProfile": "프로필 추가", + "switch.on": "켜짐", + "switch.off": "꺼짐", + "confirm": "확인", + "cancel": "취소", + "save": "저장", + "settingsSaved": "설정이 저장되었습니다!", + "featureSettings": "기능 설정", + "cafe": "카페", + "cafeDesc": "카페 초대 및 보상 관리", + "schedule": "스케쥴", + "scheduleDesc": "일일 스케쥴 설정", + "shop": "상점 구매", + "shopDesc": "아이템 구매 우선순위 설정", + "arena": "전술 대항전", + "arenaDesc": "전술 대항전 전투 자동화", + "generalSettings": "일반 설정", + "server": "서버", + "serverDesc": "게임 서버 및 연결 설정", + "emulator": "에뮬레이터", + "emulatorDesc": "에뮬레이터 경로 및 시작 옵션", + "push": "푸시 알림", + "pushDesc": "푸시 알림 설정", + "other": "기타", + "otherDesc": "기타 기능 및 설정", + "taskOverview": "작업 개요", + "uiSettings": "UI 설정", + "theme": "테마", + "light": "라이트", + "dark": "다크", + "system": "시스템 설정 따름", + "language": "언어", + "english": "English", + "chinese": "简体中文", + "japanese": "日本語", + "korean": "한국어", + "russian": "Русский", + "french": "Français", + "deutsch": "Deutsch", + "cafe.useInvitation": "초대권 사용", + "cafe.patRounds": "쓰다듬기 횟수", + "cafe.patRoundsDesc": "횟수가 높을수록 놓칠 확률이 줄어듭니다", + "server.server": "게임 서버", + "server.cn.official": "중국 공식 서버", + "server.cn.bilibili": "빌리빌리 서버", + "server.global": "글로벌 서버", + "server.global.teen": "글로벌 서버 (Teen)", + "server.kr.one": "한국 ONE store 서버", + "server.jp": "일본 서버", + "server.adbIP": "ADB IP 주소", + "server.adbPort": "ADB 포트", + "comingSoon.title": "출시 예정", + "comingSoon.desc": "이 기능에 대한 설정은 아직 구현되지 않았습니다.", + "schedule.title": "일일 작업 스케줄", + "schedule.desc": "자동으로 실행할 일일 작업을 선택하세요.", + "schedule.cafe": "카페 상호작용", + "schedule.lessons": "스케쥴", + "schedule.bounty": "현상수배", + "schedule.commissions": "학원 교류회", + "schedule.shop": "상점 구매", + "shop.title": "상점 구매 설정", + "shop.buyAp": "청휘석으로 AP 구매", + "shop.buyApDesc": "AP가 부족할 때 자동으로 구매합니다.", + "shop.refreshAp": "청휘석으로 AP 충전", + "shop.refreshApDesc": "청휘석을 사용하여 AP를 충전할 수 있습니다.", + "arena.title": "전술 대항전 자동화", + "arena.enable": "전술 대항전 자동화 활성화", + "arena.enableDesc": "전술 대항전에서 상대를 자동으로 도전합니다.", + "arena.attempts": "일일 도전 횟수", + "emulator.title": "에뮬레이터 설정", + "emulator.autoStart": "에뮬레이터 자동 시작", + "emulator.autoStartDesc": "에뮬레이터가 실행 중이 아니면 스크립트가 시작을 시도합니다.", + "emulator.path": "에뮬레이터 경로", + "emulator.pathDesc": "에뮬레이터 실행 파일의 전체 경로를 제공하세요.", + "push.title": "푸시 알림 설정", + "push.enable": "푸시 알림 활성화", + "push.enableDesc": "작업 완료 또는 문제 발생 시 알림을 보냅니다.", + "push.webhookUrl": "웹훅 URL", + "push.webhookUrlPlaceholder": "웹훅 URL을 입력하세요 (예: Bark, ServerChan)", + "other.title": "기타 설정", + "other.screenshotOnError": "오류 발생 시 스크린샷", + "other.screenshotOnErrorDesc": "스크립트에서 오류가 발생하면 자동으로 스크린샷을 찍습니다.", + "property.ap": "AP", + "property.credits": "크레딧", + "property.pyroxene": "청휘석", + "property.coin.arena": "대항전 코인", + "property.coin.commission": "교류회 코인", + "property.keystone": "기동석", + "property.keystone.piece": "조각", + "property.pass": "패스", + "log.scroll": "맨 아래로 스크롤", + "log.scroll.detail": "로그 텍스트 상자를 맨 아래로 스크롤합니다", + "assetsDisplay.detail": "자산 세부 정보 표시", + "hotkeys": "단축키", + "Invalid hotkey format": "잘못된 단축키 형식", + "Duplicated hotkey": "중복된 단축키", + "Use combinations like": "다음과 같은 조합을 사용하세요", + "Leave empty to unbind": "비워두면 바인딩 해제", + "Please fix invalid or duplicated hotkeys.": "잘못되었거나 중복된 단축키를 수정하세요.", + "hotkey.switch.start": "시작/정지", + "hotkey.toggle.scroll": "맨 아래로 스크롤 토글", + "hotkey.open.settings": "설정 열기", + "hotkey.clear.logs": "로그 지우기", + "hotkey.focus.search": "검색에 초점", + "hotkey.help.about": "도움말 / 정보", + "Search hotkeys": "단축키 검색", + "student.search": "학생 검색", + "log.export": "로그 내보내기", + "nextTask": "다음 작업", + "rename": "이름 바꾸기", + "delete": "삭제", + "editProfile": "프로필 편집", + "profileName": "프로필 이름", + "createProfile": "프로필 생성", + "creditpoints": "크레딧 포인트", + "pyroxene": "청휘석", + "confirmDeleteTitle": "삭제 확인", + "confirmDeleteMessage": "프로필 '{{name}}'을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다!", + "ui.zoom": "UI 확대/축소 설정", + "commonShop.title": "일반 상점", + "tacticalShop.title": "전술 대항전 상점", + "commonShop.refreshTimes": "상점 새로고침 횟수", + "commonShop.refreshDesc": "자동으로 상점 새로고침", + "add": "추가", + "Add Student": "학생 추가", + "placeholder.config.insert": "여기에 구성을 입력하세요", + "placeholder.stage": "학생 선택", + "stage.normalLabel": "일반 임무 일일 소탕", + "stage.hardLabel": "하드 임무 일일 소탕", + "dailySweep": "일일", + "dailySweepDesc": "일일 임무 및 소탕 설정", + "placeholder.nobinding": "바인딩 없음", + "tactical": "총력전", + "tacticalDesc": "총력전 설정", + "drill": "합동 화력 시험", + "drillDesc": "합동 화력 시험 설정", + "artifact": "제조", + "artifactDesc": "제조 설정", + "whitelist": "친구 화이트리스트", + "whitelistDesc": "친구 자동 삭제 시 화이트리스트", + "script": "스크립트 설정", + "scriptDesc": "스크립트 실행 관련 설정", + "stage": "임무 클리어", + "stageDesc": "임무 자동 클리어를 도와줍니다", + "team": "편성", + "teamDesc": "부대 편성을 설정합니다", + "eventName.restart": "오전 4시에 재시작", + "eventName.arena": "전술 대항전", + "eventName.cafe_reward": "카페", + "eventName.no1_cafe_invite": "1호점 카페 초대", + "eventName.no2_cafe_invite": "2호점 카페 초대", + "eventName.lesson": "스케쥴", + "eventName.group": "서클 AP 수령", + "eventName.collect_daily_free_power": "무료 AP 수령", + "eventName.mail": "우편함 확인", + "eventName.collect_daily_power": "일일 AP 수령", + "eventName.common_shop": "상점 구매", + "eventName.tactical_challenge_shop": "전술 대항전 상점 구매", + "eventName.rewarded_task": "현상수배", + "eventName.normal_task": "일반 임무 AP 소모", + "eventName.hard_task": "하드 임무 AP 소모", + "eventName.scrimmage": "학원 교류회", + "eventName.clear_special_task_power": "특별의뢰", + "eventName.create": "자동 제조", + "eventName.total_assault": "총력전", + "eventName.activity_sweep": "이벤트 소탕", + "eventName.collect_reward": "보상 수령", + "eventName.momo_talk": "자동 모모톡", + "eventName.dailyGameActivity": "일일 미니게임", + "eventName.friend": "친구 정리", + "eventName.joint_firing_drill": "합동 화력 시험", + "eventName.pass": "패스 보상 수령", + "scheduler.inactiveTasks": "비활성 작업", + "scheduler.activeTasks": "활성 작업", + "scheduler.search": "작업 검색", + "scheduler.sortDefault": "기본 정렬", + "scheduler.sortByTime": "시간순 정렬", + "scheduler.detailConfig": "작업 상세 스케줄 설정", + "scheduler.eventName": "작업 이름", + "scheduler.nextTick": "다음 실행 시간", + "scheduler.priority": "우선순위", + "scheduler.interval": "간격 (초)", + "scheduler.dailyReset": "일일 초기화 시간", + "scheduler.disabledRange": "비활성화 시간대", + "scheduler.preTask": "선행 작업", + "scheduler.postTask": "후행 작업", + "common.confirm": "확인", + "scheduler.selector": "작업 선택기", + "cafe.basicSettings": "카페 기본 설정", + "cafe.cafe1Settings": "1호점 카페 설정", + "cafe.cafe2Settings": "2호점 카페 설정", + "cafe.collectReward": "보상 수령", + "cafe.exchangeStudent": "학생 의상 변경", + "cafe.duplicateInvite": "중복 초대", + "cafe.hasNo2Cafe": "2호점 카페", + "cafe.patStyle": "쓰다듬기 스타일", + "cafe.patStyleDragGift": "선물 드래그", + "cafe.invite1Mode": "초대 모드", + "cafe.invite2Mode": "초대 모드", + "cafe.lowestAffection": "가장 낮은 호감도 순", + "cafe.highestAffection": "가장 높은 호감도 순", + "cafe.starred": "즐겨찾기 학생 순", + "cafe.byName": "학생 이름 순", + "cafe.starredPosition": "즐겨찾기 학생 위치", + "cafe.cafe1Students": "학생 이름 목록", + "cafe.cafe2Students": "학생 이름 목록", + "lesson.enableFavorStudent": "즐겨찾기 학생 우선", + "lesson.relationshipFirst": "호감도 높은 학생 우선", + "lesson.region": "스케쥴 지역", + "lesson.favorStudent": "즐겨찾기 학생", + "artifact.global": "전역 설정", + "artifact.phase_1": "1단계", + "artifact.phase_2": "2단계", + "artifact.phase_3": "3단계", + "artifact.useTicketDesc": "제조 티켓 사용", + "artifact.createTime": "제조 횟수", + "artifact.phaseCount": "제조 단계", + "artifact.materialSelect": "재료 선택", + "artifact.phase2.recommend": "학생 기반 추천", + "artifact.selectStudent": "학생 선택", + "artifact.priority": "우선순위", + "artifact.default": "기본값", + "artifact.white": "흰색", + "artifact.blue": "파란색", + "artifact.whiteBlue": "흰색/파란색", + "artifact.gold": "금색", + "artifact.purple": "보라색", + "artifact.goldPurple": "금색/보라색", + "artifact.all": "모두", + "artifact.saved": "설정이 저장되었습니다", + "artifact.savedDesc": "제조 설정이 저장되었습니다.", + "arena.higherLevel": "상대방이 당신보다 높은 레벨", + "arena.max_refresh_times": "최대 새로고침 횟수", + "arena.opponent_no": "상대 번호", + "stage.dailyTab": "임무 소탕", + "stage.sweepTab": "소탕 세부 정보", + "sweep.rewarded": "현상수배 소탕 횟수", + "sweep.scrimmage": "학원 교류회 소탕 횟수", + "sweep.activityNumber": "이벤트 스테이지 소탕 스테이지", + "sweep.activityTimes": "이벤트 스테이지 소탕 횟수", + "sweep.special": "특별의뢰 소탕 횟수", + "sweep.purchaseRewarded": "현상수배 티켓 구매 횟수", + "sweep.purchaseLesson": "스케쥴 티켓 구매 횟수", + "sweep.purchaseScrimmage": "학원 교류회 티켓 구매 횟수", + "stage.normalDesc": "일반 임무 및 횟수 (예: \"1-1-1,1-2-3\"은 1-1 임무 1회, 그 다음 1-2 임무 3회)", + "stage.hardDesc": "하드 임무 설정도 위와 같습니다. 참고: 최대 3회, 쉼표는 영문 쉼표 사용. 일본/글로벌 서버는 'max' 입력 가능.", + "stage.selectStudent": "학생 선택", + "tactical.hardLevel": "총력전 난이도", + "drill.out_partyNo": "부대 번호", + "drill.difficulty": "시험 난이도", + "drill.useAllAfterSweep": "출격 후 모든 시험 티켓 사용", + "friend.placeholder": "친구 코드 입력", + "friend.add": "추가", + "friend.empty": "친구 화이트리스트가 비어 있습니다", + "friend.addFailed": "추가 실패", + "friend.alreadyExists": "친구가 이미 존재합니다", + "friend.addedSuccess": "성공적으로 추가되었습니다", + "friend.added": "추가된 친구:", + "friend.deletedSuccess": "성공적으로 삭제되었습니다", + "friend.deleted": "삭제된 친구:", + "friend.invalidLength": "잘못된 친구 코드 길이", + "adb.title": "ADB 감지 패널", + "adb.detectBtn": "ADB 감지", + "adb.detecting": "ADB 감지 중...", + "adb.noData": "ADB 데이터 없음", + "script.screenshotInterval": "스크린샷 간격 (초)", + "script.autostart": "스크립트 실행 시 자동 시작", + "script.screenshotMethod": "스크린샷 방식", + "script.controlMethod": "제어 방식", + "script.then": "작업 완료 후 작업", + "script.doNothing": "아무것도 안 함", + "script.exitBaas": "블루 아카이브 종료", + "script.exitEmu": "에뮬레이터 종료", + "script.exitBoth": "블루 아카이브 및 에뮬레이터 종료", + "script.shutdown": "컴퓨터 종료", + "emulator.openOnLaunch": "스크립트 실행 시 에뮬레이터 열기", + "emulator.multiInstance": "에뮬레이터 멀티 인스턴스", + "emulator.waitTime": "에뮬레이터 시작 대기 시간 (초)", + "emulator.multiType": "에뮬레이터 종류", + "emulator.instanceCount": "멀티 인스턴스 에뮬레이터 번호", + "emulator.address": "에뮬레이터 경로", + "choose": "선택", + "execute": "실행", + "stage.exploreTab": "메인 스토리", + "stage.eventTab": "이벤트 스테이지", + "stage.manualBoss": "수동 보스전", + "stage.normalTask": "일반 임무", + "stage.hardTask": "하드 임무", + "stage.currentEvent": "현재 이벤트", + "stage.story": "스토리 임무 클리어", + "stage.mission": "미션 임무 클리어", + "stage.challenge": "챌린지 임무 클리어", + "stage.attrTable": "스테이지 속성 참조표", + "stage.noEvent": "현재 이벤트 없음", + "team.chooseMethod": "편성 방식", + "push.afterError": "오류 발생 후 푸시", + "push.afterCompletion": "모든 작업 완료 후 푸시", + "push.json": "JSON 푸시", + "push.serverchan": "ServerChan 푸시", + "other.fhx": "원클릭 검열 해제", + "other.fhxDesc": "검열 해제를 시도합니다 (중국 서버 전용)", + "versionInfo": "버전 정보", + "localVersion": "현재 버전", + "remoteVersion": "최신 버전", + "updateMethod": "작업", + "globalUpdateSettings": "업데이트 설정", + "updateChannel": "업데이트 채널", + "mirrorCdk": "MirrorC CDK (선택 사항)", + "mirror.verify": "CDK 확인", + "mirror.verifying": "확인 중", + "mc.verify.success": "MirrorC CDK 확인 성공!", + "mc.verify.error": "MirrorC CDK 확인 오류!", + "enterCdk": "CDK 입력", + "shaConnectivityTest": "SHA 검색 방법", + "shaTest.method": "방법", + "shaTest.status": "상태", + "shaTest.time": "소요 시간", + "shaTest.sha": "SHA 값", + "shaTest.testing": "SHA 테스트 중...", + "shaTest.testAll": "모든 방법 테스트", + "configAdd.nameRequired": "프로필 이름은 비워둘 수 없습니다", + "configAdd.serverRequired": "서버를 지정해야 합니다", + "configAdd.nameDuplicate": "프로필 이름이 이미 존재합니다", + "configAdd.selectServer": "서버를 선택하세요", + "create": "생성", + "settings.updateSuccess": "설정이 성공적으로 업데이트되었습니다", + "settings.updateSuccessDesc": "설정이 성공적으로 업데이트되었습니다.", + "stage.story.main": "메인 스토리 진행", + "stage.story.group": "서클 스토리 진행", + "stage.story.mini": "미니 스토리 진행", + "stage.taskTriggerStart": "작업이 할당되었습니다", + "stage.taskTriggered": "할당된 작업: {{task}}", + "stage.noHardTask": "하드 임무가 설정되지 않았습니다!", + "stage.noNormalTask": "일반 임무가 설정되지 않았습니다!", + "start_hard_task": "하드 임무 시작", + "start_normal_task": "일반 임무 시작", + "start_fhx": "검열 해제 적용", + "start_main_story": "메인 스토리 시작", + "start_group_story": "서클 스토리 시작", + "start_mini_story": "미니 스토리 시작", + "start_explore_activity_story": "이벤트 스토리 시작", + "start_explore_activity_mission": "이벤트 임무 시작", + "start_explore_activity_challenge": "이벤트 챌린지 시작", + "main_story": "메인 스토리 진행", + "group_story": "서클 스토리 진행", + "mini_story": "미니 스토리 진행", + "explore_activity_story": "이벤트 스토리 진행", + "explore_activity_mission": "이벤트 임무 진행", + "explore_activity_challenge": "이벤트 챌린지 진행", + "de_clothes": "검열 해제", + "explore_hard_task": "하드 임무 진행", + "explore_normal_task": "일반 임무 진행", + "title.updateSetting": "업데이트", + "shaMethod.github": "GitHub API", + "shaMethod.mirrorc": "MirrorC 무료 API", + "shaMethod.gitee": "Gitee 리포지토리", + "shaMethod.gitcode": "GitCode 리포지토리", + "shaMethod.tencent_c_coding": "Tencent Cloud Coding 리포지토리", + "cdk.noCDKInput": "MirrorC CDK를 입력하세요!", + "CDK invalid.": "CDK가 유효하지 않습니다.", + "CDK valid.": "CDK가 유효합니다.", + "Please confirm that you have entered the correct cdkey": "올바른 CDK를 입력했는지 확인하세요", + "CDK valid. Expires at {}": "이 CDK는 {{expire_date}}까지 유효합니다.", + "CDK expired.": "CDK가 만료되었습니다.", + "CDK quota exhausted for today.": "CDK가 오늘 만료됩니다.", + "CDK mismatched for requested resource.": "CDK가 요청된 리포지토리와 일치하지 않습니다.", + "CDK blocked.": "CDK가 관리자에 의해 차단되었습니다.", + "CDK Test OK": "CDK 확인 성공", + "version.fetching": "가져오는 중...", + "version.untested": "테스트 안 됨", + "version.testing": "테스트 중...", + "version.tapToTest": "업데이트 확인", + "version.checkError": "버전 정보를 가져오는 데 실패했습니다", + "heartbeat.connected": "서비스에 연결되었습니다", + "heartbeat.connecting": "서비스에 연결 중...", + "updateMethod.github": "GitHub (메인 리포지토리)", + "updateMethod.gitee": "Gitee (중국 미러)", + "updateMethod.gitcode": "GitCode (중국 미러)", + "updateMethod.tencent": "Tencent Cloud Coding (중국 미러)", + "updateMethod.mirrorc": "MirrorC 업데이트", + "update.dueDate": "만료일", + "placeholder.profileName": "여기에 프로필 이름을 입력하세요", + "update.available": "새 버전 사용 가능", + "property.burst": "폭발", + "property.pierce": "관통", + "property.mystic": "신비", + "property.shock": "진동", + "property.Unused": "미사용", + "team.preset": "사전 설정된 편성", + "team.side": "사이드바 속성별", + "team.order": "사이드바 순서별", + "schedule.primary": "초급", + "schedule.normal": "보통", + "schedule.advanced": "상급", + "schedule.superior": "최상급", + "lesson.times": "스케쥴 횟수", + "confirmUpdateTitle": "업데이트 확인", + "updatePrompt": "새로운 버전이 감지되었습니다. 지금 업데이트하시겠습니까?", + "updateNotice": "업데이트 전에 실행 중인 모든 작업을 중지하세요.", + "title.wiki": "문서", + "wiki": { + "title": "위키 문서", + "subtitle": "BAAS 자동화 플랫폼을 위한 표준화된 가이드 및 운영 매뉴얼.", + "searchPlaceholder": "주제, 키워드 또는 태그로 검색...", + "clearSearch": "검색 지우기", + "resultsCount": "{{count}}개의 문서가 있습니다", + "noResults": "현재 필터 기준과 일치하는 문서가 없습니다.", + "selectDocument": "왼쪽에서 문서를 선택하여 내용을 확인하세요.", + "category": { + "all": "모두", + "architecture": "아키텍처", + "getting-started": "시작하기", + "environment": "환경 설정", + "configuration": "구성 관리", + "operations": "운영", + "support": "지원 및 피드백", + "formation": "편성 전략" + } + }, + "enterSecretTitle": "공개 키 입력", + "enterSecretPrompt": "공개 키는 통신 보안을 위해 필요합니다.", + "secretLabel": "공개 키", + "secretPlaceholder": "여기에 공개 키를 입력하세요", + "secretRequired": "공개 키를 반드시 입력해야 합니다!", + "secretNotice": "공개 키는 서버 백엔드의 service.secret 파일에서 가져올 수 있습니다.", + "Confirm": "확인" +} \ No newline at end of file diff --git a/service/dist/locales/ko.json.br b/service/dist/locales/ko.json.br new file mode 100644 index 0000000000000000000000000000000000000000..fbd948ac0b1f73d6c8034d59f99f22923ac8f191 GIT binary patch literal 5895 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 da*u_Lf39a>a|9D){3z{h%?*t+eA5)awR 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 S6yP;s4CQ;AL|60qUwRYtqxkv& literal 0 HcmV?d00001 diff --git a/service/dist/locales/zh.json b/service/dist/locales/zh.json new file mode 100644 index 000000000..39463b594 --- /dev/null +++ b/service/dist/locales/zh.json @@ -0,0 +1,454 @@ +{ + "appTitle": "蔚蓝档案自动脚本", + "home": "主页", + "scheduler": "调度", + "configuration": "配置", + "settings": "设置", + "updates": "更新", + "start": "启动", + "stop": "停止", + "edit": "编辑", + "runningTask": "执行中任务", + "noTaskRunning": "暂无正在执行的任务", + "taskQueue": "任务队列", + "noTasksQueued": "队列中暂无任务", + "logs": "日志", + "assets": "资产", + "lastUpdated": "上次更新", + "secondsAgo": "{{count}}秒前", + "minutesAgo": "{{count}}分钟前", + "hoursAgo": "{{count}}小时前", + "daysAgo": "{{count}}天前", + "configProfile": "配置: {{name}}", + "addProfile": "新增配置", + "switch.on": "开", + "switch.off": "关", + "confirm": "确定", + "cancel": "取消", + "save": "保存", + "settingsSaved": "设置已保存!", + "featureSettings": "功能设置", + "cafe": "咖啡厅", + "cafeDesc": "管理咖啡厅邀请与奖励", + "schedule": "日程", + "scheduleDesc": "配置每日日程", + "shop": "商店购买", + "shopDesc": "设置物品购买优先级", + "arena": "竞技场", + "arenaDesc": "自动进行竞技场战斗", + "generalSettings": "通用设置", + "server": "服务器", + "serverDesc": "游戏服务器与连接设置", + "emulator": "模拟器", + "emulatorDesc": "模拟器路径与启动项", + "push": "推送通知", + "pushDesc": "配置消息推送", + "other": "其他", + "otherDesc": "杂项功能与设置", + "taskOverview": "任务概览", + "uiSettings": "界面设置", + "theme": "主题", + "light": "浅色", + "dark": "深色", + "system": "跟随系统", + "language": "语言", + "english": "English", + "chinese": "简体中文", + "japanese": "日本語", + "korean": "한국어", + "russian": "Русский", + "french": "Français", + "deutsch": "Deutsch", + "cafe.useInvitation": "使用邀请券", + "cafe.patRounds": "摸头轮数", + "cafe.patRoundsDesc": "轮数越高越不容易漏摸", + "server.server": "游戏服务器", + "server.cn.official": "官服", + "server.cn.bilibili": "B服", + "server.global": "国际服", + "server.global.teen": "国际服青少年", + "server.kr.one": "韩国ONE", + "server.jp": "日服", + "server.adbIP": "ADB IP地址", + "server.adbPort": "ADB 端口", + "comingSoon.title": "即将推出", + "comingSoon.desc": "此功能的配置尚未实现。", + "schedule.title": "每日任务日程", + "schedule.desc": "选择要自动执行的日常任务。", + "schedule.cafe": "咖啡厅互动", + "schedule.lessons": "课程表", + "schedule.bounty": "悬赏通缉", + "schedule.commissions": "学园交流会", + "schedule.shop": "商店购买", + "shop.title": "商店购买设置", + "shop.buyAp": "使用青辉石购买体力", + "shop.buyApDesc": "当体力不足时自动购买。", + "shop.refreshAp": "使用青辉石刷新体力", + "shop.refreshApDesc": "允许花费青辉石刷新体力。", + "arena.title": "竞技场自动化", + "arena.enable": "启用竞技场自动化", + "arena.enableDesc": "自动挑战竞技场中的对手。", + "arena.attempts": "每日挑战次数", + "emulator.title": "模拟器设置", + "emulator.autoStart": "自动启动模拟器", + "emulator.autoStartDesc": "如果模拟器未运行,脚本将尝试启动它。", + "emulator.path": "模拟器路径", + "emulator.pathDesc": "提供模拟器可执行文件的完整路径。", + "push.title": "推送通知设置", + "push.enable": "启用推送通知", + "push.enableDesc": "任务完成或出现问题时发送通知。", + "push.webhookUrl": "Webhook URL", + "push.webhookUrlPlaceholder": "输入您的 Webhook URL (例如 Bark, ServerChan)", + "other.title": "其他设置", + "other.screenshotOnError": "出错时截图", + "other.screenshotOnErrorDesc": "脚本遇到错误时自动进行截图。", + "property.ap": "体力", + "property.credits": "信用点", + "property.pyroxene": "青辉石", + "property.coin.arena": "竞技币", + "property.coin.commission": "委托币", + "property.keystone": "拱心石", + "property.keystone.piece": "碎片", + "property.pass": "通行证", + "log.scroll": "滑动到底部", + "log.scroll.detail": "日志文本框滑动到底部", + "assetsDisplay.detail": "显示资产详细信息", + "hotkeys": "快捷键", + "Invalid hotkey format": "快捷键格式无效", + "Duplicated hotkey": "快捷键重复", + "Use combinations like": "请使用类似的组合键,例如", + "Leave empty to unbind": "留空表示不绑定", + "Please fix invalid or duplicated hotkeys.": "请修复无效或重复的快捷键。", + "hotkey.switch.start": "开始/停止", + "hotkey.toggle.scroll": "切换滚动到底部", + "hotkey.open.settings": "打开设置", + "hotkey.clear.logs": "清空日志", + "hotkey.focus.search": "聚焦搜索", + "hotkey.help.about": "帮助 / 关于", + "Search hotkeys": "搜索快捷键", + "student.search": "搜索学生", + "log.export": "导出日志", + "nextTask": "下一个任务", + "rename": "重命名", + "delete": "删除", + "editProfile": "编辑配置", + "profileName": "配置名", + "createProfile": "新增配置", + "creditpoints": "信用点", + "pyroxene": "青辉石", + "confirmDeleteTitle": "删除确认", + "confirmDeleteMessage": "确认删除配置“{{name}}”?该操作不可撤销!", + "ui.zoom": "UI 缩放设置", + "commonShop.title": "普通商店", + "tacticalShop.title": "竞技场商店", + "commonShop.refreshTimes": "商店刷新次数", + "commonShop.refreshDesc": "自动刷新商店", + "add": "添加", + "Add Student": "添加学生", + "placeholder.config.insert": "请于此键入您的配置", + "placeholder.stage": "选择学生", + "stage.normalLabel": "普通图每日扫荡", + "stage.hardLabel": "困难图每日扫荡", + "dailySweep": "日常", + "dailySweepDesc": "日常推图及扫荡设置", + "placeholder.nobinding": "无绑定", + "tactical": "总力战", + "tacticalDesc": "总力战设置", + "drill": "战术综合测试", + "drillDesc": "战术综合测试设置", + "artifact": "制造", + "artifactDesc": "制造设置", + "whitelist": "好友白名单", + "whitelistDesc": "自动删好友时白名单", + "script": "脚本设置", + "scriptDesc": "脚本运行相关设置", + "stage": "推图", + "stageDesc": "帮你自动推图", + "team": "编队", + "teamDesc": "设置您的编队", + "eventName.restart": "凌晨四点重启", + "eventName.arena": "竞技场", + "eventName.cafe_reward": "咖啡厅", + "eventName.no1_cafe_invite": "1号咖啡厅邀请", + "eventName.no2_cafe_invite": "2号咖啡厅邀请", + "eventName.lesson": "日程", + "eventName.group": "收集小组体力", + "eventName.collect_daily_free_power": "收集免费购买体力", + "eventName.mail": "查收邮箱", + "eventName.collect_daily_power": "收集每日体力", + "eventName.common_shop": "商店购买", + "eventName.tactical_challenge_shop": "竞技场商店购买", + "eventName.rewarded_task": "悬赏通缉", + "eventName.normal_task": "普通关清体力", + "eventName.hard_task": "困难关清体力", + "eventName.scrimmage": "学院交流会", + "eventName.clear_special_task_power": "每日特别委托", + "eventName.create": "自动制造", + "eventName.total_assault": "总力战", + "eventName.activity_sweep": "活动扫荡", + "eventName.collect_reward": "收集奖励", + "eventName.momo_talk": "自动MomoTalk", + "eventName.dailyGameActivity": "日常小游戏", + "eventName.friend": "清理好友", + "eventName.joint_firing_drill": "综合战术测试", + "eventName.pass": "领取pass奖励", + "scheduler.inactiveTasks": "未启用的任务", + "scheduler.activeTasks": "启用的任务", + "scheduler.search": "搜索任务", + "scheduler.sortDefault": "默认排序", + "scheduler.sortByTime": "按时间排序", + "scheduler.detailConfig": "任务详细调度配置", + "scheduler.eventName": "任务名称", + "scheduler.nextTick": "下次执行时间", + "scheduler.priority": "优先级", + "scheduler.interval": "间隔 (秒)", + "scheduler.dailyReset": "每日重置时间", + "scheduler.disabledRange": "禁用时间段", + "scheduler.preTask": "前置任务", + "scheduler.postTask": "后置任务", + "common.confirm": "确认", + "scheduler.selector": "任务选择器", + "cafe.basicSettings": "咖啡厅基础设置", + "cafe.cafe1Settings": "咖啡厅1设置", + "cafe.cafe2Settings": "咖啡厅2设置", + "cafe.collectReward": "收集奖励", + "cafe.exchangeStudent": "学生更换服饰", + "cafe.duplicateInvite": "重复邀请", + "cafe.hasNo2Cafe": "二号咖啡厅", + "cafe.patStyle": "摸头风格", + "cafe.patStyleDragGift": "拖动礼物", + "cafe.invite1Mode": "邀请模式", + "cafe.invite2Mode": "邀请模式", + "cafe.lowestAffection": "按最低好感度", + "cafe.highestAffection": "按最高好感度", + "cafe.starred": "按收藏的学生", + "cafe.byName": "按学生的名字", + "cafe.starredPosition": "收藏学生位置", + "cafe.cafe1Students": "学生姓名列表", + "cafe.cafe2Students": "学生姓名列表", + "lesson.enableFavorStudent": "优先选择收藏的学生", + "lesson.relationshipFirst": "优先选择高好感度学生", + "lesson.region": "日程区域", + "lesson.favorStudent": "收藏的学生", + "artifact.global": "全局设置", + "artifact.phase_1": "第一阶段", + "artifact.phase_2": "第二阶段", + "artifact.phase_3": "第三阶段", + "artifact.useTicketDesc": "使用制造券", + "artifact.createTime": "制造次数", + "artifact.phaseCount": "制造阶数", + "artifact.materialSelect": "材料选择", + "artifact.phase2.recommend": "按照学生进行推荐", + "artifact.selectStudent": "选择学生", + "artifact.priority": "优先级", + "artifact.default": "默认", + "artifact.white": "白色", + "artifact.blue": "蓝色", + "artifact.whiteBlue": "白蓝组合", + "artifact.gold": "金色", + "artifact.purple": "紫色", + "artifact.goldPurple": "金紫组合", + "artifact.all": "全部", + "artifact.saved": "设置已保存", + "artifact.savedDesc": "您的制造设置已保存。", + "arena.higherLevel": "对手高你的级数", + "arena.max_refresh_times": "最大刷新次数", + "arena.opponent_no": "对手编号", + "stage.dailyTab": "地图扫荡", + "stage.sweepTab": "扫荡细节", + "sweep.rewarded": "悬赏通缉扫荡次数", + "sweep.scrimmage": "学院交流会扫荡次数", + "sweep.activityNumber": "活动关卡扫荡关卡", + "sweep.activityTimes": "活动关卡扫荡次数", + "sweep.special": "特殊委托扫荡次数", + "sweep.purchaseRewarded": "悬赏委托扫荡券购买次数", + "sweep.purchaseLesson": "日程券购买次数", + "sweep.purchaseScrimmage": "学院交流会扫荡券购买次数", + "stage.normalDesc": "普通关卡与次数(如\"1-1-1,1-2-3\"表示关卡1-1打一次,然后关卡1-2打三次)", + "stage.hardDesc": "困难关卡设置同上,注意:次数最多为3,逗号均为英文逗号,日服、国际服可填max", + "stage.selectStudent": "选择学生", + "tactical.hardLevel": "总力战难度", + "drill.out_partyNo": "队伍编号", + "drill.difficulty": "测试难度", + "drill.useAllAfterSweep": "出击后使用所有测试挑战券", + "friend.placeholder": "输入好友码", + "friend.add": "添加", + "friend.empty": "好友白名单列表为空", + "friend.addFailed": "添加失败", + "friend.alreadyExists": "该好友已存在", + "friend.addedSuccess": "添加成功", + "friend.added": "已添加好友:", + "friend.deletedSuccess": "删除成功", + "friend.deleted": "已删除好友:", + "friend.invalidLength": "好友码长度无效", + "adb.title": "ADB 检测面板", + "adb.detectBtn": "检测 ADB", + "adb.detecting": "正在检测 ADB...", + "adb.noData": "暂无 ADB 数据", + "script.screenshotInterval": "截图间隔 (秒)", + "script.autostart": "脚本开启时自动启动", + "script.screenshotMethod": "截图方式", + "script.controlMethod": "控制方式", + "script.then": "任务完成后操作", + "script.doNothing": "不做任何操作", + "script.exitBaas": "退出 Baas", + "script.exitEmu": "退出模拟器", + "script.exitBoth": "退出 Baas 和模拟器", + "script.shutdown": "关闭电脑", + "emulator.openOnLaunch": "启动脚本时打开模拟器", + "emulator.multiInstance": "模拟器多开", + "emulator.waitTime": "等待模拟器启动时间 (秒)", + "emulator.multiType": "模拟器类型", + "emulator.instanceCount": "多开模拟器编号", + "emulator.address": "模拟器路径", + "choose": "选择", + "execute": "执行", + "stage.exploreTab": "主线关卡", + "stage.eventTab": "活动关卡", + "stage.manualBoss": "手动打Boss", + "stage.normalTask": "普通关卡", + "stage.hardTask": "困难关卡", + "stage.currentEvent": "当前活动", + "stage.story": "推剧情关卡", + "stage.mission": "推任务关卡", + "stage.challenge": "推挑战关卡", + "stage.attrTable": "关卡参考属性表", + "stage.noEvent": "暂无活动", + "team.chooseMethod": "编队方式", + "push.afterError": "发生错误后推送", + "push.afterCompletion": "所有任务完成后推送", + "push.json": "JSON 推送", + "push.serverchan": "Server酱 推送", + "other.fhx": "一键反和谐", + "other.fhxDesc": "尝试进行反和谐操作(国区特供)", + "versionInfo": "版本信息", + "localVersion": "当前版本", + "remoteVersion": "最新版本", + "updateMethod": "操作", + "globalUpdateSettings": "更新设置", + "updateChannel": "更新通道", + "mirrorCdk": "Mirror酱的CDK (可选)", + "mirror.verify": "验证CDK", + "mirror.verifying": "验证中", + "mc.verify.success": "Mirror酱CDK验证成功!", + "mc.verify.error": "Mirror酱CDK验证错误!", + "enterCdk": "输入CDK", + "shaConnectivityTest": "SHA获取方式", + "shaTest.method": "方式", + "shaTest.status": "状态", + "shaTest.time": "耗时", + "shaTest.sha": "SHA值", + "shaTest.testing": "SHA 测试中", + "shaTest.testAll": "测试所有方法", + "configAdd.nameRequired": "配置名不能为空", + "configAdd.serverRequired": "需要指定服务器", + "configAdd.nameDuplicate": "配置名已存在", + "configAdd.selectServer": "请选择服务器", + "create": "创建", + "settings.updateSuccess": "设置更新成功", + "settings.updateSuccessDesc": "您的设置已成功更新。", + "stage.story.main": "推主线故事", + "stage.story.group": "推社团故事", + "stage.story.mini": "推小故事", + "stage.taskTriggerStart": "任务已经下发", + "stage.taskTriggered": "下发的任务为: {{task}}", + "stage.noHardTask": "没有设置困难关卡!", + "stage.noNormalTask": "没有设置普通关卡!", + "start_hard_task": "推困难关卡", + "start_normal_task": "推普通关卡", + "start_fhx": "反和谐", + "start_main_story": "推主线故事", + "start_group_story": "推社团故事", + "start_mini_story": "推小故事", + "start_explore_activity_story": "推活动故事", + "start_explore_activity_mission": "推活动任务", + "start_explore_activity_challenge": "推活动挑战", + "main_story": "推主线故事", + "group_story": "推社团故事", + "mini_story": "推小故事", + "explore_activity_story": "推活动故事", + "explore_activity_mission": "推活动任务", + "explore_activity_challenge": "推活动挑战", + "de_clothes": "反和谐", + "explore_hard_task": "推困难关卡", + "explore_normal_task": "推普通关卡", + "title.updateSetting": "更新", + "shaMethod.github": "GitHub API", + "shaMethod.mirrorc": "Mirror酱免费API", + "shaMethod.gitee": "Gitee仓库读取", + "shaMethod.gitcode": "GitCode仓库读取", + "shaMethod.tencent_c_coding": "腾讯工蜂仓库读取", + "cdk.noCDKInput": "请输入Mirror酱CDK!", + "CDK invalid.": "CDK 不合法", + "CDK valid.": "CDK 合法", + "Please confirm that you have entered the correct cdkey": "请确认您输入了正确的 CDK", + "CDK valid. Expires at {}": "该 CDK 有效期至 {{expire_date}}。", + "CDK expired.": "CDK 已过期。", + "CDK quota exhausted for today.": "CDK 将在今日过期。", + "CDK mismatched for requested resource.": "CDK 与所请求仓库不一致。", + "CDK blocked.": "CDK 已经被管理员禁用。", + "CDK Test OK": "CDK 验证成功", + "version.fetching": "获取中...", + "version.untested": "未测试", + "version.testing": "测试中...", + "version.tapToTest": "检查更新", + "version.checkError": "版本获取失败", + "heartbeat.connected": "服务已连接", + "heartbeat.connecting": "服务连接中...", + "updateMethod.github": "GitHub(主仓库)", + "updateMethod.gitee": "Gitee(国内镜像)", + "updateMethod.gitcode": "GitCode(国内镜像)", + "updateMethod.tencent": "腾讯工蜂(国内镜像)", + "updateMethod.mirrorc": "Mirror酱更新", + "update.dueDate": "到期时间", + "placeholder.profileName": "在此输入您的配置名", + "update.available": "发现新版本", + "property.burst": "爆发", + "property.pierce": "贯穿", + "property.mystic": "神秘", + "property.shock": "振动", + "property.Unused": "未使用", + "team.preset": "按预设编队", + "team.side": "按侧栏属性编队", + "team.order": "按侧栏顺序编队", + "schedule.primary": "初级", + "schedule.normal": "普通", + "schedule.advanced": "高级", + "schedule.superior": "特级", + "lesson.times": "日程次数", + "confirmUpdateTitle": "确认更新", + "updatePrompt": "检测到新版本,是否现在更新?", + "updateNotice": "更新前请停止当前运行中的任务。", + "title.wiki": "文档", + "wiki": { + "title": "百科文档", + "subtitle": "面向 BAAS 自动化平台的规范化指南与运维手册。", + "searchPlaceholder": "按主题、关键词或标签搜索…", + "clearSearch": "清空搜索", + "resultsCount": "共 {{count}} 篇文档", + "noResults": "暂无符合当前筛选条件的文档。", + "selectDocument": "请选择左侧的文档以查看正文。", + "category": { + "all": "全部", + "architecture": "架构", + "getting-started": "入门", + "environment": "环境配置", + "configuration": "配置管理", + "operations": "运营操作", + "support": "支持与反馈", + "formation": "编队策略" + } + }, + "enterSecretTitle": "输入公钥", + "enterSecretPrompt": "公钥为通信安全保障所需", + "secretLabel": "公钥", + "secretPlaceholder": "请在此输入公钥", + "secretRequired": "公钥必须输入!", + "secretNotice": "公钥可从服务后端的service.secret文件获取", + "Confirm": "确认", + "export.log.folderSelect": "选择日志导出位置", + "export.log.success": "日志保存成功", + "export.log.successDesc": "日志保存于: {{path}}", + "toast.dateUpdated": "日期已更新", + "toast.timeUpdated": "时间已更新" +} diff --git a/service/dist/locales/zh.json.br b/service/dist/locales/zh.json.br new file mode 100644 index 0000000000000000000000000000000000000000..a893e90e258d525b0e1e758ff81effee0b960ee4 GIT binary patch literal 5534 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 literal 0 HcmV?d00001 diff --git a/service/dist/scripts/fernetBrowser.min.js b/service/dist/scripts/fernetBrowser.min.js new file mode 100644 index 000000000..fa2acde26 --- /dev/null +++ b/service/dist/scripts/fernetBrowser.min.js @@ -0,0 +1,10 @@ +/** + * Minified by jsDelivr using Terser v5.37.0. + * Original file: /npm/fernet@0.4.0/fernetBrowser.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(t){if("function"==typeof bootstrap)bootstrap("fernet",t);else if("object"==typeof exports)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeFernet=t}else"undefined"!=typeof window?window.fernet=t():global.fernet=t()}((function(){return function t(e,r,n){function o(s,a){if(!r[s]){if(!e[s]){var f="function"==typeof require&&require;if(!a&&f)return f(s,!0);if(i)return i(s,!0);throw new Error("Cannot find module '"+s+"'")}var u=r[s]={exports:{}};e[s][0].call(u.exports,(function(t){var r=e[s][1][t];return o(r||t)}),u,u.exports,t,e,r,n)}return r[s].exports}for(var i="function"==typeof require&&require,s=0;s0){if(u>this.ttl)throw new Error("Invalid Token: TTL");if(f/1e3+this.maxClockSkew0)throw"Invalid string. Length must be a multiple of 4";for(a=[],o=(s=(s=e.indexOf("="))>0?e.length-s:0)>0?e.length-4:e.length,r=0,n=0;r>16),a.push((65280&i)>>8),a.push(255&i);return 2===s?(i=t.indexOf(e[r])<<2|t.indexOf(e[r+1])>>4,a.push(255&i)):1===s&&(i=t.indexOf(e[r])<<10|t.indexOf(e[r+1])<<4|t.indexOf(e[r+2])>>2,a.push(i>>8&255),a.push(255&i)),a},e.exports.fromByteArray=function(e){var r,n,o,i,s=e.length%3,a="";for(r=0,o=e.length-s;r>18&63]+t[i>>12&63]+t[i>>6&63]+t[63&i];switch(s){case 1:n=e[e.length-1],a+=t[n>>2],a+=t[n<<4&63],a+="==";break;case 2:n=(e[e.length-2]<<8)+e[e.length-1],a+=t[n>>10],a+=t[n>>4&63],a+=t[n<<2&63],a+="="}return a}}()},{}],5:[function(t,e,r){var n=t("util"),o=t("buffer").Buffer,i=Array.prototype.slice;function s(t){if(Object.keys)return Object.keys(t);var e=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.push(r);return e}var a=e.exports=h;function f(t,e){return void 0===e?""+e:"number"!=typeof e||!isNaN(e)&&isFinite(e)?"function"==typeof e||e instanceof RegExp?e.toString():e:e.toString()}function u(t,e){return"string"==typeof t?t.length=0;n--)if(o[n]!=a[n])return!1;for(n=o.length-1;n>=0;n--)if(!p(t[r=o[n]],e[r]))return!1;return!0}(t,e)}function l(t){return null==t}function y(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function g(t,e){return!(!t||!e)&&(e instanceof RegExp?e.test(t):t instanceof e||!0===e.call({},t))}function d(t,e,r,n){var o;"string"==typeof r&&(n=r,r=null);try{e()}catch(t){o=t}if(n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),t&&!o&&c("Missing expected exception"+n),!t&&g(o,r)&&c("Got unwanted exception"+n),t&&o&&r&&!g(o,r)||!t&&o)throw o}a.AssertionError=function(t){this.name="AssertionError",this.message=t.message,this.actual=t.actual,this.expected=t.expected,this.operator=t.operator;var e=t.stackStartFunction||c;Error.captureStackTrace&&Error.captureStackTrace(this,e)},n.inherits(a.AssertionError,Error),a.AssertionError.prototype.toString=function(){return this.message?[this.name+":",this.message].join(" "):[this.name+":",u(JSON.stringify(this.actual,f),128),this.operator,u(JSON.stringify(this.expected,f),128)].join(" ")},a.fail=c,a.ok=h,a.equal=function(t,e,r){t!=e&&c(t,e,r,"==",a.equal)},a.notEqual=function(t,e,r){t==e&&c(t,e,r,"!=",a.notEqual)},a.deepEqual=function(t,e,r){p(t,e)||c(t,e,r,"deepEqual",a.deepEqual)},a.notDeepEqual=function(t,e,r){p(t,e)&&c(t,e,r,"notDeepEqual",a.notDeepEqual)},a.strictEqual=function(t,e,r){t!==e&&c(t,e,r,"===",a.strictEqual)},a.notStrictEqual=function(t,e,r){t===e&&c(t,e,r,"!==",a.notStrictEqual)},a.throws=function(t,e,r){d.apply(this,[!0].concat(i.call(arguments)))},a.doesNotThrow=function(t,e,r){d.apply(this,[!1].concat(i.call(arguments)))},a.ifError=function(t){if(t)throw t}},{buffer:9,util:7}],6:[function(t,e,r){var n=t("__browserify_process");n.EventEmitter||(n.EventEmitter=function(){});var o=r.EventEmitter=n.EventEmitter,i="function"==typeof Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};o.prototype.setMaxListeners=function(t){this._events||(this._events={}),this._events.maxListeners=t},o.prototype.emit=function(t){if("error"===t&&(!this._events||!this._events.error||i(this._events.error)&&!this._events.error.length))throw arguments[1]instanceof Error?arguments[1]:new Error("Uncaught, unspecified 'error' event.");if(!this._events)return!1;var e=this._events[t];if(!e)return!1;if("function"==typeof e){switch(arguments.length){case 1:e.call(this);break;case 2:e.call(this,arguments[1]);break;case 3:e.call(this,arguments[1],arguments[2]);break;default:var r=Array.prototype.slice.call(arguments,1);e.apply(this,r)}return!0}if(i(e)){r=Array.prototype.slice.call(arguments,1);for(var n=e.slice(),o=0,s=n.length;o0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),console.trace());this._events[t].push(e)}else this._events[t]=[this._events[t],e];else this._events[t]=e;return this},o.prototype.on=o.prototype.addListener,o.prototype.once=function(t,e){var r=this;return r.on(t,(function n(){r.removeListener(t,n),e.apply(this,arguments)})),this},o.prototype.removeListener=function(t,e){if("function"!=typeof e)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[t])return this;var r=this._events[t];if(i(r)){var n=function(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0;r-1&&(o=n(f)?o.split("\n").map((function(t){return" "+t})).join("\n").substr(2):"\n"+o.split("\n").map((function(t){return" "+t})).join("\n")):o=h("[Circular]","special")),void 0===r){if("Array"===y&&e.match(/^\d+$/))return o;(r=JSON.stringify(""+e)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(r=r.substr(1,r.length-2),r=h(r,"name")):(r=r.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),r=h(r,"string"))}return r+": "+o}));c.pop();var E=m.reduce((function(t,e){return e.indexOf("\n")>=0&&0,t+e.length+1}),0);return m=E>50?g[0]+(""===l?"":l+"\n ")+" "+m.join(",\n ")+" "+g[1]:g[0]+l+" "+m.join(", ")+" "+g[1]}(t,void 0===f?2:f)};r.log=function(t){},r.pump=null;var s=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e},a=Object.getOwnPropertyNames||function(t){var e=[];for(var r in t)Object.hasOwnProperty.call(t,r)&&e.push(r);return e},f=Object.create||function(t,e){var r;if(null===t)r={__proto__:null};else{if("object"!=typeof t)throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var n=function(){};n.prototype=t,(r=new n).__proto__=t}return void 0!==e&&Object.defineProperties&&Object.defineProperties(r,e),r};r.inherits=function(t,e){t.super_=e,t.prototype=f(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})};var u=/%[sdj%]/g;r.format=function(t){if("string"!=typeof t){for(var e=[],n=0;n=i)return t;switch(t){case"%s":return String(o[n++]);case"%d":return Number(o[n++]);case"%j":return JSON.stringify(o[n++]);default:return t}})),a=o[n];n>1,c=-7,h=r?0:o-1,p=r?1:-1,l=t[e+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[e+h],h+=p,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=n;c>0;s=256*s+t[e+h],h+=p,c-=8);if(0===i)i=1-u;else{if(i===f)return s?NaN:1/0*(l?-1:1);s+=Math.pow(2,n),i-=u}return(l?-1:1)*s*Math.pow(2,i-n)},r.writeIEEE754=function(t,e,r,n,o,i){var s,a,f,u=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?i-1:0,y=n?-1:1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(f=Math.pow(2,-s))<1&&(s--,f*=2),(e+=s+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(s++,f/=2),s+h>=c?(a=0,s=c):s+h>=1?(a=(e*f-1)*Math.pow(2,o),s+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,o),s=0));o>=8;t[r+l]=255&a,l+=y,a/=256,o-=8);for(s=s<0;t[r+l]=255&s,l+=y,s/=256,u-=8);t[r+l-y]|=128*g}},{}],9:[function(t,e,r){var n=t("assert");function o(t,e,r){if(!(this instanceof o))return new o(t,e,r);var n;if(this.parent=this,this.offset=0,"number"==typeof r)this.length=i(e),this.offset=r;else{switch(n=typeof t){case"number":this.length=i(t);break;case"string":this.length=o.byteLength(t,e);break;case"object":this.length=i(t.length);break;default:throw new Error("First argument needs to be a number, array or string.")}if(function(t){return s(t)||o.isBuffer(t)||t&&"object"==typeof t&&"number"==typeof t.length}(t))for(var a=0;a=e.length||o>=t.length);)e[o+r]=t[o],o++;return o}function h(t){try{return decodeURIComponent(t)}catch(t){return String.fromCharCode(65533)}}function p(t,e,r,o){var i=0;return o||(n.ok("boolean"==typeof r,"missing or invalid endian"),n.ok(null!=e,"missing offset"),n.ok(e+1=t.length?0:(r?(i=t[e]<<8,e+1=t.length?0:(r?(e+1>>0):(e+2>>0)),i)}function y(t,e,r,o){var i;return o||(n.ok("boolean"==typeof r,"missing or invalid endian"),n.ok(null!=e,"missing offset"),n.ok(e+1=0,"specified a negative value for writing an unsigned value"),n.ok(t<=e,"value is larger than maximum value for type"),n.ok(Math.floor(t)===t,"value has a fractional component")}function b(t,e,r,o,i){i||(n.ok(null!=e,"missing value"),n.ok("boolean"==typeof o,"missing or invalid endian"),n.ok(null!=r,"missing offset"),n.ok(r+1>>8*(o?1-s:s)}function m(t,e,r,o,i){i||(n.ok(null!=e,"missing value"),n.ok("boolean"==typeof o,"missing or invalid endian"),n.ok(null!=r,"missing offset"),n.ok(r+3>>8*(o?3-s:s)&255}function E(t,e,r){n.ok("number"==typeof t,"cannot write a non-number as a number"),n.ok(t<=e,"value larger than maximum allowed value"),n.ok(t>=r,"value smaller than minimum allowed value"),n.ok(Math.floor(t)===t,"value has a fractional component")}function _(t,e,r){n.ok("number"==typeof t,"cannot write a non-number as a number"),n.ok(t<=e,"value larger than maximum allowed value"),n.ok(t>=r,"value smaller than minimum allowed value")}function k(t,e,r,o,i){i||(n.ok(null!=e,"missing value"),n.ok("boolean"==typeof o,"missing or invalid endian"),n.ok(null!=r,"missing offset"),n.ok(r+1=0?e:65535+e+1,r,o,i)}function x(t,e,r,o,i){i||(n.ok(null!=e,"missing value"),n.ok("boolean"==typeof o,"missing or invalid endian"),n.ok(null!=r,"missing offset"),n.ok(r+3=0?e:4294967295+e+1,r,o,i)}function S(e,r,o,i,s){s||(n.ok(null!=r,"missing value"),n.ok("boolean"==typeof i,"missing or invalid endian"),n.ok(null!=o,"missing offset"),n.ok(o+3=this.length)throw new Error("oob");return this[t]},o.prototype.set=function(t,e){if(t<0||t>=this.length)throw new Error("oob");return this[t]=e},o.byteLength=function(t,e){switch(e||"utf8"){case"hex":return t.length/2;case"utf8":case"utf-8":return f(t).length;case"ascii":case"binary":return t.length;case"base64":return u(t).length;default:throw new Error("Unknown encoding")}},o.prototype.utf8Write=function(t,e,r){return o._charsWritten=c(f(t),this,e,r)},o.prototype.asciiWrite=function(t,e,r){return o._charsWritten=c(function(t){for(var e=[],r=0;r"},o.prototype.hexSlice=function(t,e){var r=this.length;(!t||t<0)&&(t=0),(!e||e<0||e>r)&&(e=r);for(var n="",o=t;on&&(r=n):r=n;var i=t.length;if(i%2)throw new Error("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;si&&(r=i):r=i,n=String(n||"utf8").toLowerCase()){case"hex":return this.hexWrite(t,e,r);case"utf8":case"utf-8":return this.utf8Write(t,e,r);case"ascii":return this.asciiWrite(t,e,r);case"binary":return this.binaryWrite(t,e,r);case"base64":return this.base64Write(t,e,r);case"ucs2":case"ucs-2":return this.ucs2Write(t,e,r);default:throw new Error("Unknown encoding")}},o.prototype.slice=function(t,e){if(void 0===e&&(e=this.length),e>this.length)throw new Error("oob");if(t>e)throw new Error("oob");return new o(this,e-t,+t)},o.prototype.copy=function(t,e,r,o){var i=this;if(r||(r=0),(void 0===o||isNaN(o))&&(o=this.length),e||(e=0),o=t.length)throw new Error("targetStart out of bounds");if(r<0||r>=i.length)throw new Error("sourceStart out of bounds");if(o<0||o>i.length)throw new Error("sourceEnd out of bounds");o>this.length&&(o=this.length),t.length-e=this.length)throw new Error("start out of bounds");if(r<0||r>this.length)throw new Error("end out of bounds");for(var n=e;n=r.length))return r[t]},o.prototype.readUInt16LE=function(t,e){return p(this,t,!1,e)},o.prototype.readUInt16BE=function(t,e){return p(this,t,!0,e)},o.prototype.readUInt32LE=function(t,e){return l(this,t,!1,e)},o.prototype.readUInt32BE=function(t,e){return l(this,t,!0,e)},o.prototype.readInt8=function(t,e){var r=this;if(e||(n.ok(null!=t,"missing offset"),n.ok(t=r.length))return 128&r[t]?-1*(255-r[t]+1):r[t]},o.prototype.readInt16LE=function(t,e){return y(this,t,!1,e)},o.prototype.readInt16BE=function(t,e){return y(this,t,!0,e)},o.prototype.readInt32LE=function(t,e){return g(this,t,!1,e)},o.prototype.readInt32BE=function(t,e){return g(this,t,!0,e)},o.prototype.readFloatLE=function(t,e){return d(this,t,!1,e)},o.prototype.readFloatBE=function(t,e){return d(this,t,!0,e)},o.prototype.readDoubleLE=function(t,e){return v(this,t,!1,e)},o.prototype.readDoubleBE=function(t,e){return v(this,t,!0,e)},o.prototype.writeUInt8=function(t,e,r){var o=this;r||(n.ok(null!=t,"missing value"),n.ok(null!=e,"missing offset"),n.ok(e=0?o.writeUInt8(t,e,r):o.writeUInt8(255+t+1,e,r)},o.prototype.writeInt16LE=function(t,e,r){k(this,t,e,!1,r)},o.prototype.writeInt16BE=function(t,e,r){k(this,t,e,!0,r)},o.prototype.writeInt32LE=function(t,e,r){x(this,t,e,!1,r)},o.prototype.writeInt32BE=function(t,e,r){x(this,t,e,!0,r)},o.prototype.writeFloatLE=function(t,e,r){S(this,t,e,!1,r)},o.prototype.writeFloatBE=function(t,e,r){S(this,t,e,!0,r)},o.prototype.writeDoubleLE=function(t,e,r){B(this,t,e,!1,r)},o.prototype.writeDoubleBE=function(t,e,r){B(this,t,e,!0,r)}},{"./buffer_ieee754":8,assert:5,"base64-js":4}],10:[function(t,e,r){var n=t("buffer").Buffer,o=new n(4);o.fill(0);e.exports={hash:function(t,e,r,i){return n.isBuffer(t)||(t=new n(t)),function(t,e,r){for(var o=new n(e),i=r?o.writeInt32BE:o.writeInt32LE,s=0;sf?e=t(e):e.length>5]|=128<>>9<<4)]=e;for(var r=1732584193,n=-271733879,o=-1732584194,i=271733878,h=0;h>>32-a,r);var s,a}function s(t,e,r,n,o,s,a){return i(e&r|~e&n,t,e,o,s,a)}function a(t,e,r,n,o,s,a){return i(e&n|r&~n,t,e,o,s,a)}function f(t,e,r,n,o,s,a){return i(e^r^n,t,e,o,s,a)}function u(t,e,r,n,o,s,a){return i(r^(e|~n),t,e,o,s,a)}function c(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r}e.exports=function(t){return n.hash(t,o,16)}},{"./helpers":10}],13:[function(t,e,r){!function(){var t,r;t=function(t){for(var e,r=new Array(t),n=0;n>>((3&n)<<3)&255;return r},this.crypto&&crypto.getRandomValues&&(r=function(t){var e=new Uint8Array(t);return crypto.getRandomValues(e),e}),e.exports=r||t}()},{}],14:[function(t,e,r){var n=t("./helpers");function o(t,e){t[e>>5]|=128<<24-e%32,t[15+(e+64>>9<<4)]=e;for(var r=Array(80),n=1732584193,o=-271733879,u=-1732584194,c=271733878,h=-1009589776,p=0;p>16)+(e>>16)+(r>>16)<<16|65535&r}function f(t,e){return t<>>32-e}e.exports=function(t){return n.hash(t,o,20,!0)}},{"./helpers":10}],15:[function(t,e,r){var n=t("./helpers"),o=function(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r},i=function(t,e){return t>>>e|t<<32-e},s=function(t,e){return t>>>e},a=function(t,e,r){return t&e^~t&r},f=function(t,e,r){return t&e^t&r^e&r},u=function(t){return i(t,2)^i(t,13)^i(t,22)},c=function(t){return i(t,6)^i(t,11)^i(t,25)},h=function(t){return i(t,7)^i(t,18)^s(t,3)},p=function(t,e){var r,n,p,l,y,g,d,v,w,b,m,E=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),_=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),k=new Array(64);t[e>>5]|=128<<24-e%32,t[15+(e+64>>9<<4)]=e;for(var x=0;x>>8^255&y^99,o[r]=y,i[y]=r;var g=t[r],d=t[g],v=t[d],w=257*t[y]^16843008*y;s[r]=w<<24|w>>>8,a[r]=w<<16|w>>>16,f[r]=w<<8|w>>>24,u[r]=w,w=16843009*v^65537*d^257*g^16843008*r,c[y]=w<<24|w>>>8,h[y]=w<<16|w>>>16,p[y]=w<<8|w>>>24,l[y]=w,r?(r=g^t[t[t[v^g]]],n^=t[t[n]]):r=n=1}}();var y=[0,1,2,4,8,16,32,64,128,27,54],g=n.AES=r.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,n=4*((this._nRounds=r+6)+1),i=this._keySchedule=[],s=0;s6&&s%r==4&&(a=o[a>>>24]<<24|o[a>>>16&255]<<16|o[a>>>8&255]<<8|o[255&a]):(a=o[(a=a<<8|a>>>24)>>>24]<<24|o[a>>>16&255]<<16|o[a>>>8&255]<<8|o[255&a],a^=y[s/r|0]<<24),i[s]=i[s-r]^a}for(var f=this._invKeySchedule=[],u=0;u>>24]]^h[o[a>>>16&255]]^p[o[a>>>8&255]]^l[o[255&a]]}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,s,a,f,u,o)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,c,h,p,l,i),r=t[e+1],t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,n,o,i,s,a){for(var f=this._nRounds,u=t[e]^r[0],c=t[e+1]^r[1],h=t[e+2]^r[2],p=t[e+3]^r[3],l=4,y=1;y>>24]^o[c>>>16&255]^i[h>>>8&255]^s[255&p]^r[l++],d=n[c>>>24]^o[h>>>16&255]^i[p>>>8&255]^s[255&u]^r[l++],v=n[h>>>24]^o[p>>>16&255]^i[u>>>8&255]^s[255&c]^r[l++],w=n[p>>>24]^o[u>>>16&255]^i[c>>>8&255]^s[255&h]^r[l++];u=g,c=d,h=v,p=w}g=(a[u>>>24]<<24|a[c>>>16&255]<<16|a[h>>>8&255]<<8|a[255&p])^r[l++],d=(a[c>>>24]<<24|a[h>>>16&255]<<16|a[p>>>8&255]<<8|a[255&u])^r[l++],v=(a[h>>>24]<<24|a[p>>>16&255]<<16|a[u>>>8&255]<<8|a[255&c])^r[l++],w=(a[p>>>24]<<24|a[u>>>16&255]<<16|a[c>>>8&255]<<8|a[255&h])^r[l++],t[e]=g,t[e+1]=d,t[e+2]=v,t[e+3]=w},keySize:8});e.AES=r._createHelper(g)}(),t.AES},"object"==typeof r?e.exports=r=o(t("./core"),t("./enc-base64"),t("./md5"),t("./evpkdf"),t("./cipher-core")):o(n.CryptoJS)},{"./cipher-core":17,"./core":18,"./enc-base64":19,"./evpkdf":23,"./md5":26}],17:[function(t,e,r){var n,o;n=this,o=function(t){var e,r,n,o,i,s,a,f,u,c,h,p,l,y,g,d,v,w;t.lib.Cipher||(r=(e=t).lib,n=r.Base,o=r.WordArray,i=r.BufferedBlockAlgorithm,(s=e.enc).Utf8,a=s.Base64,f=e.algo.EvpKDF,u=r.Cipher=i.extend({cfg:n.extend(),createEncryptor:function(t,e){return this.create(this._ENC_XFORM_MODE,t,e)},createDecryptor:function(t,e){return this.create(this._DEC_XFORM_MODE,t,e)},init:function(t,e,r){this.cfg=this.cfg.extend(r),this._xformMode=t,this._key=e,this.reset()},reset:function(){i.reset.call(this),this._doReset()},process:function(t){return this._append(t),this._process()},finalize:function(t){return t&&this._append(t),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function t(t){return"string"==typeof t?w:d}return function(e){return{encrypt:function(r,n,o){return t(n).encrypt(e,r,n,o)},decrypt:function(r,n,o){return t(n).decrypt(e,r,n,o)}}}}()}),r.StreamCipher=u.extend({_doFinalize:function(){return this._process(!0)},blockSize:1}),c=e.mode={},h=r.BlockCipherMode=n.extend({createEncryptor:function(t,e){return this.Encryptor.create(t,e)},createDecryptor:function(t,e){return this.Decryptor.create(t,e)},init:function(t,e){this._cipher=t,this._iv=e}}),p=c.CBC=function(){var t=h.extend();function e(t,e,r){var n=this._iv;if(n){var o=n;this._iv=void 0}else o=this._prevBlock;for(var i=0;i>>2];t.sigBytes-=e}},r.BlockCipher=u.extend({cfg:u.cfg.extend({mode:p,padding:l}),reset:function(){u.reset.call(this);var t=this.cfg,e=t.iv,r=t.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=r.createEncryptor;else n=r.createDecryptor,this._minBufferSize=1;this._mode=n.call(r,this,e&&e.words)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){t.pad(this._data,this.blockSize);var e=this._process(!0)}else e=this._process(!0),t.unpad(e);return e},blockSize:4}),y=r.CipherParams=n.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}}),g=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,r=t.salt;if(r)var n=o.create([1398893684,1701076831]).concat(r).concat(e);else n=e;return n.toString(a)},parse:function(t){var e=a.parse(t),r=e.words;if(1398893684==r[0]&&1701076831==r[1]){var n=o.create(r.slice(2,4));r.splice(0,4),e.sigBytes-=16}return y.create({ciphertext:e,salt:n})}},d=r.SerializableCipher=n.extend({cfg:n.extend({format:g}),encrypt:function(t,e,r,n){n=this.cfg.extend(n);var o=t.createEncryptor(r,n),i=o.finalize(e),s=o.cfg;return y.create({ciphertext:i,key:r,iv:s.iv,algorithm:t,mode:s.mode,padding:s.padding,blockSize:t.blockSize,formatter:n.format})},decrypt:function(t,e,r,n){return n=this.cfg.extend(n),e=this._parse(e,n.format),t.createDecryptor(r,n).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),v=(e.kdf={}).OpenSSL={execute:function(t,e,r,n){n||(n=o.random(8));var i=f.create({keySize:e+r}).compute(t,n),s=o.create(i.words.slice(e),4*r);return i.sigBytes=4*e,y.create({key:i,iv:s,salt:n})}},w=r.PasswordBasedCipher=d.extend({cfg:d.cfg.extend({kdf:v}),encrypt:function(t,e,r,n){var o=(n=this.cfg.extend(n)).kdf.execute(r,t.keySize,t.ivSize);n.iv=o.iv;var i=d.encrypt.call(this,t,e,o.key,n);return i.mixIn(o),i},decrypt:function(t,e,r,n){n=this.cfg.extend(n),e=this._parse(e,n.format);var o=n.kdf.execute(r,t.keySize,t.ivSize,e.salt);return n.iv=o.iv,d.decrypt.call(this,t,e,o.key,n)}}))},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],18:[function(t,e,r){var n,o;n=this,o=function(){var t=t||function(t){var e=Object.create||function(){function t(){}return function(e){var r;return t.prototype=e,r=new t,t.prototype=null,r}}(),r={},n=r.lib={},o=n.Base={extend:function(t){var r=e(this);return t&&r.mixIn(t),r.hasOwnProperty("init")&&this.init!==r.init||(r.init=function(){r.$super.init.apply(this,arguments)}),r.init.prototype=r,r.$super=this,r},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},i=n.WordArray=o.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||a).stringify(this)},concat:function(t){var e=this.words,r=t.words,n=this.sigBytes,o=t.sigBytes;if(this.clamp(),n%4)for(var i=0;i>>2]>>>24-i%4*8&255;e[n+i>>>2]|=s<<24-(n+i)%4*8}else for(i=0;i>>2]=r[i>>>2];return this.sigBytes+=o,this},clamp:function(){var e=this.words,r=this.sigBytes;e[r>>>2]&=4294967295<<32-r%4*8,e.length=t.ceil(r/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(e){for(var r,n=[],o=function(e){var r=987654321,n=4294967295;return function(){var o=((r=36969*(65535&r)+(r>>16)&n)<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n;return o/=4294967296,(o+=.5)*(t.random()>.5?1:-1)}},s=0;s>>2]>>>24-o%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n>>3]|=parseInt(t.substr(n,2),16)<<24-n%8*4;return new i.init(r,e/2)}},f=s.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,n=[],o=0;o>>2]>>>24-o%4*8&255;n.push(String.fromCharCode(i))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n>>2]|=(255&t.charCodeAt(n))<<24-n%4*8;return new i.init(r,e)}},u=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(f.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return f.parse(unescape(encodeURIComponent(t)))}},c=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new i.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=u.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var r=this._data,n=r.words,o=r.sigBytes,s=this.blockSize,a=o/(4*s),f=(a=e?t.ceil(a):t.max((0|a)-this._minBufferSize,0))*s,u=t.min(4*f,o);if(f){for(var c=0;c>>2]>>>24-i%4*8&255)<<16|(e[i+1>>>2]>>>24-(i+1)%4*8&255)<<8|e[i+2>>>2]>>>24-(i+2)%4*8&255,a=0;a<4&&i+.75*a>>6*(3-a)&63));var f=n.charAt(64);if(f)for(;o.length%4;)o.push(f);return o.join("")},parse:function(t){var e=t.length,n=this._map,o=this._reverseMap;if(!o){o=this._reverseMap=[];for(var i=0;i>>6-s%4*2;o[i>>>2]|=(a|f)<<24-i%4*8,i++}return r.create(o,i)}(t,e,o)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},t.enc.Base64},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],20:[function(t,e,r){var n,o;n=this,o=function(t){return t.enc.Hex},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],21:[function(t,e,r){var n,o;n=this,o=function(t){return t.enc.Latin1},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],22:[function(t,e,r){var n,o;n=this,o=function(t){return t.enc.Utf8},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],23:[function(t,e,r){var n,o;n=this,o=function(t){var e,r,n,o,i,s,a;return r=(e=t).lib,n=r.Base,o=r.WordArray,i=e.algo,s=i.MD5,a=i.EvpKDF=n.extend({cfg:n.extend({keySize:4,hasher:s,iterations:1}),init:function(t){this.cfg=this.cfg.extend(t)},compute:function(t,e){for(var r=this.cfg,n=r.hasher.create(),i=o.create(),s=i.words,a=r.keySize,f=r.iterations;s.lengtho&&(e=t.finalize(e)),e.clamp();for(var i=this._oKey=e.clone(),s=this._iKey=e.clone(),a=i.words,f=s.words,u=0;u>>24)|4278255360&(o<<24|o>>>8)}var i=this._hash.words,s=t[e+0],f=t[e+1],l=t[e+2],y=t[e+3],g=t[e+4],d=t[e+5],v=t[e+6],w=t[e+7],b=t[e+8],m=t[e+9],E=t[e+10],_=t[e+11],k=t[e+12],x=t[e+13],S=t[e+14],B=t[e+15],I=i[0],L=i[1],A=i[2],j=i[3];I=u(I,L,A,j,s,7,a[0]),j=u(j,I,L,A,f,12,a[1]),A=u(A,j,I,L,l,17,a[2]),L=u(L,A,j,I,y,22,a[3]),I=u(I,L,A,j,g,7,a[4]),j=u(j,I,L,A,d,12,a[5]),A=u(A,j,I,L,v,17,a[6]),L=u(L,A,j,I,w,22,a[7]),I=u(I,L,A,j,b,7,a[8]),j=u(j,I,L,A,m,12,a[9]),A=u(A,j,I,L,E,17,a[10]),L=u(L,A,j,I,_,22,a[11]),I=u(I,L,A,j,k,7,a[12]),j=u(j,I,L,A,x,12,a[13]),A=u(A,j,I,L,S,17,a[14]),I=c(I,L=u(L,A,j,I,B,22,a[15]),A,j,f,5,a[16]),j=c(j,I,L,A,v,9,a[17]),A=c(A,j,I,L,_,14,a[18]),L=c(L,A,j,I,s,20,a[19]),I=c(I,L,A,j,d,5,a[20]),j=c(j,I,L,A,E,9,a[21]),A=c(A,j,I,L,B,14,a[22]),L=c(L,A,j,I,g,20,a[23]),I=c(I,L,A,j,m,5,a[24]),j=c(j,I,L,A,S,9,a[25]),A=c(A,j,I,L,y,14,a[26]),L=c(L,A,j,I,b,20,a[27]),I=c(I,L,A,j,x,5,a[28]),j=c(j,I,L,A,l,9,a[29]),A=c(A,j,I,L,w,14,a[30]),I=h(I,L=c(L,A,j,I,k,20,a[31]),A,j,d,4,a[32]),j=h(j,I,L,A,b,11,a[33]),A=h(A,j,I,L,_,16,a[34]),L=h(L,A,j,I,S,23,a[35]),I=h(I,L,A,j,f,4,a[36]),j=h(j,I,L,A,g,11,a[37]),A=h(A,j,I,L,w,16,a[38]),L=h(L,A,j,I,E,23,a[39]),I=h(I,L,A,j,x,4,a[40]),j=h(j,I,L,A,s,11,a[41]),A=h(A,j,I,L,y,16,a[42]),L=h(L,A,j,I,v,23,a[43]),I=h(I,L,A,j,m,4,a[44]),j=h(j,I,L,A,k,11,a[45]),A=h(A,j,I,L,B,16,a[46]),I=p(I,L=h(L,A,j,I,l,23,a[47]),A,j,s,6,a[48]),j=p(j,I,L,A,w,10,a[49]),A=p(A,j,I,L,S,15,a[50]),L=p(L,A,j,I,d,21,a[51]),I=p(I,L,A,j,k,6,a[52]),j=p(j,I,L,A,y,10,a[53]),A=p(A,j,I,L,E,15,a[54]),L=p(L,A,j,I,f,21,a[55]),I=p(I,L,A,j,b,6,a[56]),j=p(j,I,L,A,B,10,a[57]),A=p(A,j,I,L,v,15,a[58]),L=p(L,A,j,I,x,21,a[59]),I=p(I,L,A,j,g,6,a[60]),j=p(j,I,L,A,_,10,a[61]),A=p(A,j,I,L,l,15,a[62]),L=p(L,A,j,I,m,21,a[63]),i[0]=i[0]+I|0,i[1]=i[1]+L|0,i[2]=i[2]+A|0,i[3]=i[3]+j|0},_doFinalize:function(){var t=this._data,r=t.words,n=8*this._nDataBytes,o=8*t.sigBytes;r[o>>>5]|=128<<24-o%32;var i=e.floor(n/4294967296),s=n;r[15+(o+64>>>9<<4)]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8),r[14+(o+64>>>9<<4)]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),t.sigBytes=4*(r.length+1),this._process();for(var a=this._hash,f=a.words,u=0;u<4;u++){var c=f[u];f[u]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return a},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function u(t,e,r,n,o,i,s){var a=t+(e&r|~e&n)+o+s;return(a<>>32-i)+e}function c(t,e,r,n,o,i,s){var a=t+(e&n|r&~n)+o+s;return(a<>>32-i)+e}function h(t,e,r,n,o,i,s){var a=t+(e^r^n)+o+s;return(a<>>32-i)+e}function p(t,e,r,n,o,i,s){var a=t+(r^(e|~n))+o+s;return(a<>>32-i)+e}r.MD5=i._createHelper(f),r.HmacMD5=i._createHmacHelper(f)}(Math),t.MD5},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],27:[function(t,e,r){var n,o;n=this,o=function(t){var e,r,n,o,i,s,a;return r=(e=t).lib,n=r.WordArray,o=r.Hasher,i=e.algo,s=[],a=i.SHA1=o.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,n=r[0],o=r[1],i=r[2],a=r[3],f=r[4],u=0;u<80;u++){if(u<16)s[u]=0|t[e+u];else{var c=s[u-3]^s[u-8]^s[u-14]^s[u-16];s[u]=c<<1|c>>>31}var h=(n<<5|n>>>27)+f+s[u];h+=u<20?1518500249+(o&i|~o&a):u<40?1859775393+(o^i^a):u<60?(o&i|o&a|i&a)-1894007588:(o^i^a)-899497514,f=a,a=i,i=o<<30|o>>>2,o=n,n=h}r[0]=r[0]+n|0,r[1]=r[1]+o|0,r[2]=r[2]+i|0,r[3]=r[3]+a|0,r[4]=r[4]+f|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,n=8*t.sigBytes;return e[n>>>5]|=128<<24-n%32,e[14+(n+64>>>9<<4)]=Math.floor(r/4294967296),e[15+(n+64>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=o.clone.call(this);return t._hash=this._hash.clone(),t}}),e.SHA1=o._createHelper(a),e.HmacSHA1=o._createHmacHelper(a),t.SHA1},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],28:[function(t,e,r){var n,o;n=this,o=function(t){return function(e){var r=t,n=r.lib,o=n.WordArray,i=n.Hasher,s=r.algo,a=[],f=[];!function(){function t(t){for(var r=e.sqrt(t),n=2;n<=r;n++)if(!(t%n))return!1;return!0}function r(t){return 4294967296*(t-(0|t))|0}for(var n=2,o=0;o<64;)t(n)&&(o<8&&(a[o]=r(e.pow(n,.5))),f[o]=r(e.pow(n,1/3)),o++),n++}();var u=[],c=s.SHA256=i.extend({_doReset:function(){this._hash=new o.init(a.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,n=r[0],o=r[1],i=r[2],s=r[3],a=r[4],c=r[5],h=r[6],p=r[7],l=0;l<64;l++){if(l<16)u[l]=0|t[e+l];else{var y=u[l-15],g=(y<<25|y>>>7)^(y<<14|y>>>18)^y>>>3,d=u[l-2],v=(d<<15|d>>>17)^(d<<13|d>>>19)^d>>>10;u[l]=g+u[l-7]+v+u[l-16]}var w=n&o^n&i^o&i,b=(n<<30|n>>>2)^(n<<19|n>>>13)^(n<<10|n>>>22),m=p+((a<<26|a>>>6)^(a<<21|a>>>11)^(a<<7|a>>>25))+(a&c^~a&h)+f[l]+u[l];p=h,h=c,c=a,a=s+m|0,s=i,i=o,o=n,n=m+(b+w)|0}r[0]=r[0]+n|0,r[1]=r[1]+o|0,r[2]=r[2]+i|0,r[3]=r[3]+s|0,r[4]=r[4]+a|0,r[5]=r[5]+c|0,r[6]=r[6]+h|0,r[7]=r[7]+p|0},_doFinalize:function(){var t=this._data,r=t.words,n=8*this._nDataBytes,o=8*t.sigBytes;return r[o>>>5]|=128<<24-o%32,r[14+(o+64>>>9<<4)]=e.floor(n/4294967296),r[15+(o+64>>>9<<4)]=n,t.sigBytes=4*r.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});r.SHA256=i._createHelper(c),r.HmacSHA256=i._createHmacHelper(c)}(Math),t.SHA256},"object"==typeof r?e.exports=r=o(t("./core")):o(n.CryptoJS)},{"./core":18}],29:[function(t,e,r){t=function(t,e,r,n){function o(n){if(!r[n]){if(!e[n]){if(t)return t(n);throw new Error("Cannot find module '"+n+"'")}var i=r[n]={exports:{}};e[n][0]((function(t){var r=e[n][1][t];return o(r||t)}),i,i.exports)}return r[n].exports}for(var i=0;i=0;n--)if(o[n]!=a[n])return!1;for(n=o.length-1;n>=0;n--)if(!p(t[r=o[n]],e[r]))return!1;return!0}(t,e)}function l(t){return null==t}function y(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function g(t,e){return!(!t||!e)&&(e instanceof RegExp?e.test(t):t instanceof e||!0===e.call({},t))}function d(t,e,r,n){var o;"string"==typeof r&&(n=r,r=null);try{e()}catch(t){o=t}if(n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),t&&!o&&c("Missing expected exception"+n),!t&&g(o,r)&&c("Got unwanted exception"+n),t&&o&&r&&!g(o,r)||!t&&o)throw o}a.AssertionError=function(t){this.name="AssertionError",this.message=t.message,this.actual=t.actual,this.expected=t.expected,this.operator=t.operator;var e=t.stackStartFunction||c;Error.captureStackTrace&&Error.captureStackTrace(this,e)},n.inherits(a.AssertionError,Error),a.AssertionError.prototype.toString=function(){return this.message?[this.name+":",this.message].join(" "):[this.name+":",u(JSON.stringify(this.actual,f),128),this.operator,u(JSON.stringify(this.expected,f),128)].join(" ")},a.AssertionError.__proto__=Error.prototype,a.fail=c,a.ok=h,a.equal=function(t,e,r){t!=e&&c(t,e,r,"==",a.equal)},a.notEqual=function(t,e,r){t==e&&c(t,e,r,"!=",a.notEqual)},a.deepEqual=function(t,e,r){p(t,e)||c(t,e,r,"deepEqual",a.deepEqual)},a.notDeepEqual=function(t,e,r){p(t,e)&&c(t,e,r,"notDeepEqual",a.notDeepEqual)},a.strictEqual=function(t,e,r){t!==e&&c(t,e,r,"===",a.strictEqual)},a.notStrictEqual=function(t,e,r){t===e&&c(t,e,r,"!==",a.notStrictEqual)},a.throws=function(t,e,r){d.apply(this,[!0].concat(i.call(arguments)))},a.doesNotThrow=function(t,e,r){d.apply(this,[!1].concat(i.call(arguments)))},a.ifError=function(t){if(t)throw t}},{util:2,buffer:3}],2:[function(t,e,r){t("events");function n(t){return t instanceof Array||Array.isArray(t)||t&&t!==Object.prototype&&n(t.__proto__)}function o(t){return t instanceof RegExp||"object"==typeof t&&"[object RegExp]"===Object.prototype.toString.call(t)}function i(t){if(t instanceof Date)return!0;if("object"!=typeof t)return!1;var e=Date.prototype&&a(Date.prototype),r=t.__proto__&&a(t.__proto__);return JSON.stringify(r)===JSON.stringify(e)}r.isArray=n,r.isDate=function(t){return"[object Date]"===Object.prototype.toString.call(t)},r.isRegExp=function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},r.print=function(){},r.puts=function(){},r.debug=function(){},r.inspect=function(t,e,f,u){var c=[],h=function(t,e){var r={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},n={special:"cyan",number:"blue",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"}[e];return n?"["+r[n][0]+"m"+t+"["+r[n][1]+"m":t};return u||(h=function(t,e){return t}),function t(f,u){if(f&&"function"==typeof f.inspect&&f!==r&&(!f.constructor||f.constructor.prototype!==f))return f.inspect(u);switch(typeof f){case"undefined":return h("undefined","undefined");case"string":var p="'"+JSON.stringify(f).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return h(p,"string");case"number":return h(""+f,"number");case"boolean":return h(""+f,"boolean")}if(null===f)return h("null","null");var l,y,g,d=s(f),v=e?a(f):d;if("function"==typeof f&&0===v.length){if(o(f))return h(""+f,"regexp");var w=f.name?": "+f.name:"";return h("[Function"+w+"]","special")}if(i(f)&&0===v.length)return h(f.toUTCString(),"date");if(n(f)?(y="Array",g=["[","]"]):(y="Object",g=["{","}"]),"function"==typeof f){var b=f.name?": "+f.name:"";l=o(f)?" "+f:" [Function"+b+"]"}else l="";if(i(f)&&(l=" "+f.toUTCString()),0===v.length)return g[0]+l+g[1];if(u<0)return o(f)?h(""+f,"regexp"):h("[Object]","special");c.push(f);var m=v.map((function(e){var r,o;if(f.__lookupGetter__&&(f.__lookupGetter__(e)?o=f.__lookupSetter__(e)?h("[Getter/Setter]","special"):h("[Getter]","special"):f.__lookupSetter__(e)&&(o=h("[Setter]","special"))),d.indexOf(e)<0&&(r="["+e+"]"),o||(c.indexOf(f[e])<0?(o=null===u?t(f[e]):t(f[e],u-1)).indexOf("\n")>-1&&(o=n(f)?o.split("\n").map((function(t){return" "+t})).join("\n").substr(2):"\n"+o.split("\n").map((function(t){return" "+t})).join("\n")):o=h("[Circular]","special")),void 0===r){if("Array"===y&&e.match(/^\d+$/))return o;(r=JSON.stringify(""+e)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(r=r.substr(1,r.length-2),r=h(r,"name")):(r=r.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),r=h(r,"string"))}return r+": "+o}));c.pop();var E=m.reduce((function(t,e){return e.indexOf("\n")>=0&&0,t+e.length+1}),0);return m=E>50?g[0]+(""===l?"":l+"\n ")+" "+m.join(",\n ")+" "+g[1]:g[0]+l+" "+m.join(", ")+" "+g[1]}(t,void 0===f?2:f)};r.log=function(t){},r.pump=null;var s=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e},a=Object.getOwnPropertyNames||function(t){var e=[];for(var r in t)Object.hasOwnProperty.call(t,r)&&e.push(r);return e},f=Object.create||function(t,e){var r;if(null===t)r={__proto__:null};else{if("object"!=typeof t)throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var n=function(){};n.prototype=t,(r=new n).__proto__=t}return void 0!==e&&Object.defineProperties&&Object.defineProperties(r,e),r};r.inherits=function(t,e){t.super_=e,t.prototype=f(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})};var u=/%[sdj%]/g;r.format=function(t){if("string"!=typeof t){for(var e=[],n=0;n=i)return t;switch(t){case"%s":return String(o[n++]);case"%d":return Number(o[n++]);case"%j":return JSON.stringify(o[n++]);default:return t}})),a=o[n];n>1,c=-7,h=r?0:o-1,p=r?1:-1,l=t[e+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[e+h],h+=p,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=n;c>0;s=256*s+t[e+h],h+=p,c-=8);if(0===i)i=1-u;else{if(i===f)return s?NaN:1/0*(l?-1:1);s+=Math.pow(2,n),i-=u}return(l?-1:1)*s*Math.pow(2,i-n)},r.writeIEEE754=function(t,e,r,n,o,i){var s,a,f,u=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?i-1:0,y=n?-1:1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(f=Math.pow(2,-s))<1&&(s--,f*=2),(e+=s+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(s++,f/=2),s+h>=c?(a=0,s=c):s+h>=1?(a=(e*f-1)*Math.pow(2,o),s+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,o),s=0));o>=8;t[r+l]=255&a,l+=y,a/=256,o-=8);for(s=s<0;t[r+l]=255&s,l+=y,s/=256,u-=8);t[r+l-y]|=128*g}},{}],6:[function(t,e,r){var n=e.exports={};n.nextTick=function(){var t="undefined"!=typeof window&&window.setImmediate,e="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(t)return function(t){return window.setImmediate(t)};if(e){var r=[];return window.addEventListener("message",(function(t){t.source===window&&"process-tick"===t.data&&(t.stopPropagation(),r.length>0&&r.shift()())}),!0),function(t){r.push(t),window.postMessage("process-tick","*")}}return function(t){setTimeout(t,0)}}(),n.title="browser",n.browser=!0,n.env={},n.argv=[],n.binding=function(t){throw new Error("process.binding is not supported")},n.cwd=function(){return"/"},n.chdir=function(t){throw new Error("process.chdir is not supported")}},{}],4:[function(t,e,r){!function(t){t.EventEmitter||(t.EventEmitter=function(){});var e=r.EventEmitter=t.EventEmitter,n="function"==typeof Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};e.prototype.setMaxListeners=function(t){this._events||(this._events={}),this._events.maxListeners=t},e.prototype.emit=function(t){if("error"===t&&(!this._events||!this._events.error||n(this._events.error)&&!this._events.error.length))throw arguments[1]instanceof Error?arguments[1]:new Error("Uncaught, unspecified 'error' event.");if(!this._events)return!1;var e=this._events[t];if(!e)return!1;if("function"==typeof e){switch(arguments.length){case 1:e.call(this);break;case 2:e.call(this,arguments[1]);break;case 3:e.call(this,arguments[1],arguments[2]);break;default:var r=Array.prototype.slice.call(arguments,1);e.apply(this,r)}return!0}if(n(e)){r=Array.prototype.slice.call(arguments,1);for(var o=e.slice(),i=0,s=o.length;i0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),console.trace());this._events[t].push(e)}else this._events[t]=[this._events[t],e];else this._events[t]=e;return this},e.prototype.on=e.prototype.addListener,e.prototype.once=function(t,e){var r=this;return r.on(t,(function n(){r.removeListener(t,n),e.apply(this,arguments)})),this},e.prototype.removeListener=function(t,e){if("function"!=typeof e)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[t])return this;var r=this._events[t];if(n(r)){var o=function(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0;r=e.length||o>=t.length);)e[o+r]=t[o],o++;return o}function c(t){try{return decodeURIComponent(t)}catch(t){return String.fromCharCode(65533)}}function h(t){return(t=~~Math.ceil(+t))<0?0:t}function p(t,e,r){if(!(this instanceof p))return new p(t,e,r);var i;if("number"==typeof r)this.length=h(e),this.parent=t,this.offset=r;else{switch(i=typeof t){case"number":this.length=h(t);break;case"string":this.length=p.byteLength(t,e);break;case"object":this.length=h(t.length);break;default:throw new Error("First argument needs to be a number, array or string.")}if(this.length>p.poolSize?(this.parent=new n(this.length),this.offset=0):((!o||o.length-o.used=t.length?0:(r?(o=t.parent[t.offset+e]<<8,e+1=t.length?0:(r?(e+1>>0):(e+2>>0)),o)}function g(t,e,r,n){var o;return n||(i.ok("boolean"==typeof r,"missing or invalid endian"),i.ok(null!=e,"missing offset"),i.ok(e+1=0,"specified a negative value for writing an unsigned value"),i.ok(t<=e,"value is larger than maximum value for type"),i.ok(Math.floor(t)===t,"value has a fractional component")}function m(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+1>>8*(n?1-s:s)}function E(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+3>>8*(n?3-s:s)&255}function _(t,e,r){i.ok("number"==typeof t,"cannot write a non-number as a number"),i.ok(t<=e,"value larger than maximum allowed value"),i.ok(t>=r,"value smaller than minimum allowed value"),i.ok(Math.floor(t)===t,"value has a fractional component")}function k(t,e,r){i.ok("number"==typeof t,"cannot write a non-number as a number"),i.ok(t<=e,"value larger than maximum allowed value"),i.ok(t>=r,"value smaller than minimum allowed value")}function x(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+1=0?e:65535+e+1,r,n,o)}function S(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+3=0?e:4294967295+e+1,r,n,o)}function B(e,r,n,o,s){s||(i.ok(null!=r,"missing value"),i.ok("boolean"==typeof o,"missing or invalid endian"),i.ok(null!=n,"missing offset"),i.ok(n+3"},n.prototype.hexSlice=function(t,e){var r=this.length;(!t||t<0)&&(t=0),(!e||e<0||e>r)&&(e=r);for(var n="",o=t;oo&&(r=o):r=o;var i=t.length;if(i%2)throw new Error("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;si&&(r=i):r=i,n=String(n||"utf8").toLowerCase()){case"hex":return this.hexWrite(t,e,r);case"utf8":case"utf-8":return this.utf8Write(t,e,r);case"ascii":return this.asciiWrite(t,e,r);case"binary":return this.binaryWrite(t,e,r);case"base64":return this.base64Write(t,e,r);case"ucs2":case"ucs-2":return this.ucs2Write(t,e,r);default:throw new Error("Unknown encoding")}},n.prototype.slice=function(t,e){if(void 0===e&&(e=this.length),e>this.length)throw new Error("oob");if(t>e)throw new Error("oob");return new p(this,e-t,+t)},n.prototype.copy=function(t,e,r,n){for(var o=[],s=r;sthis.length)throw new Error("oob");if(e>r)throw new Error("oob");for(var n=e;n"},p.prototype.get=function(t){if(t<0||t>=this.length)throw new Error("oob");return this.parent[this.offset+t]},p.prototype.set=function(t,e){if(t<0||t>=this.length)throw new Error("oob");return this.parent[this.offset+t]=e},p.prototype.write=function(t,e,r,o){if(isFinite(e))isFinite(r)||(o=r,r=void 0);else{var i=o;o=e,e=r,r=i}e=+e||0;var s,a=this.length-e;switch(r?(r=+r)>a&&(r=a):r=a,o=String(o||"utf8").toLowerCase()){case"hex":s=this.parent.hexWrite(t,this.offset+e,r);break;case"utf8":case"utf-8":s=this.parent.utf8Write(t,this.offset+e,r);break;case"ascii":s=this.parent.asciiWrite(t,this.offset+e,r);break;case"binary":s=this.parent.binaryWrite(t,this.offset+e,r);break;case"base64":s=this.parent.base64Write(t,this.offset+e,r);break;case"ucs2":case"ucs-2":s=this.parent.ucs2Write(t,this.offset+e,r);break;default:throw new Error("Unknown encoding")}return p._charsWritten=n._charsWritten,s},p.prototype.toString=function(t,e,r){switch(t=String(t||"utf8").toLowerCase(),void 0===e||e<0?e=0:e>this.length&&(e=this.length),void 0===r||r>this.length?r=this.length:r<0&&(r=0),e+=this.offset,r+=this.offset,t){case"hex":return this.parent.hexSlice(e,r);case"utf8":case"utf-8":return this.parent.utf8Slice(e,r);case"ascii":return this.parent.asciiSlice(e,r);case"binary":return this.parent.binarySlice(e,r);case"base64":return this.parent.base64Slice(e,r);case"ucs2":case"ucs-2":return this.parent.ucs2Slice(e,r);default:throw new Error("Unknown encoding")}},p.byteLength=n.byteLength,p.prototype.fill=function(t,e,r){if(t||(t=0),e||(e=0),r||(r=this.length),"string"==typeof t&&(t=t.charCodeAt(0)),"number"!=typeof t||isNaN(t))throw new Error("value is not a number");if(r=this.length)throw new Error("start out of bounds");if(r<0||r>this.length)throw new Error("end out of bounds");return this.parent.fill(t,e+this.offset,r+this.offset)},p.prototype.copy=function(t,e,r,n){var o=this;if(r||(r=0),n||(n=this.length),e||(e=0),n=t.length)throw new Error("targetStart out of bounds");if(r<0||r>=o.length)throw new Error("sourceStart out of bounds");if(n<0||n>o.length)throw new Error("sourceEnd out of bounds");return n>this.length&&(n=this.length),t.length-ethis.length)throw new Error("oob");if(t>e)throw new Error("oob");return new p(this.parent,e-t,+t+this.offset)},p.prototype.utf8Slice=function(t,e){return this.toString("utf8",t,e)},p.prototype.binarySlice=function(t,e){return this.toString("binary",t,e)},p.prototype.asciiSlice=function(t,e){return this.toString("ascii",t,e)},p.prototype.utf8Write=function(t,e){return this.write(t,e,"utf8")},p.prototype.binaryWrite=function(t,e){return this.write(t,e,"binary")},p.prototype.asciiWrite=function(t,e){return this.write(t,e,"ascii")},p.prototype.readUInt8=function(t,e){var r=this;if(e||(i.ok(null!=t,"missing offset"),i.ok(t=r.length))return r.parent[r.offset+t]},p.prototype.readUInt16LE=function(t,e){return l(this,t,!1,e)},p.prototype.readUInt16BE=function(t,e){return l(this,t,!0,e)},p.prototype.readUInt32LE=function(t,e){return y(this,t,!1,e)},p.prototype.readUInt32BE=function(t,e){return y(this,t,!0,e)},p.prototype.readInt8=function(t,e){var r=this;if(e||(i.ok(null!=t,"missing offset"),i.ok(t=r.length))return 128&r.parent[r.offset+t]?-1*(255-r.parent[r.offset+t]+1):r.parent[r.offset+t]},p.prototype.readInt16LE=function(t,e){return g(this,t,!1,e)},p.prototype.readInt16BE=function(t,e){return g(this,t,!0,e)},p.prototype.readInt32LE=function(t,e){return d(this,t,!1,e)},p.prototype.readInt32BE=function(t,e){return d(this,t,!0,e)},p.prototype.readFloatLE=function(t,e){return v(this,t,!1,e)},p.prototype.readFloatBE=function(t,e){return v(this,t,!0,e)},p.prototype.readDoubleLE=function(t,e){return w(this,t,!1,e)},p.prototype.readDoubleBE=function(t,e){return w(this,t,!0,e)},p.prototype.writeUInt8=function(t,e,r){var n=this;r||(i.ok(null!=t,"missing value"),i.ok(null!=e,"missing offset"),i.ok(e=0?n.writeUInt8(t,e,r):n.writeUInt8(255+t+1,e,r)},p.prototype.writeInt16LE=function(t,e,r){x(this,t,e,!1,r)},p.prototype.writeInt16BE=function(t,e,r){x(this,t,e,!0,r)},p.prototype.writeInt32LE=function(t,e,r){S(this,t,e,!1,r)},p.prototype.writeInt32BE=function(t,e,r){S(this,t,e,!0,r)},p.prototype.writeFloatLE=function(t,e,r){B(this,t,e,!1,r)},p.prototype.writeFloatBE=function(t,e,r){B(this,t,e,!0,r)},p.prototype.writeDoubleLE=function(t,e,r){I(this,t,e,!1,r)},p.prototype.writeDoubleBE=function(t,e,r){I(this,t,e,!0,r)},n.prototype.readUInt8=p.prototype.readUInt8,n.prototype.readUInt16LE=p.prototype.readUInt16LE,n.prototype.readUInt16BE=p.prototype.readUInt16BE,n.prototype.readUInt32LE=p.prototype.readUInt32LE,n.prototype.readUInt32BE=p.prototype.readUInt32BE,n.prototype.readInt8=p.prototype.readInt8,n.prototype.readInt16LE=p.prototype.readInt16LE,n.prototype.readInt16BE=p.prototype.readInt16BE,n.prototype.readInt32LE=p.prototype.readInt32LE,n.prototype.readInt32BE=p.prototype.readInt32BE,n.prototype.readFloatLE=p.prototype.readFloatLE,n.prototype.readFloatBE=p.prototype.readFloatBE,n.prototype.readDoubleLE=p.prototype.readDoubleLE,n.prototype.readDoubleBE=p.prototype.readDoubleBE,n.prototype.writeUInt8=p.prototype.writeUInt8,n.prototype.writeUInt16LE=p.prototype.writeUInt16LE,n.prototype.writeUInt16BE=p.prototype.writeUInt16BE,n.prototype.writeUInt32LE=p.prototype.writeUInt32LE,n.prototype.writeUInt32BE=p.prototype.writeUInt32BE,n.prototype.writeInt8=p.prototype.writeInt8,n.prototype.writeInt16LE=p.prototype.writeInt16LE,n.prototype.writeInt16BE=p.prototype.writeInt16BE,n.prototype.writeInt32LE=p.prototype.writeInt32LE,n.prototype.writeInt32BE=p.prototype.writeInt32BE,n.prototype.writeFloatLE=p.prototype.writeFloatLE,n.prototype.writeFloatBE=p.prototype.writeFloatBE,n.prototype.writeDoubleLE=p.prototype.writeDoubleLE,n.prototype.writeDoubleBE=p.prototype.writeDoubleBE},{assert:1,"./buffer_ieee754":5,"base64-js":7}],7:[function(t,e,r){!function(){"use strict";var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";e.exports.toByteArray=function(e){var r,n,o,i,s,a;if(e.length%4>0)throw"Invalid string. Length must be a multiple of 4";for(a=[],o=(s=(s=e.indexOf("="))>0?e.length-s:0)>0?e.length-4:e.length,r=0,n=0;r>16),a.push((65280&i)>>8),a.push(255&i);return 2===s?(i=t.indexOf(e[r])<<2|t.indexOf(e[r+1])>>4,a.push(255&i)):1===s&&(i=t.indexOf(e[r])<<10|t.indexOf(e[r+1])<<4|t.indexOf(e[r+2])>>2,a.push(i>>8&255),a.push(255&i)),a},e.exports.fromByteArray=function(e){var r,n,o,i,s=e.length%3,a="";for(r=0,o=e.length-s;r>18&63]+t[i>>12&63]+t[i>>6&63]+t[63&i];switch(s){case 1:n=e[e.length-1],a+=t[n>>2],a+=t[n<<4&63],a+="==";break;case 2:n=(e[e.length-2]<<8)+e[e.length-1],a+=t[n>>10],a+=t[n>>4&63],a+=t[n<<2&63],a+="="}return a}}()},{}],8:[function(t,e,r){r.readIEEE754=function(t,e,r,n,o){var i,s,a=8*o-n-1,f=(1<>1,c=-7,h=r?0:o-1,p=r?1:-1,l=t[e+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[e+h],h+=p,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=n;c>0;s=256*s+t[e+h],h+=p,c-=8);if(0===i)i=1-u;else{if(i===f)return s?NaN:1/0*(l?-1:1);s+=Math.pow(2,n),i-=u}return(l?-1:1)*s*Math.pow(2,i-n)},r.writeIEEE754=function(t,e,r,n,o,i){var s,a,f,u=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?i-1:0,y=n?-1:1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(f=Math.pow(2,-s))<1&&(s--,f*=2),(e+=s+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(s++,f/=2),s+h>=c?(a=0,s=c):s+h>=1?(a=(e*f-1)*Math.pow(2,o),s+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,o),s=0));o>=8;t[r+l]=255&a,l+=y,a/=256,o-=8);for(s=s<0;t[r+l]=255&s,l+=y,s/=256,u-=8);t[r+l-y]|=128*g}},{}],3:[function(t,e,r){function n(t){this.length=t}var o,i=t("assert");function s(t){return t<16?"0"+t.toString(16):t.toString(16)}function a(t){for(var e=[],r=0;r=e.length||o>=t.length);)e[o+r]=t[o],o++;return o}function c(t){try{return decodeURIComponent(t)}catch(t){return String.fromCharCode(65533)}}function h(t){return(t=~~Math.ceil(+t))<0?0:t}function p(t,e,r){if(!(this instanceof p))return new p(t,e,r);var i;if("number"==typeof r)this.length=h(e),this.parent=t,this.offset=r;else{switch(i=typeof t){case"number":this.length=h(t);break;case"string":this.length=p.byteLength(t,e);break;case"object":this.length=h(t.length);break;default:throw new Error("First argument needs to be a number, array or string.")}if(this.length>p.poolSize?(this.parent=new n(this.length),this.offset=0):((!o||o.length-o.used>>0):(o=t.parent[t.offset+e+2]<<16,o|=t.parent[t.offset+e+1]<<8,o|=t.parent[t.offset+e],o+=t.parent[t.offset+e+3]<<24>>>0),o}function g(t,e,r,n){var o;return n||(i.ok("boolean"==typeof r,"missing or invalid endian"),i.ok(null!=e,"missing offset"),i.ok(e+1=0,"specified a negative value for writing an unsigned value"),i.ok(t<=e,"value is larger than maximum value for type"),i.ok(Math.floor(t)===t,"value has a fractional component")}function m(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+1>>8,t.parent[t.offset+r+1]=255&e):(t.parent[t.offset+r+1]=(65280&e)>>>8,t.parent[t.offset+r]=255&e)}function E(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+3>>24&255,t.parent[t.offset+r+1]=e>>>16&255,t.parent[t.offset+r+2]=e>>>8&255,t.parent[t.offset+r+3]=255&e):(t.parent[t.offset+r+3]=e>>>24&255,t.parent[t.offset+r+2]=e>>>16&255,t.parent[t.offset+r+1]=e>>>8&255,t.parent[t.offset+r]=255&e)}function _(t,e,r){i.ok("number"==typeof t,"cannot write a non-number as a number"),i.ok(t<=e,"value larger than maximum allowed value"),i.ok(t>=r,"value smaller than minimum allowed value"),i.ok(Math.floor(t)===t,"value has a fractional component")}function k(t,e,r){i.ok("number"==typeof t,"cannot write a non-number as a number"),i.ok(t<=e,"value larger than maximum allowed value"),i.ok(t>=r,"value smaller than minimum allowed value")}function x(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+1=0?e:65535+e+1,r,n,o)}function S(t,e,r,n,o){o||(i.ok(null!=e,"missing value"),i.ok("boolean"==typeof n,"missing or invalid endian"),i.ok(null!=r,"missing offset"),i.ok(r+3=0?e:4294967295+e+1,r,n,o)}function B(e,r,n,o,s){s||(i.ok(null!=r,"missing value"),i.ok("boolean"==typeof o,"missing or invalid endian"),i.ok(null!=n,"missing offset"),i.ok(n+3"},n.prototype.hexSlice=function(t,e){var r=this.length;(!t||t<0)&&(t=0),(!e||e<0||e>r)&&(e=r);for(var n="",o=t;oo&&(r=o):r=o;var i=t.length;if(i%2)throw new Error("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;si&&(r=i):r=i,n=String(n||"utf8").toLowerCase()){case"hex":return this.hexWrite(t,e,r);case"utf8":case"utf-8":return this.utf8Write(t,e,r);case"ascii":return this.asciiWrite(t,e,r);case"binary":return this.binaryWrite(t,e,r);case"base64":return this.base64Write(t,e,r);case"ucs2":case"ucs-2":return this.ucs2Write(t,e,r);default:throw new Error("Unknown encoding")}},n.prototype.slice=function(t,e){if(void 0===e&&(e=this.length),e>this.length)throw new Error("oob");if(t>e)throw new Error("oob");return new p(this,e-t,+t)},n.prototype.copy=function(t,e,r,n){for(var o=[],s=r;s"},p.prototype.get=function(t){if(t<0||t>=this.length)throw new Error("oob");return this.parent[this.offset+t]},p.prototype.set=function(t,e){if(t<0||t>=this.length)throw new Error("oob");return this.parent[this.offset+t]=e},p.prototype.write=function(t,e,r,o){if(isFinite(e))isFinite(r)||(o=r,r=void 0);else{var i=o;o=e,e=r,r=i}e=+e||0;var s,a=this.length-e;switch(r?(r=+r)>a&&(r=a):r=a,o=String(o||"utf8").toLowerCase()){case"hex":s=this.parent.hexWrite(t,this.offset+e,r);break;case"utf8":case"utf-8":s=this.parent.utf8Write(t,this.offset+e,r);break;case"ascii":s=this.parent.asciiWrite(t,this.offset+e,r);break;case"binary":s=this.parent.binaryWrite(t,this.offset+e,r);break;case"base64":s=this.parent.base64Write(t,this.offset+e,r);break;case"ucs2":case"ucs-2":s=this.parent.ucs2Write(t,this.offset+e,r);break;default:throw new Error("Unknown encoding")}return p._charsWritten=n._charsWritten,s},p.prototype.toString=function(t,e,r){switch(t=String(t||"utf8").toLowerCase(),void 0===e||e<0?e=0:e>this.length&&(e=this.length),void 0===r||r>this.length?r=this.length:r<0&&(r=0),e+=this.offset,r+=this.offset,t){case"hex":return this.parent.hexSlice(e,r);case"utf8":case"utf-8":return this.parent.utf8Slice(e,r);case"ascii":return this.parent.asciiSlice(e,r);case"binary":return this.parent.binarySlice(e,r);case"base64":return this.parent.base64Slice(e,r);case"ucs2":case"ucs-2":return this.parent.ucs2Slice(e,r);default:throw new Error("Unknown encoding")}},p.byteLength=n.byteLength,p.prototype.fill=function(t,e,r){if(t||(t=0),e||(e=0),r||(r=this.length),"string"==typeof t&&(t=t.charCodeAt(0)),"number"!=typeof t||isNaN(t))throw new Error("value is not a number");if(r=this.length)throw new Error("start out of bounds");if(r<0||r>this.length)throw new Error("end out of bounds");return this.parent.fill(t,e+this.offset,r+this.offset)},p.prototype.copy=function(t,e,r,n){var o=this;if(r||(r=0),n||(n=this.length),e||(e=0),n=t.length)throw new Error("targetStart out of bounds");if(r<0||r>=o.length)throw new Error("sourceStart out of bounds");if(n<0||n>o.length)throw new Error("sourceEnd out of bounds");return n>this.length&&(n=this.length),t.length-ethis.length)throw new Error("oob");if(t>e)throw new Error("oob");return new p(this.parent,e-t,+t+this.offset)},p.prototype.utf8Slice=function(t,e){return this.toString("utf8",t,e)},p.prototype.binarySlice=function(t,e){return this.toString("binary",t,e)},p.prototype.asciiSlice=function(t,e){return this.toString("ascii",t,e)},p.prototype.utf8Write=function(t,e){return this.write(t,e,"utf8")},p.prototype.binaryWrite=function(t,e){return this.write(t,e,"binary")},p.prototype.asciiWrite=function(t,e){return this.write(t,e,"ascii")},p.prototype.readUInt8=function(t,e){var r=this;return e||(i.ok(null!=t,"missing offset"),i.ok(t=0?n.writeUInt8(t,e,r):n.writeUInt8(255+t+1,e,r)},p.prototype.writeInt16LE=function(t,e,r){x(this,t,e,!1,r)},p.prototype.writeInt16BE=function(t,e,r){x(this,t,e,!0,r)},p.prototype.writeInt32LE=function(t,e,r){S(this,t,e,!1,r)},p.prototype.writeInt32BE=function(t,e,r){S(this,t,e,!0,r)},p.prototype.writeFloatLE=function(t,e,r){B(this,t,e,!1,r)},p.prototype.writeFloatBE=function(t,e,r){B(this,t,e,!0,r)},p.prototype.writeDoubleLE=function(t,e,r){I(this,t,e,!1,r)},p.prototype.writeDoubleBE=function(t,e,r){I(this,t,e,!0,r)},n.prototype.readUInt8=p.prototype.readUInt8,n.prototype.readUInt16LE=p.prototype.readUInt16LE,n.prototype.readUInt16BE=p.prototype.readUInt16BE,n.prototype.readUInt32LE=p.prototype.readUInt32LE,n.prototype.readUInt32BE=p.prototype.readUInt32BE,n.prototype.readInt8=p.prototype.readInt8,n.prototype.readInt16LE=p.prototype.readInt16LE,n.prototype.readInt16BE=p.prototype.readInt16BE,n.prototype.readInt32LE=p.prototype.readInt32LE,n.prototype.readInt32BE=p.prototype.readInt32BE,n.prototype.readFloatLE=p.prototype.readFloatLE,n.prototype.readFloatBE=p.prototype.readFloatBE,n.prototype.readDoubleLE=p.prototype.readDoubleLE,n.prototype.readDoubleBE=p.prototype.readDoubleBE,n.prototype.writeUInt8=p.prototype.writeUInt8,n.prototype.writeUInt16LE=p.prototype.writeUInt16LE,n.prototype.writeUInt16BE=p.prototype.writeUInt16BE,n.prototype.writeUInt32LE=p.prototype.writeUInt32LE,n.prototype.writeUInt32BE=p.prototype.writeUInt32BE,n.prototype.writeInt8=p.prototype.writeInt8,n.prototype.writeInt16LE=p.prototype.writeInt16LE,n.prototype.writeInt16BE=p.prototype.writeInt16BE,n.prototype.writeInt32LE=p.prototype.writeInt32LE,n.prototype.writeInt32BE=p.prototype.writeInt32BE,n.prototype.writeFloatLE=p.prototype.writeFloatLE,n.prototype.writeFloatBE=p.prototype.writeFloatBE,n.prototype.writeDoubleLE=p.prototype.writeDoubleLE,n.prototype.writeDoubleBE=p.prototype.writeDoubleBE},{assert:1,"./buffer_ieee754":8,"base64-js":9}],9:[function(t,e,r){!function(){"use strict";var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";e.exports.toByteArray=function(e){var r,n,o,i,s,a;if(e.length%4>0)throw"Invalid string. Length must be a multiple of 4";for(a=[],o=(s=(s=e.indexOf("="))>0?e.length-s:0)>0?e.length-4:e.length,r=0,n=0;r>16),a.push((65280&i)>>8),a.push(255&i);return 2===s?(i=t.indexOf(e[r])<<2|t.indexOf(e[r+1])>>4,a.push(255&i)):1===s&&(i=t.indexOf(e[r])<<10|t.indexOf(e[r+1])<<4|t.indexOf(e[r+2])>>2,a.push(i>>8&255),a.push(255&i)),a},e.exports.fromByteArray=function(e){var r,n,o,i,s=e.length%3,a="";for(r=0,o=e.length-s;r>18&63]+t[i>>12&63]+t[i>>6&63]+t[63&i];switch(s){case 1:n=e[e.length-1],a+=t[n>>2],a+=t[n<<4&63],a+="==";break;case 2:n=(e[e.length-2]<<8)+e[e.length-1],a+=t[n>>10],a+=t[n>>4&63],a+=t[n<<2&63],a+="="}return a}}()},{}]},{},[]),e.exports=t("buffer-browserify")},{}],30:[function(t,e,r){var n=e.exports={};n.nextTick=function(){var t="undefined"!=typeof window&&window.setImmediate,e="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(t)return function(t){return window.setImmediate(t)};if(e){var r=[];return window.addEventListener("message",(function(t){var e=t.source;e!==window&&null!==e||"process-tick"!==t.data||(t.stopPropagation(),r.length>0&&r.shift()())}),!0),function(t){r.push(t),window.postMessage("process-tick","*")}}return function(t){setTimeout(t,0)}}(),n.title="browser",n.browser=!0,n.env={},n.argv=[],n.binding=function(t){throw new Error("process.binding is not supported")},n.cwd=function(){return"/"},n.chdir=function(t){throw new Error("process.chdir is not supported")}},{}],31:[function(t,e,r){e.exports=t("./lib/urlsafe-base64")},{"./lib/urlsafe-base64":32}],32:[function(t,e,r){var n=t("__browserify_Buffer").Buffer; + /*! + * urlsafe-base64 + */r.version="1.0.0",r.encode=function(t){return t.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},r.decode=function(t){return t=(t+=Array(5-t.length%4).join("=")).replace(/\-/g,"+").replace(/\_/g,"/"),new n(t,"base64")},r.validate=function(t){return/^[A-Za-z0-9\-_]+$/.test(t)}},{__browserify_Buffer:29}]},{},[1])(1)})); diff --git a/service/dist/scripts/fernetBrowser.min.js.br b/service/dist/scripts/fernetBrowser.min.js.br new file mode 100644 index 0000000000000000000000000000000000000000..767946d7ac4ea8e3d52be93ad765f686af6dd95d GIT binary patch literal 17572 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 Ls4lp3wYR Date: Thu, 18 Dec 2025 17:59:42 +0800 Subject: [PATCH 08/98] Update: Add update-to-latest functionality and refactor update logic Introduces a new update_to_latest command to the websocket API and implements a robust update mechanism in service/utils/_update.py, supporting both MirrorC and Git-based updates. Refactors update logic in service/utils/update.py to use a new GitOperationHandler abstraction, improving reliability and maintainability. Adds PID file management to main.service.py for process tracking, and updates service/runtime.py and service/app.py to support the new update command. --- core/ocr/baas_ocr_client/server_installer.py | 253 +++++--- main.service.py | 38 +- service/app.py | 3 + service/runtime.py | 6 + service/utils/__init__.py | 3 +- service/utils/_update.py | 607 +++++++++++++++++++ service/utils/update.py | 145 ++++- 7 files changed, 949 insertions(+), 106 deletions(-) create mode 100644 service/utils/_update.py diff --git a/core/ocr/baas_ocr_client/server_installer.py b/core/ocr/baas_ocr_client/server_installer.py index 3768c630b..5068e0ee6 100644 --- a/core/ocr/baas_ocr_client/server_installer.py +++ b/core/ocr/baas_ocr_client/server_installer.py @@ -1,4 +1,15 @@ -import sys, io +import sys +import io +import shutil +import os +import platform +import subprocess +import time +from typing import Optional + +import pygit2 +from pygit2 import Commit +from pygit2.enums import ResetMode # ================================ # Check the std::in and std::out Status before @@ -11,14 +22,7 @@ sys.stdout = io.TextIOWrapper(io.BytesIO()) # ================================ -import shutil -import os -import platform -import pygit2 -from pygit2 import Commit - from core.exception import OcrInternalError -from pygit2.enums import ResetMode if sys.platform not in ["win32", "linux", "darwin"]: raise Exception("Ocr Unsupported platform " + sys.platform) @@ -37,97 +41,208 @@ arch = platform.machine().lower() if arch not in arch_map: raise Exception("Unsupported machine architecture " + arch) -branch = arch_map[arch] +TARGET_BRANCH = arch_map[arch] + + +class OcrRepoManager: + """ + Manages the OCR Server git repository. + Priority: System 'git' > pygit2 (except for rollback). + """ + + def __init__(self, repo_path: str, remote_url: str, branch: str, logger): + self.repo_path = repo_path + self.remote_url = remote_url + self.branch = branch + self.logger = logger + self.git_executable = shutil.which("git") + self.git_dir = os.path.join(repo_path, ".git") + + def _run_git_cmd(self, args: list, cwd: Optional[str] = None) -> str: + """Executes a system git command.""" + if not self.git_executable: + raise FileNotFoundError("System git not found") + + target_cwd = cwd if cwd else self.repo_path + + # Ensure directory exists before running command if not cloning + if cwd is None and not os.path.exists(target_cwd): + raise FileNotFoundError(f"Repo directory {target_cwd} does not exist") + + proc = subprocess.run( + [self.git_executable] + args, + cwd=target_cwd, + capture_output=True, + text=True, + check=True + ) + return proc.stdout.strip() + + def get_local_sha(self) -> str: + """Returns the SHA of the current local HEAD.""" + if self.git_executable: + try: + return self._run_git_cmd(["rev-parse", "HEAD"]) + except subprocess.CalledProcessError: + self.logger.warning("System git failed to get local SHA, falling back to pygit2.") + + # Fallback to pygit2 + repo = pygit2.Repository(self.repo_path) + return str(repo.head.target) + + def get_remote_sha(self) -> Optional[str]: + """Returns the SHA of the target branch on the remote.""" + if self.git_executable: + try: + # git ls-remote refs/heads/ + # Output: \trefs/heads/ + ref = f"refs/heads/{self.branch}" + output = self._run_git_cmd(["ls-remote", self.remote_url, ref], cwd=os.getcwd()) + if output: + return output.split()[0] + except Exception as e: + self.logger.warning(f"System git failed to get remote SHA: {e}") + + # Fallback to pygit2 + try: + repo = pygit2.Repository() + remote = repo.remotes.create_anonymous(self.remote_url) + target_ref_name = f"refs/heads/{self.branch}" + for head in remote.ls_remotes(): + if head.get("name") == target_ref_name: + return str(head.get("oid")) + except Exception as e: + self.logger.error(f"pygit2 failed to get remote info: {e}") + return None + return None + + def clone(self) -> None: + """Clones the repository.""" + if os.path.exists(self.repo_path): + self.logger.warning("Target directory not empty, removing old files...") + shutil.rmtree(self.repo_path, ignore_errors=True) + + for i in range(1, 4): + try: + if self.git_executable: + self.logger.info(f"Cloning with system git (Attempt {i})...") + # git clone -b + self._run_git_cmd( + ["clone", "-b", self.branch, self.remote_url, self.repo_path], + cwd=os.path.dirname(self.repo_path) + ) + else: + self.logger.info(f"Cloning with pygit2 (Attempt {i})...") + pygit2.clone_repository( + self.remote_url, + self.repo_path, + checkout_branch=self.branch, + ) + self.logger.info("Ocr Server Install success.") + return + except Exception as e: + self.logger.error(f"Failed to clone (Attempt {i}): {e}") + if i == 3: + raise OcrInternalError("Failed to install the BAAS_ocr_server. Please check your network") + time.sleep(1) + + def update(self) -> None: + """Updates the repository to the latest remote state.""" + self.logger.info("Pulling updates from the remote repository...") + + if self.git_executable: + try: + # 1. Fetch + self._run_git_cmd(["fetch", "origin", self.branch]) + # 2. Reset --hard + # We use FETCH_HEAD to ensure we are at the exact state we just fetched + self._run_git_cmd(["reset", "--hard", "FETCH_HEAD"]) + self.logger.info("Ocr Server Update success (System Git).") + return + except Exception as e: + self.logger.error(f"System git update failed: {e}. Falling back to pygit2.") + + # Fallback to pygit2 + try: + repo = pygit2.Repository(self.repo_path) + # Ensure remote exists + remote = repo.remotes["origin"] if "origin" in repo.remotes.names() else repo.remotes.create("origin", + self.remote_url) + + refspec = f"refs/heads/{self.branch}:refs/remotes/origin/{self.branch}" + remote.fetch(refspecs=[refspec]) + + remote_ref = f"refs/remotes/origin/{self.branch}" + remote_commit = repo.revparse_single(remote_ref) + + if not isinstance(remote_commit, Commit): + remote_commit = repo[remote_commit.target] + + repo.reset(remote_commit.id, ResetMode.HARD) + repo.checkout_tree(remote_commit.tree) + self.logger.info("Ocr Server Update success (pygit2).") + except Exception as e: + self.logger.error("Failed to update the BAAS_ocr_server.") + raise OcrInternalError(f"Update failed: {e}") + def check_git(logger): """ - 检查并更新 OCR Server 的本地 git 仓库 + Main entry point to check and update the OCR Server repo. """ - git_dir = os.path.join(SERVER_BIN_DIR, ".git") - if not os.path.exists(git_dir): - clone_repo(logger) + manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) + + # 1. Ensure Repo Exists + if not os.path.exists(manager.git_dir): + manager.clone() return logger.info("Ocr Server Update check.") + + # 2. Validate Local Repo Integrity try: - repo = pygit2.Repository(SERVER_BIN_DIR) - local_sha = str(repo.head.target) + local_sha = manager.get_local_sha() except Exception: logger.warning("Git Repo corrupted, remove .git folder and reinstall.") - shutil.rmtree(git_dir, ignore_errors=True) - clone_repo(logger) + shutil.rmtree(manager.git_dir, ignore_errors=True) + manager.clone() return + # 3. Check Remote try: - git = pygit2.Repository() - remote = git.remotes.create_anonymous(OCR_SERVER_PREBUILD_URL) - refs = {head.get("name"): head.get("oid") for head in remote.ls_remotes()} - remote_sha = str(refs.get(f"refs/heads/{branch}", None)) + remote_sha = manager.get_remote_sha() except Exception as e: raise OcrInternalError(f"Failed to fetch remote info: {e}") if not remote_sha: - logger.warning(f"Remote branch '{branch}' not found.") + logger.warning(f"Remote branch '{TARGET_BRANCH}' not found.") return logger.info(f"remote_sha: {remote_sha}") logger.info(f"local_sha : {local_sha}") + # 4. Update if necessary if local_sha == remote_sha: logger.info("Ocr Server No updates available.") return - logger.info("Pulling updates from the remote repository...") + # Perform update (System git preferred, pygit2 fallback) + manager.update() + # Verify update try: - remote_obj = ( - repo.remotes["origin"] - if "origin" in list(repo.remotes.names()) - else repo.remotes.create("origin", OCR_SERVER_PREBUILD_URL) - ) - refspec = f"refs/heads/{branch}:refs/remotes/origin/{branch}" - remote_obj.fetch(refspecs=[refspec]) - remote_commit = repo.revparse_single(f"refs/remotes/origin/{branch}") - if not isinstance(remote_commit, Commit): - remote_commit = repo[remote_commit.target] - repo.reset(remote_commit.id, ResetMode.HARD) - repo.checkout_tree(remote_commit.tree) - updated_sha = str(repo.head.target) - - except KeyError as ke: - logger.error(f"Branch {branch} not found in remote repository.") - raise OcrInternalError(f"Remote branch '{branch}' does not exist: {ke}") - - except Exception as e: - logger.error("Failed to update the BAAS_ocr_server.") - raise OcrInternalError(f"Update failed: {e}") - - if updated_sha == remote_sha: - logger.info("Ocr Server Update success.") - else: - logger.warning("Failed to update the BAAS_ocr_server, please check your network.") + new_local_sha = manager.get_local_sha() + if new_local_sha != remote_sha: + logger.warning("Failed to update the BAAS_ocr_server (SHA mismatch), please check your network.") + except Exception: + pass def clone_repo(logger): + """ + Wrapper for cloning the repo. + """ logger.info("Installing Ocr Server, please hang on...") - - if os.path.exists(SERVER_BIN_DIR) and os.listdir(SERVER_BIN_DIR): - logger.warning("Target directory not empty, removing old files...") - shutil.rmtree(SERVER_BIN_DIR) - - for i in range(1, 4): - try: - pygit2.clone_repository( - OCR_SERVER_PREBUILD_URL, - SERVER_BIN_DIR, - checkout_branch=branch, - ) - break - except Exception as e: - if i == 3: - raise OcrInternalError("Failed to install the BAAS_ocr_server. Please check your network") - logger.error(f"Failed to install BAAS_ocr_server, retrying... {i}") - logger.error(str(e)) - - logger.info("Ocr Server Install success.") + manager = OcrRepoManager(SERVER_BIN_DIR, OCR_SERVER_PREBUILD_URL, TARGET_BRANCH, logger) + manager.clone() diff --git a/main.service.py b/main.service.py index 7c0fc14e1..96c7196de 100644 --- a/main.service.py +++ b/main.service.py @@ -7,6 +7,16 @@ DEFAULT_PORT = int(os.getenv("BAAS_SERVICE_PORT", "8190")) +def save_pid(pid): + with open(".pid", "w") as f: + f.write(str(pid)) + + +def delete_pid_file(): + if os.path.exists(".pid"): + os.remove(".pid") + + def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Start BAAS service mode backend") parser.add_argument("--host", default=DEFAULT_HOST, help="Host to bind (default: %(default)s)") @@ -17,18 +27,22 @@ def parse_args() -> argparse.Namespace: def main() -> None: - set_log_format() - args = parse_args() - config = uvicorn.Config( - "service.app:app", - host=args.host, - port=args.port, - reload=args.reload, - log_level=args.log_level, - log_config=None - ) - server = uvicorn.Server(config) - server.run() + try: + set_log_format() + args = parse_args() + config = uvicorn.Config( + "service.app:app", + host=args.host, + port=args.port, + reload=args.reload, + log_level=args.log_level, + log_config=None + ) + server = uvicorn.Server(config) + save_pid(os.getpid()) + server.run() + finally: + delete_pid_file() if __name__ == "__main__": diff --git a/service/app.py b/service/app.py index 48f64ef30..b88874a46 100644 --- a/service/app.py +++ b/service/app.py @@ -289,6 +289,9 @@ async def websocket_trigger(websocket: WebSocket) -> None: elif cmd.command == "update_setup_toml": result = await context.runtime.check_for_update() response_payload = {"status": "ok", "data": result} + elif cmd.command == "update_to_latest": + result = await context.runtime.update_to_latest() + response_payload = {"status": "ok", "data": result} elif cmd.command == "status": response_payload = {"status": "ok", "data": context.runtime.current_status()} else: diff --git a/service/runtime.py b/service/runtime.py index a4e09493a..ac34e821d 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -300,6 +300,12 @@ async def add_config(name, server): "serial": serial_name } + @staticmethod + async def update_to_latest(): + loop = asyncio.get_running_loop() + await loop.run_in_executor(None, update_to_latest, None) + return {"status": "updated"} + @staticmethod async def remove_config(_id): shutil.rmtree(f'./config/{_id}') diff --git a/service/utils/__init__.py b/service/utils/__init__.py index 5b073239e..1e55d8b9d 100644 --- a/service/utils/__init__.py +++ b/service/utils/__init__.py @@ -8,5 +8,6 @@ "validate_cdk", "read_setup_toml", "write_setup_toml", - "check_config" + "check_config", + "update_to_latest" ] diff --git a/service/utils/_update.py b/service/utils/_update.py new file mode 100644 index 000000000..db50944c4 --- /dev/null +++ b/service/utils/_update.py @@ -0,0 +1,607 @@ +from __future__ import annotations + +import json +import logging +import os +import shutil +import stat +import subprocess +import sys +import tempfile +import time +import zipfile +from pathlib import Path +from types import SimpleNamespace +from typing import Any, Dict, List, Optional, Union + +import pygit2 +import requests +import tomli_w +from pygit2.enums import ResetMode + +# External dependencies (assumed to exist based on context) +from deploy.installer.const import GetShaMethod, get_remote_sha_methods, REPO_BRANCH +from deploy.installer.mirrorc_update.mirrorc_updater import MirrorC_Updater +from deploy.installer.toml_config import DEFAULT_SETTINGS + + +# ============================================================================== +# 1. Utility Classes (File System & Networking) +# ============================================================================== + +class FileSystemUtils: + """ + Utilities for file system operations, downloads, and archive handling. + """ + + @staticmethod + def on_rm_error(func: Any, path: str, _exc_info: Any) -> None: + """ + Error handler for shutil.rmtree. + If the error is due to read-only access, change the mode and try again. + """ + try: + os.chmod(path, stat.S_IWUSR) + func(path) + except Exception: + pass + + @staticmethod + def download_file(url: str, parent_path: Path) -> Path: + """ + Downloads a file from a URL to the specified directory with progress logging. + """ + filename = url.split("/")[-1] + logging.info(f"Prepare for downloading {filename}") + + try: + response = requests.get(url, stream=True, timeout=30) + response.raise_for_status() + except requests.RequestException as e: + raise RuntimeError(f"Network error downloading {url}: {e}") + + file_path = parent_path / filename + total_size = int(response.headers.get("Content-Length", 0)) + + with open(file_path, "wb") as download_f: + for chunk in response.iter_content(chunk_size=1024 * 64): + if not chunk: + continue + download_f.write(chunk) + + logging.info(f"Downloaded {filename} to {file_path} (Size: {total_size})") + return file_path + + @staticmethod + def unzip_file(zip_path: Path, out_dir: Path) -> None: + """ + Extracts a zip archive to the target directory. + """ + if not zipfile.is_zipfile(zip_path): + raise ValueError(f"{zip_path} is not a valid zip file.") + + with zipfile.ZipFile(zip_path, "r") as zip_ref: + zip_ref.extractall(path=out_dir) + logging.info(f"{zip_path} unzip success -> {out_dir}") + + @staticmethod + def copy_directory_structure(source: Path, target: Path) -> None: + """ + Recursively copies a directory structure. + """ + target.mkdir(parents=True, exist_ok=True) + for item in source.iterdir(): + target_path = target / item.relative_to(source) + if item.is_dir(): + FileSystemUtils.copy_directory_structure(item, target_path) + elif item.is_file(): + shutil.copy2(item, target_path) + + @staticmethod + def delete_pid_file(): + if os.path.exists(".pid"): + os.remove(".pid") + +# ============================================================================== +# 2. Git Operation Handler (System Git > Pygit2) +# ============================================================================== + +class GitOperationHandler: + """ + Encapsulates all Git operations. + + Priority Rule: + 1. System Git (subprocess): Used for Read/Write/Update if available. + 2. Pygit2: Used as fallback if System Git is missing. + """ + + def __init__(self, repo_path: Path): + self.repo_path = repo_path + self.git_executable = shutil.which("git") + self.git_dir = repo_path / ".git" + + def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: + """ + Helper to execute system git commands. + """ + if not self.git_executable: + raise RuntimeError("System git executable not found.") + + target_cwd = cwd or self.repo_path + if not target_cwd.exists(): + raise FileNotFoundError(f"Directory {target_cwd} does not exist.") + + # Suppress password prompts + env = os.environ.copy() + env["GIT_TERMINAL_PROMPT"] = "0" + + try: + result = subprocess.run( + [self.git_executable, *args], + cwd=target_cwd, + capture_output=True, + text=True, + check=True, + env=env + ) + return result.stdout.strip() + except subprocess.CalledProcessError as e: + # Pass the stderr up for debugging + raise RuntimeError(f"Git command failed: {' '.join(args)}\nStderr: {e.stderr.strip()}") + + def is_valid_repo(self) -> bool: + """Check if the directory is a valid git repository.""" + if not self.git_dir.exists(): + return False + try: + if self.git_executable: + self._run_git_cmd(["rev-parse", "--is-inside-work-tree"]) + return True + else: + pygit2.Repository(str(self.repo_path)) + return True + except Exception: + return False + + def get_local_head_sha(self) -> str: + """Retrieve the current HEAD SHA.""" + if self.git_executable: + try: + return self._run_git_cmd(["rev-parse", "HEAD"]) + except Exception as e: + logging.warning(f"[System Git] Failed to get local SHA: {e}") + + # Fallback + repo = pygit2.Repository(str(self.repo_path)) + return str(repo.head.target) + + def get_remote_head_sha(self, url: str, branch: str) -> Optional[str]: + """ + Retrieve the latest SHA from the remote. + Uses ls-remote. + """ + if self.git_executable: + try: + ref = f"refs/heads/{branch}" + output = self._run_git_cmd(["ls-remote", url, ref], cwd=Path.cwd()) # generic cwd + if output: + return output.split()[0] + except Exception as e: + logging.warning(f"[System Git] Failed to ls-remote: {e}") + + # Fallback + try: + # Use a temporary bare repo context to avoid locking/config issues + with tempfile.TemporaryDirectory() as tmp_dir: + repo = pygit2.init_repository(tmp_dir, bare=True) + remote = repo.remotes.create_anonymous(url) + target_ref = f"refs/heads/{branch}" + for head in remote.ls_remotes(): + if head.get("name") == target_ref: + return str(head.get("oid")) + except Exception as e: + logging.error(f"[PyGit2] Failed to get remote SHA: {e}") + + return None + + def clone(self, url: str) -> None: + """Clones the repository.""" + if self.repo_path.exists() and any(self.repo_path.iterdir()): + logging.warning(f"Directory {self.repo_path} is not empty. Cleaning up...") + shutil.rmtree(self.repo_path, onerror=FileSystemUtils.on_rm_error) + + self.repo_path.mkdir(parents=True, exist_ok=True) + + if self.git_executable: + logging.info("Cloning with System Git...") + self._run_git_cmd(["clone", url, "."], cwd=self.repo_path) + else: + logging.info("Cloning with PyGit2...") + pygit2.clone_repository(url, str(self.repo_path)) + + def ensure_remote_url(self, target_url: str) -> None: + """ + Ensures the 'origin' remote matches the target URL. + If not, it updates the remote. + """ + if self.git_executable: + try: + current_url = self._run_git_cmd(["remote", "get-url", "origin"]) + if current_url.strip() != target_url: + logging.info(f"Switching remote URL: {current_url} -> {target_url}") + self._run_git_cmd(["remote", "set-url", "origin", target_url]) + return + except Exception as e: + logging.warning(f"[System Git] Failed to check remote URL: {e}") + + # Fallback / Pygit2 logic + try: + repo = pygit2.Repository(str(self.repo_path)) + origin = repo.remotes["origin"] + if origin.url != target_url: + logging.info(f"Switching remote URL (PyGit2): {origin.url} -> {target_url}") + repo.remotes.delete("origin") + repo.remotes.create("origin", target_url) + # Note: Upstream branch tracking fixup is complex in pygit2, + # usually a fetch + checkout handles it in the next step. + except Exception as e: + logging.error(f"Failed to switch remote URL: {e}") + + def fetch_and_reset(self, branch: str) -> None: + """ + Performs a fetch and hard reset to the remote branch. + """ + logging.info("Pulling updates from remote...") + + if self.git_executable: + try: + self._run_git_cmd(["fetch", "origin"]) + self._run_git_cmd(["reset", "--hard", f"origin/{branch}"]) + self._run_git_cmd(["checkout", branch]) + return + except Exception as e: + logging.error(f"[System Git] Update failed: {e}") + # Fall through to fallback + + # Fallback / Pygit2 + try: + repo = pygit2.Repository(str(self.repo_path)) + origin = repo.remotes["origin"] + + # Simple progress callback + class Progress(pygit2.callbacks.RemoteCallbacks): + def transfer_progress(self, stats): + pass # Keep log clean or add logging if needed + + origin.fetch(callbacks=Progress()) + + remote_ref_name = f"refs/remotes/origin/{branch}" + remote_commit_oid = repo.lookup_reference(remote_ref_name).target + + repo.reset(remote_commit_oid, ResetMode.HARD) + repo.checkout(f"refs/heads/{branch}") + except Exception as e: + raise RuntimeError(f"PyGit2 Update failed: {e}") + + def repair_repo(self, url: str) -> None: + """ + Destructive repair: Deletes .git and re-clones into a temp folder, then moves files back. + """ + logging.warning("Attempting to repair invalid/corrupted Git repo...") + + # 1. Clean existing .git + if self.git_dir.exists(): + shutil.rmtree(self.git_dir, onerror=FileSystemUtils.on_rm_error) + + # 2. Clone to temp + with tempfile.TemporaryDirectory() as tmp_dir: + temp_repo_path = Path(tmp_dir) / "temp_clone" + temp_repo_path.mkdir() + + # Use self.clone logic (supports system git) + temp_handler = GitOperationHandler(temp_repo_path) + temp_handler.clone(url) + + # 3. Move files + logging.info("Restoring repository files...") + for item in temp_repo_path.iterdir(): + dst = self.repo_path / item.name + if dst.exists(): + if dst.is_dir(): + shutil.rmtree(dst, onerror=FileSystemUtils.on_rm_error) + else: + dst.unlink() + shutil.move(str(item), str(dst)) + + logging.info("Git repository successfully repaired.") + + +# ============================================================================== +# 3. Update Manager (Orchestrator) +# ============================================================================== + +class UpdateManager: + """ + Manages the update process for BAAS. + Coordinates between Config, Git, and MirrorC. + """ + + def __init__(self, setup_data: Dict[str, Any], config_path: Path): + # Convert dict to SimpleNamespace for dot-access compatibility + if isinstance(setup_data, dict): + self.data = json.loads(json.dumps(setup_data), object_hook=lambda d: SimpleNamespace(**d)) + else: + self.data = setup_data + + self.config_path = config_path + self.root_path = Path(self.data.Paths.BAAS_ROOT_PATH) + self.tmp_path = self.root_path / self.data.Paths.TMP_PATH + + self.git_ops = GitOperationHandler(self.root_path) + self.mirrorc = MirrorC_Updater(app="BAAS_repo", current_version="") + + self.local_sha = "" + self.remote_sha = "" + self.update_type = "latest" # 'latest', 'full', 'incremental' + self.mirrorc_cdk = self.data.General.mirrorc_cdk + + def save_config(self, key_path: str, value: Any) -> None: + """Updates a specific key in the TOML config file.""" + keys = key_path.split('.') + # Reload raw dict to ensure we don't lose data during simpleNamespace conversion + if self.config_path.exists(): + with open(self.config_path, "rb") as f: + import tomli as tomllib + current_data = tomllib.load(f) + else: + current_data = DEFAULT_SETTINGS.copy() + + # Navigate to key + ref = current_data + for k in keys[:-1]: + ref = ref.setdefault(k, {}) + ref[keys[-1]] = value + + # Write back + with open(self.config_path, "wb") as f: + tomli_w.dump(current_data, f) + + def determine_update_status(self) -> None: + """ + Checks local vs remote versions and determines if update is needed. + """ + self.local_sha = self.data.General.current_BAAS_version + + # Case 1: No local version recorded (First install or corrupted config) + if not self.local_sha: + if self.git_ops.is_valid_repo(): + try: + self.local_sha = self.git_ops.get_local_head_sha() + except Exception as e: + logging.error(f"Repo corrupted: {e}. Triggering full reinstall.") + self.update_type = "full" + return + else: + self.update_type = "full" + return + + # Case 2: Standard version check + self.mirrorc.set_version(self.local_sha) + + try: + self.remote_sha = self._fetch_best_remote_sha() + except Exception: + logging.error("Could not fetch remote SHA. Skipping update.") + self.update_type = "latest" + return + + logging.info(f"Local SHA : {self.local_sha}") + logging.info(f"Remote SHA: {self.remote_sha}") + + if self.local_sha == self.remote_sha: + self.update_type = "latest" + else: + self.update_type = "incremental" + + def _fetch_best_remote_sha(self) -> str: + """ + Iterates through configured methods to find the remote SHA. + Saves the successful method for future use. + """ + # 1. Try saved method first + saved_method_name = self.data.General.get_remote_sha_method + if saved_method_name: + method_conf = next((m for m in get_remote_sha_methods if m["name"] == saved_method_name), None) + if method_conf: + sha = self._get_sha_from_method(method_conf) + if sha: return sha + + # 2. Try all methods + for method in get_remote_sha_methods: + sha = self._get_sha_from_method(method) + if sha: + logging.info(f"Setting default remote SHA method -> [ {method['name']} ]") + self.save_config("General.get_remote_sha_method", method["name"]) + return sha + + raise RuntimeError("All remote SHA fetch methods failed.") + + def _get_sha_from_method(self, method: Dict) -> Optional[str]: + """executes a specific SHA retrieval strategy.""" + logging.info(f"[ {method['name']} ] Fetching latest SHA...") + + if method["method"] == GetShaMethod.GITHUB_API: + return self._github_api_get_sha(method) + elif method["method"] == GetShaMethod.PYGIT2: + # We use our Git wrapper here, but adapt the input + return self.git_ops.get_remote_head_sha(method["url"], method["branch"]) + elif method["method"] == GetShaMethod.MIRRORC_API: + return self._mirrorc_api_get_sha() + return None + + @staticmethod + def _github_api_get_sha(data: Dict) -> Optional[str]: + url = f"https://api.github.com/repos/{data['owner']}/{data['repo']}/branches/{data['branch']}" + try: + resp = requests.get(url, timeout=5) + if resp.status_code == 200: + return resp.json().get("commit", {}).get("sha") + except Exception as e: + logging.warning(f"GitHub API Error: {e}") + return None + + def _mirrorc_api_get_sha(self) -> Optional[str]: + try: + ret = self.mirrorc.get_latest_version(cdk=self.mirrorc_cdk) + if ret.has_data: + return ret.latest_version_name + logging.warning(f"MirrorC API Error: {ret.message}") + except Exception as e: + logging.warning(f"MirrorC API Exception: {e}") + return None + + def execute_update(self) -> None: + """ + Main execution flow. + """ + if self.update_type == "latest": + logging.info("No Update Available.") + return + + # Strategy: Try MirrorC first (if CDK exists), then Git + success = False + if self.mirrorc_cdk: + success = self._try_mirrorc_update() + + if not success: + self._try_git_update() + + def _try_mirrorc_update(self) -> bool: + """ + Attempts update via MirrorC (Incremental or Full). + """ + # Get info from MirrorC + ret = self.mirrorc.get_latest_version(cdk=self.mirrorc_cdk) + if not ret.has_url: + logging.warning("MirrorC valid but no download URL returned.") + return False + + # Check versions match + if ret.latest_version_name == self.local_sha and self.update_type != "full": + logging.info("MirrorC indicates up to date.") + return True + + # Handle Incremental Wait Logic + if ret.update_type == "full" and self.update_type == "incremental": + logging.info("Waiting for incremental package generation...") + for i in range(10): + time.sleep(1) + ret = self.mirrorc.get_latest_version(cdk=self.mirrorc_cdk) + if ret.update_type == "incremental": + break + + try: + # Download + file_mb = ret.file_size / (1024 * 1024) + logging.info(f"Downloading MirrorC package ({ret.update_type}), Size: {file_mb:.2f} MB") + self.tmp_path.mkdir(parents=True, exist_ok=True) + zip_path = FileSystemUtils.download_file(ret.download_url, self.tmp_path) + + # Unzip + FileSystemUtils.unzip_file(zip_path, self.tmp_path) + + if ret.update_type == "incremental": + logging.info("Applying Incremental Patch...") + MirrorC_Updater.apply_update( + self.tmp_path, + self.tmp_path / "changes.json", + self.root_path, + logging + ) + else: + logging.info("Applying Full Install...") + extracted_root = self.tmp_path / "blue_archive_auto_script" + FileSystemUtils.copy_directory_structure(extracted_root, self.root_path) + + # Cleanup .git if we are moving to pure file management via MirrorC + if self.git_ops.git_dir.exists(): + logging.info("Removing .git directory after MirrorC update...") + shutil.rmtree(self.git_ops.git_dir, onerror=FileSystemUtils.on_rm_error) + + self.save_config("General.current_BAAS_version", ret.latest_version_name) + logging.info("MirrorC Update Success!") + return True + + except Exception as e: + logging.error(f"MirrorC Update Failed: {e}") + return False + + def _try_git_update(self) -> None: + """ + Attempts update via Git. + """ + logging.info("+--------------------------------+") + logging.info("| GIT UPDATE BAAS |") + logging.info("+--------------------------------+") + + try: + # 1. Check/Repair Repo + if not self.git_ops.is_valid_repo(): + self.git_ops.repair_repo(self.data.URLs.REPO_URL_HTTP) + + # 2. Check Remote URL + self.git_ops.ensure_remote_url(self.data.URLs.REPO_URL_HTTP) + + # 3. Clean if requested + if self.data.General.refresh: + logging.info("Refresh enabled: Dropping local changes.") + # Logic handled implicitly by fetch_and_reset(ResetMode.HARD) + + # 4. Update + self.git_ops.fetch_and_reset(REPO_BRANCH) + + # 5. Verify + new_sha = self.git_ops.get_local_head_sha() + self.save_config("General.current_BAAS_version", new_sha) + + if new_sha == self.remote_sha: + logging.info("Git Update Success.") + else: + # Warning only, as sometimes remote SHA detection lags or differs slightly + logging.warning("Update finished, but SHA does not match expected remote SHA.") + + except Exception as e: + if "ownership" in str(e).lower(): + logging.error("Ownership error detected. Attempting full repair...") + self.git_ops.repair_repo(self.data.URLs.REPO_URL_HTTP) + self.git_ops.fetch_and_reset(REPO_BRANCH) + else: + logging.error(f"Git Update Failed: {e}") + raise + + +# ============================================================================== +# 4. Entry Point (Backward Compatibility) +# ============================================================================== + +def update_repo_to_latest(setup_data: Dict[str, Any], path: Union[str, Path]) -> None: + """ + Main entry point for the update process. + """ + config_path = Path(path) + + manager = UpdateManager(setup_data, config_path) + + # 1. Determine what needs to be done + manager.determine_update_status() + + # 2. Execute + manager.execute_update() + + # 3. Restart + logging.info("Update Success! Now restarting ...") + + os.execv(sys.executable, ['python'] + sys.argv) + + +__all__ = ["update_repo_to_latest"] diff --git a/service/utils/update.py b/service/utils/update.py index bd10b146e..f5189d7fe 100644 --- a/service/utils/update.py +++ b/service/utils/update.py @@ -1,13 +1,17 @@ from __future__ import annotations import time +import pygit2 +import shutil +import subprocess +from pathlib import Path +from typing import Union, List, Tuple from dataclasses import dataclass from datetime import datetime, timezone -from pathlib import Path from types import SimpleNamespace -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, Dict, Optional +from pygit2.enums import ResetMode -import pygit2 import requests import tomli_w @@ -21,9 +25,103 @@ from deploy.installer.mirrorc_update.mirrorc_updater import MirrorC_Updater from deploy.installer.toml_config import DEFAULT_SETTINGS +from ._update import update_repo_to_latest + RepositoryResult = Dict[str, Any] +class GitOperationHandler: + """ + Encapsulates Git operations. + Priority: + 1. If system 'git' executable exists, use it for read operations (ls-remote, rev-parse). + 2. If not, fall back to 'pygit2'. + 3. For critical state changes like rollback, 'pygit2' is preferred/enforced. + """ + + def __init__(self, repo_path: Union[str, Path] = "."): + self.repo_path = Path(repo_path) + self.git_executable = None and shutil.which("git") + + def _run_git_cmd(self, args: List[str]) -> str: + """Helper to run system git commands.""" + if not self.git_executable: + raise FileNotFoundError("Git executable not found.") + + # Ensure we run in the correct directory + result = subprocess.run( + [self.git_executable, *args], + cwd=self.repo_path, + capture_output=True, + text=True, + check=True + ) + return result.stdout.strip() + + def get_remote_latest_sha(self, url: str, branch: str) -> str: + """ + Get the SHA of a remote branch. + Uses `git ls-remote` if available, otherwise uses pygit2 anonymous remote. + """ + if self.git_executable: + try: + # Command: git ls-remote refs/heads/ + # Output format: \trefs/heads/ + ref = f"refs/heads/{branch}" + output = self._run_git_cmd(["ls-remote", url, ref]) + if output: + return output.split()[0] + raise ValueError(f"Branch '{branch}' not found at {url} (System Git)") + except (subprocess.CalledProcessError, IndexError, ValueError) as e: + # If system git fails, try fallback or just raise + raise RuntimeError(f"System git failed: {e}") + + # Fallback to pygit2 + repo = pygit2.Repository(self.repo_path) + # Create anonymous remote to avoid modifying config + remote = repo.remotes.create_anonymous(url) + target_ref = f"refs/heads/{branch}" + for head in remote.ls_remotes(): + if head.get("name") == target_ref: + return str(head.get("oid")) + raise ValueError(f"Branch '{branch}' not found at {url} (pygit2)") + + def get_local_head_info(self) -> Tuple[str, str]: + """ + Get the current local SHA and branch name. + Returns: (sha, branch_name) + """ + if self.git_executable: + try: + # Get SHA: git rev-parse HEAD + sha = self._run_git_cmd(["rev-parse", "HEAD"]) + + # Get Branch: git rev-parse --abbrev-ref HEAD + # Note: Returns "HEAD" if detached + branch = self._run_git_cmd(["rev-parse", "--abbrev-ref", "HEAD"]) + return sha, branch + except subprocess.CalledProcessError: + # Likely empty repo or error + raise RuntimeError("Failed to retrieve local git info via system git.") + + # Fallback to pygit2 + repo = pygit2.Repository(self.repo_path) + sha = str(repo.revparse_single("HEAD").id) + branch = repo.head.shorthand + return sha, branch + + def rollback(self, target_sha: str): + """ + Rollback the repository to a specific SHA. + Per requirements, this strictly uses pygit2. + """ + repo = pygit2.Repository(self.repo_path) + # Logic for rollback using pygit2 (e.g., reset --hard) + # This is a placeholder for where the rollback logic would go. + commit = repo.revparse_single(target_sha) + repo.reset(commit.id, ResetMode.HARD) + + @dataclass class VersionInfo: """Normalized version data loaded from setup.toml.""" @@ -68,17 +166,19 @@ def _mirrorc_api_get_latest_sha(timeout: float) -> Tuple[bool, str]: return False, str(exc) -def _pygit2_get_latest_sha(config: Dict[str, Any]) -> Tuple[bool, str]: +def _git_wrapper_get_latest_sha(config: Dict[str, Any]) -> Tuple[bool, str]: + """ + Replaces the direct pygit2 call. + Uses GitOperationHandler to determine whether to use system git or pygit2. + """ url = config["url"] branch = config["branch"] - target_ref = f"refs/heads/{branch}" + + git_ops = GitOperationHandler(Path.cwd()) + try: - git = pygit2.Repository(".") - remote = git.remotes.create_anonymous(url) - for head in remote.ls_remotes(): - if head.get("name") == target_ref: - return True, str(head.get("oid")) - return False, f"Branch '{branch}' not found at {url}" + sha = git_ops.get_remote_latest_sha(url, branch) + return True, sha except Exception as exc: return False, str(exc) @@ -100,7 +200,8 @@ def test_repo_sha(config: dict[str, Union[str, GetShaMethod]], timeout: float) - elif method == GetShaMethod.MIRRORC_API: success, value = _mirrorc_api_get_latest_sha(timeout) else: - success, value = _pygit2_get_latest_sha(config) + # Renamed to indicate it uses the wrapper logic + success, value = _git_wrapper_get_latest_sha(config) elapsed = time.perf_counter() - start result: RepositoryResult = { "name": config.get("name"), @@ -192,11 +293,12 @@ def validate_cdk(cdk: str, timeout: float = 3.0) -> Dict[str, Any]: def get_local_version(setup_path: Optional[Path] = None) -> Tuple["VersionInfo", Dict[str, Any], str]: data, path = read_setup_toml(setup_path) + + # Use GitOperationHandler to abstract system git vs pygit2 + git_ops = GitOperationHandler(Path.cwd()) + try: - repo = pygit2.Repository(Path.cwd()) - _branch = repo.head.shorthand - commit = repo.revparse_single("HEAD") - version_value = str(commit.id) + version_value, _branch = git_ops.get_local_head_info() data.setdefault("General", {})["current_BAAS_version"] = version_value with path.open("wb") as file: tomli_w.dump(data, file) @@ -287,11 +389,6 @@ def check_for_update(timeout: float = 3.0) -> Dict[str, Any]: return {} -__all__ = [ - "check_for_update", - "test_all_repo_sha", - "validate_cdk", - "VersionInfo", - "read_setup_toml", - "write_setup_toml" -] +def update_to_latest(setup_path: Union[Path, None] = None): + data, path = read_setup_toml(setup_path) + update_repo_to_latest(data, path) From 52c65bad091fa3a574639a3fd349de3c284a40e9 Mon Sep 17 00:00:00 2001 From: kiramei Date: Thu, 18 Dec 2025 18:13:30 +0800 Subject: [PATCH 09/98] Feat: Docker Support For Service Mode This Track made the docker available for building and deployment. --- deploy/service/docker-compose.yaml | 11 +++++++ deploy/service/dockerfile | 44 +++++++++++++++++++++++++ deploy/service/entrypoint.sh | 24 ++++++++++++++ deploy/service/requirements.service.txt | 37 +++++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 deploy/service/docker-compose.yaml create mode 100644 deploy/service/dockerfile create mode 100644 deploy/service/entrypoint.sh create mode 100644 deploy/service/requirements.service.txt diff --git a/deploy/service/docker-compose.yaml b/deploy/service/docker-compose.yaml new file mode 100644 index 000000000..a44cb42a7 --- /dev/null +++ b/deploy/service/docker-compose.yaml @@ -0,0 +1,11 @@ + +services: + baas-docker: + build: + context: . + dockerfile: dockerfile + ports: + - "8190:8190" + volumes: + - ./app:/app + restart: always diff --git a/deploy/service/dockerfile b/deploy/service/dockerfile new file mode 100644 index 000000000..e1fbb5416 --- /dev/null +++ b/deploy/service/dockerfile @@ -0,0 +1,44 @@ +FROM debian:trixie + +WORKDIR /app + +RUN apt-get update && apt-get install -y --no-install-recommends \ + git \ + curl \ + libgl1 \ + python3 \ + python3-venv \ + libglib2.0-0 \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +RUN curl -LsSf https://astral.sh/uv/install.sh | sh + +ENV PATH="/root/.local/bin:/root/.cargo/bin:$PATH" + +RUN uv python install 3.9.0 + +# ---- Python dependency layer (cache-friendly) ---- +COPY requirements.service.txt /tmp/requirements.service.txt + +RUN uv venv /opt/venv --python 3.9.0 \ + && . /opt/venv/bin/activate \ + && uv pip compile /tmp/requirements.service.txt \ + -o /tmp/requirements.service.lock \ + && uv pip sync /tmp/requirements.service.lock \ + && rm -rf /tmp/* + +RUN update-ca-certificates + +ENV PATH="/opt/venv/bin:$PATH" + +# ---- Runtime scripts ---- +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +# ---- Runtime configuration ---- +VOLUME ["/app"] + +EXPOSE 8190 + +CMD ["/entrypoint.sh"] diff --git a/deploy/service/entrypoint.sh b/deploy/service/entrypoint.sh new file mode 100644 index 000000000..45ca5c2b0 --- /dev/null +++ b/deploy/service/entrypoint.sh @@ -0,0 +1,24 @@ +#!/bin/sh +set -e + +APP_DIR="/app" +REPO_URL="https://gitee.com/Kiramei/baas-dev.git" +BRANCH="master" + +cd "$APP_DIR" + +if [ ! -d ".git" ]; then + echo "[INFO] No git repository found. Cloning repository..." + git clone "$REPO_URL" . \ + --branch "$BRANCH" \ + --depth 1 +else + echo "[INFO] Git repository found. Pulling latest changes..." + git fetch origin "$BRANCH" + git checkout "$BRANCH" + git pull --ff-only origin "$BRANCH" +fi + +echo "[INFO] Starting service..." +export GIT_SSL_CAINFO=/etc/ssl/certs/ca-certificates.crt +exec /opt/venv/bin/python main.service.py --host 0.0.0.0 diff --git a/deploy/service/requirements.service.txt b/deploy/service/requirements.service.txt new file mode 100644 index 000000000..974f4e7ed --- /dev/null +++ b/deploy/service/requirements.service.txt @@ -0,0 +1,37 @@ +# =========================== # +# Core Utils # +numpy < 2.0 # +setuptools # +adbutils == 2.2.1 # +uiautomator2 == 2.16.23 # +opencv-python == 4.8.1.78 # +# =========================== # + +# =========================== # +# Sub Utils # +psutil # +requests # +rich >= 14.2.0 # +# =========================== # + +# =========================== # +# Toml Config Process # +tomli == 2.2.1 # +tomli_w == 1.2.0 # +# =========================== # + +# =========================== # +# Steam Server Specific # +mss == 10.0.0 # +PyAutoGUI == 0.9.54 # +# =========================== # + +# =========================== # +# Service Specific # +pygit2 # +fastapi # +uvicorn # +websockets # +watchfiles # +cryptography # +# =========================== # From 0396cafe2ba2b91e79d1a114048857b6e596f5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Dec 2025 21:33:05 +0800 Subject: [PATCH 10/98] Refactor: installer logic refactor Introduces deploy/installer/installer.py with comprehensive installer logic, including environment setup, package installation, update mechanisms, and error handling. Updates build.bat to include --hidden-import=_cffi_backend for PyInstaller. Refactors deploy/installer/installer.py to streamline imports, configuration management, and utility classes, improving maintainability and modularity. --- deploy/installer/_installer.py | 1202 ++++++++++++++++++++ deploy/installer/build.bat | 2 +- deploy/installer/installer.py | 1909 +++++++++++++++----------------- 3 files changed, 2104 insertions(+), 1009 deletions(-) create mode 100644 deploy/installer/_installer.py diff --git a/deploy/installer/_installer.py b/deploy/installer/_installer.py new file mode 100644 index 000000000..13fcc96cf --- /dev/null +++ b/deploy/installer/_installer.py @@ -0,0 +1,1202 @@ +# -*- coding: utf-8 -*- +import stat +import time + +import pygit2 + +# ==================== Welcome Message ==================== +print( + """ + ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ + █ █ + █ ██████╗ █████╗ █████╗ ███████╗ █ + █ ██╔══██╗██╔══██╗██╔══██╗██╔════╝ █ + █ ██████╔╝███████║███████║███████╗ █ + █ ██╔══██╗██╔══██║██╔══██║╚════██║ █ + █ ██████╔╝██║ ██║██║ ██║███████║ █ + █ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ █ + █ █ + █===========================================================█ + █ █ + █ Welcome to BlueArchive Auto Script! █ + █ 欢迎使用蔚蓝档案自动脚本! █ + █   ブルアカオートへようこそ!  █ + █ 블루 아카이브 자동 스크립트 환영합니다! █ + █ █ + █ Developed by pur1fying █ + █ LICENSE: GPL-3.0 █ + █ https://github.com/pur1fying/blue_archive_auto_script █ + █ █ + ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ + """ +) + +# ==================== Import Statements ==================== + +import os +import gc +import re +import sys +import shutil +import zipfile +import tempfile +import platform +import subprocess +from enum import Enum, auto +from pathlib import Path + +import psutil +import getpass +import requests +import tomli_w +from copy import deepcopy +from alive_progress import alive_bar + +from easydict import EasyDict as eDict +from halo import Halo +from loguru import logger + +from pygit2 import clone_repository, Repository, RemoteCallbacks, GIT_RESET_HARD, GitError + +from toml_config import TOML_Config, DEFAULT_SETTINGS +from mirrorc_update.mirrorc_updater import MirrorC_Updater +from const import GetShaMethod, get_remote_sha_methods, REPO_BRANCH + +__system__ = platform.system() +__env__ = os.environ.copy() +if __system__ == "Windows": + __env__["PYTHONPATH"] = '.env;.venv/Lib;.venv/Scripts;.venv;.;.venv/Lib/site-packages' + +os.environ["PDM_IGNORE_ACTIVE_VENV"] = "1" + +# ==================== Default Settings ===================== + + + +repo = None +# local version +local_sha = None +# latest version +remote_sha = None +update_type = None +mirrorc_cdk = None +latest_mirrorc_return = None +mirrorc_inst = MirrorC_Updater(app="BAAS_repo", current_version="") + + +class Utils: + + @staticmethod + def on_rm_error(func, path, exc_info): + try: + os.chmod(path, stat.S_IWUSR) + func(path) + except Exception as e: + pass + + @staticmethod + def mirrorc_api_get_latest_sha(): + global mirrorc_inst + global mirrorc_cdk + global latest_mirrorc_return + try: + latest_mirrorc_return = mirrorc_inst.get_latest_version(cdk=mirrorc_cdk) + if latest_mirrorc_return.has_data: + return latest_mirrorc_return.latest_version_name + else: + logger.error(f"[MirrorC Api] get SHA error: {latest_mirrorc_return.message}") + except Exception as e: + logger.error(f"[MirrorC Api] get SHA error: {e}") + return None + + @staticmethod + def github_api_get_latest_sha(data): + owner = data["owner"] + repo = data["repo"] + branch = data["branch"] + url = f"https://api.github.com/repos/{owner}/{repo}/branches/{branch}" + try: + response = requests.get(url, timeout=3.0) + if response.status_code != 200: + return None + response_json = response.json() + return response_json.get("commit", {}).get("sha") + except requests.RequestException as e: + logger.warning(f"[Github Api] get SHA error: {e}") + return None + + @staticmethod + def pygit2_get_latest_sha(data): + with tempfile.TemporaryDirectory() as tmp_dir: + repo = pygit2.init_repository(tmp_dir, bare=True) + + url = data["url"] + branch = data["branch"] + remote = repo.remotes.create_anonymous(url) + try: + remote_refs = remote.ls_remotes() + except pygit2.GitError as e: + logger.warning(f"[PyGit2] get SHA error: {e}") + return None + target_ref = f"refs/heads/{branch}" + for ref in remote_refs: + if ref["name"] == target_ref: + return str(ref["oid"]) + return None + + @staticmethod + def get_remote_sha(): + logger.info("<<< Get Remote SHA >>>") + if G.get_remote_sha_method: + index = next( + (i for i, item in enumerate(get_remote_sha_methods) if item.get("name") == G.get_remote_sha_method), + None) + if index is not None: + sha = Utils.get_remote_sha_once(get_remote_sha_methods[index]) + if sha is not None: + return sha + get_remote_sha_methods.pop(index) + for method in get_remote_sha_methods: + sha = Utils.get_remote_sha_once(method) + if sha is not None: + logger.info(f"Set get remote SHA method --> [ {method['name']} ]") + config.set_and_save("General.get_remote_sha_method", method["name"]) + return sha + logger.error("Failed to get remote SHA from all methods.") + raise Exception("Failed to get remote SHA.") + + @staticmethod + def get_remote_sha_once(method): + logger.info(f"[ {method['name']} ] get latest SHA.") + if method["method"] == GetShaMethod.GITHUB_API: + return Utils.github_api_get_latest_sha(method) + elif method["method"] == GetShaMethod.PYGIT2: + return Utils.pygit2_get_latest_sha(method) + elif method["method"] == GetShaMethod.MIRRORC_API: + return Utils.mirrorc_api_get_latest_sha() + else: + return None + + @staticmethod + def download_file(url: str, parent_path: Path) -> Path: + filename = url.split("/")[-1] + logger.info(f"Prepare for downloading {filename}") + response = requests.get(url, stream=True) + file_path = parent_path / filename + total_size = int(response.headers.get("Content-Length", 0)) + + with alive_bar( + total_size, unit="B", bar="smooth", title=f"Downloading {filename} " + ) as progress_bar: + with open(file_path, "wb") as download_f: + for chunk in response.iter_content(chunk_size=1024): + if not chunk: + continue + download_f.write(chunk) + progress_bar(len(chunk)) + + logger.success(f"Downloaded {filename} to {file_path}") + + return file_path + + @staticmethod + def unzip_file(zip_dir, out_dir): + with zipfile.ZipFile(zip_dir, "r") as zip_ref: + # Unzip all files to the current directory + zip_ref.extractall(path=out_dir) + logger.success(f"{zip_dir} unzip success.") + logger.success(f"output --> {out_dir}") + + @staticmethod + def sudo(cmd, pwd): + os.system(f"echo {pwd} | sudo -S {cmd}") + + @staticmethod + def copy_directory_structure(source: Path, target: Path): + target.mkdir(parents=True, exist_ok=True) + for item in source.iterdir(): + relative_path = item.relative_to(source) + target_path = target / relative_path + if item.is_dir(): + target_path.mkdir(exist_ok=True) + Utils.copy_directory_structure(item, target_path) + elif item.is_file(): + shutil.copy2(item, target_path) + +# ==================== System check ==================== +if __system__ not in ["Windows", "Linux"]: + raise Exception( + f"Unsupported OS: {__system__}. Currently only Windows and Linux are supported." + ) + +# ==================== Config Processing ==================== +if getattr(sys, "frozen", False): + BASE_PATH = Path(sys.argv[0]).resolve().parent +else: + BASE_PATH = Path(__file__).resolve().parent + +if __system__ == "Linux": + BASE_PATH = Path("~").expanduser() / ".baas" + +if not os.path.exists(BASE_PATH): + os.makedirs(BASE_PATH) + +# Find the configuration file in the current directory +config_file = BASE_PATH / "setup.toml" +if not config_file.exists(): + + # If not found, create a default configuration file + with open(config_file, "wb") as file: + if __system__ == "Linux": + print( + "Since it's your first time running the script, we require password for installing packages." + ) + print( + "Don't worry, we won't use it for any other purposes. (You may check the source code)" + ) + pwd = getpass.getpass("Please enter your password: ") + DEFAULT_SETTINGS["General"]["linux_pwd"] = pwd + tomli_w.dump(DEFAULT_SETTINGS, file) +# Load the configuration file +with open(config_file, "rb") as file: + config = TOML_Config(config_file) + +config_modified = False + +def insert_new_config(cfg, new): + global config_modified + for key, value in new.items(): + if key not in cfg: + config_modified = True + cfg[key] = value + if isinstance(value, dict): + insert_new_config(cfg[key], value) + +insert_new_config(config.config, DEFAULT_SETTINGS) +if config_modified: + config.save() + +G = eDict(config.get("General")) +U = eDict(config.get("URLs")) +P = eDict(config.get("Paths")) + +BAAS_ROOT_PATH = Path(P.BAAS_ROOT_PATH).resolve() if P.BAAS_ROOT_PATH else "" or BASE_PATH +G.runtime_path = G.runtime_path.replace("\\", "/") +P.TMP_PATH = BAAS_ROOT_PATH / Path(P.TMP_PATH) +P.TOOL_KIT_PATH = BAAS_ROOT_PATH / Path(P.TOOL_KIT_PATH) +mirrorc_cdk = G.mirrorc_cdk + +if P.BAAS_ROOT_PATH and not os.path.exists(P.BAAS_ROOT_PATH): + os.makedirs(P.BAAS_ROOT_PATH) +if not os.path.exists(P.TMP_PATH): + os.makedirs(P.TMP_PATH) +if not os.path.exists(P.TOOL_KIT_PATH): + os.makedirs(P.TOOL_KIT_PATH) + +# ==================== Logging Configuration ==================== + +logger.remove() +logger.add( + sys.stdout, + colorize=True, + format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", + level="INFO", +) + +logger.add( + BAAS_ROOT_PATH / "log" / "installer.log", + format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", + level="INFO", +) + +spinner = Halo() + +# ==================== Welcome Message ==================== +logger.info("Blue Archive Auto Script Launcher & Installer") +logger.info("GitHub Repo: https://github.com/pur1fying/blue_archive_auto_script") +logger.info("Official QQ Group: 658302636") +logger.info("Current BAAS Path: " + str(BAAS_ROOT_PATH)) + + +def check_python_installation(): + try: + # Try to run the 'python' command to get version information + result = subprocess.run(["python", "--version"], capture_output=True, text=True) + if result.returncode == 0: + logger.info(f"Python is installed: {result.stdout.strip()}") + return "python" + except FileNotFoundError: + pass + + try: + # Try to run the 'python3' command to get version information + result = subprocess.run( + ["python3", "--version"], capture_output=True, text=True + ) + if result.returncode == 0: + logger.info(f"Python 3 is installed: {result.stdout.strip()}") + return "python3" + except FileNotFoundError: + pass + + # If both checks fail, Python is not installed + logger.info("Python is not installed on this system.") + return None + + +def install_package(): + try: + env_pip_exec = None + + # Detect the OS and select the appropriate Python executable and path + def try_sources(pkg_mgr_path, followed_cmd=None): + for _source in G.source_list: + try: + _followed_cmd = deepcopy(followed_cmd) + if G.package_manager == "pdm": + subprocess.run( + [pkg_mgr_path, "config", "--local", "pypi.url", _source], + check=True, + ) + else: + _followed_cmd.extend(["-i", _source]) + if _followed_cmd: + if not type(pkg_mgr_path) == list: + cmds = [pkg_mgr_path, *_followed_cmd] + else: + cmds = deepcopy(pkg_mgr_path) + cmds.extend(_followed_cmd) + subprocess.run(cmds, + env=__env__, + check=True) + return + except KeyboardInterrupt: + logger.error("User interrupted the process.") + return + except: + logger.exception(f"Failed to connect to {_source}, trying next source...") + logger.error("Packages Installation failed with all sources.") + error_tackle() + + if G.runtime_path == "default": + + # If Linux, don't create a virtual environment + if __system__ == "Linux": + mgr_path = BAAS_ROOT_PATH / ".env/bin/pdm" + if G.package_manager == "pip": + mgr_path = BAAS_ROOT_PATH / ".env/bin/pip" + Utils.sudo(f"chown -R $(whoami) {BAAS_ROOT_PATH}", G.linux_pwd) + try_sources( + mgr_path, + [ + "install", + "-r", + BAAS_ROOT_PATH / "requirements-linux.txt", + "--no-warn-script-location", + ], + ) + else: + try_sources(mgr_path, ["install", "-p", BAAS_ROOT_PATH]) + return + + python_exec_file = BAAS_ROOT_PATH / ".env/python.exe" + env_pip_exec = [str(python_exec_file), '-m', 'pip'] + + if ( + not os.path.exists(BAAS_ROOT_PATH / ".venv") + and G.package_manager == "pip" + ): + # Install virtualenv package + cmd_list = ["install", "virtualenv", "--no-warn-script-location"] + + try_sources( + env_pip_exec, + cmd_list, + ) + subprocess.run( + [ + str(python_exec_file), + "-m", + "virtualenv", + BAAS_ROOT_PATH / ".venv", + ], + check=True, + ) + env_pip_exec[0] = BAAS_ROOT_PATH / ".venv/Scripts/python.exe" + + if not env_pip_exec: + env_python_exec = G.runtime_path + env_pip_exec = (env_python_exec + " -m pip").split(" ") + + try_sources( + env_pip_exec, + [ + "install", + "-r", + str(BAAS_ROOT_PATH / "requirements.txt"), + "--no-warn-script-location", + ], + ) + + logger.success("Packages installed successfully") + + except: + logger.exception(f"Failed to install packages!") + return False + + +def check_pth(): + if __system__ == "Linux": + return + if os.path.exists(BAAS_ROOT_PATH / ".venv"): + return + logger.info("Checking pth file...") + read_file = [] + with open(BAAS_ROOT_PATH / ".env/python39._pth", "r", encoding="utf-8") as f: + lines = f.readlines() + for line in lines: + if line.startswith("#import site"): + line = line.replace("#", "") + read_file.append(line) + with open(BAAS_ROOT_PATH / ".env/python39._pth", "w", encoding="utf-8") as f: + f.writelines(read_file) + + +def start_app(): + if G.runtime_path == "default": + _path = ( + BAAS_ROOT_PATH / ".venv/Scripts/pythonw.exe" + if __system__ == "Windows" + else ( + BAAS_ROOT_PATH / ".venv/bin/python3" + if G.package_manager == "pdm" + else BAAS_ROOT_PATH / ".env/bin/python3" + ) + ) + _path = ( + BAAS_ROOT_PATH / ".venv/Scripts/python" + if G.debug and __system__ == "Windows" + else _path + ) + else: + _path = G.runtime_path + + if __system__ == "Linux": + if G.runtime_path == "default": + __env__["QT_QPA_PLATFORM_PLUGIN_PATH"] = str( + BAAS_ROOT_PATH + / ".env/lib/python3.9/site-packages/PyQt5/Qt5/plugins/platforms" + ) + proc = subprocess.run( + [_path, str(BAAS_ROOT_PATH / "window.py")], # 直接用列表传递命令 + cwd=BAAS_ROOT_PATH, # 先 cd 到 BAAS_ROOT_PATH + env=__env__ # 传递修改后的环境变量 + ) + return proc.returncode + else: + proc = subprocess.Popen( + [_path, str(BAAS_ROOT_PATH / "window.py")], # 直接用列表传递命令 + cwd=BAAS_ROOT_PATH, # 先 cd 到 BAAS_ROOT_PATH + env=__env__, # 传递修改后的环境变量 + ) + logger.info(f"Started process with PID: {proc.pid}") + return proc.pid + + +def run_app(): + logger.info("Start to run the app...") + try: # record pid + with open(BAAS_ROOT_PATH / "pid", "a+") as f: + f.seek(0) + try: + last_pid = int(f.read()) + except: + last_pid = 2147483647 + if psutil.pid_exists(last_pid): + if not G.force_launch: + logger.info( + "App already started. Killing." + ) # close existing BAAS + p = psutil.Process(last_pid) + try: + p.terminate() + except: + os.system(f"taskkill /f /pid {last_pid}") + else: + with open(BAAS_ROOT_PATH / "pid", "w+") as _f: + _f.write(str(start_app())) + logger.success("Start app success.") + f.close() + with open(BAAS_ROOT_PATH / "pid", "w+") as _f: + _f.write(str(start_app())) + logger.success("Start app success.") + _f.close() + + except Exception: + logger.exception("Run app failed") + error_tackle() + + if __system__ == "Windows" and not G.no_build: + try: + import PyInstaller.__main__ + + check_upx() + + def create_executable(): + PyInstaller.__main__.run( + [ + str(BAAS_ROOT_PATH / "installer.py"), + "--name=BlueArchiveAutoScript", + "--onefile", + "--icon=gui/assets/logo.ico", + "--noconfirm", + "--upx-dir", + "./toolkit/upx-4.2.4-win64", + ] + ) + + if os.path.exists(BAAS_ROOT_PATH / "backup.exe") and not os.path.exists( + BAAS_ROOT_PATH / "no_build" + ): + create_executable() + logger.info("try to remove the backup executable file.") + try: + os.remove(BAAS_ROOT_PATH / "backup.exe") + except: + logger.info("remove backup.exe failed.") + else: + logger.info("remove finished.") + os.rename("BlueArchiveAutoScript.exe", "backup.exe") + shutil.copy("dist/BlueArchiveAutoScript.exe", ".") + except: + logger.warning( + "Build new BAAS launcher failed, Please check the Python Environment" + ) + error_tackle() + + +def error_tackle(): + logger.info( + "Now you can turn off this command line window safely or report this issue to developers." + ) + logger.info("现在您可以安全地关闭此命令行窗口或向开发者上报问题。") + logger.info("您现在可以安全地关闭此命令行窗口或向开发人员报告此问题。") + logger.info( + "今、このコマンドラインウィンドウを安全に閉じるか、この問題を開発者に報告することができます。" + ) + logger.info( + "이제 이 명령줄 창을 안전하게 종료하거나 이 문제를 개발자에게 보고할 수 있습니다。" + ) + os.system("pause") + sys.exit() + + +def check_requirements(): + logger.info("Check package Installation...") + install_package() + logger.success("Install requirements success") + + +def check_pdm(): + raise NotImplementedError("PDM currently not supported.") + # if os.path.exists(BAAS_ROOT_PATH / ".venv"): + # logger.info("Already installed pdm.") + # return + # + # logger.info("Checking pdm installation...") + # if __system__ == "Linux": + # if os.path.exists(BAAS_ROOT_PATH / ".env/bin/pdm"): + # return + # subprocess.run([BAAS_ROOT_PATH / ".env/bin/pip3", "install", "pdm"], check=True) + # return + # + # assert __system__ == "Windows" + # if not os.path.exists(BAAS_ROOT_PATH / ".env/Scripts/pip.exe"): + # logger.warning("Pip is not installed, trying to install pip...") + # filepath = Utils.download_file(U.GET_PIP_URL, P.TMP_PATH) + # subprocess.run([BAAS_ROOT_PATH / ".env/python.exe", filepath]) + # + # if not os.path.exists(BAAS_ROOT_PATH / ".env/Scripts/pdm.exe"): + # logger.warning("Pdm is not installed, trying to install pdm...") + # subprocess.run([BAAS_ROOT_PATH / ".env/Scripts/pip.exe", "install", "pdm"]) + + +def check_pip(): + logger.info("Checking pip installation...") + if __system__ == "Linux": + return + + assert __system__ == "Windows" + if not os.path.exists(BAAS_ROOT_PATH / ".env/Scripts/pip.exe"): + logger.warning("Pip is not installed, trying to install pip...") + filepath = Utils.download_file(U.GET_PIP_URL, P.TMP_PATH) + subprocess.run([BAAS_ROOT_PATH / ".env/python.exe", filepath]) + + +def check_python(): + logger.info("Checking python installation...") + if os.path.exists(BAAS_ROOT_PATH / ".venv"): + return + # Platform-specific Python installation check + _path = "" + if __system__ == "Windows": + _path = BAAS_ROOT_PATH / ".env/python.exe" + elif __system__ == "Linux": + _path = BAAS_ROOT_PATH / ".env/bin/python3" + + if not os.path.exists(_path): + logger.info("Python environment is not installed, trying to install python...") + if __system__ == "Windows": + filepath = Utils.download_file(U.GET_PYTHON_URL, P.TMP_PATH) + Utils.unzip_file(filepath, BAAS_ROOT_PATH / ".env") + os.remove(filepath) + elif __system__ == "Linux": + # For Ubuntu, other Linux distributions may need to be modified + Utils.sudo("add-apt-repository ppa:deadsnakes/ppa", G.linux_pwd) + Utils.sudo("apt update", G.linux_pwd) + Utils.sudo("apt-get install python3.9-venv -y", G.linux_pwd) + Utils.sudo(f"python3.9 -m venv {BAAS_ROOT_PATH / '.env'}", G.linux_pwd) + + +def check_upx(): + logger.info("Checking UPX installation.") + if not os.path.exists("toolkit/upx-4.2.4-win64/upx.exe"): + filepath = Utils.download_file(U.GET_UPX_URL, P.TMP_PATH) + Utils.unzip_file(filepath, P.TOOL_KIT_PATH) + os.remove(filepath) + + +def check_env_patch(): + if __system__ == "Linux": + return + if os.path.exists(BAAS_ROOT_PATH / ".env/Lib/site-packages/Polygon"): + return + logger.info("Downloading env patch...") + filepath = Utils.download_file(U.GET_ENV_PATCH_URL, P.TMP_PATH) + Utils.unzip_file(filepath, BAAS_ROOT_PATH / ".env") + + +def fix_exe_shebangs(search_dir=".venv\\Scripts"): + """ + Scan all .exe files under the given directory and replace any shebang line + like '#!\\.venv\\Scripts\\python.exe' with '#!python.exe', + while preserving the original file size by padding with spaces. + Backup files are saved to '__exe_backups__'. + """ + backup_dir = ".venv/__exe_backups__" + os.makedirs(backup_dir, exist_ok=True) + + # Regex to match any shebang line ending with .venv\Scripts\python.exe + pattern = re.compile(rb'#!.*?\\.venv\\Scripts\\python\.exe') + replacement = b"#!python.exe" + + # Collect all .exe files under the search directory + exe_files = [] + for root, _, files in os.walk(search_dir): + for filename in files: + if filename.lower().endswith(".exe"): + exe_files.append(os.path.join(root, filename)) + + modified_count = 0 + + with alive_bar(len(exe_files), title="Fixing .exe shebangs") as bar: + for full_path in exe_files: + bar() + try: + with open(full_path, "rb") as f: + content = f.read() + + match = pattern.search(content) + if not match: + continue + + matched_bytes = match.group(0) + padding_len = len(matched_bytes) - len(replacement) + if padding_len < 0: + logger.warning(f"Skipped (replacement too long): {full_path}") + continue + + replacement_padded = replacement + b' ' * padding_len + new_content = content.replace(matched_bytes, replacement_padded, 1) + + # Construct backup path + rel_path = os.path.relpath(full_path, search_dir) + backup_path = os.path.join(backup_dir, rel_path) + os.makedirs(os.path.dirname(backup_path), exist_ok=True) + + # Save backup + with open(backup_path, "wb") as f: + f.write(content) + + # Overwrite original file + with open(full_path, "wb") as f: + f.write(new_content) + + modified_count += 1 + + except: + logger.exception(f"Failed to process {full_path}: {e}") + + logger.success(f"Finished. {modified_count} .exe file(s) patched.") + if modified_count > 0: + logger.info(f"Backups saved to: {os.path.abspath(backup_dir)}") + else: + logger.info("No matching shebangs were found in .exe files.") + + +class BAASGitCallbacks(RemoteCallbacks): + def __init__(self, bar_ref): + self.__transmitted = False + self.bar_ref = bar_ref + self.received_count = 0 + self.current_count = 0 + self.spinner = Halo(text="Resolving Objects ...", spinner="dots") + super().__init__() + + def transfer_progress(self, stats): + if not self.__transmitted: + self.__transmitted = True + # Create the progress bar generator + bar_gen = alive_bar(stats.total_objects, title="Cloning repository...") + self.bar_ref["bar_gen"] = bar_gen + self.bar_ref["bar"] = bar_gen.__enter__() # Enter the context + + if self.bar_ref.get("bar"): + self.received_count = stats.received_objects + self.bar_ref["bar"](self.received_count - self.current_count) # Advance the progress bar by one + self.current_count = self.received_count + + if self.received_count == stats.total_objects: + self.bar_ref["bar_gen"].__exit__(None, None, None) + self.spinner.start() + + +def clone_repo(repo_url, local_path): + bar_ref = {"bar": None} + callbacks = BAASGitCallbacks(bar_ref) + repo = clone_repository(repo_url, local_path, callbacks=callbacks) + callbacks.spinner.stop() + logger.success("Cloning completed successfully.") + return repo + + +def repair_broken_git_repo(): + global repo + del repo + # repo = None + gc.collect() + + # Remove the existing .git directory + git_dir = BAAS_ROOT_PATH / ".git" + if git_dir.exists(): + logger.info("Removing broken Git repository...") + shutil.rmtree(git_dir, ignore_errors=True) + + logger.warning("Attempting to repair invalid Git repo...") + + temp_clone_path = BAAS_ROOT_PATH / "temp_clone" + + # Remove any existing temp_clone directory + if temp_clone_path.exists(): + shutil.rmtree(temp_clone_path, ignore_errors=True) + + # Clone the repository to a temporary directory + logger.info("Cloning fresh repo to temporary directory...") + repo = clone_repo(U.REPO_URL_HTTP, str(temp_clone_path)) + + # Release the occupation of the directory + del repo + # repo = None + gc.collect() + + # Move the cloned repository to the desired location + for item in temp_clone_path.iterdir(): + dst = BAAS_ROOT_PATH / item.name + if dst.exists(): + if dst.is_dir(): + shutil.rmtree(dst, ignore_errors=True) + else: + dst.unlink() + shutil.move(str(item), str(dst)) + + shutil.rmtree(temp_clone_path, ignore_errors=True) + logger.success("Git repository successfully repaired.") + + +def git_install_baas(): + logger.info("+--------------------------------+") + logger.info("| GIT INSTALL BAAS |") + logger.info("+--------------------------------+") + logger.info("Cloning the repository...") + logger.info("Repo URL : " + U.REPO_URL_HTTP) + temp_clone_path = BAAS_ROOT_PATH / "temp_clone" + + if temp_clone_path.exists(): + logger.info("Removing temp_clone directory...") + shutil.rmtree(str(temp_clone_path), ignore_errors=False, onerror=Utils.on_rm_error) + + # Clone the repository using pygit2 + repo = clone_repo( + U.REPO_URL_HTTP, + str(temp_clone_path), + ) + + # Release the occupation of the directory + del repo + # repo = None + gc.collect() + + # Move the cloned repository to the desired location + Utils.copy_directory_structure(temp_clone_path, BAAS_ROOT_PATH) + + # Remove temporary clone directory + shutil.rmtree(str(temp_clone_path), ignore_errors=False, onerror=Utils.on_rm_error) + logger.success("Git Install Success!") + + +def check_repo_url(_repo): + origin = _repo.remotes["origin"] + logger.info("<<< Repo Remote URL >>>") + logger.info(origin.url) + + if origin.url != U.REPO_URL_HTTP: + original_url = origin.url + upstream_backup = {} + for branch in _repo.branches.local: + local_branch = _repo.lookup_branch(branch) + if local_branch.upstream: + upstream_backup[branch] = local_branch.upstream.name + + try: + logger.info("<<< Switch Repo Remote URL >>>") + logger.info(U.REPO_URL_HTTP) + _repo.remotes.delete("origin") + new_origin = _repo.remotes.create("origin", U.REPO_URL_HTTP) + for ref in list(_repo.references): + if ref.startswith("refs/remotes/origin/"): + _repo.references.delete(ref) + new_origin.fetch() + logger.info("Setting remote branches upstream...") + for branch in _repo.branches.local: + local_branch = _repo.lookup_branch(branch) + remote_branch_name = f"origin/{branch}" + if remote_branch_name in _repo.branches.remote: + remote_branch = _repo.lookup_branch( + remote_branch_name, + pygit2.GIT_BRANCH_REMOTE + ) + local_branch.upstream = remote_branch + logger.success("Remote repo url switched.") + + except GitError as e: + logger.error(f"Failed to fetch from new origin: {e}") + logger.info("<<< Rolling back to original URL >>>") + + try: + # 删除失败的新origin + _repo.remotes.delete("origin") + + # 恢复原始远程 + restored_origin = _repo.remotes.create("origin", original_url) + + # 重新获取原始仓库数据 + restored_origin.fetch() + + # 恢复上游分支设置 + for branch, upstream_ref in upstream_backup.items(): + local_branch = _repo.lookup_branch(branch) + # 确保远程分支引用存在 + if upstream_ref in _repo.references: + remote_branch = _repo.lookup_branch( + upstream_ref.replace("refs/remotes/", ""), + pygit2.GIT_BRANCH_REMOTE + ) + local_branch.upstream = remote_branch + + logger.success("Successfully reverted to original repository URL") + + except Exception as rollback_error: + logger.critical(f"Critical error during rollback: {rollback_error}") + raise RuntimeError("Repository recovery failed") from rollback_error + +def git_update_baas(): + global local_sha + global remote_sha + global repo + logger.info("+--------------------------------+") + logger.info("| GIT UPDATE BAAS |") + logger.info("+--------------------------------+") + try: + repo = Repository(str(BAAS_ROOT_PATH)) + check_repo_url(repo) + refresh_required = G.refresh + if refresh_required: + logger.info("You've selected dropping all changes for the project file.") + + spinner.start("Pulling updates from the remote repository...") + + # Fetch updates from the remote repository + remote = repo.remotes["origin"] + remote.fetch(callbacks=BAASGitCallbacks({"bar": None})) + del remote + gc.collect() + + # Reset local branch to remote + repo.reset(repo.lookup_reference(f"refs/remotes/origin/{REPO_BRANCH}").target, GIT_RESET_HARD) + + # Checkout to master (HEAD points to refs/heads/master) + repo.checkout(f"refs/heads/{REPO_BRANCH}") + # str(repo.references.get("refs/remotes/origin/master").target) + local_sha = str(repo.head.target) + if local_sha == remote_sha: + spinner.succeed("Update completed.") + logger.success("Git Update Success") + else: + spinner.fail("Failed to update the source code to latest version.") + logger.warning("Possible reason is your current update source haven't updated to latest.") + logger.warning("If you constantly encounter this issue, please try to use another update source like github.") + except GitError as e: + if "not owned by current user" in str(e): + logger.error(f"Git repo ownership error: {e}") + if repo: del repo + repair_broken_git_repo() + else: + logger.error(f"Unhandled Git error: {e}") + raise + + +def dynamic_update_installer(): + # Define paths for the installer and Python interpreter + installer_path = BAAS_ROOT_PATH / "deploy/installer/installer.py" + + # Use platform-independent way to determine Python executable + if __system__ == "Windows": + python_path = BAAS_ROOT_PATH / ".venv/Scripts/python.exe" + else: # Linux/Unix + python_path = BAAS_ROOT_PATH / ".env/bin/python" + + # Prepare the command arguments + launch_exec_args = sys.argv.copy() + launch_exec_args[0] = os.path.abspath(python_path) + launch_exec_args.insert(1, os.path.abspath(installer_path)) + + # Check if paths exist and arguments are provided + if ( + os.path.exists(installer_path) + and os.path.exists(python_path) + and len(sys.argv) > 1 + ): + try: + subprocess.run(launch_exec_args) + except: + logger.exception(f"Error running installer updater...") + run_app() + elif G.internal_launch: # Internal launch fallback + run_app() + else: + if not os.path.exists(installer_path): + logger.warning("Installer not found. Launching app directly.") + run_app() + sys.exit() + + # Use platform-specific commands to start the installer + if __system__ == "Windows": + os.system(f'START " " "{python_path}" "{installer_path}" --launch') + else: # Linux/Unix + subprocess.run([python_path, installer_path, "--launch"]) + + sys.exit() + + +def clean_up(): + if os.path.exists(P.TMP_PATH): + shutil.rmtree(P.TMP_PATH) + + +def pre_check(): + if G.runtime_path == "default": + check_python() + if G.package_manager == "pdm": + check_pdm() + elif G.package_manager == "pip": + check_pip() + check_pth() + check_env_patch() + + install_or_update_BAAS_repo_to_latest() + check_requirements() + if __system__ == "Windows": + fix_exe_shebangs() + + +def get_update_type(): + global repo + global local_sha + global remote_sha + global update_type + local_sha = G.current_BAAS_version + if len(local_sha) == 0: + if os.path.exists(BAAS_ROOT_PATH / ".git"): + repo = Repository(str(BAAS_ROOT_PATH)) + # Get local SHA + try: + local_sha = str(repo.head.target) + except Exception as e: + logger.error(f"Incorrect Key or corrupted repo: {e}. Remove [ .git ] folder and reinstall.") + del repo + # repo = None + update_type = "full" + gc.collect() + shutil.rmtree(BAAS_ROOT_PATH / ".git") + return + else: + # first install + update_type = "full" + return + + assert (len(local_sha) == 40) + mirrorc_inst.set_version(local_sha) + remote_sha = Utils.get_remote_sha() + assert (len(remote_sha) == 40) + logger.info(f"local_sha : {local_sha}") + logger.info(f"remote_sha: {remote_sha}") + if local_sha == remote_sha: + update_type = "latest" + return + update_type = "incremental" + return + + +def install_or_update_BAAS_repo_to_latest(): + if G.dev: + return + + get_update_type() + + global update_type + if update_type == "latest": + logger.info("No Update Available.") + return + + if try_mirrorc_install_or_update(): + return + try_git_install_or_update() + +def try_git_install_or_update(): + global repo + global local_sha + if os.path.exists(BAAS_ROOT_PATH / ".git"): + git_update_baas() + else: + git_install_baas() + repo = Repository(str(BAAS_ROOT_PATH)) + local_sha = str(repo.head.target) + config.set_and_save("General.current_BAAS_version", local_sha) + +def try_mirrorc_install_or_update(): + if not (len(mirrorc_cdk) > 0): + return False + + global latest_mirrorc_return + global update_type + if latest_mirrorc_return is None: + latest_mirrorc_return = mirrorc_inst.get_latest_version(cdk=mirrorc_cdk) + if not latest_mirrorc_return.has_url: + MirrorC_Updater.log_mirrorc_error(latest_mirrorc_return, logger) + return False + # timestamp to datetime + expired_time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(latest_mirrorc_return.cdk_expired_time)) + logger.success("CDK valid, expired time : " + expired_time_str) + if latest_mirrorc_return.latest_version_name == local_sha: + logger.info("No Update Available.") + return True + if update_type == "full": + mirrorc_install_baas() + elif update_type == "incremental": + mirrorc_update_baas() + + if os.path.exists(BAAS_ROOT_PATH / ".git"): + logger.info("Removing [ .git ] directory...") + shutil.rmtree(BAAS_ROOT_PATH / ".git", ignore_errors=False, onerror=Utils.on_rm_error) + + config.set_and_save("General.current_BAAS_version", latest_mirrorc_return.latest_version_name) + return True + +def mirrorc_install_baas(): + logger.info("+--------------------------------+") + logger.info("| MIRRORC INSTALL BAAS |") + logger.info("+--------------------------------+") + # Download the repository zip file + global latest_mirrorc_return + file_MB = latest_mirrorc_return.file_size / (1024 * 1024) + logger.info("Downloading the repository zip, total = %.2f MB" % file_MB) + zip_path = Utils.download_file( + latest_mirrorc_return.download_url, P.TMP_PATH + ) + logger.info("Unzipping the repository...") + Utils.unzip_file(zip_path, P.TMP_PATH) + + logger.info("Moving unzipped files to BAAS root path...") + file_dir = P.TMP_PATH / "blue_archive_auto_script" + Utils.copy_directory_structure(file_dir, BAAS_ROOT_PATH) + + logger.success("Mirrorc Install Success!") + +def mirrorc_update_baas(): + logger.info("+--------------------------------+") + logger.info("| MIRRORC UPDATE BAAS |") + logger.info("+--------------------------------+") + + global latest_mirrorc_return + + # wait for incremental update + if latest_mirrorc_return.update_type == "full": + logger.info("Current package is [ full ].") + logger.info("Waiting for [ incremental ] update package...") + max_retry = 10 + for i in range(1, max_retry+1): + time.sleep(0.5) + logger.info(f"Retry : {i}/{max_retry}") + latest_mirrorc_return = mirrorc_inst.get_latest_version(cdk=mirrorc_cdk) + if latest_mirrorc_return.update_type == "incremental": + logger.success("Get Incremental Package") + break + + if latest_mirrorc_return.update_type == "incremental": + logger.info("<<< Incremental Update >>>") + file_MB = latest_mirrorc_return.file_size / (1024 * 1024) + logger.info("Downloading the incremental zip, total = %.2f MB" % file_MB) + zip_path = Utils.download_file( + latest_mirrorc_return.download_url, P.TMP_PATH + ) + logger.info("Unzipping the incremental update...") + Utils.unzip_file(zip_path, P.TMP_PATH) + + MirrorC_Updater.apply_update( + P.TMP_PATH, + P.TMP_PATH / "changes.json", + BAAS_ROOT_PATH, + logger + ) + logger.success("Mirrorc Incremental Update Success!") + + if latest_mirrorc_return.update_type == "full": + logger.info("<<< Full Update >>>") + mirrorc_install_baas() + +if __name__ == "__main__": + try: + # Check the whole installation + if not G.launch: + pre_check() + clean_up() + # Check if the installer is frozen + if not G.use_dynamic_update: + run_app() # Run the app if not frozen + else: + dynamic_update_installer() # Update the installer if frozen + except Exception as e: + logger.exception("Error occurred during setup...") + error_tackle() + + # Parse command-line arguments and configuration diff --git a/deploy/installer/build.bat b/deploy/installer/build.bat index fb399f427..65b386404 100644 --- a/deploy/installer/build.bat +++ b/deploy/installer/build.bat @@ -18,7 +18,7 @@ REM Install required packages pip install -r requirements.installer.txt REM Build the executable file using PyInstaller -pyinstaller -i ./logo.ico --name BlueArchiveAutoScript -F --paths=. installer.py +pyinstaller -i ./logo.ico --name BlueArchiveAutoScript -F --paths=. installer.py --hidden-import=_cffi_backend REM Move the generated file out of the temporary directory move .\dist\* .\ diff --git a/deploy/installer/installer.py b/deploy/installer/installer.py index 13fcc96cf..33b791235 100644 --- a/deploy/installer/installer.py +++ b/deploy/installer/installer.py @@ -1,8 +1,4 @@ # -*- coding: utf-8 -*- -import stat -import time - -import pygit2 # ==================== Welcome Message ==================== print( @@ -32,1171 +28,1068 @@ ) # ==================== Import Statements ==================== - -import os import gc +import time +import getpass +import os +import platform import re -import sys import shutil -import zipfile -import tempfile -import platform +import stat import subprocess -from enum import Enum, auto +import sys +import tempfile +import zipfile from pathlib import Path +from typing import Optional, List, Any, Union import psutil -import getpass +import pygit2 import requests import tomli_w -from copy import deepcopy from alive_progress import alive_bar - from easydict import EasyDict as eDict from halo import Halo from loguru import logger +from pygit2 import Repository +from pygit2.enums import ResetMode +from pygit2.callbacks import RemoteCallbacks -from pygit2 import clone_repository, Repository, RemoteCallbacks, GIT_RESET_HARD, GitError - +# Internal imports from toml_config import TOML_Config, DEFAULT_SETTINGS from mirrorc_update.mirrorc_updater import MirrorC_Updater from const import GetShaMethod, get_remote_sha_methods, REPO_BRANCH +# ==================== Global Constants & System Checks ==================== + __system__ = platform.system() +if __system__ not in ["Windows", "Linux"]: + raise OSError(f"Unsupported OS: {__system__}. Only Windows and Linux are supported.") + +# Environment setup __env__ = os.environ.copy() if __system__ == "Windows": __env__["PYTHONPATH"] = '.env;.venv/Lib;.venv/Scripts;.venv;.;.venv/Lib/site-packages' os.environ["PDM_IGNORE_ACTIVE_VENV"] = "1" -# ==================== Default Settings ===================== +# ==================== Logging Configuration ==================== + +logger.remove() +logger.add( + sys.stdout, + colorize=True, + format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", + level="INFO", +) +logger.add( + Path() / "log" / "installer.log", + format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", + level="INFO", +) +spinner = Halo() -repo = None -# local version -local_sha = None -# latest version -remote_sha = None -update_type = None -mirrorc_cdk = None -latest_mirrorc_return = None -mirrorc_inst = MirrorC_Updater(app="BAAS_repo", current_version="") +# ==================== Welcome Message ==================== +logger.info("Blue Archive Auto Script Launcher & Installer") +logger.info("GitHub Repo: https://github.com/pur1fying/blue_archive_auto_script") +logger.info("Official QQ Group: 658302636") -class Utils: +# ==================== Class Definitions ==================== + +class GlobalConfig: + """ + Manages configuration loading, saving, and global path definitions. + """ + + def __init__(self): + if getattr(sys, "frozen", False): + self.base_path = Path(sys.argv[0]).resolve().parent + else: + self.base_path = Path(__file__).resolve().parent + + if __system__ == "Linux": + self.base_path = Path("~").expanduser() / ".baas" + + self.base_path.mkdir(parents=True, exist_ok=True) + self.config_file = self.base_path / "setup.toml" + self.config_obj = None + self.data = None # Holds the EasyDict representation + + self._load_or_create_config() + self._parse_settings() + + def _load_or_create_config(self): + """Loads setup.toml or creates it with defaults.""" + if not self.config_file.exists(): + # Initial setup for Linux requires password for sudo ops + if __system__ == "Linux": + print("First time setup: Password required for package installation (sudo).") + pwd = getpass.getpass("Please enter your password: ") + DEFAULT_SETTINGS["General"]["linux_pwd"] = pwd + + with open(self.config_file, "wb") as f: + tomli_w.dump(DEFAULT_SETTINGS, f) + + self.config_obj = TOML_Config(self.config_file) + + # Merge defaults into current config to handle version upgrades + modified = False + + def recursive_merge(cfg, defaults): + nonlocal modified + for k, v in defaults.items(): + if k not in cfg: + modified = True + cfg[k] = v + if isinstance(v, dict): + recursive_merge(cfg[k], v) + + recursive_merge(self.config_obj.config, DEFAULT_SETTINGS) + if modified: + self.config_obj.save() + + def _parse_settings(self): + """Parses config sections into easy-to-access attributes.""" + self.General = eDict(self.config_obj.get("General")) + self.URLs = eDict(self.config_obj.get("URLs")) + self.Paths = eDict(self.config_obj.get("Paths")) + + # Path resolution + self.baas_root = Path(self.Paths.BAAS_ROOT_PATH).resolve() if self.Paths.BAAS_ROOT_PATH else self.base_path + self.toolkit_path = self.baas_root / self.Paths.TOOL_KIT_PATH + + # Ensure directories exist + for p in [self.baas_root, self.toolkit_path]: + p.mkdir(parents=True, exist_ok=True) + + # Normalize Windows paths in runtime config + if self.General.runtime_path: + self.General.runtime_path = self.General.runtime_path.replace("\\", "/") + + def save_value(self, key_path: str, value: Any): + """Saves a specific value to the TOML file.""" + self.config_obj.set_and_save(key_path, value) + + +class FileSystemUtils: + """ + Utilities for file system operations, downloading, and extraction. + """ @staticmethod - def on_rm_error(func, path, exc_info): + def on_rm_error(func, path, _exc_info): + """Error handler for shutil.rmtree to handle read-only files.""" try: os.chmod(path, stat.S_IWUSR) func(path) - except Exception as e: + except Exception: pass @staticmethod - def mirrorc_api_get_latest_sha(): - global mirrorc_inst - global mirrorc_cdk - global latest_mirrorc_return + def download_file(url: str, parent_path: Union[str, Path]) -> Path: + """Downloads a file with a progress bar.""" + filename = url.split("/")[-1] + logger.info(f"Downloading {filename}...") + if type(parent_path) == str: + parent_path = Path(parent_path) try: - latest_mirrorc_return = mirrorc_inst.get_latest_version(cdk=mirrorc_cdk) - if latest_mirrorc_return.has_data: - return latest_mirrorc_return.latest_version_name - else: - logger.error(f"[MirrorC Api] get SHA error: {latest_mirrorc_return.message}") - except Exception as e: - logger.error(f"[MirrorC Api] get SHA error: {e}") - return None + response = requests.get(url, stream=True, timeout=30) + response.raise_for_status() + except requests.RequestException as e: + raise RuntimeError(f"Download failed for {url}: {e}") + + file_path = parent_path / filename + total_size = int(response.headers.get("Content-Length", 0)) + file_path.parent.mkdir(parents=True, exist_ok=True) + with alive_bar(total_size, unit="B", bar="smooth", title=f"Downloading {filename}") as bar: + with open(file_path, "wb") as f: + for chunk in response.iter_content(chunk_size=1024 * 64): + if chunk: + f.write(chunk) + bar(len(chunk)) + + logger.success(f"Downloaded to {file_path}") + return file_path @staticmethod - def github_api_get_latest_sha(data): - owner = data["owner"] - repo = data["repo"] - branch = data["branch"] - url = f"https://api.github.com/repos/{owner}/{repo}/branches/{branch}" - try: - response = requests.get(url, timeout=3.0) - if response.status_code != 200: - return None - response_json = response.json() - return response_json.get("commit", {}).get("sha") - except requests.RequestException as e: - logger.warning(f"[Github Api] get SHA error: {e}") - return None + def unzip_file(zip_path: Union[str, Path], out_dir: Path): + """Extracts a zip file.""" + if type(zip_path) == str: + zip_path = Path(zip_path) + if not zipfile.is_zipfile(zip_path): + raise ValueError(f"Invalid zip file: {zip_path}") + + with zipfile.ZipFile(zip_path, "r") as zip_ref: + zip_ref.extractall(path=out_dir) + logger.success(f"Extracted {zip_path} to {out_dir}") @staticmethod - def pygit2_get_latest_sha(data): - with tempfile.TemporaryDirectory() as tmp_dir: - repo = pygit2.init_repository(tmp_dir, bare=True) + def copy_directory_structure(source: Union[str, Path], target: Path): + """Recursively copies files and directories.""" + if type(source) == str: + source = Path(source) + target.mkdir(parents=True, exist_ok=True) + for item in source.iterdir(): + target_path = target / item.relative_to(source) + if item.is_dir(): + FileSystemUtils.copy_directory_structure(item, target_path) + elif item.is_file(): + shutil.copy2(item, target_path) + + @staticmethod + def sudo(cmd: str, pwd: str): + """Executes a command with sudo on Linux.""" + os.system(f"echo {pwd} | sudo -S {cmd}") + + +class GitOperationHandler: + """ + Handles Git operations with a priority strategy: + 1. System Git (subprocess) - Preferred for speed and robustness. + 2. PyGit2 - Fallback if System Git is missing. + 3. PyGit2 (Strict) - Mandatory for rollback operations. + """ + + def __init__(self, repo_path: Path, remote_url: str): + self.repo_path = repo_path + self.remote_url = remote_url + self.git_executable = shutil.which("git") + self.git_dir = repo_path / ".git" + + def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: + """Executes a system git command.""" + if not self.git_executable: + raise RuntimeError("System git not found.") + + target_cwd = cwd or self.repo_path + if not target_cwd.exists(): + raise FileNotFoundError(f"Target directory {target_cwd} does not exist.") + + # Disable interactive prompts + env = __env__.copy() + env["GIT_TERMINAL_PROMPT"] = "0" - url = data["url"] - branch = data["branch"] - remote = repo.remotes.create_anonymous(url) try: - remote_refs = remote.ls_remotes() - except pygit2.GitError as e: - logger.warning(f"[PyGit2] get SHA error: {e}") - return None - target_ref = f"refs/heads/{branch}" - for ref in remote_refs: - if ref["name"] == target_ref: - return str(ref["oid"]) - return None + result = subprocess.run( + [self.git_executable, *args], + cwd=target_cwd, + capture_output=True, + text=True, + check=True, + env=env + ) + return result.stdout.strip() + except subprocess.CalledProcessError as e: + raise RuntimeError(f"Git command failed: {e.stderr}") + + def is_valid_repo(self) -> bool: + """Checks if the directory is a valid git repository.""" + if not self.git_dir.exists(): + return False + try: + if self.git_executable: + self._run_git_cmd(["rev-parse", "--is-inside-work-tree"]) + else: + Repository(str(self.repo_path)) + return True + except Exception: + return False + + def get_local_sha(self) -> str: + """Gets the current HEAD SHA.""" + if self.git_executable: + try: + return self._run_git_cmd(["rev-parse", "HEAD"]) + except Exception: + pass - @staticmethod - def get_remote_sha(): + repo = Repository(str(self.repo_path)) + return str(repo.head.target) + + def get_remote_sha(self, cfg, mirrorc): logger.info("<<< Get Remote SHA >>>") - if G.get_remote_sha_method: + if cfg.General.get_remote_sha_method: index = next( - (i for i, item in enumerate(get_remote_sha_methods) if item.get("name") == G.get_remote_sha_method), - None) + (i for i, item in enumerate(get_remote_sha_methods) \ + if item.get("name") == cfg.General.get_remote_sha_method), None) if index is not None: - sha = Utils.get_remote_sha_once(get_remote_sha_methods[index]) + sha = self.get_remote_sha_once(get_remote_sha_methods[index], mirrorc) if sha is not None: return sha get_remote_sha_methods.pop(index) for method in get_remote_sha_methods: - sha = Utils.get_remote_sha_once(method) + sha = self.get_remote_sha_once(method, mirrorc={ + "inst": mirrorc, + "cdk": cfg.General.mirrorc_cdk, + }) if sha is not None: logger.info(f"Set get remote SHA method --> [ {method['name']} ]") - config.set_and_save("General.get_remote_sha_method", method["name"]) + cfg.save_value("General.get_remote_sha_method", method["name"]) return sha logger.error("Failed to get remote SHA from all methods.") raise Exception("Failed to get remote SHA.") - @staticmethod - def get_remote_sha_once(method): + def get_remote_sha_once(self, method, mirrorc): logger.info(f"[ {method['name']} ] get latest SHA.") if method["method"] == GetShaMethod.GITHUB_API: - return Utils.github_api_get_latest_sha(method) + return self.github_api_get_latest_sha(method) elif method["method"] == GetShaMethod.PYGIT2: - return Utils.pygit2_get_latest_sha(method) + return self.git_get_remote_sha() elif method["method"] == GetShaMethod.MIRRORC_API: - return Utils.mirrorc_api_get_latest_sha() + return self.mirrorc_api_get_latest_sha(mirrorc) else: return None @staticmethod - def download_file(url: str, parent_path: Path) -> Path: - filename = url.split("/")[-1] - logger.info(f"Prepare for downloading {filename}") - response = requests.get(url, stream=True) - file_path = parent_path / filename - total_size = int(response.headers.get("Content-Length", 0)) - - with alive_bar( - total_size, unit="B", bar="smooth", title=f"Downloading {filename} " - ) as progress_bar: - with open(file_path, "wb") as download_f: - for chunk in response.iter_content(chunk_size=1024): - if not chunk: - continue - download_f.write(chunk) - progress_bar(len(chunk)) - - logger.success(f"Downloaded {filename} to {file_path}") - - return file_path + def github_api_get_latest_sha(data): + owner = data["owner"] + repo = data["repo"] + branch = data["branch"] + url = f"https://api.github.com/repos/{owner}/{repo}/branches/{branch}" + try: + response = requests.get(url, timeout=3.0) + if response.status_code != 200: + return None + response_json = response.json() + return response_json.get("commit", {}).get("sha") + except requests.RequestException as e: + logger.warning(f"[Github Api] get SHA error: {e}") + return None @staticmethod - def unzip_file(zip_dir, out_dir): - with zipfile.ZipFile(zip_dir, "r") as zip_ref: - # Unzip all files to the current directory - zip_ref.extractall(path=out_dir) - logger.success(f"{zip_dir} unzip success.") - logger.success(f"output --> {out_dir}") + def mirrorc_api_get_latest_sha(mirrorc): + inst = mirrorc["inst"] + cdk = mirrorc["cdk"] + try: + latest_mirrorc_return = inst.get_latest_version(cdk=cdk) + if latest_mirrorc_return.has_data: + return latest_mirrorc_return.latest_version_name + else: + logger.error(f"[MirrorC Api] get SHA error: {latest_mirrorc_return.message}") + except Exception as e: + logger.error(f"[MirrorC Api] get SHA error: {e}") + return None - @staticmethod - def sudo(cmd, pwd): - os.system(f"echo {pwd} | sudo -S {cmd}") + def git_get_remote_sha(self, branch: str = REPO_BRANCH) -> Optional[str]: + """Gets the latest SHA from the remote using ls-remote.""" + # 1. Try System Git + if self.git_executable: + try: + ref = f"refs/heads/{branch}" + out = self._run_git_cmd(["ls-remote", self.remote_url, ref], cwd=Path.cwd()) + if out: + return out.split()[0] + except Exception as e: + logger.warning(f"[System Git] ls-remote failed: {e}") - @staticmethod - def copy_directory_structure(source: Path, target: Path): - target.mkdir(parents=True, exist_ok=True) - for item in source.iterdir(): - relative_path = item.relative_to(source) - target_path = target / relative_path - if item.is_dir(): - target_path.mkdir(exist_ok=True) - Utils.copy_directory_structure(item, target_path) - elif item.is_file(): - shutil.copy2(item, target_path) + # 2. Fallback to PyGit2 (Anonymous) + try: + with tempfile.TemporaryDirectory() as tmp: + repo = pygit2.init_repository(tmp, bare=True) + remote = repo.remotes.create_anonymous(self.remote_url) + target_ref = f"refs/heads/{branch}" + for head in remote.list_heads(): + if head.name == target_ref: + return str(head.oid) + except Exception as e: + logger.error(f"[PyGit2] ls-remote failed: {e}") -# ==================== System check ==================== -if __system__ not in ["Windows", "Linux"]: - raise Exception( - f"Unsupported OS: {__system__}. Currently only Windows and Linux are supported." - ) + return None -# ==================== Config Processing ==================== -if getattr(sys, "frozen", False): - BASE_PATH = Path(sys.argv[0]).resolve().parent -else: - BASE_PATH = Path(__file__).resolve().parent + def clone(self, branch: str = REPO_BRANCH): + """Clones the repository.""" + logger.info(f"Cloning {self.remote_url}...") -if __system__ == "Linux": - BASE_PATH = Path("~").expanduser() / ".baas" + # Create the target directory if it doesn't exist + self.repo_path.mkdir(parents=True, exist_ok=True) -if not os.path.exists(BASE_PATH): - os.makedirs(BASE_PATH) + # Create a temporary directory to clone the repo + with tempfile.TemporaryDirectory() as temp_dir: + temp_repo_path = Path(temp_dir) -# Find the configuration file in the current directory -config_file = BASE_PATH / "setup.toml" -if not config_file.exists(): + if self.git_executable: + # Use System Git to clone into the temporary directory + self._run_git_cmd(["clone", "-b", branch, self.remote_url, "."], cwd=temp_repo_path) + logger.success("Clone successful (System Git).") + else: + # Use PyGit2 to clone into the temporary directory with progress + bar_ref = {"bar": None} + callbacks = BAASGitCallbacks(bar_ref) + pygit2.clone_repository(self.remote_url, str(temp_repo_path), checkout_branch=branch, + callbacks=callbacks) + callbacks.spinner.stop() + logger.success("Clone successful (PyGit2).") + + # Move the content from the temp directory to the actual target directory + for item in temp_repo_path.iterdir(): + # Move each item from temp directory to the actual target directory + shutil.move(str(item), str(self.repo_path / item.name)) + + def update(self, branch: str = REPO_BRANCH): + """Updates the repository to the latest remote state.""" + logger.info("Updating repository...") + + self.ensure_remote_url() + + if self.git_executable: + try: + self._run_git_cmd(["fetch", "origin"]) + self._run_git_cmd(["reset", "--hard", f"origin/{branch}"]) + self._run_git_cmd(["checkout", branch]) + logger.success("Update successful (System Git).") + return + except Exception as e: + logger.error(f"System Git update failed: {e}. Falling back to PyGit2.") - # If not found, create a default configuration file - with open(config_file, "wb") as file: - if __system__ == "Linux": - print( - "Since it's your first time running the script, we require password for installing packages." - ) - print( - "Don't worry, we won't use it for any other purposes. (You may check the source code)" - ) - pwd = getpass.getpass("Please enter your password: ") - DEFAULT_SETTINGS["General"]["linux_pwd"] = pwd - tomli_w.dump(DEFAULT_SETTINGS, file) -# Load the configuration file -with open(config_file, "rb") as file: - config = TOML_Config(config_file) - -config_modified = False - -def insert_new_config(cfg, new): - global config_modified - for key, value in new.items(): - if key not in cfg: - config_modified = True - cfg[key] = value - if isinstance(value, dict): - insert_new_config(cfg[key], value) - -insert_new_config(config.config, DEFAULT_SETTINGS) -if config_modified: - config.save() - -G = eDict(config.get("General")) -U = eDict(config.get("URLs")) -P = eDict(config.get("Paths")) - -BAAS_ROOT_PATH = Path(P.BAAS_ROOT_PATH).resolve() if P.BAAS_ROOT_PATH else "" or BASE_PATH -G.runtime_path = G.runtime_path.replace("\\", "/") -P.TMP_PATH = BAAS_ROOT_PATH / Path(P.TMP_PATH) -P.TOOL_KIT_PATH = BAAS_ROOT_PATH / Path(P.TOOL_KIT_PATH) -mirrorc_cdk = G.mirrorc_cdk - -if P.BAAS_ROOT_PATH and not os.path.exists(P.BAAS_ROOT_PATH): - os.makedirs(P.BAAS_ROOT_PATH) -if not os.path.exists(P.TMP_PATH): - os.makedirs(P.TMP_PATH) -if not os.path.exists(P.TOOL_KIT_PATH): - os.makedirs(P.TOOL_KIT_PATH) + # Fallback to PyGit2 + try: + repo = Repository(str(self.repo_path)) + remote = repo.remotes["origin"] + remote.fetch() + remote_master_ref = repo.lookup_reference(f"refs/remotes/origin/{branch}") + repo.reset(remote_master_ref.target, ResetMode.HARD) + repo.checkout(f"refs/heads/{branch}") + logger.success("Update successful (PyGit2).") + except Exception as e: + raise RuntimeError(f"Update failed: {e}") -# ==================== Logging Configuration ==================== + def ensure_remote_url(self): + """Ensures the remote 'origin' matches the configuration.""" + target_url = self.remote_url + if self.git_executable: + try: + current = self._run_git_cmd(["remote", "get-url", "origin"]) + if current.strip() != target_url: + logger.info(f"Switching remote URL: {current} -> {target_url}") + self._run_git_cmd(["remote", "set-url", "origin", target_url]) + return + except Exception: + pass # Fallback to pygit2 logic -logger.remove() -logger.add( - sys.stdout, - colorize=True, - format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", - level="INFO", -) + try: + repo = Repository(str(self.repo_path)) + origin = repo.remotes["origin"] + if origin.url != target_url: + logger.info(f"Switching remote URL (PyGit2) -> {target_url}") + repo.remotes.delete("origin") + repo.remotes.create("origin", target_url) + repo.remotes["origin"].fetch() + except Exception as e: + logger.warning(f"Failed to check/switch remote URL: {e}") -logger.add( - BAAS_ROOT_PATH / "log" / "installer.log", - format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", - level="INFO", -) + def repair_repo(self): + """Destructive repair: Re-clones the repo.""" + logger.warning("Repository is corrupted. Initiating repair...") -spinner = Halo() + # Use a temp directory for safe cloning + with tempfile.TemporaryDirectory() as tmp_dir: + temp_path = Path(tmp_dir) / "temp_repo" + temp_path.mkdir() -# ==================== Welcome Message ==================== -logger.info("Blue Archive Auto Script Launcher & Installer") -logger.info("GitHub Repo: https://github.com/pur1fying/blue_archive_auto_script") -logger.info("Official QQ Group: 658302636") -logger.info("Current BAAS Path: " + str(BAAS_ROOT_PATH)) + # Helper to clone into temp + temp_handler = GitOperationHandler(temp_path, self.remote_url) + temp_handler.clone() + # Clean original + if self.git_dir.exists(): + shutil.rmtree(self.git_dir, onerror=FileSystemUtils.on_rm_error) -def check_python_installation(): - try: - # Try to run the 'python' command to get version information - result = subprocess.run(["python", "--version"], capture_output=True, text=True) - if result.returncode == 0: - logger.info(f"Python is installed: {result.stdout.strip()}") - return "python" - except FileNotFoundError: - pass + # Restore files + logger.info("Restoring files...") + FileSystemUtils.copy_directory_structure(temp_path, self.repo_path) - try: - # Try to run the 'python3' command to get version information - result = subprocess.run( - ["python3", "--version"], capture_output=True, text=True - ) - if result.returncode == 0: - logger.info(f"Python 3 is installed: {result.stdout.strip()}") - return "python3" - except FileNotFoundError: - pass + logger.success("Repository repaired.") - # If both checks fail, Python is not installed - logger.info("Python is not installed on this system.") - return None + def rollback(self, target_sha: str): + """ + Rollback to a specific SHA. + REQUIREMENT: Strictly use PyGit2. + """ + logger.info(f"Rolling back to {target_sha} using PyGit2...") + repo = Repository(str(self.repo_path)) + commit = repo.revparse_single(target_sha) + repo.reset(commit.id, ResetMode.HARD) + repo.checkout_tree(commit.tree) + logger.success("Rollback successful.") -def install_package(): - try: - env_pip_exec = None +class BAASGitCallbacks(RemoteCallbacks): + """Callback handler for PyGit2 clone progress.""" - # Detect the OS and select the appropriate Python executable and path - def try_sources(pkg_mgr_path, followed_cmd=None): - for _source in G.source_list: - try: - _followed_cmd = deepcopy(followed_cmd) - if G.package_manager == "pdm": - subprocess.run( - [pkg_mgr_path, "config", "--local", "pypi.url", _source], - check=True, - ) - else: - _followed_cmd.extend(["-i", _source]) - if _followed_cmd: - if not type(pkg_mgr_path) == list: - cmds = [pkg_mgr_path, *_followed_cmd] - else: - cmds = deepcopy(pkg_mgr_path) - cmds.extend(_followed_cmd) - subprocess.run(cmds, - env=__env__, - check=True) - return - except KeyboardInterrupt: - logger.error("User interrupted the process.") - return - except: - logger.exception(f"Failed to connect to {_source}, trying next source...") - logger.error("Packages Installation failed with all sources.") - error_tackle() + def __init__(self, bar_ref): + self.__transmitted = False + self.bar_ref = bar_ref + self.received_count = 0 + self.current_count = 0 + self.spinner = Halo(text="Resolving Objects ...", spinner="dots") + super().__init__() - if G.runtime_path == "default": + def transfer_progress(self, stats): + if not self.__transmitted: + self.__transmitted = True + bar_gen = alive_bar(stats.total_objects, title="Cloning (PyGit2)...") + self.bar_ref["bar_gen"] = bar_gen + self.bar_ref["bar"] = bar_gen.__enter__() - # If Linux, don't create a virtual environment - if __system__ == "Linux": - mgr_path = BAAS_ROOT_PATH / ".env/bin/pdm" - if G.package_manager == "pip": - mgr_path = BAAS_ROOT_PATH / ".env/bin/pip" - Utils.sudo(f"chown -R $(whoami) {BAAS_ROOT_PATH}", G.linux_pwd) - try_sources( - mgr_path, - [ - "install", - "-r", - BAAS_ROOT_PATH / "requirements-linux.txt", - "--no-warn-script-location", - ], - ) - else: - try_sources(mgr_path, ["install", "-p", BAAS_ROOT_PATH]) - return + if self.bar_ref.get("bar"): + self.received_count = stats.received_objects + self.bar_ref["bar"](self.received_count - self.current_count) + self.current_count = self.received_count - python_exec_file = BAAS_ROOT_PATH / ".env/python.exe" - env_pip_exec = [str(python_exec_file), '-m', 'pip'] + if self.received_count == stats.total_objects: + self.bar_ref["bar_gen"].__exit__(None, None, None) + self.spinner.start() - if ( - not os.path.exists(BAAS_ROOT_PATH / ".venv") - and G.package_manager == "pip" - ): - # Install virtualenv package - cmd_list = ["install", "virtualenv", "--no-warn-script-location"] - try_sources( - env_pip_exec, - cmd_list, - ) - subprocess.run( - [ - str(python_exec_file), - "-m", - "virtualenv", - BAAS_ROOT_PATH / ".venv", - ], - check=True, - ) - env_pip_exec[0] = BAAS_ROOT_PATH / ".venv/Scripts/python.exe" - - if not env_pip_exec: - env_python_exec = G.runtime_path - env_pip_exec = (env_python_exec + " -m pip").split(" ") - - try_sources( - env_pip_exec, - [ - "install", - "-r", - str(BAAS_ROOT_PATH / "requirements.txt"), - "--no-warn-script-location", - ], - ) +class EnvironmentManager: + """Checks and sets up Python environment, PIP, and dependencies.""" - logger.success("Packages installed successfully") - - except: - logger.exception(f"Failed to install packages!") - return False - - -def check_pth(): - if __system__ == "Linux": - return - if os.path.exists(BAAS_ROOT_PATH / ".venv"): - return - logger.info("Checking pth file...") - read_file = [] - with open(BAAS_ROOT_PATH / ".env/python39._pth", "r", encoding="utf-8") as f: - lines = f.readlines() - for line in lines: - if line.startswith("#import site"): - line = line.replace("#", "") - read_file.append(line) - with open(BAAS_ROOT_PATH / ".env/python39._pth", "w", encoding="utf-8") as f: - f.writelines(read_file) - - -def start_app(): - if G.runtime_path == "default": - _path = ( - BAAS_ROOT_PATH / ".venv/Scripts/pythonw.exe" - if __system__ == "Windows" - else ( - BAAS_ROOT_PATH / ".venv/bin/python3" - if G.package_manager == "pdm" - else BAAS_ROOT_PATH / ".env/bin/python3" - ) - ) - _path = ( - BAAS_ROOT_PATH / ".venv/Scripts/python" - if G.debug and __system__ == "Windows" - else _path - ) - else: - _path = G.runtime_path - - if __system__ == "Linux": - if G.runtime_path == "default": - __env__["QT_QPA_PLATFORM_PLUGIN_PATH"] = str( - BAAS_ROOT_PATH - / ".env/lib/python3.9/site-packages/PyQt5/Qt5/plugins/platforms" - ) - proc = subprocess.run( - [_path, str(BAAS_ROOT_PATH / "window.py")], # 直接用列表传递命令 - cwd=BAAS_ROOT_PATH, # 先 cd 到 BAAS_ROOT_PATH - env=__env__ # 传递修改后的环境变量 - ) - return proc.returncode - else: - proc = subprocess.Popen( - [_path, str(BAAS_ROOT_PATH / "window.py")], # 直接用列表传递命令 - cwd=BAAS_ROOT_PATH, # 先 cd 到 BAAS_ROOT_PATH - env=__env__, # 传递修改后的环境变量 - ) - logger.info(f"Started process with PID: {proc.pid}") - return proc.pid + def __init__(self, config: GlobalConfig): + self.cfg = config + self.baas_root = config.baas_root + def check_pip(self): + logger.info("Checking pip installation...") + if __system__ == "Linux": + return -def run_app(): - logger.info("Start to run the app...") - try: # record pid - with open(BAAS_ROOT_PATH / "pid", "a+") as f: - f.seek(0) - try: - last_pid = int(f.read()) - except: - last_pid = 2147483647 - if psutil.pid_exists(last_pid): - if not G.force_launch: - logger.info( - "App already started. Killing." - ) # close existing BAAS - p = psutil.Process(last_pid) - try: - p.terminate() - except: - os.system(f"taskkill /f /pid {last_pid}") - else: - with open(BAAS_ROOT_PATH / "pid", "w+") as _f: - _f.write(str(start_app())) - logger.success("Start app success.") - f.close() - with open(BAAS_ROOT_PATH / "pid", "w+") as _f: - _f.write(str(start_app())) - logger.success("Start app success.") - _f.close() + assert __system__ == "Windows" + if not os.path.exists(self.baas_root / ".env/Scripts/pip.exe"): + logger.warning("Pip is not installed, trying to install pip...") + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) / "temp_pip" + filepath = FileSystemUtils.download_file(self.cfg.URLs.GET_PIP_URL, temp_path) + subprocess.run([self.baas_root / ".env/python.exe", filepath]) - except Exception: - logger.exception("Run app failed") - error_tackle() + def check_pth(self): + if __system__ == "Linux": + return + if os.path.exists(self.baas_root / ".venv"): + return + logger.info("Checking pth file...") + read_file = [] + with open(self.baas_root / ".env/python39._pth", "r", encoding="utf-8") as f: + lines = f.readlines() + for line in lines: + if line.startswith("#import site"): + line = line.replace("#", "") + read_file.append(line) + with open(self.baas_root / ".env/python39._pth", "w", encoding="utf-8") as f: + f.writelines(read_file) + + def check_env_patch(self): + if __system__ == "Linux": + return + if os.path.exists(self.baas_root / ".env/Lib/site-packages/Polygon"): + return + logger.info("Downloading env patch...") + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) / "temp_repo" + filepath = FileSystemUtils.download_file(self.cfg.URLs.GET_ENV_PATCH_URL, temp_path) + FileSystemUtils.unzip_file(filepath, self.baas_root / ".env") - if __system__ == "Windows" and not G.no_build: - try: - import PyInstaller.__main__ - - check_upx() - - def create_executable(): - PyInstaller.__main__.run( - [ - str(BAAS_ROOT_PATH / "installer.py"), - "--name=BlueArchiveAutoScript", - "--onefile", - "--icon=gui/assets/logo.ico", - "--noconfirm", - "--upx-dir", - "./toolkit/upx-4.2.4-win64", - ] - ) + def check_python(self): + """Checks for Python installation, installs/creates venv if missing.""" + logger.info("Checking Python environment...") - if os.path.exists(BAAS_ROOT_PATH / "backup.exe") and not os.path.exists( - BAAS_ROOT_PATH / "no_build" - ): - create_executable() - logger.info("try to remove the backup executable file.") - try: - os.remove(BAAS_ROOT_PATH / "backup.exe") - except: - logger.info("remove backup.exe failed.") - else: - logger.info("remove finished.") - os.rename("BlueArchiveAutoScript.exe", "backup.exe") - shutil.copy("dist/BlueArchiveAutoScript.exe", ".") - except: - logger.warning( - "Build new BAAS launcher failed, Please check the Python Environment" - ) - error_tackle() - - -def error_tackle(): - logger.info( - "Now you can turn off this command line window safely or report this issue to developers." - ) - logger.info("现在您可以安全地关闭此命令行窗口或向开发者上报问题。") - logger.info("您现在可以安全地关闭此命令行窗口或向开发人员报告此问题。") - logger.info( - "今、このコマンドラインウィンドウを安全に閉じるか、この問題を開発者に報告することができます。" - ) - logger.info( - "이제 이 명령줄 창을 안전하게 종료하거나 이 문제를 개발자에게 보고할 수 있습니다。" - ) - os.system("pause") - sys.exit() - - -def check_requirements(): - logger.info("Check package Installation...") - install_package() - logger.success("Install requirements success") - - -def check_pdm(): - raise NotImplementedError("PDM currently not supported.") - # if os.path.exists(BAAS_ROOT_PATH / ".venv"): - # logger.info("Already installed pdm.") - # return - # - # logger.info("Checking pdm installation...") - # if __system__ == "Linux": - # if os.path.exists(BAAS_ROOT_PATH / ".env/bin/pdm"): - # return - # subprocess.run([BAAS_ROOT_PATH / ".env/bin/pip3", "install", "pdm"], check=True) - # return - # - # assert __system__ == "Windows" - # if not os.path.exists(BAAS_ROOT_PATH / ".env/Scripts/pip.exe"): - # logger.warning("Pip is not installed, trying to install pip...") - # filepath = Utils.download_file(U.GET_PIP_URL, P.TMP_PATH) - # subprocess.run([BAAS_ROOT_PATH / ".env/python.exe", filepath]) - # - # if not os.path.exists(BAAS_ROOT_PATH / ".env/Scripts/pdm.exe"): - # logger.warning("Pdm is not installed, trying to install pdm...") - # subprocess.run([BAAS_ROOT_PATH / ".env/Scripts/pip.exe", "install", "pdm"]) - - -def check_pip(): - logger.info("Checking pip installation...") - if __system__ == "Linux": - return - - assert __system__ == "Windows" - if not os.path.exists(BAAS_ROOT_PATH / ".env/Scripts/pip.exe"): - logger.warning("Pip is not installed, trying to install pip...") - filepath = Utils.download_file(U.GET_PIP_URL, P.TMP_PATH) - subprocess.run([BAAS_ROOT_PATH / ".env/python.exe", filepath]) - - -def check_python(): - logger.info("Checking python installation...") - if os.path.exists(BAAS_ROOT_PATH / ".venv"): - return - # Platform-specific Python installation check - _path = "" - if __system__ == "Windows": - _path = BAAS_ROOT_PATH / ".env/python.exe" - elif __system__ == "Linux": - _path = BAAS_ROOT_PATH / ".env/bin/python3" - - if not os.path.exists(_path): - logger.info("Python environment is not installed, trying to install python...") + venv_path = self.baas_root / ".venv" + if venv_path.exists(): return + + # Path definitions if __system__ == "Windows": - filepath = Utils.download_file(U.GET_PYTHON_URL, P.TMP_PATH) - Utils.unzip_file(filepath, BAAS_ROOT_PATH / ".env") - os.remove(filepath) + python_path = self.baas_root / ".env/python.exe" + if not python_path.exists(): + logger.info("Downloading embedded Python...") + with tempfile.TemporaryDirectory() as temp_dir: + zip_path = FileSystemUtils.download_file(self.cfg.URLs.GET_PYTHON_URL, temp_dir) + FileSystemUtils.unzip_file(zip_path, self.baas_root / ".env") elif __system__ == "Linux": - # For Ubuntu, other Linux distributions may need to be modified - Utils.sudo("add-apt-repository ppa:deadsnakes/ppa", G.linux_pwd) - Utils.sudo("apt update", G.linux_pwd) - Utils.sudo("apt-get install python3.9-venv -y", G.linux_pwd) - Utils.sudo(f"python3.9 -m venv {BAAS_ROOT_PATH / '.env'}", G.linux_pwd) - - -def check_upx(): - logger.info("Checking UPX installation.") - if not os.path.exists("toolkit/upx-4.2.4-win64/upx.exe"): - filepath = Utils.download_file(U.GET_UPX_URL, P.TMP_PATH) - Utils.unzip_file(filepath, P.TOOL_KIT_PATH) - os.remove(filepath) - + python_path = self.baas_root / ".env/bin/python3" + if not python_path.exists(): + logger.info("Setting up Python venv (Linux)...") + pwd = self.cfg.General.linux_pwd + FileSystemUtils.sudo("add-apt-repository ppa:deadsnakes/ppa -y", pwd) + FileSystemUtils.sudo("apt update", pwd) + FileSystemUtils.sudo("apt-get install python3.9-venv -y", pwd) + FileSystemUtils.sudo(f"python3.9 -m venv {self.baas_root / '.env'}", pwd) + + def install_requirements(self): + """Installs PIP dependencies.""" + logger.info("Installing requirements...") + try: + # Determine pip executable + if __system__ == "Windows": + python_exc = str(self.baas_root / ".env/python.exe") + pip_exec = [python_exc, "-m", "pip"] -def check_env_patch(): - if __system__ == "Linux": - return - if os.path.exists(BAAS_ROOT_PATH / ".env/Lib/site-packages/Polygon"): - return - logger.info("Downloading env patch...") - filepath = Utils.download_file(U.GET_ENV_PATCH_URL, P.TMP_PATH) - Utils.unzip_file(filepath, BAAS_ROOT_PATH / ".env") + # Setup virtualenv if using default pip mode + if self.cfg.General.package_manager == "pip" and not (self.baas_root / ".venv").exists(): + subprocess.run([*pip_exec, "install", "virtualenv", "--no-warn-script-location"], check=True) + subprocess.run([python_exc, "-m", "virtualenv", str(self.baas_root / ".venv")], check=True) + pip_exec = [str(self.baas_root / ".venv/Scripts/python.exe"), "-m", "pip"] + else: + # Linux logic + pip_path = self.baas_root / ".env/bin/pip" + FileSystemUtils.sudo(f"chown -R $(whoami) {self.baas_root}", self.cfg.General.linux_pwd) + pip_exec = [str(pip_path)] -def fix_exe_shebangs(search_dir=".venv\\Scripts"): - """ - Scan all .exe files under the given directory and replace any shebang line - like '#!\\.venv\\Scripts\\python.exe' with '#!python.exe', - while preserving the original file size by padding with spaces. - Backup files are saved to '__exe_backups__'. - """ - backup_dir = ".venv/__exe_backups__" - os.makedirs(backup_dir, exist_ok=True) + # Install loop with source fallback + req_file = "requirements-linux.txt" if __system__ == "Linux" else "requirements.txt" - # Regex to match any shebang line ending with .venv\Scripts\python.exe - pattern = re.compile(rb'#!.*?\\.venv\\Scripts\\python\.exe') - replacement = b"#!python.exe" + for source in self.cfg.General.source_list: + try: + cmd = [*pip_exec, "install", "-r", str(self.baas_root / req_file), "-i", source, + "--no-warn-script-location"] + subprocess.run(cmd, env=__env__, check=True) + logger.success("Dependencies installed.") + return + except Exception: + logger.warning(f"Failed source {source}, trying next...") - # Collect all .exe files under the search directory - exe_files = [] - for root, _, files in os.walk(search_dir): - for filename in files: - if filename.lower().endswith(".exe"): - exe_files.append(os.path.join(root, filename)) + raise RuntimeError("All pip sources failed.") - modified_count = 0 + except Exception: + logger.exception("Failed to install packages.") + Utils.error_tackle() - with alive_bar(len(exe_files), title="Fixing .exe shebangs") as bar: - for full_path in exe_files: - bar() - try: - with open(full_path, "rb") as f: - content = f.read() + def fix_shebangs(self): + """Fixes Windows venv exe shebangs to allow portability.""" + if __system__ != "Windows": return - match = pattern.search(content) - if not match: - continue + search_dir = self.baas_root / ".venv/Scripts" + if not search_dir.exists(): return - matched_bytes = match.group(0) - padding_len = len(matched_bytes) - len(replacement) - if padding_len < 0: - logger.warning(f"Skipped (replacement too long): {full_path}") - continue + logger.info("Fixing .exe shebangs for portability...") + # (Logic from original fix_exe_shebangs - compacted) + pattern = re.compile(rb'#!.*?\\.venv\\Scripts\\python\.exe') + replacement = b"#!python.exe" - replacement_padded = replacement + b' ' * padding_len - new_content = content.replace(matched_bytes, replacement_padded, 1) + for root, _, files in os.walk(search_dir): + for filename in files: + if filename.lower().endswith(".exe"): + path = Path(root) / filename + try: + data = path.read_bytes() + match = pattern.search(data) + if match: + matched = match.group(0) + padding = len(matched) - len(replacement) + if padding >= 0: + new_data = data.replace(matched, replacement + b' ' * padding, 1) + path.write_bytes(new_data) + except Exception: + pass + logger.success("Shebangs patched.") + + +class UpdateOrchestrator: + """Manages the update process (Git vs MirrorC).""" + + def __init__(self, config: GlobalConfig, env_mgr: EnvironmentManager): + self.cfg = config + self.git = GitOperationHandler(config.baas_root, config.URLs.REPO_URL_HTTP) + self.mirrorc = MirrorC_Updater(app="BAAS_repo", current_version="") + self.env = env_mgr + + def run(self): + """Main update execution flow.""" + if self.cfg.General.dev: + return - # Construct backup path - rel_path = os.path.relpath(full_path, search_dir) - backup_path = os.path.join(backup_dir, rel_path) - os.makedirs(os.path.dirname(backup_path), exist_ok=True) + local_sha = self._get_local_version() + self.mirrorc.set_version(local_sha) - # Save backup - with open(backup_path, "wb") as f: - f.write(content) + # 1. Determine Update Necessity + remote_sha = self._get_remote_version() + if not remote_sha or local_sha == remote_sha: + logger.info("No update available.") + return - # Overwrite original file - with open(full_path, "wb") as f: - f.write(new_content) + logger.info(f"Update found: {local_sha[:7]} -> {remote_sha[:7]}") - modified_count += 1 + # 2. Try MirrorC (Incremental/Full) + if self.cfg.General.mirrorc_cdk and self._try_mirrorc_update(): + return - except: - logger.exception(f"Failed to process {full_path}: {e}") + # 3. Fallback to Git + self._git_update() - logger.success(f"Finished. {modified_count} .exe file(s) patched.") - if modified_count > 0: - logger.info(f"Backups saved to: {os.path.abspath(backup_dir)}") - else: - logger.info("No matching shebangs were found in .exe files.") + def _get_local_version(self) -> str: + """Determines the local version (SHA).""" + # Try reading from config first + stored_sha = self.cfg.General.current_BAAS_version + if stored_sha and len(stored_sha) == 40: + return stored_sha -class BAASGitCallbacks(RemoteCallbacks): - def __init__(self, bar_ref): - self.__transmitted = False - self.bar_ref = bar_ref - self.received_count = 0 - self.current_count = 0 - self.spinner = Halo(text="Resolving Objects ...", spinner="dots") - super().__init__() + # Try reading from Git repo + if self.git.is_valid_repo(): + try: + sha = self.git.get_local_sha() + self.cfg.save_value("General.current_BAAS_version", sha) + return sha + except Exception: + pass - def transfer_progress(self, stats): - if not self.__transmitted: - self.__transmitted = True - # Create the progress bar generator - bar_gen = alive_bar(stats.total_objects, title="Cloning repository...") - self.bar_ref["bar_gen"] = bar_gen - self.bar_ref["bar"] = bar_gen.__enter__() # Enter the context + # Assume fresh installation needed + return "" - if self.bar_ref.get("bar"): - self.received_count = stats.received_objects - self.bar_ref["bar"](self.received_count - self.current_count) # Advance the progress bar by one - self.current_count = self.received_count + def _get_remote_version(self) -> Optional[str]: + """Fetches remote SHA using configured methods.""" + # This implementation simplifies the rotation logic from the original code + # by delegating to the GitHandler or specialized API calls + return self.git.get_remote_sha(self.cfg, self.mirrorc) - if self.received_count == stats.total_objects: - self.bar_ref["bar_gen"].__exit__(None, None, None) - self.spinner.start() + def _try_mirrorc_update(self) -> bool: + """Attempts to update via MirrorC.""" + update_type = self._get_mirror_update_type() -def clone_repo(repo_url, local_path): - bar_ref = {"bar": None} - callbacks = BAASGitCallbacks(bar_ref) - repo = clone_repository(repo_url, local_path, callbacks=callbacks) - callbacks.spinner.stop() - logger.success("Cloning completed successfully.") - return repo + try: + ret = self.mirrorc.get_latest_version(cdk=self.cfg.General.mirrorc_cdk) + if not ret.has_url: return False + + logger.info(f"MirrorC Update available ({update_type}).") + + if update_type == "incremental": + logger.info("+--------------------------------+") + logger.info("| MIRRORC UPDATE BAAS |") + logger.info("+--------------------------------+") + logger.info("Applying incremental patch...") + self._mirrorc_update_baas(latest_mirrorc_return=ret) + elif update_type == "full": + logger.info("+--------------------------------+") + logger.info("| MIRRORC INSTALL BAAS |") + logger.info("+--------------------------------+") + logger.info("Applying full package...") + self._mirrorc_install_baas(latest_mirrorc_return=ret) + else: + raise Exception(f"Unknown update type {update_type}") + # Cleanup .git if moving to MirrorC-only management + if self.git.git_dir.exists(): + shutil.rmtree(self.git.git_dir, onerror=FileSystemUtils.on_rm_error) -def repair_broken_git_repo(): - global repo - del repo - # repo = None - gc.collect() + self.cfg.save_value("General.current_BAAS_version", ret.latest_version_name) + return True + except Exception as e: + logger.error(f"MirrorC update failed: {e}") + return False + + def _get_mirror_update_type(self) -> str: + local_sha = self.cfg.General.current_BAAS_version + if len(local_sha) == 0: + if os.path.exists(self.cfg.Paths.BAAS_ROOT_PATH / ".git"): + repo = Repository(str(self.cfg.Paths.BAAS_ROOT_PATH)) + # Get local SHA + try: + local_sha = str(repo.head.target) + except Exception as e: + logger.error(f"Incorrect Key or corrupted repo: {e}. Remove [ .git ] folder and reinstall.") + del repo + gc.collect() + shutil.rmtree(self.cfg.Paths.BAAS_ROOT_PATH / ".git") + return "full" + else: + # first install + return "full" + + assert (len(local_sha) == 40) + self.mirrorc.set_version(local_sha) + remote_sha = self._get_remote_version() + assert (len(remote_sha) == 40) + logger.info(f"local_sha : {local_sha}") + logger.info(f"remote_sha: {remote_sha}") + if local_sha == remote_sha: + return "latest" - # Remove the existing .git directory - git_dir = BAAS_ROOT_PATH / ".git" - if git_dir.exists(): - logger.info("Removing broken Git repository...") - shutil.rmtree(git_dir, ignore_errors=True) + return "incremental" - logger.warning("Attempting to repair invalid Git repo...") + def _git_update(self): + """Performs Git install or update.""" + if not self.git.is_valid_repo(): + self.git.clone() + else: + try: + self.git.update() + except Exception: + self.git.repair_repo() + self.git.update() + + new_sha = self.git.get_local_sha() + self.cfg.save_value("General.current_BAAS_version", new_sha) + + def _mirrorc_install_baas(self, latest_mirrorc_return): + logger.info("+--------------------------------+") + logger.info("| MIRRORC INSTALL BAAS |") + logger.info("+--------------------------------+") + # Download the repository zip file + file_length = latest_mirrorc_return.file_size / (1024 * 1024) + logger.info("Downloading the repository zip, total = %.2f MB" % file_length) + with tempfile.TemporaryDirectory() as tmp_dir: + zip_path = FileSystemUtils.download_file( + latest_mirrorc_return.download_url, tmp_dir + ) + logger.info("Unzipping the repository...") + FileSystemUtils.unzip_file(zip_path, zip_path) + + logger.info("Moving unzipped files to BAAS root path...") + file_dir = Path(tmp_dir) / "blue_archive_auto_script" + FileSystemUtils.copy_directory_structure(file_dir, self.cfg.Paths.BAAS_ROOT_PATH) + + logger.success("Mirrorc Install Success!") + + def _mirrorc_update_baas(self, latest_mirrorc_return): + logger.info("+--------------------------------+") + logger.info("| MIRRORC UPDATE BAAS |") + logger.info("+--------------------------------+") + + # wait for incremental update + if latest_mirrorc_return.update_type == "full": + logger.info("Current package is [ full ].") + logger.info("Waiting for [ incremental ] update package...") + max_retry = 10 + for i in range(1, max_retry + 1): + time.sleep(0.5) + logger.info(f"Retry : {i}/{max_retry}") + latest_mirrorc_return = self.mirrorc.get_latest_version(cdk=self.cfg.General.mirrorc_cdk) + if latest_mirrorc_return.update_type == "incremental": + logger.success("Get Incremental Package") + break + + if latest_mirrorc_return.update_type == "incremental": + logger.info("<<< Incremental Update >>>") + file_length = latest_mirrorc_return.file_size / (1024 * 1024) + logger.info("Downloading the incremental zip, total = %.2f MB" % file_length) + + with tempfile.TemporaryDirectory() as tmp_dir: + zip_path = FileSystemUtils.download_file( + latest_mirrorc_return.download_url, tmp_dir + ) + logger.info("Unzipping the incremental update...") + FileSystemUtils.unzip_file(zip_path, zip_path) + + MirrorC_Updater.apply_update( + tmp_dir, + Path(tmp_dir) / "changes.json", + Path(self.cfg.Paths.BAAS_ROOT_PATH), + logger + ) + logger.success("Mirrorc Incremental Update Success!") - temp_clone_path = BAAS_ROOT_PATH / "temp_clone" + if latest_mirrorc_return.update_type == "full": + logger.info("<<< Full Update >>>") + self._mirrorc_install_baas(latest_mirrorc_return) - # Remove any existing temp_clone directory - if temp_clone_path.exists(): - shutil.rmtree(temp_clone_path, ignore_errors=True) - # Clone the repository to a temporary directory - logger.info("Cloning fresh repo to temporary directory...") - repo = clone_repo(U.REPO_URL_HTTP, str(temp_clone_path)) +class AppLauncher: + """Handles launching the main application.""" - # Release the occupation of the directory - del repo - # repo = None - gc.collect() + def __init__(self, config: GlobalConfig): + self.cfg = config + self.baas_root = config.baas_root - # Move the cloned repository to the desired location - for item in temp_clone_path.iterdir(): - dst = BAAS_ROOT_PATH / item.name - if dst.exists(): - if dst.is_dir(): - shutil.rmtree(dst, ignore_errors=True) - else: - dst.unlink() - shutil.move(str(item), str(dst)) + def run_app(self): - shutil.rmtree(temp_clone_path, ignore_errors=True) - logger.success("Git repository successfully repaired.") + if self.cfg.General.use_dynamic_update: + self.dynamic_update_installer() + """Starts window.py.""" + logger.info("Launching App...") -def git_install_baas(): - logger.info("+--------------------------------+") - logger.info("| GIT INSTALL BAAS |") - logger.info("+--------------------------------+") - logger.info("Cloning the repository...") - logger.info("Repo URL : " + U.REPO_URL_HTTP) - temp_clone_path = BAAS_ROOT_PATH / "temp_clone" + python_exec = self._get_python_executable() + env = __env__.copy() - if temp_clone_path.exists(): - logger.info("Removing temp_clone directory...") - shutil.rmtree(str(temp_clone_path), ignore_errors=False, onerror=Utils.on_rm_error) + if __system__ == "Linux": + env["QT_QPA_PLATFORM_PLUGIN_PATH"] = str( + self.baas_root / ".env/lib/python3.9/site-packages/PyQt5/Qt5/plugins/platforms") - # Clone the repository using pygit2 - repo = clone_repo( - U.REPO_URL_HTTP, - str(temp_clone_path), - ) + cmd = [str(python_exec), str(self.baas_root / "window.py")] - # Release the occupation of the directory - del repo - # repo = None - gc.collect() + # Check for running instances + self._kill_existing_process() - # Move the cloned repository to the desired location - Utils.copy_directory_structure(temp_clone_path, BAAS_ROOT_PATH) + try: + if __system__ == "Windows": + # Detached process + subprocess.Popen(cmd, cwd=self.baas_root, env=env) + else: + subprocess.run(cmd, cwd=self.baas_root, env=env) - # Remove temporary clone directory - shutil.rmtree(str(temp_clone_path), ignore_errors=False, onerror=Utils.on_rm_error) - logger.success("Git Install Success!") + logger.success("App started.") + # Record PID + # (Simplified for brevity - logic remains similar to original) + except Exception as e: + logger.error(f"Failed to launch app: {e}") + Utils.error_tackle() -def check_repo_url(_repo): - origin = _repo.remotes["origin"] - logger.info("<<< Repo Remote URL >>>") - logger.info(origin.url) + if __system__ == "Windows" and not self.cfg.General.no_build: + try: + import PyInstaller.__main__ - if origin.url != U.REPO_URL_HTTP: - original_url = origin.url - upstream_backup = {} - for branch in _repo.branches.local: - local_branch = _repo.lookup_branch(branch) - if local_branch.upstream: - upstream_backup[branch] = local_branch.upstream.name + logger.info("Checking UPX installation.") + if not os.path.exists("toolkit/upx-4.2.4-win64/upx.exe"): + with tempfile.TemporaryDirectory() as tmpdir: + temp_path = Path(tmpdir) + filepath = FileSystemUtils.download_file(self.cfg.URLs.GET_UPX_URL, temp_path) + FileSystemUtils.unzip_file(filepath, self.cfg.Paths.TOOL_KIT_PATH) - try: - logger.info("<<< Switch Repo Remote URL >>>") - logger.info(U.REPO_URL_HTTP) - _repo.remotes.delete("origin") - new_origin = _repo.remotes.create("origin", U.REPO_URL_HTTP) - for ref in list(_repo.references): - if ref.startswith("refs/remotes/origin/"): - _repo.references.delete(ref) - new_origin.fetch() - logger.info("Setting remote branches upstream...") - for branch in _repo.branches.local: - local_branch = _repo.lookup_branch(branch) - remote_branch_name = f"origin/{branch}" - if remote_branch_name in _repo.branches.remote: - remote_branch = _repo.lookup_branch( - remote_branch_name, - pygit2.GIT_BRANCH_REMOTE + def create_executable(): + PyInstaller.__main__.run( + [ + str(self.cfg.Paths.BAAS_ROOT_PATH / "installer.py"), + "--name=BlueArchiveAutoScript", + "--onefile", + "--icon=gui/assets/logo.ico", + "--noconfirm", + "--upx-dir", + "./toolkit/upx-4.2.4-win64", + ] ) - local_branch.upstream = remote_branch - logger.success("Remote repo url switched.") - - except GitError as e: - logger.error(f"Failed to fetch from new origin: {e}") - logger.info("<<< Rolling back to original URL >>>") - - try: - # 删除失败的新origin - _repo.remotes.delete("origin") - - # 恢复原始远程 - restored_origin = _repo.remotes.create("origin", original_url) - - # 重新获取原始仓库数据 - restored_origin.fetch() - - # 恢复上游分支设置 - for branch, upstream_ref in upstream_backup.items(): - local_branch = _repo.lookup_branch(branch) - # 确保远程分支引用存在 - if upstream_ref in _repo.references: - remote_branch = _repo.lookup_branch( - upstream_ref.replace("refs/remotes/", ""), - pygit2.GIT_BRANCH_REMOTE - ) - local_branch.upstream = remote_branch - - logger.success("Successfully reverted to original repository URL") - - except Exception as rollback_error: - logger.critical(f"Critical error during rollback: {rollback_error}") - raise RuntimeError("Repository recovery failed") from rollback_error - -def git_update_baas(): - global local_sha - global remote_sha - global repo - logger.info("+--------------------------------+") - logger.info("| GIT UPDATE BAAS |") - logger.info("+--------------------------------+") - try: - repo = Repository(str(BAAS_ROOT_PATH)) - check_repo_url(repo) - refresh_required = G.refresh - if refresh_required: - logger.info("You've selected dropping all changes for the project file.") - - spinner.start("Pulling updates from the remote repository...") - - # Fetch updates from the remote repository - remote = repo.remotes["origin"] - remote.fetch(callbacks=BAASGitCallbacks({"bar": None})) - del remote - gc.collect() - - # Reset local branch to remote - repo.reset(repo.lookup_reference(f"refs/remotes/origin/{REPO_BRANCH}").target, GIT_RESET_HARD) - - # Checkout to master (HEAD points to refs/heads/master) - repo.checkout(f"refs/heads/{REPO_BRANCH}") - # str(repo.references.get("refs/remotes/origin/master").target) - local_sha = str(repo.head.target) - if local_sha == remote_sha: - spinner.succeed("Update completed.") - logger.success("Git Update Success") - else: - spinner.fail("Failed to update the source code to latest version.") - logger.warning("Possible reason is your current update source haven't updated to latest.") - logger.warning("If you constantly encounter this issue, please try to use another update source like github.") - except GitError as e: - if "not owned by current user" in str(e): - logger.error(f"Git repo ownership error: {e}") - if repo: del repo - repair_broken_git_repo() - else: - logger.error(f"Unhandled Git error: {e}") - raise + if os.path.exists(self.cfg.Paths.BAAS_ROOT_PATH / "backup.exe") and not os.path.exists( + self.cfg.Paths.BAAS_ROOT_PATH / "no_build" + ): + create_executable() + logger.info("try to remove the backup executable file.") + try: + os.remove(self.cfg.Paths.BAAS_ROOT_PATH / "backup.exe") + except: + logger.info("remove backup.exe failed.") + else: + logger.info("remove finished.") + os.rename("BlueArchiveAutoScript.exe", "backup.exe") + shutil.copy("dist/BlueArchiveAutoScript.exe", ".") + except: + logger.warning( + "Build new BAAS launcher failed, Please check the Python Environment" + ) + Utils.error_tackle() -def dynamic_update_installer(): - # Define paths for the installer and Python interpreter - installer_path = BAAS_ROOT_PATH / "deploy/installer/installer.py" + def dynamic_update_installer(self) -> None: + # Define paths for the installer and Python interpreter + installer_path = Path(self.cfg.Paths.BAAS_ROOT_PATH )/ "deploy/installer/installer.py" - # Use platform-independent way to determine Python executable - if __system__ == "Windows": - python_path = BAAS_ROOT_PATH / ".venv/Scripts/python.exe" - else: # Linux/Unix - python_path = BAAS_ROOT_PATH / ".env/bin/python" + # Use platform-independent way to determine Python executable + if __system__ == "Windows": + python_path = Path(self.cfg.Paths.BAAS_ROOT_PATH) / ".venv/Scripts/python.exe" + else: # Linux/Unix + python_path = Path(self.cfg.Paths.BAAS_ROOT_PATH) / ".env/bin/python" - # Prepare the command arguments - launch_exec_args = sys.argv.copy() - launch_exec_args[0] = os.path.abspath(python_path) - launch_exec_args.insert(1, os.path.abspath(installer_path)) + # Prepare the command arguments + launch_exec_args = sys.argv.copy() + launch_exec_args[0] = os.path.abspath(python_path) + launch_exec_args.insert(1, os.path.abspath(installer_path)) - # Check if paths exist and arguments are provided - if ( + # Check if paths exist and arguments are provided + if ( os.path.exists(installer_path) and os.path.exists(python_path) and len(sys.argv) > 1 - ): - try: - subprocess.run(launch_exec_args) - except: - logger.exception(f"Error running installer updater...") - run_app() - elif G.internal_launch: # Internal launch fallback - run_app() - else: - if not os.path.exists(installer_path): - logger.warning("Installer not found. Launching app directly.") - run_app() - sys.exit() - - # Use platform-specific commands to start the installer - if __system__ == "Windows": - os.system(f'START " " "{python_path}" "{installer_path}" --launch') - else: # Linux/Unix - subprocess.run([python_path, installer_path, "--launch"]) - - sys.exit() - - -def clean_up(): - if os.path.exists(P.TMP_PATH): - shutil.rmtree(P.TMP_PATH) - - -def pre_check(): - if G.runtime_path == "default": - check_python() - if G.package_manager == "pdm": - check_pdm() - elif G.package_manager == "pip": - check_pip() - check_pth() - check_env_patch() - - install_or_update_BAAS_repo_to_latest() - check_requirements() - if __system__ == "Windows": - fix_exe_shebangs() - - -def get_update_type(): - global repo - global local_sha - global remote_sha - global update_type - local_sha = G.current_BAAS_version - if len(local_sha) == 0: - if os.path.exists(BAAS_ROOT_PATH / ".git"): - repo = Repository(str(BAAS_ROOT_PATH)) - # Get local SHA + ): try: - local_sha = str(repo.head.target) - except Exception as e: - logger.error(f"Incorrect Key or corrupted repo: {e}. Remove [ .git ] folder and reinstall.") - del repo - # repo = None - update_type = "full" - gc.collect() - shutil.rmtree(BAAS_ROOT_PATH / ".git") - return + subprocess.run(launch_exec_args) + except: + logger.exception(f"Error running installer updater...") + self.run_app() + elif self.cfg.General.internal_launch: # Internal launch fallback + self.run_app() else: - # first install - update_type = "full" - return + if not os.path.exists(installer_path): + logger.warning("Installer not found. Launching app directly.") + self.run_app() + sys.exit() + + # Use platform-specific commands to start the installer + if __system__ == "Windows": + os.system(f'START " " "{python_path}" "{installer_path}" --launch') + else: # Linux/Unix + subprocess.run([python_path, installer_path, "--launch"]) + sys.exit() + + def _get_python_executable(self) -> Path: + """Determines the correct python executable path.""" + if self.cfg.General.runtime_path != "default": + return Path(self.cfg.General.runtime_path) + + if __system__ == "Windows": + return self.baas_root / ".venv/Scripts/pythonw.exe" + else: + return self.baas_root / ".env/bin/python3" - assert (len(local_sha) == 40) - mirrorc_inst.set_version(local_sha) - remote_sha = Utils.get_remote_sha() - assert (len(remote_sha) == 40) - logger.info(f"local_sha : {local_sha}") - logger.info(f"remote_sha: {remote_sha}") - if local_sha == remote_sha: - update_type = "latest" - return - update_type = "incremental" - return - - -def install_or_update_BAAS_repo_to_latest(): - if G.dev: - return - - get_update_type() - - global update_type - if update_type == "latest": - logger.info("No Update Available.") - return - - if try_mirrorc_install_or_update(): - return - try_git_install_or_update() - -def try_git_install_or_update(): - global repo - global local_sha - if os.path.exists(BAAS_ROOT_PATH / ".git"): - git_update_baas() - else: - git_install_baas() - repo = Repository(str(BAAS_ROOT_PATH)) - local_sha = str(repo.head.target) - config.set_and_save("General.current_BAAS_version", local_sha) - -def try_mirrorc_install_or_update(): - if not (len(mirrorc_cdk) > 0): - return False - - global latest_mirrorc_return - global update_type - if latest_mirrorc_return is None: - latest_mirrorc_return = mirrorc_inst.get_latest_version(cdk=mirrorc_cdk) - if not latest_mirrorc_return.has_url: - MirrorC_Updater.log_mirrorc_error(latest_mirrorc_return, logger) - return False - # timestamp to datetime - expired_time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(latest_mirrorc_return.cdk_expired_time)) - logger.success("CDK valid, expired time : " + expired_time_str) - if latest_mirrorc_return.latest_version_name == local_sha: - logger.info("No Update Available.") - return True - if update_type == "full": - mirrorc_install_baas() - elif update_type == "incremental": - mirrorc_update_baas() - - if os.path.exists(BAAS_ROOT_PATH / ".git"): - logger.info("Removing [ .git ] directory...") - shutil.rmtree(BAAS_ROOT_PATH / ".git", ignore_errors=False, onerror=Utils.on_rm_error) - - config.set_and_save("General.current_BAAS_version", latest_mirrorc_return.latest_version_name) - return True - -def mirrorc_install_baas(): - logger.info("+--------------------------------+") - logger.info("| MIRRORC INSTALL BAAS |") - logger.info("+--------------------------------+") - # Download the repository zip file - global latest_mirrorc_return - file_MB = latest_mirrorc_return.file_size / (1024 * 1024) - logger.info("Downloading the repository zip, total = %.2f MB" % file_MB) - zip_path = Utils.download_file( - latest_mirrorc_return.download_url, P.TMP_PATH - ) - logger.info("Unzipping the repository...") - Utils.unzip_file(zip_path, P.TMP_PATH) - - logger.info("Moving unzipped files to BAAS root path...") - file_dir = P.TMP_PATH / "blue_archive_auto_script" - Utils.copy_directory_structure(file_dir, BAAS_ROOT_PATH) - - logger.success("Mirrorc Install Success!") - -def mirrorc_update_baas(): - logger.info("+--------------------------------+") - logger.info("| MIRRORC UPDATE BAAS |") - logger.info("+--------------------------------+") - - global latest_mirrorc_return - - # wait for incremental update - if latest_mirrorc_return.update_type == "full": - logger.info("Current package is [ full ].") - logger.info("Waiting for [ incremental ] update package...") - max_retry = 10 - for i in range(1, max_retry+1): - time.sleep(0.5) - logger.info(f"Retry : {i}/{max_retry}") - latest_mirrorc_return = mirrorc_inst.get_latest_version(cdk=mirrorc_cdk) - if latest_mirrorc_return.update_type == "incremental": - logger.success("Get Incremental Package") - break - - if latest_mirrorc_return.update_type == "incremental": - logger.info("<<< Incremental Update >>>") - file_MB = latest_mirrorc_return.file_size / (1024 * 1024) - logger.info("Downloading the incremental zip, total = %.2f MB" % file_MB) - zip_path = Utils.download_file( - latest_mirrorc_return.download_url, P.TMP_PATH + def _kill_existing_process(self): + """Checks PID file and kills existing instance if configured.""" + pid_file = self.baas_root / "pid" + if pid_file.exists() and not self.cfg.General.force_launch: + try: + pid = int(pid_file.read_text()) + if psutil.pid_exists(pid): + logger.info("Terminating existing instance...") + psutil.Process(pid).terminate() + except Exception: + pass + + +class Utils: + """Legacy/Helper static methods.""" + + @staticmethod + def error_tackle(): + logger.info( + "Now you can turn off this command line window safely or report this issue to developers." ) - logger.info("Unzipping the incremental update...") - Utils.unzip_file(zip_path, P.TMP_PATH) - - MirrorC_Updater.apply_update( - P.TMP_PATH, - P.TMP_PATH / "changes.json", - BAAS_ROOT_PATH, - logger + logger.info("您现在可以安全地关闭此命令行窗口或向开发人员报告此问题。") + logger.info( + "今、このコマンドラインウィンドウを安全に閉じるか、この問題を開発者に報告することができます。" ) - logger.success("Mirrorc Incremental Update Success!") + logger.info( + "이제 이 명령줄 창을 안전하게 종료하거나 이 문제를 개발자에게 보고할 수 있습니다。" + ) + if __system__ == "Windows": + os.system("pause") + sys.exit(1) - if latest_mirrorc_return.update_type == "full": - logger.info("<<< Full Update >>>") - mirrorc_install_baas() -if __name__ == "__main__": +# ==================== Main Execution Flow ==================== + +def main(): + # 1. Initialize Configuration + config = GlobalConfig() + + # 2. Welcome Message + logger.info(f"Root Path: {config.baas_root}") + + # 3. Setup Logic try: - # Check the whole installation - if not G.launch: - pre_check() - clean_up() - # Check if the installer is frozen - if not G.use_dynamic_update: - run_app() # Run the app if not frozen - else: - dynamic_update_installer() # Update the installer if frozen - except Exception as e: - logger.exception("Error occurred during setup...") - error_tackle() + if not config.General.launch: + # Environment Setup + env_mgr = EnvironmentManager(config) + env_mgr.check_python() + env_mgr.check_pip() + env_mgr.check_pth() + env_mgr.check_env_patch() + + # Repo Update + updater = UpdateOrchestrator(config, env_mgr) + updater.run() + + # Dependencies + env_mgr.install_requirements() + env_mgr.fix_shebangs() + + # 5. Launch + launcher = AppLauncher(config) + launcher.run_app() + + except Exception: + logger.exception("Critical error during setup/launch.") + Utils.error_tackle() - # Parse command-line arguments and configuration + +if __name__ == "__main__": + main() From e6e29b30b59fb710f7f7d1bef15b5d23fb50e66e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Thu, 18 Dec 2025 23:56:09 +0800 Subject: [PATCH 11/98] Fix: Add DotPrinter for progress feedback and improve temp dir usage Introduces the DotPrinter class to provide visual progress indication during git operations. Updates all usages of TemporaryDirectory to specify the parent directory for better file management. Adds calls to gc.collect() after major file operations to improve resource cleanup. --- deploy/installer/installer.py | 49 ++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/deploy/installer/installer.py b/deploy/installer/installer.py index 33b791235..0e25d017b 100644 --- a/deploy/installer/installer.py +++ b/deploy/installer/installer.py @@ -47,6 +47,7 @@ import pygit2 import requests import tomli_w +import threading from alive_progress import alive_bar from easydict import EasyDict as eDict from halo import Halo @@ -99,6 +100,28 @@ # ==================== Class Definitions ==================== +class DotPrinter: + def __init__(self, interval: float = 0.5, char: str = "."): + self.interval = interval + self.char = char + self._stop = threading.Event() + self._thread = threading.Thread( + target=self._run, + daemon=True, + ) + + def _run(self): + while not self._stop.wait(self.interval): + print(self.char, end="", flush=True) + + def start(self): + self._thread.start() + + def stop(self): + self._stop.set() + self._thread.join() + print() + class GlobalConfig: """ Manages configuration loading, saving, and global path definitions. @@ -258,8 +281,10 @@ def __init__(self, repo_path: Path, remote_url: str): self.remote_url = remote_url self.git_executable = shutil.which("git") self.git_dir = repo_path / ".git" + self.printer = DotPrinter(interval=0.5) def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: + self.printer.start() """Executes a system git command.""" if not self.git_executable: raise RuntimeError("System git not found.") @@ -281,8 +306,10 @@ def _run_git_cmd(self, args: List[str], cwd: Optional[Path] = None) -> str: check=True, env=env ) + self.printer.stop() return result.stdout.strip() except subprocess.CalledProcessError as e: + self.printer.stop() raise RuntimeError(f"Git command failed: {e.stderr}") def is_valid_repo(self) -> bool: @@ -407,7 +434,7 @@ def clone(self, branch: str = REPO_BRANCH): self.repo_path.mkdir(parents=True, exist_ok=True) # Create a temporary directory to clone the repo - with tempfile.TemporaryDirectory() as temp_dir: + with tempfile.TemporaryDirectory(dir=self.repo_path) as temp_dir: temp_repo_path = Path(temp_dir) if self.git_executable: @@ -423,6 +450,8 @@ def clone(self, branch: str = REPO_BRANCH): callbacks.spinner.stop() logger.success("Clone successful (PyGit2).") + gc.collect() + # Move the content from the temp directory to the actual target directory for item in temp_repo_path.iterdir(): # Move each item from temp directory to the actual target directory @@ -440,6 +469,7 @@ def update(self, branch: str = REPO_BRANCH): self._run_git_cmd(["reset", "--hard", f"origin/{branch}"]) self._run_git_cmd(["checkout", branch]) logger.success("Update successful (System Git).") + gc.collect() return except Exception as e: logger.error(f"System Git update failed: {e}. Falling back to PyGit2.") @@ -453,6 +483,7 @@ def update(self, branch: str = REPO_BRANCH): repo.reset(remote_master_ref.target, ResetMode.HARD) repo.checkout(f"refs/heads/{branch}") logger.success("Update successful (PyGit2).") + gc.collect() except Exception as e: raise RuntimeError(f"Update failed: {e}") @@ -485,7 +516,7 @@ def repair_repo(self): logger.warning("Repository is corrupted. Initiating repair...") # Use a temp directory for safe cloning - with tempfile.TemporaryDirectory() as tmp_dir: + with tempfile.TemporaryDirectory(dir=self.repo_path) as tmp_dir: temp_path = Path(tmp_dir) / "temp_repo" temp_path.mkdir() @@ -559,7 +590,7 @@ def check_pip(self): assert __system__ == "Windows" if not os.path.exists(self.baas_root / ".env/Scripts/pip.exe"): logger.warning("Pip is not installed, trying to install pip...") - with tempfile.TemporaryDirectory() as temp_dir: + with tempfile.TemporaryDirectory(dir=self.baas_root) as temp_dir: temp_path = Path(temp_dir) / "temp_pip" filepath = FileSystemUtils.download_file(self.cfg.URLs.GET_PIP_URL, temp_path) subprocess.run([self.baas_root / ".env/python.exe", filepath]) @@ -586,7 +617,7 @@ def check_env_patch(self): if os.path.exists(self.baas_root / ".env/Lib/site-packages/Polygon"): return logger.info("Downloading env patch...") - with tempfile.TemporaryDirectory() as temp_dir: + with tempfile.TemporaryDirectory(dir=self.baas_root) as temp_dir: temp_path = Path(temp_dir) / "temp_repo" filepath = FileSystemUtils.download_file(self.cfg.URLs.GET_ENV_PATCH_URL, temp_path) FileSystemUtils.unzip_file(filepath, self.baas_root / ".env") @@ -603,7 +634,7 @@ def check_python(self): python_path = self.baas_root / ".env/python.exe" if not python_path.exists(): logger.info("Downloading embedded Python...") - with tempfile.TemporaryDirectory() as temp_dir: + with tempfile.TemporaryDirectory(dir=self.baas_root) as temp_dir: zip_path = FileSystemUtils.download_file(self.cfg.URLs.GET_PYTHON_URL, temp_dir) FileSystemUtils.unzip_file(zip_path, self.baas_root / ".env") elif __system__ == "Linux": @@ -830,7 +861,7 @@ def _mirrorc_install_baas(self, latest_mirrorc_return): # Download the repository zip file file_length = latest_mirrorc_return.file_size / (1024 * 1024) logger.info("Downloading the repository zip, total = %.2f MB" % file_length) - with tempfile.TemporaryDirectory() as tmp_dir: + with tempfile.TemporaryDirectory(dir=self.cfg.Paths.BAAS_ROOT_PATH) as tmp_dir: zip_path = FileSystemUtils.download_file( latest_mirrorc_return.download_url, tmp_dir ) @@ -866,7 +897,7 @@ def _mirrorc_update_baas(self, latest_mirrorc_return): file_length = latest_mirrorc_return.file_size / (1024 * 1024) logger.info("Downloading the incremental zip, total = %.2f MB" % file_length) - with tempfile.TemporaryDirectory() as tmp_dir: + with tempfile.TemporaryDirectory(dir=self.cfg.Paths.BAAS_ROOT_PATH) as tmp_dir: zip_path = FileSystemUtils.download_file( latest_mirrorc_return.download_url, tmp_dir ) @@ -934,7 +965,7 @@ def run_app(self): logger.info("Checking UPX installation.") if not os.path.exists("toolkit/upx-4.2.4-win64/upx.exe"): - with tempfile.TemporaryDirectory() as tmpdir: + with tempfile.TemporaryDirectory(dir=self.baas_root) as tmpdir: temp_path = Path(tmpdir) filepath = FileSystemUtils.download_file(self.cfg.URLs.GET_UPX_URL, temp_path) FileSystemUtils.unzip_file(filepath, self.cfg.Paths.TOOL_KIT_PATH) @@ -973,7 +1004,7 @@ def create_executable(): def dynamic_update_installer(self) -> None: # Define paths for the installer and Python interpreter - installer_path = Path(self.cfg.Paths.BAAS_ROOT_PATH )/ "deploy/installer/installer.py" + installer_path = Path(self.cfg.Paths.BAAS_ROOT_PATH) / "deploy/installer/installer.py" # Use platform-independent way to determine Python executable if __system__ == "Windows": From 61c5c1d30b9cea2c52a7398618f233273e180d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Fri, 19 Dec 2025 09:14:15 +0800 Subject: [PATCH 12/98] Fix: MirrorC param pass error --- deploy/installer/installer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deploy/installer/installer.py b/deploy/installer/installer.py index 0e25d017b..eded95a20 100644 --- a/deploy/installer/installer.py +++ b/deploy/installer/installer.py @@ -343,7 +343,10 @@ def get_remote_sha(self, cfg, mirrorc): (i for i, item in enumerate(get_remote_sha_methods) \ if item.get("name") == cfg.General.get_remote_sha_method), None) if index is not None: - sha = self.get_remote_sha_once(get_remote_sha_methods[index], mirrorc) + sha = self.get_remote_sha_once(get_remote_sha_methods[index], mirrorc={ + "inst": mirrorc, + "cdk": cfg.General.mirrorc_cdk, + }) if sha is not None: return sha get_remote_sha_methods.pop(index) From 4c30b254f9026cdac23d7fe6e32439f460b34592 Mon Sep 17 00:00:00 2001 From: kiramei Date: Fri, 19 Dec 2025 11:24:16 +0800 Subject: [PATCH 13/98] Update: Optimize Docker Size Remove the useless APT packages and Delete some cached files. --- deploy/service/dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/deploy/service/dockerfile b/deploy/service/dockerfile index e1fbb5416..26c32f4e2 100644 --- a/deploy/service/dockerfile +++ b/deploy/service/dockerfile @@ -1,4 +1,4 @@ -FROM debian:trixie +FROM debian:trixie-slim WORKDIR /app @@ -6,8 +6,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ git \ curl \ libgl1 \ - python3 \ - python3-venv \ libglib2.0-0 \ ca-certificates \ && rm -rf /var/lib/apt/lists/* @@ -26,7 +24,8 @@ RUN uv venv /opt/venv --python 3.9.0 \ && uv pip compile /tmp/requirements.service.txt \ -o /tmp/requirements.service.lock \ && uv pip sync /tmp/requirements.service.lock \ - && rm -rf /tmp/* + && rm -rf /tmp/* \ + && rm -rf /root/.cache RUN update-ca-certificates From 454d34834467110dae1e12c8648f9aaeb61aa602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 15 Apr 2026 22:25:25 +0800 Subject: [PATCH 14/98] Sync: Move reqs to deploy/service --- .../service/requirements.service.linux.txt | 2 +- ...equirements.service.txt => requirements.service.windows.txt} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename requirements.service.txt => deploy/service/requirements.service.linux.txt (96%) rename deploy/service/{requirements.service.txt => requirements.service.windows.txt} (100%) diff --git a/requirements.service.txt b/deploy/service/requirements.service.linux.txt similarity index 96% rename from requirements.service.txt rename to deploy/service/requirements.service.linux.txt index 974f4e7ed..f1fc0dce4 100644 --- a/requirements.service.txt +++ b/deploy/service/requirements.service.linux.txt @@ -1,7 +1,7 @@ # =========================== # # Core Utils # numpy < 2.0 # -setuptools # +setuptools == 80.10.2 # adbutils == 2.2.1 # uiautomator2 == 2.16.23 # opencv-python == 4.8.1.78 # diff --git a/deploy/service/requirements.service.txt b/deploy/service/requirements.service.windows.txt similarity index 100% rename from deploy/service/requirements.service.txt rename to deploy/service/requirements.service.windows.txt From 323832dc0e3d82716f59e95c77fa19827458b730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Tue, 21 Apr 2026 15:17:13 +0800 Subject: [PATCH 15/98] Pre: Remote control --- deploy/service/requirements.service.linux.txt | 1 + .../service/requirements.service.windows.txt | 1 + service/app.py | 124 ++++++- service/encryption.py | 8 +- service/lib/scrcpy/__init__.py | 5 + service/lib/scrcpy/codec.py | 156 +++++++++ service/lib/scrcpy/const.py | 327 ++++++++++++++++++ service/lib/scrcpy/control.py | 259 ++++++++++++++ service/lib/scrcpy/core.py | 310 +++++++++++++++++ service/runtime.py | 110 ++++-- 10 files changed, 1254 insertions(+), 47 deletions(-) create mode 100644 service/lib/scrcpy/__init__.py create mode 100644 service/lib/scrcpy/codec.py create mode 100644 service/lib/scrcpy/const.py create mode 100644 service/lib/scrcpy/control.py create mode 100644 service/lib/scrcpy/core.py diff --git a/deploy/service/requirements.service.linux.txt b/deploy/service/requirements.service.linux.txt index f1fc0dce4..694f75dc9 100644 --- a/deploy/service/requirements.service.linux.txt +++ b/deploy/service/requirements.service.linux.txt @@ -1,6 +1,7 @@ # =========================== # # Core Utils # numpy < 2.0 # +av == 12.0.0 # setuptools == 80.10.2 # adbutils == 2.2.1 # uiautomator2 == 2.16.23 # diff --git a/deploy/service/requirements.service.windows.txt b/deploy/service/requirements.service.windows.txt index 974f4e7ed..1d31cc86c 100644 --- a/deploy/service/requirements.service.windows.txt +++ b/deploy/service/requirements.service.windows.txt @@ -1,6 +1,7 @@ # =========================== # # Core Utils # numpy < 2.0 # +av == 12.0.0 # setuptools # adbutils == 2.2.1 # uiautomator2 == 2.16.23 # diff --git a/service/app.py b/service/app.py index b88874a46..d4bebf9e3 100644 --- a/service/app.py +++ b/service/app.py @@ -1,10 +1,11 @@ from __future__ import annotations -import contextlib import asyncio +import contextlib import os import secrets import time +from contextlib import suppress from pathlib import Path from typing import Any, Dict, Union @@ -14,6 +15,7 @@ from .context import ServiceContext from .encryption import AuthenticationError, CipherBox, HandshakeResponse, HandshakeSession +from .lib.scrcpy.const import EVENT_STREAM from .messages import ( CommandMessage, ProviderRequest, @@ -109,11 +111,11 @@ async def websocket_sync(websocket: WebSocket) -> None: data = SyncPullMessage(**message) snapshot = await context.config_manager.get_snapshot(data.resource, data.resource_id) response = { - "type": "snapshot", - "resource": data.resource, + "type" : "snapshot", + "resource" : data.resource, "resource_id": data.resource_id, - "timestamp": snapshot.timestamp, - "data": snapshot.data, + "timestamp" : snapshot.timestamp, + "data" : snapshot.data, } await websocket.send_text(cipher.encrypt_json(response)) elif msg_type == "patch": @@ -122,18 +124,18 @@ async def websocket_sync(websocket: WebSocket) -> None: data.resource, data.resource_id, data.ops, data.timestamp, origin="frontend" ) response = { - "type": "patch_ack", - "resource": data.resource, + "type" : "patch_ack", + "resource" : data.resource, "resource_id": data.resource_id, - "timestamp": data.timestamp, + "timestamp" : data.timestamp, } await websocket.send_text(cipher.encrypt_json(response)) elif msg_type == "list": snapshot = await context.config_manager.get_config_list() response = { - "type": "config_list", + "type" : "config_list", "timestamp": snapshot.timestamp, - "data": snapshot.data, + "data" : snapshot.data, } await websocket.send_text(cipher.encrypt_json(response)) else: @@ -196,9 +198,9 @@ async def websocket_provider(websocket: WebSocket) -> None: await websocket.send_text( cipher.encrypt_json( { - "type": "static_snapshot", + "type" : "static_snapshot", "timestamp": snapshot.timestamp, - "data": snapshot.data, + "data" : snapshot.data, } ) ) @@ -258,8 +260,11 @@ async def websocket_trigger(websocket: WebSocket) -> None: elif cmd.command.startswith("start_"): if not cmd.config_id: raise ValueError(f"config_id is required for command '{cmd.command}'") - result = await context.runtime.solve_task(cmd.config_id, cmd.command, - set_log=context.ensure_runtime_logger_attached) + result = await context.runtime.solve_task( + config_id=cmd.config_id, + task_name=cmd.command, + set_log=context.ensure_runtime_logger_attached + ) response_payload = {"status": "ok", "data": result} elif cmd.command.startswith("add_config"): name = cmd.payload.get("name") @@ -292,6 +297,15 @@ async def websocket_trigger(websocket: WebSocket) -> None: elif cmd.command == "update_to_latest": result = await context.runtime.update_to_latest() response_payload = {"status": "ok", "data": result} + elif cmd.command == "control_device": + if not cmd.config_id: + raise ValueError(f"config_id is required for command '{cmd.command}'") + if not cmd.payload.get("operation"): + raise ValueError(f"operation is required for command '{cmd.command}'") + config_id = cmd.config_id + operation = cmd.payload.get("operation") + result = await context.runtime.control_device_(config_id, operation) + response_payload = {"status": "ok", "data": result} elif cmd.command == "status": response_payload = {"status": "ok", "data": context.runtime.current_status()} else: @@ -301,8 +315,8 @@ async def websocket_trigger(websocket: WebSocket) -> None: await websocket.send_text( cipher.encrypt_json( { - "type": "command_response", - "command": cmd.command, + "type" : "command_response", + "command" : cmd.command, **response_payload, "timestamp": cmd.timestamp, } @@ -320,7 +334,7 @@ async def _heartbeat_sender(websocket: WebSocket, cipher: CipherBox, interval: f try: while True: payload = { - "type": "heartbeat", + "type" : "heartbeat", "timestamp": time.time() } await websocket.send_text(cipher.encrypt_json(payload)) @@ -367,4 +381,80 @@ async def websocket_heartbeat(websocket: WebSocket) -> None: with contextlib.suppress(asyncio.CancelledError): await task + +@app.websocket("/ws/remote") +async def websocket_remote(websocket: WebSocket) -> None: + listener = client = None + sender_task = None + + try: + _, cipher = await _perform_handshake(websocket) + encrypted = await websocket.receive_text() + message = cipher.decrypt_json(encrypted) + config_id = message.get("config_id") + client = await context.runtime.require_remote_(config_id) + + loop = asyncio.get_running_loop() + send_queue: asyncio.Queue[str | None] = asyncio.Queue(maxsize=8) + + async def sender() -> None: + try: + while True: + item = await send_queue.get() + if item is None: + break + await websocket.send_text(item) + except WebSocketDisconnect: + pass + except Exception: + import traceback + traceback.print_exc() + + sender_task = asyncio.create_task(sender()) + + def listener(encoded_stream: bytes) -> None: + try: + payload = cipher.encrypt_bytes(encoded_stream) + + def _push() -> None: + if send_queue.full(): + # 丢掉最旧帧,避免慢客户端把队列撑爆 + with suppress(asyncio.QueueEmpty): + send_queue.get_nowait() + with suppress(asyncio.QueueFull): + send_queue.put_nowait(payload) + + loop.call_soon_threadsafe(_push) # type:ignore + + except Exception: + import traceback + traceback.print_exc() + + client.add_listener(EVENT_STREAM, listener) + + if not client.alive: + await client.init() + + await client.start(daemon_threaded=True) + + while client.alive and client.has_listener(EVENT_STREAM, listener=listener): + await asyncio.sleep(1.0) + + except Exception: + import traceback + traceback.print_exc() + + finally: + if sender_task is not None: + with suppress(Exception): + await send_queue.put(None) # type:ignore + with suppress(Exception): + await sender_task + + if client is not None: + client.remove_listener(EVENT_STREAM, listener) # type: ignore + if not client.any_listener(EVENT_STREAM): # type: ignore + client.stop() # type: ignore + + app.mount("/", StaticFiles(directory="service/dist", html=True), name="static") diff --git a/service/encryption.py b/service/encryption.py index 91d4b261c..b8100a5db 100644 --- a/service/encryption.py +++ b/service/encryption.py @@ -64,8 +64,12 @@ def encrypt_json(self, payload: dict[str, Any]) -> str: def decrypt_json(self, token: str) -> dict[str, Any]: try: data = self._fernet.decrypt(token.encode("utf-8")) - except InvalidToken as exc: - print("INVALID") raise AuthenticationError("Encrypted payload could not be authenticated") from exc return json.loads(data.decode("utf-8")) + + def encrypt_bytes(self, data: bytes) -> str: + """ + Encrypt raw bytes -> bytes (Fernet token, already base64-encoded internally). + """ + return self._fernet.encrypt(data).decode("utf-8") diff --git a/service/lib/scrcpy/__init__.py b/service/lib/scrcpy/__init__.py new file mode 100644 index 000000000..dc5685ba2 --- /dev/null +++ b/service/lib/scrcpy/__init__.py @@ -0,0 +1,5 @@ +""" +This module is modified from leng-yue/py-scrcpy-client. +Reference URL: https://github.com/leng-yue/py-scrcpy-client +""" +from .core import ScrcpyClient diff --git a/service/lib/scrcpy/codec.py b/service/lib/scrcpy/codec.py new file mode 100644 index 000000000..19bf721a9 --- /dev/null +++ b/service/lib/scrcpy/codec.py @@ -0,0 +1,156 @@ +import json +import struct +from typing import List, Optional, Iterator + +START_CODE_3 = b"\x00\x00\x01" +START_CODE_4 = b"\x00\x00\x00\x01" + + +def find_nal_units_annexb(data: bytes) -> List[bytes]: + """ + 从 Annex-B 字节流中提取 NAL(保留 start code)。 + 注意:这是对单个 buffer 的切分,不处理跨 buffer 的半截 NAL。 + """ + positions = [] + i = 0 + n = len(data) + while i < n - 3: + if data[i:i + 4] == START_CODE_4: + positions.append(i) + i += 4 + elif data[i:i + 3] == START_CODE_3: + positions.append(i) + i += 3 + else: + i += 1 + + if not positions: + return [] + + nals = [] + for idx, start in enumerate(positions): + end = positions[idx + 1] if idx + 1 < len(positions) else len(data) + nals.append(data[start:end]) + return nals + + +def strip_start_code(nal: bytes) -> bytes: + if nal.startswith(START_CODE_4): + return nal[4:] + if nal.startswith(START_CODE_3): + return nal[3:] + return nal + + +def nal_type(nal: bytes) -> int: + body = strip_start_code(nal) + if not body: + return -1 + return body[0] & 0x1F + + +def is_vcl_nal(t: int) -> bool: + return t in (1, 5) # non-IDR / IDR + + +def is_parameter_set(t: int) -> bool: + return t in (7, 8) # SPS / PPS + + +def contains_idr(frame_annexb: bytes) -> bool: + for nal in find_nal_units_annexb(frame_annexb): + if nal_type(nal) == 5: + return True + return False + + +class H264AnnexBFramer: + """ + 把 H264 Annex-B 连续流切成较适合前端解码的 access unit。 + 这是工程上可用的简化版,不是完整 H264 语法解析器。 + """ + + def __init__(self, max_fps: int): + self.buffer = bytearray() + self.pending_nals: List[bytes] = [] + self.last_sps: Optional[bytes] = None + self.last_pps: Optional[bytes] = None + self.frame_interval_us = int(1_000_000 / max(max_fps, 1)) + self._pts_us = 0 + + def construct_return_val(self, frame_annexb: bytes) -> bytes: + is_key = 1 if contains_idr(frame_annexb) else 0 + header = struct.pack( + ">QB", + self._pts_us, + is_key + ) + self._pts_us += self.frame_interval_us + return header + frame_annexb + + def decode(self, chunk: bytes) -> Iterator[bytes]: + self.buffer.extend(chunk) + units = self._extract_complete_nals() + + for nal in units: + t = nal_type(nal) + if t == 7: + self.last_sps = nal + elif t == 8: + self.last_pps = nal + + if is_vcl_nal(t): + if self.pending_nals: + to_send = b"".join(self.pending_nals) + yield self.construct_return_val(to_send) + self.pending_nals = [] + + # IDR 前把最新 SPS/PPS 带上,方便前端重建解码器或恢复 + if t == 5: + if self.last_sps: + self.pending_nals.append(self.last_sps) + if self.last_pps: + self.pending_nals.append(self.last_pps) + + self.pending_nals.append(nal) + else: + # SEI / SPS / PPS / AUD 等跟到当前帧里 + self.pending_nals.append(nal) + + def flush(self) -> Optional[bytes]: + if self.pending_nals: + frame = b"".join(self.pending_nals) + self.pending_nals = [] + return frame + return None + + def _extract_complete_nals(self) -> List[bytes]: + """ + 从 buffer 中提取“完整 NAL”。 + 保留最后一个可能不完整的尾巴,等待下一批 chunk。 + """ + data = bytes(self.buffer) + positions = [] + i = 0 + n = len(data) + while i < n - 3: + if data[i:i + 4] == START_CODE_4: + positions.append(i) + i += 4 + elif data[i:i + 3] == START_CODE_3: + positions.append(i) + i += 3 + else: + i += 1 + + if len(positions) < 2: + return [] + + units = [] + for idx in range(len(positions) - 1): + start = positions[idx] + end = positions[idx + 1] + units.append(data[start:end]) + + self.buffer = bytearray(data[positions[-1]:]) + return units diff --git a/service/lib/scrcpy/const.py b/service/lib/scrcpy/const.py new file mode 100644 index 000000000..4e1c32336 --- /dev/null +++ b/service/lib/scrcpy/const.py @@ -0,0 +1,327 @@ +""" +This module includes all consts used in this project +""" + +# Action +ACTION_DOWN = 0 +ACTION_UP = 1 +ACTION_MOVE = 2 + +# KeyCode +KEYCODE_UNKNOWN = 0 +KEYCODE_SOFT_LEFT = 1 +KEYCODE_SOFT_RIGHT = 2 +KEYCODE_HOME = 3 +KEYCODE_BACK = 4 +KEYCODE_CALL = 5 +KEYCODE_ENDCALL = 6 +KEYCODE_0 = 7 +KEYCODE_1 = 8 +KEYCODE_2 = 9 +KEYCODE_3 = 10 +KEYCODE_4 = 11 +KEYCODE_5 = 12 +KEYCODE_6 = 13 +KEYCODE_7 = 14 +KEYCODE_8 = 15 +KEYCODE_9 = 16 +KEYCODE_STAR = 17 +KEYCODE_POUND = 18 +KEYCODE_DPAD_UP = 19 +KEYCODE_DPAD_DOWN = 20 +KEYCODE_DPAD_LEFT = 21 +KEYCODE_DPAD_RIGHT = 22 +KEYCODE_DPAD_CENTER = 23 +KEYCODE_VOLUME_UP = 24 +KEYCODE_VOLUME_DOWN = 25 +KEYCODE_POWER = 26 +KEYCODE_CAMERA = 27 +KEYCODE_CLEAR = 28 +KEYCODE_A = 29 +KEYCODE_B = 30 +KEYCODE_C = 31 +KEYCODE_D = 32 +KEYCODE_E = 33 +KEYCODE_F = 34 +KEYCODE_G = 35 +KEYCODE_H = 36 +KEYCODE_I = 37 +KEYCODE_J = 38 +KEYCODE_K = 39 +KEYCODE_L = 40 +KEYCODE_M = 41 +KEYCODE_N = 42 +KEYCODE_O = 43 +KEYCODE_P = 44 +KEYCODE_Q = 45 +KEYCODE_R = 46 +KEYCODE_S = 47 +KEYCODE_T = 48 +KEYCODE_U = 49 +KEYCODE_V = 50 +KEYCODE_W = 51 +KEYCODE_X = 52 +KEYCODE_Y = 53 +KEYCODE_Z = 54 +KEYCODE_COMMA = 55 +KEYCODE_PERIOD = 56 +KEYCODE_ALT_LEFT = 57 +KEYCODE_ALT_RIGHT = 58 +KEYCODE_SHIFT_LEFT = 59 +KEYCODE_SHIFT_RIGHT = 60 +KEYCODE_TAB = 61 +KEYCODE_SPACE = 62 +KEYCODE_SYM = 63 +KEYCODE_EXPLORER = 64 +KEYCODE_ENVELOPE = 65 +KEYCODE_ENTER = 66 +KEYCODE_DEL = 67 +KEYCODE_GRAVE = 68 +KEYCODE_MINUS = 69 +KEYCODE_EQUALS = 70 +KEYCODE_LEFT_BRACKET = 71 +KEYCODE_RIGHT_BRACKET = 72 +KEYCODE_BACKSLASH = 73 +KEYCODE_SEMICOLON = 74 +KEYCODE_APOSTROPHE = 75 +KEYCODE_SLASH = 76 +KEYCODE_AT = 77 +KEYCODE_NUM = 78 +KEYCODE_HEADSETHOOK = 79 +KEYCODE_PLUS = 81 +KEYCODE_MENU = 82 +KEYCODE_NOTIFICATION = 83 +KEYCODE_SEARCH = 84 +KEYCODE_MEDIA_PLAY_PAUSE = 85 +KEYCODE_MEDIA_STOP = 86 +KEYCODE_MEDIA_NEXT = 87 +KEYCODE_MEDIA_PREVIOUS = 88 +KEYCODE_MEDIA_REWIND = 89 +KEYCODE_MEDIA_FAST_FORWARD = 90 +KEYCODE_MUTE = 91 +KEYCODE_PAGE_UP = 92 +KEYCODE_PAGE_DOWN = 93 +KEYCODE_BUTTON_A = 96 +KEYCODE_BUTTON_B = 97 +KEYCODE_BUTTON_C = 98 +KEYCODE_BUTTON_X = 99 +KEYCODE_BUTTON_Y = 100 +KEYCODE_BUTTON_Z = 101 +KEYCODE_BUTTON_L1 = 102 +KEYCODE_BUTTON_R1 = 103 +KEYCODE_BUTTON_L2 = 104 +KEYCODE_BUTTON_R2 = 105 +KEYCODE_BUTTON_THUMBL = 106 +KEYCODE_BUTTON_THUMBR = 107 +KEYCODE_BUTTON_START = 108 +KEYCODE_BUTTON_SELECT = 109 +KEYCODE_BUTTON_MODE = 110 +KEYCODE_ESCAPE = 111 +KEYCODE_FORWARD_DEL = 112 +KEYCODE_CTRL_LEFT = 113 +KEYCODE_CTRL_RIGHT = 114 +KEYCODE_CAPS_LOCK = 115 +KEYCODE_SCROLL_LOCK = 116 +KEYCODE_META_LEFT = 117 +KEYCODE_META_RIGHT = 118 +KEYCODE_FUNCTION = 119 +KEYCODE_SYSRQ = 120 +KEYCODE_BREAK = 121 +KEYCODE_MOVE_HOME = 122 +KEYCODE_MOVE_END = 123 +KEYCODE_INSERT = 124 +KEYCODE_FORWARD = 125 +KEYCODE_MEDIA_PLAY = 126 +KEYCODE_MEDIA_PAUSE = 127 +KEYCODE_MEDIA_CLOSE = 128 +KEYCODE_MEDIA_EJECT = 129 +KEYCODE_MEDIA_RECORD = 130 +KEYCODE_F1 = 131 +KEYCODE_F2 = 132 +KEYCODE_F3 = 133 +KEYCODE_F4 = 134 +KEYCODE_F5 = 135 +KEYCODE_F6 = 136 +KEYCODE_F7 = 137 +KEYCODE_F8 = 138 +KEYCODE_F9 = 139 +KEYCODE_F10 = 140 +KEYCODE_F11 = 141 +KEYCODE_F12 = 142 +KEYCODE_NUM_LOCK = 143 +KEYCODE_NUMPAD_0 = 144 +KEYCODE_NUMPAD_1 = 145 +KEYCODE_NUMPAD_2 = 146 +KEYCODE_NUMPAD_3 = 147 +KEYCODE_NUMPAD_4 = 148 +KEYCODE_NUMPAD_5 = 149 +KEYCODE_NUMPAD_6 = 150 +KEYCODE_NUMPAD_7 = 151 +KEYCODE_NUMPAD_8 = 152 +KEYCODE_NUMPAD_9 = 153 +KEYCODE_NUMPAD_DIVIDE = 154 +KEYCODE_NUMPAD_MULTIPLY = 155 +KEYCODE_NUMPAD_SUBTRACT = 156 +KEYCODE_NUMPAD_ADD = 157 +KEYCODE_NUMPAD_DOT = 158 +KEYCODE_NUMPAD_COMMA = 159 +KEYCODE_NUMPAD_ENTER = 160 +KEYCODE_NUMPAD_EQUALS = 161 +KEYCODE_NUMPAD_LEFT_PAREN = 162 +KEYCODE_NUMPAD_RIGHT_PAREN = 163 +KEYCODE_VOLUME_MUTE = 164 +KEYCODE_INFO = 165 +KEYCODE_CHANNEL_UP = 166 +KEYCODE_CHANNEL_DOWN = 167 +KEYCODE_ZOOM_IN = 168 +KEYCODE_ZOOM_OUT = 169 +KEYCODE_TV = 170 +KEYCODE_WINDOW = 171 +KEYCODE_GUIDE = 172 +KEYCODE_DVR = 173 +KEYCODE_BOOKMARK = 174 +KEYCODE_CAPTIONS = 175 +KEYCODE_SETTINGS = 176 +KEYCODE_TV_POWER = 177 +KEYCODE_TV_INPUT = 178 +KEYCODE_STB_POWER = 179 +KEYCODE_STB_INPUT = 180 +KEYCODE_AVR_POWER = 181 +KEYCODE_AVR_INPUT = 182 +KEYCODE_PROG_RED = 183 +KEYCODE_PROG_GREEN = 184 +KEYCODE_PROG_YELLOW = 185 +KEYCODE_PROG_BLUE = 186 +KEYCODE_APP_SWITCH = 187 +KEYCODE_BUTTON_1 = 188 +KEYCODE_BUTTON_2 = 189 +KEYCODE_BUTTON_3 = 190 +KEYCODE_BUTTON_4 = 191 +KEYCODE_BUTTON_5 = 192 +KEYCODE_BUTTON_6 = 193 +KEYCODE_BUTTON_7 = 194 +KEYCODE_BUTTON_8 = 195 +KEYCODE_BUTTON_9 = 196 +KEYCODE_BUTTON_10 = 197 +KEYCODE_BUTTON_11 = 198 +KEYCODE_BUTTON_12 = 199 +KEYCODE_BUTTON_13 = 200 +KEYCODE_BUTTON_14 = 201 +KEYCODE_BUTTON_15 = 202 +KEYCODE_BUTTON_16 = 203 +KEYCODE_LANGUAGE_SWITCH = 204 +KEYCODE_MANNER_MODE = 205 +KEYCODE_3D_MODE = 206 +KEYCODE_CONTACTS = 207 +KEYCODE_CALENDAR = 208 +KEYCODE_MUSIC = 209 +KEYCODE_CALCULATOR = 210 +KEYCODE_ZENKAKU_HANKAKU = 211 +KEYCODE_EISU = 212 +KEYCODE_MUHENKAN = 213 +KEYCODE_HENKAN = 214 +KEYCODE_KATAKANA_HIRAGANA = 215 +KEYCODE_YEN = 216 +KEYCODE_RO = 217 +KEYCODE_KANA = 218 +KEYCODE_ASSIST = 219 +KEYCODE_BRIGHTNESS_DOWN = 220 +KEYCODE_BRIGHTNESS_UP = 221 +KEYCODE_MEDIA_AUDIO_TRACK = 222 +KEYCODE_SLEEP = 223 +KEYCODE_WAKEUP = 224 +KEYCODE_PAIRING = 225 +KEYCODE_MEDIA_TOP_MENU = 226 +KEYCODE_11 = 227 +KEYCODE_12 = 228 +KEYCODE_LAST_CHANNEL = 229 +KEYCODE_TV_DATA_SERVICE = 230 +KEYCODE_VOICE_ASSIST = 231 +KEYCODE_TV_RADIO_SERVICE = 232 +KEYCODE_TV_TELETEXT = 233 +KEYCODE_TV_NUMBER_ENTRY = 234 +KEYCODE_TV_TERRESTRIAL_ANALOG = 235 +KEYCODE_TV_TERRESTRIAL_DIGITAL = 236 +KEYCODE_TV_SATELLITE = 237 +KEYCODE_TV_SATELLITE_BS = 238 +KEYCODE_TV_SATELLITE_CS = 239 +KEYCODE_TV_SATELLITE_SERVICE = 240 +KEYCODE_TV_NETWORK = 241 +KEYCODE_TV_ANTENNA_CABLE = 242 +KEYCODE_TV_INPUT_HDMI_1 = 243 +KEYCODE_TV_INPUT_HDMI_2 = 244 +KEYCODE_TV_INPUT_HDMI_3 = 245 +KEYCODE_TV_INPUT_HDMI_4 = 246 +KEYCODE_TV_INPUT_COMPOSITE_1 = 247 +KEYCODE_TV_INPUT_COMPOSITE_2 = 248 +KEYCODE_TV_INPUT_COMPONENT_1 = 249 +KEYCODE_TV_INPUT_COMPONENT_2 = 250 +KEYCODE_TV_INPUT_VGA_1 = 251 +KEYCODE_TV_AUDIO_DESCRIPTION = 252 +KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP = 253 +KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN = 254 +KEYCODE_TV_ZOOM_MODE = 255 +KEYCODE_TV_CONTENTS_MENU = 256 +KEYCODE_TV_MEDIA_CONTEXT_MENU = 257 +KEYCODE_TV_TIMER_PROGRAMMING = 258 +KEYCODE_HELP = 259 +KEYCODE_NAVIGATE_PREVIOUS = 260 +KEYCODE_NAVIGATE_NEXT = 261 +KEYCODE_NAVIGATE_IN = 262 +KEYCODE_NAVIGATE_OUT = 263 +KEYCODE_STEM_PRIMARY = 264 +KEYCODE_STEM_1 = 265 +KEYCODE_STEM_2 = 266 +KEYCODE_STEM_3 = 267 +KEYCODE_DPAD_UP_LEFT = 268 +KEYCODE_DPAD_DOWN_LEFT = 269 +KEYCODE_DPAD_UP_RIGHT = 270 +KEYCODE_DPAD_DOWN_RIGHT = 271 +KEYCODE_MEDIA_SKIP_FORWARD = 272 +KEYCODE_MEDIA_SKIP_BACKWARD = 273 +KEYCODE_MEDIA_STEP_FORWARD = 274 +KEYCODE_MEDIA_STEP_BACKWARD = 275 +KEYCODE_SOFT_SLEEP = 276 +KEYCODE_CUT = 277 +KEYCODE_COPY = 278 +KEYCODE_PASTE = 279 +KEYCODE_SYSTEM_NAVIGATION_UP = 280 +KEYCODE_SYSTEM_NAVIGATION_DOWN = 281 +KEYCODE_SYSTEM_NAVIGATION_LEFT = 282 +KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283 +KEYCODE_KEYCODE_ALL_APPS = 284 +KEYCODE_KEYCODE_REFRESH = 285 +KEYCODE_KEYCODE_THUMBS_UP = 286 +KEYCODE_KEYCODE_THUMBS_DOWN = 287 + +# Event +EVENT_INIT = "init" +EVENT_FRAME = "frame" +EVENT_STREAM = "stream" +EVENT_DISCONNECT = "disconnect" + +# Type +TYPE_INJECT_KEYCODE = 0 +TYPE_INJECT_TEXT = 1 +TYPE_INJECT_TOUCH_EVENT = 2 +TYPE_INJECT_SCROLL_EVENT = 3 +TYPE_BACK_OR_SCREEN_ON = 4 +TYPE_EXPAND_NOTIFICATION_PANEL = 5 +TYPE_EXPAND_SETTINGS_PANEL = 6 +TYPE_COLLAPSE_PANELS = 7 +TYPE_GET_CLIPBOARD = 8 +TYPE_SET_CLIPBOARD = 9 +TYPE_SET_SCREEN_POWER_MODE = 10 +TYPE_ROTATE_DEVICE = 11 + +# Lock screen orientation +LOCK_SCREEN_ORIENTATION_UNLOCKED = -1 +LOCK_SCREEN_ORIENTATION_INITIAL = -2 +LOCK_SCREEN_ORIENTATION_0 = 0 +LOCK_SCREEN_ORIENTATION_1 = 1 +LOCK_SCREEN_ORIENTATION_2 = 2 +LOCK_SCREEN_ORIENTATION_3 = 3 + +# Screen power mode +POWER_MODE_OFF = 0 +POWER_MODE_NORMAL = 2 diff --git a/service/lib/scrcpy/control.py b/service/lib/scrcpy/control.py new file mode 100644 index 000000000..bc8c73ea3 --- /dev/null +++ b/service/lib/scrcpy/control.py @@ -0,0 +1,259 @@ +import functools +import socket +import struct +from time import sleep + +from .const import * + + +def inject(control_type: int): + """ + Inject control code, with this inject, we will be able to do unit test + + Args: + control_type: event to send, TYPE_* + """ + + def wrapper(f): + @functools.wraps(f) + def inner(*args, **kwargs): + package = struct.pack(">B", control_type) + f(*args, **kwargs) + if args[0].parent.control_socket is not None: + with args[0].parent.control_socket_lock: + args[0].parent.control_socket.send(package) + return package + + return inner + + return wrapper + + +class ControlSender: + def __init__(self, parent): + self.parent = parent + + @inject(TYPE_INJECT_KEYCODE) + def keycode( + self, keycode: int, action: int = ACTION_DOWN, repeat: int = 0 + ) -> bytes: + """ + Send keycode to device + + Args: + keycode: KEYCODE_* + action: ACTION_DOWN | ACTION_UP + repeat: repeat count + """ + return struct.pack(">Biii", action, keycode, repeat, 0) + + @inject(TYPE_INJECT_TEXT) + def text(self, text: str) -> bytes: + """ + Send text to device + + Args: + text: text to send + """ + + buffer = text.encode("utf-8") + return struct.pack(">i", len(buffer)) + buffer + + @inject(TYPE_INJECT_TOUCH_EVENT) + def touch( + self, + x: int, + y: int, + action: int = ACTION_DOWN, + touch_id: int = 0x1234567887654321, + ) -> bytes: + """ + Touch screen + + Args: + x: horizontal position + y: vertical position + action: ACTION_DOWN | ACTION_UP | ACTION_MOVE + touch_id: Default using virtual id -1, you can specify it to emulate multi finger touch + """ + x, y = max(x, 0), max(y, 0) + return struct.pack( + ">BqiiHHHii", + action, + touch_id, + int(x), + int(y), + int(self.parent.resolution[0]), + int(self.parent.resolution[1]), + 0xFFFF, + 1, + 1, + ) + + @inject(TYPE_INJECT_SCROLL_EVENT) + def scroll(self, x: int, y: int, h: int, v: int) -> bytes: + """ + Scroll screen + + Args: + x: horizontal position + y: vertical position + h: horizontal movement + v: vertical movement + """ + + x, y = max(x, 0), max(y, 0) + return struct.pack( + ">iiHHii", + int(x), + int(y), + int(self.parent.resolution[0]), + int(self.parent.resolution[1]), + int(h), + int(v), + ) + + @inject(TYPE_BACK_OR_SCREEN_ON) + def back_or_turn_screen_on(self, action: int = ACTION_DOWN) -> bytes: + """ + If the screen is off, it is turned on only on ACTION_DOWN + + Args: + action: ACTION_DOWN | ACTION_UP + """ + return struct.pack(">B", action) + + @inject(TYPE_EXPAND_NOTIFICATION_PANEL) + def expand_notification_panel(self) -> bytes: + """ + Expand notification panel + """ + return b"" + + @inject(TYPE_EXPAND_SETTINGS_PANEL) + def expand_settings_panel(self) -> bytes: + """ + Expand settings panel + """ + return b"" + + @inject(TYPE_COLLAPSE_PANELS) + def collapse_panels(self) -> bytes: + """ + Collapse all panels + """ + return b"" + + def get_clipboard(self) -> str: + """ + Get clipboard + """ + # Since this function need socket response, we can't auto inject it any more + s: socket.socket = self.parent.control_socket + + with self.parent.control_socket_lock: + # Flush socket + s.setblocking(False) + while True: + try: + s.recv(1024) + except BlockingIOError: + break + s.setblocking(True) + + # Read package + package = struct.pack(">B", TYPE_GET_CLIPBOARD) + s.send(package) + (code,) = struct.unpack(">B", s.recv(1)) + assert code == 0 + (length,) = struct.unpack(">i", s.recv(4)) + + return s.recv(length).decode("utf-8") + + @inject(TYPE_SET_CLIPBOARD) + def set_clipboard(self, text: str, paste: bool = False) -> bytes: + """ + Set clipboard + + Args: + text: the string you want to set + paste: paste now + """ + buffer = text.encode("utf-8") + return struct.pack(">?i", paste, len(buffer)) + buffer + + @inject(TYPE_SET_SCREEN_POWER_MODE) + def set_screen_power_mode(self, mode: int = POWER_MODE_NORMAL) -> bytes: + """ + Set screen power mode + + Args: + mode: POWER_MODE_OFF | POWER_MODE_NORMAL + """ + return struct.pack(">b", mode) + + @inject(TYPE_ROTATE_DEVICE) + def rotate_device(self) -> bytes: + """ + Rotate device + """ + return b"" + + def swipe( + self, + start_x: int, + start_y: int, + end_x: int, + end_y: int, + move_step_length: int = 5, + move_steps_delay: float = 0.005, + ) -> None: + """ + Swipe on screen + + Args: + start_x: start horizontal position + start_y: start vertical position + end_x: start horizontal position + end_y: end vertical position + move_step_length: length per step + move_steps_delay: sleep seconds after each step + :return: + """ + + self.touch(start_x, start_y, ACTION_DOWN) + next_x = start_x + next_y = start_y + + if end_x > self.parent.resolution[0]: + end_x = self.parent.resolution[0] + + if end_y > self.parent.resolution[1]: + end_y = self.parent.resolution[1] + + decrease_x = True if start_x > end_x else False + decrease_y = True if start_y > end_y else False + while True: + if decrease_x: + next_x -= move_step_length + if next_x < end_x: + next_x = end_x + else: + next_x += move_step_length + if next_x > end_x: + next_x = end_x + + if decrease_y: + next_y -= move_step_length + if next_y < end_y: + next_y = end_y + else: + next_y += move_step_length + if next_y > end_y: + next_y = end_y + + self.touch(next_x, next_y, ACTION_MOVE) + + if next_x == end_x and next_y == end_y: + self.touch(next_x, next_y, ACTION_UP) + break + sleep(move_steps_delay) diff --git a/service/lib/scrcpy/core.py b/service/lib/scrcpy/core.py new file mode 100644 index 000000000..0debe1389 --- /dev/null +++ b/service/lib/scrcpy/core.py @@ -0,0 +1,310 @@ +import asyncio +import inspect +import socket +import struct +import threading +from pathlib import Path +from time import sleep +from typing import Any, Callable, Optional, Tuple + +import numpy as np +from adbutils import AdbConnection, AdbDevice, AdbError, Network + +from .codec import H264AnnexBFramer +from .const import ( + EVENT_DISCONNECT, + EVENT_STREAM, + EVENT_INIT, + LOCK_SCREEN_ORIENTATION_UNLOCKED, +) +from .control import ControlSender + + +class ScrcpyClient: + device: AdbDevice + + def __init__( + self, + device: AdbDevice, + max_width: int = 0, + bitrate: int = 8000000, + max_fps: int = 0, + flip: bool = False, + block_frame: bool = False, + stay_awake: bool = False, + lock_screen_orientation: int = LOCK_SCREEN_ORIENTATION_UNLOCKED, + connection_timeout: int = 3000, + encoder_name: Optional[str] = None, + codec_name: Optional[str] = None, + ): + """ + Create a scrcpy client, this client won't be started until you call the start function + + Args: + device: Android device, required. + max_width: frame width that will be broadcast from android server + bitrate: bitrate + max_fps: maximum fps, 0 means not limited (supported after android 10) + flip: flip the video + block_frame: only return nonempty frames + stay_awake: keep Android device awake + lock_screen_orientation: lock screen orientation, LOCK_SCREEN_ORIENTATION_* + connection_timeout: timeout for connection, unit is ms + encoder_name: encoder name, enum: [OMX.google.h264.encoder, OMX.qcom.video.encoder.avc, c2.qti.avc.encoder, c2.android.avc.encoder], default is None (Auto) + codec_name: codec name, enum: [h264, h265, av1], default is None (Auto) + """ + # Check Params + assert max_width >= 0, "max_width must be greater than or equal to 0" + assert bitrate >= 0, "bitrate must be greater than or equal to 0" + assert max_fps >= 0, "max_fps must be greater than or equal to 0" + assert ( + -1 <= lock_screen_orientation <= 3 + ), "lock_screen_orientation must be LOCK_SCREEN_ORIENTATION_*" + assert ( + connection_timeout >= 0 + ), "connection_timeout must be greater than or equal to 0" + assert encoder_name in [ + None, + "OMX.google.h264.encoder", + "OMX.qcom.video.encoder.avc", + "c2.qti.avc.encoder", + "c2.android.avc.encoder", + ] + assert codec_name in [None, "h264", "h265", "av1"] + + # Params + self.flip = flip + self.device = device + self.max_width = max_width + self.bitrate = bitrate + self.max_fps = max_fps + self.block_frame = block_frame + self.stay_awake = stay_awake + self.lock_screen_orientation = lock_screen_orientation + self.connection_timeout = connection_timeout + self.encoder_name = encoder_name + self.codec_name = codec_name + + self.framer = H264AnnexBFramer(max_fps if max_fps > 0 else 30) + self.listeners = dict(frame=[], init=[], disconnect=[], stream=[]) + + # User accessible + self.last_frame: Optional[np.ndarray] = None + self.resolution: Optional[Tuple[int, int]] = None + self.device_name: Optional[str] = None + self.control = ControlSender(self) + + # Need to destroy + self.alive = False + self.__server_stream: Optional[AdbConnection] = None + self.__video_socket: Optional[socket.socket] = None + self.control_socket: Optional[socket.socket] = None + self.control_socket_lock = threading.Lock() + + self.stream_loop_thread = None + + def __init_server_connection(self) -> None: + """ + Connect to android server, there will be two sockets, video and control socket. + This method will set: video_socket, control_socket, resolution variables + """ + for _ in range(self.connection_timeout // 100): + try: + self.__video_socket = self.device.create_connection( + Network.LOCAL_ABSTRACT, "scrcpy" + ) + break + except AdbError: + sleep(0.1) + pass + else: + raise ConnectionError("Failed to connect scrcpy-server after 3 seconds") + + if self.__video_socket is None: + raise ConnectionError("Unexpected Null Video Socket!") + + dummy_byte = self.__video_socket.recv(1) + if not len(dummy_byte) or dummy_byte != b"\x00": + raise ConnectionError("Did not receive Dummy Byte!") + + self.control_socket = self.device.create_connection( + Network.LOCAL_ABSTRACT, "scrcpy" + ) + self.device_name = self.__video_socket.recv(64).decode("utf-8").rstrip("\x00") + if self.device_name == "": + raise ConnectionError("Did not receive Device Name!") + + res = self.__video_socket.recv(4) + self.resolution = struct.unpack(">HH", res) + self.__video_socket.setblocking(False) + + def __deploy_server(self) -> None: + """ + Deploy server to android device + """ + jar_name = "scrcpy-server.jar" + root_path = Path(__file__).parent.parent.parent.parent + server_file_path = root_path / "src" / "scrcpy_bin" / jar_name + self.device.sync.push(server_file_path, f"/data/local/tmp/{jar_name}") + commands = [ + f"CLASSPATH=/data/local/tmp/{jar_name}", + "app_process", + "/", + "com.genymobile.scrcpy.Server", + "2.4", # Scrcpy server version + "log_level=info", + f"max_size={self.max_width}", + f"max_fps={self.max_fps}", + f"video_bit_rate={self.bitrate}", + f"video_encoder={self.encoder_name}" + if self.encoder_name + else "video_encoder=OMX.google.h264.encoder", + f"video_codec={self.codec_name}" if self.codec_name else "video_codec=h264", + "tunnel_forward=true", + "send_frame_meta=false", + "control=true", + "audio=false", + "show_touches=false", + "stay_awake=false", + "power_off_on_close=false", + "clipboard_autosync=false", + ] + + self.device = self.device + + fetched_response = self.device.shell( + commands, + stream=True, + ) + + assert isinstance(fetched_response, AdbConnection), \ + "Unexpected Type: {}".format(type(fetched_response)) + + self.__server_stream: AdbConnection = fetched_response + + assert self.__server_stream is not None, \ + "Did not receive Server Stream!" + + # Wait for server to start + self.__server_stream.read(10) + + async def start(self, daemon_threaded: bool = False) -> None: + """ + Start listening video stream + + Args: + daemon_threaded: Run stream loop in a daemon thread to avoid blocking + """ + if self.stream_loop_thread: return + self.stream_loop_thread = threading.Thread( + target=asyncio.run, args=(self.__stream_loop(),), daemon=daemon_threaded + ) + self.stream_loop_thread.start() + + async def init(self): + assert self.alive is False + self.__deploy_server() + self.__init_server_connection() + self.alive = True + await self.__send_to_listeners(EVENT_INIT) + return self + + # noinspection PyBroadException + def stop(self) -> None: + """ + Stop listening (both threaded and blocked) + """ + self.alive = False + if self.__server_stream is not None: + try: + self.__server_stream.close() + except Exception: + pass + + if self.control_socket is not None: + try: + self.control_socket.close() + except Exception: + pass + + if self.__video_socket is not None: + try: + self.__video_socket.close() + except Exception: + pass + self.stream_loop_thread = None + + async def __stream_loop(self) -> None: + while self.alive: + try: + if self.__video_socket is None: + raise ConnectionError("Did not receive Video Stream!") + + raw_h264 = self.__video_socket.recv(0x10000) + if raw_h264 == b"": + raise ConnectionError("Video stream is disconnected") + + for to_send_content in self.framer.decode(raw_h264): + await self.__send_to_listeners(EVENT_STREAM, to_send_content) + + except BlockingIOError: + await asyncio.sleep(0.01) + + except (ConnectionError, OSError): + import traceback + traceback.print_exc() + print("++++++++++++++++++++++++++++++++++++++++") + if self.alive: + await self.__send_to_listeners(EVENT_DISCONNECT) + + except Exception: + import traceback + traceback.print_exc() + print("========================================") + self.alive = False + + def add_listener(self, cls: str, listener: Callable[..., Any]) -> None: + """ + Add a video listener + + Args: + :param cls: Listener category, support: init, frame + :param listener:A function to receive frame np.ndarray + """ + self.listeners[cls].append(listener) + + def remove_listener(self, cls: str, listener: Callable[..., Any]) -> None: + """ + Remove a video listener + + Args: + cls: Listener category, support: init, frame + listener: A function to receive frame np.ndarray + """ + if listener in self.listeners[cls]: + self.listeners[cls].remove(listener) + + def has_listener(self, cls: str, listener: Callable[..., Any]) -> bool: + return listener in self.listeners[cls] + + def any_listener(self, cls: str) -> bool: + return len(self.listeners[cls]) > 0 + + async def __send_to_listeners(self, cls: str, *args, **kwargs) -> None: + loop = asyncio.get_running_loop() + tasks = [] + + for fun in list(self.listeners.get(cls, [])): + try: + result = fun(*args, **kwargs) + + if inspect.isawaitable(result): + # 不直接 await,而是绑定到当前 loop + tasks.append(loop.create_task(result)) + + except Exception: + import traceback + traceback.print_exc() + + if tasks: + await asyncio.gather(*tasks, return_exceptions=True) diff --git a/service/runtime.py b/service/runtime.py index ac34e821d..ec86520d1 100644 --- a/service/runtime.py +++ b/service/runtime.py @@ -1,8 +1,8 @@ from __future__ import annotations -import os import asyncio import datetime +import os import shutil import threading import time @@ -10,22 +10,26 @@ from pathlib import Path from typing import Any, Dict, List, Optional, Tuple +from adbutils import adb + from core.Baas_thread import Baas_thread from core.config.config_set import ConfigSet from core.device import emulator_manager +from core.device.connection import Connection from main import Main from .broadcast import BroadcastChannel +from .lib.scrcpy import ScrcpyClient from .utils import * _TASK_ALIAS = { - "start_hard_task": "explore_hard_task", - "start_normal_task": "explore_normal_task", - "start_fhx": "de_clothes", - "start_main_story": "main_story", - "start_group_story": "group_story", - "start_mini_story": "mini_story", - "start_explore_activity_story": "explore_activity_story", - "start_explore_activity_mission": "explore_activity_mission", + "start_hard_task" : "explore_hard_task", + "start_normal_task" : "explore_normal_task", + "start_fhx" : "de_clothes", + "start_main_story" : "main_story", + "start_group_story" : "group_story", + "start_mini_story" : "mini_story", + "start_explore_activity_story" : "explore_activity_story", + "start_explore_activity_mission" : "explore_activity_mission", "start_explore_activity_challenge": "explore_activity_challenge", } @@ -40,14 +44,14 @@ def emit(self, payload): # noqa: ANN001 - Qt compatible signature def _default_status(config_id: str) -> Dict[str, Any]: return { - "config_id": config_id, - "running": False, - "is_flag_run": False, - "button": None, - "current_task": None, + "config_id" : config_id, + "running" : False, + "is_flag_run" : False, + "button" : None, + "current_task" : None, "waiting_tasks": [], - "exit_code": None, - "timestamp": time.time(), + "exit_code" : None, + "timestamp" : time.time(), } @@ -59,6 +63,7 @@ class ConfigSession: button_signal: _SignalHook update_signal: _SignalHook exit_signal: _SignalHook + scrcpy_client: ScrcpyClient = None thread: Optional[threading.Thread] = None status: Dict[str, Any] = field(default_factory=dict) @@ -134,7 +139,7 @@ def _ensure_main_sync(self) -> None: self._main = Main(ocr_needed=["en-us", "zh-cn"], jsonify=True, lazy_data=True) async def _ensure_main(self) -> None: - await asyncio.get_running_loop().run_in_executor(None, self._ensure_main_sync) + await asyncio.get_running_loop().run_in_executor(None, self._ensure_main_sync) # type: ignore @staticmethod def _ensure_config() -> None: @@ -147,7 +152,6 @@ def _ensure_config() -> None: if len(config_dir_list) == 0: check_config('default_config') - async def ensure_ready(self) -> None: await self._ensure_main() @@ -186,6 +190,13 @@ def _get_or_create_session(self, config_id: str) -> ConfigSession: self._publish_status(config_id) return session + async def get_session(self, config_id: str): + async with self._lock: + session = self._sessions.get(config_id) + if session is None: + session = self._get_or_create_session(config_id) + return session + async def start_scheduler(self, config_id: str, set_log=None) -> Dict[str, Any]: loop = asyncio.get_running_loop() async with self._lock: @@ -193,7 +204,7 @@ async def start_scheduler(self, config_id: str, set_log=None) -> Dict[str, Any]: if set_log: set_log() if session.thread and session.thread.is_alive(): return {"status": "already-running", "config_id": config_id} - init_ok = await loop.run_in_executor(None, session.baas.init_all_data) + init_ok = await loop.run_in_executor(None, session.baas.init_all_data) # type: ignore if not init_ok: raise RuntimeError("Baas_thread initialization failed") @@ -245,18 +256,30 @@ async def solve_task(self, config_id: str, task_name: str, set_log=None) -> Dict needs_init = session.baas.scheduler is None if needs_init: - await loop.run_in_executor(None, baas.init_all_data) + await loop.run_in_executor(None, baas.init_all_data) # type: ignore def _call() -> None: try: - self._update_status(config_id, running=True, is_flag_run=True, exit_code=None, current_task=task_name, - waiting_tasks=[]) + self._update_status( + config_id, + running=True, + is_flag_run=True, + exit_code=None, + current_task=task_name, + waiting_tasks=[] + ) baas.flag_run = True baas.send("solve", task_name) finally: session.thread = None - self._update_status(config_id, running=False, is_flag_run=session.baas.flag_run, current_task=None, - waiting_tasks=[]) + assert session is not None + self._update_status( + config_id, + running=False, + is_flag_run=session.baas.flag_run, + current_task=None, + waiting_tasks=[] + ) thread = threading.Thread( target=_call, @@ -268,28 +291,59 @@ def _call() -> None: return {"status": "ok", "task": task_name, "result": 0} + async def require_remote_(self, config_id: str) -> ScrcpyClient: + session = await self.get_session(config_id) + if session.scrcpy_client is not None: + return session.scrcpy_client + session = await self.get_session(config_id) + connection = Connection(session.baas) + connection = adb.device(connection.serial) + session.scrcpy_client = await ScrcpyClient(connection).init() + return session.scrcpy_client + + # noinspection PyBroadException + async def control_device_(self, config_id: str, operation: Dict[str, Any]) -> Dict[str, Any]: + loop = asyncio.get_running_loop() + session = await self.get_session(config_id) + + op_type = operation["type"] + op_data = operation["data"] + try: + await loop.run_in_executor(None, { + "click": lambda: session.scrcpy_client.control.touch( # type: ignore + op_data["x"], op_data["y"] + ), + "swipe": lambda: session.scrcpy_client.control.swipe( # type: ignore + op_data["fx"], op_data["fy"], op_data["tx"], op_data["ty"], op_data["dt"] + ) + }[op_type]) # type: ignore + + return {"status": "ok", "config_id": config_id, "result": 0} + except Exception: + return {"status": "fail", "config_id": config_id, "result": 1} + @staticmethod async def detect_adb() -> List[str]: loop = asyncio.get_running_loop() - adb_res = await loop.run_in_executor(None, emulator_manager.autosearch) + adb_res = await loop.run_in_executor(None, emulator_manager.autosearch) # type: ignore return adb_res @staticmethod async def valid_cdk(cdk): loop = asyncio.get_running_loop() - cdk_res = await loop.run_in_executor(None, validate_cdk, cdk) + cdk_res = await loop.run_in_executor(None, validate_cdk, cdk) # type: ignore return cdk_res @staticmethod async def test_all_sha(): loop = asyncio.get_running_loop() - all_sha_res = await loop.run_in_executor(None, test_all_repo_sha) + all_sha_res = await loop.run_in_executor(None, test_all_repo_sha) # type: ignore return all_sha_res @staticmethod async def check_for_update(): loop = asyncio.get_running_loop() - all_update_res = await loop.run_in_executor(None, check_for_update) + all_update_res = await loop.run_in_executor(None, check_for_update) # type: ignore return all_update_res @staticmethod From fc74f0494b277314961207a2fd776b796e23a371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=AD=E3=83=A9=E3=83=A1=E3=82=A4?= <1710623513@qq.com> Date: Wed, 22 Apr 2026 14:40:35 +0800 Subject: [PATCH 16/98] Dev Feature Remote --- deploy/service/requirements.service.linux.txt | 1 + .../service/requirements.service.windows.txt | 1 + main.service.py | 2 +- pyproject.toml | 1 + requirements.txt | 3 +- service/app.py | 643 ++++++--- service/context.py | 2 + service/dist/assets/highlight-BsptWXP5.js | 7 - service/dist/assets/highlight-BsptWXP5.js.br | Bin 42983 -> 0 bytes service/dist/assets/index-CcNZVzNR.css | 1 - service/dist/assets/index-CcNZVzNR.css.br | Bin 13282 -> 0 bytes service/dist/assets/index-DySAOzzf.js | 67 - service/dist/assets/index-DySAOzzf.js.br | Bin 82223 -> 0 bytes service/dist/assets/markdown-XJO5hUeu.js | 29 - service/dist/assets/markdown-XJO5hUeu.js.br | Bin 41073 -> 0 bytes service/dist/assets/misc-GeCjUSSS.js | 344 ----- service/dist/assets/misc-GeCjUSSS.js.br | Bin 29974 -> 0 bytes service/dist/assets/motion-Dp9wOFzY.js | 25 - service/dist/assets/motion-Dp9wOFzY.js.br | Bin 39726 -> 0 bytes service/dist/assets/ui-CImlNgPE.js | 53 - service/dist/assets/ui-CImlNgPE.js.br | Bin 64249 -> 0 bytes service/dist/cursors/alternativeselect.cur | Bin 503 -> 0 bytes service/dist/cursors/areaselect.cur | Bin 607 -> 0 bytes service/dist/cursors/block.cur | Bin 1702 -> 0 bytes service/dist/cursors/help.cur | Bin 1396 -> 0 bytes service/dist/cursors/link.cur | Bin 1050 -> 0 bytes service/dist/cursors/move.cur | Bin 804 -> 0 bytes service/dist/cursors/normal.cur | Bin 1021 -> 0 bytes service/dist/cursors/pen.cur | Bin 859 -> 0 bytes service/dist/cursors/resizeDIAG1.cur | Bin 874 -> 0 bytes service/dist/cursors/resizeDIAG2.cur | Bin 898 -> 0 bytes service/dist/cursors/resizeNS.cur | Bin 359 -> 0 bytes service/dist/cursors/resizeWE.cur | Bin 309 -> 0 bytes service/dist/cursors/text_static_blue.cur | Bin 406 -> 0 bytes service/dist/cursors/text_static_white.cur | Bin 391 -> 0 bytes .../Auto clear mainline plot settings.md | 46 - .../Commonly used emulator adb address.md | 26 - .../de_DE/Description of normal graphs.md | 113 -- ...fficult Chart Configuration Description.md | 102 -- .../docs/de_DE/Frontend Development Guide.md | 103 -- .../de_DE/Guide for activity sweep fill in.md | 53 - ... BlueArchive game (first-use must read).md | 30 - .../Normal Sweeping Scanning Description.md | 62 - .../Scheduling Configuration Filling Guide.md | 83 -- ...ask force attributes required by region.md | 38 - ...orting guidelines on issues (important).md | 60 - .../Auto clear mainline plot settings.md | 46 - .../Commonly used emulator adb address.md | 24 - .../en_US/Description of normal graphs.md | 113 -- ...fficult Chart Configuration Description.md | 103 -- .../docs/en_US/Frontend Development Guide.md | 104 -- .../en_US/Guide for activity sweep fill in.md | 53 - ... BlueArchive game (first-use must read).md | 29 - .../Normal Sweeping Scanning Description.md | 61 - .../Scheduling Configuration Filling Guide.md | 83 -- ...ask force attributes required by region.md | 37 - ...orting guidelines on issues (important).md | 57 - service/dist/docs/entry.json | 304 ----- service/dist/docs/entry.json.br | Bin 5361 -> 0 bytes .../Auto clear mainline plot settings.md | 46 - .../Commonly used emulator adb address.md | 26 - .../fr_FR/Description of normal graphs.md | 111 -- ...fficult Chart Configuration Description.md | 103 -- .../docs/fr_FR/Frontend Development Guide.md | 101 -- .../fr_FR/Guide for activity sweep fill in.md | 53 - ... BlueArchive game (first-use must read).md | 30 - .../Normal Sweeping Scanning Description.md | 63 - .../Scheduling Configuration Filling Guide.md | 85 -- ...ask force attributes required by region.md | 37 - ...orting guidelines on issues (important).md | 60 - .../Auto clear mainline plot settings.md | 46 - .../Commonly used emulator adb address.md | 28 - .../ja_JP/Description of normal graphs.md | 112 -- ...fficult Chart Configuration Description.md | 102 -- .../docs/ja_JP/Frontend Development Guide.md | 104 -- .../ja_JP/Guide for activity sweep fill in.md | 50 - ... BlueArchive game (first-use must read).md | 31 - .../Normal Sweeping Scanning Description.md | 64 - .../Scheduling Configuration Filling Guide.md | 84 -- ...ask force attributes required by region.md | 40 - ...orting guidelines on issues (important).md | 65 - .../Auto clear mainline plot settings.md | 46 - .../Commonly used emulator adb address.md | 26 - .../ko_KR/Description of normal graphs.md | 117 -- ...fficult Chart Configuration Description.md | 105 -- .../docs/ko_KR/Frontend Development Guide.md | 111 -- .../ko_KR/Guide for activity sweep fill in.md | 53 - ... BlueArchive game (first-use must read).md | 32 - .../Normal Sweeping Scanning Description.md | 62 - .../Scheduling Configuration Filling Guide.md | 86 -- ...ask force attributes required by region.md | 40 - ...orting guidelines on issues (important).md | 54 - .../Auto clear mainline plot settings.md | 46 - .../Commonly used emulator adb address.md | 25 - .../ru_RU/Description of normal graphs.md | 114 -- ...fficult Chart Configuration Description.md | 103 -- .../docs/ru_RU/Frontend Development Guide.md | 104 -- .../ru_RU/Guide for activity sweep fill in.md | 53 - ... BlueArchive game (first-use must read).md | 30 - .../Normal Sweeping Scanning Description.md | 63 - .../Scheduling Configuration Filling Guide.md | 79 -- ...ask force attributes required by region.md | 36 - ...orting guidelines on issues (important).md | 65 - .../Auto clear mainline plot settings.md | 46 - .../Commonly used emulator adb address.md | 29 - .../zh_CN/Description of normal graphs.md | 111 -- ...fficult Chart Configuration Description.md | 102 -- .../docs/zh_CN/Frontend Development Guide.md | 102 -- .../zh_CN/Guide for activity sweep fill in.md | 41 - ... BlueArchive game (first-use must read).md | 29 - .../Normal Sweeping Scanning Description.md | 47 - .../Scheduling Configuration Filling Guide.md | 66 - ...ask force attributes required by region.md | 35 - ...orting guidelines on issues (important).md | 59 - service/dist/favicon.ico | Bin 15406 -> 0 bytes service/dist/fonts/JetBrainsMono.ttf | Bin 189028 -> 0 bytes .../dist/fonts/SourceHanSans-Subset-JP.woff2 | Bin 258428 -> 0 bytes .../dist/fonts/SourceHanSans-Subset-SC.woff2 | Bin 266404 -> 0 bytes .../dist/icons/property/currency_icon_ap.webp | Bin 5976 -> 0 bytes .../icons/property/currency_icon_gem.webp | Bin 7966 -> 0 bytes .../icons/property/currency_icon_gold.webp | Bin 9124 -> 0 bytes .../icons/property/item_icon_arenacoin.webp | Bin 13150 -> 0 bytes .../icons/property/item_icon_chasecoin.webp | Bin 12830 -> 0 bytes .../icons/property/item_icon_craftitem_0.webp | Bin 9760 -> 0 bytes .../icons/property/item_icon_craftitem_1.webp | Bin 15208 -> 0 bytes .../dist/icons/property/item_icon_pass.webp | Bin 15342 -> 0 bytes service/dist/icons/regular/ic_warning.svg | 13 - service/dist/images/bg-dark.webp | Bin 251202 -> 0 bytes service/dist/images/bg-light.webp | Bin 289662 -> 0 bytes service/dist/images/logo.png | Bin 126799 -> 0 bytes service/dist/index.html | 20 - service/dist/locales/de.json | 449 ------- service/dist/locales/de.json.br | Bin 6286 -> 0 bytes service/dist/locales/en.json | 450 ------- service/dist/locales/en.json.br | Bin 5167 -> 0 bytes service/dist/locales/fr.json | 449 ------- service/dist/locales/fr.json.br | Bin 6297 -> 0 bytes service/dist/locales/ja.json | 449 ------- service/dist/locales/ja.json.br | Bin 6203 -> 0 bytes service/dist/locales/ko.json | 449 ------- service/dist/locales/ko.json.br | Bin 5895 -> 0 bytes service/dist/locales/ru.json | 449 ------- service/dist/locales/ru.json.br | Bin 6768 -> 0 bytes service/dist/locales/zh.json | 454 ------- service/dist/locales/zh.json.br | Bin 5534 -> 0 bytes service/dist/scripts/fernetBrowser.min.js | 10 - service/dist/scripts/fernetBrowser.min.js.br | Bin 17572 -> 0 bytes service/encryption.py | 676 +++++++++- service/lib/scrcpy/codec.py | 1196 ++++++++++++++++- service/lib/scrcpy/const.py | 3 +- service/lib/scrcpy/core.py | 40 +- 151 files changed, 2233 insertions(+), 9341 deletions(-) delete mode 100644 service/dist/assets/highlight-BsptWXP5.js delete mode 100644 service/dist/assets/highlight-BsptWXP5.js.br delete mode 100644 service/dist/assets/index-CcNZVzNR.css delete mode 100644 service/dist/assets/index-CcNZVzNR.css.br delete mode 100644 service/dist/assets/index-DySAOzzf.js delete mode 100644 service/dist/assets/index-DySAOzzf.js.br delete mode 100644 service/dist/assets/markdown-XJO5hUeu.js delete mode 100644 service/dist/assets/markdown-XJO5hUeu.js.br delete mode 100644 service/dist/assets/misc-GeCjUSSS.js delete mode 100644 service/dist/assets/misc-GeCjUSSS.js.br delete mode 100644 service/dist/assets/motion-Dp9wOFzY.js delete mode 100644 service/dist/assets/motion-Dp9wOFzY.js.br delete mode 100644 service/dist/assets/ui-CImlNgPE.js delete mode 100644 service/dist/assets/ui-CImlNgPE.js.br delete mode 100644 service/dist/cursors/alternativeselect.cur delete mode 100644 service/dist/cursors/areaselect.cur delete mode 100644 service/dist/cursors/block.cur delete mode 100644 service/dist/cursors/help.cur delete mode 100644 service/dist/cursors/link.cur delete mode 100644 service/dist/cursors/move.cur delete mode 100644 service/dist/cursors/normal.cur delete mode 100644 service/dist/cursors/pen.cur delete mode 100644 service/dist/cursors/resizeDIAG1.cur delete mode 100644 service/dist/cursors/resizeDIAG2.cur delete mode 100644 service/dist/cursors/resizeNS.cur delete mode 100644 service/dist/cursors/resizeWE.cur delete mode 100644 service/dist/cursors/text_static_blue.cur delete mode 100644 service/dist/cursors/text_static_white.cur delete mode 100644 service/dist/docs/de_DE/Auto clear mainline plot settings.md delete mode 100644 service/dist/docs/de_DE/Commonly used emulator adb address.md delete mode 100644 service/dist/docs/de_DE/Description of normal graphs.md delete mode 100644 service/dist/docs/de_DE/Difficult Chart Configuration Description.md delete mode 100644 service/dist/docs/de_DE/Frontend Development Guide.md delete mode 100644 service/dist/docs/de_DE/Guide for activity sweep fill in.md delete mode 100644 service/dist/docs/de_DE/Internal settings in BlueArchive game (first-use must read).md delete mode 100644 service/dist/docs/de_DE/Normal Sweeping Scanning Description.md delete mode 100644 service/dist/docs/de_DE/Scheduling Configuration Filling Guide.md delete mode 100644 service/dist/docs/de_DE/Task force attributes required by region.md delete mode 100644 service/dist/docs/de_DE/reporting guidelines on issues (important).md delete mode 100644 service/dist/docs/en_US/Auto clear mainline plot settings.md delete mode 100644 service/dist/docs/en_US/Commonly used emulator adb address.md delete mode 100644 service/dist/docs/en_US/Description of normal graphs.md delete mode 100644 service/dist/docs/en_US/Difficult Chart Configuration Description.md delete mode 100644 service/dist/docs/en_US/Frontend Development Guide.md delete mode 100644 service/dist/docs/en_US/Guide for activity sweep fill in.md delete mode 100644 service/dist/docs/en_US/Internal settings in BlueArchive game (first-use must read).md delete mode 100644 service/dist/docs/en_US/Normal Sweeping Scanning Description.md delete mode 100644 service/dist/docs/en_US/Scheduling Configuration Filling Guide.md delete mode 100644 service/dist/docs/en_US/Task force attributes required by region.md delete mode 100644 service/dist/docs/en_US/reporting guidelines on issues (important).md delete mode 100644 service/dist/docs/entry.json delete mode 100644 service/dist/docs/entry.json.br delete mode 100644 service/dist/docs/fr_FR/Auto clear mainline plot settings.md delete mode 100644 service/dist/docs/fr_FR/Commonly used emulator adb address.md delete mode 100644 service/dist/docs/fr_FR/Description of normal graphs.md delete mode 100644 service/dist/docs/fr_FR/Difficult Chart Configuration Description.md delete mode 100644 service/dist/docs/fr_FR/Frontend Development Guide.md delete mode 100644 service/dist/docs/fr_FR/Guide for activity sweep fill in.md delete mode 100644 service/dist/docs/fr_FR/Internal settings in BlueArchive game (first-use must read).md delete mode 100644 service/dist/docs/fr_FR/Normal Sweeping Scanning Description.md delete mode 100644 service/dist/docs/fr_FR/Scheduling Configuration Filling Guide.md delete mode 100644 service/dist/docs/fr_FR/Task force attributes required by region.md delete mode 100644 service/dist/docs/fr_FR/reporting guidelines on issues (important).md delete mode 100644 service/dist/docs/ja_JP/Auto clear mainline plot settings.md delete mode 100644 service/dist/docs/ja_JP/Commonly used emulator adb address.md delete mode 100644 service/dist/docs/ja_JP/Description of normal graphs.md delete mode 100644 service/dist/docs/ja_JP/Difficult Chart Configuration Description.md delete mode 100644 service/dist/docs/ja_JP/Frontend Development Guide.md delete mode 100644 service/dist/docs/ja_JP/Guide for activity sweep fill in.md delete mode 100644 service/dist/docs/ja_JP/Internal settings in BlueArchive game (first-use must read).md delete mode 100644 service/dist/docs/ja_JP/Normal Sweeping Scanning Description.md delete mode 100644 service/dist/docs/ja_JP/Scheduling Configuration Filling Guide.md delete mode 100644 service/dist/docs/ja_JP/Task force attributes required by region.md delete mode 100644 service/dist/docs/ja_JP/reporting guidelines on issues (important).md delete mode 100644 service/dist/docs/ko_KR/Auto clear mainline plot settings.md delete mode 100644 service/dist/docs/ko_KR/Commonly used emulator adb address.md delete mode 100644 service/dist/docs/ko_KR/Description of normal graphs.md delete mode 100644 service/dist/docs/ko_KR/Difficult Chart Configuration Description.md delete mode 100644 service/dist/docs/ko_KR/Frontend Development Guide.md delete mode 100644 service/dist/docs/ko_KR/Guide for activity sweep fill in.md delete mode 100644 service/dist/docs/ko_KR/Internal settings in BlueArchive game (first-use must read).md delete mode 100644 service/dist/docs/ko_KR/Normal Sweeping Scanning Description.md delete mode 100644 service/dist/docs/ko_KR/Scheduling Configuration Filling Guide.md delete mode 100644 service/dist/docs/ko_KR/Task force attributes required by region.md delete mode 100644 service/dist/docs/ko_KR/reporting guidelines on issues (important).md delete mode 100644 service/dist/docs/ru_RU/Auto clear mainline plot settings.md delete mode 100644 service/dist/docs/ru_RU/Commonly used emulator adb address.md delete mode 100644 service/dist/docs/ru_RU/Description of normal graphs.md delete mode 100644 service/dist/docs/ru_RU/Difficult Chart Configuration Description.md delete mode 100644 service/dist/docs/ru_RU/Frontend Development Guide.md delete mode 100644 service/dist/docs/ru_RU/Guide for activity sweep fill in.md delete mode 100644 service/dist/docs/ru_RU/Internal settings in BlueArchive game (first-use must read).md delete mode 100644 service/dist/docs/ru_RU/Normal Sweeping Scanning Description.md delete mode 100644 service/dist/docs/ru_RU/Scheduling Configuration Filling Guide.md delete mode 100644 service/dist/docs/ru_RU/Task force attributes required by region.md delete mode 100644 service/dist/docs/ru_RU/reporting guidelines on issues (important).md delete mode 100644 service/dist/docs/zh_CN/Auto clear mainline plot settings.md delete mode 100644 service/dist/docs/zh_CN/Commonly used emulator adb address.md delete mode 100644 service/dist/docs/zh_CN/Description of normal graphs.md delete mode 100644 service/dist/docs/zh_CN/Difficult Chart Configuration Description.md delete mode 100644 service/dist/docs/zh_CN/Frontend Development Guide.md delete mode 100644 service/dist/docs/zh_CN/Guide for activity sweep fill in.md delete mode 100644 service/dist/docs/zh_CN/Internal settings in BlueArchive game (first-use must read).md delete mode 100644 service/dist/docs/zh_CN/Normal Sweeping Scanning Description.md delete mode 100644 service/dist/docs/zh_CN/Scheduling Configuration Filling Guide.md delete mode 100644 service/dist/docs/zh_CN/Task force attributes required by region.md delete mode 100644 service/dist/docs/zh_CN/reporting guidelines on issues (important).md delete mode 100644 service/dist/favicon.ico delete mode 100644 service/dist/fonts/JetBrainsMono.ttf delete mode 100644 service/dist/fonts/SourceHanSans-Subset-JP.woff2 delete mode 100644 service/dist/fonts/SourceHanSans-Subset-SC.woff2 delete mode 100644 service/dist/icons/property/currency_icon_ap.webp delete mode 100644 service/dist/icons/property/currency_icon_gem.webp delete mode 100644 service/dist/icons/property/currency_icon_gold.webp delete mode 100644 service/dist/icons/property/item_icon_arenacoin.webp delete mode 100644 service/dist/icons/property/item_icon_chasecoin.webp delete mode 100644 service/dist/icons/property/item_icon_craftitem_0.webp delete mode 100644 service/dist/icons/property/item_icon_craftitem_1.webp delete mode 100644 service/dist/icons/property/item_icon_pass.webp delete mode 100644 service/dist/icons/regular/ic_warning.svg delete mode 100644 service/dist/images/bg-dark.webp delete mode 100644 service/dist/images/bg-light.webp delete mode 100644 service/dist/images/logo.png delete mode 100644 service/dist/index.html delete mode 100644 service/dist/locales/de.json delete mode 100644 service/dist/locales/de.json.br delete mode 100644 service/dist/locales/en.json delete mode 100644 service/dist/locales/en.json.br delete mode 100644 service/dist/locales/fr.json delete mode 100644 service/dist/locales/fr.json.br delete mode 100644 service/dist/locales/ja.json delete mode 100644 service/dist/locales/ja.json.br delete mode 100644 service/dist/locales/ko.json delete mode 100644 service/dist/locales/ko.json.br delete mode 100644 service/dist/locales/ru.json delete mode 100644 service/dist/locales/ru.json.br delete mode 100644 service/dist/locales/zh.json delete mode 100644 service/dist/locales/zh.json.br delete mode 100644 service/dist/scripts/fernetBrowser.min.js delete mode 100644 service/dist/scripts/fernetBrowser.min.js.br diff --git a/deploy/service/requirements.service.linux.txt b/deploy/service/requirements.service.linux.txt index 694f75dc9..5485a6fad 100644 --- a/deploy/service/requirements.service.linux.txt +++ b/deploy/service/requirements.service.linux.txt @@ -35,4 +35,5 @@ uvicorn # websockets # watchfiles # cryptography # +PyNaCl # # =========================== # diff --git a/deploy/service/requirements.service.windows.txt b/deploy/service/requirements.service.windows.txt index 1d31cc86c..62a999f54 100644 --- a/deploy/service/requirements.service.windows.txt +++ b/deploy/service/requirements.service.windows.txt @@ -35,4 +35,5 @@ uvicorn # websockets # watchfiles # cryptography # +PyNaCl # # =========================== # diff --git a/main.service.py b/main.service.py index 96c7196de..8b0d90c68 100644 --- a/main.service.py +++ b/main.service.py @@ -3,7 +3,7 @@ import uvicorn from service import set_log_format -DEFAULT_HOST = os.getenv("BAAS_SERVICE_HOST", "127.0.0.1") +DEFAULT_HOST = os.getenv("BAAS_SERVICE_HOST", "0.0.0.0") DEFAULT_PORT = int(os.getenv("BAAS_SERVICE_PORT", "8190")) diff --git a/pyproject.toml b/pyproject.toml index c65df0b1d..8d284906c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ dependencies = [ "PyAutoGUI == 0.9.54", "mss == 10.0.0", "rich >= 14.2.0", + "PyNaCl >= 1.6.1", "setuptools <= 80.10.2" ] requires-python = ">=3.9" diff --git a/requirements.txt b/requirements.txt index d715a8a24..1de2b9018 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,4 +24,5 @@ tomli_w == 1.2.0 PyAutoGUI == 0.9.54 mss == 10.0.0 -rich >= 14.2.0 +rich >= 14.2.0 +PyNaCl >= 1.6.1 diff --git a/service/app.py b/service/app.py index d4bebf9e3..4b602fd32 100644 --- a/service/app.py +++ b/service/app.py @@ -2,62 +2,45 @@ import asyncio import contextlib -import os -import secrets +import json import time from contextlib import suppress from pathlib import Path -from typing import Any, Dict, Union +from typing import Any, Dict from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect from starlette.middleware.cors import CORSMiddleware from starlette.staticfiles import StaticFiles from .context import ServiceContext -from .encryption import AuthenticationError, CipherBox, HandshakeResponse, HandshakeSession -from .lib.scrcpy.const import EVENT_STREAM -from .messages import ( - CommandMessage, - ProviderRequest, - SyncPatchMessage, - SyncPullMessage, +from .encryption import ( + ActiveSession, + AuthenticationError, + HandshakeContext, + JsonChaChaChannel, + PROTOCOL_VERSION, + SecretStreamBox, + b64d, + b64e, ) +from .lib.scrcpy.const import EVENT_STREAM_ANNEXB, EVENT_STREAM_FMP4 +from .messages import CommandMessage, ProviderRequest, SyncPatchMessage, SyncPullMessage PROJECT_ROOT = Path(__file__).resolve().parent.parent context = ServiceContext(PROJECT_ROOT) -_SHARED_SECRET: Union[str, None] = None - - -def _load_shared_secret() -> str: - secret = os.getenv("BAAS_SERVICE_SECRET") - if secret: - return secret - fallback = PROJECT_ROOT / "config" / "service.secret" - if fallback.exists(): - return fallback.read_text(encoding="utf-8").strip() - (PROJECT_ROOT / "config").mkdir(exist_ok=True) - token = secrets.token_hex(16) - fallback.write_bytes(token.encode("utf-8")) - return token - @contextlib.asynccontextmanager async def lifespan(app: FastAPI): - global _SHARED_SECRET - _SHARED_SECRET = _load_shared_secret() await context.startup() - yield - await context.shutdown() app = FastAPI(title="BAAS Service Mode", lifespan=lifespan) -# Allow all origins app.add_middleware( - CORSMiddleware, + CORSMiddleware, # type: ignore allow_origins=["*"], allow_credentials=True, allow_methods=["*"], @@ -65,32 +48,238 @@ async def lifespan(app: FastAPI): ) +def _json_bytes(payload: dict[str, Any]) -> bytes: + return json.dumps(payload, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + + +async def _send_stream_json(websocket: WebSocket, stream: SecretStreamBox, payload: dict[str, Any]) -> None: + await websocket.send_bytes(stream.encrypt(_json_bytes(payload))) + + +async def _recv_stream_json(websocket: WebSocket, stream: SecretStreamBox) -> dict[str, Any]: + frame = await websocket.receive_bytes() + plaintext = stream.decrypt(frame) + return json.loads(plaintext.decode("utf-8")) + + +async def _begin_server_hello(websocket: WebSocket, *, kind: str, channel: str) -> tuple[ + HandshakeContext, JsonChaChaChannel, dict[str, Any]]: + await websocket.accept() + hello = await websocket.receive_json() + handshake, response = context.auth_manager.issue_server_hello(hello, kind=kind, channel=channel) + await websocket.send_json(response) + secure = context.auth_manager.build_preauth_channel(handshake) + return handshake, secure, hello + + +def _decode_control_auth_proof(request: dict[str, Any]) -> bytes: + proof = request.get("proof") + if not isinstance(proof, str): + raise AuthenticationError("Password proof is missing") + return b64d(proof) + + +async def _finalize_control_auth( + websocket: WebSocket, + *, + handshake: HandshakeContext, + preauth_channel: JsonChaChaChannel, + request: dict[str, Any], +) -> tuple[ActiveSession, JsonChaChaChannel]: + if not context.auth_manager.password_state.initialized: + if request.get("type") != "initialize": + raise AuthenticationError("Initialization is required") + password = str(request.get("password", "")) + context.auth_manager.initialize_password(password) + session, control_channel = context.auth_manager.open_control_session_after_initialize(handshake) + else: + if request.get("type") != "authenticate": + raise AuthenticationError("Password authentication is required") + session, control_channel = context.auth_manager.authenticate_control( + handshake, + proof=_decode_control_auth_proof(request), + ) + await websocket.send_json( + preauth_channel.encrypt( + { + "type" : "auth_ok", + "protocol_version": PROTOCOL_VERSION, + "session_id" : session.session_id, + "resume_ticket" : context.auth_manager.issue_resume_ticket(session), + "expires_at" : session.expires_at, + "pwd_epoch" : session.pwd_epoch, + "pwd_salt" : context.auth_manager.password_state.as_public_dict()["pwd_salt"], + "argon2" : context.auth_manager.password_state.as_public_dict()["argon2"], + } + ) + ) + return session, control_channel + + +async def _control_sender( + websocket: WebSocket, + *, + control_channel: JsonChaChaChannel, + revoke_queue: asyncio.Queue, +) -> None: + try: + while True: + payload = await revoke_queue.get() + await websocket.send_json(control_channel.encrypt(payload)) + if payload.get("type") == "auth_revoked": + await websocket.close(code=4401, reason=payload.get("reason", "revoked")) + return + except asyncio.CancelledError: + pass + except WebSocketDisconnect: + pass + + +async def _control_heartbeat_sender( + websocket: WebSocket, + *, + control_channel: JsonChaChaChannel, + interval: float, +) -> None: + try: + while True: + await websocket.send_json( + control_channel.encrypt( + { + "type" : "heartbeat", + "timestamp": time.time(), + } + ) + ) + await asyncio.sleep(interval) + except asyncio.CancelledError: + pass + except WebSocketDisconnect: + pass + except RuntimeError: + pass + + @app.get("/health") async def health() -> Dict[str, Any]: statuses = context.runtime.current_status() - return {"ok": True, "statuses": statuses} - + auth_state = context.auth_manager.password_state + return { + "ok" : True, + "statuses": statuses, + "auth" : { + "initialized" : auth_state.initialized, + "pwd_epoch" : auth_state.pwd_epoch, + "server_sign_public_key": context.auth_manager.server_public_key_b64(), + }, + } + + +@app.websocket("/ws/control") +async def websocket_control(websocket: WebSocket) -> None: + revoke_queue = None + sender_task = heartbeat_task = None + session: ActiveSession | None = None + try: + handshake, preauth_channel, _ = await _begin_server_hello(websocket, kind="control", channel="control") + request = preauth_channel.decrypt(await websocket.receive_json()) + session, control_channel = await _finalize_control_auth( + websocket, + handshake=handshake, + preauth_channel=preauth_channel, + request=request, + ) + revoke_queue = context.auth_manager.subscribe_control(session.session_id) + sender_task = asyncio.create_task( + _control_sender( + websocket, + control_channel=control_channel, + revoke_queue=revoke_queue, + ) + ) + heartbeat_task = asyncio.create_task( + _control_heartbeat_sender( + websocket, + control_channel=control_channel, + interval=3.0, + ) + ) + while True: + message = control_channel.decrypt(await websocket.receive_json()) + msg_type = message.get("type") + if msg_type == "ping": + await websocket.send_json(control_channel.encrypt({"type": "pong", "timestamp": time.time()})) + elif msg_type == "change_password": + new_password = str(message.get("new_password", "")) + await context.auth_manager.change_password(session_id=session.session_id, new_password=new_password) + return + else: + raise AuthenticationError(f"Unsupported control message: {msg_type}") + except (AuthenticationError, HTTPException) as exc: + with suppress(RuntimeError): + await websocket.close(code=4401, reason=str(exc)) + except WebSocketDisconnect: + pass + except Exception as exc: # noqa: BLE001 - surfaced to caller + import traceback -async def _perform_handshake(websocket: WebSocket) -> tuple[HandshakeSession, CipherBox]: - if _SHARED_SECRET is None: - raise RuntimeError("Shared secret not initialised") - await websocket.accept() - session = HandshakeSession(_SHARED_SECRET) - challenge = session.issue_challenge() - await websocket.send_json({"type": "handshake", "challenge": challenge.challenge, "algorithm": challenge.algorithm}) - raw = await websocket.receive_json() - response = HandshakeResponse(**raw) - session.verify(response.response) - await websocket.send_json({"type": "handshake_ok"}) - return session, session.build_cipher() + traceback.print_exc() + with suppress(RuntimeError): + await websocket.close(code=1011, reason=str(exc)) + finally: + if session is not None and revoke_queue is not None: + context.auth_manager.unsubscribe_control(session.session_id, revoke_queue) + for task in (sender_task, heartbeat_task): + if task: + task.cancel() + with suppress(asyncio.CancelledError): + await task -async def _sync_sender(websocket: WebSocket, cipher: CipherBox, queue: asyncio.Queue) -> None: +async def _perform_business_resume( + websocket: WebSocket, + *, + channel: str, +) -> tuple[ActiveSession, SecretStreamBox]: + handshake, preauth_channel, hello = await _begin_server_hello(websocket, kind="resume", channel=channel) + if hello.get("channel") != channel: + raise AuthenticationError("Requested channel does not match websocket endpoint") + request = preauth_channel.decrypt(await websocket.receive_json()) + if request.get("type") != "resume_proof": + raise AuthenticationError("Resume proof is required") + session, secure_channel, stream_box = context.auth_manager.resume_business_session( + handshake=handshake, + session_id=str(hello.get("session_id", "")), + socket_id=str(hello.get("socket_id", "")), + channel=channel, + resume_ticket=str(hello.get("resume_ticket", "")), + resume_mac=b64d(str(request.get("resume_mac", ""))), + ) + await websocket.send_json( + secure_channel.encrypt( + { + "type" : "resume_ok", + "session_id" : session.session_id, + "pwd_epoch" : session.pwd_epoch, + "server_header": b64e(stream_box.tx_header), + } + ) + ) + ready_back = await websocket.receive_json() + secure_channel.set_rx_seq(1) + ready = secure_channel.decrypt(ready_back) + if ready.get("type") != "stream_ready": + raise AuthenticationError("Client stream header is required") + stream_box.init_pull(b64d(str(ready.get("client_header", "")))) + return session, stream_box + + +async def _sync_sender(websocket: WebSocket, stream: SecretStreamBox, queue: asyncio.Queue) -> None: try: while True: payload = dict(await queue.get()) payload.setdefault("direction", "push") - await websocket.send_text(cipher.encrypt_json(payload)) + await _send_stream_json(websocket, stream, payload) # type: ignore except asyncio.CancelledError: pass @@ -100,64 +289,82 @@ async def websocket_sync(websocket: WebSocket) -> None: queue = None sender_task = None try: - _, cipher = await _perform_handshake(websocket) + _, stream = await _perform_business_resume(websocket, channel="sync") queue = await context.config_manager.subscribe_updates() - sender_task = asyncio.create_task(_sync_sender(websocket, cipher, queue)) + sender_task = asyncio.create_task(_sync_sender(websocket, stream, queue)) while True: - encrypted = await websocket.receive_text() - message = cipher.decrypt_json(encrypted) + message = await _recv_stream_json(websocket, stream) msg_type = message.get("type") if msg_type == "pull": data = SyncPullMessage(**message) snapshot = await context.config_manager.get_snapshot(data.resource, data.resource_id) - response = { - "type" : "snapshot", - "resource" : data.resource, - "resource_id": data.resource_id, - "timestamp" : snapshot.timestamp, - "data" : snapshot.data, - } - await websocket.send_text(cipher.encrypt_json(response)) + await _send_stream_json( + websocket, + stream, + { + "type" : "snapshot", + "resource" : data.resource, + "resource_id": data.resource_id, + "timestamp" : snapshot.timestamp, + "data" : snapshot.data, + }, + ) elif msg_type == "patch": data = SyncPatchMessage(**message) await context.config_manager.apply_patch( - data.resource, data.resource_id, data.ops, data.timestamp, origin="frontend" + data.resource, + data.resource_id, + data.ops, + data.timestamp, + origin="frontend", + ) + await _send_stream_json( + websocket, + stream, + { + "type" : "patch_ack", + "resource" : data.resource, + "resource_id": data.resource_id, + "timestamp" : data.timestamp, + }, ) - response = { - "type" : "patch_ack", - "resource" : data.resource, - "resource_id": data.resource_id, - "timestamp" : data.timestamp, - } - await websocket.send_text(cipher.encrypt_json(response)) elif msg_type == "list": snapshot = await context.config_manager.get_config_list() - response = { - "type" : "config_list", - "timestamp": snapshot.timestamp, - "data" : snapshot.data, - } - await websocket.send_text(cipher.encrypt_json(response)) + await _send_stream_json( + websocket, + stream, + { + "type" : "config_list", + "timestamp": snapshot.timestamp, + "data" : snapshot.data, + }, + ) else: raise HTTPException(status_code=400, detail=f"Unsupported sync message: {msg_type}") except (AuthenticationError, HTTPException) as exc: - await websocket.close(code=4401, reason=str(exc)) + import traceback + traceback.print_exc() + with suppress(RuntimeError): + await websocket.close(code=4401, reason=str(exc)) except WebSocketDisconnect: pass - except Exception as exc: + except Exception as exc: # noqa: BLE001 - surfaced to caller import traceback + traceback.print_exc() - await websocket.close(code=1011, reason=str(exc)) + with suppress(RuntimeError): + await websocket.close(code=1011, reason=str(exc)) finally: if sender_task: sender_task.cancel() - with contextlib.suppress(asyncio.CancelledError): + with suppress(asyncio.CancelledError): await sender_task if queue is not None: context.config_manager.unsubscribe_updates(queue) -async def _provider_sender(websocket: WebSocket, cipher: CipherBox, queue: asyncio.Queue, envelope_type: str) -> None: +async def _provider_sender(websocket: WebSocket, stream: SecretStreamBox, queue: asyncio.Queue, + envelope_type: str) -> None: try: while True: payload = await queue.get() @@ -165,7 +372,7 @@ async def _provider_sender(websocket: WebSocket, cipher: CipherBox, queue: async response = {"type": envelope_type, "status": payload} else: response = {"type": envelope_type, "entry": payload} - await websocket.send_text(cipher.encrypt_json(response)) + await _send_stream_json(websocket, stream, response) except asyncio.CancelledError: pass @@ -175,51 +382,50 @@ async def websocket_provider(websocket: WebSocket) -> None: log_queue = status_queue = None log_task = status_task = None try: - _, cipher = await _perform_handshake(websocket) + _, stream = await _perform_business_resume(websocket, channel="provider") history = context.log_manager.get_history() scopes = context.log_manager.get_scopes() - await websocket.send_text(cipher.encrypt_json({"type": "logs_full", "scopes": scopes, "entries": history})) - await websocket.send_text(cipher.encrypt_json({"type": "status", "status": context.runtime.current_status()})) + await _send_stream_json(websocket, stream, {"type": "logs_full", "scopes": scopes, "entries": history}) + await _send_stream_json(websocket, stream, {"type": "status", "status": context.runtime.current_status()}) if context.runtime.is_all_data_initialized: - await websocket.send_text( - cipher.encrypt_json({"type": "status", "status": {"is_all_data_initialized": True}}) - ) + await _send_stream_json(websocket, stream, {"type": "status", "status": {"is_all_data_initialized": True}}) log_queue = await context.log_manager.subscribe() status_queue = await context.runtime.subscribe_status() - log_task = asyncio.create_task(_provider_sender(websocket, cipher, log_queue, "log")) - status_task = asyncio.create_task(_provider_sender(websocket, cipher, status_queue, "status")) + log_task = asyncio.create_task(_provider_sender(websocket, stream, log_queue, "log")) + status_task = asyncio.create_task(_provider_sender(websocket, stream, status_queue, "status")) while True: - encrypted = await websocket.receive_text() - message = cipher.decrypt_json(encrypted) + message = await _recv_stream_json(websocket, stream) req_type = message.get("type") if req_type == "static_request": ProviderRequest(**message) snapshot = await context.config_manager.get_static_snapshot() - await websocket.send_text( - cipher.encrypt_json( - { - "type" : "static_snapshot", - "timestamp": snapshot.timestamp, - "data" : snapshot.data, - } - ) + await _send_stream_json( + websocket, + stream, + { + "type" : "static_snapshot", + "timestamp": snapshot.timestamp, + "data" : snapshot.data, + }, ) elif req_type == "status_request": - await websocket.send_text( - cipher.encrypt_json({"type": "status", "status": context.runtime.current_status()})) + await _send_stream_json(websocket, stream, + {"type": "status", "status": context.runtime.current_status()}) else: raise HTTPException(status_code=400, detail=f"Unsupported provider message: {req_type}") except (AuthenticationError, HTTPException) as exc: - await websocket.close(code=4401, reason=str(exc)) + with suppress(RuntimeError): + await websocket.close(code=4401, reason=str(exc)) except WebSocketDisconnect: pass - except Exception as exc: - await websocket.close(code=1011, reason=str(exc)) + except Exception as exc: # noqa: BLE001 - surfaced to caller + with suppress(RuntimeError): + await websocket.close(code=1011, reason=str(exc)) finally: for task in (log_task, status_task): if task: task.cancel() - with contextlib.suppress(asyncio.CancelledError): + with suppress(asyncio.CancelledError): await task if log_queue is not None: context.log_manager.unsubscribe(log_queue) @@ -230,18 +436,19 @@ async def websocket_provider(websocket: WebSocket) -> None: @app.websocket("/ws/trigger") async def websocket_trigger(websocket: WebSocket) -> None: try: - _, cipher = await _perform_handshake(websocket) + _, stream = await _perform_business_resume(websocket, channel="trigger") while True: - encrypted = await websocket.receive_text() - message = cipher.decrypt_json(encrypted) + message = await _recv_stream_json(websocket, stream) cmd = CommandMessage(**message) response_payload: Dict[str, Any] try: if cmd.command == "start_scheduler": if not cmd.config_id: raise ValueError("config_id is required for start_scheduler") - result = await context.runtime.start_scheduler(cmd.config_id, - set_log=context.ensure_runtime_logger_attached) + result = await context.runtime.start_scheduler( + cmd.config_id, + set_log=context.ensure_runtime_logger_attached, + ) response_payload = {"status": "ok", "data": result} elif cmd.command == "stop_scheduler": if not cmd.config_id: @@ -254,8 +461,11 @@ async def websocket_trigger(websocket: WebSocket) -> None: task = cmd.payload.get("task") if not task: raise ValueError("task is required for solve command") - result = await context.runtime.solve_task(cmd.config_id, task, - set_log=context.ensure_runtime_logger_attached) + result = await context.runtime.solve_task( + cmd.config_id, + task, + set_log=context.ensure_runtime_logger_attached, + ) response_payload = {"status": "ok", "data": result} elif cmd.command.startswith("start_"): if not cmd.config_id: @@ -263,7 +473,7 @@ async def websocket_trigger(websocket: WebSocket) -> None: result = await context.runtime.solve_task( config_id=cmd.config_id, task_name=cmd.command, - set_log=context.ensure_runtime_logger_attached + set_log=context.ensure_runtime_logger_attached, ) response_payload = {"status": "ok", "data": result} elif cmd.command.startswith("add_config"): @@ -274,10 +484,10 @@ async def websocket_trigger(websocket: WebSocket) -> None: result = await context.runtime.add_config(name, server) response_payload = {"status": "ok", "data": result} elif cmd.command.startswith("remove_config"): - id = cmd.payload.get("id") - if not id: + config_id = cmd.payload.get("id") + if not config_id: raise ValueError("id is required for remove_config") - result = await context.runtime.remove_config(id) + result = await context.runtime.remove_config(config_id) response_payload = {"status": "ok", "data": result} elif cmd.command == "detect_adb": result = await context.runtime.detect_adb() @@ -302,130 +512,170 @@ async def websocket_trigger(websocket: WebSocket) -> None: raise ValueError(f"config_id is required for command '{cmd.command}'") if not cmd.payload.get("operation"): raise ValueError(f"operation is required for command '{cmd.command}'") - config_id = cmd.config_id - operation = cmd.payload.get("operation") - result = await context.runtime.control_device_(config_id, operation) + result = await context.runtime.control_device_(cmd.config_id, cmd.payload.get("operation")) response_payload = {"status": "ok", "data": result} elif cmd.command == "status": response_payload = {"status": "ok", "data": context.runtime.current_status()} else: raise ValueError(f"Unsupported command '{cmd.command}'") - except Exception as inner_exc: # noqa: BLE001 - convert to payload + except Exception as inner_exc: # noqa: BLE001 - returned to frontend response_payload = {"status": "error", "error": str(inner_exc)} - await websocket.send_text( - cipher.encrypt_json( - { - "type" : "command_response", - "command" : cmd.command, - **response_payload, - "timestamp": cmd.timestamp, - } - ) + await _send_stream_json( + websocket, + stream, + { + "type" : "command_response", + "command" : cmd.command, + **response_payload, + "timestamp": cmd.timestamp, + }, ) except (AuthenticationError, HTTPException) as exc: - await websocket.close(code=4401, reason=str(exc)) + with suppress(RuntimeError): + await websocket.close(code=4401, reason=str(exc)) except WebSocketDisconnect: pass - except Exception as exc: - await websocket.close(code=1011, reason=str(exc)) + except Exception as exc: # noqa: BLE001 - surfaced to caller + with suppress(RuntimeError): + await websocket.close(code=1011, reason=str(exc)) -async def _heartbeat_sender(websocket: WebSocket, cipher: CipherBox, interval: float) -> None: +@app.websocket("/ws/remote") +async def websocket_remote(websocket: WebSocket) -> None: + listener = client = None + sender_task = None + send_queue: asyncio.Queue[bytes | None] | None = None + EVENT_STREAM = None + MAPPING = { + "AnnexB": EVENT_STREAM_ANNEXB, + "fMP4" : EVENT_STREAM_FMP4 + } + # noinspection PyBroadException try: - while True: - payload = { - "type" : "heartbeat", - "timestamp": time.time() - } - await websocket.send_text(cipher.encrypt_json(payload)) - await asyncio.sleep(interval) - except asyncio.CancelledError: - pass - except WebSocketDisconnect: - pass - except RuntimeError: - pass + _, stream = await _perform_business_resume(websocket, channel="remote") + message = await _recv_stream_json(websocket, stream) + config_id = message.get("config_id") + transfer_type = message.get("transfer_type") + EVENT_STREAM = MAPPING[transfer_type] # type: ignore -async def _heartbeat_receiver(websocket: WebSocket, cipher: CipherBox) -> None: - try: - while True: - encrypted = await websocket.receive_text() - message = cipher.decrypt_json(encrypted) - if message.get("type") == "ping": - await websocket.send_text(cipher.encrypt_json({"type": "pong", "timestamp": time.time()})) - except asyncio.CancelledError: - pass - except WebSocketDisconnect: - pass + client = await context.runtime.require_remote_(config_id) + loop = asyncio.get_running_loop() + send_queue = asyncio.Queue(maxsize=8) -@app.websocket("/ws/heartbeat") -async def websocket_heartbeat(websocket: WebSocket) -> None: - sender_task = receiver_task = None - try: - _, cipher = await _perform_handshake(websocket) - sender_task = asyncio.create_task(_heartbeat_sender(websocket, cipher, 3.0)) - receiver_task = asyncio.create_task(_heartbeat_receiver(websocket, cipher)) - await asyncio.gather(sender_task, receiver_task) - except (AuthenticationError, HTTPException) as exc: - await websocket.close(code=4401, reason=str(exc)) - except WebSocketDisconnect: - pass - except Exception as exc: - await websocket.close(code=1011, reason=str(exc)) + async def sender() -> None: + try: + while True: + item = await send_queue.get() # type: ignore + if item is None: + break + await websocket.send_bytes(item) + except WebSocketDisconnect: + pass + + sender_task = asyncio.create_task(sender()) + + def listener(encoded_stream: bytes) -> None: + # noinspection PyBroadException + try: + payload = encoded_stream + # payload = stream.encrypt(encoded_stream) + + def _push() -> None: + assert send_queue is not None + if send_queue.full(): + with suppress(asyncio.QueueEmpty): + send_queue.get_nowait() + with suppress(asyncio.QueueFull): + send_queue.put_nowait(payload) + + loop.call_soon_threadsafe(_push) # type: ignore + except Exception: + import traceback + traceback.print_exc() + + client.add_listener(EVENT_STREAM, listener) + + if not client.alive: + await client.init() + + await client.start(daemon_threaded=True) + + while client.alive and client.has_listener(EVENT_STREAM, listener=listener): + await asyncio.sleep(1.0) + except Exception: + import traceback + + traceback.print_exc() finally: - for task in (sender_task, receiver_task): - if task: - task.cancel() - with contextlib.suppress(asyncio.CancelledError): - await task + if sender_task is not None: + with suppress(Exception): + assert send_queue is not None + await send_queue.put(None) + with suppress(Exception): + await sender_task + if client is not None: + client.remove_listener(EVENT_STREAM, listener) # type: ignore + if (not client.any_listener(EVENT_STREAM_ANNEXB) and # type: ignore + not client.any_listener(EVENT_STREAM_FMP4)): # type: ignore + client.stop() # type: ignore[union-attr] -@app.websocket("/ws/remote") -async def websocket_remote(websocket: WebSocket) -> None: + + +@app.websocket("/ws/remote_test") +async def websocket_remote_test(websocket: WebSocket) -> None: listener = client = None sender_task = None - + send_queue: asyncio.Queue[bytes | None] | None = None + EVENT_STREAM = None + MAPPING = { + "AnnexB": EVENT_STREAM_ANNEXB, + "fMP4" : EVENT_STREAM_FMP4 + } + # noinspection PyBroadException try: - _, cipher = await _perform_handshake(websocket) - encrypted = await websocket.receive_text() - message = cipher.decrypt_json(encrypted) + await websocket.accept() + frame = await websocket.receive_text() + message = json.loads(frame) config_id = message.get("config_id") + transfer_type = message.get("transfer_type") + + EVENT_STREAM = MAPPING[transfer_type] # type: ignore + client = await context.runtime.require_remote_(config_id) loop = asyncio.get_running_loop() - send_queue: asyncio.Queue[str | None] = asyncio.Queue(maxsize=8) + send_queue = asyncio.Queue(maxsize=8) async def sender() -> None: try: while True: - item = await send_queue.get() + item = await send_queue.get() # type: ignore if item is None: break - await websocket.send_text(item) + await websocket.send_bytes(item) except WebSocketDisconnect: pass - except Exception: - import traceback - traceback.print_exc() sender_task = asyncio.create_task(sender()) def listener(encoded_stream: bytes) -> None: + # noinspection PyBroadException try: - payload = cipher.encrypt_bytes(encoded_stream) + payload = encoded_stream + # payload = stream.encrypt(encoded_stream) def _push() -> None: + assert send_queue is not None if send_queue.full(): - # 丢掉最旧帧,避免慢客户端把队列撑爆 with suppress(asyncio.QueueEmpty): send_queue.get_nowait() with suppress(asyncio.QueueFull): send_queue.put_nowait(payload) - loop.call_soon_threadsafe(_push) # type:ignore - + loop.call_soon_threadsafe(_push) # type: ignore except Exception: import traceback traceback.print_exc() @@ -439,22 +689,23 @@ def _push() -> None: while client.alive and client.has_listener(EVENT_STREAM, listener=listener): await asyncio.sleep(1.0) - except Exception: import traceback - traceback.print_exc() + traceback.print_exc() finally: if sender_task is not None: with suppress(Exception): - await send_queue.put(None) # type:ignore + assert send_queue is not None + await send_queue.put(None) with suppress(Exception): await sender_task - if client is not None: client.remove_listener(EVENT_STREAM, listener) # type: ignore - if not client.any_listener(EVENT_STREAM): # type: ignore - client.stop() # type: ignore + + if (not client.any_listener(EVENT_STREAM_ANNEXB) and # type: ignore + not client.any_listener(EVENT_STREAM_FMP4)): # type: ignore + client.stop() # type: ignore[union-attr] app.mount("/", StaticFiles(directory="service/dist", html=True), name="static") diff --git a/service/context.py b/service/context.py index 5c0526306..2322c2cfd 100644 --- a/service/context.py +++ b/service/context.py @@ -6,6 +6,7 @@ from pathlib import Path from typing import Optional +from .encryption import ServiceAuthManager from .config_manager import ConfigManager from .logging import LogManager from .runtime import ServiceRuntime @@ -16,6 +17,7 @@ class ServiceContext: def __init__(self, project_root: Path) -> None: self.project_root = project_root + self.auth_manager = ServiceAuthManager(project_root) self.config_manager = ConfigManager(project_root) self.runtime = ServiceRuntime(project_root) self.log_manager = LogManager() diff --git a/service/dist/assets/highlight-BsptWXP5.js b/service/dist/assets/highlight-BsptWXP5.js deleted file mode 100644 index 04898bf2d..000000000 --- a/service/dist/assets/highlight-BsptWXP5.js +++ /dev/null @@ -1,7 +0,0 @@ -import{g as Wn}from"./motion-Dp9wOFzY.js";function Wr(){}function Yr(){}const mt=(function(e){if(e==null)return Vn;if(typeof e=="function")return Xe(e);if(typeof e=="object")return Array.isArray(e)?Yn(e):Zn(e);if(typeof e=="string")return Xn(e);throw new Error("Expected function, string, or object as test")});function Yn(e){const t=[];let i=-1;for(;++i":""))+")"})}return p;function p(){let f=Zt,N,_,y;if((!t||d(l,c,g[g.length-1]||void 0))&&(f=ti(i(l,g)),f[0]===Dt))return f;if("children"in l&&l.children){const w=l;if(w.children&&f[0]!==jn)for(_=(r?w.children.length:-1)+o,y=g.concat(w);_>-1&&_c&&(c=g):g&&(c!==void 0&&c>-1&&l.push(` -`.repeat(c)||" "),c=-1,l.push(g))}return l.join("")}function Vt(e,t,i){return e.type==="element"?di(e,t,i):e.type==="text"?i.whitespace==="normal"?Qt(e,i):ui(e):[]}function di(e,t,i){const r=Jt(e,i),a=e.children||[];let d=-1,o=[];if(ci(e))return o;let s,l;for(bt(e)||$t(e)&&Bt(t,e,$t)?l=` -`:si(e)?(s=2,l=2):Xt(e)&&(s=1,l=1);++d]+>")+")",s={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},g={className:"number",variants:[{begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"},{begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"}],relevance:0},m={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{className:"string",begin:/<.*?>/},i,e.C_BLOCK_COMMENT_MODE]},p={className:"title",begin:t.optional(a)+e.IDENT_RE,relevance:0},f=t.optional(a)+e.IDENT_RE+"\\s*\\(",N=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],_=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],y=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],w=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],k={type:_,keyword:N,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:y},D={className:"function.dispatch",relevance:0,keywords:{_hint:w},begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))},x=[D,m,s,i,e.C_BLOCK_COMMENT_MODE,g,c],q={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:k,contains:x.concat([{begin:/\(/,end:/\)/,keywords:k,contains:x.concat(["self"]),relevance:0}]),relevance:0},z={className:"function",begin:"("+o+"[\\*&\\s]+)+"+f,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:k,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:k,relevance:0},{begin:f,returnBegin:!0,contains:[p],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[c,g]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:[i,e.C_BLOCK_COMMENT_MODE,c,g,s,{begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:["self",i,e.C_BLOCK_COMMENT_MODE,c,g,s]}]},s,i,e.C_BLOCK_COMMENT_MODE,m]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:k,illegal:"",keywords:k,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:k},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function _i(e){const t={type:["boolean","byte","word","String"],built_in:["KeyboardController","MouseController","SoftwareSerial","EthernetServer","EthernetClient","LiquidCrystal","RobotControl","GSMVoiceCall","EthernetUDP","EsploraTFT","HttpClient","RobotMotor","WiFiClient","GSMScanner","FileSystem","Scheduler","GSMServer","YunClient","YunServer","IPAddress","GSMClient","GSMModem","Keyboard","Ethernet","Console","GSMBand","Esplora","Stepper","Process","WiFiUDP","GSM_SMS","Mailbox","USBHost","Firmata","PImage","Client","Server","GSMPIN","FileIO","Bridge","Serial","EEPROM","Stream","Mouse","Audio","Servo","File","Task","GPRS","WiFi","Wire","TFT","GSM","SPI","SD"],_hints:["setup","loop","runShellCommandAsynchronously","analogWriteResolution","retrieveCallingNumber","printFirmwareVersion","analogReadResolution","sendDigitalPortPair","noListenOnLocalhost","readJoystickButton","setFirmwareVersion","readJoystickSwitch","scrollDisplayRight","getVoiceCallStatus","scrollDisplayLeft","writeMicroseconds","delayMicroseconds","beginTransmission","getSignalStrength","runAsynchronously","getAsynchronously","listenOnLocalhost","getCurrentCarrier","readAccelerometer","messageAvailable","sendDigitalPorts","lineFollowConfig","countryNameWrite","runShellCommand","readStringUntil","rewindDirectory","readTemperature","setClockDivider","readLightSensor","endTransmission","analogReference","detachInterrupt","countryNameRead","attachInterrupt","encryptionType","readBytesUntil","robotNameWrite","readMicrophone","robotNameRead","cityNameWrite","userNameWrite","readJoystickY","readJoystickX","mouseReleased","openNextFile","scanNetworks","noInterrupts","digitalWrite","beginSpeaker","mousePressed","isActionDone","mouseDragged","displayLogos","noAutoscroll","addParameter","remoteNumber","getModifiers","keyboardRead","userNameRead","waitContinue","processInput","parseCommand","printVersion","readNetworks","writeMessage","blinkVersion","cityNameRead","readMessage","setDataMode","parsePacket","isListening","setBitOrder","beginPacket","isDirectory","motorsWrite","drawCompass","digitalRead","clearScreen","serialEvent","rightToLeft","setTextSize","leftToRight","requestFrom","keyReleased","compassRead","analogWrite","interrupts","WiFiServer","disconnect","playMelody","parseFloat","autoscroll","getPINUsed","setPINUsed","setTimeout","sendAnalog","readSlider","analogRead","beginWrite","createChar","motorsStop","keyPressed","tempoWrite","readButton","subnetMask","debugPrint","macAddress","writeGreen","randomSeed","attachGPRS","readString","sendString","remotePort","releaseAll","mouseMoved","background","getXChange","getYChange","answerCall","getResult","voiceCall","endPacket","constrain","getSocket","writeJSON","getButton","available","connected","findUntil","readBytes","exitValue","readGreen","writeBlue","startLoop","IPAddress","isPressed","sendSysex","pauseMode","gatewayIP","setCursor","getOemKey","tuneWrite","noDisplay","loadImage","switchPIN","onRequest","onReceive","changePIN","playFile","noBuffer","parseInt","overflow","checkPIN","knobRead","beginTFT","bitClear","updateIR","bitWrite","position","writeRGB","highByte","writeRed","setSpeed","readBlue","noStroke","remoteIP","transfer","shutdown","hangCall","beginSMS","endWrite","attached","maintain","noCursor","checkReg","checkPUK","shiftOut","isValid","shiftIn","pulseIn","connect","println","localIP","pinMode","getIMEI","display","noBlink","process","getBand","running","beginSD","drawBMP","lowByte","setBand","release","bitRead","prepare","pointTo","readRed","setMode","noFill","remove","listen","stroke","detach","attach","noTone","exists","buffer","height","bitSet","circle","config","cursor","random","IRread","setDNS","endSMS","getKey","micros","millis","begin","print","write","ready","flush","width","isPIN","blink","clear","press","mkdir","rmdir","close","point","yield","image","BSSID","click","delay","read","text","move","peek","beep","rect","line","open","seek","fill","size","turn","stop","home","find","step","tone","sqrt","RSSI","SSID","end","bit","tan","cos","sin","pow","map","abs","max","min","get","run","put"],literal:["DIGITAL_MESSAGE","FIRMATA_STRING","ANALOG_MESSAGE","REPORT_DIGITAL","REPORT_ANALOG","INPUT_PULLUP","SET_PIN_MODE","INTERNAL2V56","SYSTEM_RESET","LED_BUILTIN","INTERNAL1V1","SYSEX_START","INTERNAL","EXTERNAL","DEFAULT","OUTPUT","INPUT","HIGH","LOW"]},i=fi(e),r=i.keywords;return r.type=[...r.type,...t.type],r.literal=[...r.literal,...t.literal],r.built_in=[...r.built_in,...t.built_in],r._hints=t._hints,i.name="Arduino",i.aliases=["ino"],i.supersetOf="cpp",i}function Ei(e){const t=e.regex,i={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[i]}]};Object.assign(i,{className:"variable",variants:[{begin:t.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},d=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),o={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i,a]};a.contains.push(s);const l={match:/\\"/},c={className:"string",begin:/'/,end:/'/},g={match:/\\'/},m={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,i]},p=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],f=e.SHEBANG({binary:`(${p.join("|")})`,relevance:10}),N={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},_=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],y=["true","false"],w={match:/(\/[a-z._-]+)+/},I=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],L=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],k=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],D=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:_,literal:y,built_in:[...I,...L,"set","shopt",...k,...D]},contains:[f,e.SHEBANG(),N,m,d,o,w,s,l,c,g,i]}}function hi(e){const t=e.regex,i=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",a="[a-zA-Z_]\\w*::",o="("+r+"|"+t.optional(a)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{match:/\batomic_[a-z]{3,6}\b/}]},c={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},g={className:"number",variants:[{match:/\b(0b[01']+)/},{match:/(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/},{match:/(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/},{match:/(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/}],relevance:0},m={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{className:"string",begin:/<.*?>/},i,e.C_BLOCK_COMMENT_MODE]},p={className:"title",begin:t.optional(a)+e.IDENT_RE,relevance:0},f=t.optional(a)+e.IDENT_RE+"\\s*\\(",y={keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"],literal:"true false NULL",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"},w=[m,s,i,e.C_BLOCK_COMMENT_MODE,g,c],I={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:y,contains:w.concat([{begin:/\(/,end:/\)/,keywords:y,contains:w.concat(["self"]),relevance:0}]),relevance:0},L={begin:"("+o+"[\\*&\\s]+)+"+f,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:y,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:y,relevance:0},{begin:f,returnBegin:!0,contains:[e.inherit(p,{className:"title.function"})],relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:y,relevance:0,contains:[i,e.C_BLOCK_COMMENT_MODE,c,g,s,{begin:/\(/,end:/\)/,keywords:y,relevance:0,contains:["self",i,e.C_BLOCK_COMMENT_MODE,c,g,s]}]},s,i,e.C_BLOCK_COMMENT_MODE,m]};return{name:"C",aliases:["h"],keywords:y,disableAutodetect:!0,illegal:"=]/,contains:[{beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:m,strings:c,keywords:y}}}function Ni(e){const t=e.regex,i=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",a="[a-zA-Z_]\\w*::",o="(?!struct)("+r+"|"+t.optional(a)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},g={className:"number",variants:[{begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"},{begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"}],relevance:0},m={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{className:"string",begin:/<.*?>/},i,e.C_BLOCK_COMMENT_MODE]},p={className:"title",begin:t.optional(a)+e.IDENT_RE,relevance:0},f=t.optional(a)+e.IDENT_RE+"\\s*\\(",N=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],_=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],y=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],w=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],k={type:_,keyword:N,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:y},D={className:"function.dispatch",relevance:0,keywords:{_hint:w},begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))},x=[D,m,s,i,e.C_BLOCK_COMMENT_MODE,g,c],q={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:k,contains:x.concat([{begin:/\(/,end:/\)/,keywords:k,contains:x.concat(["self"]),relevance:0}]),relevance:0},z={className:"function",begin:"("+o+"[\\*&\\s]+)+"+f,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:k,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:k,relevance:0},{begin:f,returnBegin:!0,contains:[p],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[c,g]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:[i,e.C_BLOCK_COMMENT_MODE,c,g,s,{begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:["self",i,e.C_BLOCK_COMMENT_MODE,c,g,s]}]},s,i,e.C_BLOCK_COMMENT_MODE,m]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:k,illegal:"",keywords:k,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:k},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function yi(e){const t=["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"],i=["public","private","protected","static","internal","protected","abstract","async","extern","override","unsafe","virtual","new","sealed","partial"],r=["default","false","null","true"],a=["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"],d=["add","alias","and","ascending","args","async","await","by","descending","dynamic","equals","file","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","record","remove","required","scoped","select","set","unmanaged","value|0","var","when","where","with","yield"],o={keyword:a.concat(d),built_in:t,literal:r},s=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),l={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},c={className:"string",begin:/"""("*)(?!")(.|\n)*?"""\1/,relevance:1},g={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},m=e.inherit(g,{illegal:/\n/}),p={className:"subst",begin:/\{/,end:/\}/,keywords:o},f=e.inherit(p,{illegal:/\n/}),N={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},e.BACKSLASH_ESCAPE,f]},_={className:"string",begin:/\$@"/,end:'"',contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},p]},y=e.inherit(_,{illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},f]});p.contains=[_,N,g,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,l,e.C_BLOCK_COMMENT_MODE],f.contains=[y,N,m,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,l,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];const w={variants:[c,_,N,g,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},I={begin:"<",end:">",contains:[{beginKeywords:"in out"},s]},L=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",k={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:o,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:""},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},w,l,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},s,I,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[s,I,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+L+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:o,contains:[{beginKeywords:i.join(" "),relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[e.TITLE_MODE,I],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,relevance:0,contains:[w,l,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},k]}}const Ti=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),wi=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Si=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],vi=[...wi,...Si],Ai=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),Oi=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),Ri=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),ki=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function Mi(e){const t=e.regex,i=Ti(e),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},a="and or not only",d=/@-?\w[\w]*(-\w+)*/,o="[a-zA-Z-][a-zA-Z0-9_-]*",s=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[i.BLOCK_COMMENT,r,i.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+o,relevance:0},i.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+Oi.join("|")+")"},{begin:":(:)?("+Ri.join("|")+")"}]},i.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ki.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[i.BLOCK_COMMENT,i.HEXCOLOR,i.IMPORTANT,i.CSS_NUMBER_MODE,...s,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...s,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},i.FUNCTION_DISPATCH]},{begin:t.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:d},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:a,attribute:Ai.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...s,i.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+vi.join("|")+")\\b"}]}}function Ii(e){const t=e.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:t.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:t.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}function xi(e){const d={keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],literal:["true","false","iota","nil"],built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]};return{name:"Go",aliases:["golang"],keywords:d,illegal:"jt(e,t,i-1))}function Di(e){const t=e.regex,i="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",r=i+jt("(?:<"+i+"~~~(?:\\s*,\\s*"+i+"~~~)*>)?",/~~~/g,2),l={keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto","when"],literal:["false","true","null"],type:["char","boolean","long","float","int","byte","short","double"],built_in:["super","this"]},c={className:"meta",begin:"@"+i,contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},g={className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:l,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[e.BACKSLASH_ESCAPE]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,i],className:{1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{begin:[t.concat(/(?!else)/,i),/\s+/,i,/\s+/,/=(?!=)/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,i],className:{1:"keyword",3:"title.class"},contains:[g,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+r+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:l,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[c,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,zt,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},zt,c]}}const Gt="[A-Za-z$_][0-9A-Za-z$_]*",Bi=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],Pi=["true","false","null","undefined","NaN","Infinity"],en=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],tn=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],nn=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Ui=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],Fi=[].concat(nn,en,tn);function $i(e){const t=e.regex,i=(P,{after:j})=>{const ae="",end:""},d=/<[A-Za-z0-9\\._:-]+\s*\/>/,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(P,j)=>{const ae=P[0].length+P.index,ne=P.input[ae];if(ne==="<"||ne===","){j.ignoreMatch();return}ne===">"&&(i(P,{after:ae})||j.ignoreMatch());let ee;const _e=P.input.substring(ae);if(ee=_e.match(/^\s*=/)){j.ignoreMatch();return}if((ee=_e.match(/^\s+extends\s+/))&&ee.index===0){j.ignoreMatch();return}}},s={$pattern:Gt,keyword:Bi,literal:Pi,built_in:Fi,"variable.language":Ui},l="[0-9](_?[0-9])*",c=`\\.(${l})`,g="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",m={className:"number",variants:[{begin:`(\\b(${g})((${c})|\\.)?|(${c}))[eE][+-]?(${l})\\b`},{begin:`\\b(${g})\\b((${c})\\b|\\.)?|(${c})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},p={className:"subst",begin:"\\$\\{",end:"\\}",keywords:s,contains:[]},f={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"xml"}},N={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"css"}},_={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"graphql"}},y={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,p]},I={className:"comment",variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},L=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,f,N,_,y,{match:/\$\d+/},m];p.contains=L.concat({begin:/\{/,end:/\}/,keywords:s,contains:["self"].concat(L)});const k=[].concat(I,p.contains),D=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:s,contains:["self"].concat(k)}]),x={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:D},q={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,"(",t.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},z={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...en,...tn]}},H={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},se={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[x],illegal:/%/},de={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function le(P){return t.concat("(?!",P.join("|"),")")}const ue={match:t.concat(/\b/,le([...nn,"super","import"].map(P=>`${P}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:"title.function",relevance:0},W={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},V={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},x]},re="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",fe={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(re)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[x]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:s,exports:{PARAMS_CONTAINS:D,CLASS_REFERENCE:z},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),H,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,f,N,_,y,I,{match:/\$\d+/},m,z,{scope:"attr",match:r+t.lookahead(":"),relevance:0},fe,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[I,e.REGEXP_MODE,{className:"function",begin:re,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:D}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:d},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0,contains:["self"]}]}]},se,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[x,e.inherit(e.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},W,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[x]},ue,de,q,V,{match:/\$[(.]/}]}}function zi(e){const t={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},i={match:/[{}[\],:]/,className:"punctuation",relevance:0},r=["true","false","null"],a={scope:"literal",beginKeywords:r.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:r},contains:[t,i,e.QUOTE_STRING_MODE,a,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}var Me="[0-9](_*[0-9])*",He=`\\.(${Me})`,qe="[0-9a-fA-F](_*[0-9a-fA-F])*",Gi={className:"number",variants:[{begin:`(\\b(${Me})((${He})|\\.)?|(${He}))[eE][+-]?(${Me})[fFdD]?\\b`},{begin:`\\b(${Me})((${He})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${He})[fFdD]?\\b`},{begin:`\\b(${Me})[fFdD]\\b`},{begin:`\\b0[xX]((${qe})\\.?|(${qe})?\\.(${qe}))[pP][+-]?(${Me})[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${qe})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],relevance:0};function Ki(e){const t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},i={className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},r={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},d={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},o={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[d,a]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,d,a]}]};a.contains.push(o);const s={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(o,{className:"string"}),"self"]}]},c=Gi,g=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),m={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},p=m;return p.variants[1].contains=[m],m.variants[1].contains=[p],{name:"Kotlin",aliases:["kt","kts"],keywords:t,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,g,i,r,s,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:t,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:t,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[m,e.C_LINE_COMMENT_MODE,g],relevance:0},e.C_LINE_COMMENT_MODE,g,s,l,o,e.C_NUMBER_MODE]},g]},{begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/,excludeBegin:!0,returnEnd:!0},s,l]},o,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:` -`},c]}}const Hi=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),qi=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Wi=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],Yi=[...qi,...Wi],Zi=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),rn=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),an=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),Xi=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse(),Vi=rn.concat(an).sort().reverse();function Qi(e){const t=Hi(e),i=Vi,r="and or not only",a="[\\w-]+",d="("+a+"|@\\{"+a+"\\})",o=[],s=[],l=function(L){return{className:"string",begin:"~?"+L+".*?"+L}},c=function(L,k,D){return{className:L,begin:k,relevance:D}},g={$pattern:/[a-z-]+/,keyword:r,attribute:Zi.join(" ")},m={begin:"\\(",end:"\\)",contains:s,keywords:g,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l("'"),l('"'),t.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},t.HEXCOLOR,m,c("variable","@@?"+a,10),c("variable","@\\{"+a+"\\}"),c("built_in","~?`[^`]*?`"),{className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0},t.IMPORTANT,{beginKeywords:"and not"},t.FUNCTION_DISPATCH);const p=s.concat({begin:/\{/,end:/\}/,contains:o}),f={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},N={begin:d+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+Xi.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},_={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",keywords:g,returnEnd:!0,contains:s,relevance:0}},y={className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a}],starts:{end:"[;}]",returnEnd:!0,contains:p}},w={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0,returnEnd:!0,illegal:`[<='$"]`,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,f,c("keyword","all\\b"),c("variable","@\\{"+a+"\\}"),{begin:"\\b("+Yi.join("|")+")\\b",className:"selector-tag"},t.CSS_NUMBER_MODE,c("selector-tag",d,0),c("selector-id","#"+d),c("selector-class","\\."+d,0),c("selector-tag","&",0),t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",begin:":("+rn.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+an.join("|")+")"},{begin:/\(/,end:/\)/,relevance:0,contains:p},{begin:"!important"},t.FUNCTION_DISPATCH]},I={begin:a+`:(:)?(${i.join("|")})`,returnBegin:!0,contains:[w]};return o.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,_,y,I,N,w,f,t.FUNCTION_DISPATCH),{name:"Less",case_insensitive:!0,illegal:`[=>'/<($"]`,contains:o}}function Ji(e){const t="\\[=*\\[",i="\\]=*\\]",r={begin:t,end:i,contains:["self"]},a=[e.COMMENT("--(?!"+t+")","$"),e.COMMENT("--"+t,i,{contains:[r],relevance:10})];return{name:"Lua",aliases:["pluto"],keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:t,end:i,contains:[r],relevance:5}])}}function ji(e){const t={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%",subLanguage:"xml",relevance:0},r={begin:"^[-\\*]{3,}",end:"$"},a={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},d={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},o={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},s=/[A-Za-z][A-Za-z0-9+.-]*/,l={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:t.concat(/\[.+?\]\(/,s,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},c={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},g={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},m=e.inherit(c,{contains:[]}),p=e.inherit(g,{contains:[]});c.contains.push(p),g.contains.push(m);let f=[i,l];return[c,g,m,p].forEach(w=>{w.contains=w.contains.concat(f)}),f=f.concat(c,g),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:f},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:f}]}]},i,d,c,g,{className:"quote",begin:"^>\\s+",contains:f,end:"$"},a,r,l,o,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}function tr(e){const t={className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},i=/[a-zA-Z@][a-zA-Z0-9_]*/,s={"variable.language":["this","super"],$pattern:i,keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"],literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"],built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"],type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"]},l={$pattern:i,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:s,illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+l.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:l,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}function nr(e){const t=e.regex,i=["abs","accept","alarm","and","atan2","bind","binmode","bless","break","caller","chdir","chmod","chomp","chop","chown","chr","chroot","class","close","closedir","connect","continue","cos","crypt","dbmclose","dbmopen","defined","delete","die","do","dump","each","else","elsif","endgrent","endhostent","endnetent","endprotoent","endpwent","endservent","eof","eval","exec","exists","exit","exp","fcntl","field","fileno","flock","for","foreach","fork","format","formline","getc","getgrent","getgrgid","getgrnam","gethostbyaddr","gethostbyname","gethostent","getlogin","getnetbyaddr","getnetbyname","getnetent","getpeername","getpgrp","getpriority","getprotobyname","getprotobynumber","getprotoent","getpwent","getpwnam","getpwuid","getservbyname","getservbyport","getservent","getsockname","getsockopt","given","glob","gmtime","goto","grep","gt","hex","if","index","int","ioctl","join","keys","kill","last","lc","lcfirst","length","link","listen","local","localtime","log","lstat","lt","ma","map","method","mkdir","msgctl","msgget","msgrcv","msgsnd","my","ne","next","no","not","oct","open","opendir","or","ord","our","pack","package","pipe","pop","pos","print","printf","prototype","push","q|0","qq","quotemeta","qw","qx","rand","read","readdir","readline","readlink","readpipe","recv","redo","ref","rename","require","reset","return","reverse","rewinddir","rindex","rmdir","say","scalar","seek","seekdir","select","semctl","semget","semop","send","setgrent","sethostent","setnetent","setpgrp","setpriority","setprotoent","setpwent","setservent","setsockopt","shift","shmctl","shmget","shmread","shmwrite","shutdown","sin","sleep","socket","socketpair","sort","splice","split","sprintf","sqrt","srand","stat","state","study","sub","substr","symlink","syscall","sysopen","sysread","sysseek","system","syswrite","tell","telldir","tie","tied","time","times","tr","truncate","uc","ucfirst","umask","undef","unless","unlink","unpack","unshift","untie","until","use","utime","values","vec","wait","waitpid","wantarray","warn","when","while","write","x|0","xor","y|0"],r=/[dualxmsipngr]{0,12}/,a={$pattern:/[\w.]+/,keyword:i.join(" ")},d={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},o={begin:/->\{/,end:/\}/},s={scope:"attr",match:/\s+:\s*\w+(\s*\(.*?\))?/},l={scope:"variable",variants:[{begin:/\$\d/},{begin:t.concat(/[$%@](?!")(\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@](?!")[^\s\w{=]|\$=/,relevance:0}],contains:[s]},c={className:"number",variants:[{match:/0?\.[0-9][0-9_]+\b/},{match:/\bv?(0|[1-9][0-9_]*(\.[0-9_]+)?|[1-9][0-9_]*)\b/},{match:/\b0[0-7][0-7_]*\b/},{match:/\b0x[0-9a-fA-F][0-9a-fA-F_]*\b/},{match:/\b0b[0-1][0-1_]*\b/}],relevance:0},g=[e.BACKSLASH_ESCAPE,d,l],m=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],p=(_,y,w="\\1")=>{const I=w==="\\1"?w:t.concat(w,y);return t.concat(t.concat("(?:",_,")"),y,/(?:\\.|[^\\\/])*?/,I,/(?:\\.|[^\\\/])*?/,w,r)},f=(_,y,w)=>t.concat(t.concat("(?:",_,")"),y,/(?:\\.|[^\\\/])*?/,w,r),N=[l,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),o,{className:"string",contains:g,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0}]},c,{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:p("s|tr|y",t.either(...m,{capture:!0}))},{begin:p("s|tr|y","\\(","\\)")},{begin:p("s|tr|y","\\[","\\]")},{begin:p("s|tr|y","\\{","\\}")}],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:f("(?:m|qr)?",/\//,/\//)},{begin:f("m|qr",t.either(...m,{capture:!0}),/\1/)},{begin:f("m|qr",/\(/,/\)/)},{begin:f("m|qr",/\[/,/\]/)},{begin:f("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub method",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,s]},{className:"class",beginKeywords:"class",end:"[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,s,c]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return d.contains=N,o.contains=N,{name:"Perl",aliases:["pl","pm"],keywords:a,contains:N}}function ir(e){const t=e.regex,i=/(?![A-Za-z0-9])(?![$])/,r=t.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,i),a=t.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,i),d=t.concat(/[A-Z]+/,i),o={scope:"variable",match:"\\$+"+r},s={scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},l={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},c=e.inherit(e.APOS_STRING_MODE,{illegal:null}),g=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(l)}),m={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(l),"on:begin":(W,V)=>{V.data._beginMatch=W[1]||W[2]},"on:end":(W,V)=>{V.data._beginMatch!==W[1]&&V.ignoreMatch()}},p=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),f=`[ -]`,N={scope:"string",variants:[g,c,m,p]},_={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},y=["false","null","true"],w=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],I=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],k={keyword:w,literal:(W=>{const V=[];return W.forEach(re=>{V.push(re),re.toLowerCase()===re?V.push(re.toUpperCase()):V.push(re.toLowerCase())}),V})(y),built_in:I},D=W=>W.map(V=>V.replace(/\|\d+$/,"")),x={variants:[{match:[/new/,t.concat(f,"+"),t.concat("(?!",D(I).join("\\b|"),"\\b)"),a],scope:{1:"keyword",4:"title.class"}}]},q=t.concat(r,"\\b(?!\\()"),z={variants:[{match:[t.concat(/::/,t.lookahead(/(?!class\b)/)),q],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[a,t.concat(/::/,t.lookahead(/(?!class\b)/)),q],scope:{1:"title.class",3:"variable.constant"}},{match:[a,t.concat("::",t.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[a,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},H={scope:"attr",match:t.concat(r,t.lookahead(":"),t.lookahead(/(?!::)/))},se={relevance:0,begin:/\(/,end:/\)/,keywords:k,contains:[H,o,z,e.C_BLOCK_COMMENT_MODE,N,_,x]},de={relevance:0,match:[/\b/,t.concat("(?!fn\\b|function\\b|",D(w).join("\\b|"),"|",D(I).join("\\b|"),"\\b)"),r,t.concat(f,"*"),t.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[se]};se.contains.push(de);const le=[H,z,e.C_BLOCK_COMMENT_MODE,N,_,x],ue={begin:t.concat(/#\[\s*\\?/,t.either(a,d)),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:y,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:y,keyword:["new","array"]},contains:["self",...le]},...le,{scope:"meta",variants:[{match:a},{match:d}]}]};return{case_insensitive:!1,keywords:k,contains:[ue,e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},s,{scope:"variable.language",match:/\$this\b/},o,de,z,{match:[/const/,/\s/,r],scope:{1:"keyword",3:"variable.constant"}},x,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:k,contains:["self",ue,o,z,e.C_BLOCK_COMMENT_MODE,N,_]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},N,_]}}function rr(e){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}function ar(e){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}function or(e){const t=e.regex,i=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],s={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},l={className:"meta",begin:/^(>>>|\.\.\.) /},c={className:"subst",begin:/\{/,end:/\}/,keywords:s,illegal:/#/},g={begin:/\{\{/,relevance:0},m={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,l],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,l],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,l,g,c]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,l,g,c]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,g,c]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,g,c]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},p="[0-9](_?[0-9])*",f=`(\\b(${p}))?\\.(${p})|\\b(${p})\\.`,N=`\\b|${r.join("|")}`,_={className:"number",relevance:0,variants:[{begin:`(\\b(${p})|(${f}))[eE][+-]?(${p})[jJ]?(?=${N})`},{begin:`(${f})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${N})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${N})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${N})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${N})`},{begin:`\\b(${p})[jJ](?=${N})`}]},y={className:"comment",begin:t.lookahead(/# type:/),end:/$/,keywords:s,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},w={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:["self",l,_,m,e.HASH_COMMENT_MODE]}]};return c.contains=[m,_,l],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:s,illegal:/(<\/|\?)|=>/,contains:[l,_,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},m,y,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,i],scope:{1:"keyword",3:"title.function"},contains:[w]},{variants:[{match:[/\bclass/,/\s+/,i,/\s*/,/\(\s*/,i,/\s*\)/]},{match:[/\bclass/,/\s+/,i]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[_,w,m]}]}}function sr(e){return{aliases:["pycon"],contains:[{className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}function cr(e){const t=e.regex,i=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,r=t.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),a=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,d=t.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:i,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:t.lookahead(t.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:i},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE],variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[a,r]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,r]},{scope:{1:"punctuation",2:"number"},match:[d,r]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,r]}]},{scope:{3:"operator"},match:[i,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:a},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:d},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}function lr(e){const t=e.regex,i="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",r=t.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),a=t.concat(r,/(::\w+)*/),o={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield",...["include","extend","prepend","public","private","protected","raise","throw"]],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},l={begin:"#<",end:">"},c=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],g={className:"subst",begin:/#\{/,end:/\}/,keywords:o},m={className:"string",contains:[e.BACKSLASH_ESCAPE,g],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:t.concat(/<<[-~]?'?/,t.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,g]})]}]},p="[1-9](_?[0-9])*|0",f="[0-9](_?[0-9])*",N={className:"number",relevance:0,variants:[{begin:`\\b(${p})(\\.(${f}))?([eE][+-]?(${f})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},_={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:o}]},x=[m,{variants:[{match:[/class\s+/,a,/\s+<\s+/,a]},{match:[/\b(class|module)\s+/,a]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:o},{match:[/(include|extend)\s+/,a],scope:{2:"title.class"},keywords:o},{relevance:0,match:[a,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:r,scope:"title.class"},{match:[/def/,/\s+/,i],scope:{1:"keyword",3:"title.function"},contains:[_]},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[m,{begin:i}],relevance:0},N,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|(?!=)/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:o},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,g],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(l,c),relevance:0}].concat(l,c);g.contains=x,_.contains=x;const se=[{begin:/^\s*=>/,starts:{end:"$",contains:x}},{className:"meta.prompt",begin:"^("+"[>?]>"+"|"+"[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"+"|"+"(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"+")(?=[ ])",starts:{end:"$",keywords:o,contains:x}}];return c.unshift(l),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:o,illegal:/\/\*/,contains:[e.SHEBANG({binary:"ruby"})].concat(se).concat(c).concat(x)}}function dr(e){const t=e.regex,i=/(r#)?/,r=t.concat(i,e.UNDERSCORE_IDENT_RE),a=t.concat(i,e.IDENT_RE),d={className:"title.function.invoke",relevance:0,begin:t.concat(/\b/,/(?!let|for|while|if|else|match\b)/,a,t.lookahead(/\s*\(/))},o="([ui](8|16|32|64|128|size)|f(32|64))?",s=["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"],l=["true","false","Some","None","Ok","Err"],c=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],g=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"];return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:g,keyword:s,literal:l,built_in:c},illegal:""},d]}}const ur=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),gr=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],pr=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],br=[...gr,...pr],mr=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),fr=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),_r=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),Er=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function hr(e){const t=ur(e),i=_r,r=fr,a="@[a-z-]+",d="and or not only",s={className:"variable",begin:"(\\$"+"[a-zA-Z-][a-zA-Z0-9_-]*"+")\\b",relevance:0};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t.CSS_NUMBER_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+br.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+r.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+i.join("|")+")"},s,{begin:/\(/,end:/\)/,contains:[t.CSS_NUMBER_MODE]},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+Er.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:/:/,end:/[;}{]/,relevance:0,contains:[t.BLOCK_COMMENT,s,t.HEXCOLOR,t.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,t.IMPORTANT,t.FUNCTION_DISPATCH]},{begin:"@(page|font-face)",keywords:{$pattern:a,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:d,attribute:mr.join(" ")},contains:[{begin:a,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},s,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,t.HEXCOLOR,t.CSS_NUMBER_MODE]},t.FUNCTION_DISPATCH]}}function Nr(e){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}function yr(e){const t=e.regex,i=e.COMMENT("--","$"),r={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},a={begin:/"/,end:/"/,contains:[{match:/""/}]},d=["true","false","unknown"],o=["double precision","large object","with timezone","without timezone"],s=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],l=["add","asc","collation","desc","final","first","last","view"],c=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],g=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],m=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],p=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],f=g,N=[...c,...l].filter(D=>!g.includes(D)),_={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},y={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},w={match:t.concat(/\b/,t.either(...f),/\s*\(/),relevance:0,keywords:{built_in:f}};function I(D){return t.concat(/\b/,t.either(...D.map(x=>x.replace(/\s+/,"\\s+"))),/\b/)}const L={scope:"keyword",match:I(p),relevance:0};function k(D,{exceptions:x,when:q}={}){const z=q;return x=x||[],D.map(H=>H.match(/\|\d+$/)||x.includes(H)?H:z(H)?`${H}|0`:H)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:k(N,{when:D=>D.length<3}),literal:d,type:s,built_in:m},contains:[{scope:"type",match:I(o)},L,w,_,r,a,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,i,y]}}function on(e){return e?typeof e=="string"?e:e.source:null}function Ce(e){return $("(?=",e,")")}function $(...e){return e.map(i=>on(i)).join("")}function Tr(e){const t=e[e.length-1];return typeof t=="object"&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function oe(...e){return"("+(Tr(e).capture?"":"?:")+e.map(r=>on(r)).join("|")+")"}const _t=e=>$(/\b/,e,/\w$/.test(e)?/\b/:/\B/),wr=["Protocol","Type"].map(_t),Kt=["init","self"].map(_t),Sr=["Any","Self"],ut=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","package","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Ht=["false","nil","true"],vr=["assignment","associativity","higherThan","left","lowerThan","none","right"],Ar=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],qt=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],sn=oe(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),cn=oe(sn,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),gt=$(sn,cn,"*"),ln=oe(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),Ye=oe(ln,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),me=$(ln,Ye,"*"),We=$(/[A-Z]/,Ye,"*"),Or=["attached","autoclosure",$(/convention\(/,oe("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",$(/objc\(/,me,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Rr=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"];function kr(e){const t={match:/\s+/,relevance:0},i=e.COMMENT("/\\*","\\*/",{contains:["self"]}),r=[e.C_LINE_COMMENT_MODE,i],a={match:[/\./,oe(...wr,...Kt)],className:{2:"keyword"}},d={match:$(/\./,oe(...ut)),relevance:0},o=ut.filter(F=>typeof F=="string").concat(["_|0"]),s=ut.filter(F=>typeof F!="string").concat(Sr).map(_t),l={variants:[{className:"keyword",match:oe(...s,...Kt)}]},c={$pattern:oe(/\b\w+/,/#\w+/),keyword:o.concat(Ar),literal:Ht},g=[a,d,l],m={match:$(/\./,oe(...qt)),relevance:0},p={className:"built_in",match:$(/\b/,oe(...qt),/(?=\()/)},f=[m,p],N={match:/->/,relevance:0},_={className:"operator",relevance:0,variants:[{match:gt},{match:`\\.(\\.|${cn})+`}]},y=[N,_],w="([0-9]_*)+",I="([0-9a-fA-F]_*)+",L={className:"number",relevance:0,variants:[{match:`\\b(${w})(\\.(${w}))?([eE][+-]?(${w}))?\\b`},{match:`\\b0x(${I})(\\.(${I}))?([pP][+-]?(${w}))?\\b`},{match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},k=(F="")=>({className:"subst",variants:[{match:$(/\\/,F,/[0\\tnr"']/)},{match:$(/\\/,F,/u\{[0-9a-fA-F]{1,8}\}/)}]}),D=(F="")=>({className:"subst",match:$(/\\/,F,/[\t ]*(?:[\r\n]|\r\n)/)}),x=(F="")=>({className:"subst",label:"interpol",begin:$(/\\/,F,/\(/),end:/\)/}),q=(F="")=>({begin:$(F,/"""/),end:$(/"""/,F),contains:[k(F),D(F),x(F)]}),z=(F="")=>({begin:$(F,/"/),end:$(/"/,F),contains:[k(F),x(F)]}),H={className:"string",variants:[q(),q("#"),q("##"),q("###"),z(),z("#"),z("##"),z("###")]},se=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}],de={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//,contains:se},le=F=>{const Ae=$(F,/\//),ye=$(/\//,F);return{begin:Ae,end:ye,contains:[...se,{scope:"comment",begin:`#(?!.*${ye})`,end:/$/}]}},ue={scope:"regexp",variants:[le("###"),le("##"),le("#"),de]},W={match:$(/`/,me,/`/)},V={className:"variable",match:/\$\d+/},re={className:"variable",match:`\\$${Ye}+`},fe=[W,V,re],P={match:/(@|#(un)?)available/,scope:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:Rr,contains:[...y,L,H]}]}},j={scope:"keyword",match:$(/@/,oe(...Or),Ce(oe(/\(/,/\s+/)))},ae={scope:"meta",match:$(/@/,me)},ne=[P,j,ae],ee={match:Ce(/\b[A-Z]/),relevance:0,contains:[{className:"type",match:$(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Ye,"+")},{className:"type",match:We,relevance:0},{match:/[?!]+/,relevance:0},{match:/\.\.\./,relevance:0},{match:$(/\s+&\s+/,Ce(We)),relevance:0}]},_e={begin://,keywords:c,contains:[...r,...g,...ne,N,ee]};ee.contains.push(_e);const Ve={match:$(me,/\s*:/),keywords:"_|0",relevance:0},Le={begin:/\(/,end:/\)/,relevance:0,keywords:c,contains:["self",Ve,...r,ue,...g,...f,...y,L,H,...fe,...ne,ee]},Ie={begin://,keywords:"repeat each",contains:[...r,ee]},Qe={begin:oe(Ce($(me,/\s*:/)),Ce($(me,/\s+/,me,/\s*:/))),end:/:/,relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:me}]},De={begin:/\(/,end:/\)/,keywords:c,contains:[Qe,...r,...g,...y,L,H,...ne,ee,Le],endsParent:!0,illegal:/["']/},Et={match:[/(func|macro)/,/\s+/,oe(W.match,me,gt)],className:{1:"keyword",3:"title.function"},contains:[Ie,De,t],illegal:[/\[/,/%/]},ve={match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},contains:[Ie,De,t],illegal:/\[|%/},Je={match:[/operator/,/\s+/,gt],className:{1:"keyword",3:"title"}},je={begin:[/precedencegroup/,/\s+/,We],className:{1:"keyword",3:"title"},contains:[ee],keywords:[...vr,...Ht],end:/}/},et={match:[/class\b/,/\s+/,/func\b/,/\s+/,/\b[A-Za-z_][A-Za-z0-9_]*\b/],scope:{1:"keyword",3:"keyword",5:"title.function"}},tt={match:[/class\b/,/\s+/,/var\b/],scope:{1:"keyword",3:"keyword"}},nt={begin:[/(struct|protocol|class|extension|enum|actor)/,/\s+/,me,/\s*/],beginScope:{1:"keyword",3:"title.class"},keywords:c,contains:[Ie,...g,{begin:/:/,end:/\{/,keywords:c,contains:[{scope:"title.class.inherited",match:We},...g],relevance:0}]};for(const F of H.variants){const Ae=F.contains.find(it=>it.label==="interpol");Ae.keywords=c;const ye=[...g,...f,...y,L,H,...fe];Ae.contains=[...ye,{begin:/\(/,end:/\)/,contains:["self",...ye]}]}return{name:"Swift",keywords:c,contains:[...r,Et,ve,et,tt,nt,Je,je,{beginKeywords:"import",end:/$/,contains:[...r],relevance:0},ue,...g,...f,...y,L,H,...fe,...ne,ee,Le]}}const Ze="[A-Za-z$_][0-9A-Za-z$_]*",dn=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],un=["true","false","null","undefined","NaN","Infinity"],gn=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],pn=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],bn=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],mn=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],fn=[].concat(bn,gn,pn);function Mr(e){const t=e.regex,i=(P,{after:j})=>{const ae="",end:""},d=/<[A-Za-z0-9\\._:-]+\s*\/>/,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(P,j)=>{const ae=P[0].length+P.index,ne=P.input[ae];if(ne==="<"||ne===","){j.ignoreMatch();return}ne===">"&&(i(P,{after:ae})||j.ignoreMatch());let ee;const _e=P.input.substring(ae);if(ee=_e.match(/^\s*=/)){j.ignoreMatch();return}if((ee=_e.match(/^\s+extends\s+/))&&ee.index===0){j.ignoreMatch();return}}},s={$pattern:Ze,keyword:dn,literal:un,built_in:fn,"variable.language":mn},l="[0-9](_?[0-9])*",c=`\\.(${l})`,g="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",m={className:"number",variants:[{begin:`(\\b(${g})((${c})|\\.)?|(${c}))[eE][+-]?(${l})\\b`},{begin:`\\b(${g})\\b((${c})\\b|\\.)?|(${c})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},p={className:"subst",begin:"\\$\\{",end:"\\}",keywords:s,contains:[]},f={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"xml"}},N={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"css"}},_={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,p],subLanguage:"graphql"}},y={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,p]},I={className:"comment",variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},L=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,f,N,_,y,{match:/\$\d+/},m];p.contains=L.concat({begin:/\{/,end:/\}/,keywords:s,contains:["self"].concat(L)});const k=[].concat(I,p.contains),D=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:s,contains:["self"].concat(k)}]),x={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:D},q={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,"(",t.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},z={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...gn,...pn]}},H={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},se={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[x],illegal:/%/},de={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function le(P){return t.concat("(?!",P.join("|"),")")}const ue={match:t.concat(/\b/,le([...bn,"super","import"].map(P=>`${P}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:"title.function",relevance:0},W={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},V={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},x]},re="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",fe={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(re)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[x]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:s,exports:{PARAMS_CONTAINS:D,CLASS_REFERENCE:z},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),H,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,f,N,_,y,I,{match:/\$\d+/},m,z,{scope:"attr",match:r+t.lookahead(":"),relevance:0},fe,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[I,e.REGEXP_MODE,{className:"function",begin:re,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:D}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:d},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0,contains:["self"]}]}]},se,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[x,e.inherit(e.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},W,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[x]},ue,de,q,V,{match:/\$[(.]/}]}}function Ir(e){const t=e.regex,i=Mr(e),r=Ze,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],d={begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},o={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a},contains:[i.exports.CLASS_REFERENCE]},s={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},l=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],c={$pattern:Ze,keyword:dn.concat(l),literal:un,built_in:fn.concat(a),"variable.language":mn},g={className:"meta",begin:"@"+r},m=(_,y,w)=>{const I=_.contains.findIndex(L=>L.label===y);if(I===-1)throw new Error("can not find mode to replace");_.contains.splice(I,1,w)};Object.assign(i.keywords,c),i.exports.PARAMS_CONTAINS.push(g);const p=i.contains.find(_=>_.scope==="attr"),f=Object.assign({},p,{match:t.concat(r,t.lookahead(/\s*\?:/))});i.exports.PARAMS_CONTAINS.push([i.exports.CLASS_REFERENCE,p,f]),i.contains=i.contains.concat([g,d,o,f]),m(i,"shebang",e.SHEBANG()),m(i,"use_strict",s);const N=i.contains.find(_=>_.label==="func.def");return N.relevance=0,Object.assign(i,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),i}function xr(e){const t=e.regex,i={className:"string",begin:/"(""|[^/n])"C\b/},r={className:"string",begin:/"/,end:/"/,illegal:/\n/,contains:[{begin:/""/}]},a=/\d{1,2}\/\d{1,2}\/\d{4}/,d=/\d{4}-\d{1,2}-\d{1,2}/,o=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,s=/\d{1,2}(:\d{1,2}){1,2}/,l={className:"literal",variants:[{begin:t.concat(/# */,t.either(d,a),/ *#/)},{begin:t.concat(/# */,s,/ *#/)},{begin:t.concat(/# */,o,/ *#/)},{begin:t.concat(/# */,t.either(d,a),/ +/,t.either(o,s),/ *#/)}]},c={className:"number",relevance:0,variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},g={className:"label",begin:/^\w+:/},m=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]}),p=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield",built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",literal:"true false nothing"},illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[i,r,l,c,g,m,p,{className:"meta",begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,end:/$/,keywords:{keyword:"const disable else elseif enable end externalsource if region then"},contains:[p]}]}}function Cr(e){e.regex;const t=e.COMMENT(/\(;/,/;\)/);t.contains.push("self");const i=e.COMMENT(/;;/,/$/),r=["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"],a={begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword",3:"title.function"}},d={className:"variable",begin:/\$[\w_]+/},o={match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},s={className:"number",relevance:0,match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/},l={match:/(i32|i64|f32|f64)(?!\.)/,className:"type"},c={className:"keyword",match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/};return{name:"WebAssembly",keywords:{$pattern:/[\w.]+/,keyword:r},contains:[i,t,{match:[/(?:offset|align)/,/\s*/,/=/],className:{1:"keyword",3:"operator"}},d,o,a,e.QUOTE_STRING_MODE,l,c,s]}}function Lr(e){const t=e.regex,i=t.concat(/[\p{L}_]/u,t.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,a={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},d={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},o=e.inherit(d,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),c={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[d,l,s,o,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[d,o,l,s]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[c],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[c],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:t.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:i,relevance:0,starts:c}]},{className:"tag",begin:t.concat(/<\//,t.lookahead(t.concat(i,/>/))),contains:[{className:"name",begin:i,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function Dr(e){const t="true false yes no null",i="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},a={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},d={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},o={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,a]},s=e.inherit(o,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),p={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},f={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},N={begin:/\{/,end:/\}/,contains:[f],illegal:"\\n",relevance:0},_={begin:"\\[",end:"\\]",contains:[f],illegal:"\\n",relevance:0},y=[r,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+i},{className:"type",begin:"!<"+i+">"},{className:"type",begin:"!"+i},{className:"type",begin:"!!"+i},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},p,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},N,_,d,o],w=[...y];return w.pop(),w.push(s),f.contains=w,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:y}}const Br={arduino:_i,bash:Ei,c:hi,cpp:Ni,csharp:yi,css:Mi,diff:Ii,go:xi,graphql:Ci,ini:Li,java:Di,javascript:$i,json:zi,kotlin:Ki,less:Qi,lua:Ji,makefile:ji,markdown:er,objectivec:tr,perl:nr,php:ir,"php-template":rr,plaintext:ar,python:or,"python-repl":sr,r:cr,ruby:lr,rust:dr,scss:hr,shell:Nr,sql:yr,swift:kr,typescript:Ir,vbnet:xr,wasm:Cr,xml:Lr,yaml:Dr};var pt,Wt;function Pr(){if(Wt)return pt;Wt=1;function e(n){return n instanceof Map?n.clear=n.delete=n.set=function(){throw new Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=function(){throw new Error("set is read-only")}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach(u=>{const E=n[u],R=typeof E;(R==="object"||R==="function")&&!Object.isFrozen(E)&&e(E)}),n}class t{constructor(u){u.data===void 0&&(u.data={}),this.data=u.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function i(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(n,...u){const E=Object.create(null);for(const R in n)E[R]=n[R];return u.forEach(function(R){for(const Y in R)E[Y]=R[Y]}),E}const a="",d=n=>!!n.scope,o=(n,{prefix:u})=>{if(n.startsWith("language:"))return n.replace("language:","language-");if(n.includes(".")){const E=n.split(".");return[`${u}${E.shift()}`,...E.map((R,Y)=>`${R}${"_".repeat(Y+1)}`)].join(" ")}return`${u}${n}`};class s{constructor(u,E){this.buffer="",this.classPrefix=E.classPrefix,u.walk(this)}addText(u){this.buffer+=i(u)}openNode(u){if(!d(u))return;const E=o(u.scope,{prefix:this.classPrefix});this.span(E)}closeNode(u){d(u)&&(this.buffer+=a)}value(){return this.buffer}span(u){this.buffer+=``}}const l=(n={})=>{const u={children:[]};return Object.assign(u,n),u};class c{constructor(){this.rootNode=l(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(u){this.top.children.push(u)}openNode(u){const E=l({scope:u});this.add(E),this.stack.push(E)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(u){return this.constructor._walk(u,this.rootNode)}static _walk(u,E){return typeof E=="string"?u.addText(E):E.children&&(u.openNode(E),E.children.forEach(R=>this._walk(u,R)),u.closeNode(E)),u}static _collapse(u){typeof u!="string"&&u.children&&(u.children.every(E=>typeof E=="string")?u.children=[u.children.join("")]:u.children.forEach(E=>{c._collapse(E)}))}}class g extends c{constructor(u){super(),this.options=u}addText(u){u!==""&&this.add(u)}startScope(u){this.openNode(u)}endScope(){this.closeNode()}__addSublanguage(u,E){const R=u.root;E&&(R.scope=`language:${E}`),this.add(R)}toHTML(){return new s(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function m(n){return n?typeof n=="string"?n:n.source:null}function p(n){return _("(?=",n,")")}function f(n){return _("(?:",n,")*")}function N(n){return _("(?:",n,")?")}function _(...n){return n.map(E=>m(E)).join("")}function y(n){const u=n[n.length-1];return typeof u=="object"&&u.constructor===Object?(n.splice(n.length-1,1),u):{}}function w(...n){return"("+(y(n).capture?"":"?:")+n.map(R=>m(R)).join("|")+")"}function I(n){return new RegExp(n.toString()+"|").exec("").length-1}function L(n,u){const E=n&&n.exec(u);return E&&E.index===0}const k=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function D(n,{joinWith:u}){let E=0;return n.map(R=>{E+=1;const Y=E;let Z=m(R),S="";for(;Z.length>0;){const T=k.exec(Z);if(!T){S+=Z;break}S+=Z.substring(0,T.index),Z=Z.substring(T.index+T[0].length),T[0][0]==="\\"&&T[1]?S+="\\"+String(Number(T[1])+Y):(S+=T[0],T[0]==="("&&E++)}return S}).map(R=>`(${R})`).join(u)}const x=/\b\B/,q="[a-zA-Z]\\w*",z="[a-zA-Z_]\\w*",H="\\b\\d+(\\.\\d+)?",se="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",de="\\b(0b[01]+)",le="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",ue=(n={})=>{const u=/^#![ ]*\//;return n.binary&&(n.begin=_(u,/.*\b/,n.binary,/\b.*/)),r({scope:"meta",begin:u,end:/$/,relevance:0,"on:begin":(E,R)=>{E.index!==0&&R.ignoreMatch()}},n)},W={begin:"\\\\[\\s\\S]",relevance:0},V={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[W]},re={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[W]},fe={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},P=function(n,u,E={}){const R=r({scope:"comment",begin:n,end:u,contains:[]},E);R.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const Y=w("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return R.contains.push({begin:_(/[ ]+/,"(",Y,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),R},j=P("//","$"),ae=P("/\\*","\\*/"),ne=P("#","$"),ee={scope:"number",begin:H,relevance:0},_e={scope:"number",begin:se,relevance:0},Ve={scope:"number",begin:de,relevance:0},Le={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[W,{begin:/\[/,end:/\]/,relevance:0,contains:[W]}]},Ie={scope:"title",begin:q,relevance:0},Qe={scope:"title",begin:z,relevance:0},De={begin:"\\.\\s*"+z,relevance:0};var ve=Object.freeze({__proto__:null,APOS_STRING_MODE:V,BACKSLASH_ESCAPE:W,BINARY_NUMBER_MODE:Ve,BINARY_NUMBER_RE:de,COMMENT:P,C_BLOCK_COMMENT_MODE:ae,C_LINE_COMMENT_MODE:j,C_NUMBER_MODE:_e,C_NUMBER_RE:se,END_SAME_AS_BEGIN:function(n){return Object.assign(n,{"on:begin":(u,E)=>{E.data._beginMatch=u[1]},"on:end":(u,E)=>{E.data._beginMatch!==u[1]&&E.ignoreMatch()}})},HASH_COMMENT_MODE:ne,IDENT_RE:q,MATCH_NOTHING_RE:x,METHOD_GUARD:De,NUMBER_MODE:ee,NUMBER_RE:H,PHRASAL_WORDS_MODE:fe,QUOTE_STRING_MODE:re,REGEXP_MODE:Le,RE_STARTERS_RE:le,SHEBANG:ue,TITLE_MODE:Ie,UNDERSCORE_IDENT_RE:z,UNDERSCORE_TITLE_MODE:Qe});function Je(n,u){n.input[n.index-1]==="."&&u.ignoreMatch()}function je(n,u){n.className!==void 0&&(n.scope=n.className,delete n.className)}function et(n,u){u&&n.beginKeywords&&(n.begin="\\b("+n.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",n.__beforeBegin=Je,n.keywords=n.keywords||n.beginKeywords,delete n.beginKeywords,n.relevance===void 0&&(n.relevance=0))}function tt(n,u){Array.isArray(n.illegal)&&(n.illegal=w(...n.illegal))}function nt(n,u){if(n.match){if(n.begin||n.end)throw new Error("begin & end are not supported with match");n.begin=n.match,delete n.match}}function F(n,u){n.relevance===void 0&&(n.relevance=1)}const Ae=(n,u)=>{if(!n.beforeMatch)return;if(n.starts)throw new Error("beforeMatch cannot be used with starts");const E=Object.assign({},n);Object.keys(n).forEach(R=>{delete n[R]}),n.keywords=E.keywords,n.begin=_(E.beforeMatch,p(E.begin)),n.starts={relevance:0,contains:[Object.assign(E,{endsParent:!0})]},n.relevance=0,delete E.beforeMatch},ye=["of","and","for","in","not","or","if","then","parent","list","value"],it="keyword";function ht(n,u,E=it){const R=Object.create(null);return typeof n=="string"?Y(E,n.split(" ")):Array.isArray(n)?Y(E,n):Object.keys(n).forEach(function(Z){Object.assign(R,ht(n[Z],u,Z))}),R;function Y(Z,S){u&&(S=S.map(T=>T.toLowerCase())),S.forEach(function(T){const O=T.split("|");R[O[0]]=[Z,_n(O[0],O[1])]})}}function _n(n,u){return u?Number(u):En(n)?0:1}function En(n){return ye.includes(n.toLowerCase())}const Nt={},Te=n=>{console.error(n)},yt=(n,...u)=>{console.log(`WARN: ${n}`,...u)},Oe=(n,u)=>{Nt[`${n}/${u}`]||(console.log(`Deprecated as of ${n}. ${u}`),Nt[`${n}/${u}`]=!0)},Be=new Error;function Tt(n,u,{key:E}){let R=0;const Y=n[E],Z={},S={};for(let T=1;T<=u.length;T++)S[T+R]=Y[T],Z[T+R]=!0,R+=I(u[T-1]);n[E]=S,n[E]._emit=Z,n[E]._multi=!0}function hn(n){if(Array.isArray(n.begin)){if(n.skip||n.excludeBegin||n.returnBegin)throw Te("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),Be;if(typeof n.beginScope!="object"||n.beginScope===null)throw Te("beginScope must be object"),Be;Tt(n,n.begin,{key:"beginScope"}),n.begin=D(n.begin,{joinWith:""})}}function Nn(n){if(Array.isArray(n.end)){if(n.skip||n.excludeEnd||n.returnEnd)throw Te("skip, excludeEnd, returnEnd not compatible with endScope: {}"),Be;if(typeof n.endScope!="object"||n.endScope===null)throw Te("endScope must be object"),Be;Tt(n,n.end,{key:"endScope"}),n.end=D(n.end,{joinWith:""})}}function yn(n){n.scope&&typeof n.scope=="object"&&n.scope!==null&&(n.beginScope=n.scope,delete n.scope)}function Tn(n){yn(n),typeof n.beginScope=="string"&&(n.beginScope={_wrap:n.beginScope}),typeof n.endScope=="string"&&(n.endScope={_wrap:n.endScope}),hn(n),Nn(n)}function wn(n){function u(S,T){return new RegExp(m(S),"m"+(n.case_insensitive?"i":"")+(n.unicodeRegex?"u":"")+(T?"g":""))}class E{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(T,O){O.position=this.position++,this.matchIndexes[this.matchAt]=O,this.regexes.push([O,T]),this.matchAt+=I(T)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const T=this.regexes.map(O=>O[1]);this.matcherRe=u(D(T,{joinWith:"|"}),!0),this.lastIndex=0}exec(T){this.matcherRe.lastIndex=this.lastIndex;const O=this.matcherRe.exec(T);if(!O)return null;const J=O.findIndex((xe,at)=>at>0&&xe!==void 0),X=this.matchIndexes[J];return O.splice(0,J),Object.assign(O,X)}}class R{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(T){if(this.multiRegexes[T])return this.multiRegexes[T];const O=new E;return this.rules.slice(T).forEach(([J,X])=>O.addRule(J,X)),O.compile(),this.multiRegexes[T]=O,O}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(T,O){this.rules.push([T,O]),O.type==="begin"&&this.count++}exec(T){const O=this.getMatcher(this.regexIndex);O.lastIndex=this.lastIndex;let J=O.exec(T);if(this.resumingScanAtSamePosition()&&!(J&&J.index===this.lastIndex)){const X=this.getMatcher(0);X.lastIndex=this.lastIndex+1,J=X.exec(T)}return J&&(this.regexIndex+=J.position+1,this.regexIndex===this.count&&this.considerAll()),J}}function Y(S){const T=new R;return S.contains.forEach(O=>T.addRule(O.begin,{rule:O,type:"begin"})),S.terminatorEnd&&T.addRule(S.terminatorEnd,{type:"end"}),S.illegal&&T.addRule(S.illegal,{type:"illegal"}),T}function Z(S,T){const O=S;if(S.isCompiled)return O;[je,nt,Tn,Ae].forEach(X=>X(S,T)),n.compilerExtensions.forEach(X=>X(S,T)),S.__beforeBegin=null,[et,tt,F].forEach(X=>X(S,T)),S.isCompiled=!0;let J=null;return typeof S.keywords=="object"&&S.keywords.$pattern&&(S.keywords=Object.assign({},S.keywords),J=S.keywords.$pattern,delete S.keywords.$pattern),J=J||/\w+/,S.keywords&&(S.keywords=ht(S.keywords,n.case_insensitive)),O.keywordPatternRe=u(J,!0),T&&(S.begin||(S.begin=/\B|\b/),O.beginRe=u(O.begin),!S.end&&!S.endsWithParent&&(S.end=/\B|\b/),S.end&&(O.endRe=u(O.end)),O.terminatorEnd=m(O.end)||"",S.endsWithParent&&T.terminatorEnd&&(O.terminatorEnd+=(S.end?"|":"")+T.terminatorEnd)),S.illegal&&(O.illegalRe=u(S.illegal)),S.contains||(S.contains=[]),S.contains=[].concat(...S.contains.map(function(X){return Sn(X==="self"?S:X)})),S.contains.forEach(function(X){Z(X,O)}),S.starts&&Z(S.starts,T),O.matcher=Y(O),O}if(n.compilerExtensions||(n.compilerExtensions=[]),n.contains&&n.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return n.classNameAliases=r(n.classNameAliases||{}),Z(n)}function wt(n){return n?n.endsWithParent||wt(n.starts):!1}function Sn(n){return n.variants&&!n.cachedVariants&&(n.cachedVariants=n.variants.map(function(u){return r(n,{variants:null},u)})),n.cachedVariants?n.cachedVariants:wt(n)?r(n,{starts:n.starts?r(n.starts):null}):Object.isFrozen(n)?r(n):n}var vn="11.11.1";class An extends Error{constructor(u,E){super(u),this.name="HTMLInjectionError",this.html=E}}const rt=i,St=r,vt=Symbol("nomatch"),On=7,At=function(n){const u=Object.create(null),E=Object.create(null),R=[];let Y=!0;const Z="Could not find the language '{}', did you forget to load/include a language module?",S={disableAutodetect:!0,name:"Plain text",contains:[]};let T={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:g};function O(b){return T.noHighlightRe.test(b)}function J(b){let A=b.className+" ";A+=b.parentNode?b.parentNode.className:"";const B=T.languageDetectRe.exec(A);if(B){const G=he(B[1]);return G||(yt(Z.replace("{}",B[1])),yt("Falling back to no-highlight mode for this block.",b)),G?B[1]:"no-highlight"}return A.split(/\s+/).find(G=>O(G)||he(G))}function X(b,A,B){let G="",Q="";typeof A=="object"?(G=b,B=A.ignoreIllegals,Q=A.language):(Oe("10.7.0","highlight(lang, code, ...args) has been deprecated."),Oe("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),Q=b,G=A),B===void 0&&(B=!0);const ge={code:G,language:Q};Ue("before:highlight",ge);const Ne=ge.result?ge.result:xe(ge.language,ge.code,B);return Ne.code=ge.code,Ue("after:highlight",Ne),Ne}function xe(b,A,B,G){const Q=Object.create(null);function ge(h,v){return h.keywords[v]}function Ne(){if(!M.keywords){te.addText(K);return}let h=0;M.keywordPatternRe.lastIndex=0;let v=M.keywordPatternRe.exec(K),C="";for(;v;){C+=K.substring(h,v.index);const U=be.case_insensitive?v[0].toLowerCase():v[0],ie=ge(M,U);if(ie){const[Ee,Hn]=ie;if(te.addText(C),C="",Q[U]=(Q[U]||0)+1,Q[U]<=On&&(ze+=Hn),Ee.startsWith("_"))C+=v[0];else{const qn=be.classNameAliases[Ee]||Ee;pe(v[0],qn)}}else C+=v[0];h=M.keywordPatternRe.lastIndex,v=M.keywordPatternRe.exec(K)}C+=K.substring(h),te.addText(C)}function Fe(){if(K==="")return;let h=null;if(typeof M.subLanguage=="string"){if(!u[M.subLanguage]){te.addText(K);return}h=xe(M.subLanguage,K,!0,Lt[M.subLanguage]),Lt[M.subLanguage]=h._top}else h=ot(K,M.subLanguage.length?M.subLanguage:null);M.relevance>0&&(ze+=h.relevance),te.__addSublanguage(h._emitter,h.language)}function ce(){M.subLanguage!=null?Fe():Ne(),K=""}function pe(h,v){h!==""&&(te.startScope(v),te.addText(h),te.endScope())}function Mt(h,v){let C=1;const U=v.length-1;for(;C<=U;){if(!h._emit[C]){C++;continue}const ie=be.classNameAliases[h[C]]||h[C],Ee=v[C];ie?pe(Ee,ie):(K=Ee,Ne(),K=""),C++}}function It(h,v){return h.scope&&typeof h.scope=="string"&&te.openNode(be.classNameAliases[h.scope]||h.scope),h.beginScope&&(h.beginScope._wrap?(pe(K,be.classNameAliases[h.beginScope._wrap]||h.beginScope._wrap),K=""):h.beginScope._multi&&(Mt(h.beginScope,v),K="")),M=Object.create(h,{parent:{value:M}}),M}function xt(h,v,C){let U=L(h.endRe,C);if(U){if(h["on:end"]){const ie=new t(h);h["on:end"](v,ie),ie.isMatchIgnored&&(U=!1)}if(U){for(;h.endsParent&&h.parent;)h=h.parent;return h}}if(h.endsWithParent)return xt(h.parent,v,C)}function Fn(h){return M.matcher.regexIndex===0?(K+=h[0],1):(dt=!0,0)}function $n(h){const v=h[0],C=h.rule,U=new t(C),ie=[C.__beforeBegin,C["on:begin"]];for(const Ee of ie)if(Ee&&(Ee(h,U),U.isMatchIgnored))return Fn(v);return C.skip?K+=v:(C.excludeBegin&&(K+=v),ce(),!C.returnBegin&&!C.excludeBegin&&(K=v)),It(C,h),C.returnBegin?0:v.length}function zn(h){const v=h[0],C=A.substring(h.index),U=xt(M,h,C);if(!U)return vt;const ie=M;M.endScope&&M.endScope._wrap?(ce(),pe(v,M.endScope._wrap)):M.endScope&&M.endScope._multi?(ce(),Mt(M.endScope,h)):ie.skip?K+=v:(ie.returnEnd||ie.excludeEnd||(K+=v),ce(),ie.excludeEnd&&(K=v));do M.scope&&te.closeNode(),!M.skip&&!M.subLanguage&&(ze+=M.relevance),M=M.parent;while(M!==U.parent);return U.starts&&It(U.starts,h),ie.returnEnd?0:v.length}function Gn(){const h=[];for(let v=M;v!==be;v=v.parent)v.scope&&h.unshift(v.scope);h.forEach(v=>te.openNode(v))}let $e={};function Ct(h,v){const C=v&&v[0];if(K+=h,C==null)return ce(),0;if($e.type==="begin"&&v.type==="end"&&$e.index===v.index&&C===""){if(K+=A.slice(v.index,v.index+1),!Y){const U=new Error(`0 width match regex (${b})`);throw U.languageName=b,U.badRule=$e.rule,U}return 1}if($e=v,v.type==="begin")return $n(v);if(v.type==="illegal"&&!B){const U=new Error('Illegal lexeme "'+C+'" for mode "'+(M.scope||"")+'"');throw U.mode=M,U}else if(v.type==="end"){const U=zn(v);if(U!==vt)return U}if(v.type==="illegal"&&C==="")return K+=` -`,1;if(lt>1e5&<>v.index*3)throw new Error("potential infinite loop, way more iterations than matches");return K+=C,C.length}const be=he(b);if(!be)throw Te(Z.replace("{}",b)),new Error('Unknown language: "'+b+'"');const Kn=wn(be);let ct="",M=G||Kn;const Lt={},te=new T.__emitter(T);Gn();let K="",ze=0,we=0,lt=0,dt=!1;try{if(be.__emitTokens)be.__emitTokens(A,te);else{for(M.matcher.considerAll();;){lt++,dt?dt=!1:M.matcher.considerAll(),M.matcher.lastIndex=we;const h=M.matcher.exec(A);if(!h)break;const v=A.substring(we,h.index),C=Ct(v,h);we=h.index+C}Ct(A.substring(we))}return te.finalize(),ct=te.toHTML(),{language:b,value:ct,relevance:ze,illegal:!1,_emitter:te,_top:M}}catch(h){if(h.message&&h.message.includes("Illegal"))return{language:b,value:rt(A),illegal:!0,relevance:0,_illegalBy:{message:h.message,index:we,context:A.slice(we-100,we+100),mode:h.mode,resultSoFar:ct},_emitter:te};if(Y)return{language:b,value:rt(A),illegal:!1,relevance:0,errorRaised:h,_emitter:te,_top:M};throw h}}function at(b){const A={value:rt(b),illegal:!1,relevance:0,_top:S,_emitter:new T.__emitter(T)};return A._emitter.addText(b),A}function ot(b,A){A=A||T.languages||Object.keys(u);const B=at(b),G=A.filter(he).filter(kt).map(ce=>xe(ce,b,!1));G.unshift(B);const Q=G.sort((ce,pe)=>{if(ce.relevance!==pe.relevance)return pe.relevance-ce.relevance;if(ce.language&&pe.language){if(he(ce.language).supersetOf===pe.language)return 1;if(he(pe.language).supersetOf===ce.language)return-1}return 0}),[ge,Ne]=Q,Fe=ge;return Fe.secondBest=Ne,Fe}function Rn(b,A,B){const G=A&&E[A]||B;b.classList.add("hljs"),b.classList.add(`language-${G}`)}function st(b){let A=null;const B=J(b);if(O(B))return;if(Ue("before:highlightElement",{el:b,language:B}),b.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",b);return}if(b.children.length>0&&(T.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(b)),T.throwUnescapedHTML))throw new An("One of your code blocks includes unescaped HTML.",b.innerHTML);A=b;const G=A.textContent,Q=B?X(G,{language:B,ignoreIllegals:!0}):ot(G);b.innerHTML=Q.value,b.dataset.highlighted="yes",Rn(b,B,Q.language),b.result={language:Q.language,re:Q.relevance,relevance:Q.relevance},Q.secondBest&&(b.secondBest={language:Q.secondBest.language,relevance:Q.secondBest.relevance}),Ue("after:highlightElement",{el:b,result:Q,text:G})}function kn(b){T=St(T,b)}const Mn=()=>{Pe(),Oe("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function In(){Pe(),Oe("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let Ot=!1;function Pe(){function b(){Pe()}if(document.readyState==="loading"){Ot||window.addEventListener("DOMContentLoaded",b,!1),Ot=!0;return}document.querySelectorAll(T.cssSelector).forEach(st)}function xn(b,A){let B=null;try{B=A(n)}catch(G){if(Te("Language definition for '{}' could not be registered.".replace("{}",b)),Y)Te(G);else throw G;B=S}B.name||(B.name=b),u[b]=B,B.rawDefinition=A.bind(null,n),B.aliases&&Rt(B.aliases,{languageName:b})}function Cn(b){delete u[b];for(const A of Object.keys(E))E[A]===b&&delete E[A]}function Ln(){return Object.keys(u)}function he(b){return b=(b||"").toLowerCase(),u[b]||u[E[b]]}function Rt(b,{languageName:A}){typeof b=="string"&&(b=[b]),b.forEach(B=>{E[B.toLowerCase()]=A})}function kt(b){const A=he(b);return A&&!A.disableAutodetect}function Dn(b){b["before:highlightBlock"]&&!b["before:highlightElement"]&&(b["before:highlightElement"]=A=>{b["before:highlightBlock"](Object.assign({block:A.el},A))}),b["after:highlightBlock"]&&!b["after:highlightElement"]&&(b["after:highlightElement"]=A=>{b["after:highlightBlock"](Object.assign({block:A.el},A))})}function Bn(b){Dn(b),R.push(b)}function Pn(b){const A=R.indexOf(b);A!==-1&&R.splice(A,1)}function Ue(b,A){const B=b;R.forEach(function(G){G[B]&&G[B](A)})}function Un(b){return Oe("10.7.0","highlightBlock will be removed entirely in v12.0"),Oe("10.7.0","Please use highlightElement now."),st(b)}Object.assign(n,{highlight:X,highlightAuto:ot,highlightAll:Pe,highlightElement:st,highlightBlock:Un,configure:kn,initHighlighting:Mn,initHighlightingOnLoad:In,registerLanguage:xn,unregisterLanguage:Cn,listLanguages:Ln,getLanguage:he,registerAliases:Rt,autoDetection:kt,inherit:St,addPlugin:Bn,removePlugin:Pn}),n.debugMode=function(){Y=!1},n.safeMode=function(){Y=!0},n.versionString=vn,n.regex={concat:_,lookahead:p,either:w,optional:N,anyNumberOfTimes:f};for(const b in ve)typeof ve[b]=="object"&&e(ve[b]);return Object.assign(n,ve),n},Re=At({});return Re.newInstance=()=>At({}),pt=Re,Re.HighlightJS=Re,Re.default=Re,pt}var Ur=Pr();const Fr=Wn(Ur),Yt={},$r="hljs-";function zr(e){const t=Fr.newInstance();return e&&d(e),{highlight:i,highlightAuto:r,listLanguages:a,register:d,registerAlias:o,registered:s};function i(l,c,g){const m=g||Yt,p=typeof m.prefix=="string"?m.prefix:$r;if(!t.getLanguage(l))throw new Error("Unknown language: `"+l+"` is not registered");t.configure({__emitter:Gr,classPrefix:p});const f=t.highlight(c,{ignoreIllegals:!0,language:l});if(f.errorRaised)throw new Error("Could not highlight with `Highlight.js`",{cause:f.errorRaised});const N=f._emitter.root,_=N.data;return _.language=f.language,_.relevance=f.relevance,N}function r(l,c){const m=(c||Yt).subset||a();let p=-1,f=0,N;for(;++pf&&(f=y.data.relevance,N=y)}return N||{type:"root",children:[],data:{language:void 0,relevance:f}}}function a(){return t.listLanguages()}function d(l,c){if(typeof l=="string")t.registerLanguage(l,c);else{let g;for(g in l)Object.hasOwn(l,g)&&t.registerLanguage(g,l[g])}}function o(l,c){if(typeof l=="string")t.registerAliases(typeof c=="string"?c:[...c],{languageName:l});else{let g;for(g in l)if(Object.hasOwn(l,g)){const m=l[g];t.registerAliases(typeof m=="string"?m:[...m],{languageName:g})}}}function s(l){return!!t.getLanguage(l)}}class Gr{constructor(t){this.options=t,this.root={type:"root",children:[],data:{language:void 0,relevance:0}},this.stack=[this.root]}addText(t){if(t==="")return;const i=this.stack[this.stack.length-1],r=i.children[i.children.length-1];r&&r.type==="text"?r.value+=t:i.children.push({type:"text",value:t})}startScope(t){this.openNode(String(t))}endScope(){this.closeNode()}__addSublanguage(t,i){const r=this.stack[this.stack.length-1],a=t.root.children;i?r.children.push({type:"element",tagName:"span",properties:{className:[i]},children:a}):r.children.push(...a)}openNode(t){const i=this,r=t.split(".").map(function(o,s){return s?o+"_".repeat(s):i.options.classPrefix+o}),a=this.stack[this.stack.length-1],d={type:"element",tagName:"span",properties:{className:r},children:[]};a.children.push(d),this.stack.push(d)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}}const Kr={};function Zr(e){const t=e||Kr,i=t.aliases,r=t.detect||!1,a=t.languages||Br,d=t.plainText,o=t.prefix,s=t.subset;let l="hljs";const c=zr(a);if(i&&c.registerAlias(i),o){const g=o.indexOf("-");l=g===-1?o:o.slice(0,g)}return function(g,m){ni(g,"element",function(p,f,N){if(p.tagName!=="code"||!N||N.type!=="element"||N.tagName!=="pre")return;const _=Hr(p);if(_===!1||!_&&!r||_&&d&&d.includes(_))return;Array.isArray(p.properties.className)||(p.properties.className=[]),p.properties.className.includes(l)||p.properties.className.unshift(l);const y=li(p,{whitespace:"pre"});let w;try{w=_?c.highlight(_,y,{prefix:o}):c.highlightAuto(y,{prefix:o,subset:s})}catch(I){const L=I;if(_&&/Unknown language/.test(L.message)){m.message("Cannot highlight as `"+_+"`, it’s not registered",{ancestors:[N,p],cause:L,place:p.position,ruleId:"missing-language",source:"rehype-highlight"});return}throw L}!_&&w.data&&w.data.language&&p.properties.className.push("language-"+w.data.language),w.children.length>0&&(p.children=w.children)})}}function Hr(e){const t=e.properties.className;let i=-1;if(!Array.isArray(t))return;let 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�EmT;b)Iu@50o`G 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:not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:oklab(21% -.00316127 -.0338527/.1);--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.71429}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-40{margin-top:calc(var(--spacing)*40)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mr-4\.5{margin-right:calc(var(--spacing)*4.5)}.mr-6{margin-right:calc(var(--spacing)*6)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.size-\(--cell-size\){width:var(--cell-size);height:var(--cell-size)}.size-2\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-auto{width:auto;height:auto}.\!h-8{height:calc(var(--spacing)*8)!important}.h-\(--cell-size\){height:var(--cell-size)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-35{height:calc(var(--spacing)*35)}.h-36{height:calc(var(--spacing)*36)}.h-40{height:calc(var(--spacing)*40)}.h-\[1\.15rem\]{height:1.15rem}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[calc\(100\%-64px\)\]{height:calc(100% - 64px)}.h-\[calc\(100\%-70px\)\]{height:calc(100% - 70px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-35{max-height:calc(var(--spacing)*35)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-100{max-height:calc(var(--spacing)*100)}.max-h-\[40vh\]{max-height:40vh}.max-h-\[95vh\]{max-height:95vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-16{min-height:calc(var(--spacing)*16)}.min-h-100{min-height:calc(var(--spacing)*100)}.min-h-\[120px\]{min-height:120px}.w-\(--cell-size\){width:var(--cell-size)}.w-1\/2{width:50%}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-14{width:calc(var(--spacing)*14)}.w-18\.5{width:calc(var(--spacing)*18.5)}.w-20{width:calc(var(--spacing)*20)}.w-20\.5{width:calc(var(--spacing)*20.5)}.w-24{width:calc(var(--spacing)*24)}.w-25{width:calc(var(--spacing)*25)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-\[400px\]{width:400px}.w-\[420px\]{width:420px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-none{max-width:none}.max-w-xs{max-width:var(--container-xs)}.min-w-\(--cell-size\){min-width:var(--cell-size)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-10{min-width:calc(var(--spacing)*10)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[80px\]{min-width:80px}.min-w-\[100px\]{min-width:100px}.min-w-\[160px\]{min-width:160px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-\(--radix-popover-content-transform-origin\){transform-origin:var(--radix-popover-content-transform-origin)}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.translate-x-\[-8px\]{--tw-translate-x:-8px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[8px\]{--tw-translate-x:8px;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-1px\]{--tw-translate-y:-1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize{resize:both}.scroll-my-1{scroll-margin-block:calc(var(--spacing)*1)}.\[appearance\:textfield\]{appearance:textfield}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-2{row-gap:calc(var(--spacing)*2)}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[2px\]{border-radius:2px}.rounded-\[50\%\]{border-radius:50%}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-l-md{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.rounded-r-md{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1px\]{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-4{border-bottom-style:var(--tw-border-style);border-bottom-width:4px}.border-l-3,.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-l-\[5px\]{border-left-style:var(--tw-border-style);border-left-width:5px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-\[\#90a1b977\]{border-color:#90a1b977}.border-gray-400{border-color:var(--color-gray-400)}.border-input{border-color:var(--input)}.border-primary-500{border-color:var(--color-primary-500)}.border-primary-500\/70{border-color:#0891b2b3}@supports (color:color-mix(in lab,red,red)){.border-primary-500\/70{border-color:color-mix(in oklab,var(--color-primary-500)70%,transparent)}}.border-primary-600{border-color:var(--color-primary-600)}.border-purple-500{border-color:var(--color-purple-500)}.border-red-500{border-color:var(--color-red-500)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-200\/50{border-color:#e2e8f080}@supports (color:color-mix(in lab,red,red)){.border-slate-200\/50{border-color:color-mix(in oklab,var(--color-slate-200)50%,transparent)}}.border-slate-300{border-color:var(--color-slate-300)}.border-slate-400{border-color:var(--color-slate-400)}.border-slate-500{border-color:var(--color-slate-500)}.border-transparent{border-color:#0000}.border-yellow-500{border-color:var(--color-yellow-500)}.\!bg-transparent{background-color:#0000!important}.bg-\[\#eeeeeeee\]{background-color:#eeee}.bg-\[var\(--color-slate-100\)\]{background-color:var(--color-slate-100)}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-border{background-color:var(--border)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-primary-100{background-color:var(--color-primary-100)}.bg-primary-100\/70{background-color:#cffafeb3}@supports (color:color-mix(in lab,red,red)){.bg-primary-100\/70{background-color:color-mix(in oklab,var(--color-primary-100)70%,transparent)}}.bg-primary-500{background-color:var(--color-primary-500)}.bg-primary-600{background-color:var(--color-primary-600)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-100\/50{background-color:#ffe0e580}@supports (color:color-mix(in lab,red,red)){.bg-red-100\/50{background-color:color-mix(in oklab,var(--color-red-100)50%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-secondary{background-color:var(--secondary)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-100\/50{background-color:#f1f5f980}@supports (color:color-mix(in lab,red,red)){.bg-slate-100\/50{background-color:color-mix(in oklab,var(--color-slate-100)50%,transparent)}}.bg-slate-100\/80{background-color:#f1f5f9cc}@supports (color:color-mix(in lab,red,red)){.bg-slate-100\/80{background-color:color-mix(in oklab,var(--color-slate-100)80%,transparent)}}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/80{background-color:color-mix(in oklab,var(--color-slate-900)80%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-cyan-50{--tw-gradient-from:var(--color-cyan-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-cyan-400{--tw-gradient-from:var(--color-cyan-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-cyan-400\/40{--tw-gradient-from:#00d2ef66}@supports (color:color-mix(in lab,red,red)){.from-cyan-400\/40{--tw-gradient-from:color-mix(in oklab,var(--color-cyan-400)40%,transparent)}}.from-cyan-400\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-50{--tw-gradient-from:var(--color-slate-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-indigo-400\/40{--tw-gradient-via:#7d87ff66}@supports (color:color-mix(in lab,red,red)){.via-indigo-400\/40{--tw-gradient-via:color-mix(in oklab,var(--color-indigo-400)40%,transparent)}}.via-indigo-400\/40{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-purple-50{--tw-gradient-to:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-400\/40{--tw-gradient-to:#c07eff66}@supports (color:color-mix(in lab,red,red)){.to-purple-400\/40{--tw-gradient-to:color-mix(in oklab,var(--color-purple-400)40%,transparent)}}.to-purple-400\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-500{--tw-gradient-to:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-100{--tw-gradient-to:var(--color-slate-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.\[mask-composite\:exclude\]{-webkit-mask-composite:xor;mask-composite:exclude}.fill-primary{fill:var(--primary)}.object-cover{object-fit:cover}.object-center{object-position:center}.\!p-0{padding:calc(var(--spacing)*0)!important}.\!p-2{padding:calc(var(--spacing)*2)!important}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-\[3px\]{padding:3px}.\!px-4{padding-inline:calc(var(--spacing)*4)!important}.px-\(--cell-size\){padding-inline:var(--cell-size)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-6{padding-block:calc(var(--spacing)*6)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-0{padding-right:calc(var(--spacing)*0)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-5{padding-right:calc(var(--spacing)*5)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-keep{word-break:keep-all}.text-ellipsis{text-overflow:ellipsis}.hyphens-none{-webkit-hyphens:none;hyphens:none}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:var(--accent-foreground)}.text-blue-400{color:var(--color-blue-400)}.text-cyan-400{color:var(--color-cyan-400)}.text-cyan-500{color:var(--color-cyan-500)}.text-foreground{color:var(--foreground)}.text-gray-500{color:var(--color-gray-500)}.text-green-500{color:var(--color-green-500)}.text-green-700{color:var(--color-green-700)}.text-indigo-500{color:var(--color-indigo-500)}.text-inherit{color:inherit}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-500{color:var(--color-primary-500)}.text-primary-600{color:var(--color-primary-600)}.text-primary-700{color:var(--color-primary-700)}.text-primary-foreground{color:var(--primary-foreground)}.text-purple-400{color:var(--color-purple-400)}.text-purple-500{color:var(--color-purple-500)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-slate-200{color:var(--color-slate-200)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.placeholder-slate-400::placeholder{color:var(--color-slate-400)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-\[0_0_10px_rgba\(255\,255\,246\,0\.8\)\]{--tw-drop-shadow-size:drop-shadow(0 0 10px var(--tw-drop-shadow-color,#fffff6cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-\[0_0_80px_rgba\(0\,215\,255\,0\.8\)\]{--tw-drop-shadow-size:drop-shadow(0 0 80px var(--tw-drop-shadow-color,#00d7ffcc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-\[5px\]{--tw-backdrop-blur:blur(5px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.\[--cell-size\:--spacing\(8\)\]{--cell-size:calc(var(--spacing)*8)}.\[-ms-overflow-style\:none\]{-ms-overflow-style:none}.\[scrollbar-width\:none\]{scrollbar-width:none}.running{animation-play-state:running}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\[focused\=true\]\/day\:relative:is(:where(.group\/day)[data-focused=true] *){position:relative}.group-data-\[focused\=true\]\/day\:z-10:is(:where(.group\/day)[data-focused=true] *){z-index:10}.group-data-\[focused\=true\]\/day\:border-ring:is(:where(.group\/day)[data-focused=true] *){border-color:var(--ring)}.group-data-\[focused\=true\]\/day\:ring-\[3px\]:is(:where(.group\/day)[data-focused=true] *){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[focused\=true\]\/day\:ring-ring\/50:is(:where(.group\/day)[data-focused=true] *){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.group-data-\[focused\=true\]\/day\:ring-ring\/50:is(:where(.group\/day)[data-focused=true] *){--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.peer-checked\:opacity-100:is(:where(.peer):checked~*){opacity:1}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.odd\:bg-white:nth-child(odd){background-color:var(--color-white)}.even\:bg-slate-50:nth-child(2n){background-color:var(--color-slate-50)}.checked\:border-slate-500:checked{border-color:var(--color-slate-500)}.checked\:bg-primary-400:checked{background-color:var(--color-primary-400)}.checked\:text-primary-foreground:checked{color:var(--primary-foreground)}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-primary-500:focus-within{--tw-ring-color:var(--color-primary-500)}@media (hover:hover){.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-primary-300:hover{border-color:var(--color-primary-300)}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-primary-100\/70:hover{background-color:#cffafeb3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary-100\/70:hover{background-color:color-mix(in oklab,var(--color-primary-100)70%,transparent)}}.hover\:bg-primary-700:hover{background-color:var(--color-primary-700)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-100\/90:hover{background-color:#ffe0e5e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-100\/90:hover{background-color:color-mix(in oklab,var(--color-red-100)90%,transparent)}}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:bg-slate-200\/70:hover{background-color:#e2e8f0b3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-200\/70:hover{background-color:color-mix(in oklab,var(--color-slate-200)70%,transparent)}}.hover\:bg-slate-300:hover{background-color:var(--color-slate-300)}.hover\:bg-white\/50:hover{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/50:hover{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.hover\:bg-white\/70:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/70:hover{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-primary:hover{color:var(--primary)}.hover\:text-primary-500:hover{color:var(--color-primary-500)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:border-primary-500:focus{border-color:var(--color-primary-500)}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-primary-500:focus{--tw-ring-color:var(--color-primary-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-slate-500:focus{--tw-ring-color:var(--color-slate-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:\!border-current:focus-visible{border-color:currentColor!important}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:\!ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:\[--tw-ring-shadow\:0_0_\#0000\]:focus-visible{--tw-ring-shadow:0 0 #0000}.focus-visible\:\[--tw-ring-color\:transparent\]:focus-visible{--tw-ring-color:transparent}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-primary-500:focus-visible{--tw-ring-color:var(--color-primary-500)}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus-visible\:\!ring-offset-0:focus-visible{--tw-ring-offset-width:0px!important;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)!important}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.focus-visible\:\[--tw-ring-offset-shadow\:0_0_\#0000\]:focus-visible{--tw-ring-offset-shadow:0 0 #0000}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-focus\:border-ring:has(:focus){border-color:var(--ring)}.has-focus\:ring-\[3px\]:has(:focus){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.has-focus\:ring-ring\/50:has(:focus){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.has-focus\:ring-ring\/50:has(:focus){--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.aria-selected\:text-muted-foreground[aria-selected=true]{color:var(--muted-foreground)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[range-end\=true\]\:rounded-md[data-range-end=true]{border-radius:calc(var(--radius) - 2px)}.data-\[range-end\=true\]\:rounded-r-md[data-range-end=true]{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.data-\[range-end\=true\]\:bg-primary[data-range-end=true]{background-color:var(--primary)}.data-\[range-end\=true\]\:text-primary-foreground[data-range-end=true]{color:var(--primary-foreground)}.data-\[range-middle\=true\]\:rounded-none[data-range-middle=true]{border-radius:0}.data-\[range-middle\=true\]\:bg-accent[data-range-middle=true]{background-color:var(--accent)}.data-\[range-middle\=true\]\:text-accent-foreground[data-range-middle=true]{color:var(--accent-foreground)}.data-\[range-start\=true\]\:rounded-md[data-range-start=true]{border-radius:calc(var(--radius) - 2px)}.data-\[range-start\=true\]\:rounded-l-md[data-range-start=true]{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.data-\[range-start\=true\]\:bg-primary[data-range-start=true]{background-color:var(--primary)}.data-\[range-start\=true\]\:text-primary-foreground[data-range-start=true]{color:var(--primary-foreground)}.data-\[selected-single\=true\]\:bg-primary[data-selected-single=true]{background-color:var(--primary)}.data-\[selected-single\=true\]\:text-primary-foreground[data-selected-single=true]{color:var(--primary-foreground)}.data-\[selected\=true\]\:rounded-none[data-selected=true]{border-radius:0}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(var(--spacing)*2*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(var(--spacing)*2)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(var(--spacing)*2*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(var(--spacing)*2)}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing)*9)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing)*8)}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing)*2)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x: calc(100% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}@media not all and (min-width:320px){.max-\[320px\]\:hidden{display:none}}@media not all and (min-width:64rem){.max-lg\:flex-col{flex-direction:column}}@media not all and (min-width:48rem){.max-md\:hidden{display:none}.max-md\:max-h-40{max-height:calc(var(--spacing)*40)}}@media (min-width:40rem){.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:min-w-\[75px\]{min-width:75px}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:py-4{padding-block:calc(var(--spacing)*4)}.sm\:pr-4{padding-right:calc(var(--spacing)*4)}.sm\:pr-6{padding-right:calc(var(--spacing)*6)}.sm\:pl-2{padding-left:calc(var(--spacing)*2)}.sm\:pl-4{padding-left:calc(var(--spacing)*4)}}@media (min-width:48rem){.md\:hidden{display:none}.md\:min-h-40{min-height:calc(var(--spacing)*40)}.md\:w-18\.5{width:calc(var(--spacing)*18.5)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:64rem){.lg\:block{display:block}.lg\:hidden{display:none}.lg\:h-full{height:100%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}}@media (min-width:80rem){.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@container not (min-width:32rem){.\@max-lg\:flex-col{flex-direction:column}}@container (min-width:32rem){.\@lg\:flex-row{flex-direction:row}}.dark\:border-input:where(.dark,.dark *){border-color:var(--input)}.dark\:border-primary-300:where(.dark,.dark *){border-color:var(--color-primary-300)}.dark\:border-slate-400:where(.dark,.dark *){border-color:var(--color-slate-400)}.dark\:border-slate-500:where(.dark,.dark *){border-color:var(--color-slate-500)}.dark\:border-slate-600:where(.dark,.dark *){border-color:var(--color-slate-600)}.dark\:border-slate-700:where(.dark,.dark *){border-color:var(--color-slate-700)}.dark\:border-slate-800:where(.dark,.dark *){border-color:var(--color-slate-800)}.dark\:bg-\[\#0000002f\]:where(.dark,.dark *){background-color:#0000002f}.dark\:bg-\[oklch\(12\.9\%_0\.042_264\.695\)\]:where(.dark,.dark *){background-color:#020618}.dark\:bg-destructive\/60:where(.dark,.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:where(.dark,.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:where(.dark,.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:bg-primary-800:where(.dark,.dark *){background-color:var(--color-primary-800)}.dark\:bg-primary-900\/40:where(.dark,.dark *){background-color:#164e6366}@supports (color:color-mix(in lab,red,red)){.dark\:bg-primary-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-primary-900)40%,transparent)}}.dark\:bg-primary-900\/50:where(.dark,.dark *){background-color:#164e6380}@supports (color:color-mix(in lab,red,red)){.dark\:bg-primary-900\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-primary-900)50%,transparent)}}.dark\:bg-red-900\/40:where(.dark,.dark *){background-color:#7f244066}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900)40%,transparent)}}.dark\:bg-red-900\/50:where(.dark,.dark *){background-color:#7f244080}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.dark\:bg-slate-600:where(.dark,.dark *){background-color:var(--color-slate-600)}.dark\:bg-slate-700:where(.dark,.dark *){background-color:var(--color-slate-700)}.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-700)50%,transparent)}}.dark\:bg-slate-800:where(.dark,.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800)40%,transparent)}}.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800)50%,transparent)}}.dark\:bg-slate-900:where(.dark,.dark *){background-color:var(--color-slate-900)}.dark\:bg-slate-900\/80:where(.dark,.dark *){background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900)80%,transparent)}}.dark\:from-slate-800:where(.dark,.dark *){--tw-gradient-from:var(--color-slate-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-slate-900:where(.dark,.dark *){--tw-gradient-from:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-slate-900:where(.dark,.dark *){--tw-gradient-to:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-slate-950:where(.dark,.dark *){--tw-gradient-to:var(--color-slate-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:fill-slate-700:where(.dark,.dark *){fill:var(--color-slate-700)}.dark\:text-green-300:where(.dark,.dark *){color:var(--color-green-300)}.dark\:text-muted-foreground:where(.dark,.dark *){color:var(--muted-foreground)}.dark\:text-primary-300:where(.dark,.dark *){color:var(--color-primary-300)}.dark\:text-primary-400:where(.dark,.dark *){color:var(--color-primary-400)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-slate-100:where(.dark,.dark *){color:var(--color-slate-100)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\:text-slate-500:where(.dark,.dark *){color:var(--color-slate-500)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:drop-shadow-\[0_0_10px_rgba\(255\,255\,246\,0\.8\)\]:where(.dark,.dark *){--tw-drop-shadow-size:drop-shadow(0 0 10px var(--tw-drop-shadow-color,#fffff6cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.dark\:drop-shadow-\[0_0_80px_rgba\(59\,130\,246\,0\.8\)\]:where(.dark,.dark *){--tw-drop-shadow-size:drop-shadow(0 0 80px var(--tw-drop-shadow-color,#3b82f6cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.dark\:prose-invert:where(.dark,.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.dark\:odd\:bg-slate-900:where(.dark,.dark *):nth-child(odd){background-color:var(--color-slate-900)}.dark\:even\:bg-slate-800:where(.dark,.dark *):nth-child(2n){background-color:var(--color-slate-800)}.dark\:checked\:border-slate-400:where(.dark,.dark *):checked{border-color:var(--color-slate-400)}.dark\:checked\:bg-primary-600:where(.dark,.dark *):checked{background-color:var(--color-primary-600)}@media (hover:hover){.dark\:hover\:border-primary-500:where(.dark,.dark *):hover{border-color:var(--color-primary-500)}.dark\:hover\:bg-accent\/50:where(.dark,.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:where(.dark,.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}.dark\:hover\:bg-red-900:where(.dark,.dark *):hover{background-color:var(--color-red-900)}.dark\:hover\:bg-red-950\/30:where(.dark,.dark *):hover{background-color:#4608094d}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-950\/30:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-950)30%,transparent)}}.dark\:hover\:bg-slate-600:where(.dark,.dark *):hover{background-color:var(--color-slate-600)}.dark\:hover\:bg-slate-700:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}.dark\:hover\:bg-slate-700\/50:where(.dark,.dark *):hover{background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-700\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-700)50%,transparent)}}.dark\:hover\:bg-slate-700\/70:where(.dark,.dark *):hover{background-color:#314158b3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-700\/70:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-700)70%,transparent)}}.dark\:hover\:bg-slate-800:where(.dark,.dark *):hover{background-color:var(--color-slate-800)}.hover\:dark\:bg-red-900\/90:hover:where(.dark,.dark *){background-color:#7f2440e6}@supports (color:color-mix(in lab,red,red)){.hover\:dark\:bg-red-900\/90:hover:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900)90%,transparent)}}.dark\:hover\:text-accent-foreground:where(.dark,.dark *):hover{color:var(--accent-foreground)}}.dark\:focus\:bg-slate-700:where(.dark,.dark *):focus{background-color:var(--color-slate-700)}.dark\:focus-visible\:ring-destructive\/40:where(.dark,.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:data-\[state\=active\]\:border-input:where(.dark,.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:where(.dark,.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=active\]\:bg-input\/30:where(.dark,.dark *)[data-state=active]{background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:data-\[state\=active\]\:text-foreground:where(.dark,.dark *)[data-state=active]{color:var(--foreground)}.dark\:data-\[state\=checked\]\:bg-primary-foreground:where(.dark,.dark *)[data-state=checked]{background-color:var(--primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:where(.dark,.dark *)[data-state=unchecked]{background-color:var(--foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:where(.dark,.dark *)[data-state=unchecked]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:where(.dark,.dark *)[data-state=unchecked]{background-color:color-mix(in oklab,var(--input)80%,transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&\:\:-webkit-calendar-picker-indicator\]\:hidden::-webkit-calendar-picker-indicator{display:none}.\[\&\:\:-webkit-calendar-picker-indicator\]\:appearance-none::-webkit-calendar-picker-indicator{appearance:none}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none}.\[\&\:first-child\[data-selected\=true\]_button\]\:rounded-l-md:first-child[data-selected=true] button{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}:is(.rtl\:\*\*\:\[\.rdp-button\\_next\>svg\]\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *) *):is(.rdp-button_next>svg),:is(.rtl\:\*\*\:\[\.rdp-button\\_previous\>svg\]\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *) *):is(.rdp-button_previous>svg){rotate:180deg}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing)*2)}.\[\&\:last-child\[data-selected\=true\]_button\]\:rounded-r-md:last-child[data-selected=true] button{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.\[\&\>span\]\:text-xs>span{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&\>span\]\:opacity-70>span{opacity:.7}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:text-muted-foreground>svg{color:var(--muted-foreground)}[data-slot=card-content] .\[\[data-slot\=card-content\]_\&\]\:bg-transparent,[data-slot=popover-content] .\[\[data-slot\=popover-content\]_\&\]\:bg-transparent{background-color:#0000}}::selection{color:#fff;background:#0891b2}@font-face{font-family:Source Han Sans SC;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/SourceHanSans-Subset-SC.woff2)format("woff2")}@font-face{font-family:Source Han Sans JP;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/SourceHanSans-Subset-JP.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/JetBrainsMono.ttf)}:lang(zh),:lang(ko),:lang(en),:lang(fr),:lang(ru),:lang(de),:lang(zh-CN),:lang(zh-TW),:lang(zh-HK){font-family:"Source Han Sans SC",var(--font-sans),sans-serif}:lang(ja){font-family:"Source Han Sans JP",var(--font-sans),sans-serif}.font-mono,.font-mono *{font-family:var(--font-mono),monospace!important}html{font-family:var(--font-sans)sans-serif}::-webkit-scrollbar{z-index:999;width:7px;height:9px}::-webkit-scrollbar-thumb{background-color:var(--color-primary-500);background-image:-webkit-linear-gradient(45deg,#fff3 25%,#0000 0 50%,#fff3 0 75%,#0000 0,#0000);border-radius:10px}::-webkit-scrollbar-track{border-radius:10px}.scroll-embedded{scrollbar-gutter:stable}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}*{cursor:url(/cursors/normal.cur),auto;-webkit-user-select:none;user-select:none}img{-webkit-user-drag:none}input[type=text],.allow-select-text *{-webkit-user-select:text;user-select:text}a,a *,button,button *,select,select *,.cursor-link,.cursor-link *,[role=button],[role=button] *,.cursor-pointer,.cursor-pointer *,input[type=button],input[type=button] *{cursor:url(/cursors/link.cur),pointer!important}input[type=text],input[type=text] *,input[type=password],input[type=password] *,input[type=number],input[type=number] *,input[type=time],input[type=time] *,textarea,textarea *,[contenteditable=true],[contenteditable=true] *,.cursor-text,.cursor-text *{cursor:url(/cursors/text_static_white.cur) 7 16,text}.cursor-grab,.cursor-grab *{cursor:url(/cursors/move.cur),grab}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}html,body,#root{height:100%}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(96.8% .007 247.896);--muted-foreground:oklch(55.4% .046 257.417);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(92.9% .013 255.508);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.8% .042 265.755);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(55.4% .046 257.417);--accent:oklch(27.9% .041 260.031);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.4% .046 257.417);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} diff --git a/service/dist/assets/index-CcNZVzNR.css.br b/service/dist/assets/index-CcNZVzNR.css.br deleted file mode 100644 index 2bd7f3c0055d8a1c07293f20c6078642eb4f229b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13282 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 p of m)if(p.type==="childList")for(const b of p.addedNodes)b.tagName==="LINK"&&b.rel==="modulepreload"&&c(b)}).observe(document,{childList:!0,subtree:!0});function d(m){const p={};return m.integrity&&(p.integrity=m.integrity),m.referrerPolicy&&(p.referrerPolicy=m.referrerPolicy),m.crossOrigin==="use-credentials"?p.credentials="include":m.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function c(m){if(m.ep)return;m.ep=!0;const p=d(m);fetch(m.href,p)}})();var Hr={exports:{}},Wn={},Br={exports:{}},qr={};/** - * @license React - * scheduler.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var pm;function op(){return pm||(pm=1,(function(u){function o(U,X){var te=U.length;U.push(X);e:for(;0>>1,be=U[Te];if(0>>1;Tem(he,te))Mem(st,he)?(U[Te]=st,U[Me]=te,Te=Me):(U[Te]=he,U[ze]=te,Te=ze);else if(Mem(st,te))U[Te]=st,U[Me]=te,Te=Me;else break e}}return X}function m(U,X){var te=U.sortIndex-X.sortIndex;return te!==0?te:U.id-X.id}if(u.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var p=performance;u.unstable_now=function(){return p.now()}}else{var b=Date,C=b.now();u.unstable_now=function(){return b.now()-C}}var g=[],x=[],j=1,h=null,S=3,y=!1,D=!1,L=!1,M=!1,Y=typeof setTimeout=="function"?setTimeout:null,E=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;function R(U){for(var X=d(x);X!==null;){if(X.callback===null)c(x);else if(X.startTime<=U)c(x),X.sortIndex=X.expirationTime,o(g,X);else break;X=d(x)}}function Z(U){if(L=!1,R(U),!D)if(d(g)!==null)D=!0,I||(I=!0,ee());else{var X=d(x);X!==null&&me(Z,X.startTime-U)}}var I=!1,fe=-1,Ce=5,Ve=-1;function K(){return M?!0:!(u.unstable_now()-VeU&&K());){var Te=h.callback;if(typeof Te=="function"){h.callback=null,S=h.priorityLevel;var be=Te(h.expirationTime<=U);if(U=u.unstable_now(),typeof be=="function"){h.callback=be,R(U),X=!0;break t}h===d(g)&&c(g),R(U)}else c(g);h=d(g)}if(h!==null)X=!0;else{var Ke=d(x);Ke!==null&&me(Z,Ke.startTime-U),X=!1}}break e}finally{h=null,S=te,y=!1}X=void 0}}finally{X?ee():I=!1}}}var ee;if(typeof w=="function")ee=function(){w(G)};else if(typeof MessageChannel<"u"){var ue=new MessageChannel,Se=ue.port2;ue.port1.onmessage=G,ee=function(){Se.postMessage(null)}}else ee=function(){Y(G,0)};function me(U,X){fe=Y(function(){U(u.unstable_now())},X)}u.unstable_IdlePriority=5,u.unstable_ImmediatePriority=1,u.unstable_LowPriority=4,u.unstable_NormalPriority=3,u.unstable_Profiling=null,u.unstable_UserBlockingPriority=2,u.unstable_cancelCallback=function(U){U.callback=null},u.unstable_forceFrameRate=function(U){0>U||125Te?(U.sortIndex=te,o(x,U),d(g)===null&&U===d(x)&&(L?(E(fe),fe=-1):L=!0,me(Z,te-Te))):(U.sortIndex=be,o(g,U),D||y||(D=!0,I||(I=!0,ee()))),U},u.unstable_shouldYield=K,u.unstable_wrapCallback=function(U){var X=S;return function(){var te=S;S=X;try{return U.apply(this,arguments)}finally{S=te}}}})(qr)),qr}var bm;function dp(){return bm||(bm=1,Br.exports=op()),Br.exports}var vm;function fp(){if(vm)return Wn;vm=1;/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var u=dp(),o=Bg(),d=Yg();function c(e){var t="https://react.dev/errors/"+e;if(1be||(e.current=Te[be],Te[be]=null,be--)}function he(e,t){be++,Te[be]=e.current,e.current=t}var Me=Ke(null),st=Ke(null),Ut=Ke(null),Ka=Ke(null);function gl(e,t){switch(he(Ut,t),he(st,e),he(Me,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?kf(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=kf(t),e=Uf(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}ze(Me),he(Me,e)}function ha(){ze(Me),ze(st),ze(Ut)}function tn(e){e.memoizedState!==null&&he(Ka,e);var t=Me.current,a=Uf(t,e.type);t!==a&&(he(st,e),he(Me,a))}function ga(e){st.current===e&&(ze(Me),ze(st)),Ka.current===e&&(ze(Ka),Vn._currentValue=te)}var Q,De;function at(e){if(Q===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Q=t&&t[1]||"",De=-1)":-1n||v[l]!==z[n]){var H=` -`+v[l].replace(" at new "," at ");return e.displayName&&H.includes("")&&(H=H.replace("",e.displayName)),H}while(1<=l&&0<=n);break}}}finally{xa=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?at(a):""}function gh(e,t){switch(e.tag){case 26:case 27:case 5:return at(e.type);case 16:return at("Lazy");case 13:return e.child!==t&&t!==null?at("Suspense Fallback"):at("Suspense");case 19:return at("SuspenseList");case 0:case 15:return an(e.type,!1);case 11:return an(e.type.render,!1);case 1:return an(e.type,!0);case 31:return at("Activity");default:return""}}function uu(e){try{var t="",a=null;do t+=gh(e,a),a=e,e=e.return;while(e);return t}catch(l){return` -Error generating stack: `+l.message+` -`+l.stack}}var Si=Object.prototype.hasOwnProperty,_i=u.unstable_scheduleCallback,Ni=u.unstable_cancelCallback,xh=u.unstable_shouldYield,ph=u.unstable_requestPaint,mt=u.unstable_now,bh=u.unstable_getCurrentPriorityLevel,ou=u.unstable_ImmediatePriority,du=u.unstable_UserBlockingPriority,ts=u.unstable_NormalPriority,vh=u.unstable_LowPriority,fu=u.unstable_IdlePriority,yh=u.log,jh=u.unstable_setDisableYieldValue,ln=null,ht=null;function pa(e){if(typeof yh=="function"&&jh(e),ht&&typeof ht.setStrictMode=="function")try{ht.setStrictMode(ln,e)}catch{}}var gt=Math.clz32?Math.clz32:Nh,Sh=Math.log,_h=Math.LN2;function Nh(e){return e>>>=0,e===0?32:31-(Sh(e)/_h|0)|0}var as=256,ls=262144,ns=4194304;function $a(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ss(e,t,a){var l=e.pendingLanes;if(l===0)return 0;var n=0,i=e.suspendedLanes,r=e.pingedLanes;e=e.warmLanes;var f=l&134217727;return f!==0?(l=f&~i,l!==0?n=$a(l):(r&=f,r!==0?n=$a(r):a||(a=f&~e,a!==0&&(n=$a(a))))):(f=l&~i,f!==0?n=$a(f):r!==0?n=$a(r):a||(a=l&~e,a!==0&&(n=$a(a)))),n===0?0:t!==0&&t!==n&&(t&i)===0&&(i=n&-n,a=t&-t,i>=a||i===32&&(a&4194048)!==0)?t:n}function nn(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function wh(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function mu(){var e=ns;return ns<<=1,(ns&62914560)===0&&(ns=4194304),e}function wi(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function sn(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ch(e,t,a,l,n,i){var r=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var f=e.entanglements,v=e.expirationTimes,z=e.hiddenUpdates;for(a=r&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Mh=/[\n"\\]/g;function Nt(e){return e.replace(Mh,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Oi(e,t,a,l,n,i,r,f){e.name="",r!=null&&typeof r!="function"&&typeof r!="symbol"&&typeof r!="boolean"?e.type=r:e.removeAttribute("type"),t!=null?r==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+_t(t)):e.value!==""+_t(t)&&(e.value=""+_t(t)):r!=="submit"&&r!=="reset"||e.removeAttribute("value"),t!=null?Mi(e,r,_t(t)):a!=null?Mi(e,r,_t(a)):l!=null&&e.removeAttribute("value"),n==null&&i!=null&&(e.defaultChecked=!!i),n!=null&&(e.checked=n&&typeof n!="function"&&typeof n!="symbol"),f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"?e.name=""+_t(f):e.removeAttribute("name")}function Cu(e,t,a,l,n,i,r,f){if(i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(e.type=i),t!=null||a!=null){if(!(i!=="submit"&&i!=="reset"||t!=null)){Ai(e);return}a=a!=null?""+_t(a):"",t=t!=null?""+_t(t):a,f||t===e.value||(e.value=t),e.defaultValue=t}l=l??n,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=f?e.checked:!!l,e.defaultChecked=!!l,r!=null&&typeof r!="function"&&typeof r!="symbol"&&typeof r!="boolean"&&(e.name=r),Ai(e)}function Mi(e,t,a){t==="number"&&rs(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function jl(e,t,a,l){if(e=e.options,t){t={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Hi=!1;if(Ft)try{var on={};Object.defineProperty(on,"passive",{get:function(){Hi=!0}}),window.addEventListener("test",on,on),window.removeEventListener("test",on,on)}catch{Hi=!1}var va=null,Bi=null,os=null;function Du(){if(os)return os;var e,t=Bi,a=t.length,l,n="value"in va?va.value:va.textContent,i=n.length;for(e=0;e=mn),qu=" ",Lu=!1;function Gu(e,t){switch(e){case"keyup":return i0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Yu(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var wl=!1;function r0(e,t){switch(e){case"compositionend":return Yu(t);case"keypress":return t.which!==32?null:(Lu=!0,qu);case"textInput":return e=t.data,e===qu&&Lu?null:e;default:return null}}function u0(e,t){if(wl)return e==="compositionend"||!Qi&&Gu(e,t)?(e=Du(),os=Bi=va=null,wl=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-e};e=l}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=Wu(a)}}function Iu(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Iu(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Pu(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=rs(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=rs(e.document)}return t}function Vi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var p0=Ft&&"documentMode"in document&&11>=document.documentMode,Cl=null,Ji=null,pn=null,Ki=!1;function eo(e,t,a){var l=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Ki||Cl==null||Cl!==rs(l)||(l=Cl,"selectionStart"in l&&Vi(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),pn&&xn(pn,l)||(pn=l,l=li(Ji,"onSelect"),0>=r,n-=r,Yt=1<<32-gt(t)+n|a<le?(re=$,$=null):re=$.sibling;var xe=A(N,$,T[le],B);if(xe===null){$===null&&($=re);break}e&&$&&xe.alternate===null&&t(N,$),_=i(xe,_,le),ge===null?F=xe:ge.sibling=xe,ge=xe,$=re}if(le===T.length)return a(N,$),oe&&Pt(N,le),F;if($===null){for(;lele?(re=$,$=null):re=$.sibling;var Ga=A(N,$,xe.value,B);if(Ga===null){$===null&&($=re);break}e&&$&&Ga.alternate===null&&t(N,$),_=i(Ga,_,le),ge===null?F=Ga:ge.sibling=Ga,ge=Ga,$=re}if(xe.done)return a(N,$),oe&&Pt(N,le),F;if($===null){for(;!xe.done;le++,xe=T.next())xe=q(N,xe.value,B),xe!==null&&(_=i(xe,_,le),ge===null?F=xe:ge.sibling=xe,ge=xe);return oe&&Pt(N,le),F}for($=l($);!xe.done;le++,xe=T.next())xe=k($,N,le,xe.value,B),xe!==null&&(e&&xe.alternate!==null&&$.delete(xe.key===null?le:xe.key),_=i(xe,_,le),ge===null?F=xe:ge.sibling=xe,ge=xe);return e&&$.forEach(function(Hg){return t(N,Hg)}),oe&&Pt(N,le),F}function we(N,_,T,B){if(typeof T=="object"&&T!==null&&T.type===L&&T.key===null&&(T=T.props.children),typeof T=="object"&&T!==null){switch(T.$$typeof){case y:e:{for(var F=T.key;_!==null;){if(_.key===F){if(F=T.type,F===L){if(_.tag===7){a(N,_.sibling),B=n(_,T.props.children),B.return=N,N=B;break e}}else if(_.elementType===F||typeof F=="object"&&F!==null&&F.$$typeof===Ce&&il(F)===_.type){a(N,_.sibling),B=n(_,T.props),_n(B,T),B.return=N,N=B;break e}a(N,_);break}else t(N,_);_=_.sibling}T.type===L?(B=tl(T.props.children,N.mode,B,T.key),B.return=N,N=B):(B=ys(T.type,T.key,T.props,null,N.mode,B),_n(B,T),B.return=N,N=B)}return r(N);case D:e:{for(F=T.key;_!==null;){if(_.key===F)if(_.tag===4&&_.stateNode.containerInfo===T.containerInfo&&_.stateNode.implementation===T.implementation){a(N,_.sibling),B=n(_,T.children||[]),B.return=N,N=B;break e}else{a(N,_);break}else t(N,_);_=_.sibling}B=tc(T,N.mode,B),B.return=N,N=B}return r(N);case Ce:return T=il(T),we(N,_,T,B)}if(me(T))return J(N,_,T,B);if(ee(T)){if(F=ee(T),typeof F!="function")throw Error(c(150));return T=F.call(T),P(N,_,T,B)}if(typeof T.then=="function")return we(N,_,Ts(T),B);if(T.$$typeof===w)return we(N,_,_s(N,T),B);zs(N,T)}return typeof T=="string"&&T!==""||typeof T=="number"||typeof T=="bigint"?(T=""+T,_!==null&&_.tag===6?(a(N,_.sibling),B=n(_,T),B.return=N,N=B):(a(N,_),B=ec(T,N.mode,B),B.return=N,N=B),r(N)):a(N,_)}return function(N,_,T,B){try{Sn=0;var F=we(N,_,T,B);return Hl=null,F}catch($){if($===Rl||$===ws)throw $;var ge=pt(29,$,null,N.mode);return ge.lanes=B,ge.return=N,ge}finally{}}}var rl=No(!0),wo=No(!1),Na=!1;function mc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function hc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function wa(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ca(e,t,a){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(pe&2)!==0){var n=l.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),l.pending=t,t=vs(e),co(e,null,a),t}return bs(e,l,t,a),vs(e)}function Nn(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,gu(e,a)}}function gc(e,t){var a=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,a===l)){var n=null,i=null;if(a=a.firstBaseUpdate,a!==null){do{var r={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};i===null?n=i=r:i=i.next=r,a=a.next}while(a!==null);i===null?n=i=t:i=i.next=t}else n=i=t;a={baseState:l.baseState,firstBaseUpdate:n,lastBaseUpdate:i,shared:l.shared,callbacks:l.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var xc=!1;function wn(){if(xc){var e=Ul;if(e!==null)throw e}}function Cn(e,t,a,l){xc=!1;var n=e.updateQueue;Na=!1;var i=n.firstBaseUpdate,r=n.lastBaseUpdate,f=n.shared.pending;if(f!==null){n.shared.pending=null;var v=f,z=v.next;v.next=null,r===null?i=z:r.next=z,r=v;var H=e.alternate;H!==null&&(H=H.updateQueue,f=H.lastBaseUpdate,f!==r&&(f===null?H.firstBaseUpdate=z:f.next=z,H.lastBaseUpdate=v))}if(i!==null){var q=n.baseState;r=0,H=z=v=null,f=i;do{var A=f.lane&-536870913,k=A!==f.lane;if(k?(ce&A)===A:(l&A)===A){A!==0&&A===kl&&(xc=!0),H!==null&&(H=H.next={lane:0,tag:f.tag,payload:f.payload,callback:null,next:null});e:{var J=e,P=f;A=t;var we=a;switch(P.tag){case 1:if(J=P.payload,typeof J=="function"){q=J.call(we,q,A);break e}q=J;break e;case 3:J.flags=J.flags&-65537|128;case 0:if(J=P.payload,A=typeof J=="function"?J.call(we,q,A):J,A==null)break e;q=h({},q,A);break e;case 2:Na=!0}}A=f.callback,A!==null&&(e.flags|=64,k&&(e.flags|=8192),k=n.callbacks,k===null?n.callbacks=[A]:k.push(A))}else k={lane:A,tag:f.tag,payload:f.payload,callback:f.callback,next:null},H===null?(z=H=k,v=q):H=H.next=k,r|=A;if(f=f.next,f===null){if(f=n.shared.pending,f===null)break;k=f,f=k.next,k.next=null,n.lastBaseUpdate=k,n.shared.pending=null}}while(!0);H===null&&(v=q),n.baseState=v,n.firstBaseUpdate=z,n.lastBaseUpdate=H,i===null&&(n.shared.lanes=0),Oa|=r,e.lanes=r,e.memoizedState=q}}function Co(e,t){if(typeof e!="function")throw Error(c(191,e));e.call(t)}function To(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;ei?i:8;var r=U.T,f={};U.T=f,Uc(e,!1,t,a);try{var v=n(),z=U.S;if(z!==null&&z(f,v),v!==null&&typeof v=="object"&&typeof v.then=="function"){var H=C0(v,l);En(e,t,H,St(e))}else En(e,t,l,St(e))}catch(q){En(e,t,{then:function(){},status:"rejected",reason:q},St())}finally{X.p=i,r!==null&&f.types!==null&&(r.types=f.types),U.T=r}}function M0(){}function Dc(e,t,a,l){if(e.tag!==5)throw Error(c(476));var n=sd(e).queue;nd(e,n,t,te,a===null?M0:function(){return id(e),a(l)})}function sd(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:te,baseState:te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:la,lastRenderedState:te},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:la,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function id(e){var t=sd(e);t.next===null&&(t=e.alternate.memoizedState),En(e,t.next.queue,{},St())}function kc(){return Pe(Vn)}function cd(){return Le().memoizedState}function rd(){return Le().memoizedState}function D0(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=St();e=wa(a);var l=Ca(t,e,a);l!==null&&(ft(l,t,a),Nn(l,t,a)),t={cache:uc()},e.payload=t;return}t=t.return}}function k0(e,t,a){var l=St();a={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Bs(e)?od(t,a):(a=Ii(e,t,a,l),a!==null&&(ft(a,e,l),dd(a,t,l)))}function ud(e,t,a){var l=St();En(e,t,a,l)}function En(e,t,a,l){var n={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(Bs(e))od(t,n);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var r=t.lastRenderedState,f=i(r,a);if(n.hasEagerState=!0,n.eagerState=f,xt(f,r))return bs(e,t,n,0),Ee===null&&ps(),!1}catch{}finally{}if(a=Ii(e,t,n,l),a!==null)return ft(a,e,l),dd(a,t,l),!0}return!1}function Uc(e,t,a,l){if(l={lane:2,revertLane:mr(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},Bs(e)){if(t)throw Error(c(479))}else t=Ii(e,a,l,2),t!==null&&ft(t,e,2)}function Bs(e){var t=e.alternate;return e===ae||t!==null&&t===ae}function od(e,t){ql=Os=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function dd(e,t,a){if((a&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,gu(e,a)}}var An={readContext:Pe,use:ks,useCallback:He,useContext:He,useEffect:He,useImperativeHandle:He,useLayoutEffect:He,useInsertionEffect:He,useMemo:He,useReducer:He,useRef:He,useState:He,useDebugValue:He,useDeferredValue:He,useTransition:He,useSyncExternalStore:He,useId:He,useHostTransitionStatus:He,useFormState:He,useActionState:He,useOptimistic:He,useMemoCache:He,useCacheRefresh:He};An.useEffectEvent=He;var fd={readContext:Pe,use:ks,useCallback:function(e,t){return lt().memoizedState=[e,t===void 0?null:t],e},useContext:Pe,useEffect:$o,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,Rs(4194308,4,Po.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Rs(4194308,4,e,t)},useInsertionEffect:function(e,t){Rs(4,2,e,t)},useMemo:function(e,t){var a=lt();t=t===void 0?null:t;var l=e();if(ul){pa(!0);try{e()}finally{pa(!1)}}return a.memoizedState=[l,t],l},useReducer:function(e,t,a){var l=lt();if(a!==void 0){var n=a(t);if(ul){pa(!0);try{a(t)}finally{pa(!1)}}}else n=t;return l.memoizedState=l.baseState=n,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},l.queue=e,e=e.dispatch=k0.bind(null,ae,e),[l.memoizedState,e]},useRef:function(e){var t=lt();return e={current:e},t.memoizedState=e},useState:function(e){e=zc(e);var t=e.queue,a=ud.bind(null,ae,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:Oc,useDeferredValue:function(e,t){var a=lt();return Mc(a,e,t)},useTransition:function(){var e=zc(!1);return e=nd.bind(null,ae,e.queue,!0,!1),lt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var l=ae,n=lt();if(oe){if(a===void 0)throw Error(c(407));a=a()}else{if(a=t(),Ee===null)throw Error(c(349));(ce&127)!==0||Do(l,t,a)}n.memoizedState=a;var i={value:a,getSnapshot:t};return n.queue=i,$o(Uo.bind(null,l,i,e),[e]),l.flags|=2048,Gl(9,{destroy:void 0},ko.bind(null,l,i,a,t),null),a},useId:function(){var e=lt(),t=Ee.identifierPrefix;if(oe){var a=Qt,l=Yt;a=(l&~(1<<32-gt(l)-1)).toString(32)+a,t="_"+t+"R_"+a,a=Ms++,0<\/script>",i=i.removeChild(i.firstChild);break;case"select":i=typeof l.is=="string"?r.createElement("select",{is:l.is}):r.createElement("select"),l.multiple?i.multiple=!0:l.size&&(i.size=l.size);break;default:i=typeof l.is=="string"?r.createElement(n,{is:l.is}):r.createElement(n)}}i[Fe]=t,i[it]=l;e:for(r=t.child;r!==null;){if(r.tag===5||r.tag===6)i.appendChild(r.stateNode);else if(r.tag!==4&&r.tag!==27&&r.child!==null){r.child.return=r,r=r.child;continue}if(r===t)break e;for(;r.sibling===null;){if(r.return===null||r.return===t)break e;r=r.return}r.sibling.return=r.return,r=r.sibling}t.stateNode=i;e:switch(tt(i,n,l),n){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&sa(t)}}return Ue(t),$c(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&sa(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(c(166));if(e=Ut.current,Ml(t)){if(e=t.stateNode,a=t.memoizedProps,l=null,n=Ie,n!==null)switch(n.tag){case 27:case 5:l=n.memoizedProps}e[Fe]=t,e=!!(e.nodeValue===a||l!==null&&l.suppressHydrationWarning===!0||Mf(e.nodeValue,a)),e||Sa(t,!0)}else e=ni(e).createTextNode(l),e[Fe]=t,t.stateNode=e}return Ue(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(l=Ml(t),a!==null){if(e===null){if(!l)throw Error(c(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(c(557));e[Fe]=t}else al(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),e=!1}else a=sc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(vt(t),t):(vt(t),null);if((t.flags&128)!==0)throw Error(c(558))}return Ue(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(n=Ml(t),l!==null&&l.dehydrated!==null){if(e===null){if(!n)throw Error(c(318));if(n=t.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(c(317));n[Fe]=t}else al(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),n=!1}else n=sc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),n=!0;if(!n)return t.flags&256?(vt(t),t):(vt(t),null)}return vt(t),(t.flags&128)!==0?(t.lanes=a,t):(a=l!==null,e=e!==null&&e.memoizedState!==null,a&&(l=t.child,n=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(n=l.alternate.memoizedState.cachePool.pool),i=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(i=l.memoizedState.cachePool.pool),i!==n&&(l.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),Qs(t,t.updateQueue),Ue(t),null);case 4:return ha(),e===null&&pr(t.stateNode.containerInfo),Ue(t),null;case 10:return ta(t.type),Ue(t),null;case 19:if(ze(qe),l=t.memoizedState,l===null)return Ue(t),null;if(n=(t.flags&128)!==0,i=l.rendering,i===null)if(n)Mn(l,!1);else{if(Be!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(i=As(e),i!==null){for(t.flags|=128,Mn(l,!1),e=i.updateQueue,t.updateQueue=e,Qs(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)ro(a,e),a=a.sibling;return he(qe,qe.current&1|2),oe&&Pt(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&mt()>Ks&&(t.flags|=128,n=!0,Mn(l,!1),t.lanes=4194304)}else{if(!n)if(e=As(i),e!==null){if(t.flags|=128,n=!0,e=e.updateQueue,t.updateQueue=e,Qs(t,e),Mn(l,!0),l.tail===null&&l.tailMode==="hidden"&&!i.alternate&&!oe)return Ue(t),null}else 2*mt()-l.renderingStartTime>Ks&&a!==536870912&&(t.flags|=128,n=!0,Mn(l,!1),t.lanes=4194304);l.isBackwards?(i.sibling=t.child,t.child=i):(e=l.last,e!==null?e.sibling=i:t.child=i,l.last=i)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=mt(),e.sibling=null,a=qe.current,he(qe,n?a&1|2:a&1),oe&&Pt(t,l.treeForkCount),e):(Ue(t),null);case 22:case 23:return vt(t),bc(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(a&536870912)!==0&&(t.flags&128)===0&&(Ue(t),t.subtreeFlags&6&&(t.flags|=8192)):Ue(t),a=t.updateQueue,a!==null&&Qs(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==a&&(t.flags|=2048),e!==null&&ze(sl),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),ta(Ge),Ue(t),null;case 25:return null;case 30:return null}throw Error(c(156,t.tag))}function q0(e,t){switch(lc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ta(Ge),ha(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ga(t),null;case 31:if(t.memoizedState!==null){if(vt(t),t.alternate===null)throw Error(c(340));al()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(vt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(c(340));al()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ze(qe),null;case 4:return ha(),null;case 10:return ta(t.type),null;case 22:case 23:return vt(t),bc(),e!==null&&ze(sl),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ta(Ge),null;case 25:return null;default:return null}}function Rd(e,t){switch(lc(t),t.tag){case 3:ta(Ge),ha();break;case 26:case 27:case 5:ga(t);break;case 4:ha();break;case 31:t.memoizedState!==null&&vt(t);break;case 13:vt(t);break;case 19:ze(qe);break;case 10:ta(t.type);break;case 22:case 23:vt(t),bc(),e!==null&&ze(sl);break;case 24:ta(Ge)}}function Dn(e,t){try{var a=t.updateQueue,l=a!==null?a.lastEffect:null;if(l!==null){var n=l.next;a=n;do{if((a.tag&e)===e){l=void 0;var i=a.create,r=a.inst;l=i(),r.destroy=l}a=a.next}while(a!==n)}}catch(f){ye(t,t.return,f)}}function Ea(e,t,a){try{var l=t.updateQueue,n=l!==null?l.lastEffect:null;if(n!==null){var i=n.next;l=i;do{if((l.tag&e)===e){var r=l.inst,f=r.destroy;if(f!==void 0){r.destroy=void 0,n=t;var v=a,z=f;try{z()}catch(H){ye(n,v,H)}}}l=l.next}while(l!==i)}}catch(H){ye(t,t.return,H)}}function Hd(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{To(t,a)}catch(l){ye(e,e.return,l)}}}function Bd(e,t,a){a.props=ol(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(l){ye(e,t,l)}}function kn(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof a=="function"?e.refCleanup=a(l):a.current=l}}catch(n){ye(e,t,n)}}function Xt(e,t){var a=e.ref,l=e.refCleanup;if(a!==null)if(typeof l=="function")try{l()}catch(n){ye(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(n){ye(e,t,n)}else a.current=null}function qd(e){var t=e.type,a=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&l.focus();break e;case"img":a.src?l.src=a.src:a.srcSet&&(l.srcset=a.srcSet)}}catch(n){ye(e,e.return,n)}}function Wc(e,t,a){try{var l=e.stateNode;cg(l,e.type,a,t),l[it]=t}catch(n){ye(e,e.return,n)}}function Ld(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Ra(e.type)||e.tag===4}function Fc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ld(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Ra(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ic(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Wt));else if(l!==4&&(l===27&&Ra(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(Ic(e,t,a),e=e.sibling;e!==null;)Ic(e,t,a),e=e.sibling}function Xs(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(l!==4&&(l===27&&Ra(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(Xs(e,t,a),e=e.sibling;e!==null;)Xs(e,t,a),e=e.sibling}function Gd(e){var t=e.stateNode,a=e.memoizedProps;try{for(var l=e.type,n=t.attributes;n.length;)t.removeAttributeNode(n[0]);tt(t,l,a),t[Fe]=e,t[it]=a}catch(i){ye(e,e.return,i)}}var ia=!1,Xe=!1,Pc=!1,Yd=typeof WeakSet=="function"?WeakSet:Set,We=null;function L0(e,t){if(e=e.containerInfo,yr=di,e=Pu(e),Vi(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var l=a.getSelection&&a.getSelection();if(l&&l.rangeCount!==0){a=l.anchorNode;var n=l.anchorOffset,i=l.focusNode;l=l.focusOffset;try{a.nodeType,i.nodeType}catch{a=null;break e}var r=0,f=-1,v=-1,z=0,H=0,q=e,A=null;t:for(;;){for(var k;q!==a||n!==0&&q.nodeType!==3||(f=r+n),q!==i||l!==0&&q.nodeType!==3||(v=r+l),q.nodeType===3&&(r+=q.nodeValue.length),(k=q.firstChild)!==null;)A=q,q=k;for(;;){if(q===e)break t;if(A===a&&++z===n&&(f=r),A===i&&++H===l&&(v=r),(k=q.nextSibling)!==null)break;q=A,A=q.parentNode}q=k}a=f===-1||v===-1?null:{start:f,end:v}}else a=null}a=a||{start:0,end:0}}else a=null;for(jr={focusedElem:e,selectionRange:a},di=!1,We=t;We!==null;)if(t=We,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,We=e;else for(;We!==null;){switch(t=We,i=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),tt(i,l,a),i[Fe]=e,$e(i),l=i;break e;case"link":var r=$f("link","href",n).get(l+(a.href||""));if(r){for(var f=0;fwe&&(r=we,we=P,P=r);var N=Fu(f,P),_=Fu(f,we);if(N&&_&&(k.rangeCount!==1||k.anchorNode!==N.node||k.anchorOffset!==N.offset||k.focusNode!==_.node||k.focusOffset!==_.offset)){var T=q.createRange();T.setStart(N.node,N.offset),k.removeAllRanges(),P>we?(k.addRange(T),k.extend(_.node,_.offset)):(T.setEnd(_.node,_.offset),k.addRange(T))}}}}for(q=[],k=f;k=k.parentNode;)k.nodeType===1&&q.push({element:k,left:k.scrollLeft,top:k.scrollTop});for(typeof f.focus=="function"&&f.focus(),f=0;fa?32:a,U.T=null,a=ir,ir=null;var i=Da,r=da;if(Je=0,Vl=Da=null,da=0,(pe&6)!==0)throw Error(c(331));var f=pe;if(pe|=4,Pd(i.current),Wd(i,i.current,r,a),pe=f,Ln(0,!1),ht&&typeof ht.onPostCommitFiberRoot=="function")try{ht.onPostCommitFiberRoot(ln,i)}catch{}return!0}finally{X.p=n,U.T=l,bf(e,t)}}function yf(e,t,a){t=Ct(a,t),t=qc(e.stateNode,t,2),e=Ca(e,t,2),e!==null&&(sn(e,2),Zt(e))}function ye(e,t,a){if(e.tag===3)yf(e,e,a);else for(;t!==null;){if(t.tag===3){yf(t,e,a);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(Ma===null||!Ma.has(l))){e=Ct(a,e),a=yd(2),l=Ca(t,a,2),l!==null&&(jd(a,l,t,e),sn(l,2),Zt(l));break}}t=t.return}}function or(e,t,a){var l=e.pingCache;if(l===null){l=e.pingCache=new Q0;var n=new Set;l.set(t,n)}else n=l.get(t),n===void 0&&(n=new Set,l.set(t,n));n.has(a)||(ar=!0,n.add(a),e=K0.bind(null,e,t,a),t.then(e,e))}function K0(e,t,a){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,Ee===e&&(ce&a)===a&&(Be===4||Be===3&&(ce&62914560)===ce&&300>mt()-Js?(pe&2)===0&&Jl(e,0):lr|=a,Zl===ce&&(Zl=0)),Zt(e)}function jf(e,t){t===0&&(t=mu()),e=el(e,t),e!==null&&(sn(e,t),Zt(e))}function $0(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),jf(e,a)}function W0(e,t){var a=0;switch(e.tag){case 31:case 13:var l=e.stateNode,n=e.memoizedState;n!==null&&(a=n.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(c(314))}l!==null&&l.delete(t),jf(e,a)}function F0(e,t){return _i(e,t)}var ei=null,$l=null,dr=!1,ti=!1,fr=!1,Ua=0;function Zt(e){e!==$l&&e.next===null&&($l===null?ei=$l=e:$l=$l.next=e),ti=!0,dr||(dr=!0,P0())}function Ln(e,t){if(!fr&&ti){fr=!0;do for(var a=!1,l=ei;l!==null;){if(e!==0){var n=l.pendingLanes;if(n===0)var i=0;else{var r=l.suspendedLanes,f=l.pingedLanes;i=(1<<31-gt(42|e)+1)-1,i&=n&~(r&~f),i=i&201326741?i&201326741|1:i?i|2:0}i!==0&&(a=!0,wf(l,i))}else i=ce,i=ss(l,l===Ee?i:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(i&3)===0||nn(l,i)||(a=!0,wf(l,i));l=l.next}while(a);fr=!1}}function I0(){Sf()}function Sf(){ti=dr=!1;var e=0;Ua!==0&&ug()&&(e=Ua);for(var t=mt(),a=null,l=ei;l!==null;){var n=l.next,i=_f(l,t);i===0?(l.next=null,a===null?ei=n:a.next=n,n===null&&($l=a)):(a=l,(e!==0||(i&3)!==0)&&(ti=!0)),l=n}Je!==0&&Je!==5||Ln(e),Ua!==0&&(Ua=0)}function _f(e,t){for(var a=e.suspendedLanes,l=e.pingedLanes,n=e.expirationTimes,i=e.pendingLanes&-62914561;0f)break;var H=v.transferSize,q=v.initiatorType;H&&Df(q)&&(v=v.responseEnd,r+=H*(v"u"?null:document;function Zf(e,t,a){var l=Wl;if(l&&typeof t=="string"&&t){var n=Nt(t);n='link[rel="'+e+'"][href="'+n+'"]',typeof a=="string"&&(n+='[crossorigin="'+a+'"]'),Xf.has(n)||(Xf.add(n),e={rel:e,crossOrigin:a,href:t},l.querySelector(n)===null&&(t=l.createElement("link"),tt(t,"link",e),$e(t),l.head.appendChild(t)))}}function bg(e){fa.D(e),Zf("dns-prefetch",e,null)}function vg(e,t){fa.C(e,t),Zf("preconnect",e,t)}function yg(e,t,a){fa.L(e,t,a);var l=Wl;if(l&&e&&t){var n='link[rel="preload"][as="'+Nt(t)+'"]';t==="image"&&a&&a.imageSrcSet?(n+='[imagesrcset="'+Nt(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(n+='[imagesizes="'+Nt(a.imageSizes)+'"]')):n+='[href="'+Nt(e)+'"]';var i=n;switch(t){case"style":i=Fl(e);break;case"script":i=Il(e)}Mt.has(i)||(e=h({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),Mt.set(i,e),l.querySelector(n)!==null||t==="style"&&l.querySelector(Xn(i))||t==="script"&&l.querySelector(Zn(i))||(t=l.createElement("link"),tt(t,"link",e),$e(t),l.head.appendChild(t)))}}function jg(e,t){fa.m(e,t);var a=Wl;if(a&&e){var l=t&&typeof t.as=="string"?t.as:"script",n='link[rel="modulepreload"][as="'+Nt(l)+'"][href="'+Nt(e)+'"]',i=n;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":i=Il(e)}if(!Mt.has(i)&&(e=h({rel:"modulepreload",href:e},t),Mt.set(i,e),a.querySelector(n)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Zn(i)))return}l=a.createElement("link"),tt(l,"link",e),$e(l),a.head.appendChild(l)}}}function Sg(e,t,a){fa.S(e,t,a);var l=Wl;if(l&&e){var n=vl(l).hoistableStyles,i=Fl(e);t=t||"default";var r=n.get(i);if(!r){var f={loading:0,preload:null};if(r=l.querySelector(Xn(i)))f.loading=5;else{e=h({rel:"stylesheet",href:e,"data-precedence":t},a),(a=Mt.get(i))&&zr(e,a);var v=r=l.createElement("link");$e(v),tt(v,"link",e),v._p=new Promise(function(z,H){v.onload=z,v.onerror=H}),v.addEventListener("load",function(){f.loading|=1}),v.addEventListener("error",function(){f.loading|=2}),f.loading|=4,ii(r,t,l)}r={type:"stylesheet",instance:r,count:1,state:f},n.set(i,r)}}}function _g(e,t){fa.X(e,t);var a=Wl;if(a&&e){var l=vl(a).hoistableScripts,n=Il(e),i=l.get(n);i||(i=a.querySelector(Zn(n)),i||(e=h({src:e,async:!0},t),(t=Mt.get(n))&&Er(e,t),i=a.createElement("script"),$e(i),tt(i,"link",e),a.head.appendChild(i)),i={type:"script",instance:i,count:1,state:null},l.set(n,i))}}function Ng(e,t){fa.M(e,t);var a=Wl;if(a&&e){var l=vl(a).hoistableScripts,n=Il(e),i=l.get(n);i||(i=a.querySelector(Zn(n)),i||(e=h({src:e,async:!0,type:"module"},t),(t=Mt.get(n))&&Er(e,t),i=a.createElement("script"),$e(i),tt(i,"link",e),a.head.appendChild(i)),i={type:"script",instance:i,count:1,state:null},l.set(n,i))}}function Vf(e,t,a,l){var n=(n=Ut.current)?si(n):null;if(!n)throw Error(c(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Fl(a.href),a=vl(n).hoistableStyles,l=a.get(t),l||(l={type:"style",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Fl(a.href);var i=vl(n).hoistableStyles,r=i.get(e);if(r||(n=n.ownerDocument||n,r={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},i.set(e,r),(i=n.querySelector(Xn(e)))&&!i._p&&(r.instance=i,r.state.loading=5),Mt.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},Mt.set(e,a),i||wg(n,e,a,r.state))),t&&l===null)throw Error(c(528,""));return r}if(t&&l!==null)throw Error(c(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Il(a),a=vl(n).hoistableScripts,l=a.get(t),l||(l={type:"script",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(c(444,e))}}function Fl(e){return'href="'+Nt(e)+'"'}function Xn(e){return'link[rel="stylesheet"]['+e+"]"}function Jf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function wg(e,t,a,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),tt(t,"link",a),$e(t),e.head.appendChild(t))}function Il(e){return'[src="'+Nt(e)+'"]'}function Zn(e){return"script[async]"+e}function Kf(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+Nt(a.href)+'"]');if(l)return t.instance=l,$e(l),l;var n=h({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),$e(l),tt(l,"style",n),ii(l,a.precedence,e),t.instance=l;case"stylesheet":n=Fl(a.href);var i=e.querySelector(Xn(n));if(i)return t.state.loading|=4,t.instance=i,$e(i),i;l=Jf(a),(n=Mt.get(n))&&zr(l,n),i=(e.ownerDocument||e).createElement("link"),$e(i);var r=i;return r._p=new Promise(function(f,v){r.onload=f,r.onerror=v}),tt(i,"link",l),t.state.loading|=4,ii(i,a.precedence,e),t.instance=i;case"script":return i=Il(a.src),(n=e.querySelector(Zn(i)))?(t.instance=n,$e(n),n):(l=a,(n=Mt.get(i))&&(l=h({},a),Er(l,n)),e=e.ownerDocument||e,n=e.createElement("script"),$e(n),tt(n,"link",l),e.head.appendChild(n),t.instance=n);case"void":return null;default:throw Error(c(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,ii(l,a.precedence,e));return t.instance}function ii(e,t,a){for(var l=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=l.length?l[l.length-1]:null,i=n,r=0;r title"):null)}function Cg(e,t,a){if(a===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Ff(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function Tg(e,t,a,l){if(a.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var n=Fl(l.href),i=t.querySelector(Xn(n));if(i){t=i._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=ri.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=i,$e(i);return}i=t.ownerDocument||t,l=Jf(l),(n=Mt.get(n))&&zr(l,n),i=i.createElement("link"),$e(i);var r=i;r._p=new Promise(function(f,v){r.onload=f,r.onerror=v}),tt(i,"link",l),a.instance=i}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=ri.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var Ar=0;function zg(e,t){return e.stylesheets&&e.count===0&&oi(e,e.stylesheets),0Ar?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(n)}}:null}function ri(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)oi(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var ui=null;function oi(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ui=new Map,t.forEach(Eg,e),ui=null,ri.call(e))}function Eg(e,t){if(!(t.state.loading&4)){var a=ui.get(e);if(a)var l=a.get(null);else{a=new Map,ui.set(e,a);for(var n=e.querySelectorAll("link[data-precedence],style[data-precedence]"),i=0;i"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(u)}catch(o){console.error(o)}}return u(),Hr.exports=fp(),Hr.exports}var hp=mp();const gp=qg(hp),$m=O.createContext(null);function xp({children:u}){const[o,d]=O.useState(null);return s.jsx($m.Provider,{value:{openId:o,setOpenId:d},children:u})}function pp(){return O.useContext($m)}function bp(u){const o=u.replace(/-/g,"+").replace(/_/g,"/"),d=o.length%4,c=o+(d?"=".repeat(4-d):""),m=atob(c);return Uint8Array.from([...m].map(p=>p.charCodeAt(0)))}async function vp(u,o){const d=await crypto.subtle.importKey("raw",new TextEncoder().encode(u),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),c=await crypto.subtle.sign("HMAC",d,o);return Array.from(new Uint8Array(c)).map(m=>m.toString(16).padStart(2,"0")).join("")}async function yp(u){const o=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(u)),d=btoa(String.fromCharCode(...new Uint8Array(o))).replace(/\+/g,"-").replace(/\//g,"_");return new window.fernet.Secret(d)}class jp{constructor(o,d,c){this.ws=null,this.fernetSecret=null,this.url=o,this.sharedSecret=d,this.name=c}async connect(o){return new Promise((d,c)=>{let m=!1;this.ws=new WebSocket(this.url),this.ws.onopen=p=>{console.log(`[${this.name}] Connected`),this.onOpen?.(p)},this.ws.onmessage=async p=>{try{const b=JSON.parse(p.data);if(b.type==="handshake"){const C=bp(b.challenge),g=await vp(this.sharedSecret,C);this.ws?.send(JSON.stringify({response:g}))}else b.type==="handshake_ok"&&(this.fernetSecret=await yp(this.sharedSecret),console.log(`[${this.name}] Handshake OK`),m=!0,d())}catch{if(!this.fernetSecret)return;try{const b=p.data,g=new window.fernet.Token({secret:this.fernetSecret,token:b,ttl:0}).decode();this.name!=="heartbeat"&&console.log(`[${this.name}] Recv: ${g}`),o?.(g)}catch(b){console.error(`[${this.name}] Decrypt error: ${b}`)}}},this.ws.onerror=p=>{console.error(`[${this.name}] Error:`,p),this.onError?.(p),m||c(p)},this.ws.onclose=p=>{console.warn(`[${this.name}] Closed (code=${p.code}, reason=${p.reason||"none"})`),this.onClose?.(p),m||c(p)}})}sendJson(o){if(!this.fernetSecret)throw new Error("Handshake not done");if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not open");const c=new window.fernet.Token({secret:this.fernetSecret}).encode(JSON.stringify(o));this.ws.send(c),console.log(`[${this.name}] Sent: ${JSON.stringify(o)}`)}close(){this.ws&&(this.ws.close(),this.ws=null)}}const Sp=u=>(o,d,c)=>{const m=c.subscribe;return c.subscribe=((b,C,g)=>{let x=b;if(C){const j=g?.equalityFn||Object.is;let h=b(c.getState());x=S=>{const y=b(S);if(!j(h,y)){const D=h;C(h=y,D)}},g?.fireImmediately&&C(h,h)}return m(x)}),u(o,d,c)},_p=Sp,W=(...u)=>Qg(Xg(u)),Np=u=>typeof u=="object"&&u!==null&&!Array.isArray(u),$r=u=>{const o=new Date(u),d=(c,m=2)=>String(c).padStart(m,"0");return`${o.getFullYear()}-${d(o.getMonth()+1)}-${d(o.getDate())} ${d(o.getHours())}:${d(o.getMinutes())}:${d(o.getSeconds())}.${d(o.getMilliseconds(),3)}`},Wm=u=>{const o=new Date(u),d=(c,m=2)=>String(c).padStart(m,"0");return`${d(o.getHours())}:${d(o.getMinutes())}:${d(o.getSeconds())}.${d(o.getMilliseconds(),3)}`},wp=()=>Math.floor(Date.now()/1e3),qt=()=>Date.now(),Va={日服:"JP",国际服:"Global",国际服青少年:"Global",韩国ONE:"Global",Steam国际服:"Global",B服:"CN",官服:"CN"},Cp={日服:"JP",国际服:"Global_en-us",国际服青少年:"Global_en-us",韩国ONE:"Global_en-us",Steam国际服:"Global_en-us",B服:"CN",官服:"CN"},Fm=Om((u,o)=>({globalLogData:[],appendGlobalLog:d=>{u(c=>({globalLogData:[...c.globalLogData,d]}))}}));class Vt{static get(o){try{const d=localStorage.getItem(o);return d?JSON.parse(d):null}catch(d){return console.error("[StorageUtil:get] error:",d),null}}static set(o,d){try{localStorage.setItem(o,JSON.stringify(d))}catch(c){console.error("[StorageUtil:set] error:",c)}}static remove(o){try{localStorage.removeItem(o)}catch(d){console.error("[StorageUtil:remove] error:",d)}}static clear(){try{localStorage.clear()}catch(o){console.error("[StorageUtil:clear] error:",o)}}}const bi="ws://localhost:8190",{appendGlobalLog:jm}=Fm.getState(),vi=async(u,o=1e3)=>{const{connect:d}=V.getState();for(;;)try{await d(u),console.log(`[${u}] connected successfully`);return}catch(c){c.reason==="Invalid handshake response"?(console.error(`[${u}] connect failed, maybe Secret is Incorrect!`,c),V.setState(m=>({...m,_secret:""})),Vt.set("SECRET","")):console.error(`[${u}] connect failed, retrying in ${o}ms`,c),await new Promise(m=>setTimeout(m,o))}},Ya=(u,o,d,c,m=1/0)=>new Promise((p,b)=>{const C=d(u());if(c(C)){p();return}const g=o(d,j=>{c(j)&&(clearTimeout(x),g(),p())});let x=null;m!==1/0&&(x=setTimeout(()=>{g(),b(new Error("waitFor timeout"))},m))}),Tp=(u,o,d=1/0,c=50)=>new Promise((m,p)=>{const b=Date.now(),C=()=>{try{const x=u();o(x)?(clearInterval(g),m()):Date.now()-b>=d&&(clearInterval(g),p(new Error("waitFor timeout")))}catch(x){clearInterval(g),p(x)}};C();const g=setInterval(C,c)}),V=Om()(_p((u,o,d)=>({connections:{},logStore:{},configStore:{},staticStore:{},eventStore:{},updateStore:{},statusStore:{},versionStore:{},pendingCallbacks:{},_all_data_initialized:!1,_heartbeat_time:0,_initiating:!1,_secret:"",connect:async c=>{if(o().connections[c])return;let m="";c==="provider"&&(m=`${bi}/ws/provider`),c==="sync"&&(m=`${bi}/ws/sync`),c==="trigger"&&(m=`${bi}/ws/trigger`),c==="heartbeat"&&(m=`${bi}/ws/heartbeat`);const p={config:g=>{u(x=>({configStore:{...x.configStore,[g.resource_id]:g.data}}))},event:g=>{u(x=>({eventStore:{...x.eventStore,[g.resource_id]:g.data}}))},static:g=>{u(x=>({staticStore:g.data}))},setup_toml:g=>{u(x=>({updateStore:g.data}))}},b={config_list:g=>{u(x=>{const j=Object.fromEntries(g.data.filter(E=>!(E in x.configStore)).map(E=>[E,{}])),h=Object.fromEntries(g.data.filter(E=>!(E in x.eventStore)).map(E=>[E,[]])),S=Object.fromEntries(g.data.map(E=>{const w=`config:${E}`;return w in x.logStore?null:[w,[]]}).filter(E=>!!E)),y=Object.fromEntries(g.data.filter(E=>!(E in x.statusStore)).map(E=>[E,{}])),D=Object.fromEntries(Object.entries(x.configStore).filter(([E])=>g.data.includes(E))),L=Object.fromEntries(Object.entries(x.eventStore).filter(([E])=>g.data.includes(E))),M=Object.fromEntries(Object.entries(x.logStore).filter(([E])=>g.data.some(w=>E===`config:${w}`))),Y=Object.fromEntries(Object.entries(x.statusStore).filter(([E])=>g.data.includes(E)));return{configStore:{...D,...j},eventStore:{...L,...h},logStore:{...M,...S},statusStore:{...Y,...y}}})},snapshot:g=>{p[g.resource](g)},logs_full:g=>{const x=g.scopes,j=Object.fromEntries(x.map(S=>[S,[]]));g.entries.forEach(S=>{const y={time:S.time,level:S.level,message:S.message};j[S.scope].push(y),S.scope=="global"&&jm(y)}),u(S=>({logStore:j}))},log:g=>{const x=g.entry,j={time:x.time,level:x.level,message:x.message};u(h=>{const S=h.logStore[x.scope]??[];return{logStore:{...h.logStore,[x.scope]:[...S,j]}}}),x.scope=="global"&&jm(j)},status:g=>{const x=g.status;if(typeof x!="string")if("is_all_data_initialized"in x)u(j=>({...j,_all_data_initialized:!0}));else{let j=Object.keys(x)[0];typeof x[j]=="object"&&"config_id"in x[j]?Object.keys(x).forEach(h=>{u(S=>({statusStore:{...S.statusStore,[h]:{...S.statusStore[h]??{},...x[h]}}}))}):u(h=>({statusStore:{...h.statusStore,[x.config_id]:x.status}}))}},command_response:g=>{const{timestamp:x,command:j,data:h,status:S}=g,y=o().pendingCallbacks[x];y?(y({command:j,data:h,status:S}),delete o().pendingCallbacks[x]):console.warn("CallBack Not Found:",g)},patch:g=>{const x=g.ops,j=g.resource;if(j==="gui")return;const h=g.resource_id??null;h&&(Array.isArray(x)?x.forEach(S=>{if(S.op==="add"){o().send("sync",{type:"list"});const y=Object.keys(o().configStore).length;Ya(o,d.subscribe,D=>Object.keys(D.configStore).length,D=>D===y+1).then(()=>{o().send("sync",{type:"pull",resource:"config",resource_id:h}),o().send("sync",{type:"pull",resource:"event",resource_id:h})})}if(S.op==="remove")o().send("sync",{type:"list"});else{const y=`${h}::${j}${S.path}`;let D=S.value;o().patch(y,D)}}):console.error("Invalid patch message:",g))},patch_ack:g=>{const{timestamp:x}=g,j=o().pendingCallbacks[x];j?(j(),delete o().pendingCallbacks[x]):console.warn("CallBack Not Found:",g)},heartbeat:g=>{const{timestamp:x}=g;u(j=>({...j,_heartbeat_time:x}))}};u(g=>({...g,_secret:Vt.get("SECRET")})),await Ya(o,d.subscribe,g=>g._secret,g=>g!==""),Vt.set("SECRET",o()._secret);const C=new jp(m,o()._secret,c);await C.connect(g=>{try{const x=JSON.parse(g);b[x.type]?.(x)}catch(x){console.error("Message parse error:",x,g)}}),C.onClose=()=>{u(g=>{const x={...g.connections};return delete x[c],{connections:x}})},C.onError=g=>console.error("Socket error:",g),u(g=>({connections:{...g.connections,[c]:C}}))},disconnect:c=>{const m=o().connections[c];m&&(m.ws?.close(),u(p=>{const b={...p.connections};return delete b[c],{connections:b}}))},send:(c,m)=>{const p=o().connections[c];p&&p.sendJson(m)},init:async()=>{o()._initiating||(u(c=>({...c,_initiating:!0})),await vi("heartbeat"),await vi("provider"),await vi("sync"),o().send("sync",{type:"pull",resource:"static"}),await Ya(o,d.subscribe,c=>Object.keys(c.staticStore).length,c=>c>0),o().send("sync",{type:"pull",resource:"setup_toml",resource_id:"global"}),await Ya(o,d.subscribe,c=>Object.keys(c.updateStore).length,c=>c>0),o().send("sync",{type:"list"}),await Ya(o,d.subscribe,c=>Object.keys(c.configStore).length,c=>c>0),Object.keys(o().configStore).forEach(c=>{o().send("sync",{type:"pull",resource:"config",resource_id:c})}),await Ya(o,d.subscribe,c=>Object.keys(c.eventStore).length,c=>c>0),Object.keys(o().configStore).forEach(c=>{o().send("sync",{type:"pull",resource:"event",resource_id:c})}),await vi("trigger"),o().trigger({timestamp:qt(),command:"check_for_update",payload:{}},c=>{u(m=>({...m,versionStore:{local:c.data.local,remote:c.data.remote}}))}),await Ya(o,d.subscribe,c=>c.versionStore,c=>Object.keys(c).length>0),await Ya(o,d.subscribe,c=>c._all_data_initialized,c=>c),u(c=>({...c,_initiating:!1})))},patch:(c,m)=>{const[p,b]=c.split("::"),[C,...g]=b.split("/");u(x=>{let j;switch(C){case"config":j="configStore";break;case"event":j="eventStore";break;case"setup_toml":j="updateStore";break;default:throw new Error(`Unknown resource scope: ${C}`)}const h=x[j],S=h?.[p]??{};if(!(g[0]in S)&&m===void 0)return;let y={...S};if(g.length===0||g.length===1&&g[0]==="")y=m;else{let D=y;for(let M=0;M{const[b,C]=c.split("::"),g=qt(),x=Np(m)?Object.entries(m).map(([j,h])=>({op:"replace",path:`/${j}`,value:h})):[{op:"replace",path:"/",value:m}];o().pendingCallbacks[g]=()=>{p&&Dt.success(ji("settings.updateSuccess"),{description:ji("settings.updateSuccessDesc")})},o().send("sync",{type:"patch",resource_id:b,resource:C,timestamp:g,ops:x})},trigger:(c,m)=>{const p=c.timestamp||Date.now();m&&(o().pendingCallbacks[p]=m),o().send("trigger",{type:"command",_timestamp:p,...c})}}))),Lr={lang:"",theme:"",zoomScale:100,scrollToEnd:!0,assetsDisplay:!0},Im=O.createContext(void 0);function zp(u){let o="pending",d,c=u.then(m=>{o="success",d=m},m=>{o="error",d=m});return{read(){if(o==="pending")throw c;if(o==="error")throw d;return d}}}const Ep=V.getState().init,Ap=zp(Ep()),Op=({children:u,setReady:o})=>{const[d,c]=O.useState([]),[m,p]=O.useState(null),[b,C]=O.useState(!1),[g,x]=O.useState(Lr);Ap.read();const j=V(S=>S.configStore);O.useEffect(()=>{const S=Vt.get("uiSettings");S?x(S):(x(Lr),Vt.set("uiSettings",Lr)),C(!0)},[]),O.useEffect(()=>{b&&Vt.set("uiSettings",g)},[g]),O.useEffect(()=>{const S=Object.keys(j).map(y=>({id:y,name:j[y].name,settings:j[y]}));S.length>0&&!m&&(async()=>{const y=Vt.get("tabOrder");y&&y.length&&S.sort((D,L)=>{const M=y.indexOf(D.id),Y=y.indexOf(L.id);return M===-1&&Y===-1?0:M===-1?1:Y===-1?-1:M-Y}),p(S[0])})(),c(S)},[j]),O.useEffect(()=>{o(!0)},[]);const h={profiles:d,uiSettings:g,setUiSettings:x,activeProfile:m,setActiveProfile:p};return s.jsx(Im.Provider,{value:h,children:s.jsx(xp,{children:u})})},Ja=()=>{const u=O.useContext(Im);if(u===void 0)throw new Error("useApp must be used within an AppProvider");return u},Pm=O.createContext(void 0),Mp=({children:u})=>{const[o,d]=O.useState(()=>localStorage.getItem("theme")||"system");O.useEffect(()=>{const m=window.document.documentElement,p=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light",b=o==="system"?p:o;m.classList.remove("light","dark"),m.classList.add(b),localStorage.setItem("theme",o);const C=window.matchMedia("(prefers-color-scheme: dark)"),g=()=>{if(o==="system"){const x=C.matches?"dark":"light";m.classList.remove("light","dark"),m.classList.add(x)}};return C.addEventListener("change",g),()=>C.removeEventListener("change",g)},[o]);const c=m=>{d(m)};return s.jsx(Pm.Provider,{value:{theme:o,setTheme:c},children:u})},eh=()=>{const u=O.useContext(Pm);if(u===void 0)throw new Error("useTheme must be used within a ThemeProvider");return u},Dp=({onStateChanged:u})=>{const[o,d]=O.useState(!1),[c,m]=O.useState(!0),p=V(x=>x._heartbeat_time),b=V(x=>x.init),C=O.useRef(Date.now());O.useEffect(()=>{if(!p)return;C.current=Date.now(),d(!0),m(!0),u(!0);const x=setTimeout(()=>d(!1),300);return()=>clearTimeout(x)},[p]),O.useEffect(()=>{const x=setInterval(async()=>{Date.now()-C.current>5e3&&(m(!1),u(!1),await b())},1e3);return()=>clearInterval(x)},[]);const g=c?o?"var(--color-primary-400)":"var(--color-primary-500)":"var(--color-slate-500)";return s.jsx(Ze.div,{className:"w-4 h-4 rounded-full mx-auto",animate:{scale:c&&o?1.3:1,backgroundColor:g,boxShadow:c?o?"0 0 25px var(--color-primary-500)":"0 0 10px var(--color-primary-400)":"none"},transition:{type:"spring",stiffness:300,damping:15}})},kp=()=>{const{t:u}=ne(),[o,d]=O.useState(!1);return s.jsxs("div",{className:"flex flex-row items-center justify-center p-4 bg-slate-100/50 dark:bg-slate-700/50 w-full rounded-xl self-start",children:[s.jsx(Dp,{onStateChanged:d}),s.jsx(Ze.div,{className:"ml-4 text-sm font-bold rounded-lg",animate:{color:o?"var(--color-primary-400)":"var(--color-slate-400)"},transition:{duration:.4},children:u(o?"heartbeat.connected":"heartbeat.connecting")}),s.jsx("div",{className:"flex-grow"})]})},Up="/",Rp=({activePage:u,setActivePage:o})=>{const{t:d}=ne(),c=V(x=>x.versionStore),[m,p]=O.useState(!1),b=c.remote&&c.local!==c.remote,C=[{id:"home",label:d("home"),icon:Zg},{id:"scheduler",label:d("scheduler"),icon:Vg},{id:"configuration",label:d("configuration"),icon:Jg},{id:"settings",label:d("settings"),icon:Vr},{id:"wiki",label:d("title.wiki"),icon:Kg}],g=async()=>{};return s.jsxs("div",{className:"relative",children:[s.jsxs("aside",{className:"w-64 h-full flex-shrink-0 bg-white dark:bg-slate-900 border-r border-slate-200 dark:border-slate-700 flex-col lg:block hidden",children:[s.jsxs("div",{className:"h-16 flex items-center border-b border-slate-200 dark:border-slate-700 px-4",children:[s.jsx("img",{src:`${Up}images/logo.png`,alt:"Logo",className:"h-8 w-8"}),s.jsx("h1",{className:"text-xl font-bold text-primary-600 dark:text-primary-400 flex-1 text-start ml-2",children:d("appTitle")})]}),s.jsxs("nav",{className:"flex-1 px-4 py-6 h-[calc(100%-64px)] flex flex-col",children:[s.jsx("ul",{children:C.map(x=>s.jsxs("li",{children:[x.id==="settings"&&s.jsx("hr",{className:"border-[1px] border-slate-300 dark:border-slate-500"},x.id+"hr"),s.jsxs("button",{onClick:()=>o(x.id),className:`flex items-center w-full px-4 py-3 my-1 text-sm font-bold rounded-lg transition-colors duration-200 ${u===x.id?"bg-primary-500 text-white":"text-slate-600 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800"}`,children:[s.jsx(x.icon,{className:"w-5 h-5 mr-3"}),s.jsx("span",{children:x.label})]})]},x.id))}),s.jsx("div",{className:"flex-grow"}),b&&s.jsxs("button",{className:`flex flex-row items-center justify-center p-4 bg-red-100/50 hover:bg-red-100/90\r - dark:bg-red-900/50 hover:dark:bg-red-900/90 w-full rounded-xl self-start mb-2 transition`,onClick:()=>p(!0),children:[s.jsx(Jr,{className:"text-red-500"}),s.jsx("div",{className:"ml-2 text-sm font-bold rounded-lg text-red-500",children:d("update.available")}),s.jsx("div",{className:"flex-grow"})]}),s.jsx(kp,{})]})]}),s.jsx("nav",{className:"lg:hidden fixed bottom-0 left-0 w-full bg-white dark:bg-slate-900 border-t border-slate-200 dark:border-slate-700 flex justify-between items-center py-2 px-4 z-40",children:C.map(x=>s.jsxs("button",{onClick:()=>o(x.id),className:`flex flex-col items-center w-full text-sm font-medium py-2 ${u===x.id?"text-primary-500":"text-slate-600 dark:text-slate-300 hover:text-primary-500"}`,children:[s.jsx(x.icon,{className:"w-6 h-6 mb-1"}),s.jsx("span",{children:x.label})]},x.id))}),b&&s.jsx(Ze.button,{onClick:()=>p(!0),whileHover:{scale:1.1},whileTap:{scale:.95},animate:{y:[0,-4,0]},transition:{duration:2,repeat:1/0,ease:"easeInOut"},className:"lg:hidden fixed bottom-25 right-5 z-50 w-14 h-14 rounded-full bg-red-500 hover:bg-red-600 text-white shadow-lg flex items-center justify-center",children:s.jsx(Jr,{className:"w-7 h-7"})}),s.jsx(Bp,{open:m,localVersion:c.local,remoteVersion:c.remote,onCancel:()=>p(!1),onConfirm:async()=>{await g(),p(!1)}})]})},Hp="fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50",Bp=({open:u,localVersion:o,remoteVersion:d,onCancel:c,onConfirm:m})=>{const{t:p}=ne();return u?s.jsx("div",{className:Hp,onMouseDown:b=>{b.target===b.currentTarget&&c()},children:s.jsxs(Ze.div,{initial:{opacity:0,scale:.96,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:10},transition:{duration:.18,ease:"easeOut"},onMouseDown:b=>b.stopPropagation(),className:"w-[420px] rounded-2xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-2xl p-6",children:[s.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[s.jsx("div",{className:"rounded-full bg-primary-100 dark:bg-primary-900/40 text-primary-600 p-3",children:s.jsx(Jr,{className:"w-6 h-6"})}),s.jsxs("div",{children:[s.jsx("h2",{className:"text-lg font-semibold text-slate-900 dark:text-slate-100",children:p("confirmUpdateTitle")||"Confirm Update"}),s.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:p("updatePrompt")||"A new version is available. Confirm to update your application."})]})]}),s.jsxs("div",{className:"rounded-lg border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800/40 p-3 mb-5",children:[s.jsxs("div",{className:"flex items-center gap-2 text-sm mb-1",children:[s.jsx(Mm,{className:"w-4 h-4 text-red-500"}),s.jsxs("span",{className:"text-slate-600 dark:text-slate-300",children:[p("localVersion")||"Current version",":"]}),s.jsx("code",{className:"font-mono text-slate-700 dark:text-slate-100",children:o.slice(0,8)})]}),s.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[s.jsx(eu,{className:"w-4 h-4 text-green-500"}),s.jsxs("span",{className:"text-slate-600 dark:text-slate-300",children:[p("remoteVersion")||"Latest version",":"]}),s.jsx("code",{className:"font-mono text-green-700 dark:text-green-300",children:d?d.slice(0,8):"UNKNOWN"})]})]}),s.jsxs("div",{className:"flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400 mb-4",children:[s.jsx(tu,{className:"w-4 h-4 text-primary-500"}),s.jsx("span",{children:p("updateNotice")||"Make sure your current tasks are saved before updating."})]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx("button",{onClick:c,className:"px-4 py-2 rounded-md bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors",children:p("cancel")||"Cancel"}),s.jsx("button",{onClick:m,className:"px-4 py-2 rounded-md bg-primary-600 hover:bg-primary-700 text-white font-medium shadow-sm transition-colors",children:p("updates")||"Update Now"})]})]})}):null};function th({...u}){return s.jsx(Ox,{"data-slot":"select",...u})}function ah({...u}){return s.jsx(kx,{"data-slot":"select-value",...u})}function lh({className:u,size:o="default",children:d,...c}){return s.jsxs(Mx,{"data-slot":"select-trigger","data-size":o,className:W("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",u),...c,children:[d,s.jsx(Dx,{asChild:!0,children:s.jsx(au,{className:"size-4 opacity-50"})})]})}function nh({className:u,children:o,position:d="popper",...c}){return s.jsx(Ux,{children:s.jsxs(Rx,{"data-slot":"select-content",className:W("bg-popover dark:bg-slate-900 text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",d==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",u),position:d,...c,children:[s.jsx(qp,{}),s.jsx(Hx,{className:W("p-1",d==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),children:o}),s.jsx(Lp,{})]})})}function sh({className:u,children:o,...d}){return s.jsxs(Bx,{"data-slot":"select-item",className:W("focus:bg-accent dark:focus:bg-slate-700 focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",u),...d,children:[s.jsx("span",{className:"absolute right-2 flex size-3.5 items-center justify-center",children:s.jsx(qx,{children:s.jsx(Dm,{className:"size-4"})})}),s.jsx(Lx,{children:o})]})}function qp({className:u,...o}){return s.jsx(Gx,{"data-slot":"select-scroll-up-button",className:W("flex cursor-default items-center justify-center py-1",u),...o,children:s.jsx(km,{className:"size-4"})})}function Lp({className:u,...o}){return s.jsx(Yx,{"data-slot":"select-scroll-down-button",className:W("flex cursor-default items-center justify-center py-1",u),...o,children:s.jsx(au,{className:"size-4"})})}function ih({delayDuration:u=0,...o}){return s.jsx(Kx,{"data-slot":"tooltip-provider",delayDuration:u,...o})}function ch({...u}){return s.jsx(ih,{children:s.jsx(Qx,{"data-slot":"tooltip",...u})})}function rh({...u}){return s.jsx(Xx,{"data-slot":"tooltip-trigger",...u})}function uh({className:u,sideOffset:o=0,children:d,...c}){return s.jsx(Zx,{children:s.jsxs(Vx,{"data-slot":"tooltip-content",sideOffset:o,className:W("bg-primary dark:bg-slate-700 dark:text-white text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",u),...c,children:[d,s.jsx(Jx,{className:"bg-primary dark:bg-slate-700 fill-primary dark:fill-slate-700 z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]"})]})})}const en=({label:u,tooltip:o,className:d})=>s.jsxs("label",{className:`text-sm font-medium mb-2 flex items-center ${d??""}`,children:[s.jsx("span",{children:u}),s.jsxs(ch,{children:[s.jsx(rh,{asChild:!0,children:s.jsx("button",{type:"button",className:"ml-1",children:s.jsx($g,{size:18})})}),s.jsx(uh,{className:"max-w-xs text-sm",children:o})]})]}),Oe=({label:u,tooltip:o,value:d,onChange:c,options:m,placeholder:p,className:b,selectId:C,disabled:g=!1})=>{const x=O.useId(),j=C??x,h=pp(),S=h?h.openId===j:void 0,y=D=>{h&&h.setOpenId(D?j:null)};return s.jsxs("div",{className:`space-y-2 ${b??""}`,children:[u&&(o?s.jsx(en,{className:"block text-sm font-medium",label:u,tooltip:o}):s.jsx("label",{className:"block text-sm font-medium",children:u})),s.jsxs(th,{value:d,disabled:g,onValueChange:D=>{c(D),h&&h.setOpenId(null)},...h&&{open:S,onOpenChange:y},children:[s.jsx(lh,{className:"w-full",children:s.jsx(ah,{placeholder:p??"请选择"})}),s.jsx(nh,{position:"popper",children:m.map(D=>s.jsx(sh,{value:D.value,children:D.label},D.value))})]})]})};function Gp({className:u,type:o,...d}){return o==="number"?s.jsxs("div",{className:"relative w-full",children:[s.jsx("input",{type:"number","data-slot":"input",className:W("appearance-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none","file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent pr-8 px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",u),...d}),s.jsxs("div",{className:"absolute inset-y-0 right-1 flex flex-col justify-center",children:[s.jsx("button",{type:"button",tabIndex:-1,className:"hover:text-primary transition-colors",onClick:c=>{const m=c.currentTarget.parentElement?.previousSibling||null;m&&m.stepUp(),m?.dispatchEvent(new Event("input",{bubbles:!0}))},children:s.jsx(km,{className:"h-3 w-3"})}),s.jsx("button",{type:"button",tabIndex:-1,className:"hover:text-primary transition-colors",onClick:c=>{const m=c.currentTarget.parentElement?.previousSibling||null;m&&m.stepDown(),m?.dispatchEvent(new Event("input",{bubbles:!0}))},children:s.jsx(au,{className:"h-3 w-3"})})]})]}):s.jsx("input",{type:o??"text","data-slot":"input",className:W("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive","appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none",u),...d})}const de=({label:u,tooltip:o,className:d,childClassName:c,...m})=>s.jsxs("div",{className:`space-y-2 ${d??""}`,children:[u&&(o?s.jsx(en,{className:"block text-sm font-medium",label:u,tooltip:o}):s.jsx("label",{className:"block text-sm font-medium",children:u})),s.jsx(Gp,{...m,className:W("w-full",c)})]}),Yp="[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",Qp=()=>{const{t:u}=ne(),{activeProfile:o,setActiveProfile:d}=Ja(),[c,m]=je.useState([]),p=O.useRef(c),b=V(G=>G.configStore),{modify:C,trigger:g}=V(),x=je.useRef(null),[j,h]=je.useState({left:!1,right:!1}),S=je.useCallback(()=>{const G=x.current;G&&h({left:G.scrollLeft>0,right:G.scrollLeft+G.clientWidth{S();const G=x.current;if(!G)return;const ee=()=>S(),ue=()=>S();return window.addEventListener("resize",ee),G.addEventListener("scroll",ue,{passive:!0}),()=>{window.removeEventListener("resize",ee),G.removeEventListener("scroll",ue)}},[S]);const y=G=>{x.current?.scrollBy({left:G,behavior:"smooth"})},[D,L]=je.useState(null),[M,Y]=je.useState(null),[E,w]=je.useState(null),R=()=>L(null);O.useEffect(()=>{const G=Object.keys(b).map(Se=>({id:Se,name:b[Se].name,server:b[Se].server,settings:b[Se]})),ee=Vt.get("tabOrder");ee&&ee.length&&G.sort((Se,me)=>{const U=ee.indexOf(Se.id),X=ee.indexOf(me.id);return U===-1&&X===-1?0:U===-1?1:X===-1?-1:U-X}),m(G);const ue=G.find(Se=>Se.id===o?.id);d(ue??G[0]),(async()=>setTimeout(()=>{if(!(ue??G[0]))return;document.getElementById(`tab-${ue??G[0].id}`)?.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"})},0))()},[b]);const Z=G=>{m(G),Vt.set("tabOrder",G.map(ee=>ee.id))},I=G=>{d(G),document.getElementById(`tab-${G.id}`)?.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"})};O.useEffect(()=>{p.current=c},[c]);const fe=async(G,ee)=>{if(p.current.some(me=>me.name.trim()===G.trim()))throw new Error(u("nameExists"));const ue=await new Promise(me=>{g({timestamp:qt()+Math.random()*1e3,command:"add_config",payload:{name:G,server:ee}},U=>me(U.data.serial))});await Tp(()=>p.current.filter(me=>me.id===ue),me=>me.length!==0);const Se=p.current.find(me=>me.id===ue);Se&&d(Se)},Ce=async(G,ee,ue)=>{const Se=ee.trim();if(c.some(me=>me.id!==G.id&&me.name.trim()===Se))throw new Error(u("nameExists")||"Name already exists");C(`${G.id}::config`,{name:Se,server:ue}),m(me=>me.map(U=>U.id===G.id?{...U,name:Se,server:ue}:U)),o?.id===G.id&&d({...o,name:Se})},Ve=async G=>{if(c.length<=1){alert(u("cannotDeleteLast")||"Cannot delete the last profile.");return}let ee=null;m(ue=>{const Se=ue.findIndex(U=>U.id===G.id),me=ue.filter(U=>U.id!==G.id);return o?.id===G.id&&(ee=me[Math.max(0,Math.min(Se,me.length-1))]??null),me}),ee&&queueMicrotask(()=>d(ee)),g({timestamp:qt()+Math.random()*1e3,command:"remove_config",payload:{id:G.id}})};je.useEffect(()=>(window.addEventListener("click",R),()=>{window.removeEventListener("click",R),window.removeEventListener("contextmenu",R)}),[]);const K=V(G=>G.statusStore);return s.jsxs("header",{className:"h-16 flex-shrink-0 bg-white dark:bg-slate-900 border-b border-slate-200 dark:border-slate-700 flex items-center px-3",children:[s.jsxs("div",{className:"flex items-center gap-1 mr-2",children:[s.jsx("button",{className:`p-1 rounded hover:bg-slate-100 dark:hover:bg-slate-800 ${j.left?"":"opacity-40 pointer-events-none"}`,onClick:()=>y(-200),"aria-label":"scroll-left",children:s.jsx(Um,{className:"w-5 h-5"})}),s.jsx("button",{className:`p-1 rounded hover:bg-slate-100 dark:hover:bg-slate-800 ${j.right?"":"opacity-40 pointer-events-none"}`,onClick:()=>y(200),"aria-label":"scroll-right",children:s.jsx(Rm,{className:"w-5 h-5"})})]}),s.jsx("div",{ref:x,className:`flex-1 overflow-x-auto ${Yp}`,children:s.jsx(Ir,{axis:"x",values:c,onReorder:Z,className:"flex items-stretch h-10 gap-1",children:c.map(G=>{const ee=o?.id===G.id;return K[G.id]?s.jsxs(Pr,{id:`tab-${G.id}`,value:G,className:`group relative flex items-center max-w-xs shrink-0 rounded-lg px-3 h-10 select-none - border cursor-pointer transition-colors - ${ee?"bg-slate-100 dark:bg-slate-700 border-slate-400 dark:border-slate-500":"bg-slate-50 dark:bg-slate-800 border-slate-200 dark:border-slate-700 hover:bg-slate-100 dark:hover:bg-slate-700"} - `,onClick:()=>I(G),onPointerDown:ue=>{ue.button===1&&(ue.preventDefault(),w(G))},onContextMenu:ue=>{ue.preventDefault(),L({x:ue.clientX,y:ue.clientY,tab:G})},children:[K[G.id].running?s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}):s.jsx(s.Fragment,{}),s.jsx("span",{className:"truncate pr-5",children:G.name}),s.jsx("button",{title:u("delete")||"Delete",className:"absolute right-1 p-1 rounded opacity-0 group-hover:opacity-100 hover:bg-slate-200/70 dark:hover:bg-slate-700/70 transition",onClick:ue=>{ue.stopPropagation(),w(G)},children:s.jsx(Kt,{className:"w-3.5 h-3.5"})})]},G.id):s.jsx("div",{},G.id)})})}),s.jsxs("div",{className:"ml-3",children:[s.jsxs("button",{onClick:()=>Y({mode:"create"}),className:"hidden sm:flex items-center px-3 h-9 rounded-lg bg-primary-600 text-white hover:bg-primary-700 transition-colors",children:[s.jsx(dm,{className:"w-4 h-4 mr-2"}),u("addProfile")]}),s.jsx("button",{onClick:()=>Y({mode:"create"}),className:"flex sm:hidden items-center h-9 rounded-lg bg-primary-600 text-white hover:bg-primary-700 transition-colors w-9",children:s.jsx(dm,{className:"w-5 h-5 translate-x-[8px]"})})]}),s.jsx(Zr,{children:D&&D.tab&&s.jsxs(Ze.div,{initial:{opacity:0,scale:.96},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.96},transition:{type:"tween",duration:.12},className:"fixed z-50 min-w-[160px] rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 shadow-lg py-1",style:{top:D.y+2,left:D.x+2},children:[s.jsxs("button",{className:"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-slate-100 dark:hover:bg-slate-700",onClick:()=>{Y({mode:"edit",tab:D.tab}),L(null)},children:[s.jsx(Wg,{className:"w-4 h-4"})," ",u("edit")||"Edit"]}),s.jsxs("button",{className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 hover:bg-red-50 dark:hover:bg-red-950/30",onClick:()=>{w(D.tab),L(null)},children:[s.jsx(Hm,{className:"w-4 h-4"})," ",u("delete")||"Delete"]})]})}),s.jsx(Xp,{open:!!M,mode:M?.mode||"create",initial:M?.tab||null,onClose:()=>Y(null),onSubmit:async G=>{M?.mode==="create"?await fe(G.name,G.server):M?.mode==="edit"&&M?.tab&&await Ce(M.tab,G.name,G.server),Y(null)},checkName:(G,ee)=>c.some(ue=>ue.id!==ee&&ue.name.trim()===G.trim())}),s.jsx(Zp,{open:!!E,name:E?.name||"",onCancel:()=>w(null),onConfirm:async()=>{E&&await Ve(E),w(null)},disabled:c.length<=1})]})},oh="fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center z-50",Xp=u=>{const{t:o}=ne(),[d,c]=je.useState(u.initial?.name??""),[m,p]=je.useState("CN"),[b,C]=je.useState(null),[g,x]=je.useState(!1);je.useEffect(()=>{u.open&&(c(u.initial?.name??""),p(u.initial?.server??"NULL"),C(null))},[u.open,u.initial]);const j=async()=>{const h=d.trim();if(!h)return C(o("configAdd.nameRequired"));if(m==="NULL")return C(o("configAdd.serverRequired")||"Server is required");if(u.checkName(h,u.initial?.id))return C(o("configAdd.nameDuplicate")||"Name already exists");try{x(!0),await u.onSubmit({name:h,server:m})}catch(S){console.error(S),console.error({nm:h,server:m}),C(S?.message||o("saveFailed")||"Save failed")}finally{x(!1)}};return u.open?s.jsx("div",{className:oh,onMouseDown:h=>{h.target===h.currentTarget&&u.onClose()},children:s.jsxs(Ze.div,{initial:{opacity:0,y:12,scale:.98},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:12,scale:.98},transition:{duration:.18,type:"tween",ease:"easeOut"},className:"w-[420px] rounded-xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-700 shadow-xl p-5",onMouseDown:h=>h.stopPropagation(),children:[s.jsx("div",{className:"text-lg font-semibold mb-4",children:u.mode==="create"?o("createProfile")||"Create Profile":o("editProfile")||"Edit Profile"}),s.jsxs("div",{className:"space-y-4",children:[s.jsx(de,{value:d,label:o("profileName"),placeholder:o("placeholder.profileName"),onChange:h=>c(h.target.value)}),s.jsx(Oe,{label:o("server.server"),value:m,disabled:u.mode==="edit",onChange:h=>p(h),placeholder:o("configAdd.selectServer"),options:[{label:o("configAdd.selectServer"),value:"NULL"},{label:o("server.cn.official"),value:"官服"},{label:o("server.cn.bilibili"),value:"B服"},{label:o("server.global"),value:"国际服"},{label:o("server.global.teen"),value:"国际服青少年"},{label:o("server.kr.one"),value:"韩国ONE"},{label:o("server.jp"),value:"日服"}]}),b&&s.jsx("div",{className:"text-red-600 text-sm",children:b})]}),s.jsxs("div",{className:"mt-5 flex justify-end gap-2",children:[s.jsx("button",{onClick:u.onClose,className:"px-3 py-2 rounded-md bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700",disabled:g,children:o("cancel")}),s.jsxs("button",{onClick:j,className:"px-3 py-2 rounded-md bg-primary-600 text-white hover:bg-primary-700 disabled:opacity-60 flex items-center",disabled:g,children:[g&&s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}),s.jsx("span",{children:u.mode==="create"?o("create")||"Create":o("save")||"Save"})]})]})]})}):null},Zp=u=>{const{t:o}=ne();return u.open?s.jsx("div",{className:oh,onMouseDown:d=>{d.target===d.currentTarget&&u.onCancel()},children:s.jsxs(Ze.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:8},transition:{duration:.16},className:"w-[420px] rounded-xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-700 shadow-xl p-5",onMouseDown:d=>d.stopPropagation(),children:[s.jsxs("div",{className:"flex items-start gap-3",children:[s.jsx("div",{className:"mt-1 rounded-full bg-red-100 dark:bg-red-900/40 text-red-600 p-2",children:s.jsx(Hm,{className:"w-5 h-5"})}),s.jsxs("div",{className:"flex-1",children:[s.jsx("div",{className:"text-lg font-semibold",children:o("confirmDeleteTitle")}),s.jsx("div",{className:"text-sm text-slate-600 dark:text-slate-300 mt-1",children:o("confirmDeleteMessage",{name:u.name})})]})]}),s.jsxs("div",{className:"mt-5 flex justify-end gap-2",children:[s.jsx("button",{onClick:u.onCancel,className:"px-3 py-2 rounded-md bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700",children:o("cancel")}),s.jsx("button",{onClick:u.onConfirm,disabled:u.disabled,className:"px-3 py-2 rounded-md bg-red-600 text-white hover:bg-red-700 disabled:opacity-60",children:o("delete")})]})]})}):null};function Vp(u){const o=O.useRef(null);return isNaN(u)&&(u=1),O.useEffect(()=>{const d=o.current;d.style.transformOrigin="0 0",d.style.transform=`scale(${u})`,d.style.width=`${100/u}%`,d.style.height=`${100/u}%`},[u]),o}const Jp=({children:u,activePage:o,setActivePage:d})=>{const{uiSettings:c}=Ja(),m=Vp(c?.zoomScale/100);return s.jsxs("div",{className:"flex h-full w-full overflow-hidden text-slate-800 dark:text-slate-200",ref:m,children:[s.jsx(Rp,{activePage:o,setActivePage:d}),s.jsxs("div",{className:"flex flex-1 flex-col overflow-hidden",children:[s.jsx(Qp,{}),s.jsx("main",{className:"flex-1 overflow-y-auto p-6 pr-0 sm:pr-6 bg-slate-100 dark:bg-slate-800",children:u})]})]})},Ae=({children:u,variant:o="primary",className:d="",...c})=>{const m="px-4 py-2 text-sm font-semibold rounded-lg shadow-sm focus:outline-none transition-colors duration-200 disabled:opacity-50 disabled:cursors-not-allowed",p={primary:"bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500",secondary:"bg-slate-200 text-slate-800 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600 focus:ring-slate-500",danger:"bg-red-600 text-white hover:bg-red-700 focus:ring-red-500"};return s.jsx("button",{className:`${m} ${p[o]} ${d}`,...c,children:u})},Kp=u=>{switch(u){case"INFO":return"text-blue-400";case"WARNING":return"text-yellow-400";case"ERROR":return"text-red-400";case"CRITICAL":return"text-purple-400";default:return"text-slate-400"}},$p=u=>{switch(u){case"INFO":return"text-inherit font-normal border-l-[3px] border-gray-400";case"WARNING":return"text-yellow-500 font-bold border-l-[5px] border-yellow-500";case"ERROR":return"text-red-500 font-bold border-l-[5px] border-red-500";case"CRITICAL":return"text-purple-500 font-bold border-l-[5px] border-purple-500";default:return"text-inherit font-normal border-l-[3px] border-gray-400"}},Wp=({index:u,logs:o,style:d})=>{const c=o[u];return s.jsxs("div",{style:d,className:"flex items-start cursor-text px-2",children:[s.jsx("span",{className:"text-gray-500 whitespace-nowrap min-w-[100px] hidden sm:block",children:Wm(c.time)}),s.jsxs("span",{className:`sm:min-w-[75px] ${Kp(c.level)} font-bold flex justify-end mr-2`,children:[s.jsx("span",{className:"block sm:hidden",children:c.level.trim().charAt(0)}),s.jsx("span",{className:"hidden sm:block",children:c.level})]}),s.jsx("div",{className:`flex-1 pl-2 sm:pl-2 whitespace-pre-wrap break-words ${$p(c.level)}`,children:c.message})]})},Fp=({logs:u=[],scrollToEnd:o=!1})=>{const d=O.useRef(null),c=Fg({defaultRowHeight:28});return O.useLayoutEffect(()=>{if(!o||!d.current)return;let m=0;const p=()=>{d.current&&u.length>0&&d.current.scrollToRow({index:u.length-1,align:"end"}),m=requestAnimationFrame(p)};return p(),()=>cancelAnimationFrame(m)},[o,u.length]),s.jsx("div",{className:"w-full h-full bg-slate-900/80 dark:bg-slate/50 rounded-lg font-mono text-sm text-white py-1 pl-1 sm:py-4 sm:pl-4 overflow-x-auto allow-select-text",children:u.length>0?s.jsx(Ig,{listRef:d,rowComponent:Wp,rowCount:u.length,rowHeight:c,rowProps:{logs:u}}):s.jsx("div",{className:"text-slate-400 px-2 py-2 select-none",children:"No logs yet."})})};function nu({...u}){return s.jsx($x,{"data-slot":"popover",...u})}function su({...u}){return s.jsx(Wx,{"data-slot":"popover-trigger",...u})}function iu({className:u,align:o="center",sideOffset:d=4,...c}){return s.jsx(Fx,{children:s.jsx(Ix,{"data-slot":"popover-content",align:o,sideOffset:d,className:W("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",u),...c})})}const Qa="/",Ip=()=>{const{t:u}=ne(),[o,d]=je.useState(Date.now());return je.useEffect(()=>{const c=setInterval(()=>d(Date.now()),1e4);return()=>clearInterval(c)},[]),c=>{const m=Math.floor(o/1e3-c);if(m<60)return u("secondsAgo",{count:m});const p=Math.floor(m/60);if(p<60)return u("minutesAgo",{count:p});const b=Math.floor(p/60);if(b<24)return u("hoursAgo",{count:b});const C=Math.floor(b/24);return u("daysAgo",{count:C})}},Gr=({className:u=""})=>s.jsx("div",{className:`animate-pulse bg-slate-200 dark:bg-slate-700 rounded-md ${u}`}),Pp=({profileId:u})=>{const{t:o}=ne(),d=Ip(),c=V(g=>g.configStore[u]),[m,p]=O.useState(Array.from({length:8}).map(()=>!1));if(!c||Object.keys(c).length===0)return s.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-4 gap-2 p-2",children:Array.from({length:8}).map((g,x)=>s.jsxs("div",{className:"flex items-center bg-white dark:bg-slate-800/50 p-3 rounded-lg border border-slate-200 dark:border-slate-700",children:[s.jsx(Gr,{className:"w-10 h-10 rounded-full mr-4"}),s.jsxs("div",{className:"flex-1 space-y-2",children:[s.jsx(Gr,{className:"h-4 w-3/4"}),s.jsx(Gr,{className:"h-3 w-1/2"})]})]},x))});const C=[{name:o("property.ap"),value:`${c.ap.count}/${c.ap.max}`,time:c.ap.time,icon:`${Qa}icons/property/currency_icon_ap.webp`},{name:o("property.credits"),value:c.creditpoints.count.toLocaleString(),time:c.creditpoints.time,icon:`${Qa}icons/property/currency_icon_gold.webp`},{name:o("property.pyroxene"),value:c.pyroxene.count.toLocaleString(),time:c.pyroxene.time,icon:`${Qa}icons/property/currency_icon_gem.webp`},{name:o("property.coin.arena"),value:c.tactical_challenge_coin.count.toLocaleString(),time:c.tactical_challenge_coin.time,icon:`${Qa}icons/property/item_icon_chasecoin.webp`},{name:o("property.coin.commission"),value:c.bounty_coin.count,time:c.bounty_coin.time,icon:`${Qa}icons/property/item_icon_arenacoin.webp`},{name:o("property.keystone"),value:c.create_item_holding_quantity.Keystone?.toLocaleString()||"-1",time:c.pyroxene.time,icon:`${Qa}icons/property/item_icon_craftitem_1.webp`},{name:o("property.keystone.piece"),value:c.create_item_holding_quantity["Keystone-Piece"]?.toLocaleString()||"-1",time:c.pyroxene.time,icon:`${Qa}icons/property/item_icon_craftitem_0.webp`},{name:o("property.pass"),value:`${c._pass.level}/${c._pass.max_level}`,time:c._pass.time,icon:`${Qa}icons/property/item_icon_pass.webp`}];return s.jsx("div",{className:"max-[320px]:hidden grid sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-2",children:C.map((g,x)=>s.jsxs(nu,{open:m[x],onOpenChange:()=>p(j=>{const h=[...j];return h[x]=!1,h}),children:[s.jsx(su,{asChild:!0,children:s.jsxs("div",{onMouseEnter:()=>p(j=>{const h=[...j];return h[x]=!1,h}),onMouseLeave:()=>p(j=>{const h=[...j];return h[x]=!1,h}),className:"bg-white dark:bg-slate-800/50 p-3 rounded-lg border border-slate-200 dark:border-slate-700 flex items-start transition-transform hover:scale-[1.02]",children:[s.jsxs("div",{className:"flex flex-col items-center justify-center mr-4 min-w-10 ml-1",children:[s.jsx("img",{src:g.icon,className:"w-8 h-6",alt:g.name}),s.jsx("div",{className:"text-sm text-slate-500 dark:text-slate-400",children:g.name})]}),s.jsxs("div",{children:[s.jsx("div",{className:"text-l font-bold text-slate-800 dark:text-slate-100",children:g.value}),s.jsx("div",{className:"text-xs text-slate-400 dark:text-slate-500 mt-1",children:d(g.time)})]})]})}),s.jsx(iu,{className:"w-56 p-2 mr-6 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 max-h-100 overflow-y-auto"})]},g.name))})},kt=({children:u,className:o="",onClick:d})=>{const c="bg-white dark:bg-slate-800/50 border border-slate-200 dark:border-slate-700 rounded-xl shadow-sm",m=d?"cursors-pointer hover:shadow-md hover:border-primary-300 dark:hover:border-primary-500 transition-all duration-200":"";return s.jsx("div",{className:`${c} ${m} ${o}`,onClick:d,children:u})},Xa=({children:u,className:o=""})=>s.jsx("div",{className:`p-4 border-b border-slate-200 dark:border-slate-700 ${o}`,children:u}),ma=({children:u,className:o=""})=>s.jsx("div",{className:`p-4 ${o}`,children:u}),Za=({children:u,className:o=""})=>s.jsx("h3",{className:`text-lg font-semibold text-slate-800 dark:text-slate-100 ${o}`,children:u}),cu=({children:u,className:o=""})=>s.jsx("p",{className:`text-sm text-slate-500 dark:text-slate-400 ${o}`,children:u}),nt=({children:u,checked:o,label:d,onChange:c,className:m="",...p})=>u?s.jsx("button",{onClick:()=>c(!o),className:`px-6 py-2 rounded-lg text-sm font-semibold transition-all duration-200 ${o?"bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500":"bg-slate-200 text-slate-800 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600 focus:ring-slate-500"} ${m}`,...p,children:u}):s.jsxs("button",{onClick:()=>c(!o),className:`px-6 py-2 rounded-lg text-sm font-semibold transition-all duration-200 ${o?"bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500":"bg-slate-200 text-slate-800 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600 focus:ring-slate-500"} ${m}`,...p,children:[d??""," : ",o?ji("switch.on"):ji("switch.off")]}),eb=({profileId:u})=>{const{t:o}=ne(),[d,c]=O.useState(!1),m=V(b=>b.statusStore[u]?.current_task),p=V(b=>b.statusStore[u]?.waiting_tasks);return s.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-1",children:[s.jsxs("div",{className:"bg-white dark:bg-slate-800/50 p-2 rounded-lg border border-slate-200 dark:border-slate-700 flex items-center",children:[s.jsx(Kr,{className:"w-5 h-5 mr-2 text-primary-500"}),s.jsxs("div",{className:"flex-grow",children:[o("runningTask"),":"]}),s.jsx("div",{className:"flex flex-col items-center justify-center float-end",children:m?s.jsx("span",{className:"text-lg font-semibold text-primary-600 dark:text-primary-400",children:o(m)}):s.jsx("span",{className:"text-slate-500 dark:text-slate-400",children:o("noTaskRunning")})})]}),s.jsxs("div",{className:"bg-white dark:bg-slate-800/50 p-2 rounded-lg border border-slate-200 dark:border-slate-700 flex items-center",children:[s.jsx(Kr,{className:"w-5 h-5 mr-2 text-primary-500"}),s.jsxs("div",{className:"flex-grow",children:[o("nextTask"),":"]}),s.jsx("div",{className:"flex flex-col items-center justify-center float-end mr-2",children:p&&p.length>0?s.jsx("span",{className:"text-lg font-semibold text-primary-600 dark:text-primary-400",children:p[0]}):s.jsx("span",{className:"text-slate-500 dark:text-slate-400",children:o("noTasksQueued")})}),s.jsxs(nu,{open:d,onOpenChange:c,children:[s.jsx(su,{asChild:!0,children:s.jsx("button",{className:"p-1 hover:bg-slate-100 dark:hover:bg-slate-700 rounded-lg outline-none",onClick:()=>c(!d),children:s.jsx(Pg,{className:"w-5 h-5 text-slate-600 dark:text-slate-300"})})}),s.jsx(iu,{className:"w-56 p-2 mr-6 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 max-h-100 overflow-y-auto",onFocusOutside:()=>c(!1),children:p&&p.length>0?s.jsx("ul",{className:"space-y-1",children:p.map((b,C)=>s.jsx("li",{className:"text-lg px-3 py-2 bg-slate-100 dark:bg-slate-800 rounded-md",children:b},C))}):s.jsx("div",{className:"text-sm text-slate-500 dark:text-slate-400",children:o("noTasksQueued")})})]})]})]})},tb=({profileId:u})=>{const{t:o}=ne(),{uiSettings:d,setUiSettings:c}=Ja(),{profiles:m,activeProfile:p}=Ja(),b=u??p?.id,C=O.useMemo(()=>m.find(L=>L.id===b)??p??null,[m,b,p]),g=V(L=>L.statusStore),x=V(L=>L.trigger),j=V(L=>L.logStore),h=g[u]?.running||!1,S=()=>{!C||h||x({timestamp:qt(),command:"start_scheduler",config_id:u,payload:{}},L=>{console.debug("start_scheduler acknowledged",L)})},y=()=>{!C||!h||x({timestamp:wp(),command:"stop_scheduler",config_id:u,payload:{}},L=>{console.debug("stop_scheduler acknowledged",L)})},D=()=>{const L=j[`config:${u}`].map(w=>`[${$r(w.time)}] ${w.level}: ${w.message}`).join(` -`),M=new Blob([L],{type:"text/plain;charset=utf-8"}),Y=URL.createObjectURL(M),E=document.createElement("a");E.href=Y,E.download=`logs-${u}-${new Date().toISOString()}.txt`,E.click(),URL.revokeObjectURL(Y)};return s.jsxs("div",{className:"h-full flex flex-col min-h-0 gap-2",children:[s.jsxs("div",{className:"flex justify-between items-center shrink-0",children:[s.jsxs("div",{className:"flex",children:[s.jsx("h2",{className:"text-2xl font-bold text-slate-800 dark:text-slate-100",children:o("home")}),s.jsxs("h2",{className:"text-2xl ml-3 text-slate-500 dark:text-slate-400",children:["#",C?.name]})]}),s.jsx("div",{className:"flex sm:hidden items-center gap-2",children:s.jsx(Ae,{onClick:h?y:S,variant:h?"danger":"primary",className:"pl-2 pr-2 flex items-center justify-center",children:h?s.jsx(fm,{className:"w-4 h-4"}):s.jsx(mm,{className:"w-4 h-4"})})}),s.jsx("div",{className:"hidden sm:flex items-center gap-2",children:s.jsxs(Ae,{onClick:h?y:S,variant:h?"danger":"primary",className:"w-25 pl-3 flex items-center justify-center",children:[h?s.jsx(fm,{className:"w-4 h-4 mr-2"}):s.jsx(mm,{className:"w-4 h-4 mr-2"}),o(h?"stop":"start")]})})]}),s.jsx(eb,{profileId:u}),d?.assetsDisplay&&s.jsx("div",{className:"shrink-0",children:s.jsx(Pp,{profileId:u})}),s.jsxs(kt,{className:"flex-1 min-h-100 flex flex-col",children:[s.jsxs(Xa,{className:"flex justify-between items-center",children:[s.jsx(Za,{children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(ex,{})," ",o("logs")]})}),s.jsxs("div",{className:"sm:flex hidden items-center justify-center",children:[s.jsx(nt,{checked:d?.scrollToEnd,onChange:L=>{c(M=>({...M,scrollToEnd:L}))},label:o("log.scroll"),className:"!px-4"}),s.jsx(Ae,{onClick:D,className:"ml-2",children:s.jsxs("div",{className:"flex",children:[s.jsx(hm,{size:20,className:"mr-2"}),o("log.export")]})})]}),s.jsxs("div",{className:"sm:hidden flex items-center justify-center",children:[s.jsx(nt,{checked:d?.scrollToEnd,onChange:L=>{c(M=>({...M,scrollToEnd:L}))},label:"",className:"!px-4 ml-2 w-8 h-8",children:s.jsx(tx,{size:20,className:"rounded w-4 h-4 translate-x-[-8px]"})}),s.jsx(Ae,{onClick:D,className:"ml-2 w-8 h-8",children:s.jsx(hm,{size:20,className:"rounded w-4 h-4 translate-x-[-8px]"})})]})]}),s.jsx(ma,{className:"flex-1 min-h-0 p-0 flex overflow-x-hidden",children:s.jsx(Fp,{logs:j[`config:${u}`],scrollToEnd:d?.scrollToEnd})})]})]})};function Gt({className:u,orientation:o="horizontal",decorative:d=!0,...c}){return s.jsx(Px,{"data-slot":"separator",decorative:d,orientation:o,className:W("bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",u),...c})}const ru=({isOpen:u,onClose:o,title:d,children:c,width:m=40})=>(O.useEffect(()=>{const b=C=>{C.key==="Escape"&&o()};return window.addEventListener("keydown",b),()=>{window.removeEventListener("keydown",b)}},[o]),u?s.jsx("div",{className:"fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center z-50",onMouseDown:b=>{b.target===b.currentTarget&&o()},children:s.jsx(Ze.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:8},transition:{duration:.16},onMouseDown:b=>b.stopPropagation(),className:"rounded-xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-700 shadow-xl p-5 px-3",style:{width:`${m}%`,minWidth:"320px"},children:s.jsxs("div",{className:"overflow-auto px-2",style:{maxHeight:"calc(100vh - 80px)"},children:[s.jsxs("div",{className:"flex items-center justify-between p-0 border-b border-slate-200 dark:border-slate-700",children:[s.jsx("h2",{className:"text-xl font-semibold text-slate-800 dark:text-slate-100",children:d}),s.jsx("button",{onClick:o,className:"p-1 rounded-full hover:bg-slate-100 dark:hover:bg-slate-700",children:s.jsx(Kt,{className:"w-5 h-5 text-slate-500"})})]}),s.jsx("div",{className:"py-2 overflow-y-auto px-1",children:c})]})})}):null),ab=({isOpen:u,onClose:o,alternatives:d,selected:c,onChange:m,translatePrefix:p})=>{const{t:b}=ne(),[C,g]=O.useState(""),x=O.useMemo(()=>d.filter(h=>(p?b(p+"."+h):h).toString().toLowerCase().includes(C.toLowerCase())),[C,d]),j=h=>{c.includes(h)?m(c.filter(S=>S!==h)):m([...c,h])};return s.jsxs(Zm,{open:u,onClose:o,className:"relative z-50",children:[s.jsx("div",{className:"fixed inset-0 bg-black/30","aria-hidden":"true"}),s.jsx("div",{className:"fixed inset-0 flex items-center justify-center",children:s.jsxs(Vm,{className:"w-full max-w-3xl rounded-lg bg-white dark:bg-slate-800 p-6 shadow-lg",children:[s.jsxs("div",{className:"flex justify-between items-center mb-4",children:[s.jsx(Jm,{className:"text-lg font-semibold",children:b("scheduler.selector")}),s.jsx("button",{onClick:o,children:s.jsx(Kt,{className:"w-5 h-5 text-slate-500"})})]}),s.jsx("input",{type:"text",placeholder:b("scheduler.search"),value:C,onChange:h=>g(h.target.value),className:"w-full mb-4 px-3 py-2 border rounded-md focus:ring-primary-500 focus:border-primary-500"}),s.jsx("div",{className:"flex flex-wrap gap-2 max-h-96 overflow-y-auto",children:x.map(h=>{const S=h.toString(),y=c.includes(S);return s.jsx("button",{onClick:()=>j(S),className:`px-3 py-1 rounded-full text-sm border transition ${y?"bg-primary-600 text-white border-primary-600":"bg-slate-100 dark:bg-slate-700 border-slate-300"}`,children:p?b(p+"."+S):S},S)})})]})})]})},Sm=({label:u,tooltip:o,values:d,onChange:c,className:m,alternatives:p=[],translatePrefix:b})=>{const[C,g]=O.useState(!1),{t:x}=ne(),j=y=>{c(d.filter(D=>D!==y))},h=y=>{c(y)},S=()=>{g(!0)};return s.jsxs(s.Fragment,{children:[s.jsxs("div",{children:[u&&(o?s.jsx(en,{className:"block text-sm font-medium mb-2",label:u,tooltip:o}):s.jsx("label",{className:"block text-sm font-medium mb-2",children:u})),s.jsx("div",{className:W("space-y-2",m),children:s.jsx("div",{className:"overflow-x-auto pb-1",children:s.jsxs(Ir,{axis:"x",values:d,onReorder:h,className:"flex gap-1 min-w-max",children:[d.map((y,D)=>s.jsxs(Pr,{value:y,className:W("flex items-center gap-2 px-3 py-0.5 shrink-0","rounded-full border border-slate-300 dark:border-slate-600","bg-slate-100 dark:bg-slate-700","shadow-sm hover:shadow-md","cursor-grab"),children:[s.jsx("span",{className:"flex items-center justify-center w-5 h-5 text-xs font-medium rounded-full bg-primary text-primary-foreground",children:D+1}),s.jsx("span",{className:"text-sm",children:b?x(b+"."+y):y}),s.jsx("button",{onClick:()=>j(y),className:"ml-1 inline-flex items-center justify-center w-5 h-5 rounded-full text-red-500 hover:bg-red-100 dark:hover:bg-red-900 transition",children:s.jsx(Kt,{className:"w-3.5 h-3.5"})})]},y)),s.jsxs("button",{onClick:S,className:W("flex items-center gap-1 px-3 py-0.5 shrink-0","rounded-full border-2 border-dashed border-slate-300 dark:border-slate-600","text-slate-600 dark:text-slate-200","hover:bg-slate-100 dark:hover:bg-slate-600"),children:[s.jsx(lu,{className:"w-4 h-4"})," ",x("add")]})]})})})]}),s.jsx(ab,{isOpen:C,onClose:()=>g(!1),alternatives:p,selected:d,onChange:y=>{c(y)},translatePrefix:b})]})},_m=({label:u,tooltip:o,values:d,onChange:c,className:m,mode:p="time"})=>{const{t:b}=ne(),C=()=>{p==="time"&&c([...d,[0,0,0]])},g=()=>{p==="range"&&c([...d,[[0,0,0],[23,59,59]]])},x=y=>{c(d.filter((D,L)=>L!==y))},j=y=>String(y).padStart(2,"0"),h=y=>y.length===2?`${j(y[0])}:${j(y[1])}`:`${j(y[0])}:${j(y[1])}:${j(y[2])}`,S=y=>y.split(":").map(D=>parseInt(D));return s.jsxs("div",{children:[u&&(o?s.jsx(en,{className:"block text-sm font-medium mb-2",label:u,tooltip:o}):s.jsx("label",{className:"block text-sm font-medium mb-2",children:u})),s.jsx("div",{className:W("space-y-2",m),children:s.jsxs("div",{className:"overflow-x-auto pb-2 flex flex-row gap-1 scroll-embedded",children:[d.map((y,D)=>s.jsxs("div",{className:W("flex items-center gap-1 px-2 shrink-0","rounded-full border border-slate-300 dark:border-slate-600","bg-slate-100 dark:bg-slate-700","shadow-sm hover:shadow-md"),children:[p==="time"&&s.jsx(de,{type:"time",value:h(y),step:"1",onChange:L=>{const M=L.target.value,Y=S(M),E=[...d];E[D]=Y,c(E)},className:"w-20.5 md:w-18.5",childClassName:"h-6 px-1 bg-slate-200 dark:bg-slate-600 shadow-none translate-y-[-1px]"}),p==="range"&&s.jsx("div",{className:"flex items-center gap-1",children:y.map((L,M)=>s.jsxs(je.Fragment,{children:[M===1&&s.jsx("span",{className:"mx-1 text-slate-500 dark:text-slate-300",children:"~"}),s.jsx(de,{type:"time",value:h(L),step:"1",onChange:Y=>{const E=S(Y.target.value),w=[...d];w[D][M]=E,c(w)},className:"w-18.5",childClassName:"h-6 px-1 bg-slate-200 dark:bg-slate-600 shadow-none translate-y-[-1px]"})]},M))}),s.jsx("button",{onClick:()=>x(D),className:`inline-flex items-center justify-center w-5 h-5\r - rounded-full text-red-500 hover:bg-red-100 dark:hover:bg-red-900 transition`,children:s.jsx(Kt,{className:"w-3.5 h-3.5"})})]},D)),s.jsxs("button",{onClick:p==="time"?C:g,className:W("flex items-center gap-1 px-3 py-0.5 shrink-0","rounded-full border-2 border-dashed border-slate-300 dark:border-slate-600","text-slate-600 dark:text-slate-200","hover:bg-slate-100 dark:hover:bg-slate-600"),children:[s.jsx(lu,{className:"w-4 h-4"})," ",b("add")]})]})})]})},Wr=ax("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function lb({className:u,variant:o,size:d,asChild:c=!1,...m}){const p=c?ep:"button";return s.jsx(p,{"data-slot":"button",className:W(Wr({variant:o,size:d,className:u})),...m})}function nb({className:u,classNames:o,showOutsideDays:d=!0,captionLayout:c="label",buttonVariant:m="ghost",formatters:p,components:b,...C}){const g=Km();return s.jsx(tp,{showOutsideDays:d,className:W("bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,u),captionLayout:c,formatters:{formatMonthDropdown:x=>x.toLocaleString("default",{month:"short"}),...p},classNames:{root:W("w-fit",g.root),months:W("flex gap-4 flex-col md:flex-row relative",g.months),month:W("flex flex-col w-full gap-4",g.month),nav:W("flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between",g.nav),button_previous:W(Wr({variant:m}),"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none",g.button_previous),button_next:W(Wr({variant:m}),"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none",g.button_next),month_caption:W("flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)",g.month_caption),dropdowns:W("w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5",g.dropdowns),dropdown_root:W("relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md",g.dropdown_root),dropdown:W("absolute bg-popover inset-0 opacity-0",g.dropdown),caption_label:W("select-none font-medium",c==="label"?"text-sm":"rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5",g.caption_label),table:"w-full border-collapse",weekdays:W("flex",g.weekdays),weekday:W("text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none",g.weekday),week:W("flex w-full mt-2",g.week),week_number_header:W("select-none w-(--cell-size)",g.week_number_header),week_number:W("text-[0.8rem] select-none text-muted-foreground",g.week_number),day:W("relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none",g.day),range_start:W("rounded-l-md bg-accent",g.range_start),range_middle:W("rounded-none",g.range_middle),range_end:W("rounded-r-md bg-accent",g.range_end),today:W("bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none",g.today),outside:W("text-muted-foreground aria-selected:text-muted-foreground",g.outside),disabled:W("text-muted-foreground opacity-50",g.disabled),hidden:W("invisible",g.hidden),...o},components:{Root:({className:x,rootRef:j,...h})=>s.jsx("div",{"data-slot":"calendar",ref:j,className:W(x),...h}),Chevron:({className:x,orientation:j,...h})=>j==="left"?s.jsx(Um,{className:W("size-4",x),...h}):j==="right"?s.jsx(Rm,{className:W("size-4",x),...h}):s.jsx("div",{}),DayButton:sb,WeekNumber:({children:x,...j})=>s.jsx("td",{...j,children:s.jsx("div",{className:"flex size-(--cell-size) items-center justify-center text-center",children:x})}),...b},...C})}function sb({className:u,day:o,modifiers:d,...c}){const m=Km(),p=O.useRef(null);return O.useEffect(()=>{d.focused&&p.current?.focus()},[d.focused]),s.jsx(lb,{ref:p,variant:"ghost",size:"icon","data-day":o.date.toLocaleDateString(),"data-selected-single":d.selected&&!d.range_start&&!d.range_end&&!d.range_middle,"data-range-start":d.range_start,"data-range-end":d.range_end,"data-range-middle":d.range_middle,className:W("data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70",m.day,u),...c})}const ib=({value:u,onChange:o,className:d,delay:c=500})=>{const[m,p]=O.useState(!1),b=u!=null?new Date(u):null,{t:C}=ne(),g=b?`${b.getFullYear()}-${String(b.getMonth()+1).padStart(2,"0")}-${String(b.getDate()).padStart(2,"0")}`:"0000-00-00",x=b?`${String(b.getHours()).padStart(2,"0")}:${String(b.getMinutes()).padStart(2,"0")}:${String(b.getSeconds()).padStart(2,"0")}`:"00:00:00",[j,h]=O.useState(x);O.useEffect(()=>{b&&h(`${String(b.getHours()).padStart(2,"0")}:${String(b.getMinutes()).padStart(2,"0")}:${String(b.getSeconds()).padStart(2,"0")}`)},[u]);const S=O.useRef(null),y=O.useCallback(L=>{if(!L){o(null);return}const M=b??new Date;M.setFullYear(L.getFullYear(),L.getMonth(),L.getDate()),O.startTransition(()=>{o(M.getTime()),p(!1)}),Dt(C("toast.dateUpdated"),{description:M.toLocaleString()})},[b,o,C]),D=O.useCallback(L=>{const M=L.target.value;h(M),S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{const[Y,E,w]=M.split(":").map(Z=>parseInt(Z,10)),R=b??new Date;R.setHours(Y||0,E||0,w||0),O.startTransition(()=>{o(R.getTime())}),Dt.success(C("toast.timeUpdated"),{description:R.toLocaleString()})},c)},[b,c,o,C]);return s.jsxs("div",{className:W("flex bg-transparent border px-4 rounded-lg py-0 w-fit h-8",d),children:[s.jsxs(nu,{open:m,onOpenChange:p,children:[s.jsx(su,{asChild:!0,children:s.jsx(de,{value:g,className:"justify-between font-mono !p-0",childClassName:"border-none !p-0 !bg-transparent shadow-none h-8"})}),s.jsx(iu,{className:"w-auto overflow-hidden p-0",align:"start",children:s.jsx(nb,{mode:"single",selected:b??void 0,captionLayout:"label",onSelect:y})})]}),s.jsx("span",{className:"mx-1 h-8",children:"."}),s.jsx(de,{type:"time",step:"1",value:j,onChange:D,className:"font-mono h-8",childClassName:`h-8\r - border-none !p-0 !bg-transparent shadow-none\r - focus:outline-none focus-visible:outline-none\r - focus-visible:!ring-0 focus-visible:!ring-offset-0\r - focus-visible:!border-current\r - focus-visible:[--tw-ring-color:transparent]\r - focus-visible:[--tw-ring-shadow:0_0_#0000]\r - focus-visible:[--tw-ring-offset-shadow:0_0_#0000]\r - `})]})},Fr=O.memo(ib),cb=({task:u,onClose:o,onSave:d,allTasks:c})=>{const{t:m}=ne(),[p,b]=O.useState({...u}),C=(x,j)=>{b(h=>({...h,[x]:j}))},g=()=>{d(p)};return s.jsx(ru,{isOpen:!0,onClose:o,title:m("scheduler.detailConfig"),width:80,children:s.jsxs("div",{className:"space-y-2",children:[s.jsx(de,{label:m("scheduler.eventName"),value:p.event_name,disabled:!0}),s.jsx("label",{className:"block text-sm font-medium",children:m("scheduler.nextTick")}),s.jsx(Fr,{value:u.next_tick*1e3,onChange:x=>C("next_tick",Math.floor(x/1e3)),className:"w-full justify-center flex xl:hidden"}),s.jsxs("div",{className:"grid grid-cols-1 gap-y-2 lg:grid-cols-2 gap-2",children:[s.jsx(de,{label:m("scheduler.priority"),type:"number",value:p.priority??0,onChange:x=>C("priority",Number(x.target.value))}),s.jsx(de,{label:m("scheduler.interval"),type:"number",value:p.interval??0,onChange:x=>C("interval",Number(x.target.value)),min:0}),s.jsx(_m,{label:m("scheduler.dailyReset"),values:p.daily_reset??[],onChange:x=>{C("daily_reset",x)},mode:"time"}),s.jsx(_m,{label:m("scheduler.disabledRange"),values:p.disabled_time_range??[],onChange:x=>{C("disabled_time_range",x)},mode:"range"}),s.jsx(Sm,{label:m("scheduler.preTask"),values:p.pre_task??[],onChange:x=>{b(j=>({...j,pre_task:x}))},alternatives:c,translatePrefix:"eventName"}),s.jsx(Sm,{label:m("scheduler.postTask"),values:p.post_task??[],onChange:x=>{b(j=>({...j,post_task:x}))},alternatives:c,translatePrefix:"eventName"})]}),s.jsx(Gt,{}),s.jsx("div",{className:"flex justify-end gap-2 pt-1",children:s.jsx(Ae,{onClick:g,children:m("common.confirm")})})]})})},Fn=({text:u,tooltip:o,className:d})=>s.jsx(ih,{children:s.jsxs(ch,{children:[s.jsx(rh,{asChild:!0,children:s.jsx("div",{className:`overflow-hidden whitespace-nowrap text-ellipsis cursor-default ${d??""}`,children:u})}),s.jsx(uh,{children:s.jsx("p",{children:o||u})})]})}),rb=[],Nm=je.memo(function({task:o,side:d,onMove:c,onEdit:m,onChangeTime:p,t:b}){return s.jsx("div",{className:"flex items-center justify-between bg-slate-50 dark:bg-slate-700 p-2 rounded-md gap-2 min-w-0 overflow-x-hidden",children:d==="left"?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"flex flex-grow min-w-0 overflow-hidden text-ellipsis text-left mr-2",children:s.jsx(Fn,{text:b("eventName."+o.func_name)})}),s.jsx(Fr,{value:o.next_tick*1e3,onChange:C=>p(o,C),className:"hidden xl:flex"}),s.jsx(Ae,{onClick:()=>m(o),className:"rounded-[50%] w-8 h-8",children:s.jsx(Vr,{className:"w-4 h-4 translate-x-[-8px]"})}),s.jsx(Gt,{orientation:"vertical",className:"!h-8"}),s.jsxs(Ae,{onClick:()=>c(o,!0),className:"rounded-[50%] w-8 h-8",children:[s.jsx(Bm,{className:"w-4 h-4 translate-x-[-8px] max-md:hidden"}),s.jsx(qm,{className:"w-4 h-4 translate-x-[-8px] md:hidden"})]})]}):s.jsxs(s.Fragment,{children:[s.jsxs(Ae,{onClick:()=>c(o,!1),className:"rounded-[50%] w-8 h-8",children:[s.jsx(Lm,{className:"w-4 h-4 translate-x-[-8px] max-md:hidden"}),s.jsx(Gm,{className:"w-4 h-4 translate-x-[-8px] md:hidden"})]}),s.jsx(Gt,{orientation:"vertical",className:"!h-8"}),s.jsx(Ae,{onClick:()=>m(o),className:"rounded-[50%] w-8 h-8",children:s.jsx(Vr,{className:"w-4 h-4 translate-x-[-8px]"})}),s.jsx(Fr,{value:o.next_tick*1e3,onChange:C=>p(o,C),className:"hidden xl:flex"}),s.jsx("div",{className:"flex flex-grow min-w-0 overflow-hidden text-ellipsis text-right mr-2 justify-end",children:s.jsx(Fn,{text:b("eventName."+o.func_name)})})]})})}),ub=({profileId:u})=>{const{t:o}=ne(),{profiles:d,activeProfile:c}=Ja(),m=u??c?.id,p=O.useMemo(()=>d.find(K=>K.id===m)??c??null,[d,m,c]),[b,C]=O.useState(""),[g,x]=O.useState("default"),[j,h]=O.useState(null),S=V(K=>K.statusStore[u]?.current_task),y=V(K=>K.statusStore[u]?.waiting_tasks),D=V(K=>K.eventStore[u]??rb),L=V(K=>K.modify),M=O.useMemo(()=>{let K=D.filter(G=>G.event_name.includes(b));return g==="default"?K=[...K].sort((G,ee)=>G.priority-ee.priority):g==="time"&&(K=[...K].sort((G,ee)=>new Date(ee.next_tick).getTime()-new Date(G.next_tick).getTime())),K},[D,b,g]),Y=M.filter(K=>!K.enabled),E=M.filter(K=>K.enabled),w=O.useCallback(K=>{L(`${u}::event`,K)},[]),R=O.useCallback((K,G)=>{O.startTransition(()=>{w(D.map(ee=>ee.func_name===K.func_name?{...ee,enabled:G}:ee))})},[D,w]),Z=O.useCallback((K,G)=>{w(D.map(ee=>ee.func_name===K.func_name?{...ee,next_tick:Math.floor(G/1e3)}:ee))},[D,w]),I=O.useCallback(K=>{h(K)},[]),fe=K=>{O.startTransition(()=>{w(D.map(G=>({...G,enabled:K})))})},Ce=()=>{const K=new Date().getTime();O.startTransition(()=>{w(D.map(G=>({...G,next_tick:Math.floor(K/1e3)})))})},Ve=K=>{O.startTransition(()=>{w(D.map(G=>G.func_name===K.func_name?K:G)),h(null)})};return s.jsxs("div",{className:"h-full flex flex-col gap-4 min-h-0",children:[s.jsxs("div",{className:"flex",children:[s.jsx("h2",{className:"text-2xl font-bold text-slate-800 dark:text-slate-100",children:o("scheduler")}),s.jsxs("h2",{className:"text-2xl ml-3 text-slate-500 dark:text-slate-400",children:["#",p?.name]})]}),s.jsx("div",{className:"grid grid-cols-1 gap-2",children:s.jsxs(kt,{children:[s.jsx(Xa,{children:s.jsxs(Za,{className:"flex items-center",children:[s.jsx(Kr,{className:"w-5 h-5 mr-2 text-primary-500"}),o("taskOverview")]})}),s.jsx(ma,{children:s.jsxs("div",{className:"space-y-1",children:[s.jsx("div",{className:"border-dashed border-b-2 pb-1",children:S?s.jsx("div",{className:"px-3 py-2 bg-primary-100 dark:bg-primary-800 rounded-md",children:s.jsxs("span",{className:"text-primary-700 dark:text-primary-300 font-semibold",children:[o("runningTask"),": ",o(S)]})}):s.jsx("p",{className:"text-slate-500 dark:text-slate-400",children:o("noTaskRunning")})}),y&&y.length>0?s.jsx("ul",{className:"space-y-0 h-35 overflow-auto pr-2 gap-2 flex flex-col",children:y.map((K,G)=>s.jsx("div",{className:"px-3 py-2 bg-slate-100 dark:bg-slate-800 rounded-md",children:s.jsx("span",{className:"text-slate-700 dark:text-slate-300",children:K})},G))}):s.jsx("p",{className:"h-35 max-h-35 text-slate-500 dark:text-slate-400",children:o("noTasksQueued")})]})})]})}),s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s.jsx(Ym,{size:20}),s.jsx("div",{className:"flex-1 bg-white dark:bg-slate-800 rounded-md shadow-sm",children:s.jsx(de,{placeholder:o("scheduler.search"),value:b,onChange:K=>C(K.target.value),className:"w-full"})}),s.jsx("div",{className:"bg-white dark:bg-slate-800 rounded-md shadow-sm",children:s.jsx(Oe,{onChange:K=>x(K),value:g,options:[{label:o("scheduler.sortDefault"),value:"default"},{label:o("scheduler.sortByTime"),value:"time"}]})}),s.jsx(Ae,{variant:"primary",onClick:Ce,className:"mr-2 rounded-[50%] w-8 h-8",children:s.jsx(lx,{className:"w-4 h-4 translate-x-[-8px]"})})]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 flex-1 md:min-h-40",children:[s.jsx(kt,{className:"flex flex-col min-h-0",children:s.jsxs(ma,{className:"pr-1 sm:pr-4 flex flex-col flex-1 min-h-0",children:[s.jsxs("div",{className:"flex justify-between mb-2",children:[s.jsxs("div",{className:"flex items-center",children:[s.jsx(nx,{className:"w-5 h-5 mr-2 text-red-500"}),s.jsx("span",{className:"font-medium",children:o("scheduler.inactiveTasks")})]}),s.jsxs(Ae,{variant:"primary",onClick:()=>fe(!0),className:"rounded-[50%] w-8 h-8 mr-4.5",children:[s.jsx(Bm,{className:"w-4 h-4 translate-x-[-8px] max-md:hidden"}),s.jsx(qm,{className:"w-4 h-4 translate-x-[-8px] md:hidden"})]})]}),s.jsx("div",{className:"flex-1 min-h-0 overflow-auto space-y-2 scroll-embedded pr-1 max-md:max-h-40",children:Y.map(K=>s.jsx(Nm,{task:K,side:"left",onMove:R,onEdit:I,onChangeTime:Z,t:o},K.func_name))})]})}),s.jsx(kt,{className:"flex flex-col min-h-0",children:s.jsxs(ma,{className:"flex flex-col flex-1 min-h-0",children:[s.jsxs("div",{className:"flex justify-between mb-2",children:[s.jsxs(Ae,{variant:"primary",onClick:()=>fe(!1),className:"rounded-[50%] w-8 h-8 ml-2",children:[s.jsx(Lm,{className:"w-4 h-4 translate-x-[-8px] max-md:hidden"}),s.jsx(Gm,{className:"w-4 h-4 translate-x-[-8px] md:hidden"})]}),s.jsxs("div",{className:"flex items-center",children:[s.jsx("span",{className:"font-medium",children:o("scheduler.activeTasks")}),s.jsx(eu,{className:"w-5 h-5 ml-2 text-green-500"})]})]}),s.jsx("div",{className:"flex-1 min-h-0 overflow-auto space-y-2 scroll-embedded pr-1 max-md:max-h-40",children:E.map(K=>s.jsx(Nm,{task:K,side:"right",onMove:R,onEdit:I,onChangeTime:Z,t:o},K.func_name))})]})})]}),j&&s.jsx(cb,{task:j,onClose:()=>h(null),onSave:Ve,allTasks:D.filter(K=>K.func_name!=j.func_name).map(K=>K.func_name)})]})},In=({isOpen:u,onClose:o,allStudents:d,selected:c,onChange:m,lang:p="JP"})=>{const{t:b}=ne(),[C,g]=O.useState(""),x=S=>p==="CN"?S.CN_name:p==="Global"?S.Global_name:S.JP_name,j=O.useMemo(()=>d.filter(S=>typeof S=="string"?S.toLowerCase().includes(C.toLowerCase()):x(S).toLowerCase().includes(C.toLowerCase())),[C,d,p]),h=S=>{c.includes(S)?m(c.filter(y=>y!==S)):m([...c,S])};return s.jsxs(Zm,{open:u,onClose:o,className:"relative z-50",children:[s.jsx("div",{className:"fixed inset-0 bg-black/30","aria-hidden":"true"}),s.jsx("div",{className:"fixed inset-0 flex items-center justify-center",children:s.jsxs(Vm,{className:"w-full max-w-3xl rounded-lg bg-white dark:bg-slate-800 p-6 shadow-lg",children:[s.jsxs("div",{className:"flex justify-between items-center mb-4",children:[s.jsx(Jm,{className:"text-lg font-semibold",children:b("artifact.selectStudent")}),s.jsx("button",{onClick:o,children:s.jsx(Kt,{className:"w-5 h-5 text-slate-500"})})]}),s.jsx("input",{type:"text",placeholder:b("student.search"),value:C,onChange:S=>g(S.target.value),className:"w-full mb-4 px-3 py-2 border rounded-md focus:ring-primary-500 focus:border-primary-500"}),s.jsx("div",{className:"flex flex-wrap gap-2 max-h-96 overflow-y-auto",children:j.map(S=>{const y=typeof S=="string"?S:x(S),D=c.includes(y);return s.jsx("button",{onClick:()=>h(y),className:`px-3 py-1 rounded-full text-sm border transition ${D?"bg-primary-600 text-white border-primary-600":"bg-slate-100 dark:bg-slate-700 border-slate-300"}`,children:y},y)})})]})})]})};function Pn({className:u,...o}){return s.jsx(ap,{"data-slot":"tabs",className:W("flex flex-col gap-2",u),...o})}function es({className:u,...o}){return s.jsx(lp,{"data-slot":"tabs-list",className:W("bg-muted text-muted-foreground dark:bg-slate-800 dark:text-white inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",u),...o})}function Lt({className:u,...o}){return s.jsx(np,{"data-slot":"tabs-trigger",className:W("data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",u),...o})}function Jt({className:u,...o}){return s.jsx(sp,{"data-slot":"tabs-content",className:W("flex-1 outline-none",u),...o})}const ob=(u,o,d)=>Math.max(o,Math.min(d,u)),db=({onClose:u,profileId:o})=>{const c=V(w=>w.staticStore).student_names,{t:m}=ne(),p=V(w=>w.configStore[o]),b=V(w=>w.modify),C=O.useMemo(()=>({cafe_reward_collect_hour_reward:p.cafe_reward_collect_hour_reward??!1,cafe_reward_use_invitation_ticket:p.cafe_reward_use_invitation_ticket??!0,cafe_reward_allow_exchange_student:p.cafe_reward_allow_exchange_student??!0,cafe_reward_allow_duplicate_invite:p.cafe_reward_allow_duplicate_invite??!1,cafe_reward_has_no2_cafe:p.cafe_reward_has_no2_cafe??!1,cafe_reward_affection_pat_round:p.cafe_reward_affection_pat_round??5,patStyle:p.patStyle??"普通",cafe_reward_invite1_criterion:p.cafe_reward_invite1_criterion??"lowest_affection",cafe_reward_invite2_criterion:p.cafe_reward_invite2_criterion??"lowest_affection",cafe_reward_invite1_starred_student_position:String(p.cafe_reward_invite1_starred_student_position??"1"),cafe_reward_invite2_starred_student_position:String(p.cafe_reward_invite2_starred_student_position??"1"),favorStudent1:p.favorStudent1??[],favorStudent2:p.favorStudent2??[]}),[p]),[g,x]=O.useState(C),[j,h]=O.useState(!1),[S,y]=O.useState(!1);O.useEffect(()=>x(C),[C]);const D=JSON.stringify(g)!==JSON.stringify(C),L=w=>R=>x(Z=>({...Z,[w]:R})),M=w=>{const R=w.target.value;if(R==="")return x(I=>({...I,cafe_reward_affection_pat_round:""}));const Z=Number(R);Number.isFinite(Z)&&x(I=>({...I,cafe_reward_affection_pat_round:ob(Math.trunc(Z),4,15)}))},Y=w=>R=>{x(Z=>({...Z,[w]:R}))},E=async()=>{const w={};if(Object.keys(g).forEach(R=>{g[R]!==C[R]&&(w[R]=g[R])}),Object.keys(w).length===0){u();return}b(`${o}::config`,w),u()};return s.jsxs("div",{className:"space-y-2",children:[s.jsxs(Pn,{defaultValue:"basic",className:"w-full",children:[s.jsxs(es,{className:"grid grid-cols-3 w-full",children:[s.jsx(Lt,{value:"basic",children:m("cafe.basicSettings")}),s.jsx(Lt,{value:"cafe1",children:m("cafe.cafe1Settings")}),g.cafe_reward_has_no2_cafe&&s.jsx(Lt,{value:"cafe2",children:m("cafe.cafe2Settings")})]}),s.jsxs(Jt,{value:"basic",className:"space-y-6",children:[s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-2",children:[["cafe_reward_collect_hour_reward","cafe.collectReward"],["cafe_reward_use_invitation_ticket","cafe.useInvitation"],["cafe_reward_allow_exchange_student","cafe.exchangeStudent"],["cafe_reward_allow_duplicate_invite","cafe.duplicateInvite"],["cafe_reward_has_no2_cafe","cafe.hasNo2Cafe"]].map(([w,R])=>s.jsx(nt,{label:m(R),checked:g[w],onChange:L(w)},R))}),s.jsx(Gt,{}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-2",children:[s.jsx(de,{label:m("cafe.patRounds"),tooltip:m("cafe.patRoundsDesc"),type:"number",value:g.cafe_reward_affection_pat_round,onChange:M,min:4,max:15}),s.jsx(Oe,{label:m("cafe.patStyle"),value:g.patStyle,onChange:Y("pat_style"),options:[{value:"拖动礼物",label:m("cafe.patStyleDragGift")}]})]})]}),s.jsxs(Jt,{value:"cafe1",className:"space-y-6 pt-4",children:[s.jsx(Oe,{label:m("cafe.invite1Mode"),value:g.cafe_reward_invite1_criterion,onChange:Y("cafe_reward_invite1_criterion"),options:[{value:"lowest_affection",label:m("cafe.lowestAffection")},{value:"highest_affection",label:m("cafe.highestAffection")},{value:"starred",label:m("cafe.starred")},{value:"name",label:m("cafe.byName")}]}),g.cafe_reward_invite1_criterion==="starred"&&s.jsx(Oe,{label:m("cafe.starredPosition"),value:g.cafe_reward_invite1_starred_student_position,onChange:Y("cafe_invite1_starred_position"),options:[1,2,3,4,5].map(w=>({value:String(w),label:String(w)}))}),g.cafe_reward_invite1_criterion==="name"&&s.jsxs("div",{className:"space-y-2",children:[s.jsx("label",{className:"block text-sm font-medium",children:m("cafe.cafe1Students")}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[g.favorStudent1.map(w=>s.jsxs("span",{className:"flex items-center gap-1 px-2 py-1 bg-slate-200 rounded-full text-sm dark:bg-slate-700",children:[w,s.jsx("button",{onClick:()=>x(R=>({...R,favorStudent1:R.favorStudent1.filter(Z=>Z!==w)})),children:s.jsx(Kt,{className:"w-3 h-3"})})]},w)),s.jsx("button",{onClick:()=>h(!0),className:"px-3 py-1 text-sm border rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 transition",children:m("Add Student")})]})]})]}),g.cafe_reward_has_no2_cafe&&s.jsxs(Jt,{value:"cafe2",className:"space-y-6 pt-4",children:[s.jsx(Oe,{label:m("cafe.invite2Mode"),value:g.cafe_reward_invite2_criterion,onChange:Y("cafe_reward_invite2_criterion"),options:[{value:"lowest_affection",label:m("cafe.lowestAffection")},{value:"highest_affection",label:m("cafe.highestAffection")},{value:"starred",label:m("cafe.starred")},{value:"name",label:m("cafe.byName")}]}),g.cafe_reward_invite2_criterion==="starred"&&s.jsx(Oe,{label:m("cafe.starredPosition"),value:g.cafe_reward_invite2_starred_student_position,onChange:Y("cafe_invite2_starred_position"),options:[1,2,3,4,5].map(w=>({value:String(w),label:String(w)}))}),g.cafe_reward_invite2_criterion==="name"&&s.jsxs("div",{className:"space-y-2",children:[s.jsx("label",{className:"block text-sm font-medium",children:m("cafe.cafe2Students")}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[g.favorStudent2.map(w=>s.jsxs("span",{className:"flex items-center gap-1 px-2 py-1 bg-slate-200 rounded-full text-sm dark:bg-slate-700",children:[w,s.jsx("button",{onClick:()=>x(R=>({...R,favorStudent2:R.favorStudent2.filter(Z=>Z!==w)})),children:s.jsx(Kt,{className:"w-3 h-3"})})]},w)),s.jsx("button",{onClick:()=>y(!0),className:"px-3 py-1 text-sm border rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 transition",children:m("Add Student")})]})]})]})]}),s.jsx(In,{isOpen:j,onClose:()=>h(!1),allStudents:c,selected:g.favorStudent1,onChange:w=>x(R=>({...R,favorStudent1:w})),lang:Va[p.server]}),s.jsx(In,{isOpen:S,onClose:()=>y(!1),allStudents:c,selected:g.favorStudent2,onChange:w=>x(R=>({...R,favorStudent2:w})),lang:Va[p.server]}),s.jsx(Gt,{}),s.jsx("div",{className:"flex justify-end pt-4",children:s.jsx("button",{onClick:E,disabled:!D||g.cafe_reward_affection_pat_round==="",className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:m("save")})})]})},fb=({onSelect:u})=>{const{t:o}=ne(),[d,c]=O.useState(!1),[m,p]=O.useState(!1),[b,C]=O.useState([]),g=V(j=>j.trigger),x=async()=>{p(!0),g({timestamp:qt(),command:"detect_adb",payload:{}},j=>{console.log("detect_adb",j.data.addresses);const h=j.data.addresses;!h||h.length===0?C([]):C(h),p(!1)})};return s.jsxs(s.Fragment,{children:[s.jsx(Ae,{variant:"primary",onClick:()=>c(!0),style:{borderRadius:"50%",padding:"8px",width:"36px",height:"36px"},children:s.jsx(gm,{size:20})}),s.jsx(ru,{isOpen:d,onClose:()=>c(!1),title:o("adb.title"),width:40,children:s.jsxs("div",{className:"space-y-2",children:[s.jsx(Ae,{onClick:x,disabled:m,className:"w-full",children:m?s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}),o("adb.detecting")]}):s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(gm,{className:"mr-2 h-4 w-4"}),o("adb.detectBtn")]})}),s.jsxs("div",{className:"space-y-2 max-h-60 overflow-y-auto",children:[b.map(j=>s.jsx(kt,{className:"p-2 cursor-pointer hover:bg-slate-100 dark:hover:bg-slate-700",onClick:()=>{u?.(j),c(!1)},children:j},j)),b.length===0&&!m&&s.jsx("p",{className:"text-sm text-slate-500",children:o("adb.noData")||"No results found"})]})]})})]})},mb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(S=>S.configStore[u]),m=V(S=>S.modify),p=je.useMemo(()=>({server:c.server,adbIP:c.adbIP,adbPort:c.adbPort}),[c]),[b,C]=je.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=S=>y=>{C(D=>({...D,[S]:y}))},j=async()=>{const S={};if(Object.keys(b).forEach(y=>{JSON.stringify(b[y])!==JSON.stringify(p[y])&&(S[y]=b[y])}),Object.keys(S).length===0){o();return}m(`${u}::config`,S),o()},h=S=>{const{name:y,value:D}=S.target;C(L=>({...L,[y]:D}))};return s.jsxs("div",{className:"space-y-2",children:[s.jsx(Oe,{label:d("server.server"),value:b.server,disabled:!0,onChange:x("server"),options:[{label:d("server.cn.official"),value:"官服"},{label:d("server.cn.bilibili"),value:"B服"},{label:d("server.global"),value:"国际服"},{label:d("server.global.teen"),value:"国际服青少年"},{label:d("server.kr.one"),value:"韩国ONE"},{label:d("server.jp"),value:"日服"}]}),s.jsx(de,{id:"adbIP",name:"adbIP",type:"text",label:d("server.adbIP"),value:b.adbIP,onChange:h,className:"w-full",placeholder:"127.0.0.1"}),s.jsxs("div",{className:"flex items-end justify-end gap-2",children:[s.jsx(de,{id:"adbPort",name:"adbPort",label:d("server.adbPort"),type:"number",value:b.adbPort,onChange:h,className:"flex-1",min:0,max:65535}),s.jsx(fb,{onSelect:S=>{C(y=>{const[D,L]=S.split(":");return{...y,adbIP:D,adbPort:L}})}})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:j,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},yi=["primary","normal","advanced","superior"],hb=({onClose:u,profileId:o})=>{const{t:d}=ne(),c=V(E=>E.configStore[o]),m=V(E=>E.modify),p=V(E=>E.staticStore),b=p.lesson_region_name[Cp[c.server]],C=p.student_names,[g,x]=O.useState(!1),j=O.useMemo(()=>{let E;if(!c.lesson_each_region_object_priority)E=b.map(()=>[...yi]);else if(c.lesson_each_region_object_priority.lengthyi);E=[...c.lesson_each_region_object_priority,...R]}else c.lesson_each_region_object_priority.length>b.length?E=c.lesson_each_region_object_priority.slice(0,b.length):E=c.lesson_each_region_object_priority;let w;if(!c.lesson_times)w=b.map(()=>1);else if(c.lesson_times.length1);w=[...c.lesson_times,...R]}else c.lesson_times.length>b.length?w=c.lesson_times.slice(0,b.length):w=c.lesson_times;return{lesson_enableInviteFavorStudent:c.lesson_enableInviteFavorStudent??!1,lesson_favorStudent:c.lesson_favorStudent??[],lesson_relationship_first:c.lesson_relationship_first??!1,lesson_each_region_object_priority:E,lesson_times:w}},[c]),[h,S]=O.useState(j);O.useEffect(()=>{S(E=>JSON.stringify(E)!==JSON.stringify(j)?j:E)},[j]);const y=JSON.stringify(h)!==JSON.stringify(j),D=async()=>{const E={};if(Object.keys(h).forEach(w=>{JSON.stringify(h[w])!==JSON.stringify(j[w])&&(E[w]=h[w])}),Object.keys(E).length===0){u();return}m(`${o}::config`,E),u()},L=E=>{S(w=>({...w,lesson_favorStudent:w.lesson_favorStudent.filter(R=>R!==E)}))},M=(E,w)=>{S(R=>{const Z=R.lesson_each_region_object_priority.map(I=>[...I]);return Z[E].includes(w)?Z[E]=Z[E].filter(I=>I!==w):Z[E].push(w),{...R,lesson_each_region_object_priority:Z}})},Y=(E,w)=>{const R=Number(w);Number.isFinite(R)&&S(Z=>{const I=[...Z.lesson_times];return I[E]=R,{...Z,lesson_times:I}})};return s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-2",children:[s.jsx(nt,{checked:h.lesson_enableInviteFavorStudent,label:d("lesson.enableFavorStudent"),onChange:E=>S(w=>({...w,lesson_enableInviteFavorStudent:E}))}),s.jsx(nt,{checked:h.lesson_relationship_first,label:d("lesson.relationshipFirst"),onChange:E=>S(w=>({...w,lesson_relationship_first:E}))})]}),h.lesson_enableInviteFavorStudent&&s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium mb-2 text-slate-700 dark:text-slate-200",children:d("lesson.favorStudent")}),s.jsx("div",{className:"overflow-x-auto pb-1 scroll-embedded",children:s.jsxs(Ir,{axis:"x",values:h.lesson_favorStudent,onReorder:E=>S(w=>({...w,lesson_favorStudent:E})),className:"flex gap-1 min-w-max",children:[h.lesson_favorStudent.map((E,w)=>s.jsxs(Pr,{value:E,className:`\r - flex items-center gap-2 px-3 py-0.5 shrink-0\r - rounded-full border border-slate-300 dark:border-slate-600\r - bg-slate-100 dark:bg-slate-700\r - shadow-sm hover:shadow-md\r - cursor-grab\r - `,children:[s.jsx("span",{className:"flex items-center justify-center w-5 h-5 text-xs font-medium rounded-full bg-primary text-primary-foreground",children:w+1}),s.jsx("span",{className:"text-sm",children:E}),s.jsx("button",{onClick:()=>L(E),className:"ml-1 inline-flex items-center justify-center w-5 h-5 rounded-full text-red-500 hover:bg-red-100 dark:hover:bg-red-900 transition",children:s.jsx(Kt,{className:"w-3.5 h-3.5"})})]},E)),s.jsxs("button",{onClick:()=>x(!0),className:`\r - flex items-center gap-1 px-3 py-0.5 shrink-0\r - rounded-full border-2 border-dashed border-slate-300 dark:border-slate-600\r - text-slate-600 dark:text-slate-200\r - hover:bg-slate-100 dark:hover:bg-slate-600\r - `,children:[s.jsx(lu,{className:"w-4 h-4"})," ",d("add")]})]})})]}),s.jsx(Gt,{}),s.jsx("div",{className:"overflow-y-auto overflow-x-auto border rounded-md",style:{maxHeight:"calc(100vh - 320px)",minHeight:"80px"},children:s.jsxs("table",{className:"min-w-full text-sm",children:[s.jsx("thead",{className:"sticky top-0 bg-slate-100 dark:bg-slate-700 z-10",children:s.jsxs("tr",{children:[s.jsx("th",{className:"px-2 py-1 border text-left",children:d("lesson.region")}),yi.map(E=>s.jsx("th",{className:"px-2 py-1 border",children:d(`schedule.${E}`)},E)),s.jsx("th",{className:"px-2 py-1 border",children:d("lesson.times")})]})}),s.jsx("tbody",{children:b.map((E,w)=>s.jsxs("tr",{children:[s.jsx("td",{className:"px-2 py-1 border",children:E}),yi.map((R,Z)=>s.jsx("td",{className:"px-2 py-1 border text-center",children:s.jsxs("label",{className:"relative inline-flex items-center cursor-pointer mt-1",children:[s.jsx("input",{type:"checkbox",checked:h.lesson_each_region_object_priority[w].includes(R),onChange:()=>M(w,R),className:`\r - peer w-6 h-6 cursor-pointer\r - appearance-none\r - rounded-full border\r - border-slate-500 dark:border-slate-400\r - bg-slate-100 dark:bg-slate-700\r - checked:bg-primary-400 checked:border-slate-500\r - dark:checked:bg-primary-600 dark:checked:border-slate-400\r - checked:text-primary-foreground\r - focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\r - disabled:cursor-not-allowed disabled:opacity-50\r - `}),s.jsx(Dm,{className:`\r - pointer-events-none absolute left-0.5 top-0.5 h-5 w-5 text-white\r - opacity-0 peer-checked:opacity-100 transition-opacity\r - `})]})},Z)),s.jsx("td",{className:"px-2 py-1 border ",children:s.jsx(de,{type:"number",value:h.lesson_times[w],onChange:R=>Y(w,R.target.value),min:0,max:99,className:"w-20 px-1 m-auto"})})]},w))})]})}),s.jsx(In,{isOpen:g,onClose:()=>x(!1),allStudents:C,selected:h.lesson_favorStudent,onChange:E=>S(w=>({...w,lesson_favorStudent:E})),lang:Va[c.server]}),s.jsx("div",{className:"flex justify-end pt-4 border-t",children:s.jsx("button",{onClick:D,disabled:!y,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},gb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(w=>w.staticStore),m=V(w=>w.configStore[u]),p=V(w=>w.modify),b=Va[m.server],C=c.common_shop_price_list[b],g=c.tactical_challenge_shop_price_list[b],x={common:{title:d("commonShop.title"),listKey:"CommonShopList",refreshKey:"CommonShopRefreshTime",defaultGoods:C},tactical:{title:d("tacticalShop.title"),listKey:"TacticalChallengeShopList",refreshKey:"TacticalChallengeShopRefreshTime",defaultGoods:g}},[j,h]=O.useState("common"),S=O.useMemo(()=>({CommonShopList:m.CommonShopList||Array(x.common.defaultGoods.length).fill(0),CommonShopRefreshTime:m.CommonShopRefreshTime??0,TacticalChallengeShopList:m.TacticalChallengeShopList||Array(x.tactical.defaultGoods.length).fill(0),TacticalChallengeShopRefreshTime:m.TacticalChallengeShopRefreshTime??0}),[m]),[y,D]=O.useState(S);O.useEffect(()=>{D(S)},[S]);const L=JSON.stringify(y)!==JSON.stringify(S),M=(w,R)=>{D(Z=>{const I=w==="common"?[...Z.CommonShopList]:[...Z.TacticalChallengeShopList];return I[R]=I[R]===1?0:1,w==="common"?{...Z,CommonShopList:I}:{...Z,TacticalChallengeShopList:I}})},Y=(w,R)=>{const Z=R.target.value;if(Z===""){D(fe=>w==="common"?{...fe,CommonShopRefreshTime:""}:{...fe,TacticalChallengeShopRefreshTime:""});return}const I=Number(Z);Number.isFinite(I)&&D(fe=>w==="common"?{...fe,CommonShopRefreshTime:Math.max(0,Math.min(I,5))}:{...fe,TacticalChallengeShopRefreshTime:Math.max(0,Math.min(I,5))})},E=async()=>{if(!L){o();return}const w={};Object.keys(y).forEach(R=>{y[R]!==S[R]&&(w[R]=y[R])}),p(`${u}::config`,w),o()};return s.jsxs("div",{className:"space-y-6",children:[s.jsxs(Pn,{defaultValue:"common",value:j,onValueChange:w=>h(w),children:[s.jsxs(es,{className:"grid grid-cols-2 w-full",children:[s.jsx(Lt,{value:"common",children:x.common.title}),s.jsx(Lt,{value:"tactical",children:x.tactical.title})]}),["common","tactical"].map(w=>{const R=x[w];return s.jsxs(Jt,{value:w,className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center justify-between p-4 bg-slate-50 dark:bg-slate-700/50 rounded-lg",children:[s.jsxs("div",{children:[s.jsx("label",{className:"text-slate-700 dark:text-slate-200 font-medium",children:d("commonShop.refreshTimes")}),s.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:d("commonShop.refreshDesc")})]}),s.jsx(de,{type:"number",min:0,max:5,value:w==="common"?y.CommonShopRefreshTime:y.TacticalChallengeShopRefreshTime,onChange:Z=>Y(w,Z),className:"w-20"})]}),s.jsx("div",{className:"max-h-[40vh] overflow-y-auto pr-1 grid grid-cols-2 gap-1",children:R.defaultGoods.map(([Z,I,fe],Ce)=>{const Ve=(w==="common"?y.CommonShopList:y.TacticalChallengeShopList)[Ce]===1,K=fe==="creditpoints"?`${I} ${d("creditpoints")}`:`${I} ${d("pyroxene")}`;return s.jsx("div",{className:`${Ve?"bg-primary-600 text-white hover:bg-primary-700":"bg-slate-200 text-slate-800 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600"} p-2 rounded-lg cursor-pointer`,onClick:()=>M(w,Ce),children:s.jsxs("div",{children:[s.jsx(Fn,{text:Z}),s.jsx("div",{className:`text-sm ${Ve?"text-slate-200":"text-slate-500 dark:text-slate-400"}`,children:K})]})},`${Z}-${Ce}`)})})]},w)})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:E,disabled:!L,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 disabled:opacity-60",children:d("save")})})]})},xb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(S=>S.configStore[u]),m=V(S=>S.modify),p=O.useMemo(()=>({ArenaLevelDiff:c.ArenaLevelDiff,ArenaComponentNumber:c.ArenaComponentNumber,maxArenaRefreshTimes:c.maxArenaRefreshTimes}),[c]),[b,C]=O.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=S=>y=>{const D=parseInt(y,10);isNaN(D)||C(L=>({...L,[S]:D}))},j=S=>{const{name:y,value:D}=S.target,L=parseInt(D,10);isNaN(L)||C(M=>({...M,[y]:L}))},h=async()=>{const S={};if(Object.keys(b).forEach(y=>{JSON.stringify(b[y])!==JSON.stringify(p[y])&&(S[y]=b[y])}),Object.keys(S).length===0){o();return}m(`${u}::config`,S),o()};return s.jsxs("div",{className:"space-y-6",children:[s.jsxs("div",{className:"space-y-2",children:[s.jsx(de,{id:"ArenaLevelDiff",name:"ArenaLevelDiff",label:d("arena.higherLevel"),type:"number",className:"w-full",value:b.ArenaLevelDiff,onChange:j,min:"-89",max:"89"}),s.jsx(de,{id:"maxArenaRefreshTimes",name:"maxArenaRefreshTimes",label:d("arena.max_refresh_times"),type:"number",className:"w-full",value:b.maxArenaRefreshTimes,onChange:j,min:"0"}),s.jsx(Oe,{label:d("arena.opponent_no"),className:"w-full",value:b.ArenaComponentNumber.toString(),onChange:x("ArenaComponentNumber"),options:[{value:"1",label:"1"},{value:"2",label:"2"},{value:"3",label:"3"}],placeholder:d("selectPlaceholder")||void 0})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:h,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},pb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(M=>M.configStore[u]),m=V(M=>M.modify),b=V(M=>M.staticStore).hard_task_student_material,[C,g]=O.useState(!1),x=O.useMemo(()=>({mainlinePriority:c.mainlinePriority,hardPriority:c.hardPriority,rewarded_task_times:c.rewarded_task_times,scrimmage_times:c.scrimmage_times,activity_sweep_task_number:c.activity_sweep_task_number,activity_sweep_times:c.activity_sweep_times,special_task_times:c.special_task_times,purchase_rewarded_task_ticket_times:c.purchase_rewarded_task_ticket_times,purchase_lesson_ticket_times:c.purchase_lesson_ticket_times,purchase_scrimmage_ticket_times:c.purchase_scrimmage_ticket_times}),[]),[j,h]=O.useState(x),S=M=>b.filter(([Y,E])=>E===M).map(([Y])=>Y),y=()=>Array.from(new Set(b.map(([M,Y])=>Y))),D=JSON.stringify(j)!==JSON.stringify(x),L=async()=>{const M={};if(Object.keys(j).forEach(Y=>{JSON.stringify(j[Y])!==JSON.stringify(x[Y])&&(M[Y]=j[Y])}),Object.keys(M).length===0){o();return}m(`${u}::config`,M),o()};return s.jsxs("div",{children:[s.jsxs(Pn,{defaultValue:"daily",className:"w-full",children:[s.jsxs(es,{className:"w-full",children:[s.jsx(Lt,{value:"daily",children:d("stage.dailyTab")}),s.jsx(Lt,{value:"sweep",children:d("stage.sweepTab")})]}),s.jsxs(Jt,{value:"daily",className:"space-y-4",children:[s.jsxs("div",{children:[s.jsx(en,{label:d("stage.normalLabel"),tooltip:d("stage.normalDesc")}),s.jsx(de,{type:"text",value:j.mainlinePriority,onChange:M=>h({...j,mainlinePriority:M.target.value}),placeholder:d("placeholder.config.insert")})]}),s.jsxs("div",{children:[s.jsx(en,{label:d("stage.hardLabel"),tooltip:d("stage.hardDesc")}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx(de,{type:"text",value:j.hardPriority,onChange:M=>h({...j,hardPriority:M.target.value}),placeholder:d("placeholder.config.insert"),className:"flex-1"}),s.jsx(Ae,{onClick:()=>g(!0),variant:"secondary",children:d("stage.selectStudent")})]})]})]}),s.jsxs(Jt,{value:"sweep",className:"grid gap-2 grid-cols-1 md:grid-cols-2",children:[s.jsx(de,{label:d("sweep.rewarded"),value:j.rewarded_task_times,onChange:M=>h({...j,rewarded_task_times:M.target.value})}),s.jsx(de,{label:d("sweep.scrimmage"),value:j.scrimmage_times,onChange:M=>h({...j,scrimmage_times:M.target.value})}),s.jsx(de,{label:d("sweep.activityNumber"),value:j.activity_sweep_task_number,onChange:M=>h({...j,activity_sweep_task_number:Number(M.target.value)})}),s.jsx(de,{label:d("sweep.activityTimes"),value:j.activity_sweep_times,onChange:M=>h({...j,activity_sweep_times:M.target.value})}),s.jsx(de,{label:d("sweep.special"),value:j.special_task_times,onChange:M=>h({...j,special_task_times:M.target.value})}),s.jsx(Oe,{label:d("sweep.purchaseRewarded"),value:j.purchase_rewarded_task_ticket_times,onChange:M=>h({...j,purchase_rewarded_task_ticket_times:M}),options:["max",...Array.from({length:13},(M,Y)=>Y.toString())].map(M=>({value:M,label:M}))}),s.jsx(Oe,{label:d("sweep.purchaseLesson"),value:j.purchase_lesson_ticket_times,onChange:M=>h({...j,purchase_lesson_ticket_times:M}),options:["max","0","1","2","3","4"].map(M=>({value:M,label:M}))}),s.jsx(Oe,{label:d("sweep.purchaseScrimmage"),value:j.purchase_scrimmage_ticket_times,onChange:M=>h({...j,purchase_scrimmage_ticket_times:M}),options:["max",...Array.from({length:13},(M,Y)=>Y.toString())].map(M=>({value:M,label:M}))})]})]}),s.jsx(Gt,{className:"mt-4"}),s.jsx("div",{className:"flex justify-end pt-4",children:s.jsx("button",{onClick:L,disabled:!D,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})}),s.jsx(In,{isOpen:C,onClose:function(){g(!1)},allStudents:y(),selected:[],onChange:function(M){const Y=S(M[0]);h(E=>{const w=E.hardPriority?E.hardPriority+", ":"";return{...E,hardPriority:w+Y.join(", ")}}),g(!1)}})]})},bb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(y=>y.staticStore),m=V(y=>y.configStore[u]),p=V(y=>y.modify),b=c.total_assault_difficulties[Va[m.server]],C=O.useMemo(()=>({totalForceFightDifficulty:m?.totalForceFightDifficulty}),[m]),[g,x]=je.useState(C),j=JSON.stringify(g)!==JSON.stringify(C),h=()=>{const y={};if(Object.keys(g).forEach(D=>{JSON.stringify(g[D])!==JSON.stringify(C[D])&&(y[D]=g[D])}),Object.keys(y).length===0){o();return}p(`${u}::config`,y),o()},S=y=>D=>{x(L=>({...L,[y]:D}))};return s.jsxs("div",{className:"space-y-6",children:[s.jsx(Oe,{label:d("tactical.hardLevel"),className:"w-full",value:g.totalForceFightDifficulty.toString(),onChange:S("totalForceFightDifficulty"),options:b.map((y,D)=>({value:y,label:y}))}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{disabled:!j,onClick:h,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},vb=({onClose:u,profileId:o})=>{const{t:d}=ne(),c=V(y=>y.configStore[o]),m=V(y=>y.modify),p=["1","2","3","4"],b=["1","2","3","4"],C=O.useMemo(()=>({drill_enable_sweep:c.drill_enable_sweep,drill_fight_formation_list:c.drill_fight_formation_list.map(String),drill_difficulty_list:c.drill_difficulty_list.map(String)}),[c]),[g,x]=O.useState(C),j=JSON.stringify(g)!==JSON.stringify(C),h=(y,D)=>L=>{x(M=>{const Y=[...M[y]];return Y[D]=L,{...M,[y]:Y}})},S=async()=>{const y={drill_enable_sweep:g.drill_enable_sweep,drill_fight_formation_list:g.drill_fight_formation_list.map(Number),drill_difficulty_list:g.drill_difficulty_list.map(Number)};m(`${o}::config`,y),u()};return s.jsxs("div",{className:"space-y-2",children:[s.jsx(nt,{label:d("drill.useAllAfterSweep"),checked:g.drill_enable_sweep,onChange:y=>x(D=>({...D,drill_enable_sweep:y})),className:"w-full"}),s.jsx(Gt,{}),s.jsxs("div",{children:[s.jsx("label",{className:"block mb-2 text-sm font-medium text-slate-700 dark:text-slate-200",children:d("drill.out_partyNo")}),s.jsx("div",{className:"flex items-center gap-2",children:g.drill_fight_formation_list.map((y,D)=>s.jsxs(je.Fragment,{children:[s.jsx(Oe,{value:y,onChange:h("drill_fight_formation_list",D),options:p.map(L=>({value:L,label:L})),className:"flex-1"}),D!==g.drill_fight_formation_list.length-1&&s.jsx("span",{className:"text-slate-400",children:"/"})]},D))})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block mb-2 text-sm font-medium text-slate-700 dark:text-slate-200",children:d("drill.difficulty")}),s.jsx("div",{className:"flex items-center gap-2",children:g.drill_difficulty_list.map((y,D)=>s.jsxs(je.Fragment,{children:[s.jsx(Oe,{value:y,onChange:h("drill_difficulty_list",D),options:b.map(L=>({value:L,label:L})),className:"flex-1"}),D!==g.drill_difficulty_list.length-1&&s.jsx("span",{className:"text-slate-400",children:"/"})]},D))})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700 mt-4",children:s.jsx("button",{onClick:S,disabled:!j,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},yb={mumu:"MuMu模拟器",mumu_global:"MuMu模拟器全球版",bluestacks_nxt_cn:"蓝叠模拟器",bluestacks_nxt:"蓝叠国际版"},jb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(h=>h.configStore[u]),m=V(h=>h.modify),p=O.useMemo(()=>({open_emulator_stat:c.open_emulator_stat,emulator_wait_time:c.emulator_wait_time,emulatorIsMultiInstance:c.emulatorIsMultiInstance,program_address:c.program_address,emulatorMultiInstanceNumber:c.emulatorMultiInstanceNumber,multiEmulatorName:c.multiEmulatorName}),[c]),[b,C]=O.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=h=>S=>{C(y=>({...y,[h]:S}))},j=async()=>{const h={};if(Object.keys(b).forEach(S=>{JSON.stringify(b[S])!==JSON.stringify(p[S])&&(h[S]=b[S])}),Object.keys(h).length===0){o();return}m(`${u}::config`,h),o()};return s.jsxs("div",{className:"@container space-y-2",children:[s.jsxs("div",{className:"flex @lg:flex-row @max-lg:flex-col gap-2",children:[s.jsx(nt,{label:d("emulator.openOnLaunch"),checked:b.open_emulator_stat,onChange:h=>x("open_emulator_stat")(h),className:"w-full"}),s.jsx(nt,{label:d("emulator.multiInstance"),checked:b.emulatorIsMultiInstance,onChange:h=>x("emulatorIsMultiInstance")(h),className:"w-full"})]}),s.jsx(de,{type:"number",label:d("emulator.waitTime"),value:b.emulator_wait_time,onChange:h=>x("emulator_wait_time")(h.target.value),placeholder:"5"}),!b.emulatorIsMultiInstance&&s.jsxs("div",{className:"space-y-2",children:[s.jsx("label",{className:"block text-sm font-medium text-slate-700 dark:text-slate-200",children:d("emulator.address")}),s.jsx("div",{className:"flex gap-2",children:s.jsx(de,{type:"text",value:b.program_address,onChange:h=>x("program_address")(h.target.value),placeholder:"C:\\\\Path\\\\to\\\\MuMuPlayer.exe",className:"flex-1"})})]}),b.emulatorIsMultiInstance&&s.jsxs("div",{className:"space-y-4",children:[s.jsx(Oe,{label:d("emulator.multiType"),value:b.multiEmulatorName,onChange:x("multiEmulatorName"),options:Object.entries(yb).map(([h,S])=>({value:h,label:S}))}),s.jsx(de,{type:"number",label:d("emulator.instanceCount"),value:b.emulatorMultiInstanceNumber,onChange:h=>x("emulatorMultiInstanceNumber")(h.target.value)})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:j,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},Sb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(h=>h.configStore[u]),m=V(h=>h.modify),p=O.useMemo(()=>({push_json:c.push_json,push_serverchan:c.push_serverchan,push_after_error:c.push_after_error,push_after_completion:c.push_after_completion}),[c]),[b,C]=O.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=h=>S=>{C(y=>({...y,[h]:S}))},j=async()=>{const h={};if(Object.keys(b).forEach(S=>{JSON.stringify(b[S])!==JSON.stringify(p[S])&&(h[S]=b[S])}),Object.keys(h).length===0){o();return}m(`${u}::config`,h),o()};return s.jsxs("div",{className:"space-y-6",children:[s.jsxs("div",{className:"w-full flex gap-2 lg:flex-row max-lg:flex-col",children:[s.jsx(nt,{label:d("push.afterError"),checked:b.push_after_error,onChange:x("push_after_error"),className:"flex-1"}),s.jsx(nt,{label:d("push.afterCompletion"),checked:b.push_after_completion,onChange:x("push_after_completion"),className:"flex-1"})]}),s.jsx(de,{label:d("push.json"),value:b.push_json,onChange:h=>x("push_json")(h.target.value),placeholder:d("placeholder.config.insert")}),s.jsx(de,{label:d("push.serverchan"),value:b.push_serverchan,onChange:h=>x("push_serverchan")(h.target.value),placeholder:d("placeholder.config.insert")}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:j,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},_b=({profileId:u,onClose:o,setActivePage:d})=>{const{t:c}=ne(),m=V(b=>b.trigger),p=b=>async()=>{m({timestamp:qt(),command:"solve",config_id:u,payload:{task:b}},C=>{Dt(c("stage.taskTriggerStart"),{description:c("stage.taskTriggered",{task:c(b)})})}),o(),d?.("home")};return s.jsx("div",{className:"space-y-2",children:s.jsxs("div",{className:"flex items-center justify-between p-4 bg-slate-50 dark:bg-slate-700/50 rounded-lg",children:[s.jsxs("div",{children:[s.jsx("label",{className:"text-slate-700 dark:text-slate-200 font-medium",children:c("other.fhx")}),s.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:c("other.fhxDesc")})]}),s.jsx("button",{onClick:p("start_fhx"),className:"px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors duration-200",children:c("execute")})]})})},Nb=({onClose:u,profileId:o})=>{const{t:d}=ne(),c=V(M=>M.configStore[o]),m=V(M=>M.modify),p=Va[c.server],b=O.useMemo(()=>({clear_friend_white_list:c.clear_friend_white_list}),[c]),[C,g]=O.useState(""),[x,j]=O.useState(b),h=JSON.stringify(x)!==JSON.stringify(b),S=M=>{let Y=7;if((p==="JP"||p==="Global")&&(Y=8),M.length!==Y)return d("friend.invalidLength");if(p==="CN"){if(!/^[0-9a-z]+$/.test(M))return d("friend.invalidFormatCN")}else if(p==="Global"&&!/^[A-Z]+$/.test(M))return d("friend.invalidFormatGlobal");return null},y=async()=>{const M=C.trim(),Y=S(M);if(Y){Dt.error(d("friend.addFailed"),{description:Y});return}if(x.clear_friend_white_list.includes(M)){Dt.error(d("friend.addFailed"),{description:d("friend.alreadyExists")});return}const E=[...x.clear_friend_white_list,M];j(w=>({...w,clear_friend_white_list:E}))},D=async M=>{const Y=x.clear_friend_white_list.filter(E=>E!==M);j(E=>({...E,clear_friend_white_list:Y}))},L=async()=>{const M={clear_friend_white_list:x.clear_friend_white_list};m(`${o}::config`,M),u()};return s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{className:"flex gap-2 items-center",children:[s.jsx(de,{type:"text",value:C,onChange:M=>g(M.target.value),placeholder:d("friend.placeholder"),className:"flex-1"}),s.jsx("button",{onClick:y,className:"px-4 py-1.5 bg-primary-600 text-white rounded-lg hover:bg-primary-700",children:d("friend.add")})]}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[x.clear_friend_white_list.map(M=>s.jsxs("span",{className:"inline-flex items-center px-3 py-1 rounded-full bg-slate-200 text-slate-800 dark:bg-slate-700 dark:text-slate-100 font-mono font-bold",children:[M,s.jsx("button",{onClick:()=>D(M),className:"ml-2 text-red-600 hover:text-red-800 dark:text-red-400",children:"✕"})]},M)),x.clear_friend_white_list.length===0&&s.jsx("p",{className:"text-slate-500 text-sm",children:d("friend.empty")})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700 mt-4",children:s.jsx("button",{onClick:L,disabled:!h,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})};function wb({className:u,...o}){return s.jsx("textarea",{"data-slot":"textarea",wrap:"soft",className:W("border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","whitespace-pre-wrap break-keep break-normal overflow-x-auto hyphens-none",u),style:{wordBreak:"keep-all",overflowWrap:"normal",whiteSpace:"pre-wrap"},...o})}const Cb=({onClose:u,profileId:o})=>{const{t:d}=ne(),c=V(j=>j.configStore[o]),m=V(j=>j.modify),p=O.useMemo(()=>({use_acceleration_ticket:c.use_acceleration_ticket,createTime:c.createTime,create_phase:c.create_phase,create_phase_1_select_item_rule:c.create_phase_1_select_item_rule,create_phase_2_select_item_rule:c.create_phase_2_select_item_rule,create_phase_3_select_item_rule:c.create_phase_3_select_item_rule,createPriority_phase1:c.createPriority_phase1,createPriority_phase2:c.createPriority_phase2,createPriority_phase3:c.createPriority_phase3}),[c]),[b,C]=O.useState(p);O.useEffect(()=>{C(p)},[p]);const g=JSON.stringify(b)!==JSON.stringify(p),x=async()=>{const j={};if(Object.keys(b).forEach(h=>{JSON.stringify(b[h])!==JSON.stringify(p[h])&&(j[h]=b[h])}),Object.keys(j).length===0){u();return}m(`${o}::config`,j),u()};return s.jsxs("div",{className:"space-y-4",children:[s.jsxs(Pn,{defaultValue:"global",className:"w-full",children:[s.jsxs(es,{className:"w-full",children:[s.jsx(Lt,{value:"global",children:d("artifact.global")}),Array.from({length:b.create_phase}).map((j,h)=>s.jsx(Lt,{value:`phase${h+1}`,children:d(`artifact.phase_${h+1}`)},h))]}),s.jsx(Jt,{value:"global",children:s.jsxs("div",{className:"flex flex-col justify-between gap-4 mt-4",children:[s.jsx(nt,{label:d("artifact.useTicketDesc"),checked:b.use_acceleration_ticket,onChange:j=>C(h=>({...h,use_acceleration_ticket:j}))}),s.jsx(de,{id:"createTime",label:d("artifact.createTime"),type:"number",value:b.createTime,onChange:j=>C(h=>({...h,createTime:j.target.value})),min:"1",max:"10"}),s.jsx(Oe,{label:d("artifact.phaseCount"),value:b.create_phase.toString(),onChange:j=>C(h=>({...h,create_phase:Number(j)})),options:[1,2,3].map(j=>({value:j.toString(),label:j.toString()}))})]})}),Array.from({length:b.create_phase},(j,h)=>h).map(j=>s.jsx(Jt,{value:`phase${j+1}`,children:s.jsx(Tb,{phase:j+1,draft:b,settings:c,setDraft:C})},j))]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:x,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 disabled:opacity-60",children:d("save")})})]})},Tb=({settings:u,phase:o,draft:d,setDraft:c})=>{const{t:m}=ne(),[p,b]=O.useState(!1),C={1:{default:m("artifact.default")},2:{primary:m("artifact.white"),normal:m("artifact.blue"),primary_normal:m("artifact.whiteBlue"),advanced:m("artifact.gold"),superior:m("artifact.purple"),advanced_superior:m("artifact.goldPurple"),primary_normal_advanced_superior:m("artifact.all")},3:{advanced:m("artifact.gold"),superior:m("artifact.purple"),advanced_superior:m("artifact.goldPurple")}},g=V(j=>j.staticStore),x=j=>{const h=g.create_phase2_recommended_priority[j],S=g.create_default_priority[Va[u.server]].phase2,y=h.map(D=>S[D]);return S.forEach((D,L)=>{h.includes(L)||y.push(S[L])}),y};return s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block mb-1",children:m("artifact.materialSelect")}),s.jsxs(th,{value:d[`create_phase_${o}_select_item_rule`],onValueChange:j=>c(h=>({...h,[`create_phase_${o}_select_item_rule`]:j})),children:[s.jsx(lh,{className:"w-full",children:s.jsx(ah,{})}),s.jsx(nh,{children:Object.entries(C[o]).map(([j,h])=>s.jsx(sh,{value:j,children:h},j))})]})]}),o===2&&s.jsxs("div",{children:[s.jsx("label",{className:"block mb-1",children:m("artifact.phase2.recommend")}),s.jsx(Ae,{className:"w-full",variant:"secondary",onClick:()=>b(!0),children:m("artifact.selectStudent")})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block mb-1",children:m("artifact.priority")}),s.jsx(wb,{value:d[`createPriority_phase${o}`].join(" > ")||"",onChange:j=>c(h=>({...h,[`createPriority_phase${o}`]:j.target.value.split(">").map(S=>S.trim())})),placeholder:"A > B > C",className:"min-h-[120px]"})]}),s.jsx(In,{isOpen:p,onClose:function(){b(!1)},allStudents:Object.keys(g.create_phase2_recommended_priority),selected:[],onChange:function(j){const h=x(j[0]);c(S=>({...S,createPriority_phase2:h})),b(!1)}})]})},zb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(y=>y.staticStore),m=V(y=>y.configStore[u]),p=V(y=>y.modify),b=[[d("script.doNothing"),"无动作"],[d("script.exitBaas"),"退出 Baas"],[d("script.exitEmu"),"退出 模拟器"],[d("script.exitBoth"),"退出 Baas 和 模拟器"],[d("script.shutdown"),"关机"]],C=O.useMemo(()=>({screenshot_interval:m.screenshot_interval,autostart:m.autostart,then:m.then,screenshot_method:m.screenshot_method,control_method:m.control_method}),[m]),[g,x]=O.useState(C),j=JSON.stringify(g)!==JSON.stringify(C),h=y=>D=>{x(L=>({...L,[y]:D}))},S=async()=>{const y={};if(Object.keys(g).forEach(D=>{JSON.stringify(g[D])!==JSON.stringify(C[D])&&(y[D]=g[D])}),Object.keys(y).length===0){o();return}p(`${u}::config`,y),o()};return s.jsxs("div",{className:"space-y-2",children:[s.jsx(de,{type:"number",label:d("script.screenshotInterval"),value:g.screenshot_interval,onChange:y=>h("screenshot_interval")(y.target.value),placeholder:"1.0",min:.1,step:.1}),s.jsx(nt,{label:d("script.autostart"),checked:g.autostart,onChange:y=>h("autostart")(y),className:"w-full"}),s.jsx(Oe,{label:d("script.then"),value:g.then,onChange:h("then"),options:b.map(y=>({value:y[1],label:y[0]}))}),s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s.jsx(Oe,{label:d("script.screenshotMethod"),value:g.screenshot_method,onChange:h("screenshot_method"),options:c?.screenshot_methods?.map(y=>({value:y,label:y}))??[],className:"flex-1"}),s.jsx(Oe,{label:d("script.controlMethod"),value:g.control_method,onChange:h("control_method"),options:c?.control_methods?.map(y=>({value:y,label:y}))??[],className:"flex-1"})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:S,disabled:!j,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},Eb=({profileId:u,setActivePage:o,onClose:d})=>{const{t:c}=ne(),m=V(R=>R.staticStore),p=V(R=>R.configStore[u]),b=V(R=>R.modify),C=V(R=>R.trigger),g=O.useMemo(()=>({manual_boss:p.manual_boss,explore_normal_task_list:p.explore_normal_task_list,explore_hard_task_list:p.explore_hard_task_list}),[p]),[x,j]=O.useState(g),h=JSON.stringify(x)!==JSON.stringify(g),[S,y]=O.useState([]),D=Va[p.server],L=m.current_game_activity[D],M=L?.activity_name??c("stage.noEvent");O.useEffect(()=>{if(!L)return;const R=[];["story","mission","challenge"].forEach(Z=>{const I=L[Z];I&&Object.entries(I).forEach(([fe,Ce])=>{R.push([fe,Ce])})}),y(R)},[L]);const Y=async()=>{const R={};if(Object.keys(x).forEach(Z=>{JSON.stringify(x[Z])!==JSON.stringify(g[Z])&&(R[Z]=x[Z])}),Object.keys(R).length===0){d();return}b(`${u}::config`,R),d()},E=R=>Z=>{j(I=>({...I,[R]:Z}))},w=R=>async()=>{if(R==="start_hard_task"||R==="start_normal_task"){if(R==="start_hard_task"&&(!x.explore_hard_task_list||x.explore_hard_task_list.trim()==="")){Dt.error(c("stage.noHardTask"));return}else if(R==="start_normal_task"&&(!x.explore_normal_task_list||x.explore_normal_task_list.trim()==="")){Dt.error(c("stage.noNormalTask"));return}await Y()}C({timestamp:qt(),command:"solve",config_id:u,payload:{task:R}},()=>{Dt(c("stage.taskTriggerStart"),{description:c("stage.taskTriggered",{task:c(R)})})}),d(),o?.("home")};return s.jsxs("div",{children:[s.jsxs(Pn,{defaultValue:"explore",className:"w-full",children:[s.jsxs(es,{className:"w-full",children:[s.jsx(Lt,{value:"explore",children:c("stage.exploreTab")}),s.jsx(Lt,{value:"event",children:c("stage.eventTab")})]}),s.jsxs(Jt,{value:"explore",className:"space-y-2",children:[s.jsx(nt,{label:c("stage.manualBoss"),checked:x.manual_boss,onChange:E("manual_boss"),className:"w-full"}),s.jsxs("div",{className:"flex gap-2 w-full",children:[s.jsx(Ae,{className:"flex-1",onClick:w("start_main_story"),children:c("stage.story.main")}),s.jsx(Ae,{className:"flex-1",onClick:w("start_group_story"),children:c("stage.story.group")}),s.jsx(Ae,{className:"flex-1",onClick:w("start_mini_story"),children:c("stage.story.mini")})]}),s.jsx(Gt,{}),s.jsxs("div",{className:"w-full flex flex-row gap-2 items-end",children:[s.jsx(de,{label:c("stage.normalTask"),value:x.explore_normal_task_list,onChange:R=>E("explore_normal_task_list")(R.target.value),placeholder:c("placeholder.config.insert"),className:"flex-1"}),s.jsx(Ae,{onClick:w("start_normal_task"),className:"h-9",children:c("execute")})]}),s.jsxs("div",{className:"w-full flex flex-row gap-2 items-end",children:[s.jsx(de,{label:c("stage.hardTask"),value:x.explore_hard_task_list,onChange:R=>E("explore_hard_task_list")(R.target.value),placeholder:c("placeholder.config.insert"),className:"flex-1"}),s.jsx(Ae,{onClick:w("start_hard_task"),className:"h-9",children:c("execute")})]})]}),s.jsxs(Jt,{value:"event",className:"space-y-4",children:[s.jsx(kt,{className:"p-3",children:s.jsxs("p",{className:"text-sm",children:[c("stage.currentEvent"),": ",s.jsx("b",{children:M})]})}),s.jsxs("div",{className:"flex gap-2 w-full",children:[s.jsx(Ae,{className:"flex-1",onClick:w("start_explore_activity_story"),children:c("stage.story")}),s.jsx(Ae,{className:"flex-1",onClick:w("start_explore_activity_mission"),children:c("stage.mission")}),s.jsx(Ae,{className:"flex-1",onClick:w("start_explore_activity_challenge"),children:c("stage.challenge")})]}),s.jsxs("div",{children:[s.jsx("p",{className:"mb-2",children:c("stage.attrTable")}),s.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-2 text-sm",children:S.map(([R,Z],I)=>s.jsxs(kt,{className:"p-2 flex justify-between",children:[s.jsx("span",{children:R}),s.jsx("span",{className:"font-medium",children:c(`property.${Z}`)})]},I))})]})]})]}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700 mt-4",children:s.jsx("button",{onClick:Y,disabled:!h,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:c("save")})})]})},Ab=["burst","pierce","mystic","shock","Unused"],Ob=["preset","side","order"],Mb=({profileId:u,onClose:o})=>{const{t:d}=ne(),c=V(y=>y.configStore[u]),m=V(y=>y.modify),p=O.useMemo(()=>({choose_team_method:c.choose_team_method,side_team_attribute:c.side_team_attribute,preset_team_attribute:c.preset_team_attribute}),[c]),[b,C]=O.useState(p),g=JSON.stringify(b)!==JSON.stringify(p),x=(y,D,L)=>M=>{C(Y=>{const E=Y[y].map((w,R)=>R===D?w.map((Z,I)=>I===L?M:Z):w);return{...Y,[y]:E}})},j=y=>D=>{C(L=>({...L,[y]:D}))},h=async()=>{const y={};if(Object.keys(b).forEach(D=>{JSON.stringify(b[D])!==JSON.stringify(p[D])&&(y[D]=b[D])}),Object.keys(y).length===0){o();return}m(`${u}::config`,y),o()},S=y=>{const D=b[y],L=y=="preset_team_attribute"?4:1;return s.jsx("div",{className:"grid gap-2 border rounded-lg p-2 bg-slate-50 dark:bg-slate-800",style:{gridTemplateColumns:`repeat(${L}, minmax(0, 1fr))`},children:D.map((M,Y)=>M.map((E,w)=>s.jsx(Oe,{value:E,onChange:R=>x(y,Y,w)(R),options:Ab.map(R=>({value:R,label:d(`property.${R}`)})),className:"w-full"},`${Y}-${w}`)))})};return s.jsxs("div",{className:"space-y-6",children:[s.jsx(Oe,{label:d("team.chooseMethod"),value:b.choose_team_method,onChange:j("choose_team_method"),options:Ob.map(y=>({value:y,label:d(`team.${y}`)}))}),b.choose_team_method==="preset"&&S("preset_team_attribute"),b.choose_team_method==="side"&&s.jsx("div",{className:"space-y-4",children:S("side_team_attribute")}),s.jsx("div",{className:"flex justify-end pt-4 border-t border-slate-200 dark:border-slate-700",children:s.jsx("button",{onClick:h,disabled:!g,className:"px-6 py-2 bg-primary-600 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 disabled:opacity-60",children:d("save")})})]})},Db={cafe:50,schedule:50,shop:50,artifact:80,arena:30,dailySweep:70,tactical:60,drill:50,whitelist:70,server:30,script:60,emulator:50,stage:80,team:70,push:50,other:30},wm={cafe:{icon:yx,descKey:"cafeDesc",component:db},schedule:{icon:vx,descKey:"scheduleDesc",component:hb},shop:{icon:bx,descKey:"shopDesc",component:gb},arena:{icon:px,descKey:"arenaDesc",component:xb},dailySweep:{icon:xx,descKey:"dailySweepDesc",component:pb},tactical:{icon:gx,descKey:"tacticalDesc",component:bb},drill:{icon:hx,descKey:"drillDesc",component:vb},whitelist:{icon:mx,descKey:"whitelistDesc",component:Nb},artifact:{icon:fx,descKey:"artifactDesc",component:Cb},server:{icon:dx,descKey:"serverDesc",component:mb},script:{icon:ox,descKey:"scriptDesc",component:zb},emulator:{icon:ux,descKey:"emulatorDesc",component:jb},stage:{icon:rx,descKey:"stageDesc",component:Eb},team:{icon:cx,descKey:"teamDesc",component:Mb},push:{icon:ix,descKey:"pushDesc",component:Sb},other:{icon:sx,descKey:"otherDesc",component:_b}},kb={show:{transition:{staggerChildren:.05}}},Ub={hidden:{opacity:0,y:8,scale:.98},show:{opacity:1,y:0,scale:1,transition:{duration:.18,ease:"easeOut"}}},Rb=({children:u,onClick:o})=>s.jsx(Ze.div,{variants:Ub,initial:"hidden",animate:"show",whileHover:{y:-2},whileTap:{scale:.99},className:"cursor-pointer",onClick:o,children:s.jsx(kt,{children:u})}),Hb=({profileId:u,setActivePage:o})=>{const{t:d}=ne(),{profiles:c,activeProfile:m}=Ja(),p=u??m?.id,b=O.useMemo(()=>c.find(M=>M.id===p)??m??null,[c,p,m]),[C,g]=O.useState(null),[x,j]=O.useState(null),h=M=>{j(Db[M]),g(M)},S=()=>{g(null)},y={[d("featureSettings")]:["cafe","schedule","shop","artifact","arena","dailySweep","tactical","drill","whitelist"],[d("generalSettings")]:["server","script","emulator","stage","team","push","other"]},D=M=>{const{icon:Y,descKey:E}=wm[M];return s.jsx(Rb,{onClick:()=>h(M),children:s.jsx(Xa,{children:s.jsxs("div",{className:"flex items-center gap-4",children:[s.jsx("div",{className:"bg-primary-100 dark:bg-primary-900/50 p-3 rounded-lg",children:s.jsx(Y,{className:"w-6 h-6 text-primary-600 dark:text-primary-400"})}),s.jsxs("div",{children:[s.jsx(Za,{children:d(M)}),s.jsx(cu,{children:d(E)})]})]})})},M)},L=C?wm[C].component:null;return s.jsxs("div",{className:"space-y-8",children:[s.jsx("div",{className:"flex items-baseline justify-between",children:s.jsxs("div",{className:"flex",children:[s.jsx("h2",{className:"text-2xl font-bold text-slate-800 dark:text-slate-100",children:d("configuration")}),s.jsxs("h2",{className:"text-2xl ml-3 text-slate-500 dark:text-slate-400",children:["#",b?.name]})]})}),s.jsx(Ze.div,{variants:kb,initial:"show",animate:"show",className:"space-y-8",children:Object.entries(y).map(([M,Y])=>s.jsxs("section",{children:[s.jsx("h3",{className:"text-lg font-semibold mb-4 text-slate-700 dark:text-slate-200",children:M}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2",children:Y.map(D)})]},M))}),C&&L&&s.jsx(ru,{isOpen:!0,title:d(C),onClose:S,width:x??0,children:s.jsx(L,{onClose:S,profileId:b.id,setActivePage:o})})]})},Bb="/";ml.use(jx).init({lng:Vt.get("uiSettings")?.lang||"en",fallbackLng:"en",resources:{},interpolation:{escapeValue:!1}});async function dh(u){try{const o=await fetch(`${Bb}locales/${u}.json`);if(!o.ok)throw new Error(`Failed to load locale: ${u}`);const d=await o.json();ml.addResourceBundle(u,"translation",d,!0,!0),await ml.changeLanguage(u),console.log(`[i18n] switched to ${u}`)}catch(o){console.error(`[i18n] failed to load ${u}:`,o)}}const Yr=[{label:"updateMethod.github",method:"github"},{label:"updateMethod.gitee",method:"gitee"},{label:"updateMethod.gitcode",method:"gitcode"},{label:"updateMethod.tencent",method:"tencent_c_coding"}];let Cm=!0;const Tm=[{label:"shaMethod.github",value:"github"},{label:"shaMethod.mirrorc",value:"mirrorc"},{label:"shaMethod.gitee",value:"gitee"},{label:"shaMethod.gitcode",value:"gitcode"},{label:"shaMethod.tencent_c_coding",value:"tencent_c_coding"}],qb=()=>{const{t:u,i18n:o}=ne(),{theme:d,setTheme:c}=eh(),{uiSettings:m,setUiSettings:p}=Ja(),b=V(Q=>Q.trigger),C=V(Q=>Q.updateStore),g=V(Q=>Q.versionStore),x=V(Q=>Q.modify),[j,h]=O.useState(Yr),S=Q=>{c(Q),p(De=>({...De,theme:Q}))},y=Q=>{dh(Q).then(()=>{p(De=>({...De,lang:Q}))})},D=Q=>{const De=Number(Q);p(at=>({...at,zoomScale:De}))},[L,M]=O.useState(u("version.fetching")),[Y,E]=O.useState(u("version.fetching")),[w,R]=O.useState(u("version.tapToTest")),[Z,I]=O.useState(g.local),[fe,Ce]=O.useState(g.remote),[Ve,K]=O.useState(""),[G,ee]=O.useState(""),[ue,Se]=O.useState(!1),[me,U]=O.useState(!1),[X,te]=O.useState(!1),[Te,be]=O.useState(C.updateMethod),[Ke,ze]=O.useState(""),he=[{label:u("localVersion"),value:L,icon:s.jsx(Sx,{className:"w-8 h-8 text-cyan-500"})},{label:u("remoteVersion"),value:Y,icon:s.jsx(_x,{className:"w-8 h-8 text-indigo-500"})},{label:u("updateMethod"),value:u(w),icon:s.jsx(Nx,{className:`w-8 h-8 text-purple-500 ${X?"animate-spin":""}`})}],[Me,st]=O.useState(C.mirrorcCdk),[Ut,Ka]=O.useState(Tm.map(Q=>({method:Q.label,status:"pending"}))),gl=()=>{te(!0),Ce(""),I(""),ee(""),K(""),M(u("version.fetching")),E(u("version.fetching")),R(u("version.testing")),b({timestamp:qt(),command:"check_for_update",payload:{}},Q=>{I(Q.data.local),Ce(Q.data.remote),R("version.tapToTest"),te(!1)})};O.useEffect(()=>{Cm&&(Cm=!1,Me&&ga())},[]),O.useEffect(()=>{C.mirrorcCdk?(h([...Yr,{label:"updateMethod.mirrorc",method:"mirrorc"}]),be("mirrorc")):(be(C.updateMethod),h(Yr.filter(Q=>Q.method!=="mirrorc")))},[C]),O.useEffect(()=>{Ve+Z+G+fe!==""&&(M(Ve===null||Z===null?u("version.checkError"):`${Z.slice(0,6)}`),E(G===null||fe===null?u("version.checkError"):`${fe.slice(0,6)}`))},[Ve,Z,G,fe]);const ha=()=>{Se(!0),Ka(Ut.map(Q=>({...Q,status:"testing"}))),b({timestamp:qt(),command:"test_all_sha",payload:{}},Q=>{Ka(Q.data.map(De=>({status:De.success?"success":"error",method:u(`shaMethod.${De.name}`),time:De.duration.toFixed(3),sha:De.value}))),Se(!1)})},tn=Q=>{if(Q==="mirrorc"){be(Q);return}else Q!=="mirrorc"&&C.mirrorcCdk&&(st(""),ze(""));x("global::setup_toml",{mirrorcCdk:""},!1),x("global::setup_toml",{updateMethod:Q}),be(Q)},ga=(Q,De=!0)=>{Me||De&&Dt.error(u("cdk.noCDKInput")),U(!0),b({timestamp:qt()+Math.random(),command:"valid_cdk",payload:{cdk:Me}},at=>{if(at.data.success){const xa=at.data.expires_at_iso;console.log(xa);const an=xa?u(at.data.message,{expire_date:$r(xa)}):u(at.data.message);De&&Dt.success(u("CDK Test OK"),{description:an}),ze(xa),x("global::setup_toml",{mirrorcCdk:Me},!1)}else Me!==""&&De&&Dt.error(u(at.data.message),{description:u(at.data.mirrorc_message)}),st(""),ze(""),x("global::setup_toml",{mirrorcCdk:""},!1);U(!1)})};return s.jsxs("div",{className:"space-y-4",children:[s.jsxs(kt,{className:"relative overflow-hidden rounded-2xl border border-slate-200/50 bg-gradient-to-br from-slate-50 to-slate-100 dark:from-slate-900 dark:to-slate-950 shadow-lg",children:[s.jsx("div",{className:"absolute inset-0 rounded-2xl border border-transparent [mask-composite:exclude] bg-gradient-to-r from-cyan-400/40 via-indigo-400/40 to-purple-400/40 blur-2xl opacity-40 pointer-events-none"}),s.jsxs(Xa,{className:"flex flex-row items-center gap-2",children:[s.jsx(tu,{className:"w-5 h-5 text-cyan-400"}),s.jsx(Za,{className:"text-lg font-semibold tracking-wide bg-gradient-to-r from-cyan-400 to-purple-500 bg-clip-text text-transparent",children:u("versionInfo")})]}),s.jsx(ma,{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:he.map((Q,De)=>s.jsxs("div",{className:`flex items-center gap-3 p-3 rounded-lg bg-white dark:bg-slate-800/40 transition ${Q.label===u("updateMethod")?" cursor-link hover:bg-white/70 dark:hover:bg-slate-700/50":""}`,onClick:Q.label===u("updateMethod")?gl:void 0,children:[Q.icon,s.jsxs("div",{className:"flex flex-col",children:[s.jsx("p",{className:"text-sm font-medium text-slate-600 dark:text-slate-400",children:Q.label}),s.jsx("p",{className:"text-base font-semibold text-slate-900 dark:text-slate-100",children:Q.value})]})]},De))})]}),s.jsxs(kt,{children:[s.jsxs(Xa,{className:"flex flex-row items-center gap-2",children:[s.jsx(wx,{className:"w-5 h-5"}),s.jsx(Za,{children:u("uiSettings")})]}),s.jsxs(ma,{className:"space-y-6",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-slate-700 dark:text-slate-200 mb-2",children:u("theme")}),s.jsx("div",{className:"flex space-x-2 p-1 bg-slate-100 dark:bg-slate-700 rounded-lg",children:["light","dark","system"].map(Q=>s.jsx("button",{onClick:()=>S(Q),className:`flex-1 py-2 text-sm font-medium rounded-md transition-colors ${d===Q?"bg-white dark:bg-slate-600 shadow":"hover:bg-white/50 dark:hover:bg-slate-700/50"}`,children:u(Q)},Q))})]}),s.jsx(Oe,{value:o.language,label:u("language"),onChange:y,options:[{value:"en",label:u("english")},{value:"zh",label:u("chinese")},{value:"ja",label:u("japanese")},{value:"ko",label:u("korean")},{value:"de",label:u("deutsch")},{value:"ru",label:u("russian")},{value:"fr",label:u("french")}]}),s.jsx(Oe,{value:m?.zoomScale.toString(),label:u("ui.zoom"),onChange:D,options:[50,60,70,80,90,100,110,120,130,140,150].map(Q=>({value:Q.toString(),label:`${Q}%`}))}),s.jsx(Gt,{}),s.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:[s.jsx(nt,{label:u("log.scroll.detail"),checked:m?.scrollToEnd,onChange:Q=>{p(De=>({...De,scrollToEnd:Q}))}}),s.jsx(nt,{label:u("assetsDisplay.detail"),checked:m?.assetsDisplay,onChange:Q=>{p(De=>({...De,assetsDisplay:Q}))}})]})]})]}),s.jsxs(kt,{children:[s.jsxs(Xa,{className:"flex flex-row items-center gap-2",children:[s.jsx(Cx,{className:"w-5 h-5"}),s.jsx(Za,{children:u("globalUpdateSettings")})]}),s.jsxs(ma,{className:"space-y-4",children:[s.jsxs("div",{className:"grid grid-cols-1 gap-1",children:[s.jsxs("div",{className:"grid sm:flex gap-2 items-center",children:[s.jsx(de,{label:u("mirrorCdk"),placeholder:u("enterCdk"),value:Me,onKeyDown:Q=>{Q.key==="Enter"&&ga()},onChange:Q=>st(Q.target.value),className:"flex-1"}),s.jsx(Ae,{onClick:ga,disabled:me,className:"pl-3 self-end",children:me?s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}),u("mirror.verifying")]}):s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(Tx,{className:"mr-1 h-4 w-4"}),u("mirror.verify")]})})]}),Ke!==""?s.jsxs("div",{className:"text-sm text-slate-600",children:[u("update.dueDate"),": ",$r(Ke)]}):s.jsx("div",{className:"text-sm text-slate-600",children:" "})]}),s.jsx(Gt,{}),s.jsx(Oe,{label:u("updateChannel"),value:Te,onChange:tn,options:j.map(Q=>({value:Q.method,label:u(Q.label)}))}),s.jsxs("div",{className:"grid sm:flex gap-2",children:[s.jsx(Oe,{label:u("shaConnectivityTest"),value:C.shaMethod,onChange:Q=>x("global::setup_toml",{shaMethod:Q}),options:Tm.map(Q=>({value:Q.value,label:u(Q.label)})),className:"flex-grow"}),s.jsx(Ae,{onClick:ha,disabled:ue,className:"pl-3 self-end",children:ue?s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(hl,{className:"animate-spin mr-2 h-4 w-4"}),u("shaTest.testing")]}):s.jsxs("div",{className:"flex justify-center items-center",children:[s.jsx(zx,{className:"mr-1 h-4 w-4"}),u("shaTest.testAll")]})})]}),s.jsx("div",{className:"overflow-auto rounded-xl border border-slate-200 dark:border-slate-700 shadow-md",children:s.jsxs("table",{className:"w-full text-sm border-collapse",children:[s.jsx("thead",{className:"bg-gradient-to-r from-cyan-50 to-purple-50 dark:from-slate-800 dark:to-slate-900",children:s.jsxs("tr",{children:[s.jsx("th",{className:"px-4 py-3 text-left font-semibold text-slate-700 dark:text-slate-200 border-b border-slate-200 dark:border-slate-700",children:u("shaTest.method")}),s.jsx("th",{className:"px-4 py-3 text-center font-semibold text-slate-700 dark:text-slate-200 border-b border-slate-200 dark:border-slate-700",children:u("shaTest.status")}),s.jsx("th",{className:"px-4 py-3 text-center font-semibold text-slate-700 dark:text-slate-200 border-b border-slate-200 dark:border-slate-700",children:u("shaTest.time")}),s.jsx("th",{className:"px-4 py-3 text-center font-semibold text-slate-700 dark:text-slate-200 border-b border-slate-200 dark:border-slate-700",children:u("shaTest.sha")})]})}),s.jsx("tbody",{children:Ut.map((Q,De)=>s.jsxs("tr",{className:"odd:bg-white even:bg-slate-50 dark:odd:bg-slate-900 dark:even:bg-slate-800 hover:bg-slate-100 dark:hover:bg-slate-700 transition-colors",children:[s.jsxs("td",{className:"px-4 py-3 border-b border-slate-200 dark:border-slate-700 flex",children:[s.jsx(Fn,{text:u(Q.method)}),s.jsx("div",{className:"flex-grow"})]}),s.jsxs("td",{className:"px-4 py-3 text-center border-b border-slate-200 dark:border-slate-700 w-20",children:[Q.status==="success"&&s.jsx(eu,{className:"w-5 h-5 mx-auto text-green-500"}),Q.status==="error"&&s.jsx(Mm,{className:"w-5 h-5 mx-auto text-red-500"}),Q.status==="testing"&&s.jsx(hl,{className:"text-yellow-500 mx-auto animate-spin h-5 w-5"}),!["success","error","testing"].includes(Q.status)&&s.jsx(Ex,{className:"w-5 h-5 mx-auto text-slate-400"})]}),s.jsx("td",{className:"px-4 py-3 text-center border-b border-slate-200 dark:border-slate-700 font-mono w-24",children:Q.time??"-"}),s.jsx("td",{className:"px-4 py-3 border-b border-slate-200 dark:border-slate-700 font-mono w-20",children:Q.sha?s.jsx(Fn,{text:Q.sha.substring(0,6),tooltip:Q.sha}):"-"})]},De))})]})})]})]})]})},fh="/",Lb={en:"en_US",zh:"zh_CN",ja:"ja_JP",ko:"ko_KR",fr:"fr_FR",de:"de_DE",ru:"ru_RU"},mh=async(u,o)=>{const d={},c=`${fh}docs/${Lb[o]}/${u}.md`,m=await fetch(c);return d[o]=await m.text(),d},Gb=async u=>{const d=await(await fetch(`${fh}docs/entry.json`)).json();return Promise.all(d.map(async c=>({...c,body:await mh(c.basename,u)})))},Yb=u=>u.startsWith("zh")?"zh":u.startsWith("ja")?"ja":u.startsWith("ko")?"ko":u.startsWith("fr")?"fr":u.startsWith("de")?"de":u.startsWith("ru")?"ru":"en",zm=(u,o)=>u[o]??u.en,Qb=u=>u.replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim(),Xb=(u,o,d,c)=>`${u} ${o} ${d} ${c.join(" ")}`.toLowerCase(),Zb="fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50",Vb=({open:u,article:o,onClose:d})=>{if(O.useEffect(()=>{if(!u)return;const m=p=>{p.key==="Escape"&&(p.stopPropagation(),d())};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[u,d]),!u||!o)return null;const{i18n:c}=ne();return s.jsx("div",{className:Zb,onMouseDown:m=>m.target===m.currentTarget&&d(),children:s.jsxs(Ze.div,{initial:{opacity:0,scale:.95,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.97,y:10},transition:{duration:.2,ease:"easeOut"},onMouseDown:m=>m.stopPropagation(),className:"w-full max-h-[95vh] m-5 overflow-hidden rounded-2xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-2xl flex flex-col",children:[s.jsxs(Xa,{className:"space-y-2 border-b border-slate-200 dark:border-slate-700 p-4",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Qm,{className:"w-5 h-5 text-primary-600 dark:text-primary-400"}),s.jsx(Za,{className:"text-lg",children:o.localizedTitle})]}),s.jsx("button",{onClick:d,className:"rounded-full p-1.5 hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors",children:s.jsx(Kt,{className:"w-5 h-5 text-slate-500"})})]}),s.jsx(cu,{children:o.localizedSummary}),s.jsx("div",{className:"flex flex-wrap gap-2",children:o.tags.map(m=>s.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-primary-100/70 dark:bg-primary-900/40 px-2 py-0.5 text-xs text-primary-700 dark:text-primary-300",children:[s.jsx(Xm,{size:12}),m]},m))})]}),s.jsx(ma,{className:"flex-1 overflow-y-auto scroll-embedded prose prose-sm dark:prose-invert max-w-none p-4 cursor-text allow-select-text",children:s.jsx(cp,{remarkPlugins:[rp],rehypePlugins:[up],children:o.body[c.language]})})]})})},Jb=()=>{const{t:u,i18n:o}=ne(),d=Yb(o.language),[c,m]=O.useState(""),[p,b]=O.useState(null),C=O.useDeferredValue(c),[g,x]=O.useState("all"),[j,h]=O.useState(null),[S,y]=O.useState([]);O.useEffect(()=>{let E=!0;return(async()=>{try{const w=await Gb(d);E&&b(w)}catch(w){console.error("Failed to load wiki articles:",w)}})(),()=>{E=!1}},[]),O.useEffect(()=>{if(!p)return;(async()=>{const w=await Promise.all(p.map(async R=>{const Z=zm(R.title,d),I=zm(R.summary,d);let fe=R.body[d]??R.body.en??"",Ce=R;if(!R.body[d])try{const G=await mh(R.basename,d);Ce={...R,body:{...R.body,...G}},G&&(fe=G[d])}catch(G){console.error(`Failed to load ${R.basename} (${d})`,G)}const Ve=Qb(fe),K=Xb(Z,I,Ve,R.tags);return{...Ce,localizedTitle:Z,localizedSummary:I,bodyHtml:fe,searchIndex:K}}));return y(w),w})().then(void 0)},[p,d]);const D=O.useMemo(()=>{if(!S.length)return[];const E=new Map;return S.forEach(w=>{E.set(w.category,(E.get(w.category)??0)+1)}),Array.from(E.entries())},[S]),L=O.useMemo(()=>{if(!S.length)return[];const E=C.trim().toLowerCase();return S.filter(w=>{const R=g==="all"||w.category===g,Z=!E||w.searchIndex.includes(E);return R&&Z})},[S,C,g]);if(!p)return s.jsx("div",{className:"flex h-full items-center justify-center text-slate-500 dark:text-slate-400",children:s.jsx(hl,{className:"animate-spin mr-2 h-10 w-10"})});const M=(E,w,R)=>{const Z=g===E;return s.jsxs("button",{onClick:()=>x(E),className:`px-3 py-1 rounded-full text-sm transition-colors ${Z?"bg-primary-600 text-white shadow-md":"bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-300 hover:bg-primary-100/70 dark:hover:bg-slate-700"}`,children:[w,typeof R=="number"&&s.jsxs("span",{className:"ml-1 opacity-80",children:["(",R,")"]})]},E)},Y=E=>s.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-primary-100/70 dark:bg-primary-900/40 px-2 py-0.5 text-xs text-primary-700 dark:text-primary-300",children:[s.jsx(Xm,{size:12}),E]},E);return s.jsxs("div",{className:"flex h-full flex-col gap-4 overflow-hidden",children:[s.jsxs("header",{className:"space-y-1",children:[s.jsxs("h1",{className:"text-2xl font-semibold text-slate-900 dark:text-slate-100 flex items-center gap-2",children:[s.jsx(Qm,{className:"w-6 h-6 text-primary-600 dark:text-primary-400"}),u("wiki.title")]}),s.jsx("p",{className:"text-sm text-slate-600 dark:text-slate-400 max-w-3xl",children:u("wiki.subtitle")})]}),s.jsxs("div",{className:"relative p-1",children:[s.jsx(Ym,{className:"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-slate-400",size:16}),s.jsx("input",{value:c,onChange:E=>m(E.target.value),placeholder:u("wiki.searchPlaceholder")??"",className:"w-full rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 pl-10 pr-3 py-2 text-sm text-slate-800 dark:text-slate-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 transition cursor-text","aria-label":u("wiki.searchPlaceholder")??"Search"})]}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[M("all",u("wiki.category.all")??"All",S.length),D.map(([E,w])=>M(E,u(`wiki.category.${E}`)??E,w))]}),s.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-500 dark:text-slate-400",children:[s.jsx("span",{children:u("wiki.resultsCount",{count:L.length})}),c&&s.jsx("button",{className:"underline",onClick:()=>m(""),children:u("wiki.clearSearch")})]}),s.jsxs("div",{className:"flex-1 overflow-y-auto space-y-3 scroll-embedded p-2 pr-4",children:[s.jsx(Zr,{initial:!1,children:L.map(E=>s.jsx(Ze.div,{layout:!0,initial:{opacity:0,y:6},animate:{opacity:1,y:0},exit:{opacity:0,y:-6},transition:{duration:.15,ease:"easeOut"},children:s.jsxs(kt,{onClick:()=>h(E),className:"cursor-pointer transition-colors hover:border-primary-300 dark:hover:border-primary-500",children:[s.jsxs(Xa,{className:"pb-3",children:[s.jsx(Za,{className:"text-base flex items-center justify-between gap-3",children:s.jsx("span",{children:E.localizedTitle})}),s.jsx(cu,{children:E.localizedSummary})]}),s.jsx(ma,{className:"!p-2 flex gap-2 flex-wrap",children:E.tags.slice(0,4).map(Y)})]})},E.id))}),L.length===0&&s.jsx("div",{className:"rounded-xl border border-dashed border-slate-300 dark:border-slate-700 p-6 text-center text-sm text-slate-500 dark:text-slate-400",children:u("wiki.noResults")})]}),s.jsx(Zr,{children:j&&s.jsx(Vb,{open:!!j,article:j,onClose:()=>h(null)})})]})},Em=({words:u,className:o,filter:d=!0,duration:c=.5,mode:m="word"})=>{const[p,b]=Lg(),C=je.useMemo(()=>m==="word"?u.split(" "):[],[u,m]);return O.useEffect(()=>{b("span",{opacity:1,filter:d?"blur(0px)":"none"},{duration:c??.5,delay:m==="word"?Gg(.2):0})},[p,u,m,d,c]),m==="all"?s.jsx(Ze.div,{ref:p,children:s.jsx(Ze.span,{className:W("opacity-0",o),style:{filter:d?"blur(10px)":"none",whiteSpace:"pre-wrap"},children:u})}):s.jsx(Ze.div,{ref:p,children:C.map((g,x)=>{const j=g.split(` -`);return s.jsxs(Ze.span,{className:W("opacity-0",o),style:{filter:d?"blur(10px)":"none",whiteSpace:"pre-wrap"},children:[j.map((h,S)=>s.jsxs(je.Fragment,{children:[h,S{o.current?.scrollIntoView({behavior:"smooth"})},[u]),s.jsxs("div",{className:"w-full h-full opacity-50 scrollbar-hide font-mono overflow-auto p-2 text-sm",children:[u,s.jsx("div",{ref:o})]})}const $b=({message:u="Loading..."})=>{const o=Fm(m=>m.globalLogData),d=V(m=>m._secret),{theme:c}=eh();return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"fixed inset-0 bg-[var(--color-slate-100)] dark:bg-[oklch(12.9%_0.042_264.695)] overflow-hidden",children:s.jsx("img",{src:c==="light"?`${Qr}images/bg-light.webp`:`${Qr}images/bg-dark.webp`,alt:"Loading BG",className:"w-full h-full object-cover object-center"})}),s.jsx("div",{className:"fixed w-full h-full p-2",children:s.jsx("div",{className:"w-full h-full bg-slate-100/80 dark:bg-slate-900/80 backdrop-blur-[5px] rounded-md p-2 border border-2 border-primary-500/70",children:s.jsx(Kb,{children:o.map((m,p)=>s.jsxs("div",{className:"flex",children:[s.jsx("div",{className:"min-w-[80px] text-slate-600 dark:text-slate-400",children:s.jsx(Em,{words:Wm(m.time),mode:"all"})}),s.jsx("div",{className:"min-w-[80px] flex justify-end mr-2 font-bold",style:{color:Xr[m.level]},children:s.jsx(Em,{words:m.level,mode:"all"})}),s.jsx(Ze.div,{className:"flex-1 border-l-3 pl-4",style:{borderColor:Xr[m.level],whiteSpace:"pre-wrap",borderLeftWidth:m.level==="INFO"?"3px":"5px",color:m.level==="INFO"?"inherit":Xr[m.level],fontWeight:m.level==="INFO"?"inherit":"bold"},initial:{opacity:0,filter:"blur(10px)"},animate:{opacity:1,filter:"blur(0px)"},transition:{duration:.5},children:m.message})]},`${m.time}-${p}`))})})}),s.jsxs("div",{className:"z-10 flex flex-col items-center justify-center w-full h-full",children:[s.jsxs("div",{className:"fixed",style:{marginTop:"calc(var(--spacing) * -15)"},children:[s.jsx("img",{src:`${Qr}images/logo.png`,alt:"App Logo",className:"w-36 h-36 mb-6 fixed rounded-full drop-shadow-[0_0_80px_rgba(0,215,255,0.8)] dark:drop-shadow-[0_0_80px_rgba(59,130,246,0.8)]"}),s.jsx("div",{className:`animate-spin rounded-full h-40 w-40 border-t-4 border-b-4 drop-shadow-[0_0_10px_rgba(255,255,246,0.8)]\r - border-primary-500 dark:border-primary-300 mb-6 dark:drop-shadow-[0_0_10px_rgba(255,255,246,0.8)]`,style:{marginTop:"calc(var(--spacing) * -2)",marginLeft:"calc(var(--spacing) * -2)"}})]}),s.jsx("p",{className:`text-lg font-bold text-slate-500 dark:text-slate-200 absolute mt-40 py-1 px-4 rounded-lg font-mono\r - bg-[#eeeeeeee] dark:bg-[#0000002f] backdrop-blur-[5px] border-[#90a1b977] dark:border-slate-700 border`,children:u})]}),s.jsx(Fb,{open:!d,onCancel:()=>{},onConfirm:m=>{V.setState(p=>({...p,_secret:m}))}})]})},Wb="fixed inset-0 flex items-center justify-center bg-black/50 z-50 backdrop-blur-sm",Fb=({open:u,onCancel:o,onConfirm:d})=>{const{t:c}=ne(),[m,p]=O.useState(""),[b,C]=O.useState("");if(!u)return null;const g=async()=>{if(!m.trim()){C(c("secretRequired")||"Please enter your secret.");return}C(""),await d(m.trim())};return s.jsx("div",{className:Wb,onMouseDown:x=>{x.target===x.currentTarget&&o()},children:s.jsxs(Ze.div,{initial:{opacity:0,scale:.96,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:10},transition:{duration:.18,ease:"easeOut"},onMouseDown:x=>x.stopPropagation(),className:"w-[400px] rounded-2xl bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-2xl p-6",children:[s.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[s.jsx("div",{className:"rounded-full bg-primary-100 dark:bg-primary-900/40 text-primary-600 p-3",children:s.jsx(xm,{className:"w-6 h-6"})}),s.jsxs("div",{children:[s.jsx("h2",{className:"text-lg font-semibold text-slate-900 dark:text-slate-100",children:c("enterSecretTitle")||"Enter Secret"}),s.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:c("enterSecretPrompt")||"Please enter your secret key to proceed."})]})]}),s.jsxs("div",{className:"mb-4",children:[s.jsx("label",{className:"block text-sm text-slate-600 dark:text-slate-300 mb-1",children:c("secretLabel")||"SECRET"}),s.jsxs("div",{className:"flex items-center gap-2 border border-slate-300 dark:border-slate-700 rounded-md px-3 py-2 bg-slate-50 dark:bg-slate-800 focus-within:ring-2 focus-within:ring-primary-500 transition",children:[s.jsx(xm,{className:"w-4 h-4 text-slate-500"}),s.jsx("input",{type:"text",value:m,onChange:x=>p(x.target.value),placeholder:c("secretPlaceholder")||"Enter your secret...",className:"flex-1 bg-transparent outline-none text-slate-800 dark:text-slate-100 placeholder-slate-400 text-sm transition"})]}),b&&s.jsx("p",{className:"mt-1 text-xs text-red-500 dark:text-red-400",children:b})]}),s.jsxs("div",{className:"flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400 mb-4",children:[s.jsx(tu,{className:"w-4 h-4 text-primary-500"}),s.jsx("span",{children:c("secretNotice")||"This secret will be used for authentication. Keep it private."})]}),s.jsx("div",{className:"flex justify-end gap-2",children:s.jsx("button",{onClick:g,className:"px-4 py-2 rounded-md bg-primary-600 hover:bg-primary-700 text-white font-medium shadow-sm transition-colors",children:c("confirm")||"Confirm"})})]})})},Ib=({...u})=>{const{theme:o="system"}=Ax();return s.jsx(ip,{theme:o,className:"toaster group",style:{"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)","--toast-description":"var(--popover-foreground)"},...u})},Pb={show:{opacity:1,x:0,display:"block",transition:{type:"tween",duration:.2,ease:"easeOut"}},hide:{opacity:0,x:-24,transition:{type:"tween",duration:.2,ease:"easeOut"},transitionEnd:{display:"none"}}},ev=()=>{const[u,o]=O.useState(!1),[d,c]=O.useState(!1);return O.useEffect(()=>{document.documentElement.lang=ml.language;const m=p=>{document.documentElement.lang=p};return ml.on("languageChanged",m),()=>{ml.off("languageChanged",m)}},[]),O.useEffect(()=>{dh(ml.language||"en").then(void 0)},[]),s.jsx(s.Fragment,{children:s.jsxs(Mp,{children:[!d&&s.jsx(Ze.div,{initial:!1,animate:{opacity:u?0:1},transition:{duration:.2},onAnimationComplete:m=>{u&&m.opacity===0&&c(!0)},className:"fixed inset-0 z-[100]",children:s.jsx($b,{})}),s.jsx(O.Suspense,{fallback:null,children:s.jsx(Op,{setReady:o,children:u&&s.jsxs(s.Fragment,{children:[s.jsx(av,{}),s.jsx(Ib,{})]})})})]})})},Am=(u,o)=>u==="home"||u==="scheduler"||u==="configuration"?`${u}:${o??"none"}`:u,tv=u=>{if(u.includes(":")){const[o,d]=u.split(":");return[o,d]}return[u,void 0]},av=()=>{const[u,o]=je.useState("home"),{activeProfile:d}=Ja(),c=d.id,m=Am(u,c),[p,b]=je.useState([Am("home",c)]);je.useEffect(()=>{b(g=>g.includes(m)?g:[...g,m])},[m]);const C=O.useCallback((g,x)=>{switch(g){case"home":return s.jsx(tb,{profileId:x});case"scheduler":return s.jsx(ub,{profileId:x});case"configuration":return s.jsx(Hb,{profileId:x,setActivePage:o});case"settings":return s.jsx(qb,{});case"wiki":return s.jsx(Jb,{});default:return null}},[]);return s.jsx(Jp,{activePage:u,setActivePage:o,children:s.jsx("div",{className:"relative flex-1 min-h-0 overflow-hidden scroll-embedded h-[calc(100%-70px)] lg:h-full",children:p.map(g=>{const[x,j]=tv(g),h=g===m;return s.jsx(Ze.div,{className:"absolute inset-0 overflow-y-auto scroll-embedded pr-2",variants:Pb,initial:h?"show":"hide",animate:h?"show":"hide",style:{pointerEvents:h?"auto":"none"},"aria-hidden":!h,children:C(x,j)},g)})})})},hh=document.getElementById("root");if(!hh)throw new Error("Could not find root element to mount to");const lv=gp.createRoot(hh);lv.render(s.jsx(je.StrictMode,{children:s.jsx(ev,{})})); diff --git a/service/dist/assets/index-DySAOzzf.js.br b/service/dist/assets/index-DySAOzzf.js.br deleted file mode 100644 index 1b5ee36bbd0241ace6a8b7387695d32a81532814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82223 zcmV(nK=Qv^ZYOmCJ+@t;+$I7$(EnviZS+J@6K6Bm0ra$mc@A>3`X7|@GZ~?(s!2uV z*rxA*Ak{UKLor$~WrGSOPPL&H>USDtw&iZhqGW*`c#t8n&qW)pu(JhPM|CSB!S6H$ z8J!_W*K)dxpBl}PWjn2mKkZ+py$TD4NJwN01X%#6Pusj-_IB9Xd)wqY z-C5RdmH&MWsY4B^tndbyK-x)w5TxDJRC~Q$sACL0#1^tD6a??U8`|~#=o?|_baglFS^+Yn99+>$lXRI~174or8H0-gFPivHzrw1{JRfx`B8TBXLbj$KBdn*wt*n~O%FPnP0s?$WZUWVbXvyf8N z#i9G6@EjIl@PhRg$0CIuZio7*_GP(~$nD^x3SFYFXf;#j-e*J;i_+?~B#bB$6gAez zHvjf}^S^$Z(`S0`-JA6JLWVlXZUsq|Ovi|#Cc9L+fokIHVygDP&rdjYIF})2bt)Zl z_GFesIHVmzfCo}0yf(<*3+S_!`tRq*2#waxwd3QGW*rF=)Pi$uoQw2g?Ld(z$OT_Z z?d?^ouV0c_H0r@+?S=T-HJq5`je;=C72C34+7j5UaX9kepLB0uQOwM)N_Tx*^UFk^ zM-;dmXpL}Fg~b-&jo|;k`J|mI7S?? zAWIEWdhdah{#%s37p2m(`m3w{tlePN!yZf3PVLRiPlh1t4J7^VN8LSggGu*bFl+Vq z!yZZj1?P=6P4;~csafZ?+U~0NY4Q^wkcnR#dW@<6p(g~S0H#H}-w`&nz zQf9M9o%miFT<<0xJz|6X)?@B88Kccki>*$5LM$q7s(WOBMP0(O&j$I-?CSmy6`ws5 zQcH{1?xwhG-r%tpk0EOXOJz3;R^5%U=4dlx4Uis$YhR2wv}|y!KH;m>itxdR~ zafRoWl{;>pODFV^?pri?XnVpF+=$E=<%P~0m3MLzm?q*IpsbfuOd(~IQ!7c;^!mIE zr@|UfA16}+mq}b@?>d8=Iu=u?oLnSK38uudbhN0jQrCU3b8WFA1{Fr2Q_o2 zaO7Z!|Ge?Kg%?kcL^_-W)~48IG|zcEO(O==i1-rmZ=B+|#&M7HIO6Y1#KWaSb_ecD_f`<>X4K*1klkpz1sBl$<@a7VD{Jp|->wdx zzGfK=SgDGj7?I*I-@Um0>+0q11$)X*yA!jcTZJ9E`1|)CFZV)=pg<>}aG<0L6;-E; z7qsxO6((OX=UcYOe_DXr5XvSikBM=I3a=%dq-glHxT+ULQavUA5RhOfb9L(%WOWht z_;Y#Pilk|;Y`<{rlI4WByT+~(tWjiokMPW@>Z>WcYb+nXF^4u}jTu4{rH3JqY*|MR z35Kegdv)MDPTMY&RKnCTAl@37IFJhY_p1jqq}f^o=|(7$&g=V!qlM&nZK5|O+I*CO z#zsTd_Rl%BcV`Ym*5TcKR2|P_6mH2%<_5_;K%W!WMY6|<8axgH(c8r49XcE49y9OzGs<~#HAkiFxZ#1nt&SLgrT?iXFx6om^M zT@e{I1~cT-fqu_E&aC=0-p}jJj%Q00J@J1WMr&q#q7_oTfL0-iKW!~b9QFEUCO#C7{VcF$R(iL7z(S%{TMENw8AAxWCjy~yYd~9 zl4Ee^J>;ruZ7dPH3puA59ny90SKDK*G|2u7ts&@r;lgid$W_R&&ixx(ZA%)MvqXQh zyoy`$)p@Ijd_pvP7^`v8bf=M2x>&p6f@GHWestX@!|DS`Q&K2R?HI28`ex^uOi7HUH&j8e{ymW5d2#1%S@}YgS@G9b~&pSa?2>VeTB95O|08Z!AH` z!sCw>+ytad4$C6j^h%q7dGSNy^{Qr90KPAmcMXzmKa>7w`*}EiW5IPthk`|YYu<6lhwzv`ewuNd~dQ0Q|`>JZVcoRnFs(7Ks77#7vaRG)~Fs^KU? zH+GZTUvyFj@D zJ^F-PHA<+|9T3obU_hN=GeP46h>%xZ^!-S=vP$S`bQ~r!E=4s2z*{jN4U32;z?jjb z*pH#u4^!+h+YNfmAZb7#eW&t<$G-Kvk$V)6dN{xuVqGQRyMMaeCF~< zgq^Th57AeMxTBmiMqm&C0hTJRLIE|HUQuiI`t|N7_jr&Zj*x*^8VX*m5Y35Lki`yB zi`w@oh{#IL@*&3da0~fHAH_0(oR#maCC+`F2h+7}QVx;iOo~;^qs=Ja%FP?#u*-a( z*B5UE|59yhw~IaVTQ%+i0$ufD?elu#T`lWQVjLvOcPfzSA~)y+nh}uY{(~Q_m>;xy zKYMS<^;79db#VB23g8MYUA3y2Ykhx2mY8UTX0ESa(wY2$W)38JlkTVZZDnl<5l(u` zJ3ONP`zsJ6xAcUs@3{W?`*_9i(nIShB9$)pE#12c$h^?1vdX0Q@t0(~D!6B(H`abN z{jB-inPKz!Dii3}W_3PS(X+i(p}E(`$l!`traa{;^MezJFsE8N=AwHaz;q$i)-TuA zPkYdG_KM`6OOW_#`o)-+cK+u{eLhbvJ=fI`hCbn}P4URX?d1x&nDUPTk6Y<%@7hdw z$QsMf3Xy8+Kf{z!?qh@UzYX2Y}0a$@a0cFGPFIFBrNeZnUZ<;Zsy#XFj0L(7ll=WlKA z^83pXb-7<+3Is?jf4AQ(*nE1hzXUt%1R6jsqD+_icM(0s%g((qTS<{`gQcslP{hAtj%d_ zz@I9r>h%to{T&vJcJHYfZnIItO&F;oQogSP2$V~U$-|E=NNYdF3EHvJ-w{i7*WYcW zJI5^ZE#=jp87GYutn13E|4~#8-Wf1hF!4gfZM6M)2F3v>VTVnd`kn30lu-*z6xaUn zKG9p8b6z|b2c`l!HO+crsccn^FZhZ~cY1B!@tlWh>UGeIQ)?LwUBvuOO-zUK;>#Lv zjo^KCjfI}B6LwQ2PVYKmrVE4?+8w4;CCJp#woQZRNx4e3h*MA!9mAcC-VM8mx?V#x z&#L}Z6q(Z$K?zHc4XuC%ypA?Kg@UHWgPPzGDo zU#q$uz=#Qc3pBvd>gOjU@T)5pCdTJDTzJ7LFaYZ(gCr@G zh-N7(^w%q|>F_uH_AixUaaj)1!oBY%z7!ZO^uwK1z1SWy8dUGaPIx%OYG3U1>WXn! zly4Oms@Gz-#1pXW%VJ~AArUl-eGpSZwJvr+EDB%xHgJ0^cE_`~hZ(*>56@ewl%UQ& zi5q04)%2pf|2)q>?-#w&6Q|vaI5s&_OdzZ3mYz7#RvhE1D~E}x!!?spvJKb48Ea*= zLW-uXn(?zt98Uw)DG#0J6oC$XEEq$hD@wOF*z|$4%GnDXaW%P|1BA}A5zYuk*O{>> z39AI=@gkKoIABSVo_w^N(*~sD6_NfnA9FR-6L`)B#`3w}vm<)YjruI<#vZ zNFdV<(w0n1ZuK4D>0jH%gw_;7eM!Y$G_dq4Qa}B_7PU`vjDuaUUMUE=#wuO~Q$tl< zhtjsH0@orgT#_AUP%#(CoJL>_Ur@RW!!ScX@De=Vy@I#HRjL&=Hb zynE$~PdVTK?MShpI(EA65gu9)rBLvT+ABi2c7YnwcN;+V06DA|SI6!x>2cWp@&Em; z4*&YofTQ{~x1ZmRUr+*j_CFa~xaW?Nt=AYU`Gx;InEm};#2?!k6ZV-|gX zXF8Hr;gk9>UiU%LT#5p%yp$Z9B`xp23L90bg@Hg}-^vJNPHWw4@-e-N; z$q9O>TJI(I?Rek+J(z?JNd)STUmbAN%RgI!ghj@!Wd> zq3CyJe>6L(BQL zRDXVaDuJgQfLuc9ntNhFNJJzQr!#Bua=O<(qSYG^D8NB(c-po`c~h;W(`+UJN2BKA zP-Eaqh_3gvl4X0%p+=Ts<8sp?Sz97S@x-Z_={DmVSkS#V$x{WzROT{bCRNOb0@boq zsFf~HO-%S?*LC4|jg}G+K>+mX#ydyDpCAOF2`SUFLAiC{x~PXC74+NShCKPQ|Lg5u z4ysrGDZirW9*0zVJ6(2Z~@DO;Y8;#)M* z{sH-TsCoS@bMcX!5hI)_aq}{~HR=?T#9Lr{h_&LaFm=hTQRkPqcksI7YiL|xd~TTr zAp+=V2i@yHN4$ji&7vCZHER1suL6Dfs+<=uQDQ%$>_sus9fS_RWvyynWbS0`6ULf*6Tq7a4^4eIO65>y8X zJrSvz8^RUzo@3(4%V}py04CvE(UH<7+Xa4_iVcY_u5#jDvv80v;B*B4bu}70;b#pJ zo5gB^%TQr1+zY}kMCO;w=OnA)!?r)PG!^9vARoMy4o z6#J0UJ|f6Z%FtOy0UncKgW*b|^08*aoMD(*G$1u@mLv_=MUj^4`n_6?&IEMQ=j8oi zNYi_hhX3N}_sP%S)9<)bO18FSYD<;2MCg&`p6!&Leo8HIm~YM@;!FiUMAq5=?GRO* z*@=cWqm-BwjQPL}2JKMiSbhbl*JgTe{1?~}Lts=!vL`UKz~9=$Mk{6ykG}vQH&wH- z5U27<)oQ1YpLxr5b`3RO7pfe_BJwpAY-bbl7V889raYRhbZ$Ec6GNq*t$e^XkX zj1+!0`GU>cisq`4wtX~Z?!C^>(Q~6dHqNzINQUle6=0-@FC(F0_CHPHMm^ZgFx$<5 z#9vxEAp3@8lRsj>-DTwT8#iOwBGkC6x#GLfgkuF>BN-k{ZN*nrT%@pE3Q}OKU>ttr zqktCsuwsl+(K(z#jyRwXHs{)A)1mUbbs+YsQq7yMfA~xLGx;ClzwVfwQ!PCc{Tn)EEmK$}blZ%4mMZE-{ z`&_gCbUU8jm8V}GL1)Hh#_MEYB77MYGLz@Z9Ce~S2UE+-aR0RRauE%plR&I!si;NB zq>xGmo)^j3vZ{Bw-9RzU#BiE+RSRa7X&3(w*nyp>rEN@qHQ&(G)#a)IZ)P95JW2Tg zUE%?n?R+f%eNn+vWH2lh%=wx|Hgg)v_c3{*?K*(g|8o?*H2-_4H3sQiUsqH78A8&-;_FXQ=kCzK-O5Rlvg6-o}`JninMM#+SV;)4IjKW2#}~d{l)f z-GA7&Mw9K_3zP#Z*LV~2BVkF zEAMuS<0;eg>G{WLK0n0)AjDU`Ja6E9!X*NjjY4!4aQ+%$jLjK@lk+$KdpAU(;O~|4WOgT zr^_|liq?)OuKcPohW)4XwmT>JtwI7IrVk-(zPb7L!V{M^*!u)L@M~&V5&%6Di zyyucgK}P=SfbjA|JJt~c6k4|@b6oP3$}Cb0#?;SPWJPg_SZ1mmJsi}x?%I7bY-Ata zdoF-T>7%e{*cgJ^$f1jf)r}nL$A# z0g$E9>U0k^D`h`UmI5VA2DPoh%+26y^(D4rldeNP?pJl4^)p#wTuzC=epX;}MD^Z? zeK+HuFky}9vt1md8_6d?1CKneAKk!p(kd8PQm2MEfWA0EN7>`3R5upFB0MW6rIZoR zmEk-HL2A{+lw>mpyBd%>=7VW#45yc}9*z>KF1rcP-PqE!HQIP&XrglMWli%~dHyJf zD?4TxP-7YT{uD)$3qt!cg>be{&j&PX84OXN_Y>z*Vt(A^Zv??PD{4eBG8F3(id3<% z>VFNJe^?y~BUjyz{nWp|{(pV{;oJA;FIsu#H8*f?oE}uwf^JH9Jx-$Y_0Es(czhw$ zm93!vwqs1dIY6$^$hMp{*(rSAoNJhGH%^>m)E7yXB`AlM-<)g4nTzcwbB-OB8+Sm+ zvWa#;KhI90C_xmhYU?_DxIlBn{C;>+&g7+Y8ziz47Iv!)GanpCFK9pjMoR=s>@J0; z`4v7#T`P-b0MtaLgum(hW-^ri1(LqQz4HMDLNNt zi?MkO;e*cmCdI1aBTAXE&H*#*d}DLd;(Re)$stSt!Xk?xuEBD@p~D4QY|qQ2Y1LGo zBcl)PjaUW0A`i#?C?pZ61E<23U~FY_Xxo&CO=5%mL#_)xJgRm|JGZyz(XkMUV?C2H zzt|=1@bc=Gl*@rj@x7Ks02#5`_6>0u5goIYcM9+9Ne>IUYLk6dTVO!)R7GGGDY%+8 zjXoT`TqiuLrFBa6mGxiJ$IVje72l|fmg0Nd?&U9WBKLSCMnLg0h@ZqaOE~h1&=w`~ zoZj&$O<-3Kv`I~IQus>>VYPB6Z`GD6T1DbSL}zHQYNGNQonJ}xadmO#w=)cu0|oH3}Ojp>uNL(P33x%Bzm|>UCwquPyK( zUX_vV;Mxcis~5KHaObP&&$;%pv%^x0#M&g8#{pRENpB@^R${Y30mg8Jfrgbg%YAr*OzQNky-uQZXh1DS-Ea%1S~l<49DQ{Mb7S5DW~oL<5Rx{AJfugbh+eBxlXXeUjh5Hf)=yG6&>dgg7| zzvij(wcB6y?AdUF8E{k=#cG&rIBz_*$IHf*EYE8EaNf3~_Hn~$b&U_u#7}(k7d}-7 z#5h%NNEJG_t!}!V_^WtaO`-syQ+2kxO1t?+SGC@Z@^i~jm+dhm@9BS3XXuw%ZSB2o z)lo{V+*j!ZQ52nP|S?ce>jj>g-%sihGVTW`VVp9?@xTa$~pwSc=C!-&A&T<8Xw~lA?83`LQwRP^2+FLsQS9gFtR?QyJFh%{3pIU zAs_Htv|!{?KSJt9K=?{o`_D!BrFb6Y;hsCQ$73BXChE1P>Ub|EFk-ix)Z=TRQ^?w?x{7b|`(Z)tkDgJrGiZbpc-sLuopv zkm{mc@XofayDy3==Aa0>CU}V)XZXk? zuFV00ww7Q5teqOZTM@pFWe{cOX6<&rHARF;W^_PUG*c}-M&xh6cTKofnLMb~4A2_@ zp((14CD870<|_pLPz=y9YRn-z^T}YI`XV1qKu9zN zP+71ZeXqzo6NM#|&&s2s^GNtl^;g_eVB%9M?lXh$gWVV^9l$SA*0L*nt$=tMXsK z|1lAcD&z+tjSkaQkY>B8h&Wj{C{3$2&(Vo5_e;u<2qpbt+MHxb>$5Dv4&`XGNZZ4M z7C>x^ykkl6s6h-&HUnrRzUUk|G*R!bibj zgJiYb&Dqv)I_{SeKZeqMCn7jb6YfZ<8kbiG0Ue#zTk3iH*wEsYw#BmOHJ(zaZG{DeEXRj5)jrj_U z@P#Jn!bGq!k8h$$Q%ZLF*t?ER@APD zM_364gU?evl(vf6i#=6#d);-R$3uI=H4nw)EJ^9q)i^)o_6bShIgeG2l}BNuYkbUt zc~dZ7iH3a*QW9ADy5d#f7LOBZqEy-Vvn}~NX8~fgWN}==HLDd5rw&+>lbXPhxbfkT$1py>@m_q6@oG{^~AtvTc%fcc4KCn%3)gsSB+x?GgU9rBcx^HY)H zRWY&d3fhhRw$xFtT1ln{L(%S{u{=;7<5+VrDfz-w8Hwz+t}!MoCp>=>i^fG$NDcPB zPhwF4*W#GSF;ZJ|WG}}p_5v+%AshIW#U59EEnkTiBO_oDzD#$({&3^DRXy5OHgwqA z(mu9sgf=KBkkeS1v8q}60(13%-x#dAs03fC^kq(e`S;GSbnsO^f78B7FFU)irC{uQ zCEedX(4WHHW6tc8D?U7$PL=LS!(;g@5Jxyf+8sI5D7e}BV5^|Y+LDXJK&{Lq19>!GNFP}0X-9=O{9S9) zTHFc>_loIOZJU%<)eQXNgWPPq(Ies3V}G%I{b$#E+GnBsdktFq7#5JW?KO{9E$0BO zUhV!Iw)|er*J;_^^}%GxWXCG%laInglQR_qWZN~iuN6&E|Huz-yPgj0!VQ$E)M)zRw9 z2qA;YRq3SirV46c=3q5rIH!N58trF`MnXWOxWdHAQ+49DO0SmU36o2?KXFri<-L;Y zaVW^h8M!4!6zqJb+wu8RVV# z0+%}f%KIn4H?F4~R~7v|0an)qR%}f{lZ=n*^b&02w?C_Dr+gjd_9l!M*VK!bo4Ate zA7K;>L4z&+rF;$J`5IvA69dJ8=b|A0^RHYq!TG=wxZM`l#NdP%YPN9@>&|Wn(wEax z0{{X}XDO#+hA4zvgDJ%7%-p}^@gm{0U`W(i6pNQY|eR3y4+S@#kKp^?v9m^YHX>9 zdcYqG+@|WwNw1CUwJL*mCZb})fIBDPwFJVkxzHigPoCk*Z)cQjjM^KK(dELIk6n`= zoTvnA4WirO%rq!rg%3es0g=XF!w= zhxljdr03c1MWK39(+U1Lgg-+Q7LDLWZ9tO$k|~=!SlJFxJ=m+M^Izw^ zF7_(bxGrpI=YM{vU#pT1@br|Ikd2V*1dpM6p=Po4G}JJ)Dn(%b*FrA@z>^6x;(-K&W;X0nGo!Rwa!Y`4?HqMA z-xG`1W%6qeFx!L+l-~0?BH!o|3(0o^X|Qq)iiBy7`vI=-iDRm!RJh9z%wq!SRLfde zUA1;vpC?ZAkwpO01&t^K>p|Gu_mQn>!6e283T~F>6Rf-R;qdng>n6s>Lz+YRGdg&9 ze0nv^wJNle>oW`Wix^CIW@T}|3 zGBB8!Xg*iEiQ#(k!)zi4tK)B69$uFK(XN6)l`W<+%Qi+uBs2(?Z76@+LPJe6VkCi6 ztYHA1Sy~$NFx6fEI+n6SSzKr<{j>w90WV;;u$=(3cZj~G{e|LC@Xa84H69TGE63iYoe+FRpPHnOPkzRCRaK4|tPj`y_F*<^s;xnkGWOP5hU zgA#sShOqcEl*@;6>)U|G?6sT2)CHcUcgvX} z8t$@#uYK_V_~Kc0qqr=>6p$KI(NVj)@mnTEk!G3`n7U3Nu$#8rA=STPz{QDYx48S@ z`#*8hA$@kzt?l1QoOaA6t%ho6YqQZn2*yD{bYXYXBmy1~N|Lie@P-y}xPC}BC)#&# zSKo$xC1C&yuc(9!8Cs6+(mofiGeU0~hL%bRfY2^yYRKxcP$3(*$Q?eqXGShxsAE*r z@xa&Vo9!z4HZ8x#Ius;=e|v1GqxPc_zCY5GIOd;!Mmy7RZsYUVGrC|`Vf*An{GPh$L6bq2)na z!27ORx3PJBp0KiBjm`QW|rt#FfEKyD()7bhhDOFy@HnGQQn%n z$b+lox9RVeU(=i({!e(v;Xn0}57L)jLHyeD$+Tvt-j(IdWU9viDW+Rc^B4PtVxj55 z!3%OwkI~HmOJ(n(0X9_+Fc4nCU(eyED71i~F{Ygx=5pyaOe7?s%aF|90*CH8s(Ikv zS{nk&Uj=DUYtb+7Cy%FExDU3aTdI!?^G$Rt-KrY2y%1Fsqa91NVCU?5!$PanRBlQg z363Zpzn_YjOdO%S4J0o5ooqN)h-AzQLCv%Y8p9t1?PwM&7_d67Pmjm>`xF~4Gx;qb zKEqwIH6|lT4v1|@(ZjJ0w`b`$W9|DYf-BG?P)Pn>dx1M*YfC#zk3t;f-s_?2A=cyE zrxtgaOqxgb^2uc@IA(--5?AIsiW6wSbcLyyn)l4$9d>WYfUfJ~u}yy9*{Pyju9=6u zr_gzJoh2J~DpWf8p9=aGJ{VkCSg($5Ebd9+ePrv!w_ddUTw^1sgaee<;|c7VTh2Tj z;r#20RNi{L=9UGvw;@maF|YV0#ZZz(B9`Q&i+53i^_T)5Jd0%u@TXzf7$m2bO`*qh z>qoYrv*1+Wb7Dn09O>f=%BWP}ZPf7n@UEMbO=eLDmSM;^ZfM&&xA|~eYu1MwK=MTBYRyrGdgTx(7h*#VyDIm7MJTWBx-WWa;vSAdE5eh9 zHip3=F=u6SJlbOXl4-K+AO3o7bg&ifANLQo;d(!#XNveKg3I;IKU>X4?g#CpR-pB~ z2CcOM>J7+YVx>*3PmV+I9149AcgB7{s^JLpRLS9Ih@|Ezr(2AR3>Z_u>?2w`&VVqn zk?&(U!akr|!|z-s!C`&iy9xL?vF~7&Zhw}5D)MReL(}efU|Eo)j<5QO4(CyV>mrxP z?qIhlq>~ImjmJNwB&b&Jg<96K;8$$}RwJwR$?ghF56}3)*QQeccR!X2K6fm8_|`9Q zRo7^mBB_~J(nf1;genHC$S#vLFRDrB-IASB<-6PdfBi+a0xM;QQ|r@< zG^8apalK}Kf(#eI_t(Prq3lv$VcU%NhjI>k0?u&K%JRM^X-V70o1c!_3fWelyf5Wb zL?HC5@A^+NgsODcE4(7+mbAI)d7?{=%?5_Sv{L zKN?3_O|KW1+YOBu=rY_@rV0NrSa5YLJ>WGW97ltO9*Y3xoJwlofjo5zm^!1VUA=>a8t;H|4FC(^KxYDHbP>Tg`f&?^SuB*nV=;A#-Y#a{~GF4Mz zg+bh#k}$ugpi`S&f~%a}7Qb-0dho_3EXvR{!;(-yPP??8F|{8KWO&5(YPH?j#CDxlCf0tgFu8YLhy$8Si<0;tCkFs`FW z{cZT#jV+g3k?4%*e-#%Zn=?qhHSV;C^cVBHPTcC^&j^tmv)msdK^w;v#hUTRim_!zRK_fn6tng&j(8!p^0W>uG~ZyBBN_ zW%rHkWb>H(PDuBJB%|IIK)_FVm9seQ`>IKj;<}I9{`4{sASZjt0L=84+T~v0!TYd# zfrcj|-?404d!E|41G0!Lojb!xnhLZ zY?T73ciD8{kUqU6Y?c<2@b3H|PR1qMxoh$_YoF}<*sJ~Qb9*Vc>z>Zm>mqjxY?d(R z9g6Agy(>h1YgY({4fL(uh?k@=2LFhLXPyhBI^()PnR1#9dOEj9z4QqN6M!h4%LXAj zj7!?o=PqjrTt;x?g~CZKU*>C*R$nF#8?&_|tA`a8LA?DRXhfT{36WBs#MPp$^j(4G z_gv{}(+WgmcHs1xx)ntfwbHp(i_1FLV(``T`Wk{AzyDL_E4bz)tV!4F|5V34eUwQk z!4kao%uH~w<&bfVVG>K`UN~_@6H|L(Gw}fj95r#Um##pQ(3|>VEpFHZ^_||jm|T`z z2~&YL>A!2BrgS3S@V!FGWV0Z2aGO^b+Q0{O%aYLL^W-(pKl|u$d|9wb-{P@b8xrvb^Si8pRktq+B!ia(O_@6K}A;Z$iM0NzDvjlN=Xcv$<(IyZ>JCsDJ1(Do-Ns%kqFGX!_nR z{M*ZO(0K5m@hZ(Q@A*rB)wl{SI(AbM2rA2(teGfI!m2AgM%4{MZ>=waj-m7rBVNh`}{BaFU!j~u?`4eIDuo`QcJisSx_Jz zyT2;=wlvzPUQGu>3*xqXB^zufnZFDcmkZ)G*DS+eScx_Byl*>At?I;>xtCSF$yORH zw`nB6YMMBKS!CjD#I3vBk8#M1X@aARePB1%MR82T`t!6hWvzkxgj;cLUKf}e>`D26 zs-gYHEIO$P9?8Yaw#rJ1ymHuz1t{j~ODw+v56fcK^KQ`orTzV9D$P=P(N?{%6k58# zTRG2o)aa1|-@dDJWe2{(!w}3`&=R6s+ML&XZ*Mq;7d>F$7mL1ua3?L<7Ih$f*s2O> z_4rK$doc8d-43Y_`cUA*R?PW=KJ8O}2#aJJHKq>;W4z%}$cM^!jB+}!|Lz+}=skV^gxcYdjz8a^`6@z*J~vC{fO$A< zr9*7RRPrsM`GZ`wrhZJfN(W?0=6AU&9u{3k}R)|&=77MgG zwVC?wjXCAP2C6{;C$)P#Ey2f$8!yj^7daGwll{fZ#>-YFy+GNS(jyPqz6|8@g71vj z+#QT}7r@Xf2}A*Bs90%r%F2<~d?7ebXVuh2^9{ifuXCuUUUJ zP;KbiuX%=ID13+bx_FtETZO-~ddxeQCK znirQ|(9~7hVSBcNXSS0!iOf$GDNV|*h^G~e8Fj*rUh>N^-?>J-b|$5ubWZiPSnpae z>Nbhd<_wTmWA^dQk_-oau8}Kj0gJQC&{gOJ4o`*Z*<5=PMJq867`>e1e4YqYLAax; zENZOCYz3KgX|(-utY@+ZlhBtw5nrAuCQLoe^#YDPvMoi*p_dP5HH!SIRRyUNrvS#e z@nNJY9q_COCk)0DdxN7TV_+xKpjYgi7#)=qWrATo!*RfHzPI~713^e9L@CZMVUQ)x z_c0&4ki?`P6%&jmu)|CAVNhaM501BdE^1t>4)RtqehhAGT={nP$}PP@bY{-ruNziK z**F?2Dw-2-<{TKc!d=wGlGJ6i12eczz%thr*tXYC1mU~} zz$(F-re#Nsuq?T55W>h4HXg_#MV2N)bWu%$-gv<{#pH)zdI_^+Y0WRtNL=f|`2QMO zwW_Ee{@RfIjBGYx>p(WJaw_U{kL!(J)f%GIut{Txp|XStn5*c1Rcqa03h0)LBtlV~ zh6l#yQzzTpFp1;tOEC0$z5yQ6>P`lo7DRIHfLhaOH~d3a{Dml}jGGhYAAQzc~%+iV~V z>h&LQ9?8MPGFk;R0s5+HJsIujTu{D!S#en>U|y?}Iceuxvv_(tb5-VLr#Mz;Y76J6 z(v{dAdDoT#18#W?0rtEs>|BE#e&W6+cmMfxXDFxP83E@&TjEx|DtrC|IVL&A(x zr^j?n|6o#6cA+2CZzLkFuv!T-Or}GUgco%2JuB2iJ-Ay(_-ypQE9G>AdE z%jDdc@$AjXY%d(cR%U;EYdBoUG9v@9reZAp4Obbebsg@mnj@Xh#Mj+lje#_)!R%ML%ExErtx_`zAh_;0rS& zT@_{pUL2Gzimw|rJGWJ*%8=R<1xA}BXd(&&jN>)mSTY)acLGk3!77_^2RGn3!O#%NYKy`#<8fwgRHAPbR)5s0VVC`B%yul3M+Wj0LasZd+lV)5}p@ zdAsB^C%hi*ifeD;_ATl>IwTOtFo#Lj@0tWP@2u~#`0LzNd$MxG|1jy(s?N~pYKi}v znBo1y9kI*MxFsCdF*-YFi3D0O@es&tvJ#om#+0~8zvK@Ql~yeuW6r^HQs$>mhNl$; z)o27urJ96}I7hKkHSZr6#W2wm@($Oe!^28Mv%-%!&;?aAZ+QjLU7{?4EK1eqfgosO zMsD%g`6RcF+`E&^*wg_x8e84?E{|4r_(N;Ez-|^quu=1Uk~_62W|hB2{uT~jT8qu! z>xOJP%W~q1>j+U_hMR&UdeNG0;KboDIwxOEw=0IvRQP8TSscp;o!uz5S;0mQzbe0t z5LOiamYq@`56F>H0ueB5f^jrQ;7RAJ&?RdhhEsKvPPs*970kw6Z3b$a7mkcgYkk-8 zoX-nWuPNt~@DIMN0Y(O|X|2$r!58d+HA4hke(ijma6h_CYYKT2Vbn#K+-?c_@Px+X zZwn7al~KTgLcNuF0=_JwO3$}Fi&l;ccqi_DUYZRDwf~IHEuJ&b(Nl1mo(NWtl5lHX zQ>tmaS(;nzOkqChEDV5Ljr~ebs~ZZgEo3O05k>+Fh2tssKwCn#KGQNKi^&w9VoL?L zxL@`syEvG6-Iz0q)t?wydy|1z>a%YISEpq|%9y#81}^gq2s?tIO;ReY@(w+O5|fkU zm&*zRX`(;lvgfgCl0uh*=zx#fpe*tQpyn7N7U0Er5gzef6$LZO)fJe0+U#OrSdf>< z3UK9fWrn;F{Q*iBxm$QGBe~20b6Dx0X%5)!HzVaL7U?^`7$$4NT}cd(Vvb{0ia+p! zr=@UC^AN)&If%^#U@=$(RFq)NvxEkuwXn73%0QKJ3k07Qge3vn5krJw2shqk5pC_% z0&bxHjNQ#EGV03^fCxbPDT5;U1w}2GY>)q?!L+Jt08@T3V8v=}%Fa(*_B=jjqk#=3 ze)Oj)et#M(J3S@#fF!ySO&Nc_=NS*<5^{+R=JkUfUD#rx%#LB-R&+)Zp<`klvadIq z9lrNm!*vzcK#(yA)j4AmmvQ*_YENL+)&?S8;Y>yq`Moe21`_g3qa%CVe9S=a=!_~5 zP!W^@$^^rnxAu_^)A-5Q3;!5^lu)ms2Ufd~T5;`x(fGk;%H+Ka!4__S*w0*Y<`SAq zYKS)$Cxn-(Uoy5IICi_Q9w{Bn4sXK+Ly6n*CP4~8mW$2b!1_pH%IFlj7zXa5X?~hY zD~TRZ#^xZXXX;I9u8I_PSR1ffLCX8{Shw~QHT4FRFL0pv%=%_G!FshCczjRcCY1FI zzJIwc$uR3XJ^w7!<+G^Er>n~|>TPT65vcVFpm^Wm4=C-2Gj{ zaPM*wKbJl%ILr*a^^E`Nnc?*rhu28P=8pwc13kP>_^_gP$p2%RTHf!Afl>`OALRvD zWl$i%p*2CGKtNYLBi1=l4Yj$iovSDtIus`is1r)(X5ecB0Tv5x6@SdCr*5~&%4z_9 z575u48rZQ=(4@>{<``QW5GrXlpBr^H2xzN?Umtk`D#vao6Jh{l4MvkFhP#SgGbZot zcNJ*YmaMxDz^@5c?PKo0Sky=9+B@z3aD1`8MukY zx-h`Q@~4Wg4k8XmXd!?jZlpNoa%RX<05Ix2@y!IWVX#AZ_jx8V8bw{tqWg{}CULTs zwXUDhF>ps~XS!*?&}e-hn0Dcc>OkbW5gZnvRLb#NUkuqJG5kMtIr8VW(exlqN9Sqp zg3Ql^8jSbxvK!y7bS&;Rd~3=O?2)f&ACgRWQt-6P>`)LZs^8w#R_q|zqX(2@cvCtA z58HOKt5}U?pLSuB>36I3vnrOe5Y}7a;H#Zh*?LXm5&Y#l+zo0R(TraJE_2d5yapr0 zLp8VQPPME--al%26C5|_L=CefMwQdb)kYMb(;Sf)Z*0qgA;L0~`ojen(Z$E&xpB0N z&yjsdXGADI7N)E9Kwy8aZdb%AIJ&5=CFmZC}2nV7VN`9B4g?6i#_OKJ#3JTd# zT=`|N!^KWSyU{kn;%I=lmI8`u%~py+j3^N-46y~~O29Fug|y)pZQ5bM_>~nSXTzTD zY|fx0_%K_*a#n?6m4a|!q(_=ssuxBYs#&60#8*81Eu8yCvm`KMK`Lb6+U~ErQlHwjgfG?Q#Db#zAJKb1Bm~k1h9z>dZVx@C<)`KEp=}Y+nW0l?HVL zyLYk)PxV1I2fOB)pSXoRR3{h!-6M|5Fwu}#bC#~x>u)@`XUvSSnH%LwKT`4*uBPrw zd=&W4T@O>Z=|6D{^dYRIB>--0Wt387Xxg`iO|@-q0X zEV7tOj_mF2U19msOt9BTk74K)gtBzzkcU!L$RueVh8szyI1gK|C(v1CtUno>8gG?x zQL{B!Uh+2m2arYKOU1YZ<^RBuQ({rX(>xj=4U+)0q|pIzFI$4+7Wa)%usG9uPb^!2cl4g+Is z!)P+bD*1PhV6Ta!*ru%WMF4#a-6TL4z7-;Te*10%p1b%J9T=tUbnVbopff@B>!|eSV|?wr=q< z=7mGOC=<wl9j~Vc2`-PpB7OnW^Bi&k04A0r50Q>xZIC^p+5Ij2BJH(Cu;h@ z?Q)*5+P1`y95iEAhkaqG)*424yT=HPavX{}~J?O5QAXja-o>K{6<9(2#QAZ}eGvXG&0(_n@=!1~#;#LG(a!2ByH8 zRaCR9%(p~@y(j5gfA4riGltef+c5_?OZL2XSf2X0C1e2=$WpnxFkO) z6XJCB$ulj*nj2j)f}T2UKaosHS8UI=#$@=*M|qnAfRA7dtTlV#cTtb(St#ftQUu13 zTV2wOjAhF4iJSNbZ~VuKNX@>b`%Nzi)~CYClj)PQq)(qb3W3VXMFUv)joQRpa_B(G zHK(PTWL=Oxh129j=-{6v>smhTIphI=+j6zyP?yxA?g6lw2b{2T!fj{NGZE)I0x~5l zY+DkC%ppSwYXS1bv09F@p74jw!okDqo=C?Qq8wV()3|HtAJhs(j2eryDFKRB-G=V} zD4PVp>&ku>;Pm5yaP6*Sj6RvH#BCEDkf8EvSA(+`QjroI|0?3ZS8Bwo_Iw&|N%?ar z!O!zaf~DCluM4&pEV3G>Wus0U%IDKRtB%6&F}o$hZd*e{VbcU*g(u1>a+m-mB>F+A z|H}TjNuvO$h`c0g%@PtpSdDG`!l_kaCdP(JnYM|1-86m=3e1i@QS#@=+_?9sHK(G9 zo7H3_cGM@PD1@DSMTb0*f>4xSu#rybC}`*ypeM`AVA(?1(zBU~x@yw;Sl(kZRd(g^ zq`x~XPeF^MbK`|9Mg=FnqB(+M!uB%qTUX4T+PT`Bji!zuRv|KX^^Mk-a*BTnTLUi?vbvlh=r;W$j=?e`jhf~W_%f1thM`;%s)ju4|kM-Rhu&i4> zIk8x1*g~$wG??V1LsM@Is|m6x?vrBHDfYOsnZ`$2=Q4Z}*SRxNbQn0z!h5hM^d zYb0cWW|5GkbI!M9ERHE|lEA=o4DdCch9#1@UjdqbC^OU_YR_wKfYF@e%OxX|4`b++ zb3+j_3+c(_M+MvpL5ziV zb##Y(xi9YE5vLEQe+JYFK1VP>amIm%SIsMiYI^%Oa^U!f^*as|-FxK2-0aJ+1iE@4 zvH&X0RXg1`PDncZOUDlr4e&ZeWC6nFpy1jnNY$?r38oucE*=35T(GdE`pG#;e*r}s zvg-T_d*@t%eQn}&p(-_BuB>2T6U#xpeD4#ikhm!KMT+}7dYY65zY?YP1i`RCo@RdJ z&a5njQ7Y|6{fx~492t571Xj~~=f=wP(RCF9^^h&uKxMRaJX$G5RxlD- zg3vJ^{X=DLR>&s#BL?Kg%4lC+gX!d(b~*OCO-HS(wP5}VkyTn$`|P#T2j4Smhpk9X zOc$9T#^5->q{D!FzhV`$lQ@YcwbboC=;CqBB-2Ii)J}|sYi_{1nrM$i$LamVWv9=Cs0`mXFm^aze-S@? zqxofKUZ5{9@pR~&xDIr-L4SYs=YXp(dBlVfQioWA3!exIHv7;kS>*qJZe%ZgKHaYj zl%Q05q#L}CFxSJVbX5sp@T*4mB%^(RF;&&d=S9srhC5~_Sg#DS*^mnn;hOasw@fLX zWjwxP*bEUCvU%3;qVHuKCYT-E-N>D1jT3eYT1>+AG=61^$F*cy@UpoVtdTMj1P)qO zC|9lJCd){XL|5Z2-P!qm?BUfH@Oru2~9^*bq;>0(12{$QhS$x9; z;ERgwEW*x4ycnyl1-|D4NB>wfQPOZt6uV~UoV$Y6EDXf)&Us7?YN;D41IWe(=Co|A z-ak<_z;=obzb2baUZX3Al4>Cc1eIBTVi$!Ud0MNDAKZGLv~+D!NL5xP(LoFc z!+ab^${L+=kpRK3)`*S9a5Lsd-v$n)F@mvTS$VAJqD%U;VOZcVSbuk&>qSa4AvbNaykXB%D$u7Vb1t`tgEc|?f0}E zMd_;sc0fP2o3A}wfkDG^IjZ&xlkawmmp$wFxLMUFv7HH>#8X?+le%s_)hRBK%+fYf zj#RGpzAsFCLJz?_rFjk0@ia@WKjE$C(gn1 zi*dre$<;@t=48#)U6?3Qb!%d#UO#)Ehn#;PETJwun^u#jT51#&CR{PTwwH)Ky3Y}t zaPaRnCby!6!us{K&xLzE9jp)79k14|7>D(5n%sXkNKZ}sXPlt7prK<9E{==`F)C~L zT=nLXsGv7PqzQAze_5;SGkIPLvJrvvBNrIs>XZS9yHVjJ&)(=w(B@On<@KE}ECe2M>2hb*7)OinKsAdz($O zxc{u&#qP=Yl$*iJOCb6reiN+y!^`oM<#!>1bV8=PWiZ z3bDRO#;QB%jfQwZW1;~j?X2lj`GF)tYb0ngy-jcAE<)Srxq{%+P9zqA5ANh*ltF&7 z0z-9=0!OaGT+hzNpd=Bz`*owe_Z!F1zr3Go3Xh@V(m-~@YbXRj7xM0mRFvuI1TukA zCLfCQ=&Q!elmr@F!Ottj+;w;ti@EhJA1&5U*k+@p`jnF21Cp~eUixIXZu|P`05>~& z6x7UObblT?Pr*4aw3ewya6y3cfRhh$47+V?Il$(2|bN2`moLnn;t4zi&3H_y-FJsBM+t@9OXZ z8YkjXAJb7a=X+rZTnl8e^Ta2)>3WyTZsRN_t;Aih+4#!KCjHV0=NQJqD^bXY=7c0u zw>`r}M-a={7k6p&YF_qQ)qM|mh3dSYpLS!xMs{B#4K8p(cms`ksXdCgog}ovn!Joh z?z6KOxB-q|7FC!=5AH{uGiKxQ9@id4%(i$WT4ss}2TI>8xzoN;7ExR5-?|GrGv2nM zzO&v)@b8~6`|%#cw9^!E83kW3N74gbh|O{;_n1;Vdy=ggpEG208s~Q68;sbnDYa@4 zvVeS0>bqJpQW=%gO$c`Kr=#%btmxU#)i2s{|Alo0Vyeut>?5>Ldy3%=MPYUAD4aoB zKQe+#^nF1-?aU0>P&=s+N6*)BQOS%@{cBPr!nu3(R6p%hM}!lmafwG^q8qM)5k=BF z%Dl1on6qBf70t6IuEN6}TG*x)s`!$Hu8hY8v(Cr%&9z_6QHd{t%EJi6##ezx6u$N- z7NuH3iRDM{f6`)bS|_8OdLsbp#_{WyM>*}EFLcusUuQ3egf%LAi!s%t_C=8$(N^r++>)-S*TlTCqTEI0Kqyad zon{{O`aF&4cj3Fm?)?4Zq@C;o-6W9rn8!IT6cGNU>kPz4Q8fFraH-ExAB!7zu1j06 z;ni}~L%V%6+!j7Mqen(BQxORdxk5pr{B0|pz@1pf)KB*|8V%bOI$i*b(5t#Gk$F)U zfC~)Z16|EO64@l$dnJu0vF5m_TC+Lqs3l8uWT6rh$~3Om-g78NEL@$)z6?AQ_{SBa zpP0cx2F7<%*_$yDMtR--6*BF(v988yv~=!!X}$k1smoSc$)bh=IMvlyf?8oWWRxjM3>8-<2&a4-Gm>wp9BlYrsv&dg!0w0NZNX z;YXY?iCfcY!=Hg5>&q!`3!BW;AX~Ii@)R606yFcDf}hqfEHgU_iXsP!^HmGx8+z8G zpH5xxoe{116n_)Q>eyBNZu`23*=S=54DO+NO!JW9$hdyTe`wfk(Pp0$;*@a@MkqyfEsSQ3LJ*=I}fg z_m6%=%&-X2EQifz;5ju8-D~RMdLcuA6VzCOk9mrQQ7P|&9yW!$J1rlNzUIE)+9#Y- z^^a`|@aEX89p}O%rCC&^C}<4tKd4svVMXC4cW*0s#0bn~ACc~>F1$5jaZ@WMhMNUVP8D(1bRN!xk!rBuRf7G z;UxJDs;!VZosTK5!E~9yk+UXQoB}h?8LGghj3WZUY<{JT$gqxFo^!g}cT@DZr7B#bT2*x8c8<1g7NBS+LF~2Ae>GY8? zZ?;s`{bP44Bx3S;=LOP$f59Y0 zH`BTE63OL<0FXQeWYlrS5<}L)E1REPK10+dq+AmrYK?3h>!7tNFjL2TW|_dyNg>CL zmHX10RPxGWo3$$j#zuZlXi0z<2{h4eBb=ph?wmf zU~s(ip%Z`(2+rh10H}dP-=Nv;Yy``~`vtl_wEvrZHkc)=Nk}GRkYH@*9J8mi?wP6J zl;w#!RS9J-8|*ZTcx!gI53SVlf@zNxDi%`J+=el;Qu;H19J9v2yL0%+uI2jM^*#>{ z$7!+?WDq?(5J!dktPn+gRzoK=rxw?X+k;6Y9M~|-6`9PK^`S{J9C|2IGKV<+3S-Bo zP9k^iN}O^M3Ta2q)A7NZZgL`Qa&M(t9f?2}W}-vs2{Sh&bzz|b@yFW0k*@8&<~4M5 z>IfdAkC>Uz!!HW5i!F*Xb~Ijh@%O?G>0d$1o>ja*Lg8++qh9&>Ra$NfYloV6$)K~9 zDx|m4S@giHB-E=>0L8X-m$HvNTQ~*4zynRJk`wJ&a@QfF_un@`dqB}J#~x!g0#u8h zM>EKH0BgV%ykq2(lG~s!aO7g-AhP>iTqMKJdBBRuTn7M(or=t5^7(O37U*#sB+7Hw z+uC?lfCL@1J>Hmt0=-CUOKnc+SGlVWXV&Izb6pH4fAw6e0}@EX*0mSeneY-}Xyi_W z0Brk!;`S!^kdl~N>m~<_jksbsz`U^>o+X5WLoX#+ew_68v&JBZ;Sq*k4~N25rRwsx zTKtNLo6P;nhgG(%s4-!}Z68P(>SC#}9^0-%+N*A1DTM|I=#fE%pve>>WC+)!607FN z-12rZpPvd;oFNNEYUdP?%ofAkyQOR@drKDSfO})@L}Pu~^n|HCj#!FCF?)y4&lun+ z!IKnb%#5hvb+{2QRq9|*Q-^<{a7{l1Ks)Wfm=7)F6>b3lId}vpm}L*zY@xaFG|BSG zusCRJcsScyRrH$}smbo(nwyr%8NzQ0sxJ&iIkOelV={AJ(UXy~HefJcHJu8y+%yqi z&k$bSSz=iND&J#l7IU(Gj=`%rb}jMC-=cGN`nISQE-Cu^z7a&X@!mp1`AofwNj&MB*wK&|-al%j_C3;UZGIprk*TcO z;<{#%Slc4mC*ZBBUSzHR^5&y9N4IG^2A1=q*69cH*eD>i(Jn#?7RGG4g+9`mD5~uT zav9BpaZd{@WEv*Un5=ntFe|wk(xt)O2nPr5+miNKOBZTkwNT`#L8;9WBu+(d5IvkZ zU%qN%lqlplzjnmWGus-wk)X?VuOAKZGyr^@IkBHhzAP@zG1Ob zCCy*Nv{4RGy%K2#Z&@PJ)RW`MTwA)k|QD@9jma#xToi(p3x?DjY7%30iOaJ>6 z$`d z-;v36I{;2BXd^zn9+Nw9&+TE)beqF2ib|B~A0u$6PdoSqeT*{UK zi-ln@yrW-RZ)J^S-Nf223s4K?)W2Q^{OTh*XAnXj#UoV1EwycT<#C%0LGc59B=}xV=9RjsitN`s?W?+#{)$*FCR4oMGQ%; zGRGuIxtcO;jXLE*(f(bgIbRdQJ3uqz^@48vk74TnZgMuLq#obPrUxMztAqy4P#dvK zaLQ%~Z44N;t)RstliENuk>B`fri-rD(SlLD@s>$`%lIB2W4jf(msgS-EbXH{zS}Pa zgtyl~Y6!9;Ls+@hb_IpGr~;EZck!7dt?{aFPc=8Eod}ZoFXhC<*Z`Xq(LA|ru+q+d z`AQEUe^B^#OFD0wAxG7@6h0g-l}=Z@+=&*35Gtp6iL*X&6XC{zHJA2vw@^JUAvh#H zxPgHDdS`bd1;wFE!n}_L*aIp4x||BL&>BB(PWdaBnCUFQ+Y@OL@#mUKV1@bvwka27 zw+$UuYc54ISPNg+5Gn$Dux`m%VxAhxxgwXnoTt517FkvH(>~>;JmujB%9_g?G_3Z8 zp{#}N!hR3&>kPR4e%e(UJf~ES3fsFlw2Z|5X2kfFD3pvnDT9MsCcCa*k2_mBS5!V zpDbTllS07&6B&u0HpEOjCWKN8I8W1gl2Xa-Zh;?y9tXH9X@T1@IT01mpA5eYjX!oP zmf3v2fj{QeoF{ZceDLgdY9`%T-d_6}@6U-`oC%9ehF9H;Y2yXI-&SS2x0m!Bw1o=t zZP@;FDBq6D)fn!t&U@13nr23Iuk>5pt+E>&zrnl^8{u4|ljD`pn2)r}RZb?9l%|hq z^+_Lr>N#CQaZzg^_#J)%jpp<*B3q?~t|0xKk59Z!!!;j?4jH098i4#|CaMh0!-(+T zdB98#bXwTudN~IsMyGCP)u{+j_=y*_J!@W5^a0q{*@)dxmfgD%ty`j8AxW<#!h_h> zhH1gXdHYQrw~e;E0RPj`ge6W}v%-(XxgaZ)^$>Cevre>+4{nltXmJtaAP+Z2y#^1Q zMU(N&Vk#c}!AB5=`ZmYMhk^c#+&75X7;7U9Gw4?hFl6E^TgJO;9Qh}Wf(pz-W|yJc z9E&^hF6V&T!i|`OJZxeUjrWa_a5U3$vuwUfpmxh#)L~TY1iajnq_W@s;!(d-JDjEB z$EIyQhlQndW}_MmvQq{QOK=#Im0BsSY@T~i%7NIPZ)1gE0BUJwr6K4pfm-)TV$^Rz zeaV!ya~-EPN>p~SZc5oT0=mo;5D+*_Gj|iEu~GON$TAwI!t>P=NJI{s3PG1a^k-}J=}~fx99P^6w*F22Yt83gGBj&eby0Re8|9ps4Ev` z?tV4s=yPsi&TsRj;RI#>E2?@5XP)r<93T@g3M&HK}RY8k~Au%7^ z*{BY*41R$C_I2dyc&UE217$yyL+uBW2XEHPC%XRTt;|u&Lce(o9w8F;N?%Val_fpI z{c31gC(L8Z)lvdHsv(!anFZFgP${A#3TJXQSi2BwzSkmA8wU1@ouV5_^3*$@zBLbK zBz2X`4@?=i?IDi@ebyXuBe0mjqyg9&as@+Nj9R-BKJ+}m6C2V8qo zNuqjDBDJZZ?an*r$I2yUtQY-?`#8xr4LT=o@V(54-%39l=u=QWcSM6FcNtCkV`+=B+F%FgAT=-ICZqcla;Ve-4V{Eg-Jz3otWdL z-`BAO=(t$zCN!mXz*0|8Xa=iIce3gP{A92XjFzwkugj<$WX~~cg=tH%VM}8xv-Y6& z%Pi-7v~jhNmd1XDCk<{?m?8fPsG%U>B;uB_HQ>(}B zcVUVRjZQmT>&22@D)e&|U>}DA`*M|c>(+E&vj5yXvf0=1B!*D1@3W^3v%#2`G zyO&#m@6CBkf~gTCQNj1a4=Iae4M7KiQc!eF-?9{lHrL%!1QHnJYj~z+)buFUKg4Q>8EQF(QJ4VNRrSW^S+ldok$~f*Hj^#7C z`}ofBr6wGvsoRIUKWmoGCCSW2Kyd1_`TLSS{TYH&;H57-d~wWxn=ci5r#M57+mZnV z1JkzE6zr-Lv=($mu3@Jw08bdq9@3ts$7>B{5kLFcog(Z8)V|!iNkDdsy()h0tl51@ zRMCjhi4jpeHLZQU>x988c*+6cuvs&fq_p;vXfeLK$LK)raKdc4y(C2B8a>|r{tR{x z*NCjk@yH$Lto4-cYA2R{_e%F82Q1E_=qEWs;N7knlg9fIAqn|;nN7<0k(1F>7o<{S zdUE>(y)ATePvS6C5KwJWg$HlC&AMZ8)DT_> ztY;2)W3s}LBO0fY%t(%Bkx`6Ifg?2q0$VTD{sa5Qu*5XYVbQJ7n-FS#>)7f4bJ_|w zrPT`jm7QZ%e+~n}_AqzzN(rZmMqaP+PR_AhC+2OEiP!qcHAM53TY}o;rWL?f0o$F4 zCZ$X?E*P^6**nusL%qz>0E9gC0TUNbBuK?2U=FbO3GO2g9h)XBTA_H$cgRzwooa@Z+a={0WTrq80GYs zw%B^yegdIL&3>;OPgx4FYfl|g-qJhzi3BB)Cv0iNaj3AWM(k@JgAziH-A2fZx?*-3D0OU#53N-~CYi3v> z=BK4ftuok%VWqwgdma+GVi9Xv(#<&MO7?%!a($x_fC$ z)(_VrhkxvIKijT5_4P>->$I zeau2cXPAQfR%%b(O+gz;PZ66-Ha{pCUO(x9kpa*bH2= z432?5K{s%O6WX-qJ$ckgO$T#L&K}xfIi2LM+c~NU9jc4biJLAGr}K+QIel}1Th25%#rFQOozH~ zI)9XQvk$qzj2Bz(fl1NTfp!QdhicQbPy*gZ9|qh7mEg%}wHv%?pS_^T4pf9Nxo|6)-V+u8SR<8F^nn6jbk<-Q#1#ggakky*xhz{KAb6Av>S;dcB7 z&oo`BtjG4|1j(_^GtqRjlr692Jk!STJfbxtD%~-2{B!C5V4TOX)GKELU$S;g=yMSK zV>sD*PH;%@G26Fq7|4^7;$ktc$buN+%UXD3eMo|$B#tO|qA=;TNqVhy5R%y9kR_d< znj&S*mv3B;^RS+6i328z1$3ihu}6M0dfruj3GvRW2_B@0uL_RZBTNo#EpX$Xh3J!k zFIwiu-^GbfI#%htssrGhO(vW|Vy*MY@O+GR?h;6@^%Cl-hdJ$5Up$()^g_7xWbocY z7u;7$K9?7q%$wxa;+hEG5Pw|D1O|4BE`@p0_L}kynr4;UY%rdk379S&XtB&RR?oWL zR@$P$Mc~90weJW*t4$(Vf$zo7$eog>F}t+;#puSUBfLYT`~55qbKWFx{b!Mb#6;yE zAw-v#m%ZlUnua^)#go@I-FS$OrqanK=GZQ)*4;ezjAH=>gtnlcUH%llTNM}D3NaLe z`AtN%c017N1t3}x-?L4Grr1@CM&M$P%0~ObUbHG?(4w#zpj?qqSL4FfNbR<13*n@I zJL^l<4}c@*aw_^Pv=HaiB?Er^MRPXk%J8X5^fY&2iAw$UP5-<%;-JwuHKUnstKGH- zwmlis=;cF#fUUG_sb(hoHT!R`dPyt5=#{fBrs7*k*?n*6G|I?hthRDyx|NW4ah|Rt zRHT(i!*qB}m&@sZ*mog^D~ph#mh3o@ZJ2^l*(A#2wfdd*QW-bZn6hIBT!a(s7t#+M zNEVeQ^d2b1f6{C?DD&^D(0SBq<0OOXo#;H6r~Ax(}Zh-d+GN>$!V99r{_^)Mx%p9dI>g zKrZuR$bk*o!5TZkW%On>N#nG`$MkLst%@4g5mV_q7dk*9E@x4mNKUt)l?(tmV7ywt zA))b8F9c08A25geF-!iX-OIim#cRr=pYxVM$J(Romak2-nPhEdHn=jOXI#tL(nJ;G z^mkD%K)qB1YikhFGNHYx4UqM0VM)BivbHGhVi!t_0VqvaFd{&r;lNWPV98rZo+#T| zx3r8>5meQD2P%L_VB{Ywv@KrX8M$f#v^EDMRhUuGEC%K6&!=Slu~L-g%6daItrS&@v`}uqU^gE)trX-g_FE~$u!d0w<|65@Kq9EG+KWH1G?2LHk5Pev{ZtY%o04e@`sr=yj#QYK9pwdbFO{N z{MtyXleu<$^(#^>P^^nmG;6gN(1pNOxM7jhOx5#iaMQ8ZP3w1%fvN|y>2y?u)iu1z zaWR|S+KFop_18HIj5wLS=Gi%p6`u1f*)etCOp5^oNRklk71!8ELCs{jBo&DmpRv5b58O(}@;ru}YkbT{EC8D7Jwx+UhuQ$Ifmqx92s zvGnUsKwwXPzeY-(|w>JQ9O7 zLN;?*IQ*~nFuve0u-%JS#!^!qwz}m3X_57z3g+Nj&lS+Z99@FUgr8X%Q;UQ~7#|{0 zb{I#|_|H2m^X_f259mvnmJ3cN+#OB|<%WMXb<&sS&GBTo$xKGF7}bKNONu@ntLcE7 z?5ZskxUm*}r>|s2@!UHtXIq%V7*eA_(rwbW-Awz~T{tUb zQZbs3QKFyBpjQd97<3iMcX_n@G5JLb4mFn5_+P2on{EpikDM^1b}XBZQgv+p=U^)j zC@o*Q;pCrWQcQ755wUx0D=nfp8}95s1p%ZXbJs8dq)HOa5!D4zCe1f| z&>{J)w##p=I%nP_og%BfF@!i~0gqq53!WRt)=CJ?XxL!z{(2KY5QEs&Z~<%gY>VR4v`u09-z9=K9&VgRU)?G)qdZ zSlNqEpYpYO7SuPuX%GV_Iu@b{D}ed<+1uL9UGTH5Z(G(h5n|=R)epCP6@tZ^EbW-z zwc#SE1O`t$dz*t}fLodvCC(heIY%w!QS*l*g+rW(8JcC19557|y-#RLk3`gr;u{2B zD-k9LeU!Tfsm{_VlyxIU(}WN`F?*OP7&Y6c#-uoPv5a2VV$hjpTD@2b#R+{-OTow8 z1A~h=6*p&9b-~1#D_Nj;E6(?qt%<)qb2c_*<3y_IDd7BieU$7cyqhp*hX7ID3PvoL zf`F(F8L>yHXvNg1Lxm6C&wQNBUg_=kC$o31&*Bujt+RWoay=IN2HNptopqM}nR)a5 zFno7$fOUaK;278hHN0i)1>0GXo40Mr>7{mDc?r?~UlHK-T-RlEg`<^A4r8zHabIL} z(qA@`I+~W2Z5Dw8@mQ+P{VOF)^;hUs6z<*|O|Xx9;JRc?7$L|+JY*^8=K?huU{cmM zMP_G;3O=B>@E#EajB#c1+Uqsr@TO3B3pV1~?~xju?aqZFpPmmTy&|35r@Tro_iT5# zx26&?S(dzdZu(uo5KFwwqUbgViR=Mo?fRylBh0Z*sCAV5)~i2Q_<9K)u$GW%Q$3Ic zHtAR{!z(U=81>FZAKRQ%r@VJEtP;Y^Rqz`kt?C4_Q29L=PpjX|q+aPeA5}{U-i)s1 zm@$Gi$z?QpSCiRL?UOX2#WAfYT#mE>hCEkihiW7~X9qN^CU!=eKrJSsIwn!t#AJY| zP&r|Y{#sF;w8NT069R$zx#miQ?+!>39bc{Hf1dt%7y5- zpmX)isn}dvh$1$7vxEuDWq-_r)y;YeuXE6A8`{_O~tP$?-qYVa-{ft{uIaknz-UvSyDaAD3$A}{oz#iIHPs^C1I z+_~tdc-)fHWxwQ-7rU(r;cU5r-vhhbt*H0psc)Q$@_d(^v{p0Jk4!s2#Y+XqXheZQ zh1Ckx674$sTD0|v`sOzxHhxBI2U~YQ_I{Jzu0#|$0$r%Fq0!v{a*;!-74BM`B&Y|D zb3w~R`H^Fnz%X3AI+`3+GkUpuHhztx>L0ZC*5;b@0Rn3gX>M0m`$~3L;Y4mkuL#Rn z-GFdEH~G(3K?S?Q`*!wsg%KL&#D?}3YlU@KG3>fOG;KUqC!*Sbk)wpGf`MiL4?4FiT&~F)8@{1jnnagh4>e%pi-s!z zn6soPT#Z0`=U>}ff$w~$_0MhH7WcFT?fy(p(~V|s7lwj1$M){~AT%C8EF*pPni!T7 z=Ig~@^+kZc@q%P7KH_>Iym)h8ZgVj*T2FKsRv7Ar@Oox?dkTT-Oqur zyIkrpa4EoygZ#8)UnST&k35dKIkyio7Fxot(qMregkA6_)ugunFvE&ra`|41LHL)p3a7>xT8EI5Zf@QlB1w+Jjxu9n?r876hPUJe*yk>WS79f z2(=_eoY4F8lQU!csATbbC7nh#h z#}G_{;H)HB2PwLaU>xYn{SRzPlrYM9r%VUQss`Sv-4@bP<1ws&@VB>c`{5js-bIK; zXTd-6e^5ByUOCA%){cJz(y1-PD8>iQ7O2%|sG*1_s$j-89(23=wj#KuyQlo;N3=y#oGWK(uG|E`Mv>y99btL+}Nu85{n&=CK&82kS6HX^fG1kIrQ*T-vJ}=kVm+=_Jt-%D-!iS+F z|EHFx#~Cu>BBwmhYdCQDzTpyXCE8!umV!r*tBKgFf4_$nThvT9bFxn*=P_%`hUaQG z`*oVv;A=YFr}#3|@T#I%^17wVwB9Nax+(zb&M)u}5^80Pb!+nTie7I`_Z^#Hvk{eT z??#kO7IJ=fPkWJdfMaLl zZtz>mLknB_f}q6;mRDf-1=E41`Cu@!WnRK#Mwv@fpTX<%87DE^-llatjgCv+%JS9m znI?v9*vm!2E9-kQIY+`9St4g4U7E>3wQm&r^#!gQfiVH*6LGUxrONyxEM2%KS9 z|IhUG!W>fKWO-lQIJo4^tB9m%*xSrETNm*UKrR_T(@y@Y5F_JRpp{|4~es=+$G%2yX+fdjT z&#JV_FF(D=TG?^s!E7KBl*uv4D>y(&N2;RevEW6FLcu1h4MQ#$S%aI8iH^U6&C6Ao zSK(^y+Q~RH;|g#YL2M_!t}%l&)joWCK0yyMvj7)XyuG z6j(ldzzfC<*L~LS&q_Q~qe{m8ge43pQd8J%a;v~CtQ2=XkZgwegJh@HEzskkkzWiTl zoK$YMz}W@=mtet{TO&eIB*=(nokg9f!}dUTTc)Lwmp-=XT=yyFtZLHmi|4p=GvOmj z1~Pih&cX@?*D7n(&0P7j8h7k!Np6C%_FM}YZ1ZI<$Ff~ae;TNZC$(!`qPtnJ>bxF% zC@rH=I;VgB2OMbkvTrwXSyeNxfF-M6!zcEz z{cV07f8$~Q_p+bFc6L!1;fPy!PI)3NPx$u4>ruaR4so2H%=9@KTXZzK@b{lob6o0w zCpKxxB|rHl7OFGv*_Ql`;@S{_T0wA^@aLzg+LmBq&ZGeGOL*b-~Hu$IYD zdt%5rj;8lUBWkKlEQ%vhuM_6?CicN7md1hI=1H>x$X|>zs*p;G^c-f*eZBfX}5` zhAB!O8W6TyVenooRjOS;i?*1n&!~y+DVom;0Mf+xJ*)%+<(L+j(S2Q7t%)RG}QGQY$$9#@HjSsS|7C-ds5y!Uk&SF2Q^EF_-T>99>U(+ zXIuZWr+=4}^|iQ+@BbMZuHXM*eNxw7=D7RmMN&Pmh$*w~5bsT&>wCZMnSG();wE3b ze=C&*{B|CmRDf@|ve<}+p0o+_g&%e#-3yJ6-Z+ATzVWQcTxi^EL7x=xvMW_^8^j{beZxn?kqy^h5~V7Ry@PDsrPdAuUEC_SP|5Mmi&(TlAy98EF3 zUakQ5s4q}Hrn>vNLD1R{oVVD6_ZUyYiub^cE8#L0vK!cPxs9eJ26fY8v{(nPbDci> z^|I?{A=vg+fj4C%=`Q`k%TiWg7YnV*teZ`TE*Tn&Zqvsv;F(y+xO08I15rwAS{g)@ zmsasY?{|B+^G8SE&2Vj3(JYVo=#5?qXiTR3h%cN3Y6WUJyR)e_cv!IFCmdBsf)*$& zSFiml?7K`BIZO+y43J~ButInh#pTO8{MiJ{#GJ0cAA#(mr=y&5f-Sd$j^l6I&;{Ax z+Tw+ZM}N}3NIGsc1eSMVPtbZZZ`1#|M6ar3En&bGyiBDtmLh`OsIu|bx^ulA@=a;c zIaKX<+w9ONDi)iS!ew;b(#ci>ngB-YB}CIaX!lRLkZ5c45UFN-Mh0HC-RO0$jcT>< z+_`_8sz_e$=z*UktLEz!9>9fCXi=-$GG#AoQT$Hy@Uglnvp=JM23u7}-GXQP%wig; zF3JBF)>}D^KDH<26{7Oui0U(i1dxxO!%0ey(oqZEA?hdAksLuRm64}f+-#oLb|wID zn9C^m9y58J3ZPge++ioTGAxBlhkxye+F}SR zu@lONp#W|+I0&kw@FSC`&T)Owxc+0?J#qYqZt?i9f^mJwbY{WEYUit#H7@JKEpkI) zVHHDT9}v};HM5>xpS@xlfVF7K0XBr>2fbR!h>p(oU z+WOh}63O}QneW|CEkm!ad4#U&ktcjGKnH z6BL*4qaHavRM)$ItuU$1TuBqQH9xNt9#|@9%d3su;|^7JCHW85pwn0{?+40KbW~g| zyUQOI*lv6di+!5Jdyp$f?*AXrc#4%tFIu&49hF&O>h`GImn(3bzDt`TVU93LbouQ!FICfBe$Y#xRfv(hMRTC+ z9ladw1Kxhs+IOx6txAj23D1e`J`mGos$SCyfs^k z*D=kXN!Vs3rp#Ab9oMm8iu#vCCdjF|biG)+wc?Vg*!eVqdn@^82VIyq+jm$bwhFp%(KAOj*S-|F@?QT+7=G2 zsWkR6}h(fMqOqu%Vf&z>qv9UjUPY}oC(#E^_QeywTsM#Mc?QDo!?-xd6``Sp> z(IQK0Cy)Lioxn%wwp~;{3Et{PwO_Tvyk%cKAhWEDH%8<94|z-v8*@cmtIEow&|}N5 ze$NjJpS2Kv{tcFLwTGw$taU_$dBU7_3)#bTAn)pgGn8?AzXF*LgmZcBzf|i1FqmCL z++YYu-G1GD8xwgWG4m5o@aqp1?X1vCOq07}#}^*j4vQ`BWmz>-ni73yB0aW`1qcE zxw@kHI_vm*)TUGB)obJ9zs8-D-kIeOdhYrM=&aDe6wA-6o>1FSNv#5AO|%g{Mno*F z)jWe}$HfXQ2Tt0DR$ZoHs6+@7EML~8_xv^YpR5l4)>JJ@D|p#5Zl)q>zNT`dvPi)w zid+s-(KmIOw^r2}xm5u-074-%v^Mg$$Nky-FJNB7RdiskzepDnQOEd;<@L58lYOV4EG3mF1wE@$aTCQgg zx1RVXVsFqLmt;p+(a`p>6Wp$7&|F7=o$_OnzQ zwz)zYlE!GV}C@iB}-fBfU zclOMN97|_s#b=rK=0;K2ptRmf%(kPY52@$S&+!WHtS1oE%lj>W%~px8%H?5tdj;5o z9L`)b3b@o|ZXhjI8JMeusVVf!N&EQ;Zy1x?EvHLcepGL#gB=T8FGuQ6-wVS+Ybkr{ zCEc4p^ibH4&o=7ke0khe9jTipxJ?5@{?A*UDvi|+x3j}XY;&%0iq~ddcUW<+LmGa%oY1P|&BvE7SQp^pa!`E;N))Rh5_!MZGm9Ve!g%islP8NL@M? z*D(&#uu0exH0~`eH)U032FDwJiM%klz)&KUok$WJG)9>DdxOx3#SWirzv98t4!VM; z+e)*FON_oSZ02lysz4|! zYn{N;^d!W^l5TrG=HPer%4Y7%sjq9)Vf910dv76QA^5JN0~mFQSWl7i zS#g9pD+tUbDpUJ@P1xr+g}sx0L0^g;Z6~tVbM-a7)j%(`?eY3CI*p!TnLTvnrJY@u*tzuO z^54y3>$7pcv1IfAsp(D6O%-u0#EZ> zsfyg!lYync$J1ApXZeUP10-He?s2$5H8EMS<$vT3cs+DE5Kay(c-%3;lV8q>SPJi9 zzv~PH4B-($`dzE^mq36Z@Kn_6QOB-=TSbD8ND?so8Y~vo25XVZa&7JuWpFV71AD7fuWcH>SQAQy_cB;;uY#-R+J9B1kN35m?aR8PoDOc%7nl9=TUe2)O+P9C?QdU4M8A%SB7Y9;_D=o3f@6A6)ZsU(LE z-1?r5Bg^=pf?J}bdP(#_@@CzRw(9MDYezzqhKwcZ(JtuDrU!wDR@-LFsVyPX_sHA zHY%xI$@G?SMLPb~@dXLxxI5;2Pg4AV!0Eo;uUOyS=8foJh!EE#?7$AiY3aO+C}P3^ zUgJbFfKjC_^c_Ls(8x+0!}$2t+?F^CU+hQ zQhUQWp#UY-NS?2}HG(&58x-mWFif<9X$oq{Ng`T%Erb0YoBtj8IGjM(QFuIfW5@A_mh>$M8x>OkW>ovyr^QDeKc`6Lq9L$-n_L^)>G^dY@{`Gx|xLkQJ@dYzDCEpt$Eh ziL(A%E$dt4uhJAJF4aAb@2p46%+`bd@skI(6mm6B{-Be|hZBZP=_vxZig!E(5IRHQ zQB{qxRZ(6kT1PR0-+a76L}=K%?aOFj3LTnl%iT=AhS9UklSR1`Q7IW6bZYP<1KVEL z0Px&msJDtDwT{~5d_T?$^c0_48^HXKkd{zK(#8}E75>(cXOpMX+qISg~WZd^HD7&jT{)^m*>q+J)&NrR^HIdjhSk^K?U8HW`+VR_ zPl+y1p64&s+0Bo36AJ!n#+-t$ccpKE%!1+q#;M%*d08&S#sHgdt^oX`()29s2ocBJSD;u2$DKe*Hj&{YLqmprINCZ%V|DiGG@0p`ukRepLjQYDo`r zKe;?RLJ*o2l#cLz{0_NJa9GealR`NOP~=&&7rjI`G@r@-*M26WJCW+9qtR#DKHe?* zOV0poah8X@5WJ^qYXwNSf%~o-Poh2fE6)pt%Du^OJa;8{;f8tXkSGTr6?VV5jqT-I zAR{U5Zta>j&Jj|ryA5DL%_^ZvBv6s~WC{F*$5j(}v^6Ye4+?S^4kx~W;K~|ZWnrwV zuno9fQXh8-|Vkqdj@fgf@-j;wJ&8fr#5acxWI~K#H(v68HdSldxR%j zt=f~ip->yY&Ut&%TPEU`byUU(Yh!@mZZ;)(Qu{2PP*e%(goiC4Doj&T#04hT#El%J zwJT?Bz+K+E04W*l)BTq~mJ=Nn7!{izme}Rx8(a$OH1ixORhUNR(1iy<@Cc$-{Q16Tv^|ONj zP+itI3qK97{$zm|T(Ul|dQ!ccri11V#s;X47R;BioBX)Tdmh`|JJitIfSYJH)-iw2 z00Ycgk1^l*G=&>5W?1UD`hu7g7DL@?C3`AVZql2>Okc5HYtc0uP@(x0Y_nZ%Fpdbt zT75}!$lUzNO!x(r<6sjYcS6+zk~V*ysAKiF+DrdFv7;B3zb@3M04QmEKtvbNV?XV% zIRIW!^)lebm}IZ6cHTc4m?^N466$zgv>JM*PJCQLkm>kjw!}pRY`vJyIhd9^ns^O$ zdXX$CEHxNetcYQ)4=5mF$8Q^H({?3|bC~ zCAo<05#2f!5`@C>EZ+3oZX0RWTG~#H8rvL$Firg%e)PztuYggnK~S7trV|=~_D67~ z9;zgNiJBKYk17J5=~m6kZkVHsbT0$B%6P>krauI#&BfcVlKr7-K&XzU875BM#%d!$ zID<&BGS?*GhIH=M9_|Tu4v5YNc@m8;)Rq$vjefGI=l}EVp(jE^Rj3NSg#*$_K(?6F zh1}@iJz~jCdRSFb0zZ2~7zGw&NhIcrQ<<9ZcQv97Yf`6S&JbOWlNX7OMz9iF2!5Q;6e6p!>>=itQE)@O%ol z7EO6mg2jia9Ii;B908EnMqj!2 zY-zy`z~xfhKPXq7%0;`6C2f9{%WtHyNF#uVqrk})pP==5yBKTr%v`(A?)bz%w3u~^ z=%SHcnwE!{NCh;#p9v5MO##KB3ltgPcG>0i$Q~6}4+FGnF#9%)O-pJv5&<<9?OgZP zk|ZOI017QKXH}gfFM4TmjFcA5U@$gEQAXSr79#$n)=GZ1a6pQ5R0^t!+h!P`eb*il zPT6RI2ye}4wcWSohfHIQ%wn5#$ z1DcB8!n@vHWU;sQKorPRXpKh`(e?Lrdi7@{X$J$}$v z%VX!bgRt2nbvK%WE&rltbBbo{Y7vxNaQ>G92brs@`A4l)^=F-W!wm4Xeh-_b`X#4_ z<{i{fvoT*&&V-PmZTY&q>~d#vu(Z!%y;`S0Ny-P9INuEf!X$@Y=Q(lF*STbR-J7M`Mc zOj(3cLQN%yjrFmiqFycbXKH=G(!t%xZiM^>v*|J%*I49RMX`dw&!x)Y_A2~6JZohU zUXnYKEIh@+++fazOMgtSkxyFw8ub*`{6_IJ-RP#bVR)i*RO8-r?_`e>67O7Eu3hMW zrmHhn;wf8zXAA*PKjiQbwNOJrvNHh~r1f^M-shSJuc@Xw!WB*MH5b_M%o%f=BfV^< z`8j3=N)$-62%TeTcQ=&z0-E$bQy7Vw#uB~Zs<3KwUljmSu{Ma3OMP0RWOKZXK04Bn z+5AG*(FEFt+D4d4e=<+i4cgh2dL3*7Htfyz zA|3Q&R)`ii$O)u!_w$VN8ogq6xBWKDQ_NkUs1g*h6)2w3L|jVJrO2$L5)52$XT-(g z03C97{Kp#4V${HX_~@I?SN#Mt7&7O-Q$S3h6ak#DP(neV2PMct-%+CbWyzaGL~S3l zuC<!228CRa5Y|jr#d@68h^9^j8xN)l1^Q@3_^~Yc~Y@ zdItk0ltSoZ%{qXgdFF~XiN|r+e&PmA^laer-*Z2!l!C|(5 zxS`pNXw)PQr+qF<9%M-u%W}^8Lb_ls(NoB~-P~Owyd#bvF8gOrpGte6>O7n)_vnct z!sM15UnN>>l*STiZVWt7#{*oPFv8l1t7)365(QPlVilLm>epy3qND7N0h^tp#pyKZ zMY0(;CQ}GRtw-1xV|_iw%os)N9!=x;pWfBSV*Ao|RzZQ0*(0(X^Lx4%>&1I7QA4G2 zkE`hUj!-wENFg_LaNF;wTl1(Jql^3$su+uG9rb2};WVp{X%5(7&^Bv5AKYqq#WrSf z}3TEB8#^ z#wF>>zDB0xTutod>aiHVoW{g44b>??a1V5bC{T0^6xOl(d17hDv1a!*r|9 z-S{N+baB}ns$WSZ@nruxky6qTOsVV(1l5SFjAp1;xuyI;{+0PZsN3piS}3aYSj+R+ zI#?d}Z+~lwiWAIUu-lL{=I`Y{($C)+-bO=mCk=L9YEcY2UL`OqOG+YbX6^iL|`Rg@pAHFJj+Np{hq>~&kb-aKVGk&H-oR^EtN zzvgDp-#e9#?of{K_tJDLe)yLL zL`OX31tne(!#|DsMm8^xCbNGKfJIvQ<L93Vyu&dfMx+IXG`wl8WjuU~H1D~Eq_C5Zu!Sq?lig`1VLgXl$M zbBXh!tATAAxv>t$ejF~%P#Yhz0FfUyn22%DHrou zc8vu%Pz#tz*8K5Exf*8|4Je(c2zhtHWG&D>8d`T8e2$dSwhO6ZRbe2jdWUB5YbeX9 z1(Rh;1sZH6?N{8%0&XndC@@o_BWS?w)*Qp<^wDK{Lq9Lo+vs25W@zqJl;3qRWSa^W z*ot6rOvM!BWT=}Ks<#2>2W{gvmS|!Ft{-u08>~N%f*2Q|d)#r+jgA5N(>-ra=q51N znXaBjT`{b_mmmonj_>9c=?E?1{SqVif;^-4y~qoUk=k`RoM19#UT|1~Fwn!0Vh#J5lto)t8tm^O+rr(GIVp za+7MQ4D7haux(Nh&8OPR?JRZRnHWGQ>N5l3AC5vqJ3N3xN=kpl$jrJAfYOy`V`HE( zESZWK%RcOZ{{i~{2IO=l3q`oVoqp0=4&{AnXP-(N9rh}$a&H_SBom&7~ZbPx40hz)6 zHywH)2_R87HzsbxKm0=%ap}klvs=yuC|guaLzyE3bBO0L#AJ&q6H4y=>V&9~23?OH zk<1(lYDpUvED_9v3N7wniiVC5K);;UBk?5@Dh{FLX-mU#{qEsTG;?Ihq zTwBkgNb}&47&m^n4h1S9Q?kvuSy>F1Vj07yVC;WP$U4`->G0sH!|J`0>%uFkpASGN z25@r4yAB}R`A!zK@?7v44r@d%vftiB3++jJ<A}#0;g@Sn>Ap) zfv&!%UUG817#kW}f39q|+mzgZH`LZ+G^gCqdGc26zfQ$^XBrScuWItYP)98a^H>h)b}%{|wRu^D-Wn~f**;IeofGiFP&@M4WV&2F$7SCnM(IsQx~@ErV_ z7pb3lfEeG&jAY!xh7OM7Dm?6Gq=O*ZSYe=cg0ey5jn=$K$+}%BXv2A$ zeEaftM#yhSj)|?(WIN9j87^jcB5+9zw-|>Qelju`abp#h3s1kAD8CYqtQs)oK9Ql) zyb7Dp{*=JcCM6}^BUL=SJ6 z%-A>x%lUOq&}CrfWNue_l|1W>$y)iXWKkJW29*et@NOhGi|ejUT9Yo78gL0C=kX2gGfRt=6Um3Yg(+6)S< z(a0=Xcdr#LB}c*3U<^sQt&`$!`namS^a3FZm58Nu^QYn^L4QtQYl4(jHHk^Bx+|e3 zbnB*uozsx^N{7y52d4XegObPl+Y3i?e<|<-U@iKWJZlBUGk;Y2v}-VUFA{R~qf-2n zF~5_6NsK@WYsh;SdJRcsnZPsLa$LhNvt6`^Y09g{i; zD`i4%XOv}GrT~ceC`;`eVGw($fr4liBb4Qf|No#Yoe%=KSPUf7+{CLS`ogC}1S^4c ztTj2IBhJl(;)Y4d9{Y>|jK@|iFUG3k4!W1>N>qWu-QSrIHp6Z92<4Fs8gQE0$5Fub zVNnu0W{8k02i{e-7JAg{h_TQ8hY{p0 zJ0RFQ6|>Rb6M8;e*$h3PNDvUFU*_M+q)w7;0C(7-G1v08lqR^>u!2v(Ea;qy_-r$G z`4v91RFuy5ABtCrV@uhMH43apR2Fg?<0?+H`{Ul7-H6Zv|LG-rlhEi5Y&w(L zPl?<_U!&ZE4S8VdQJM_TJ#}G-1P^prXJI>0PmYHSPFwx%fYZa`{ZLJEP6mF7@a_mNSdNDnZJx%neiLf~R>qjwlXe ziC)$A79D?816;^w^9fky5xB2&b>cb#>ZmaRpjr2v!So3bJe{kjClcKz|}d%IL2X6x$Q z#hnB9<1EIgRUfP92Tz^Rm|aAGoI^~LfQ(=}@guDUWI=s7uX=(Y7_HN%(X&S6I{j+0 zeE<^VF(zTtln2rf3~TxIHC1)c9A`eQDrn#a6gFfcgM*u@4tI_}V&Mn$zlvlw)dLGc zS&ZWyz+**t$Exjd&5d?BYju2BFq72o!Y%xUxuIk>ZDEJ~UE$`wb^+OCE$CiqWU;#t zr#dsv&4f++hmTfd#h7aGBJALO83+Hqq)9c8^4SF_*43u0_}+tVu3vFhec`cO~Z(yK?Na>Vy~^y+RW z7C+3SKMpxQ)v`MDc0EPkr$cbCC-nl#-|DCa_?C4VQ7lx*fk7WO;cE-_Kx+I?`MKOtkadt zp48x=2f+Dy**62K!1%&bscs8bs!a9E-IK;H7n=i$Js>Sl;=kq|xFK-qs^2x3na!=M zFXD&jl`kCWYh9Syq`m3xTbR%N31lrVHg;Is^$=E3G>qC5%&BL*YRhx)(jxFB1t{>Y zlP(-zfN)yJ(`V;+bK-0;@{h*RCD)y^tSx7*NoVKRSk>DBRd4%R7feZRhXqr8TRPt{ z=>|S6(WqijZL5d-vQVQH>oPJV>KMfcR*VW;5gYM+Vzm=eC9l&3+6E^ZwxJvKG29#z-KI^#szc^fwnK`uGvqdKr2;k8(u`JoYCsj?6E*Xhdp~69#)%PVWFKD3 zGS@l@(Lb~#0id)x$fEDTSRUAHvokv2{xi}yhBk~y<``;LRN3?x55S|a=dkuZ&#-JS;*>|%z%F;fRPXkT+M2NijF#UNFVHd$&(3!)hFPQS2Jt-9jkU zJ{B)jq|qJH@g;EZ{W+VA{;)2&M)*PAj~ck(?o|BU^}?u9&KUTkRZU9BS}VN5BG zieV2Q%fn>>Kf7`_7SBIxXdZ!HD=ljX`n2x>8xjrvqnY~zio6-4VUvOnPu!A1LL#rM zj1Pjqq~Y_AwkG8k^#2CDat^#%UEeiKU<~QOhl!3FK`nA_FRk$9!eoR0Zp;Ib8p-6f z>w-5{bjV=>I zPf7g+lI0>S&x02>TS!^iK$*SFrLEZebEv`l$;T)I`4cE;f{c%WtK|L;?dr0Y2vye} z(cVHP{fdJC&SvGRb#}3k%ui-3+>W6i^p2IUcy8>75P&KHDhL=87$2|;g@hYBLzlQH zIE8C(kP((-yJfoDj;N+M0_#3b`uk2gs@BZIQzT|V9Jz{I6nzn~ySYofb_ozA;21xh7KYEW0g8^~a@pmu^ z4v`5dp`IOPGiHEK%*}YhlXYtP3mtt*x?=9Tk3Z=Bj;TJnx>DtA(_fmpmT+VHCw=&h zXNP3@cq0z;E`As>1lNdme>7@>7n(-Wd|Ww-xTnnVJ34_?{Y~~Rm6eq;om{PQY?;cL z)hZvbR{4GT%CFE2AT0Y2TxBZs6Pdm{Z1t0}Iy;{_K2fc%*wHe@c@Tkhpvur`$ckH` zcVt#*$=o-x@I~%1{vI`HIqym3c024?3Puy~U7UC*Z20p(%ZZ1Tqo_V*nh4(JRk3=V z^gR|(5>H$I=n-$T+oc4}=v3DYc|fuzpQc+rwJy)r>+wL4HUShBiTf7nygTV`L0WE9 zbHlw#@*c9^$D{FfefV*K#ClfV13QjrER!4n$IX#237uisFtwn393-KoSP4paiJ(*V z8JEU3XhG?G!`=tlsBr>LbreOiLOj8gz4(X+9;TYb8~M-~aj*gFjT5!)9w#qs)EJfv z0{7VzmoHA6MS@8ghIuUXl8>ERhlluk2j5_+&8@HXc};T}N6kTFA~0OGG;g46%u2)= zlFG6T4RrqT0}^Da*hq8M-^#Q%jyj3m;Qz+NuIOLG3nT1~7$@`4M7 zy?;x=6ImE}^zxz$S~^OP`}JDg@?`dEsI*F%oc2xyq7bTqyIyj$j8)Ou2`s^-%VA?Q zerhy3n%_({v(3s;Z0maa)7v;^F*CavYK@tEv)62Aq zykK!sy;{%nnqQUjYET|_QcA{Ip}u$`<+j3I>>?5a>(8@?Y;%44DGPm z)|D@-@G}`rjpjF{Mp~`B&f}ySzwLK|%h?myXt;$d=|bMJu2KyPROJ9ZK*7I-kl{b5 z{s1!FdhhIky2kDXcm^j+{)#)rb~E3i-o8sYUVmk#hLk|fP0=$W++FGzN!gjSu3Lak2yj-5b{L6h>1;>y4Yru?i#vM(Hf(6$Xny&okoaUcm9h zxy9ys8@O8B=1wt`x#e+ zgrQXMWQxg|Yjvq&=HKnR>&fKXZLy@&Imasu$wO(X9EM7SpWF1+hW-jS3FI#Fu`)ZF zzUL58L@wKbBPu2Iz|9tH;FhIJCb3Gw>b#xwFgL1;yS6RM2eb17f0kmNG%s%5;4MVs zyoO#Ch^bL_{7jh{qgvWx5c(NpVaQM9HFW!%?mNOGT#l{$8Q#CGu7nr*#HuemF<81m zM%DxFiF{vtw#P_FjnT(DuRFkUbtMyzxl_rilD#kitTZ)j9orp}EDx$;^?G(l_FcoL z>F5jp-dXg;V26YpR+ae!v1s-3Z!FQ^uxBn*X6P>ANg{uT?WaaM?P!O8qR3zupX$JxX)(!iTXXxXb10^+tXsBM_2JhRtMnxIWj=G(I($$*kk{KVk_e^>ao(UCyZVF{;5N#yQh*F}+dh zG#W9Wy|kxYF$+w&3%YVq!ffeU#61Wr54;bsyiQqud3B_Pky8cP#R*yj1&LS+rd>$f z1pAqiwOr^PIOt=U-Z9ieGNL|7;W$0n;o>^p&SgliRp7TwWm)EBRbr#qFaJ|8ttDg1 zmkwVn6ibFLVpA*;zF=0I4t&w17y^o-&7~NY5m-$ z%5p4g>rfSr)baKSu#gGwwT@=6Ql@Xa{BpPGsrl%CLIMNJ68*|plXo{Ot1uQv!t_M@ zXIvuYzS1@E(LOYPCE33wU3j<${+lF3t}X^7^^U`rOS}dSK3XrPZO2AARf@49hjZc> zG#RB=Z+CHH_ZBtIK}ImGUb*u`bb$w z?$2_}LfEPO@}l|`Vv;o9S1Tg|aodGYvHEso61O;9R@3Tmn&)Mu%Aff?ly~eHe{7Yp zGPJ`wZpyBA8z_0+!|XBS4U*#ia#!l@nQe!5XFK*?=3OdSQ;(mX zR?{Qd7vlqSbg;G-{DtK2r*D*+WzeGDlZT~{T|QmaRH28cad*L}wiEtJ7c{oJ$%{$A zI^J{nU~+QbEbY!(1h}M?K9w4eilX`Z+Q*I25eA&6f0%PE4)nlGv9~MPyDl!U7IOBf z16R5FDB+-_DY+5bBEeX;mY$+T3sE+Y=fz$EBRt-T^nNlH6p~L#p&vY$cW0z9`mn>% z1?k%2$jyOckN_C*+59*a9W!LP44B@ch*it>ars}zy|By%Zmq{wMpzrwv?UBmVfKhL zORbO7XG>=8?B2ul!AIy2nYq9KHRjR5gFEbPRyugeHpjM-*)`(%HoPO*3aX3t!7h@r zA7FGT^IO4nqUbbo1|3_4vvdRePa9PpGnu>cAyac;R%zefWPODcof9e1M_p~2V7?}O zr5i|7?=C3E`uuggpGbfyoQnu>n0%z?i^`^2{$(b_V3IfGgu*QF|Cklo2T7<$QEU^v zJ8j<3kp9_m&d3NoNPShJ#un=weh+h~R2O-zq2H}57xieNH_MVT`b#S)=$c#i%*`|{ zn3KdDTUD;|@%F+CY)wblYU>XQD!e4^6-9*vvi>}kNOQN|Uf7HfH4CK=e5LlR_oizD zvBMwbgU{p6SiB~4=vAuJ>Ey6c{2PkP9SdgZ&P1g70b%0Mke&0qT z{dG^sFZ|&fL4$5YivD2Onf(KgayNprER+5N`ynu_PU&BFg+9S_uscfe!~COo~IiAT3*iK>RGr#g?c<{LgyPW+@`RQ+P_) zfKkY#r1D);!mm`!Y+EFLa69m_J@DRg&%0akEG=$#*pKB0j>Wf@=rjUOWxOi_9FV`R zD~%&LP9p<<;~r$aK)K*H3D0-6VGv(ErcmGOcbLGiS)g~JG?bgP;j8&>3lu9$7^(x- z{!j8AvVWLDFV7R{t~*ou!EonY0<87jv z@%LF7@_oDmA%9DudVRNEy5!@O`|^|*b<0>c0_n}|aH~nOYrU4qq*!I)S(mgo;fIT& z)~KE;;&?q|XH6^RdGUKZNmehU!^rFEs3ip?rW2v_}UVE^@pIB$Fgv=S7(#CEtUs*Wu%Hl9XYm%Z>Y`ihfP4 z-n1y_T{AVV;;@r?pU5QY6#{%Ko5>Gl{m8ivUewOsO3++Whpjj$BV(-;c9_$u6tC;> zm7jj89}gAHJb3NqvBG-Q_JOOsbKRk#B9&6|8@&x4AjKu$F;Tqa{;@t#EF?emK8Y0h z36d`#;zy{BMXe|-9C{8sJ*;CjRo|cc#3_yxt7|%vn)MxUb-LtLiP$9di#gp``?#uz zYyVqdUVAsLkLs2mHK0iP%e8JBw)W?A)Y@ACS0%lbn_|{ni2lK?|Irxz<{7g-d0g$y zKs!aPaWp6{XUk0*P<0JA$GCw@Ji^5;sr{S>$_gsbCBqY<0h_q<;D0AeAx^@YAZI*( zC&a!}eQxZVt&JQujGJSiq+nwrUZ21f2#CL;;?ZL!1pfKxyGpA%C$wKDHHISO0{!3O z-e}oAGzk=s^~QETxx8H>Aa|aN^{T(j^vcIp_bD(FS9!EE#4VcjrK&Juspv03$7jK+ zXIJUgibWN%CdeYSla=%vUD=H)N^T~A+P_CNOBjKLzIJ~z_?_(xV%*OZMT zs7jI3orIotuXHkJyVE_ZWKYOp@|crfn;89M{#Ujs_^|vgPj&7YCr$3!$&JM$q?0Wa zyq%AcldK0N@u(o&gGH%5ne88tzM_UPC5Qpr+ZjQ@^81#**TaB$VywT1z&;o<9qOu>tP&P+{ftzcd2OLq(Kc7Y zgf@W;ky`6k%5!xdzimv}I!5pm_n`f3flzFm{b}_Ih+5QE2Xr?l5@g!lm@O-Dcd3r)7jFsnQMD5!Vuk$_}C@!xuV$k6}I|xuvqcdKVklM_O zwK*W6H^Bv?N3~w4bNhi_sTxM^cN&Uja-_KcYJLU%mZn!Yx6GEw33t)1I`B4Fj>$8QsaUc@p{cj^$rNs5aPdA=s-pH)2NmwdtIB+Q#RusJ z5#6U`%EWJKR6Zeu9tObi7lN>h6o7Tx|5U$BNTC*faL}3PkpQM-!aoM~_~Bzq{U-~q zu~-e0(7LYBFMuA92owVx2DNH~thPcpy$qxQgY^C_sOA6mB%ly|X%x^uJ&3TG#a_SC zWIr%9yH*f2(yp>*VjA^=&zW6K>LBA-)E&*?tLq}C3vIQX9j}*NQ~GQzOH0QdqVm{F*r0jNLT*(-O%(vc zX8@4Ui1?ctNv-+z7JNiAjGAaslUs|H<+K$EH;`~yI+1A&nUX#8>u~Wgq&Bf0w%|ET ze#?VHd#h*CnA8SK-j*@BQc=}aP6L-ZF6?4g3`LwTq0UR<)1oCPE0x?Vu~9V`YEfV_5+x_!ZA>o|9;}-he~5|nhEbtzb}%sh7kF0N^e&QR7x=Hy z?hn7_%bK5sMUo8EvjVZY*!_+fYp-(QzQwuo@4fhzS9{p)1in`VhJQW;e;_yKAI3)> z^}v6~Ablmba_#TWQ{D8O*wlJNW*F{_`#!!H-{y`KhQn=@Hnb~A} z3`LHLp!BZqW;&6#NhSn49;DFx;yD&$vqB)aV*g{3F9bA6(E0?JtXs^Jqd8A#oB>;9 zP#dcwxpA5VP^CNE0%+#lQe=I+KlUFQ!)|eWB%lF{dFEowuEDA-K#U|d6yC|H>99&U zriFL?J+an8*I82>Hx{U?kFvZ&)hbN!tQD75i~TTGqOMUr zmJQ8FK!rbNVkx#b4;5ASE>*iwR8>e_&xYgfQetTE+H#_zGhRF-MIAzpFX%)zqLS8k z)%3Pd;yOwZr;(m(x`hPec<)dyw-*W#Dp%=vC1Wb@!k&SZeg7+=+Kbr(DOq?_>KrCW3McwflwAI& zQSZd3?0tUQxEOMo1%l||u6s~&ML$Go^FPG+CV)dx!h#2ik47FT!xeTB?gp_h+^?oF zmw&|j+%`{Y*3cfnz82&9RVeSVT}$}%3`^i~8v6{hQ;~YibMU^gG96^|GOJMxD{eHW zFukuR+#Kq1(4ylG@*SRdI7>~Wp(S=G7f=m-!S0g}eiWTfX%NYHQ{kw-*_a2<2kE~f z{JrR@FkPq@e;1uvtHzYUpgATecN#ey#Lu(+d$GI~OOi7AHiDjn&)G9-pC6@NZz|{S z#Z|PH1JL2K9-M#Du@2?m-?h$3*7c)ES_5f6Z9nz^zLygGfqgB&!Q%%;tS-`r?SMjA5TBnGzk--Br=uvp6DPcOg9V3EKOlA1#d| zUBry`r-e|HK;{EHtN=4ttY#3)q!WKiD=9muSmE=>eW+)~tqERrn%h95e2a>8P0Gk0 z$S(TStw3oOMvX9wCUuG6Y%CAEc^Y&+C$ntLmp; zbt_)|3dB}DQ?BGn((Zu7qypwCl&Xh$5E3!1EOHbj;NcA-qUUQx?$5o_TPfxAk05c6 zbM)rzK89V2pl_=x+0BugE@YQ;gcEWPidE4I*?!#04Rft?8c*mTJDe)=_E&J5?soy zFMriM+ynVWdI5E@dPDlt(Wd5-aN_yM(|@2>=O4W}m}he|Mb-=OtqTDt=H$DGUg~xo z&B21O;ms{EHV>GLp!uudI7k)-v1poDEX4ErEv&IA;RicYBTb~dAICj%_UL$mcIkzN z%WSVBFHJsKS5ibZS^aZX*rS4Hxgprc3^=PzGqKG@>82lA6%8^o;E!2vx6Xt>O8|Cb zO;@`e8C6w=p9``5*YkZkYA-EV2V|Gvio=&IU+#Fhtd<1WmqskCT7Yb&M!Vb~gJjLp z76Gn}75HLG?$aUq19NVG`mh_Z1}*(hgK@;R36Ja+A>aT9qkYddyD7f%!$p^pr|hCw zWm{%Ae7`g@!2iw=3Sv#r&(c8p*~}fHd0~AM#D3_IjhJvBum{NJTs4oT2!&}wt+rZ2 z2j@!r3r`pvi92c=LacwY(+GELn8C#HEIHOXzqfT>v?OsTJ7h zC`hy#UR$EQOr8N@aOn{QNLyj?b~0SZ))VaC!>7S)owln1eIkMZaPD_xRg5>0TL^)} zQ$37$p#B>k^K@RiaT^#0EB9q@w%#Mb4KfOp>k%>gGeko)W2$f8feSo+*p(v_c+Hnp zdej77F-E{U!aPR1pwcU3>FClu2m43_Sp$C0<_yz=`v37Wc?zF}p>k#mW&mD_RcUVC zGUaA+f$40&SN4c15+s+w11#<9A!g`T0r{QIT0s_|aE=a1} z@5{_)>3|_+B&!%ug#Ji$Fo6I@UM;#c{Iq$65i-S7%hjXfA~t$o*7^v|s0zkjd`7@# zD?V3&D*<-J4d!=*cMlJydE_l4TA`<1`g)7b9(l9q6@3zltw0~YQ<(td2&n4`K}F$RV4X-z@&X!vXOmd$Q8&&(x1S3pC;shX zB^|pE*9O}jLCfQ*3oylzR6w)KZsUygj1{y_^CikCl8uRY54{Zn8fH>GXA#T`-Mm7! z6j~$$7DZ4#gfq`QBX~>nUJ-Z62masdNg#hB(Xv2`$9*v2d+ATZd@Uv^Cp*UB*=OS! z&EeF1QkHT58{~Dgg&i$hSct5(#kCBnX4_v?TQCF{{(fAwf72csBy5se8pLmir|~w( z_aTZj1*l-Dzlnq_j3nFxKbV?;`iy&?FiG(svD% zcbhBOgU&U4J;%B^0@LEd#IMZB1*iiDJ|b9RNxig%FuT#&;$$rCvJPFh*3z zgRNeDb{>`_4|3J3WuuT|B!8_mFyF2ZK_n`GWZ$?9UPyP~&8oLfoa#SG-S#AG#L66y zWgf#BdhbB&;`AGkfvJ+&B=1Chti{}~`c9yK@_sqrp{a#>hP61c%w`rV5#_Pzn}=uv z86HNti7?{C%jDqwx^j$kDd)v>At5 zjUrYcH`C4ZFaQK1+Snqi@+gxW%C1F_+Y5M^@=9^eL~XM7;B-LpGwfYp{uPhg2X{bx zM2qz5{Vy)7*s-%E|4H;4Xtn}=aGe8O_vrU)9ZrJx;kAQKn?MSgZi!K{547d4GAQFc zS)W{SO1*^VNNfjmq*NLj zFs!Q>oq3z}*>VX2rg=9q$9oBEf6r5S&>tVyD$DKFzNGOje6$(}nXN2Y4>1Q`3|T0M z1+8u511&sEKJTc_k=Yd2{xtm%_?|w=6%Fp~IuYM>I^C(NO*J-8@A%#MoL}KLI@(4rns!x*ZZp>!l@JE~e=8wBSUU9$nWaY2%0+OfQnEmn2vDGX@*o{xRrvStI z<9%lSwo=S?@DenL9P8Xg%R5k9-4H>rq9wyd62s-9Zl?X){Xs+kcDf zBOofs}Ya92k!)LTP@jO(YTQs==MfoLQT{ycnZcjQbF<4~_J4VO3 z04_d9OzWi&Gk{v6>D|VA05s$ZXr(r4*g>3`3la=2*t&NN)cjlyK*9zAS*aNhCq{+E zop6ha1W_E_4Op>9R73S*9;~we)lHGK(OGH|??~|SGpjdFnyrh6!e_+;xPZ02QE|aL zmNrpUF5buwOZlzXt&Jl<$D;TEE{tMi3+!%)oN&S;2Hs2Qfr)^+V1y-gV$?Iav=he8 zs2l(OG0|xzRm4oTWpK|)2#)o~ZUXU1cZ}|?#2(Dx>W^6uw3W?-)qZZsV`w4vm(o>$ z!R8A<(S2Cu1`jU1R-0OiW^9lrl;&&4PRE^#N1f5#ST}Ww&=VRME+Q6j7x~OlQ57qC zMDK&J&3B@$ji(~C8HwpoRX2jUD-0(M+``A&5BOYFuFmQ1oyN6#1j@(#{8`r5iT(iw zCQ-W_PrkcqQLP1c$&^!4af`ts(!zt8-ylv48{c1%Zjj>)Stm0;1{tS3$W=0$eLM8K zg|$_hrFi*9Sc}ts>_&t7{QQDiOvwfggCYLVxC)+ z`$&`4X!G9D+bv34qM_VJAxxoeh~1VPVe@fkI- z^c&SR7*(_%sQ`95cFM%t{SV=_$b8;Lxh*=@$;q9U*f0sTXPCso%|=R?7gsn|LK=A3 zYi7>e(8vY($5A`tG32Y}Y@YF9?T?$Z*;#QV~e8o>l*Q+QSB zQlluiypy9Y0~|amQm^K4Q+D%I?uMNrkALmBT`8`LzjT>Ee(FmM$r*$NFu5b;`noo(_CJX^VS#_5jFJ$oU=9rSk z;2Ncefjy>LN;6OIN}*&oYFPUViSvdVbf91Wke6o`zJ4{(7}a^fa&fNJV%oSo5|T0g zz1Sa))+sb*DSBtosvg=DKd}IF1m1M_>h|qpq;lw34GKyP_x51;6SXn!>U0P9`w+~S zCjg|;Kir@vfL$jH;W8CC0S8$abSA3C>!NdE!gZ-~y&X|))0~%T#9ohy`wi~?-@zPV zxSZ8U-z{aVKGKAqGl!mD zkzQN9)~AI|51+b4kDSb*_PxCbbs+yR&T0Y!USW1)EVNCy&lZ=yC?{~2xWxSNQ3w(> zO=$1WpFw?b|Is)2d6WGF$1aZ_>74X$!ZFc-K>*OkgmXbOTd_wEwo1zN*5{K;dlJEx z5A$wT#y%?qQe?Vx3tbv8F|vCx{TChnwZk@xK&wDKGHc+9Be5L4^13Lj=jaq&Ab97M zrjXmoXO7vNY3u^`FiFTyurFFST2gF9vb)QF78*2YfoHYjw%(s96hZy1G+g%B`g;t=1i?E;kZDID_xXYCMeiXOaiil9T987j` zlKEHr;_2ZvxhEsI1wv}uSb--VjwA_S9q@N&Qe5>#v5XP-!T9b1FCc_G0q~gCErCl@ z;BsCEfy=Hx7{3sIW?T=rLVe#A1K^J54QyqD%S`Z)04<)+OE$PP1TMLJaoO_cjGTR) zm2>%1a(LaaL_+8J0E1zQ!MU)Xi;}tY+rGM?fNUOg_K`uR+&VUZvcHB|9g)3en9t3- z+BU+qtK78M&%@M-6kDq(?bB^U@qCVHMYRd4-8A z6bR@JREM0xn;RHjc}vO0UvU5q^mN`_Fj7`y{1}7aHE4J~@&~F=o~DabVy@avM7t>0 zjCbDId^`8Xw!kF_>%v+FqV|r|PtRPaM2A^iVjn3hu7%`5^VqP$gu2ZR%5l{;qbQaL zxE;Oudwl*#>eX(1)DTaAPyBs9-np?H`7~iUVTAIu>7w~3o-vMmD?-7CEw)1x;PFAD z3=Z0oHpfB0w;RL?x_)}Z`J=^=%H6LOSV!IKgq_%mpPHM?h8cOTBQ^MDrO@gi{BFyk zjuC#xUpNCU5(k!|_HPy7KyWLc!Cr+JY%Kig7IYezm*#fUz6OOpSBm?vh5M1vx|@XR zx01>Aq^`3|qxV)&{){EEqXn9wdnM}dmg$$RY}B%ap+r!-xHq!LAo2W%9UNgBGXMgb zTrhCa^~QkZXzOdj$3y{4N6I8>V$efqr?2lTlSDI9avnF=LG8Ks@1BpaS^MJ>IrGlz z^E=*ROOx#CkRUFy>BD<`P*LV-XD8x%V|CYo;Dp{71^K+jBO>M9NlE0=zXj*2fn{t_ z%ydUoXWS{t_yQyHEuFyXG%(ci4u-~$iiIKTCDgZ;BTj@lz{H&oju_8v3fhx5Y=nO0T{;VTu0nciw^4yZ`kZQI*L@4o1rrAMfstG0k28`U~{eUj6M`uNT$G zQJP!Re251~RL%mC*vvEx^0QS)+%05d&m$bgZvRHC5X)#7zD6ZCh!B;5OuzRIR@ziQ z=y3Vxv2yE!lW~}qW{Wn0&m}m-Z&+AF`F2cI&K=v&Kky3r*K3Tj+umZ^o+8_Q8`v30 zoD2h^+c`%hK(Tsc(z+E2%UCVCmyRx54f>Abo6%zPT(m_rd zUXeK(Jr?d|Y2U&TW<+l2a)y)%YGMDqF_KGt&!6%4)BLBa@y$up6J*uzrgAL7v44v|D3_5#Cx*j$7(N9bJ4PD+ygsnpDF% z6XLa<@J!$Gs(mxlDG(_`ni{v%W7k=^hJw8MsHbYIj;Qvh@;z}=DVopZz}i+Y>B*o- z$4awbXu*w&GCtqh0%vRRtqKy!_%3N#?%ur`*^xh$+rz0zXU;cK*xZV`_&UUb)q(o# zYbl=2dcH(6H4e~bq-=zVn%=F(AnmLc&ME!slN6l}22{o7Q&s2ElQMud_#y88@Q)J{ z1Ur~(?5*QNOKs62V}6+^yI>&yV$gYkwmg&9Qm6u zi9_(tFfmcC(FTo!VU!I8S|ZBb1fMJxlz9bGDw3y-GiPyP_wP0?ErR)6A6vLxACpAe zFpuN=`+RQc&DMX6(;yd5G^7a|Wz7OS|9qp=!?=}LmjUP6(X~4G#)_=pfYbcYp_oN| z3J!rA?wLC^aQ)B48(wPsTdt}*vOPky;B3$a|L`-)$QC)nM9r4WFkS__*k$G08d$Zb z%}hIoXFpFJ_ptTX)A~nF|FM&Ly3OxIM%MzDom^@%Hir4SKR5Na-j|~#tiZ()!mhXP zex;|g)buPWe*yU7FuE|cc%bm+AV+zm|NaO*7@!@VG!U8HSTYIOOmz2p_&b3K z^gS;5g&+*$mSGzdPu@7A+=}iJ^itu=cXu=k@~Oi(Q35L_ug5kM<}~zSdH2eC{q2b! zCMq5Jr|vB8hQO564zK)J+Loylo`6943r&@nhfbB~*8#U_Q^How27( z9Q=j263uag631`&dq^(|Iq!z{DouMaIs&1$6OoJi0FnAD(&1t;pt_+vv6xcEAK;`& za@6fIY(t7N30B)V-bap0$IBOLthRP@P90T0m8vKvggo!6dpkZ^iUtiw+avge;H0~7 zzjaoqoru1g4OGB}F?st1+9*dT`tZvG1NN4X?uNRY^H!qe_<_em4_{s8YjQh`=*S7qlapXI zPc)OBEeRZns~SFEy9%><+C{xWfh=`t`8M-N2KC8sj<5nKr7S#rM)vddb)0rs}h6 z12s_4%`H}}u<33*rt8h2(e6F4`z^9*yI=R-+bB?i%f`pVI17l&ySqT#3zWr7=-c3w zgT{h`Rv1{Sxy1LNKvjhzj@ptJMkiV~PzTN$caKd0_r&5rAm&awmx%`09GF9bE#hDoHw_C)6sH+E(RYv zYY$-SC~4q-O@H2Qsu9mH@@^#N&)a0)b8j)7U32taD)*k)C=jFWSG9LTi59R-dJ)## zZp7)vLMf7OJm&NCkj%sbf`gU#w|PhoJ9eJmPg%>=qH~KeG09*BHmFjz#u$@)O)a(e z<}dl2N|*yOviJKOKLE^8LJQJcnu~A7Pq>>$$%u@6Q-}u<>)>`(koV&}B zs%N5sJ8m2c!O^L5D_N0zbEzzA$}>8Yu^LD6zrk+j{ese8BVZ{>%(!RxWm2+)1j*5TBP!yNcToZge##Y)uHiI=LlQGM*>K5GP zOx~^J6|o0dDbjv`_JWdGFh?jo7lh0plZ`Cp(i4p4nf*=?uf@tVFOg&Jj=Bs8+2J+Y6?crqs!C5;!-^|IpW>)?Kn~#fff0cXxG}lyC&nZh^XYz8m zwDT#b-qmKaYOb-V0MehXvnF6SnoG$-ZgM#rR3a9s?2Zf5UvU)HQJMpoToV$^o-aK>fCk+b3F{FEy8tUZ`X+U+@yI9x>K4<=Qnm!L;tl*awaZcj4v$7EJ^`X3NN- zY3;}GCI_dP0C9Kw!p@NvkDuL!N_+~(q(=!;ADkp&OS8@JUlm$At$O01DZT6 z&kihtw*Z66dm}aVl8#-Z=^onZE#72XKEIE9`u1d;x$x31EX5{!X`zFn@uc_9wM(mN zoPMQwzrCrg(ibyQMm;U)yJA=NRn83Ts)ROzS=z5a*fEbj8HUsXi4+iL`|!y!h%G8!B#J7AIv?RA(+Q~Al^)# zP>=(;3<`PyYUm!VHuhrx%5ynJX2jaO7e!&a?crEbykST0YfpNb@oXJD>-1vmS+Tlu z(=G3lfI&KpRc^k`$R9^1b<-$Ng}RK_)^uM6%;bR-OVrF&~P7u2+3fa zimj?vW<|GAh`UHiJ+!Z2=ivUV8v#=ErW=YS=qLekI~Et=M!92&dxzWx0u_n#@N&1^ zVsG69Kvs=qMytg!&dN0L((K^x+zi-glxy>_jGp73f+}*f$ zi$}M^K5KW`-_FdVd&ke#HkyVo3G<9f09WHrLVdjD=D^>*FxI>5QpQX;9B~WJaB+b9 zrBB#1Qloo*7JPs0hrX8&Wx} zWD<(SLlpixbK>$;NK?H4U+$o5eY@F^)JRFa62=uVQgE4#18Ok=+AOgD(GuUf9h3E+ zg{*c|!tL)()4W={zGVEP1`f`!j5pLg(@F7pXGF!uzQ!u_%?Zos--!N8%deFBFugb4MBfo1 z)a9=#C!x?ub$8A**emyW_4|(A{at!-f5$hg=OS#q2ZH~^7Ke8K8YfoPg*b#{aSC+6 zd)N&iu;AWOce+wAEK+Z_$Y#446aV*z2C`l)YiYw}r|)i5XD~g?)2>^@$6%!_df%MQ zu6w`~dqCi3hJFVb;0pTV2rT1OfNpNEeIaNXKM!<5j3Ap0l#J|a z`G6Z8r`yx36)wN_Jdi2_?bYcvmJ8M`yYL7$caco!^SK1_Y-sz6NOHu*goWMx1n(59 z^OPRt#AdHi6_o9oF@L}RTbDg%1~1iN@EV0g+M5X8ak859Jt*s1WVLS0TXxsF=|4ykL@U!~^3V@8 z`B8N2TkqH8t4H*0%pZG;Mr^N-yuM|CNA5|Rgw8$duN3S6z9QH8T$8uS`S%PT z&k3UGPirHJZWrwsASv0UV=XuUk>3hSX}<-|`IMKLGxHN@IdqS~nej#cN|F)~59Vr= z3RS4)x{E$vN<1Mkd-M*HOa?5i~)F!i`C|~P0tSq z9%2)ai0=C&e`fzgMe(Hy^=8tZgf*F_(Esbrd2!?k!MVh?teHR2rN&%hz2}b;vsl=? zrsVIO;k}DkdoLqr3-meY0Fj-}2ZS`v@L+*e#gbb;xM=(~Yp!sdAB(>G?d^VS`L*&g z%g2G(u+#UC3yV?v#H__jC3ZmOo^lImmTzeiz+gzcMU{$l^duqoWT-ONc{v)F)XKLhWN7Gs@zku269&!6^k< zDr@Dg)h^1Af|d@LVO~Nj*I*OiD+I~-H@pFfa(CA%k@@-Pa7GIsrL?>T?>9r>p4BUf zgu4*sw*5dZZwQVtukM@k%`y*vp3Mg6?cUAyOwz3#o3$Rx&{YyTzQ>U82W7^SyKRV| zX9~Gcgh^lYI+-%UcGKA%k-6@w{=5xWygl&Mg#aBiIEn%y;>cRY#`%O*_q;@Njt+Bm zOSxcF;VS}X=Z+$S%A_-YKpg7TqEPPF4_XC$lr-x_+2GoMrUw2~23dA?XLpMx6Hj5Q zlz6Ah?`C<(_DTAV7ONGuB8;?2uH7xh%0xAfVm{b9Eaft53B_A_dy_055Q=6|=gQ`@Ye`Bwbzd(JQ z!w5?5z;;tT`MedWJ9(^`uri-~d2H$`XZUT&%1EOBA7b^!SaF%}@V^&$UG;a?NY`CwN;uu!Gjk`f9dnUW-bLEGZ}Jzn`@1nYE!JJAzD_CVhDc}$V5nhjs8m6AWEGxh zk%y{IK3cI!l?B{-ve|(bc>$i-*1kGjo&eNZicuVM+Z`50w@5;R!K`dczE}Ba1s#jC zV%8F(Jd3S@aXF?xQiD?&R5Y&%7DV++NTM3BF!9R9hyY{OrqfT0oREUV`qi?IAiP5h zEem*4OuKMoyeLTgycsI~x3`}WF<5}N9J7_I=PfX4`Ei!l4uba$=Z_rw{x`;%u<7f< zfrOtrSzhg(eB8~ZyKGTEpcle#95eY8IIk_J#U@)yeO4;$P zZI(Xo&X%ulXa1<7|2&~j(IXO%KYuWc@J^y;62l>R?8^H_xP7$!hy#VxPsi_w`0%z- zbTGVmeM|gR&9<|xKVmhD6kg==cAMMC*}+v?1fpYWaO8$z8<$vS1zES7kLGKOI>Ea^*z%7Wgz;_@iVRL?rJlP2|ah24mC zc{X7H&BB@jTpD+kb8kVp&eHl^E{@;!>bkk+Yo zj#EDwC|DzW<8YwsRyUd;IQ)tgH$(Ki5Vr1yJ~b#fh_uTt-*+YS^}DjSpw+4I`o_*rx3yS2 zGlZ>s0`>xw07VKb8|)-Zz*$Zuz=YKj@p&t3zO(8AL`yhSALUnZs|iEya_+Mm8~J3J zLw5T_aH4|hy)X<1ig!3UXXEF?F_Py}d_R9dN~OF%2v0?gghGkcQkopp6D72@KMt4_ z9~6P)KggVatCsR8a*y>UtLjQNBoW0(uR`WvbuMiUxRoTbb*;u~d>6!i$QaG8oLt~A_iY>rEOe(Ve>=Qz!3_m30rCS5cyC-!c-r;k&5z$cl}^J zq&MVfMc9C17qbM$8`7tAhNKy$;ct%iJfS?|LzcqMV>he=s(XX7gSyp}F#b2{M;)c1 z*Q1*Xv1AU>A6VoIMM0{U+dyEJ=^+GdtpAc+D#^gkhe4D>qo-do=l?jz(}j6CqtFFp z_&(djA4=qVJpfohr@x$Dq=^17`Sz2&m@DCQ`Wm}-{!pBui4_l*8vBE{QR?`F2tgWe zXZ-&Ymm9*S$*k2llD#8juQ8;3hs{7GxX-!stJgB&>y3z<-s@#kjpaUd4#+#zPxp_xp9}tyz4Gy&FdUlk-wtAvIVE9+`A}<{o1X@eV*dRARHY z!ce&d{>wJ;SD<$6pl7Y>-7L@icfc+uj-RC1?k((F zq9|Jyp@HSv`ECigjFQK?n@Ko&Kr{WM&QGpIs%SztXn#Y)&I{TEbs^#%8K{iIYUTFA zLL7f4+d<}1D+ipyd|adC6E%x0`Yz(|@Be!V1Yymh9n{<7D+Q3aY(A?F#^oc(IM^OC zyC$^;>RC@%!Ahsk(5|Bu;;iaT&7+7ztSW%nyh1{J80btQYD1HEHTtj~>q9!wZhMzi zWQ6Vs=cxpR!mx{gUay>8FR2lug6T`W4;bditd!Pg=`n>SqpW2QAbIuIUq278mjVpq zx@b|qi)vw+A={^bKo|=W4-NF0OHs zQwY{w8tSMV;yY~a_R5gGy^7>LPngH)ew+iUFeYgJbY}8h#6!>YZt5zT5U1heYN=f@ZL6l zvdZn$D(cc@QjX$O(>w7Um?TOiNPRcH8zEOUJB8}fkwr!G-xE3UqlQ1|z4)`IW=Ey5 zRBxXm2rDh=jT4b+Xy5*lSpIfrWJvp7>B$m!xIn3EMR%kkFgPGK4rxj-7gA$VI&**` zd0*}lb4f#hzTqbt1Zns4OVjRw(E{*s`_mw~|INiO?d1q zu;8F5CAq-1TRGVMTFFAbatOa3-_kosZw?o88nw#&BGk#cskD9 zb*hof6)IL|G`S4H?iJ0K^PMs~v{6G5hZc=$M3Uk^>5XQ?rr6-eNgkbK%m89-rlk)V zMDh$L*rl6h`jhjv1l8a2m0G$e3T5sK=;d>vtB)S@JigLA7md`<5)G4_>Fvp5m1HXZ$Z`IdWDXaA!i4JvXsL@tdYIM}IBj`s{nVa&ybJch zEHz!H2=0`h`o+G|?#UnifGuR`?1WU;Q{uD^?RpwPKqcLm>Lek*Gr0%1%cd#q^NwsR zJ=hIzyfGXJi(aFoJwOa4c1Xe$`$&QKajRMh@5`&@wNQXr{o5?CQY#ZkzD#hl_bQEoZ-) z01{g2P@x0*@6{Eeg9A$Np4z^2CF~Tev}OBr`YlPPwX;_Zk=#kyTK76E_t4*Yuivvzaexkj#+gGgq3QWbbLRs;GBE>?_TH{`fIAGV^G zwz{f$K&e``VgWYY8xSxC8*px*rv>h3`1^Jr%9-=*(e*QLX!4`M2suw4g4Hvcaohh5 zAAnJLV1&qj_V`j_Pgi*!M+sYb#=Ux0PzMxAAgd~pEk1`uDEC~|FP+OoD(*Bz0;neC z&hiD~lA0VkRq>P;5syoH`4A+L-o>=jrtH3t4?mTy_nE++C29G@jyQn1GL+e!k7({g znLtj5;Xwm=ZI9m3RW-uQX!&Umc>*A!_N?Yi7vhDA;@y&_hM@ z_}7H;WR%4C#r7F) zn|_w&Sp1r~ppg$Tv?RD&4By=G|w?CG zH#f+0D}mKt#?aoW=;_SP>@51!l=hrArSjT5WF~4j!&-GI5p}*B8tHZBXQwrTRbGHH z+xLH>;x++7s<;=;fXcJb)%W{FOp!!lh}h>2;YbkPZf`0VtyD;5OSN%|nTmp6NiEA} zCF&}pdsUC6Nap(TTV`2mjImF@Pr8qwju_du@>2J4BzZDD)*B6~+}02VaE6EcOMC&Z|H019@!sT39lZW&8H`qm5=uxLI|cLIkrz znK-K^rExWe@#M+<^Sm&|oyr)iMncjWv`g&fB&%sSrRVGIHOB+<;(ZWWF$t z$50~`WgxUWW@OCXJ*u?pzF`g8VXL_mIzb=Ybw&RFnE8n+q>u1+MBNjg}gc31P@+ccBqe(u{b{iwbJdTd>8+dWq%Hsr!| zXGr7l@4nn6lh%Qd(^`~gn7l2^M;G}aXH9C4Po0QG`M=#Po?Tlfwgw& z^EEU;Wh2PH%Q*X8+i0_V6=1dpNVRpOe|c zFOJ#6&)n?c7xV04q1n&)?BN&2`av>yw1)!+!O9E)^ccaPP~mMwtdZyjuEkkcQ48D* zyRU3rG>>=NWYiVax};PA#4?`=B=NKP{5u#n4~lV265AJfKe zo|}5htg+;ux|Uc+=dLp1Q{g{Rj_DQuMQ-w9_9kb^!X8OLnG;4xvaL7^CwpSR$mPiD z1~G%-h~>PQnx!I|^F|39)5y4ZL1!@LQ^zV8&Zjn#%a)^q&;$H@NJ0`-z3OtZTkN=K z*V5DhHbx|0_K33X1BtT@c2Sl&6`MP$y={k{jyz)1)!tiqE~1CirzD(`4*|8jOY~EM zyuF+^>Ca3uU-_UBPmiE<%g5kW3KGU70@H8S`ngk@t&LKnKAhr z;S(2qbURW7Mg#dwJv0{g9*`UDR8=Oi3_@v-#@}-7>Rm^S4>P^#`%s5ixX?y3H`KGa zhcGQgPF9!sC=TM_Hj=z#SHKcLQ{Zlaic-T|4iKJm1`|N>6V61FB*t}^4=S4Dorb-U z_{8c~JfAnKpEK|Nr(#f#czm_u531ZH@UGF3Jg_jaYNVg5E=dXsVYDW=lBkq4RQna! z2(Cm}m==QyS7NK?cMTl>QCrk~+^OnD19G56N_nqv8&RVNsm1aK^%?D4elydO;US z0BHbwT>mT(`K$^f6z?0{WcFz8N^B%D;O`Ph!NJ$-fd>2gjn+rWG zR>yQt^++%C+dZ9*m2UIrmGp}$&37*xj`1er>|rcco31uuak^E7})i}8iFNt~XL!xT!(+fb}l#0bFdxw4ie_#>}(Xh^M)e@(r=((pT$q zuC}7m4CnPORrD7&uW7>HZ}`Sa4sH1~CU>of9x9Q}c%&R*z{RGohD(Lwa9BbDje(=v z&c?GV)2>YrVq&%tZRlQo&3<{q*&CI~6TzXcuLF;FV1hiUyF^%fnE&tiMZY;a13o?u zOqwP2uejM=k_GK<7CcKBm+M&XI?AKXNbCWtf3w%c5O0LM0|M+Sy7%2mmI8o~LwB*r zOhl@~6qe=^X05u|zlTVRO?Rnw=Q9tZKxpkpq^(2n9c($hemeJe9dXS^J)>DXfK@A8 zf0R2Ol__0JSKuP`i(;sspiocgPyx(#SwJteR^~vL*EOTQ+axvD*}v}ZMXN5f493#q zvi}vvs?bs$JRP0kjm|uVUI?J^5Hn^5;?2kAyN)>gtCcHTR0PNr!BD!jy61Ssc`ghp zmb-Q9vDW5pge5XPhkC-3TBMf7O-(a+G=%c`GqYqH4j@O5CMuY{a4_sq_I~eCDBPSX z-4@0SMt%=rr&9qX280x7>C3u_m||V8;cGN|9O5vPfC{fKU7E?RFq#H)hut}gwR%Om zaqqi~?{=z8j9qEko&&0Ep45HM@vdItyXUl`FGdmu_Z2>FUbx-yJ>${Btt-SL6q4Fpj;bYP@yIY6uI%{{!?5;4_U*kJ@?9hFo(3@&LD>F*gDBE6T z+Z_{9jXAxmoD~f+NaT46dYrV}F)9|-<1T!G{}ladba|?4b#m@CwwsoYYT%@P#z0~H zaA;@w;);FkI!s^JomOIw5K_rDZoL!Bz9hKQO}_}%R*l2FXZz2W0{`*~q~spE zJp>tE*F%lWm}7((^P9g%RmOMu@8tsHli4z|*}`9{ZCvyMyzAK2Uy5ajwCEdlm zDz{GNc)IJz%}q?sS-FwNasb&LA{=)V^oS}W6$Z1KW9;{deH3IqB%&nWMD{{ExDc1- z$AwoF(&Mm=&D-@~fy6Y=_r5Bn+d7g;^^5cP=MKlpdVAyKeMxPQOX~s!8YOSoI_;I} zip^@@c|mn++l6{@v5q#>*Y4=JIfotL1nxAoDkU@^;~?O+K;ci$B_7b|NMQp5DPEXZbY2-}UN9l48pSFY&R z&Td>)SEQT{vnU7d2gUfyDj{cK(L zfTzQmMZLkO{=!)wy_I<6ctdD6}VL0-adGGe(zn;2~z2QkQ2O8 zQy7End&0XN+}6QnZ73>VWG)RoHIQ>m_TTg%PYRi{C#u+59&^W`(puCOS$r+P(_E=% zj)esQs9bwh(tq2&i7~mR=)Vxe4BTU=1?gpT%$VbBDNk?LcW9~4 z8W_^JJp@tNz07oB#~SY0ox)Baz%(uz%_&E@G@b zAq+en50lny5kv0F_@T!dqc(Lp0*u%36~@%?;Tk-{IMZC@+e%<~*cx22Gb|BTb`es! zz13Us88V{yc`*I=Xfqh5SW{Vd@+VegvSdRqCJB=ufW?y?!%Zp^YdtzbHnNWK#5H;oI?`oj#XL>=w40yUGg`z+ll@ z&rI*s#BPWEz)&_xu*Xc3)~Kqbv_!1;z8 zUJJa|WWH@z?M$!-_K$$Hh3S+H6M)$+XUHzuc3Db;-IMp83S3tOF|59flwbvs0S$ja$t!D)%|*f+c7s@#6#{RrG6fX`a6y+eFKxWDT#%wD>TqcxXj z*S)|3vB91YbJ^$gsCLr(p7hPwyW2`U(b;^Fq}?vc`w$i8q>dZw^{3R&>C7%ryK7gw zpY9yxn^)fKt2Kl5SX)k1IiE^;`=-xMV|b_aRF7aW*d5^SkgNB7Q9QaeQm@^H@(`x> zw6QCXz>wYkUHEU#0Q7nEie2VT+=l8t?=x)sAxb2Wva51e>!_FQ`AlbJiXE7TK(Wg6 zGnTkfY!6wK)twUX^;Od zD`*I<)*;0I(@hK!n|bD=?=aDgtTQLYDHlQ_69Q>xf~o%$>{qbNnr){DeCfi;EY9O} z*ysJUzaZOkd}8c_!QUyXRiLv1llArQr#R-aXD&{U=N)zjzX2Dnky}W>exZkXiOd@K zmZ+s3Ca2cYm)sijrC%e(53=DoG6PG0Q0?;i&7CQEC(dXJ_9?yidPs(7f6Lhuz73{! zT~bzs?;2G6rxDaa&nXTHz-*VL@q(YG85wU@P`rAL9>r;RuH^+UNrjT0)KA z3&2l~S<;qutS@s!H^U|Vu$GJ&kCj|X$v!$??(n6ls%19@kl|R0QyhF0ddP$;lWx2otKbrnl9it`=UrR4F>cF$$rLvlJ# zziwa*WjJdK-xp+}=;@e~siC_aM)HrIT@f~NKtlxNiV__yh8@7#VkHydIMoK-90N5lR%0^{TG*HH8E+Vghx$WK^v>p%8NwL_#1|I2qw5j*(8cOX_ai-$jZtO#*Xm?sAFPIt{yl6XvOa3F+h(A zGNLj@33kM%RACSxLwFjvC@cY{;NuuzVK_s0ClF61{d{@I={5fB#BaleE#>gH%9ON? zyAACsU#0gt_|@ipEYn+NwyLl5#C$1Z9|81MKqKa+yp53)UQb-TJiXO0K9GJU@<*F> z7*RP-$)-a;7j)gml0f4@gQSsE1w%#EU}yGzoC(YKK4ZeJL~%`bFLwXwU71$sqB5&9 z+aS97eqlEL_otpS6BMyt=XVtn;ewm^=6D;(e4v-vvwh>=AB8sRu6*%~;iNd@q7^e15RNO(u4ei*a9C-gUPD1kM1ad~I zhp;tud(ICt{}|y179DREl@{iW1O#UvF;cSuL{MU@xEgEf4#V1n{*;_Q={*vyV3VBc z{Y3`F_SQ|#M491K3NyDRvIBOHAR|JnxEFeazqaYp+qm_X9?NY23FI_|E%#x4>if(vv^YhinGy+Z@ zuc?gddXaPf(@n$0z{8?v_UE3hr>2TN%G+BgI>)A>hm#A&v4ykKk-ZC9R+H1B!e}rk zd58b1RkI_T&(C}jlsv}cGEcx&aIDsspGetOS84eOawf;g9?Jbo6Wab@#~@0tEAtUM zEM}y>y*e?zZg)kQJ(ZEwvX`RbD36$QQedZqulCk~b|;W9bdrwRB)WmZxvA28tKiwO z`u$<>>cx&Trp z_cO%9Xk!wY8aJdSpSQZ;@ziL_oz(^Hch!`(}kpCMdzm}k{-Jvsbk54FT^=u{(P1$1yT+da*Zm)3(wBQ@p!JJr?@yUqY<& z?Yq#AB%TjDDt@i3d()(vd0oaItn9xHZi%LT!K-BZ(iEWaRyG>{wN-z0{;%TCzz&96 z%HEf{=0J`f{nKuTB_Hi0qrR=u{DRE>2o_{M%Q_jqO&(T$L0CvRG8L7-*KLGZ!WI$E zNBvY^({!<}8e2|cUr9>5ljy-MC!T0ak0xWZf3zxG$bXx-ME~AD2|-N^c5%?HSD5pidBFLiUh4%MMtoA`{iGJ#q*@! z+!1bxdVjcMkaH!2J~wm^CQ`)Bons=|691xbHl#Y29}xLKiHazg_KKwVew zbW^zp5?j5;V|$$n%8>?WKCxA|;_2R3CwS=g5o=`gknFV=AcQ>eVnRDq8IfICUNdgG zOhZqLE(QL7zw9!^b*hWE4?k_A@(Xst<|^)+1$KH5Db{FHanbb(rX@AM5A#`}AmH;ItYLDjth=FN8GK6X`HMb^< zY|jR3HqOq8CqZ?^l|rUMpI(|2O96q7Q+(`vYYl?QJG^R~{`VfKS&-qAF09F;=;cD7 zujjydG#oRVDn?^}jC)(q+6*YW8(H^28A#psYI2-yQ{c=%HpH6yWytX)1vzHIIYT-e z#}2jXY-If<_I%9t2l=!#^|Co&Db?u;Zt?)4{3+TYBH+}|O*7zU4tr6kGVL>5C*S2f zW`N07NxrwPJe&PtG_8vM-pj3yEw7?`zYRXqyz*t9Ozxr$|Lk`zzg%N)c_(L$MGTE< zKPx+f%sF=GTbi*h;>2M@*HKqjjb3NzUx9icTK5EwH3%H$g{b+QYrOh%_5ROByoBG! zgY`7e|6ft{(+b0Yq#ZUk^sk@+_A<6QUO2CYn0DN!_VQaHv$(tA zHFPKJt{U_-J;eg{ZxV8T^TYMc*S-4wkRHf>^f%hd<3!qVW^_2w_Cy*Bc){aK;sorM zL_hdaL)#eXthh`4@JtBrs3eC5qr4%(B`!)IW~zE&SnYox=R{c=lX&EtTa208v!c_S ziLPJA?_RVWdz9cy<~)hou@PKOtucyrk_w|9f@$KZF5$d&W();4T$v7h&YjV0q{;jL z#(JZ(V@KSRXSh;?JB75N9@8XunP#KnR z7L<4Qz56?!C~4cBPF~r6u4w5i_@^cQPp2o#_gP+QDuz9xX-V$)Sl(F&zR%Vq z>UW2p=bUmu%>R`&?j;cj)`p_}<%??OF7s1r!1qZ^AT$W%ExSh7A_;CTbsTvSE;6Z& z$gQd)%vi;>{p5Ba7^eK#(R-vk41BM&SHGsnx$j7kzvZMI4LC(ne*7I+g(N;VwblQ| zfFH&iYu~$@JMQ9WuiFxJCx1kJ`t`;>$o4`#-Vu}^#Oxgn1wtQzi1Z|47Wgp4YP6F% zf7(?%!O_oN=|Z_w_nn3J_|92i_niT{FXXoGYa3Vetn$OqqJKUmM!lb4I=@pKlZe`h zo4BY*{Mk3K^5o>@{x;#X8Qft$GJ(yScC)3X#@vY}H(epF9QlaA4*f+~{8_O6uMxgZ zieYp45CP~m;|l{o^9->r00?Va>;ZT=j=_}BxSAA0S4}VxfUuPYfF}UOM>ptu$#VlsDoIy@RO9tDOM0+5CptuuA2EgP%`NSeT`O=mKN|C zsfZnIZRl=$^phE`lH{;v)V}QPRGtqrZB?w%RbQlt6L`mdgDd`Jnt5L+SeVou}VNuQ@?8YCiC=f{ADns9QL79ZwYK1Z`;&U*EkM>DVBE);D{F;V zbHH%Bqp#d6#Oecq=L#y7M}Vv)C@-4pN&YJ!6d0iy^By$^=XS;~ZHF&itm>Ixl2j9L z3t~P3AY~k(8(rm|&|ak`7jOyB99gL70JcE>!|*e#$O+Nv7>sHVDi?y$@<3JBo1Vu1 zdMtGX)3m598LiHNgLRgm*(#Gz8c(B-2BBa#+yr*d2C&;TfZa)*d7W(4c@t?| zYTTF7;_(i?XjIn~)Qz#JyK|ONv^Pk69B6FX{(J0i%58Ep{{ey28 zVG47b4t$3lZfY&RMK<3YJEEp?t6tt1B5GH_9Kd&N+42n^y0J1oK0M!{!epK+sAj}4 zBv!SHuW?Eu(@!?*QNEtZOovusq%$edp3upE%E;tb^&W zU5n!IC+S{QYGI8%8par~hTWU(FU?GJK??tI76f!8Vx5NRc>|j7stk)auhki~omc2z z+kYDmh_oLX3r*s~pfnGZ|C|kYy%M|gfv+1yRarKXqAT(w`0BLSV%2W|kG=#t9motY zYRuz7jd`3b+VX+AdEHhu++ohRP`69U{MY1$`4qKc4-TQEkiLepG;2qNRsW(OBu@6b zgL7SMm`sZYF}WW&!}=dG*#Ggo^NH`yr*$@YI@kOk#h{UuwpqI^o0Xa-YiUp5^hzEJ=Q zRQ~ubKsnqk7tcM&3iM+HIaga{1+>pu{*@jMvoPS5M)x@BMiFYEad6xFCo`E;v#R~n zjpZ6L;-a=#AM=W(md0NY@_y~Fm_@$d7ii@F=3iFsWCsx6|DfDgUHHFy5CFsUUv6v} zcx?Jh9?%QR`D*v&g{isX^JW!k6?qv`pm@zV+DE<(e?^ARj zW~m3l<0?7i?M3%jMT0e4N+)AV;g|(A=hBx_+3BWY?5rDHj1Zk(QWa?YHxR)PFg3Qs z!c-W+S|<9&ZS7yw<(1}a44UnwZbE~de@%)fcDJ+JQ&BVDBA*k+O^lc)2DSD@mzQsF z^8OmUenJS)De!L)%FpEeOExnl(0|I)HHO3UdfYLr$mU?`iaY!7MF(XLp?$X zkroh`65OP*u!NVWK{jhlK69E{UbIIv_&t#;fMt7^f2+1dZEBacu!ROm(vHyT{xn0T zH4aEw*(4_d?H11+(?%VKuW+OwQnKiHsdQ=LQl#>!JJR$*_Q00gM8LG7L3p8<_icUoYf8wNYeE|Fz#0?`VUCbB&~atv{i_Om z1u@K~YMR!lnqg{#V^m68CP&g=3-s@xemC{!Z0Dir_GH%Z=IW3K%Nh}NPXab^7T|96?C)}Tw6RffK;N^)#b10v#jCRt1!9hYIO_-r6jyv?!UxJJLGyX%7odqG0-bQA>a=1U*STJwYBFHN^vn`~5VP@$|To-6B) zqQJR*PNjO8Fb51qYOhUHcVzhI+RNWvvDVH6^YkC~z#rD>r>E~Ts06p1dwzNeQqFMV z;pzTDUD!6yJ$+kI>FDk&FQ=@<KI>!pmESEFuuvorAIxY%gIGim3sb*6c`K(p8*+LQ zVn_F@?8*Bk`^6jCjC6Lc-jFT`eaq@0HyY>8rS zdp`cV!v7wg2dk(pn}Rg{8E=_E#v9#=KkW8C2TPkoaP=t3g-Q~%z1qjb!f~0j6IR`J zAgJ^po5=BT1v#%SxvO}267T@Zj^x?fCreN8sq>*fpu)O$yUPCb!_Q~xmSF3lC*zd9%kD}6pCAiRxs#hLz=WRf)pf$HO2<-Ga; z{a0Cee+3Rk@Wa%%zXR8qV4qd^PoS*?+p2E<2{a%mp%%XZZZ86VsmK374>A2}cEHZ&l&#jB#`ut9 zqcW!o4ab1w4`T@q@^pw}ES2JN%mC@b@f$SHD|6EqJW3LacH<5w8$` zf1yU`dEw^@s-G12u9H9PS%28ceSX$`KDn*Wx~(TmJZp(3{G~4FPhLAy4sVUCX_VBIFd+V_LcCgiEMv{3Evt(5 zX={4C|FpZA80~%9#Y76{&Ynoy-TQAWDX;}}l~g>X>~Nm$_fdc({hA?lKt7$O?jHmC z9jpqLcg^(ulyO7NL!mnpK{GxZELBqcvV`6@L3JESJ3e{uMtX+@2Psg*jBl7oV{j|ra+juNphh&>m3|Vpw zdHV^>vB{KjkEmpL3%?oIC&0~L45pB7nBuHcfP)kREF**Ut& zFDH~6|4=fa;lvM2XpEh);8*}rOO&qu(<&;w132or;L_QK(v!} zj;j$@h00w!&Ec!EJAoJ9lXOEKC|by1jI=x#Bn$0^9yFQNVI~}dFVS>P*ac4hV?9i0 z!J(Q@P!h`q6N!YA0IjU;U@J?TgtnCke;x23Ve}jXI9^d3*xSzj<%G&ZRae z>!TD$s7scmOn?1IOvbq{TO8bMP!evIrP&5FULxI+nhhgX;j2!}g-pYNmZ-Y<4`p_|p_ z!!4~(gXw`7VUU%nPzM;#bVg~$$+njzGzK?@{S5l?Vn{5Q0xKp}r++2#%RjpPURQv` zho%7GlFtJbblogBtz0tqG7I;ZIivL+z{hCiqJ$}hiyqibkdUq#(2%HZX9=t4@34|M z)mf$G*nqwE6zCPd)!inTsppgGoQe5XYSKNDWHuof?Oy8#;_J@%R9f=sik7D})(K+P z?zF=C=&Ad&MY3@F^v@d+qeEBXAVaEpqYW*nk9<-SAog)Xr5dPG7I5R{e8yfK?7z`d zVf9~ggR3LcQL$B4sw>*<_JTQtF8#>%?Iw1Y4x~(~y!%{hD*HYgZZY;^^6;)%82frl zgrjZ8l-grk!hDIbpN)?37r#h^BP}v7(bT~AO-dJ}E(ouc(QH7*nV3hWoC&_o z#5wcimF>MHd9MCpCO63%Mst)A8naD0z&{+uZ`y(3-dK>+LIYN5`+TIb`kmd>1}8`V z$LJ{wNT3=2IN_=%p4TN|fDxG+sBT%UOd6=Y?vnkdvn#Xk2L>ad!7gh8-z_3|KGdl9Q6>+Gfn}WG zFb|58vZd^E9gBMG4BQ+f!*?3}<|7?75mu`g~he*?;LwqaG+-u~j`&5k+ zp@eC3qyO*Kia*(+VuoCLsR{=|*W|_dq(wVLwG-ZfkY*xCk19Gut+vyGwbdf-LAFK; zCwD8O;2$8yLod*8GWq>GV0A+ZRdum8B7cpdoP3P-Ttb%7S)Ap)#(7t%Bl zVr{9$u&C?FyV*e!g-0Qa9JcLCbX5ZZ*MGp=rlP)FFMJSko)XY{QDV@F$swLP-c`6X zgU8_`W`NEOw}hT*^QavMh^f=kb>Wat`r%8|$H*Og!J?@fp$1x&6-Pj{G8|1#~^dfWH3!-*=|E7Ld zyXS1s3MD*Re~Zs%W+l{l@1mJ1d?v?rby14qCAQgbTkNy&@f1x0%w+NK1gnI6io*(& zKDDF#L#cMzXjWK4-2&YJ7wvZ6K^iM5c3X$U{~dH*+Z5r!F3qHb;X`<0F8Wsq*1vlSqdgCqTKDjEupAH~_CJfX^WxK{DzOGO;%0<1=tBm?!8Azf7NnI=A+yS@y*q_O9X>`RX zx&`I%Si33}TEV68SP+MLd|EL6!sT{b5X945{bOJF@y{AD{RkW^pGQ1#?M?g_T`e@c zW3St6f#+1Y;THJqrqEEz){|-0=A~V?&;nl1JxuhWdtT?}Pi*6aH=~CaYA-FlZWaT) zV|4GW=%oJJKa&~`62gYP!NESVv*#bjGVLG1kFtyE*}~$S#TBcdApUwkQRJmALYH{E zl@|Pd7p{b+)*?8GfU&NF)lB0U+qg@L0X9`Z#$dmWPCXe`MBYpOCGh$M-L$v@UU%jN zw5K56q13A+=|}o{-G!5Cv1ukK-ObwShk7+7%b=HtBzBwU&Cj`Sngpriiw`cz@=H^g zG1%5nSF$^cS_%lajF1O*`E`rGZ}bcHD&`bm{cIW!jVhnkwLp~aYFDfl@axo|{!Z{Y z_MzsNZw`L{W$$R0@eR9RPhgO&NHNZTw6%e*uog!dfe5G3?l2a%ZN`#Sf7`%?s9lu4 zZoET{k(Y|E{oJCA&Kyo98j>U<>adE3ZF-+&R3Eff;iPWeC`ovF9eXt#5|DD;l(b8` ziYOl4448_u_+LtUIvjd5Xo;s~WR9@+vj5xm$xDEA5?5w0OqJatq=>^hSZ%dBtcUkY z=M9^oRcv)|?~|Eps1-%@i)=A`=6j_;tN%ziDGQa$Y#I*+Eyk{yo%ne+M{fke^;wX- z9yFq|AvLGz@eW~nQgI)4JlcX{G!qr0hc~K^+-rQe{+y1)iS3DO9JY8ezv4@Ev@G*3 zZ>;~nWT3&Qn=N~XC?i9aqUFmi{l=lMxZ$nmn6gC35FY%X6mF*)~ z^r`nDQ8NfMHPa<+BWaOg|U-0c2(?i7g`kBs;r}eW6@5oO?;dQ8W0Tkdstuo^5yWkzVTHFx8)$ zB8Q;cs9PA$LP#?}Y4&&n.slice(0,4)==="data"&&Ei.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(ft,Ti);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!ft.test(o)){let l=o.replace(Ci,Ai);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=jn}return new i(r,t)}function Ai(e){return"-"+e.toLowerCase()}function Ti(e){return e.charAt(1).toUpperCase()}const vi=Zt([er,bi,rr,ir,lr],"html"),Hn=Zt([er,wi,rr,ir,lr],"svg");function Pi(e){return e.join(" ").trim()}var Pe={},pn,ht;function zi(){if(ht)return pn;ht=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,a=/^\s+|\s+$/g,s=` -`,u="/",f="*",c="",p="comment",h="declaration";pn=function(w,E){if(typeof w!="string")throw new TypeError("First argument must be a string");if(!w)return[];E=E||{};var y=1,I=1;function C(z){var T=z.match(t);T&&(y+=T.length);var L=z.lastIndexOf(s);I=~L?z.length-L:I+z.length}function R(){var z={line:y,column:I};return function(T){return T.position=new _(z),U(),T}}function _(z){this.start=z,this.end={line:y,column:I},this.source=E.source}_.prototype.content=w;function b(z){var T=new Error(E.source+":"+y+":"+I+": "+z);if(T.reason=z,T.filename=E.source,T.line=y,T.column=I,T.source=w,!E.silent)throw T}function M(z){var T=z.exec(w);if(T){var L=T[0];return C(L),w=w.slice(L.length),T}}function U(){M(n)}function H(z){var T;for(z=z||[];T=k();)T!==!1&&z.push(T);return z}function k(){var z=R();if(!(u!=w.charAt(0)||f!=w.charAt(1))){for(var T=2;c!=w.charAt(T)&&(f!=w.charAt(T)||u!=w.charAt(T+1));)++T;if(T+=2,c===w.charAt(T-1))return b("End of comment missing");var L=w.slice(2,T-2);return I+=2,C(L),w=w.slice(T),I+=2,z({type:p,comment:L})}}function v(){var z=R(),T=M(r);if(T){if(k(),!M(i))return b("property missing ':'");var L=M(o),Y=z({type:h,property:d(T[0].replace(e,c)),value:L?d(L[0].replace(e,c)):c});return M(l),Y}}function P(){var z=[];H(z);for(var T;T=v();)T!==!1&&(z.push(T),H(z));return z}return U(),P()};function d(w){return w?w.replace(a,c):c}return pn}var pt;function Di(){if(pt)return Pe;pt=1;var e=Pe&&Pe.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Pe,"__esModule",{value:!0}),Pe.default=n;const t=e(zi());function n(r,i){let o=null;if(!r||typeof r!="string")return o;const l=(0,t.default)(r),a=typeof i=="function";return l.forEach(s=>{if(s.type!=="declaration")return;const{property:u,value:f}=s;a?i(u,f,s):f&&(o=o||{},o[u]=f)}),o}return Pe}var Be={},mt;function Li(){if(mt)return Be;mt=1,Object.defineProperty(Be,"__esModule",{value:!0}),Be.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,t=/-([a-z])/g,n=/^[^-]+$/,r=/^-(webkit|moz|ms|o|khtml)-/,i=/^-(ms)-/,o=function(u){return!u||n.test(u)||e.test(u)},l=function(u,f){return f.toUpperCase()},a=function(u,f){return"".concat(f,"-")},s=function(u,f){return f===void 0&&(f={}),o(u)?u:(u=u.toLowerCase(),f.reactCompat?u=u.replace(i,a):u=u.replace(r,a),u.replace(t,l))};return Be.camelCase=s,Be}var je,gt;function Fi(){if(gt)return je;gt=1;var e=je&&je.__importDefault||function(i){return i&&i.__esModule?i:{default:i}},t=e(Di()),n=Li();function r(i,o){var l={};return!i||typeof i!="string"||(0,t.default)(i,function(a,s){a&&s&&(l[(0,n.camelCase)(a,o)]=s)}),l}return r.default=r,je=r,je}var Ri=Fi();const _i=Kt(Ri),or=ar("end"),Un=ar("start");function ar(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function Oi(e){const t=Un(e),n=or(e);if(t&&n)return{start:t,end:n}}function qe(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?dt(e.position):"start"in e||"end"in e?dt(e):"line"in e||"column"in e?Ln(e):""}function Ln(e){return kt(e&&e.line)+":"+kt(e&&e.column)}function dt(e){return Ln(e&&e.start)+"-"+Ln(e&&e.end)}function kt(e){return e&&typeof e=="number"?e:1}class J extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let i="",o={},l=!1;if(n&&("line"in n&&"column"in n?o={place:n}:"start"in n&&"end"in n?o={place:n}:"type"in n?o={ancestors:[n],place:n.position}:o={...n}),typeof t=="string"?i=t:!o.cause&&t&&(l=!0,i=t.message,o.cause=t),!o.ruleId&&!o.source&&typeof r=="string"){const s=r.indexOf(":");s===-1?o.ruleId=r:(o.source=r.slice(0,s),o.ruleId=r.slice(s+1))}if(!o.place&&o.ancestors&&o.ancestors){const s=o.ancestors[o.ancestors.length-1];s&&(o.place=s.position)}const a=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=a?a.column:void 0,this.fatal=void 0,this.file="",this.message=i,this.line=a?a.line:void 0,this.name=qe(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=l&&o.cause&&typeof o.cause.stack=="string"?o.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}J.prototype.file="";J.prototype.name="";J.prototype.reason="";J.prototype.message="";J.prototype.stack="";J.prototype.column=void 0;J.prototype.line=void 0;J.prototype.ancestors=void 0;J.prototype.cause=void 0;J.prototype.fatal=void 0;J.prototype.place=void 0;J.prototype.ruleId=void 0;J.prototype.source=void 0;const qn={}.hasOwnProperty,Mi=new Map,Ni=/[A-Z]/g,Bi=new Set(["table","tbody","thead","tfoot","tr"]),ji=new Set(["td","th"]),ur="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function Hi(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=Qi(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=Xi(n,t.jsx,t.jsxs)}const i={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?Hn:vi,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},o=sr(i,e,void 0);return o&&typeof o!="string"?o:i.create(e,i.Fragment,{children:o||void 0},void 0)}function sr(e,t,n){if(t.type==="element")return Ui(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return qi(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return $i(e,t,n);if(t.type==="mdxjsEsm")return Vi(e,t);if(t.type==="root")return Wi(e,t,n);if(t.type==="text")return Yi(e,t)}function Ui(e,t,n){const r=e.schema;let i=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(i=Hn,e.schema=i),e.ancestors.push(t);const o=fr(e,t.tagName,!1),l=Gi(e,t);let a=$n(e,t);return Bi.has(t.tagName)&&(a=a.filter(function(s){return typeof s=="string"?!yi(s):!0})),cr(e,l,o,t),Vn(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function qi(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return se(r.type==="ExpressionStatement"),e.evaluater.evaluateExpression(r.expression)}We(e,t.position)}function Vi(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);We(e,t.position)}function $i(e,t,n){const r=e.schema;let i=r;t.name==="svg"&&r.space==="html"&&(i=Hn,e.schema=i),e.ancestors.push(t);const o=t.name===null?e.Fragment:fr(e,t.name,!0),l=Ji(e,t),a=$n(e,t);return cr(e,l,o,t),Vn(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function Wi(e,t,n){const r={};return Vn(r,$n(e,t)),e.create(t,e.Fragment,r,n)}function Yi(e,t){return t.value}function cr(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function Vn(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function Xi(e,t,n){return r;function r(i,o,l,a){const u=Array.isArray(l.children)?n:t;return a?u(o,l,a):u(o,l)}}function Qi(e,t){return n;function n(r,i,o,l){const a=Array.isArray(o.children),s=Un(r);return t(i,o,l,a,{columnNumber:s?s.column-1:void 0,fileName:e,lineNumber:s?s.line:void 0},void 0)}}function Gi(e,t){const n={};let r,i;for(i in t.properties)if(i!=="children"&&qn.call(t.properties,i)){const o=Ki(e,i,t.properties[i]);if(o){const[l,a]=o;e.tableCellAlignToStyle&&l==="align"&&typeof a=="string"&&ji.has(t.tagName)?r=a:n[l]=a}}if(r){const o=n.style||(n.style={});o[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function Ji(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const o=r.data.estree.body[0];se(o.type==="ExpressionStatement");const l=o.expression;se(l.type==="ObjectExpression");const a=l.properties[0];se(a.type==="SpreadElement"),Object.assign(n,e.evaluater.evaluateExpression(a.argument))}else We(e,t.position);else{const i=r.name;let o;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const a=r.value.data.estree.body[0];se(a.type==="ExpressionStatement"),o=e.evaluater.evaluateExpression(a.expression)}else We(e,t.position);else o=r.value===null?!0:r.value;n[i]=o}return n}function $n(e,t){const n=[];let r=-1;const i=e.passKeys?new Map:Mi;for(;++ri?0:i+t:t=t>i?i:t,n=n>0?n:0,r.length<1e4)l=Array.from(r),l.unshift(t,n),e.splice(...l);else for(n&&e.splice(t,n);o0?(re(e,e.length,0,t),e):t}const bt={}.hasOwnProperty;function pr(e){const t={};let n=-1;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}function ce(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const K=be(/[A-Za-z]/),G=be(/[\dA-Za-z]/),al=be(/[#-'*+\--9=?A-Z^-~]/);function rn(e){return e!==null&&(e<32||e===127)}const Fn=be(/\d/),ul=be(/[\dA-Fa-f]/),sl=be(/[!-/:-@[-`{-~]/);function D(e){return e!==null&&e<-2}function V(e){return e!==null&&(e<0||e===32)}function N(e){return e===-2||e===-1||e===32}const un=be(new RegExp("\\p{P}|\\p{S}","u")),Ee=be(/\s/);function be(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function _e(e){const t=[];let n=-1,r=0,i=0;for(;++n55295&&o<57344){const a=e.charCodeAt(n+1);o<56320&&a>56319&&a<57344?(l=String.fromCharCode(o,a),i=1):l="�"}else l=String.fromCharCode(o);l&&(t.push(e.slice(r,n),encodeURIComponent(l)),r=n+i+1,l=""),i&&(n+=i,i=0)}return t.join("")+e.slice(r)}function j(e,t,n,r){const i=r?r-1:Number.POSITIVE_INFINITY;let o=0;return l;function l(s){return N(s)?(e.enter(n),a(s)):t(s)}function a(s){return N(s)&&o++l))return;const M=t.events.length;let U=M,H,k;for(;U--;)if(t.events[U][0]==="exit"&&t.events[U][1].type==="chunkFlow"){if(H){k=t.events[U][1].end;break}H=!0}for(y(r),b=M;bC;){const _=n[R];t.containerState=_[1],_[0].exit.call(t,e)}n.length=C}function I(){i.write([null]),o=void 0,i=void 0,t.containerState._closeFlow=void 0}}function ml(e,t,n){return j(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Fe(e){if(e===null||V(e)||Ee(e))return 1;if(un(e))return 2}function sn(e,t,n){const r=[];let i=-1;for(;++i1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const c={...e[r][1].end},p={...e[n][1].start};St(c,-s),St(p,s),l={type:s>1?"strongSequence":"emphasisSequence",start:c,end:{...e[r][1].end}},a={type:s>1?"strongSequence":"emphasisSequence",start:{...e[n][1].start},end:p},o={type:s>1?"strongText":"emphasisText",start:{...e[r][1].end},end:{...e[n][1].start}},i={type:s>1?"strong":"emphasis",start:{...l.start},end:{...a.end}},e[r][1].end={...l.start},e[n][1].start={...a.end},u=[],e[r][1].end.offset-e[r][1].start.offset&&(u=ie(u,[["enter",e[r][1],t],["exit",e[r][1],t]])),u=ie(u,[["enter",i,t],["enter",l,t],["exit",l,t],["enter",o,t]]),u=ie(u,sn(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),u=ie(u,[["exit",o,t],["enter",a,t],["exit",a,t],["exit",i,t]]),e[n][1].end.offset-e[n][1].start.offset?(f=2,u=ie(u,[["enter",e[n][1],t],["exit",e[n][1],t]])):f=0,re(e,r-1,n-r+3,u),n=r+u.length-f-2;break}}for(n=-1;++n0&&N(b)?j(e,I,"linePrefix",o+1)(b):I(b)}function I(b){return b===null||D(b)?e.check(Ct,w,R)(b):(e.enter("codeFlowValue"),C(b))}function C(b){return b===null||D(b)?(e.exit("codeFlowValue"),I(b)):(e.consume(b),C)}function R(b){return e.exit("codeFenced"),t(b)}function _(b,M,U){let H=0;return k;function k(L){return b.enter("lineEnding"),b.consume(L),b.exit("lineEnding"),v}function v(L){return b.enter("codeFencedFence"),N(L)?j(b,P,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(L):P(L)}function P(L){return L===a?(b.enter("codeFencedFenceSequence"),z(L)):U(L)}function z(L){return L===a?(H++,b.consume(L),z):H>=l?(b.exit("codeFencedFenceSequence"),N(L)?j(b,T,"whitespace")(L):T(L)):U(L)}function T(L){return L===null||D(L)?(b.exit("codeFencedFence"),M(L)):U(L)}}}function Al(e,t,n){const r=this;return i;function i(l){return l===null?n(l):(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}const gn={name:"codeIndented",tokenize:vl},Tl={partial:!0,tokenize:Pl};function vl(e,t,n){const r=this;return i;function i(u){return e.enter("codeIndented"),j(e,o,"linePrefix",5)(u)}function o(u){const f=r.events[r.events.length-1];return f&&f[1].type==="linePrefix"&&f[2].sliceSerialize(f[1],!0).length>=4?l(u):n(u)}function l(u){return u===null?s(u):D(u)?e.attempt(Tl,l,s)(u):(e.enter("codeFlowValue"),a(u))}function a(u){return u===null||D(u)?(e.exit("codeFlowValue"),l(u)):(e.consume(u),a)}function s(u){return e.exit("codeIndented"),t(u)}}function Pl(e,t,n){const r=this;return i;function i(l){return r.parser.lazy[r.now().line]?n(l):D(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),i):j(e,o,"linePrefix",5)(l)}function o(l){const a=r.events[r.events.length-1];return a&&a[1].type==="linePrefix"&&a[2].sliceSerialize(a[1],!0).length>=4?t(l):D(l)?i(l):n(l)}}const zl={name:"codeText",previous:Ll,resolve:Dl,tokenize:Fl};function Dl(e){let t=e.length-4,n=3,r,i;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const i=n||0;this.setCursor(Math.trunc(t));const o=this.right.splice(this.right.length-i,Number.POSITIVE_INFINITY);return r&&He(this.left,r),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),He(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),He(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(l):e.interrupt(r.parser.constructs.flow,n,t)(l)}}function xr(e,t,n,r,i,o,l,a,s){const u=s||Number.POSITIVE_INFINITY;let f=0;return c;function c(y){return y===60?(e.enter(r),e.enter(i),e.enter(o),e.consume(y),e.exit(o),p):y===null||y===32||y===41||rn(y)?n(y):(e.enter(r),e.enter(l),e.enter(a),e.enter("chunkString",{contentType:"string"}),w(y))}function p(y){return y===62?(e.enter(o),e.consume(y),e.exit(o),e.exit(i),e.exit(r),t):(e.enter(a),e.enter("chunkString",{contentType:"string"}),h(y))}function h(y){return y===62?(e.exit("chunkString"),e.exit(a),p(y)):y===null||y===60||D(y)?n(y):(e.consume(y),y===92?d:h)}function d(y){return y===60||y===62||y===92?(e.consume(y),h):h(y)}function w(y){return!f&&(y===null||y===41||V(y))?(e.exit("chunkString"),e.exit(a),e.exit(l),e.exit(r),t(y)):f999||h===null||h===91||h===93&&!s||h===94&&!a&&"_hiddenFootnoteSupport"in l.parser.constructs?n(h):h===93?(e.exit(o),e.enter(i),e.consume(h),e.exit(i),e.exit(r),t):D(h)?(e.enter("lineEnding"),e.consume(h),e.exit("lineEnding"),f):(e.enter("chunkString",{contentType:"string"}),c(h))}function c(h){return h===null||h===91||h===93||D(h)||a++>999?(e.exit("chunkString"),f(h)):(e.consume(h),s||(s=!N(h)),h===92?p:c)}function p(h){return h===91||h===92||h===93?(e.consume(h),a++,c):c(h)}}function wr(e,t,n,r,i,o){let l;return a;function a(p){return p===34||p===39||p===40?(e.enter(r),e.enter(i),e.consume(p),e.exit(i),l=p===40?41:p,s):n(p)}function s(p){return p===l?(e.enter(i),e.consume(p),e.exit(i),e.exit(r),t):(e.enter(o),u(p))}function u(p){return p===l?(e.exit(o),s(l)):p===null?n(p):D(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),j(e,u,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),f(p))}function f(p){return p===l||p===null||D(p)?(e.exit("chunkString"),u(p)):(e.consume(p),p===92?c:f)}function c(p){return p===l||p===92?(e.consume(p),f):f(p)}}function Ve(e,t){let n;return r;function r(i){return D(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),n=!0,r):N(i)?j(e,r,n?"linePrefix":"lineSuffix")(i):t(i)}}const Hl={name:"definition",tokenize:ql},Ul={partial:!0,tokenize:Vl};function ql(e,t,n){const r=this;let i;return o;function o(h){return e.enter("definition"),l(h)}function l(h){return br.call(r,e,a,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(h)}function a(h){return i=ce(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),h===58?(e.enter("definitionMarker"),e.consume(h),e.exit("definitionMarker"),s):n(h)}function s(h){return V(h)?Ve(e,u)(h):u(h)}function u(h){return xr(e,f,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(h)}function f(h){return e.attempt(Ul,c,c)(h)}function c(h){return N(h)?j(e,p,"whitespace")(h):p(h)}function p(h){return h===null||D(h)?(e.exit("definition"),r.parser.defined.push(i),t(h)):n(h)}}function Vl(e,t,n){return r;function r(a){return V(a)?Ve(e,i)(a):n(a)}function i(a){return wr(e,o,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(a)}function o(a){return N(a)?j(e,l,"whitespace")(a):l(a)}function l(a){return a===null||D(a)?t(a):n(a)}}const $l={name:"hardBreakEscape",tokenize:Wl};function Wl(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.consume(o),i}function i(o){return D(o)?(e.exit("hardBreakEscape"),t(o)):n(o)}}const Yl={name:"headingAtx",resolve:Xl,tokenize:Ql};function Xl(e,t){let n=e.length-2,r=3,i,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(i={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},re(e,r,n-r+1,[["enter",i,t],["enter",o,t],["exit",o,t],["exit",i,t]])),e}function Ql(e,t,n){let r=0;return i;function i(f){return e.enter("atxHeading"),o(f)}function o(f){return e.enter("atxHeadingSequence"),l(f)}function l(f){return f===35&&r++<6?(e.consume(f),l):f===null||V(f)?(e.exit("atxHeadingSequence"),a(f)):n(f)}function a(f){return f===35?(e.enter("atxHeadingSequence"),s(f)):f===null||D(f)?(e.exit("atxHeading"),t(f)):N(f)?j(e,a,"whitespace")(f):(e.enter("atxHeadingText"),u(f))}function s(f){return f===35?(e.consume(f),s):(e.exit("atxHeadingSequence"),a(f))}function u(f){return f===null||f===35||V(f)?(e.exit("atxHeadingText"),a(f)):(e.consume(f),u)}}const Gl=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],It=["pre","script","style","textarea"],Jl={concrete:!0,name:"htmlFlow",resolveTo:eo,tokenize:no},Kl={partial:!0,tokenize:ro},Zl={partial:!0,tokenize:to};function eo(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function no(e,t,n){const r=this;let i,o,l,a,s;return u;function u(g){return f(g)}function f(g){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(g),c}function c(g){return g===33?(e.consume(g),p):g===47?(e.consume(g),o=!0,w):g===63?(e.consume(g),i=3,r.interrupt?t:m):K(g)?(e.consume(g),l=String.fromCharCode(g),E):n(g)}function p(g){return g===45?(e.consume(g),i=2,h):g===91?(e.consume(g),i=5,a=0,d):K(g)?(e.consume(g),i=4,r.interrupt?t:m):n(g)}function h(g){return g===45?(e.consume(g),r.interrupt?t:m):n(g)}function d(g){const ae="CDATA[";return g===ae.charCodeAt(a++)?(e.consume(g),a===ae.length?r.interrupt?t:P:d):n(g)}function w(g){return K(g)?(e.consume(g),l=String.fromCharCode(g),E):n(g)}function E(g){if(g===null||g===47||g===62||V(g)){const ae=g===47,we=l.toLowerCase();return!ae&&!o&&It.includes(we)?(i=1,r.interrupt?t(g):P(g)):Gl.includes(l.toLowerCase())?(i=6,ae?(e.consume(g),y):r.interrupt?t(g):P(g)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(g):o?I(g):C(g))}return g===45||G(g)?(e.consume(g),l+=String.fromCharCode(g),E):n(g)}function y(g){return g===62?(e.consume(g),r.interrupt?t:P):n(g)}function I(g){return N(g)?(e.consume(g),I):k(g)}function C(g){return g===47?(e.consume(g),k):g===58||g===95||K(g)?(e.consume(g),R):N(g)?(e.consume(g),C):k(g)}function R(g){return g===45||g===46||g===58||g===95||G(g)?(e.consume(g),R):_(g)}function _(g){return g===61?(e.consume(g),b):N(g)?(e.consume(g),_):C(g)}function b(g){return g===null||g===60||g===61||g===62||g===96?n(g):g===34||g===39?(e.consume(g),s=g,M):N(g)?(e.consume(g),b):U(g)}function M(g){return g===s?(e.consume(g),s=null,H):g===null||D(g)?n(g):(e.consume(g),M)}function U(g){return g===null||g===34||g===39||g===47||g===60||g===61||g===62||g===96||V(g)?_(g):(e.consume(g),U)}function H(g){return g===47||g===62||N(g)?C(g):n(g)}function k(g){return g===62?(e.consume(g),v):n(g)}function v(g){return g===null||D(g)?P(g):N(g)?(e.consume(g),v):n(g)}function P(g){return g===45&&i===2?(e.consume(g),Y):g===60&&i===1?(e.consume(g),X):g===62&&i===4?(e.consume(g),oe):g===63&&i===3?(e.consume(g),m):g===93&&i===5?(e.consume(g),pe):D(g)&&(i===6||i===7)?(e.exit("htmlFlowData"),e.check(Kl,me,z)(g)):g===null||D(g)?(e.exit("htmlFlowData"),z(g)):(e.consume(g),P)}function z(g){return e.check(Zl,T,me)(g)}function T(g){return e.enter("lineEnding"),e.consume(g),e.exit("lineEnding"),L}function L(g){return g===null||D(g)?z(g):(e.enter("htmlFlowData"),P(g))}function Y(g){return g===45?(e.consume(g),m):P(g)}function X(g){return g===47?(e.consume(g),l="",le):P(g)}function le(g){if(g===62){const ae=l.toLowerCase();return It.includes(ae)?(e.consume(g),oe):P(g)}return K(g)&&l.length<8?(e.consume(g),l+=String.fromCharCode(g),le):P(g)}function pe(g){return g===93?(e.consume(g),m):P(g)}function m(g){return g===62?(e.consume(g),oe):g===45&&i===2?(e.consume(g),m):P(g)}function oe(g){return g===null||D(g)?(e.exit("htmlFlowData"),me(g)):(e.consume(g),oe)}function me(g){return e.exit("htmlFlow"),t(g)}}function to(e,t,n){const r=this;return i;function i(l){return D(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o):n(l)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}function ro(e,t,n){return r;function r(i){return e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),e.attempt(Qe,t,n)}}const io={name:"htmlText",tokenize:lo};function lo(e,t,n){const r=this;let i,o,l;return a;function a(m){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(m),s}function s(m){return m===33?(e.consume(m),u):m===47?(e.consume(m),_):m===63?(e.consume(m),C):K(m)?(e.consume(m),U):n(m)}function u(m){return m===45?(e.consume(m),f):m===91?(e.consume(m),o=0,d):K(m)?(e.consume(m),I):n(m)}function f(m){return m===45?(e.consume(m),h):n(m)}function c(m){return m===null?n(m):m===45?(e.consume(m),p):D(m)?(l=c,X(m)):(e.consume(m),c)}function p(m){return m===45?(e.consume(m),h):c(m)}function h(m){return m===62?Y(m):m===45?p(m):c(m)}function d(m){const oe="CDATA[";return m===oe.charCodeAt(o++)?(e.consume(m),o===oe.length?w:d):n(m)}function w(m){return m===null?n(m):m===93?(e.consume(m),E):D(m)?(l=w,X(m)):(e.consume(m),w)}function E(m){return m===93?(e.consume(m),y):w(m)}function y(m){return m===62?Y(m):m===93?(e.consume(m),y):w(m)}function I(m){return m===null||m===62?Y(m):D(m)?(l=I,X(m)):(e.consume(m),I)}function C(m){return m===null?n(m):m===63?(e.consume(m),R):D(m)?(l=C,X(m)):(e.consume(m),C)}function R(m){return m===62?Y(m):C(m)}function _(m){return K(m)?(e.consume(m),b):n(m)}function b(m){return m===45||G(m)?(e.consume(m),b):M(m)}function M(m){return D(m)?(l=M,X(m)):N(m)?(e.consume(m),M):Y(m)}function U(m){return m===45||G(m)?(e.consume(m),U):m===47||m===62||V(m)?H(m):n(m)}function H(m){return m===47?(e.consume(m),Y):m===58||m===95||K(m)?(e.consume(m),k):D(m)?(l=H,X(m)):N(m)?(e.consume(m),H):Y(m)}function k(m){return m===45||m===46||m===58||m===95||G(m)?(e.consume(m),k):v(m)}function v(m){return m===61?(e.consume(m),P):D(m)?(l=v,X(m)):N(m)?(e.consume(m),v):H(m)}function P(m){return m===null||m===60||m===61||m===62||m===96?n(m):m===34||m===39?(e.consume(m),i=m,z):D(m)?(l=P,X(m)):N(m)?(e.consume(m),P):(e.consume(m),T)}function z(m){return m===i?(e.consume(m),i=void 0,L):m===null?n(m):D(m)?(l=z,X(m)):(e.consume(m),z)}function T(m){return m===null||m===34||m===39||m===60||m===61||m===96?n(m):m===47||m===62||V(m)?H(m):(e.consume(m),T)}function L(m){return m===47||m===62||V(m)?H(m):n(m)}function Y(m){return m===62?(e.consume(m),e.exit("htmlTextData"),e.exit("htmlText"),t):n(m)}function X(m){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),le}function le(m){return N(m)?j(e,pe,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(m):pe(m)}function pe(m){return e.enter("htmlTextData"),l(m)}}const Xn={name:"labelEnd",resolveAll:so,resolveTo:co,tokenize:fo},oo={tokenize:ho},ao={tokenize:po},uo={tokenize:mo};function so(e){let t=-1;const n=[];for(;++t=3&&(u===null||D(u))?(e.exit("thematicBreak"),t(u)):n(u)}function s(u){return u===i?(e.consume(u),r++,s):(e.exit("thematicBreakSequence"),N(u)?j(e,a,"whitespace")(u):a(u))}}const Z={continuation:{tokenize:Io},exit:To,name:"list",tokenize:Eo},So={partial:!0,tokenize:vo},Co={partial:!0,tokenize:Ao};function Eo(e,t,n){const r=this,i=r.events[r.events.length-1];let o=i&&i[1].type==="linePrefix"?i[2].sliceSerialize(i[1],!0).length:0,l=0;return a;function a(h){const d=r.containerState.type||(h===42||h===43||h===45?"listUnordered":"listOrdered");if(d==="listUnordered"?!r.containerState.marker||h===r.containerState.marker:Fn(h)){if(r.containerState.type||(r.containerState.type=d,e.enter(d,{_container:!0})),d==="listUnordered")return e.enter("listItemPrefix"),h===42||h===45?e.check(tn,n,u)(h):u(h);if(!r.interrupt||h===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),s(h)}return n(h)}function s(h){return Fn(h)&&++l<10?(e.consume(h),s):(!r.interrupt||l<2)&&(r.containerState.marker?h===r.containerState.marker:h===41||h===46)?(e.exit("listItemValue"),u(h)):n(h)}function u(h){return e.enter("listItemMarker"),e.consume(h),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||h,e.check(Qe,r.interrupt?n:f,e.attempt(So,p,c))}function f(h){return r.containerState.initialBlankLine=!0,o++,p(h)}function c(h){return N(h)?(e.enter("listItemPrefixWhitespace"),e.consume(h),e.exit("listItemPrefixWhitespace"),p):n(h)}function p(h){return r.containerState.size=o+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(h)}}function Io(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Qe,i,o);function i(a){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,j(e,t,"listItemIndent",r.containerState.size+1)(a)}function o(a){return r.containerState.furtherBlankLines||!N(a)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,l(a)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Co,t,l)(a))}function l(a){return r.containerState._closeFlow=!0,r.interrupt=void 0,j(e,e.attempt(Z,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(a)}}function Ao(e,t,n){const r=this;return j(e,i,"listItemIndent",r.containerState.size+1);function i(o){const l=r.events[r.events.length-1];return l&&l[1].type==="listItemIndent"&&l[2].sliceSerialize(l[1],!0).length===r.containerState.size?t(o):n(o)}}function To(e){e.exit(this.containerState.type)}function vo(e,t,n){const r=this;return j(e,i,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function i(o){const l=r.events[r.events.length-1];return!N(o)&&l&&l[1].type==="listItemPrefixWhitespace"?t(o):n(o)}}const At={name:"setextUnderline",resolveTo:Po,tokenize:zo};function Po(e,t){let n=e.length,r,i,o;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(i=n)}else e[n][1].type==="content"&&e.splice(n,1),!o&&e[n][1].type==="definition"&&(o=n);const l={type:"setextHeading",start:{...e[r][1].start},end:{...e[e.length-1][1].end}};return e[i][1].type="setextHeadingText",o?(e.splice(i,0,["enter",l,t]),e.splice(o+1,0,["exit",e[r][1],t]),e[r][1].end={...e[o][1].end}):e[r][1]=l,e.push(["exit",l,t]),e}function zo(e,t,n){const r=this;let i;return o;function o(u){let f=r.events.length,c;for(;f--;)if(r.events[f][1].type!=="lineEnding"&&r.events[f][1].type!=="linePrefix"&&r.events[f][1].type!=="content"){c=r.events[f][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||c)?(e.enter("setextHeadingLine"),i=u,l(u)):n(u)}function l(u){return e.enter("setextHeadingLineSequence"),a(u)}function a(u){return u===i?(e.consume(u),a):(e.exit("setextHeadingLineSequence"),N(u)?j(e,s,"lineSuffix")(u):s(u))}function s(u){return u===null||D(u)?(e.exit("setextHeadingLine"),t(u)):n(u)}}const Do={tokenize:Lo};function Lo(e){const t=this,n=e.attempt(Qe,r,e.attempt(this.parser.constructs.flowInitial,i,j(e,e.attempt(this.parser.constructs.flow,i,e.attempt(Ol,i)),"linePrefix")));return n;function r(o){if(o===null){e.consume(o);return}return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function i(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const Fo={resolveAll:Cr()},Ro=Sr("string"),_o=Sr("text");function Sr(e){return{resolveAll:Cr(e==="text"?Oo:void 0),tokenize:t};function t(n){const r=this,i=this.parser.constructs[e],o=n.attempt(i,l,a);return l;function l(f){return u(f)?o(f):a(f)}function a(f){if(f===null){n.consume(f);return}return n.enter("data"),n.consume(f),s}function s(f){return u(f)?(n.exit("data"),o(f)):(n.consume(f),s)}function u(f){if(f===null)return!0;const c=i[f];let p=-1;if(c)for(;++p-1){const a=l[0];typeof a=="string"?l[0]=a.slice(r):l.shift()}o>0&&l.push(e[i].slice(0,o))}return l}function Qo(e,t){let n=-1;const r=[];let i;for(;++n0){const ue=F.tokenStack[F.tokenStack.length-1];(ue[1]||vt).call(F,void 0,ue[0])}for(A.position={start:xe(x.length>0?x[0][1].start:{line:1,column:1,offset:0}),end:xe(x.length>0?x[x.length-2][1].end:{line:1,column:1,offset:0})},q=-1;++q1?"-"+a:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(l)}]};e.patch(t,s);const u={type:"element",tagName:"sup",properties:{},children:[s]};return e.patch(t,u),e.applyData(t,u)}function ha(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function pa(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function Ar(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const i=e.all(t),o=i[0];o&&o.type==="text"?o.value="["+o.value:i.unshift({type:"text",value:"["});const l=i[i.length-1];return l&&l.type==="text"?l.value+=r:i.push({type:"text",value:r}),i}function ma(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Ar(e,t);const i={src:_e(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(i.title=r.title);const o={type:"element",tagName:"img",properties:i,children:[]};return e.patch(t,o),e.applyData(t,o)}function ga(e,t){const n={src:_e(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function da(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function ka(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Ar(e,t);const i={href:_e(r.url||"")};r.title!==null&&r.title!==void 0&&(i.title=r.title);const o={type:"element",tagName:"a",properties:i,children:e.all(t)};return e.patch(t,o),e.applyData(t,o)}function ya(e,t){const n={href:_e(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function xa(e,t,n){const r=e.all(t),i=n?ba(n):Tr(t),o={},l=[];if(typeof t.checked=="boolean"){const f=r[0];let c;f&&f.type==="element"&&f.tagName==="p"?c=f:(c={type:"element",tagName:"p",properties:{},children:[]},r.unshift(c)),c.children.length>0&&c.children.unshift({type:"text",value:" "}),c.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),o.className=["task-list-item"]}let a=-1;for(;++a1}function wa(e,t){const n={},r=e.all(t);let i=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++i0){const l={type:"element",tagName:"tbody",properties:{},children:e.wrap(n,!0)},a=Un(t.children[1]),s=or(t.children[t.children.length-1]);a&&s&&(l.position={start:a,end:s}),i.push(l)}const o={type:"element",tagName:"table",properties:{},children:e.wrap(i,!0)};return e.patch(t,o),e.applyData(t,o)}function Aa(e,t,n){const r=n?n.children:void 0,o=(r?r.indexOf(t):1)===0?"th":"td",l=n&&n.type==="table"?n.align:void 0,a=l?l.length:t.children.length;let s=-1;const u=[];for(;++s0,!0),r[0]),i=r.index+r[0].length,r=n.exec(t);return o.push(Dt(t.slice(i),i>0,!1)),o.join("")}function Dt(e,t,n){let r=0,i=e.length;if(t){let o=e.codePointAt(r);for(;o===Pt||o===zt;)r++,o=e.codePointAt(r)}if(n){let o=e.codePointAt(i-1);for(;o===Pt||o===zt;)i--,o=e.codePointAt(i-1)}return i>r?e.slice(r,i):""}function Pa(e,t){const n={type:"text",value:va(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function za(e,t){const n={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}const Da={blockquote:oa,break:aa,code:ua,delete:sa,emphasis:ca,footnoteReference:fa,heading:ha,html:pa,imageReference:ma,image:ga,inlineCode:da,linkReference:ka,link:ya,listItem:xa,list:wa,paragraph:Sa,root:Ca,strong:Ea,table:Ia,tableCell:Ta,tableRow:Aa,text:Pa,thematicBreak:za,toml:Ke,yaml:Ke,definition:Ke,footnoteDefinition:Ke};function Ke(){}const vr=-1,cn=0,$e=1,ln=2,Qn=3,Gn=4,Jn=5,Kn=6,Pr=7,zr=8,Lt=typeof self=="object"?self:globalThis,La=(e,t)=>{const n=(i,o)=>(e.set(o,i),i),r=i=>{if(e.has(i))return e.get(i);const[o,l]=t[i];switch(o){case cn:case vr:return n(l,i);case $e:{const a=n([],i);for(const s of l)a.push(r(s));return a}case ln:{const a=n({},i);for(const[s,u]of l)a[r(s)]=r(u);return a}case Qn:return n(new Date(l),i);case Gn:{const{source:a,flags:s}=l;return n(new RegExp(a,s),i)}case Jn:{const a=n(new Map,i);for(const[s,u]of l)a.set(r(s),r(u));return a}case Kn:{const a=n(new Set,i);for(const s of l)a.add(r(s));return a}case Pr:{const{name:a,message:s}=l;return n(new Lt[a](s),i)}case zr:return n(BigInt(l),i);case"BigInt":return n(Object(BigInt(l)),i);case"ArrayBuffer":return n(new Uint8Array(l).buffer,l);case"DataView":{const{buffer:a}=new Uint8Array(l);return n(new DataView(a),l)}}return n(new Lt[o](l),i)};return r},Ft=e=>La(new Map,e)(0),ze="",{toString:Fa}={},{keys:Ra}=Object,Ue=e=>{const t=typeof e;if(t!=="object"||!e)return[cn,t];const n=Fa.call(e).slice(8,-1);switch(n){case"Array":return[$e,ze];case"Object":return[ln,ze];case"Date":return[Qn,ze];case"RegExp":return[Gn,ze];case"Map":return[Jn,ze];case"Set":return[Kn,ze];case"DataView":return[$e,n]}return n.includes("Array")?[$e,n]:n.includes("Error")?[Pr,n]:[ln,n]},Ze=([e,t])=>e===cn&&(t==="function"||t==="symbol"),_a=(e,t,n,r)=>{const i=(l,a)=>{const s=r.push(l)-1;return n.set(a,s),s},o=l=>{if(n.has(l))return n.get(l);let[a,s]=Ue(l);switch(a){case cn:{let f=l;switch(s){case"bigint":a=zr,f=l.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+s);f=null;break;case"undefined":return i([vr],l)}return i([a,f],l)}case $e:{if(s){let p=l;return s==="DataView"?p=new Uint8Array(l.buffer):s==="ArrayBuffer"&&(p=new Uint8Array(l)),i([s,[...p]],l)}const f=[],c=i([a,f],l);for(const p of l)f.push(o(p));return c}case ln:{if(s)switch(s){case"BigInt":return i([s,l.toString()],l);case"Boolean":case"Number":case"String":return i([s,l.valueOf()],l)}if(t&&"toJSON"in l)return o(l.toJSON());const f=[],c=i([a,f],l);for(const p of Ra(l))(e||!Ze(Ue(l[p])))&&f.push([o(p),o(l[p])]);return c}case Qn:return i([a,l.toISOString()],l);case Gn:{const{source:f,flags:c}=l;return i([a,{source:f,flags:c}],l)}case Jn:{const f=[],c=i([a,f],l);for(const[p,h]of l)(e||!(Ze(Ue(p))||Ze(Ue(h))))&&f.push([o(p),o(h)]);return c}case Kn:{const f=[],c=i([a,f],l);for(const p of l)(e||!Ze(Ue(p)))&&f.push(o(p));return c}}const{message:u}=l;return i([a,{name:s,message:u}],l)};return o},Rt=(e,{json:t,lossy:n}={})=>{const r=[];return _a(!(t||n),!!t,new Map,r)(e),r},on=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?Ft(Rt(e,t)):structuredClone(e):(e,t)=>Ft(Rt(e,t));function Oa(e,t){const n=[{type:"text",value:"↩"}];return t>1&&n.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),n}function Ma(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function Na(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=e.options.footnoteBackContent||Oa,r=e.options.footnoteBackLabel||Ma,i=e.options.footnoteLabel||"Footnotes",o=e.options.footnoteLabelTagName||"h2",l=e.options.footnoteLabelProperties||{className:["sr-only"]},a=[];let s=-1;for(;++s0&&d.push({type:"text",value:" "});let I=typeof n=="string"?n:n(s,h);typeof I=="string"&&(I={type:"text",value:I}),d.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+p+(h>1?"-"+h:""),dataFootnoteBackref:"",ariaLabel:typeof r=="string"?r:r(s,h),className:["data-footnote-backref"]},children:Array.isArray(I)?I:[I]})}const E=f[f.length-1];if(E&&E.type==="element"&&E.tagName==="p"){const I=E.children[E.children.length-1];I&&I.type==="text"?I.value+=" ":E.children.push({type:"text",value:" "}),E.children.push(...d)}else f.push(...d);const y={type:"element",tagName:"li",properties:{id:t+"fn-"+p},children:e.wrap(f,!0)};e.patch(u,y),a.push(y)}if(a.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:o,properties:{...on(l),id:"footnote-label"},children:[{type:"text",value:i}]},{type:"text",value:` -`},{type:"element",tagName:"ol",properties:{},children:e.wrap(a,!0)},{type:"text",value:` -`}]}}const _n={}.hasOwnProperty,Ba={};function ja(e,t){const n=t||Ba,r=new Map,i=new Map,o=new Map,l={...Da,...n.handlers},a={all:u,applyData:Ua,definitionById:r,footnoteById:i,footnoteCounts:o,footnoteOrder:[],handlers:l,one:s,options:n,patch:Ha,wrap:Va};return Bn(e,function(f){if(f.type==="definition"||f.type==="footnoteDefinition"){const c=f.type==="definition"?r:i,p=String(f.identifier).toUpperCase();c.has(p)||c.set(p,f)}}),a;function s(f,c){const p=f.type,h=a.handlers[p];if(_n.call(a.handlers,p)&&h)return h(a,f,c);if(a.options.passThrough&&a.options.passThrough.includes(p)){if("children"in f){const{children:w,...E}=f,y=on(E);return y.children=a.all(f),y}return on(f)}return(a.options.unknownHandler||qa)(a,f,c)}function u(f){const c=[];if("children"in f){const p=f.children;let h=-1;for(;++h0&&n.push({type:"text",value:` -`}),n}function _t(e){let t=0,n=e.charCodeAt(t);for(;n===9||n===32;)t++,n=e.charCodeAt(t);return e.slice(t)}function Ot(e,t){const n=ja(e,t),r=n.one(e,void 0),i=Na(n),o=Array.isArray(r)?{type:"root",children:r}:r||{type:"root",children:[]};return i&&o.children.push({type:"text",value:` -`},i),o}function $a(e,t){return e&&"run"in e?async function(n,r){const i=Ot(n,{file:r,...t});await e.run(i,r)}:function(n,r){return Ot(n,{file:r,...e||t})}}function Mt(e){if(e)throw e}var kn,Nt;function Wa(){if(Nt)return kn;Nt=1;var e=Object.prototype.hasOwnProperty,t=Object.prototype.toString,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=function(u){return typeof Array.isArray=="function"?Array.isArray(u):t.call(u)==="[object Array]"},o=function(u){if(!u||t.call(u)!=="[object Object]")return!1;var f=e.call(u,"constructor"),c=u.constructor&&u.constructor.prototype&&e.call(u.constructor.prototype,"isPrototypeOf");if(u.constructor&&!f&&!c)return!1;var p;for(p in u);return typeof p>"u"||e.call(u,p)},l=function(u,f){n&&f.name==="__proto__"?n(u,f.name,{enumerable:!0,configurable:!0,value:f.newValue,writable:!0}):u[f.name]=f.newValue},a=function(u,f){if(f==="__proto__")if(e.call(u,f)){if(r)return r(u,f).value}else return;return u[f]};return kn=function s(){var u,f,c,p,h,d,w=arguments[0],E=1,y=arguments.length,I=!1;for(typeof w=="boolean"&&(I=w,w=arguments[1]||{},E=2),(w==null||typeof w!="object"&&typeof w!="function")&&(w={});El.length;let s;a&&l.push(i);try{s=e.apply(this,l)}catch(u){const f=u;if(a&&n)throw f;return i(f)}a||(s&&s.then&&typeof s.then=="function"?s.then(o,i):s instanceof Error?i(s):o(s))}function i(l,...a){n||(n=!0,t(l,...a))}function o(l){i(null,l)}}const fe={basename:Ga,dirname:Ja,extname:Ka,join:Za,sep:"/"};function Ga(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');Ge(e);let n=0,r=-1,i=e.length,o;if(t===void 0||t.length===0||t.length>e.length){for(;i--;)if(e.codePointAt(i)===47){if(o){n=i+1;break}}else r<0&&(o=!0,r=i+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let l=-1,a=t.length-1;for(;i--;)if(e.codePointAt(i)===47){if(o){n=i+1;break}}else l<0&&(o=!0,l=i+1),a>-1&&(e.codePointAt(i)===t.codePointAt(a--)?a<0&&(r=i):(a=-1,r=l));return n===r?r=l:r<0&&(r=e.length),e.slice(n,r)}function Ja(e){if(Ge(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.codePointAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.codePointAt(0)===47?"/":".":t===1&&e.codePointAt(0)===47?"//":e.slice(0,t)}function Ka(e){Ge(e);let t=e.length,n=-1,r=0,i=-1,o=0,l;for(;t--;){const a=e.codePointAt(t);if(a===47){if(l){r=t+1;break}continue}n<0&&(l=!0,n=t+1),a===46?i<0?i=t:o!==1&&(o=1):i>-1&&(o=-1)}return i<0||n<0||o===0||o===1&&i===n-1&&i===r+1?"":e.slice(i,n)}function Za(...e){let t=-1,n;for(;++t0&&e.codePointAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function nu(e,t){let n="",r=0,i=-1,o=0,l=-1,a,s;for(;++l<=e.length;){if(l2){if(s=n.lastIndexOf("/"),s!==n.length-1){s<0?(n="",r=0):(n=n.slice(0,s),r=n.length-1-n.lastIndexOf("/")),i=l,o=0;continue}}else if(n.length>0){n="",r=0,i=l,o=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(i+1,l):n=e.slice(i+1,l),r=l-i-1;i=l,o=0}else a===46&&o>-1?o++:o=-1}return n}function Ge(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const tu={cwd:ru};function ru(){return"/"}function Mn(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function iu(e){if(typeof e=="string")e=new URL(e);else if(!Mn(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return lu(e)}function lu(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n0){let[h,...d]=f;const w=r[p][1];On(w)&&On(h)&&(h=yn(!0,w,h)),r[p]=[u,h,...d]}}}}const su=new Zn().freeze();function Sn(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function Cn(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function En(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function jt(e){if(!On(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function Ht(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function en(e){return cu(e)?e:new Dr(e)}function cu(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function fu(e){return typeof e=="string"||hu(e)}function hu(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const pu="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",Ut=[],qt={allowDangerousHtml:!0},mu=/^(https?|ircs?|mailto|xmpp)$/i,gu=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"className",id:"remove-classname"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function zc(e){const t=du(e),n=ku(e);return yu(t.runSync(t.parse(n),n),e)}function du(e){const t=e.rehypePlugins||Ut,n=e.remarkPlugins||Ut,r=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...qt}:qt;return su().use(la).use(n).use($a,r).use(t)}function ku(e){const t=e.children||"",n=new Dr;return typeof t=="string"&&(n.value=t),n}function yu(e,t){const n=t.allowedElements,r=t.allowElement,i=t.components,o=t.disallowedElements,l=t.skipHtml,a=t.unwrapDisallowed,s=t.urlTransform||xu;for(const f of gu)Object.hasOwn(t,f.from)&&ci("Unexpected `"+f.from+"` prop, "+(f.to?"use `"+f.to+"` instead":"remove it")+" (see <"+pu+"#"+f.id+"> for more info)");return Bn(e,u),Hi(e,{Fragment:fn.Fragment,components:i,ignoreInvalidStyle:!0,jsx:fn.jsx,jsxs:fn.jsxs,passKeys:!0,passNode:!0});function u(f,c,p){if(f.type==="raw"&&p&&typeof c=="number")return l?p.children.splice(c,1):p.children[c]={type:"text",value:f.value},c;if(f.type==="element"){let h;for(h in mn)if(Object.hasOwn(mn,h)&&Object.hasOwn(f.properties,h)){const d=f.properties[h],w=mn[h];(w===null||w.includes(f.tagName))&&(f.properties[h]=s(String(d||""),h,f))}}if(f.type==="element"){let h=n?!n.includes(f.tagName):o?o.includes(f.tagName):!1;if(!h&&r&&typeof c=="number"&&(h=!r(f,c,p)),h&&p&&typeof c=="number")return a&&f.children?p.children.splice(c,1,...f.children):p.children.splice(c,1),c}}}function xu(e){const t=e.indexOf(":"),n=e.indexOf("?"),r=e.indexOf("#"),i=e.indexOf("/");return t===-1||i!==-1&&t>i||n!==-1&&t>n||r!==-1&&t>r||mu.test(e.slice(0,t))?e:""}function Vt(e,t){const n=String(e);if(typeof t!="string")throw new TypeError("Expected character");let r=0,i=n.indexOf(t);for(;i!==-1;)r++,i=n.indexOf(t,i+t.length);return r}function bu(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function wu(e,t,n){const i=Jt((n||{}).ignore||[]),o=Su(t);let l=-1;for(;++l0?{type:"text",value:b}:void 0),b===!1?p.lastIndex=R+1:(d!==R&&I.push({type:"text",value:u.value.slice(d,R)}),Array.isArray(b)?I.push(...b):b&&I.push(b),d=R+C[0].length,y=!0),!p.global)break;C=p.exec(u.value)}return y?(d?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let n=t[0],r=n.indexOf(")");const i=Vt(e,"(");let o=Vt(e,")");for(;r!==-1&&i>o;)e+=n.slice(0,r+1),n=n.slice(r+1),r=n.indexOf(")"),o++;return[e,n]}function Lr(e,t){const n=e.input.charCodeAt(e.index-1);return(e.index===0||Ee(n)||un(n))&&(!t||n!==47)}Fr.peek=$u;function Mu(){this.buffer()}function Nu(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Bu(){this.buffer()}function ju(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Hu(e){const t=this.resume(),n=this.stack[this.stack.length-1];se(n.type==="footnoteReference"),n.identifier=ce(this.sliceSerialize(e)).toLowerCase(),n.label=t}function Uu(e){this.exit(e)}function qu(e){const t=this.resume(),n=this.stack[this.stack.length-1];se(n.type==="footnoteDefinition"),n.identifier=ce(this.sliceSerialize(e)).toLowerCase(),n.label=t}function Vu(e){this.exit(e)}function $u(){return"["}function Fr(e,t,n,r){const i=n.createTracker(r);let o=i.move("[^");const l=n.enter("footnoteReference"),a=n.enter("reference");return o+=i.move(n.safe(n.associationId(e),{after:"]",before:o})),a(),l(),o+=i.move("]"),o}function Wu(){return{enter:{gfmFootnoteCallString:Mu,gfmFootnoteCall:Nu,gfmFootnoteDefinitionLabelString:Bu,gfmFootnoteDefinition:ju},exit:{gfmFootnoteCallString:Hu,gfmFootnoteCall:Uu,gfmFootnoteDefinitionLabelString:qu,gfmFootnoteDefinition:Vu}}}function Yu(e){let t=!1;return e&&e.firstLineBlank&&(t=!0),{handlers:{footnoteDefinition:n,footnoteReference:Fr},unsafe:[{character:"[",inConstruct:["label","phrasing","reference"]}]};function n(r,i,o,l){const a=o.createTracker(l);let s=a.move("[^");const u=o.enter("footnoteDefinition"),f=o.enter("label");return s+=a.move(o.safe(o.associationId(r),{before:s,after:"]"})),f(),s+=a.move("]:"),r.children&&r.children.length>0&&(a.shift(4),s+=a.move((t?` -`:" ")+o.indentLines(o.containerFlow(r,a.current()),t?Rr:Xu))),u(),s}}function Xu(e,t,n){return t===0?e:Rr(e,t,n)}function Rr(e,t,n){return(n?"":" ")+e}const Qu=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];_r.peek=es;function Gu(){return{canContainEols:["delete"],enter:{strikethrough:Ku},exit:{strikethrough:Zu}}}function Ju(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:Qu}],handlers:{delete:_r}}}function Ku(e){this.enter({type:"delete",children:[]},e)}function Zu(e){this.exit(e)}function _r(e,t,n,r){const i=n.createTracker(r),o=n.enter("strikethrough");let l=i.move("~~");return l+=n.containerPhrasing(e,{...i.current(),before:l,after:"~"}),l+=i.move("~~"),o(),l}function es(){return"~"}function ns(e){return e.length}function ts(e,t){const n=t||{},r=(n.align||[]).concat(),i=n.stringLength||ns,o=[],l=[],a=[],s=[];let u=0,f=-1;for(;++fu&&(u=e[f].length);++ys[y])&&(s[y]=C)}w.push(I)}l[f]=w,a[f]=E}let c=-1;if(typeof r=="object"&&"length"in r)for(;++cs[c]&&(s[c]=I),h[c]=I),p[c]=C}l.splice(1,0,p),a.splice(1,0,h),f=-1;const d=[];for(;++f "),o.shift(2);const l=n.indentLines(n.containerFlow(e,o.current()),ls);return i(),l}function ls(e,t,n){return">"+(n?"":" ")+e}function os(e,t){return Wt(e,t.inConstruct,!0)&&!Wt(e,t.notInConstruct,!1)}function Wt(e,t,n){if(typeof t=="string"&&(t=[t]),!t||t.length===0)return n;let r=-1;for(;++rl&&(l=o):o=1,i=r+t.length,r=n.indexOf(t,i);return l}function us(e,t){return!!(t.options.fences===!1&&e.value&&!e.lang&&/[^ \r\n]/.test(e.value)&&!/^[\t ]*(?:[\r\n]|$)|(?:^|[\r\n])[\t ]*$/.test(e.value))}function ss(e){const t=e.options.fence||"`";if(t!=="`"&&t!=="~")throw new Error("Cannot serialize code with `"+t+"` for `options.fence`, expected `` ` `` or `~`");return t}function cs(e,t,n,r){const i=ss(n),o=e.value||"",l=i==="`"?"GraveAccent":"Tilde";if(us(e,n)){const c=n.enter("codeIndented"),p=n.indentLines(o,fs);return c(),p}const a=n.createTracker(r),s=i.repeat(Math.max(as(o,i)+1,3)),u=n.enter("codeFenced");let f=a.move(s);if(e.lang){const c=n.enter(`codeFencedLang${l}`);f+=a.move(n.safe(e.lang,{before:f,after:" ",encode:["`"],...a.current()})),c()}if(e.lang&&e.meta){const c=n.enter(`codeFencedMeta${l}`);f+=a.move(" "),f+=a.move(n.safe(e.meta,{before:f,after:` -`,encode:["`"],...a.current()})),c()}return f+=a.move(` -`),o&&(f+=a.move(o+` -`)),f+=a.move(s),u(),f}function fs(e,t,n){return(n?"":" ")+e}function et(e){const t=e.options.quote||'"';if(t!=='"'&&t!=="'")throw new Error("Cannot serialize title with `"+t+"` for `options.quote`, expected `\"`, or `'`");return t}function hs(e,t,n,r){const i=et(n),o=i==='"'?"Quote":"Apostrophe",l=n.enter("definition");let a=n.enter("label");const s=n.createTracker(r);let u=s.move("[");return u+=s.move(n.safe(n.associationId(e),{before:u,after:"]",...s.current()})),u+=s.move("]: "),a(),!e.url||/[\0- \u007F]/.test(e.url)?(a=n.enter("destinationLiteral"),u+=s.move("<"),u+=s.move(n.safe(e.url,{before:u,after:">",...s.current()})),u+=s.move(">")):(a=n.enter("destinationRaw"),u+=s.move(n.safe(e.url,{before:u,after:e.title?" ":` -`,...s.current()}))),a(),e.title&&(a=n.enter(`title${o}`),u+=s.move(" "+i),u+=s.move(n.safe(e.title,{before:u,after:i,...s.current()})),u+=s.move(i),a()),l(),u}function ps(e){const t=e.options.emphasis||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize emphasis with `"+t+"` for `options.emphasis`, expected `*`, or `_`");return t}function Ye(e){return"&#x"+e.toString(16).toUpperCase()+";"}function an(e,t,n){const r=Fe(e),i=Fe(t);return r===void 0?i===void 0?n==="_"?{inside:!0,outside:!0}:{inside:!1,outside:!1}:i===1?{inside:!0,outside:!0}:{inside:!1,outside:!0}:r===1?i===void 0?{inside:!1,outside:!1}:i===1?{inside:!0,outside:!0}:{inside:!1,outside:!1}:i===void 0?{inside:!1,outside:!1}:i===1?{inside:!0,outside:!1}:{inside:!1,outside:!1}}Or.peek=ms;function Or(e,t,n,r){const i=ps(n),o=n.enter("emphasis"),l=n.createTracker(r),a=l.move(i);let s=l.move(n.containerPhrasing(e,{after:i,before:a,...l.current()}));const u=s.charCodeAt(0),f=an(r.before.charCodeAt(r.before.length-1),u,i);f.inside&&(s=Ye(u)+s.slice(1));const c=s.charCodeAt(s.length-1),p=an(r.after.charCodeAt(0),c,i);p.inside&&(s=s.slice(0,-1)+Ye(c));const h=l.move(i);return o(),n.attentionEncodeSurroundingInfo={after:p.outside,before:f.outside},a+s+h}function ms(e,t,n){return n.options.emphasis||"*"}function gs(e,t){let n=!1;return Bn(e,function(r){if("value"in r&&/\r?\n|\r/.test(r.value)||r.type==="break")return n=!0,hi}),!!((!e.depth||e.depth<3)&&Wn(e)&&(t.options.setext||n))}function ds(e,t,n,r){const i=Math.max(Math.min(6,e.depth||1),1),o=n.createTracker(r);if(gs(e,n)){const f=n.enter("headingSetext"),c=n.enter("phrasing"),p=n.containerPhrasing(e,{...o.current(),before:` -`,after:` -`});return c(),f(),p+` -`+(i===1?"=":"-").repeat(p.length-(Math.max(p.lastIndexOf("\r"),p.lastIndexOf(` -`))+1))}const l="#".repeat(i),a=n.enter("headingAtx"),s=n.enter("phrasing");o.move(l+" ");let u=n.containerPhrasing(e,{before:"# ",after:` -`,...o.current()});return/^[\t ]/.test(u)&&(u=Ye(u.charCodeAt(0))+u.slice(1)),u=u?l+" "+u:l,n.options.closeAtx&&(u+=" "+l),s(),a(),u}Mr.peek=ks;function Mr(e){return e.value||""}function ks(){return"<"}Nr.peek=ys;function Nr(e,t,n,r){const i=et(n),o=i==='"'?"Quote":"Apostrophe",l=n.enter("image");let a=n.enter("label");const s=n.createTracker(r);let u=s.move("![");return u+=s.move(n.safe(e.alt,{before:u,after:"]",...s.current()})),u+=s.move("]("),a(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(a=n.enter("destinationLiteral"),u+=s.move("<"),u+=s.move(n.safe(e.url,{before:u,after:">",...s.current()})),u+=s.move(">")):(a=n.enter("destinationRaw"),u+=s.move(n.safe(e.url,{before:u,after:e.title?" ":")",...s.current()}))),a(),e.title&&(a=n.enter(`title${o}`),u+=s.move(" "+i),u+=s.move(n.safe(e.title,{before:u,after:i,...s.current()})),u+=s.move(i),a()),u+=s.move(")"),l(),u}function ys(){return"!"}Br.peek=xs;function Br(e,t,n,r){const i=e.referenceType,o=n.enter("imageReference");let l=n.enter("label");const a=n.createTracker(r);let s=a.move("![");const u=n.safe(e.alt,{before:s,after:"]",...a.current()});s+=a.move(u+"]["),l();const f=n.stack;n.stack=[],l=n.enter("reference");const c=n.safe(n.associationId(e),{before:s,after:"]",...a.current()});return l(),n.stack=f,o(),i==="full"||!u||u!==c?s+=a.move(c+"]"):i==="shortcut"?s=s.slice(0,-1):s+=a.move("]"),s}function xs(){return"!"}jr.peek=bs;function jr(e,t,n){let r=e.value||"",i="`",o=-1;for(;new RegExp("(^|[^`])"+i+"([^`]|$)").test(r);)i+="`";for(/[^ \r\n]/.test(r)&&(/^[ \r\n]/.test(r)&&/[ \r\n]$/.test(r)||/^`|`$/.test(r))&&(r=" "+r+" ");++o\u007F]/.test(e.url))}Ur.peek=ws;function Ur(e,t,n,r){const i=et(n),o=i==='"'?"Quote":"Apostrophe",l=n.createTracker(r);let a,s;if(Hr(e,n)){const f=n.stack;n.stack=[],a=n.enter("autolink");let c=l.move("<");return c+=l.move(n.containerPhrasing(e,{before:c,after:">",...l.current()})),c+=l.move(">"),a(),n.stack=f,c}a=n.enter("link"),s=n.enter("label");let u=l.move("[");return u+=l.move(n.containerPhrasing(e,{before:u,after:"](",...l.current()})),u+=l.move("]("),s(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(s=n.enter("destinationLiteral"),u+=l.move("<"),u+=l.move(n.safe(e.url,{before:u,after:">",...l.current()})),u+=l.move(">")):(s=n.enter("destinationRaw"),u+=l.move(n.safe(e.url,{before:u,after:e.title?" ":")",...l.current()}))),s(),e.title&&(s=n.enter(`title${o}`),u+=l.move(" "+i),u+=l.move(n.safe(e.title,{before:u,after:i,...l.current()})),u+=l.move(i),s()),u+=l.move(")"),a(),u}function ws(e,t,n){return Hr(e,n)?"<":"["}qr.peek=Ss;function qr(e,t,n,r){const i=e.referenceType,o=n.enter("linkReference");let l=n.enter("label");const a=n.createTracker(r);let s=a.move("[");const u=n.containerPhrasing(e,{before:s,after:"]",...a.current()});s+=a.move(u+"]["),l();const f=n.stack;n.stack=[],l=n.enter("reference");const c=n.safe(n.associationId(e),{before:s,after:"]",...a.current()});return l(),n.stack=f,o(),i==="full"||!u||u!==c?s+=a.move(c+"]"):i==="shortcut"?s=s.slice(0,-1):s+=a.move("]"),s}function Ss(){return"["}function nt(e){const t=e.options.bullet||"*";if(t!=="*"&&t!=="+"&&t!=="-")throw new Error("Cannot serialize items with `"+t+"` for `options.bullet`, expected `*`, `+`, or `-`");return t}function Cs(e){const t=nt(e),n=e.options.bulletOther;if(!n)return t==="*"?"-":"*";if(n!=="*"&&n!=="+"&&n!=="-")throw new Error("Cannot serialize items with `"+n+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(n===t)throw new Error("Expected `bullet` (`"+t+"`) and `bulletOther` (`"+n+"`) to be different");return n}function Es(e){const t=e.options.bulletOrdered||".";if(t!=="."&&t!==")")throw new Error("Cannot serialize items with `"+t+"` for `options.bulletOrdered`, expected `.` or `)`");return t}function Vr(e){const t=e.options.rule||"*";if(t!=="*"&&t!=="-"&&t!=="_")throw new Error("Cannot serialize rules with `"+t+"` for `options.rule`, expected `*`, `-`, or `_`");return t}function Is(e,t,n,r){const i=n.enter("list"),o=n.bulletCurrent;let l=e.ordered?Es(n):nt(n);const a=e.ordered?l==="."?")":".":Cs(n);let s=t&&n.bulletLastUsed?l===n.bulletLastUsed:!1;if(!e.ordered){const f=e.children?e.children[0]:void 0;if((l==="*"||l==="-")&&f&&(!f.children||!f.children[0])&&n.stack[n.stack.length-1]==="list"&&n.stack[n.stack.length-2]==="listItem"&&n.stack[n.stack.length-3]==="list"&&n.stack[n.stack.length-4]==="listItem"&&n.indexStack[n.indexStack.length-1]===0&&n.indexStack[n.indexStack.length-2]===0&&n.indexStack[n.indexStack.length-3]===0&&(s=!0),Vr(n)===l&&f){let c=-1;for(;++c-1?t.start:1)+(n.options.incrementListMarker===!1?0:t.children.indexOf(e))+o);let l=o.length+1;(i==="tab"||i==="mixed"&&(t&&t.type==="list"&&t.spread||e.spread))&&(l=Math.ceil(l/4)*4);const a=n.createTracker(r);a.move(o+" ".repeat(l-o.length)),a.shift(l);const s=n.enter("listItem"),u=n.indentLines(n.containerFlow(e,a.current()),f);return s(),u;function f(c,p,h){return p?(h?"":" ".repeat(l))+c:(h?o:o+" ".repeat(l-o.length))+c}}function vs(e,t,n,r){const i=n.enter("paragraph"),o=n.enter("phrasing"),l=n.containerPhrasing(e,r);return o(),i(),l}const Ps=Jt(["break","delete","emphasis","footnote","footnoteReference","image","imageReference","inlineCode","inlineMath","link","linkReference","mdxJsxTextElement","mdxTextExpression","strong","text","textDirective"]);function zs(e,t,n,r){return(e.children.some(function(l){return Ps(l)})?n.containerPhrasing:n.containerFlow).call(n,e,r)}function Ds(e){const t=e.options.strong||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize strong with `"+t+"` for `options.strong`, expected `*`, or `_`");return t}$r.peek=Ls;function $r(e,t,n,r){const i=Ds(n),o=n.enter("strong"),l=n.createTracker(r),a=l.move(i+i);let s=l.move(n.containerPhrasing(e,{after:i,before:a,...l.current()}));const u=s.charCodeAt(0),f=an(r.before.charCodeAt(r.before.length-1),u,i);f.inside&&(s=Ye(u)+s.slice(1));const c=s.charCodeAt(s.length-1),p=an(r.after.charCodeAt(0),c,i);p.inside&&(s=s.slice(0,-1)+Ye(c));const h=l.move(i+i);return o(),n.attentionEncodeSurroundingInfo={after:p.outside,before:f.outside},a+s+h}function Ls(e,t,n){return n.options.strong||"*"}function Fs(e,t,n,r){return n.safe(e.value,r)}function Rs(e){const t=e.options.ruleRepetition||3;if(t<3)throw new Error("Cannot serialize rules with repetition `"+t+"` for `options.ruleRepetition`, expected `3` or more");return t}function _s(e,t,n){const r=(Vr(n)+(n.options.ruleSpaces?" ":"")).repeat(Rs(n));return n.options.ruleSpaces?r.slice(0,-1):r}const Wr={blockquote:is,break:Yt,code:cs,definition:hs,emphasis:Or,hardBreak:Yt,heading:ds,html:Mr,image:Nr,imageReference:Br,inlineCode:jr,link:Ur,linkReference:qr,list:Is,listItem:Ts,paragraph:vs,root:zs,strong:$r,text:Fs,thematicBreak:_s};function Os(){return{enter:{table:Ms,tableData:Xt,tableHeader:Xt,tableRow:Bs},exit:{codeText:js,table:Ns,tableData:vn,tableHeader:vn,tableRow:vn}}}function Ms(e){const t=e._align;this.enter({type:"table",align:t.map(function(n){return n==="none"?null:n}),children:[]},e),this.data.inTable=!0}function Ns(e){this.exit(e),this.data.inTable=void 0}function Bs(e){this.enter({type:"tableRow",children:[]},e)}function vn(e){this.exit(e)}function Xt(e){this.enter({type:"tableCell",children:[]},e)}function js(e){let t=this.resume();this.data.inTable&&(t=t.replace(/\\([\\|])/g,Hs));const n=this.stack[this.stack.length-1];se(n.type==="inlineCode"),n.value=t,this.exit(e)}function Hs(e,t){return t==="|"?t:e}function Us(e){const t=e||{},n=t.tableCellPadding,r=t.tablePipeAlign,i=t.stringLength,o=n?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:` -`,inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[ :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{inlineCode:p,table:l,tableCell:s,tableRow:a}};function l(h,d,w,E){return u(f(h,w,E),h.align)}function a(h,d,w,E){const y=c(h,w,E),I=u([y]);return I.slice(0,I.indexOf(` -`))}function s(h,d,w,E){const y=w.enter("tableCell"),I=w.enter("phrasing"),C=w.containerPhrasing(h,{...E,before:o,after:o});return I(),y(),C}function u(h,d){return ts(h,{align:d,alignDelimiters:r,padding:n,stringLength:i})}function f(h,d,w){const E=h.children;let y=-1;const I=[],C=d.enter("table");for(;++y0&&!n&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),n}const oc={tokenize:mc,partial:!0};function ac(){return{document:{91:{name:"gfmFootnoteDefinition",tokenize:fc,continuation:{tokenize:hc},exit:pc}},text:{91:{name:"gfmFootnoteCall",tokenize:cc},93:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:uc,resolveTo:sc}}}}function uc(e,t,n){const r=this;let i=r.events.length;const o=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let l;for(;i--;){const s=r.events[i][1];if(s.type==="labelImage"){l=s;break}if(s.type==="gfmFootnoteCall"||s.type==="labelLink"||s.type==="label"||s.type==="image"||s.type==="link")break}return a;function a(s){if(!l||!l._balanced)return n(s);const u=ce(r.sliceSerialize({start:l.end,end:r.now()}));return u.codePointAt(0)!==94||!o.includes(u.slice(1))?n(s):(e.enter("gfmFootnoteCallLabelMarker"),e.consume(s),e.exit("gfmFootnoteCallLabelMarker"),t(s))}}function sc(e,t){let n=e.length;for(;n--;)if(e[n][1].type==="labelImage"&&e[n][0]==="enter"){e[n][1];break}e[n+1][1].type="data",e[n+3][1].type="gfmFootnoteCallLabelMarker";const r={type:"gfmFootnoteCall",start:Object.assign({},e[n+3][1].start),end:Object.assign({},e[e.length-1][1].end)},i={type:"gfmFootnoteCallMarker",start:Object.assign({},e[n+3][1].end),end:Object.assign({},e[n+3][1].end)};i.end.column++,i.end.offset++,i.end._bufferIndex++;const o={type:"gfmFootnoteCallString",start:Object.assign({},i.end),end:Object.assign({},e[e.length-1][1].start)},l={type:"chunkString",contentType:"string",start:Object.assign({},o.start),end:Object.assign({},o.end)},a=[e[n+1],e[n+2],["enter",r,t],e[n+3],e[n+4],["enter",i,t],["exit",i,t],["enter",o,t],["enter",l,t],["exit",l,t],["exit",o,t],e[e.length-2],e[e.length-1],["exit",r,t]];return e.splice(n,e.length-n+1,...a),e}function cc(e,t,n){const r=this,i=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o=0,l;return a;function a(c){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(c),e.exit("gfmFootnoteCallLabelMarker"),s}function s(c){return c!==94?n(c):(e.enter("gfmFootnoteCallMarker"),e.consume(c),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",u)}function u(c){if(o>999||c===93&&!l||c===null||c===91||V(c))return n(c);if(c===93){e.exit("chunkString");const p=e.exit("gfmFootnoteCallString");return i.includes(ce(r.sliceSerialize(p)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(c),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),t):n(c)}return V(c)||(l=!0),o++,e.consume(c),c===92?f:u}function f(c){return c===91||c===92||c===93?(e.consume(c),o++,u):u(c)}}function fc(e,t,n){const r=this,i=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o,l=0,a;return s;function s(d){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(d),e.exit("gfmFootnoteDefinitionLabelMarker"),u}function u(d){return d===94?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(d),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",f):n(d)}function f(d){if(l>999||d===93&&!a||d===null||d===91||V(d))return n(d);if(d===93){e.exit("chunkString");const w=e.exit("gfmFootnoteDefinitionLabelString");return o=ce(r.sliceSerialize(w)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(d),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),p}return V(d)||(a=!0),l++,e.consume(d),d===92?c:f}function c(d){return d===91||d===92||d===93?(e.consume(d),l++,f):f(d)}function p(d){return d===58?(e.enter("definitionMarker"),e.consume(d),e.exit("definitionMarker"),i.includes(o)||i.push(o),j(e,h,"gfmFootnoteDefinitionWhitespace")):n(d)}function h(d){return t(d)}}function hc(e,t,n){return e.check(Qe,t,e.attempt(oc,t,n))}function pc(e){e.exit("gfmFootnoteDefinition")}function mc(e,t,n){const r=this;return j(e,i,"gfmFootnoteDefinitionIndent",5);function i(o){const l=r.events[r.events.length-1];return l&&l[1].type==="gfmFootnoteDefinitionIndent"&&l[2].sliceSerialize(l[1],!0).length===4?t(o):n(o)}}function gc(e){let n=(e||{}).singleTilde;const r={name:"strikethrough",tokenize:o,resolveAll:i};return n==null&&(n=!0),{text:{126:r},insideSpan:{null:[r]},attentionMarkers:{null:[126]}};function i(l,a){let s=-1;for(;++s1?s(d):(l.consume(d),c++,h);if(c<2&&!n)return s(d);const E=l.exit("strikethroughSequenceTemporary"),y=Fe(d);return E._open=!y||y===2&&!!w,E._close=!w||w===2&&!!y,a(d)}}}class dc{constructor(){this.map=[]}add(t,n,r){kc(this,t,n,r)}consume(t){if(this.map.sort(function(o,l){return o[0]-l[0]}),this.map.length===0)return;let n=this.map.length;const r=[];for(;n>0;)n-=1,r.push(t.slice(this.map[n][0]+this.map[n][1]),this.map[n][2]),t.length=this.map[n][0];r.push(t.slice()),t.length=0;let i=r.pop();for(;i;){for(const o of i)t.push(o);i=r.pop()}this.map.length=0}}function kc(e,t,n,r){let i=0;if(!(n===0&&r.length===0)){for(;i-1;){const T=r.events[v][1].type;if(T==="lineEnding"||T==="linePrefix")v--;else break}const P=v>-1?r.events[v][1].type:null,z=P==="tableHead"||P==="tableRow"?b:s;return z===b&&r.parser.lazy[r.now().line]?n(k):z(k)}function s(k){return e.enter("tableHead"),e.enter("tableRow"),u(k)}function u(k){return k===124||(l=!0,o+=1),f(k)}function f(k){return k===null?n(k):D(k)?o>1?(o=0,r.interrupt=!0,e.exit("tableRow"),e.enter("lineEnding"),e.consume(k),e.exit("lineEnding"),h):n(k):N(k)?j(e,f,"whitespace")(k):(o+=1,l&&(l=!1,i+=1),k===124?(e.enter("tableCellDivider"),e.consume(k),e.exit("tableCellDivider"),l=!0,f):(e.enter("data"),c(k)))}function c(k){return k===null||k===124||V(k)?(e.exit("data"),f(k)):(e.consume(k),k===92?p:c)}function p(k){return k===92||k===124?(e.consume(k),c):c(k)}function h(k){return r.interrupt=!1,r.parser.lazy[r.now().line]?n(k):(e.enter("tableDelimiterRow"),l=!1,N(k)?j(e,d,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(k):d(k))}function d(k){return k===45||k===58?E(k):k===124?(l=!0,e.enter("tableCellDivider"),e.consume(k),e.exit("tableCellDivider"),w):_(k)}function w(k){return N(k)?j(e,E,"whitespace")(k):E(k)}function E(k){return k===58?(o+=1,l=!0,e.enter("tableDelimiterMarker"),e.consume(k),e.exit("tableDelimiterMarker"),y):k===45?(o+=1,y(k)):k===null||D(k)?R(k):_(k)}function y(k){return k===45?(e.enter("tableDelimiterFiller"),I(k)):_(k)}function I(k){return k===45?(e.consume(k),I):k===58?(l=!0,e.exit("tableDelimiterFiller"),e.enter("tableDelimiterMarker"),e.consume(k),e.exit("tableDelimiterMarker"),C):(e.exit("tableDelimiterFiller"),C(k))}function C(k){return N(k)?j(e,R,"whitespace")(k):R(k)}function R(k){return k===124?d(k):k===null||D(k)?!l||i!==o?_(k):(e.exit("tableDelimiterRow"),e.exit("tableHead"),t(k)):_(k)}function _(k){return n(k)}function b(k){return e.enter("tableRow"),M(k)}function M(k){return k===124?(e.enter("tableCellDivider"),e.consume(k),e.exit("tableCellDivider"),M):k===null||D(k)?(e.exit("tableRow"),t(k)):N(k)?j(e,M,"whitespace")(k):(e.enter("data"),U(k))}function U(k){return k===null||k===124||V(k)?(e.exit("data"),M(k)):(e.consume(k),k===92?H:U)}function H(k){return k===92||k===124?(e.consume(k),U):U(k)}}function wc(e,t){let n=-1,r=!0,i=0,o=[0,0,0,0],l=[0,0,0,0],a=!1,s=0,u,f,c;const p=new dc;for(;++nn[2]+1){const d=n[2]+1,w=n[3]-n[2]-1;e.add(d,w,[])}}e.add(n[3]+1,0,[["exit",c,t]])}return i!==void 0&&(o.end=Object.assign({},De(t.events,i)),e.add(i,0,[["exit",o,t]]),o=void 0),o}function Gt(e,t,n,r,i){const o=[],l=De(t.events,n);i&&(i.end=Object.assign({},l),o.push(["exit",i,t])),r.end=Object.assign({},l),o.push(["exit",r,t]),e.add(n+1,0,o)}function De(e,t){const n=e[t],r=n[0]==="enter"?"start":"end";return n[1][r]}const Sc={name:"tasklistCheck",tokenize:Ec};function Cc(){return{text:{91:Sc}}}function Ec(e,t,n){const r=this;return i;function i(s){return r.previous!==null||!r._gfmTasklistFirstContentOfListItem?n(s):(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(s),e.exit("taskListCheckMarker"),o)}function o(s){return V(s)?(e.enter("taskListCheckValueUnchecked"),e.consume(s),e.exit("taskListCheckValueUnchecked"),l):s===88||s===120?(e.enter("taskListCheckValueChecked"),e.consume(s),e.exit("taskListCheckValueChecked"),l):n(s)}function l(s){return s===93?(e.enter("taskListCheckMarker"),e.consume(s),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),a):n(s)}function a(s){return D(s)?t(s):N(s)?e.check({tokenize:Ic},t,n)(s):n(s)}}function Ic(e,t,n){return j(e,r,"whitespace");function r(i){return i===null?n(i):t(i)}}function Ac(e){return pr([Js(),ac(),gc(e),xc(),Cc()])}const Tc={};function Dc(e){const t=this,n=e||Tc,r=t.data(),i=r.micromarkExtensions||(r.micromarkExtensions=[]),o=r.fromMarkdownExtensions||(r.fromMarkdownExtensions=[]),l=r.toMarkdownExtensions||(r.toMarkdownExtensions=[]);i.push(Ac(n)),o.push(Ys()),l.push(Xs(n))}export{zc as M,Dc as r}; diff --git a/service/dist/assets/markdown-XJO5hUeu.js.br b/service/dist/assets/markdown-XJO5hUeu.js.br deleted file mode 100644 index ec340b6ed32574b1f14df9f9ecd6f2ded270fdc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41073 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¥!a-k9u{)7dVi^OQQP}ss?3)4=CAp;F zHV{skxMV2HDQJo&EDn(b1*m^eN4YVU^6(fp0dCD$^~$>N6);pHdo8Y>L~yTX(TvNK zUWmn1*6H?SYSAaNxE3QsXt+2*GK8R!fbz(T+i4|oCaOG zjkB zpCunG>QxSZ>TGdNO^$=p#AXD71G)JbJ{wh)Quvj*)}n0Hbp;^^OJ)Uj zI(L9Yiaa@O3@Jwjbipc!xbv;>5IU}U=Qx_$itdJQU=BR}wA2q>wq=}x##JxTHiGNt zZWy;P-hC{omC=c}&EVc&1KTxe@7PuU7oXgI;_bv0>b&YP z9vr70{P!kY5!H-w-Y~jk;!*f~&8(wiXyP~%1+!#*2vgQWKR-WSE&NFFKL63w_sqPM z<29Mq3`%B<>)_<5bk}cAN^{_>;5jg<{Wuj~js4_u|3rT}mt2f*lfUgS-=i&YH!lW( z-WEv3ZYgl8ltt*FFm5G~BWf6f5>u4;*JFC4U_l3bm7;|S4hg^E1Yvh}w=kiBpt z$XO6ju;$7>NKKs4RM$?@bQs+Ur_&ifo1p}|{6ys+!FnpseTj2bcv&wT4;jWR0{}&2 z8WlR^p`5exjG6*JNiLcHTJFXdpGuy8#DP!qeA}cj72_i62{dtQWAd+DkQLw<*Ws+m%3JWEb5nT*{|wb z93YdRDCo%Xt+aapHpuWhbQy@D{9lyr_j<%|EqF%Nr>$QWxU2+?Gcllq37nYotCM0M z+$eEzz`tB?WB8{&)t<=%wzwbvS$BAyF=-d$lb#ZnUMkJAk z7WLq}PgZiTJUSMv!QnvBD-t?U3lObPm7#>!TG67)DkyKw07mSCv``MMmrb9#lOSs6 z5ZKZT0gHdohTjoxsh&}XNE<4G@}*hF&;-xCb2~-wv zhQd7}aNclyN5FNCrqx(5*Wtcmx>LOmQ*k=Om%xOD>OgNLBg{L|uU&}&{ip*Gk3m@b z0Hc*p+m-d)UF88);|Z1_rh=+F2w|s8yy{f2NaO(tSf!AkqE{9^P2PR|_D?i_+PN?YRlxXIJR`QCeU}27F=uFQR+@!w zi!8gMSqvl*m$P=1OI^s?0CMR-jWVnEXM%R&*Q#wYljD5q6Qn1?r64g4=H2xmBR$V( z-9B0~q3e04cc}(tQ|B=|Qx2sknuewdVQX5X`YZW=jZ;X5!VVEJL)0Ua#ae~=Ctsf7 z7xOtd|FG*P$ujF)+v-%-_3-sy&ehRRQ$aBnBgsl?ubB$YmSh!~_eFWU&}7|9e?_^u zoDU9XqurLqd}(6J5pv9|IL!>DlfQCO(2SwWMz z?6O*6=?li-(1oYW>qOz_Mz1m2dqE`_<4>j491q5az+ zq5cl-(zS00FeYH?btE$}m=F1v~OUaUD5 zWV|}4wp}7kEVU7aBcuBZ-TP!v!4Prz&1ohdeexHJ?`)hjKl;6JF!*DO>9uUttb`J( ze5J7l@SBK?`OI>--8g$qK-=pqhDso2m1R&0 z(!4?`=Tl~3iqBJ6o?{%iKh0SJf>3;cTHuCCcCbYf)nP#^N6=KyR%A@3EON^(dd%V2 z3y2Td&9XaUaWHF3_$JaMiEZ-S#&>q^Z!cc2SB&sqD!(cd!&aWb)n)JGw~%$$jLka1 zkg}5_nt#ln1n|vDgTccO!dj6&wQ-wSf5l^{*M`z+DcJJv#skKtKJq0$?>Qm%4~7-u z0T|_<)1c^!9kZ(gJ_ibvbw^i=?>-+ROEHC`+Ux_|N83kjIC3Gi5wE48K&T2~M35>r zb8P~~b^~OH1YfcTs4S}-*e+f`Y@k59f*^0c%Rt5B{wLj%E@Z<3ho)dxV7b-^u2L~x z&Z#eW-X~+vYDkbN<&BSu+gMxQBcx05Iib!QVOm2+MHfTt?F>sF+QP3tD&7`GG^C~2 zmgv=&jf@ZqH+t>VVy+5?qFt_ncOT0njG(R?7n%-q2^X{UA{AdN?Fi!$A%E1p@om$X zq0(6W*V`7u9MCJtT0ME}3%?|m_@T9Kea;6AHUK?PQhYFY+P8m>v*cNB{M~+L5>z;X z%g>KnDE%5(9ocv4zCl_cAlMN05AaoX)s2R+m>-jJXX8zpIi)kCn`W0;_7=IFI`E?6 znKkrM0u-vyZhVvG>xu4P9y&oSih+rUchy8eaqLTIt=v! z1#RQu;w88+?M%Z|*BQ(}_9LW=&)rTuyOnr%shVo63-kVr@3R^)#t)8S-H#);*Jkrk z?%USNR4f+CU2_=<9n99aF*7R(m_|2Uv{thjtLr0hs4H!_byM{}RM^rBJVckqA&W(bd4Fsh(!tca;)NFA| zhojqfz}YAw?NtCgV|t{~~8EzGOWW>P zaTDtYSo+Q0ZgqWp4RWql37A%AE5BOw;l%TA;kP>|$;+&099okLd!m2;8pl$ezOarp zHK;a2qeq7Hngtze@+r&rn+)8w#7_+d4}%^?RtK93~2X@MU0kSaKKJv!gk_5Di`8cyE5~1__EoO_vhng^_0Jj!X*h@9p>s3 zH*I-dZEL;IhiQx1WyG)w85LYSGx6~LBQ$#elWj{C@j3Y^d zecZ6P`>~V%4LlTad1FA%KNPA$7$h<@;Il7cjIk!k2O2*+>Y?O*3}2BK_q^8%IYP@T zDW>h`dTRd+!&EA7b|gVn&UrP7H`xr)%4e4Y1n~ZBO-9y$5Ot?^QNr)Vh!|j}!JxgQ z2)sPv*-sI|gW!ymhEzpo-}L}Vu+&sp>8Og`x>-ds;xS5eSw1s8FGMA?$4X(h*6GDr zMh%>JzjB9$^#nJLD08)`D7L2dg1|=gPO#O+;vgJL3XT9|w7QyQvIDL{m%G-VY6QjG z8rxBh*W1`g`LFN)o6Ysl>+)}(k3YTPZr(Y%J)LmgZf=01lwl>Y|KdNnzcuH=ZGAOs zyRk^5Ei9zVUlxSNP4w))NbzL4pbd!1h1LpkuMoDge%>}>lPT-mW+4$P7`(5AAm>AC4cXYo#rAuLL3`B8-OewD0kd9 z61YQ&HnW8usfV!iW)Jsz3Kkk2)!042LJbExur(V#4#^UP+w7llmGCyaghfJXvsE_c z*L+MR!!{}X(jDYZdylm4nf^58tiA+f8o4tLmv*zS^CLk{KeIUg1&B1KwPg?lHHKpQ z1w}(cCJp1_JiWZteuxl#=5v#Ej%rKbYI9lEq(S?Jt?ko_Y@=xaaT9~CNc`>xnZo8n zMop$&(?@jeVkSt37@H3_wnT+bMkzP(UVe(Inbj7BmvZ)Oxh5`JS?FwKZFTzeI#-#t zJp4%EL>C$#<&#XpNMhT`T1~mz>l%0GQ-6$yE(v=x8!?mB-}dYE+kCtR4>Mbfs6#(B zm(brCuAg$c^Bleh`hPyzUEiZ9ip3Yj5?u z|DmauAGbSC_U+c%WybmrSe89zBBXZ;=Sd$0p;<*>csb~qTM=7F04;PaPWX87h_NN# z(;fndiM|!WQ*=dE0Iyb>2#ILnqz1^(0NZcei^X1@g%LW{Uu9Knr)xd7E6OTMwXPc? z|9$)Ociq1sqi3)=Q~&kBaC3YV zv^g2GE@r=t{Z>nHtQ4Y3;71mlSSV~R5aZkpx+2mj*O2Uxc`tREoBVYrm=2-jI|3{g zR|emFy1qXA^FTlVDUL0dDcW>2B)(WdakIAqjUQ)RuPwL&jX5Q$Mpb(T#rIWpliRWj z1Z<#=PP@#P4so~CJ=LEarK->16O}PGgtuPWq(*NwQ>|q?d^>(t`$I#(&e+tprbIA& zR-FAFN@smgsHX^d*OeX0q+n^seu)FVMq=>&=0Yp5zOk?_c|kMfHD~^B{dl}&`!6*Lb-}7v{8ryMQb_y}FMDZSL{53~MplV%E1XY8GeUBur z)p|yPSYS9rg{%{h!^0rP1e88h1@Hdj^Yz?+?uM)RHYhU@L2)&jLjq(qMSmGLi_2`rB@?e*6k)LS2#pP8Py3!@3Wf7@l<*v1+O9nIqK!48;-9)I4Rc@%@b zX6JPzF~=TA4k&RZDa3LeJ8gaW)Q-FIX~}x-WkdvBIW6hRZx5zj0&E|)eYB~obaYkj zdBIhd#+NtmEiTgK7hs90JZLYIG9%Aj*KMXQkfTe|alM2{TF0VML6iYf zb2dCro$c#?EXe`W8N;b6DZlkFiagcXmgk9J|s8mFcF6oAW7ZlNfERC{7(^ zhdm1Hw~wzU1B>kBxUfOm?6l}r3cvm9l)Mj3k##?j#jTjXM#860`v_x4qG9yj{Y^wF zJe)B)sw6t*{iO71KkPJaplLU;d>@`!llT8qa++ChOq7&d?^l%QG^5@mh`hZSx$-1t znwH?#(bbYFo^@_JNn6623mhnmUQkJJJ%q=rIr!s7lWjb0usH;ZJA3J${Vq|C-jZG7 zH_>selbzeQ{x)H(mkw#a#7Dg+oOrFTHu1^G}4Ab8EdRUBlw4gAgSae5hk+Y+veQJAqs(x`2F<5# z7^w8K2bQA#i`wvwgxC6QwUtem!E#iLyiBRH0bf>mE`0k?)mMSYIT;P2M4`$z`({}! zlqONqU-ltA;+iF3JUlA3C6_^_eB5u@HV*$Uy?+fIw#zw;1S&kGms9e{XP&yJF(OnL zZft@0x}29+`n8R?v1Sj%03gPqL;hC^ByLV4Jea?RR&Mxvk;%*7*JR>~SfX?oF01GF z1MI$kFNk^^gI(dsUdd3|$kzr#S(_mhx8)H|R%$FR4VCP<%Xl6GHbT4hf7ncGlry`R zp}M7&KJT`-r9OXbS=}_vR?Dx-aINRJ=RxJ@R(<{6uodhG$;VkX$+2nXhxnt;I#z(q z_TfZ$-_2(!wARyVx$KJA^0L`b3(3Z+l)16rj4x`yWv}nl@`quJNGHF(-!;B`APOl# z{VBxX@%0^uhV|Cx(hkGv%qKBR)X1~BrO;YXq&e9;&hKO~&Rwhu=>@l1@_Qh)!{=WP zWr~dTve*WEvXtd9xTESZC6rkDF654d72YPc)QVhE7FY0@S#V)ogQ&HG_cWvMNew9? zdN-Wq%+^DsqX(gbevf#txC)<2;I;441Ixmd*p`gNG|dDlE-2c^vRgw%a`CS!3V)*1 z%pFpTwh+hCShb0@Y%Iq_!q24z?^$iy&;GX;H~|L0BlOPx3y_S=J=}VD0`j@EFf@Vv zB}M`+9Qq?%|4(7*0Lwt zb_T4HKF2kzU@085?#pZ7tVzlaJeI!nha7vm{88Twv4?!sY&Fo)c;aZ$yFSUlK%GU- zDL5ZYgd6H^n(<+(#yjnK@9kMLCx3guw$Jcvt-gK337piSJRS3isHWS0s3H1kt%Vg` zXK*sz^j+ARBulm%Ahg*H4Fq?EC9KPlJS)nTCLYkgP-@ZqhO9)a`fbTBq((`M7EW#t z;xVB{AiA9oo!>yCWveh`sPJVmv=7-QU3KomA10wfdPF3;#@fQ7Ywny0p{+qLi$#y+ z{FToaAzJ`ja<<5{5NS=}%dZf7jM-%H4ym-ifVshq@XL>{egE8k0`0KP4xo+sw>Y^r zpnuSS>}EoX(quYnYV!Ke^KA0jG2bYC((X!1nf{EPoo8_4UK0FvKWImfADfwobZGU# zaa$UICAo@b77+XEIs%()6F1Q@G%?QjmO1YFR`ay{CJsWpq*wgcDNA`4Y{50zcC{V- z^6jJw(yfwX4Poiq)|9G zR9M?&AHOl9YOZvDy2O5I`wOu##+~{TPL?~;M|i{=yvo1nC#-_g`yVL}YtP5fR2~<% zg7=*PH@Zg1(u3Z-UO-X}vQ_zxB4tQ1AzGd>)_%ndNOr)AicoPUG1D~n71qc&?u56R zZnG$I#N3dk)lPi#(Psm-;txR_w8#$x$nH;c{Li#y*jQ|YHFtX1N!?nB$*vIJ2$j^}Zd z6q9r2=x-lwrw@a;DAkFhOM|mpB}YwFS?Us{ybQXPNG`@^hg0lqK*1%IA4o?Z2}c=R za>!@U6J!-l#;G7rHXwFg!~Qp-ZNDR*BP)B`ypG#XOqs8CHhBC;jT$bfId4I-IsH=Z zzep3k_oY4Dd1x((jz^+h1MFMTFE#SMu>Bialmy7m8(oSloL?Be(0eR7X4iAOK#}J^ zkxG#Ne+pvxA2nmRSPGQxOB81J6W{edPy5S2VVhP$(5c-}(RM~WJ?P!%kI%I|w$?~h zy%U|+=d-ij-@E~*SC(yV(egEPwpoEeuy~NN%GJGX0^a>OiI^kMB!g zuR1N|=q$dyFptF|3Ib;l{fpBF#*9a*K-AKyHf67z7% zd~Wf+^ewMAeWQ|H&>FKiiNZpD42BSH1L$vRL8Go(ICwD$;0T$u`+KSiZI;<(QLvq{ zz#)T7bI==m_ulh2C^;q3Uh3o* zwUQ7%^0-|f*^crH7bK7&H4V;$K_(M5&m%hP2-$)_fL2k0hb|l~3jX36cO<)wA%T^m zFwZ-7J$v4kRC@hG^z}YHZ`b*(JrQaGW5eKCEeqOH4G$pH31~Ee;(QDXcCnM`qL`F} z`C1KO=;1*iQR&BSFR;^4N;(YIthh%Xv+L!AV7=6qDn72|7)uR4PF!26`54NFfon;1 znOUjH$BAo8g(r%aYe4Q;jg&jaTH3QYor%#u_Db*Z_P-V#^oaVqyB_R9U6!H{j5QiWTFlU#B7U43H?2Z_`t zkb5{G2@yMSGEL?WN1iUDUAl0m_+cvQSnZ-O9@aiU?_4{)>x&c`1oGu9Q9~o~zQiv* zsk$}$A&~oaB+*upVX}H#h&X_T>E0BM9ilV99&XI?%!-)EJ1LL(hHIAk#MM|H6T=L? z74G0efVw`Bw1UsbqlYh3)C8%o^B=YAUUF)fl2xk0?_znWDv4iQ&AB;M8oTTU1~jke zn8?F6MhS)d0d=NRP!c2#dTEl5dv7gdM_W(qv@?C)hSor4Ey5QmAa(F%IT+!Po9;+? zU^;bWj|5q#RJ+}kezn(7vJZdRfC}ig+-|A(xcG@xQws2W>!wb0Gs*_23COkBaO7%! zw=87HF%2vm3?+ZfsmY)i-ed5Xp18eOTZ-xSCgkK>@gYvQv1y#y0{Tz==E=s=QOr#koFeg< z?kf4YbDNWmR$>alC)>~ioV!u&*J9ehE{R~|^OwoDJ`*HEnq{xxvYyNqKBRR(*JMWATB`4Bct6r(U{=M^8dypeTfsnBPfLD zoD3FQ7GnHFELzbj1@1U6PB=(j6(n>nmG}DGBs*2M`o555FY%04JOgd@RN6~FS)D7= zC<0HN-{^;a!rl!s6Ukb)7eE$*5zl>>yxrJ$6eWx{ptQ{6xEcBu>kbkH0>0KIk<>O6 z;DNpeU_f&(j-XF34sR7M&<{|-$d~Y$ue$H}!N3r@w%l_>u#1WB#d2&7s;A7;c=}x; zZdFPT&Epso3(6a^@4VAYt3}pH8`%Da!3=;dX&<1d+eh@Q8tH}8eaT(-NP{U|KK|#o z`FeXdw;4hjC+X17O2Vz6A}yP!_2|z0bOrm%c5oPrE&l!cISMd4I4H^|qb{ZxZ#PMg z`N66_a(5<*%g|(mbP3FIo6IoL1aYu0y{Bv~3$g}J)Zplb{~%rRIp!9KVOZ$%=8Ygcr!|!Td=e+%CaEW!t8l;`uA*@9 z-fr}%8ay#Ak4wuyTE^Sup|~3)Loagw8-RyIe+ngy5EC1ce4`=)_UWG>q`)P5O5y!a zL-sN(FT{V;SzlDm(EBuw&%BXkEh6sChPuV2!_$r%{Oy!w520&~q%EfXdB;l|zQCaP z{3(W$!~g=E45}YHgTG_A0VbrMp zPQsXU=|9+ax}uUTJyp1%ROm>f8+_Bp|IgZ(SeisddEa)0l1itX`=KW;O|i6U46x-r zL7nH<7I8S0KIZ~%q6Wal&G%X-w<9g3W=WTXk9H%$@lY+NDbdr3`W)B3*H~izeKi_` z2(*;6NDZXFIoci#hbLrYNn@F^lZfn}Izgf}EO1EKCL8m?< zlY*7s(#spowg-MS=6vkNJfwZgcUdeVWZxT+z38AwpK_1+N~N`QLfChLO450V3nK}4 z?6d(8QD}Say@9~+tuS;EwZuEV6Uf3cN7PSfD^+jm@_!Ho_IyNH_@vN4iY;{DCh z$HyvPqgH*WVO1A3`0=M_Ey05~aF@fc!^MHC==*f?z~HGj)l+$`hzhW6__$#$eR|I^ z-_?BfTqF56P{V~6_-CA#wc2<2D(fc4exIqy&MlhE zCDD4mu<&;c$$mg#q@F% zVC-oM9LGu*C_QzCfr8ElPfroU2mwh;Y5>w0Ld#Q(B&x~lx^AD%J7w@vpov}I3oB9` zksP~>(r7_&zfJf%z2Kh`TJr3%`gJz^{GD9MzBDhY_a9fm3UMj+fc+OIKqLJhs{;G5 zsvvzk%qjpr4`pPdlU{%s5#4WlSZQBj?!C~MQ$KhW3QWi9R~=~hF39~2=CYMS#EORN z^VaM_|3)2vAl?|`M;X@njc@w&KvkvL{xe*;HI~P7uO~R`Babi(guU58RjDg5`TH#c zC=T6p>7ZL7hH+?iUHv>o-mt`s?qEC*OHvnn{;ByWU#8|F6SkBAvrIY>M(G13`dj*I z6|&SVRHKtJkD_?|q03GWiiWcMvBaEvWwODrG}k1zAdFa8Kn66Us&9%$IhE-moYv@Y zvp_3cf;j=kB>Gpos44{Jt^+?Bx=)ooe85Hc^js)_0^gW!GcP2-x&X=9V!9_6EIU?v zlO5#ETfR@eS#Fx%XX}Efa%LLpBip0ju?$exEtEW~Bv&oT_f{0w26p-L#F$uYgCY4m zp%Y^~qNQPCslD8vrQPx9dEEC^8s770r84o#xNHb=nl5N=NfV&Zfo8{3nKJGkeb@+u zGZCXGl!-VIC*nk$h!e3KgXJo@itxmeO{k=*9t&hV2fuXvw>@ zYPXTRSDRP;H~O~Gfz}10u((*5H{2qzi(b^A|(^u#IlZ08rkL*QG&_LQP|>J+$`;_eAyyk$2Q)Zgx{& zq3vw4LtD4~1#Wd>&u;)Mn}#KulU8Elg(w35Z8bfTE3WhNJn9NFT&5r1$b{xr-<|QM zCzY}p8lUv`iWR=1G_(46U8^7H-fEn6{tV$-;Gm(%**<$^u5|YAFtie|R_~7MxxCKB zL$_P6Tb9~7i{Adfn_fIwqzr~O;5Bd;n-L58eFb7@Us>lO!57F^EaLF+0ubIF$~4Cx z**>nV>O=n0aEy}_-GVcm3UIwj$Py)D6G_u&7Tc{S$M9NX)K&eFjQ$LHrIet@u_Ef& zKYG)2;T^M-^k}Ejq8vA!;07m_Hn7|_8kb09&`o^(Bui$JjFKsG1!GvHq&9_J{e>^P zmKC!jGg?Qf;HlfK0m>u!K@d9{>a>@6e8zZIsTtRgmB$vn(i|T)lF^S5+pN=y&CyE{ z1yhuKrKgKl;VrGc`3k<00$7(Zm_a22bR|+MGf|imOT{PH+ODiLKz{I}yB?p%2=>yUu=XtxD!`zLAnR2e)m$=c6F0@f2K6_y z+rg9pD8An&uHO>GiSUb7m7UOHPe$;uMJdcNV)|Za5y>8w{MqSmA!#&#HrnGss!j)a zypEGZ%k%m2ymt%nrqLZglmE-3jDYoH3}A4XJzx zeKws&isYT-6beQ}%k0E1J`D6iM3DLr?c~KEN}!-uiCr(W0h{@3zM<&j?L;vwZ4a;% z4tKq_dkRoKlr*F^BBXwkAf0yKtc0%3Qa^CrP0gT~x(#7tYdJt;-8*pWGc-ggtZ#SD4)v}3)8Fpf>#t!hq10XG4s zhL5PXRYpr(1g!5^fj%;dL|=#dTE*D7wJ`0B1!n0v3`hgku`QC=8_imnQ8bd{>&DDk zaW3R0zgSw{uOv8k5NMaKN?o%0aTZKsEAd3;rAHdj;lM~ zgJDQoyGdmuyiCfluDiAmh~4>V-rIoj^cwTxD3tVTs@WB^J@rfrb@|;zfkgP))2Rue zCFyTCALeENE*~QTibJS_*W#dQokb=X&1LTnY|C(oGUsw;e*dHuOTkDfuJ}9YPFVmz z=#BS$6q5&EDk!|YbfpeQ>+hTiWQFIueH+V~U6#oiTO9vPw*Nqtl2 zc7>z{X{LDfAj{V2T**bhHfp=BMt*wbeM91BR&?15nJ{+aLJlu}jo^fxRjjXP>-iqw zB}SIK^L(2YoyeX?=N54$hXcAp>JH%gai7|uOvAe5&YyTlg0$ndyS&0n6zw^c)8?FQ zFL^zAUYk5$xFk$@WoLvuF|6{f@sM_PvRPlehE^-hA6NVcNhv7zVGH+^IewNFlg$rS zl=9El-Y^h*&g=*y#@hJdeOQtvbN5Pqa(bS>%f}&9IOgDCSSiC$#Fp8VZd)I5DW51V z3}*AfW_PJODT{}p@y1ZBTOZgqhj(PU%y^SsO2R~Lxjs`u0F=A#J0L2%z!kRK&J>ZU zR_G2agRF#y2-UXcY1WcsANX*33&NXwa`?#D(BmgBvUgSwGz5FDGBIbtCcQdPvlrQr zLM=0V2u5?b1k}AGJ#zhI#2!w12m$z7*Nbb8%UtUxq_z1jf;V;{t@uevh4aKI9P6NU zBQ7?-_nZZd{fAbJ9K?yQcgyqhnPiVuydWL1S~#TAV8WEW>BhLqi#4KpqowHu?&E@; zHQN0l`xV(6*h%w!1O0l*85f+)xZh*RvbN|5bcb>2ipu3Z{q2dA&CXSZI{D^3qA%sm zkas9mM4D~!Uqj{nAX5eT6Q|LuY?h}pK|_aj;RaeuFsTUl(~#R~PGR<``XX)(z#wMF z*{4J+VW!SAgyZWTX~x*8+E?%@@r6`F4p4a6fLH zoS#Bgx`kqPCdY*c(=4C!8LT|Q<&hoz1^Xd)2eMWu*)h_E2bT<6t-xt7SzzM9u2%>N z0Yax}vCU%BQNOSWt&=G2mCyFLHX+(mra>?G>3!^j0G$BL=%Z70EBIQIx@UT$?qN5l z42bA(YqAp{cJ!gQSHM(|bFnYjqoAt;EWZzb7G3y{jG$bE*WK_iaQg@!Wa=GJ06p5^ znQcvaTgfzpU!7Uo6eKmncKwSJEFDQCn8Fzel_CoJ@42i#cqe5^8s0wi1MhaWn?}2) z@2DG=J6H-?NjB_s9v=CyW;+X#IZdGJ+4%T0yXu{Hr-CI9zDBQTnXXMI4fS$F{_HUh z$J3O*SM>w$A)Cf}d+Ri#dh6XjJgI8_Rus81Bd6^*K~xJuA;HG!On z-b~nB_1sGD zNahuT$YCd&Tx~N&s4=o^mh4h;`mbf+=qx#ipF(yIo1@0*@UUEPnNRYoY)pCmK-~~Z zHOJf2IbDTha(6J5;CB!43P$BM(s_185~y)XQq3=v=WJtED}pa@aLs zni~?7yyDBn*`nqT{3!(mG*cc_#5W^_Rk##T2HW&)vOW10YZAi_$_3yl0aM@`v1}PO zj@AcSTP7BTB#Fo^i37?dW%lG+KhTN`DV#V5n>t5FVgGj{x0IeU7B=+D)Vl#Y_qZd622Oy(&JO}ZYYwv$zXy2w3Oo7-u zN2w?u77zM$4@X`g4!y2&p8rSHG`P!%QI@W2r~81i{`gGV3MMPJdFRd=8}Ok-#lLP z&N|q zc~AtRY(>?px#E84^X0&bOYWo_JicYk(sF3WD_zkYi*0NSy}Wqy!#SOR{@Ct|)1KL;*i?>BUMys>a9ZFA5Q0A9x8we)xWyPfs7` Nt`BZMY}Qrl@e6kLmtX(@ diff --git a/service/dist/assets/misc-GeCjUSSS.js b/service/dist/assets/misc-GeCjUSSS.js deleted file mode 100644 index 0c4167989..000000000 --- a/service/dist/assets/misc-GeCjUSSS.js +++ /dev/null @@ -1,344 +0,0 @@ -import{r as Vt,R as be,a as w,j as Ft}from"./motion-Dp9wOFzY.js";var Ne={exports:{}},K={};/** - * @license React - * react-dom.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ke;function Ht(){if(Ke)return K;Ke=1;var s=Vt();function e(l){var i="https://react.dev/errors/"+l;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(s)}catch(e){console.error(e)}}return s(),Ne.exports=Ht(),Ne.exports}const Ge=s=>{let e;const t=new Set,r=(i,d)=>{const u=typeof i=="function"?i(e):i;if(!Object.is(u,e)){const p=e;e=d??(typeof u!="object"||u===null)?u:Object.assign({},e,u),t.forEach(h=>h(e,p))}},n=()=>e,c={setState:r,getState:n,getInitialState:()=>l,subscribe:i=>(t.add(i),()=>t.delete(i))},l=e=s(r,n,c);return c},Dt=(s=>s?Ge(s):Ge),Ut=s=>s;function Kt(s,e=Ut){const t=be.useSyncExternalStore(s.subscribe,be.useCallback(()=>e(s.getState()),[s,e]),be.useCallback(()=>e(s.getInitialState()),[s,e]));return be.useDebugValue(t),t}const qe=s=>{const e=Dt(s),t=r=>Kt(e,r);return Object.assign(t,e),t},In=(s=>s?qe(s):qe);function xt(s){var e,t,r="";if(typeof s=="string"||typeof s=="number")r+=s;else if(typeof s=="object")if(Array.isArray(s)){var n=s.length;for(e=0;e{const e=Wt(s),{conflictingClassGroups:t,conflictingClassGroupModifiers:r}=s;return{getClassGroupId:a=>{const c=a.split(He);return c[0]===""&&c.length!==1&&c.shift(),kt(c,e)||qt(a)},getConflictingClassGroupIds:(a,c)=>{const l=t[a]||[];return c&&r[a]?[...l,...r[a]]:l}}},kt=(s,e)=>{if(s.length===0)return e.classGroupId;const t=s[0],r=e.nextPart.get(t),n=r?kt(s.slice(1),r):void 0;if(n)return n;if(e.validators.length===0)return;const o=s.join(He);return e.validators.find(({validator:a})=>a(o))?.classGroupId},We=/^\[(.+)\]$/,qt=s=>{if(We.test(s)){const e=We.exec(s)[1],t=e?.substring(0,e.indexOf(":"));if(t)return"arbitrary.."+t}},Wt=s=>{const{theme:e,classGroups:t}=s,r={nextPart:new Map,validators:[]};for(const n in t)ze(t[n],r,n,e);return r},ze=(s,e,t,r)=>{s.forEach(n=>{if(typeof n=="string"){const o=n===""?e:Je(e,n);o.classGroupId=t;return}if(typeof n=="function"){if(Jt(n)){ze(n(r),e,t,r);return}e.validators.push({validator:n,classGroupId:t});return}Object.entries(n).forEach(([o,a])=>{ze(a,Je(e,o),t,r)})})},Je=(s,e)=>{let t=s;return e.split(He).forEach(r=>{t.nextPart.has(r)||t.nextPart.set(r,{nextPart:new Map,validators:[]}),t=t.nextPart.get(r)}),t},Jt=s=>s.isThemeGetter,Yt=s=>{if(s<1)return{get:()=>{},set:()=>{}};let e=0,t=new Map,r=new Map;const n=(o,a)=>{t.set(o,a),e++,e>s&&(e=0,r=t,t=new Map)};return{get(o){let a=t.get(o);if(a!==void 0)return a;if((a=r.get(o))!==void 0)return n(o,a),a},set(o,a){t.has(o)?t.set(o,a):n(o,a)}}},Pe="!",Ee=":",Zt=Ee.length,Qt=s=>{const{prefix:e,experimentalParseClassName:t}=s;let r=n=>{const o=[];let a=0,c=0,l=0,i;for(let f=0;fl?i-l:void 0;return{modifiers:o,hasImportantModifier:p,baseClassName:u,maybePostfixModifierPosition:h}};if(e){const n=e+Ee,o=r;r=a=>a.startsWith(n)?o(a.substring(n.length)):{isExternal:!0,modifiers:[],hasImportantModifier:!1,baseClassName:a,maybePostfixModifierPosition:void 0}}if(t){const n=r;r=o=>t({className:o,parseClassName:n})}return r},Xt=s=>s.endsWith(Pe)?s.substring(0,s.length-1):s.startsWith(Pe)?s.substring(1):s,es=s=>{const e=Object.fromEntries(s.orderSensitiveModifiers.map(r=>[r,!0]));return r=>{if(r.length<=1)return r;const n=[];let o=[];return r.forEach(a=>{a[0]==="["||e[a]?(n.push(...o.sort(),a),o=[]):o.push(a)}),n.push(...o.sort()),n}},ts=s=>({cache:Yt(s.cacheSize),parseClassName:Qt(s),sortModifiers:es(s),...Gt(s)}),ss=/\s+/,rs=(s,e)=>{const{parseClassName:t,getClassGroupId:r,getConflictingClassGroupIds:n,sortModifiers:o}=e,a=[],c=s.trim().split(ss);let l="";for(let i=c.length-1;i>=0;i-=1){const d=c[i],{isExternal:u,modifiers:p,hasImportantModifier:h,baseClassName:f,maybePostfixModifierPosition:b}=t(d);if(u){l=d+(l.length>0?" "+l:l);continue}let x=!!b,C=r(x?f.substring(0,b):f);if(!C){if(!x){l=d+(l.length>0?" "+l:l);continue}if(C=r(f),!C){l=d+(l.length>0?" "+l:l);continue}x=!1}const N=o(p).join(":"),E=h?N+Pe:N,O=E+C;if(a.includes(O))continue;a.push(O);const L=n(C,x);for(let z=0;z0?" "+l:l)}return l};function ns(){let s=0,e,t,r="";for(;s{if(typeof s=="string")return s;let e,t="";for(let r=0;ru(d),s());return t=ts(i),r=t.cache.get,n=t.cache.set,o=c,c(l)}function c(l){const i=r(l);if(i)return i;const d=rs(l,t);return n(l,d),d}return function(){return o(ns.apply(null,arguments))}}const V=s=>{const e=t=>t[s]||[];return e.isThemeGetter=!0,e},wt=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,St=/^\((?:(\w[\w-]*):)?(.+)\)$/i,is=/^\d+\/\d+$/,as=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,ls=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,cs=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,ds=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,us=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,se=s=>is.test(s),M=s=>!!s&&!Number.isNaN(Number(s)),Q=s=>!!s&&Number.isInteger(Number(s)),Le=s=>s.endsWith("%")&&M(s.slice(0,-1)),Y=s=>as.test(s),hs=()=>!0,fs=s=>ls.test(s)&&!cs.test(s),Ot=()=>!1,ps=s=>ds.test(s),gs=s=>us.test(s),ms=s=>!g(s)&&!m(s),ys=s=>ne(s,Nt,Ot),g=s=>wt.test(s),ee=s=>ne(s,Lt,fs),Re=s=>ne(s,ws,M),Ye=s=>ne(s,Ct,Ot),bs=s=>ne(s,Mt,gs),xe=s=>ne(s,Rt,ps),m=s=>St.test(s),ae=s=>oe(s,Lt),xs=s=>oe(s,Ss),Ze=s=>oe(s,Ct),ks=s=>oe(s,Nt),vs=s=>oe(s,Mt),ke=s=>oe(s,Rt,!0),ne=(s,e,t)=>{const r=wt.exec(s);return r?r[1]?e(r[1]):t(r[2]):!1},oe=(s,e,t=!1)=>{const r=St.exec(s);return r?r[1]?e(r[1]):t:!1},Ct=s=>s==="position"||s==="percentage",Mt=s=>s==="image"||s==="url",Nt=s=>s==="length"||s==="size"||s==="bg-size",Lt=s=>s==="length",ws=s=>s==="number",Ss=s=>s==="family-name",Rt=s=>s==="shadow",Os=()=>{const s=V("color"),e=V("font"),t=V("text"),r=V("font-weight"),n=V("tracking"),o=V("leading"),a=V("breakpoint"),c=V("container"),l=V("spacing"),i=V("radius"),d=V("shadow"),u=V("inset-shadow"),p=V("text-shadow"),h=V("drop-shadow"),f=V("blur"),b=V("perspective"),x=V("aspect"),C=V("ease"),N=V("animate"),E=()=>["auto","avoid","all","avoid-page","page","left","right","column"],O=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],L=()=>[...O(),m,g],z=()=>["auto","hidden","clip","visible","scroll"],_=()=>["auto","contain","none"],v=()=>[m,g,l],I=()=>[se,"full","auto",...v()],R=()=>[Q,"none","subgrid",m,g],G=()=>["auto",{span:["full",Q,m,g]},Q,m,g],q=()=>[Q,"auto",m,g],P=()=>["auto","min","max","fr",m,g],$=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],j=()=>["start","end","center","stretch","center-safe","end-safe"],A=()=>["auto",...v()],H=()=>[se,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...v()],k=()=>[s,m,g],X=()=>[...O(),Ze,Ye,{position:[m,g]}],ie=()=>["no-repeat",{repeat:["","x","y","space","round"]}],D=()=>["auto","cover","contain",ks,ys,{size:[m,g]}],W=()=>[Le,ae,ee],T=()=>["","none","full",i,m,g],U=()=>["",M,ae,ee],pe=()=>["solid","dashed","dotted","double"],De=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],F=()=>[M,Le,Ze,Ye],Ue=()=>["","none",f,m,g],ge=()=>["none",M,m,g],me=()=>["none",M,m,g],Me=()=>[M,m,g],ye=()=>[se,"full",...v()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[Y],breakpoint:[Y],color:[hs],container:[Y],"drop-shadow":[Y],ease:["in","out","in-out"],font:[ms],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[Y],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[Y],shadow:[Y],spacing:["px",M],text:[Y],"text-shadow":[Y],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",se,g,m,x]}],container:["container"],columns:[{columns:[M,g,m,c]}],"break-after":[{"break-after":E()}],"break-before":[{"break-before":E()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:L()}],overflow:[{overflow:z()}],"overflow-x":[{"overflow-x":z()}],"overflow-y":[{"overflow-y":z()}],overscroll:[{overscroll:_()}],"overscroll-x":[{"overscroll-x":_()}],"overscroll-y":[{"overscroll-y":_()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:I()}],"inset-x":[{"inset-x":I()}],"inset-y":[{"inset-y":I()}],start:[{start:I()}],end:[{end:I()}],top:[{top:I()}],right:[{right:I()}],bottom:[{bottom:I()}],left:[{left:I()}],visibility:["visible","invisible","collapse"],z:[{z:[Q,"auto",m,g]}],basis:[{basis:[se,"full","auto",c,...v()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[M,se,"auto","initial","none",g]}],grow:[{grow:["",M,m,g]}],shrink:[{shrink:["",M,m,g]}],order:[{order:[Q,"first","last","none",m,g]}],"grid-cols":[{"grid-cols":R()}],"col-start-end":[{col:G()}],"col-start":[{"col-start":q()}],"col-end":[{"col-end":q()}],"grid-rows":[{"grid-rows":R()}],"row-start-end":[{row:G()}],"row-start":[{"row-start":q()}],"row-end":[{"row-end":q()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":P()}],"auto-rows":[{"auto-rows":P()}],gap:[{gap:v()}],"gap-x":[{"gap-x":v()}],"gap-y":[{"gap-y":v()}],"justify-content":[{justify:[...$(),"normal"]}],"justify-items":[{"justify-items":[...j(),"normal"]}],"justify-self":[{"justify-self":["auto",...j()]}],"align-content":[{content:["normal",...$()]}],"align-items":[{items:[...j(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...j(),{baseline:["","last"]}]}],"place-content":[{"place-content":$()}],"place-items":[{"place-items":[...j(),"baseline"]}],"place-self":[{"place-self":["auto",...j()]}],p:[{p:v()}],px:[{px:v()}],py:[{py:v()}],ps:[{ps:v()}],pe:[{pe:v()}],pt:[{pt:v()}],pr:[{pr:v()}],pb:[{pb:v()}],pl:[{pl:v()}],m:[{m:A()}],mx:[{mx:A()}],my:[{my:A()}],ms:[{ms:A()}],me:[{me:A()}],mt:[{mt:A()}],mr:[{mr:A()}],mb:[{mb:A()}],ml:[{ml:A()}],"space-x":[{"space-x":v()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":v()}],"space-y-reverse":["space-y-reverse"],size:[{size:H()}],w:[{w:[c,"screen",...H()]}],"min-w":[{"min-w":[c,"screen","none",...H()]}],"max-w":[{"max-w":[c,"screen","none","prose",{screen:[a]},...H()]}],h:[{h:["screen","lh",...H()]}],"min-h":[{"min-h":["screen","lh","none",...H()]}],"max-h":[{"max-h":["screen","lh",...H()]}],"font-size":[{text:["base",t,ae,ee]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[r,m,Re]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Le,g]}],"font-family":[{font:[xs,g,e]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[n,m,g]}],"line-clamp":[{"line-clamp":[M,"none",m,Re]}],leading:[{leading:[o,...v()]}],"list-image":[{"list-image":["none",m,g]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",m,g]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:k()}],"text-color":[{text:k()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...pe(),"wavy"]}],"text-decoration-thickness":[{decoration:[M,"from-font","auto",m,ee]}],"text-decoration-color":[{decoration:k()}],"underline-offset":[{"underline-offset":[M,"auto",m,g]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:v()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",m,g]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",m,g]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:X()}],"bg-repeat":[{bg:ie()}],"bg-size":[{bg:D()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},Q,m,g],radial:["",m,g],conic:[Q,m,g]},vs,bs]}],"bg-color":[{bg:k()}],"gradient-from-pos":[{from:W()}],"gradient-via-pos":[{via:W()}],"gradient-to-pos":[{to:W()}],"gradient-from":[{from:k()}],"gradient-via":[{via:k()}],"gradient-to":[{to:k()}],rounded:[{rounded:T()}],"rounded-s":[{"rounded-s":T()}],"rounded-e":[{"rounded-e":T()}],"rounded-t":[{"rounded-t":T()}],"rounded-r":[{"rounded-r":T()}],"rounded-b":[{"rounded-b":T()}],"rounded-l":[{"rounded-l":T()}],"rounded-ss":[{"rounded-ss":T()}],"rounded-se":[{"rounded-se":T()}],"rounded-ee":[{"rounded-ee":T()}],"rounded-es":[{"rounded-es":T()}],"rounded-tl":[{"rounded-tl":T()}],"rounded-tr":[{"rounded-tr":T()}],"rounded-br":[{"rounded-br":T()}],"rounded-bl":[{"rounded-bl":T()}],"border-w":[{border:U()}],"border-w-x":[{"border-x":U()}],"border-w-y":[{"border-y":U()}],"border-w-s":[{"border-s":U()}],"border-w-e":[{"border-e":U()}],"border-w-t":[{"border-t":U()}],"border-w-r":[{"border-r":U()}],"border-w-b":[{"border-b":U()}],"border-w-l":[{"border-l":U()}],"divide-x":[{"divide-x":U()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":U()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...pe(),"hidden","none"]}],"divide-style":[{divide:[...pe(),"hidden","none"]}],"border-color":[{border:k()}],"border-color-x":[{"border-x":k()}],"border-color-y":[{"border-y":k()}],"border-color-s":[{"border-s":k()}],"border-color-e":[{"border-e":k()}],"border-color-t":[{"border-t":k()}],"border-color-r":[{"border-r":k()}],"border-color-b":[{"border-b":k()}],"border-color-l":[{"border-l":k()}],"divide-color":[{divide:k()}],"outline-style":[{outline:[...pe(),"none","hidden"]}],"outline-offset":[{"outline-offset":[M,m,g]}],"outline-w":[{outline:["",M,ae,ee]}],"outline-color":[{outline:k()}],shadow:[{shadow:["","none",d,ke,xe]}],"shadow-color":[{shadow:k()}],"inset-shadow":[{"inset-shadow":["none",u,ke,xe]}],"inset-shadow-color":[{"inset-shadow":k()}],"ring-w":[{ring:U()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:k()}],"ring-offset-w":[{"ring-offset":[M,ee]}],"ring-offset-color":[{"ring-offset":k()}],"inset-ring-w":[{"inset-ring":U()}],"inset-ring-color":[{"inset-ring":k()}],"text-shadow":[{"text-shadow":["none",p,ke,xe]}],"text-shadow-color":[{"text-shadow":k()}],opacity:[{opacity:[M,m,g]}],"mix-blend":[{"mix-blend":[...De(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":De()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[M]}],"mask-image-linear-from-pos":[{"mask-linear-from":F()}],"mask-image-linear-to-pos":[{"mask-linear-to":F()}],"mask-image-linear-from-color":[{"mask-linear-from":k()}],"mask-image-linear-to-color":[{"mask-linear-to":k()}],"mask-image-t-from-pos":[{"mask-t-from":F()}],"mask-image-t-to-pos":[{"mask-t-to":F()}],"mask-image-t-from-color":[{"mask-t-from":k()}],"mask-image-t-to-color":[{"mask-t-to":k()}],"mask-image-r-from-pos":[{"mask-r-from":F()}],"mask-image-r-to-pos":[{"mask-r-to":F()}],"mask-image-r-from-color":[{"mask-r-from":k()}],"mask-image-r-to-color":[{"mask-r-to":k()}],"mask-image-b-from-pos":[{"mask-b-from":F()}],"mask-image-b-to-pos":[{"mask-b-to":F()}],"mask-image-b-from-color":[{"mask-b-from":k()}],"mask-image-b-to-color":[{"mask-b-to":k()}],"mask-image-l-from-pos":[{"mask-l-from":F()}],"mask-image-l-to-pos":[{"mask-l-to":F()}],"mask-image-l-from-color":[{"mask-l-from":k()}],"mask-image-l-to-color":[{"mask-l-to":k()}],"mask-image-x-from-pos":[{"mask-x-from":F()}],"mask-image-x-to-pos":[{"mask-x-to":F()}],"mask-image-x-from-color":[{"mask-x-from":k()}],"mask-image-x-to-color":[{"mask-x-to":k()}],"mask-image-y-from-pos":[{"mask-y-from":F()}],"mask-image-y-to-pos":[{"mask-y-to":F()}],"mask-image-y-from-color":[{"mask-y-from":k()}],"mask-image-y-to-color":[{"mask-y-to":k()}],"mask-image-radial":[{"mask-radial":[m,g]}],"mask-image-radial-from-pos":[{"mask-radial-from":F()}],"mask-image-radial-to-pos":[{"mask-radial-to":F()}],"mask-image-radial-from-color":[{"mask-radial-from":k()}],"mask-image-radial-to-color":[{"mask-radial-to":k()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":O()}],"mask-image-conic-pos":[{"mask-conic":[M]}],"mask-image-conic-from-pos":[{"mask-conic-from":F()}],"mask-image-conic-to-pos":[{"mask-conic-to":F()}],"mask-image-conic-from-color":[{"mask-conic-from":k()}],"mask-image-conic-to-color":[{"mask-conic-to":k()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:X()}],"mask-repeat":[{mask:ie()}],"mask-size":[{mask:D()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",m,g]}],filter:[{filter:["","none",m,g]}],blur:[{blur:Ue()}],brightness:[{brightness:[M,m,g]}],contrast:[{contrast:[M,m,g]}],"drop-shadow":[{"drop-shadow":["","none",h,ke,xe]}],"drop-shadow-color":[{"drop-shadow":k()}],grayscale:[{grayscale:["",M,m,g]}],"hue-rotate":[{"hue-rotate":[M,m,g]}],invert:[{invert:["",M,m,g]}],saturate:[{saturate:[M,m,g]}],sepia:[{sepia:["",M,m,g]}],"backdrop-filter":[{"backdrop-filter":["","none",m,g]}],"backdrop-blur":[{"backdrop-blur":Ue()}],"backdrop-brightness":[{"backdrop-brightness":[M,m,g]}],"backdrop-contrast":[{"backdrop-contrast":[M,m,g]}],"backdrop-grayscale":[{"backdrop-grayscale":["",M,m,g]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[M,m,g]}],"backdrop-invert":[{"backdrop-invert":["",M,m,g]}],"backdrop-opacity":[{"backdrop-opacity":[M,m,g]}],"backdrop-saturate":[{"backdrop-saturate":[M,m,g]}],"backdrop-sepia":[{"backdrop-sepia":["",M,m,g]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":v()}],"border-spacing-x":[{"border-spacing-x":v()}],"border-spacing-y":[{"border-spacing-y":v()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",m,g]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[M,"initial",m,g]}],ease:[{ease:["linear","initial",C,m,g]}],delay:[{delay:[M,m,g]}],animate:[{animate:["none",N,m,g]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[b,m,g]}],"perspective-origin":[{"perspective-origin":L()}],rotate:[{rotate:ge()}],"rotate-x":[{"rotate-x":ge()}],"rotate-y":[{"rotate-y":ge()}],"rotate-z":[{"rotate-z":ge()}],scale:[{scale:me()}],"scale-x":[{"scale-x":me()}],"scale-y":[{"scale-y":me()}],"scale-z":[{"scale-z":me()}],"scale-3d":["scale-3d"],skew:[{skew:Me()}],"skew-x":[{"skew-x":Me()}],"skew-y":[{"skew-y":Me()}],transform:[{transform:[m,g,"","none","gpu","cpu"]}],"transform-origin":[{origin:L()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:ye()}],"translate-x":[{"translate-x":ye()}],"translate-y":[{"translate-y":ye()}],"translate-z":[{"translate-z":ye()}],"translate-none":["translate-none"],accent:[{accent:k()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:k()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",m,g]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":v()}],"scroll-mx":[{"scroll-mx":v()}],"scroll-my":[{"scroll-my":v()}],"scroll-ms":[{"scroll-ms":v()}],"scroll-me":[{"scroll-me":v()}],"scroll-mt":[{"scroll-mt":v()}],"scroll-mr":[{"scroll-mr":v()}],"scroll-mb":[{"scroll-mb":v()}],"scroll-ml":[{"scroll-ml":v()}],"scroll-p":[{"scroll-p":v()}],"scroll-px":[{"scroll-px":v()}],"scroll-py":[{"scroll-py":v()}],"scroll-ps":[{"scroll-ps":v()}],"scroll-pe":[{"scroll-pe":v()}],"scroll-pt":[{"scroll-pt":v()}],"scroll-pr":[{"scroll-pr":v()}],"scroll-pb":[{"scroll-pb":v()}],"scroll-pl":[{"scroll-pl":v()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",m,g]}],fill:[{fill:["none",...k()]}],"stroke-w":[{stroke:[M,ae,ee,Re]}],stroke:[{stroke:["none",...k()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},An=os(Os),S=s=>typeof s=="string",le=()=>{let s,e;const t=new Promise((r,n)=>{s=r,e=n});return t.resolve=s,t.reject=e,t},Qe=s=>s==null?"":""+s,Cs=(s,e,t)=>{s.forEach(r=>{e[r]&&(t[r]=e[r])})},Ms=/###/g,Xe=s=>s&&s.indexOf("###")>-1?s.replace(Ms,"."):s,et=s=>!s||S(s),ce=(s,e,t)=>{const r=S(e)?e.split("."):e;let n=0;for(;n{const{obj:r,k:n}=ce(s,e,Object);if(r!==void 0||e.length===1){r[n]=t;return}let o=e[e.length-1],a=e.slice(0,e.length-1),c=ce(s,a,Object);for(;c.obj===void 0&&a.length;)o=`${a[a.length-1]}.${o}`,a=a.slice(0,a.length-1),c=ce(s,a,Object),c?.obj&&typeof c.obj[`${c.k}.${o}`]<"u"&&(c.obj=void 0);c.obj[`${c.k}.${o}`]=t},Ns=(s,e,t,r)=>{const{obj:n,k:o}=ce(s,e,Object);n[o]=n[o]||[],n[o].push(t)},we=(s,e)=>{const{obj:t,k:r}=ce(s,e);if(t&&Object.prototype.hasOwnProperty.call(t,r))return t[r]},Ls=(s,e,t)=>{const r=we(s,t);return r!==void 0?r:we(e,t)},_t=(s,e,t)=>{for(const r in e)r!=="__proto__"&&r!=="constructor"&&(r in s?S(s[r])||s[r]instanceof String||S(e[r])||e[r]instanceof String?t&&(s[r]=e[r]):_t(s[r],e[r],t):s[r]=e[r]);return s},re=s=>s.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var Rs={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const _s=s=>S(s)?s.replace(/[&<>"'\/]/g,e=>Rs[e]):s;class $s{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const t=this.regExpMap.get(e);if(t!==void 0)return t;const r=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,r),this.regExpQueue.push(e),r}}const zs=[" ",",","?","!",";"],Ps=new $s(20),Es=(s,e,t)=>{e=e||"",t=t||"";const r=zs.filter(a=>e.indexOf(a)<0&&t.indexOf(a)<0);if(r.length===0)return!0;const n=Ps.getRegExp(`(${r.map(a=>a==="?"?"\\?":a).join("|")})`);let o=!n.test(s);if(!o){const a=s.indexOf(t);a>0&&!n.test(s.substring(0,a))&&(o=!0)}return o},Ie=(s,e,t=".")=>{if(!s)return;if(s[e])return Object.prototype.hasOwnProperty.call(s,e)?s[e]:void 0;const r=e.split(t);let n=s;for(let o=0;o-1&&ls?.replace("_","-"),Is={type:"logger",log(s){this.output("log",s)},warn(s){this.output("warn",s)},error(s){this.output("error",s)},output(s,e){console?.[s]?.apply?.(console,e)}};class Se{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||"i18next:",this.logger=e||Is,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,t,r,n){return n&&!this.debug?null:(S(e[0])&&(e[0]=`${r}${this.prefix} ${e[0]}`),this.logger[t](e))}create(e){return new Se(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new Se(this.logger,e)}}var J=new Se;class Ce{constructor(){this.observers={}}on(e,t){return e.split(" ").forEach(r=>{this.observers[r]||(this.observers[r]=new Map);const n=this.observers[r].get(t)||0;this.observers[r].set(t,n+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([n,o])=>{for(let a=0;a{for(let a=0;a-1&&this.options.ns.splice(t,1)}getResource(e,t,r,n={}){const o=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,a=n.ignoreJSONStructure!==void 0?n.ignoreJSONStructure:this.options.ignoreJSONStructure;let c;e.indexOf(".")>-1?c=e.split("."):(c=[e,t],r&&(Array.isArray(r)?c.push(...r):S(r)&&o?c.push(...r.split(o)):c.push(r)));const l=we(this.data,c);return!l&&!t&&!r&&e.indexOf(".")>-1&&(e=c[0],t=c[1],r=c.slice(2).join(".")),l||!a||!S(r)?l:Ie(this.data?.[e]?.[t],r,o)}addResource(e,t,r,n,o={silent:!1}){const a=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator;let c=[e,t];r&&(c=c.concat(a?r.split(a):r)),e.indexOf(".")>-1&&(c=e.split("."),n=t,t=c[1]),this.addNamespaces(t),tt(this.data,c,n),o.silent||this.emit("added",e,t,r,n)}addResources(e,t,r,n={silent:!1}){for(const o in r)(S(r[o])||Array.isArray(r[o]))&&this.addResource(e,t,o,r[o],{silent:!0});n.silent||this.emit("added",e,t,r)}addResourceBundle(e,t,r,n,o,a={silent:!1,skipCopy:!1}){let c=[e,t];e.indexOf(".")>-1&&(c=e.split("."),n=r,r=t,t=c[1]),this.addNamespaces(t);let l=we(this.data,c)||{};a.skipCopy||(r=JSON.parse(JSON.stringify(r))),n?_t(l,r,o):l={...l,...r},tt(this.data,c,l),a.silent||this.emit("added",e,t,r)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit("removed",e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||(t=this.options.defaultNS),this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(n=>t[n]&&Object.keys(t[n]).length>0)}toJSON(){return this.data}}var $t={processors:{},addPostProcessor(s){this.processors[s.name]=s},handle(s,e,t,r,n){return s.forEach(o=>{e=this.processors[o]?.process(e,t,r,n)??e}),e}};const zt=Symbol("i18next/PATH_KEY");function As(){const s=[],e=Object.create(null);let t;return e.get=(r,n)=>(t?.revoke?.(),n===zt?s:(s.push(n),t=Proxy.revocable(r,e),t.proxy)),Proxy.revocable(Object.create(null),e).proxy}function Ae(s,e){const{[zt]:t}=s(As());return t.join(e?.keySeparator??".")}const rt={},nt=s=>!S(s)&&typeof s!="boolean"&&typeof s!="number";class Oe extends Ce{constructor(e,t={}){super(),Cs(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=J.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){const r={...t};return e==null?!1:this.resolve(e,r)?.res!==void 0}extractFromKey(e,t){let r=t.nsSeparator!==void 0?t.nsSeparator:this.options.nsSeparator;r===void 0&&(r=":");const n=t.keySeparator!==void 0?t.keySeparator:this.options.keySeparator;let o=t.ns||this.options.defaultNS||[];const a=r&&e.indexOf(r)>-1,c=!this.options.userDefinedKeySeparator&&!t.keySeparator&&!this.options.userDefinedNsSeparator&&!t.nsSeparator&&!Es(e,r,n);if(a&&!c){const l=e.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:e,namespaces:S(o)?[o]:o};const i=e.split(r);(r!==n||r===n&&this.options.ns.indexOf(i[0])>-1)&&(o=i.shift()),e=i.join(n)}return{key:e,namespaces:S(o)?[o]:o}}translate(e,t,r){let n=typeof t=="object"?{...t}:t;if(typeof n!="object"&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),typeof n=="object"&&(n={...n}),n||(n={}),e==null)return"";typeof e=="function"&&(e=Ae(e,{...this.options,...n})),Array.isArray(e)||(e=[String(e)]);const o=n.returnDetails!==void 0?n.returnDetails:this.options.returnDetails,a=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,{key:c,namespaces:l}=this.extractFromKey(e[e.length-1],n),i=l[l.length-1];let d=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;d===void 0&&(d=":");const u=n.lng||this.language,p=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(u?.toLowerCase()==="cimode")return p?o?{res:`${i}${d}${c}`,usedKey:c,exactUsedKey:c,usedLng:u,usedNS:i,usedParams:this.getUsedParamsDetails(n)}:`${i}${d}${c}`:o?{res:c,usedKey:c,exactUsedKey:c,usedLng:u,usedNS:i,usedParams:this.getUsedParamsDetails(n)}:c;const h=this.resolve(e,n);let f=h?.res;const b=h?.usedKey||c,x=h?.exactUsedKey||c,C=["[object Number]","[object Function]","[object RegExp]"],N=n.joinArrays!==void 0?n.joinArrays:this.options.joinArrays,E=!this.i18nFormat||this.i18nFormat.handleAsObject,O=n.count!==void 0&&!S(n.count),L=Oe.hasDefaultValue(n),z=O?this.pluralResolver.getSuffix(u,n.count,n):"",_=n.ordinal&&O?this.pluralResolver.getSuffix(u,n.count,{ordinal:!1}):"",v=O&&!n.ordinal&&n.count===0,I=v&&n[`defaultValue${this.options.pluralSeparator}zero`]||n[`defaultValue${z}`]||n[`defaultValue${_}`]||n.defaultValue;let R=f;E&&!f&&L&&(R=I);const G=nt(R),q=Object.prototype.toString.apply(R);if(E&&R&&G&&C.indexOf(q)<0&&!(S(N)&&Array.isArray(R))){if(!n.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const P=this.options.returnedObjectHandler?this.options.returnedObjectHandler(b,R,{...n,ns:l}):`key '${c} (${this.language})' returned an object instead of string.`;return o?(h.res=P,h.usedParams=this.getUsedParamsDetails(n),h):P}if(a){const P=Array.isArray(R),$=P?[]:{},j=P?x:b;for(const A in R)if(Object.prototype.hasOwnProperty.call(R,A)){const H=`${j}${a}${A}`;L&&!f?$[A]=this.translate(H,{...n,defaultValue:nt(I)?I[A]:void 0,joinArrays:!1,ns:l}):$[A]=this.translate(H,{...n,joinArrays:!1,ns:l}),$[A]===H&&($[A]=R[A])}f=$}}else if(E&&S(N)&&Array.isArray(f))f=f.join(N),f&&(f=this.extendTranslation(f,e,n,r));else{let P=!1,$=!1;!this.isValidLookup(f)&&L&&(P=!0,f=I),this.isValidLookup(f)||($=!0,f=c);const A=(n.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&$?void 0:f,H=L&&I!==f&&this.options.updateMissing;if($||P||H){if(this.logger.log(H?"updateKey":"missingKey",u,i,c,H?I:f),a){const D=this.resolve(c,{...n,keySeparator:!1});D&&D.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let k=[];const X=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if(this.options.saveMissingTo==="fallback"&&X&&X[0])for(let D=0;D{const U=L&&T!==f?T:A;this.options.missingKeyHandler?this.options.missingKeyHandler(D,i,W,U,H,n):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(D,i,W,U,H,n),this.emit("missingKey",D,i,W,f)};this.options.saveMissing&&(this.options.saveMissingPlurals&&O?k.forEach(D=>{const W=this.pluralResolver.getSuffixes(D,n);v&&n[`defaultValue${this.options.pluralSeparator}zero`]&&W.indexOf(`${this.options.pluralSeparator}zero`)<0&&W.push(`${this.options.pluralSeparator}zero`),W.forEach(T=>{ie([D],c+T,n[`defaultValue${T}`]||I)})}):ie(k,c,I))}f=this.extendTranslation(f,e,n,h,r),$&&f===c&&this.options.appendNamespaceToMissingKey&&(f=`${i}${d}${c}`),($||P)&&this.options.parseMissingKeyHandler&&(f=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${i}${d}${c}`:c,P?f:void 0,n))}return o?(h.res=f,h.usedParams=this.getUsedParamsDetails(n),h):f}extendTranslation(e,t,r,n,o){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...r},r.lng||this.language||n.usedLng,n.usedNS,n.usedKey,{resolved:n});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});const l=S(e)&&(r?.interpolation?.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let i;if(l){const u=e.match(this.interpolator.nestingRegexp);i=u&&u.length}let d=r.replace&&!S(r.replace)?r.replace:r;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),e=this.interpolator.interpolate(e,d,r.lng||this.language||n.usedLng,r),l){const u=e.match(this.interpolator.nestingRegexp),p=u&&u.length;io?.[0]===u[0]&&!r.context?(this.logger.warn(`It seems you are nesting recursively key: ${u[0]} in key: ${t[0]}`),null):this.translate(...u,t),r)),r.interpolation&&this.interpolator.reset()}const a=r.postProcess||this.options.postProcess,c=S(a)?[a]:a;return e!=null&&c?.length&&r.applyPostProcessor!==!1&&(e=$t.handle(c,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...n,usedParams:this.getUsedParamsDetails(r)},...r}:r,this)),e}resolve(e,t={}){let r,n,o,a,c;return S(e)&&(e=[e]),e.forEach(l=>{if(this.isValidLookup(r))return;const i=this.extractFromKey(l,t),d=i.key;n=d;let u=i.namespaces;this.options.fallbackNS&&(u=u.concat(this.options.fallbackNS));const p=t.count!==void 0&&!S(t.count),h=p&&!t.ordinal&&t.count===0,f=t.context!==void 0&&(S(t.context)||typeof t.context=="number")&&t.context!=="",b=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);u.forEach(x=>{this.isValidLookup(r)||(c=x,!rt[`${b[0]}-${x}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(c)&&(rt[`${b[0]}-${x}`]=!0,this.logger.warn(`key "${n}" for languages "${b.join(", ")}" won't get resolved as namespace "${c}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),b.forEach(C=>{if(this.isValidLookup(r))return;a=C;const N=[d];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(N,d,C,x,t);else{let O;p&&(O=this.pluralResolver.getSuffix(C,t.count,t));const L=`${this.options.pluralSeparator}zero`,z=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(p&&(t.ordinal&&O.indexOf(z)===0&&N.push(d+O.replace(z,this.options.pluralSeparator)),N.push(d+O),h&&N.push(d+L)),f){const _=`${d}${this.options.contextSeparator||"_"}${t.context}`;N.push(_),p&&(t.ordinal&&O.indexOf(z)===0&&N.push(_+O.replace(z,this.options.pluralSeparator)),N.push(_+O),h&&N.push(_+L))}}let E;for(;E=N.pop();)this.isValidLookup(r)||(o=E,r=this.getResource(C,x,E,t))}))})}),{res:r,usedKey:n,exactUsedKey:o,usedLng:a,usedNS:c}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,t,r,n={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,r,n):this.resourceStore.getResource(e,t,r,n)}getUsedParamsDetails(e={}){const t=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],r=e.replace&&!S(e.replace);let n=r?e.replace:e;if(r&&typeof e.count<"u"&&(n.count=e.count),this.options.interpolation.defaultVariables&&(n={...this.options.interpolation.defaultVariables,...n}),!r){n={...n};for(const o of t)delete n[o]}return n}static hasDefaultValue(e){const t="defaultValue";for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&t===r.substring(0,t.length)&&e[r]!==void 0)return!0;return!1}}class ot{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=J.create("languageUtils")}getScriptPartFromCode(e){if(e=ue(e),!e||e.indexOf("-")<0)return null;const t=e.split("-");return t.length===2||(t.pop(),t[t.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(t.join("-"))}getLanguagePartFromCode(e){if(e=ue(e),!e||e.indexOf("-")<0)return e;const t=e.split("-");return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(S(e)&&e.indexOf("-")>-1){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(r=>{if(t)return;const n=this.formatLanguageCode(r);(!this.options.supportedLngs||this.isSupportedCode(n))&&(t=n)}),!t&&this.options.supportedLngs&&e.forEach(r=>{if(t)return;const n=this.getScriptPartFromCode(r);if(this.isSupportedCode(n))return t=n;const o=this.getLanguagePartFromCode(r);if(this.isSupportedCode(o))return t=o;t=this.options.supportedLngs.find(a=>{if(a===o)return a;if(!(a.indexOf("-")<0&&o.indexOf("-")<0)&&(a.indexOf("-")>0&&o.indexOf("-")<0&&a.substring(0,a.indexOf("-"))===o||a.indexOf(o)===0&&o.length>1))return a})}),t||(t=this.getFallbackCodes(this.options.fallbackLng)[0]),t}getFallbackCodes(e,t){if(!e)return[];if(typeof e=="function"&&(e=e(t)),S(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let r=e[t];return r||(r=e[this.getScriptPartFromCode(t)]),r||(r=e[this.formatLanguageCode(t)]),r||(r=e[this.getLanguagePartFromCode(t)]),r||(r=e.default),r||[]}toResolveHierarchy(e,t){const r=this.getFallbackCodes((t===!1?[]:t)||this.options.fallbackLng||[],e),n=[],o=a=>{a&&(this.isSupportedCode(a)?n.push(a):this.logger.warn(`rejecting language code not found in supportedLngs: ${a}`))};return S(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&o(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&o(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&o(this.getLanguagePartFromCode(e))):S(e)&&o(this.formatLanguageCode(e)),r.forEach(a=>{n.indexOf(a)<0&&o(this.formatLanguageCode(a))}),n}}const it={zero:0,one:1,two:2,few:3,many:4,other:5},at={select:s=>s===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class Ts{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=J.create("pluralResolver"),this.pluralRulesCache={}}addRule(e,t){this.rules[e]=t}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){const r=ue(e==="dev"?"en":e),n=t.ordinal?"ordinal":"cardinal",o=JSON.stringify({cleanedCode:r,type:n});if(o in this.pluralRulesCache)return this.pluralRulesCache[o];let a;try{a=new Intl.PluralRules(r,{type:n})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),at;if(!e.match(/-|_/))return at;const l=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(l,t)}return this.pluralRulesCache[o]=a,a}needsPlural(e,t={}){let r=this.getRule(e,t);return r||(r=this.getRule("dev",t)),r?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,r={}){return this.getSuffixes(e,r).map(n=>`${t}${n}`)}getSuffixes(e,t={}){let r=this.getRule(e,t);return r||(r=this.getRule("dev",t)),r?r.resolvedOptions().pluralCategories.sort((n,o)=>it[n]-it[o]).map(n=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:""}${n}`):[]}getSuffix(e,t,r={}){const n=this.getRule(e,r);return n?`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${n.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",t,r))}}const lt=(s,e,t,r=".",n=!0)=>{let o=Ls(s,e,t);return!o&&n&&S(t)&&(o=Ie(s,t,r),o===void 0&&(o=Ie(e,t,r))),o},_e=s=>s.replace(/\$/g,"$$$$");class js{constructor(e={}){this.logger=J.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(t=>t),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:t,escapeValue:r,useRawValueToEscape:n,prefix:o,prefixEscaped:a,suffix:c,suffixEscaped:l,formatSeparator:i,unescapeSuffix:d,unescapePrefix:u,nestingPrefix:p,nestingPrefixEscaped:h,nestingSuffix:f,nestingSuffixEscaped:b,nestingOptionsSeparator:x,maxReplaces:C,alwaysFormat:N}=e.interpolation;this.escape=t!==void 0?t:_s,this.escapeValue=r!==void 0?r:!0,this.useRawValueToEscape=n!==void 0?n:!1,this.prefix=o?re(o):a||"{{",this.suffix=c?re(c):l||"}}",this.formatSeparator=i||",",this.unescapePrefix=d?"":u||"-",this.unescapeSuffix=this.unescapePrefix?"":d||"",this.nestingPrefix=p?re(p):h||re("$t("),this.nestingSuffix=f?re(f):b||re(")"),this.nestingOptionsSeparator=x||",",this.maxReplaces=C||1e3,this.alwaysFormat=N!==void 0?N:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(t,r)=>t?.source===r?(t.lastIndex=0,t):new RegExp(r,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,t,r,n){let o,a,c;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},i=h=>{if(h.indexOf(this.formatSeparator)<0){const C=lt(t,l,h,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(C,void 0,r,{...n,...t,interpolationkey:h}):C}const f=h.split(this.formatSeparator),b=f.shift().trim(),x=f.join(this.formatSeparator).trim();return this.format(lt(t,l,b,this.options.keySeparator,this.options.ignoreJSONStructure),x,r,{...n,...t,interpolationkey:b})};this.resetRegExp();const d=n?.missingInterpolationHandler||this.options.missingInterpolationHandler,u=n?.interpolation?.skipOnVariables!==void 0?n.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:h=>_e(h)},{regex:this.regexp,safeValue:h=>this.escapeValue?_e(this.escape(h)):_e(h)}].forEach(h=>{for(c=0;o=h.regex.exec(e);){const f=o[1].trim();if(a=i(f),a===void 0)if(typeof d=="function"){const x=d(e,o,n);a=S(x)?x:""}else if(n&&Object.prototype.hasOwnProperty.call(n,f))a="";else if(u){a=o[0];continue}else this.logger.warn(`missed to pass in variable ${f} for interpolating ${e}`),a="";else!S(a)&&!this.useRawValueToEscape&&(a=Qe(a));const b=h.safeValue(a);if(e=e.replace(o[0],b),u?(h.regex.lastIndex+=a.length,h.regex.lastIndex-=o[0].length):h.regex.lastIndex=0,c++,c>=this.maxReplaces)break}}),e}nest(e,t,r={}){let n,o,a;const c=(l,i)=>{const d=this.nestingOptionsSeparator;if(l.indexOf(d)<0)return l;const u=l.split(new RegExp(`${d}[ ]*{`));let p=`{${u[1]}`;l=u[0],p=this.interpolate(p,a);const h=p.match(/'/g),f=p.match(/"/g);((h?.length??0)%2===0&&!f||f.length%2!==0)&&(p=p.replace(/'/g,'"'));try{a=JSON.parse(p),i&&(a={...i,...a})}catch(b){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,b),`${l}${d}${p}`}return a.defaultValue&&a.defaultValue.indexOf(this.prefix)>-1&&delete a.defaultValue,l};for(;n=this.nestingRegexp.exec(e);){let l=[];a={...r},a=a.replace&&!S(a.replace)?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;const i=/{.*}/.test(n[1])?n[1].lastIndexOf("}")+1:n[1].indexOf(this.formatSeparator);if(i!==-1&&(l=n[1].slice(i).split(this.formatSeparator).map(d=>d.trim()).filter(Boolean),n[1]=n[1].slice(0,i)),o=t(c.call(this,n[1].trim(),a),a),o&&n[0]===e&&!S(o))return o;S(o)||(o=Qe(o)),o||(this.logger.warn(`missed to resolve ${n[1]} for nesting ${e}`),o=""),l.length&&(o=l.reduce((d,u)=>this.format(d,u,r.lng,{...r,interpolationkey:n[1].trim()}),o.trim())),e=e.replace(n[0],o),this.regexp.lastIndex=0}return e}}const Vs=s=>{let e=s.toLowerCase().trim();const t={};if(s.indexOf("(")>-1){const r=s.split("(");e=r[0].toLowerCase().trim();const n=r[1].substring(0,r[1].length-1);e==="currency"&&n.indexOf(":")<0?t.currency||(t.currency=n.trim()):e==="relativetime"&&n.indexOf(":")<0?t.range||(t.range=n.trim()):n.split(";").forEach(a=>{if(a){const[c,...l]=a.split(":"),i=l.join(":").trim().replace(/^'+|'+$/g,""),d=c.trim();t[d]||(t[d]=i),i==="false"&&(t[d]=!1),i==="true"&&(t[d]=!0),isNaN(i)||(t[d]=parseInt(i,10))}})}return{formatName:e,formatOptions:t}},ct=s=>{const e={};return(t,r,n)=>{let o=n;n&&n.interpolationkey&&n.formatParams&&n.formatParams[n.interpolationkey]&&n[n.interpolationkey]&&(o={...o,[n.interpolationkey]:void 0});const a=r+JSON.stringify(o);let c=e[a];return c||(c=s(ue(r),n),e[a]=c),c(t)}},Fs=s=>(e,t,r)=>s(ue(t),r)(e);class Hs{constructor(e={}){this.logger=J.create("formatter"),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||",";const r=t.cacheInBuiltFormats?ct:Fs;this.formats={number:r((n,o)=>{const a=new Intl.NumberFormat(n,{...o});return c=>a.format(c)}),currency:r((n,o)=>{const a=new Intl.NumberFormat(n,{...o,style:"currency"});return c=>a.format(c)}),datetime:r((n,o)=>{const a=new Intl.DateTimeFormat(n,{...o});return c=>a.format(c)}),relativetime:r((n,o)=>{const a=new Intl.RelativeTimeFormat(n,{...o});return c=>a.format(c,o.range||"day")}),list:r((n,o)=>{const a=new Intl.ListFormat(n,{...o});return c=>a.format(c)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=ct(t)}format(e,t,r,n={}){const o=t.split(this.formatSeparator);if(o.length>1&&o[0].indexOf("(")>1&&o[0].indexOf(")")<0&&o.find(c=>c.indexOf(")")>-1)){const c=o.findIndex(l=>l.indexOf(")")>-1);o[0]=[o[0],...o.splice(1,c)].join(this.formatSeparator)}return o.reduce((c,l)=>{const{formatName:i,formatOptions:d}=Vs(l);if(this.formats[i]){let u=c;try{const p=n?.formatParams?.[n.interpolationkey]||{},h=p.locale||p.lng||n.locale||n.lng||r;u=this.formats[i](c,h,{...d,...n,...p})}catch(p){this.logger.warn(p)}return u}else this.logger.warn(`there was no format function for ${i}`);return c},e)}}const Ds=(s,e)=>{s.pending[e]!==void 0&&(delete s.pending[e],s.pendingCount--)};class Us extends Ce{constructor(e,t,r,n={}){super(),this.backend=e,this.store=t,this.services=r,this.languageUtils=r.languageUtils,this.options=n,this.logger=J.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=n.maxParallelReads||10,this.readingCalls=0,this.maxRetries=n.maxRetries>=0?n.maxRetries:5,this.retryTimeout=n.retryTimeout>=1?n.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(r,n.backend,n)}queueLoad(e,t,r,n){const o={},a={},c={},l={};return e.forEach(i=>{let d=!0;t.forEach(u=>{const p=`${i}|${u}`;!r.reload&&this.store.hasResourceBundle(i,u)?this.state[p]=2:this.state[p]<0||(this.state[p]===1?a[p]===void 0&&(a[p]=!0):(this.state[p]=1,d=!1,a[p]===void 0&&(a[p]=!0),o[p]===void 0&&(o[p]=!0),l[u]===void 0&&(l[u]=!0)))}),d||(c[i]=!0)}),(Object.keys(o).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:n}),{toLoad:Object.keys(o),pending:Object.keys(a),toLoadLanguages:Object.keys(c),toLoadNamespaces:Object.keys(l)}}loaded(e,t,r){const n=e.split("|"),o=n[0],a=n[1];t&&this.emit("failedLoading",o,a,t),!t&&r&&this.store.addResourceBundle(o,a,r,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&r&&(this.state[e]=0);const c={};this.queue.forEach(l=>{Ns(l.loaded,[o],a),Ds(l,e),t&&l.errors.push(t),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(i=>{c[i]||(c[i]={});const d=l.loaded[i];d.length&&d.forEach(u=>{c[i][u]===void 0&&(c[i][u]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",c),this.queue=this.queue.filter(l=>!l.done)}read(e,t,r,n=0,o=this.retryTimeout,a){if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:r,tried:n,wait:o,callback:a});return}this.readingCalls++;const c=(i,d)=>{if(this.readingCalls--,this.waitingReads.length>0){const u=this.waitingReads.shift();this.read(u.lng,u.ns,u.fcName,u.tried,u.wait,u.callback)}if(i&&d&&n{this.read.call(this,e,t,r,n+1,o*2,a)},o);return}a(i,d)},l=this.backend[r].bind(this.backend);if(l.length===2){try{const i=l(e,t);i&&typeof i.then=="function"?i.then(d=>c(null,d)).catch(c):c(null,i)}catch(i){c(i)}return}return l(e,t,c)}prepareLoading(e,t,r={},n){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),n&&n();S(e)&&(e=this.languageUtils.toResolveHierarchy(e)),S(t)&&(t=[t]);const o=this.queueLoad(e,t,r,n);if(!o.toLoad.length)return o.pending.length||n(),null;o.toLoad.forEach(a=>{this.loadOne(a)})}load(e,t,r){this.prepareLoading(e,t,{},r)}reload(e,t,r){this.prepareLoading(e,t,{reload:!0},r)}loadOne(e,t=""){const r=e.split("|"),n=r[0],o=r[1];this.read(n,o,"read",void 0,void 0,(a,c)=>{a&&this.logger.warn(`${t}loading namespace ${o} for language ${n} failed`,a),!a&&c&&this.logger.log(`${t}loaded namespace ${o} for language ${n}`,c),this.loaded(e,a,c)})}saveMissing(e,t,r,n,o,a={},c=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${r}" as the namespace "${t}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(r==null||r==="")){if(this.backend?.create){const l={...a,isUpdate:o},i=this.backend.create.bind(this.backend);if(i.length<6)try{let d;i.length===5?d=i(e,t,r,n,l):d=i(e,t,r,n),d&&typeof d.then=="function"?d.then(u=>c(null,u)).catch(c):c(null,d)}catch(d){c(d)}else i(e,t,r,n,c,l)}!e||!e[0]||this.store.addResource(e[0],t,r,n)}}}const dt=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:s=>{let e={};if(typeof s[1]=="object"&&(e=s[1]),S(s[1])&&(e.defaultValue=s[1]),S(s[2])&&(e.tDescription=s[2]),typeof s[2]=="object"||typeof s[3]=="object"){const t=s[3]||s[2];Object.keys(t).forEach(r=>{e[r]=t[r]})}return e},interpolation:{escapeValue:!0,format:s=>s,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),ut=s=>(S(s.ns)&&(s.ns=[s.ns]),S(s.fallbackLng)&&(s.fallbackLng=[s.fallbackLng]),S(s.fallbackNS)&&(s.fallbackNS=[s.fallbackNS]),s.supportedLngs?.indexOf?.("cimode")<0&&(s.supportedLngs=s.supportedLngs.concat(["cimode"])),typeof s.initImmediate=="boolean"&&(s.initAsync=s.initImmediate),s),ve=()=>{},Ks=s=>{Object.getOwnPropertyNames(Object.getPrototypeOf(s)).forEach(t=>{typeof s[t]=="function"&&(s[t]=s[t].bind(s))})};class he extends Ce{constructor(e={},t){if(super(),this.options=ut(e),this.services={},this.logger=J,this.modules={external:[]},Ks(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},t){this.isInitializing=!0,typeof e=="function"&&(t=e,e={}),e.defaultNS==null&&e.ns&&(S(e.ns)?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const r=dt();this.options={...r,...this.options,...ut(e)},this.options.interpolation={...r.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator);const n=i=>i?typeof i=="function"?new i:i:null;if(!this.options.isClone){this.modules.logger?J.init(n(this.modules.logger),this.options):J.init(null,this.options);let i;this.modules.formatter?i=this.modules.formatter:i=Hs;const d=new ot(this.options);this.store=new st(this.options.resources,this.options);const u=this.services;u.logger=J,u.resourceStore=this.store,u.languageUtils=d,u.pluralResolver=new Ts(d,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==r.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),i&&(!this.options.interpolation.format||this.options.interpolation.format===r.interpolation.format)&&(u.formatter=n(i),u.formatter.init&&u.formatter.init(u,this.options),this.options.interpolation.format=u.formatter.format.bind(u.formatter)),u.interpolator=new js(this.options),u.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},u.backendConnector=new Us(n(this.modules.backend),u.resourceStore,u,this.options),u.backendConnector.on("*",(h,...f)=>{this.emit(h,...f)}),this.modules.languageDetector&&(u.languageDetector=n(this.modules.languageDetector),u.languageDetector.init&&u.languageDetector.init(u,this.options.detection,this.options)),this.modules.i18nFormat&&(u.i18nFormat=n(this.modules.i18nFormat),u.i18nFormat.init&&u.i18nFormat.init(this)),this.translator=new Oe(this.services,this.options),this.translator.on("*",(h,...f)=>{this.emit(h,...f)}),this.modules.external.forEach(h=>{h.init&&h.init(this)})}if(this.format=this.options.interpolation.format,t||(t=ve),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const i=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);i.length>0&&i[0]!=="dev"&&(this.options.lng=i[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(i=>{this[i]=(...d)=>this.store[i](...d)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(i=>{this[i]=(...d)=>(this.store[i](...d),this)});const c=le(),l=()=>{const i=(d,u)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),c.resolve(u),t(d,u)};if(this.languages&&!this.isInitialized)return i(null,this.t.bind(this));this.changeLanguage(this.options.lng,i)};return this.options.resources||!this.options.initAsync?l():setTimeout(l,0),c}loadResources(e,t=ve){let r=t;const n=S(e)?e:this.language;if(typeof e=="function"&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(n?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return r();const o=[],a=c=>{if(!c||c==="cimode")return;this.services.languageUtils.toResolveHierarchy(c).forEach(i=>{i!=="cimode"&&o.indexOf(i)<0&&o.push(i)})};n?a(n):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>a(l)),this.options.preload?.forEach?.(c=>a(c)),this.services.backendConnector.load(o,this.options.ns,c=>{!c&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(c)})}else r(null)}reloadResources(e,t,r){const n=le();return typeof e=="function"&&(r=e,e=void 0),typeof t=="function"&&(r=t,t=void 0),e||(e=this.languages),t||(t=this.options.ns),r||(r=ve),this.services.backendConnector.reload(e,t,o=>{n.resolve(),r(o)}),n}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&$t.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1)){for(let t=0;t-1)&&this.store.hasLanguageSomeTranslations(r)){this.resolvedLanguage=r;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,t){this.isLanguageChangingTo=e;const r=le();this.emit("languageChanging",e);const n=c=>{this.language=c,this.languages=this.services.languageUtils.toResolveHierarchy(c),this.resolvedLanguage=void 0,this.setResolvedLanguage(c)},o=(c,l)=>{l?this.isLanguageChangingTo===e&&(n(l),this.translator.changeLanguage(l),this.isLanguageChangingTo=void 0,this.emit("languageChanged",l),this.logger.log("languageChanged",l)):this.isLanguageChangingTo=void 0,r.resolve((...i)=>this.t(...i)),t&&t(c,(...i)=>this.t(...i))},a=c=>{!e&&!c&&this.services.languageDetector&&(c=[]);const l=S(c)?c:c&&c[0],i=this.store.hasLanguageSomeTranslations(l)?l:this.services.languageUtils.getBestMatchFromCodes(S(c)?[c]:c);i&&(this.language||n(i),this.translator.language||this.translator.changeLanguage(i),this.services.languageDetector?.cacheUserLanguage?.(i)),this.loadResources(i,d=>{o(d,i)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?a(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(e),r}getFixedT(e,t,r){const n=(o,a,...c)=>{let l;typeof a!="object"?l=this.options.overloadTranslationOptionHandler([o,a].concat(c)):l={...a},l.lng=l.lng||n.lng,l.lngs=l.lngs||n.lngs,l.ns=l.ns||n.ns,l.keyPrefix!==""&&(l.keyPrefix=l.keyPrefix||r||n.keyPrefix);const i=this.options.keySeparator||".";let d;return l.keyPrefix&&Array.isArray(o)?d=o.map(u=>(typeof u=="function"&&(u=Ae(u,{...this.options,...a})),`${l.keyPrefix}${i}${u}`)):(typeof o=="function"&&(o=Ae(o,{...this.options,...a})),d=l.keyPrefix?`${l.keyPrefix}${i}${o}`:o),this.t(d,l)};return S(e)?n.lng=e:n.lngs=e,n.ns=t,n.keyPrefix=r,n}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const r=t.lng||this.resolvedLanguage||this.languages[0],n=this.options?this.options.fallbackLng:!1,o=this.languages[this.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const a=(c,l)=>{const i=this.services.backendConnector.state[`${c}|${l}`];return i===-1||i===0||i===2};if(t.precheck){const c=t.precheck(this,a);if(c!==void 0)return c}return!!(this.hasResourceBundle(r,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(r,e)&&(!n||a(o,e)))}loadNamespaces(e,t){const r=le();return this.options.ns?(S(e)&&(e=[e]),e.forEach(n=>{this.options.ns.indexOf(n)<0&&this.options.ns.push(n)}),this.loadResources(n=>{r.resolve(),t&&t(n)}),r):(t&&t(),Promise.resolve())}loadLanguages(e,t){const r=le();S(e)&&(e=[e]);const n=this.options.preload||[],o=e.filter(a=>n.indexOf(a)<0&&this.services.languageUtils.isSupportedCode(a));return o.length?(this.options.preload=n.concat(o),this.loadResources(a=>{r.resolve(),t&&t(a)}),r):(t&&t(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const n=new Intl.Locale(e);if(n&&n.getTextInfo){const o=n.getTextInfo();if(o&&o.direction)return o.direction}}catch{}const t=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],r=this.services?.languageUtils||new ot(dt());return e.toLowerCase().indexOf("-latn")>1?"ltr":t.indexOf(r.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},t){return new he(e,t)}cloneInstance(e={},t=ve){const r=e.forkResourceStore;r&&delete e.forkResourceStore;const n={...this.options,...e,isClone:!0},o=new he(n);if((e.debug!==void 0||e.prefix!==void 0)&&(o.logger=o.logger.clone(e)),["store","services","language"].forEach(c=>{o[c]=this[c]}),o.services={...this.services},o.services.utils={hasLoadedNamespace:o.hasLoadedNamespace.bind(o)},r){const c=Object.keys(this.store.data).reduce((l,i)=>(l[i]={...this.store.data[i]},l[i]=Object.keys(l[i]).reduce((d,u)=>(d[u]={...l[i][u]},d),l[i]),l),{});o.store=new st(c,n),o.services.resourceStore=o.store}return o.translator=new Oe(o.services,n),o.translator.on("*",(c,...l)=>{o.emit(c,...l)}),o.init(n,t),o.translator.options=n,o.translator.backendConnector.services.utils={hasLoadedNamespace:o.hasLoadedNamespace.bind(o)},o}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const B=he.createInstance();B.createInstance=he.createInstance;B.createInstance;B.dir;B.init;B.loadResources;B.reloadResources;B.use;B.changeLanguage;B.getFixedT;const Tn=B.t;B.exists;B.setDefaultNamespace;B.hasLoadedNamespace;B.loadNamespaces;B.loadLanguages;const Bs=(s,e,t,r)=>{const n=[t,{code:e,...r||{}}];if(s?.services?.logger?.forward)return s.services.logger.forward(n,"warn","react-i18next::",!0);te(n[0])&&(n[0]=`react-i18next:: ${n[0]}`),s?.services?.logger?.warn?s.services.logger.warn(...n):console?.warn&&console.warn(...n)},ht={},Te=(s,e,t,r)=>{te(t)&&ht[t]||(te(t)&&(ht[t]=new Date),Bs(s,e,t,r))},Pt=(s,e)=>()=>{if(s.isInitialized)e();else{const t=()=>{setTimeout(()=>{s.off("initialized",t)},0),e()};s.on("initialized",t)}},je=(s,e,t)=>{s.loadNamespaces(e,Pt(s,t))},ft=(s,e,t,r)=>{if(te(t)&&(t=[t]),s.options.preload&&s.options.preload.indexOf(e)>-1)return je(s,t,r);t.forEach(n=>{s.options.ns.indexOf(n)<0&&s.options.ns.push(n)}),s.loadLanguages(e,Pt(s,r))},Gs=(s,e,t={})=>!e.languages||!e.languages.length?(Te(e,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:e.languages}),!0):e.hasLoadedNamespace(s,{lng:t.lng,precheck:(r,n)=>{if(t.bindI18n&&t.bindI18n.indexOf("languageChanging")>-1&&r.services.backendConnector.backend&&r.isLanguageChangingTo&&!n(r.isLanguageChangingTo,s))return!1}}),te=s=>typeof s=="string",qs=s=>typeof s=="object"&&s!==null,Ws=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,Js={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},Ys=s=>Js[s],Zs=s=>s.replace(Ws,Ys);let Ve={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:Zs};const Qs=(s={})=>{Ve={...Ve,...s}},Xs=()=>Ve;let Et;const er=s=>{Et=s},tr=()=>Et,jn={type:"3rdParty",init(s){Qs(s.options.react),er(s)}},sr=w.createContext();class rr{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(t=>{this.usedNamespaces[t]||(this.usedNamespaces[t]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}const nr=(s,e)=>{const t=w.useRef();return w.useEffect(()=>{t.current=s},[s,e]),t.current},It=(s,e,t,r)=>s.getFixedT(e,t,r),or=(s,e,t,r)=>w.useCallback(It(s,e,t,r),[s,e,t,r]),Vn=(s,e={})=>{const{i18n:t}=e,{i18n:r,defaultNS:n}=w.useContext(sr)||{},o=t||r||tr();if(o&&!o.reportNamespaces&&(o.reportNamespaces=new rr),!o){Te(o,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const O=(z,_)=>te(_)?_:qs(_)&&te(_.defaultValue)?_.defaultValue:Array.isArray(z)?z[z.length-1]:z,L=[O,{},!1];return L.t=O,L.i18n={},L.ready=!1,L}o.options.react?.wait&&Te(o,"DEPRECATED_OPTION","useTranslation: It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const a={...Xs(),...o.options.react,...e},{useSuspense:c,keyPrefix:l}=a;let i=n||o.options?.defaultNS;i=te(i)?[i]:i||["translation"],o.reportNamespaces.addUsedNamespaces?.(i);const d=(o.isInitialized||o.initializedStoreOnce)&&i.every(O=>Gs(O,o,a)),u=or(o,e.lng||null,a.nsMode==="fallback"?i:i[0],l),p=()=>u,h=()=>It(o,e.lng||null,a.nsMode==="fallback"?i:i[0],l),[f,b]=w.useState(p);let x=i.join();e.lng&&(x=`${e.lng}${x}`);const C=nr(x),N=w.useRef(!0);w.useEffect(()=>{const{bindI18n:O,bindI18nStore:L}=a;N.current=!0,!d&&!c&&(e.lng?ft(o,e.lng,i,()=>{N.current&&b(h)}):je(o,i,()=>{N.current&&b(h)})),d&&C&&C!==x&&N.current&&b(h);const z=()=>{N.current&&b(h)};return O&&o?.on(O,z),L&&o?.store.on(L,z),()=>{N.current=!1,o&&O&&O?.split(" ").forEach(_=>o.off(_,z)),L&&o&&L.split(" ").forEach(_=>o.store.off(_,z))}},[o,x]),w.useEffect(()=>{N.current&&d&&b(p)},[o,l,d]);const E=[f,o,d];if(E.t=f,E.i18n=o,E.ready=d,d||!d&&!c)return E;throw new Promise(O=>{e.lng?ft(o,e.lng,i,()=>O()):je(o,i,()=>O())})};/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ir=s=>s.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),ar=s=>s.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase()),pt=s=>{const e=ar(s);return e.charAt(0).toUpperCase()+e.slice(1)},At=(...s)=>s.filter((e,t,r)=>!!e&&e.trim()!==""&&r.indexOf(e)===t).join(" ").trim(),lr=s=>{for(const e in s)if(e.startsWith("aria-")||e==="role"||e==="title")return!0};/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var cr={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const dr=w.forwardRef(({color:s="currentColor",size:e=24,strokeWidth:t=2,absoluteStrokeWidth:r,className:n="",children:o,iconNode:a,...c},l)=>w.createElement("svg",{ref:l,...cr,width:e,height:e,stroke:s,strokeWidth:r?Number(t)*24/Number(e):t,className:At("lucide",n),...!o&&!lr(c)&&{"aria-hidden":"true"},...c},[...a.map(([i,d])=>w.createElement(i,d)),...Array.isArray(o)?o:[o]]));/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const y=(s,e)=>{const t=w.forwardRef(({className:r,...n},o)=>w.createElement(dr,{ref:o,iconNode:e,className:At(`lucide-${ir(pt(s))}`,`lucide-${s}`,r),...n}));return t.displayName=pt(s),t};/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ur=[["path",{d:"M10 2v5.632c0 .424-.272.795-.653.982A6 6 0 0 0 6 14c.006 4 3 7 5 8",key:"1h8rid"}],["path",{d:"M10 5H8a2 2 0 0 0 0 4h.68",key:"3ezsi6"}],["path",{d:"M14 2v5.632c0 .424.272.795.652.982A6 6 0 0 1 18 14c0 4-3 7-5 8",key:"yt6q09"}],["path",{d:"M14 5h2a2 2 0 0 1 0 4h-.68",key:"8f95yk"}],["path",{d:"M18 22H6",key:"mg6kv4"}],["path",{d:"M9 2h6",key:"1jrp98"}]],Fn=y("amphora",ur);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const hr=[["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",key:"izxlao"}],["path",{d:"M10 4v4",key:"pp8u80"}],["path",{d:"M2 8h20",key:"d11cs7"}],["path",{d:"M6 4v4",key:"1svtjw"}]],Hn=y("app-window",hr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const fr=[["path",{d:"M9 13a1 1 0 0 0-1-1H5.061a1 1 0 0 1-.75-1.811l6.836-6.835a1.207 1.207 0 0 1 1.707 0l6.835 6.835a1 1 0 0 1-.75 1.811H16a1 1 0 0 0-1 1v2a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1z",key:"pnzqmc"}],["path",{d:"M9 20h6",key:"s66wpe"}]],Dn=y("arrow-big-up-dash",fr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const pr=[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]],Un=y("arrow-down",pr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const gr=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],Kn=y("arrow-left",gr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const mr=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],Bn=y("arrow-right",mr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const yr=[["path",{d:"m18 9-6-6-6 6",key:"kcunyi"}],["path",{d:"M12 3v14",key:"7cf3v8"}],["path",{d:"M5 21h14",key:"11awu3"}]],Gn=y("arrow-up-from-line",yr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const br=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],qn=y("arrow-up",br);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xr=[["path",{d:"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",key:"3c2336"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["line",{x1:"12",x2:"12.01",y1:"17",y2:"17",key:"io3f8k"}]],Wn=y("badge-question-mark",xr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const kr=[["path",{d:"M4.929 4.929 19.07 19.071",key:"196cmz"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],Jn=y("ban",kr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const vr=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M16 12h2",key:"7q9ll5"}],["path",{d:"M16 8h2",key:"msurwy"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}],["path",{d:"M6 12h2",key:"32wvfc"}],["path",{d:"M6 8h2",key:"30oboj"}]],Yn=y("book-open-text",vr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const wr=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],Zn=y("book-open",wr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Sr=[["path",{d:"m16 22-1-4",key:"1ow2iv"}],["path",{d:"M19 13.99a1 1 0 0 0 1-1V12a2 2 0 0 0-2-2h-3a1 1 0 0 1-1-1V4a2 2 0 0 0-4 0v5a1 1 0 0 1-1 1H6a2 2 0 0 0-2 2v.99a1 1 0 0 0 1 1",key:"iw8jdu"}],["path",{d:"M5 14h14l1.973 6.767A1 1 0 0 1 20 22H4a1 1 0 0 1-.973-1.233z",key:"1soew8"}],["path",{d:"m8 22 1-4",key:"s3unb"}]],Qn=y("brush-cleaning",Sr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Or=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Xn=y("check",Or);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Cr=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],eo=y("chevron-down",Cr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Mr=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],to=y("chevron-left",Mr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Nr=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],so=y("chevron-right",Nr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Lr=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],ro=y("chevron-up",Lr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Rr=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],no=y("circle-check",Rr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _r=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}]],oo=y("circle-minus",_r);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $r=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],io=y("circle-x",$r);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const zr=[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]],ao=y("cloud",zr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Pr=[["path",{d:"M10 2v2",key:"7u0qdc"}],["path",{d:"M14 2v2",key:"6buw04"}],["path",{d:"M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1",key:"pwadti"}],["path",{d:"M6 2v2",key:"colzsn"}]],lo=y("coffee",Pr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Er=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]],co=y("database",Er);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ir=[["rect",{width:"12",height:"12",x:"2",y:"10",rx:"2",ry:"2",key:"6agr2n"}],["path",{d:"m17.92 14 3.5-3.5a2.24 2.24 0 0 0 0-3l-5-4.92a2.24 2.24 0 0 0-3 0L10 6",key:"1o487t"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"M10 14h.01",key:"ssrbsk"}],["path",{d:"M15 6h.01",key:"cblpky"}],["path",{d:"M18 9h.01",key:"2061c0"}]],uo=y("dices",Ir);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ar=[["path",{d:"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"1pf5j1"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"m5 12-3 3 3 3",key:"oke12k"}],["path",{d:"m9 18 3-3-3-3",key:"112psh"}]],ho=y("file-code-2",Ar);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Tr=[["path",{d:"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"1pf5j1"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M3 15h6",key:"4e2qda"}],["path",{d:"M6 12v6",key:"1u72j0"}]],fo=y("file-plus-2",Tr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const jr=[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"m15 15-3-3-3 3",key:"15xj92"}]],po=y("file-up",jr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Vr=[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]],go=y("git-branch",Vr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Fr=[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]],mo=y("hard-drive",Fr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Hr=[["path",{d:"M5 22h14",key:"ehvnwv"}],["path",{d:"M5 2h14",key:"pdyrp9"}],["path",{d:"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22",key:"1d314k"}],["path",{d:"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2",key:"1vvvr6"}]],yo=y("hourglass",Hr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Dr=[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"1d0kgt"}]],bo=y("house",Dr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ur=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],xo=y("info",Ur);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Kr=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],ko=y("key-round",Kr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Br=[["path",{d:"m3 17 2 2 4-4",key:"1jhpwq"}],["path",{d:"m3 7 2 2 4-4",key:"1obspn"}],["path",{d:"M13 6h8",key:"15sg57"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 18h8",key:"oe0vm4"}]],vo=y("list-checks",Br);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Gr=[["path",{d:"M16 12H3",key:"1a2rj7"}],["path",{d:"M16 6H3",key:"1wxfjs"}],["path",{d:"M10 18H3",key:"13769t"}],["path",{d:"M21 6v10a2 2 0 0 1-2 2h-5",key:"ilrcs8"}],["path",{d:"m16 16-2 2 2 2",key:"kkc6pm"}]],wo=y("list-end",Gr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qr=[["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 18h.01",key:"1tta3j"}],["path",{d:"M3 6h.01",key:"1rqtza"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 18h13",key:"1lx6n3"}],["path",{d:"M8 6h13",key:"ik3vkj"}]],So=y("list",qr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Wr=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],Oo=y("loader-circle",Wr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Jr=[["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 18h8",key:"oe0vm4"}],["path",{d:"M13 6h8",key:"15sg57"}],["path",{d:"M3 12h1",key:"lp3yf2"}],["path",{d:"M3 18h1",key:"1eiwyy"}],["path",{d:"M3 6h1",key:"rgxa97"}],["path",{d:"M8 12h1",key:"1con00"}],["path",{d:"M8 18h1",key:"13wk12"}],["path",{d:"M8 6h1",key:"tn6mkg"}]],Co=y("logs",Jr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Yr=[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]],Mo=y("map",Yr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Zr=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],No=y("pencil",Zr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Qr=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]],Lo=y("play",Qr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Xr=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],Ro=y("plus",Xr);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const en=[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]],_o=y("refresh-ccw",en);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const tn=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],$o=y("refresh-cw",tn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const sn=[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]],zo=y("scroll-text",sn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const rn=[["path",{d:"m13 13.5 2-2.5-2-2.5",key:"1rvxrh"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}],["path",{d:"M9 8.5 7 11l2 2.5",key:"6ffwbx"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Po=y("search-code",rn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const nn=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Eo=y("search",nn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const on=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],Io=y("server",on);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const an=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Ao=y("settings-2",an);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ln=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],To=y("settings",ln);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const cn=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],jo=y("shield",cn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const dn=[["circle",{cx:"8",cy:"21",r:"1",key:"jimo8o"}],["circle",{cx:"19",cy:"21",r:"1",key:"13723u"}],["path",{d:"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12",key:"9zh506"}]],Vo=y("shopping-cart",dn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const un=[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]],Fo=y("sliders-horizontal",un);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const hn=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],Ho=y("square",hn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const fn=[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}]],Do=y("sword",fn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const pn=[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}],["polyline",{points:"14.5 6.5 18 3 21 3 21 6 17.5 9.5",key:"hbey2j"}],["line",{x1:"5",x2:"9",y1:"14",y2:"18",key:"1hf58s"}],["line",{x1:"7",x2:"4",y1:"17",y2:"20",key:"pidxm4"}],["line",{x1:"3",x2:"5",y1:"19",y2:"21",key:"1pehsh"}]],Uo=y("swords",pn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const gn=[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]],Ko=y("tag",gn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const mn=[["path",{d:"M14.5 2v17.5c0 1.4-1.1 2.5-2.5 2.5c-1.4 0-2.5-1.1-2.5-2.5V2",key:"125lnx"}],["path",{d:"M8.5 2h7",key:"csnxdl"}],["path",{d:"M14.5 16h-5",key:"1ox875"}]],Bo=y("test-tube",mn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const yn=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],Go=y("trash-2",yn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const bn=[["circle",{cx:"10",cy:"7",r:"4",key:"e45bow"}],["path",{d:"M10.3 15H7a4 4 0 0 0-4 4v2",key:"3bnktk"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["path",{d:"m21 21-1.9-1.9",key:"1g2n9r"}]],qo=y("user-search",bn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xn=[["path",{d:"M18 21a8 8 0 0 0-16 0",key:"3ypg7q"}],["circle",{cx:"10",cy:"8",r:"5",key:"o932ke"}],["path",{d:"M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3",key:"10s06x"}]],Wo=y("users-round",xn);/** - * @license lucide-react v0.542.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const kn=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Jo=y("x",kn),fe=typeof window<"u"?w.useLayoutEffect:w.useEffect;function gt(s){if(s!==void 0)switch(typeof s){case"number":return s;case"string":{if(s.endsWith("px"))return parseFloat(s);break}}}function vn({box:s,defaultHeight:e,defaultWidth:t,disabled:r,element:n,mode:o,style:a}){const{styleHeight:c,styleWidth:l}=w.useMemo(()=>({styleHeight:gt(a?.height),styleWidth:gt(a?.width)}),[a?.height,a?.width]),[i,d]=w.useState({height:e,width:t}),u=r||c!==void 0||o==="only-width"||c!==void 0&&l!==void 0;return fe(()=>{if(n===null||u)return;const p=new ResizeObserver(h=>{for(const f of h){const{contentRect:b,target:x}=f;n===x&&d(C=>C.height===b.height&&C.width===b.width?C:{height:b.height,width:b.width})}});return p.observe(n,{box:s}),()=>{p?.unobserve(n)}},[s,u,n,c,l]),w.useMemo(()=>({height:c??i.height,width:l??i.width}),[i,c,l])}function Tt(s){const e=w.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return fe(()=>{e.current=s},[s]),w.useCallback(t=>e.current?.(t),[e])}function $e({containerElement:s,direction:e,isRtl:t,scrollOffset:r}){return r}function Z(s,e="Assertion error"){if(!s)throw console.error(e),Error(e)}function de(s,e){if(s===e)return!0;if(!!s!=!!e||(Z(s!==void 0),Z(e!==void 0),Object.keys(s).length!==Object.keys(e).length))return!1;for(const t in s)if(!Object.is(e[t],s[t]))return!1;return!0}function jt({cachedBounds:s,itemCount:e,itemSize:t}){if(e===0)return 0;if(typeof t=="number")return e*t;{const r=s.get(s.size===0?0:s.size-1);Z(r!==void 0,"Unexpected bounds cache miss");const n=(r.scrollOffset+r.size)/s.size;return e*n}}function wn({align:s,cachedBounds:e,index:t,itemCount:r,itemSize:n,containerScrollOffset:o,containerSize:a}){const c=jt({cachedBounds:e,itemCount:r,itemSize:n}),l=e.get(t),i=Math.max(0,Math.min(c-a,l.scrollOffset)),d=Math.max(0,l.scrollOffset-a+l.size);switch(s==="smart"&&(o>=d&&o<=i?s="auto":s="center"),s){case"start":return i;case"end":return d;case"center":return l.scrollOffset<=a/2?0:l.scrollOffset+l.size/2>=c-a/2?c-a:l.scrollOffset+l.size/2-a/2;case"auto":default:return o>=d&&o<=i?o:oe)break;d++}for(a=d,l=Math.max(0,a-n);d=e+t)break;d++}return c=Math.min(o,d),i=Math.min(r-1,c+n),a<0&&(a=0,c=-1,l=0,i=-1),{startIndexVisible:a,stopIndexVisible:c,startIndexOverscan:l,stopIndexOverscan:i}}function Sn({itemCount:s,itemProps:e,itemSize:t}){const r=new Map;return{get(n){for(Z(nSn({itemCount:s,itemProps:e,itemSize:t}),[s,e,t])}function Cn({containerSize:s,itemSize:e}){let t;switch(typeof e){case"string":{Z(e.endsWith("%"),`Invalid item size: "${e}"; string values must be percentages (e.g. "100%")`),Z(s!==void 0,"Container size must be defined if a percentage item size is specified"),t=s*parseInt(e)/100;break}default:{t=e;break}}return t}function Mn({containerElement:s,containerStyle:e,defaultContainerSize:t=0,direction:r,isRtl:n=!1,itemCount:o,itemProps:a,itemSize:c,onResize:l,overscanCount:i}){const[d,u]=w.useState({startIndexVisible:0,startIndexOverscan:0,stopIndexVisible:-1,stopIndexOverscan:-1}),{startIndexVisible:p,startIndexOverscan:h,stopIndexVisible:f,stopIndexOverscan:b}={startIndexVisible:Math.min(o-1,d.startIndexVisible),startIndexOverscan:Math.min(o-1,d.startIndexOverscan),stopIndexVisible:Math.min(o-1,d.stopIndexVisible),stopIndexOverscan:Math.min(o-1,d.stopIndexOverscan)},{height:x=t,width:C=t}=vn({defaultHeight:t,defaultWidth:void 0,element:s,mode:"only-height",style:e}),N=w.useRef({height:0,width:0}),E=x,O=Cn({containerSize:E,itemSize:c});w.useLayoutEffect(()=>{if(typeof l=="function"){const R=N.current;(R.height!==x||R.width!==C)&&(l({height:x,width:C},{...R}),R.height=x,R.width=C)}},[x,l,C]);const L=On({itemCount:o,itemProps:a,itemSize:O}),z=w.useCallback(R=>L.get(R),[L]),_=w.useCallback(()=>jt({cachedBounds:L,itemCount:o,itemSize:O}),[L,o,O]),v=w.useCallback(R=>{const G=$e({containerElement:s,direction:r,isRtl:n,scrollOffset:R});return mt({cachedBounds:L,containerScrollOffset:G,containerSize:E,itemCount:o,overscanCount:i})},[L,s,E,r,n,o,i]);fe(()=>{const R=s?.scrollTop??0;u(v(R))},[s,r,v]),fe(()=>{if(!s)return;const R=()=>{u(G=>{const{scrollLeft:q,scrollTop:P}=s,$=$e({containerElement:s,direction:r,isRtl:n,scrollOffset:P}),j=mt({cachedBounds:L,containerScrollOffset:$,containerSize:E,itemCount:o,overscanCount:i});return de(j,G)?G:j})};return s.addEventListener("scroll",R),()=>{s.removeEventListener("scroll",R)}},[L,s,E,r,o,i]);const I=Tt(({align:R="auto",containerScrollOffset:G,index:q})=>{let P=wn({align:R,cachedBounds:L,containerScrollOffset:G,containerSize:E,index:q,itemCount:o,itemSize:O});if(s){if(P=$e({containerElement:s,direction:r,isRtl:n,scrollOffset:P}),typeof s.scrollTo!="function"){const $=v(P);de(d,$)||u($)}return P}});return{getCellBounds:z,getEstimatedSize:_,scrollToIndex:I,startIndexOverscan:h,startIndexVisible:p,stopIndexOverscan:b,stopIndexVisible:f}}function Nn(s){return w.useMemo(()=>s,Object.values(s))}function Ln(s,e){const{ariaAttributes:t,style:r,...n}=s,{ariaAttributes:o,style:a,...c}=e;return de(t,o)&&de(r,a)&&de(n,c)}function Rn(s){return s!=null&&typeof s=="object"&&"getAverageRowHeight"in s&&typeof s.getAverageRowHeight=="function"}const Fe="data-react-window-index";function Yo({children:s,className:e,defaultHeight:t=0,listRef:r,onResize:n,onRowsRendered:o,overscanCount:a=3,rowComponent:c,rowCount:l,rowHeight:i,rowProps:d,tagName:u="div",style:p,...h}){const f=Nn(d),b=w.useMemo(()=>w.memo(c,Ln),[c]),[x,C]=w.useState(null),N=Rn(i),E=w.useMemo(()=>N?P=>i.getRowHeight(P)??i.getAverageRowHeight():i,[N,i]),{getCellBounds:O,getEstimatedSize:L,scrollToIndex:z,startIndexOverscan:_,startIndexVisible:v,stopIndexOverscan:I,stopIndexVisible:R}=Mn({containerElement:x,containerStyle:p,defaultContainerSize:t,direction:"vertical",itemCount:l,itemProps:f,itemSize:E,onResize:n,overscanCount:a});w.useImperativeHandle(r,()=>({get element(){return x},scrollToRow({align:P="auto",behavior:$="auto",index:j}){const A=z({align:P,containerScrollOffset:x?.scrollTop??0,index:j});typeof x?.scrollTo=="function"&&x.scrollTo({behavior:$,top:A})}}),[x,z]),fe(()=>{if(!x)return;const P=Array.from(x.children).filter(($,j)=>{if($.hasAttribute("aria-hidden"))return!1;const A=`${_+j}`;return $.setAttribute(Fe,A),!0});if(N)return i.observeRowElements(P)},[x,N,i,_,I]),w.useEffect(()=>{_>=0&&I>=0&&o&&o({startIndex:v,stopIndex:R},{startIndex:_,stopIndex:I})},[o,_,v,I,R]);const G=w.useMemo(()=>{const P=[];if(l>0)for(let $=_;$<=I;$++){const j=O($);P.push(w.createElement(b,{...f,ariaAttributes:{"aria-posinset":$+1,"aria-setsize":l,role:"listitem"},key:$,index:$,style:{position:"absolute",left:0,transform:`translateY(${j.scrollOffset}px)`,height:N?void 0:j.size,width:"100%"}}))}return P},[b,O,N,l,f,_,I]),q=Ft.jsx("div",{"aria-hidden":!0,style:{height:L(),width:"100%",zIndex:-1}});return w.createElement(u,{role:"list",...h,className:e,ref:C,style:{position:"relative",maxHeight:"100%",flexGrow:1,overflowY:"auto",...p}},G,s,q)}function Zo({defaultRowHeight:s,key:e}){const[t,r]=w.useState({key:e,map:new Map});t.key!==e&&r({key:e,map:new Map});const{map:n}=t,o=w.useCallback(()=>{let u=0;return n.forEach(p=>{u+=p}),u===0?s:u/n.size},[s,n]),a=w.useCallback(u=>n.get(u),[n]),c=w.useCallback((u,p)=>{r(h=>{if(h.map.get(u)===p)return h;const f=new Map(h.map);return f.set(u,p),{...h,map:f}})},[]),l=Tt(u=>{u.length!==0&&u.forEach(p=>{const{borderBoxSize:h,target:f}=p,b=f.getAttribute(Fe);Z(b!==null,`Invalid ${Fe} attribute value`);const x=parseInt(b),{blockSize:C}=h[0];C&&c(x,C)})}),[i]=w.useState(()=>new ResizeObserver(l));w.useEffect(()=>()=>{i.disconnect()},[i]);const d=w.useCallback(u=>(u.forEach(p=>i.observe(p)),()=>{u.forEach(p=>i.unobserve(p))}),[i]);return w.useMemo(()=>({getAverageRowHeight:o,getRowHeight:a,setRowHeight:c,observeRowElements:d}),[o,a,c,d])}const yt=s=>typeof s=="boolean"?`${s}`:s===0?"0":s,bt=Bt,Qo=(s,e)=>t=>{var r;if(e?.variants==null)return bt(s,t?.class,t?.className);const{variants:n,defaultVariants:o}=e,a=Object.keys(n).map(i=>{const d=t?.[i],u=o?.[i];if(d===null)return null;const p=yt(d)||yt(u);return n[i][p]}),c=t&&Object.entries(t).reduce((i,d)=>{let[u,p]=d;return p===void 0||(i[u]=p),i},{}),l=e==null||(r=e.compoundVariants)===null||r===void 0?void 0:r.reduce((i,d)=>{let{class:u,className:p,...h}=d;return Object.entries(h).every(f=>{let[b,x]=f;return Array.isArray(x)?x.includes({...o,...c}[b]):{...o,...c}[b]===x})?[...i,u,p]:i},[]);return bt(s,a,l,t?.class,t?.className)};var _n=(s,e,t,r,n,o,a,c)=>{let l=document.documentElement,i=["light","dark"];function d(h){(Array.isArray(s)?s:[s]).forEach(f=>{let b=f==="class",x=b&&o?n.map(C=>o[C]||C):n;b?(l.classList.remove(...x),l.classList.add(o&&o[h]?o[h]:h)):l.setAttribute(f,h)}),u(h)}function u(h){c&&i.includes(h)&&(l.style.colorScheme=h)}function p(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(r)d(r);else try{let h=localStorage.getItem(e)||t,f=a&&h==="system"?p():h;d(f)}catch{}},$n=w.createContext(void 0),zn={setTheme:s=>{},themes:[]},Xo=()=>{var s;return(s=w.useContext($n))!=null?s:zn};w.memo(({forcedTheme:s,storageKey:e,attribute:t,enableSystem:r,enableColorScheme:n,defaultTheme:o,value:a,themes:c,nonce:l,scriptProps:i})=>{let d=JSON.stringify([t,e,o,s,c,a,r,n]).slice(1,-1);return w.createElement("script",{...i,suppressHydrationWarning:!0,nonce:typeof window>"u"?l:"",dangerouslySetInnerHTML:{__html:`(${_n.toString()})(${d})`}})});export{zo as $,Dn as A,Yn as B,io as C,Bn as D,Un as E,fo as F,Kn as G,bo as H,xo as I,qn as J,Eo as K,vo as L,Jn as M,Po as N,Ao as O,No as P,Gn as Q,$o as R,Fo as S,Go as T,Wo as U,Mo as V,co as W,Jo as X,ho as Y,Io as Z,Fn as _,In as a,Do as a0,jo as a1,Qn as a2,Uo as a3,Vo as a4,uo as a5,lo as a6,B as a7,jn as a8,mo as a9,ao as aa,_o as ab,Hn as ac,go as ad,qo as ae,Bo as af,oo as ag,Zn as ah,Ko as ai,ko as aj,Xo as ak,Tn as b,Bt as c,To as d,no as e,eo as f,Xn as g,ro as h,Wn as i,to as j,so as k,Oo as l,Zo as m,Yo as n,yo as o,So as p,Ho as q,En as r,Lo as s,An as t,Vn as u,Co as v,po as w,wo as x,Ro as y,Qo as z}; diff --git a/service/dist/assets/misc-GeCjUSSS.js.br b/service/dist/assets/misc-GeCjUSSS.js.br deleted file mode 100644 index 90bfe62824fb98768261840425329ec10b31bbac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29974 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 diff --git a/service/dist/assets/motion-Dp9wOFzY.js b/service/dist/assets/motion-Dp9wOFzY.js deleted file mode 100644 index 9a2cac4f5..000000000 --- a/service/dist/assets/motion-Dp9wOFzY.js +++ /dev/null @@ -1,25 +0,0 @@ -function so(t,e){for(var n=0;ns[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}function io(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Pe={exports:{}},Ft={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Wn;function ro(){if(Wn)return Ft;Wn=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(s,i,o){var r=null;if(o!==void 0&&(r=""+o),i.key!==void 0&&(r=""+i.key),"key"in i){o={};for(var a in i)a!=="key"&&(o[a]=i[a])}else o=i;return i=o.ref,{$$typeof:t,type:s,key:r,ref:i!==void 0?i:null,props:o}}return Ft.Fragment=e,Ft.jsx=n,Ft.jsxs=n,Ft}var Kn;function oo(){return Kn||(Kn=1,Pe.exports=ro()),Pe.exports}var tt=oo(),Ae={exports:{}},D={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Hn;function ao(){if(Hn)return D;Hn=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),o=Symbol.for("react.consumer"),r=Symbol.for("react.context"),a=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),c=Symbol.for("react.memo"),l=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),d=Symbol.iterator;function p(h){return h===null||typeof h!="object"?null:(h=d&&h[d]||h["@@iterator"],typeof h=="function"?h:null)}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,T={};function y(h,g,R){this.props=h,this.context=g,this.refs=T,this.updater=R||m}y.prototype.isReactComponent={},y.prototype.setState=function(h,g){if(typeof h!="object"&&typeof h!="function"&&h!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,h,g,"setState")},y.prototype.forceUpdate=function(h){this.updater.enqueueForceUpdate(this,h,"forceUpdate")};function P(){}P.prototype=y.prototype;function x(h,g,R){this.props=h,this.context=g,this.refs=T,this.updater=R||m}var C=x.prototype=new P;C.constructor=x,v(C,y.prototype),C.isPureReactComponent=!0;var w=Array.isArray;function V(){}var S={H:null,A:null,T:null,S:null},b=Object.prototype.hasOwnProperty;function L(h,g,R){var M=R.ref;return{$$typeof:t,type:h,key:g,ref:M!==void 0?M:null,props:R}}function W(h,g){return L(h.type,g,h.props)}function N(h){return typeof h=="object"&&h!==null&&h.$$typeof===t}function dt(h){var g={"=":"=0",":":"=2"};return"$"+h.replace(/[=:]/g,function(R){return g[R]})}var at=/\/+/g;function yt(h,g){return typeof h=="object"&&h!==null&&h.key!=null?dt(""+h.key):g.toString(36)}function jt(h){switch(h.status){case"fulfilled":return h.value;case"rejected":throw h.reason;default:switch(typeof h.status=="string"?h.then(V,V):(h.status="pending",h.then(function(g){h.status==="pending"&&(h.status="fulfilled",h.value=g)},function(g){h.status==="pending"&&(h.status="rejected",h.reason=g)})),h.status){case"fulfilled":return h.value;case"rejected":throw h.reason}}throw h}function ut(h,g,R,M,k){var I=typeof h;(I==="undefined"||I==="boolean")&&(h=null);var j=!1;if(h===null)j=!0;else switch(I){case"bigint":case"string":case"number":j=!0;break;case"object":switch(h.$$typeof){case t:case e:j=!0;break;case l:return j=h._init,ut(j(h._payload),g,R,M,k)}}if(j)return k=k(h),j=M===""?"."+yt(h,0):M,w(k)?(R="",j!=null&&(R=j.replace(at,"$&/")+"/"),ut(k,g,R,"",function(no){return no})):k!=null&&(N(k)&&(k=W(k,R+(k.key==null||h&&h.key===k.key?"":(""+k.key).replace(at,"$&/")+"/")+j)),g.push(k)),1;j=0;var z=M===""?".":M+":";if(w(h))for(var K=0;K-1&&t.splice(n,1)}function co([...t],e,n){const s=e<0?t.length+e:e;if(s>=0&&sn>e?e:n{};const ft={},ci=t=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(t);function fi(t){return typeof t=="object"&&t!==null}const hi=t=>/^0[^.\s]+$/u.test(t);function hn(t){let e;return()=>(e===void 0&&(e=t()),e)}const et=t=>t,fo=(t,e)=>n=>e(t(n)),te=(...t)=>t.reduce(fo),Dt=(t,e,n)=>{const s=e-t;return s===0?1:(n-t)/s};class dn{constructor(){this.subscriptions=[]}add(e){return cn(this.subscriptions,e),()=>Qt(this.subscriptions,e)}notify(e,n,s){const i=this.subscriptions.length;if(i)if(i===1)this.subscriptions[0](e,n,s);else for(let o=0;ot*1e3,rt=t=>t/1e3;function di(t,e){return e?t*(1e3/e):0}const ho=(t,e,n)=>{const s=e-t;return((n-t)%s+s)%s+t},pi=(t,e,n)=>(((1-3*n+3*e)*t+(3*n-6*e))*t+3*e)*t,po=1e-7,mo=12;function go(t,e,n,s,i){let o,r,a=0;do r=e+(n-e)/2,o=pi(r,s,i)-t,o>0?n=r:e=r;while(Math.abs(o)>po&&++ago(o,0,1,t,n);return o=>o===0||o===1?o:pi(i(o),e,s)}const mi=t=>e=>e<=.5?t(2*e)/2:(2-t(2*(1-e)))/2,gi=t=>e=>1-t(1-e),yi=ee(.33,1.53,.69,.99),pn=gi(yi),vi=mi(pn),Ti=t=>(t*=2)<1?.5*pn(t):.5*(2-Math.pow(2,-10*(t-1))),mn=t=>1-Math.sin(Math.acos(t)),xi=gi(mn),Pi=mi(mn),yo=ee(.42,0,1,1),vo=ee(0,0,.58,1),Ai=ee(.42,0,.58,1),Si=t=>Array.isArray(t)&&typeof t[0]!="number";function wi(t,e){return Si(t)?t[ho(0,t.length,e)]:t}const bi=t=>Array.isArray(t)&&typeof t[0]=="number",To={linear:et,easeIn:yo,easeInOut:Ai,easeOut:vo,circIn:mn,circInOut:Pi,circOut:xi,backIn:pn,backInOut:vi,backOut:yi,anticipate:Ti},xo=t=>typeof t=="string",Be=t=>{if(bi(t)){fn(t.length===4);const[e,n,s,i]=t;return ee(e,n,s,i)}else if(xo(t))return To[t];return t},ie=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function Po(t,e){let n=new Set,s=new Set,i=!1,o=!1;const r=new WeakSet;let a={delta:0,timestamp:0,isProcessing:!1};function u(l){r.has(l)&&(c.schedule(l),t()),l(a)}const c={schedule:(l,f=!1,d=!1)=>{const m=d&&i?n:s;return f&&r.add(l),m.has(l)||m.add(l),l},cancel:l=>{s.delete(l),r.delete(l)},process:l=>{if(a=l,i){o=!0;return}i=!0,[n,s]=[s,n],n.forEach(u),n.clear(),i=!1,o&&(o=!1,c.process(l))}};return c}const Ao=40;function Ci(t,e){let n=!1,s=!0;const i={delta:0,timestamp:0,isProcessing:!1},o=()=>n=!0,r=ie.reduce((x,C)=>(x[C]=Po(o),x),{}),{setup:a,read:u,resolveKeyframes:c,preUpdate:l,update:f,preRender:d,render:p,postRender:m}=r,v=()=>{const x=ft.useManualTiming?i.timestamp:performance.now();n=!1,ft.useManualTiming||(i.delta=s?1e3/60:Math.max(Math.min(x-i.timestamp,Ao),1)),i.timestamp=x,i.isProcessing=!0,a.process(i),u.process(i),c.process(i),l.process(i),f.process(i),d.process(i),p.process(i),m.process(i),i.isProcessing=!1,n&&e&&(s=!1,t(v))},T=()=>{n=!0,s=!0,i.isProcessing||t(v)};return{schedule:ie.reduce((x,C)=>{const w=r[C];return x[C]=(V,S=!1,b=!1)=>(n||T(),w.schedule(V,S,b)),x},{}),cancel:x=>{for(let C=0;C(ue===void 0&&q.set(Y.isProcessing||ft.useManualTiming?Y.timestamp:performance.now()),ue),set:t=>{ue=t,queueMicrotask(So)}},Vi=t=>e=>typeof e=="string"&&e.startsWith(t),gn=Vi("--"),wo=Vi("var(--"),yn=t=>wo(t)?bo.test(t.split("/*")[0].trim()):!1,bo=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu,kt={test:t=>typeof t=="number",parse:parseFloat,transform:t=>t},Gt={...kt,transform:t=>ct(0,1,t)},re={...kt,default:1},Nt=t=>Math.round(t*1e5)/1e5,vn=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function Co(t){return t==null}const Vo=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,Tn=(t,e)=>n=>!!(typeof n=="string"&&Vo.test(n)&&n.startsWith(t)||e&&!Co(n)&&Object.prototype.hasOwnProperty.call(n,e)),Ei=(t,e,n)=>s=>{if(typeof s!="string")return s;const[i,o,r,a]=s.match(vn);return{[t]:parseFloat(i),[e]:parseFloat(o),[n]:parseFloat(r),alpha:a!==void 0?parseFloat(a):1}},Eo=t=>ct(0,255,t),we={...kt,transform:t=>Math.round(Eo(t))},xt={test:Tn("rgb","red"),parse:Ei("red","green","blue"),transform:({red:t,green:e,blue:n,alpha:s=1})=>"rgba("+we.transform(t)+", "+we.transform(e)+", "+we.transform(n)+", "+Nt(Gt.transform(s))+")"};function Mo(t){let e="",n="",s="",i="";return t.length>5?(e=t.substring(1,3),n=t.substring(3,5),s=t.substring(5,7),i=t.substring(7,9)):(e=t.substring(1,2),n=t.substring(2,3),s=t.substring(3,4),i=t.substring(4,5),e+=e,n+=n,s+=s,i+=i),{red:parseInt(e,16),green:parseInt(n,16),blue:parseInt(s,16),alpha:i?parseInt(i,16)/255:1}}const _e={test:Tn("#"),parse:Mo,transform:xt.transform},ne=t=>({test:e=>typeof e=="string"&&e.endsWith(t)&&e.split(" ").length===1,parse:parseFloat,transform:e=>`${e}${t}`}),pt=ne("deg"),ot=ne("%"),E=ne("px"),Ro=ne("vh"),Do=ne("vw"),Yn={...ot,parse:t=>ot.parse(t)/100,transform:t=>ot.transform(t*100)},bt={test:Tn("hsl","hue"),parse:Ei("hue","saturation","lightness"),transform:({hue:t,saturation:e,lightness:n,alpha:s=1})=>"hsla("+Math.round(t)+", "+ot.transform(Nt(e))+", "+ot.transform(Nt(n))+", "+Nt(Gt.transform(s))+")"},H={test:t=>xt.test(t)||_e.test(t)||bt.test(t),parse:t=>xt.test(t)?xt.parse(t):bt.test(t)?bt.parse(t):_e.parse(t),transform:t=>typeof t=="string"?t:t.hasOwnProperty("red")?xt.transform(t):bt.transform(t),getAnimatableNone:t=>{const e=H.parse(t);return e.alpha=0,H.transform(e)}},Lo=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function ko(t){return isNaN(t)&&typeof t=="string"&&(t.match(vn)?.length||0)+(t.match(Lo)?.length||0)>0}const Mi="number",Ri="color",Io="var",Oo="var(",zn="${}",jo=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function Yt(t){const e=t.toString(),n=[],s={color:[],number:[],var:[]},i=[];let o=0;const a=e.replace(jo,u=>(H.test(u)?(s.color.push(o),i.push(Ri),n.push(H.parse(u))):u.startsWith(Oo)?(s.var.push(o),i.push(Io),n.push(u)):(s.number.push(o),i.push(Mi),n.push(parseFloat(u))),++o,zn)).split(zn);return{values:n,split:a,indexes:s,types:i}}function Di(t){return Yt(t).values}function Li(t){const{split:e,types:n}=Yt(t),s=e.length;return i=>{let o="";for(let r=0;rtypeof t=="number"?0:H.test(t)?H.getAnimatableNone(t):t;function Bo(t){const e=Di(t);return Li(t)(e.map(Fo))}const mt={test:ko,parse:Di,createTransformer:Li,getAnimatableNone:Bo};function be(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+(e-t)*6*n:n<1/2?e:n<2/3?t+(e-t)*(2/3-n)*6:t}function _o({hue:t,saturation:e,lightness:n,alpha:s}){t/=360,e/=100,n/=100;let i=0,o=0,r=0;if(!e)i=o=r=n;else{const a=n<.5?n*(1+e):n+e-n*e,u=2*n-a;i=be(u,a,t+1/3),o=be(u,a,t),r=be(u,a,t-1/3)}return{red:Math.round(i*255),green:Math.round(o*255),blue:Math.round(r*255),alpha:s}}function he(t,e){return n=>n>0?e:t}const F=(t,e,n)=>t+(e-t)*n,Ce=(t,e,n)=>{const s=t*t,i=n*(e*e-s)+s;return i<0?0:Math.sqrt(i)},No=[_e,xt,bt],Uo=t=>No.find(e=>e.test(t));function Xn(t){const e=Uo(t);if(!e)return!1;let n=e.parse(t);return e===bt&&(n=_o(n)),n}const qn=(t,e)=>{const n=Xn(t),s=Xn(e);if(!n||!s)return he(t,e);const i={...n};return o=>(i.red=Ce(n.red,s.red,o),i.green=Ce(n.green,s.green,o),i.blue=Ce(n.blue,s.blue,o),i.alpha=F(n.alpha,s.alpha,o),xt.transform(i))},Ne=new Set(["none","hidden"]);function $o(t,e){return Ne.has(t)?n=>n<=0?t:e:n=>n>=1?e:t}function Wo(t,e){return n=>F(t,e,n)}function xn(t){return typeof t=="number"?Wo:typeof t=="string"?yn(t)?he:H.test(t)?qn:Go:Array.isArray(t)?ki:typeof t=="object"?H.test(t)?qn:Ko:he}function ki(t,e){const n=[...t],s=n.length,i=t.map((o,r)=>xn(o)(o,e[r]));return o=>{for(let r=0;r{for(const o in s)n[o]=s[o](i);return n}}function Ho(t,e){const n=[],s={color:0,var:0,number:0};for(let i=0;i{const n=mt.createTransformer(e),s=Yt(t),i=Yt(e);return s.indexes.var.length===i.indexes.var.length&&s.indexes.color.length===i.indexes.color.length&&s.indexes.number.length>=i.indexes.number.length?Ne.has(t)&&!i.values.length||Ne.has(e)&&!s.values.length?$o(t,e):te(ki(Ho(s,i),i.values),n):he(t,e)};function Ii(t,e,n){return typeof t=="number"&&typeof e=="number"&&typeof n=="number"?F(t,e,n):xn(t)(t,e)}const Yo=t=>{const e=({timestamp:n})=>t(n);return{start:(n=!0)=>B.update(e,n),stop:()=>ht(e),now:()=>Y.isProcessing?Y.timestamp:q.now()}},Oi=(t,e,n=10)=>{let s="";const i=Math.max(Math.round(e/n),2);for(let o=0;o=de?1/0:e}function ji(t,e=100,n){const s=n({...t,keyframes:[0,e]}),i=Math.min(Pn(s),de);return{type:"keyframes",ease:o=>s.next(i*o).value/e,duration:rt(i)}}const zo=5;function Fi(t,e,n){const s=Math.max(e-zo,0);return di(n-t(s),e-s)}const $={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1},Ve=.001;function Xo({duration:t=$.duration,bounce:e=$.bounce,velocity:n=$.velocity,mass:s=$.mass}){let i,o,r=1-e;r=ct($.minDamping,$.maxDamping,r),t=ct($.minDuration,$.maxDuration,rt(t)),r<1?(i=c=>{const l=c*r,f=l*t,d=l-n,p=Ue(c,r),m=Math.exp(-f);return Ve-d/p*m},o=c=>{const f=c*r*t,d=f*n+n,p=Math.pow(r,2)*Math.pow(c,2)*t,m=Math.exp(-f),v=Ue(Math.pow(c,2),r);return(-i(c)+Ve>0?-1:1)*((d-p)*m)/v}):(i=c=>{const l=Math.exp(-c*t),f=(c-n)*t+1;return-Ve+l*f},o=c=>{const l=Math.exp(-c*t),f=(n-c)*(t*t);return l*f});const a=5/t,u=Zo(i,o,a);if(t=it(t),isNaN(u))return{stiffness:$.stiffness,damping:$.damping,duration:t};{const c=Math.pow(u,2)*s;return{stiffness:c,damping:r*2*Math.sqrt(s*c),duration:t}}}const qo=12;function Zo(t,e,n){let s=n;for(let i=1;it[n]!==void 0)}function ta(t){let e={velocity:$.velocity,stiffness:$.stiffness,damping:$.damping,mass:$.mass,isResolvedFromDuration:!1,...t};if(!Zn(t,Qo)&&Zn(t,Jo))if(t.visualDuration){const n=t.visualDuration,s=2*Math.PI/(n*1.2),i=s*s,o=2*ct(.05,1,1-(t.bounce||0))*Math.sqrt(i);e={...e,mass:$.mass,stiffness:i,damping:o}}else{const n=Xo(t);e={...e,...n,mass:$.mass},e.isResolvedFromDuration=!0}return e}function zt(t=$.visualDuration,e=$.bounce){const n=typeof t!="object"?{visualDuration:t,keyframes:[0,1],bounce:e}:t;let{restSpeed:s,restDelta:i}=n;const o=n.keyframes[0],r=n.keyframes[n.keyframes.length-1],a={done:!1,value:o},{stiffness:u,damping:c,mass:l,duration:f,velocity:d,isResolvedFromDuration:p}=ta({...n,velocity:-rt(n.velocity||0)}),m=d||0,v=c/(2*Math.sqrt(u*l)),T=r-o,y=rt(Math.sqrt(u/l)),P=Math.abs(T)<5;s||(s=P?$.restSpeed.granular:$.restSpeed.default),i||(i=P?$.restDelta.granular:$.restDelta.default);let x;if(v<1){const w=Ue(y,v);x=V=>{const S=Math.exp(-v*y*V);return r-S*((m+v*y*T)/w*Math.sin(w*V)+T*Math.cos(w*V))}}else if(v===1)x=w=>r-Math.exp(-y*w)*(T+(m+y*T)*w);else{const w=y*Math.sqrt(v*v-1);x=V=>{const S=Math.exp(-v*y*V),b=Math.min(w*V,300);return r-S*((m+v*y*T)*Math.sinh(b)+w*T*Math.cosh(b))/w}}const C={calculatedDuration:p&&f||null,next:w=>{const V=x(w);if(p)a.done=w>=f;else{let S=w===0?m:0;v<1&&(S=w===0?it(m):Fi(x,w,V));const b=Math.abs(S)<=s,L=Math.abs(r-V)<=i;a.done=b&&L}return a.value=a.done?r:V,a},toString:()=>{const w=Math.min(Pn(C),de),V=Oi(S=>C.next(w*S).value,w,30);return w+"ms "+V},toTransition:()=>{}};return C}zt.applyToOptions=t=>{const e=ji(t,100,zt);return t.ease=e.ease,t.duration=it(e.duration),t.type="keyframes",t};function $e({keyframes:t,velocity:e=0,power:n=.8,timeConstant:s=325,bounceDamping:i=10,bounceStiffness:o=500,modifyTarget:r,min:a,max:u,restDelta:c=.5,restSpeed:l}){const f=t[0],d={done:!1,value:f},p=b=>a!==void 0&&bu,m=b=>a===void 0?u:u===void 0||Math.abs(a-b)-v*Math.exp(-b/s),x=b=>y+P(b),C=b=>{const L=P(b),W=x(b);d.done=Math.abs(L)<=c,d.value=d.done?y:W};let w,V;const S=b=>{p(d.value)&&(w=b,V=zt({keyframes:[d.value,m(d.value)],velocity:Fi(x,b,d.value),damping:i,stiffness:o,restDelta:c,restSpeed:l}))};return S(0),{calculatedDuration:null,next:b=>{let L=!1;return!V&&w===void 0&&(L=!0,C(b),S(b)),w!==void 0&&b>=w?V.next(b-w):(!L&&C(b),d)}}}function ea(t,e,n){const s=[],i=n||ft.mix||Ii,o=t.length-1;for(let r=0;re[0];if(o===2&&e[0]===e[1])return()=>e[1];const r=t[0]===t[1];t[0]>t[o-1]&&(t=[...t].reverse(),e=[...e].reverse());const a=ea(e,s,i),u=a.length,c=l=>{if(r&&l1)for(;fc(ct(t[0],t[o-1],l)):c}function _i(t,e){const n=t[t.length-1];for(let s=1;s<=e;s++){const i=Dt(0,e,s);t.push(F(n,1,i))}}function Ni(t){const e=[0];return _i(e,t.length-1),e}function na(t,e){return t.map(n=>n*e)}function sa(t,e){return t.map(()=>e||Ai).splice(0,t.length-1)}function Ut({duration:t=300,keyframes:e,times:n,ease:s="easeInOut"}){const i=Si(s)?s.map(Be):Be(s),o={done:!1,value:e[0]},r=na(n&&n.length===e.length?n:Ni(e),t),a=Bi(r,e,{ease:Array.isArray(i)?i:sa(e,i)});return{calculatedDuration:t,next:u=>(o.value=a(u),o.done=u>=t,o)}}const ia=t=>t!==null;function An(t,{repeat:e,repeatType:n="loop"},s,i=1){const o=t.filter(ia),a=i<0||e&&n!=="loop"&&e%2===1?0:o.length-1;return!a||s===void 0?o[a]:s}const ra={decay:$e,inertia:$e,tween:Ut,keyframes:Ut,spring:zt};function Ui(t){typeof t.type=="string"&&(t.type=ra[t.type])}class Sn{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(e=>{this.resolve=e})}notifyFinished(){this.resolve()}then(e,n){return this.finished.then(e,n)}}const oa=t=>t/100;class wn extends Sn{constructor(e){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.stop=()=>{const{motionValue:n}=this.options;n&&n.updatedAt!==q.now()&&this.tick(q.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),this.options.onStop?.())},this.options=e,this.initAnimation(),this.play(),e.autoplay===!1&&this.pause()}initAnimation(){const{options:e}=this;Ui(e);const{type:n=Ut,repeat:s=0,repeatDelay:i=0,repeatType:o,velocity:r=0}=e;let{keyframes:a}=e;const u=n||Ut;u!==Ut&&typeof a[0]!="number"&&(this.mixKeyframes=te(oa,Ii(a[0],a[1])),a=[0,100]);const c=u({...e,keyframes:a});o==="mirror"&&(this.mirroredGenerator=u({...e,keyframes:[...a].reverse(),velocity:-r})),c.calculatedDuration===null&&(c.calculatedDuration=Pn(c));const{calculatedDuration:l}=c;this.calculatedDuration=l,this.resolvedDuration=l+i,this.totalDuration=this.resolvedDuration*(s+1)-i,this.generator=c}updateTime(e){const n=Math.round(e-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=n}tick(e,n=!1){const{generator:s,totalDuration:i,mixKeyframes:o,mirroredGenerator:r,resolvedDuration:a,calculatedDuration:u}=this;if(this.startTime===null)return s.next(0);const{delay:c=0,keyframes:l,repeat:f,repeatType:d,repeatDelay:p,type:m,onUpdate:v,finalKeyframe:T}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,e):this.speed<0&&(this.startTime=Math.min(e-i/this.speed,this.startTime)),n?this.currentTime=e:this.updateTime(e);const y=this.currentTime-c*(this.playbackSpeed>=0?1:-1),P=this.playbackSpeed>=0?y<0:y>i;this.currentTime=Math.max(y,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=i);let x=this.currentTime,C=s;if(f){const b=Math.min(this.currentTime,i)/a;let L=Math.floor(b),W=b%1;!W&&b>=1&&(W=1),W===1&&L--,L=Math.min(L,f+1),!!(L%2)&&(d==="reverse"?(W=1-W,p&&(W-=p/a)):d==="mirror"&&(C=r)),x=ct(0,1,W)*a}const w=P?{done:!1,value:l[0]}:C.next(x);o&&(w.value=o(w.value));let{done:V}=w;!P&&u!==null&&(V=this.playbackSpeed>=0?this.currentTime>=i:this.currentTime<=0);const S=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&V);return S&&m!==$e&&(w.value=An(l,this.options,T,this.speed)),v&&v(w.value),S&&this.finish(),w}then(e,n){return this.finished.then(e,n)}get duration(){return rt(this.calculatedDuration)}get time(){return rt(this.currentTime)}set time(e){e=it(e),this.currentTime=e,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=e:this.driver&&(this.startTime=this.driver.now()-e/this.playbackSpeed),this.driver?.start(!1)}get speed(){return this.playbackSpeed}set speed(e){this.updateTime(q.now());const n=this.playbackSpeed!==e;this.playbackSpeed=e,n&&(this.time=rt(this.currentTime))}play(){if(this.isStopped)return;const{driver:e=Yo,startTime:n}=this.options;this.driver||(this.driver=e(i=>this.tick(i))),this.options.onPlay?.();const s=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=s):this.holdTime!==null?this.startTime=s-this.holdTime:this.startTime||(this.startTime=n??s),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(q.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){this.notifyFinished(),this.teardown(),this.state="finished",this.options.onComplete?.()}cancel(){this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),this.options.onCancel?.()}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(e){return this.startTime=0,this.tick(e,!0)}attachTimeline(e){return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),this.driver?.stop(),e.observe(this)}}function aa(t){for(let e=1;et*180/Math.PI,We=t=>{const e=Pt(Math.atan2(t[1],t[0]));return Ke(e)},ua={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:t=>(Math.abs(t[0])+Math.abs(t[3]))/2,rotate:We,rotateZ:We,skewX:t=>Pt(Math.atan(t[1])),skewY:t=>Pt(Math.atan(t[2])),skew:t=>(Math.abs(t[1])+Math.abs(t[2]))/2},Ke=t=>(t=t%360,t<0&&(t+=360),t),Jn=We,Qn=t=>Math.sqrt(t[0]*t[0]+t[1]*t[1]),ts=t=>Math.sqrt(t[4]*t[4]+t[5]*t[5]),la={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:Qn,scaleY:ts,scale:t=>(Qn(t)+ts(t))/2,rotateX:t=>Ke(Pt(Math.atan2(t[6],t[5]))),rotateY:t=>Ke(Pt(Math.atan2(-t[2],t[0]))),rotateZ:Jn,rotate:Jn,skewX:t=>Pt(Math.atan(t[4])),skewY:t=>Pt(Math.atan(t[1])),skew:t=>(Math.abs(t[1])+Math.abs(t[4]))/2};function He(t){return t.includes("scale")?1:0}function Ge(t,e){if(!t||t==="none")return He(e);const n=t.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let s,i;if(n)s=la,i=n;else{const a=t.match(/^matrix\(([-\d.e\s,]+)\)$/u);s=ua,i=a}if(!i)return He(e);const o=s[e],r=i[1].split(",").map(fa);return typeof o=="function"?o(r):r[o]}const ca=(t,e)=>{const{transform:n="none"}=getComputedStyle(t);return Ge(n,e)};function fa(t){return parseFloat(t.trim())}const It=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Ot=new Set(It),es=t=>t===kt||t===E,ha=new Set(["x","y","z"]),da=It.filter(t=>!ha.has(t));function pa(t){const e=[];return da.forEach(n=>{const s=t.getValue(n);s!==void 0&&(e.push([n,s.get()]),s.set(n.startsWith("scale")?1:0))}),e}const At={width:({x:t},{paddingLeft:e="0",paddingRight:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),height:({y:t},{paddingTop:e="0",paddingBottom:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),top:(t,{top:e})=>parseFloat(e),left:(t,{left:e})=>parseFloat(e),bottom:({y:t},{top:e})=>parseFloat(e)+(t.max-t.min),right:({x:t},{left:e})=>parseFloat(e)+(t.max-t.min),x:(t,{transform:e})=>Ge(e,"x"),y:(t,{transform:e})=>Ge(e,"y")};At.translateX=At.x;At.translateY=At.y;const St=new Set;let Ye=!1,ze=!1,Xe=!1;function $i(){if(ze){const t=Array.from(St).filter(s=>s.needsMeasurement),e=new Set(t.map(s=>s.element)),n=new Map;e.forEach(s=>{const i=pa(s);i.length&&(n.set(s,i),s.render())}),t.forEach(s=>s.measureInitialState()),e.forEach(s=>{s.render();const i=n.get(s);i&&i.forEach(([o,r])=>{s.getValue(o)?.set(r)})}),t.forEach(s=>s.measureEndState()),t.forEach(s=>{s.suspendedScrollY!==void 0&&window.scrollTo(0,s.suspendedScrollY)})}ze=!1,Ye=!1,St.forEach(t=>t.complete(Xe)),St.clear()}function Wi(){St.forEach(t=>{t.readKeyframes(),t.needsMeasurement&&(ze=!0)})}function ma(){Xe=!0,Wi(),$i(),Xe=!1}class bn{constructor(e,n,s,i,o,r=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...e],this.onComplete=n,this.name=s,this.motionValue=i,this.element=o,this.isAsync=r}scheduleResolve(){this.state="scheduled",this.isAsync?(St.add(this),Ye||(Ye=!0,B.read(Wi),B.resolveKeyframes($i))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:e,name:n,element:s,motionValue:i}=this;if(e[0]===null){const o=i?.get(),r=e[e.length-1];if(o!==void 0)e[0]=o;else if(s&&n){const a=s.readValue(n,r);a!=null&&(e[0]=a)}e[0]===void 0&&(e[0]=r),i&&o===void 0&&i.set(e[0])}aa(e)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(e=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,e),St.delete(this)}cancel(){this.state==="scheduled"&&(St.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const ga=t=>t.startsWith("--");function ya(t,e,n){ga(e)?t.style.setProperty(e,n):t.style[e]=n}const va=hn(()=>window.ScrollTimeline!==void 0),Ta={};function xa(t,e){const n=hn(t);return()=>Ta[e]??n()}const Ki=xa(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),_t=([t,e,n,s])=>`cubic-bezier(${t}, ${e}, ${n}, ${s})`,ns={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:_t([0,.65,.55,1]),circOut:_t([.55,0,1,.45]),backIn:_t([.31,.01,.66,-.59]),backOut:_t([.33,1.53,.69,.99])};function Hi(t,e){if(t)return typeof t=="function"?Ki()?Oi(t,e):"ease-out":bi(t)?_t(t):Array.isArray(t)?t.map(n=>Hi(n,e)||ns.easeOut):ns[t]}function Pa(t,e,n,{delay:s=0,duration:i=300,repeat:o=0,repeatType:r="loop",ease:a="easeOut",times:u}={},c=void 0){const l={[e]:n};u&&(l.offset=u);const f=Hi(a,i);Array.isArray(f)&&(l.easing=f);const d={delay:s,duration:i,easing:Array.isArray(f)?"linear":f,fill:"both",iterations:o+1,direction:r==="reverse"?"alternate":"normal"};return c&&(d.pseudoElement=c),t.animate(l,d)}function Cn(t){return typeof t=="function"&&"applyToOptions"in t}function Aa({type:t,...e}){return Cn(t)&&Ki()?t.applyToOptions(e):(e.duration??(e.duration=300),e.ease??(e.ease="easeOut"),e)}class Sa extends Sn{constructor(e){if(super(),this.finishedTime=null,this.isStopped=!1,!e)return;const{element:n,name:s,keyframes:i,pseudoElement:o,allowFlatten:r=!1,finalKeyframe:a,onComplete:u}=e;this.isPseudoElement=!!o,this.allowFlatten=r,this.options=e,fn(typeof e.type!="string");const c=Aa(e);this.animation=Pa(n,s,i,c,o),c.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!o){const l=An(i,this.options,a,this.speed);this.updateMotionValue?this.updateMotionValue(l):ya(n,s,l),this.animation.cancel()}u?.(),this.notifyFinished()}}play(){this.isStopped||(this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){this.animation.finish?.()}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:e}=this;e==="idle"||e==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){this.isPseudoElement||this.animation.commitStyles?.()}get duration(){const e=this.animation.effect?.getComputedTiming?.().duration||0;return rt(Number(e))}get time(){return rt(Number(this.animation.currentTime)||0)}set time(e){this.finishedTime=null,this.animation.currentTime=it(e)}get speed(){return this.animation.playbackRate}set speed(e){e<0&&(this.finishedTime=null),this.animation.playbackRate=e}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return Number(this.animation.startTime)}set startTime(e){this.animation.startTime=e}attachTimeline({timeline:e,observe:n}){return this.allowFlatten&&this.animation.effect?.updateTiming({easing:"linear"}),this.animation.onfinish=null,e&&va()?(this.animation.timeline=e,et):n(this)}}const Gi={anticipate:Ti,backInOut:vi,circInOut:Pi};function wa(t){return t in Gi}function ba(t){typeof t.ease=="string"&&wa(t.ease)&&(t.ease=Gi[t.ease])}const ss=10;class Ca extends Sa{constructor(e){ba(e),Ui(e),super(e),e.startTime&&(this.startTime=e.startTime),this.options=e}updateMotionValue(e){const{motionValue:n,onUpdate:s,onComplete:i,element:o,...r}=this.options;if(!n)return;if(e!==void 0){n.set(e);return}const a=new wn({...r,autoplay:!1}),u=it(this.finishedTime??this.time);n.setWithVelocity(a.sample(u-ss).value,a.sample(u).value,ss),a.stop()}}const is=(t,e)=>e==="zIndex"?!1:!!(typeof t=="number"||Array.isArray(t)||typeof t=="string"&&(mt.test(t)||t==="0")&&!t.startsWith("url("));function Va(t){const e=t[0];if(t.length===1)return!0;for(let n=0;nObject.hasOwnProperty.call(Element.prototype,"animate"));function Da(t){const{motionValue:e,name:n,repeatDelay:s,repeatType:i,damping:o,type:r}=t;if(!(e?.owner?.current instanceof HTMLElement))return!1;const{onUpdate:u,transformTemplate:c}=e.owner.getProps();return Ra()&&n&&Ma.has(n)&&(n!=="transform"||!c)&&!u&&!s&&i!=="mirror"&&o!==0&&r!=="inertia"}const La=40;class ka extends Sn{constructor({autoplay:e=!0,delay:n=0,type:s="keyframes",repeat:i=0,repeatDelay:o=0,repeatType:r="loop",keyframes:a,name:u,motionValue:c,element:l,...f}){super(),this.stop=()=>{this._animation&&(this._animation.stop(),this.stopTimeline?.()),this.keyframeResolver?.cancel()},this.createdAt=q.now();const d={autoplay:e,delay:n,type:s,repeat:i,repeatDelay:o,repeatType:r,name:u,motionValue:c,element:l,...f},p=l?.KeyframeResolver||bn;this.keyframeResolver=new p(a,(m,v,T)=>this.onKeyframesResolved(m,v,d,!T),u,c,l),this.keyframeResolver?.scheduleResolve()}onKeyframesResolved(e,n,s,i){this.keyframeResolver=void 0;const{name:o,type:r,velocity:a,delay:u,isHandoff:c,onUpdate:l}=s;this.resolvedAt=q.now(),Ea(e,o,r,a)||((ft.instantAnimations||!u)&&l?.(An(e,s,n)),e[0]=e[e.length-1],qe(s),s.repeat=0);const d={startTime:i?this.resolvedAt?this.resolvedAt-this.createdAt>La?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:n,...s,keyframes:e},p=!c&&Da(d)?new Ca({...d,element:d.motionValue.owner.current}):new wn(d);p.finished.then(()=>this.notifyFinished()).catch(et),this.pendingTimeline&&(this.stopTimeline=p.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=p}get finished(){return this._animation?this.animation.finished:this._finished}then(e,n){return this.finished.finally(e).then(()=>{})}get animation(){return this._animation||(this.keyframeResolver?.resume(),ma()),this._animation}get duration(){return this.animation.duration}get time(){return this.animation.time}set time(e){this.animation.time=e}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(e){this.animation.speed=e}get startTime(){return this.animation.startTime}attachTimeline(e){return this._animation?this.stopTimeline=this.animation.attachTimeline(e):this.pendingTimeline=e,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){this._animation&&this.animation.cancel(),this.keyframeResolver?.cancel()}}class Ia{constructor(e){this.stop=()=>this.runAll("stop"),this.animations=e.filter(Boolean)}get finished(){return Promise.all(this.animations.map(e=>e.finished))}getAll(e){return this.animations[0][e]}setAll(e,n){for(let s=0;ss.attachTimeline(e));return()=>{n.forEach((s,i)=>{s&&s(),this.animations[i].stop()})}}get time(){return this.getAll("time")}set time(e){this.setAll("time",e)}get speed(){return this.getAll("speed")}set speed(e){this.setAll("speed",e)}get state(){return this.getAll("state")}get startTime(){return this.getAll("startTime")}get duration(){let e=0;for(let n=0;nn[e]())}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}class Oa extends Ia{then(e,n){return this.finished.finally(e).then(()=>{})}}const ja=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function Fa(t){const e=ja.exec(t);if(!e)return[,];const[,n,s,i]=e;return[`--${n??s}`,i]}function Yi(t,e,n=1){const[s,i]=Fa(t);if(!s)return;const o=window.getComputedStyle(e).getPropertyValue(s);if(o){const r=o.trim();return ci(r)?parseFloat(r):r}return yn(i)?Yi(i,e,n+1):i}function Vn(t,e){return t?.[e]??t?.default??t}const zi=new Set(["width","height","top","left","right","bottom",...It]),Ba={test:t=>t==="auto",parse:t=>t},Xi=t=>e=>e.test(t),qi=[kt,E,ot,pt,Do,Ro,Ba],rs=t=>qi.find(Xi(t));function _a(t){return typeof t=="number"?t===0:t!==null?t==="none"||t==="0"||hi(t):!0}const Na=new Set(["brightness","contrast","saturate","opacity"]);function Ua(t){const[e,n]=t.slice(0,-1).split("(");if(e==="drop-shadow")return t;const[s]=n.match(vn)||[];if(!s)return t;const i=n.replace(s,"");let o=Na.has(e)?1:0;return s!==n&&(o*=100),e+"("+o+i+")"}const $a=/\b([a-z-]*)\(.*?\)/gu,Ze={...mt,getAnimatableNone:t=>{const e=t.match($a);return e?e.map(Ua).join(" "):t}},os={...kt,transform:Math.round},Wa={rotate:pt,rotateX:pt,rotateY:pt,rotateZ:pt,scale:re,scaleX:re,scaleY:re,scaleZ:re,skew:pt,skewX:pt,skewY:pt,distance:E,translateX:E,translateY:E,translateZ:E,x:E,y:E,z:E,perspective:E,transformPerspective:E,opacity:Gt,originX:Yn,originY:Yn,originZ:E},En={borderWidth:E,borderTopWidth:E,borderRightWidth:E,borderBottomWidth:E,borderLeftWidth:E,borderRadius:E,radius:E,borderTopLeftRadius:E,borderTopRightRadius:E,borderBottomRightRadius:E,borderBottomLeftRadius:E,width:E,maxWidth:E,height:E,maxHeight:E,top:E,right:E,bottom:E,left:E,padding:E,paddingTop:E,paddingRight:E,paddingBottom:E,paddingLeft:E,margin:E,marginTop:E,marginRight:E,marginBottom:E,marginLeft:E,backgroundPositionX:E,backgroundPositionY:E,...Wa,zIndex:os,fillOpacity:Gt,strokeOpacity:Gt,numOctaves:os},Ka={...En,color:H,backgroundColor:H,outlineColor:H,fill:H,stroke:H,borderColor:H,borderTopColor:H,borderRightColor:H,borderBottomColor:H,borderLeftColor:H,filter:Ze,WebkitFilter:Ze},Zi=t=>Ka[t];function Ji(t,e){let n=Zi(t);return n!==Ze&&(n=mt),n.getAnimatableNone?n.getAnimatableNone(e):void 0}const Ha=new Set(["auto","none","0"]);function Ga(t,e,n){let s=0,i;for(;s{e.getValue(a).set(u)}),this.resolveNoneKeyframes()}}function Qi(t,e,n){if(t instanceof EventTarget)return[t];if(typeof t=="string"){let s=document;e&&(s=e.current);const i=n?.[t]??s.querySelectorAll(t);return i?Array.from(i):[]}return Array.from(t)}const tr=(t,e)=>e&&typeof t=="number"?e.transform(t):t;function er(t){return fi(t)&&"offsetHeight"in t}const as=30,za=t=>!isNaN(parseFloat(t)),$t={current:void 0};class Xa{constructor(e,n={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=s=>{const i=q.now();if(this.updatedAt!==i&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(s),this.current!==this.prev&&(this.events.change?.notify(this.current),this.dependents))for(const o of this.dependents)o.dirty()},this.hasAnimated=!1,this.setCurrent(e),this.owner=n.owner}setCurrent(e){this.current=e,this.updatedAt=q.now(),this.canTrackVelocity===null&&e!==void 0&&(this.canTrackVelocity=za(this.current))}setPrevFrameValue(e=this.current){this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt}onChange(e){return this.on("change",e)}on(e,n){this.events[e]||(this.events[e]=new dn);const s=this.events[e].add(n);return e==="change"?()=>{s(),B.read(()=>{this.events.change.getSize()||this.stop()})}:s}clearListeners(){for(const e in this.events)this.events[e].clear()}attach(e,n){this.passiveEffect=e,this.stopPassiveEffect=n}set(e){this.passiveEffect?this.passiveEffect(e,this.updateAndNotify):this.updateAndNotify(e)}setWithVelocity(e,n,s){this.set(n),this.prev=void 0,this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt-s}jump(e,n=!0){this.updateAndNotify(e),this.prev=e,this.prevUpdatedAt=this.prevFrameValue=void 0,n&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){this.events.change?.notify(this.current)}addDependent(e){this.dependents||(this.dependents=new Set),this.dependents.add(e)}removeDependent(e){this.dependents&&this.dependents.delete(e)}get(){return $t.current&&$t.current.push(this),this.current}getPrevious(){return this.prev}getVelocity(){const e=q.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||e-this.updatedAt>as)return 0;const n=Math.min(this.updatedAt-this.prevUpdatedAt,as);return di(parseFloat(this.current)-parseFloat(this.prevFrameValue),n)}start(e){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=e(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.dependents?.clear(),this.events.destroy?.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function wt(t,e){return new Xa(t,e)}const{schedule:Mn}=Ci(queueMicrotask,!1),st={x:!1,y:!1};function nr(){return st.x||st.y}function qa(t){return t==="x"||t==="y"?st[t]?null:(st[t]=!0,()=>{st[t]=!1}):st.x||st.y?null:(st.x=st.y=!0,()=>{st.x=st.y=!1})}function sr(t,e){const n=Qi(t),s=new AbortController,i={passive:!0,...e,signal:s.signal};return[n,i,()=>s.abort()]}function us(t){return!(t.pointerType==="touch"||nr())}function Za(t,e,n={}){const[s,i,o]=sr(t,n),r=a=>{if(!us(a))return;const{target:u}=a,c=e(u,a);if(typeof c!="function"||!u)return;const l=f=>{us(f)&&(c(f),u.removeEventListener("pointerleave",l))};u.addEventListener("pointerleave",l,i)};return s.forEach(a=>{a.addEventListener("pointerenter",r,i)}),o}const ir=(t,e)=>e?t===e?!0:ir(t,e.parentElement):!1,Rn=t=>t.pointerType==="mouse"?typeof t.button!="number"||t.button<=0:t.isPrimary!==!1,Ja=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function Qa(t){return Ja.has(t.tagName)||t.tabIndex!==-1}const le=new WeakSet;function ls(t){return e=>{e.key==="Enter"&&t(e)}}function Ee(t,e){t.dispatchEvent(new PointerEvent("pointer"+e,{isPrimary:!0,bubbles:!0}))}const tu=(t,e)=>{const n=t.currentTarget;if(!n)return;const s=ls(()=>{if(le.has(n))return;Ee(n,"down");const i=ls(()=>{Ee(n,"up")}),o=()=>Ee(n,"cancel");n.addEventListener("keyup",i,e),n.addEventListener("blur",o,e)});n.addEventListener("keydown",s,e),n.addEventListener("blur",()=>n.removeEventListener("keydown",s),e)};function cs(t){return Rn(t)&&!nr()}function eu(t,e,n={}){const[s,i,o]=sr(t,n),r=a=>{const u=a.currentTarget;if(!cs(a))return;le.add(u);const c=e(u,a),l=(p,m)=>{window.removeEventListener("pointerup",f),window.removeEventListener("pointercancel",d),le.has(u)&&le.delete(u),cs(p)&&typeof c=="function"&&c(p,{success:m})},f=p=>{l(p,u===window||u===document||n.useGlobalTarget||ir(u,p.target))},d=p=>{l(p,!1)};window.addEventListener("pointerup",f,i),window.addEventListener("pointercancel",d,i)};return s.forEach(a=>{(n.useGlobalTarget?window:a).addEventListener("pointerdown",r,i),er(a)&&(a.addEventListener("focus",c=>tu(c,i)),!Qa(a)&&!a.hasAttribute("tabindex")&&(a.tabIndex=0))}),o}function Dn(t){return fi(t)&&"ownerSVGElement"in t}function rr(t){return Dn(t)&&t.tagName==="svg"}function nu(t,e){if(t==="first")return 0;{const n=e-1;return t==="last"?n:n/2}}function pf(t=.1,{startDelay:e=0,from:n=0,ease:s}={}){return(i,o)=>{const r=typeof n=="number"?n:nu(n,o),a=Math.abs(r-i);let u=t*a;if(s){const c=o*t;u=Be(s)(u/c)*c}return e+u}}function su(...t){const e=!Array.isArray(t[0]),n=e?0:-1,s=t[0+n],i=t[1+n],o=t[2+n],r=t[3+n],a=Bi(i,o,r);return e?a(s):a}const G=t=>!!(t&&t.getVelocity),iu=[...qi,H,mt],ru=t=>iu.find(Xi(t)),ye=A.createContext({transformPagePoint:t=>t,isStatic:!1,reducedMotion:"never"});function fs(t,e){if(typeof t=="function")return t(e);t!=null&&(t.current=e)}function ou(...t){return e=>{let n=!1;const s=t.map(i=>{const o=fs(i,e);return!n&&typeof o=="function"&&(n=!0),o});if(n)return()=>{for(let i=0;i{const{width:c,height:l,top:f,left:d,right:p}=r.current;if(e||!o.current||!c||!l)return;const m=n==="left"?`left: ${d}`:`right: ${p}`;o.current.dataset.motionPopId=i;const v=document.createElement("style");a&&(v.nonce=a);const T=s??document.head;return T.appendChild(v),v.sheet&&v.sheet.insertRule(` - [data-motion-pop-id="${i}"] { - position: absolute !important; - width: ${c}px !important; - height: ${l}px !important; - ${m}px !important; - top: ${f}px !important; - } - `),()=>{T.contains(v)&&T.removeChild(v)}},[e]),tt.jsx(uu,{isPresent:e,childRef:o,sizeRef:r,children:A.cloneElement(t,{ref:u})})}const cu=({children:t,initial:e,isPresent:n,onExitComplete:s,custom:i,presenceAffectsLayout:o,mode:r,anchorX:a,root:u})=>{const c=lt(fu),l=A.useId();let f=!0,d=A.useMemo(()=>(f=!1,{id:l,initial:e,isPresent:n,custom:i,onExitComplete:p=>{c.set(p,!0);for(const m of c.values())if(!m)return;s&&s()},register:p=>(c.set(p,!1),()=>c.delete(p))}),[n,c,s]);return o&&f&&(d={...d}),A.useMemo(()=>{c.forEach((p,m)=>c.set(m,!1))},[n]),A.useEffect(()=>{!n&&!c.size&&s&&s()},[n]),r==="popLayout"&&(t=tt.jsx(lu,{isPresent:n,anchorX:a,root:u,children:t})),tt.jsx(ge.Provider,{value:d,children:t})};function fu(){return new Map}function or(t=!0){const e=A.useContext(ge);if(e===null)return[!0,null];const{isPresent:n,onExitComplete:s,register:i}=e,o=A.useId();A.useEffect(()=>{if(t)return i(o)},[t]);const r=A.useCallback(()=>t&&s&&s(o),[o,s,t]);return!n&&s?[!1,r]:[!0]}const oe=t=>t.key||"";function hs(t){const e=[];return A.Children.forEach(t,n=>{A.isValidElement(n)&&e.push(n)}),e}const mf=({children:t,custom:e,initial:n=!0,onExitComplete:s,presenceAffectsLayout:i=!0,mode:o="sync",propagate:r=!1,anchorX:a="left",root:u})=>{const[c,l]=or(r),f=A.useMemo(()=>hs(t),[t]),d=r&&!c?[]:f.map(oe),p=A.useRef(!0),m=A.useRef(f),v=lt(()=>new Map),[T,y]=A.useState(f),[P,x]=A.useState(f);ln(()=>{p.current=!1,m.current=f;for(let V=0;V{const S=oe(V),b=r&&!c?!1:f===P||d.includes(S),L=()=>{if(v.has(S))v.set(S,!0);else return;let W=!0;v.forEach(N=>{N||(W=!1)}),W&&(w?.(),x(m.current),r&&l?.(),s&&s())};return tt.jsx(cu,{isPresent:b,initial:!p.current||n?void 0:!1,custom:e,presenceAffectsLayout:i,mode:o,root:u,onExitComplete:b?void 0:L,anchorX:a,children:V},S)})})},ar=A.createContext({strict:!1}),ds={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},Lt={};for(const t in ds)Lt[t]={isEnabled:e=>ds[t].some(n=>!!e[n])};function hu(t){for(const e in t)Lt[e]={...Lt[e],...t[e]}}const du=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function pe(t){return t.startsWith("while")||t.startsWith("drag")&&t!=="draggable"||t.startsWith("layout")||t.startsWith("onTap")||t.startsWith("onPan")||t.startsWith("onLayout")||du.has(t)}let ur=t=>!pe(t);function pu(t){typeof t=="function"&&(ur=e=>e.startsWith("on")?!pe(e):t(e))}try{pu(require("@emotion/is-prop-valid").default)}catch{}function mu(t,e,n){const s={};for(const i in t)i==="values"&&typeof t.values=="object"||(ur(i)||n===!0&&pe(i)||!e&&!pe(i)||t.draggable&&i.startsWith("onDrag"))&&(s[i]=t[i]);return s}const ve=A.createContext({});function Te(t){return t!==null&&typeof t=="object"&&typeof t.start=="function"}function Xt(t){return typeof t=="string"||Array.isArray(t)}const Ln=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],kn=["initial",...Ln];function xe(t){return Te(t.animate)||kn.some(e=>Xt(t[e]))}function lr(t){return!!(xe(t)||t.variants)}function gu(t,e){if(xe(t)){const{initial:n,animate:s}=t;return{initial:n===!1||Xt(n)?n:void 0,animate:Xt(s)?s:void 0}}return t.inherit!==!1?e:{}}function yu(t){const{initial:e,animate:n}=gu(t,A.useContext(ve));return A.useMemo(()=>({initial:e,animate:n}),[ps(e),ps(n)])}function ps(t){return Array.isArray(t)?t.join(" "):t}const qt={};function vu(t){for(const e in t)qt[e]=t[e],gn(e)&&(qt[e].isCSSVariable=!0)}function cr(t,{layout:e,layoutId:n}){return Ot.has(t)||t.startsWith("origin")||(e||n!==void 0)&&(!!qt[t]||t==="opacity")}const Tu={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},xu=It.length;function Pu(t,e,n){let s="",i=!0;for(let o=0;o({style:{},transform:{},transformOrigin:{},vars:{}});function fr(t,e,n){for(const s in e)!G(e[s])&&!cr(s,n)&&(t[s]=e[s])}function Au({transformTemplate:t},e){return A.useMemo(()=>{const n=On();return In(n,e,t),Object.assign({},n.vars,n.style)},[e])}function Su(t,e){const n=t.style||{},s={};return fr(s,n,t),Object.assign(s,Au(t,e)),s}function wu(t,e){const n={},s=Su(t,e);return t.drag&&t.dragListener!==!1&&(n.draggable=!1,s.userSelect=s.WebkitUserSelect=s.WebkitTouchCallout="none",s.touchAction=t.drag===!0?"none":`pan-${t.drag==="x"?"y":"x"}`),t.tabIndex===void 0&&(t.onTap||t.onTapStart||t.whileTap)&&(n.tabIndex=0),n.style=s,n}const bu={offset:"stroke-dashoffset",array:"stroke-dasharray"},Cu={offset:"strokeDashoffset",array:"strokeDasharray"};function Vu(t,e,n=1,s=0,i=!0){t.pathLength=1;const o=i?bu:Cu;t[o.offset]=E.transform(-s);const r=E.transform(e),a=E.transform(n);t[o.array]=`${r} ${a}`}function hr(t,{attrX:e,attrY:n,attrScale:s,pathLength:i,pathSpacing:o=1,pathOffset:r=0,...a},u,c,l){if(In(t,a,c),u){t.style.viewBox&&(t.attrs.viewBox=t.style.viewBox);return}t.attrs=t.style,t.style={};const{attrs:f,style:d}=t;f.transform&&(d.transform=f.transform,delete f.transform),(d.transform||f.transformOrigin)&&(d.transformOrigin=f.transformOrigin??"50% 50%",delete f.transformOrigin),d.transform&&(d.transformBox=l?.transformBox??"fill-box",delete f.transformBox),e!==void 0&&(f.x=e),n!==void 0&&(f.y=n),s!==void 0&&(f.scale=s),i!==void 0&&Vu(f,i,o,r,!1)}const dr=()=>({...On(),attrs:{}}),pr=t=>typeof t=="string"&&t.toLowerCase()==="svg";function Eu(t,e,n,s){const i=A.useMemo(()=>{const o=dr();return hr(o,e,pr(s),t.transformTemplate,t.style),{...o.attrs,style:{...o.style}}},[e]);if(t.style){const o={};fr(o,t.style,t),i.style={...o,...i.style}}return i}const Mu=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function jn(t){return typeof t!="string"||t.includes("-")?!1:!!(Mu.indexOf(t)>-1||/[A-Z]/u.test(t))}function Ru(t,e,n,{latestValues:s},i,o=!1){const a=(jn(t)?Eu:wu)(e,s,i,t),u=mu(e,typeof t=="string",o),c=t!==A.Fragment?{...u,...a,ref:n}:{},{children:l}=e,f=A.useMemo(()=>G(l)?l.get():l,[l]);return A.createElement(t,{...c,children:f})}function ms(t){const e=[{},{}];return t?.values.forEach((n,s)=>{e[0][s]=n.get(),e[1][s]=n.getVelocity()}),e}function Fn(t,e,n,s){if(typeof e=="function"){const[i,o]=ms(s);e=e(n!==void 0?n:t.custom,i,o)}if(typeof e=="string"&&(e=t.variants&&t.variants[e]),typeof e=="function"){const[i,o]=ms(s);e=e(n!==void 0?n:t.custom,i,o)}return e}function ce(t){return G(t)?t.get():t}function Du({scrapeMotionValuesFromProps:t,createRenderState:e},n,s,i){return{latestValues:Lu(n,s,i,t),renderState:e()}}function Lu(t,e,n,s){const i={},o=s(t,{});for(const d in o)i[d]=ce(o[d]);let{initial:r,animate:a}=t;const u=xe(t),c=lr(t);e&&c&&!u&&t.inherit!==!1&&(r===void 0&&(r=e.initial),a===void 0&&(a=e.animate));let l=n?n.initial===!1:!1;l=l||r===!1;const f=l?a:r;if(f&&typeof f!="boolean"&&!Te(f)){const d=Array.isArray(f)?f:[f];for(let p=0;p(e,n)=>{const s=A.useContext(ve),i=A.useContext(ge),o=()=>Du(t,e,s,i);return n?o():lt(o)};function Bn(t,e,n){const{style:s}=t,i={};for(const o in s)(G(s[o])||e.style&&G(e.style[o])||cr(o,t)||n?.getValue(o)?.liveStyle!==void 0)&&(i[o]=s[o]);return i}const ku=mr({scrapeMotionValuesFromProps:Bn,createRenderState:On});function gr(t,e,n){const s=Bn(t,e,n);for(const i in t)if(G(t[i])||G(e[i])){const o=It.indexOf(i)!==-1?"attr"+i.charAt(0).toUpperCase()+i.substring(1):i;s[o]=t[i]}return s}const Iu=mr({scrapeMotionValuesFromProps:gr,createRenderState:dr}),Ou=Symbol.for("motionComponentSymbol");function Ct(t){return t&&typeof t=="object"&&Object.prototype.hasOwnProperty.call(t,"current")}function ju(t,e,n){return A.useCallback(s=>{s&&t.onMount&&t.onMount(s),e&&(s?e.mount(s):e.unmount()),n&&(typeof n=="function"?n(s):Ct(n)&&(n.current=s))},[e])}const _n=t=>t.replace(/([a-z])([A-Z])/gu,"$1-$2").toLowerCase(),Fu="framerAppearId",yr="data-"+_n(Fu),vr=A.createContext({});function Bu(t,e,n,s,i){const{visualElement:o}=A.useContext(ve),r=A.useContext(ar),a=A.useContext(ge),u=A.useContext(ye).reducedMotion,c=A.useRef(null);s=s||r.renderer,!c.current&&s&&(c.current=s(t,{visualState:e,parent:o,props:n,presenceContext:a,blockInitialAnimation:a?a.initial===!1:!1,reducedMotionConfig:u}));const l=c.current,f=A.useContext(vr);l&&!l.projection&&i&&(l.type==="html"||l.type==="svg")&&_u(c.current,n,i,f);const d=A.useRef(!1);A.useInsertionEffect(()=>{l&&d.current&&l.update(n,a)});const p=n[yr],m=A.useRef(!!p&&!window.MotionHandoffIsComplete?.(p)&&window.MotionHasOptimisedAnimation?.(p));return ln(()=>{l&&(d.current=!0,window.MotionIsMounted=!0,l.updateFeatures(),l.scheduleRenderMicrotask(),m.current&&l.animationState&&l.animationState.animateChanges())}),A.useEffect(()=>{l&&(!m.current&&l.animationState&&l.animationState.animateChanges(),m.current&&(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(p)}),m.current=!1),l.enteringChildren=void 0)}),l}function _u(t,e,n,s){const{layoutId:i,layout:o,drag:r,dragConstraints:a,layoutScroll:u,layoutRoot:c,layoutCrossfade:l}=e;t.projection=new n(t.latestValues,e["data-framer-portal-id"]?void 0:Tr(t.parent)),t.projection.setOptions({layoutId:i,layout:o,alwaysMeasureLayout:!!r||a&&Ct(a),visualElement:t,animationType:typeof o=="string"?o:"both",initialPromotionConfig:s,crossfade:l,layoutScroll:u,layoutRoot:c})}function Tr(t){if(t)return t.options.allowProjection!==!1?t.projection:Tr(t.parent)}function Me(t,{forwardMotionProps:e=!1}={},n,s){n&&hu(n);const i=jn(t)?Iu:ku;function o(a,u){let c;const l={...A.useContext(ye),...a,layoutId:Nu(a)},{isStatic:f}=l,d=yu(a),p=i(a,f);if(!f&&un){Uu();const m=$u(l);c=m.MeasureLayout,d.visualElement=Bu(t,p,l,s,m.ProjectionNode)}return tt.jsxs(ve.Provider,{value:d,children:[c&&d.visualElement?tt.jsx(c,{visualElement:d.visualElement,...l}):null,Ru(t,a,ju(p,d.visualElement,u),p,f,e)]})}o.displayName=`motion.${typeof t=="string"?t:`create(${t.displayName??t.name??""})`}`;const r=A.forwardRef(o);return r[Ou]=t,r}function Nu({layoutId:t}){const e=A.useContext(an).id;return e&&t!==void 0?e+"-"+t:t}function Uu(t,e){A.useContext(ar).strict}function $u(t){const{drag:e,layout:n}=Lt;if(!e&&!n)return{};const s={...e,...n};return{MeasureLayout:e?.isEnabled(t)||n?.isEnabled(t)?s.MeasureLayout:void 0,ProjectionNode:s.ProjectionNode}}function Wu(t,e){if(typeof Proxy>"u")return Me;const n=new Map,s=(o,r)=>Me(o,r,t,e),i=(o,r)=>s(o,r);return new Proxy(i,{get:(o,r)=>r==="create"?s:(n.has(r)||n.set(r,Me(r,void 0,t,e)),n.get(r))})}function xr({top:t,left:e,right:n,bottom:s}){return{x:{min:e,max:n},y:{min:t,max:s}}}function Ku({x:t,y:e}){return{top:e.min,right:t.max,bottom:e.max,left:t.min}}function Hu(t,e){if(!e)return t;const n=e({x:t.left,y:t.top}),s=e({x:t.right,y:t.bottom});return{top:n.y,left:n.x,bottom:s.y,right:s.x}}function Re(t){return t===void 0||t===1}function Je({scale:t,scaleX:e,scaleY:n}){return!Re(t)||!Re(e)||!Re(n)}function Tt(t){return Je(t)||Pr(t)||t.z||t.rotate||t.rotateX||t.rotateY||t.skewX||t.skewY}function Pr(t){return gs(t.x)||gs(t.y)}function gs(t){return t&&t!=="0%"}function me(t,e,n){const s=t-n,i=e*s;return n+i}function ys(t,e,n,s,i){return i!==void 0&&(t=me(t,i,s)),me(t,n,s)+e}function Qe(t,e=0,n=1,s,i){t.min=ys(t.min,e,n,s,i),t.max=ys(t.max,e,n,s,i)}function Ar(t,{x:e,y:n}){Qe(t.x,e.translate,e.scale,e.originPoint),Qe(t.y,n.translate,n.scale,n.originPoint)}const vs=.999999999999,Ts=1.0000000000001;function Gu(t,e,n,s=!1){const i=n.length;if(!i)return;e.x=e.y=1;let o,r;for(let a=0;avs&&(e.x=1),e.yvs&&(e.y=1)}function Vt(t,e){t.min=t.min+e,t.max=t.max+e}function xs(t,e,n,s,i=.5){const o=F(t.min,t.max,i);Qe(t,e,n,o,s)}function Et(t,e){xs(t.x,e.x,e.scaleX,e.scale,e.originX),xs(t.y,e.y,e.scaleY,e.scale,e.originY)}function Sr(t,e){return xr(Hu(t.getBoundingClientRect(),e))}function Yu(t,e,n){const s=Sr(t,n),{scroll:i}=e;return i&&(Vt(s.x,i.offset.x),Vt(s.y,i.offset.y)),s}const Ps=()=>({translate:0,scale:1,origin:0,originPoint:0}),Mt=()=>({x:Ps(),y:Ps()}),As=()=>({min:0,max:0}),U=()=>({x:As(),y:As()}),tn={current:null},wr={current:!1};function zu(){if(wr.current=!0,!!un)if(window.matchMedia){const t=window.matchMedia("(prefers-reduced-motion)"),e=()=>tn.current=t.matches;t.addEventListener("change",e),e()}else tn.current=!1}const Zt=new WeakMap;function Xu(t,e,n){for(const s in e){const i=e[s],o=n[s];if(G(i))t.addValue(s,i);else if(G(o))t.addValue(s,wt(i,{owner:t}));else if(o!==i)if(t.hasValue(s)){const r=t.getValue(s);r.liveStyle===!0?r.jump(i):r.hasAnimated||r.set(i)}else{const r=t.getStaticValue(s);t.addValue(s,wt(r!==void 0?r:i,{owner:t}))}}for(const s in n)e[s]===void 0&&t.removeValue(s);return e}const Ss=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];class br{scrapeMotionValuesFromProps(e,n,s){return{}}constructor({parent:e,props:n,presenceContext:s,reducedMotionConfig:i,blockInitialAnimation:o,visualState:r},a={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=bn,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const d=q.now();this.renderScheduledAtthis.bindToMotionValue(s,n)),wr.current||zu(),this.shouldReduceMotion=this.reducedMotionConfig==="never"?!1:this.reducedMotionConfig==="always"?!0:tn.current,this.parent?.addChild(this),this.update(this.props,this.presenceContext)}unmount(){this.projection&&this.projection.unmount(),ht(this.notifyUpdate),ht(this.render),this.valueSubscriptions.forEach(e=>e()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent?.removeChild(this);for(const e in this.events)this.events[e].clear();for(const e in this.features){const n=this.features[e];n&&(n.unmount(),n.isMounted=!1)}this.current=null}addChild(e){this.children.add(e),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(e)}removeChild(e){this.children.delete(e),this.enteringChildren&&this.enteringChildren.delete(e)}bindToMotionValue(e,n){this.valueSubscriptions.has(e)&&this.valueSubscriptions.get(e)();const s=Ot.has(e);s&&this.onBindTransform&&this.onBindTransform();const i=n.on("change",r=>{this.latestValues[e]=r,this.props.onUpdate&&B.preRender(this.notifyUpdate),s&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let o;window.MotionCheckAppearSync&&(o=window.MotionCheckAppearSync(this,e,n)),this.valueSubscriptions.set(e,()=>{i(),o&&o(),n.owner&&n.stop()})}sortNodePosition(e){return!this.current||!this.sortInstanceNodePosition||this.type!==e.type?0:this.sortInstanceNodePosition(this.current,e.current)}updateFeatures(){let e="animation";for(e in Lt){const n=Lt[e];if(!n)continue;const{isEnabled:s,Feature:i}=n;if(!this.features[e]&&i&&s(this.props)&&(this.features[e]=new i(this)),this.features[e]){const o=this.features[e];o.isMounted?o.update():(o.mount(),o.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):U()}getStaticValue(e){return this.latestValues[e]}setStaticValue(e,n){this.latestValues[e]=n}update(e,n){(e.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=e,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let s=0;sn.variantChildren.delete(e)}addValue(e,n){const s=this.values.get(e);n!==s&&(s&&this.removeValue(e),this.bindToMotionValue(e,n),this.values.set(e,n),this.latestValues[e]=n.get())}removeValue(e){this.values.delete(e);const n=this.valueSubscriptions.get(e);n&&(n(),this.valueSubscriptions.delete(e)),delete this.latestValues[e],this.removeValueFromRenderState(e,this.renderState)}hasValue(e){return this.values.has(e)}getValue(e,n){if(this.props.values&&this.props.values[e])return this.props.values[e];let s=this.values.get(e);return s===void 0&&n!==void 0&&(s=wt(n===null?void 0:n,{owner:this}),this.addValue(e,s)),s}readValue(e,n){let s=this.latestValues[e]!==void 0||!this.current?this.latestValues[e]:this.getBaseTargetFromProps(this.props,e)??this.readValueFromInstance(this.current,e,this.options);return s!=null&&(typeof s=="string"&&(ci(s)||hi(s))?s=parseFloat(s):!ru(s)&&mt.test(n)&&(s=Ji(e,n)),this.setBaseTarget(e,G(s)?s.get():s)),G(s)?s.get():s}setBaseTarget(e,n){this.baseTarget[e]=n}getBaseTarget(e){const{initial:n}=this.props;let s;if(typeof n=="string"||typeof n=="object"){const o=Fn(this.props,n,this.presenceContext?.custom);o&&(s=o[e])}if(n&&s!==void 0)return s;const i=this.getBaseTargetFromProps(this.props,e);return i!==void 0&&!G(i)?i:this.initialValues[e]!==void 0&&s===void 0?void 0:this.baseTarget[e]}on(e,n){return this.events[e]||(this.events[e]=new dn),this.events[e].add(n)}notify(e,...n){this.events[e]&&this.events[e].notify(...n)}scheduleRenderMicrotask(){Mn.render(this.render)}}class Cr extends br{constructor(){super(...arguments),this.KeyframeResolver=Ya}sortInstanceNodePosition(e,n){return e.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(e,n){return e.style?e.style[n]:void 0}removeValueFromRenderState(e,{vars:n,style:s}){delete n[e],delete s[e]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:e}=this.props;G(e)&&(this.childSubscription=e.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}}function Vr(t,{style:e,vars:n},s,i){const o=t.style;let r;for(r in e)o[r]=e[r];i?.applyProjectionStyles(o,s);for(r in n)o.setProperty(r,n[r])}function qu(t){return window.getComputedStyle(t)}class Er extends Cr{constructor(){super(...arguments),this.type="html",this.renderInstance=Vr}readValueFromInstance(e,n){if(Ot.has(n))return this.projection?.isProjecting?He(n):ca(e,n);{const s=qu(e),i=(gn(n)?s.getPropertyValue(n):s[n])||0;return typeof i=="string"?i.trim():i}}measureInstanceViewportBox(e,{transformPagePoint:n}){return Sr(e,n)}build(e,n,s){In(e,n,s.transformTemplate)}scrapeMotionValuesFromProps(e,n,s){return Bn(e,n,s)}}const Mr=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function Zu(t,e,n,s){Vr(t,e,void 0,s);for(const i in e.attrs)t.setAttribute(Mr.has(i)?i:_n(i),e.attrs[i])}class Rr extends Cr{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=U}getBaseTargetFromProps(e,n){return e[n]}readValueFromInstance(e,n){if(Ot.has(n)){const s=Zi(n);return s&&s.default||0}return n=Mr.has(n)?n:_n(n),e.getAttribute(n)}scrapeMotionValuesFromProps(e,n,s){return gr(e,n,s)}build(e,n,s){hr(e,n,this.isSVGTag,s.transformTemplate,s.style)}renderInstance(e,n,s,i){Zu(e,n,s,i)}mount(e){this.isSVGTag=pr(e.tagName),super.mount(e)}}const Ju=(t,e)=>jn(t)?new Rr(e):new Er(e,{allowProjection:t!==A.Fragment});function Rt(t,e,n){const s=t.getProps();return Fn(s,e,n!==void 0?n:s.custom,t)}const en=t=>Array.isArray(t);function Qu(t,e,n){t.hasValue(e)?t.getValue(e).set(n):t.addValue(e,wt(n))}function tl(t){return en(t)?t[t.length-1]||0:t}function el(t,e){const n=Rt(t,e);let{transitionEnd:s={},transition:i={},...o}=n||{};o={...o,...s};for(const r in o){const a=tl(o[r]);Qu(t,r,a)}}function nl(t){return!!(G(t)&&t.add)}function nn(t,e){const n=t.getValue("willChange");if(nl(n))return n.add(e);if(!n&&ft.WillChange){const s=new ft.WillChange("auto");t.addValue("willChange",s),s.add(e)}}function Dr(t){return t.props[yr]}const sl=t=>t!==null;function il(t,{repeat:e,repeatType:n="loop"},s){const i=t.filter(sl),o=e&&n!=="loop"&&e%2===1?0:i.length-1;return i[o]}const rl={type:"spring",stiffness:500,damping:25,restSpeed:10},ol=t=>({type:"spring",stiffness:550,damping:t===0?2*Math.sqrt(550):30,restSpeed:10}),al={type:"keyframes",duration:.8},ul={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},ll=(t,{keyframes:e})=>e.length>2?al:Ot.has(t)?t.startsWith("scale")?ol(e[1]):rl:ul;function cl({when:t,delay:e,delayChildren:n,staggerChildren:s,staggerDirection:i,repeat:o,repeatType:r,repeatDelay:a,from:u,elapsed:c,...l}){return!!Object.keys(l).length}const Nn=(t,e,n,s={},i,o)=>r=>{const a=Vn(s,t)||{},u=a.delay||s.delay||0;let{elapsed:c=0}=s;c=c-it(u);const l={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:e.getVelocity(),...a,delay:-c,onUpdate:d=>{e.set(d),a.onUpdate&&a.onUpdate(d)},onComplete:()=>{r(),a.onComplete&&a.onComplete()},name:t,motionValue:e,element:o?void 0:i};cl(a)||Object.assign(l,ll(t,l)),l.duration&&(l.duration=it(l.duration)),l.repeatDelay&&(l.repeatDelay=it(l.repeatDelay)),l.from!==void 0&&(l.keyframes[0]=l.from);let f=!1;if((l.type===!1||l.duration===0&&!l.repeatDelay)&&(qe(l),l.delay===0&&(f=!0)),(ft.instantAnimations||ft.skipAnimations)&&(f=!0,qe(l),l.delay=0),l.allowFlatten=!a.type&&!a.ease,f&&!o&&e.get()!==void 0){const d=il(l.keyframes,a);if(d!==void 0){B.update(()=>{l.onUpdate(d),l.onComplete()});return}}return a.isSync?new wn(l):new ka(l)};function fl({protectedKeys:t,needsAnimating:e},n){const s=t.hasOwnProperty(n)&&e[n]!==!0;return e[n]=!1,s}function Un(t,e,{delay:n=0,transitionOverride:s,type:i}={}){let{transition:o=t.getDefaultTransition(),transitionEnd:r,...a}=e;s&&(o=s);const u=[],c=i&&t.animationState&&t.animationState.getState()[i];for(const l in a){const f=t.getValue(l,t.latestValues[l]??null),d=a[l];if(d===void 0||c&&fl(c,l))continue;const p={delay:n,...Vn(o||{},l)},m=f.get();if(m!==void 0&&!f.isAnimating&&!Array.isArray(d)&&d===m&&!p.velocity)continue;let v=!1;if(window.MotionHandoffAnimation){const y=Dr(t);if(y){const P=window.MotionHandoffAnimation(y,l,B);P!==null&&(p.startTime=P,v=!0)}}nn(t,l),f.start(Nn(l,f,d,t.shouldReduceMotion&&zi.has(l)?{type:!1}:p,t,v));const T=f.animation;T&&u.push(T)}return r&&Promise.all(u).then(()=>{B.update(()=>{r&&el(t,r)})}),u}function Lr(t,e,n,s=0,i=1){const o=Array.from(t).sort((c,l)=>c.sortNodePosition(l)).indexOf(e),r=t.size,a=(r-1)*s;return typeof n=="function"?n(o,r):i===1?o*s:a-o*s}function sn(t,e,n={}){const s=Rt(t,e,n.type==="exit"?t.presenceContext?.custom:void 0);let{transition:i=t.getDefaultTransition()||{}}=s||{};n.transitionOverride&&(i=n.transitionOverride);const o=s?()=>Promise.all(Un(t,s,n)):()=>Promise.resolve(),r=t.variantChildren&&t.variantChildren.size?(u=0)=>{const{delayChildren:c=0,staggerChildren:l,staggerDirection:f}=i;return hl(t,e,u,c,l,f,n)}:()=>Promise.resolve(),{when:a}=i;if(a){const[u,c]=a==="beforeChildren"?[o,r]:[r,o];return u().then(()=>c())}else return Promise.all([o(),r(n.delay)])}function hl(t,e,n=0,s=0,i=0,o=1,r){const a=[];for(const u of t.variantChildren)u.notify("AnimationStart",e),a.push(sn(u,e,{...r,delay:n+(typeof s=="function"?0:s)+Lr(t.variantChildren,u,s,i,o)}).then(()=>u.notify("AnimationComplete",e)));return Promise.all(a)}function dl(t,e,n={}){t.notify("AnimationStart",e);let s;if(Array.isArray(e)){const i=e.map(o=>sn(t,o,n));s=Promise.all(i)}else if(typeof e=="string")s=sn(t,e,n);else{const i=typeof e=="function"?Rt(t,e,n.custom):e;s=Promise.all(Un(t,i,n))}return s.then(()=>{t.notify("AnimationComplete",e)})}function kr(t,e){if(!Array.isArray(e))return!1;const n=e.length;if(n!==t.length)return!1;for(let s=0;sPromise.all(e.map(({animation:n,options:s})=>dl(t,n,s)))}function vl(t){let e=yl(t),n=ws(),s=!0;const i=u=>(c,l)=>{const f=Rt(t,l,u==="exit"?t.presenceContext?.custom:void 0);if(f){const{transition:d,transitionEnd:p,...m}=f;c={...c,...m,...p}}return c};function o(u){e=u(t)}function r(u){const{props:c}=t,l=Ir(t.parent)||{},f=[],d=new Set;let p={},m=1/0;for(let T=0;Tm&&C,L=!1;const W=Array.isArray(x)?x:[x];let N=W.reduce(i(y),{});w===!1&&(N={});const{prevResolvedValues:dt={}}=P,at={...dt,...N},yt=O=>{b=!0,d.has(O)&&(L=!0,d.delete(O)),P.needsAnimating[O]=!0;const _=t.getValue(O);_&&(_.liveStyle=!1)};for(const O in at){const _=N[O],Z=dt[O];if(p.hasOwnProperty(O))continue;let nt=!1;en(_)&&en(Z)?nt=!kr(_,Z):nt=_!==Z,nt?_!=null?yt(O):d.add(O):_!==void 0&&d.has(O)?yt(O):P.protectedKeys[O]=!0}P.prevProp=x,P.prevResolvedValues=N,P.isActive&&(p={...p,...N}),s&&t.blockInitialAnimation&&(b=!1);const jt=V&&S;b&&(!jt||L)&&f.push(...W.map(O=>{const _={type:y};if(typeof O=="string"&&s&&!jt&&t.manuallyAnimateOnMount&&t.parent){const{parent:Z}=t,nt=Rt(Z,O);if(Z.enteringChildren&&nt){const{delayChildren:h}=nt.transition||{};_.delay=Lr(Z.enteringChildren,t,h)}}return{animation:O,options:_}}))}if(d.size){const T={};if(typeof c.initial!="boolean"){const y=Rt(t,Array.isArray(c.initial)?c.initial[0]:c.initial);y&&y.transition&&(T.transition=y.transition)}d.forEach(y=>{const P=t.getBaseTarget(y),x=t.getValue(y);x&&(x.liveStyle=!0),T[y]=P??null}),f.push({animation:T})}let v=!!f.length;return s&&(c.initial===!1||c.initial===c.animate)&&!t.manuallyAnimateOnMount&&(v=!1),s=!1,v?e(f):Promise.resolve()}function a(u,c){if(n[u].isActive===c)return Promise.resolve();t.variantChildren?.forEach(f=>f.animationState?.setActive(u,c)),n[u].isActive=c;const l=r(u);for(const f in n)n[f].protectedKeys={};return l}return{animateChanges:r,setActive:a,setAnimateFunction:o,getState:()=>n,reset:()=>{n=ws(),s=!0}}}function Tl(t,e){return typeof e=="string"?e!==t:Array.isArray(e)?!kr(e,t):!1}function vt(t=!1){return{isActive:t,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function ws(){return{animate:vt(!0),whileInView:vt(),whileHover:vt(),whileTap:vt(),whileDrag:vt(),whileFocus:vt(),exit:vt()}}class gt{constructor(e){this.isMounted=!1,this.node=e}update(){}}class xl extends gt{constructor(e){super(e),e.animationState||(e.animationState=vl(e))}updateAnimationControlsSubscription(){const{animate:e}=this.node.getProps();Te(e)&&(this.unmountControls=e.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:e}=this.node.getProps(),{animate:n}=this.node.prevProps||{};e!==n&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}}let Pl=0;class Al extends gt{constructor(){super(...arguments),this.id=Pl++}update(){if(!this.node.presenceContext)return;const{isPresent:e,onExitComplete:n}=this.node.presenceContext,{isPresent:s}=this.node.prevPresenceContext||{};if(!this.node.animationState||e===s)return;const i=this.node.animationState.setActive("exit",!e);n&&!e&&i.then(()=>{n(this.id)})}mount(){const{register:e,onExitComplete:n}=this.node.presenceContext||{};n&&n(this.id),e&&(this.unmount=e(this.id))}unmount(){}}const Sl={animation:{Feature:xl},exit:{Feature:Al}};function Jt(t,e,n,s={passive:!0}){return t.addEventListener(e,n,s),()=>t.removeEventListener(e,n)}function se(t){return{point:{x:t.pageX,y:t.pageY}}}const wl=t=>e=>Rn(e)&&t(e,se(e));function Wt(t,e,n,s){return Jt(t,e,wl(n),s)}const Or=1e-4,bl=1-Or,Cl=1+Or,jr=.01,Vl=0-jr,El=0+jr;function X(t){return t.max-t.min}function Ml(t,e,n){return Math.abs(t-e)<=n}function bs(t,e,n,s=.5){t.origin=s,t.originPoint=F(e.min,e.max,t.origin),t.scale=X(n)/X(e),t.translate=F(n.min,n.max,t.origin)-t.originPoint,(t.scale>=bl&&t.scale<=Cl||isNaN(t.scale))&&(t.scale=1),(t.translate>=Vl&&t.translate<=El||isNaN(t.translate))&&(t.translate=0)}function Kt(t,e,n,s){bs(t.x,e.x,n.x,s?s.originX:void 0),bs(t.y,e.y,n.y,s?s.originY:void 0)}function Cs(t,e,n){t.min=n.min+e.min,t.max=t.min+X(e)}function Rl(t,e,n){Cs(t.x,e.x,n.x),Cs(t.y,e.y,n.y)}function Vs(t,e,n){t.min=e.min-n.min,t.max=t.min+X(e)}function Ht(t,e,n){Vs(t.x,e.x,n.x),Vs(t.y,e.y,n.y)}function Q(t){return[t("x"),t("y")]}const Fr=({current:t})=>t?t.ownerDocument.defaultView:null,Es=(t,e)=>Math.abs(t-e);function Dl(t,e){const n=Es(t.x,e.x),s=Es(t.y,e.y);return Math.sqrt(n**2+s**2)}class Br{constructor(e,n,{transformPagePoint:s,contextWindow:i=window,dragSnapToOrigin:o=!1,distanceThreshold:r=3}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const d=Le(this.lastMoveEventInfo,this.history),p=this.startEvent!==null,m=Dl(d.offset,{x:0,y:0})>=this.distanceThreshold;if(!p&&!m)return;const{point:v}=d,{timestamp:T}=Y;this.history.push({...v,timestamp:T});const{onStart:y,onMove:P}=this.handlers;p||(y&&y(this.lastMoveEvent,d),this.startEvent=this.lastMoveEvent),P&&P(this.lastMoveEvent,d)},this.handlePointerMove=(d,p)=>{this.lastMoveEvent=d,this.lastMoveEventInfo=De(p,this.transformPagePoint),B.update(this.updatePoint,!0)},this.handlePointerUp=(d,p)=>{this.end();const{onEnd:m,onSessionEnd:v,resumeAnimation:T}=this.handlers;if(this.dragSnapToOrigin&&T&&T(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const y=Le(d.type==="pointercancel"?this.lastMoveEventInfo:De(p,this.transformPagePoint),this.history);this.startEvent&&m&&m(d,y),v&&v(d,y)},!Rn(e))return;this.dragSnapToOrigin=o,this.handlers=n,this.transformPagePoint=s,this.distanceThreshold=r,this.contextWindow=i||window;const a=se(e),u=De(a,this.transformPagePoint),{point:c}=u,{timestamp:l}=Y;this.history=[{...c,timestamp:l}];const{onSessionStart:f}=n;f&&f(e,Le(u,this.history)),this.removeListeners=te(Wt(this.contextWindow,"pointermove",this.handlePointerMove),Wt(this.contextWindow,"pointerup",this.handlePointerUp),Wt(this.contextWindow,"pointercancel",this.handlePointerUp))}updateHandlers(e){this.handlers=e}end(){this.removeListeners&&this.removeListeners(),ht(this.updatePoint)}}function De(t,e){return e?{point:e(t.point)}:t}function Ms(t,e){return{x:t.x-e.x,y:t.y-e.y}}function Le({point:t},e){return{point:t,delta:Ms(t,_r(e)),offset:Ms(t,Ll(e)),velocity:kl(e,.1)}}function Ll(t){return t[0]}function _r(t){return t[t.length-1]}function kl(t,e){if(t.length<2)return{x:0,y:0};let n=t.length-1,s=null;const i=_r(t);for(;n>=0&&(s=t[n],!(i.timestamp-s.timestamp>it(e)));)n--;if(!s)return{x:0,y:0};const o=rt(i.timestamp-s.timestamp);if(o===0)return{x:0,y:0};const r={x:(i.x-s.x)/o,y:(i.y-s.y)/o};return r.x===1/0&&(r.x=0),r.y===1/0&&(r.y=0),r}function Il(t,{min:e,max:n},s){return e!==void 0&&tn&&(t=s?F(n,t,s.max):Math.min(t,n)),t}function Rs(t,e,n){return{min:e!==void 0?t.min+e:void 0,max:n!==void 0?t.max+n-(t.max-t.min):void 0}}function Ol(t,{top:e,left:n,bottom:s,right:i}){return{x:Rs(t.x,n,i),y:Rs(t.y,e,s)}}function Ds(t,e){let n=e.min-t.min,s=e.max-t.max;return e.max-e.mins?n=Dt(e.min,e.max-s,t.min):s>i&&(n=Dt(t.min,t.max-i,e.min)),ct(0,1,n)}function Bl(t,e){const n={};return e.min!==void 0&&(n.min=e.min-t.min),e.max!==void 0&&(n.max=e.max-t.min),n}const rn=.35;function _l(t=rn){return t===!1?t=0:t===!0&&(t=rn),{x:Ls(t,"left","right"),y:Ls(t,"top","bottom")}}function Ls(t,e,n){return{min:ks(t,e),max:ks(t,n)}}function ks(t,e){return typeof t=="number"?t:t[e]||0}const Nl=new WeakMap;class Ul{constructor(e){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=U(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=e}start(e,{snapToCursor:n=!1,distanceThreshold:s}={}){const{presenceContext:i}=this.visualElement;if(i&&i.isPresent===!1)return;const o=f=>{const{dragSnapToOrigin:d}=this.getProps();d?this.pauseAnimation():this.stopAnimation(),n&&this.snapToCursor(se(f).point)},r=(f,d)=>{const{drag:p,dragPropagation:m,onDragStart:v}=this.getProps();if(p&&!m&&(this.openDragLock&&this.openDragLock(),this.openDragLock=qa(p),!this.openDragLock))return;this.latestPointerEvent=f,this.latestPanInfo=d,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Q(y=>{let P=this.getAxisMotionValue(y).get()||0;if(ot.test(P)){const{projection:x}=this.visualElement;if(x&&x.layout){const C=x.layout.layoutBox[y];C&&(P=X(C)*(parseFloat(P)/100))}}this.originPoint[y]=P}),v&&B.postRender(()=>v(f,d)),nn(this.visualElement,"transform");const{animationState:T}=this.visualElement;T&&T.setActive("whileDrag",!0)},a=(f,d)=>{this.latestPointerEvent=f,this.latestPanInfo=d;const{dragPropagation:p,dragDirectionLock:m,onDirectionLock:v,onDrag:T}=this.getProps();if(!p&&!this.openDragLock)return;const{offset:y}=d;if(m&&this.currentDirection===null){this.currentDirection=$l(y),this.currentDirection!==null&&v&&v(this.currentDirection);return}this.updateAxis("x",d.point,y),this.updateAxis("y",d.point,y),this.visualElement.render(),T&&T(f,d)},u=(f,d)=>{this.latestPointerEvent=f,this.latestPanInfo=d,this.stop(f,d),this.latestPointerEvent=null,this.latestPanInfo=null},c=()=>Q(f=>this.getAnimationState(f)==="paused"&&this.getAxisMotionValue(f).animation?.play()),{dragSnapToOrigin:l}=this.getProps();this.panSession=new Br(e,{onSessionStart:o,onStart:r,onMove:a,onSessionEnd:u,resumeAnimation:c},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:l,distanceThreshold:s,contextWindow:Fr(this.visualElement)})}stop(e,n){const s=e||this.latestPointerEvent,i=n||this.latestPanInfo,o=this.isDragging;if(this.cancel(),!o||!i||!s)return;const{velocity:r}=i;this.startAnimation(r);const{onDragEnd:a}=this.getProps();a&&B.postRender(()=>a(s,i))}cancel(){this.isDragging=!1;const{projection:e,animationState:n}=this.visualElement;e&&(e.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:s}=this.getProps();!s&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),n&&n.setActive("whileDrag",!1)}updateAxis(e,n,s){const{drag:i}=this.getProps();if(!s||!ae(e,i,this.currentDirection))return;const o=this.getAxisMotionValue(e);let r=this.originPoint[e]+s[e];this.constraints&&this.constraints[e]&&(r=Il(r,this.constraints[e],this.elastic[e])),o.set(r)}resolveConstraints(){const{dragConstraints:e,dragElastic:n}=this.getProps(),s=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):this.visualElement.projection?.layout,i=this.constraints;e&&Ct(e)?this.constraints||(this.constraints=this.resolveRefConstraints()):e&&s?this.constraints=Ol(s.layoutBox,e):this.constraints=!1,this.elastic=_l(n),i!==this.constraints&&s&&this.constraints&&!this.hasMutatedConstraints&&Q(o=>{this.constraints!==!1&&this.getAxisMotionValue(o)&&(this.constraints[o]=Bl(s.layoutBox[o],this.constraints[o]))})}resolveRefConstraints(){const{dragConstraints:e,onMeasureDragConstraints:n}=this.getProps();if(!e||!Ct(e))return!1;const s=e.current,{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const o=Yu(s,i.root,this.visualElement.getTransformPagePoint());let r=jl(i.layout.layoutBox,o);if(n){const a=n(Ku(r));this.hasMutatedConstraints=!!a,a&&(r=xr(a))}return r}startAnimation(e){const{drag:n,dragMomentum:s,dragElastic:i,dragTransition:o,dragSnapToOrigin:r,onDragTransitionEnd:a}=this.getProps(),u=this.constraints||{},c=Q(l=>{if(!ae(l,n,this.currentDirection))return;let f=u&&u[l]||{};r&&(f={min:0,max:0});const d=i?200:1e6,p=i?40:1e7,m={type:"inertia",velocity:s?e[l]:0,bounceStiffness:d,bounceDamping:p,timeConstant:750,restDelta:1,restSpeed:10,...o,...f};return this.startAxisValueAnimation(l,m)});return Promise.all(c).then(a)}startAxisValueAnimation(e,n){const s=this.getAxisMotionValue(e);return nn(this.visualElement,e),s.start(Nn(e,s,0,n,this.visualElement,!1))}stopAnimation(){Q(e=>this.getAxisMotionValue(e).stop())}pauseAnimation(){Q(e=>this.getAxisMotionValue(e).animation?.pause())}getAnimationState(e){return this.getAxisMotionValue(e).animation?.state}getAxisMotionValue(e){const n=`_drag${e.toUpperCase()}`,s=this.visualElement.getProps(),i=s[n];return i||this.visualElement.getValue(e,(s.initial?s.initial[e]:void 0)||0)}snapToCursor(e){Q(n=>{const{drag:s}=this.getProps();if(!ae(n,s,this.currentDirection))return;const{projection:i}=this.visualElement,o=this.getAxisMotionValue(n);if(i&&i.layout){const{min:r,max:a}=i.layout.layoutBox[n];o.set(e[n]-F(r,a,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:e,dragConstraints:n}=this.getProps(),{projection:s}=this.visualElement;if(!Ct(n)||!s||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Q(r=>{const a=this.getAxisMotionValue(r);if(a&&this.constraints!==!1){const u=a.get();i[r]=Fl({min:u,max:u},this.constraints[r])}});const{transformTemplate:o}=this.visualElement.getProps();this.visualElement.current.style.transform=o?o({},""):"none",s.root&&s.root.updateScroll(),s.updateLayout(),this.resolveConstraints(),Q(r=>{if(!ae(r,e,null))return;const a=this.getAxisMotionValue(r),{min:u,max:c}=this.constraints[r];a.set(F(u,c,i[r]))})}addListeners(){if(!this.visualElement.current)return;Nl.set(this.visualElement,this);const e=this.visualElement.current,n=Wt(e,"pointerdown",u=>{const{drag:c,dragListener:l=!0}=this.getProps();c&&l&&this.start(u)}),s=()=>{const{dragConstraints:u}=this.getProps();Ct(u)&&u.current&&(this.constraints=this.resolveRefConstraints())},{projection:i}=this.visualElement,o=i.addEventListener("measure",s);i&&!i.layout&&(i.root&&i.root.updateScroll(),i.updateLayout()),B.read(s);const r=Jt(window,"resize",()=>this.scalePositionWithinConstraints()),a=i.addEventListener("didUpdate",(({delta:u,hasLayoutChanged:c})=>{this.isDragging&&c&&(Q(l=>{const f=this.getAxisMotionValue(l);f&&(this.originPoint[l]+=u[l].translate,f.set(f.get()+u[l].translate))}),this.visualElement.render())}));return()=>{r(),n(),o(),a&&a()}}getProps(){const e=this.visualElement.getProps(),{drag:n=!1,dragDirectionLock:s=!1,dragPropagation:i=!1,dragConstraints:o=!1,dragElastic:r=rn,dragMomentum:a=!0}=e;return{...e,drag:n,dragDirectionLock:s,dragPropagation:i,dragConstraints:o,dragElastic:r,dragMomentum:a}}}function ae(t,e,n){return(e===!0||e===t)&&(n===null||n===t)}function $l(t,e=10){let n=null;return Math.abs(t.y)>e?n="y":Math.abs(t.x)>e&&(n="x"),n}class Wl extends gt{constructor(e){super(e),this.removeGroupControls=et,this.removeListeners=et,this.controls=new Ul(e)}mount(){const{dragControls:e}=this.node.getProps();e&&(this.removeGroupControls=e.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||et}unmount(){this.removeGroupControls(),this.removeListeners()}}const Is=t=>(e,n)=>{t&&B.postRender(()=>t(e,n))};class Kl extends gt{constructor(){super(...arguments),this.removePointerDownListener=et}onPointerDown(e){this.session=new Br(e,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:Fr(this.node)})}createPanHandlers(){const{onPanSessionStart:e,onPanStart:n,onPan:s,onPanEnd:i}=this.node.getProps();return{onSessionStart:Is(e),onStart:Is(n),onMove:s,onEnd:(o,r)=>{delete this.session,i&&B.postRender(()=>i(o,r))}}}mount(){this.removePointerDownListener=Wt(this.node.current,"pointerdown",e=>this.onPointerDown(e))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}const fe={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function Os(t,e){return e.max===e.min?0:t/(e.max-e.min)*100}const Bt={correct:(t,e)=>{if(!e.target)return t;if(typeof t=="string")if(E.test(t))t=parseFloat(t);else return t;const n=Os(t,e.target.x),s=Os(t,e.target.y);return`${n}% ${s}%`}},Hl={correct:(t,{treeScale:e,projectionDelta:n})=>{const s=t,i=mt.parse(t);if(i.length>5)return s;const o=mt.createTransformer(t),r=typeof i[0]!="number"?1:0,a=n.x.scale*e.x,u=n.y.scale*e.y;i[0+r]/=a,i[1+r]/=u;const c=F(a,u,.5);return typeof i[2+r]=="number"&&(i[2+r]/=c),typeof i[3+r]=="number"&&(i[3+r]/=c),o(i)}};let ke=!1;class Gl extends A.Component{componentDidMount(){const{visualElement:e,layoutGroup:n,switchLayoutGroup:s,layoutId:i}=this.props,{projection:o}=e;vu(Yl),o&&(n.group&&n.group.add(o),s&&s.register&&i&&s.register(o),ke&&o.root.didUpdate(),o.addEventListener("animationComplete",()=>{this.safeToRemove()}),o.setOptions({...o.options,onExitComplete:()=>this.safeToRemove()})),fe.hasEverUpdated=!0}getSnapshotBeforeUpdate(e){const{layoutDependency:n,visualElement:s,drag:i,isPresent:o}=this.props,{projection:r}=s;return r&&(r.isPresent=o,ke=!0,i||e.layoutDependency!==n||n===void 0||e.isPresent!==o?r.willUpdate():this.safeToRemove(),e.isPresent!==o&&(o?r.promote():r.relegate()||B.postRender(()=>{const a=r.getStack();(!a||!a.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:e}=this.props.visualElement;e&&(e.root.didUpdate(),Mn.postRender(()=>{!e.currentAnimation&&e.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:e,layoutGroup:n,switchLayoutGroup:s}=this.props,{projection:i}=e;ke=!0,i&&(i.scheduleCheckAfterUnmount(),n&&n.group&&n.group.remove(i),s&&s.deregister&&s.deregister(i))}safeToRemove(){const{safeToRemove:e}=this.props;e&&e()}render(){return null}}function Nr(t){const[e,n]=or(),s=A.useContext(an);return tt.jsx(Gl,{...t,layoutGroup:s,switchLayoutGroup:A.useContext(vr),isPresent:e,safeToRemove:n})}const Yl={borderRadius:{...Bt,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:Bt,borderTopRightRadius:Bt,borderBottomLeftRadius:Bt,borderBottomRightRadius:Bt,boxShadow:Hl};function Ur(t,e,n){const s=G(t)?t:wt(t);return s.start(Nn("",s,e,n)),s.animation}const zl=(t,e)=>t.depth-e.depth;class Xl{constructor(){this.children=[],this.isDirty=!1}add(e){cn(this.children,e),this.isDirty=!0}remove(e){Qt(this.children,e),this.isDirty=!0}forEach(e){this.isDirty&&this.children.sort(zl),this.isDirty=!1,this.children.forEach(e)}}function ql(t,e){const n=q.now(),s=({timestamp:i})=>{const o=i-n;o>=e&&(ht(s),t(o-e))};return B.setup(s,!0),()=>ht(s)}const $r=["TopLeft","TopRight","BottomLeft","BottomRight"],Zl=$r.length,js=t=>typeof t=="string"?parseFloat(t):t,Fs=t=>typeof t=="number"||E.test(t);function Jl(t,e,n,s,i,o){i?(t.opacity=F(0,n.opacity??1,Ql(s)),t.opacityExit=F(e.opacity??1,0,tc(s))):o&&(t.opacity=F(e.opacity??1,n.opacity??1,s));for(let r=0;rse?1:n(Dt(t,e,s))}function _s(t,e){t.min=e.min,t.max=e.max}function J(t,e){_s(t.x,e.x),_s(t.y,e.y)}function Ns(t,e){t.translate=e.translate,t.scale=e.scale,t.originPoint=e.originPoint,t.origin=e.origin}function Us(t,e,n,s,i){return t-=e,t=me(t,1/n,s),i!==void 0&&(t=me(t,1/i,s)),t}function ec(t,e=0,n=1,s=.5,i,o=t,r=t){if(ot.test(e)&&(e=parseFloat(e),e=F(r.min,r.max,e/100)-r.min),typeof e!="number")return;let a=F(o.min,o.max,s);t===o&&(a-=e),t.min=Us(t.min,e,n,a,i),t.max=Us(t.max,e,n,a,i)}function $s(t,e,[n,s,i],o,r){ec(t,e[n],e[s],e[i],e.scale,o,r)}const nc=["x","scaleX","originX"],sc=["y","scaleY","originY"];function Ws(t,e,n,s){$s(t.x,e,nc,n?n.x:void 0,s?s.x:void 0),$s(t.y,e,sc,n?n.y:void 0,s?s.y:void 0)}function Ks(t){return t.translate===0&&t.scale===1}function Kr(t){return Ks(t.x)&&Ks(t.y)}function Hs(t,e){return t.min===e.min&&t.max===e.max}function ic(t,e){return Hs(t.x,e.x)&&Hs(t.y,e.y)}function Gs(t,e){return Math.round(t.min)===Math.round(e.min)&&Math.round(t.max)===Math.round(e.max)}function Hr(t,e){return Gs(t.x,e.x)&&Gs(t.y,e.y)}function Ys(t){return X(t.x)/X(t.y)}function zs(t,e){return t.translate===e.translate&&t.scale===e.scale&&t.originPoint===e.originPoint}class rc{constructor(){this.members=[]}add(e){cn(this.members,e),e.scheduleRender()}remove(e){if(Qt(this.members,e),e===this.prevLead&&(this.prevLead=void 0),e===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(e){const n=this.members.findIndex(i=>e===i);if(n===0)return!1;let s;for(let i=n;i>=0;i--){const o=this.members[i];if(o.isPresent!==!1){s=o;break}}return s?(this.promote(s),!0):!1}promote(e,n){const s=this.lead;if(e!==s&&(this.prevLead=s,this.lead=e,e.show(),s)){s.instance&&s.scheduleRender(),e.scheduleRender(),e.resumeFrom=s,n&&(e.resumeFrom.preserveOpacity=!0),s.snapshot&&(e.snapshot=s.snapshot,e.snapshot.latestValues=s.animationValues||s.latestValues),e.root&&e.root.isUpdating&&(e.isLayoutDirty=!0);const{crossfade:i}=e.options;i===!1&&s.hide()}}exitAnimationComplete(){this.members.forEach(e=>{const{options:n,resumingFrom:s}=e;n.onExitComplete&&n.onExitComplete(),s&&s.options.onExitComplete&&s.options.onExitComplete()})}scheduleRender(){this.members.forEach(e=>{e.instance&&e.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function oc(t,e,n){let s="";const i=t.x.translate/e.x,o=t.y.translate/e.y,r=n?.z||0;if((i||o||r)&&(s=`translate3d(${i}px, ${o}px, ${r}px) `),(e.x!==1||e.y!==1)&&(s+=`scale(${1/e.x}, ${1/e.y}) `),n){const{transformPerspective:c,rotate:l,rotateX:f,rotateY:d,skewX:p,skewY:m}=n;c&&(s=`perspective(${c}px) ${s}`),l&&(s+=`rotate(${l}deg) `),f&&(s+=`rotateX(${f}deg) `),d&&(s+=`rotateY(${d}deg) `),p&&(s+=`skewX(${p}deg) `),m&&(s+=`skewY(${m}deg) `)}const a=t.x.scale*e.x,u=t.y.scale*e.y;return(a!==1||u!==1)&&(s+=`scale(${a}, ${u})`),s||"none"}const Ie=["","X","Y","Z"],ac=1e3;let uc=0;function Oe(t,e,n,s){const{latestValues:i}=e;i[t]&&(n[t]=i[t],e.setStaticValue(t,0),s&&(s[t]=0))}function Gr(t){if(t.hasCheckedOptimisedAppear=!0,t.root===t)return;const{visualElement:e}=t.options;if(!e)return;const n=Dr(e);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:i,layoutId:o}=t.options;window.MotionCancelOptimisedAnimation(n,"transform",B,!(i||o))}const{parent:s}=t;s&&!s.hasCheckedOptimisedAppear&&Gr(s)}function Yr({attachResizeListener:t,defaultParent:e,measureScroll:n,checkIsScrollRoot:s,resetTransform:i}){return class{constructor(r={},a=e?.()){this.id=uc++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(fc),this.nodes.forEach(mc),this.nodes.forEach(gc),this.nodes.forEach(hc)},this.resolvedRelativeTargetAt=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=r,this.root=a?a.root||a:this,this.path=a?[...a.path,a]:[],this.parent=a,this.depth=a?a.depth+1:0;for(let u=0;uthis.root.updateBlockedByResize=!1;B.read(()=>{f=window.innerWidth}),t(r,()=>{const p=window.innerWidth;p!==f&&(f=p,this.root.updateBlockedByResize=!0,l&&l(),l=ql(d,250),fe.hasAnimatedSinceResize&&(fe.hasAnimatedSinceResize=!1,this.nodes.forEach(Zs)))})}a&&this.root.registerSharedNode(a,this),this.options.animate!==!1&&c&&(a||u)&&this.addEventListener("didUpdate",({delta:l,hasLayoutChanged:f,hasRelativeLayoutChanged:d,layout:p})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const m=this.options.transition||c.getDefaultTransition()||Pc,{onLayoutAnimationStart:v,onLayoutAnimationComplete:T}=c.getProps(),y=!this.targetLayout||!Hr(this.targetLayout,p),P=!f&&d;if(this.options.layoutRoot||this.resumeFrom||P||f&&(y||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const x={...Vn(m,"layout"),onPlay:v,onComplete:T};(c.shouldReduceMotion||this.options.layoutRoot)&&(x.delay=0,x.type=!1),this.startAnimation(x),this.setAnimationOrigin(l,P)}else f||Zs(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=p})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const r=this.getStack();r&&r.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),ht(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(yc),this.animationId++)}getTransformTemplate(){const{visualElement:r}=this.options;return r&&r.getProps().transformTemplate}willUpdate(r=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&Gr(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let l=0;l{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!X(this.snapshot.measuredBox.x)&&!X(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let u=0;u{const w=C/1e3;Js(f.x,r.x,w),Js(f.y,r.y,w),this.setTargetDelta(f),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(Ht(d,this.layout.layoutBox,this.relativeParent.layout.layoutBox),Tc(this.relativeTarget,this.relativeTargetOrigin,d,w),x&&ic(this.relativeTarget,x)&&(this.isProjectionDirty=!1),x||(x=U()),J(x,this.relativeTarget)),v&&(this.animationValues=l,Jl(l,c,this.latestValues,w,P,y)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=w},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(r){this.notifyListeners("animationStart"),this.currentAnimation?.stop(),this.resumingFrom?.currentAnimation?.stop(),this.pendingAnimation&&(ht(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=B.update(()=>{fe.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=wt(0)),this.currentAnimation=Ur(this.motionValue,[0,1e3],{...r,velocity:0,isSync:!0,onUpdate:a=>{this.mixTargetDelta(a),r.onUpdate&&r.onUpdate(a)},onStop:()=>{},onComplete:()=>{r.onComplete&&r.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const r=this.getStack();r&&r.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(ac),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const r=this.getLead();let{targetWithTransforms:a,target:u,layout:c,latestValues:l}=r;if(!(!a||!u||!c)){if(this!==r&&this.layout&&c&&zr(this.options.animationType,this.layout.layoutBox,c.layoutBox)){u=this.target||U();const f=X(this.layout.layoutBox.x);u.x.min=r.target.x.min,u.x.max=u.x.min+f;const d=X(this.layout.layoutBox.y);u.y.min=r.target.y.min,u.y.max=u.y.min+d}J(a,u),Et(a,l),Kt(this.projectionDeltaWithTransform,this.layoutCorrected,a,l)}}registerSharedNode(r,a){this.sharedNodes.has(r)||this.sharedNodes.set(r,new rc),this.sharedNodes.get(r).add(a);const c=a.options.initialPromotionConfig;a.promote({transition:c?c.transition:void 0,preserveFollowOpacity:c&&c.shouldPreserveFollowOpacity?c.shouldPreserveFollowOpacity(a):void 0})}isLead(){const r=this.getStack();return r?r.lead===this:!0}getLead(){const{layoutId:r}=this.options;return r?this.getStack()?.lead||this:this}getPrevLead(){const{layoutId:r}=this.options;return r?this.getStack()?.prevLead:void 0}getStack(){const{layoutId:r}=this.options;if(r)return this.root.sharedNodes.get(r)}promote({needsReset:r,transition:a,preserveFollowOpacity:u}={}){const c=this.getStack();c&&c.promote(this,u),r&&(this.projectionDelta=void 0,this.needsReset=!0),a&&this.setOptions({transition:a})}relegate(){const r=this.getStack();return r?r.relegate(this):!1}resetSkewAndRotation(){const{visualElement:r}=this.options;if(!r)return;let a=!1;const{latestValues:u}=r;if((u.z||u.rotate||u.rotateX||u.rotateY||u.rotateZ||u.skewX||u.skewY)&&(a=!0),!a)return;const c={};u.z&&Oe("z",r,c,this.animationValues);for(let l=0;lr.currentAnimation?.stop()),this.root.nodes.forEach(Xs),this.root.sharedNodes.clear()}}}function lc(t){t.updateLayout()}function cc(t){const e=t.resumeFrom?.snapshot||t.snapshot;if(t.isLead()&&t.layout&&e&&t.hasListeners("didUpdate")){const{layoutBox:n,measuredBox:s}=t.layout,{animationType:i}=t.options,o=e.source!==t.layout.source;i==="size"?Q(l=>{const f=o?e.measuredBox[l]:e.layoutBox[l],d=X(f);f.min=n[l].min,f.max=f.min+d}):zr(i,e.layoutBox,n)&&Q(l=>{const f=o?e.measuredBox[l]:e.layoutBox[l],d=X(n[l]);f.max=f.min+d,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[l].max=t.relativeTarget[l].min+d)});const r=Mt();Kt(r,n,e.layoutBox);const a=Mt();o?Kt(a,t.applyTransform(s,!0),e.measuredBox):Kt(a,n,e.layoutBox);const u=!Kr(r);let c=!1;if(!t.resumeFrom){const l=t.getClosestProjectingParent();if(l&&!l.resumeFrom){const{snapshot:f,layout:d}=l;if(f&&d){const p=U();Ht(p,e.layoutBox,f.layoutBox);const m=U();Ht(m,n,d.layoutBox),Hr(p,m)||(c=!0),l.options.layoutRoot&&(t.relativeTarget=m,t.relativeTargetOrigin=p,t.relativeParent=l)}}}t.notifyListeners("didUpdate",{layout:n,snapshot:e,delta:a,layoutDelta:r,hasLayoutChanged:u,hasRelativeLayoutChanged:c})}else if(t.isLead()){const{onExitComplete:n}=t.options;n&&n()}t.options.transition=void 0}function fc(t){t.parent&&(t.isProjecting()||(t.isProjectionDirty=t.parent.isProjectionDirty),t.isSharedProjectionDirty||(t.isSharedProjectionDirty=!!(t.isProjectionDirty||t.parent.isProjectionDirty||t.parent.isSharedProjectionDirty)),t.isTransformDirty||(t.isTransformDirty=t.parent.isTransformDirty))}function hc(t){t.isProjectionDirty=t.isSharedProjectionDirty=t.isTransformDirty=!1}function dc(t){t.clearSnapshot()}function Xs(t){t.clearMeasurements()}function qs(t){t.isLayoutDirty=!1}function pc(t){const{visualElement:e}=t.options;e&&e.getProps().onBeforeLayoutMeasure&&e.notify("BeforeLayoutMeasure"),t.resetTransform()}function Zs(t){t.finishAnimation(),t.targetDelta=t.relativeTarget=t.target=void 0,t.isProjectionDirty=!0}function mc(t){t.resolveTargetDelta()}function gc(t){t.calcProjection()}function yc(t){t.resetSkewAndRotation()}function vc(t){t.removeLeadSnapshot()}function Js(t,e,n){t.translate=F(e.translate,0,n),t.scale=F(e.scale,1,n),t.origin=e.origin,t.originPoint=e.originPoint}function Qs(t,e,n,s){t.min=F(e.min,n.min,s),t.max=F(e.max,n.max,s)}function Tc(t,e,n,s){Qs(t.x,e.x,n.x,s),Qs(t.y,e.y,n.y,s)}function xc(t){return t.animationValues&&t.animationValues.opacityExit!==void 0}const Pc={duration:.45,ease:[.4,0,.1,1]},ti=t=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(t),ei=ti("applewebkit/")&&!ti("chrome/")?Math.round:et;function ni(t){t.min=ei(t.min),t.max=ei(t.max)}function Ac(t){ni(t.x),ni(t.y)}function zr(t,e,n){return t==="position"||t==="preserve-aspect"&&!Ml(Ys(e),Ys(n),.2)}function Sc(t){return t!==t.root&&t.scroll?.wasRoot}const wc=Yr({attachResizeListener:(t,e)=>Jt(t,"resize",e),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),je={current:void 0},Xr=Yr({measureScroll:t=>({x:t.scrollLeft,y:t.scrollTop}),defaultParent:()=>{if(!je.current){const t=new wc({});t.mount(window),t.setOptions({layoutScroll:!0}),je.current=t}return je.current},resetTransform:(t,e)=>{t.style.transform=e!==void 0?e:"none"},checkIsScrollRoot:t=>window.getComputedStyle(t).position==="fixed"}),bc={pan:{Feature:Kl},drag:{Feature:Wl,ProjectionNode:Xr,MeasureLayout:Nr}};function si(t,e,n){const{props:s}=t;t.animationState&&s.whileHover&&t.animationState.setActive("whileHover",n==="Start");const i="onHover"+n,o=s[i];o&&B.postRender(()=>o(e,se(e)))}class Cc extends gt{mount(){const{current:e}=this.node;e&&(this.unmount=Za(e,(n,s)=>(si(this.node,s,"Start"),i=>si(this.node,i,"End"))))}unmount(){}}class Vc extends gt{constructor(){super(...arguments),this.isActive=!1}onFocus(){let e=!1;try{e=this.node.current.matches(":focus-visible")}catch{e=!0}!e||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=te(Jt(this.node.current,"focus",()=>this.onFocus()),Jt(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function ii(t,e,n){const{props:s}=t;if(t.current instanceof HTMLButtonElement&&t.current.disabled)return;t.animationState&&s.whileTap&&t.animationState.setActive("whileTap",n==="Start");const i="onTap"+(n==="End"?"":n),o=s[i];o&&B.postRender(()=>o(e,se(e)))}class Ec extends gt{mount(){const{current:e}=this.node;e&&(this.unmount=eu(e,(n,s)=>(ii(this.node,s,"Start"),(i,{success:o})=>ii(this.node,i,o?"End":"Cancel")),{useGlobalTarget:this.node.props.globalTapTarget}))}unmount(){}}const on=new WeakMap,Fe=new WeakMap,Mc=t=>{const e=on.get(t.target);e&&e(t)},Rc=t=>{t.forEach(Mc)};function Dc({root:t,...e}){const n=t||document;Fe.has(n)||Fe.set(n,{});const s=Fe.get(n),i=JSON.stringify(e);return s[i]||(s[i]=new IntersectionObserver(Rc,{root:t,...e})),s[i]}function Lc(t,e,n){const s=Dc(e);return on.set(t,n),s.observe(t),()=>{on.delete(t),s.unobserve(t)}}const kc={some:0,all:1};class Ic extends gt{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:e={}}=this.node.getProps(),{root:n,margin:s,amount:i="some",once:o}=e,r={root:n?n.current:void 0,rootMargin:s,threshold:typeof i=="number"?i:kc[i]},a=u=>{const{isIntersecting:c}=u;if(this.isInView===c||(this.isInView=c,o&&!c&&this.hasEnteredView))return;c&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",c);const{onViewportEnter:l,onViewportLeave:f}=this.node.getProps(),d=c?l:f;d&&d(u)};return Lc(this.node.current,r,a)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:e,prevProps:n}=this.node;["amount","margin","root"].some(Oc(e,n))&&this.startObserver()}unmount(){}}function Oc({viewport:t={}},{viewport:e={}}={}){return n=>t[n]!==e[n]}const jc={inView:{Feature:Ic},tap:{Feature:Ec},focus:{Feature:Vc},hover:{Feature:Cc}},Fc={layout:{ProjectionNode:Xr,MeasureLayout:Nr}},Bc={...Sl,...jc,...bc,...Fc},qr=Wu(Bc,Ju);function _c(t){return A.useEffect(()=>()=>t(),[])}function Zr(t){const e=lt(()=>wt(t)),{isStatic:n}=A.useContext(ye);if(n){const[,s]=A.useState(t);A.useEffect(()=>e.on("change",s),[])}return e}function Jr(t,e){const n=Zr(e()),s=()=>n.set(e());return s(),ln(()=>{const i=()=>B.preRender(s,!1,!0),o=t.map(r=>r.on("change",i));return()=>{o.forEach(r=>r()),ht(s)}}),n}function Nc(t){$t.current=[],t();const e=Jr($t.current,t);return $t.current=void 0,e}function Uc(t,e,n,s){if(typeof t=="function")return Nc(t);const i=typeof e=="function"?e:su(e,n,s);return Array.isArray(t)?ri(t,i):ri([t],([o])=>i(o))}function ri(t,e){const n=lt(()=>[]);return Jr(t,()=>{n.length=0;const s=t.length;for(let i=0;ie&&i.at{const L=Xc(C),{delay:W=0,times:N=Ni(L),type:dt="keyframes",repeat:at,repeatType:yt,repeatDelay:jt=0,...ut}=w;let{ease:O=e.ease||"easeOut",duration:_}=w;const Z=typeof W=="function"?W(S,b):W,nt=L.length,h=Cn(dt)?dt:i?.[dt||"keyframes"];if(nt<=2&&h){let k=100;if(nt===2&&Jc(L)){const z=L[1]-L[0];k=Math.abs(z)}const I={...ut};_!==void 0&&(I.duration=it(_));const j=ji(I,k,h);O=j.ease,_=j.duration}_??(_=o);const g=f+Z;N.length===1&&N[0]===0&&(N[1]=1);const R=N.length-L.length;if(R>0&&_i(N,R),L.length===1&&L.unshift(null),at){_=$c(_,at);const k=[...L],I=[...N];O=Array.isArray(O)?[...O]:[O];const j=[...O];for(let z=0;z{for(const v in p){const T=p[v];T.sort(Gc);const y=[],P=[],x=[];for(let w=0;wtypeof t=="number",Jc=t=>t.every(Zc);function Qc(t,e){return t in e}class tf extends br{constructor(){super(...arguments),this.type="object"}readValueFromInstance(e,n){if(Qc(n,e)){const s=e[n];if(typeof s=="string"||typeof s=="number")return s}}getBaseTargetFromProps(){}removeValueFromRenderState(e,n){delete n.output[e]}measureInstanceViewportBox(){return U()}build(e,n){Object.assign(e.output,n)}renderInstance(e,{output:n}){Object.assign(e,n)}sortInstanceNodePosition(){return 0}}function ef(t){const e={presenceContext:null,props:{},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{}}},n=Dn(t)&&!rr(t)?new Rr(e):new Er(e);n.mount(t),Zt.set(t,n)}function nf(t){const e={presenceContext:null,props:{},visualState:{renderState:{output:{}},latestValues:{}}},n=new tf(e);n.mount(t),Zt.set(t,n)}function sf(t,e){return G(t)||typeof t=="number"||typeof t=="string"&&!$n(e)}function to(t,e,n,s){const i=[];if(sf(t,e))i.push(Ur(t,$n(e)&&e.default||e,n&&(n.default||n)));else{const o=Qr(t,e,s),r=o.length;for(let a=0;a{s.push(...to(a,o,r))}),s}function of(t){return Array.isArray(t)&&t.some(Array.isArray)}function af(t){function e(n,s,i){let o=[];of(n)?o=rf(n,s,t):o=to(n,s,i,t);const r=new Oa(o);return t&&(t.animations.push(r),r.finished.then(()=>{Qt(t.animations,r)})),r}return e}function yf(){const t=lt(()=>({current:null,animations:[]})),e=lt(()=>af(t));return _c(()=>{t.animations.forEach(n=>n.stop()),t.animations.length=0}),[t,e]}const eo=A.createContext(null);function uf(t,e,n,s){if(!s)return t;const i=t.findIndex(l=>l.value===e);if(i===-1)return t;const o=s>0?1:-1,r=t[i+o];if(!r)return t;const a=t[i],u=r.layout,c=F(u.min,u.max,.5);return o===1&&a.layout.max+n>c||o===-1&&a.layout.min+nqr[e]),u=[],c=A.useRef(!1),l={axis:n,registerItem:(f,d)=>{const p=u.findIndex(m=>f===m.value);p!==-1?u[p].layout=d[n]:u.push({value:f,layout:d[n]}),u.sort(ff)},updateOrder:(f,d,p)=>{if(c.current)return;const m=uf(u,f,d,p);u!==m&&(c.current=!0,s(m.map(cf).filter(v=>i.indexOf(v)!==-1)))}};return A.useEffect(()=>{c.current=!1}),tt.jsx(a,{...o,ref:r,ignoreStrict:!0,children:tt.jsx(eo.Provider,{value:l,children:t})})}const vf=A.forwardRef(lf);function cf(t){return t.value}function ff(t,e){return t.layout.min-e.layout.min}function li(t,e=0){return G(t)?t:Zr(e)}function hf({children:t,style:e={},value:n,as:s="li",onDrag:i,layout:o=!0,...r},a){const u=lt(()=>qr[s]),c=A.useContext(eo),l={x:li(e.x),y:li(e.y)},f=Uc([l.x,l.y],([v,T])=>v||T?1:"unset"),{axis:d,registerItem:p,updateOrder:m}=c;return tt.jsx(u,{drag:d,...r,dragSnapToOrigin:!0,style:{...e,x:l.x,y:l.y,zIndex:f},layout:o,onDrag:(v,T)=>{const{velocity:y}=T;y[d]&&m(n,l[d].get(),y[d]),i&&i(v,T)},onLayoutMeasure:v=>p(n,v),ref:a,ignoreStrict:!0,children:t})}const Tf=A.forwardRef(hf);export{mf as A,lo as R,A as a,vf as b,Tf as c,io as g,tt as j,qr as m,uo as r,pf as s,df as t,yf as u}; diff --git a/service/dist/assets/motion-Dp9wOFzY.js.br b/service/dist/assets/motion-Dp9wOFzY.js.br deleted file mode 100644 index 7061521290d861d6aa160951ff1d2473a7390228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39726 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