From fd45974e03299d036846c72a7a772e57c34a8d39 Mon Sep 17 00:00:00 2001 From: miaowmint Date: Tue, 1 Sep 2026 00:14:48 +0800 Subject: [PATCH 01/58] feat(mobile): auto-install Docker for Android container backend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New docker_install.py: latency-race install sources (official download.docker.com + CN mirrors, no geo detection; official wins → no DOWNLOAD_URL override), run official get.docker.com script, probe Tencent Cloud registry mirror reachability and merge registry-mirrors into /etc/docker/daemon.json (backup kept) only after a fresh install. - install_mobile_stream: when Docker is missing on Linux with root/passwordless sudo, attempt the automatic install first and continue with the container install when the daemon is ready; otherwise fall back to the manual-install error. - i18n (backend en/zh + dashboard locales) and install-guide copy updated; CHANGELOG entry added. - Unit tests for source selection, daemon.json merge, probe, and the install stream branches (auto-install ok / fail / no-sudo). --- CHANGELOG.md | 4 + dashboard/src/locales/en.json | 6 +- dashboard/src/locales/zh.json | 6 +- .../RemoteAndroid/RemotePhoneIdleGuide.tsx | 6 +- .../src/pages/Control/RemoteAndroid/index.tsx | 2 +- src/octop/i18n/en.json | 15 + src/octop/i18n/zh.json | 15 + src/octop/infra/mobile/docker_install.py | 281 ++++++++++++++++++ src/octop/infra/mobile/setup.py | 24 +- tests/unit/mobile/test_docker_install.py | 219 ++++++++++++++ 10 files changed, 565 insertions(+), 13 deletions(-) create mode 100644 src/octop/infra/mobile/docker_install.py create mode 100644 tests/unit/mobile/test_docker_install.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 02e393fc..39ff3ccb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ ## [Unreleased] +### 新增 + +- 远程手机:主机缺少 Docker 时自动安装——纯测速选择安装源(官方 download.docker.com 与境内镜像竞速,官方最快则不设 DOWNLOAD_URL),执行官方 get.docker.com 脚本;安装后按腾讯云镜像加速可达性决定是否写入 `registry-mirrors`(不检测地区,连不上则跳过)。自动安装失败时回退为提示用户手动安装。 + ## [0.9.30] - 2026-08-31 ### 新增 diff --git a/dashboard/src/locales/en.json b/dashboard/src/locales/en.json index 66ba02c2..008ce251 100644 --- a/dashboard/src/locales/en.json +++ b/dashboard/src/locales/en.json @@ -4808,7 +4808,7 @@ "pickDevice": "Select a device first", "devicePlaceholder": "Select device", "needsInstall": "Container install required", - "needsInstallDesc": "This host uses a container Android backend. One-click install pulls and starts the container (Docker required on the host).", + "needsInstallDesc": "This host uses a container Android backend. One-click install pulls and starts the container; Docker is installed automatically when missing (manual install required if that fails).", "install": "Install container", "installing": "Starting install…", "installProgress": "Installing Android container…", @@ -4816,8 +4816,8 @@ "installFailed": "Container install failed. Check the log and retry.", "installRetry": "Retry install", "installCancelHint": "Install request cancelled. The server may still be installing — refresh status later.", - "installStep1": "Make sure Docker is installed and usable on this host", - "installStep2": "Click Install container to pull and start the Android container", + "installStep1": "Click Install container; Docker is installed automatically when missing", + "installStep2": "Wait for the Android container to be pulled and started", "installStep3": "When install finishes, refresh status, then click Connect", "needsDevice": "No device connected", "needsDeviceDesc": "Start an Android emulator or connect a phone via USB, then refresh.", diff --git a/dashboard/src/locales/zh.json b/dashboard/src/locales/zh.json index 886984d0..7b255c56 100644 --- a/dashboard/src/locales/zh.json +++ b/dashboard/src/locales/zh.json @@ -4947,7 +4947,7 @@ "pickDevice": "请先选择设备", "devicePlaceholder": "选择设备", "needsInstall": "需要安装容器", - "needsInstallDesc": "此主机使用容器 Android 后端。可一键拉取并启动容器(需本机已安装 Docker)。", + "needsInstallDesc": "此主机使用容器 Android 后端。可一键拉取并启动容器;若未安装 Docker 将自动尝试安装(失败时需手动安装)。", "install": "安装容器", "installing": "正在启动安装…", "installProgress": "正在安装 Android 容器…", @@ -4955,8 +4955,8 @@ "installFailed": "容器安装失败,请查看日志后重试", "installRetry": "重新安装", "installCancelHint": "已取消安装请求,服务端可能仍在继续安装,请稍后刷新状态。", - "installStep1": "确认主机已安装并可使用 Docker", - "installStep2": "点击「安装容器」,拉取并启动 Android 容器", + "installStep1": "点击「安装容器」;若主机未安装 Docker 将自动安装", + "installStep2": "等待拉取并启动 Android 容器", "installStep3": "安装完成后刷新状态,再点击「连接」", "needsDevice": "未连接设备", "needsDeviceDesc": "请启动 Android 模拟器或通过 USB 连接手机,然后刷新。", diff --git a/dashboard/src/pages/Control/RemoteAndroid/RemotePhoneIdleGuide.tsx b/dashboard/src/pages/Control/RemoteAndroid/RemotePhoneIdleGuide.tsx index eb535948..c7d3f1f1 100644 --- a/dashboard/src/pages/Control/RemoteAndroid/RemotePhoneIdleGuide.tsx +++ b/dashboard/src/pages/Control/RemoteAndroid/RemotePhoneIdleGuide.tsx @@ -100,7 +100,7 @@ export default function RemotePhoneIdleGuide({ : needsInstall ? t( "remoteAndroid.needsInstallDesc", - "此主机使用容器 Android 后端。可一键拉取并启动容器(需本机已安装 Docker)。", + "此主机使用容器 Android 后端。可一键拉取并启动容器;若未安装 Docker 将自动尝试安装(失败时需手动安装)。", ) : needsDevice ? t( @@ -135,13 +135,13 @@ export default function RemotePhoneIdleGuide({ { label: t( "remoteAndroid.installStep1", - "确认主机已安装并可使用 Docker", + "点击「安装容器」;若主机未安装 Docker 将自动安装", ), }, { label: t( "remoteAndroid.installStep2", - "点击「安装容器」,拉取并启动 Android 容器", + "等待拉取并启动 Android 容器", ), }, { diff --git a/dashboard/src/pages/Control/RemoteAndroid/index.tsx b/dashboard/src/pages/Control/RemoteAndroid/index.tsx index ac371efd..41dd7786 100644 --- a/dashboard/src/pages/Control/RemoteAndroid/index.tsx +++ b/dashboard/src/pages/Control/RemoteAndroid/index.tsx @@ -1106,7 +1106,7 @@ export default function RemoteAndroidPage({ )} description={t( "remoteAndroid.needsInstallDesc", - "此主机使用容器 Android 后端。可一键拉取并启动容器(需本机已安装 Docker)。", + "此主机使用容器 Android 后端。可一键拉取并启动容器;若未安装 Docker 将自动尝试安装(失败时需手动安装)。", )} action={ + ); } @@ -1612,14 +1595,15 @@ export function ChannelDrawer({
1 - 点击按钮,启动自动创建流程 + {t("channels.feishuQrIntro1")}
- 2扫码登录飞书账号 + 2 + {t("channels.feishuQrIntro2")}
3 - 自动完成机器人注册和权限配置 + {t("channels.feishuQrIntro3")}
); diff --git a/pyproject.toml b/pyproject.toml index 6fa1522b..c8b1b020 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ dependencies = [ "orcakit-harness-agent[all]>=1.0.2", "harness-memory>=0.9.7", "harness-gateway>=0.9.3", + "lark-oapi>=1.5.5", "cryptography>=41", "scalar-fastapi>=1.0", "edge-tts>=6.1", diff --git a/src/octop/api/routers/channels.py b/src/octop/api/routers/channels.py index 4867aab5..93de511b 100644 --- a/src/octop/api/routers/channels.py +++ b/src/octop/api/routers/channels.py @@ -22,6 +22,7 @@ from octop.api.common.agent import require_agent_owner_row from octop.api.deps import get_server, require_permission from octop.infra.errors import ErrorCode, OctopError +from octop.infra.gateway.bot_creators.feishu_runner import extract_feishu_credentials from octop.infra.gateway.channels import dingtalk_registration, qr_bind from octop.infra.gateway.gateway import ChannelKind from octop.infra.utils.locale import DEFAULT_LOCALE, resolve_request_locale @@ -808,19 +809,6 @@ async def feishu_bot_creator_start( if greeting: _sanitize_subprocess_arg(greeting, "greeting") - profile_dir = _safe_profile_directory(target_platform) - await _pkill_chrome_profile(profile_dir) - - # Remove stale Chrome singleton lock files - for lock_name in ("SingletonLock", "SingletonCookie", "SingletonSocket"): - lock_path = profile_dir / lock_name - try: - await asyncio.to_thread(lock_path.unlink) - except FileNotFoundError: - pass - except OSError as exc: - logger.warning("Failed to remove stale %s: %s", lock_name, exc) - script_path = _bot_creator_script("feishu_bot_creator.py") cmd = [sys.executable, script_path, "create", "--platform", target_platform] @@ -888,26 +876,12 @@ async def feishu_bot_creator_poll( if finished: status = "finished" if return_code == 0 else "failed" - qr_token = None - app_id = None - app_secret = None - for ev in state["lines"]: - if ev.get("action") == "show_qrcode": - content = ev.get("content", "") - try: - qr_data = json.loads(content) if isinstance(content, str) else content - qr_token = qr_data.get("qrlogin", {}).get("token") - except (json.JSONDecodeError, AttributeError): - pass - if ev.get("action") == "finish" and ev.get("level") == "success": - data = ev.get("data", {}) - app_id = data.get("app_id") - app_secret = data.get("app_secret") + qr_url, app_id, app_secret = extract_feishu_credentials(state["lines"]) return { "status": status, "events": new_lines, - "qr_token": qr_token, + "qr_url": qr_url, "app_id": app_id, "app_secret": app_secret, "return_code": return_code, diff --git a/src/octop/cli/commands/channel.py b/src/octop/cli/commands/channel.py index 043c2718..f9dc1a81 100644 --- a/src/octop/cli/commands/channel.py +++ b/src/octop/cli/commands/channel.py @@ -521,7 +521,7 @@ def feishu_setup( dry_run: bool, retries: int, ) -> None: - """Run Feishu bot-creator (browser QR) and save app credentials.""" + """Run Feishu scan-to-create (lark-oapi QR) and save app credentials.""" from octop.cli.support.feishu_creator import dry_run_feishu_setup, run_feishu_bot_creator from octop.cli.support.offline_ops import create_channel_offline, patch_channel_offline from octop.infra.errors import OctopError diff --git a/src/octop/cli/support/feishu_creator.py b/src/octop/cli/support/feishu_creator.py index 51da2341..55a5d3f6 100644 --- a/src/octop/cli/support/feishu_creator.py +++ b/src/octop/cli/support/feishu_creator.py @@ -3,7 +3,6 @@ from __future__ import annotations import contextlib -import json import time from typing import Any @@ -18,15 +17,15 @@ def dry_run_feishu_setup(*, agent_id: str, platform: str, channel_id: str | None) -> None: - """Print what ``feishu-setup`` would do without starting the browser flow.""" + """Print what ``feishu-setup`` would do without starting the scan-to-create flow.""" click.echo("Dry run — no subprocess or channel writes.") click.echo(f" agent: {agent_id}") click.echo(f" platform: {platform}") click.echo(f" channel_id: {channel_id or '(create new feishu channel)'}") click.echo(" steps:") - click.echo(" 1. Start feishu_bot_creator.py subprocess") + click.echo(" 1. Start feishu_bot_creator.py subprocess (lark-oapi register_app)") click.echo(" 2. Poll stdout until app_id + app_secret") - click.echo(" 3. Render QR in terminal when qr_token appears") + click.echo(" 3. Render QR in terminal when qr_url appears") click.echo(" 4. Stop subprocess") click.echo(" 5. PATCH or POST channel with app_id / app_secret") @@ -51,9 +50,9 @@ def run_feishu_bot_creator( message = ev.get("message") or ev.get("step") or "" if message and level in ("info", "success", ""): click.echo(f" {message}") - qr_token = poll.get("qr_token") - if qr_token and not shown_qr: - render_qrcode_terminal(json.dumps({"qrlogin": {"token": qr_token}})) + qr_url = poll.get("qr_url") + if qr_url and not shown_qr: + render_qrcode_terminal(str(qr_url)) shown_qr = True app_id = poll.get("app_id") or app_id app_secret = poll.get("app_secret") or app_secret diff --git a/src/octop/infra/gateway/bot_creators/feishu_bot_creator.py b/src/octop/infra/gateway/bot_creators/feishu_bot_creator.py index 35198812..e4056cf0 100644 --- a/src/octop/infra/gateway/bot_creators/feishu_bot_creator.py +++ b/src/octop/infra/gateway/bot_creators/feishu_bot_creator.py @@ -7,123 +7,68 @@ # Violators will be held liable under applicable laws. # # Author: Tencent Lighthouse Team -"""Feishu / Lark Open Platform — auto-create enterprise bot. +"""Feishu / Lark Open Platform — scan-to-create app via lark-oapi. + +Uses ``lark_oapi.register_app`` (OAuth 2.0 Device Authorization Grant, +RFC 8628). Requires ``lark-oapi>=1.5.5``. Usage: - python -m octop.infra.channels.bot_creators.feishu_bot_creator init - python -m octop.infra.channels.bot_creators.feishu_bot_creator create [--platform feishu|lark] - python -m octop.infra.channels.bot_creators.feishu_bot_creator cleanup - -Migration note (2026-05-22) ---------------------------- -This script previously drove Chrome via ``playwright.sync_api``. It has been -rewritten on top of ``harness-browser`` (pure CDP) so finnie no longer needs -Playwright as a runtime dependency for bot creation. - -Key changes vs. the Playwright version: - -* ``BrowserSession.create(profile="octop-feishu-bot")`` replaces - ``pw.chromium.connect_over_cdp(...)``. The harness session reuses an - existing Chrome on the same profile or launches one as needed. -* ``page.evaluate`` → ``sess.eval_js`` -* ``page.goto/reload`` → ``sess.navigate / sess.reload`` -* ``page.on("request"/"response")`` → CDP ``Network.*`` event listeners -* ``page.context.cookies()`` → CDP ``Network.getAllCookies`` -* ``page.request.post/get`` → ``httpx.AsyncClient`` with cookies harvested - from CDP — this preserves Feishu's CSRF / cookie-bound API contract while - removing the Playwright dependency. -* The whole top-level dependency bootstrap (``_ensure_pip``, - ``_install_system_deps``, ``ensure_playwright_browsers``) is gone — the - package's normal install flow already handles ``harness-browser``; - Chromium is provided by ``octop install-browsers`` (Playwright's - installer is the only thing left from the old stack). + python -m octop.infra.gateway.bot_creators.feishu_bot_creator init + python -m octop.infra.gateway.bot_creators.feishu_bot_creator create [--platform feishu|lark] + python -m octop.infra.gateway.bot_creators.feishu_bot_creator cleanup """ from __future__ import annotations -import asyncio import contextlib +import importlib.metadata import json import os -import random import ssl import sys import time -import urllib.error import urllib.request import uuid -from typing import Any, cast +from typing import Any -import httpx -from harness_browser import BrowserSession +import lark_oapi as lark +from lark_oapi.scene.registration.errors import ( + AppAccessDeniedError, + AppExpiredError, + RegisterAppError, +) -# ============================================================ -# Force stdout line-buffered / write-through -# ============================================================ if hasattr(sys.stdout, "reconfigure"): sys.stdout.reconfigure(write_through=True) - -# ============================================================ -# Platform config (feishu / lark) -# ============================================================ PLATFORM = "feishu" _PLATFORM_CONFIGS = { "feishu": { - "base_url": "https://open.feishu.cn", - "login_url": ( - "https://accounts.feishu.cn/accounts/page/login" - "?app_id=7&no_trap=1" - "&redirect_uri=https%3A%2F%2Fopen.feishu.cn%2Fapp" - ), - "accounts_host": "accounts.feishu.cn", - "open_host": "open.feishu.cn", - "admin_audit_url": "https://feishu.cn/admin/appCenter/audit", - "primary_lang": "zh_cn", + "open_base": "https://open.feishu.cn", + "accounts_domain": "https://accounts.feishu.cn", + "lark_domain": "https://accounts.larksuite.com", "default_greeting": "Hi,我是你刚刚使用 Octop 创建的飞书机器人,你现在可以跟我聊天了!", + "app_name": "Octop机器人-{user}", + "app_desc": "由 Octop 一键创建的飞书机器人", "state_file_prefix": "octop-feishu-bot", - "profile_name": "octop-feishu-bot", - "qr_default": True, }, "lark": { - "base_url": "https://open.larksuite.com", - "login_url": ( - "https://accounts.larksuite.com/accounts/page/login" - "?app_id=7&no_trap=1" - "&redirect_uri=https%3A%2F%2Fopen.larksuite.com%2F%3Flang%3Dzh-CN" - ), - "accounts_host": "accounts.larksuite.com", - "open_host": "open.larksuite.com", - "admin_audit_url": "https://larksuite.com/admin/appCenter/audit", - "primary_lang": "en_us", + "open_base": "https://open.larksuite.com", + "accounts_domain": "https://accounts.larksuite.com", + "lark_domain": "https://accounts.larksuite.com", "default_greeting": "Hi, I'm the bot you just created with Octop. You can chat with me now!", + "app_name": "Octop Bot-{user}", + "app_desc": "Lark bot created by Octop", "state_file_prefix": "octop-lark-bot", - "profile_name": "octop-lark-bot", - "qr_default": False, }, } - -def _pcfg(key: str) -> Any: - return _PLATFORM_CONFIGS[PLATFORM][key] - - -# ============================================================ -# Constants -# ============================================================ -LOGIN_TIMEOUT = 90 -POLL_INTERVAL = 2 -QR_MAX_RETRIES = 3 - DEFAULT_AVATAR_URL = "https://cloudcache.tencent-cloud.com/qcloud/ui/static/other_external_resource/4e9ca8c5-0ce4-44a2-8c7c-4f8f43f9e73a.png" - -WEBSOCKET_POLL_INTERVAL = 3 -WEBSOCKET_POLL_TIMEOUT = 90 - STATE_DIR = "/tmp" +MIN_LARK_OAPI = (1, 5, 5) -BOT_PERMISSIONS = [ +BOT_SCOPES = [ "im:message", "im:message.p2p_msg:readonly", "im:message.group_at_msg:readonly", @@ -145,35 +90,27 @@ def _pcfg(key: str) -> Any: "bitable:app", "task:task:read", "task:task:write", -] - -BOT_PERMISSIONS_NEED_AUDIT = [ "drive:drive:readonly", "drive:drive", ] +BOT_EVENTS = ["im.message.receive_v1"] +BOT_CALLBACKS = ["card.action.trigger"] + -def _gen_bot_name() -> str: - if PLATFORM == "lark": - return f"Octop Bot-{random.randint(1000, 9999)}" - return f"Octop机器人-{random.randint(1000, 9999)}" +def _pcfg(key: str) -> Any: + return _PLATFORM_CONFIGS[PLATFORM][key] def _state_file() -> str: return os.path.join(STATE_DIR, f"{_pcfg('state_file_prefix')}-creator-state.json") -# ============================================================ -# State file -# ============================================================ def _save_state(data: dict[str, Any]) -> None: with open(_state_file(), "w") as f: json.dump(data, f, ensure_ascii=False) -# ============================================================ -# Structured JSON output (stdout) -# ============================================================ def _emit(action: str, level: str, step: str, message: str, **extra: Any) -> None: record = { "action": action, @@ -202,10 +139,6 @@ def _log_error(step: str, message: str, **extra: Any) -> None: _emit("log", "error", step, message, **extra) -def _emit_progress(step: str, message: str, current: int, total: int) -> None: - _emit("progress", "info", step, message, current=current, total=total) - - def _emit_finish(message: str, data: dict[str, Any]) -> None: _emit("finish", "success", "finish", message, data=data) @@ -214,45 +147,43 @@ def _emit_error(step: str, message: str) -> None: _emit("finish", "error", step, message) -# ============================================================ -# Avatar / greeting helpers (no browser) -# ============================================================ -def _download_avatar(avatar_url: str = "") -> str: - url = avatar_url or DEFAULT_AVATAR_URL - avatar_path = os.path.join(STATE_DIR, f"{_pcfg('state_file_prefix')}-avatar.png") - if not avatar_url and os.path.isfile(avatar_path) and os.path.getsize(avatar_path) > 0: - _log_info("create_app", f"Using cached avatar: {avatar_path}") - return avatar_path +def _parse_version(raw: str) -> tuple[int, ...]: + parts: list[int] = [] + for chunk in raw.split("."): + digits = "" + for ch in chunk: + if ch.isdigit(): + digits += ch + else: + break + if digits: + parts.append(int(digits)) + return tuple(parts) - _log_info("create_app", f"Downloading avatar: {url}") - ctx = ssl.create_default_context() - ctx.check_hostname = False - ctx.verify_mode = ssl.CERT_NONE - req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) - try: - with urllib.request.urlopen(req, context=ctx) as resp: - data = resp.read() - with open(avatar_path, "wb") as f: - f.write(data) - _log_info("create_app", f"Avatar downloaded: {len(data)} bytes") - return avatar_path - except Exception as e: - _log_warn("create_app", f"Avatar download failed: {e}") - return "" - - -def _send_greeting(app_id: str, app_secret: str, open_id: str, greeting: str = "") -> None: - _log_info("greeting", "Sending initial greeting message") - greeting = greeting or _pcfg("default_greeting") - base_url = _pcfg("base_url") +def _lark_oapi_version() -> str: + return importlib.metadata.version("lark-oapi") + + +def _open_base_for_brand(tenant_brand: str | None) -> str: + if tenant_brand == "lark": + return str(_PLATFORM_CONFIGS["lark"]["open_base"]) + if tenant_brand == "feishu": + return str(_PLATFORM_CONFIGS["feishu"]["open_base"]) + return str(_pcfg("open_base")) + + +def _send_greeting( + app_id: str, app_secret: str, open_id: str, *, open_base: str, greeting: str +) -> None: + _log_info("greeting", "Sending initial greeting message") ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE token_payload = json.dumps({"app_id": app_id, "app_secret": app_secret}).encode() token_req = urllib.request.Request( - f"{base_url}/open-apis/auth/v3/tenant_access_token/internal", + f"{open_base}/open-apis/auth/v3/tenant_access_token/internal", data=token_payload, headers={"Content-Type": "application/json"}, ) @@ -274,7 +205,7 @@ def _send_greeting(app_id: str, app_secret: str, open_id: str, greeting: str = " } ).encode() send_req = urllib.request.Request( - f"{base_url}/open-apis/im/v1/messages?receive_id_type=open_id", + f"{open_base}/open-apis/im/v1/messages?receive_id_type=open_id", data=send_payload, headers={ "Content-Type": "application/json", @@ -288,1135 +219,135 @@ def _send_greeting(app_id: str, app_secret: str, open_id: str, greeting: str = " pass -# ============================================================ -# Browser helpers — thin wrappers around harness-browser -# ============================================================ -async def _navigate(sess: BrowserSession, url: str) -> bool: - """Navigate, returning True on success.""" - try: - result = await sess.navigate(url) - return bool(result.success) - except Exception as e: - _log_warn("login", f"Navigate failed: {e}") - return False - - -async def _eval(sess: BrowserSession, expr: str) -> Any: - """Evaluate a JS expression and decode the JSON-encoded result string.""" - try: - result = await sess.eval_js(expr) - if not result.success: - return None - # eval_js returns JSON-encoded string (e.g. '"hello"' or '42'). - raw = result.content if isinstance(result.content, str) else "" - try: - return json.loads(raw) - except (json.JSONDecodeError, ValueError): - return raw - except Exception: - return None - - -async def _current_url(sess: BrowserSession) -> str: - val = await _eval(sess, "location.href") - return str(val) if val else "" - - -async def _get_cookies(sess: BrowserSession, urls: list[str] | None = None) -> list[dict[str, Any]]: - """Fetch all cookies for the given URLs via CDP Network.getAllCookies. - - Falls back to ``Network.getCookies`` if ``urls`` are specified. - """ - client = sess._internal.client - try: - if urls: - result = await client.send("Network.getCookies", {"urls": urls}) - else: - result = await client.send("Network.getAllCookies") - cookies = result.get("cookies") or [] - return list(cookies) - except Exception: - return [] - - -def _cookie_header(cookies: list[dict[str, Any]]) -> str: - return "; ".join(f"{c['name']}={c['value']}" for c in cookies if c.get("name")) - - -# ============================================================ -# Network capture — extract CSRF token from outgoing requests -# ============================================================ -class _NetworkCapture: - """Subscribe to CDP Network events to capture the CSRF token. - - Mirrors the previous Playwright ``page.on("request" / "response")`` - behaviour. The token is read out of ``X-CSRF-Token`` request headers - seen on requests targeting ``open_host``. - """ - - def __init__(self, sess: BrowserSession, open_host: str) -> None: - self._sess = sess - self._open_host = open_host - self.csrf_token: str | None = None - self._on_request_listeners: list[Any] = [] - self._on_response_listeners: list[Any] = [] - - async def install(self) -> None: - client = self._sess._internal.client - await client.send("Network.enable") - - async def _on_req(params: dict[str, Any]) -> None: - req = params.get("request", {}) or {} - url = req.get("url", "") - if self._open_host not in url: - return - headers = req.get("headers", {}) or {} - for k, v in headers.items(): - if k.lower() == "x-csrf-token" and v: - self.csrf_token = str(v) - break - - client.on("Network.requestWillBeSent", _on_req) - - def add_response_listener(self, listener: Any) -> None: - """Register a callback for ``Network.responseReceived`` events. - - The callback receives the raw CDP params dict. Use - ``remove_response_listener`` for cleanup. - """ - client = self._sess._internal.client - client.on("Network.responseReceived", listener) - self._on_response_listeners.append(listener) - - def remove_response_listener(self, listener: Any) -> None: - client = self._sess._internal.client - client.off("Network.responseReceived", listener) - if listener in self._on_response_listeners: - self._on_response_listeners.remove(listener) - - -async def _fetch_response_body(sess: BrowserSession, request_id: str) -> dict[str, Any] | None: - """Pull a response body via CDP and parse it as JSON. - - Used by the QR login poller in lieu of Playwright's ``resp.json()``. - """ - try: - client = sess._internal.client - result = await client.send("Network.getResponseBody", {"requestId": request_id}) - body = result.get("body", "") - if result.get("base64Encoded"): - import base64 - - body = base64.b64decode(body).decode("utf-8", errors="replace") - return cast(dict[str, Any] | None, json.loads(body)) - except Exception: - return None - - -# ============================================================ -# FeishuBotCreator — pure HTTP API wrapper, no browser interactions -# ============================================================ -class FeishuBotCreator: - """Creates a Feishu/Lark bot by hitting the developer-platform JSON API. - - The class does not use the browser directly; it relies on: - * ``capture.csrf_token`` — populated by the ``_NetworkCapture`` listener - when the page makes any authenticated request. - * ``cookies`` — harvested from CDP and sent verbatim with each request. - - All HTTP traffic is plain ``httpx.AsyncClient`` with the same headers - a real browser would send. - """ - - def __init__( - self, - sess: BrowserSession, - capture: _NetworkCapture, - ) -> None: - self._sess = sess - self._capture = capture - self._base_url = _pcfg("base_url") - self._api_base = f"{self._base_url}/developers/v1" - self._app_page = f"{self._base_url}/app" - self.app_id: str | None = None - self.app_secret: str | None = None - self.version_id: str | None = None - self.publish_fail_reason: str = "" - self.audit_url: str | None = None - - async def _csrf(self) -> str | None: - if self._capture.csrf_token: - return self._capture.csrf_token - # Try window.csrfToken - token = await _eval(self._sess, "window.csrfToken || ''") - if token: - self._capture.csrf_token = str(token) - return self._capture.csrf_token - # Try cookies - cookies = await _get_cookies(self._sess, [self._base_url]) - cookie_map = {c["name"]: c["value"] for c in cookies} - token = ( - cookie_map.get("lark_oapi_csrf_token") - or cookie_map.get("lgw_csrf_token") - or cookie_map.get("swp_csrf_token") - ) - if token: - self._capture.csrf_token = token - return self._capture.csrf_token - - async def _headers(self, *, with_body: bool = False) -> dict[str, str]: - h: dict[str, str] = {"accept": "*/*", "x-timezone-offset": "-480"} - if with_body: - h.update( - { - "content-type": "application/json", - "origin": self._base_url, - "referer": self._app_page, - } - ) - csrf = await self._csrf() - if csrf: - h["x-csrf-token"] = csrf - return h - - async def _client(self) -> httpx.AsyncClient: - cookies = await _get_cookies(self._sess, [self._base_url]) - cookie_jar = {c["name"]: c["value"] for c in cookies} - return httpx.AsyncClient( - cookies=cookie_jar, - timeout=30.0, - verify=False, +def _on_qr_code(info: dict[str, Any]) -> None: + url = str(info.get("url") or "") + expire_in = int(info.get("expire_in") or 0) + if not url: + return + _save_state( + { + "phase": "create", + "qr_url": url, + "expire_in": expire_in, + "deadline": int(time.time()) + expire_in, + } + ) + _emit( + "show_qrcode", + "info", + "login", + "Please scan to create the Feishu app", + content=json.dumps({"url": url, "expire_in": expire_in}, ensure_ascii=False), + ) + _log_info("login", f"QR URL ready (expires in {expire_in}s)") + + +def _on_status_change(info: dict[str, Any]) -> None: + status = str(info.get("status") or "") + interval = info.get("interval") + if status == "slow_down": + _log_info("login", f"Polling slowed down (interval={interval}s)") + elif status == "domain_switched": + _log_info("login", "Switched to Lark accounts domain") + elif status == "polling": + _log_info("login", "Waiting for scan confirmation...") + + +def register_feishu_app(*, avatar_url: str = "", greeting: str = "") -> dict[str, Any]: + """Run ``lark.register_app`` and return finish data (app_id / app_secret / …).""" + avatar = avatar_url.strip() or DEFAULT_AVATAR_URL + greeting_text = greeting.strip() or str(_pcfg("default_greeting")) + result = lark.register_app( + on_qr_code=_on_qr_code, + on_status_change=_on_status_change, + source="octop", + domain=str(_pcfg("accounts_domain")), + lark_domain=str(_pcfg("lark_domain")), + app_preset={ + "avatar": avatar, + "name": str(_pcfg("app_name")), + "desc": str(_pcfg("app_desc")), + }, + addons={ + "scopes": {"tenant": list(BOT_SCOPES)}, + "events": {"items": {"tenant": list(BOT_EVENTS)}}, + "callbacks": {"items": list(BOT_CALLBACKS)}, + }, + create_only=True, + ) + app_id = str(result.get("client_id") or "") + app_secret = str(result.get("client_secret") or "") + if not app_id or not app_secret: + raise RegisterAppError( + "missing_credentials", "register_app returned empty client_id/client_secret" ) - async def _post(self, url: str, payload: dict[str, Any]) -> dict[str, Any] | None: - try: - headers = await self._headers(with_body=True) - async with await self._client() as c: - resp = await c.post(url, json=payload, headers=headers) - return cast(dict[str, Any] | None, resp.json()) - except Exception as e: - _log_warn("api", f"POST {url} failed: {e}") - return None - - async def _get(self, url: str) -> dict[str, Any] | None: - try: - headers = await self._headers() - async with await self._client() as c: - resp = await c.get(url, headers=headers) - return cast(dict[str, Any] | None, resp.json()) - except Exception as e: - _log_warn("api", f"GET {url} failed: {e}") - return None - - def _ok( - self, body: dict[str, Any] | None, step: str, log_step: str = "" - ) -> dict[str, Any] | None: - if body is None: - return None - if body.get("code") != 0: - if log_step: - _log_error( - log_step, f"{step} failed: code={body.get('code')}, msg={body.get('msg')}" - ) - return None - return body - - @staticmethod - def _build_multipart(fields: dict[str, Any], files: dict[str, Any]) -> tuple[bytes, str]: - boundary = f"----WebKitFormBoundary{uuid.uuid4().hex[:16]}" - parts: list[bytes] = [] - for key, value in fields.items(): - parts.append(f"--{boundary}\r\n".encode()) - parts.append(f'Content-Disposition: form-data; name="{key}"\r\n\r\n'.encode()) - parts.append(f"{value}\r\n".encode()) - for key, (filename, data, content_type) in files.items(): - parts.append(f"--{boundary}\r\n".encode()) - parts.append( - f'Content-Disposition: form-data; name="{key}"; filename="{filename}"\r\n'.encode() - ) - parts.append(f"Content-Type: {content_type}\r\n\r\n".encode()) - parts.append(data) - parts.append(b"\r\n") - parts.append(f"--{boundary}--\r\n".encode()) - return b"".join(parts), f"multipart/form-data; boundary={boundary}" - - async def _upload_avatar(self, avatar_path: str) -> str | None: - with open(avatar_path, "rb") as f: - img_data = f.read() - - csrf = await self._csrf() - if not csrf: - return None - - cookies = await _get_cookies(self._sess, [self._base_url]) - cookie_str = _cookie_header(cookies) - - body, content_type = self._build_multipart( - fields={ - "uploadType": "4", - "isIsv": "false", - "scale": '{"width":240,"height":240}', - }, - files={ - "file": (str(uuid.uuid4()), img_data, "image/png"), - }, - ) + user_info = result.get("user_info") if isinstance(result.get("user_info"), dict) else {} + open_id = str(user_info.get("open_id") or "") + tenant_brand = str(user_info.get("tenant_brand") or PLATFORM) + open_base = _open_base_for_brand(tenant_brand) + bot_name = str(_pcfg("app_name")).replace("{user}", "").rstrip("-") + manage_url = f"{open_base}/app/{app_id}" - headers = { - "Accept": "*/*", - "Content-Type": content_type, - "Cookie": cookie_str, - "Origin": self._base_url, - "Referer": self._app_page, - "User-Agent": ( - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/145.0.0.0 Safari/537.36" - ), - "x-csrf-token": csrf, - "x-timezone-offset": "-480", - } + if open_id: + _send_greeting(app_id, app_secret, open_id, open_base=open_base, greeting=greeting_text) + else: + _log_warn("owner", "open_id not obtained, skipping greeting") - try: - async with httpx.AsyncClient(timeout=60.0, verify=False) as c: - resp = await c.post( - f"{self._api_base}/app/upload/image", - content=body, - headers=headers, - ) - result = resp.json() - except Exception: - return None - - if result.get("code") != 0: - return None - return cast(str | None, result["data"].get("url", "")) - - # -- Steps -------------------------------------------------------------- - - async def step1_create_app(self, name: str, desc: str, avatar_path: str) -> bool: - _log_info("create_app", f"Creating enterprise app: {name}") - if avatar_path and os.path.isfile(avatar_path): - _log_info("create_app", f"Uploading avatar: {os.path.basename(avatar_path)}") - avatar_url = await self._upload_avatar(avatar_path) or "" - else: - avatar_url = "" - - lang = _pcfg("primary_lang") - body = await self._post( - f"{self._api_base}/app/create", - { - "appSceneType": 0, - "name": name, - "desc": desc, - "avatar": avatar_url, - "i18n": {lang: {"name": name, "description": desc}}, - "primaryLang": lang, - }, - ) - if not self._ok(body, "Create app", "create_app"): - return False - self.app_id = body["data"]["ClientID"] # type: ignore[index] - _log_success("create_app", "App created", app_id=self.app_id) - return True - - async def step2_get_credentials(self) -> bool: - _log_info("credential", "Getting app credentials") - body = await self._get(f"{self._api_base}/secret/{self.app_id}") - if not self._ok(body, "Get App Secret", "credential"): - return False - d = body.get("data", {}) # type: ignore[union-attr] - self.app_secret = ( - d.get("appSecret") or d.get("app_secret") or d.get("secret") or d.get("AppSecret") - ) - if not self.app_secret: - _log_error("credential", f"App Secret not found, keys={list(d.keys())}") - return False - _log_success( - "credential", "Credentials obtained", app_id=self.app_id, app_secret=self.app_secret - ) - return True - - async def step3_add_bot(self) -> bool: - _log_info("bot_ability", "Enabling bot capability") - body = await self._post(f"{self._api_base}/robot/switch/{self.app_id}", {"enable": True}) - if self._ok(body, "Enable bot", "bot_ability") is not None: - _log_success("bot_ability", "Bot capability enabled") - return True - return False - - async def step4_event_mode(self) -> bool: - _log_info("event_mode", "Switching event mode to WebSocket") - deadline = time.time() + WEBSOCKET_POLL_TIMEOUT - attempt = 0 - total = WEBSOCKET_POLL_TIMEOUT // WEBSOCKET_POLL_INTERVAL - while time.time() < deadline: - attempt += 1 - body = await self._post( - f"{self._api_base}/event/switch/{self.app_id}", {"eventMode": 4} - ) - if body and body.get("code") == 10068: - _emit_progress( - "event_mode", - "Waiting for WebSocket connection...", - current=attempt, - total=total, - ) - await asyncio.sleep(WEBSOCKET_POLL_INTERVAL) - continue - if self._ok(body, "Switch event mode → WebSocket(4)", "event_mode") is not None: - _log_success("event_mode", "Event mode switched") - return True - return False - _log_error("event_mode", f"WebSocket connection timeout ({WEBSOCKET_POLL_TIMEOUT}s)") - return False - - async def step5_add_event(self) -> bool: - _log_info("event", "Adding im.message.receive_v1 event") - ev = await self._get(f"{self._api_base}/event/{self.app_id}") - mode = ev.get("data", {}).get("eventMode", 1) if ev and ev.get("code") == 0 else 1 - body = await self._post( - f"{self._api_base}/event/update/{self.app_id}", - { - "operation": "add", - "events": ["im.message.receive_v1"], - "eventMode": mode, - }, - ) - if not self._ok(body, "Add im.message.receive_v1", "event"): - return False - verify = await self._get(f"{self._api_base}/event/{self.app_id}") - if verify and verify.get("code") == 0: - events = verify["data"].get("events", []) - if "im.message.receive_v1" in events: - _log_success("event", "im.message.receive_v1 added") - else: - _log_warn("event", f"im.message.receive_v1 not in event list: {events}") - return True - - async def step6_callback_mode(self) -> bool: - _log_info("callback", "Configuring long connection callback") - deadline = time.time() + WEBSOCKET_POLL_TIMEOUT - attempt = 0 - total = WEBSOCKET_POLL_TIMEOUT // WEBSOCKET_POLL_INTERVAL - while time.time() < deadline: - attempt += 1 - body = await self._post( - f"{self._api_base}/callback/switch/{self.app_id}", {"callbackMode": 4} - ) - if body and body.get("code") == 10068: - _emit_progress( - "callback", "Waiting for WebSocket connection...", current=attempt, total=total - ) - await asyncio.sleep(WEBSOCKET_POLL_INTERVAL) - continue - if self._ok(body, "Switch callback mode → long connection(4)", "callback") is not None: - _log_success("callback", "Callback mode switched") - return True - return False - _log_error("callback", f"WebSocket connection timeout ({WEBSOCKET_POLL_TIMEOUT}s)") - return False - - async def step7_permissions(self) -> bool: - _log_info("basic_perm", "Importing permissions") - body = await self._get(f"{self._api_base}/scope/all/{self.app_id}") - if not self._ok(body, "Get permission list", "basic_perm"): - return False - name_to_id: dict[str, str] = {} - for s in body.get("data", {}).get("scopes", []): # type: ignore[union-attr] - name = s.get("name") or s.get("scopeName", "") - sid = s.get("id", "") - if name and sid: - name_to_id[name] = str(sid) - ids = [name_to_id[n] for n in BOT_PERMISSIONS if n in name_to_id] - missing = [n for n in BOT_PERMISSIONS if n not in name_to_id] - _log_info("basic_perm", f"Matched {len(ids)}/{len(BOT_PERMISSIONS)} permissions") - if missing: - _log_warn( - "basic_perm", - f"{len(missing)} permissions not matched: {json.dumps(missing, ensure_ascii=False)}", - ) - if not ids: - _log_error("basic_perm", "No available permission IDs") - return False - body = await self._post( - f"{self._api_base}/scope/update/{self.app_id}", - { - "clientId": self.app_id, - "appScopeIDs": ids, - "userScopeIDs": [], - "scopeIds": [], - "operation": "add", - }, - ) - if self._ok(body, "Batch add permissions", "basic_perm") is not None: - _log_success("basic_perm", "Permissions added") - return True - return False - - async def _get_scope_name_to_id(self) -> dict[str, str]: - body = await self._get(f"{self._api_base}/scope/all/{self.app_id}") - if not self._ok(body, "Get permission list", "permission"): - return {} - name_to_id: dict[str, str] = {} - for s in body.get("data", {}).get("scopes", []): # type: ignore[union-attr] - name = s.get("name") or s.get("scopeName", "") - sid = s.get("id", "") - if name and sid: - name_to_id[name] = str(sid) - return name_to_id - - async def step_add_audit_permissions(self) -> dict[str, Any]: - result: dict[str, Any] = {"added": False, "need_audit": False, "audit_url": None} - name_to_id = await self._get_scope_name_to_id() - if not name_to_id: - _log_error("advanced_perm", "Failed to get permission map") - return result - ids = [name_to_id[n] for n in BOT_PERMISSIONS_NEED_AUDIT if n in name_to_id] - missing = [n for n in BOT_PERMISSIONS_NEED_AUDIT if n not in name_to_id] - if missing: - _log_warn("advanced_perm", f"Advanced permissions not matched: {missing}") - if not ids: - result["added"] = True - return result - - body = await self._post( - f"{self._api_base}/scope/update/{self.app_id}", - { - "clientId": self.app_id, - "appScopeIDs": ids, - "userScopeIDs": [], - "scopeIds": [], - "operation": "add", - }, - ) - if not self._ok(body, "Add advanced permissions", "permission"): - return result - result["added"] = True - - audit_url = _pcfg("admin_audit_url") - _log_info("advanced_perm", "Publishing advanced permissions...") - publish_ok = await self.step8_publish(version="1.0.1", silent=True) - - if not publish_ok: - _log_error("advanced_perm", "Advanced permission publish failed") - result["need_audit"] = True - result["audit_url"] = self.audit_url or audit_url - return result - - await asyncio.sleep(2) - - info = await self._get(f"{self._api_base}/app/{self.app_id}") - if info and info.get("code") == 0: - data = info.get("data", {}) - audit_version_id = data.get("auditVersionId") - audit_status = data.get("auditStatus") - is_new_version = audit_version_id and str(audit_version_id) == str(self.version_id) - if is_new_version and audit_status == 100: - _log_success("advanced_perm", "Advanced permissions published") - result["need_audit"] = False - else: - _log_error("advanced_perm", "Auto-publish advanced permissions failed") - result["need_audit"] = True - result["audit_url"] = audit_url - else: - _log_error("advanced_perm", "Auto-publish advanced permissions failed") - result["need_audit"] = True - result["audit_url"] = audit_url - - return result - - async def step8_publish(self, version: str = "1.0.0", silent: bool = False) -> bool: - self.publish_fail_reason = "" - self.audit_url = None - admin_audit_url = _pcfg("admin_audit_url") - changelog = "Initial version" if PLATFORM == "lark" else "初始版本" - - if not silent: - _log_info("publish", "Publishing...") - body = await self._post( - f"{self._api_base}/app_version/create/{self.app_id}", - { - "clientId": self.app_id, - "appVersion": version, - "changeLog": changelog, - "autoPublish": False, - "pcDefaultAbility": "bot", - "mobileDefaultAbility": "bot", - }, - ) - if not self._ok(body, "Create version", "publish"): - self.publish_fail_reason = f"Create version failed: code={(body or {}).get('code')}, msg={(body or {}).get('msg')}" - return False - self.version_id = ( - body.get("data", {}).get("versionId") or body["data"].get("version_id") # type: ignore[union-attr,index] - ) - if not self.version_id: - _log_error("publish", "Publish failed") - self.publish_fail_reason = "Version ID not obtained" - return False - - await asyncio.sleep(1) - body = await self._post( - f"{self._api_base}/publish/commit/{self.app_id}/{self.version_id}", {} - ) - if not self._ok(body, "Submit for review", "publish"): - self.publish_fail_reason = ( - f"Submit failed: code={(body or {}).get('code')}, msg={(body or {}).get('msg')}" - ) - return False - - await asyncio.sleep(1) - body = await self._post( - f"{self._api_base}/publish/release/{self.app_id}/{self.version_id}", - {"clientId": self.app_id, "versionId": self.version_id}, - ) - release_code = (body or {}).get("code") - - if release_code == 0: - if not silent: - _log_success("publish", "Published", version_id=self.version_id) - return True - - if release_code == 10002: - await asyncio.sleep(1) - info = await self._get(f"{self._api_base}/app/{self.app_id}") - if info and info.get("code") == 0: - app_status = info.get("data", {}).get("appStatus") - if app_status == 1: - if not silent: - _log_success("publish", "Published", version_id=self.version_id) - return True - self.audit_url = admin_audit_url - _log_error("publish", "Auto-publish failed") - self.publish_fail_reason = ( - f"Admin approval required: appStatus={app_status}, " - f"release code={release_code}, msg={(body or {}).get('msg')}" - ) - return False - if not silent: - _log_success("publish", "Published", version_id=self.version_id) - return True - - if release_code is None: - await asyncio.sleep(1) - info = await self._get(f"{self._api_base}/app/{self.app_id}") - if info and info.get("code") == 0: - app_status = info.get("data", {}).get("appStatus") - if app_status == 1: - if not silent: - _log_success("publish", "Published", version_id=self.version_id) - return True - - fail_msg = (body or {}).get("msg", "Unknown error") - _log_error("publish", f"Publish failed: {fail_msg}") - self.publish_fail_reason = f"Publish failed: code={release_code}, msg={fail_msg}" - return False - - async def step9_get_owner_open_id(self) -> str | None: - _log_info("owner", "Getting app owner open_id") - if not self.app_id or not self.app_secret: - _log_warn("owner", "Missing app_id or app_secret, skipping") - return None - - ctx = ssl.create_default_context() - ctx.check_hostname = False - ctx.verify_mode = ssl.CERT_NONE - - payload = json.dumps({"app_id": self.app_id, "app_secret": self.app_secret}).encode() - req = urllib.request.Request( - f"{self._base_url}/open-apis/auth/v3/tenant_access_token/internal", - data=payload, - headers={"Content-Type": "application/json; charset=utf-8"}, - method="POST", - ) - try: - with urllib.request.urlopen(req, context=ctx) as resp: - token_data = json.loads(resp.read()) - except Exception: - _log_error("owner", "Failed to get tenant_access_token") - return None + finish = { + "app_id": app_id, + "app_secret": app_secret, + "bot_name": bot_name, + "open_id": open_id or None, + "manage_url": manage_url, + "tenant_brand": tenant_brand, + } + _save_state({"phase": "done", **finish}) + return finish - token = token_data.get("tenant_access_token") - if not token: - _log_error("owner", "Failed to get tenant_access_token") - return None - - req2 = urllib.request.Request( - f"{self._base_url}/open-apis/contact/v3/users?page_size=50&user_id_type=open_id", - headers={ - "Content-Type": "application/json; charset=utf-8", - "Authorization": f"Bearer {token}", - }, - method="GET", - ) - try: - with urllib.request.urlopen(req2, context=ctx) as resp: - user_data = json.loads(resp.read()) - except Exception: - _log_error("owner", "Failed to query user list") - return None - - items = user_data.get("data", {}).get("items", []) - if not items: - _log_error("owner", "User list is empty") - return None - - owner = items[0] - open_id = owner.get("open_id", "") - name = owner.get("name", "unknown") - _log_success("owner", f"User: {name}, open_id: {open_id}") - return cast(str | None, open_id) - - -# ============================================================ -# Command: init — verify harness-browser + Chromium are available -# ============================================================ -def cmd_init() -> None: - _log_info("init", "Checking dependencies (harness-browser + Chromium)...") +def cmd_init() -> None: + _log_info("init", "Checking lark-oapi...") try: - import harness_browser # noqa: F401 - except ImportError: - _emit_error("init", "harness-browser not installed. Run `pip install harness-browser`.") + version = _lark_oapi_version() + except importlib.metadata.PackageNotFoundError: + _emit_error("init", "lark-oapi not installed. Run `pip install 'lark-oapi>=1.5.5'`.") sys.exit(1) - - from harness_browser.cdp.launcher import find_chrome - - if find_chrome() is None: - _emit_error( - "init", - "Chrome/Chromium not found. Run `octop install-browsers` " - "or install Chrome via your system package manager.", - ) + if _parse_version(version) < MIN_LARK_OAPI: + _emit_error("init", f"lark-oapi {version} is too old; need >= 1.5.5") sys.exit(1) - - _log_success("init", "Dependencies ready") + _log_success("init", f"lark-oapi {version} ready") sys.exit(0) -# ============================================================ -# Command: create -# ============================================================ -async def _cmd_create(avatar_url: str = "", greeting: str = "") -> None: - base_url = _pcfg("base_url") - login_url = _pcfg("login_url") - open_host = _pcfg("open_host") - accounts_host = _pcfg("accounts_host") - app_page = f"{base_url}/app" - admin_audit_url = _pcfg("admin_audit_url") +def cmd_create(avatar_url: str = "", greeting: str = "") -> None: platform_label = "Lark" if PLATFORM == "lark" else "飞书" - - _log_info("login", "Starting browser, fetching QR code...") - _t_qr_total = time.monotonic() - - # ---- Launch harness-browser session ---- - _t_browser = time.monotonic() - sess: BrowserSession + _log_info("login", f"Starting {platform_label} scan-to-create flow...") try: - sess = await BrowserSession.create( - profile=_pcfg("profile_name"), - mode="auto", - ) - except Exception as exc: - _emit_error("login", f"Failed to launch browser: {exc}") + finish = register_feishu_app(avatar_url=avatar_url, greeting=greeting) + except AppAccessDeniedError as exc: + _emit_error("login", f"User denied authorization: {exc.description}") sys.exit(1) - - _log_info("login", f"Browser ready ({time.monotonic() - _t_browser:.2f}s)") - - # Bind the CDP client once outside the try blocks below so subsequent - # cleanup steps can still reach it even if an earlier mitigation step - # fails — otherwise the second ``try`` block would hit ``UnboundLocalError`` - # when trying to call ``Network.clearBrowserCookies``. - _ua_client = sess._internal.client - - # ---- Anti-headless fingerprint mitigation ------------------------------ - # Feishu's login page returns a stripped-down variant (no QR DOM, no - # ``.switch-login-mode-box``) when it detects HeadlessChrome via the - # User-Agent or the ``navigator.webdriver`` flag. Override both via CDP - # before any navigation so the page renders the standard QR-capable form. - try: - # Use a desktop Chrome UA matching the current Chromium major version. - await _ua_client.send( - "Network.setUserAgentOverride", - { - "userAgent": ( - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 " - "(KHTML, like Gecko) Chrome/145.0.7632.6 Safari/537.36" - ), - "acceptLanguage": "zh-CN,zh;q=0.9,en;q=0.8", - "platform": "Linux x86_64", - }, - ) - # Hide navigator.webdriver and a few other common automation tells on - # every new document so SPA navigations stay clean too. - await _ua_client.send( - "Page.addScriptToEvaluateOnNewDocument", - { - "source": ( - "Object.defineProperty(navigator, 'webdriver', " - "{get: () => undefined});" - "Object.defineProperty(navigator, 'languages', " - "{get: () => ['zh-CN', 'zh', 'en']});" - "Object.defineProperty(navigator, 'plugins', " - "{get: () => [1, 2, 3, 4, 5]});" - ), - }, - ) - _log_info("login", "Anti-headless fingerprint mitigation applied") - except Exception as exc: - _log_info("login", f"Anti-headless mitigation skipped ({exc})") - - # ---- Per-run session cleanup ------------------------------------------- - # ``harness_browser.launch_or_attach`` keeps Chrome alive across runs and - # *attaches* on the second start instead of launching a fresh process. - # That means cookies / localStorage from the previous QR attempt persist - # and cause Feishu to skip the QR form on subsequent runs (e.g. when it - # sees an existing ``__tcouv__``/session cookie). Clear them via CDP so - # every QR attempt starts from a clean session. - try: - await _ua_client.send("Network.clearBrowserCookies") - await _ua_client.send("Network.clearBrowserCache") - _log_info("login", "Session cookies & cache cleared for fresh QR attempt") - except Exception as exc: - _log_info("login", f"Session cleanup skipped ({exc})") - - capture = _NetworkCapture(sess, open_host) - await capture.install() - - async def _cleanup_browser() -> None: - with contextlib.suppress(Exception): - await sess.close() - - # ---- QR token capture via CDP responseReceived ---- - state: dict[str, Any] = {"qr_token": None, "qr_token_at": None} - - # Map requestId → url so we can fetch bodies asynchronously when needed. - request_url_by_id: dict[str, str] = {} - - async def _on_request_will_be_sent(params: dict[str, Any]) -> None: - rid = params.get("requestId", "") - url = params.get("request", {}).get("url", "") - if rid and url: - request_url_by_id[rid] = url - - sess._internal.client.on("Network.requestWillBeSent", _on_request_will_be_sent) - - async def _on_response(params: dict[str, Any]) -> None: - rid = params.get("requestId", "") - url = request_url_by_id.get(rid) or params.get("response", {}).get("url", "") - if "qrlogin/init" in url: - body = await _fetch_response_body(sess, rid) - if body and body.get("code") == 0: - token = body.get("data", {}).get("step_info", {}).get("token") - if token: - state["qr_token"] = token - state["qr_token_at"] = time.monotonic() - _log_info( - "login", - f"QR token acquired ({state['qr_token_at'] - _t_qr_total:.2f}s since start)", - ) - - capture.add_response_listener(_on_response) - - async def _switch_to_qr_mode() -> None: - try: - _t_switch = time.monotonic() - await asyncio.sleep(2) - await _eval( - sess, - """(() => { - const el = document.querySelector('.switch-login-mode-box'); - if (el) el.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true})); - return true; - })()""", - ) - await asyncio.sleep(1.5) - _log_info("login", f"Switched to QR mode ({time.monotonic() - _t_switch:.2f}s)") - except Exception: - _log_info("login", "QR mode switch skipped or failed") - - async def _fetch_qr_token() -> bool: - state["qr_token"] = None - _t_fetch = time.monotonic() - _log_info("login", "Navigating to login page...") - if not await _navigate(sess, login_url): - _log_info("login", f"Login page load failed ({time.monotonic() - _t_fetch:.2f}s)") - return False - _log_info("login", f"Login page loaded ({time.monotonic() - _t_fetch:.2f}s)") - if not _pcfg("qr_default"): - await _switch_to_qr_mode() - for _ in range(25): - if state["qr_token"]: - _log_info( - "login", f"QR token ready (first poll) ({time.monotonic() - _t_fetch:.2f}s)" - ) - return True - await asyncio.sleep(0.1) - - _log_info("login", "QR token not found in first attempt, reloading page...") - try: - await sess.reload() - except Exception: - if not await _navigate(sess, login_url): - _log_info("login", f"Reload failed ({time.monotonic() - _t_fetch:.2f}s)") - return False - if not _pcfg("qr_default"): - await _switch_to_qr_mode() - for _ in range(25): - if state["qr_token"]: - _log_info( - "login", f"QR token ready (second poll) ({time.monotonic() - _t_fetch:.2f}s)" - ) - return True - await asyncio.sleep(0.2) - _log_info("login", f"QR token acquisition failed ({time.monotonic() - _t_fetch:.2f}s)") - return False - - async def _poll_qr_login() -> bool: - login_state: dict[str, Any] = {"login_ok": False, "scanned": False} - - async def _on_poll_resp(params: dict[str, Any]) -> None: - rid = params.get("requestId", "") - url = request_url_by_id.get(rid) or params.get("response", {}).get("url", "") - if "qrlogin/polling" not in url: - return - body = await _fetch_response_body(sess, rid) - if not body or body.get("code") != 0: - return - data = body.get("data", {}) - info = data.get("step_info", {}) - status = info.get("status") - redirect_url = data.get("redirect_url", "") - if status == 2 and not login_state["scanned"]: - login_state["scanned"] = True - _log_info("login", "Scanned, please confirm on phone") - _emit_progress("login", "已扫码,请在手机上确认登录", current=0, total=1) - if redirect_url: - login_state["login_ok"] = True - - capture.add_response_listener(_on_poll_resp) - try: - poll_deadline = time.time() + LOGIN_TIMEOUT - while time.time() < poll_deadline: - if login_state["login_ok"]: - break - if login_state["scanned"]: - cur = await _current_url(sess) - if open_host in cur and accounts_host not in cur: - login_state["login_ok"] = True - break - await asyncio.sleep(0.5) - finally: - capture.remove_response_listener(_on_poll_resp) - return bool(login_state["login_ok"]) - - # ---- QR retry loop ---- - for attempt in range(1, QR_MAX_RETRIES + 1): - _log_info("login", f"Fetching QR token (attempt {attempt}/{QR_MAX_RETRIES})...") - if not await _fetch_qr_token(): - if attempt < QR_MAX_RETRIES: - _log_warn("login", f"Failed to get QR token, retrying ({attempt}/{QR_MAX_RETRIES})") - await asyncio.sleep(2) - continue - _log_info( - "login", f"All QR attempts exhausted ({time.monotonic() - _t_qr_total:.2f}s total)" - ) - await _cleanup_browser() - _emit_error("login", "Failed to get QR token") - sys.exit(1) - - _log_info( - "login", - f"QR code ready — total acquisition time: {time.monotonic() - _t_qr_total:.2f}s (attempt {attempt})", - ) - - qr_content = {"qrlogin": {"token": state["qr_token"]}} - _save_state( - { - "phase": "create", - "qr_token": state["qr_token"], - "qr_content": json.dumps(qr_content), - "deadline": int(time.time()) + LOGIN_TIMEOUT, - } - ) - _emit( - "show_qrcode", - "info", - "login", - f"Please scan to login {platform_label}", - content=json.dumps(qr_content, ensure_ascii=False), - ) - _emit_progress("login", "Waiting for scan...", current=attempt, total=QR_MAX_RETRIES) - - if await _poll_qr_login(): - break - - if attempt < QR_MAX_RETRIES: - _log_warn("login", f"QR expired, refreshing ({attempt}/{QR_MAX_RETRIES})") - await asyncio.sleep(1) - else: - await _cleanup_browser() - _emit_error("login", f"{QR_MAX_RETRIES} timeouts, exiting") - sys.exit(1) - - # ---- Wait for redirect ---- - _log_info("login", "Page redirected to open platform, login successful") - jump_deadline = time.time() + 15 - while time.time() < jump_deadline: - cur = await _current_url(sess) - if open_host in cur and accounts_host not in cur: - break - await asyncio.sleep(0.5) - else: - await _navigate(sess, app_page) - - _log_success("login", "Login successful!") - _emit_progress("create", "登录成功,正在自动创建机器人,请稍候…", current=0, total=1) - await asyncio.sleep(2) - - # ---- Bot creation ---- - bot_name = _gen_bot_name() - bot_desc = bot_name - avatar_path = _download_avatar(avatar_url) - - creator = FeishuBotCreator(sess, capture) - - await _navigate(sess, app_page) - await asyncio.sleep(2) - csrf = await creator._csrf() - _log_info("create_app", f"CSRF token: {'obtained' if csrf else 'not obtained, continuing'}") - - if not await creator.step1_create_app(bot_name, bot_desc, avatar_path): - await _cleanup_browser() - _emit_error("create_app", "Failed to create app") + except AppExpiredError as exc: + _emit_error("login", f"QR code expired: {exc.description}") sys.exit(1) - - if not await creator.step2_get_credentials(): - await _cleanup_browser() - _emit_error("credential", "Failed to get credentials") + except RegisterAppError as exc: + _emit_error("create_app", f"Failed to create app: {exc.code}: {exc.description}") sys.exit(1) - - # orca: credentials are returned via finish event, not written to config - _log_info("config", "Credentials ready — octop will handle storage") - - _step_error_messages = { - "step3_add_bot": ("bot_ability", "Failed to enable bot capability"), - "step4_event_mode": ( - "event_mode", - "Failed to establish long connection, check if octop is running", - ), - "step5_add_event": ("event", "Failed to add message receive event"), - "step6_callback_mode": ( - "callback", - "Failed to configure callback, check if octop is running", - ), - "step7_permissions": ("basic_perm", "Failed to import permissions"), - } - steps = [ - creator.step3_add_bot, - creator.step4_event_mode, - creator.step5_add_event, - creator.step6_callback_mode, - creator.step7_permissions, - ] - for fn in steps: - if not await fn(): - await _cleanup_browser() - step_name = fn.__name__ - err_step, err_msg = _step_error_messages.get( - step_name, (step_name, f"{step_name} failed") - ) - _emit_error(err_step, err_msg) - sys.exit(1) - - manage_url = f"{base_url}/app/{creator.app_id}" - publish_ok = await creator.step8_publish() - - if not publish_ok: - await _cleanup_browser() - fail_reason = creator.publish_fail_reason or "Publish failed" - audit_url = creator.audit_url or admin_audit_url - msg_lines = [ - f"Current user cannot auto-publish {platform_label} bot, please contact admin for approval.", - f"Bot name: {bot_name}", - f"Manage URL: {manage_url}", - f"Approval URL: {audit_url}", - ] - finish_data = { - "app_id": creator.app_id, - "app_secret": creator.app_secret, - "bot_name": bot_name, - "manage_url": manage_url, - "audit_url": audit_url, - "publish_fail_reason": fail_reason, - } - _emit("finish", "error", "publish", "\n".join(msg_lines), data=finish_data) + except Exception as exc: + _emit_error("create_app", f"Failed to create app: {exc}") sys.exit(1) - _log_info("advanced_perm", "Adding advanced permissions...") - audit_result = await creator.step_add_audit_permissions() - open_id = await creator.step9_get_owner_open_id() - - if open_id: - _send_greeting(creator.app_id or "", creator.app_secret or "", open_id, greeting) - else: - _log_warn("owner", "open_id not obtained, skipping greeting") - - await _cleanup_browser() - - result: dict[str, Any] = { - "app_id": creator.app_id, - "app_secret": creator.app_secret, - "bot_name": bot_name, - "version_id": creator.version_id, - "open_id": open_id, - "manage_url": manage_url, - } - - if audit_result.get("need_audit"): - audit_url = audit_result.get("audit_url") or admin_audit_url - result["audit_url"] = audit_url - result["audit_permissions"] = BOT_PERMISSIONS_NEED_AUDIT - finish_msg_lines = [ - f"✅ Bot「{bot_name}」created and published.", - f"Manage URL: {manage_url}", - "", - "⚠️ The following advanced permissions require admin approval:", - " · View, comment and download all files in cloud space", - " · View, comment, edit and manage all files in cloud space", - f"Contact admin for approval: {audit_url}", - ] - else: - finish_msg_lines = [ - f"✅ Bot「{bot_name}」created and published, all permissions active.", - f"Manage URL: {manage_url}", - ] - - _save_state({"phase": "done", **result}) - _emit_finish("\n".join(finish_msg_lines), result) - - -def cmd_create(avatar_url: str = "", greeting: str = "") -> None: - asyncio.run(_cmd_create(avatar_url=avatar_url, greeting=greeting)) + bot_name = str(finish.get("bot_name") or "") + manage_url = str(finish.get("manage_url") or "") + _log_success("create_app", "App created", app_id=finish["app_id"]) + _emit_finish( + f"✅ Bot「{bot_name}」created. Manage URL: {manage_url}", + finish, + ) -# ============================================================ -# Command: cleanup -# ============================================================ -async def _cmd_cleanup() -> None: - """Close any harness session for the bot profile and remove state file.""" - try: - from harness_browser.tool_interface import _registry as _hr - - sess = _hr.get(_pcfg("profile_name")) - if sess is not None: - with contextlib.suppress(Exception): - await sess.close() - _hr.pop(_pcfg("profile_name"), None) - except Exception: - pass - +def cmd_cleanup() -> None: sf = _state_file() if os.path.isfile(sf): with contextlib.suppress(OSError): @@ -1424,13 +355,6 @@ async def _cmd_cleanup() -> None: _log_success("cleanup", "Cleaned up") -def cmd_cleanup() -> None: - asyncio.run(_cmd_cleanup()) - - -# ============================================================ -# Entry point -# ============================================================ def main() -> None: global PLATFORM @@ -1438,42 +362,34 @@ def main() -> None: sys.exit(0) cmd = sys.argv[1] - if cmd == "init": cmd_init() - elif cmd == "create": - avatar_url = "" - greeting = "" - args = sys.argv[2:] - i = 0 - while i < len(args): - if args[i] == "--avatar-url" and i + 1 < len(args): - avatar_url = args[i + 1] - i += 2 - elif args[i] == "--greeting" and i + 1 < len(args): - greeting = args[i + 1] - i += 2 - elif args[i] == "--platform" and i + 1 < len(args): - p = args[i + 1].lower() - if p not in ("feishu", "lark"): - _emit_error("main", f"Unsupported platform: {p}, use feishu or lark") - sys.exit(1) - PLATFORM = p - i += 2 - else: - i += 1 + return + + avatar_url = "" + greeting = "" + args = sys.argv[2:] + i = 0 + while i < len(args): + if args[i] == "--avatar-url" and i + 1 < len(args): + avatar_url = args[i + 1] + i += 2 + elif args[i] == "--greeting" and i + 1 < len(args): + greeting = args[i + 1] + i += 2 + elif args[i] == "--platform" and i + 1 < len(args): + p = args[i + 1].lower() + if p not in ("feishu", "lark"): + _emit_error("main", f"Unsupported platform: {p}, use feishu or lark") + sys.exit(1) + PLATFORM = p + i += 2 + else: + i += 1 + + if cmd == "create": cmd_create(avatar_url=avatar_url, greeting=greeting) elif cmd == "cleanup": - args = sys.argv[2:] - i = 0 - while i < len(args): - if args[i] == "--platform" and i + 1 < len(args): - p = args[i + 1].lower() - if p in ("feishu", "lark"): - PLATFORM = p - i += 2 - else: - i += 1 cmd_cleanup() else: _emit_error("main", f"Unknown command: {cmd}") diff --git a/src/octop/infra/gateway/bot_creators/feishu_runner.py b/src/octop/infra/gateway/bot_creators/feishu_runner.py index 146e5846..dedd3b5b 100644 --- a/src/octop/infra/gateway/bot_creators/feishu_runner.py +++ b/src/octop/infra/gateway/bot_creators/feishu_runner.py @@ -12,10 +12,6 @@ from octop.infra.utils.subprocess_io import parse_subprocess_json_lines ALLOWED_PLATFORMS = frozenset({"feishu", "lark"}) -PROFILE_NAMES = { - "feishu": "octop-feishu-bot", - "lark": "octop-lark-bot", -} def bot_creator_script(name: str) -> Path: @@ -28,37 +24,6 @@ def bot_creator_script(name: str) -> Path: return script -def resolve_profiles_root() -> Path: - """Shared Octop profiles root; honor env overrides when present.""" - raw = (os.environ.get("BROWSER_USE_PROFILES_DIR") or "").strip() - if not raw: - raw = (os.environ.get("HARNESS_BROWSER_PROFILES_DIR") or "").strip() - if raw and len(raw) <= 2048: - return Path(raw).expanduser() - from octop.infra.utils.browser_media import octop_browser_profiles_dir # noqa: PLC0415 - - return octop_browser_profiles_dir() - - -def feishu_profile_dir(platform: str) -> Path: - if platform not in ALLOWED_PLATFORMS: - raise ValueError(f"platform must be one of {sorted(ALLOWED_PLATFORMS)}") - root = resolve_profiles_root().resolve() - profile = (root / PROFILE_NAMES[platform]).resolve() - profile.relative_to(root) - return profile - - -def clear_profile_locks(profile_dir: Path) -> None: - for lock_name in ("SingletonLock", "SingletonCookie", "SingletonSocket"): - try: - (profile_dir / lock_name).unlink() - except FileNotFoundError: - pass - except OSError: - pass - - def start_feishu_creator( *, platform: str, @@ -67,7 +32,6 @@ def start_feishu_creator( ) -> subprocess.Popen[bytes]: if platform not in ALLOWED_PLATFORMS: raise ValueError(f"platform must be one of {sorted(ALLOWED_PLATFORMS)}") - clear_profile_locks(feishu_profile_dir(platform)) script_path = bot_creator_script("feishu_bot_creator.py") cmd = [sys.executable, str(script_path), "create", "--platform", platform] if avatar_url: @@ -84,25 +48,38 @@ def start_feishu_creator( ) +def _qr_url_from_event(ev: dict[str, Any]) -> str | None: + content = ev.get("content", "") + if isinstance(content, str) and content.startswith("http"): + return content + try: + qr_data = json.loads(content) if isinstance(content, str) else content + except (json.JSONDecodeError, TypeError): + return None + if not isinstance(qr_data, dict): + return None + url = qr_data.get("url") + return str(url) if url else None + + def extract_feishu_credentials( lines: list[dict[str, Any]], ) -> tuple[str | None, str | None, str | None]: - qr_token = None + """Return ``(qr_url, app_id, app_secret)`` from creator stdout events.""" + qr_url = None app_id = None app_secret = None for ev in lines: if ev.get("action") == "show_qrcode": - content = ev.get("content", "") - try: - qr_data = json.loads(content) if isinstance(content, str) else content - qr_token = qr_data.get("qrlogin", {}).get("token") - except (json.JSONDecodeError, AttributeError): - pass + parsed = _qr_url_from_event(ev) + if parsed: + qr_url = parsed if ev.get("action") == "finish" and ev.get("level") == "success": data = ev.get("data", {}) - app_id = data.get("app_id") - app_secret = data.get("app_secret") - return qr_token, app_id, app_secret + if isinstance(data, dict): + app_id = data.get("app_id") + app_secret = data.get("app_secret") + return qr_url, app_id, app_secret def poll_feishu_creator( @@ -127,11 +104,11 @@ def poll_feishu_creator( status = "running" if finished: status = "finished" if return_code == 0 else "failed" - qr_token, app_id, app_secret = extract_feishu_credentials(lines) + qr_url, app_id, app_secret = extract_feishu_credentials(lines) return { "status": status, "events": new_lines, - "qr_token": qr_token, + "qr_url": qr_url, "app_id": app_id, "app_secret": app_secret, "return_code": return_code, diff --git a/tests/unit/gateway/test_channels_qr.py b/tests/unit/gateway/test_channels_qr.py index 386ec4a4..f054a542 100644 --- a/tests/unit/gateway/test_channels_qr.py +++ b/tests/unit/gateway/test_channels_qr.py @@ -313,7 +313,7 @@ def test_pkill_chrome_profile_accepts_resolved_path(monkeypatch: pytest.MonkeyPa def test_feishu_bot_creator_start_without_pkill_mock(mock_server_and_user): - """feishu/bot-creator/start must pass profile_dir validation before pkill.""" + """feishu/bot-creator/start launches the scan-to-create subprocess.""" server, user = mock_server_and_user mock_proc = MagicMock() @@ -353,7 +353,6 @@ def test_feishu_bot_creator_start_returns_pid(mock_server_and_user): "octop.api.routers.channels._bot_creator_script", return_value="/fake/feishu_bot_creator.py", ), - patch("octop.api.routers.channels._pkill_chrome_profile", new_callable=AsyncMock), patch("octop.api.routers.channels.asyncio.to_thread", new_callable=AsyncMock), ): app = _make_app(server, user) diff --git a/tests/unit/gateway/test_feishu_bot_creator.py b/tests/unit/gateway/test_feishu_bot_creator.py new file mode 100644 index 00000000..7ab03743 --- /dev/null +++ b/tests/unit/gateway/test_feishu_bot_creator.py @@ -0,0 +1,122 @@ +"""Unit tests for Feishu scan-to-create (lark-oapi register_app).""" + +from __future__ import annotations + +import json +from typing import Any + +import pytest +from lark_oapi.scene.registration.errors import AppAccessDeniedError, RegisterAppError + +from octop.infra.gateway.bot_creators import feishu_bot_creator as creator +from octop.infra.gateway.bot_creators.feishu_runner import extract_feishu_credentials + + +def test_extract_feishu_credentials_from_url_payload() -> None: + lines = [ + { + "action": "show_qrcode", + "content": json.dumps( + {"url": "https://accounts.feishu.cn/oauth/v1/device/verify?x=1", "expire_in": 600} + ), + }, + { + "action": "finish", + "level": "success", + "data": {"app_id": "cli_1", "app_secret": "sec"}, + }, + ] + qr_url, app_id, app_secret = extract_feishu_credentials(lines) + assert qr_url == "https://accounts.feishu.cn/oauth/v1/device/verify?x=1" + assert app_id == "cli_1" + assert app_secret == "sec" + + +def test_extract_feishu_credentials_from_bare_url() -> None: + lines = [{"action": "show_qrcode", "content": "https://accounts.larksuite.com/x"}] + qr_url, app_id, app_secret = extract_feishu_credentials(lines) + assert qr_url == "https://accounts.larksuite.com/x" + assert app_id is None + assert app_secret is None + + +def test_register_feishu_app_maps_sdk_result(monkeypatch: pytest.MonkeyPatch) -> None: + captured: dict[str, Any] = {} + + def fake_register_app(**kwargs: Any) -> dict[str, Any]: + captured.update(kwargs) + kwargs["on_qr_code"]({"url": "https://accounts.feishu.cn/qr", "expire_in": 120}) + return { + "client_id": "cli_new", + "client_secret": "secret_new", + "user_info": {"open_id": "ou_1", "tenant_brand": "feishu"}, + } + + sent: dict[str, Any] = {} + + def fake_send( + app_id: str, app_secret: str, open_id: str, *, open_base: str, greeting: str + ) -> None: + sent.update( + { + "app_id": app_id, + "app_secret": app_secret, + "open_id": open_id, + "open_base": open_base, + "greeting": greeting, + } + ) + + monkeypatch.setattr(creator.lark, "register_app", fake_register_app) + monkeypatch.setattr(creator, "_send_greeting", fake_send) + monkeypatch.setattr(creator, "_save_state", lambda _data: None) + + finish = creator.register_feishu_app(greeting="hello") + assert finish["app_id"] == "cli_new" + assert finish["app_secret"] == "secret_new" + assert finish["open_id"] == "ou_1" + assert finish["manage_url"] == "https://open.feishu.cn/app/cli_new" + assert captured["create_only"] is True + assert captured["source"] == "octop" + assert sent["open_id"] == "ou_1" + assert sent["greeting"] == "hello" + addons = captured["addons"] + assert "im:message:send_as_bot" in addons["scopes"]["tenant"] + assert addons["events"]["items"]["tenant"] == ["im.message.receive_v1"] + + +def test_cmd_create_denied( + monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] +) -> None: + def fake_register(**_kwargs: Any) -> dict[str, Any]: + raise AppAccessDeniedError("access_denied", "user cancelled") + + monkeypatch.setattr(creator.lark, "register_app", fake_register) + with pytest.raises(SystemExit) as exc: + creator.cmd_create() + assert exc.value.code == 1 + out = capsys.readouterr().out + payload = json.loads(out.strip().splitlines()[-1]) + assert payload["action"] == "finish" + assert payload["level"] == "error" + assert "denied" in payload["message"].lower() + + +def test_cmd_create_register_error( + monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] +) -> None: + def fake_register(**_kwargs: Any) -> dict[str, Any]: + raise RegisterAppError("unsupported_auth_method", "client_secret missing") + + monkeypatch.setattr(creator.lark, "register_app", fake_register) + with pytest.raises(SystemExit) as exc: + creator.cmd_create() + assert exc.value.code == 1 + payload = json.loads(capsys.readouterr().out.strip().splitlines()[-1]) + assert payload["step"] == "create_app" + + +def test_parse_version() -> None: + assert creator._parse_version("1.5.5") >= creator.MIN_LARK_OAPI + assert creator._parse_version("1.5.4") < creator.MIN_LARK_OAPI + assert creator._parse_version("1.7.0") >= creator.MIN_LARK_OAPI diff --git a/uv.lock b/uv.lock index ad3aae70..adacde35 100644 --- a/uv.lock +++ b/uv.lock @@ -2492,6 +2492,7 @@ dependencies = [ { name = "josepy" }, { name = "langchain-core" }, { name = "langgraph-checkpoint-postgres" }, + { name = "lark-oapi" }, { name = "mcp" }, { name = "orcakit-harness-agent", extra = ["all"] }, { name = "pillow" }, @@ -2568,6 +2569,7 @@ requires-dist = [ { name = "josepy", specifier = ">=2.2.0" }, { name = "langchain-core", specifier = ">=1.4.8" }, { name = "langgraph-checkpoint-postgres", specifier = ">=2.0" }, + { name = "lark-oapi", specifier = ">=1.5.5" }, { name = "mcp", specifier = ">=1.9,<2" }, { name = "mss", marker = "extra == 'desktop'", specifier = ">=9.0" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.10" }, From 0585ff89993516433463fe1ac77216caa0b5bf35 Mon Sep 17 00:00:00 2001 From: liukewia Date: Tue, 1 Sep 2026 20:28:57 +0800 Subject: [PATCH 12/58] refactor: enhance Feishu bot registration flow and localization - Updated localization strings in English and Chinese for improved clarity in the Feishu bot registration process. - Refactored the bot creation logic to streamline the registration flow, removing unnecessary parameters and ensuring credentials are handled correctly. - Added error handling for cases where the registration result is empty, improving robustness. These changes enhance user experience and align with the latest API requirements. --- dashboard/src/locales/en.json | 6 +- dashboard/src/locales/zh.json | 6 +- .../bot_creators/feishu_bot_creator.py | 65 +++++-------------- tests/unit/gateway/test_feishu_bot_creator.py | 14 +++- 4 files changed, 34 insertions(+), 57 deletions(-) diff --git a/dashboard/src/locales/en.json b/dashboard/src/locales/en.json index 6aa3f5ba..837418fe 100644 --- a/dashboard/src/locales/en.json +++ b/dashboard/src/locales/en.json @@ -1955,9 +1955,9 @@ "feishuQrStep2": "Scan the QR code below", "feishuQrStep3": "Confirm app creation on your phone", "feishuQrScanHint": "Scan with Feishu App, then confirm to receive credentials", - "feishuQrIntro1": "Click the button to generate a scan-to-create QR code", - "feishuQrIntro2": "Scan with Feishu App and confirm app creation", - "feishuQrIntro3": "App ID / App Secret are saved automatically after confirm", + "feishuQrIntro1": "Click the button below to generate a Feishu AI bot registration QR code", + "feishuQrIntro2": "Scan with Feishu App to finish bot registration", + "feishuQrIntro3": "Credentials are filled in and saved automatically", "feishuCreateButton": "Create Feishu bot", "feishuCreateFailed": "Failed to create Feishu bot", "feishuBindSuccess": "Feishu bot created and enabled", diff --git a/dashboard/src/locales/zh.json b/dashboard/src/locales/zh.json index 0c8dc97e..500f7468 100644 --- a/dashboard/src/locales/zh.json +++ b/dashboard/src/locales/zh.json @@ -1954,9 +1954,9 @@ "feishuQrStep2": "扫描下方二维码", "feishuQrStep3": "在手机上确认创建应用", "feishuQrScanHint": "请使用飞书 App 内的「扫一扫」扫描,确认后即可拿到凭证", - "feishuQrIntro1": "点击按钮,生成一键创建二维码", - "feishuQrIntro2": "用飞书 App 扫码并确认创建应用", - "feishuQrIntro3": "确认后自动写入 App ID / App Secret", + "feishuQrIntro1": "点击下方按钮,生成飞书 AI 机器人注册二维码", + "feishuQrIntro2": "用飞书 App 扫码,完成机器人注册", + "feishuQrIntro3": "凭据自动填入并保存", "feishuCreateButton": "一键创建飞书机器人", "feishuCreateFailed": "飞书机器人创建失败", "feishuBindSuccess": "飞书机器人已创建并启用", diff --git a/src/octop/infra/gateway/bot_creators/feishu_bot_creator.py b/src/octop/infra/gateway/bot_creators/feishu_bot_creator.py index e4056cf0..d87247a7 100644 --- a/src/octop/infra/gateway/bot_creators/feishu_bot_creator.py +++ b/src/octop/infra/gateway/bot_creators/feishu_bot_creator.py @@ -38,8 +38,9 @@ RegisterAppError, ) -if hasattr(sys.stdout, "reconfigure"): - sys.stdout.reconfigure(write_through=True) +_reconfigure = getattr(sys.stdout, "reconfigure", None) +if callable(_reconfigure): + _reconfigure(write_through=True) PLATFORM = "feishu" @@ -49,7 +50,6 @@ "accounts_domain": "https://accounts.feishu.cn", "lark_domain": "https://accounts.larksuite.com", "default_greeting": "Hi,我是你刚刚使用 Octop 创建的飞书机器人,你现在可以跟我聊天了!", - "app_name": "Octop机器人-{user}", "app_desc": "由 Octop 一键创建的飞书机器人", "state_file_prefix": "octop-feishu-bot", }, @@ -58,45 +58,14 @@ "accounts_domain": "https://accounts.larksuite.com", "lark_domain": "https://accounts.larksuite.com", "default_greeting": "Hi, I'm the bot you just created with Octop. You can chat with me now!", - "app_name": "Octop Bot-{user}", "app_desc": "Lark bot created by Octop", "state_file_prefix": "octop-lark-bot", }, } -DEFAULT_AVATAR_URL = "https://cloudcache.tencent-cloud.com/qcloud/ui/static/other_external_resource/4e9ca8c5-0ce4-44a2-8c7c-4f8f43f9e73a.png" STATE_DIR = "/tmp" MIN_LARK_OAPI = (1, 5, 5) -BOT_SCOPES = [ - "im:message", - "im:message.p2p_msg:readonly", - "im:message.group_at_msg:readonly", - "im:message:send_as_bot", - "im:resource", - "im:message.group_msg", - "im:message:readonly", - "im:message:update", - "im:message:recall", - "im:message.reactions:read", - "contact:user.base:readonly", - "contact:contact.base:readonly", - "docx:document:readonly", - "docx:document", - "docx:document.block:convert", - "wiki:wiki:readonly", - "wiki:wiki", - "bitable:app:readonly", - "bitable:app", - "task:task:read", - "task:task:write", - "drive:drive:readonly", - "drive:drive", -] - -BOT_EVENTS = ["im.message.receive_v1"] -BOT_CALLBACKS = ["card.action.trigger"] - def _pcfg(key: str) -> Any: return _PLATFORM_CONFIGS[PLATFORM][key] @@ -255,26 +224,24 @@ def _on_status_change(info: dict[str, Any]) -> None: def register_feishu_app(*, avatar_url: str = "", greeting: str = "") -> dict[str, Any]: """Run ``lark.register_app`` and return finish data (app_id / app_secret / …).""" - avatar = avatar_url.strip() or DEFAULT_AVATAR_URL + avatar = avatar_url.strip() greeting_text = greeting.strip() or str(_pcfg("default_greeting")) + app_preset: dict[str, Any] = {"desc": str(_pcfg("app_desc"))} + if avatar: + app_preset["avatar"] = avatar result = lark.register_app( on_qr_code=_on_qr_code, on_status_change=_on_status_change, source="octop", domain=str(_pcfg("accounts_domain")), lark_domain=str(_pcfg("lark_domain")), - app_preset={ - "avatar": avatar, - "name": str(_pcfg("app_name")), - "desc": str(_pcfg("app_desc")), - }, - addons={ - "scopes": {"tenant": list(BOT_SCOPES)}, - "events": {"items": {"tenant": list(BOT_EVENTS)}}, - "callbacks": {"items": list(BOT_CALLBACKS)}, - }, + app_preset=app_preset, create_only=True, ) + if not isinstance(result, dict): + raise RegisterAppError( + "missing_credentials", "register_app returned empty client_id/client_secret" + ) app_id = str(result.get("client_id") or "") app_secret = str(result.get("client_secret") or "") if not app_id or not app_secret: @@ -282,11 +249,12 @@ def register_feishu_app(*, avatar_url: str = "", greeting: str = "") -> dict[str "missing_credentials", "register_app returned empty client_id/client_secret" ) - user_info = result.get("user_info") if isinstance(result.get("user_info"), dict) else {} + raw_user_info = result.get("user_info") + user_info = raw_user_info if isinstance(raw_user_info, dict) else {} open_id = str(user_info.get("open_id") or "") tenant_brand = str(user_info.get("tenant_brand") or PLATFORM) open_base = _open_base_for_brand(tenant_brand) - bot_name = str(_pcfg("app_name")).replace("{user}", "").rstrip("-") + bot_name = str(result.get("app_name") or result.get("name") or "") manage_url = f"{open_base}/app/{app_id}" if open_id: @@ -341,8 +309,9 @@ def cmd_create(avatar_url: str = "", greeting: str = "") -> None: bot_name = str(finish.get("bot_name") or "") manage_url = str(finish.get("manage_url") or "") _log_success("create_app", "App created", app_id=finish["app_id"]) + created = f"Bot「{bot_name}」created" if bot_name else "Bot created" _emit_finish( - f"✅ Bot「{bot_name}」created. Manage URL: {manage_url}", + f"✅ {created}. Manage URL: {manage_url}", finish, ) diff --git a/tests/unit/gateway/test_feishu_bot_creator.py b/tests/unit/gateway/test_feishu_bot_creator.py index 7ab03743..835a0064 100644 --- a/tests/unit/gateway/test_feishu_bot_creator.py +++ b/tests/unit/gateway/test_feishu_bot_creator.py @@ -78,11 +78,12 @@ def fake_send( assert finish["manage_url"] == "https://open.feishu.cn/app/cli_new" assert captured["create_only"] is True assert captured["source"] == "octop" + assert "name" not in captured["app_preset"] + assert "avatar" not in captured["app_preset"] assert sent["open_id"] == "ou_1" assert sent["greeting"] == "hello" - addons = captured["addons"] - assert "im:message:send_as_bot" in addons["scopes"]["tenant"] - assert addons["events"]["items"]["tenant"] == ["im.message.receive_v1"] + # No addons: the scan page skips the extra scope-confirmation step. + assert "addons" not in captured def test_cmd_create_denied( @@ -102,6 +103,13 @@ def fake_register(**_kwargs: Any) -> dict[str, Any]: assert "denied" in payload["message"].lower() +def test_register_feishu_app_rejects_none_result(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(creator.lark, "register_app", lambda **_kwargs: None) + monkeypatch.setattr(creator, "_save_state", lambda _data: None) + with pytest.raises(RegisterAppError, match=r"missing_credentials"): + creator.register_feishu_app() + + def test_cmd_create_register_error( monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] ) -> None: From 36049d29f25a2daf8e9cfad4fa737c7c022ff9a6 Mon Sep 17 00:00:00 2001 From: liukewia Date: Tue, 1 Sep 2026 20:31:56 +0800 Subject: [PATCH 13/58] fix(ChannelDrawer): stop polling before generating QR codes for various platforms - Added `stopPolling()` calls in the QR generation functions for QQ, WeCom, Weixin, Dingtalk, Feishu, and Yuanbao to ensure polling is halted before initiating the QR code generation process. - Updated button click handlers to directly invoke the respective QR generation functions, improving user interaction and flow. These changes enhance the user experience by preventing potential conflicts during QR code generation. --- .../Channels/components/ChannelDrawer.tsx | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx b/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx index aa12a0f6..db08bff7 100644 --- a/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx +++ b/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx @@ -534,6 +534,7 @@ export function ChannelDrawer({ // ── QQ Bot Flow ──────────────────────────────────────────────────────── const startQqQr = useCallback(async () => { + stopPolling(); setQrState({ phase: "loading" }); try { const res = await channelApi.qqQrcodeGenerate(agentId); @@ -574,6 +575,7 @@ export function ChannelDrawer({ // ── WeCom Flow ───────────────────────────────────────────────────────── const startWecomQr = useCallback(async () => { + stopPolling(); setQrState({ phase: "loading" }); try { const res = await channelApi.wecomQrcodeGenerate(agentId); @@ -611,6 +613,7 @@ export function ChannelDrawer({ // ── WeChat Flow ───────────────────────────────────────────────────────── const startWeixinQr = useCallback(async () => { + stopPolling(); setQrState({ phase: "loading" }); try { const res = await channelApi.weixinQrcodeGenerate(agentId); @@ -652,6 +655,7 @@ export function ChannelDrawer({ // ── DingTalk Flow ─────────────────────────────────────────────────────── const startDingtalkQr = useCallback(async () => { + stopPolling(); setQrState({ phase: "loading" }); try { const res = await channelApi.dingtalkQrcodeGenerate(agentId); @@ -708,6 +712,7 @@ export function ChannelDrawer({ // ── Feishu Flow ───────────────────────────────────────────────────────── const startFeishuCreator = useCallback( async (platform: "feishu" | "lark" = "feishu") => { + stopPolling(); setQrState({ phase: "feishu_creating", message: t("channels.feishuCreating"), @@ -765,6 +770,7 @@ export function ChannelDrawer({ // ── YuanBao Flow ──────────────────────────────────────────────────────── const startYuanbaoCreator = useCallback(async () => { + stopPolling(); setQrState({ phase: "yuanbao_creating", message: "启动元宝扫码绑定流程...", @@ -1145,7 +1151,11 @@ export function ChannelDrawer({

{t("channels.qqQrScanHint")}

- @@ -1243,7 +1253,11 @@ export function ChannelDrawer({

扫码后自动跳转下一步

- @@ -1349,7 +1363,11 @@ export function ChannelDrawer({

使用微信扫码登录个人账号

- @@ -1446,7 +1464,11 @@ export function ChannelDrawer({

{t("channels.dingtalkUserCode")}: {s.userCode}

- @@ -1537,6 +1559,13 @@ export function ChannelDrawer({

{t("channels.feishuQrScanHint")}

+ ); } @@ -1659,6 +1688,13 @@ export function ChannelDrawer({

扫码后在元宝 App 确认绑定

+ ); } From 3f5678cb9d6dce008a08512bf8dab6f1d8a9618b Mon Sep 17 00:00:00 2001 From: liukewia Date: Wed, 2 Sep 2026 14:50:35 +0800 Subject: [PATCH 14/58] refactor: update localization and enhance QR code generation flow - Modified localization strings in English and Chinese for improved clarity in QR code generation instructions across various platforms (WeChat, DingTalk, Feishu, YuanBao). - Enhanced the styling of QR code display elements in the UI for better user experience. - Refactored QR code generation logic in the ChannelDrawer component to ensure smoother transitions and prevent conflicts during the process. These changes aim to improve user guidance and streamline the QR code generation experience. --- dashboard/src/locales/en.json | 20 +- dashboard/src/locales/zh.json | 22 +- .../Channels/components/ChannelDrawer.tsx | 595 +++++++----------- .../pages/Agent/Channels/index.module.less | 11 + 4 files changed, 261 insertions(+), 387 deletions(-) diff --git a/dashboard/src/locales/en.json b/dashboard/src/locales/en.json index 837418fe..17d0d77b 100644 --- a/dashboard/src/locales/en.json +++ b/dashboard/src/locales/en.json @@ -1897,16 +1897,16 @@ "qrStep2": "Scan the QR code below to authorize", "qrStep3": "Credentials will be auto-filled after scanning", "qrScanHint": "Scan with WeCom App", - "weixinQrStep1": "Open WeChat App", + "weixinQrStep1": "Open WeChat", "weixinQrStep2": "Scan the QR code below to authorize", "weixinQrStep3": "Credentials will be auto-filled after scanning", "weixinQrScanHint": "Scan with WeChat App", - "dingtalkQrLoading": "Initializing DingTalk application registration...", + "dingtalkQrLoading": "Generating QR code...", "dingtalkQrIntro1": "Generate a DingTalk application authorization QR code", "dingtalkQrIntro2": "Scan and confirm in DingTalk while signed in to the same organization", "dingtalkQrIntro3": "Octop creates and enables the DingTalk channel automatically", - "dingtalkQrStep1": "Open DingTalk App", - "dingtalkQrStep2": "Scan the application authorization code", + "dingtalkQrStep1": "Open DingTalk", + "dingtalkQrStep2": "Scan QR code", "dingtalkQrStep3": "Confirm application creation", "dingtalkQrScanHint": "Scan with DingTalk App to finish authorization", "dingtalkUserCode": "User code", @@ -1947,13 +1947,13 @@ "qrTimeout": "Scan timed out (3 min), please retry", "qrFailed": "Scan failed, please retry", "qrGenerateFailed": "Failed to generate QR code, check network and retry", - "qrRetry": "Regenerate QR Code", - "feishuCreating": "Initializing Feishu bot creation...", + "qrRetry": "Regenerate", + "feishuCreating": "Generating QR code...", "feishuApiTimeout": "Feishu API timed out, please use manual configuration", "feishuSwitchManual": "Use Manual Config", - "feishuQrStep1": "Open Feishu App, tap \"+ → Scan\" in top-right", - "feishuQrStep2": "Scan the QR code below", - "feishuQrStep3": "Confirm app creation on your phone", + "feishuQrStep1": "Open Feishu Scan", + "feishuQrStep2": "Scan QR code", + "feishuQrStep3": "Confirm on phone", "feishuQrScanHint": "Scan with Feishu App, then confirm to receive credentials", "feishuQrIntro1": "Click the button below to generate a Feishu AI bot registration QR code", "feishuQrIntro2": "Scan with Feishu App to finish bot registration", @@ -1965,7 +1965,7 @@ "feishuCreateSuccessNamed": "Feishu bot \"{{name}}\" created successfully", "feishuBotName": "Bot Name", "feishuManageBot": "Manage on Feishu Open Platform", - "yuanbaoCreating": "Initializing YuanBao bot binding...", + "yuanbaoCreating": "Generating QR code...", "yuanbaoQrStep1": "Open Tencent YuanBao App", "yuanbaoQrStep2": "Scan the QR code below to bind your bot", "yuanbaoQrScanHint": "Scan with Tencent YuanBao App", diff --git a/dashboard/src/locales/zh.json b/dashboard/src/locales/zh.json index 500f7468..c3a18fe4 100644 --- a/dashboard/src/locales/zh.json +++ b/dashboard/src/locales/zh.json @@ -1891,21 +1891,21 @@ "quickConfigStep2": "按照指引完成机器人授权", "quickConfigStep3": "授权完成后回到此页面,频道将自动连接", "goToAuthorize": "前往授权", - "qrLoading": "正在获取二维码...", + "qrLoading": "生成二维码中...", "qrStep1": "打开企业微信 App", "qrStep2": "扫描下方二维码完成授权", "qrStep3": "扫码成功后自动获取凭据并接入", "qrScanHint": "请使用企业微信扫描二维码", - "weixinQrStep1": "打开微信 App", + "weixinQrStep1": "打开微信", "weixinQrStep2": "扫描下方二维码完成授权", "weixinQrStep3": "扫码成功后自动获取凭据并接入", "weixinQrScanHint": "请使用微信扫描二维码", - "dingtalkQrLoading": "正在初始化钉钉应用创建流程...", + "dingtalkQrLoading": "生成二维码中...", "dingtalkQrIntro1": "点击按钮生成钉钉应用授权二维码", "dingtalkQrIntro2": "使用同一组织账号登录的钉钉 App 扫码并确认", "dingtalkQrIntro3": "Octop 将自动创建并启用钉钉频道", - "dingtalkQrStep1": "打开钉钉 App", - "dingtalkQrStep2": "扫描应用授权二维码", + "dingtalkQrStep1": "打开钉钉", + "dingtalkQrStep2": "扫描二维码", "dingtalkQrStep3": "确认创建应用", "dingtalkQrScanHint": "请使用钉钉 App 扫码完成授权", "dingtalkUserCode": "用户码", @@ -1946,13 +1946,13 @@ "qrTimeout": "扫码超时(3 分钟),请重试", "qrFailed": "扫码失败,请重试", "qrGenerateFailed": "获取二维码失败,请检查网络后重试", - "qrRetry": "重新获取二维码", - "feishuCreating": "正在初始化飞书机器人创建流程...", + "qrRetry": "重新生成", + "feishuCreating": "生成二维码中...", "feishuApiTimeout": "调用飞书接口超时,请使用手动配置", "feishuSwitchManual": "使用手动配置", - "feishuQrStep1": "打开飞书 App,点击右上角「+」→「扫一扫」", - "feishuQrStep2": "扫描下方二维码", - "feishuQrStep3": "在手机上确认创建应用", + "feishuQrStep1": "打开飞书扫一扫", + "feishuQrStep2": "扫描二维码", + "feishuQrStep3": "确认创建应用", "feishuQrScanHint": "请使用飞书 App 内的「扫一扫」扫描,确认后即可拿到凭证", "feishuQrIntro1": "点击下方按钮,生成飞书 AI 机器人注册二维码", "feishuQrIntro2": "用飞书 App 扫码,完成机器人注册", @@ -1964,7 +1964,7 @@ "feishuCreateSuccessNamed": "飞书机器人「{{name}}」创建成功", "feishuBotName": "机器人名称", "feishuManageBot": "前往飞书开放平台管理", - "yuanbaoCreating": "正在初始化元宝机器人绑定流程...", + "yuanbaoCreating": "生成二维码中...", "yuanbaoQrStep1": "打开腾讯元宝 App", "yuanbaoQrStep2": "扫描下方二维码完成机器人绑定", "yuanbaoQrScanHint": "请使用腾讯元宝 App 扫描二维码", diff --git a/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx b/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx index db08bff7..fbde6960 100644 --- a/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx +++ b/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx @@ -511,16 +511,31 @@ export function ChannelDrawer({ } }, [open, resetQr]); - useEffect(() => { - resetQr(); - }, [selectedKind, resetQr]); - useEffect(() => { if (open && initialValues?.kind) { setSelectedKind(initialValues.kind); } }, [open, initialValues?.kind]); + // Only wipe an in-flight QR when the kind actually changes while the drawer + // is already open. A blanket `[selectedKind]` reset races the open-time + // kickoff: QR appears, kind sync/draft fires, resetQr hides it, and a second + // start often never gets a new qr_url. + const kindWhileOpenRef = useRef(null); + useEffect(() => { + if (!open) { + kindWhileOpenRef.current = null; + return; + } + if (kindWhileOpenRef.current === null) { + kindWhileOpenRef.current = selectedKind; + return; + } + if (kindWhileOpenRef.current === selectedKind) return; + kindWhileOpenRef.current = selectedKind; + resetQr(); + }, [open, selectedKind, resetQr]); + // Restore session draft after server/default values are applied. useEffect(() => { if (!open || loadingConfig || !draftScope) return; @@ -533,7 +548,7 @@ export function ChannelDrawer({ }, [open, loadingConfig, draftScope, form]); // ── QQ Bot Flow ──────────────────────────────────────────────────────── - const startQqQr = useCallback(async () => { + const startQqQr = async () => { stopPolling(); setQrState({ phase: "loading" }); try { @@ -571,10 +586,10 @@ export function ChannelDrawer({ reason: e instanceof Error ? e.message : String(e), }); } - }, [agentId, stopPolling, t]); + }; // ── WeCom Flow ───────────────────────────────────────────────────────── - const startWecomQr = useCallback(async () => { + const startWecomQr = async () => { stopPolling(); setQrState({ phase: "loading" }); try { @@ -609,10 +624,10 @@ export function ChannelDrawer({ reason: e instanceof Error ? e.message : String(e), }); } - }, [agentId, stopPolling]); + }; // ── WeChat Flow ───────────────────────────────────────────────────────── - const startWeixinQr = useCallback(async () => { + const startWeixinQr = async () => { stopPolling(); setQrState({ phase: "loading" }); try { @@ -651,10 +666,10 @@ export function ChannelDrawer({ reason: e instanceof Error ? e.message : String(e), }); } - }, [agentId, stopPolling]); + }; // ── DingTalk Flow ─────────────────────────────────────────────────────── - const startDingtalkQr = useCallback(async () => { + const startDingtalkQr = async () => { stopPolling(); setQrState({ phase: "loading" }); try { @@ -707,69 +722,68 @@ export function ChannelDrawer({ reason: e instanceof Error ? e.message : String(e), }); } - }, [agentId, onProvisioned, stopPolling, t]); + }; // ── Feishu Flow ───────────────────────────────────────────────────────── - const startFeishuCreator = useCallback( - async (platform: "feishu" | "lark" = "feishu") => { - stopPolling(); + const startFeishuCreator = async ( + platform: "feishu" | "lark" = "feishu", + ) => { + stopPolling(); + setQrState({ + phase: "feishu_creating", + message: t("channels.feishuCreating"), + }); + try { + await channelApi.feishuBotCreatorStart(agentId, { platform }); + } catch (e: unknown) { setQrState({ - phase: "feishu_creating", - message: t("channels.feishuCreating"), + phase: "error", + reason: e instanceof Error ? e.message : String(e), }); + return; + } + const timer = setInterval(async () => { try { - await channelApi.feishuBotCreatorStart(agentId, { platform }); - } catch (e: unknown) { - setQrState({ - phase: "error", - reason: e instanceof Error ? e.message : String(e), - }); - return; - } - const timer = setInterval(async () => { - try { - const poll = await channelApi.feishuBotCreatorPoll(agentId); - if (poll.qr_url) { - setQrState((prev) => - prev.phase === "feishu_progress" || prev.phase === "feishu_done" - ? prev - : { phase: "feishu_qr", qrUrl: poll.qr_url! }, - ); - } - if (poll.status === "finished" && poll.app_id && poll.app_secret) { - stopPolling(); - const finishEvent = poll.events.find( - (e) => e.action === "finish" && e.level === "success", - ); - const data = (finishEvent?.data ?? {}) as Record; - setQrState({ - phase: "feishu_done", - appId: poll.app_id, - appSecret: poll.app_secret, - botName: data.bot_name as string | undefined, - manageUrl: data.manage_url as string | undefined, - }); - } else if (poll.status === "failed") { - stopPolling(); - const errEvent = poll.events.find( - (e) => e.action === "finish" && e.level === "error", - ); - setQrState({ - phase: "error", - reason: errEvent?.message ?? t("channels.feishuCreateFailed"), - }); - } - } catch { - // keep polling + const poll = await channelApi.feishuBotCreatorPoll(agentId); + if (poll.qr_url) { + setQrState((prev) => + prev.phase === "feishu_progress" || prev.phase === "feishu_done" + ? prev + : { phase: "feishu_qr", qrUrl: poll.qr_url! }, + ); } - }, 1500); - pollTimerRef.current = timer; - }, - [agentId, stopPolling, t], - ); + if (poll.status === "finished" && poll.app_id && poll.app_secret) { + stopPolling(); + const finishEvent = poll.events.find( + (e) => e.action === "finish" && e.level === "success", + ); + const data = (finishEvent?.data ?? {}) as Record; + setQrState({ + phase: "feishu_done", + appId: poll.app_id, + appSecret: poll.app_secret, + botName: data.bot_name as string | undefined, + manageUrl: data.manage_url as string | undefined, + }); + } else if (poll.status === "failed") { + stopPolling(); + const errEvent = poll.events.find( + (e) => e.action === "finish" && e.level === "error", + ); + setQrState({ + phase: "error", + reason: errEvent?.message ?? t("channels.feishuCreateFailed"), + }); + } + } catch { + // keep polling + } + }, 1500); + pollTimerRef.current = timer; + }; // ── YuanBao Flow ──────────────────────────────────────────────────────── - const startYuanbaoCreator = useCallback(async () => { + const startYuanbaoCreator = async () => { stopPolling(); setQrState({ phase: "yuanbao_creating", @@ -824,7 +838,49 @@ export function ChannelDrawer({ } }, 2000); pollTimerRef.current = timer; - }, [agentId, stopPolling]); + }; + + // Entering quick-config starts QR generation immediately (no extra click). + useEffect(() => { + if (!open || isEdit || loadingConfig) return; + if (configMode !== "quick" && selectedKind !== "weixin") return; + if (qrState.phase !== "idle") return; + // Wait until local kind matches the card that opened the drawer. + if (initialValues?.kind && selectedKind !== initialValues.kind) return; + + switch (selectedKind) { + case "qq": + void startQqQr(); + break; + case "wecom": + void startWecomQr(); + break; + case "weixin": + void startWeixinQr(); + break; + case "dingtalk": + void startDingtalkQr(); + break; + case "feishu": + void startFeishuCreator("feishu"); + break; + case "yuanbao": + void startYuanbaoCreator(); + break; + default: + break; + } + // start* omitted: recreated each render; idle-phase already one-shots. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + open, + isEdit, + loadingConfig, + configMode, + selectedKind, + qrState.phase, + initialValues?.kind, + ]); // ── Form ──────────────────────────────────────────────────────────────── const fields = CHANNEL_FIELDS[selectedKind]; @@ -1094,13 +1150,48 @@ export function ChannelDrawer({ }; // ── QR Panels ─────────────────────────────────────────────────────────── + function renderQrSteps(step1: string, step2: string, step3: string) { + return ( +
+ + 1 + {step1} + + + + 2 + {step2} + + + + 3 + {step3} + +
+ ); + } + + function renderQrLoading(step1: string, step2: string, step3: string) { + return ( +
+ {renderQrSteps(step1, step2, step3)} +
+
+ +
+
+

{t("channels.qrLoading")}

+
+ ); + } + function renderQqPanel() { const s = qrState; - if (s.phase === "loading") - return ( -
- -
+ if (s.phase === "loading" || s.phase === "idle") + return renderQrLoading( + t("channels.qqQrStep1"), + t("channels.qqQrStep2"), + t("channels.qqQrStep3"), ); if (s.phase === "qq_success") { const retrySave = () => @@ -1129,22 +1220,11 @@ export function ChannelDrawer({ if (s.phase === "qq_ready") { return (
-
- - 1 - {t("channels.qqQrStep1")} - - - - 2 - {t("channels.qqQrStep2")} - - - - 3 - {t("channels.qqQrStep3")} - -
+ {renderQrSteps( + t("channels.qqQrStep1"), + t("channels.qqQrStep2"), + t("channels.qqQrStep3"), + )}
@@ -1156,7 +1236,7 @@ export function ChannelDrawer({ onClick={() => void startQqQr()} style={{ marginTop: 4 }} > - {t("channels.qrRetry")} + {t("channels.qrRegenerate")}
); @@ -1170,47 +1250,18 @@ export function ChannelDrawer({ style={{ width: "100%", marginBottom: 12 }} />
); } - return ( -
-
-
- 1 - {t("channels.qqQrIntro1")} -
-
- 2 - {t("channels.qqQrIntro2")} -
-
- 3 - {t("channels.qqQrIntro3")} -
-
- -
- ); + return null; } function renderWecomPanel() { const s = qrState; - if (s.phase === "loading") - return ( -
- -
- ); + if (s.phase === "loading" || s.phase === "idle") + return renderQrLoading("打开企业微信", "扫码注册 AI 机器人", "确认绑定"); if (s.phase === "wecom_success") { const retrySave = () => submitChannel( @@ -1234,19 +1285,7 @@ export function ChannelDrawer({ if (s.phase === "wecom_ready") { return (
-
- - 1打开企业微信 - - - - 2扫码注册 AI 机器人 - - - - 3确认绑定 - -
+ {renderQrSteps("打开企业微信", "扫码注册 AI 机器人", "确认绑定")}
@@ -1277,42 +1316,13 @@ export function ChannelDrawer({
); } - return ( -
-
-
- 1 - 点击下方按钮,生成企业微信 AI 机器人注册二维码 -
-
- 2用企业微信 App - 扫码,完成机器人注册 -
-
- 3 - 凭据自动填入并保存 -
-
- -
- ); + return null; } function renderWeixinPanel() { const s = qrState; - if (s.phase === "loading") - return ( -
- -
- ); + if (s.phase === "loading" || s.phase === "idle") + return renderQrLoading("打开微信 App", "扫码登录", "手机确认"); if (s.phase === "weixin_success") { const weixinConfig = mergeDisplayConfig({ accounts: [ @@ -1344,19 +1354,7 @@ export function ChannelDrawer({ if (s.phase === "weixin_ready") { return (
-
- - 1打开微信 App - - - - 2扫码登录 - - - - 3手机确认 - -
+ {renderQrSteps("打开微信 App", "扫码登录", "手机确认")}
@@ -1387,40 +1385,16 @@ export function ChannelDrawer({
); } - return ( -
-
-
- 1 - 点击按钮生成微信登录二维码 -
-
- 2微信扫码并在手机确认登录 -
-
- 3登录成功后自动保存配置 -
-
- -
- ); + return null; } function renderDingtalkPanel() { const s = qrState; - if (s.phase === "loading") { - return ( -
- -

{t("channels.dingtalkQrLoading")}

-
+ if (s.phase === "loading" || s.phase === "idle") { + return renderQrLoading( + t("channels.dingtalkQrStep1"), + t("channels.dingtalkQrStep2"), + t("channels.dingtalkQrStep3"), ); } if (s.phase === "dingtalk_success") { @@ -1437,22 +1411,11 @@ export function ChannelDrawer({ if (s.phase === "dingtalk_ready") { return (
-
- - 1 - {t("channels.dingtalkQrStep1")} - - - - 2 - {t("channels.dingtalkQrStep2")} - - - - 3 - {t("channels.dingtalkQrStep3")} - -
+ {renderQrSteps( + t("channels.dingtalkQrStep1"), + t("channels.dingtalkQrStep2"), + t("channels.dingtalkQrStep3"), + )}
@@ -1488,81 +1451,45 @@ export function ChannelDrawer({
); } - return ( -
-
-
- 1 - {t("channels.dingtalkQrIntro1")} -
-
- 2 - {t("channels.dingtalkQrIntro2")} -
-
- 3 - {t("channels.dingtalkQrIntro3")} -
-
- -
- ); + return null; } function renderFeishuPanel() { const s = qrState; - if (s.phase === "feishu_creating" || s.phase === "feishu_progress") { - return ( -
- -

- {s.message} -

-
- ); - } - if (s.phase === "feishu_qr") { + const feishuPending = + s.phase === "idle" || + s.phase === "loading" || + s.phase === "feishu_creating" || + s.phase === "feishu_progress"; + if (feishuPending || s.phase === "feishu_qr") { return (
-
- - 1 - {t("channels.feishuQrStep1")} - - - - 2 - {t("channels.feishuQrStep2")} - - - - 3 - {t("channels.feishuQrStep3")} - -
+ {renderQrSteps( + t("channels.feishuQrStep1"), + t("channels.feishuQrStep2"), + t("channels.feishuQrStep3"), + )}
- + {s.phase === "feishu_qr" ? ( + + ) : ( + + )}
-

{t("channels.feishuQrScanHint")}

+

+ {s.phase === "feishu_qr" + ? t("channels.feishuQrScanHint") + : t("channels.qrLoading")} +

@@ -1614,74 +1541,33 @@ export function ChannelDrawer({ style={{ width: "100%", marginBottom: 12 }} />
); } - return ( -
-
-
- 1 - {t("channels.feishuQrIntro1")} -
-
- 2 - {t("channels.feishuQrIntro2")} -
-
- 3 - {t("channels.feishuQrIntro3")} -
-
- -
+ return renderQrLoading( + t("channels.feishuQrStep1"), + t("channels.feishuQrStep2"), + t("channels.feishuQrStep3"), ); } function renderYuanbaoPanel() { const s = qrState; - if (s.phase === "yuanbao_creating" || s.phase === "yuanbao_progress") { - return ( -
- -

- {s.message} -

-
- ); + if ( + s.phase === "idle" || + s.phase === "loading" || + s.phase === "yuanbao_creating" || + s.phase === "yuanbao_progress" + ) { + return renderQrLoading("打开元宝 App", "扫码绑定", "确认授权"); } if (s.phase === "yuanbao_scan") { const qrValue = s.scanUrl ?? s.scanCode; return (
-
- - 1打开元宝 App - - - - 2扫码绑定 - - - - 3确认授权 - -
+ {renderQrSteps("打开元宝 App", "扫码绑定", "确认授权")}
@@ -1734,30 +1620,7 @@ export function ChannelDrawer({
); } - return ( -
-
-
- 1点击按钮,获取元宝扫码 -
-
- 2在元宝 App - 扫码并确认授权 -
-
- 3凭据自动填入并保存 -
-
- -
- ); + return renderQrLoading("打开元宝 App", "扫码绑定", "确认授权"); } // ── Render ────────────────────────────────────────────────────────────── diff --git a/dashboard/src/pages/Agent/Channels/index.module.less b/dashboard/src/pages/Agent/Channels/index.module.less index 8f8b69e2..0e4986cb 100644 --- a/dashboard/src/pages/Agent/Channels/index.module.less +++ b/dashboard/src/pages/Agent/Channels/index.module.less @@ -612,6 +612,15 @@ } .qrFrame { + box-sizing: content-box; + display: flex; + align-items: center; + justify-content: center; + width: 200px; + height: 200px; + min-width: 200px; + min-height: 200px; + flex-shrink: 0; padding: 8px; background: #fff; border-radius: 10px; @@ -635,6 +644,7 @@ gap: 6px; width: 100%; justify-content: center; + margin-bottom: 8px; } .qrStep { @@ -647,6 +657,7 @@ border: 1px solid var(--fn-border-secondary, rgba(0, 0, 0, 0.07)); padding: 4px 10px 4px 5px; border-radius: 999px; + white-space: nowrap; } .qrDot { From d1ce5c5d766bc67f16496f1270ca8bf9f1b1eb94 Mon Sep 17 00:00:00 2001 From: liukewia Date: Wed, 2 Sep 2026 14:53:07 +0800 Subject: [PATCH 15/58] refactor(ChannelDrawer): enhance localization and error handling for QR code flows - Updated localization strings in English and Chinese for improved clarity in QR code generation and binding instructions across various platforms (WeCom, WeChat, YuanBao). - Integrated translation functions to dynamically handle error messages and prompts, enhancing user experience during the QR code generation process. - Refactored error handling in the ChannelDrawer component to provide more informative feedback to users in case of failures. These changes aim to streamline the user experience and ensure consistent messaging across the application. --- dashboard/src/locales/en.json | 37 ++++--- dashboard/src/locales/zh.json | 39 ++++--- .../Channels/components/ChannelDrawer.tsx | 102 +++++++++++++----- 3 files changed, 125 insertions(+), 53 deletions(-) diff --git a/dashboard/src/locales/en.json b/dashboard/src/locales/en.json index 17d0d77b..9f604091 100644 --- a/dashboard/src/locales/en.json +++ b/dashboard/src/locales/en.json @@ -1886,21 +1886,21 @@ "checkRequestFailed": "Connection check request failed, please try again later", "checkFailedAutoDisabled": "Credential verification failed, channel has been auto-disabled", "enableFailedCheckFailed": "Enable failed: connection check did not pass", - "quickConfig": "Scan to Connect", - "manualConfig": "Manual Config", + "quickConfig": "Quick setup (scan)", + "manualConfig": "Fill in manually", "quickConfigStep1": "Click the button below to go to WeCom Open Platform", "quickConfigStep2": "Follow the instructions to authorize your bot", "quickConfigStep3": "Once authorized, return here and the channel will connect automatically", "goToAuthorize": "Go to Authorize", "qrLoading": "Generating QR code...", - "qrStep1": "Open WeCom App", - "qrStep2": "Scan the QR code below to authorize", - "qrStep3": "Credentials will be auto-filled after scanning", - "qrScanHint": "Scan with WeCom App", + "qrStep1": "Open WeCom", + "qrStep2": "Scan to register an AI bot", + "qrStep3": "Confirm binding", + "qrScanHint": "Next step starts automatically after scanning", "weixinQrStep1": "Open WeChat", - "weixinQrStep2": "Scan the QR code below to authorize", - "weixinQrStep3": "Credentials will be auto-filled after scanning", - "weixinQrScanHint": "Scan with WeChat App", + "weixinQrStep2": "Scan to sign in", + "weixinQrStep3": "Confirm on phone", + "weixinQrScanHint": "Scan with WeChat to sign in to your personal account", "dingtalkQrLoading": "Generating QR code...", "dingtalkQrIntro1": "Generate a DingTalk application authorization QR code", "dingtalkQrIntro2": "Scan and confirm in DingTalk while signed in to the same organization", @@ -1966,9 +1966,12 @@ "feishuBotName": "Bot Name", "feishuManageBot": "Manage on Feishu Open Platform", "yuanbaoCreating": "Generating QR code...", - "yuanbaoQrStep1": "Open Tencent YuanBao App", - "yuanbaoQrStep2": "Scan the QR code below to bind your bot", - "yuanbaoQrScanHint": "Scan with Tencent YuanBao App", + "yuanbaoQrStep1": "Open YuanBao", + "yuanbaoQrStep2": "Scan to bind", + "yuanbaoQrStep3": "Confirm authorization", + "yuanbaoQrScanHint": "Confirm the binding in YuanBao after scanning", + "yuanbaoStarting": "Starting YuanBao scan-to-bind...", + "yuanbaoBindFailed": "YuanBao binding failed", "yuanbaoBindSuccess": "YuanBao bot bound and enabled", "yuanbaoCreateSuccess": "YuanBao bot bound successfully!", "dmPolicy": "DM Policy", @@ -1993,6 +1996,16 @@ "qrRetryBtn": "Retry", "wecomGenerateQr": "Generate WeCom scan code", "weixinGenerateQr": "Generate WeChat login QR code", + "wecomQrSuccess": "WeCom bound successfully", + "weixinQrSuccess": "WeChat bound successfully", + "weixinAccountId": "Account ID: {{id}}", + "fieldRequired": "{{label}} is required", + "fieldMustBeJsonObject": "{{label}} must be a JSON object", + "jsonMustBeObject": "Must be a JSON object", + "invalidJson": "Invalid JSON", + "rawConfigTooltip": "Channel-specific config — see harness-gateway docs", + "getCredentials": "Get credentials", + "channelSettingsNamed": "{{kind}} channel settings", "deleteConfirmTitle": "Delete channel \"{{name}}\"?" }, "tokenUsage": { diff --git a/dashboard/src/locales/zh.json b/dashboard/src/locales/zh.json index c3a18fe4..1430a135 100644 --- a/dashboard/src/locales/zh.json +++ b/dashboard/src/locales/zh.json @@ -1885,21 +1885,21 @@ "checkRequestFailed": "连接检测请求失败,请稍后重试", "checkFailedAutoDisabled": "凭据验证失败,频道已自动停用", "enableFailedCheckFailed": "启用失败:连接检测未通过", - "quickConfig": "扫码接入", - "manualConfig": "手动配置", + "quickConfig": "快捷配置(扫码)", + "manualConfig": "手动填写", "quickConfigStep1": "点击下方按钮前往企业微信开放平台", "quickConfigStep2": "按照指引完成机器人授权", "quickConfigStep3": "授权完成后回到此页面,频道将自动连接", "goToAuthorize": "前往授权", "qrLoading": "生成二维码中...", - "qrStep1": "打开企业微信 App", - "qrStep2": "扫描下方二维码完成授权", - "qrStep3": "扫码成功后自动获取凭据并接入", - "qrScanHint": "请使用企业微信扫描二维码", - "weixinQrStep1": "打开微信", - "weixinQrStep2": "扫描下方二维码完成授权", - "weixinQrStep3": "扫码成功后自动获取凭据并接入", - "weixinQrScanHint": "请使用微信扫描二维码", + "qrStep1": "打开企业微信", + "qrStep2": "扫码注册 AI 机器人", + "qrStep3": "确认绑定", + "qrScanHint": "扫码后自动跳转下一步", + "weixinQrStep1": "打开微信 App", + "weixinQrStep2": "扫码登录", + "weixinQrStep3": "手机确认", + "weixinQrScanHint": "使用微信扫码登录个人账号", "dingtalkQrLoading": "生成二维码中...", "dingtalkQrIntro1": "点击按钮生成钉钉应用授权二维码", "dingtalkQrIntro2": "使用同一组织账号登录的钉钉 App 扫码并确认", @@ -1965,9 +1965,12 @@ "feishuBotName": "机器人名称", "feishuManageBot": "前往飞书开放平台管理", "yuanbaoCreating": "生成二维码中...", - "yuanbaoQrStep1": "打开腾讯元宝 App", - "yuanbaoQrStep2": "扫描下方二维码完成机器人绑定", - "yuanbaoQrScanHint": "请使用腾讯元宝 App 扫描二维码", + "yuanbaoQrStep1": "打开元宝 App", + "yuanbaoQrStep2": "扫码绑定", + "yuanbaoQrStep3": "确认授权", + "yuanbaoQrScanHint": "扫码后在元宝 App 确认绑定", + "yuanbaoStarting": "启动元宝扫码绑定流程...", + "yuanbaoBindFailed": "元宝绑定失败", "yuanbaoBindSuccess": "元宝机器人已绑定并启用", "yuanbaoCreateSuccess": "元宝机器人绑定成功!", "dmPolicy": "私聊策略", @@ -1993,6 +1996,16 @@ "qrRetryBtn": "重试", "wecomGenerateQr": "生成扫码二维码", "weixinGenerateQr": "生成微信扫码二维码", + "wecomQrSuccess": "企业微信绑定成功", + "weixinQrSuccess": "微信绑定成功", + "weixinAccountId": "账号 ID: {{id}}", + "fieldRequired": "{{label}} 必填", + "fieldMustBeJsonObject": "{{label}} 必须是 JSON 对象", + "jsonMustBeObject": "必须是 JSON 对象", + "invalidJson": "非法 JSON", + "rawConfigTooltip": "渠道特定配置 — 详见 harness-gateway 文档", + "getCredentials": "前往获取凭据", + "channelSettingsNamed": "{{kind}} 频道设置", "deleteConfirmTitle": "删除频道「{{name}}」?" }, "tokenUsage": { diff --git a/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx b/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx index fbde6960..183ec743 100644 --- a/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx +++ b/dashboard/src/pages/Agent/Channels/components/ChannelDrawer.tsx @@ -160,6 +160,7 @@ interface ChannelDrawerProps { } function FormItemForField({ field }: { field: ChannelField }) { + const { t } = useTranslation(); const Input1 = field.type === "password" ? Input.Password @@ -167,7 +168,12 @@ function FormItemForField({ field }: { field: ChannelField }) { ? Input.TextArea : Input; const rules: Rule[] = field.required - ? [{ required: true, message: `${field.label} 必填` }] + ? [ + { + required: true, + message: t("channels.fieldRequired", { label: field.label }), + }, + ] : []; if (field.type === "json") { rules.push({ @@ -176,7 +182,9 @@ function FormItemForField({ field }: { field: ChannelField }) { try { normalizeChannelFieldValue(field.name, value); } catch { - throw new Error(`${field.label} 必须是 JSON 对象`); + throw new Error( + t("channels.fieldMustBeJsonObject", { label: field.label }), + ); } }, }); @@ -611,7 +619,10 @@ export function ChannelDrawer({ }); } else if (poll.status === "error") { stopPolling(); - setQrState({ phase: "error", reason: poll.reason ?? "扫码失败" }); + setQrState({ + phase: "error", + reason: poll.reason ?? t("channels.qrFailed"), + }); } } catch { // network error — keep polling @@ -653,7 +664,10 @@ export function ChannelDrawer({ }); } else if (poll.status === "error") { stopPolling(); - setQrState({ phase: "error", reason: poll.message ?? "扫码失败" }); + setQrState({ + phase: "error", + reason: poll.message ?? t("channels.qrFailed"), + }); } } catch { // keep polling @@ -787,7 +801,7 @@ export function ChannelDrawer({ stopPolling(); setQrState({ phase: "yuanbao_creating", - message: "启动元宝扫码绑定流程...", + message: t("channels.yuanbaoStarting"), }); try { await channelApi.yuanbaoBotCreatorStart(agentId, {}); @@ -830,7 +844,7 @@ export function ChannelDrawer({ ); setQrState({ phase: "error", - reason: errEvent?.message ?? "元宝绑定失败", + reason: errEvent?.message ?? t("channels.yuanbaoBindFailed"), }); } } catch { @@ -1261,7 +1275,11 @@ export function ChannelDrawer({ function renderWecomPanel() { const s = qrState; if (s.phase === "loading" || s.phase === "idle") - return renderQrLoading("打开企业微信", "扫码注册 AI 机器人", "确认绑定"); + return renderQrLoading( + t("channels.qrStep1"), + t("channels.qrStep2"), + t("channels.qrStep3"), + ); if (s.phase === "wecom_success") { const retrySave = () => submitChannel( @@ -1274,7 +1292,7 @@ export function ChannelDrawer({
@@ -1285,13 +1303,17 @@ export function ChannelDrawer({ if (s.phase === "wecom_ready") { return (
- {renderQrSteps("打开企业微信", "扫码注册 AI 机器人", "确认绑定")} + {renderQrSteps( + t("channels.qrStep1"), + t("channels.qrStep2"), + t("channels.qrStep3"), + )}
-

扫码后自动跳转下一步

+

{t("channels.qrScanHint")}

+
); } - return renderQrLoading("打开元宝 App", "扫码绑定", "确认授权"); + return renderQrLoading( + t("channels.yuanbaoQrStep1"), + t("channels.yuanbaoQrStep2"), + t("channels.yuanbaoQrStep3"), + ); } // ── Render ────────────────────────────────────────────────────────────── @@ -1639,7 +1683,7 @@ export function ChannelDrawer({ )} {isEdit - ? `${kindLabel} ${t("channels.channelSettings")}` + ? t("channels.channelSettingsNamed", { kind: kindLabel }) : t("channels.createChannel")}
@@ -1716,8 +1760,8 @@ export function ChannelDrawer({ value={configMode} onChange={(v) => setConfigMode(v as "quick" | "manual")} options={[ - { label: "快捷配置(扫码)", value: "quick" }, - { label: "手动填写", value: "manual" }, + { label: t("channels.quickConfig"), value: "quick" }, + { label: t("channels.manualConfig"), value: "manual" }, ]} /> )} @@ -1751,7 +1795,7 @@ export function ChannelDrawer({ rel="noopener noreferrer" className={styles.bannerLink} > - 前往获取凭据 + {t("channels.getCredentials")}
@@ -1784,7 +1828,7 @@ export function ChannelDrawer({ { @@ -1797,12 +1841,14 @@ export function ChannelDrawer({ Array.isArray(parsed) ) { return Promise.reject( - new Error("必须是 JSON 对象"), + new Error(t("channels.jsonMustBeObject")), ); } return Promise.resolve(); } catch { - return Promise.reject(new Error("非法 JSON")); + return Promise.reject( + new Error(t("channels.invalidJson")), + ); } }, }, From 9ac0dd962fc2904ef85fa758844c4baaad3d4ae8 Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Wed, 2 Sep 2026 16:22:46 +0800 Subject: [PATCH 16/58] fix(desktop): keep dock chrome clear of window controls Reserve a toolbar spacer so right-dock and popup actions no longer sit under frameless caption buttons, hide the PWA install entry inside the Wails shell, restyle the splash as a card with a progress bar, and add Windows settings-window height so DWM does not clip the bottom inset. Co-authored-by: Cursor --- CHANGELOG.md | 6 + dashboard/src/App.tsx | 53 +++---- .../ChatBrowserPanel.module.less | 5 + .../ChatDockPanelShell.test.tsx | 85 +++++++++++ .../BrowserWorkspace/ChatDockPanelShell.tsx | 31 +++- .../PwaInstallPrompt/index.test.tsx | 23 +++ .../src/components/PwaInstallPrompt/index.tsx | 5 +- dashboard/src/hooks/useDesktopChrome.ts | 27 +++- dashboard/src/styles/layout.css | 21 +++ dashboard/src/utils/desktopChrome.test.ts | 43 +++++- dashboard/src/utils/desktopChrome.ts | 30 +++- desktop/src/assets/index.html | 133 ++++++++++-------- desktop/src/main.go | 2 +- desktop/src/settings_window.go | 12 ++ desktop/src/window_chrome_test.go | 67 +++++++++ 15 files changed, 454 insertions(+), 89 deletions(-) create mode 100644 dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.test.tsx create mode 100644 dashboard/src/components/PwaInstallPrompt/index.test.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 75919659..771ca7e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ ## [Unreleased] +### 修复 + +- 聊天右侧停靠/弹窗工具栏避开无边框窗口按钮,避免与红绿灯重叠 +- 桌面启动页改为白底卡片和底部进度条;Windows 设置窗加高,避免底边距被裁掉 +- 桌面壳内隐藏「安装为桌面应用」,避免在已原生窗口里再提示 PWA 安装 + ## [0.9.31] - 2026-09-01 ### 新增 diff --git a/dashboard/src/App.tsx b/dashboard/src/App.tsx index 4e353bc9..2b46d650 100644 --- a/dashboard/src/App.tsx +++ b/dashboard/src/App.tsx @@ -4,7 +4,10 @@ import zhCN from "antd/locale/zh_CN"; import enUS from "antd/locale/en_US"; import { useEffect } from "react"; import DesktopWindowControls from "./components/DesktopWindowControls"; -import { useDesktopChrome } from "./hooks/useDesktopChrome"; +import { + DesktopChromeProvider, + useDesktopChrome, +} from "./hooks/useDesktopChrome"; import { BrowserRouter, Routes, Route } from "react-router-dom"; import { useTranslation } from "react-i18next"; import MainLayout from "./layouts/MainLayout"; @@ -113,29 +116,31 @@ function ThemedApp() { return ( - {desktopChrome ? ( - - ) : null} - - } /> - } /> - } /> - } /> - - - - - - - - - - } - /> - + + {desktopChrome ? ( + + ) : null} + + } /> + } /> + } /> + } /> + + + + + + + + + + } + /> + + ); diff --git a/dashboard/src/components/BrowserWorkspace/ChatBrowserPanel.module.less b/dashboard/src/components/BrowserWorkspace/ChatBrowserPanel.module.less index 2b96a808..2a7c3fdd 100644 --- a/dashboard/src/components/BrowserWorkspace/ChatBrowserPanel.module.less +++ b/dashboard/src/components/BrowserWorkspace/ChatBrowserPanel.module.less @@ -248,6 +248,11 @@ min-width: 0; } +.windowControlsSpacer { + flex-shrink: 0; + height: 1px; +} + .toolbarIconBtn { display: inline-flex; align-items: center; diff --git a/dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.test.tsx b/dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.test.tsx new file mode 100644 index 00000000..e232daf5 --- /dev/null +++ b/dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.test.tsx @@ -0,0 +1,85 @@ +import { render } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; +import { DesktopChromeProvider } from "../../hooks/useDesktopChrome"; +import { + DOCK_WINDOW_CONTROLS_PAD_PX, + WINDOW_CONTROLS_INSET, + WINDOW_CONTROLS_SPACER_ATTR, + resolveDesktopChromeStyle, +} from "../../utils/desktopChrome"; +import ChatDockPanelShell from "./ChatDockPanelShell"; + +const baseProps = { + onModeChange: vi.fn(), + onClose: vi.fn(), + children:
dock-body
, +}; + +function renderShell( + mode: "right" | "popup" | "bottom", + chrome: "mac" | "windows" | null, +) { + return render( + + + , + ); +} + +function expectedDockSpacer(chrome: "mac" | "windows"): string { + return `${WINDOW_CONTROLS_INSET[chrome] - DOCK_WINDOW_CONTROLS_PAD_PX}px`; +} + +function spacerWidth(container: HTMLElement): string | undefined { + const el = container.querySelector( + `[${WINDOW_CONTROLS_SPACER_ATTR}]`, + ) as HTMLElement | null; + return el?.style.width; +} + +describe("ChatDockPanelShell chrome inset", () => { + it("inserts a pixel spacer so right-dock and popup toolbars clear window controls", () => { + const { container, rerender } = renderShell("right", "mac"); + expect(spacerWidth(container)).toBe(expectedDockSpacer("mac")); + + rerender( + + + , + ); + expect(spacerWidth(container)).toBe(expectedDockSpacer("windows")); + + rerender( + + + , + ); + expect( + container.querySelector(`[${WINDOW_CONTROLS_SPACER_ATTR}]`), + ).toBeNull(); + }); + + it("does not reserve window-control space outside the desktop shell", () => { + const { container } = renderShell("right", null); + expect( + container.querySelector(`[${WINDOW_CONTROLS_SPACER_ATTR}]`), + ).toBeNull(); + }); + + it("still inserts the spacer from the Wails bridge when chrome context is missing", () => { + Object.defineProperty(window, "_wails", { + configurable: true, + value: { invoke: () => undefined }, + }); + const { container } = render( + , + ); + expect(spacerWidth(container)).toBe( + `${ + WINDOW_CONTROLS_INSET[resolveDesktopChromeStyle()] - + DOCK_WINDOW_CONTROLS_PAD_PX + }px`, + ); + delete (window as Window & { _wails?: unknown })._wails; + }); +}); diff --git a/dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.tsx b/dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.tsx index efd06497..faf02891 100644 --- a/dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.tsx +++ b/dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.tsx @@ -20,6 +20,14 @@ import { } from "lucide-react"; import { beginPointerDragSession } from "../../hooks/usePointerDragSession"; import type { PanelMode } from "./index"; +import { useDesktopChromeStyle } from "../../hooks/useDesktopChrome"; +import { + DOCK_WINDOW_CONTROLS_PAD_PX, + isDesktopShell, + resolveDesktopChromeStyle, + WINDOW_CONTROLS_SPACER_ATTR, + windowControlsEndSpacerPx, +} from "../../utils/desktopChrome"; import styles from "./ChatBrowserPanel.module.less"; interface ChatDockPanelShellProps { @@ -112,6 +120,10 @@ const ChatDockPanelShell: React.FC = ({ children, }) => { const { t } = useTranslation(); + const chromeFromContext = useDesktopChromeStyle(); + const desktopChrome = + chromeFromContext ?? + (isDesktopShell() ? resolveDesktopChromeStyle() : null); const panelRef = useRef(null); const prevModeRef = useRef(mode); const [popupPos, setPopupPos] = useState<{ x: number; y: number } | null>( @@ -370,6 +382,15 @@ const ChatDockPanelShell: React.FC = ({ [mode, onModeChange, style], ); + const windowControlsSpacerPx = windowControlsEndSpacerPx( + desktopChrome, + mode === "right" || mode === "popup", + DOCK_WINDOW_CONTROLS_PAD_PX, + ); + const toolbarStyle: React.CSSProperties | undefined = popupFullscreen + ? { cursor: "default" } + : undefined; + const togglePopupFullscreen = useCallback(() => { setPopupFullscreen((v) => !v); }, []); @@ -426,7 +447,7 @@ const ChatDockPanelShell: React.FC = ({
{title}
@@ -499,6 +520,14 @@ const ChatDockPanelShell: React.FC = ({
+ {windowControlsSpacerPx > 0 ? ( + + ) : null}
{children} {mode === "popup" && !popupFullscreen && ( diff --git a/dashboard/src/components/PwaInstallPrompt/index.test.tsx b/dashboard/src/components/PwaInstallPrompt/index.test.tsx new file mode 100644 index 00000000..23c8d005 --- /dev/null +++ b/dashboard/src/components/PwaInstallPrompt/index.test.tsx @@ -0,0 +1,23 @@ +import { render, screen } from "@testing-library/react"; +import { afterEach, describe, expect, it } from "vitest"; +import PwaInstallPrompt from "./index"; + +describe("PwaInstallPrompt in desktop shell", () => { + afterEach(() => { + delete (window as Window & { _wails?: unknown })._wails; + }); + + it("hides the install button when the Wails bridge is present", () => { + Object.defineProperty(window, "_wails", { + configurable: true, + value: { invoke: () => undefined }, + }); + render(); + expect(screen.queryByLabelText("安装应用")).toBeNull(); + }); + + it("still offers install in a regular browser", () => { + render(); + expect(screen.getByLabelText("安装应用")).toBeInTheDocument(); + }); +}); diff --git a/dashboard/src/components/PwaInstallPrompt/index.tsx b/dashboard/src/components/PwaInstallPrompt/index.tsx index 6daaf522..63eeedb1 100644 --- a/dashboard/src/components/PwaInstallPrompt/index.tsx +++ b/dashboard/src/components/PwaInstallPrompt/index.tsx @@ -8,6 +8,7 @@ import { triggerInstall, waitForInstallPrompt, } from "../../pwa-prompt"; +import { isDesktopShell } from "../../utils/desktopChrome"; import styles from "./index.module.less"; const DISMISSED_KEY = "pwa:install-dismissed"; @@ -165,7 +166,7 @@ export default function PwaInstallPrompt({ () => !!localStorage.getItem(DISMISSED_KEY), ); - if (isStandalone() || installState.installed) return null; + if (isStandalone() || isDesktopShell() || installState.installed) return null; // Chat right float: always expose the install entry until the app is // installed (ignore Header dismiss + beforeinstallprompt lag). Dev has no @@ -262,7 +263,7 @@ export function PwaAutoPrompt() { const [show, setShow] = useState(false); useEffect(() => { - if (!isIosDevice() || isStandalone()) return; + if (!isIosDevice() || isStandalone() || isDesktopShell()) return; if ( localStorage.getItem(DISMISSED_KEY) || localStorage.getItem(IOS_SHOWN_KEY) diff --git a/dashboard/src/hooks/useDesktopChrome.ts b/dashboard/src/hooks/useDesktopChrome.ts index c71b572f..6b3f0e8b 100644 --- a/dashboard/src/hooks/useDesktopChrome.ts +++ b/dashboard/src/hooks/useDesktopChrome.ts @@ -1,4 +1,11 @@ -import { useEffect, useState } from "react"; +import { + createContext, + createElement, + useContext, + useEffect, + useState, + type ReactNode, +} from "react"; import { applyDesktopChrome, installDesktopWindowDrag, @@ -7,6 +14,8 @@ import { type DesktopChromeStyle, } from "../utils/desktopChrome"; +const DesktopChromeContext = createContext(null); + /** Activate frameless window chrome after the Wails bridge appears. */ export function useDesktopChrome(): DesktopChromeStyle | null { const [style, setStyle] = useState(null); @@ -24,7 +33,6 @@ export function useDesktopChrome(): DesktopChromeStyle | null { if (tryApply()) { return () => { cancelled = true; - applyDesktopChrome(null); }; } const timer = window.setInterval(() => { @@ -35,9 +43,22 @@ export function useDesktopChrome(): DesktopChromeStyle | null { cancelled = true; window.clearInterval(timer); window.clearTimeout(stop); - applyDesktopChrome(null); }; }, []); return style; } + +export function DesktopChromeProvider({ + value, + children, +}: { + value: DesktopChromeStyle | null; + children: ReactNode; +}) { + return createElement(DesktopChromeContext.Provider, { value }, children); +} + +export function useDesktopChromeStyle(): DesktopChromeStyle | null { + return useContext(DesktopChromeContext); +} diff --git a/dashboard/src/styles/layout.css b/dashboard/src/styles/layout.css index e144e89d..dcb3b78a 100644 --- a/dashboard/src/styles/layout.css +++ b/dashboard/src/styles/layout.css @@ -33,6 +33,27 @@ html[data-octop-desktop-chrome] [data-octop-no-drag] { --wails-draggable: no-drag; } +/* Right-edge overlays sit under the frameless caption buttons unless inset. */ +html[data-octop-desktop-chrome] [data-octop-chrome-end-pad] { + padding-inline-end: max( + 12px, + var(--window-controls-inset-end, 0px) + ) !important; +} + +html[data-octop-desktop-chrome] .octop-drawer-right .octop-drawer-header, +html[data-octop-desktop-chrome] .ant-drawer-right .ant-drawer-header { + padding-inline-end: max( + 24px, + var(--window-controls-inset-end, 0px) + ) !important; +} + +html[data-octop-desktop-chrome] .octop-drawer-right .octop-drawer-close, +html[data-octop-desktop-chrome] .ant-drawer-right .ant-drawer-close { + inset-inline-end: var(--window-controls-inset-end, 0px) !important; +} + #root { height: 100%; overflow: hidden; diff --git a/dashboard/src/utils/desktopChrome.test.ts b/dashboard/src/utils/desktopChrome.test.ts index 69bafef2..0603e191 100644 --- a/dashboard/src/utils/desktopChrome.test.ts +++ b/dashboard/src/utils/desktopChrome.test.ts @@ -1,6 +1,10 @@ +import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; import { applyDesktopChrome, + CHROME_END_PAD_ATTR, + chromeEndPadValue, emitDesktopWindowAction, installDesktopWindowDrag, isDesktopShell, @@ -8,7 +12,10 @@ import { shouldArmDesktopDrag, titleRowEndPadding, WINDOW_CONTROLS_INSET, + WINDOW_CONTROLS_SPACER_ATTR, + windowControlsEndSpacerPx, DESKTOP_DRAG_REGION_CLASS, + DOCK_WINDOW_CONTROLS_PAD_PX, } from "./desktopChrome"; describe("desktopChrome", () => { @@ -49,13 +56,47 @@ describe("desktopChrome", () => { ).toBe("windows"); }); - it("reserves a trailing inset only for the title row", () => { + it("reserves a trailing inset for the title row and right-edge overlays", () => { expect(WINDOW_CONTROLS_INSET.mac).toBeGreaterThan(0); expect(WINDOW_CONTROLS_INSET.windows).toBeGreaterThan( WINDOW_CONTROLS_INSET.mac, ); expect(titleRowEndPadding(32)).toContain("--window-controls-inset-end"); expect(titleRowEndPadding(32)).toContain("32px"); + expect(CHROME_END_PAD_ATTR).toBe("data-octop-chrome-end-pad"); + expect(WINDOW_CONTROLS_SPACER_ATTR).toBe( + "data-octop-window-controls-spacer", + ); + expect(chromeEndPadValue(12)).toContain("--window-controls-inset-end"); + expect(chromeEndPadValue(12)).toContain("12px"); + expect(windowControlsEndSpacerPx("mac", true)).toBe( + WINDOW_CONTROLS_INSET.mac, + ); + expect(windowControlsEndSpacerPx("windows", true)).toBe( + WINDOW_CONTROLS_INSET.windows, + ); + expect(windowControlsEndSpacerPx("mac", true, 12)).toBe( + WINDOW_CONTROLS_INSET.mac - 12, + ); + expect( + windowControlsEndSpacerPx("mac", true, DOCK_WINDOW_CONTROLS_PAD_PX), + ).toBe(WINDOW_CONTROLS_INSET.mac - DOCK_WINDOW_CONTROLS_PAD_PX); + expect(windowControlsEndSpacerPx("windows", true, 12)).toBe( + WINDOW_CONTROLS_INSET.windows - 12, + ); + expect(windowControlsEndSpacerPx("mac", false)).toBe(0); + expect(windowControlsEndSpacerPx(null, true)).toBe(0); + }); + + it("pads right-edge overlays away from frameless window controls", () => { + const css = readFileSync( + resolve(__dirname, "../styles/layout.css"), + "utf8", + ); + expect(css).toContain("[data-octop-chrome-end-pad]"); + expect(css).not.toContain("[data-dock-panel]"); + expect(css).toContain(".octop-drawer-right"); + expect(css).toMatch(/padding-inline-end:\s*max\(/); }); it("exports a stable class for Wails title-bar dragging", () => { diff --git a/dashboard/src/utils/desktopChrome.ts b/dashboard/src/utils/desktopChrome.ts index d1333800..e4611504 100644 --- a/dashboard/src/utils/desktopChrome.ts +++ b/dashboard/src/utils/desktopChrome.ts @@ -12,6 +12,34 @@ export const WINDOW_CONTROLS_INSET: Record = { windows: 138, }; +/** Right-edge overlay chrome (dock toolbar, etc.) to keep clear of caption buttons. */ +export const CHROME_END_PAD_ATTR = "data-octop-chrome-end-pad"; +export const WINDOW_CONTROLS_SPACER_ATTR = "data-octop-window-controls-spacer"; + +/** + * Dock toolbar already has 12px end padding. Subtract that plus 6px so the + * ⋮ / close group sits a few pixels closer to the caption buttons than the + * personalization title row. + */ +export const DOCK_WINDOW_CONTROLS_PAD_PX = 18; + +const INSET_VAR = "--window-controls-inset-end"; + +/** Inline padding so CSS-module `padding` shorthands cannot clobber the inset. */ +export function chromeEndPadValue(minPx = 12): string { + return `max(${minPx}px, var(${INSET_VAR}, 0px))`; +} + +/** Pixel width of a flex spacer that clears overlay caption buttons. */ +export function windowControlsEndSpacerPx( + chrome: DesktopChromeStyle | null, + panelTouchesWindowEnd: boolean, + existingEndPadPx = 0, +): number { + if (!chrome || !panelTouchesWindowEnd) return 0; + return Math.max(0, WINDOW_CONTROLS_INSET[chrome] - existingEndPadPx); +} + /** Marks shell chrome that Wails should treat as a window-drag region. */ export const DESKTOP_DRAG_REGION_CLASS = "octop-desktop-drag"; export const DESKTOP_NO_DRAG_CLASS = "octop-desktop-no-drag"; @@ -20,8 +48,6 @@ export const DESKTOP_TITLEBAR_DRAG_HEIGHT = 32; const NO_DRAG_SELECTOR = 'button, a, input, textarea, select, [role="button"], [role="menuitem"], [data-octop-no-drag], .octop-desktop-no-drag'; -const INSET_VAR = "--window-controls-inset-end"; - export function isDesktopShell( win: Pick = window as DesktopWindow, ): boolean { diff --git a/desktop/src/assets/index.html b/desktop/src/assets/index.html index 455b2ab2..daf9d50d 100644 --- a/desktop/src/assets/index.html +++ b/desktop/src/assets/index.html @@ -16,6 +16,10 @@ ); if (new URLSearchParams(location.search).get("settings") === "1") { document.documentElement.dataset.mode = "settings"; + document.documentElement.style.setProperty( + "--window-controls-inset-end", + "36px", + ); } @@ -87,6 +91,9 @@ } html[data-mode="settings"] .wrap { max-width: none; + height: 100%; + display: flex; + flex-direction: column; padding: 44px 20px 28px; } html[data-mode="settings"] #title { @@ -97,6 +104,7 @@ } html[data-mode="settings"] .actions { margin-top: 14px; + flex-shrink: 0; } .ctrl-mac { gap: 8px; @@ -306,28 +314,29 @@ } .loading { min-height: 100vh; - display: grid; - place-content: center; - justify-items: center; - text-align: center; - background: - radial-gradient( - 1200px 420px at 50% 110%, - var(--brand-soft) 0%, - transparent 62% - ), - var(--bg-layout); + display: flex; + align-items: center; + justify-content: center; + background: var(--bg-layout); padding: 56px 24px 40px; + box-sizing: border-box; } - .loading-stage { + .loading-card { display: flex; flex-direction: column; align-items: center; - width: min(360px, 100%); + gap: 14px; + width: min(100%, 420px); + padding: 36px 32px 32px; + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 14px; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06); + text-align: center; } .loading img { - width: 148px; - aspect-ratio: 352 / 320; + width: 120px; + aspect-ratio: 1; height: auto; object-fit: contain; background: transparent; @@ -342,54 +351,64 @@ transform: scale(0.94); } .loading-brand { - margin: 10px 0 0; - font-size: 22px; - font-weight: 650; - letter-spacing: -0.03em; + margin: 0; + font-size: 17px; + font-weight: 600; + line-height: 1.4; + letter-spacing: -0.02em; color: var(--text-primary); } - .spinner { - width: 18px; - height: 18px; - margin-top: 18px; - border: 2px solid var(--brand-soft); - border-top-color: var(--brand); - border-radius: 50%; - animation: spin 0.8s linear infinite; + .loading-hint { + margin: 0; + font-size: 13px; + line-height: 1.6; + color: var(--text-tertiary); + } + .loading.is-error .loading-hint { + display: none; + } + .loading-footer { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + width: 100%; + margin-top: 4px; + } + .loading-bar { + width: 100%; + height: 4px; + overflow: hidden; + border-radius: 999px; + background: var(--brand-soft); + } + .loading-bar-fill { + display: block; + width: 36%; + height: 100%; + border-radius: 999px; + background: var(--brand); + animation: loading-slide 1.2s ease-in-out infinite; } .loading-status { - margin: 16px 0 0; - max-width: 28em; - padding: 10px 14px; - border-radius: 10px; - background: var(--bg-primary); - border: 1px solid var(--border); - box-shadow: var(--shadow); + margin: 0; + width: 100%; color: var(--text-secondary); font-size: 13px; line-height: 1.55; } - .loading.is-error .spinner { + .loading.is-error .loading-bar { display: none; } .loading.is-error .loading-status { - border-color: #fecaca; - background: #fef2f2; color: #991b1b; } - .loading-hint { - max-width: 280px; - margin: 10px 0 0; - color: var(--text-tertiary); - font-size: 12px; - line-height: 1.5; - } - .loading.is-error .loading-hint { - display: none; - } - @keyframes spin { - to { - transform: rotate(360deg); + @keyframes loading-slide { + 0% { + transform: translateX(-120%); + } + 100% { + transform: translateX(320%); } } .hidden { @@ -465,7 +484,7 @@
-
+

Octop

- -

正在启动,请稍候…

正在检查运行环境,可能需要几分钟。

+
@@ -543,7 +566,7 @@

Octop 设置

const copy = { zh: { - statusWait: "正在启动…", + statusWait: "正在启动,请稍候…", loadingHint: "正在检查运行环境,可能需要几分钟。", title: "Octop 设置", subtitle: "桌面端偏好", @@ -563,7 +586,7 @@

Octop 设置

winClose: "关闭", }, en: { - statusWait: "Starting…", + statusWait: "Starting, please wait…", loadingHint: "Checking the runtime. This may take a few minutes.", title: "Octop Settings", subtitle: "Desktop preferences", diff --git a/desktop/src/main.go b/desktop/src/main.go index 1e33c5c0..62056fb0 100644 --- a/desktop/src/main.go +++ b/desktop/src/main.go @@ -344,7 +344,7 @@ func main() { settingsWin := app.Window.NewWithOptions(application.WebviewWindowOptions{ Title: "Octop 设置", Width: settingsWindowWidth, - Height: settingsWindowHeight, + Height: settingsWindowOuterHeight(), URL: "/?settings=1", Hidden: true, Frameless: true, diff --git a/desktop/src/settings_window.go b/desktop/src/settings_window.go index cbe23488..a216eb62 100644 --- a/desktop/src/settings_window.go +++ b/desktop/src/settings_window.go @@ -1,6 +1,18 @@ package main +import "runtime" + const ( settingsWindowWidth = 400 settingsWindowHeight = 460 + // Windows DWM frameless decorations shrink the WebView2 client area, which + // clips the 28px bottom gap used on macOS. + settingsWindowWindowsExtraHeight = 24 ) + +func settingsWindowOuterHeight() int { + if runtime.GOOS == "windows" { + return settingsWindowHeight + settingsWindowWindowsExtraHeight + } + return settingsWindowHeight +} diff --git a/desktop/src/window_chrome_test.go b/desktop/src/window_chrome_test.go index 843fbc98..eb7eaa68 100644 --- a/desktop/src/window_chrome_test.go +++ b/desktop/src/window_chrome_test.go @@ -55,6 +55,57 @@ func TestSplashHTMLHasFramelessWindowControls(t *testing.T) { } } +func TestSplashLoadingCardWrapsProgressAndStatus(t *testing.T) { + html, err := os.ReadFile("assets/index.html") + if err != nil { + t.Fatal(err) + } + body := string(html) + for _, needle := range []string{ + `class="loading-card"`, + `class="loading-footer"`, + `class="loading-bar"`, + `id="status"`, + `.loading-card {`, + `border-radius: 14px`, + `box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06)`, + } { + if !strings.Contains(body, needle) { + t.Fatalf("splash HTML missing %q", needle) + } + } + cardAt := strings.Index(body, `class="loading-card"`) + footerAt := strings.Index(body, `class="loading-footer"`) + barAt := strings.Index(body, `class="loading-bar"`) + statusAt := strings.Index(body, `id="status"`) + if cardAt < 0 || footerAt < cardAt || barAt < footerAt || statusAt < barAt { + t.Fatal("progress bar and status must sit at the bottom of the loading card") + } + if strings.Contains(body, `class="spinner"`) || strings.Contains(body, `.spinner {`) { + t.Fatal("splash should use a progress bar, not a circular spinner") + } + statusCSS := cssRule(body, ".loading-status") + if statusCSS == "" { + t.Fatal("missing .loading-status rule") + } + if strings.Contains(statusCSS, "border:") { + t.Fatal("status text must not have its own bordered box") + } +} + +func cssRule(html, selector string) string { + start := strings.Index(html, selector+" {") + if start < 0 { + return "" + } + rest := html[start:] + end := strings.Index(rest, "}") + if end < 0 { + return "" + } + return rest[:end+1] +} + func TestSettingsHTMLFitsWithoutScrollbar(t *testing.T) { html, err := os.ReadFile("assets/index.html") if err != nil { @@ -75,6 +126,16 @@ func TestSettingsHTMLFitsWithoutScrollbar(t *testing.T) { if !strings.Contains(body, `padding: 44px 20px 28px`) { t.Fatal("settings wrap must keep a 28px bottom gap, matching the visual side inset") } + wrapRule := cssRule(body, `html[data-mode="settings"] .wrap`) + if wrapRule == "" { + t.Fatal("missing settings wrap rule") + } + if !strings.Contains(wrapRule, "height: 100%") { + t.Fatal("settings wrap must fill the window so the 28px bottom gap is not clipped") + } + if !strings.Contains(wrapRule, "display: flex") { + t.Fatal("settings wrap must be a column so action buttons sit above the bottom padding") + } if !strings.Contains(body, `.glyph`) || !strings.Contains(body, `translateY(-0.5px)`) { t.Fatal("traffic-light glyphs must be optically centered in the lights") } @@ -97,4 +158,10 @@ func TestSettingsWindowSizeFitsContent(t *testing.T) { if settingsWindowHeight < 456 { t.Fatalf("settings height %d clips the bottom padding", settingsWindowHeight) } + if settingsWindowWindowsExtraHeight < 16 { + t.Fatal("Windows settings window needs extra height so DWM frame does not eat the 28px bottom gap") + } + if settingsWindowOuterHeight() < settingsWindowHeight { + t.Fatal("outer height must be at least the content height") + } } From 31215950f978299fc731d2f2f0babeca9494dbab Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Wed, 2 Sep 2026 09:29:26 +0000 Subject: [PATCH 17/58] fix(mobile): write daemon.json and restart Docker via sudo when not root Passwordless sudo can install the engine, but /etc/docker/daemon.json and systemctl restart still need elevation; otherwise the Tencent mirror step silently skips. Co-authored-by: Cursor --- CHANGELOG.md | 1 + src/octop/infra/mobile/docker_install.py | 66 ++++++++++++++++++------ tests/unit/mobile/test_docker_install.py | 48 +++++++++++++++++ 3 files changed, 100 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 972d3b7b..2bbd840a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - 桌面启动页改为白底卡片和底部进度条;Windows 设置窗加高,避免底边距被裁掉 - 桌面壳内隐藏「安装为桌面应用」,避免在已原生窗口里再提示 PWA 安装 - 日志按大小+按日轮转,并采用 logrotate 风格的 `compress` + `delaycompress`(最新一份轮转文件暂不 gzip,下一轮再压;用 Python 标准库,Windows 可用) +- 远程手机自动安装 Docker 后,非 root 时用 `sudo -n` 写 `daemon.json` 并重启 dockerd ## [0.9.31] - 2026-09-01 diff --git a/src/octop/infra/mobile/docker_install.py b/src/octop/infra/mobile/docker_install.py index 55d24ab6..f4ceedfc 100644 --- a/src/octop/infra/mobile/docker_install.py +++ b/src/octop/infra/mobile/docker_install.py @@ -203,12 +203,52 @@ async def _probe_tencent_mirror() -> bool: return True +def _privileged_cmd(*cmd: str) -> list[str]: + """Prefix ``sudo -n`` when we are not already root (passwordless sudo).""" + if geteuid() == 0: + return list(cmd) + return ["sudo", "-n", *cmd] + + +def _run_privileged(*cmd: str, input_bytes: bytes | None = None) -> bool: + """Run ``cmd``, prefixing ``sudo -n`` when the process is not root.""" + argv = list(cmd) if geteuid() == 0 else _privileged_cmd(*cmd) + try: + proc = subprocess.run( + argv, + input=input_bytes, + capture_output=True, + timeout=15, + check=False, + ) + except (OSError, subprocess.TimeoutExpired): + return False + return proc.returncode == 0 + + +def _copy_privileged(src: Path, dst: Path) -> bool: + try: + shutil.copy2(src, dst) + return True + except OSError: + return _run_privileged("cp", "-a", str(src), str(dst)) + + +def _write_text_privileged(path: Path, text: str) -> bool: + try: + path.write_text(text, encoding="utf-8") + return True + except OSError: + return _run_privileged("tee", str(path), input_bytes=text.encode("utf-8")) + + def _merge_registry_mirror(daemon_json: Path, mirror: str) -> bool: """Add ``registry-mirrors`` to daemon.json unless already configured. Backs up the previous file as ``daemon.json.backup``. Returns True when the file was written; False when left untouched (already configured, or the - existing file is unreadable/corrupt). + existing file is unreadable/corrupt). Writes via ``sudo -n`` when the + process is not root (same gate as the install itself). """ config: dict[str, object] = {} if daemon_json.exists(): @@ -223,20 +263,15 @@ def _merge_registry_mirror(daemon_json: Path, mirror: str) -> bool: return False if not daemon_json.parent.exists(): return False - if daemon_json.exists(): - try: - shutil.copy2(daemon_json, daemon_json.parent / f"{daemon_json.name}.backup") - except OSError: - return False - config["registry-mirrors"] = [mirror] - try: - daemon_json.write_text( - json.dumps(config, indent=2, ensure_ascii=False) + "\n", - encoding="utf-8", - ) - except OSError: + if daemon_json.exists() and not _copy_privileged( + daemon_json, daemon_json.parent / f"{daemon_json.name}.backup" + ): return False - return True + config["registry-mirrors"] = [mirror] + return _write_text_privileged( + daemon_json, + json.dumps(config, indent=2, ensure_ascii=False) + "\n", + ) async def _restart_docker_daemon() -> bool: @@ -246,9 +281,10 @@ async def _restart_docker_daemon() -> bool: ): if shutil.which(cmd[0]) is None: continue + argv = _privileged_cmd(*cmd) try: proc = await asyncio.create_subprocess_exec( - *cmd, + *argv, stdout=asyncio.subprocess.DEVNULL, stderr=asyncio.subprocess.DEVNULL, ) diff --git a/tests/unit/mobile/test_docker_install.py b/tests/unit/mobile/test_docker_install.py index 7300a334..fbf7b653 100644 --- a/tests/unit/mobile/test_docker_install.py +++ b/tests/unit/mobile/test_docker_install.py @@ -111,6 +111,54 @@ def test_merge_registry_mirror_skips_corrupt_file(tmp_path: Path) -> None: assert daemon.read_text(encoding="utf-8") == "{not json" # left untouched +def test_privileged_cmd_prefixes_sudo_when_not_root(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(docker_install, "geteuid", lambda: 1000) + assert docker_install._privileged_cmd("systemctl", "restart", "docker") == [ + "sudo", + "-n", + "systemctl", + "restart", + "docker", + ] + monkeypatch.setattr(docker_install, "geteuid", lambda: 0) + assert docker_install._privileged_cmd("systemctl", "restart", "docker") == [ + "systemctl", + "restart", + "docker", + ] + + +def test_write_text_privileged_falls_back_to_sudo_tee( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + target = tmp_path / "daemon.json" + monkeypatch.setattr(docker_install, "geteuid", lambda: 1000) + + orig_write = Path.write_text + + def boom(_self: Path, *_args: object, **_kwargs: object) -> None: + raise PermissionError("denied") + + calls: list[list[str]] = [] + + def fake_run(argv: list[str], **kwargs: object) -> object: + calls.append(list(argv)) + raw = kwargs.get("input") + assert isinstance(raw, bytes) + orig_write(target, raw.decode("utf-8"), encoding="utf-8") + + class _Proc: + returncode = 0 + + return _Proc() + + monkeypatch.setattr(Path, "write_text", boom) + monkeypatch.setattr(docker_install.subprocess, "run", fake_run) + assert docker_install._write_text_privileged(target, '{"ok": true}\n') is True + assert calls[0] == ["sudo", "-n", "tee", str(target)] + assert json.loads(target.read_text(encoding="utf-8")) == {"ok": True} + + @pytest.mark.asyncio async def test_probe_tencent_mirror_unreachable() -> None: # 127.0.0.1:1 → connection refused → probe returns False quickly. From 903a958809a71843524bb25bccad1cfaa5b974ed Mon Sep 17 00:00:00 2001 From: liukewia Date: Wed, 2 Sep 2026 17:58:06 +0800 Subject: [PATCH 18/58] Update README files to reflect changes in initial admin credentials and password handling. The default password is no longer hardcoded; first-run credentials are now written to `~/octop-login.txt`. Updated password policy to clarify requirements and options for setting a custom initial password using `OCTOP_DEFAULT_PASSWORD`. --- README.md | 12 ++++++------ README_CN.md | 11 ++++------- docker/README.md | 6 +++--- docker/README_CN.md | 6 +++--- fnos/README.md | 11 ----------- 5 files changed, 16 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 3b5c2b85..9e3821c4 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,8 @@ This roadmap may shift as the community grows; treat it as indicative only. Octop can be installed on FnOS (飞牛 NAS) devices via the App Center as a `.fpk` package, either as a Docker-backed app or as a native (non-Docker) app. See [`fnos/README.md`](fnos/README.md) for the full packaging guide, the FPK build helper (`scripts/build-fpk.sh`), and the CI pipeline template (`.github/workflows/fnos-build-fpk.yml`). -Initial admin credentials: `admin` / `Octop123` (change after first login). For non-root FnOS installs, the WeCom/Feishu connector CLIs require the fix in [PR #406](https://github.com/TencentCloud/Octop/pull/406) (user-level npm fallback). +For non-root FnOS installs, the WeCom/Feishu connector CLIs require the fix in [PR #406](https://github.com/TencentCloud/Octop/pull/406) (user-level npm fallback). + ## 🚀 Quick Start ### Prerequisites @@ -225,7 +226,7 @@ octop run --host 0.0.0.0 --port 8088 octop service start ``` -Open **http://127.0.0.1:8088**. With Docker first-run defaults, sign in as `admin` / `Octop123` and change the password immediately. Interactive `octop init` / the setup wizard asks you to choose a password (≥8 characters, letters and digits). +Open **http://127.0.0.1:8088**. Interactive `octop init` / the setup wizard asks you to choose a password (≥8 characters, letters and digits). Docker first-run credentials are written to `~/octop-login.txt`. ### Docker (recommended for production) @@ -239,18 +240,17 @@ docker run -d \ -p 8088:8088 \ -v octop-data:/data/.octop \ -e HOME=/data \ - -e OCTOP_DEFAULT_PASSWORD=Octop123 \ octop:latest ``` -Open `http://localhost:8088` — default credentials are `admin` / `Octop123` (change immediately). Credentials are also written to `/data/.octop/credential.txt` on first boot. +Open `http://localhost:8088`. First-boot credentials are written to `~/octop-login.txt` (`/data/octop-login.txt` in the container); set `OCTOP_DEFAULT_PASSWORD` if you want to choose the initial password yourself. -> **Password policy:** at least 8 characters with letters and digits. A future release may replace the fixed Docker default with a randomly generated password written only to `credential.txt`. +> **Password policy:** at least 8 characters with letters and digits. | Variable | Default | Description | |----------|---------|-------------| | `OCTOP_PORT` | `8088` | HTTP listen port | -| `OCTOP_DEFAULT_PASSWORD` | `Octop123` | First-run admin password (Docker bootstrap) | +| `OCTOP_DEFAULT_PASSWORD` | — | Optional first-run admin password (Docker bootstrap) | | `OCTOP_ADMIN_USERNAME` | `admin` | First-run admin username | | `OCTOP_DATA` | `~/.octop` | Host data directory (compose bind mount) | diff --git a/README_CN.md b/README_CN.md index 9fc11fa3..59bb0525 100644 --- a/README_CN.md +++ b/README_CN.md @@ -222,9 +222,7 @@ octop run --host 0.0.0.0 --port 8088 octop service start ``` -打开 **http://127.0.0.1:8088**。Docker 首次初始化默认账号为 `admin` / `Octop123`,请立即修改密码。交互式 `octop init` / 设置向导会让你自行设置密码(至少 8 位,且同时包含字母和数字)。 - -> ⚠️ **安全提醒:** Docker 默认管理员密码为 `Octop123`,首次启动后请尽快在「个人设置 → 修改密码」中更换,避免服务暴露到公网时被未授权访问。 +打开 **http://127.0.0.1:8088**。交互式 `octop init` / 设置向导会让你自行设置密码(至少 8 位,且同时包含字母和数字)。Docker 首次启动的凭据会写入 `~/octop-login.txt`。 ### Docker(推荐用于生产部署) @@ -238,18 +236,17 @@ docker run -d \ -p 8088:8088 \ -v octop-data:/data/.octop \ -e HOME=/data \ - -e OCTOP_DEFAULT_PASSWORD=Octop123 \ octop:latest ``` -打开 `http://localhost:8088` — 默认账号 `admin` / `Octop123`(请立即修改密码)。首次启动也会把凭据写入 `/data/.octop/credential.txt`。 +打开 `http://localhost:8088`。首次启动的凭据会写入 `~/octop-login.txt`(容器内为 `/data/octop-login.txt`);若要自行指定初始密码,设置 `OCTOP_DEFAULT_PASSWORD`。 -> **密码策略:** 至少 8 位,且同时包含字母和数字。后续计划改为首次启动随机生成密码,并仅写入 `credential.txt`。 +> **密码策略:** 至少 8 位,且同时包含字母和数字。 | 变量 | 默认值 | 说明 | |------|--------|------| | `OCTOP_PORT` | `8088` | HTTP 监听端口 | -| `OCTOP_DEFAULT_PASSWORD` | `Octop123` | 首次运行管理员密码(Docker 引导) | +| `OCTOP_DEFAULT_PASSWORD` | — | 可选,首次运行管理员密码(Docker 引导) | | `OCTOP_ADMIN_USERNAME` | `admin` | 首次运行管理员用户名 | | `OCTOP_DATA` | `~/.octop` | 宿主机数据目录(compose 挂载) | diff --git a/docker/README.md b/docker/README.md index 43196b07..e004dbf4 100644 --- a/docker/README.md +++ b/docker/README.md @@ -26,7 +26,7 @@ From the repository root: docker compose -f docker/docker-compose.yml up -d --build ``` -Open `http://localhost:8088`. Default credentials: `admin` / `Octop123` (applied only on first init; change immediately). Password must be ≥8 characters with letters and digits. A future release may randomize the first-boot password and write it only to `credential.txt`. +Open `http://localhost:8088`. First-boot credentials are written to `~/octop-login.txt` (`/data/octop-login.txt` in the container; override with `OCTOP_DEFAULT_PASSWORD`). Password must be ≥8 characters with letters and digits. **Option 2: Build script** @@ -58,7 +58,7 @@ bash docker/docker_build.sh |----------|---------|-------------| | `HOME` | `/data` | Must be `/data` so `~/.octop` maps to the data volume | | `OCTOP_PORT` | `8088` | HTTP listen port | -| `OCTOP_DEFAULT_PASSWORD` | `Octop123` | Initial admin password (≥8 chars, letters + digits) | +| `OCTOP_DEFAULT_PASSWORD` | — | Optional first-run admin password (≥8 chars, letters + digits) | | `OCTOP_ADMIN_USERNAME` | `admin` | Initial admin username | | `OCTOP_DATABASE_URL` | — | PostgreSQL DSN (or other `OCTOP_DATABASE_*`; see [configuration.md](../docs/configuration.md)) | | `OCTOP_DATABASE_DRIVER` | — | `sqlite` \| `postgresql` when overriding defaults via env | @@ -71,7 +71,7 @@ For Compose, put these in `docker/.env`. Values only reach the container if list - Compose mounts host `~/.octop` → container `/data/.octop` - `docker run` example uses named volume `octop-data` -- First boot runs `octop init`; credentials are written to `/data/.octop/credential.txt` (default password `Octop123` unless `OCTOP_DEFAULT_PASSWORD` is set). Future: may randomize on first boot instead of a fixed default. +- First boot runs `octop init`; credentials are written to `~/octop-login.txt` (`/data/octop-login.txt` in the container; override with `OCTOP_DEFAULT_PASSWORD`). ### Health check diff --git a/docker/README_CN.md b/docker/README_CN.md index f4b4da54..c36fb630 100644 --- a/docker/README_CN.md +++ b/docker/README_CN.md @@ -26,7 +26,7 @@ docker compose -f docker/docker-compose.yml up -d --build ``` -访问 `http://localhost:8088`,默认账号 `admin` / `Octop123`(仅首次初始化生效,请立即修改)。密码须 ≥8 位且同时包含字母和数字。后续计划改为首次启动随机生成密码,并仅写入 `credential.txt`。 +访问 `http://localhost:8088`。首次启动的凭据写入 `~/octop-login.txt`(容器内为 `/data/octop-login.txt`,可用 `OCTOP_DEFAULT_PASSWORD` 覆盖)。密码须 ≥8 位且同时包含字母和数字。 **方式二:构建脚本** @@ -58,7 +58,7 @@ bash docker/docker_build.sh |------|--------|------| | `HOME` | `/data` | 必须为 `/data`,数据目录映射到 `~/.octop` | | `OCTOP_PORT` | `8088` | HTTP 服务端口 | -| `OCTOP_DEFAULT_PASSWORD` | `Octop123` | 首次管理员密码(≥8 位,字母+数字) | +| `OCTOP_DEFAULT_PASSWORD` | — | 可选,首次管理员密码(≥8 位,字母+数字) | | `OCTOP_ADMIN_USERNAME` | `admin` | 首次管理员用户名 | | `OCTOP_DATABASE_URL` | — | PostgreSQL DSN(或其他 `OCTOP_DATABASE_*`,见 [configuration.md](../docs/configuration.md)) | | `OCTOP_DATABASE_DRIVER` | — | 通过环境变量覆盖时:`sqlite` \| `postgresql` | @@ -71,7 +71,7 @@ Compose 可在 `docker/.env` 中配置上述变量。注意:`.env` 只参与 C - Compose 默认将宿主机 `~/.octop` 挂载到容器 `/data/.octop` - `docker run` 示例使用命名卷 `octop-data` -- 首次启动会自动执行 `octop init`,凭据写入容器内 `/data/.octop/credential.txt`(默认密码 `Octop123`,可用 `OCTOP_DEFAULT_PASSWORD` 覆盖)。后续计划改为首次启动随机生成密码。 +- 首次启动会自动执行 `octop init`,凭据写入 `~/octop-login.txt`(容器内为 `/data/octop-login.txt`,可用 `OCTOP_DEFAULT_PASSWORD` 覆盖)。 ### 健康检查 diff --git a/fnos/README.md b/fnos/README.md index d6f8b384..6c47bc8b 100644 --- a/fnos/README.md +++ b/fnos/README.md @@ -2,17 +2,6 @@ 本目录包含将 [TencentCloud/Octop](https://github.com/TencentCloud/Octop) 打包为飞牛 fnOS `.fpk` 安装包所需的全部文件,并附带自动同步上游 + 自动构建的 GitHub Actions。 -## First use (initial account) - -After install, open the app (Docker: `http://:8088`, native: `http://:8089`) and sign in with the **initial admin account**: - -| Field | Value | -|-------|-------| -| Username | `admin` | -| Password | `Octop123` | - -> The password is a fixed initial value (same as the official Docker image default). **Change it right after first login** via the avatar menu → "Change password". If `OCTOP_ADMIN_USERNAME` / `OCTOP_DEFAULT_PASSWORD` were customized via env during install, those take precedence. - ## 两种安装包 仓库同时产出 **两款** `.fpk`,用于满足不同部署偏好: From 0629253d4ecad601a3a2830616fccc40ebcb8e46 Mon Sep 17 00:00:00 2001 From: liukewia Date: Wed, 2 Sep 2026 17:16:28 +0800 Subject: [PATCH 19/58] feat(desktop): add NSIS installer support for Windows packaging - Integrated NSIS installation into the CI workflow for Windows, ensuring `makensis.exe` is available. - Updated `package-release.sh` to check for `makensis` and provide installation instructions if missing. - Enhanced documentation to clarify the need for NSIS in Windows packaging. - Added NSIS project files to facilitate the creation of a Windows installer that includes shortcuts and the WebView2 runtime. This change improves the Windows packaging process by providing a proper installer experience. --- .github/workflows/octop-desktop.yml | 11 + desktop/README.md | 5 +- desktop/package-release.sh | 4 + desktop/src/.gitignore | 1 + desktop/src/build/windows/Taskfile.yml | 34 ++- desktop/src/build/windows/nsis/project.nsi | 95 ++++++++ .../src/build/windows/nsis/wails_tools.nsh | 219 ++++++++++++++++++ 7 files changed, 364 insertions(+), 5 deletions(-) create mode 100644 desktop/src/build/windows/nsis/project.nsi create mode 100644 desktop/src/build/windows/nsis/wails_tools.nsh diff --git a/.github/workflows/octop-desktop.yml b/.github/workflows/octop-desktop.yml index 98b2cd09..5149254f 100644 --- a/.github/workflows/octop-desktop.yml +++ b/.github/workflows/octop-desktop.yml @@ -230,6 +230,17 @@ jobs: - name: Install Wails v3 CLI run: go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-beta.13 + - name: Install NSIS + if: runner.os == 'Windows' + shell: pwsh + run: | + choco install nsis --yes --no-progress + $nsis = "${env:ProgramFiles(x86)}\NSIS" + if (-not (Test-Path "$nsis\makensis.exe")) { + throw "makensis.exe missing after NSIS install" + } + Add-Content -Path $env:GITHUB_PATH -Value $nsis + - name: Package desktop app with bundled portable runtime working-directory: desktop/src run: >- diff --git a/desktop/README.md b/desktop/README.md index 68a903bd..8006f93d 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -44,6 +44,8 @@ desktop/package-release.sh darwin-arm64 --reuse-portable Wails requires native packaging, so all six variants are produced by the CI matrix on macOS, Linux, and Windows runners rather than cross-compiled locally. +Windows packaging also needs [NSIS](https://nsis.sourceforge.io/) (`makensis`) +so the `.exe` is an installer rather than a portable single-file binary. ## Build the Wails shell @@ -76,7 +78,8 @@ Wails shell never downloads Octop. For local runtime debugging, set GitHub Release names follow `Octop----.`: - Desktop GUI: `Octop-desktop--.dmg` (macOS), - `.exe` (Windows), `.tar.gz` (Linux) + `.exe` (Windows NSIS installer — copies into `Program Files\Octop` + and creates Start Menu + desktop shortcuts), `.tar.gz` (Linux) - Green runtime zip: `Octop-portable--.zip` - PyPI wheels stay `octop--py3-none-any.whl` (PEP 427) diff --git a/desktop/package-release.sh b/desktop/package-release.sh index c81d0c73..3d8e16d9 100755 --- a/desktop/package-release.sh +++ b/desktop/package-release.sh @@ -59,6 +59,10 @@ if ! command -v wails3 >/dev/null 2>&1; then echo "wails3 is required: go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-beta.13" >&2 exit 1 fi +if [[ "$plat" == windows-* ]] && ! command -v makensis >/dev/null 2>&1; then + echo "makensis is required for the Windows installer: choco install nsis" >&2 + exit 1 +fi arch="${plat##*-}" ver="$(octop_version)" diff --git a/desktop/src/.gitignore b/desktop/src/.gitignore index 734c8808..47359f35 100644 --- a/desktop/src/.gitignore +++ b/desktop/src/.gitignore @@ -5,4 +5,5 @@ bundled/portable.zip build/windows/*.syso build/darwin/icons.icns build/windows/icon.ico +build/windows/nsis/MicrosoftEdgeWebview2Setup.exe build/linux/icon.png diff --git a/desktop/src/build/windows/Taskfile.yml b/desktop/src/build/windows/Taskfile.yml index 3be93aef..6536e9ff 100644 --- a/desktop/src/build/windows/Taskfile.yml +++ b/desktop/src/build/windows/Taskfile.yml @@ -39,7 +39,7 @@ tasks: PORTABLE_ZIP: '{{.PORTABLE_ZIP | default (printf "../portable/release/Octop-portable-windows-%s-%s.zip" (.ARCH | default ARCH) (.VERSION | default "dev"))}}' package: - summary: Packages a single production exe with the portable runtime embedded + summary: Packages an NSIS installer with the portable runtime embedded cmds: - task: stage:portable vars: @@ -49,13 +49,15 @@ tasks: vars: PRODUCTION: "true" ARCH: "{{.ARCH}}" + - task: create:nsis:installer + vars: + ARCH: "{{.ARCH}}" + VERSION: "{{.VERSION}}" - cmd: >- powershell -NoProfile -Command - "Remove-Item -Force '{{.ARCHIVE}}' -ErrorAction SilentlyContinue; - Remove-Item -Force '{{.BIN_DIR}}/{{.APP_NAME}}-Desktop-windows-{{.ARCH}}.zip' -ErrorAction SilentlyContinue; + "Remove-Item -Force '{{.BIN_DIR}}/{{.APP_NAME}}-Desktop-windows-{{.ARCH}}.zip' -ErrorAction SilentlyContinue; Remove-Item -Force '{{.BIN_DIR}}/{{.APP_NAME}}-Desktop-windows-{{.ARCH}}.exe' -ErrorAction SilentlyContinue; Remove-Item -Recurse -Force '{{.BIN_DIR}}/{{.APP_NAME}}-Desktop-windows-{{.ARCH}}' -ErrorAction SilentlyContinue; - Copy-Item '{{.BIN_DIR}}/{{.APP_NAME}}.exe' '{{.ARCHIVE}}'; Remove-Item -Force 'bundled/portable.zip' -ErrorAction SilentlyContinue" vars: ARCH: "{{.ARCH | default ARCH}}" @@ -63,6 +65,30 @@ tasks: PORTABLE_ZIP: '{{.PORTABLE_ZIP | default (printf "../portable/release/Octop-portable-windows-%s-%s.zip" .ARCH .VERSION)}}' ARCHIVE: '{{.BIN_DIR}}/{{.APP_NAME}}-desktop-windows-{{.ARCH}}-{{.VERSION}}.exe' + create:nsis:installer: + summary: Wraps Octop.exe in an NSIS installer (Program Files + shortcuts) + dir: build/windows/nsis + preconditions: + - sh: makensis -VERSION + msg: "makensis is required. Install NSIS (choco install nsis) and ensure it is on PATH." + cmds: + - wails3 generate webview2bootstrapper -dir "{{.ROOT_DIR}}/build/windows/nsis" + - cmd: >- + powershell -NoProfile -Command + "Remove-Item -Force '{{.ROOT_DIR}}/{{.ARCHIVE}}' -ErrorAction SilentlyContinue; + New-Item -ItemType Directory -Force '{{.ROOT_DIR}}/{{.BIN_DIR}}' | Out-Null" + - | + {{if eq OS "windows"}} + makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" -DINSTALLER_OUTFILE="{{.ROOT_DIR}}\{{.ARCHIVE}}" project.nsi + {{else}} + makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" -DINSTALLER_OUTFILE="{{.ROOT_DIR}}/{{.ARCHIVE}}" project.nsi + {{end}} + vars: + ARCH: '{{.ARCH | default ARCH}}' + VERSION: '{{.VERSION | default "dev"}}' + ARG_FLAG: '{{if eq (.ARCH | default ARCH) "amd64"}}AMD64{{else}}ARM64{{end}}' + ARCHIVE: '{{.BIN_DIR}}/{{.APP_NAME}}-desktop-windows-{{.ARCH}}-{{.VERSION}}.exe' + run: cmds: - "{{.BIN_DIR}}/{{.APP_NAME}}.exe" diff --git a/desktop/src/build/windows/nsis/project.nsi b/desktop/src/build/windows/nsis/project.nsi new file mode 100644 index 00000000..7b36b862 --- /dev/null +++ b/desktop/src/build/windows/nsis/project.nsi @@ -0,0 +1,95 @@ +Unicode true + +# Octop desktop NSIS installer. +# Built by `wails3 task package` on a Windows runner: +# makensis -DARG_WAILS_AMD64_BINARY=..\..\..\bin\Octop.exe project.nsi +# makensis -DARG_WAILS_ARM64_BINARY=..\..\..\bin\Octop.exe project.nsi + +!include "wails_tools.nsh" + +SetCompressor /SOLID lzma + +# The version information for this two must consist of 4 parts +VIProductVersion "${INFO_PRODUCTVERSION}.0" +VIFileVersion "${INFO_PRODUCTVERSION}.0" + +VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}" +VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer" +VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}" +VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}" +VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}" +VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}" + +ManifestDPIAware true + +!include "MUI.nsh" + +!define MUI_ICON "..\icon.ico" +!define MUI_UNICON "..\icon.ico" +!define MUI_FINISHPAGE_NOAUTOCLOSE +!define MUI_ABORTWARNING +!define MUI_FINISHPAGE_RUN "$INSTDIR\${PRODUCT_EXECUTABLE}" + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_INSTFILES + +!insertmacro MUI_LANGUAGE "SimpChinese" +!insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_RESERVEFILE_LANGDLL + +Name "${INFO_PRODUCTNAME}" +!ifndef INSTALLER_OUTFILE + !define INSTALLER_OUTFILE "..\..\..\bin\${INFO_PROJECTNAME}-desktop-windows-${ARCH}-${INFO_PRODUCTVERSION}.exe" +!endif +OutFile "${INSTALLER_OUTFILE}" +!if "${WAILS_INSTALL_SCOPE}" == "user" + InstallDir "$LOCALAPPDATA\Programs\${INFO_PRODUCTNAME}" +!else + InstallDir "$PROGRAMFILES64\${INFO_PRODUCTNAME}" +!endif +ShowInstDetails show + +Function .onInit + IfSilent skipLang + !insertmacro MUI_LANGDLL_DISPLAY + skipLang: + !insertmacro wails.checkArchitecture +FunctionEnd + +Section + !insertmacro wails.setShellContext + + !insertmacro wails.webview2runtime + + SetOutPath $INSTDIR + + !insertmacro wails.files + + CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" + CreateShortcut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" + + !insertmacro wails.associateFiles + !insertmacro wails.associateCustomProtocols + + !insertmacro wails.writeUninstaller +SectionEnd + +Section "uninstall" + !insertmacro wails.setShellContext + + RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" + + RMDir /r $INSTDIR + + Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" + Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk" + + !insertmacro wails.unassociateFiles + !insertmacro wails.unassociateCustomProtocols + + !insertmacro wails.deleteUninstaller +SectionEnd diff --git a/desktop/src/build/windows/nsis/wails_tools.nsh b/desktop/src/build/windows/nsis/wails_tools.nsh new file mode 100644 index 00000000..2c88b92f --- /dev/null +++ b/desktop/src/build/windows/nsis/wails_tools.nsh @@ -0,0 +1,219 @@ +# Shared NSIS helpers for the Octop desktop installer. +# Keep INFO_* defaults in sync with desktop/src/build/config.yml. + +!include "x64.nsh" +!include "WinVer.nsh" +!include "FileFunc.nsh" + +!ifndef INFO_PROJECTNAME + !define INFO_PROJECTNAME "Octop" +!endif +!ifndef INFO_COMPANYNAME + !define INFO_COMPANYNAME "Octop" +!endif +!ifndef INFO_PRODUCTNAME + !define INFO_PRODUCTNAME "Octop" +!endif +!ifndef INFO_PRODUCTVERSION + !define INFO_PRODUCTVERSION "0.9.31" +!endif +!ifndef INFO_COPYRIGHT + !define INFO_COPYRIGHT "(c) 2026, Octop" +!endif +!ifndef PRODUCT_EXECUTABLE + !define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe" +!endif +!ifndef UNINST_KEY_NAME + !define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}" +!endif +!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}" + +!ifndef WAILS_INSTALL_SCOPE + !define WAILS_INSTALL_SCOPE "machine" +!endif + +!ifndef REQUEST_EXECUTION_LEVEL + !if "${WAILS_INSTALL_SCOPE}" == "user" + !define REQUEST_EXECUTION_LEVEL "user" + !else + !define REQUEST_EXECUTION_LEVEL "admin" + !endif +!endif + +RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}" + +!ifdef ARG_WAILS_AMD64_BINARY + !define SUPPORTS_AMD64 +!endif + +!ifdef ARG_WAILS_ARM64_BINARY + !define SUPPORTS_ARM64 +!endif + +!ifdef SUPPORTS_AMD64 + !ifdef SUPPORTS_ARM64 + !define ARCH "amd64_arm64" + !else + !define ARCH "amd64" + !endif +!else + !ifdef SUPPORTS_ARM64 + !define ARCH "arm64" + !else + !error "Undefined ARCH, please provide ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY" + !endif +!endif + +!macro wails.checkArchitecture + !ifndef WAILS_WIN10_REQUIRED + !define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later." + !endif + + !ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED + !define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}" + !endif + + ${If} ${AtLeastWin10} + !ifdef SUPPORTS_AMD64 + ${if} ${IsNativeAMD64} + Goto ok + ${EndIf} + !endif + + !ifdef SUPPORTS_ARM64 + ${if} ${IsNativeARM64} + Goto ok + ${EndIf} + !endif + + IfSilent silentArch notSilentArch + silentArch: + SetErrorLevel 65 + Abort + notSilentArch: + MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}" + Quit + ${else} + IfSilent silentWin notSilentWin + silentWin: + SetErrorLevel 64 + Abort + notSilentWin: + MessageBox MB_OK "${WAILS_WIN10_REQUIRED}" + Quit + ${EndIf} + + ok: +!macroend + +!macro wails.files + !ifdef SUPPORTS_AMD64 + ${if} ${IsNativeAMD64} + File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}" + ${EndIf} + !endif + + !ifdef SUPPORTS_ARM64 + ${if} ${IsNativeARM64} + File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}" + ${EndIf} + !endif +!macroend + +!macro wails.writeUninstaller + WriteUninstaller "$INSTDIR\uninstall.exe" + + SetRegView 64 + !if "${WAILS_INSTALL_SCOPE}" == "user" + WriteRegStr HKCU "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}" + WriteRegStr HKCU "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}" + WriteRegStr HKCU "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}" + WriteRegStr HKCU "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}" + WriteRegStr HKCU "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" + WriteRegStr HKCU "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + IntFmt $0 "0x%08X" $0 + WriteRegDWORD HKCU "${UNINST_KEY}" "EstimatedSize" "$0" + !else + WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}" + WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" + WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + IntFmt $0 "0x%08X" $0 + WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0" + !endif +!macroend + +!macro wails.deleteUninstaller + Delete "$INSTDIR\uninstall.exe" + + SetRegView 64 + !if "${WAILS_INSTALL_SCOPE}" == "user" + DeleteRegKey HKCU "${UNINST_KEY}" + !else + DeleteRegKey HKLM "${UNINST_KEY}" + !endif +!macroend + +!macro wails.setShellContext + ${If} ${REQUEST_EXECUTION_LEVEL} == "admin" + SetShellVarContext all + ${else} + SetShellVarContext current + ${EndIf} +!macroend + +# Install webview2 by launching the bootstrapper +# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment +!macro wails.webview2runtime + !ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT + !define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime" + !endif + + SetRegView 64 + ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" + ${If} $0 != "" + Goto ok + ${EndIf} + + ${If} ${REQUEST_EXECUTION_LEVEL} == "user" + ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" + ${If} $0 != "" + Goto ok + ${EndIf} + ${EndIf} + + SetDetailsPrint both + DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}" + SetDetailsPrint listonly + + InitPluginsDir + CreateDirectory "$pluginsdir\webview2bootstrapper" + SetOutPath "$pluginsdir\webview2bootstrapper" + File "MicrosoftEdgeWebview2Setup.exe" + ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install' + + SetDetailsPrint both + ok: +!macroend + +!macro wails.associateFiles + ; No file associations +!macroend + +!macro wails.unassociateFiles + ; No file associations +!macroend + +!macro wails.associateCustomProtocols + ; No custom protocols +!macroend + +!macro wails.unassociateCustomProtocols + ; No custom protocols +!macroend From e166fefe49012f00f03b6adb58fbbf75842df284 Mon Sep 17 00:00:00 2001 From: HUANG Cheng Date: Wed, 2 Sep 2026 19:06:11 +0800 Subject: [PATCH 20/58] feat(chat): add turn timeline rail for in-thread navigation Add a left-side user-turn rail with hover preview, scroll-spy, and jump-to-turn so long chats are easier to scan without changing the session sidebar. --- dashboard/src/locales/en.json | 7 + dashboard/src/locales/zh.json | 7 + .../src/pages/Chat/chatMessages.partial.less | 16 + .../src/pages/Chat/components/MessageList.tsx | 28 +- .../components/TurnTimelineRail.module.less | 183 ++++++++ .../Chat/components/TurnTimelineRail.test.tsx | 260 +++++++++++ .../Chat/components/TurnTimelineRail.tsx | 426 ++++++++++++++++++ dashboard/src/pages/Chat/index.module.less | 31 ++ dashboard/src/pages/Chat/index.tsx | 18 +- .../src/pages/Chat/utils/turnTimeline.test.ts | 187 ++++++++ .../src/pages/Chat/utils/turnTimeline.ts | 330 ++++++++++++++ 11 files changed, 1491 insertions(+), 2 deletions(-) create mode 100644 dashboard/src/pages/Chat/components/TurnTimelineRail.module.less create mode 100644 dashboard/src/pages/Chat/components/TurnTimelineRail.test.tsx create mode 100644 dashboard/src/pages/Chat/components/TurnTimelineRail.tsx create mode 100644 dashboard/src/pages/Chat/utils/turnTimeline.test.ts create mode 100644 dashboard/src/pages/Chat/utils/turnTimeline.ts diff --git a/dashboard/src/locales/en.json b/dashboard/src/locales/en.json index 5e179d3b..47601f44 100644 --- a/dashboard/src/locales/en.json +++ b/dashboard/src/locales/en.json @@ -1047,6 +1047,13 @@ "generating": "Generating", "generatingWithElapsed": "Generating · {{seconds}}s", "scrollToBottom": "Back to bottom", + "turnTimeline": { + "label": "Conversation turns", + "jumpToQuery": "Jump to message {{index}}", + "userFallback": "(empty message)", + "emptyAssistant": "(no reply yet)", + "runningAssistant": "(generating…)" + }, "loadingEarlierMessages": "Loading earlier messages…", "scrollForEarlierMessages": "Scroll up for earlier messages", "refreshingMessages": "Refreshing messages…", diff --git a/dashboard/src/locales/zh.json b/dashboard/src/locales/zh.json index ea088ae1..bba5f654 100644 --- a/dashboard/src/locales/zh.json +++ b/dashboard/src/locales/zh.json @@ -1047,6 +1047,13 @@ "generating": "生成中", "generatingWithElapsed": "生成中 · {{seconds}}s", "scrollToBottom": "回到底部", + "turnTimeline": { + "label": "对话回合", + "jumpToQuery": "跳转到第 {{index}} 条消息", + "userFallback": "(空消息)", + "emptyAssistant": "(暂无回复)", + "runningAssistant": "(生成中…)" + }, "loadingEarlierMessages": "正在加载更早的消息…", "scrollForEarlierMessages": "向上滚动加载更早的消息", "refreshingMessages": "正在刷新消息…", diff --git a/dashboard/src/pages/Chat/chatMessages.partial.less b/dashboard/src/pages/Chat/chatMessages.partial.less index 0d296912..41118259 100644 --- a/dashboard/src/pages/Chat/chatMessages.partial.less +++ b/dashboard/src/pages/Chat/chatMessages.partial.less @@ -8,6 +8,22 @@ flex-direction: column; } +/* Left gutter so the in-thread turn timeline ticks do not cover bubbles. + Prefer parent `.chatMainWithTurnRail` (title + composer + list). This local + class remains as a fallback when MessageList is mounted alone. */ +.messageListWrapperWithRail { + --chat-turn-rail-gutter: 48px; + + .messageListInner { + padding-inline-start: var(--chat-turn-rail-gutter); + padding-inline-end: var(--chat-column-pad-x, 24px); + + @media (max-width: 863px) { + padding-inline-start: var(--chat-column-pad-x, 24px); + } + } +} + .messageList { flex: 1; overflow-y: auto; diff --git a/dashboard/src/pages/Chat/components/MessageList.tsx b/dashboard/src/pages/Chat/components/MessageList.tsx index 750dc493..dd70414b 100644 --- a/dashboard/src/pages/Chat/components/MessageList.tsx +++ b/dashboard/src/pages/Chat/components/MessageList.tsx @@ -18,6 +18,7 @@ import MessageBubble from "./MessageBubble"; import AssistantTurnView from "./AssistantTurnView"; import ScrollToBottomButton from "./ScrollToBottomButton"; import GeneratingIndicator from "./GeneratingIndicator"; +import TurnTimelineRail from "./TurnTimelineRail"; import { isLiveAssistantTurn } from "./liveAssistantTurn"; import { chatGeneratingPhase } from "./generatingGate"; import { useAutoScroll } from "../hooks/useAutoScroll"; @@ -109,6 +110,8 @@ interface MessageListProps { shellCommandDisabled?: boolean; shellCommandDisabledTitle?: string; compactProcess?: boolean; + /** Notify chat chrome when the in-thread turn rail is shown (for gutter align). */ + onTurnRailVisibilityChange?: (visible: boolean) => void; } interface GroupRenderContext { @@ -157,6 +160,8 @@ function renderMessageGroup( if (msg.role === "assistant") { return (
{ ctx.registerBubbleRef(msg.id, el); }} @@ -184,6 +189,8 @@ function renderMessageGroup( } return (
{ ctx.registerBubbleRef(msg.id, el); }} @@ -203,6 +210,8 @@ function renderMessageGroup( return (
{ for (const msg of group.messages) { ctx.registerBubbleRef(msg.id, el); @@ -259,10 +268,12 @@ export default function MessageList(props: MessageListProps) { shellCommandDisabled, shellCommandDisabledTitle, compactProcess, + onTurnRailVisibilityChange, } = props; const { t } = useTranslation(); const virtuosoRef = useRef(null); + const wrapperRef = useRef(null); const containerRef = useRef(null); const scrollerRef = useRef(null); const endRef = useRef(null); @@ -766,7 +777,22 @@ export default function MessageList(props: MessageListProps) { } return ( -
+
+ {useVirtual ? ( ({ + useTranslation: () => ({ + t: (key: string, opts?: Record) => { + if (key === "chat.turnTimeline.jumpToQuery") { + return `Jump ${opts?.index ?? ""}`.trim(); + } + return key; + }, + }), +})); + +function msg( + role: ChatMessage["role"], + id: string, + content: string, +): ChatMessage { + return { + id, + role, + content, + status: "done", + timestamp: Date.now(), + }; +} + +function mountScrollerWithAnchors(ids: string[]) { + const scroller = document.createElement("div"); + Object.defineProperty(scroller, "clientHeight", { + configurable: true, + value: 600, + }); + Object.defineProperty(scroller, "scrollTop", { + configurable: true, + writable: true, + value: 0, + }); + scroller.getBoundingClientRect = () => + ({ + top: 0, + left: 0, + bottom: 600, + right: 400, + width: 400, + height: 600, + x: 0, + y: 0, + toJSON() { + return {}; + }, + }) as DOMRect; + + const bubbleRefsMap = new Map(); + ids.forEach((id, index) => { + const el = document.createElement("div"); + el.dataset.messageId = id; + el.dataset.role = "user"; + el.className = "userBubble messageBubble"; + el.getBoundingClientRect = () => + ({ + top: 40 + index * 200, + left: 80, + bottom: 140 + index * 200, + right: 360, + width: 280, + height: 100, + x: 80, + y: 40 + index * 200, + toJSON() { + return {}; + }, + }) as DOMRect; + scroller.appendChild(el); + bubbleRefsMap.set(id, el); + }); + document.body.appendChild(scroller); + return { scroller, bubbleRefsMap }; +} + +describe("TurnTimelineRail", () => { + beforeEach(() => { + vi.stubGlobal( + "MutationObserver", + class { + observe() {} + disconnect() {} + takeRecords() { + return []; + } + }, + ); + vi.stubGlobal( + "ResizeObserver", + class { + callback: ResizeObserverCallback; + constructor(cb: ResizeObserverCallback) { + this.callback = cb; + } + observe(target: Element) { + this.callback( + [ + { + target, + contentRect: { + width: 960, + height: 700, + } as DOMRectReadOnly, + borderBoxSize: [], + contentBoxSize: [], + devicePixelContentBoxSize: [], + } as ResizeObserverEntry, + ], + this as unknown as ResizeObserver, + ); + } + unobserve() {} + disconnect() {} + }, + ); + }); + + afterEach(() => { + cleanup(); + document.body.innerHTML = ""; + vi.unstubAllGlobals(); + }); + + it("renders ticks for two user turns and jumps on click", async () => { + const messages = [ + msg("user", "u1", "first question"), + msg("assistant", "a1", "first answer"), + msg("user", "u2", "second question"), + msg("assistant", "a2", "second answer"), + ]; + const messageGroups = groupConsecutiveAssistantMessages(messages); + const { scroller, bubbleRefsMap } = mountScrollerWithAnchors(["u1", "u2"]); + const scrollerRef = { current: null as HTMLElement | null }; + const containerRef = { current: scroller as HTMLDivElement | null }; + const virtuosoRef = { current: null }; + const wrapper = document.createElement("div"); + Object.defineProperty(wrapper, "clientWidth", { + configurable: true, + value: 960, + }); + document.body.appendChild(wrapper); + const wrapperRef = { current: wrapper }; + const armProgrammaticGuard = vi.fn(); + const scrollTo = vi.fn(); + scroller.scrollTo = scrollTo; + + render( + , + ); + + const rail = await screen.findByTestId("turn-timeline-rail"); + expect(rail).toHaveAttribute("data-item-count", "2"); + expect(rail).toHaveAttribute("data-visible", "true"); + expect(rail).toHaveAttribute("data-direction", "ltr"); + + fireEvent.click(screen.getByTestId("turn-timeline-tick-0")); + await waitFor(() => { + expect(armProgrammaticGuard).toHaveBeenCalled(); + }); + expect(scrollTo).toHaveBeenCalled(); + }); + + it("marks rtl direction for preview placement", async () => { + document.documentElement.setAttribute("dir", "rtl"); + const messages = [ + msg("user", "u1", "first"), + msg("assistant", "a1", "a"), + msg("user", "u2", "second"), + msg("assistant", "a2", "b"), + ]; + const messageGroups = groupConsecutiveAssistantMessages(messages); + const { scroller, bubbleRefsMap } = mountScrollerWithAnchors(["u1", "u2"]); + const wrapper = document.createElement("div"); + Object.defineProperty(wrapper, "clientWidth", { + configurable: true, + value: 960, + }); + document.body.appendChild(wrapper); + + render( + , + ); + + const rail = await screen.findByTestId("turn-timeline-rail"); + expect(rail).toHaveAttribute("data-direction", "rtl"); + document.documentElement.setAttribute("dir", "ltr"); + }); + + it("hides when fewer than two user turns", () => { + const messages = [ + msg("user", "u1", "only one"), + msg("assistant", "a1", "reply"), + ]; + const messageGroups = groupConsecutiveAssistantMessages(messages); + const { scroller, bubbleRefsMap } = mountScrollerWithAnchors(["u1"]); + const wrapper = document.createElement("div"); + Object.defineProperty(wrapper, "clientWidth", { + configurable: true, + value: 960, + }); + document.body.appendChild(wrapper); + + const { container } = render( + , + ); + + expect( + container.querySelector('[data-testid="turn-timeline-rail"]'), + ).toBeNull(); + }); +}); diff --git a/dashboard/src/pages/Chat/components/TurnTimelineRail.tsx b/dashboard/src/pages/Chat/components/TurnTimelineRail.tsx new file mode 100644 index 00000000..5d993b18 --- /dev/null +++ b/dashboard/src/pages/Chat/components/TurnTimelineRail.tsx @@ -0,0 +1,426 @@ +import { + useCallback, + useEffect, + useMemo, + useRef, + useState, + type MutableRefObject, + type RefObject, +} from "react"; +import { Popover } from "antd"; +import type { VirtuosoHandle } from "react-virtuoso"; +import { useTranslation } from "react-i18next"; +import type { ChatMessage } from "../hooks/useChat"; +import type { MessageGroup } from "../utils/messageGrouping"; +import { + TURN_TIMELINE_HOVER_CLOSE_DELAY_S, + TURN_TIMELINE_HOVER_OPEN_DELAY_S, + TURN_TIMELINE_MIN_TURNS, + TURN_TIMELINE_MIN_WIDTH_PX, + TURN_TIMELINE_ROW_PX, + TURN_TIMELINE_VIRTUALIZE_THRESHOLD, + alignElementToScrollerTop, + buildTurnTimelineItems, + mergeTurnPositions, + prefersReducedMotion, + readElementDirection, + resolveActiveTurnId, + resolveFlashTarget, + resolveFollowPinnedTurnId, + tickVisualForDistance, + visibleTurnWindow, + type TurnTimelineItem, +} from "../utils/turnTimeline"; +import styles from "./TurnTimelineRail.module.less"; + +const FLASH_CLASS = "turn-timeline-flash"; +const FLASH_MS = 700; +const JUMP_RETRY_FRAMES = 30; + +interface TurnTimelineRailProps { + messages: ChatMessage[]; + messageGroups: MessageGroup[]; + isStreaming?: boolean; + /** When true (pinned near bottom), keep the latest tick active. */ + following?: boolean; + useVirtual: boolean; + firstItemIndex: number; + scrollerRef: RefObject; + containerRef: RefObject; + virtuosoRef: RefObject; + bubbleRefsMap: MutableRefObject>; + wrapperRef: RefObject; + armProgrammaticGuard: (ms?: number) => void; + onVisibilityChange?: (visible: boolean) => void; +} + +function flashElement(anchor: HTMLElement): void { + const el = resolveFlashTarget(anchor); + el.classList.remove(FLASH_CLASS); + void el.offsetWidth; + el.classList.add(FLASH_CLASS); + window.setTimeout(() => { + el.classList.remove(FLASH_CLASS); + }, FLASH_MS); +} + +export default function TurnTimelineRail({ + messages, + messageGroups, + isStreaming, + following = false, + useVirtual, + firstItemIndex, + scrollerRef, + containerRef, + virtuosoRef, + bubbleRefsMap, + wrapperRef, + armProgrammaticGuard, + onVisibilityChange, +}: TurnTimelineRailProps) { + const { t } = useTranslation(); + const railScrollRef = useRef(null); + const [hoverIndex, setHoverIndex] = useState(undefined); + const [activeMessageId, setActiveMessageId] = useState( + undefined, + ); + const [wideEnough, setWideEnough] = useState(false); + const [reducedMotion, setReducedMotion] = useState(false); + const [textDirection, setTextDirection] = useState<"ltr" | "rtl">("ltr"); + const [railViewport, setRailViewport] = useState({ + scrollTop: 0, + height: 0, + }); + + const turns = useMemo( + () => + buildTurnTimelineItems( + messages, + messageGroups, + { + userFallback: t("chat.turnTimeline.userFallback"), + emptyAssistant: t("chat.turnTimeline.emptyAssistant"), + runningAssistant: t("chat.turnTimeline.runningAssistant"), + }, + { isStreaming }, + ), + [messages, messageGroups, isStreaming, t], + ); + + const showRail = wideEnough && turns.length >= TURN_TIMELINE_MIN_TURNS; + + useEffect(() => { + onVisibilityChange?.(showRail); + }, [showRail, onVisibilityChange]); + + useEffect(() => { + setReducedMotion(prefersReducedMotion()); + if (typeof window === "undefined" || !window.matchMedia) return; + const mq = window.matchMedia("(prefers-reduced-motion: reduce)"); + const onChange = () => setReducedMotion(mq.matches); + mq.addEventListener("change", onChange); + return () => mq.removeEventListener("change", onChange); + }, []); + + useEffect(() => { + const el = wrapperRef.current; + if (!el) return; + const update = () => { + setWideEnough(el.clientWidth >= TURN_TIMELINE_MIN_WIDTH_PX); + setTextDirection(readElementDirection(el)); + }; + update(); + if (typeof ResizeObserver === "undefined") { + window.addEventListener("resize", update); + return () => window.removeEventListener("resize", update); + } + const ro = new ResizeObserver(update); + ro.observe(el); + const mo = new MutationObserver(update); + mo.observe(document.documentElement, { + attributes: true, + attributeFilter: ["dir"], + }); + return () => { + ro.disconnect(); + mo.disconnect(); + }; + }, [wrapperRef]); + + useEffect(() => { + const el = railScrollRef.current; + if (!el || !showRail) return; + const sync = () => { + setRailViewport({ + scrollTop: el.scrollTop, + height: el.clientHeight, + }); + }; + sync(); + el.addEventListener("scroll", sync, { passive: true }); + if (typeof ResizeObserver === "undefined") { + window.addEventListener("resize", sync); + return () => { + el.removeEventListener("scroll", sync); + window.removeEventListener("resize", sync); + }; + } + const ro = new ResizeObserver(sync); + ro.observe(el); + return () => { + el.removeEventListener("scroll", sync); + ro.disconnect(); + }; + }, [showRail, turns.length]); + + const getScroller = useCallback((): HTMLElement | null => { + if (useVirtual) return scrollerRef.current; + return containerRef.current; + }, [useVirtual, scrollerRef, containerRef]); + + const measureActive = useCallback(() => { + const pinned = resolveFollowPinnedTurnId(turns, { following }); + if (pinned) { + setActiveMessageId(pinned); + return; + } + + const scroller = getScroller(); + if (!scroller || turns.length === 0) { + setActiveMessageId(undefined); + return; + } + const scrollerRect = scroller.getBoundingClientRect(); + const measured: Array<{ messageId: string; start: number; end: number }> = + []; + for (const turn of turns) { + const el = + bubbleRefsMap.current.get(turn.messageId) ?? + (scroller.querySelector( + `[data-message-id="${CSS.escape(turn.messageId)}"]`, + ) as HTMLElement | null); + if (!el) continue; + const rect = el.getBoundingClientRect(); + const start = scroller.scrollTop + rect.top - scrollerRect.top; + measured.push({ + messageId: turn.messageId, + start, + end: start + rect.height, + }); + } + const positions = mergeTurnPositions({ turns, measured }); + setActiveMessageId( + resolveActiveTurnId({ + positions, + scrollOffsetPx: scroller.scrollTop, + viewportHeightPx: scroller.clientHeight, + }), + ); + }, [bubbleRefsMap, following, getScroller, turns]); + + useEffect(() => { + const scroller = getScroller(); + if (!scroller) return; + const onScroll = () => { + measureActive(); + }; + measureActive(); + scroller.addEventListener("scroll", onScroll, { passive: true }); + return () => scroller.removeEventListener("scroll", onScroll); + }, [getScroller, measureActive, messages.length, useVirtual]); + + const activeIndex = useMemo(() => { + if (!activeMessageId) return -1; + return turns.findIndex((turn) => turn.messageId === activeMessageId); + }, [activeMessageId, turns]); + + useEffect(() => { + if (!showRail || activeIndex < 0 || turns.length < 2) return; + const scroller = railScrollRef.current; + if (!scroller) return; + const rowTop = activeIndex * TURN_TIMELINE_ROW_PX; + const rowBottom = rowTop + TURN_TIMELINE_ROW_PX; + if (rowTop < scroller.scrollTop) { + scroller.scrollTop = rowTop; + } else if (rowBottom > scroller.scrollTop + scroller.clientHeight) { + scroller.scrollTop = rowBottom - scroller.clientHeight; + } + }, [activeIndex, showRail, turns.length]); + + const jumpToTurn = useCallback( + (turn: TurnTimelineItem) => { + const scroller = getScroller(); + if (!scroller) return; + armProgrammaticGuard(reducedMotion ? 200 : 450); + const behavior: ScrollBehavior = reducedMotion ? "auto" : "smooth"; + + const tryAlign = (): boolean => { + const target = + bubbleRefsMap.current.get(turn.messageId) ?? + (scroller.querySelector( + `[data-message-id="${CSS.escape(turn.messageId)}"]`, + ) as HTMLElement | null); + if (!target) return false; + alignElementToScrollerTop(scroller, target, behavior); + flashElement(target); + measureActive(); + return true; + }; + + if (tryAlign()) return; + + if (useVirtual) { + virtuosoRef.current?.scrollToIndex({ + index: firstItemIndex + turn.groupIndex, + align: "start", + behavior: "auto", + }); + let attempts = JUMP_RETRY_FRAMES; + const retry = () => { + if (tryAlign() || --attempts <= 0) return; + window.requestAnimationFrame(retry); + }; + window.requestAnimationFrame(retry); + } + }, + [ + armProgrammaticGuard, + bubbleRefsMap, + firstItemIndex, + getScroller, + measureActive, + reducedMotion, + useVirtual, + virtuosoRef, + ], + ); + + if (turns.length < TURN_TIMELINE_MIN_TURNS) { + return null; + } + + const totalHeight = turns.length * TURN_TIMELINE_ROW_PX; + const forceFull = turns.length < TURN_TIMELINE_VIRTUALIZE_THRESHOLD; + const tickWindow = visibleTurnWindow({ + count: turns.length, + scrollTop: railViewport.scrollTop, + viewportHeight: railViewport.height || totalHeight, + forceFull, + }); + const previewPlacement = textDirection === "rtl" ? "leftTop" : "rightTop"; + + return ( +
+ + ); +} diff --git a/dashboard/src/pages/Chat/index.module.less b/dashboard/src/pages/Chat/index.module.less index 4be09021..e6b0021f 100644 --- a/dashboard/src/pages/Chat/index.module.less +++ b/dashboard/src/pages/Chat/index.module.less @@ -46,6 +46,37 @@ } } +/* Turn timeline rail visible: align title, message column, and composer gutters. */ +.chatMainWithTurnRail { + --chat-turn-rail-gutter: 48px; + + .chatTitleBar { + padding-inline: var(--chat-turn-rail-gutter) + max(var(--chat-column-pad-x, 24px), var(--window-controls-inset-end, 0px)); + padding-block: 0; + } + + .messageListInner { + padding-inline-start: var(--chat-turn-rail-gutter); + padding-inline-end: var(--chat-column-pad-x, 24px); + } + + .chatInput { + padding-inline-start: var(--chat-turn-rail-gutter); + } + + .runUsageBar { + width: 100%; + max-width: var(--chat-column-max, 960px); + padding-inline: var(--chat-turn-rail-gutter) var(--chat-column-pad-x, 24px); + box-sizing: border-box; + } + + @media (max-width: 863px) { + --chat-turn-rail-gutter: var(--chat-column-pad-x, 24px); + } +} + .chatTitleBar { display: flex; align-items: center; diff --git a/dashboard/src/pages/Chat/index.tsx b/dashboard/src/pages/Chat/index.tsx index 95f378ca..ff70c872 100644 --- a/dashboard/src/pages/Chat/index.tsx +++ b/dashboard/src/pages/Chat/index.tsx @@ -215,6 +215,7 @@ function ChatPageInner() { ); const [agentProfileOpen, setAgentProfileOpen] = useState(false); const [workspaceDrawerOpen, setWorkspaceDrawerOpen] = useState(false); + const [turnRailVisible, setTurnRailVisible] = useState(false); const { sessions, @@ -828,6 +829,13 @@ function ChatPageInner() { activeThreadId && !hasMessages && (historyLoading || !historyHydrated), ); const showWelcome = !hasMessages && !awaitingThreadHistory; + + useEffect(() => { + if (showWelcome || !agentChatReady || noAgents) { + setTurnRailVisible(false); + } + }, [showWelcome, agentChatReady, noAgents]); + const activeSession = useMemo(() => { if (!activeThreadId || showWelcome) return null; return ( @@ -913,7 +921,14 @@ function ChatPageInner() { }`} > {/* Main chat area */} -
+
{/* Mobile toolbar — session list + optional title + agent profile */} {isMobile && (
@@ -1031,6 +1046,7 @@ function ChatPageInner() { forkDisabledHint={forkDisabledHint} onAcpPermissionSelect={handleAcpPermissionSelect} onHitlDecision={handleHitlDecision} + onTurnRailVisibilityChange={setTurnRailVisible} onOpenBrowser={ hasBrowserTool && !isMobile ? openBrowserTab : undefined } diff --git a/dashboard/src/pages/Chat/utils/turnTimeline.test.ts b/dashboard/src/pages/Chat/utils/turnTimeline.test.ts new file mode 100644 index 00000000..74cd1055 --- /dev/null +++ b/dashboard/src/pages/Chat/utils/turnTimeline.test.ts @@ -0,0 +1,187 @@ +import { describe, expect, it } from "vitest"; +import type { ChatMessage } from "../hooks/useChat"; +import { groupConsecutiveAssistantMessages } from "./messageGrouping"; +import { + buildTurnTimelineItems, + mergeTurnPositions, + readElementDirection, + resolveActiveTurnId, + resolveFollowPinnedTurnId, + tickVisualForDistance, + truncatePreviewText, + visibleTurnWindow, +} from "./turnTimeline"; + +function msg( + role: ChatMessage["role"], + id: string, + extra?: Partial, +): ChatMessage { + return { + id, + role, + content: extra?.content ?? "", + status: "done", + timestamp: Date.now(), + ...extra, + }; +} + +const copy = { + userFallback: "(empty)", + emptyAssistant: "(no reply)", + runningAssistant: "(generating)", +}; + +describe("truncatePreviewText", () => { + it("falls back when empty", () => { + expect(truncatePreviewText([], "fallback")).toBe("fallback"); + }); + + it("truncates long text with ellipsis", () => { + const long = "a".repeat(300); + const out = truncatePreviewText([long], "x", 20); + expect(out.endsWith("...")).toBe(true); + expect(out.length).toBeLessThanOrEqual(20); + }); + + it("keeps at most two paragraphs", () => { + const out = truncatePreviewText(["one\n\ntwo\n\nthree"], "x", 220, 2); + expect(out).toBe("one\ntwo"); + }); +}); + +describe("tickVisualForDistance", () => { + it("returns idle when no focus", () => { + expect(tickVisualForDistance(0, undefined)).toMatchObject({ + tone: "idle", + scaleX: 1, + }); + }); + + it("peaks at focus and cascades neighbors", () => { + expect(tickVisualForDistance(3, 3).scaleX).toBe(2.6); + expect(tickVisualForDistance(2, 3).scaleX).toBe(1.7); + expect(tickVisualForDistance(1, 3).scaleX).toBe(1.25); + expect(tickVisualForDistance(0, 3).scaleX).toBe(1); + }); +}); + +describe("resolveActiveTurnId", () => { + it("picks the visible row closest to the viewport top", () => { + const id = resolveActiveTurnId({ + scrollOffsetPx: 100, + viewportHeightPx: 400, + positions: [ + { messageId: "a", start: 0, end: 80 }, + { messageId: "b", start: 120, end: 200 }, + { messageId: "c", start: 500, end: 580 }, + ], + }); + expect(id).toBe("b"); + }); + + it("falls back to the last row above the viewport", () => { + const id = resolveActiveTurnId({ + scrollOffsetPx: 300, + viewportHeightPx: 100, + positions: [ + { messageId: "a", start: 0, end: 50 }, + { messageId: "b", start: 100, end: 150 }, + { messageId: "c", start: 500, end: 550 }, + ], + }); + expect(id).toBe("b"); + }); +}); + +describe("buildTurnTimelineItems", () => { + it("indexes user turns with assistant previews", () => { + const messages = [ + msg("user", "u1", { content: "hello" }), + msg("assistant", "a1", { content: "world" }), + msg("user", "u2", { content: "again" }), + msg("assistant", "a2", { content: "ok", status: "streaming" }), + ]; + const groups = groupConsecutiveAssistantMessages(messages); + const items = buildTurnTimelineItems(messages, groups, copy, { + isStreaming: true, + }); + expect(items).toHaveLength(2); + expect(items[0]).toMatchObject({ + messageId: "u1", + userPreview: "hello", + assistantPreview: "world", + assistantPreviewKind: "text", + isRunning: false, + }); + expect(items[1]).toMatchObject({ + messageId: "u2", + isRunning: true, + }); + }); +}); + +describe("mergeTurnPositions", () => { + it("interpolates missing virtualized turns from neighbors", () => { + const merged = mergeTurnPositions({ + estimatedUnitHeight: 100, + turns: [ + { messageId: "u1", groupIndex: 0 }, + { messageId: "u2", groupIndex: 2 }, + { messageId: "u3", groupIndex: 4 }, + ], + measured: [{ messageId: "u1", start: 0, end: 80 }], + }); + expect(merged[0]).toEqual({ messageId: "u1", start: 0, end: 80 }); + expect(merged[1].start).toBe(200); + expect(merged[2].start).toBe(400); + }); +}); + +describe("resolveFollowPinnedTurnId", () => { + it("pins to the latest turn while following", () => { + expect( + resolveFollowPinnedTurnId([{ messageId: "a" }, { messageId: "b" }], { + following: true, + }), + ).toBe("b"); + expect( + resolveFollowPinnedTurnId([{ messageId: "a" }], { following: false }), + ).toBeUndefined(); + }); +}); + +describe("visibleTurnWindow", () => { + it("returns full range when forceFull", () => { + expect( + visibleTurnWindow({ + count: 100, + scrollTop: 0, + viewportHeight: 100, + forceFull: true, + }), + ).toEqual({ start: 0, end: 100 }); + }); + + it("windows ticks with overscan", () => { + expect( + visibleTurnWindow({ + count: 100, + scrollTop: 140, + viewportHeight: 70, + rowPx: 14, + overscan: 2, + }), + ).toEqual({ start: 8, end: 17 }); + }); +}); + +describe("readElementDirection", () => { + it("reads rtl from document dir", () => { + document.documentElement.setAttribute("dir", "rtl"); + expect(readElementDirection(null)).toBe("rtl"); + document.documentElement.setAttribute("dir", "ltr"); + expect(readElementDirection(null)).toBe("ltr"); + }); +}); diff --git a/dashboard/src/pages/Chat/utils/turnTimeline.ts b/dashboard/src/pages/Chat/utils/turnTimeline.ts new file mode 100644 index 00000000..858a6085 --- /dev/null +++ b/dashboard/src/pages/Chat/utils/turnTimeline.ts @@ -0,0 +1,330 @@ +import type { ChatMessage } from "../hooks/useChat"; +import { deriveMessageContent } from "./messageContent"; +import type { MessageGroup } from "./messageGrouping"; + +export const TURN_TIMELINE_MIN_TURNS = 2; +export const TURN_TIMELINE_MIN_WIDTH_PX = 864; +export const TURN_TIMELINE_MAX_PREVIEW_CHARS = 220; +export const TURN_TIMELINE_MAX_PREVIEW_PARAGRAPHS = 2; +export const TURN_TIMELINE_ROW_PX = 14; +/** Window ticks when the rail grows past this many user turns. */ +export const TURN_TIMELINE_VIRTUALIZE_THRESHOLD = 40; +export const TURN_TIMELINE_RAIL_OVERSCAN = 6; +export const TURN_TIMELINE_HOVER_OPEN_DELAY_S = 0.12; +export const TURN_TIMELINE_HOVER_CLOSE_DELAY_S = 0.08; + +export interface TurnTimelineItem { + messageId: string; + groupIndex: number; + userPreview: string; + assistantPreview: string; + assistantPreviewKind: "text" | "empty" | "running"; + isRunning: boolean; +} + +export interface TurnTickVisual { + colorTone: "focus" | "muted"; + opacity: number; + scaleX: number; + tone: "peak" | "near" | "mid" | "idle"; +} + +export interface TurnTimelinePreviewCopy { + userFallback: string; + emptyAssistant: string; + runningAssistant: string; +} + +function splitPreviewParagraphs(text: string, maxParagraphs: number): string[] { + return text + .trim() + .split(/\n\s*\n/u) + .map((part) => part.replace(/\s+/gu, " ").trim()) + .filter(Boolean) + .slice(0, Math.max(1, maxParagraphs)); +} + +export function truncatePreviewText( + texts: string[], + fallback: string, + maxChars = TURN_TIMELINE_MAX_PREVIEW_CHARS, + maxParagraphs = TURN_TIMELINE_MAX_PREVIEW_PARAGRAPHS, +): string { + const paragraphs = splitPreviewParagraphs(texts.join("\n\n"), maxParagraphs); + if (paragraphs.length === 0) return fallback; + const joined = paragraphs.join("\n"); + const limit = Math.max(8, maxChars); + if (joined.length <= limit) return joined; + return `${joined.slice(0, limit - 3).trimEnd()}...`; +} + +export function tickVisualForDistance( + itemIndex: number, + visualFocusItemIndex: number | undefined, +): TurnTickVisual { + if (visualFocusItemIndex === undefined) { + return { colorTone: "muted", opacity: 0.58, scaleX: 1, tone: "idle" }; + } + const distance = Math.abs(itemIndex - visualFocusItemIndex); + if (distance === 0) { + return { colorTone: "focus", opacity: 1, scaleX: 2.6, tone: "peak" }; + } + if (distance === 1) { + return { colorTone: "muted", opacity: 0.86, scaleX: 1.7, tone: "near" }; + } + if (distance === 2) { + return { colorTone: "muted", opacity: 0.72, scaleX: 1.25, tone: "mid" }; + } + return { colorTone: "muted", opacity: 0.58, scaleX: 1, tone: "idle" }; +} + +export function resolveActiveTurnId(args: { + positions: Array<{ messageId: string; start: number; end: number }>; + scrollOffsetPx: number; + viewportHeightPx: number; +}): string | undefined { + const { positions, scrollOffsetPx, viewportHeightPx } = args; + if (positions.length === 0) return undefined; + const viewportStart = Math.max(0, scrollOffsetPx); + const viewportEnd = viewportStart + Math.max(1, viewportHeightPx); + const normalized = positions + .map((row) => { + const start = Math.max(0, row.start); + return { + messageId: row.messageId, + start, + end: Math.max(start, row.end), + }; + }) + .sort( + (a, b) => a.start - b.start || a.messageId.localeCompare(b.messageId), + ); + const visible = normalized.filter( + (row) => row.end >= viewportStart && row.start <= viewportEnd, + ); + if (visible.length > 0) { + return visible.reduce((best, row) => + Math.abs(row.start - viewportStart) < Math.abs(best.start - viewportStart) + ? row + : best, + ).messageId; + } + return ( + [...normalized].reverse().find((row) => row.start <= viewportStart) + ?.messageId ?? + normalized.find((row) => row.start > viewportStart)?.messageId + ); +} + +function messageText(message: ChatMessage): string { + return deriveMessageContent(message).textContent.trim(); +} + +export function buildTurnTimelineItems( + messages: ChatMessage[], + messageGroups: MessageGroup[], + copy: TurnTimelinePreviewCopy, + opts?: { isStreaming?: boolean }, +): TurnTimelineItem[] { + const groupIndexByMessageId = new Map(); + messageGroups.forEach((group, index) => { + for (const msg of group.messages) { + groupIndexByMessageId.set(msg.id, index); + } + }); + + const items: TurnTimelineItem[] = []; + for (let i = 0; i < messages.length; i++) { + const msg = messages[i]; + if (msg.role !== "user") continue; + const groupIndex = groupIndexByMessageId.get(msg.id); + if (groupIndex === undefined) continue; + + let assistant: ChatMessage | undefined; + for (let j = i + 1; j < messages.length; j++) { + const next = messages[j]; + if (next.role === "user") break; + if (next.role === "assistant" && messageText(next)) { + assistant = next; + } + } + + const isLastUser = !messages + .slice(i + 1) + .some((candidate) => candidate.role === "user"); + const isRunning = Boolean( + opts?.isStreaming && + isLastUser && + (!assistant || assistant.status === "streaming"), + ); + + let assistantPreviewKind: TurnTimelineItem["assistantPreviewKind"] = + "empty"; + let assistantPreview = copy.emptyAssistant; + if (assistant && messageText(assistant)) { + assistantPreviewKind = "text"; + assistantPreview = truncatePreviewText( + [messageText(assistant)], + copy.emptyAssistant, + ); + } else if (isRunning) { + assistantPreviewKind = "running"; + assistantPreview = copy.runningAssistant; + } + + items.push({ + messageId: msg.id, + groupIndex, + userPreview: truncatePreviewText([messageText(msg)], copy.userFallback), + assistantPreview, + assistantPreviewKind, + isRunning, + }); + } + return items; +} + +export function prefersReducedMotion(): boolean { + if (typeof window === "undefined" || !window.matchMedia) return false; + return window.matchMedia("(prefers-reduced-motion: reduce)").matches; +} + +export function alignElementToScrollerTop( + scroller: HTMLElement, + target: HTMLElement, + behavior: ScrollBehavior, +): void { + const top = + scroller.scrollTop + + target.getBoundingClientRect().top - + scroller.getBoundingClientRect().top; + if (behavior === "auto") { + scroller.scrollTop = top; + return; + } + scroller.scrollTo({ top, behavior }); +} + +/** Fallback height for virtualized turns that are not mounted yet. */ +export const TURN_TIMELINE_ESTIMATED_UNIT_HEIGHT_PX = 140; + +/** + * Fill in scroll positions for turns whose DOM nodes are not mounted + * (Virtuoso windowing) by interpolating from nearest measured neighbors. + */ +export function mergeTurnPositions(args: { + turns: Array<{ messageId: string; groupIndex: number }>; + measured: Array<{ messageId: string; start: number; end: number }>; + estimatedUnitHeight?: number; +}): Array<{ messageId: string; start: number; end: number }> { + const unit = Math.max( + 1, + args.estimatedUnitHeight ?? TURN_TIMELINE_ESTIMATED_UNIT_HEIGHT_PX, + ); + const measuredById = new Map( + args.measured.map((row) => [row.messageId, row] as const), + ); + const measuredByGroup = new Map< + number, + { start: number; end: number; groupIndex: number } + >(); + for (const turn of args.turns) { + const known = measuredById.get(turn.messageId); + if (!known) continue; + measuredByGroup.set(turn.groupIndex, { + start: known.start, + end: known.end, + groupIndex: turn.groupIndex, + }); + } + + return args.turns.map((turn) => { + const known = measuredById.get(turn.messageId); + if (known) return known; + + let nearest: + | { dist: number; start: number; end: number; groupIndex: number } + | undefined; + for (const candidate of measuredByGroup.values()) { + const dist = Math.abs(candidate.groupIndex - turn.groupIndex); + if (!nearest || dist < nearest.dist) { + nearest = { ...candidate, dist }; + } + } + + if (nearest) { + const delta = (turn.groupIndex - nearest.groupIndex) * unit; + const start = nearest.start + delta; + return { + messageId: turn.messageId, + start, + end: start + unit, + }; + } + + const start = turn.groupIndex * unit; + return { + messageId: turn.messageId, + start, + end: start + unit, + }; + }); +} + +/** Prefer the latest turn while the list is pinned to the bottom / following. */ +export function resolveFollowPinnedTurnId( + turns: Array<{ messageId: string }>, + options: { following: boolean }, +): string | undefined { + if (!options.following || turns.length === 0) return undefined; + return turns[turns.length - 1]?.messageId; +} + +export function resolveFlashTarget(anchor: HTMLElement): HTMLElement { + const bubble = + anchor.querySelector('[class*="userBubble"]') ?? + anchor.querySelector('[class*="messageBubble"]'); + return bubble ?? anchor; +} + +/** Inclusive-exclusive window of tick indices to mount in the rail. */ +export function visibleTurnWindow(args: { + count: number; + scrollTop: number; + viewportHeight: number; + rowPx?: number; + overscan?: number; + forceFull?: boolean; +}): { start: number; end: number } { + const count = Math.max(0, args.count); + if (count === 0) return { start: 0, end: 0 }; + if (args.forceFull) return { start: 0, end: count }; + const rowPx = Math.max(1, args.rowPx ?? TURN_TIMELINE_ROW_PX); + const overscan = Math.max(0, args.overscan ?? TURN_TIMELINE_RAIL_OVERSCAN); + const start = Math.max(0, Math.floor(args.scrollTop / rowPx) - overscan); + const end = Math.min( + count, + Math.ceil((args.scrollTop + Math.max(1, args.viewportHeight)) / rowPx) + + overscan, + ); + return { start, end: Math.max(start, end) }; +} + +export function readElementDirection( + el: Element | null | undefined, +): "ltr" | "rtl" { + if (typeof document === "undefined") return "ltr"; + const withDir = + el && typeof el.closest === "function" ? el.closest("[dir]") : null; + const attr = ( + withDir?.getAttribute("dir") || + document.documentElement.getAttribute("dir") || + "" + ).toLowerCase(); + if (attr === "rtl" || attr === "ltr") return attr; + if (typeof getComputedStyle === "function" && el) { + const computed = getComputedStyle(el).direction.toLowerCase(); + if (computed === "rtl") return "rtl"; + } + return "ltr"; +} From ff16453146b8a71dbb9610dfcf90a80341be382b Mon Sep 17 00:00:00 2001 From: HUANG Cheng Date: Wed, 2 Sep 2026 19:08:01 +0800 Subject: [PATCH 21/58] docs(changelog): note chat turn timeline rail --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bbd840a..e1e938ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### 新增 +- 聊天消息列表左侧回合时间轴:按用户回合显示刻度,悬停预览、点击跳转、滚动联动;宽屏且至少两轮对话时显示 - 飞书频道改为官方 `lark-oapi` 扫码创建应用,凭据自动回填(不再走浏览器 CDP) - 远程手机:主机缺少 Docker 时自动安装——纯测速选择安装源(官方 download.docker.com 与境内镜像竞速,官方最快则不设 DOWNLOAD_URL),通过**内置的官方 get.docker.com 脚本**(`scripts/linux/v1.0/install-docker.sh`,含 TencentOS/OpenCloudOS releasever 映射等增强)安装;安装后按腾讯云镜像加速可达性决定是否写入 `registry-mirrors`(不检测地区,连不上则跳过)。自动安装失败时回退为提示用户手动安装。 - Docker 自动安装报错兼容:脚本输出尾部按已知失败模式(不支持的发行版、无 root 权限、网络/curl 失败、包管理器锁死、GPG 密钥、磁盘满、已有 Docker)追加本地化修复提示;脚本启动失败、长时间无输出(卡死看门狗)、脚本缺失均有独立提示;重启失败提示手动启动命令。 From 09403976c88429481874394dbcfd800fc7a0336c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=84=E7=94=9F?= <67680641+Bosheng0422@users.noreply.github.com> Date: Thu, 3 Sep 2026 10:20:08 +0800 Subject: [PATCH 22/58] Feature/reload ws polish 0902 (#529) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: schedule proactive care for agents that never saved config Proactive care defaults to on, but the scheduler only listed persisted enabled rows, so most experts never entered the push loop. * fix: attach gateway connector tools without rebuilding the agent prepare_chat_mcp rebuilt the agent whenever a builtin MCP server was missing from the live runtime. For gateway-mode connectors that rebuild is pure loss: they carry no HTTP transport, their tools are built in-process from stored credentials, and _post_start_agent runs the very same injection at the end anyway. Meanwhile the rebuild drops the harness instance and with it the checkpointer pool an in-flight turn is still writing to. Split the missing names on connector mode: gateway ones refresh their credentials and inject into the running agent, the rest keep the existing reload path. Co-authored-by: Cursor * fix: await cancellation on scheduler shutdown, and keep its sleeps out of tests ProactiveCareScheduler.shutdown() cancelled each task and returned without awaiting it, so a loop parked in a multi-hour sleep could outlive the shutdown that was supposed to end it. It now gathers the cancelled tasks before returning. Proactive care defaults to on, so creating an agent starts one of those sleeps. pytest-asyncio waits for leftover tasks before fixture teardown, which hangs the suite. octop_client shuts the scheduler down and calls the new suspend() so nothing reschedules; an autouse fixture covers tests that boot OctopServer another way. The scheduler's own unit tests opt out. suspend() exists for the tests. The alternative — every test remembering to tear the scheduler down — is the arrangement that produced the hang. * refactor: drive websockets on one event loop and drop the cross-loop workaround starlette's sync TestClient runs the app on its own anyio portal loop. That left the process with two loops over one OctopServer, so primitives bound to a loop and shared by both — AgentManager._lock — deadlocked or raised "bound to a different event loop". The tests worked around it by running the ws session in a worker thread. tests.support.http now speaks ASGI directly, so the handler, the gateway workers and the test all share one loop, the way uvicorn runs it in production. That removes the reason the production handlers marshalled every outbound frame across loops with run_coroutine_threadsafe + wrap_future. The comment on that code named the cause outright — "this handler may run on a different loop (e.g. starlette's TestClient portal)" — so it was test-shaped machinery sitting on the path of every frame the dashboard receives. Both handlers now await the send directly. * update harness-agent & harness-memory --------- --- pyproject.toml | 4 +- src/octop/api/routers/chat/notify_ws.py | 10 +- src/octop/api/routers/chat/ws.py | 12 +- src/octop/infra/agents/manager.py | 65 +++++ src/octop/infra/connectors/builder.py | 17 ++ .../infra/db/repos/proactive_care_config.py | 41 ++- src/octop/infra/proactive/scheduler.py | 47 ++- src/octop/infra/server.py | 1 + tests/conftest.py | 26 ++ tests/integration/test_chat_ws.py | 275 ++++-------------- tests/integration/test_e2e_golden_path.py | 36 +-- tests/integration/test_notifications_ws.py | 78 ++--- tests/support/app.py | 11 +- tests/support/http.py | 160 ++++++++-- tests/unit/agents/test_mcp_tool_cache.py | 55 ++++ tests/unit/proactive/test_scheduler.py | 81 ++++++ uv.lock | 16 +- 17 files changed, 555 insertions(+), 380 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c8b1b020..fd69f11d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,8 +21,8 @@ dependencies = [ "apscheduler>=3.10,<4", "argon2-cffi>=23.1", "pyjwt>=2.8", - "orcakit-harness-agent[all]>=1.0.2", - "harness-memory>=0.9.7", + "orcakit-harness-agent[all]>=1.0.3", + "harness-memory>=0.9.8", "harness-gateway>=0.9.3", "lark-oapi>=1.5.5", "cryptography>=41", diff --git a/src/octop/api/routers/chat/notify_ws.py b/src/octop/api/routers/chat/notify_ws.py index 2b3f9cec..39d2df36 100644 --- a/src/octop/api/routers/chat/notify_ws.py +++ b/src/octop/api/routers/chat/notify_ws.py @@ -2,7 +2,6 @@ from __future__ import annotations -import asyncio import contextlib import json import logging @@ -46,20 +45,13 @@ async def dashboard_notifications_ws( connection_id = uuid.uuid4().hex await websocket.accept() - # Harness/gateway workers run on the server loop; this handler may run on - # another (e.g. Starlette TestClient). Marshal frames onto the socket loop. - ws_loop = asyncio.get_running_loop() - - async def _emit_frame(frame: dict[str, Any]) -> None: + async def send_frame(frame: dict[str, Any]) -> None: if websocket.application_state != WebSocketState.CONNECTED: return await websocket.send_text( json.dumps(frame, ensure_ascii=False, default=json_chunk_default), ) - async def send_frame(frame: dict[str, Any]) -> None: - await asyncio.wrap_future(asyncio.run_coroutine_threadsafe(_emit_frame(frame), ws_loop)) - hub.register(connection_id, send_frame, user_id=user.id) try: diff --git a/src/octop/api/routers/chat/ws.py b/src/octop/api/routers/chat/ws.py index 02fcb790..910c3fda 100644 --- a/src/octop/api/routers/chat/ws.py +++ b/src/octop/api/routers/chat/ws.py @@ -2,7 +2,6 @@ from __future__ import annotations -import asyncio import contextlib import json import logging @@ -68,22 +67,13 @@ async def dashboard_chat_ws( connection_id = uuid.uuid4().hex await websocket.accept() - # The harness/gateway workers run on the server event loop, but this - # handler may run on a different loop (e.g. starlette's TestClient portal). - # Marshal outbound frames onto the loop that owns this WebSocket so - # cross-loop sends don't deadlock. - ws_loop = asyncio.get_running_loop() - - async def _emit_frame(frame: dict[str, Any]) -> None: + async def send_frame(frame: dict[str, Any]) -> None: if websocket.application_state != WebSocketState.CONNECTED: return await websocket.send_text( json.dumps(frame, ensure_ascii=False, default=json_chunk_default), ) - async def send_frame(frame: dict[str, Any]) -> None: - await asyncio.wrap_future(asyncio.run_coroutine_threadsafe(_emit_frame(frame), ws_loop)) - hub.register(connection_id, send_frame) try: diff --git a/src/octop/infra/agents/manager.py b/src/octop/infra/agents/manager.py index 08505dc4..17ea648f 100644 --- a/src/octop/infra/agents/manager.py +++ b/src/octop/infra/agents/manager.py @@ -53,6 +53,7 @@ ) from octop.infra.connectors.builder import ( build_mcp_server_configs_for_user, + gateway_mcp_server_names, inject_missing_gateway_tools, ) from octop.infra.connectors.service import ConnectorService @@ -71,6 +72,7 @@ from octop.infra.cron.manager import CronManager from octop.infra.db.repos.agents import AgentRow from octop.infra.db.services import RepoBundle + from octop.infra.proactive.scheduler import ProactiveCareScheduler from octop.infra.utils.paths import PathLayout logger = logging.getLogger(__name__) @@ -333,6 +335,7 @@ def __init__( self._expert_catalog = expert_catalog self._plugin_manager = plugin_manager self._cron_manager: CronManager | None = None + self._proactive_scheduler: ProactiveCareScheduler | None = None self._team_processor: Any | None = None self._harness_manager: HarnessAgentManager | None = None self._lock = asyncio.Lock() @@ -403,6 +406,10 @@ def set_cron_manager(self, cron_manager: CronManager) -> None: """Attach the process-wide CronManager (must be set before boot()).""" self._cron_manager = cron_manager + def set_proactive_scheduler(self, scheduler: ProactiveCareScheduler) -> None: + """Attach the process-wide proactive-care scheduler (optional; used after create/delete).""" + self._proactive_scheduler = scheduler + def set_team_processor(self, team_processor: Any | None) -> None: """Attach harness TeamProcessor (GlobalProcessor); required before boot().""" self._team_processor = team_processor @@ -579,6 +586,8 @@ async def create( self._repos.audit_repo.write( actor=ACTOR_SYSTEM, action="agent.create", target=agent_id, payload=spec.name ) + if self._proactive_scheduler is not None: + self._proactive_scheduler.ensure_scheduled(agent_id) return row def _preserve_system_files_path(self, agent_id: str, cfg: dict[str, Any]) -> dict[str, Any]: @@ -678,6 +687,8 @@ async def delete(self, agent_id: str) -> None: except OSError: logger.exception("rmtree failed for %s; agent removed from DB anyway", workspace_dir) self._repos.agent_repo.delete(agent_id) + if self._proactive_scheduler is not None: + self._proactive_scheduler.cancel(agent_id) self._repos.audit_repo.write(actor=ACTOR_SYSTEM, action="agent.delete", target=agent_id) async def start(self, agent_id: str) -> None: @@ -1352,6 +1363,23 @@ async def prepare_chat_mcp( continue agent.config.mcp_server_configs[name] = dict(spec) + gateway_missing: list[str] = [] + if builtin_missing and uid is not None: + gateway_names = gateway_mcp_server_names( + connector_repo=self._repos.connector_repo, + user_id=uid, + ) + gateway_missing = [n for n in builtin_missing if n in gateway_names] + builtin_missing = [n for n in builtin_missing if n not in gateway_names] + + if gateway_missing and uid is not None: + await self._attach_gateway_tools( + agent, + agent_id=agent_id, + user_id=uid, + server_names=gateway_missing, + ) + if builtin_missing: logger.info( "Reloading agent %s MCP tools (builtin_missing=%s)", @@ -1434,6 +1462,43 @@ async def prepare_chat_mcp( ) return still_missing + async def _attach_gateway_tools( + self, + agent: HarnessAgent, + *, + agent_id: str, + user_id: int, + server_names: list[str], + ) -> None: + """Add gateway connector tools to the running agent without rebuilding it. + + A rebuild would drop the harness instance (and with it the checkpointer + pool an in-flight turn still writes to) only to run the very same + in-process injection at the end of ``_post_start_agent``. + """ + repo = self._repos.connector_repo + for inst in repo.list_by_user(user_id): + if inst.status != "active" or inst.mcp_server_name not in server_names: + continue + try: + await self._connector_svc.ensure_fresh_credentials(inst.instance_id, inst.kind) + except Exception: + logger.exception( + "prepare_chat_mcp agent=%s: credential refresh failed for %s", + agent_id, + inst.mcp_server_name, + ) + inject_missing_gateway_tools( + agent, + svc=self._connector_svc, + connector_repo=repo, + user_id=user_id, + agent_id=agent_id, + mcp_server_configs=agent.config.mcp_server_configs, + ) + for name in server_names: + agent.config.mcp_server_configs.setdefault(name, {}) + # ------------------------------------------------------------------ # Settings persistence — push global policy into harness runtime # ------------------------------------------------------------------ diff --git a/src/octop/infra/connectors/builder.py b/src/octop/infra/connectors/builder.py index a7521c8e..d20bebb9 100644 --- a/src/octop/infra/connectors/builder.py +++ b/src/octop/infra/connectors/builder.py @@ -529,6 +529,23 @@ def build_mcp_server_configs_for_user( return configs +def gateway_mcp_server_names(*, connector_repo: Any, user_id: int) -> set[str]: + """MCP server names of *user_id*'s active gateway-mode connector instances. + + Gateway connectors carry no HTTP transport: their tools are built in-process + from stored credentials, so callers can attach them to a live agent instead + of rebuilding it. + """ + names: set[str] = set() + for inst in connector_repo.list_by_user(user_id): + if inst.status != "active": + continue + entry = get_catalog_entry(inst.kind) + if entry is not None and entry.mcp_mode == "gateway": + names.add(inst.mcp_server_name) + return names + + def inject_missing_gateway_tools( agent: Any, *, diff --git a/src/octop/infra/db/repos/proactive_care_config.py b/src/octop/infra/db/repos/proactive_care_config.py index 3214d1ca..c54a6945 100644 --- a/src/octop/infra/db/repos/proactive_care_config.py +++ b/src/octop/infra/db/repos/proactive_care_config.py @@ -92,25 +92,36 @@ def upsert(self, config: ProactiveCareConfig) -> None: ) def list_enabled(self) -> list[ProactiveCareConfig]: - """List the configurations of all agents that have proactive care push enabled. + """List proactive-care configs for every enabled agent that should be scheduled. + + Agents without a ``proactive_care_config`` row use the same defaults as + ``get()`` (enabled=True). An explicit ``enabled=0`` row opts out. + Disabled agents (``agents.enabled = 0``) are excluded. Returns: The list of enabled ProactiveCareConfig. """ with self._db.connect() as conn: rows = conn.execute( - "SELECT agent_id, enabled, active_hours_start, active_hours_end, " - "min_interval_hours, max_interval_hours " - "FROM proactive_care_config WHERE enabled = 1", + "SELECT a.agent_id, c.enabled, c.active_hours_start, " + "c.active_hours_end, c.min_interval_hours, c.max_interval_hours " + "FROM agents a " + "LEFT JOIN proactive_care_config c ON c.agent_id = a.agent_id " + "WHERE a.enabled = 1 AND (c.agent_id IS NULL OR c.enabled = 1)", ).fetchall() - return [ - ProactiveCareConfig( - agent_id=row[0], - enabled=bool(row[1]), - active_hours_start=row[2], - active_hours_end=row[3], - min_interval_hours=row[4], - max_interval_hours=row[5], - ) - for row in rows - ] + configs: list[ProactiveCareConfig] = [] + for row in rows: + if row[1] is None: + configs.append(ProactiveCareConfig(agent_id=row[0])) + else: + configs.append( + ProactiveCareConfig( + agent_id=row[0], + enabled=bool(row[1]), + active_hours_start=row[2], + active_hours_end=row[3], + min_interval_hours=row[4], + max_interval_hours=row[5], + ) + ) + return configs diff --git a/src/octop/infra/proactive/scheduler.py b/src/octop/infra/proactive/scheduler.py index 6c12cd60..8d8e5273 100644 --- a/src/octop/infra/proactive/scheduler.py +++ b/src/octop/infra/proactive/scheduler.py @@ -133,6 +133,7 @@ def __init__( self._session_repo = session_repo # agent_id -> asyncio.Task self._tasks: dict[str, asyncio.Task[None]] = {} + self._suspended = False def replace_persistence( self, @@ -147,11 +148,32 @@ def replace_persistence( self._care_service.replace_care_push_repo(care_push_repo) async def start_all(self) -> None: - """At system startup, register random scheduling tasks for all agents with enabled=true.""" + """At system startup, register random scheduling tasks for all agents with enabled=true. + + Includes agents that never saved a config row: proactive care defaults to on. + """ configs = self._config_repo.list_enabled() logger.info("ProactiveCareScheduler: started, found %d enabled agents", len(configs)) for cfg in configs: - self._schedule(cfg.agent_id) + self.ensure_scheduled(cfg.agent_id) + + def suspend(self) -> None: + """Stop creating new loops. Tests call this so leftover sleeps do not hang pytest.""" + self._suspended = True + + def ensure_scheduled(self, agent_id: str) -> None: + """Start the loop if this agent is enabled and not already scheduled.""" + if self._suspended: + return + if agent_id in self._tasks: + return + cfg = self._config_repo.get(agent_id) + if cfg.enabled: + self._schedule(agent_id) + logger.info( + "ProactiveCareScheduler: agent=%s scheduled (default enabled unless opted out)", + agent_id, + ) def reschedule(self, agent_id: str) -> None: """Cancel the current schedule and re-arrange the next trigger time with new config. @@ -182,14 +204,24 @@ def cancel(self, agent_id: str) -> None: task.cancel() async def shutdown(self) -> None: - """Shut down all scheduling tasks.""" - agent_ids = list(self._tasks.keys()) - for agent_id in agent_ids: - self.cancel(agent_id) + """Cancel every loop and wait so a long sleep cannot outlive the process.""" + pending: list[asyncio.Task[None]] = [] + for agent_id in list(self._tasks.keys()): + task = self._tasks.pop(agent_id, None) + if task and not task.done(): + task.cancel() + pending.append(task) + if pending: + await asyncio.gather(*pending, return_exceptions=True) logger.info("ProactiveCareScheduler: all scheduled tasks shut down") def _schedule(self, agent_id: str) -> None: """Create a scheduling task for an agent.""" + if self._suspended: + return + existing = self._tasks.get(agent_id) + if existing is not None and not existing.done(): + existing.cancel() task = asyncio.create_task( self._run_loop(agent_id), name=f"proactive_care_{agent_id}", @@ -199,7 +231,8 @@ def _schedule(self, agent_id: str) -> None: def _on_task_done(self, agent_id: str, task: asyncio.Task[None]) -> None: """Task-completion callback that handles exceptions.""" - self._tasks.pop(agent_id, None) + if self._tasks.get(agent_id) is task: + self._tasks.pop(agent_id, None) if task.cancelled(): return exc = task.exception() diff --git a/src/octop/infra/server.py b/src/octop/infra/server.py index fccf6062..8555809d 100644 --- a/src/octop/infra/server.py +++ b/src/octop/infra/server.py @@ -408,6 +408,7 @@ async def _boot_runtime(self, config: OctopConfig) -> None: config_repo=self.services.repos.proactive_care_config_repo, session_repo=self.services.repos.session_repo, ) + registry.set_proactive_scheduler(proactive_scheduler) await registry.boot() await gateway.refresh_media_backends() diff --git a/tests/conftest.py b/tests/conftest.py index 8d37cb87..bfd0bf9b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,6 +4,7 @@ from collections.abc import Iterator from pathlib import Path +from typing import Any import pytest @@ -43,6 +44,31 @@ def repo_root() -> Path: return _REPO_ROOT +# Creating an agent now starts a multi-hour asyncio.sleep (proactive care +# defaults to on). pytest-asyncio waits for leftover tasks before fixture +# teardown, so any test that boots OctopServer without going through +# ``octop_client`` would hang the suite. Scheduler unit tests opt out. +_PROACTIVE_SCHEDULER_TESTS = "tests/unit/proactive/test_scheduler.py" + + +@pytest.fixture(autouse=True) +def _suspend_proactive_care_loops( + request: pytest.FixtureRequest, + monkeypatch: pytest.MonkeyPatch, +) -> None: + if _module_path(request.node.nodeid) == _PROACTIVE_SCHEDULER_TESTS: + return + from octop.infra.proactive.scheduler import ProactiveCareScheduler + + monkeypatch.setattr(ProactiveCareScheduler, "ensure_scheduled", lambda self, _id: None) + + async def _start_all(self: Any) -> None: + return None + + monkeypatch.setattr(ProactiveCareScheduler, "start_all", _start_all) + monkeypatch.setattr(ProactiveCareScheduler, "_schedule", lambda self, _id: None) + + @pytest.fixture(autouse=True) def _isolated_user_home( tmp_path_factory: pytest.TempPathFactory, diff --git a/tests/integration/test_chat_ws.py b/tests/integration/test_chat_ws.py index cac5a6df..495f3d15 100644 --- a/tests/integration/test_chat_ws.py +++ b/tests/integration/test_chat_ws.py @@ -3,7 +3,6 @@ from __future__ import annotations import asyncio -import json from collections.abc import AsyncIterator from pathlib import Path from typing import Any @@ -11,7 +10,6 @@ import httpx import pytest -from starlette.testclient import TestClient from starlette.websockets import WebSocketDisconnect from tests.support.app import octop_client @@ -23,7 +21,11 @@ seed_openai_provider, ) from tests.support.fakes import FakeHarnessAgent -from tests.support.http import ws_token +from tests.support.http import chat_ws_path, ws_connect + + +def _chat_ws(c: httpx.AsyncClient, aid: str, auth: dict[str, str]) -> Any: + return ws_connect(c._octop_app, chat_ws_path(aid, auth)) # type: ignore[attr-defined] @pytest.fixture @@ -43,80 +45,38 @@ async def env(tmp_octop_home: Path) -> AsyncIterator[Any]: yield c, srv, fake, users["alice"], users["bob"], aid -def _consume_ws_turn_sync( - app: object, - aid: str, - token: str, - body: dict[str, Any], -) -> list[dict[str, Any]]: - chunks: list[dict[str, Any]] = [] - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws: - ws.send_json(body) - while True: - raw = ws.receive_text() - chunk = json.loads(raw) - chunks.append(chunk) - if chunk.get("type") in ("done", "error"): - break - return chunks - - -def _disconnect_ws_turn_sync( - app: object, - aid: str, - token: str, -) -> None: - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws: - ws.send_json({"type": "user_turn", "text": "cancel me"}) - ws.receive_text() - - -def _turn_then_rebind_sync( - app: object, +async def _turn_then_rebind( + c: httpx.AsyncClient, aid: str, - token: str, + auth: dict[str, str], thread_id: str, - gate_release: Any, + gate_release: asyncio.Event, ) -> list[dict[str, Any]]: """Start a turn on conn A, drop it after the first token, re-subscribe on B. The fake stream is gated between first and second token so B can subscribe while the turn is still active, then receive the remaining chunks. """ - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws_a: - ws_a.send_json( + async with _chat_ws(c, aid, auth) as ws_a: + await ws_a.send_json( { "type": "user_turn", "text": "slow please", "thread_id": thread_id, } ) - first = json.loads(ws_a.receive_text()) + first = await ws_a.receive_json() assert first.get("type") == "token" assert first.get("content") == "first" # A is closed; turn is blocked on gate_release (still active, not cancelled). frames: list[dict[str, Any]] = [] - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws_b: - ws_b.send_json({"type": "subscribe", "thread_id": thread_id}) - status = json.loads(ws_b.receive_text()) - frames.append(status) + async with _chat_ws(c, aid, auth) as ws_b: + await ws_b.send_json({"type": "subscribe", "thread_id": thread_id}) + frames.append(await ws_b.receive_json()) # Release the slow stream only after B is subscribed. gate_release.set() - for _ in range(50): - raw = ws_b.receive_text() - frame = json.loads(raw) - frames.append(frame) - if frame.get("type") in ("done", "error"): - break + frames.extend(await ws_b.drain_turn()) return frames @@ -138,14 +98,7 @@ async def slow_stream(request: dict[str, Any]) -> AsyncIterator[dict[str, Any]]: cancel_spy = MagicMock(wraps=srv.app_runtime.agent_registry.cancel_stream) srv.app_runtime.agent_registry.cancel_stream = cancel_spy - frames = await asyncio.to_thread( - _turn_then_rebind_sync, - c._octop_app, # type: ignore[attr-defined] - aid, - ws_token(alice_auth), - tid, - gate, - ) + frames = await _turn_then_rebind(c, aid, alice_auth, tid, gate) cancel_spy.assert_not_called() assert frames[0] == {"type": "turn_status", "thread_id": tid, "active": True} @@ -154,63 +107,46 @@ async def slow_stream(request: dict[str, Any]) -> AsyncIterator[dict[str, Any]]: assert frames[-1].get("type") == "done" -def _turn_with_second_subscriber_sync( - app: object, +async def _turn_with_second_subscriber( + c: httpx.AsyncClient, aid: str, - token: str, + auth: dict[str, str], thread_id: str, - gate_release: Any, + gate_release: asyncio.Event, ) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]: """Keep conn A open, subscribe conn B mid-turn; both receive remaining chunks.""" a_frames: list[dict[str, Any]] = [] b_frames: list[dict[str, Any]] = [] - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws_a: - ws_a.send_json( + async with _chat_ws(c, aid, auth) as ws_a: + await ws_a.send_json( { "type": "user_turn", "text": "slow please", "thread_id": thread_id, } ) - a_frames.append(json.loads(ws_a.receive_text())) - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws_b: - ws_b.send_json({"type": "subscribe", "thread_id": thread_id}) - b_frames.append(json.loads(ws_b.receive_text())) + a_frames.append(await ws_a.receive_json()) + async with _chat_ws(c, aid, auth) as ws_b: + await ws_b.send_json({"type": "subscribe", "thread_id": thread_id}) + b_frames.append(await ws_b.receive_json()) gate_release.set() - for _ in range(50): - frame = json.loads(ws_a.receive_text()) - a_frames.append(frame) - if frame.get("type") in ("done", "error"): - break - for _ in range(50): - frame = json.loads(ws_b.receive_text()) - b_frames.append(frame) - if frame.get("type") in ("done", "error"): - break + rest_a, rest_b = await asyncio.gather(ws_a.drain_turn(), ws_b.drain_turn()) + a_frames.extend(rest_a) + b_frames.extend(rest_b) return a_frames, b_frames -def _two_threads_turn_sync( - app: object, +async def _two_threads_turn( + c: httpx.AsyncClient, aid: str, - token: str, + auth: dict[str, str], tid_a: str, tid_b: str, *, text_a: str = "one", text_b: str = "two", ) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]: - """Run two live turns on different threads from one TestClient thread. - - Each sync ``TestClient`` spins a blocking anyio portal; driving two portals - from separate ``asyncio.to_thread`` workers deadlocks the server's - ``run_coroutine_threadsafe`` outbound path under pytest-asyncio. Interleaving - receives on one thread still exercises concurrent per-thread routing. - """ + """Run two live turns on different threads over two concurrent sockets.""" body_a: dict[str, Any] = { "type": "user_turn", "text": text_a, @@ -223,31 +159,10 @@ def _two_threads_turn_sync( "messages": [{"role": "user", "content": text_b}], "thread_id": tid_b, } - a_frames: list[dict[str, Any]] = [] - b_frames: list[dict[str, Any]] = [] - with ( - TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws_a, - TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws_b, - ): - ws_a.send_json(body_a) - ws_b.send_json(body_b) - pending = {"a": True, "b": True} - while pending["a"] or pending["b"]: - if pending["a"]: - frame = json.loads(ws_a.receive_text()) - a_frames.append(frame) - if frame.get("type") in ("done", "error"): - pending["a"] = False - if pending["b"]: - frame = json.loads(ws_b.receive_text()) - b_frames.append(frame) - if frame.get("type") in ("done", "error"): - pending["b"] = False - return a_frames, b_frames + async with _chat_ws(c, aid, auth) as ws_a, _chat_ws(c, aid, auth) as ws_b: + await ws_a.send_json(body_a) + await ws_b.send_json(body_b) + return await asyncio.gather(ws_a.drain_turn(), ws_b.drain_turn()) # type: ignore[return-value] async def test_ws_concurrent_subscribers_both_receive_later_chunks(env: Any) -> None: @@ -266,14 +181,7 @@ async def slow_stream(request: dict[str, Any]) -> AsyncIterator[dict[str, Any]]: agent.stream = slow_stream - a_frames, b_frames = await asyncio.to_thread( - _turn_with_second_subscriber_sync, - c._octop_app, # type: ignore[attr-defined] - aid, - ws_token(alice_auth), - tid, - gate, - ) + a_frames, b_frames = await _turn_with_second_subscriber(c, aid, alice_auth, tid, gate) assert a_frames[0].get("content") == "first" assert [f.get("content") for f in a_frames if f.get("type") == "token"] == ["first", "second"] @@ -298,14 +206,7 @@ async def tagged_stream(request: dict[str, Any]) -> AsyncIterator[dict[str, Any] agent.stream = tagged_stream - a_frames, b_frames = await asyncio.to_thread( - _two_threads_turn_sync, - c._octop_app, # type: ignore[attr-defined] - aid, - ws_token(alice_auth), - tid_a, - tid_b, - ) + a_frames, b_frames = await _two_threads_turn(c, aid, alice_auth, tid_a, tid_b) a_tokens = [f.get("content") for f in a_frames if f.get("type") == "token"] b_tokens = [f.get("content") for f in b_frames if f.get("type") == "token"] @@ -334,15 +235,9 @@ async def _consume_ws_turn( if extra: body.update(extra) - # Run the blocking starlette TestClient session in a worker thread so the - # server's event loop stays free to process the turn (see ws_chat_turn). - return await asyncio.to_thread( - _consume_ws_turn_sync, - c._octop_app, # type: ignore[attr-defined] - aid, - ws_token(auth), - body, - ) + async with _chat_ws(c, aid, auth) as ws: + await ws.send_json(body) + return await ws.drain_turn() async def test_ws_emits_chunks_then_done(env: Any) -> None: @@ -367,28 +262,23 @@ async def slow_stream(request: dict[str, Any]) -> AsyncIterator[dict[str, Any]]: cancel_spy = MagicMock(wraps=original_cancel) srv.app_runtime.agent_registry.cancel_stream = cancel_spy - await asyncio.to_thread( - _disconnect_ws_turn_sync, - c._octop_app, # type: ignore[attr-defined] - aid, - ws_token(alice_auth), - ) + async with _chat_ws(c, aid, alice_auth) as ws: + await ws.send_json({"type": "user_turn", "text": "cancel me"}) + await ws.receive_json() await asyncio.sleep(0.05) cancel_spy.assert_not_called() -def _subscribe_ws_sync( - app: object, +async def _subscribe_ws( + c: httpx.AsyncClient, aid: str, - token: str, + auth: dict[str, str], thread_id: str, ) -> dict[str, Any]: - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws: - ws.send_json({"type": "subscribe", "thread_id": thread_id}) - return json.loads(ws.receive_text()) + async with _chat_ws(c, aid, auth) as ws: + await ws.send_json({"type": "subscribe", "thread_id": thread_id}) + return await ws.receive_json() async def test_ws_subscribe_turn_status_idle(env: Any) -> None: @@ -397,13 +287,7 @@ async def test_ws_subscribe_turn_status_idle(env: Any) -> None: assert create.status_code == 201 tid = create.json()["thread_id"] - frame = await asyncio.to_thread( - _subscribe_ws_sync, - c._octop_app, # type: ignore[attr-defined] - aid, - ws_token(alice_auth), - tid, - ) + frame = await _subscribe_ws(c, aid, alice_auth, tid) assert frame == {"type": "turn_status", "thread_id": tid, "active": False} @@ -420,30 +304,10 @@ async def test_ws_subscribe_rejects_another_users_thread(env: Any) -> None: assert response.status_code == 201, response.text tid = response.json()["thread_id"] - frame = await asyncio.to_thread( - _subscribe_ws_sync, - c._octop_app, # type: ignore[attr-defined] - aid, - ws_token(alice_auth), - tid, - ) + frame = await _subscribe_ws(c, aid, alice_auth, tid) assert frame == {"type": "error", "message": f"thread {tid!r} not found"} -def _cancel_ws_turn_sync( - app: object, - aid: str, - token: str, - thread_id: str, -) -> None: - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={token}" - ) as ws: - ws.send_json({"type": "user_turn", "text": "cancel me", "thread_id": thread_id}) - ws.receive_text() # first token - ws.send_json({"type": "cancel", "thread_id": thread_id}) - - async def test_ws_cancel_frame_cancels_active_turn(env: Any) -> None: c, srv, _fake, alice_auth, _bob_auth, aid = env agent = srv.app_runtime.agent_registry.get_agent(aid) @@ -459,13 +323,10 @@ async def slow_stream(request: dict[str, Any]) -> AsyncIterator[dict[str, Any]]: cancel_spy = MagicMock(wraps=original_cancel) srv.app_runtime.agent_registry.cancel_stream = cancel_spy - await asyncio.to_thread( - _cancel_ws_turn_sync, - c._octop_app, # type: ignore[attr-defined] - aid, - ws_token(alice_auth), - tid, - ) + async with _chat_ws(c, aid, alice_auth) as ws: + await ws.send_json({"type": "user_turn", "text": "cancel me", "thread_id": tid}) + await ws.receive_json() # first token + await ws.send_json({"type": "cancel", "thread_id": tid}) for _ in range(40): if cancel_spy.called: @@ -487,24 +348,16 @@ async def test_ws_emits_error_frame_on_exception(env: Any) -> None: async def test_ws_bad_agent_rejected(env: Any) -> None: c, _srv, _fake, alice_auth, _bob_auth, _aid = env - with ( - pytest.raises(WebSocketDisconnect), - TestClient(c._octop_app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/01HMISSING0000000000000000/chat/ws?token={ws_token(alice_auth)}" - ), - ): - pass + with pytest.raises(WebSocketDisconnect): + async with _chat_ws(c, "01HMISSING0000000000000000", alice_auth): + pass async def test_ws_cross_user_rejected(env: Any) -> None: c, _srv, _fake, _admin_auth, bob_auth, aid = env - with ( - pytest.raises(WebSocketDisconnect), - TestClient(c._octop_app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{aid}/chat/ws?token={ws_token(bob_auth)}" - ), - ): - pass + with pytest.raises(WebSocketDisconnect): + async with _chat_ws(c, aid, bob_auth): + pass async def test_ws_accepts_skills_and_model(env: Any) -> None: diff --git a/tests/integration/test_e2e_golden_path.py b/tests/integration/test_e2e_golden_path.py index 962c77a5..7bc5f1a8 100644 --- a/tests/integration/test_e2e_golden_path.py +++ b/tests/integration/test_e2e_golden_path.py @@ -2,15 +2,12 @@ from __future__ import annotations -import asyncio -import json from typing import Any import pytest -from starlette.testclient import TestClient from tests.support.auth import bootstrap_admin -from tests.support.http import ws_token +from tests.support.http import ws_chat_turn @pytest.fixture @@ -18,37 +15,10 @@ async def env(env_fake_harness): yield env_fake_harness -def _ws_turn_sync(app: object, agent_id: str, token: str, text: str) -> list[dict[str, Any]]: - chunks: list[dict[str, Any]] = [] - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{agent_id}/chat/ws?token={token}" - ) as ws: - ws.send_json( - { - "type": "user_turn", - "text": text, - "messages": [{"role": "user", "content": text}], - } - ) - while True: - raw = ws.receive_text() - chunk = json.loads(raw) - chunks.append(chunk) - if chunk.get("type") in ("done", "error"): - break - return chunks - - async def _ws_turn( - client: object, agent_id: str, auth: dict[str, str], *, text: str = "Hello" + client: Any, agent_id: str, auth: dict[str, str], *, text: str = "Hello" ) -> list[dict[str, Any]]: - return await asyncio.to_thread( - _ws_turn_sync, - client._octop_app, - agent_id, - ws_token(auth), - text, # type: ignore[attr-defined] - ) + return await ws_chat_turn(client, agent_id, auth, text=text) async def test_full_golden_path(env: Any) -> None: diff --git a/tests/integration/test_notifications_ws.py b/tests/integration/test_notifications_ws.py index c62c1335..81c83b7f 100644 --- a/tests/integration/test_notifications_ws.py +++ b/tests/integration/test_notifications_ws.py @@ -2,20 +2,16 @@ from __future__ import annotations -import asyncio -import json -import threading from collections.abc import AsyncIterator from pathlib import Path from typing import Any import pytest -from starlette.testclient import TestClient from starlette.websockets import WebSocketDisconnect from tests.support.app import octop_client from tests.support.auth import auth_header, bootstrap_admin, ensure_users -from tests.support.http import ws_token +from tests.support.http import ws_connect, ws_token @pytest.fixture @@ -27,69 +23,47 @@ async def env(tmp_octop_home: Path) -> AsyncIterator[Any]: yield c, srv, users["alice"], users["bob"] +def _notifications_ws(c: Any, auth: dict[str, str] | None = None) -> Any: + query = f"?token={ws_token(auth)}" if auth else "" + return ws_connect(c._octop_app, f"/api/notifications/ws{query}") + + async def test_notifications_ws_ping_pong(env: Any) -> None: c, _srv, alice_auth, _bob_auth = env - with TestClient(c._octop_app).websocket_connect( # type: ignore[attr-defined] - f"/api/notifications/ws?token={ws_token(alice_auth)}" - ) as ws: - ws.send_json({"type": "ping"}) - assert json.loads(ws.receive_text()) == {"type": "pong"} + async with _notifications_ws(c, alice_auth) as ws: + await ws.send_json({"type": "ping"}) + assert await ws.receive_json() == {"type": "pong"} async def test_notifications_ws_missing_token_rejected(env: Any) -> None: c, _srv, _alice_auth, _bob_auth = env - with ( - pytest.raises(WebSocketDisconnect), - TestClient(c._octop_app).websocket_connect("/api/notifications/ws"), # type: ignore[attr-defined] - ): - pass + with pytest.raises(WebSocketDisconnect): + async with _notifications_ws(c): + pass async def test_notifications_ws_receives_user_push(env: Any) -> None: c, srv, alice_auth, _bob_auth = env user = srv.user_manager.get("alice") assert user is not None - token = ws_token(alice_auth) - connected = threading.Event() - frames: list[dict[str, object]] = [] - errors: list[BaseException] = [] - def _session() -> None: - try: - with TestClient(c._octop_app).websocket_connect( # type: ignore[attr-defined] - f"/api/notifications/ws?token={token}" - ) as ws: - ws.send_json({"type": "ping"}) - pong = json.loads(ws.receive_text()) - if pong != {"type": "pong"}: - raise AssertionError(f"unexpected pong: {pong!r}") - connected.set() - frames.append(json.loads(ws.receive_text())) - except BaseException as exc: - errors.append(exc) - connected.set() - - session_task = asyncio.create_task(asyncio.to_thread(_session)) - assert await asyncio.to_thread(connected.wait, 5) - if errors: - raise errors[0] - await srv.app_runtime.gateway.ws_hub.push_to_user( - user.id, - { - "type": "dashboard_push", - "agent_id": "a1", - "thread_id": "thr_1", - "text": "记得喝水", - "agent_name": "助手", - }, - ) - await asyncio.wait_for(session_task, timeout=5) - assert frames == [ - { + async with _notifications_ws(c, alice_auth) as ws: + await ws.send_json({"type": "ping"}) + assert await ws.receive_json() == {"type": "pong"} + await srv.app_runtime.gateway.ws_hub.push_to_user( + user.id, + { + "type": "dashboard_push", + "agent_id": "a1", + "thread_id": "thr_1", + "text": "记得喝水", + "agent_name": "助手", + }, + ) + assert await ws.receive_json() == { "type": "dashboard_push", "agent_id": "a1", "thread_id": "thr_1", "text": "记得喝水", "agent_name": "助手", } - ] diff --git a/tests/support/app.py b/tests/support/app.py index bf8e57c8..454844a0 100644 --- a/tests/support/app.py +++ b/tests/support/app.py @@ -54,14 +54,21 @@ async def octop_client( await srv.start() if bind_database and not srv.database_bound: await ensure_control_plane_bound(srv) + # Creating an agent now starts a random-interval sleep (default ON). + # pytest-asyncio waits for leftover tasks before fixture teardown, so + # those sleeps hang the suite. Production shutdown still cancels them. + if srv.app_runtime is not None: + await srv.app_runtime.proactive_scheduler.shutdown() + srv.app_runtime.proactive_scheduler.suspend() app = build_app(srv) try: async with httpx.AsyncClient( transport=httpx.ASGITransport(app=app), base_url="http://testserver", ) as client: - # Expose the ASGI app so tests can open WebSocket sessions via - # starlette's sync TestClient (httpx removed AsyncClient.websocket_connect). + # Expose the ASGI app so tests can open WebSocket sessions on + # this same event loop (tests.support.http.ws_connect); httpx + # removed AsyncClient.websocket_connect. client._octop_app = app # type: ignore[attr-defined] yield client, srv finally: diff --git a/tests/support/http.py b/tests/support/http.py index ff17e76b..1ade227e 100644 --- a/tests/support/http.py +++ b/tests/support/http.py @@ -3,39 +3,144 @@ from __future__ import annotations import asyncio +import contextlib import json +from collections.abc import AsyncIterator +from contextlib import asynccontextmanager +from typing import Any +from urllib.parse import unquote, urlsplit import httpx -from starlette.testclient import TestClient +from starlette.websockets import WebSocketDisconnect + +# A single-loop session should never stall; the cap keeps a regression from +# wedging the whole suite instead of failing this one test. +_WS_RECEIVE_TIMEOUT_S = 20.0 def ws_token(auth: dict[str, str]) -> str: return auth["Authorization"].split(" ", 1)[1] -def _consume_ws_chunks( - app: object, agent_id: str, token: str, body: dict[str, object] -) -> list[dict[str, object]]: - """Run the (blocking) starlette ``TestClient`` ws session in a worker thread. +class ASGIWebSocketSession: + """Drive an ASGI websocket endpoint on the caller's event loop. - starlette's sync ``TestClient.websocket_connect`` blocks the calling event - loop for the whole ``with`` block. The gateway workers that process the - turn run on that same loop, so blocking it would deadlock. Running the - session in a worker thread keeps the server loop free to stream chunks - back to the socket. + starlette's sync ``TestClient`` runs the app on its own anyio portal loop. + That gives the process two loops over one ``OctopServer``, and loop-bound + primitives shared by both (``AgentManager._lock``) then deadlock or raise + "bound to a different event loop". Speaking ASGI directly keeps the + handler, the gateway workers and the test on the same loop, exactly like + uvicorn in production. """ - chunks: list[dict[str, object]] = [] - with TestClient(app).websocket_connect( # type: ignore[attr-defined] - f"/api/agents/{agent_id}/chat/ws?token={token}", - ) as ws: - ws.send_json(body) + + def __init__(self, app: Any, path: str) -> None: + self._app = app + self._path = path + self._from_app: asyncio.Queue[dict[str, Any]] = asyncio.Queue() + self._to_app: asyncio.Queue[dict[str, Any]] = asyncio.Queue() + self._task: asyncio.Task[None] | None = None + + def _scope(self) -> dict[str, Any]: + url = urlsplit(self._path) + return { + "type": "websocket", + "asgi": {"version": "3.0", "spec_version": "2.3"}, + "http_version": "1.1", + "scheme": "ws", + "path": unquote(url.path), + "raw_path": url.path.encode("ascii"), + "query_string": url.query.encode("ascii"), + "root_path": "", + "headers": [(b"host", b"testserver")], + "client": ("testclient", 50000), + "server": ("testserver", 80), + "subprotocols": [], + "state": {}, + "app": self._app, + } + + async def _next_event(self, timeout: float) -> dict[str, Any]: + assert self._task is not None + getter: asyncio.Future[dict[str, Any]] = asyncio.ensure_future(self._from_app.get()) + done, _pending = await asyncio.wait( + {getter, self._task}, + timeout=timeout, + return_when=asyncio.FIRST_COMPLETED, + ) + if getter in done: + return getter.result() + getter.cancel() + with contextlib.suppress(asyncio.CancelledError): + await getter + if self._task in done: + # Surface a handler crash instead of a bare timeout. + self._task.result() + raise AssertionError("websocket handler returned without sending an event") + raise TimeoutError(f"no websocket event after {timeout:.0f}s") + + async def connect(self, timeout: float = _WS_RECEIVE_TIMEOUT_S) -> None: + self._task = asyncio.create_task( + self._app(self._scope(), self._to_app.get, self._from_app.put), + name=f"asgi-ws{self._path}", + ) + await self._to_app.put({"type": "websocket.connect"}) + event = await self._next_event(timeout) + if event["type"] == "websocket.close": + raise WebSocketDisconnect(event.get("code", 1000), event.get("reason")) + if event["type"] != "websocket.accept": + raise AssertionError(f"unexpected handshake event: {event['type']}") + + async def send_json(self, payload: Any) -> None: + await self._to_app.put( + {"type": "websocket.receive", "text": json.dumps(payload, ensure_ascii=False)}, + ) + + async def receive_json(self, *, timeout: float = _WS_RECEIVE_TIMEOUT_S) -> dict[str, Any]: + event = await self._next_event(timeout) + if event["type"] == "websocket.close": + raise WebSocketDisconnect(event.get("code", 1000), event.get("reason")) + raw = event.get("text") + if raw is None: + raw = bytes(event.get("bytes") or b"").decode("utf-8") + parsed: dict[str, Any] = json.loads(raw) + return parsed + + async def drain_turn(self, *, timeout: float = _WS_RECEIVE_TIMEOUT_S) -> list[dict[str, Any]]: + """Collect frames until the turn reports ``done`` or ``error``.""" + chunks: list[dict[str, Any]] = [] while True: - raw = ws.receive_text() - chunk = json.loads(raw) + chunk = await self.receive_json(timeout=timeout) chunks.append(chunk) if chunk.get("type") in ("done", "error"): - break - return chunks + return chunks + + async def close(self) -> None: + if self._task is None: + return + task = self._task + self._task = None + await self._to_app.put({"type": "websocket.disconnect", "code": 1000}) + try: + await asyncio.wait_for(task, timeout=_WS_RECEIVE_TIMEOUT_S) + except (asyncio.CancelledError, TimeoutError): + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task + + +@asynccontextmanager +async def ws_connect(app: Any, path: str) -> AsyncIterator[ASGIWebSocketSession]: + """Open an in-process websocket session against *app* on the current loop.""" + session = ASGIWebSocketSession(app, path) + try: + await session.connect() + yield session + finally: + await session.close() + + +def chat_ws_path(agent_id: str, auth: dict[str, str]) -> str: + return f"/api/agents/{agent_id}/chat/ws?token={ws_token(auth)}" async def ws_chat_turn( @@ -45,20 +150,15 @@ async def ws_chat_turn( *, mcp_servers: list[str] | None = None, text: str = "hi", -) -> list[dict[str, object]]: - body: dict[str, object] = { +) -> list[dict[str, Any]]: + body: dict[str, Any] = { "type": "user_turn", "text": text, "messages": [{"role": "user", "content": text}], } if mcp_servers is not None: body["mcp_servers"] = mcp_servers - # httpx dropped AsyncClient.websocket_connect; use starlette's sync TestClient - # in a worker thread (see _consume_ws_chunks). - return await asyncio.to_thread( - _consume_ws_chunks, - client._octop_app, # type: ignore[attr-defined] - agent_id, - ws_token(auth), - body, - ) + app = client._octop_app # type: ignore[attr-defined] + async with ws_connect(app, chat_ws_path(agent_id, auth)) as ws: + await ws.send_json(body) + return await ws.drain_turn() diff --git a/tests/unit/agents/test_mcp_tool_cache.py b/tests/unit/agents/test_mcp_tool_cache.py index efd6c0c0..52bc8f51 100644 --- a/tests/unit/agents/test_mcp_tool_cache.py +++ b/tests/unit/agents/test_mcp_tool_cache.py @@ -195,6 +195,61 @@ async def test_prepare_chat_mcp_injects_custom_from_cache() -> None: assert isinstance(injected[0], StructuredTool) +@pytest.mark.asyncio +async def test_prepare_chat_mcp_attaches_gateway_tools_without_reload() -> None: + """Gateway connectors inject in-process; rebuilding would drop the runtime. + + A rebuild ends in the very same injection, but first closes the harness + agent (and the checkpointer pool an in-flight turn still writes to) and + holds ``AgentManager._lock`` across workspace I/O. + """ + from octop.infra.agents.manager import AgentManager + from octop.infra.connectors.builder import mcp_server_name + + instance_id = "01TESTGATEWAYINSTANCE0001" + server = mcp_server_name("qq-mail", instance_id) + + inst = MagicMock() + inst.instance_id = instance_id + inst.kind = "qq-mail" + inst.status = "active" + inst.mcp_server_name = server + + agent = MagicMock() + agent._mcp_tools = [] + agent._mcp_tool_name_set = frozenset() + agent.config.mcp_server_configs = {} + + def _inject(tools: list[Any]) -> None: + agent._mcp_tools = [*tools, *agent._mcp_tools] + agent._mcp_tool_name_set = frozenset(str(getattr(t, "name", "")) for t in agent._mcp_tools) + + agent.inject_mcp_tools = MagicMock(side_effect=_inject) + + mgr = object.__new__(AgentManager) + mgr._repos = MagicMock() + mgr._repos.connector_repo.list_by_user.return_value = [inst] + mgr._connector_svc = MagicMock() + mgr._connector_svc.custom_harness_configs.return_value = {} + mgr._connector_svc.decrypt.return_value = {"email": "a@qq.com", "password": "code"} + mgr._connector_svc.ensure_fresh_credentials = AsyncMock(return_value={}) + mgr.get_agent = MagicMock(return_value=agent) + mgr.get_row = MagicMock(return_value=MagicMock()) + mgr._connector_uid_for = MagicMock(return_value=7) + mgr.reload_connectors = AsyncMock() + + failed = await mgr.prepare_chat_mcp("A1", [server], connector_user_id=7) + + # Asserted before the tool checks so a reintroduced rebuild reports itself + # rather than surfacing as "tools missing". + mgr.reload_connectors.assert_not_awaited() + assert failed == [] + assert agent.inject_mcp_tools.call_count == 1 + assert all(name.startswith(f"{server}_") for name in agent._mcp_tool_name_set) + assert server in agent.config.mcp_server_configs + mgr._connector_svc.ensure_fresh_credentials.assert_awaited_once_with(instance_id, "qq-mail") + + def test_wrap_tools_for_shared_use() -> None: lock = asyncio.Lock() inner = MagicMock() diff --git a/tests/unit/proactive/test_scheduler.py b/tests/unit/proactive/test_scheduler.py index 935ac3b7..c865fb9a 100644 --- a/tests/unit/proactive/test_scheduler.py +++ b/tests/unit/proactive/test_scheduler.py @@ -231,6 +231,27 @@ def test_config_repo_list_enabled(db: SqlitePool, config_repo: ProactiveCareConf assert aid2 not in enabled_ids +def test_config_repo_list_enabled_includes_default_on_agents( + db: SqlitePool, config_repo: ProactiveCareConfigRepo +): + """Agents with no config row default to enabled and must be scheduled.""" + uid = UserRepo(db).create(username="carol", password_hash="h", role="admin") + aid_default = new_ulid() + aid_off = new_ulid() + AgentRepo(db).create(agent_id=aid_default, user_id=uid, name="default-on") + AgentRepo(db).create(agent_id=aid_off, user_id=uid, name="opted-out") + config_repo.upsert(ProactiveCareConfig(agent_id=aid_off, enabled=False)) + + enabled = config_repo.list_enabled() + enabled_ids = {c.agent_id for c in enabled} + assert aid_default in enabled_ids + assert aid_off not in enabled_ids + default_cfg = next(c for c in enabled if c.agent_id == aid_default) + assert default_cfg.enabled is True + assert default_cfg.min_interval_hours == 5 + assert default_cfg.max_interval_hours == 24 + + # --------------------------------------------------------------------------- # ProactiveCareScheduler tests # --------------------------------------------------------------------------- @@ -314,3 +335,63 @@ async def test_scheduler_start_all_no_enabled( ) await scheduler.start_all() assert len(scheduler._tasks) == 0 + + +@pytest.mark.asyncio +async def test_scheduler_start_all_includes_default_on_agent( + agent_id: str, + config_repo: ProactiveCareConfigRepo, + db: SqlitePool, +): + """start_all should schedule agents that never saved a proactive-care row.""" + from octop.infra.db.repos.sessions import SessionRepo + + care_service = AsyncMock() + scheduler = ProactiveCareScheduler( + care_service=care_service, + config_repo=config_repo, + session_repo=SessionRepo(db), + ) + await scheduler.start_all() + assert agent_id in scheduler._tasks + scheduler.cancel(agent_id) + await asyncio.sleep(0.01) + + +@pytest.mark.asyncio +async def test_shutdown_cancels_long_sleep_quickly( + agent_id: str, + config_repo: ProactiveCareConfigRepo, + db: SqlitePool, +) -> None: + """A default-on loop sleeps for hours; shutdown must not wait that out.""" + from octop.infra.db.repos.sessions import SessionRepo + + scheduler = ProactiveCareScheduler( + care_service=AsyncMock(), + config_repo=config_repo, + session_repo=SessionRepo(db), + ) + scheduler.ensure_scheduled(agent_id) + assert agent_id in scheduler._tasks + await asyncio.wait_for(scheduler.shutdown(), timeout=2) + assert scheduler._tasks == {} + + +@pytest.mark.asyncio +async def test_suspend_skips_new_schedules( + agent_id: str, + config_repo: ProactiveCareConfigRepo, + db: SqlitePool, +) -> None: + from octop.infra.db.repos.sessions import SessionRepo + + scheduler = ProactiveCareScheduler( + care_service=AsyncMock(), + config_repo=config_repo, + session_repo=SessionRepo(db), + ) + scheduler.suspend() + scheduler.ensure_scheduled(agent_id) + await scheduler.start_all() + assert scheduler._tasks == {} diff --git a/uv.lock b/uv.lock index adacde35..e485d931 100644 --- a/uv.lock +++ b/uv.lock @@ -1343,11 +1343,11 @@ wheels = [ [[package]] name = "harness-memory" -version = "0.9.7" +version = "0.9.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/1e/31ed48da269f67eb18ba758974fa4d315cb0563d4e546bea52c985f21dd1/harness_memory-0.9.7.tar.gz", hash = "sha256:c1013bf5ce57f07393443a313b75e4f0e66f4e7158cc7295cb7e899d3b16719c", size = 34604833, upload-time = "2026-08-20T12:53:17.595Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/80/ef214b2b7d5bc7ee349236545c75f7ed13372c2c39c9b2042ac4df0c4df3/harness_memory-0.9.8.tar.gz", hash = "sha256:0c995845514c9525604b7799db3a7bdcb1e3f87b6b6f0f9cf4a40346276b5479", size = 1078796, upload-time = "2026-09-02T11:57:47.216Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/05/b239a8db324d79f29c917d51daa1a30753998f559579d393d7629306685a/harness_memory-0.9.7-py3-none-any.whl", hash = "sha256:c0872ebcc24144edb89b3a928de8df0cef80abea36ab1bd2a6ee7ca56e7f71ff", size = 345460, upload-time = "2026-08-20T12:53:12.719Z" }, + { url = "https://files.pythonhosted.org/packages/4d/61/b0057b399bfbc153bd2d207b1204254934038960e7e78a7426d9ec59f8ff/harness_memory-0.9.8-py3-none-any.whl", hash = "sha256:8621175ca605a50930f1253cb18c157b2881aecaab93d96e8ba2537845465957", size = 350227, upload-time = "2026-09-02T11:57:44.94Z" }, ] [[package]] @@ -2563,7 +2563,7 @@ requires-dist = [ { name = "fastembed", marker = "extra == 'local-embedding'", specifier = ">=0.4" }, { name = "harness-browser", specifier = ">=0.7.7" }, { name = "harness-gateway", specifier = ">=0.9.3" }, - { name = "harness-memory", specifier = ">=0.9.7" }, + { name = "harness-memory", specifier = ">=0.9.8" }, { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.27" }, { name = "huggingface-hub", marker = "extra == 'local-embedding'", specifier = ">=0.20" }, { name = "josepy", specifier = ">=2.2.0" }, @@ -2573,7 +2573,7 @@ requires-dist = [ { name = "mcp", specifier = ">=1.9,<2" }, { name = "mss", marker = "extra == 'desktop'", specifier = ">=9.0" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.10" }, - { name = "orcakit-harness-agent", extras = ["all"], specifier = ">=1.0.2" }, + { name = "orcakit-harness-agent", extras = ["all"], specifier = ">=1.0.3" }, { name = "pillow", specifier = ">=10.0" }, { name = "playwright", specifier = ">=1.40" }, { name = "playwright", marker = "extra == 'browser'", specifier = ">=1.40" }, @@ -2747,7 +2747,7 @@ wheels = [ [[package]] name = "orcakit-harness-agent" -version = "1.0.2" +version = "1.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deepagents" }, @@ -2765,9 +2765,9 @@ dependencies = [ { name = "mcp" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/c8/3985ab4520ea92b51506b5932e6f2f3c631cbe2066238234d4047a31ccfd/orcakit_harness_agent-1.0.2.tar.gz", hash = "sha256:a36df51c19b74042319f1d9d4de93f9439fcd5e429b9cbdf5a0523d9de2a9b97", size = 1197763, upload-time = "2026-09-01T08:56:24.118Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/27/c8cd2c2b77fa830f06dd753fd5810a6a6a352f6f086f706a4ec166d934e8/orcakit_harness_agent-1.0.3.tar.gz", hash = "sha256:545d1ff57f4666b721a56a6c595dfd4c63da0ef7bd954a91439a4eafeb1674ed", size = 1203668, upload-time = "2026-09-02T12:13:58.496Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/49/29585033f3be1bee13a76f7a517107540a79dd8011cc223edf74d1416ab5/orcakit_harness_agent-1.0.2-py3-none-any.whl", hash = "sha256:fa61ec1a6ceb13c3233eae3e6707526b9621b85d2dbfea4fa2694a14cbf37bfa", size = 1424971, upload-time = "2026-09-01T08:56:28.24Z" }, + { url = "https://files.pythonhosted.org/packages/a8/4e/11ec5fac7f7261ad0d012704437730b11ac5016ddc6cf32a5d5f254150d6/orcakit_harness_agent-1.0.3-py3-none-any.whl", hash = "sha256:e401ebef4d7ebd725bfcb94467b3d1afcc10ca3c7ee5682d571b0ece4c4681bf", size = 1430103, upload-time = "2026-09-02T12:13:56.456Z" }, ] [package.optional-dependencies] From 01499517e7d93125116e07dddddf80474cd5c611 Mon Sep 17 00:00:00 2001 From: liukewia Date: Wed, 2 Sep 2026 20:38:32 +0800 Subject: [PATCH 23/58] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E7=AE=A1=E7=90=86=E5=91=98=E5=87=AD=E6=8D=AE=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++---- README_CN.md | 7 ++++--- docker/README.md | 6 +++--- docker/README_CN.md | 6 +++--- fnos/README.md | 11 +++++++++++ 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9e3821c4..0fcde91d 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ This roadmap may shift as the community grows; treat it as indicative only. Octop can be installed on FnOS (飞牛 NAS) devices via the App Center as a `.fpk` package, either as a Docker-backed app or as a native (non-Docker) app. See [`fnos/README.md`](fnos/README.md) for the full packaging guide, the FPK build helper (`scripts/build-fpk.sh`), and the CI pipeline template (`.github/workflows/fnos-build-fpk.yml`). -For non-root FnOS installs, the WeCom/Feishu connector CLIs require the fix in [PR #406](https://github.com/TencentCloud/Octop/pull/406) (user-level npm fallback). +Initial admin credentials: `admin` / `Octop123` (change after first login). For non-root FnOS installs, the WeCom/Feishu connector CLIs require the fix in [PR #406](https://github.com/TencentCloud/Octop/pull/406) (user-level npm fallback). ## 🚀 Quick Start @@ -226,7 +226,7 @@ octop run --host 0.0.0.0 --port 8088 octop service start ``` -Open **http://127.0.0.1:8088**. Interactive `octop init` / the setup wizard asks you to choose a password (≥8 characters, letters and digits). Docker first-run credentials are written to `~/octop-login.txt`. +Open **http://127.0.0.1:8088**. With Docker first-run defaults, sign in as `admin` / `Octop123` and change the password immediately. Interactive `octop init` / the setup wizard asks you to choose a password (≥8 characters, letters and digits). ### Docker (recommended for production) @@ -240,17 +240,18 @@ docker run -d \ -p 8088:8088 \ -v octop-data:/data/.octop \ -e HOME=/data \ + -e OCTOP_DEFAULT_PASSWORD=Octop123 \ octop:latest ``` -Open `http://localhost:8088`. First-boot credentials are written to `~/octop-login.txt` (`/data/octop-login.txt` in the container); set `OCTOP_DEFAULT_PASSWORD` if you want to choose the initial password yourself. +Open `http://localhost:8088`. First boot creates an admin account with fixed default credentials `admin` / `Octop123` (written to `/data/.octop/credential.txt` in the container) — **not** a randomly generated password. Override the defaults via `OCTOP_ADMIN_USERNAME` / `OCTOP_DEFAULT_PASSWORD`. > **Password policy:** at least 8 characters with letters and digits. | Variable | Default | Description | |----------|---------|-------------| | `OCTOP_PORT` | `8088` | HTTP listen port | -| `OCTOP_DEFAULT_PASSWORD` | — | Optional first-run admin password (Docker bootstrap) | +| `OCTOP_DEFAULT_PASSWORD` | `Octop123` | First-run admin password (Docker bootstrap) | | `OCTOP_ADMIN_USERNAME` | `admin` | First-run admin username | | `OCTOP_DATA` | `~/.octop` | Host data directory (compose bind mount) | diff --git a/README_CN.md b/README_CN.md index 59bb0525..666f5f9f 100644 --- a/README_CN.md +++ b/README_CN.md @@ -222,7 +222,7 @@ octop run --host 0.0.0.0 --port 8088 octop service start ``` -打开 **http://127.0.0.1:8088**。交互式 `octop init` / 设置向导会让你自行设置密码(至少 8 位,且同时包含字母和数字)。Docker 首次启动的凭据会写入 `~/octop-login.txt`。 +打开 **http://127.0.0.1:8088**。Docker 首次初始化默认账号为 `admin` / `Octop123`,请立即修改密码。交互式 `octop init` / 设置向导会让你自行设置密码(至少 8 位,且同时包含字母和数字)。 ### Docker(推荐用于生产部署) @@ -236,17 +236,18 @@ docker run -d \ -p 8088:8088 \ -v octop-data:/data/.octop \ -e HOME=/data \ + -e OCTOP_DEFAULT_PASSWORD=Octop123 \ octop:latest ``` -打开 `http://localhost:8088`。首次启动的凭据会写入 `~/octop-login.txt`(容器内为 `/data/octop-login.txt`);若要自行指定初始密码,设置 `OCTOP_DEFAULT_PASSWORD`。 +打开 `http://localhost:8088`。首次初始化会以固定默认凭据创建管理员:`admin` / `Octop123`(并写入容器内 `/data/.octop/credential.txt`)——**并非随机生成**。可通过 `OCTOP_ADMIN_USERNAME` / `OCTOP_DEFAULT_PASSWORD` 覆盖默认值。 > **密码策略:** 至少 8 位,且同时包含字母和数字。 | 变量 | 默认值 | 说明 | |------|--------|------| | `OCTOP_PORT` | `8088` | HTTP 监听端口 | -| `OCTOP_DEFAULT_PASSWORD` | — | 可选,首次运行管理员密码(Docker 引导) | +| `OCTOP_DEFAULT_PASSWORD` | `Octop123` | 首次运行管理员密码(Docker 引导) | | `OCTOP_ADMIN_USERNAME` | `admin` | 首次运行管理员用户名 | | `OCTOP_DATA` | `~/.octop` | 宿主机数据目录(compose 挂载) | diff --git a/docker/README.md b/docker/README.md index e004dbf4..f1d2f26c 100644 --- a/docker/README.md +++ b/docker/README.md @@ -26,7 +26,7 @@ From the repository root: docker compose -f docker/docker-compose.yml up -d --build ``` -Open `http://localhost:8088`. First-boot credentials are written to `~/octop-login.txt` (`/data/octop-login.txt` in the container; override with `OCTOP_DEFAULT_PASSWORD`). Password must be ≥8 characters with letters and digits. +Open `http://localhost:8088`. Default credentials: `admin` / `Octop123` (applied only on first init; change immediately). Password must be ≥8 characters with letters and digits. A future release may randomize the first-boot password and write it only to `credential.txt`. **Option 2: Build script** @@ -58,7 +58,7 @@ bash docker/docker_build.sh |----------|---------|-------------| | `HOME` | `/data` | Must be `/data` so `~/.octop` maps to the data volume | | `OCTOP_PORT` | `8088` | HTTP listen port | -| `OCTOP_DEFAULT_PASSWORD` | — | Optional first-run admin password (≥8 chars, letters + digits) | +| `OCTOP_DEFAULT_PASSWORD` | `Octop123` | First-run admin password (≥8 chars, letters + digits) | | `OCTOP_ADMIN_USERNAME` | `admin` | Initial admin username | | `OCTOP_DATABASE_URL` | — | PostgreSQL DSN (or other `OCTOP_DATABASE_*`; see [configuration.md](../docs/configuration.md)) | | `OCTOP_DATABASE_DRIVER` | — | `sqlite` \| `postgresql` when overriding defaults via env | @@ -71,7 +71,7 @@ For Compose, put these in `docker/.env`. Values only reach the container if list - Compose mounts host `~/.octop` → container `/data/.octop` - `docker run` example uses named volume `octop-data` -- First boot runs `octop init`; credentials are written to `~/octop-login.txt` (`/data/octop-login.txt` in the container; override with `OCTOP_DEFAULT_PASSWORD`). +- First boot runs `octop init`; credentials are written to `/data/.octop/credential.txt` (default password `Octop123` unless `OCTOP_DEFAULT_PASSWORD` is set). Future: may randomize on first boot instead of a fixed default. ### Health check diff --git a/docker/README_CN.md b/docker/README_CN.md index c36fb630..7ed593f8 100644 --- a/docker/README_CN.md +++ b/docker/README_CN.md @@ -26,7 +26,7 @@ docker compose -f docker/docker-compose.yml up -d --build ``` -访问 `http://localhost:8088`。首次启动的凭据写入 `~/octop-login.txt`(容器内为 `/data/octop-login.txt`,可用 `OCTOP_DEFAULT_PASSWORD` 覆盖)。密码须 ≥8 位且同时包含字母和数字。 +访问 `http://localhost:8088`。默认凭据:`admin` / `Octop123`(仅在首次初始化时生效,请立即修改密码)。密码须 ≥8 位且同时包含字母和数字。后续版本可能改为首次启动随机生成并仅写入 `credential.txt`。 **方式二:构建脚本** @@ -58,7 +58,7 @@ bash docker/docker_build.sh |------|--------|------| | `HOME` | `/data` | 必须为 `/data`,数据目录映射到 `~/.octop` | | `OCTOP_PORT` | `8088` | HTTP 服务端口 | -| `OCTOP_DEFAULT_PASSWORD` | — | 可选,首次管理员密码(≥8 位,字母+数字) | +| `OCTOP_DEFAULT_PASSWORD` | `Octop123` | 首次管理员密码(≥8 位,字母+数字) | | `OCTOP_ADMIN_USERNAME` | `admin` | 首次管理员用户名 | | `OCTOP_DATABASE_URL` | — | PostgreSQL DSN(或其他 `OCTOP_DATABASE_*`,见 [configuration.md](../docs/configuration.md)) | | `OCTOP_DATABASE_DRIVER` | — | 通过环境变量覆盖时:`sqlite` \| `postgresql` | @@ -71,7 +71,7 @@ Compose 可在 `docker/.env` 中配置上述变量。注意:`.env` 只参与 C - Compose 默认将宿主机 `~/.octop` 挂载到容器 `/data/.octop` - `docker run` 示例使用命名卷 `octop-data` -- 首次启动会自动执行 `octop init`,凭据写入 `~/octop-login.txt`(容器内为 `/data/octop-login.txt`,可用 `OCTOP_DEFAULT_PASSWORD` 覆盖)。 +- 首次启动会自动执行 `octop init`,凭据写入容器内 `/data/.octop/credential.txt`(默认密码 `Octop123`,可用 `OCTOP_DEFAULT_PASSWORD` 覆盖)。后续计划改为首次启动随机生成密码。 ### 健康检查 diff --git a/fnos/README.md b/fnos/README.md index 6c47bc8b..1339475f 100644 --- a/fnos/README.md +++ b/fnos/README.md @@ -2,6 +2,17 @@ 本目录包含将 [TencentCloud/Octop](https://github.com/TencentCloud/Octop) 打包为飞牛 fnOS `.fpk` 安装包所需的全部文件,并附带自动同步上游 + 自动构建的 GitHub Actions。 +## 首次使用(初始账号) + +安装完成后打开应用(Docker 版:`http://<设备IP>:8088`,本地版:`http://<设备IP>:8089`),使用**初始管理员账号**登录: + +| 字段 | 值 | +|------|-----| +| 用户名 | `admin` | +| 密码 | `Octop123` | + +> 该密码是固定初始值(与官方 Docker 镜像默认一致),并非随机生成。**首次登录后请立即在头像菜单 →「修改密码」中更换**。若安装时通过环境变量自定义了 `OCTOP_ADMIN_USERNAME` / `OCTOP_DEFAULT_PASSWORD`,则以自定义值为准。 + ## 两种安装包 仓库同时产出 **两款** `.fpk`,用于满足不同部署偏好: From 31a24e15d8f17e248a576bee1f71f7541af6bd28 Mon Sep 17 00:00:00 2001 From: liukewia Date: Wed, 2 Sep 2026 19:31:57 +0800 Subject: [PATCH 24/58] feat(dashboard): add not-found page for unknown routes --- dashboard/public/octop-mascot-empty.png | Bin 0 -> 1687878 bytes dashboard/src/assets/mascot.ts | 2 +- .../src/components/NotFoundPage.module.less | 37 ++++++++++++++++++ .../src/components/NotFoundPage.test.tsx | 26 ++++++++++++ dashboard/src/components/NotFoundPage.tsx | 23 +++++++++++ dashboard/src/context/AgentContext.test.ts | 14 ++----- dashboard/src/locales/en.json | 2 + dashboard/src/locales/zh.json | 2 + dashboard/src/routes/controlAdminPath.test.ts | 12 +++++- dashboard/src/routes/index.tsx | 4 +- 10 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 dashboard/public/octop-mascot-empty.png create mode 100644 dashboard/src/components/NotFoundPage.module.less create mode 100644 dashboard/src/components/NotFoundPage.test.tsx create mode 100644 dashboard/src/components/NotFoundPage.tsx diff --git a/dashboard/public/octop-mascot-empty.png b/dashboard/public/octop-mascot-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..80cdad906f9108c33274587006f6678c20082aeb GIT binary patch literal 1687878 zcmb5W2{_f;_do8OC{u}qN`?>`OqF>!k+>x^D?((bjFBPJIYqh%rBLR&rF%=1G7l$0 zB10O;JX2;eJLk9G`rPm5>~nUX=l_46?sMx{)_bkjT6^ua*M6P%pT>rItJycQGchr( z{zHG?5hf;9@K;tQ)|KFYFH;-j!2j4>^iR1lF|8@Z{=-!`KRL(5w3g|QeS432;f7jH z-WL4hHgnzWLTZX(a80 zW4K&Kwe6T%wb>{bgLCZqx{PY$fLaUI0PcUEw5*@B4|k7Itrk#A(VvZj)%LLI?_*RO z1Jr7M#zB`d+>zH{o7RGqxepwB8r%-MLAXxjg>51dipbf4 z>`d*1#RIS#Jj~}HtieMkSc)W%G0nB*0mp>JHR+UmW~nxUAH)ih z#sJ{e@KzGGEjf!g$OfYTa&Z+1gHZD94cO&ld~#|qEFzJzV^S%2ve^10x}?d&Zr$e?jm|{nX3;nfU9l+E;$}H3Iq2C05{#w zm(Gt1tg*LYqcCu>TC+Mb9rlC3g4+d^O7MGg_)!3E!MX_z*bfs6av-A#&AS{6I?^TqcYmX09GESMcxzC;UK@ zljL*oZ)1q10CR(5)#<9+iS=^)@NWZiU3LI-U0%?}L9EGq)2n_iuH57@rgC`a*=DKb-g2PFA&1}F} zbK@~|@l_Au2U<$tGU3=@=Gp;t#MMVJfFjbA^h4nHtf))G;5-9ce!IA=~* z7&2K}7^`kPC=4!b)tl%{cus7F7Zg?)I6z^LN%jtc*I+fTixO-UhJpk@Vf~&_*bkC7 z-idCH165Z>;uurT+dc`nFvuMw7s5tifp`r9@wKIZE>ZhfbMC@Mfx?gz3kt)Q_^$jl;_W)S~HVOl` z5P&fYPUFH_D#4~1Y3kGg`9UJUNayqdAHVOlGB>;D$i0V~1Nv3#R6k(%4=GJXV!4o)i z?O;Dh{&+*i%)KvujLE)aU@h!N-9d6LY!m>O5C_0@6im>D!JTJSri(ZL*Zz(%E}8o; zYdA>=TsS*8;uyGTpo+b^?Y;)~!(O&yA8Zr=H~AC**Y?gDx+F%s>cg@LO8z&&`#4&FRS9(Y4Kqd?}~2mONm`$0L_ zkGcb771$^YTx_#;)JUK^iF{*KX3SjscmS^alWy1#0tb#R;>+NI%zedonXWA4$aXNp zMq%K3191EPT0>VBJXs1DGxrt9+`6_;f5LurBoeb3Gj|ODS2bCcuJ38#9+P1NR}6s5 zb(}6qNI&pxbVdPi^FZbflzcaa{ct%>_JNJUz)b?+`k5urb-K^lyh7pS1TuF3%iML( ztYJUM>v41&0S0a%$lR&hm+AaamhD-;;u3cz)GwT5m5+OeoJf;)v}Zta&!*pH5Q zVk&GDmbu{=xLvAr9eX_Y7+q6a1N z+R*JIq<(ynD8uG<9b~aU$q*0h$Cv@RA2terOO6HLTF1B2)n6fw**gqbEC90Da_y^& zaETy`;ph&L7`P8X7Kh#Tple%ar90NaMgedwO#rxOKgrOQx^|XDx`>0$Fbrg|T+O#b zupb>yiFAi~3|tZhu2nu=lKAqC?P3HM)L*i`qbFVcEynxP83jtjb&$mZ?}rs&KgRUP z?XXc8xQ!UNg{^e;*PnxatOGJv0A#MET+RdD5M@W@jzwG64X_ z39?Zxz9opxHoDk?g)E01*1X)5psf@=NLvSDYe4XnfM6WjDMELC#FT>4OXj=`cb4QD z{7bl8U_Kqil%DmJhLvs?p*!(oO0hOi&@&sh^f~?#qtYl$=~d62uu^G}Jj@h+ zBq0KuzN{2fT(W_mC#=*E|B_MZQA}yCCk)|`mPk>VbBKzY^6+rmC|t1k_lQ>@AxAl=`!^le{2$1 zD3mn@aIO#HCm7cW2dIN4mTdc>vQ2Wp4Z@2ID;DcPP@iS6zz0miOQHj#sXV}|Xp?KA zkP?xT1iFfVRkoYJtBXT#;JIStHW9|NONKrug1UTXIbi^JBk9T)s1zm=AXeMr=+4;U z?C61$pOwzCiWZlLmLli z2ktzC$Z`hU#bAB48XhwcZWDJf!g>UQ^>pxANQsCZfo>PWU`@kd9WLDsDT&-7!Z>xv z!1k6hJ}W^O*0qszTP_CcP5|qLP4e)TCC>T|PBdl=Rxla2%)KiB&so27=rf8w!$b=c zVqwvLIAW8akg#F~$N>Yc9+c;S3d<)xImWu0VFlb;pKY}ja_h+sOAqJ+5e%$K0M^0h zWyTO##wW==&iZ3TO4^dXRhLl-#V4f7|n0o{ZN#NZjY^ssDgjSYiv{D&6fTPs31J`uM(0e!Fx>>vhgdW8#wqp=?OFX)41V83C& zwne~oCpm6#{1jX`nE2`RiP5GVi5+jt*m_5UHXvg$gcBYt z{@{pZtgj|o0Ihj71yKmCXEK(W3=kv}09yEi3R_^&otCPMqS`=|-Bdvg7TsY9BaH!@ zybp--TvQN;MYmfr7TDzdKy;&z0^Eu`+h!@lXaH7Vw}dKeg|$jsZetWZ07SRNDM-Si zQkL*?6TxgX0HO*{6{KKMNy{yaS`C4yYQ6%z`99lfDa0sh3`Di76t=-yB`h~GiXH)? z2bvY&JBVlEmVAt&$AIXO9}4gx?wOb+V}(sV0YpzPD8LKk*%r$+j9Re@YsIk(KCeC# zwPa@$Jq<)JY}zFYyCq`DIPgj~1EQC%T*C^6G{0L*wIsodMRIZ{9RQbs2IJoUwE`@u* z;{MbU_cyfcEu)D(&fYsZ__TM{3GOw@qzq5elMuT(65k5G&)9penfx@oNm? zwj}s+)bb9|2inw@A@0H;maUtG5S80c-U)rM4Dn9@@nMi~U|A_PLMs<~1S>Vi*DzjZY6GQ#JC4A8?0{Iu zF-D~lKJ z`e5185)9Lw$KWQ`UaSK)eOW1JVhP{&_d+^IeE1p&EwIk5xMk+Zd9C-lLx(mg=wciUcA>2`b@1oASbRzT_7 z=O^IVJaTj^f|b`1CkeL}^Z|xx z`blL-hq6q^AJ7NO?yCW%)BcZOr4R9m& zV9}HKBFOe-|FbaBvim`>C~`zQjfqwyK7vK<@R|r)v6Fe_gECmO0jT=`Mz_%;w7r+51+J2@WjzE|szaXF z3)-J#JS8GXV$Xr+9<2q?Pa2OBEs}q*k4QBImbLgIENJ@lpgrDK8%|i6^l!b{-6bou-u-0z~H2C!35QzEh6x-6zkP9u6^ zTm9K|ptg7|1?~_~{97Cwl@+MHHKqj8=D(03`M3JBNkDA?uRm-pihm2#vIDiR$JRk= zk^Ecz**^%lj&;|Cp^QWFZwV!}cy^|wJ&UyU1cyiRZ+ZN=jhSXkI{9h+TC0!Z-$sr- z1&*EMDuzyP1Qh?47}(Ct%Tz>~h1noT{;l|;Ofu8hnYW`fz^)ZR@^1+x!oV>teP6KB zXb?m4Z}n%70=!cHH2QD2z_|>`zs0c$gXpRg#<^*fGP5H2w<4WlI2NMbHh60$A^ErB zzEZ%m$g*JAGZg=p7#P9A%OsRfcYTZG-$su83F5F$K$x}`5z+ix9?f;eOkP{N-JtLy z`L~3UQ~<8gd0&{=_Zh{%)t@y3;O5?R2H^fBZbSHY7VzJ=Ai20WHVXiB0eO5q3^a<1 zE7G|g0DV%m2->SjNG`6puQUMqc0~*fG>VH$3`_?=n=i~p(`FDel8YNTb`t=-NyGvM z8p*}wDZ+r3?D2tsMsjh9fzH5$HXd&%iJ6gHT#-&6fWplFM7WqBxw!gX1P~Oa+j>yO zqq(>|LSWe|Kj_&2n~UP&5(9(5T3#dX4c~=M1BDuKwUdF&& zkvkQzxkxT9kI;Hx?zUbP*jyt77Z;cd&|P!X8y=A(xws;ouE5;x6ENuo&BfLC(gx-- zN9#fL7tO`xNyN~7*n0{#7sbUT2BrdZ4PCwAhUWx|i!0Kp0?c(YPo(Ys0JOtM3T0m;P`>0A#`*nR;%$D_Hp;sxT#OfG+ZI0zL6Bo~($_!R`=d9F8114D9g zBgYpoaF%E@`b=tJv0|r++j;HQ(a)aCk zPIwdrgNx$g0&qcpy!)*?F9a@5)XB~Ad`R{PEHSqaI-)o(Nc z;3lO-!Qi5}xBy&`x$bW-?}joL$;A~pYXrbe%!99bNJuWO_z;%4cfWSR;G+1q09=r{ z^Yg0Ez=Rpezm3eu1mN0PR=_nE$-m{92AMmsbI2D07dhD_l#F2D{&@zjxk&!4ej}*4 z$;B@=L1h8Szs0ew0-4K6@L++!Me=V&I#~g@-0w%=1{yis6&D1VD;L-#0f9S);@=Vj ztwH9NE9b*C7s>Pm^F-ZQczA`xAS}NyqKuaAy zumLP1Wkou@00iTGPP8*SH2;>zaIG;@EOF!j?ZQFwZ$&yefzl1%Mr&{=c(; zUvVZQxwt%r;ItgOe-!!_Fp`Ta(y0y};63d`d*(rNad`}RfzlhJ&^Q{&#TDr^07~!8 zk3dS1b6*}q&|${DAH4)Yf#TwdbeaLBxfCbb;U^i%#pN*si5OeJ^p&>UBDuIYHajrS ztZpMN&?X|1i%Se_0ITM4IvJV~Be}SdE=6F`EN+g45*o?H<&hCdX38M*gwZ4o6OxOI zV>=1*+vF^VEp4eqa&d`)2SEYf@nWS8ZAnCOaS0`RK%xE8cuktNbRoI8BAr`6K@8nd zB0yVW-l4d-kuKO7^0?wzhzNq@;_Byw0jw0B%CXXJHb^e6xS1X(8VP4&A>J;Mi_0Se z4yGA(3SqRoT_hJ5zzP&~~z5UeOJZluc|0PAN(D`@*da&h%@;sLCew#%=jg%!!g)z3);qF2=9q46w| ziyP^(7Z|`2V+Ao8kX&4m&Jf_%cBe7}TDOo~TtbNiSXt3#p((UEh~(lD122Nz^I0zc zQQG|o$;HL7@q^N0;x1plg=TG`xwt&f!RDFq-L_hnX2qhpxZ-9fKoT~67JwMGNG`5^ z&T{~4UcUSW+87|YxREYr0kAE-nC;9{}sSx14r#Oh9sRd7gvIhm85_)wJIkMRRe*&A`#ha&G+w zXt0Rn;zqjo0knR4o`bI4kX&3s2_B%u5`AtT?FRD<#l2pw9g5=^7O0WW}%V%Q%X+?2y2_@Tr=y63Gh|Ks5#lRumVPP@)P%FMHTP-42qAODNF>qCwF%#~`gJE-s=!=aBq!q=*C6t^7qOYfIpe72*#U+$r6}F7e7CNsYxwwRq3qbUV90IYfWyC8A{l8YOe0gf?*&fX2sVI9fE)i*f> zV4aw*hUg7Q{;l|qodDJ=e%GOv6v@Bk`2t$fCxu!KP)my9-vU@cCFZqA9;aEoC6r8H*?Lk68nYq!w~-m3dnGJwK0vc=GLew{TX9a%lCqjSV5NON zl7CAmVFs}Z-1#0-isavlhXJKGOdhUi`P(O;~-->gBew6j}V<|`} zihoNe5eG{Da(oXdMe=XO!+_Eor&Hx1r6~R_p#(c|KJz=EL)!`=`M2Vn;FQT~`UGlR zk^Eai$!?(Z)y?;iQY8OYJPatkVfr_L*3#e1ZLyi-;8dt19wa70ov~?pt-o>oS?d~ znm@OPl%lw}gpzYWY0vO`NGXzwD;@@v-Y`#hfs~@SxP%f1pmb>I0Mun7xwzt-pm$}p z$nb)cqPVz(5_h0kA_1Iud? zp^zw&i!0u;7l;P$tb#<5TwL)MZ6F%DhvN_0<&7TKw&(!S2#te~D3XgS-m(vfM(Kt^ zqDU^Tc#AF&jX6{Wi6XhU;w}4uXxwoQ+INYdxwzsj*k~Z>%t1&L$;B0K(FdXrZ9*YY zBo|k_1#rSFQyr@yQ6v{vyyXB8eR`SWAT6%wNo~tPAe!!X5E4alam8B>Tln(H77W2$bU_e1Z;@PF z9GeoTevR(qRy1uGl8Z|W%m>ZwP@XsKmwb_2TtW$UgPC=vu!CmxBe}RDokgGrTNp8? z9d;tQxREZ_0M45+vZ}OjqPV#FIpAiAT+UQ;Xkl zae+?CYG@jVbkLFrZFvMDh-~$ z)$b4np$`yPgxXIu7nf}j?2xm=9Y(Zj(Og{p4hu}J=pxi1pt-ngi=eHY73*}SRg320 z>UU@XwN$A^+L}N@b8*=g!P=X>*eOY?7R|-g?*Nz4WJyjf+RJD(7grmf1eTxX#aWtq z@;fdr&n&or91ALyrODRcaB(BaCxK(>LjKT<3(du4E&@f;cf~mLWn(lKS9}bk73JS( zr>&=GF0M9S3yhHcBWGzg6dWGS#ntaf1$Y^)OQOy2-*9o+)WPw}i`XSb8wNBNSCpg& z7FfhFU#M9_b8*GTFuI{=C>P`znv2UU1Wvf>9^=q=zR_IVNb))m2T3_in$rF|E-sJP zRuEo;a_DtVXfCcc-Uwt(;>TI&g%@Zpu6{=@0M~6(I|MH3UAQL%s`_7|6T^1X%F#ga}PMbKiUO7kFgHydYPMga-i52L-w_DR zW!n)!TXTQIzvWRD1Lp3p%7oBG^KY3A0lM*B6VN*g(EM9bk{d9$zd)U)6F7ASTYlX*o6O;MBvw*l5nzl*gH(Xri z=O8F%Zj;bEH_=?&NU|;{5}_{Uv^(K%xVStySQ;O%fnEzKfaKz8<6{8OG7a9hXsZO8 zi>u#}2Y|k;<_x7Knv2WUf&oqHKTZoYnu{w+QUgGHP8C2$Cggi@0np&k*1?w)LtBC6 z&|F;R5ddz>lSFUcmT=8)y8K7aGlnv zLcIf;i>u#(krn)OBx$qwH(Xq{-2hyB;s7fxxM(h}DEN9kJJU|y1gNkh--|0QUI)ep z$!rgGXfyXWTwLaFfZFiN)g5B8qq(?|1nj#+`y<1ln|?g7z(?q9vFK5* zHvR)>%qNHdH+&u}< zHiUdHE&%r!09QJ-6ap8`#by2mHtttH-Jw@Pp}Dw`1nh`fo*YhF7JkFU<*^3`%DU5^ zylFERJ<|o?g3P@ir3&2wqq(^H$%O!1pQDnrW#KnmTsC)*xdX)S(1k6Uiz`YJ0^n*K zOMo`bAE@`@0&u}JE1Bb|4sBWZ4HuVr9%Sy6>t*O`0%$I7Bta5@YnTxZamkSH#pU4{ zz%uvX7w9F@=z*>_z7=F{UcD;xWf(LUS3eni&61#HDoMM)BHxP(GS?ks?!b*7_OzLc z=HiNy5;1TuCqP>~nu{x5cN~DbJ-rkH7tO_Go(Gvb_46|Az~nbv+(?2Q0Jnx54%J*V z7nf%M%UsjOIoixcPj&&gAanE9e#6COE(e(#=IX&gyP=`ExRGQL0Pfzp=d?BV zH(XpE0g$q&mQJ<7AD$&+leCX12xxDD!U2-7tO_GE(e(#_S0h%Ex7;3#a-0$3808K zxwiUT?Vl~&a94^i)Pzl2WN&0gQAoZ%PK5P#2Yzh}zwuu=fAUBixbkUYe(>j}%f&Ae zEy~NERXlTi{NY=9dAWnb(2{Ax=pW3+xw`vhUbOxgSz4N3T^q9P>K*-CPpY3dZz~#X z9`Ek=UEKdZL{dQ%zeVJ~f8vY?8$!rc1_WUyuY05)%G_&l&>s=pAI$p*41X*q*`##1 zy>i(GRxrsbxh6>dSK}}3wpKI``R@ZW=9urKuoet4PvM9$n{(Ij!cU`n`2YR0(HH;T znAzMPKhH$2sx^}gA+p|}`O`AOe5V-tZDIdt) z|2&cOK{AZb0ESD3cVfS3r))|ld*C`rLf5Ev^G?|O3g=a|h7z|v;v_x{X zE+d)*X2m3;0x!u_2ZSMKPs`yidX2;Bt0gbG01!;3AO<;bPcuy`#X4eufjrP+jYhsh{uWGe?`Ju z1Vkb}*wmPlPAJZRko)KFmqh@_c|;@w&gKCL1+7~fBwfotX9Ow#2E|H3B~CXR2UqT{Vsgy-&p|m zoL}kFe;sqy>A5zE-dQ1>jrjj?R(RRjTn^nWuu#T%<~tFvACR-*%gzoc@P@!bWLs`y zMLItqXSZO^rZyYzpc9JQN64kK{ntPL<6sEp;PdA?Z|H;^*5GXDY=@#LyX;^dm#!F{ zgVM}*f??Ys2Wyrc9Ma|uhlR+tYmNEnY=;~a!yL@sbXc8EC=RSgI@=)!!!ZX(p6|oa zh1?A6e5eg$->-_Q9Dr5SNl(cTeY#5ZV4d+Ioei{xs)%ETmL5E;Pbb75M|{Bl`z@nJ z4BIl)+d`~(V4<9M%)I$9SP-HzSf%QpIL&(p79y8PB)|I~C3W%-P*RnXW*$7DYeQtV z;mYXBIu!b&Sm;#>1%f2t(7VX9NnQ9Kdqx4aXVm=oASD9}kwWze@^s}H3Sso}B23>; zq7R`uKIDIFips^yA@orSF`y42w{Zbobf6G!#X{I!b=aOxh(DD0U_Bh2UwzH5UB716 zatPbQt=7RpIr_}JPvPi5A$-0Z!ucz_@vsoNOf*^le}(W67Q*(KhXeE>WXF}!wN_9F z-IhaGED}W5Ub@J$N*#cs^UIU}Z2JZ4un;b+mez!YNTCFR{QuY$`xBQ}VY)t!PAEPA zA7TtghqkX#rY?stK#yLiqhOt}FI{wKL&$>dZf3-TM{dvw^@CMN7aiIV%HXjOZfUt~ zMc2_P*D~|Q!O?+2D2mlJ{;vDHf5AfJIj{=pqC?x*gzm)}8-ba>r0C*YvmIAPx4>va zXtov$Axo}Q5M7*IG})xK!O?+2_yB9YW!@i>HiU&plVBCnEil?u$iKW5o_&6RL?1#e zJbjI%4PlNl7Q#@slOgmydjYpGeKChZh;34q5q!$PD|FIY5crAy}(~iE{ zcAQvOH;0`9d*b~L;gGzMW>FXd$-hP4fA3Wv95=^s~zE0<6f15BXCw$InjE;52 z$!w-eSP?wc13w{x=a0l{1WxvlD7|&3@v3K-%?byRb^vwgchLNvz}^5n4> zvgdK+ZOU7f$A4vyyVexb)W(6Cl{?KZW<6KwOKA$r;+<)=Q!K1~T<0)-Av)ZgF_{r%%1ioTnOxRu?)wS23BPC>)N}NokNwacr8u1UGODcqWBm}v zpyhn8yUWCDC)fF({x4_J{9jTN{0pds{^|>R+hqe{`9g(v8W~Z=H_K3VABxucqoVFS zm4EOR^^bs;f#LqQAJ5e~Xf7R%AGaRRQ&gKvJe1mA*5Z~G?^hOGmFlMCqu|-9=Vq>u zo-LZKmmHk@l`y02shu7uqqF#f`P{w}KLU;ug|EBF)iZ$P|CPDNf>}l!TXfpyaaZXN zl9!p?Cx#7~$_9@FnqNHiDc$PL{jQ`6I}&wG;~Cs8$_dJnZDxDs+~Q@a8(LPagU!#9 z3YBCY2N3Z~-HICi-weZxA`Q1%j7CTXd`c4Z(-JcB|Fn5CMfoNdMLayh|5F54Kx0Hj zyT#CGfOBp>b-1i%#BDMmA-&dfx~Oe%YH$P48A>OpnL&0Og29T`cwoS(0CYGi0}uItw=1q7B?4{@UUbQ*NkMaa7I(T&k(Oec!cnavM$lM4?^VG&$g*EBr)oH^3zK-iyh1x zs2{o5$bCbJ8Ah^jQNVG}?qPdp#w@cHi;z`Y+ynXu9cOkQaolTpT;29?Qkic^kS$;Q zoaC%D<-8B&o)2Yk$;Uy}?`Bii+00(kv^YOG!wAjwMiE8d4wbk6knB#9nf9dmyAB5h z#14m1yQf^J!u>w^RPPu0Gg>vCp44?Aom9<{;iX|;yP06AfdFSpS4}pb?1-=9T-R$^ z8BY(bO`aY}=X|^t_qlm3*4tj1f8%m#zRg3`hkt5XE}`i4y&7RB!&I&m z>S-+vzdA$1(QIqp)(E4~KO|FU0tbh-O%!}@XxQG#tD5roiGpo5dU`WG zrIkyAvtw`6Hxw&w-mH0NYgBe$_d`#Qg?!;NBg5)1T3WrY>X*Fsi)```wZK~ zF67URa9Fwzw;NeB&T%zdlwC}nql^F$%x8^4uO(1(1V$+py{{h@n~fCBO166S=k|Jy zHkH+nNG^1b>*Y0+dNy^<-uk?XWn`CHR{;CjB`qBnwwXW1g`_FExTW=^=B|Wi;?NG$ z(M}+k>ULbk`f8bhGHC}m^4QcX)!YFu#hkQsLV142Sf)Vr1G&(J#hXjpV~f8!Osn!v zwL4__#+{mx$s8Pgm_habVJG}@u2OG!YCv91ld>;fP<=g@N7CS9$=Vu!N=fEqzs2IW zp&Uwfx$jYCaaaDHM*mv9a@N%D&%bDvTs~2PfZ*AN6-x+^4KOe(Sugg0H5J>8`jUQG?WUYtc5N)S2MHu)OqpJ4eskwrYIvb@j|NX=#>;nQ^+@ z>SubUpw=qD=(_sP8Sjx%F8L!|yQMXV%)<5y?g5(`{OSrF!#uP7iZTa3et!HToe&ep zo1XV*dtz5_WP>8%X3Kt4ofoDqygJz|qQVt$Fd|sQGkd zo;_bw5U&o|JU)oe?vX>8UbQHpE%oC|i#wN0XIzAPUvOP-l7D^S0gnWh0M~8X_HFa@0C{o>bB?Y7;$QFHx zuL-CVtfkaQHcRFy*!)ZpD(bAMl+ls#QME07q3?XI5MUNT_;y`);UB>s+yXXbP* zZZ-$5R~pYBO{Cy_&ZZlZ=sKc;MP~Od@2y0<7Dv-hrTMwImc`6bPfN;rmC@v6AK!?k zAzWr}+=sk&z51E@9Q8Q^rNJWAqy+zpi16YUEt>-TJRE24^^Uw*x77AV&)AqkpqA7$ z&$nI+Zs-|X?Rsf8`B1opV`{}rVAS9lsWFSynN4>+G>cmv`#$>M?Njw^b8fcj%~RG= z_xpKw=;{cvmCZ6==iO*s@FXGiLCen7K@$%IeI6PUlxpic$QfUGipEyEHFb;{#9z!i zhx@s(O;1#7s?huE`ZoggZ!N>U1Vsr`ZwMP_KE178A~`nOJ@b>y;Vw_6Lx5Q+Z?7<*wRdWe<@%z zKeV+_>r^-wMKEYdxT3T&siJgTsiCuHo&Ti?|D>9>)@pudkkd+mWnFL5G~2X720xps zSZuy`QzkdtIH%{3&)?@w5BgcXR_njvWo#e8#xiWbqw8T#Qlsh@r|Dw(gl zq;V=@n@{^)jnCITbh*nG8&~NZOj+xM3!2>4J-4%*fI0^y5!EkDAFy>9i}< zY%9u>+07??t$6Q^ol{bMI$354SreVivq~c=2ZS{nFST!bEb2TYTz*4Mmv{Q;cvbEm zmQrqB>$3*BWB2Cm7n7NIt+H7~z3tQ3a9tJ>8F#MPWb7Ad>iXEKqhoXNjm&QOtQ!G= zjiC1D_)5=xPKzCN7Lpe67)GrOmg> z(|IO8N?3;CJ!8~-u|aE;Yij_=v$@0Bo?|y(X;FN4sm$58#TD4OtNP4_&rK95$3>`@ zI|{m}Ot}O?&MmefW@}<2yxd!L;6%$9FQ0@N()73f5c5a0c~HnEqV6 zIk$E}(Ot^QlS8NdK5xT;%YrThq7HA~LzR%l<0?O+ttz@yrju_7WqP-tWSL5N+qH{V zM_W`_VcRO^?y=yet&i4P1v&~pyQcMoltlb8|ER3RG)eWe$Tz}^(jKmPpvc!7J5`pWjMsAmNW(Px%jZkjt}(;N?E^ux4x>+L?J%# zZM}&9{J?GR!v^P@4oBw+`5(O~fAdPu?Tp&Et$PkxkA!FLOxD#39=QILaH}niOElK5 z`MQixnAnen;l>XZuj7+il588k_74u`cTwKxeH@`2&GMQ3IXk(eb=tgn>5p$}i)X*7 z&HHbRC~n#;?BDjdp&~7*kjryvYv$m^>hRGT6${dL3pV?D=VW5t6#bx8gqim-tJyjH z{Hg)nB8@T`_*6c2iKp(AtQd~h!0!<;n&lH;Mdm>5RqE)yo$WUs46CJC_`b81jA*W$ zVv94-+!S7(6w!Unu8T5zk7Bv#uB9^T8=y|99y~Ymx0k{~&WHSn*YZpL4HZgdy%Rr8 z59O?)q$hh7_(=y3r`f06te25E7M!`E+%fZ2)|qn`qvc?2c0%}pVA(Z%3C!b#1+1}%scVkg2VN? z#;v^H=Ju|X4qf@e?S zWx5k*lm4==yR!ZZecZvQpZ6B4nLU1X)l5*h#T&ZC4Qlj0LPdcYvx#8YsnzamR`tRx zp9Y^Ej`b5L`|MdZH)uWRHSM6TIp3`;L_MXhJX?8*+94aQC)qx-RnOv-VYp_Yx(dbe zeqzyQzN)WTD(%_5{&xC*7Pl6+if`J}Bz-5qt%^N2Rp8P-(mm~Ql@#Nel0Bx@T6%X< z(yQbi3+g V6VzW&i15AmLCbIzvD^#ocWv{mq$D7U|Z4Ilvt9~w=Q)=u8OCf4C9xHw= zad5h6EAPmzu011_%6EphNqswZws)vk!c8b{N4Fu5pB$eF^Yb@)f(&zyz$6=(MJrL5-5NDbOAG}#+Dc{k18bB}zxFyB(Cw`xFy@CU7tsJR$N z^`*T+!b{$o%JZY$Ba{HMkrAqAE2ZA3p|W17Yp6&5hn;gp=0arCkmhVfrb9ZR$}WFz zqWU@=`Z8R@g##CA;39>R;{9UOsGcrTAV%&rqk&B9$xlS>__R%@=InlEyVfPxPJTW0 zwQvOsm8-0`QnJB)ysUS;CbQLR=3wg^%C4%VC8L>Ds{#bLBu9rM!rMOyClzI#+9B+e zM|qQG_c_IH@4a`2{Jq*Q!pf;Ox)>*PztOZovfFv_X!zAB;~f#bN@bgM z{ljpZD^5pEa8=yWV6OGYj{fMLAmQF#eXwWRJmRuIgK)p`E2URs7mqjUSV&#k)GPHoy=u#}_D@+>fiFkf zH&v)S6yTDOdl12ybf>gGPaxI$rq9!yq`9LuTqO!a4@1&RaFqH>;p3MQm)@3W^!>=0 ztvIuivghi#cVhR%9`mdiir?0qbKl~%)S}w-DgK=vh4sQJ(TdZeKdTfgobKfJdgz}I zTy^==)@G+@*H6{*N^utFA6G3bo}(mpZZN2jjClL7GQWGagDY>TP%?j5o^|w zI1I5VY6t(5G3bm-U^W-RtM+CaF$Ed&DQ9=g{nIq1nOSzx(R)6c;y&TedrUT0gNstouCn-Ngb{VCa3bXoH}{F&X?KbMd&a2!{Ot7(3ZZ$or;>cO?!BPX7j>@6 z1>5c5Q;o6F!#k>`Khu4}9yH0IZxSQZOP{SZ4XgUzMRuLmjH|MHAz+n!;o0@s z%?m1eDq6m{7Z!JK<)>fbh)&z~My4xKVfw4@(2ncprVg>VIJn5L&+S*K4NN#Iyne^2 zYsu-^(X&Zw>|frc1`?|Mx;89E@RKth-G6+()h$#ft99aT`QnJ;+>iUu1N1Z#{L~{N ziZ^;n21HMK(juYkKKI$7fr; z#qGG5@uJ2OZ(JJvaRuy(no+G;3PpnXFsi zZtmDRmEh_z`=^uY(u2(jzWG|3bB9$`=g;03^b<=;^p{Bz)Vd#@I%=RNnZEi=L5qjf z$c#!xq$zLao=WX1i)cfY7ZyuRF9BY-36d~*54zDhwBi}%Ka zn!oi9E4PVQcjkqf7)Bdcd-6t}Qhw}v{6^7>4^jt8FYgc4cDt_8CGC^jZsK5GS+5}E zkH1=G7vjddaEy3!*UB60xA6}D&H^T1r8cI&{JgQ^9dGl*A?+dQ(^m!6pD@{W93H~= zJ^kMD!O=?Q-T9>*iF$jQ!sOrFb4`#xYE!Kdxv8k`QuxwkS6Q2PcMCY}Hp~}@h4_^U zetmaa;aPg9D{rSE=bZ5d&(Nc_=G7_N8iZLqHh7LU?qaR9T;mdSm% zU*jelFY{SWiCXDZ2kjS#&CX-TZn1sFYw*?y?~y;_#NYb#e)ph`qRJJc0GBC&#Btfb zO1rhbR|IPft%)cqjyEX&y4j#;16RJC!`AZ%s@p-u>=K65glx%-txiO<$qfd%+)v@RmSMFrS3U;n%@#l+q$~h^w z>yu~b)fDA0m74UY-@szHoyMQPqO0>>{KNP6rh?oKJ1B-b^My|BkGq^=l5p7TG3U}h zs)oujbJPcfHPeZihs~72q^GNz?mZcE99HkE6}VtJbh1B6tW2deKJ`ZYDx0vw>Pj_f zKP24BZcU9UYl=}yRz2ISz}xoskICz%rSciwW``>)tJiwwt_WNA#XDMbYih(tTQ7qX z6)QLOIkg094B1ikuu5G%_)sD7&n~;mMy4vMisd~TT4z6|*6DKi@pH0EXB`Tp+VD?2 z$ZY({`o4Na(f!A-A8$Bwz~AQ1a7|jSd@~=aeFz)HX?}fsJ%xVF7Hi-q#PR$|gq&Gv zsTJ_#5X_7>uZvu;2qn}srSQd#$f*@oIgG1jj%;@Im^!Dbaz#csoZ31u)-l@evk)L` zWLW&8p;xkde9CWWaB#)>yqxVjV`9>N>~EV9<8zI(Jpc6kx`2lE!_{SV@yEN@`na7q zbJ)w!{&2x%gA{>_tN$q#z06kDbWUpENUXw_!qt5%-T1r?)(iOQh&Jx}r(TM4)7zp< zuP|}Wi@IhOf6rb`IBT}BxHI6NF!|cFCkE*uHDe##l6enDj*3oA-Vb||78*2lS8!6o ze8_qzJXUJ@DZanMnV`Mm(mO z8$BX}FD-hqTK;;NW*}P*xoI(6U`1ko)}P*+^1hY3pG>T6kF}l5?r&()8!PhKCUmIS zHmX~Ap|dCbW6u~E98Wl?oBKO>EBI$7#J6y0#kkd&Mm|iZqfn8ZuMvH3kXK^2y^0+? zcj?(-qtV0y>IM7`f;R4g2qlYp+| z!Kv!@sJ=Qk%x~yr3b2$IimL0uaYVBU2EBzntCJm zTo8wEw7`|>6bq}XTy2KsejEF{$T4=4I->S-oYny{+UjQ|1mn)$KCthWhH6P?nXK*V z@0Ws8x%|$Mrptvp``py;pK+P-*uI-oE8NBAIOfswVLG}g zp{;DySbgih*E664__SPjOSROutT1@N5!W z$0~ft!3O%srynA0+Gn|rbwD^M&L#ByUiezG!}AY9Q2-l`*J|^HjOqtk0nJpyIAKl8 z?pDv#%BiDLQvphbTLbn4be0t#sL<0INDY-u$(Zvuo#r|s#_@0`$MA{wju-i|4$C?o z7TABQ-ICv!uv+SUi3XpJ+#O4umnI>v;%C~7hm0=j+8ZR#)@m!UXP3*qwUf5y@0*Lk zN$HWA1Q%S)%f0Wsh`_&m^F{ekkRc*w~jpsfmUw+$fzuNJ%%nog~GV8wc%A0=nTnc})O1J&k zuw?wj8||xIORry?s@#R|OXDr+c9F5l?Bxkl;}~ctclA(NVK-h)e6l&Wo~x{=fvfvR zbaZlUj8SthIwoj4oO+znXpG7=cqLDkZ#zizLER zDle5k$&#j$bR+>K0MRWvEzTKwr<+`A}xF1#%8Xko*Wm)3>;2f zSaI6y<*5UrB3}vy_GcONopHG3GsYYjpZ+R(#9@Af}Uf-=ydHKivRP|%X#dqqX4xa@JmLiNxZ^%-A_2TvK&WiR3JmJDv@lKtmW#OdxA z_H}sfCxmau@vdL-NjoO_WbEelYgeg192C4gi!&z&1_PP{`rP|FOdGC^&+r8YTUZ#R zMx1IdEPOG0KXTz@xOU_9{f_qE6nzM1_Xvc%{X4=w%7)kUZ-Iv|Sa0qMyTnXLkq$ck z$*E~)Q0F(h7mddHk8-lJc07NOe8FKbwCjGq!-(dMHsu;yLt#bV`e^H{V;Z4L4mY@c z8ucRkTCQGoef(XWy}rfSUb_75i64(_lCEm_N%nm3&bt(>XB6#f_+BH+^POn)>=!?) z&UrKGZ4YmR3ED?>#%MM@_~_7cfLa=xDxj@5eqa7sP2a}au)nuYx0L2u752rrZCH4( zUX&|l{>s-iE%B&n&F4K?)iE<<@A(vEi$J&Uz8@kc3#|3t_}fqZEO?XMSJhZ$-c$2s zfWvG+tLI$HL5n;2F+Ogb_<8&Hq1GV_((}n!_s*H?6CQoCKVxSRH%Fp(ckn*#YFp*@ z`Ez^=A5%B`8E?qi5I^^Ihd}WoO=FemMPmY)YPn9mHzn!W8G) z9kJ)xI%5lF#cNCyjob}?N^vmk{t0VyZYI1m&N)KJXW>0rZ8-Y6yE{042^)^P%#udR zN+V=FJ(EUeD%vv!D~0!jmU(`APCYP?U-7NTr{dkjkL;Gwvc9LH<&O5B-UgP~D)9B{ zgrw{p&)w^~UiVP`^RTPuuU@J0JNed1Zrk(n?~gWpF*&Bo{kl4{E~G1?)QI4kwXHP! ztop0%Nm5V6V!DDUCSi{hILcH`OMl^O*T|Z-jop4xsyve%wk<71jzg_nPHLR9aYOfm z6E6f#Z!5L99x(q;*Q~+VhZsrOqEiM=Yeh}%oEmFQ5{kUn^aCeL_CM#a|DA~T-*QNo|y+xS|aURR07QLB>zcl9|Gd_2U*( z-BHCiSAlMft31FX&u#2(+3RktSA!Ha{-{bFk1Ows*CunV;EcFk1Rc)EH<@?ykXB<< zX@_^Z+g8JwKx$u2YOdeT{tr(3Lz|2!^<;8Kz|5rp>Y?#(uPgHVD=gxMhbf=CI>tux zN-NuC`ct(Ixz44fZ4IzeYxc>q_P0Ohae2E>DBk1Z23-qY?W03HArD9_7fS{FcC0S@ z`6H;_VNvg&7>$RnA3kYX4Rzw`%j(GGc7ksU9IbrSmpL4Mfk(f-4D~Z#Vf_%JM3b}Cud>( zfGdRZrL08G?~YjX0?|N zN)1@>_g9K`w>75Pmu9uFT$*{{Affn{%*AGWxjH)crNk=hf{PERs(MbxHg8%yzWV=> z_1^z%F5v%gX;GWj7E?@266uR zkN*$y=OPAXf~aa;ufn7JS-*BZdbDW|*lI4A3a4l#kj|$JGfy<~?k}Cn{a)&X?F_H+ zzt=zLtz8G|zdi4??VX!?-^!dX3jZ+Y9oq6dlnwNr(a=fZMX%YogdUhzx#-PnUBCMc zh7{!|nAf=&0pZ3XQ=GqrJNxzmD9bDsl28OsV)&+5VAiK(oPl&GR8bW@2DxEP9u?Ha zKO-t+r2G9cdJyYe*2xq@^t6vXdNItuvHp~=vLR(j$}ln;=lcuJ5w=>_6)8`&Y$anq zK1z31%o1?kt(Fi&yJ$*8vAV(>vJAqbjTmKYoMvuZ36tt4i3-aVgRn zoO6V|op$Wpo$wogd_n6q04MM4Sy+UAm)m;&qT~N?0Vh8ugy3tbEuZ6!e?IAks~HOV zRrsygcUP4-JU;~_2k}i^-;8uO#~npDH$~aBDe6v4?50Wo9)=HwUl8ujawb2HpHGA- zR`U3gm?44MO`MP$%!DAkqD_r|$==|uQNn5BMX?NiPxj#YyuO}HsWKxr?uEq$216A8 z74%h9T{Qc-3ffct>vWa_{$#gh!^QhK|0&Z5h5UMWZSQqR2=$+U!0j)~3+6<#FJos~ci5$)jE{wweQTo7&IS53UGSAj1brgSF#ZSeX( zCx2XVRcCc;AB8fV*PJ^C9Q^J+-&k#yU}`k}r@K4PcxlaQ!{yjUBU@_|i#wT2 z6TQPgDKKq(!Jx0tLxJ{%8h;Tz;nN?_&>x6Rw|IQh)Fs-+n;B=MH++R9_LXvYDXP^X z*Oco84@mMBZqP1lz3Fd0As*w4EL$9caK@WFZ?F_#rQkjfNin`7+doUAv3OLJcf7!hq2bF@(DqNoriwnLQqQC*Ajy2jcq8nhn~;tQ%xb6P=-dTm3F8xQj#YW4E81WMf_VItOs3p zxgoUDR1vK>j?-fH9al>(^|6H!9@xuyGQu=3-Yl>vOO(5Duu%C|1QW*rDuOArY9&Of zwVBXxskT!DY{+C4f4W2NkO*SxdT(^Sm#w7-Tv$#LZ_@T#h!jM!?_4HM@q{yPy|zC4 zr3dxege^LZwKZPieD(?(?GnEob~nWOL56z&>G$h+mriBHxi_{4j5}4XPBrPB=`?-4 zJDAF?feup@0fc_YNo;MHo;mebM~4h%lsHta9bQ$|c)1l4c9=i0@IPk6hW0#Q^2gtQ zh^vu<*Yn|b9iuL9&vgl>C7b=%z8yIy8u^eC-66v2?|Jm_d}Jh;c4Fj;Y&I3;iL`1z zFouK~=CxKelhOU%yV@+F)G^S}Ncqu{XH6Z$u9aKeM%Kv34d_&tDvd@1{W?%9*p734 zw!?FcM;$tkqyr#KQa-pV>`A7CZh@XK@u=BcE0X?je-hKvSAJWB#}x3;TH!LLaQ?YI z8Fn}?ly0?Nl;SK!wW0Jwy3Vo>3odkZU`FM-oJ}aKCs;n%HcAKyO}fx9q!{>g0@)!& z>Jv~NEyoy_i@RfgIZJZdqijRkl1~!Y7qRKn?`TsfCl*qhv8Z|QL4MHsJ|u4ZB>ENR zj$XfB53Hv^W&fFx1&}<#l>T-0IIK#M2j#Jl9hL};h!9x%%7#JM!7b-hi=RLGvTP@r z)=49go%#SR^y+ZQ&Y5a^{;jU8llyxrm&+8;Vu$$-*h|K-+X_?zC>zi2&zIbr$p&OZ z(&wdi3BxG&PVBQzh^=bO)UQjSElr*Az1k zbQM~RSMwm!`Uudj-t8XNedeIQj6&O5_>!MYTexdkb9~zHgZ0vh#wwb+-fXYa^641k$=h+FH!PjIK=0+Qj8(|93)`% z(n@ZvbrXl=^u?J-RiTgnMq~aYDSZ~0L3G^2zv!J(-{JZT5_mDj5q1thpjXd91?ndxRqO&x|E0W8w z=|8yHUy4w;qxxs9qW$uUp8?BX(_8?7=3mtIvsUl05OaEvlnjL{gS4U)B0zsOkti9UVmIvA zuf$R1)gXsacb1_<*}P7{_tOgnn?@~Ume>DZQOglPCFb_vWU_#MhNI46_a2FfF7T}``# z?y!b!>KpEzpCXn)YNaXy9TJ<8{za}WI2AvM8=a6H=JqNM!=4%Ls{}+B^l;H$l?;OD zaRg3$5EL+RnWySppt(wF={#D*G&>jr$UQfCZ4XJgP6J;O8&%3wR3*|HL^qFGz#ak@ zh91!_^wJxQ08e+l6vP`XG>?j&Y+&bgQSw%1MzE&wC%yaNHe=%RkecO%ouY3~JyYk# zrI&=st3UOgg`bx$9L{&o3=zU7Qx48FlMY(PV6hOSn&3+h?_F|^ZM z()u#=!umSrI#VClA1nOlp`(%J{DiA4z8si}zzOmmgzxmEvy)Rgz=3+`>_`1UKKwZm z201r->hJK}>};`zI^yZB{o`(M;fvEy(Ad)#{nWNL})S2tMFcv#|I$LO2+B6$VdtXVD*!3-IdBzV(KP2}tbj1yq=Mv9#imb=~rS~W(RZNtL z&k{V7#NQc~!~Mq6gIMwa=BPsJJy+WmE}-ot&t%Q|JU_#Nv`4;tgcA0pGI~2A>4(B3-b(`Mn9F| z_eT+K89Ynp4>cQ*xY6?YYh~?=mYTiDU?b2FXMDW@PoI?i8Ba8W@ zNN;=65gv=l48@y_$11;XpS4s*b#mY1^mRnDfrj|YC(atGg%J+n(hVqPS(wnE(5eqH*69Cy= zqi3|D z(;n_3U8L02`vFWc-!vuv^!Am2Y7V9P7`$dW=|?g;614O|-xTZG;h;7IFdb7Ff9~#| zI3Z5s&-Rg_7!*#8hh{LlnfryAWXYS;cd5LfZL=q3H_a(|x=+yhR!dc$NAfOvXf2>J z0l`BesuSO4N0##E>3IpBu#-%q9!lZ-9F9b(h~$o%7o}uppie?lL`H+_+IXQC;ACK^9 zaD9I;sAaiwwU}G@*mWR~bv%c}tugc=d}Zk5UZ8;yVDDvZcvY17t(f4URI&Y?i5Fwv z*Mu-I7LTzd!HcYht%obf3&$1IFPEF@$}fij)cz$3ZfGgEK`I|RY@#W1`9z7$NHd+P zhqa>jA8r+XE790>K4Z)o(tgh&LBQokwQl+cgz<6iw*ZZe^V$fxb=S&IDki@4yHBAM zF$Mo&R_!j(vzT5|PK-FaQ|rY4`Jew#t6>_Kh8p>Kh$g86bQ^rm%_DpXhGdtWh0XbG z#O`UQ+@OCqp?DmhLmxdIv9plInNJGK@UPk4A6fH5ZITPIq=`)&xHe~&ngVRx=FJg8;%kA*BR zcQVu{v6&L>kH9t3ahYQ#MC7!Q4KQ}k1E2N0DY1VWhhWEr{*!e2^~_A>)Z8cT@tceC z0zXxASYrEb{q%X9#ts2nEvBqO;jx-v*dcx96{aV004MXwf}V9pr_$zn6#y&JTBWBQ zX*VIKzsL*Jvke*+j~G`s?tB_W<9~j2_EBG)qZ~4wjFab|q$PUXL-3mGdNstszT8U+ zuSN$0d|T4$@%55fmDHcYPawjvA8s$t>-Z)M9e3vLJXKTq7%1Gb01sxSJlOeXyGUy3 zckK`iWn46>#WXFq>@HHGN;O~2Ac{cNkc8KjW6%2)J#iCG-IVNYwl~l0Pdn{f*h&6WP`xVUy{*Nh*R;;dp1~XIIBess=)9e*ESWd1-ae!ql>Q=DoP!B_p%jL+7X3dhW=uqhuMlPB%$`<4L znd-0dAwQIxY*WvXRrpQ7wp;L#zb3S(J!Rn@iV%7$Stq%50Z(FC?akA75xP3TR9k5ZJ%6(($E9GzW1Hko>*D=^#WbwaQanHyt>nB@eht(4M_ z^=lOHr7r|bvjP5hdE4$C41i!Y&r9wo(4FoYMiu#Rl9?Q7P6 zSY1N(TK+mTWR2S>GX=ebHYb4`It8`MNz@U@gC-$XI1H97K0ZFuvjFM?gN?1(Pva4y?JJfBc->*D?Cs{ z!xRnK(%O?{PR9h`yu!8><^7JvQ&P6rWvx+Pe6t1E|M(+;`9O$jLgrlWRdt(Ny=s@F z5aP>5^X`HKmUsuj4&=9addq5U6Hk|CzXpT0n5#hG1=1aS^WxE?+EqR4Jv{i)b1mZK z=f3_q&gY*~DTfRH{6lq_&e6=oF9A#V4_bhnna0w5-JCfhGq1A_`RM?`|GB~ucXbNl z+E%y)&SdI?f+TPJFZeRZj7rS~WgXp5qHQ(*moM{j0h$VPCr2lwCCZX=PWbQ&w(_6^ zThb9iL5mlu6nuQC)+HdlPZ#r*Yv4$t$&_3NvDR(Z7U!Xl>IO6!i@nI&GzBEOsTKcI z9IdO8j%_!5o6F0E#pGdDK$>QZww>zxIR$||kaYR2QfH|Aao<>0PGhHRp?_AQa>G_1 zaXys+!FR78dF87+2-4x&@v##bcB{zg-i18M=q?IbAElEv!>|P{gw5)_cH>G z?HTKE$-B3SVvIr~u^;jlukONa;I!%Dv03=AEjHRtQm?VXj}dCEL0Dr|81Us}9WKHF zPV`qLRuUF#?~D^_JKg|n%4B@oGJLD9J;lc%mz+2m1AXmqSjK{U*04^9z=FQ;ZG$xKd&O4%PjUB zPLfG)7H3THCsA1%%WISrKT-l}%)DknECt8KNb=Hbj{y1oxE5 z!;*w(t59CF`=pmkLLZoH*U);|pOKyP7lLP{d~2{R%ddv#^hqAPsvm!FmDDiq)6!Ye z&WR(I0=9sgQI(f$+?qm^x5>*yhNcFySo4(r*+yB47Ar$t&5ZKVul=#r_O~iq0ywI# z23l(h2nfYY32TdpFBwaVV-MtvIcDMhApt|#z)SAmo_5<`SpTyHVVa&^-RzR`8y#XB zD(&6>A_Q|TqmYB8i^LxCe7f>XW2^T50iH6e_{?u-N#33ss+oJ<=mj}3AfIr$5Dum+ z>z&b4j5oi0vu-f!Fq9;?y3R?NHDR%oKlR8UG?4r{z)0xkB34)Ryof)U@Pp9!m$Ow5Vh&q7CLx2VFh`6Bl*{mU z&7M{Cvo7RTRTO(dqifYM-?U8D#VB3|veqsC>!f=1x~@*Jvl9UJWZCu5`OzNkdZR{2 ztfMOsUIicMp3n1ai*C%MQFQf>Mtx@p;Mz2+wN8og`L_5zmd4?b7mOR9%Xkvli|eoQ zxxclVNC^s%Yb^Ej?2W(Gdf#=a^3cFxPj5I8`n=fz-^0`n){*6H;0)=zFxSJ+K9JR! zukO|#T&fJPE&d=O>WG|c776K<-*(`6FE$Ic)&H|9K`iFS&xktR{sZ{P0pC~s>M*B_ zmmcQsT8n7t*CspJtrYtMe=6#wvay?Xe&Xmif5 zuK(F%Q5PM-!5jJTueNYGZ|A3de_|fm?g}%fuY&{Qoj$HDGj8<2{Ypf(w5GRY=Eg+; z;jbL1= z9D)Zl7~V?{U_1CtT>s(ugc)X|th8XwLXgJNPC}G+ z;KHxCT-v#&l~y2A4X-VZxEQKbti{JI(b~xpc4gmmfb&_V>h#QXvp^6BUi3gg?v~mP zn=s_Cs#B-JwRF%3_m0IWLEp(r?2CQYTHk*6c58frd!{28b{gDTN(igu!}J{F7?{| z&4Qb^%7&y!1q3X}aL%clZ&Ui4oXa{J%J(nCVM(7&+;E@PU61)6PR0xa7$wam9?zr` zvCYB2vk5;rn+(L;lt$rcMwfRE;y zRn?BBcU*Rw!<5ex!XT$3$|Wf(6SFh_hEyIr)9Aik9sOCJC8QyR86sWeA{g`i$-ole z3!0ZTG1+_5Ytu{GU#P`Ta?d$@2*fg3<@WKwB2Sa)w8l*G(g%lA>>Hbt>PC-343Yi=Zy+-|; zm3TZF@QR>{bTu-axa{exj)#h!=p1n?J%fkCvASG=<%^d*hThuC_Ug&PFPx7Ls#r_-auEX-pZbZk6 z_{;$~ecf)!uA(^lRPJSWvUgTo9BYaKYL1 zeU6Lnhs33avUqLZ?_`qmktKm1Wbhj=Wi4VKSO9CQ#!#65)=77x4i)7{UQVD8CaYDbN9~=(iFC?+;v#f~dK%(P$r; zgW;{0ErJgk41|xR=ntlUw;u}}-boM_Yxz;P-Kh0^vi}pI(%Amo1tk+!tqM6JBv2O4 zztOzWz=KEHukwOgVaj1Qbv+S7catjqWaicy9&XPJHykapYh!Pl(oe-%XGSKGsR#!^~C*V z*x^!Ei~BlJ<8nq%0dd}LB~q}y%c*Js{UW{DQKe>LRjzxMv8bAW*($o*$`haCri!gW zMQH7IyJ=iq36g!kBNa+ar)yCHxiqGN7}w>9KDF^iuwabAIY2S2;;r}V7)n`}FE8|8 z8GTy?4yva=(Ng0JUld#imfgyy zzWLkR75=iv%22LlPJR#DMi0&;sQRxw2m|OS0VhXb_nR^0YVrXr#mk*MN<#xAETv`@e=xBxtsab-M?>ZlXa1NYZ;3 zr(3~|>1Cdcx1YmynNEN1QM}H#8_tfRu)%=;zdMkWoTnWU;@fn-&uJgP0HMt-y4i~2 zF+alMMWzjX{x15K7_4+G1@YytDf--6;5xun|4o*%$z{7%xU8s~el+^zDQ0lFljGt= zKUED@3f5uibNTMO(aY2jO0=SisNN;6=dlsyW$Q4bd?q7d%E>fc5%0*?N6a;>>J%wza+TYq{!oTanAw9&Yi|+2QKcv-8z{|Bd;P z(=Vw9a{FOtFKHv@s!h@xjY?+wKhtvabw)a~cOA`{SAnKEFR^`p?!3G6Dq`Cjb5YKg zQF^tW3PI^28xVJ7w|B}2MWTdBE~G@;CZxdz-)%TN+cZiF)`ex7I!78s^b47#%J5R zFjw`+Vvc;H49kB&fj{C2?}47ORagu&;lQEhR3-(BeOQPbDUwOmTI~gF&!+<!o2? zb?qv<`65f@3P1ZG1DM3dOU9Fr!4* zmhXdA! zTHMncnK?B^Z<5252a5B8id29=*KmiN(-&eByz5IK*$mGoU2V=n(eZ&t5_Tz|;6o!5 zorMbAdsFEyUW^Y@p;^e?g>R-8etKIAPkxSQf$=Px9NzT-U3N1H^_HgQESous?B}S( zhpRG;d}QgUyQA7TfGF>CXDV2MQT>cujRm2%Hmv1c`%gz(YLf#$vr%TG@laLaI~{V) z$WViJ@C~Lu3{t9Lkv#A_oehdN#VH}>;xQ&S-SEt=K8ij9L$|J~ghWK{W}jql-H*kB zR_t*d5=sL(>AT#l-TI&pe6{Yq_-&kB{L8bI7gE9W#)e@o?@V3%(d-PwajS@j+#N-g zIiqD`f)~$&x%b)uL;KLYaXZUYR}q9|v>|6xZqRimrW<`+{I+OPjh?JDqxnD*LKCsP zQ?{TvUMix-elT&v>?h474YLsQj;gOj;Q|Z3bNcVo@h3~-(c5s77>PjNWV)&siO8n; zOTLX7nFBLc1a0Se>it+vNyFJ#;vqi=X#dmu!b-AQaaoue)fd=>5Y!85eZ}9sXG?AX ziunqEuU2#dJIcAn#q7gB{U&Aaw`2&{E(qSg%>Br!C4rqoV2o|ua!hRnYW%ifL{thW z6!CgkZnxX+wIF6!y4$W}x9{X9I-1nww!FZa zPSsj9^?Ku5IF)*V%{NvEaFJZd$i_yv8-@CF7&l7`yXYKOD3u<8G?2qVLVX~Ib4 z;LZH-+n$>W1VDW^#5Ayu(kZu6{&z^{!x z+CkQ?icYZ%Ui5UYwcY(zU)Sz;dD#KpJB?K;`?uZn7b4;76Av&0-=uXkmIJpfyDx|v zD$vOsw7C}DXV>=;ca!I^qLfe6+ud|p4?F|{xJqC6?jV`};TzIUm3?lHGq0-B1FtAA ztGs%{1ujB1a}g5;J3~4-JwG`oXmNl?6=K;BG6dua8Lt$(v=5=Paz)iZ?lHcZ>Jk(V z0dD^iz4#Zwg=|O5sZIDika{KgBCrkFR_$=yg^=ZEU4;!k6#PiTt4g-BnAF zzP31Lrv{c{m>jw{xZqVISlo~!*3Rr`WGiH>jq{*4Bx`+8id0dqc(=R0Z>)u7s)GyC zE`I}Z#upTydvgF`oP=;!{7zUFES_`w{kTzau^mhxBnAn*Ux3Gx1wCRNs(T#uEU@2^ zp3lH*n=6|-af(>Mtv8Ej(Xc#>>0WOw`J#s*xRqE=ML@uEKf6&1Xq)F+#R{A!9aFKD z3UyuyFOL0cVgdD!1fj9^Y8O56Prmq~Y))c>;u%g~wm4NTc?oK#5339a9=iVQfj}3T z7>M5QY%qH5dAKk+;B;Ip>S8nrcNK1y?XVx47v&cEpd9%lHpE;0TxaRb4q{I|snZMT~f}9IBTzI&n*4%$0VdN6I%4GG9G*- z`7*23gKnIA-Ar4#8@ZYjv|_q)+7D-3V*Ip^qLn$hGFx8tyKj1mmP2zjdiLX>Kcn?# zg7v#ys|i!k14$dsLO`lM&y?BG!%!m-d_TFm2=gryk+6GzxSVHJ-Y_^m7zAzSa31D9 z>o45{8)_U%Ax1fE(f0d6QZ4M@A3+tqK->6JXI43B)OE;`CQb?828m&~i%!(<`IVw< zx0Llt7-}0sS6s!^P=MXPU$nI;-wRv(_v8(4s86C^Qq0hA#IGkqQNT%8RC_L5tzxl$ zXBp7V81}O#h=tCYmr&rI`7(@)o|5XseZELv$;PH1(ckJ0PkuVy@}2uyzqtvT)zwV(hpz?SoYY|J^*;m(y`u#= zi;-BTevRTlKE%8b?o?%6+8foaG-*mUzscF8!iHN<>`lT*3Kr&sx!43k*+;0h>~} zE_$w!V)+Q{P^n-m(p!~{&wc7yzBKz~f-@Y)2vH>*(m;M|Stn$H#CBkUa+XJrS9872FZR~Hg-&tCJg#! z8_)_onnKsmZ^&k>&GOvlkj{h8R4#)_&zGEs4 zq5Yi`(%AR#KS8Z=v29z7KKOG?p$7S%1N7$hQJpNO|G8t3Cn@_ZW=0!(Is*LCPfhQ) ztvu`kB|hc<8W<4QzcF^>xg(-~X8N$?=wd>{C(eeHc2ge@6YHs8In`tN_i~{rH_Utj z(7ZxCqh@tA7c`=p3-U>zF3fzLY*%ck+ea0S&$ZhV^@6PXbPQ@g{*u914|dqkWiM$O znhwop`qe}R`*=kt^2rI-A>oNLrf+^*NGE1WwK61LzrOU$S~E7~9a9LY=B{b2%3qIv z;?-s2UsoB93j|2s?vS(9n@+}xH2O68J`nB>i9j_344atT))RGQa~LQr%iKjcaS8db z7oZ}&@w#r3VI62#l<&e~T&6QR8|T`?#p!=NK3c$}%WebQ)i!;Yv(53Srob`!BaJsY zy|ZVZE+a5L&btjz9de{ohmr5d4j|8*?4H7o4g_s0ONVwv1(}w>$MnLR1ou+aVw$dF zi|>gnmoRxMi5pS~;Sv7Xce+Q&AiWg{{fj5M{G-Y&^Ejv)L6+0?x-3xfjvaC}R*YUpzIZVtz`MTjlO~FskFWhxak*Uv&4j#~_oBO1Y zf)!*s*lAea?VJYel6NPh0$w$~&N3q2W$aYb^6S-)C6z4XbrR$+*lwkQRamxmE%KV2 zF)(V#oa!v_rgl?a2(E1V6=&3axMP>bifUWgy$Tx$}U+q&tOVyI;h)yU2m%3)J((StVUb)urW3K_&j`hb^eHR z;^$D6VeGE8R|4?2~pU_oynUtv}1TOw^@_85j>7^A}Q5oM) zD(jmWoLPIuMfH759+o2<XKaB2o<>)fejmZX z3mjOQlNd%C?C;&|KBf%w9~XAQcK7y1T2SHewBvwe-LR@JfjD!3je%1W)h$$k@1`v$ zW0BdH4k1=2K?XUV#kZ1J?^1z>S?C#P$O4842K`jFScDv zvO<8+PL;`uNpvUV4Ei=k^|Qddu;*t~aF8-B8shM56sAd5guoSrljSGVoYnohB0I0J zAg5bpk1K>&&OZ?+buQa3yn!9eTRV$R4m9~>b(R#^^OFS3@j?ie6@2Xwc$OBQ#&2ESbREu> z8E1!K^0+SI6#LL{%enwqmB4-UT{>z$OR;LKrso$J&s3Z#9 z(zX_541Pj>c`H1dj`B?c`Wbi+q}-H16wX$IgO&itb|ldN6|{F;RNv3n2g0_=3G&^o z>JgpW*o)U3ZO6b{tLCbgKCLV!oW+NiWoisruBaK-hB!pW{q3W`0;zZV#L4B^nGrMG zlcOPLvpeR`ofpTH3i~=UBPSiOuRUykauiJ7#*M$XIZC)dT>r0D)p}1y@p=`lyKbwE z-Pm;Pf3dx-59U>BbSU8=u9(cH!Fvvsp+3qJ;T0MvY8z~XB�`PdhCTpWxjZ>G>*f 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%0A044tQ%gZU$XMP2H`{+t;nC0)KPrcz$!GMy`$* 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

|BKfS&tmZ=&mu8|=(1fpF1ManU8!Gg>9q2i$k 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%0A=1kC_41Xo;J9cC0yO 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

h9q%#!d-6oj%qee~7TXy*+a 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

fqOLTH3o=5aLr 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

5hLf1y;$wZU@u-Wti}8P`4ge2_U@l& zq+AqlfF5V6KsN+0(CrM-0GmfN9Dd6e^mKlHONEwh757Hpx?X^HX%UTOiF`lJa7OS~ z5Ug+vYfduR=c#&}w_tw29 zaoppkJzSc^yFkBCSi$4Ggi6f>t-3J(s2&{HB>UJJi89Q{g37OU2TY~7SaokoS;!oQ z4xLg3hN*t7IQIJfb?{Bovql}*@(-a*Jo}a%o~Xl8PC0>%G4gm3^8%<~q~V;fOwZ_% zpAo7CTC93?vZ=lKTi!WRcl9)>$ z!)#uZv%IBB7QlXMh+Cyn>7pn9q9DiHie644dqK#WO&CrC#0zFBm>xj;_2hl<-|C5B zbUtDk`TcL~WL4^)s`q3`jRy2ol1$H1Adlrxy0$dkij$+=d#9%oCk_i%T*xo};_j8h zw`;Eo@DoWCER@waCfMqJosO@_c(PH7=w8mU)g5Oxrj;B3b2ZkjMw`Ap8Hq9;c)`e? zWtLEQlrb&zT1c+)yEm$(2&s0P%@<=5SncDTO(FQOU&u_no&br*X7+n)X(MnmL_+WA~6N zpDc!6hE3~kb%*I9pj|QrpbvDsC0SQR$rXU~7(>_s@vpdrjgr2q=rU zWU-~HUPys#z8lKA+B2U2DYySyrz%=Y^UjzyPFs?r`+4ZoOwfG4!)xo`iMgm!SAY5J z_%agiKW}+8;+SRL%P|NIhEe7#Y;-kBUIuH>C(wTUf*C;-r}l(0FnYA$3CZ4KKexQ4 zEc$CKz9f0V#AuH;fuc6)r zEhXxMEq_elMkWBe4P;eqSq-8LUXE?PrtsI0i-vvV({Ys?_^YpaV7(YX*03Toqifl2 zg)tBxX}vbu_Juo(52+<;lg#8i-Il-_o-o_RWHhWn`8X<#Z)8t zl*Nn94h@R7ZLG~3gHQ8ke)2c4SRcxSW0VDB+cl*erA>9rVt+n*nQCtw-GR8hes+Lb z(}gRVwplCME<{__zXdnI@}wFbO65<_%ecGbxtdXRtO<85j17mU^eyXqCO}Wr0P5;Y zlX7U(#f-WGn$PtBRw&++8G7Q+8Tr1d@a-&YK%!0!_d{e{CJ{%IGEOEZUmky|ME(8G!tH!w)#s>tGd!XXW#u*G#QnhGw~N*5XIdYcH$CZXR70< zk;NpdSD>GYiE=%lc92%E!X{IsAtdk=Qd!PqQ>C88^sXQc{18fObBHZWrFK;TVVi6N2usbBpO)NZ) z>)>$N4$=4uIS^0D(Ru`g6or|!87OZI%C+6PtEAi-d@1(+PFo$;T7JFcK$Q>)V4!<8 zz)*JiQ?_sc;s3{8;Lu4&$+d6Ul{WMi5=c;WA?@1tRqji(pdC;ib$fs7dY}RPnRy+@ zam7@)R0F$4}P4jSr?RmqNbWhT?PT(9Od#}k{`u`>*7G>1E zvppKfb3?_P`9j8eUzoTs3yp=mS7uU0HGW=eqLMv5G4)8m}$Mv=>IaMa-yPB<9)g znjZ{qc+33duPJ`t@}mL(1tE*EJxp6}$pz_dHT^&PfaCje$2H2&&7THJKof#7Wp}cp zKDVs%?l%Wa|Ct~!xVGYWyJjF;HFC}z8S_$8UwS$X?M!ZMj*LHAq#OSUvob8~N9UWM znqlv!5;aFSJv?_!uI2bpvrI{~!oeT=#OQU*&kmx(%Wrh6dT7*MvFc}LYR@M`wXB4p z)0p!z;U%#mt5=;xP_^5xp1$01(#m{DXM=Sqcx$iA)OdU6(!kY~dsA&@DsSp=(fs_P zk8|(U?mZcGtJ@kDndsZ*UrqBnji_vwB8;J+|8fX^KVQij6|7A<{5t~wubpu1RX>YT zh9EdPqd8P2X0^t%(>q&OXmxR(+NpT|%6{6`ZL(i4W4si5PnweHtE6-pnV#5NJHkZK zXNKl3jel1a!u*#anG73vUp(#N!yI!K{9GowoKIY&_Y!t1ZKxF&_(!Uk-&|RZEswT< zG-8?wOwXJnCkZ|i%tA*{P*92xKa95L?QT6p(YW&e;b5fB_bm9@M>Y^xzwq}n$060# ztjAW!Ay{zsr`l80EBs4xUdn;B?{j**2C!Z(TAuHH9q*RFOmqwb@y zK0e~fO3Fqz0t%VY(O1VZb%1Iv2b?M^?uBKotG4VHBU=^=l*zC5*eK+9p;=5jOW(gS z=@m#kb*C>J3&&D96lUrju6^~J!Gb*%^4e?AwhaW@3HGe~cEYtiN}k!k@$#gK+bak4 z4FT*NXV{@jyNb_I%9KXz$CVOcI4BM;y{+Y3!zF5w--Dw|)Vo5wQC-VH@%gPq8u@NC zn?O4%8sM|zbN=bV^hfll*>;qhmmkGx3gB!$1F(^sMFGS6@^^ zaQkDx)kE!mGUw3A-(K#y>TB?AYg1{nhYjW1!>8>#n5Q2c+Fw%>q(2So)FJ9M9>+36 z#|ZlVMD{5qj_mt9{h1jLAuFS-r2R*y;S9SSz1xN29~JOkO?LK2p<}Zcq4O%&vE|!o zb){Zy!%SG2k&mX4a+_1{_0mR<_W8zxosqYJ(c@wYY-#Pr7IdO-1UUiS>R+y$_?5Mh zJv2{%wi2`v4eiq@%F`)InnvEW(j8E)TRZ zy+<|pACn$X+5TnX3ZMKz$bzh7rjalUk5P3>byv=Kyj>&edDoRl8y&vAsVQ~j*);EB zcg@=P#nZh941qTxAJ}-e=zowWQb|R<8EcxJ81_fw@(!BCD6j6_sx6!FQ$v^KLK9XB z@xR)pUD}YENVYR?2IEMHqd5=U2DxZ=T&|`G1+5@ATDU_+upP}TxmE(@X=GaY(PaUF zZJVa!%7?f&%v+w1KM$^isfzRs9CN>P?#$95{-UW8SA5AFo0VfvZ;V!FsaeCEJOC!Z zf4$oc|G^3NFT8)VCd0Sy=F~LjfP=Hn=QV@$LC7Vc%V84S@yh83oONcH`uzQ1M0>s< zGr7V0&!$FWbQ2w`VLxLu@b6G5mj}Q^W3+aqyj1ru; z$x1iW|7&-kadGnFBBC%5b*X4Ygul=z;ZA|ka5K}^IlfDBi zYRP8P4_KNa!ZOVKmqY(Srnx092?Kfaqz*?I=kdj*JCoO9Y4SA)h+sb zBU@hwj=JV;nESKR?!=8#{IbHy`OlB5oC98ZgW~Mr7T#>?o}7zMk?mmBfzR;L3_Yjza7tt$@|=XBW3zE8z3Wj z=)-~CaMe-))dBNp<#!<#(aeODiWP%KbaFF-{i~;4*fsRxkC!cv7Q)ckFN7Q@X5Igb z*qC>~-32O2X^PINcn9LYJp9rU+?i z4Bl&rbdzyX*FgHN9Q~)`LI*YPL+I_;$$UL^A26cPlTveZzS!$NeNpR_(vvMVR%G;b z#F?gV5lcnhHRD{;kgeBr3QVd5b^=%a93526Oeidope(2Bh^H_8!t?8ey5*bl{dtu$3g8)-6MhY2f;oMU<7O9q2PQ}*I^*`D7Jl%m zs~8PP5+qFA>Zwvei&sLTFP6PFqXk87%R^u@W!gJ^j^c^8^qJZNG-8k}nBO7{BsMoD zep|EJ;;V1;086pk0*|ssPn|b?%1l|z8UeA1zW}|sKVbG#g`i%ncGC!r%R&e6&b`oA zqZW|S5M1x_xG~%@GDD>4?$lhYkrOu_I>X|D-1guEUmm$_^2N?UjOMff2sP0D%z+Qc z2PPz#f--^@Ag1;;9IFMg$U5J8JV|Pt`KYKMW~|eh^mpB=;uaqN)-x(B-vL%k@R|1h zm=`pSDF(=yA7AZ9EO}a!Y624Kx@!)0(B{4-@obMK9Bj!ZsHJT8Q-qg?PzTNiy>G>f zZt}|67ajIfZ!2!^C*X$Owg@`7QLn3&A)g(ctC0ihtL6q@xUDZs7Z`bt9jTB=gn2&~ z3AL6cP$%;|mtC}=LPD7?leS{JFNynu*ldJ74bhYYa2j$7*5^bmeAb! zm1@UV0JZNE_nUr^G5a!Pjv@AD%9-o1SxV@to%>{{pGqGm9e}-qiq!{>p3?YM#$c#Q zmQsE0BZ0HNmqzP>K<-CF;am>msA7L^sjFaGm`HB0Xq1k`%=5#1m1n@+C(~-v%ftEE zH6Ht6(|Se6f{!ngS7KnbTjO)6@afF?R=}4F_=*aSLZ%mwN8S$kx}IBii^U$fBOSZ+ ztH%ER6CX~17u=nvyJ1RAKg$S%H6Vd(3@p4!26LN*l6@j>{74VwZ*ie`TiVYnMKFQc zm{nHEEU4{2cuEPmDxb!9uiT4i>o}@NTf&x9}UMI_n#{k-+$e#XgvU;a@V^mv<13!=Nr{}XR(zR=F2&4C(pj|=hhqw34bKH6nL45^e5+CI8PHZlj}d9FywsRngp=%&+3 zrv|w=0w2|{=pBOly4F%u)(@@Q!dQ3HP0#jcZ(k3yl6>a5D!0kqe+EIdevVogu9Oi|JbYYDi3pe;*PJ9 zR2hv0o6J6yXe|H0>RhSKPv$A*BM|WJR#Law-BbW1VOWKUg}HCpryy>_?i#p}e;l3) zXyP`Eix@(qyA1ky%^Ze;Kbdn}v&4|Q?nIVMA8-@n^fL+9#&$7fw%5oE0mQR#u5aES zxkR>wMKgS#cU4bfII3h^%e&ANz<lbIC zdbWzArNz@1H5q@iVKcvYtF&5Lh2~sWVG+fmE=p&GXNASwGb|9pIqkNK9iRIPHoEh6 zpmOnC4_pr-G?S8|4D%2*+9`VAQ@(s)18EVX%!c3UkF+4h}8}<%6!*~%4oawO|%$11c6|Ly2 zIoJ%C@$WB3(4?m#ic_juH2S+dM9D>gV1UdTiM&ui?gK3n?{d<&glx7%(aB+FFeU2{eJH5iDn93aaW!eMN=fUon zt`+Jt44aHG9=v`|+W!aNM0~Xm;|Q~+Zvp@@A+Pfkq&D6QN~fOc`3jE! zC$#s~ppUFB8O4vRj0&NN`OjAt7ca)Tbn(PEU(P}IL_{59ktIKsSnrZ&ohTj|mFsKfrd!A8)rxIYz^>t zmFP?O=!fAAmpw8|NC;-+>ux7q`6d~}NBZ>H3o~k!B=Ww&GU-MKA+#g1tI)sW zMy6ZFt4DFYIC=Y}PFJ$HWKGQI2g0S%Jx09BV*jU_#J|y_ zD!Z;4Xj%6`yRUb`J_ zzeU!!!@U9??jA+N%ZnJp*I>WYQRE2aMV=q`az-)(E}72k;3kf4 zSZU!bEAYE#rP*IUuJ7f=f);1ya=<*9uYJz*opXWu*pZ@qEhSd8Vv$QSv1? z+3&Y7Cj_^IBUvMqy*??b{noJ@Xd27qFOjK)8j)>>ZeBHU#Qe|)@a@dHhCZ_q>pnB$2HKL+{pJts+mB?^-%l zXmw@m`-AUlaPy_Ps8TIw=RR20->m1e4|%G(zv6Hxd^aA#*BcLS-!adsCh}UH-K^2T z%6jCa5w$wr7JYVmma#zOi<;Ks4M`po6C;1mm$nqaTCTn=sl`Y;93}WC28c2qa%j||1bZOgfOdM6yxI`_%2?i_47hb&n@HJ2Q%DuJUu0p%An{4=}s+78QtkG?qH=k_; z^5uA=`q;^NwM`;uajGc9^fSP7|0b1wWTw6ri z+3U)wtwug*P#i=|r-31cTb1P=6`Y7xt7^f_7X9}Fbz;R?^L#O!#4%8EiIEWib#B(S z(T^ABA6HieqK~>=E6da??2oEHRmY-J*txV7WC@z%;F6!^dd%;({FXDE>bFtwpjL5| zc&=~T7}a=*SeRUj$f%qx-@hEzT{s-jnogdN@R(Y<%fp?gH)?gb61%^C7*H5$zi=^q zORRpE9}Se&%&DjfI@eNUD5Lwci=Lcd<5q6}_S2&vt!D$w_;hrDFkbC70*AmP_^9)# z6R7wm^Y0oe+Q!x;Yjdx1b{6WQKddfI$-lAVJ33Rp>+{ku;T`Q>gL>vUP>-*E7*Z;G zqAr`83bnI%_eR@MaHTGzxtzM|jxFf>xDRMXdZN2anhbr<#f?1$y0j~t9Nu`CR#I(N z(ikIDu(XwNt!1YgLA)PQtZ%^8EZ;%8B>mLPE|Z%GjEh|ks&>q6DC{s9@}VLFYa@`% z4=h<}OylX2v?;acdGg}*8AbtJQJ2>;_T4O=Ib33c&uX%Zr@#Jat)j34&M!{hq}u8x z+k#fFYX+!T%7?+H74Xsi`?RxKP5!lL>G_yBBkr7&uvsXubPb8ntS!2l@ydr@<6@<$ zQ_B%%sE3vg7eqxg+2-E=#%s74vkK*X+pYvTcl6gQy;s|cP_G^P=s^H}cBV2jR{lp! z$xpu9N|S8yO69h~p{%fgXSc3=fLNo>Z50Rh5@7>|io#bdM%$J$NL(%1)qN*KW??tm zL^sD>Q)QD7zGSl>1-}P@q%1`M=zv>op-h&Y?{B(Vb6WYg+I5^l%HB}Db0v=m=Fn~L zitJw{)w{f+4)+mk^|m^Gt*@6S70i zz-;80dW_jPs|2o}t@g+mJ3ziUu~s=*6Mx*E%6_<`YY~Unx19&m-LYJvK2p71X3Tv5 z`*&1(*kPuI`a8m<(eV$Nm)ZO84F1o<9n#DAw)ycs;1Ld`Yrl6opFGuWf0%K)gD#a# z6`!oO1avh+S+c5CHqN`JlCfghX3P5rV-^<$JajW{-{QT*DrUgr7((yp$@&nFL0LYG zUJ_FLt&Fz9&qBZ2KE5{fYT+E+n4xI3I%|?YM2KHS&Tpa_@PW(<&0xr9IzrI0c%qkj zmSecV`SY%3#6q4MPHFP6rjMR!o~#qwl5Keep6^0uNWl;0QVvteyI@&O5iDD|HMS*k zx0}Gqn2oQ+!i$G;%f8ueHXDvnHV58yQkTm?Q8uf*$y*1J@N%{sKI3SIX`Y*dpToC0 zI6RxMrp|Hn0fA;6x*PA9-{_m#X2GZXc;gRHzf(_>DF7Wr3|h3x>aE(SWAM@efDKlG z{ypdszpsLfiaE-O*iH+4E2Ujpd@|lt7nY#Z@kcrnq_|AFO>G(V;a8(_09ZKZe!FK{ zUV2tcQy{T^83*@@Hck<&Kjj^m8zvduT(79B&nTAOG$_Wsh6GMAMix7lapE;s2guNY zlCa3>6H8^ios;a=0(q~;4K7t(*B*sv4}}PRF8)^aQ8Ch4$22tJeJ(Lqq@-|PppMh! z1QYUZ$EU$Becmrt4|KjOQP;Ep&^sM{L}2f?R*kKB8<^KrkW`qZZP9jE98T@OY1ahR_~?!ECPWf7tKDcX*)z>EBf)b)=gah>t}da`YEUz89GTKgo?W7-6hKy4+e z_HZnI(9-aheLFTB5qvAR!i_P$g~A-kLPy2j4i z`q6_+Nje;2rrn}a#F6MfRzw=k*;;A8x70$s>EEv!x#z6Gcb2k{Cf)4Hdux8HswVYL z@)``)tD4i`gV5Yl5Jdnei9}zrU41+M)@GpZLd9;Y2Dtfq;!Jq9p;UFt@R|=2F{LJd z<8U3JKejfH%~)(^O9Hd<-+6X0|LElbQj(a@3+*^Os0WC|O9 zLz-18_)5j`0k6Kaa7*wxWq#4LvUHG3%fDQJru(ep$%dXj#uxF|-zk^)Wa(07yJ|Ft zmHh^L{%eP~hmZME$wcB>8Wpd!8VRDRG*EENKpC?R>f*i(P;< ze;aD8DUWPa+E}V9g5P?7pAT-ZG@{Zc{W*8pSP+x6RQQRY(&&2hmCK~BuYxMQ&7K$G z0fyt9`>ZmokIjbBf3~{F^GJgEkKtlqs&ztJUdTO~pYe76`2{AQhLVI&ZJ35*a9)+d zzL7*fJomB33pY{A{NA!flqpOhXSFf(evjbgscN&(dyFF-)?LwPxKIV=;%sOadV}n{ zG3m;8t5SB$-{!GGgb--+WG0voB8&22fT>F=A71deF z?|}t7VmvCvc^TIX&o{H?ZEFHdxr8?}Qx6}cT3o9`pY1%$S(j31e(8B@I8NQC7jyT! zD|IZ`!y1RF(C-tw8yZ)w^r1n!rE8!G;gZO>7zV6?#>{Zij!ZlKtiHdT96pXBW(^b; zW+MO49m0BWLPfBEaK$NJ0zgfdX7S1QGah@My_#~n;}hPuD_kIKq+bmm&b<`d;2Ti? z2YrS)ht}{b80L86t6}C{knwX^2r>fL3R>}LRD5vF+)@2-U(l~jq7sx00qfkKv(D~w^Sv!&-XHTO0I84NaS4EJ7 zv@{Qb{}E+S=|1wSFf1|Uu$(4kn|%A)j>3+6yJ3%h zmSY`#z^&&vE4=A!Mx0$!mwJhkvk&iu@1Wht$E5I#@63TjrGplkL7V`x?n&MWMck-V zgL?DMek^V!3bT4*nmAVsx9?7wkGg&RJQqBqJ#3A}yPzL}#-q%Qu*79_rWhvYH8XP( z6(W6iY0@<|C7VRJPE;&yUL;%#v1U9}%NpJR{!=$D%sF8t3i=>Pyc91=1Sp|_QJblA zmGafqJ`D%%5+`xG3uzW6e}4aGP86YstAqt4Qg_f`)RwWu%cj=%`|cSo#S2N@?nIH@}g|q(`qtP*Q zgWQdB*iAQ8@$jB}7Ne%QZG@VDOM~6e!4NugKa#s^ouI`JlAccofq6%x&y{#ay}L4< zNX6LytTxACP|CD=SMZrcjGb?Y(M7f~^vY(zw(Rw0a9lH5@%2HY^xmopH{rqb^?W#P z%Af9x!}K5XF_#zDwX)iFv+u-0mdJDLuoq`^D(yWcxDCge@B5+0Z0I#k7MRG!Wu#w= zfomp+TGLQHuS)3nQ}=2Rs!0Xd`>QR%M^T}jsZ9tqZ5pfG8=nT6n(fBdnTmJJSZS{i zL3(;S$EY!0q+31tzWQkeS7Pir>n)IOVc6U08*!Q8Eivo~t!Ia(Fme^%eEU3z7%zA< zb^nPJZrE3&_FamzXWx|LoPZZhfQl0Qkj*$8-yq}7gwK70Q>iLHsP?qMIZ`N^I(bt@>PWqou z^jy9W_da@fqsN{jtkX=I6X15K3%|7mqylEzTNl}uT*qZv4ke&Xtbd7sS1W)uo9T47 zkGcv7*>`C*?`ws{Gcnc<>~c$(#pp`9l30N1 zYh(}hy26%UiF@oC*n!oc`xrhH^n)Ogi5(`5pG66}IP8S!-@34GV$w@8)=QPZ>(O?av?} z%)w=3W__*J!Gw%?c(NOp`x=9npFLLx`pOorhr^(>VD8v=-d(b|CnTCXso!?qpEE%o z;(iGxiACyPS-kc)@ewe3m(mr__u1(67Vsh%-LyEwZP(1{^*Nvjdwp}uPfbJf&{%BG zwU#9;GG}+<^((Gv{yYs*6A=RIQc?5?i^}=fS786rbV}dvU&7n_8yQrz`739)>tG*B zGinXp4fEx-?t|S+o)Bd}Vl}%(i^TbTFH-=qH!=&`X}o=PZa-r-&?myA?E_o+_Lijv zo0Wp?QC;<{KXr-VL=sWro1)FKz0oB|W3rdYmj<}b#Ysk}qL}rcI4Ri6yMJlemQt$W2neS9zH+r6himSXM zRB=n+Qt(!5K%$Ag!S}fc%EgON#**^nK$og8`ZFTTSNMX?E$k;@g*)=sRya5t<*QUD zKj-~y$QUQWJ?9DZ^8}}l_Z@tsXc(q&^gbf#T{c@R2;9b`HhT}-X?@EbIOJUp!fa*p zi1wuiYJwTB>#vP1)Cs&zyoP;ig}(}6v#tZSF=?DiHi0(vIHD9<IZ$89l*mGWZ^} z9VXLZ7yjG&XY$m67+hJqsi|LbK!M;dx@LZ_oXf;}yZ(UFL2=4L?65VCOr2Xi_n1}!vGkM6{rS{&7VTEiksvLTGSB@5{YY|Y zg3{wTh+|E&RlHWHO@r%6~>??;8E;_L5KOTrl}zbJa*+$@!{0 z+m&bciP;?mrj(Q40iSX$xG}OBF{uPI~#QqBJv&@vvE; zm@&xH#*7(m#^ai)ZSjX)!<+5En?9#VLW*hzC%N}<;&fs3G`qWta+OMH?K551)*rcL z(?U5MHRS_KwYy_Kg!JVGI&Ah=IR=PRj?Ws`0?Lk(MjGNOt?YBmjK^GL*wbs#cW$Ef z^2$fsC+z8jy(*fcPO|e;?&S2cfs|H{4714HmD_B;tB3nXcb|Kh5fbV2INN@pEtvZt$nS&c^cr3cIZb9-j)Cn5jM|`w!T{bL)JREssJ{Vo= z$MTX|`&3$A&x{c6wz7JBiI(iqzJD?j<6G{=?Iit!mennSffs$~M*Ds3oJw(FcRUtXPTh};?cR>K^3ERq@Qj8E z>1>YIO|QxL;e)EaB&C};?&WrzwIQ+K>vHHXABMCt`u6-yI{r#oK8V9Ob$tmi$L-i| zyOG@v^F<0EfmSEG|Eq(tS76idhq^YdY6<;?z-~k08HUnl)Maab~gm#kkt&XTf?AYuDi5RsEk19GX0(fx^SRKR5! z2-B16mBB(A-Fq}}i19N$AM9igT=#hck>jIq%RMCZPHjLt;>{_mM7*Eh-M2I`gJX$Y*IsnDA8KY9m zc9Ssy{W#j0A0jB2#ea4jY8!$4R;LBSZT{r~6uMJsX6QPgv@P~_(6Q=TDG$e+3~G;N zbeeayJmw9PLiH%|Rb0&*Wg3K5gxrtwdKbwD(UM_n3RE`N8$1|798m(Rb-?ZNkFL(I zJt(ivbmUv*(qpq!0A2n&g4Dyv`v!8aUO$r3?Lrdgkz#@hzHzwtE9Q)YuzB22Iu*x` zXo7R!RJVeWGnPb?n?YrTTX}b+tV#FZ99XxFF4q_)x!D+S5q+SrS6x+^LrjL8|9d(({_W>Bz~9q3?7G=;sntH}{7>k!Q>8LjlhSW-|nX zh@=YSAdrCRJOPm&SwoRCPyz0*L`{dTrpq8Nr^PUhh8=_UkHOy)`-cKFM?uVWRkcch z`JCB3e%J5}GjHL-BQi^Nx0ozZXzK#PaiExv2R4+wvANjdeiYyXpgC$x|IkGDnQ+yB9&xf;w^8!_S2GS3cy zI-?JLj1T{JO_UOj!wS3fUAtW!%UZj;qsweV%(Np4*AS}#%^<|(nE%7o3UU|G;_4b= zR`wy1ypHLi*8FU|C!scv5SBPcSQVHj#X}|@Qv;-4B-4p9h{xQ+%J_akfFl%X7-JJt zSk*v6NEXEgAS;nyb&%;!je8%$4tc?FK$W)~ZqKQ&b@gdRtp_c4vuaj-;dL0t4Zhlz zxIyE~Pn8*^7_zMcc!$V-cO6~3M9oTwlqQu4Ls{_C{pb&hx~qa5I$X$58|9R=itT}&!l=fYc$zvQpCR2^R%oe6ztDr#~BWyLE$C(6E& z3GBqQFw8lK8Q9U1yT#Z@dF^}dOxZH`EnM9b#21@Eont{hy*!(-H`LZs^k?IYG}BF6 z(O>O`$9VB74o{U^Rxy8b<)vTLLNc7%VtB4ACJgH)eBIOe}Cf-S4iMwjYg*? zpjUx5)Ie8*f1g;@;EH+fX;dos37fV=?1wGeH7>aGF@q22qoXIeP-o15dO!4&s(b|S zD;5mgm?qDPNhShB=)O~VD1#tczQBI9Xe@|gd~UgW!n081%wCoOLK}pOR(_i0`h6X~ zB9owQucOSF7Pd$4sD4Ll7{|NGV(Tg>Reey61bfw zpj6{3u0UZe-cZ=APXdz0^9u778>fAty5l$5=x05Tu@mIkOkFqD_{QT~T1ti2cEd<3 z&3V_wyQZtuCVTx}-)CfDWaQ*RCgb}U3Uy%bbVNUTgHRuGY)wllkRdAE46e3;!$$0e z-pFC2cWcR28A*1|o9W}?BFY0h$wizu7n~A*&E8`%beDTHnmjm3m7xMc=j&p-G5Y?D zL7^l5GN5ThhjT_m+SAYemlD@2Rvk5C@Vu6zIn!kZLx?(LDYq;JXOOzsFDf46auPdH zc}>^xh-%#XCAyrMeC!*&Ga;P&;}IDeARLCnJtQ%Qv3JD~c$J1Q>8DF?_9x+f)1t0q zl*8#<$aBNLOk>Td*|U>o+6vVRcMjk^S<@w!z_ob^bOmB9OWu4~Q^Jb5irZ zob2`1v`3TU&H32uzWHF_2)k?!a7W#42YL&ePU9A0wsM%fhrzKko{t)BsrwJf=pzMi64{v+hjQ(w!Q*5?} z)LouaG4<RN4!rqX!$KjDSJDz(1eHZ;`m4KaLMbizxJtL#(WR61 z<-~P?V<7;zUe#)gbcwC`-q5lhFQK9G!59z@-O>C0itiuJrzF zgARifsR?dlETb8d%*-siRPK;Ypql8M$4^Vky`Dsl3Jy7iULew_&1!)?^3$%ZcttRb zTd$oi@S8rz09H*ODQ+U(=Qtl(14$~kz~Dba5)-xE;%;cBjVmU5z)zS>*kb&p-Z}eK zb9`@AhNj+f8nO{A)DOBdYCBzh>Gi(C8Sxltnp~t4n6W9Fdhy6y`Cijf7ezdfuOXA? zi%@V$E~f%BxuGOXb9)^SxpX(X=^aYEWOgVz?g1u|5PE|TirPVpYYl<p6~`wH_!c6R1oQ|!-Iuf9+r*@AmoBD zioWK~`Vs@eT%v4}vs0UV7h@C1dNG>_8q~~2aQgWZEl{)$MkpQdExzIHlW{XeMAqMO zniBQrG$~-o z5%%Mm4bx|y7r?%scQh1Zi^n*ZD@H${NF!Y~9p6j^ycdMM|i1&;7l-VIh1qPvyqj(f;0DjV?{G&rE$*4HBr zaHhe-Ce&`CzM&9+D|)LzUO1=&)GkS6#G)#vZLTTF0!ztqvqR-}f{w*JOoGJdd<6`K-GAjyn6O5*7B0Y+LGU3Yicdd;U+Sb~BcgUz0k;-uC# zT9>$epS|}uq5^XFB5*UYT6&MhHo~!fMCVqxFTp7r#3f&1CI?o(u0U*O`s@s1Pftts zE>yZuLV3*&*mu98`Uoby>rds}R<_0*_0@2g0*IhjL3W2V%D9zS!opgsr`#XnfG{k4 zafvgGocq`soSlxbojJSjN?dY!|=h_i7PWQn~gLI8Ger7F?xpWrPoVm+&C&pv32I?#Z?xdicj;4 zB^b5?rnu%NmPUU1qxxbN(W9}&c~$5;Va|rAOQg4LZ7b$3#TaB(bxb6h@~Xu_-Do?c zZoTrr?W3CMUxFWJuEXG8G$%B3INy~_?Sqr=AX_P=J4s=(^aY{sG)z#{6|#Yd^v@kLK1X}-)sVHaH4WaRdtgx}cjF=4k|U~`Np6osWeG$lWO2U0(l1ek?7jC+1B0WV zPJo@v?d|k6sYo==9g-fLra#&)CNJKt)5fW*{Qe;D2(L05=G@6pzjdoDuVsn_iL-Q2 zD-VGKFPQw5<%Ld&Q*6u+2hs)T@#W>oi@B?UP*q)>qu+>Wr9eia_ zd=pt1&*I@j;{#$9NG>g`e5ull=cdTyu@qROo(y0~bN+u^y>~p-|NsAQgvv@XDx;Ew z>|~Efl)bWdh-04)9pfBcC5lM)JhB}tvS(zkBfDc}9gcA_4$g6o^LxI&zxQW+zyF;- z&c$Cm-0!#h^>(}cu`DRRfyw}z-(%jKrusNxQfG8?YUV&8%wF_F`$qF_u0h>eJDZI; zb*aBFF1h$lJ+E-+rCS5Y%da{HH+XJb7sO5{w#FHs)fdExxCr;FB!_s}m<&;4g*=zs z9ELl}E|*vh)mqe-()MwWsk*E?ZLa3%!nVP;e0NOD1Y`l8=RwI###u9XEo#TjX7;3DR?N;N8Vn#_2IcTyMrM_+VG-5=DrWV9 zhukH{a&C7v7XK(3WPLmezSRG{AG)>n{Xv7nC0ER?VY>Or4uaR^;le6a4b?dFQiUL6 zx9`b@ho1_g?+!xws?D|>dy=ScP&*;-&Jwz4XiV!vWDgfSO3J4aF|7SGLBYBGXhKCTbF-gFJVUM>|dCN%)mss%)(Xdkelm^4Ppl z2@(rxM{U``ga?6BXt;Bc8nNtx!p6JLGH#V0&~n??Mgi`!agEl@jw-2b^j4F4{ZogT z(&8Fwfk(9K?q7E}mJO{n>Ywgrx)7@}-5r7;iMH8-;xlO{cJFBwi=m=6GdwnQ6CDA* zz9G3MrXS0(phg^WGWEw#mY3y7F=meAg}|Ua@8zt+>Cb$d-#1k7 zZ$_gVh@Tf9f2zB1-DsdXE73pMGqf@-WFRp-Z*{uW)Enw3_gehFv;etboqe61v6R&T zti!G@k@um4Iiq=TVY$=L_wA(fawrQi^OKOUc$@DF|L5&G1z*m=)MCECPqk0BoS;I8 z)or}%t~=Q*DNI?b81}7O`as>=`1MNstRdkr0=98vU3K~aVzoWo^mQZ%Vqn-LnzA{L zJN4#(RRk~{P72Ek`M!^*g&63A?kK9du$^6P-dZI*doW-;K$kRkMoO2iBGmamCmSMZ z&I%V4R3NNb69j0P_ej=1@;we`RNZi!m6lh?y`bLmO`ScYU~{)m(h4-h{ukbiAamGc zf^O+KX}};Gwll3~Fs>nsIZGWj@ZO1S$`Pmo{}ztF30zmzmV;mz(_U7a_{0BoU8M&G z*B)(#_HdR{^gdkywBSE(xBu8emI_#2Qm>Fk)QI_rHp0FkW$$2MyW_YJ7lu&_CZbc% zV-RpaQfz7PMRe3EbKp=thhQ<(c5_=;hd2(kEo61UiMNVh{PXPhPa-vUq>Y~>L}pz+ z^6xCHdCY0(JSg%!K`Z-M;Bxg`M9FGuWNMt?`yEN{zK`;u$6B|>>YoIm*%TCSNkaxj zKE>z&*0RC+7o2aU4LGLeuHK-cOM*EoZ92{ZW=J&GJrxKK6Lh-FcVW%Sdi^nfZcVtE zO-Zvrc=_XW6yceNjFGOfIz9#L*arC+h(-H_$j?}wg6)$tit5g?VLDUP*&zc>|8)M$ zMGGC*)d~mdDP|f66nL_4EbvAgQ;SP!)0Y$%7w_d0T~r2XDyt_d?SIsY)kz0an-=#` zjX~BVuhp%M-z7y~Vo$8GUFP}6Phu~&esOjWG;uL1OT_-iub({Z6A(La-SC;HtjElw zQqsHTOUr=h_m$F%DJe}B7LL*)t8&|%I7Sc+d7HFD3(nU z!(o&c-%DQbH!3k|UNxM4@&uQW7u7C*f*Z3tw1JTgxMk-ejH`M;&IgOxSDP1K=imAU&2_~U30~lHg8o+ItC;Ryn; zTX5p?V#%6KKjONK#CB#=>e1uVOy*veG&MW_Sw79)>VhtA^+(ySOtKGauXR>#DV9SA z6KUvZu~Y+eSD*-#)^+;4CE)_OtrmjTWHxvpYZ?R2wmgWS*kXck7L-<+R@m8|cbg$C zBE&x~9dZTxS5PSbkr zNVxMwIpDw7>i_e>*Ph{&>pb#giSSd6gjghQ4(kc%LN_v{Zn#rwQd|Y-kp2tH{HGjoYZ{9^yLVIZdQM2_GL8 z-H@v1!LrPp=G)KpEkn=K^vPj-jdA{PeQG(d*Ybwj(4kX&`#Yyl94mM8df~6+$dqZ#GlQOTGTlc@9mf3L(Irw zl~ISVm$a*|M2#e`+&f!#8ncS2r9GxK@*f?ggUlXjD>TrKsbZ~@K_C-|1_4FmBIKt0 zvej-ZFtlhFJI_AHT(o#LmImnj21hgHYgKu$-^_p$w);s6F3Sl(UvUSBs6pC??#*F; z(v+Abeig;@siw?P&B}DB%Os4d;`qrzj+4~2gHo-icq6%A22npJJDwEJ)pl~bU<)N* z6D^mnTKyQq08LN}$$_%oy1AiAg4xlENY*O0DnT%a!u>Da&*Q6+&Xc4W>=1D6c4}MS zfJfFtUvub0LDE2r_WG0^GW1<@ud1rNHAE%-Gwb^rhMdF$RVFvF-gM9)q(Q&U%yw9} zGF3{?BreC!D~QSHge)_|mh3&~ByqNx(BbYethJr=-fMUCaiZBn{_h0OA)&3X_Cbvn zOB1fxXC)14Cf?%$JnqNe$On(@TH4jq%UCioJ|COBGp8u@?UT`Yj>5SC_vJ21uy4{_ ztK&3MNSYfKtYW$NfvcjFFz3{2nPV_znS!MExAiP545i1iYh7nR6i|M1@pSd{){zL56m!Mj+G_S7Dgod0!Wgqo7&$X+_(b`G0eIFW%HT-{ z8BSirQAU@_s^H|lABR9!s@ebS&x^coh5?ViL;>v(*O&E#wf}p67EoGtpgHY>lltJN z$A++D{?PTaC32<%IR<{-5o&{ZV+QTGkQyuF{XEIVpEaP`~TFV?^s7>?BN_gOG(bFOSunZRtXjac>}1` z21hb?Zr^NRMyGg9^I+P|ODrSR(q_|*X7`!Byumw#^mX7^u}gKH%mmPu>^!IrjLUd>kw%usmWb#DP2m9njv-!OF^xGk zO$<-!9rhaszg&hb+F}+V6WLfr&!r>ir51ulxoJnt9j4DNfuE@T5?iDzF&xnovk}J; zwySe#-)53^=CFdX{r*|9KV(^3hi`uE_{?xO1edvMP2a$8WyA2$97K9Y_EM!UbC8Kj zVSQK>7YSm4(3A+G#s#PhXE|gaMXT=YH%Gr25QBG@ua+c6C1~4IrSkZ#*8vvZ2_Y~5 zuAz+k0i6y3{%0Gi(yQm*h^IrpK9WVTsbgmRPrb!xkv>?jo(1an2+ziY!LBR~m z4EN={HSGHt`>r0aYo8exw{TOH-U# z6N>!9YPL9vF5Y{zJkH8}Ug!I~OCfFIgxjCOGi}#$bSSw!737R9*x=X*=OYwtc#q7} z?hg5+E@87AX6wrJ(=_EV0?Utt{1W*k?Px1QMU~f}jtkQw0awQ}{2e?OM?q72`3S}8 zHNU|gR)W5K(L$I@`=_DrU8D^eLk*b@P%d~o4gI`AwX4bSu2W&-&Ya(fF+xCul`c2j zvW!&qK;DNjO0%*)K?oms4jMeZ15dfK;nM>Hh@C%8&ubR)rQebz(7FM_WNg$ClU z{M6#NC*N`%?*4LeJr_iMIof?gUS}q^YEZ#2mmKbdlIhMULbR*9J={rVu9RY{@?XQ| z4|d%BdQL9(opxPVY=Z@_H-#N;?4GHSyzD5`a&Sxo#dnEVu|$;HwoxMq{jgg4U+E)& zoR@~nr*+U{I5@`l+zoySSo#0ggS9lwLMrSyN?q(A43xo1Tg8a;Vu!QEAWB^oiNJqe zJhu%bV1yjjkD`1*gtbyGgT;;z3vt_QTc*L44+|MFqLrhKX?X@Ot2M_Pv4`jyx?jzk zc_oLyZR5I{)*Doq8cO`C|A>kmx9F{;(Tld@3`63*T%M5 zv^XCOx$YDaOtp-C9QD>hOO~!O4knSTb?L2ZD(kydn$xf=;E(6m$XCburQIbI(}RfA z94_9F*rF;LX8hStsDi8~0r<SL#MjJ-b?E}+mpIs|( z#bu8F(gGG+juzs{6+_hhQpJC-4B6L0-?0EYk$;kqMA)yC$Sn_6TNS- zu9=}~r2=P?vuK7|LC-4D-kU0Z0w6Az2Th(KiQN3W$~_lqQ?mi z&J#YwP1M47!hX5)Z5Zc-v#~bR?q2_1>ffn1-#pnw*K?x|5lugv^6Id9YneZa^&~d6 zOKlRD!MFO^WzfW~;KWFRYJfSs-EcQMty(hFX>71aYz-WAYaP5V^;9oX+3z}gWjkcn zans32U%ju>+~W7}^@Ej4{nl5c=z~QEt2c%pT+(WAaVBALk8(q(-=ZC=%vT=%IrKOf zPYa&mip#(@HSGIQ1v8n)`HHPrvNG|jH!vPqdRHb-vKPyLa=eM4p;wk61e4zW}%OL$Q5=MHaEJi3|gw6l>P%X+J%0m(K@#^J+V2O zn-nwKO~Vlm52UJGp5dvVD{4lVytn-@Kz*&)_7hYt7`|xY9-KgA1Wpo4r&q4u@3RH9 z9N$$aYAa>~L&YIsgTFgx_J6ifI#a3Oyv*{a$skg#KuBIn~FXmP#Y8xKH+~>(! z(%wVupXr~a&C1TM-?f%%=jw zgj)9;<*B^YICxp#Vr724fBC*by(OE^Xq@G3jPCSdZ{EF9uI5`v?LwT* zx<<+IpOyi8Nr>FT6AMb&Ll4ifz)Q2&b1^h;k%6{h)IIcLFtpjLRG4_p=P=)(ICk`~ zz&&_D;!OMc6Bfl_kt*KLwp6dPxwN>?M7!*dZJSaLWxyWq*jVqwmh-E|8m~2Jl#XUM zJ=fZ8ge=|31XT^{aA%kljpKdHiQCZF>S&=lqEj*0v<&W4flA z)Ov_wReDI9LN{j1eG#ClxO&^)<;S3xIYtgX&W4@5*=jXJq%T=Y;kA+WYW|aOKD96* z*}h*6Rwai!m!S}ibCcJKE8KsT1WpGg8;o=TrD%y&d|i&RI=eWDb`eBLO-)md#qyT7oyYu1zw~ z`(AeS5KtAg?yoJC!i=F)Mw@zAm~!Nw24+pLmr9*8+ys8(BIH3;)71LB{EhRz$rWch zX<;X*w=^Z6UQ1qU?8fn^f+|fkOBz*zAPjk2!~K~9EQ$#Sm1baa&itBvMLta zLK>c&kg)je_3tRvGJf)!5d4(nNjOm@RN&6lI>=miq3yrtE{hL-vd^#y@kQIBdaUh^Bgn-AU* zi+OJIBBggWIq9M8m9i$mrzsCio~_zXmZm)D`tZ>%eZgmRkbcdQ?t-oY-<6!_ek1yn zzzS-aG9SZ-@%3!#qT>0{&;y7 z>hMldo%#>fStc-#If!BTYQ6`t{Yf2dm>~^hR$RetzE=M?CQWg9MagyR=FPiE!uNhe*_qhS z|5bINy(EdFK*Rorw<<)NCrpBPbl%0!yy@ z#t221eAdNKEgxiY@B>&y%E#;Ol>$YJ?o6?ONwI!QRKjtVs^?}&`uX@xmkVP8!wWFn zwyXbPXYffBTfE%UMcp`mY~0_5;6Ytu=Rx$nqCK7MNao(zxUH6?nRWnt;Xph5BSi!y z^8J~`_87w@mgZ^=snS=cXN+BC-1}W;P&tXpwY|-#uaWQk0FHmDbAWf#+1nz!w zTC?e+4e+rU)#^;84$@>p$4A?VupE|?(5&zAQg}6ARNZ&_BU9>JkV=pnx-R6_9=g2e-*!}6y0r7=YJXI1_8NU~mLTq?-^it;;}}@OP1b5& zqceKVs*g=L{&bq?(|B0sG4L>;yy2ydio+66YMcSln9)K zbdR|wg)!Z_txL_7X4*a0LSh5{8{74}V!F&vI_>q6+u5;^n7O1`*K=H$#$eiZK)!*ZxEGGd^J}n$Hr9T=v_;L7;UP%;?6!9gEZiyTaUJ8x z_)|T7nS~-~r9Kit)eKYLr`@ay7#~1o{JS#P_b+LZyW8}k=mLV35&q5wj?orGAI!&l zrF}~RJSIow(;6|#@Rsk>G`(iWJ3jBkD5oX2>WROM_lFyI15|zhIF^joi7hYWENe(KIdx(1&Jxy8QXP$hpA+-9oVBy2d$ zSBCf-bPNR9zILSz;AuJ6PII?JE@LguQf59?y7cN%1bu%eF4<*nE)B!R+>}FfleFk7xEju=1BF~J_@zhH_}P}efdSRC9R+jKupc>Ji4-^Qi(7}4kK9^^;?kV> zwY>v==vVFa8+ue z=RPu>A2YQr8eUmZqY!s7@_p}MTccg{pWW%dzrg?;@ZHtUiq+02)7vxf)hSl^U-<8KLIwQj z@B~i+Zf(lG5POFyg&{S9&fsxtc7yDa!#1IIl7QbLkj$zp>l#0{C#*N!im?^Xnf?9X z2h#R(pp zx+t_Er8Z2=)1y?)>HZ|38`eI;?7)>XU@x1RUzV$;XY{o!?++|z+~D=GH{&m}3Uo03 zRSz)1WR;y1t+^f>jUU4cH1k!J8Pmkky1SlZBoh1_oaQMFs@ZkhTD{)_S|)o z%|1Bgvdq2Ma(CP^WwuZYFwk1R;EfTfUfZym9+rRIt5ae8(lcEeIe6$Ic885lbE%i- zh}A>QW5|E8+k_<~;`mZ7xUd{Ou2j9D{87wM%p=9uv~T*hB+1FBZ@_hGb#Tt+*Qf-K zV>h+8>{D)m*7}}$glH}pp+Pr>?;0!KY!8gB@KTR+X>bone~S4WRDQ{Y!GNnpmF5+1 zZ0IO#0VK`0sfhKV4X9W^r`(V>^6Ax$pb5?@E&I8VHK`OYi%JwbX(_46u-#9XLZDEE z62>Q%Uy~V)f4{cDPK%qvE=|zCR#E4b100L2YZ*)6?K1te?Tg;iJSX35Hf*Us4Q}*h zmw9hyf0y(bQbrM?9rqf!iif5D!no|=SfOyYhRJ*3vB_!jcbx64wHvE_Z>zdQw(1z6 z8v#ov2=6xP2Hfs`h?^T1iy%Hh>#zM{=#5tNQXhUynvOh>S`L%9o4tPPdQ@%UIdZs% z#QZewG|j>6(cv2j#*k~~OFt(TgOP|!2g@XBi?as@e0yPl5brwZeawBWS)9RVKQM5n2$6rTF*b0mMLB8+g^z?APz#w1y~#`B0mEGJss z*A7pk!>*@+XOS004pJ24&jk1Lq$}%mA|GJ{!f6Ia6iHI162aw1&dhpZD_JV%z0nsm z){KHy$MKW((;4o+34}1%IRZ44HAM5ar)fPa%>lkj&*QWW8i01oV!txV^fH5GQe8#A z*mxZuk=nE1g>F)!Z#xwhpO|orxq3I3a?^ZRp)cw@C#BFp*PMds z3=pr-v=JkYirB9OrqC}?L1l6@bIT*m~V6!dMha{{_sL&&}6 zV*Um7^RYI;ZIh+p)-=eE!RF@sm!^+^smYEozj#nyGVDE&6@DsKDg&(->FfWXw}?Sz zP27!Fd4FRrMZpKple&h^NxUcYCXKk+%FtgohP19P3>do0@ky35_sdf=yVyGu&;~md~xP&6&$I-&nee-{pl<9s+CX67xQf2G7n-N3CHv= zL=~Ho>JRu9O`cG+Xc%WJU0!^t^IeHR7F(3=UW*Ma>+B31PXVHTQCr}d0h25P$mQ@# za@bzxpk_jUjJ9amBfQyUPcl5#7jhttNuqR9MutH?}jYnbQf zc}Cay55>N|-E+^@XywSvCio8G_~q^vItF|_ zsqvJSF1FdzYx`E%J78im_u>3*cUbxs*ncs14o!r@M^!L_6^ons3;>uE?>wL}mjb z(N)JIJY77_77iCfKFyzi%i14(Vw34(G7GvOsW*_%_x?eLE8nvem1j{Fhv;h&mDelH z$e2#cgeR`&8?4ko*mg73m-m5AYC-|kZu<}2LcpU__ZKi6-ZLWJPaN*Rj&;%u!&hT5 z5ej$b;JB{y^uXMJnU|MW=ZAyu0j_Ov7h0f@u}EzUW=-`> zv*p!ohFtRU^E$)sb(2IA+mCfs+QE^=XYtBo?RCBrMQ_%UBbxzuYdZ-DD`XvmMg$xZ zsNPykTLc5S>3|t$RWEyz`?kaykSj~|%mr=JPhI(lTX_sUXHDuF=*>~W(Qrjc$J-bpRzvi-ef{>t*xb}qN9*BboG z>!c=17^mT;(yC*(p4D6*RqdATYTGim4A>A04mlWS8K!>9(pV^kXVI*pvRJI15m+1^np0r`jtJZpRi(|U)+u8aFotW^;@V`e&_G_eIZ$j8>Rjwt;3wziw zx1pbtA`2QFHu~@9o`xka1xn!*9*`Fmq+?0y)W2fG<`Dw@{^itT|CxArr%8Xp<2Pb@o5LXUHfv6oz!?iT-+~to2aecEm%sl$7@6;FLN~l4xX?9Ae zqncRV+CsbD)7QU5K}&aNRf-7H=qiRtUaaR=1cM#rQRuyn7P|m5V;{*^i{c@neb*$9 zl0ox4L<1^1ixP&r%(=T_JNtb+IfnjI3dD@Giba(U2~4YUcFxs~k0-uMsvTj6MXFGI zFySDz4L``|4?A{v;6Og;I3xqS7CFR$I4yUM;inv7a4_O`MAZ=B zIp~1fU`}w;t}0b?M4qV^m8p)5w;6?LKT1%)=RN(=8dlPL+UPjJsLwT$3}htp!Nu=T z?_Q`?6*UtJ34dTY@UXWm+5clDNhid3C{oOsHB!a!G)9c%ny_=N!=m^gA0D~%PY?Xr zssl}bSGqz2&l4S-WPk>C%irLagfMG7v=ivIRq#co7rWGJ>UR2@bjCdEPU&H~A12U8~*Bl+GA>I?xOnc67YyL^oO)XCW#eWRQ}rS?Z&0}-OvX7&nkl*2&MHfQGQ1**jg zuCKeX>|a%bj930{=C~)_m$kWLK^t5BTB_e1)o&QnPmPKlF+_9q9NpP-9it=tmjL=wc zW1-?OkE9p&UhSpEI_il+VOv+SO**ZgjE`B^9+2~9sK*N!H7CTq0q$YbzlgXgBoSJq zgHO0j_>j+}hcC3}RwQ>zExpbm3jd6bc${jK8~w8{Hy*lTlAAiufnIiPvq!geJ-M3n znG3Y1?^N5r*6LJ7Q1m&kshmOu`L4iTRQab}%;Z&#eP?4gljtv`KRd$GaQ@f-x{r7E zCSA5mowpiQI%CVxZEBz0g#415le5DrQV%&AK%};cno>rnKkm4<#{2lu@B)i~T&NBP zr)VU6M`^0LRcom`NG>@eYr8OrYGv&%n~WO zZOOqxH;4G0Q+TWiP4Ej(#WxRUQ1u+hLlQly0)EG5Bt;(2o&6^8ew_(#e_KX#1JY1u zxPge+d!TtCBSJJebF=Y!hp9JLn6?9JxVz|vlmtflkAwV?#D$A+_nscNJrey%h*n2o z&QH}7--eDp4Y+@7m6uB2SW{x4nAQU6_%4NKh^Ke{XDe3P@6wVlsp{FO#JNO0GRHv& zH%CyYN&%&Zl+DZ8jHU3j?rD}Uw4w`*lVvZvn#|>HRPNaoa#h59H#1vwN?l9s$PHOf zOMmS=yhTb=c=pfEH<>>Y)%zbTKX3o_tekg4<|AnG)appor(!8pVTVQUoeUS;wUhb`gS1O z;_pu!B^h7laL&5a4n5hLJ3K2cHngAFGFPSeTJc06Er6o;asNa7e`x_L1d``K@O1l| zK+D*Fs&i$y?CSef#ugs8AnR&Q1;1;;b8kVvoJ_adwtiZgDLd{L39~`OcZ`Eu@zmm~ zGrv-%sa0OQsPzmF_yZd1JF%}FT$y>=k`fFN=b1W4+DE!1M{N8N_A!hMH1S=b<^_GS z^+|B&oo=dAVDz)PUu+P}e1b)lG5 zgAOBzw=Tu*bl27@_qCLnjflu?HSf%r^nHXPUcCG=RB9D}-Ev5aG~B2a_A=bspt#xV z`W&6zpB0f7CmRH40R`Fm9$y6&FB;6W=x_NU!cn1{RZT2Y%G)*OcG(?|mTOUU7Ks@4 zP|tpJTjExI7Ku;71(c~Wy(e#i9~TJcoJ*PI4A`{&+Qxsh%T;LhuI<4OK39Uk5xZ_h zTlCVQf$ty1cFfJjVZ7N|hUIo+I(Sh1J720_amxC=ykS_Z!hx{z8E5<)xfe72x^#hv z&m7zB2Q)i0Kp9V1T&}Hps$MfRvdH5&>zl+j%x*H&+Q7jQt|HEV`-p?#Fmejy{46#! z!_36rpNaO`mA&SlK$3+=`sxUAd0LgcCp_jt<^9iNj%8Q-%Y@?6{v%{R@AMSn+;v z1uY%Z9L!952?%T7^LBg!S|O~9>#sNFahp)_Lt&Pm4JR?K2A4|TYUb!P*&?v z^uj!b|LOcBwTiu~Oz+tXXz*N7UHWVM<#txCtWQpuXf zJe*+=(Ug&rIL)Xl%aKg|+e{tI_v0b%wf?9#Mjz6)gwOKh0V~9PMm+v;8m5~8w6~Z& zg08*`HG7sGE;(qgv<|uUTS_z7H>|O!dV9ie?-!~K!`(6|^$z!n{rd30LT;aw;j+p@ zDX{&kgNntUct2gM}m~$6%gSZl+$QI zGiaTqxeG>m#c`M<4l;hTZn{xFIW>N@E!r`5RY%}O$BcytpI&dg?;5!GCfRZ|5q+q< zw=_3#HT_QmMvr089RRpeKeE&!o-ayuPb(f8VIxNU%eB-fRf$=+ly}qjCxd*_d9gx) zQ_Si6rR_Y1FE3x0QIXKD_`8Zq+9>rhG$er0^%dLT(UBHRT|ir_qDmXo+5lHWo@hW} zI*tb#I`D8J+TnD8a+nG~$)uQ1v8w9N{?Ew)aNLYVFr01v;F^nAkI_Hr|DOf#|KId% zm8h~h_JQ?p4FPmnQ8q!qNY+9ANx?gugD^7)(yw9!?6^<7U~=ndKIS2z|BOVc1gef2 z%sAoJsanNijc$oU8jSM~8uj?OgBwi*;=;?A_XwshT6)V86u$eIIrsW@^E|#eCOat{ zW0@K$A~N`1HQ9T>_CjoP_S`#NZDK`oWWn024!}HQxKXhiUEVF|A{Z*X((u60yttU@ znTueZSFIt>M@5b&j~q%E_dz{EiPFBwvVs;~Q>wsmCn0U~R_(DEsmt_TH?FS9l1t0n z>t*@iBg};lyIFDmHri9xm)jJ z@^u$CB-cU;h{?nvE8@@0Hk7Ji6D53@bXukW!Y^6Aw48- zuRiBwPX?3gOJDYs6v4wGQ~V&$C*t2$qPS-{NhS)3$gAzi3Xy>rA@m#hSDAN=&QUx+ z%;csFYyIR)lr$1+Cbxqwfmzi?8T%m#hXozcAZlhpX-wV?b5{eWQ2=0ma&OVvWw%P6 zV@uc08Q=0@2~-mH7R20w)ff(8>!MPaURQjPruy$~?OwPWKKm5_A&OU5C<3ork!P== zB3_cT41Sdz;J>>tOCR~im+xN<-X~7L{C$}|^j|PlwQ(FR=hF5lsQN?mhZj2x+=K|- zcC?%$26<)Eg6Iird=6gX0>QyKI@d~ z7Pnt1dJxGbT7`R8Lq$BN7vCrHgk1hf|8`WqbPTRRh%QY%mnP<;)^ILUKTGH|%-0sT zLjvJ2YK5@1jCuMz31dilF$EH?=mpMtCd*5>0P};Ri*NG3{U_hR{t0;{=kgg+rw-CR ziMj>mk-{f>W|9&NRMN<=u9Iq62Lio4*25Kn&7CopP2CGm{RK$8aa{Y=pz5xKUUzp` zXQsWI+Dsyk-$Q?<{j69Sjdf%2SqlN?fBGqwqqKuKS*dk_WQJyX!iO{Nbr0IXrptI| z^ja|tTku(`>&hnkL1!AayLKpM2>g&MwZj7|f_kX-_qmXXxmetHms4|vqLQEVnzU~f zi*Oe=xCT9(2@>;>kG=wg>?T}ip8P>}uevG&&w0 z@4HyY_cr7+Ca;4kVDC85Q#RTH1Re``E`m$))o!N31tt_w^hHRs5lW%Kn&sa+e34_N zYfi{nZE_k4aT>KSOYU0zZOdO?w!JSwU7)>|{;K>bNG4U)1WcRJ3yrH%hCyAubN2~Sh77f*1^_uZtJ(AQDXV8$HCRn*Vycb zIMd15JkByGPPhlxcINAskj`lWGJFLHQ;bo0G00c96WBjoCYS5cCuI2HmE-2mW0uzj zx$96W>#EjuR@P6$hF0o3&?>-87W@QJoHZ1zT2&?8fG60Za7z-z_7E6_IC6GE@d_ai zEQR5J;z%}C9TalMIksVu@)PMxc{e|-(eXc&Dj)AAi!uvvJ?-S(%2Y#~Makh#?oM#i!7L>sTI7Nblvxjei;21;LQL!3fr&!I-p)ELA)s@35?9c~V zHyxnposp%9wz`V= zn9J(vnez+Rw-3~fcV!MMwK)5c#-*LD8&{`nXf*7`tTh+#9*Xxw#IzxFAJjrdxr z&mk{MyY(WU&vaS5!J6eA2lFnmo?yI3^3shtoE6$ZS%WjA4kI_}4pQLIvZoJ8M__ljjI!a*exe z^Mi`%s}~{c-!U-Bgp<*?Ej+p}s~OTk?!FhheP=>rxkdMO!+E#2Z)`Rh@OM27R53b@ z{meI3Tr3jSn&*rN*0H^k${M(w_qLPvQpfRpGaVCI@D>2=*TDg}^gV9(P*|3Kv`m;s zx1Tl@2vP0$;Nfr(%JAA-ZCS${>mGab#(^s1COYFc>mWNaTz6D~FSnH1qMbuw_{~;^ zjDX{5Y0S_F%i8bPb!S!XARlNT_o0-Y-0nf*Apci;9!Mf3jqj;G(HnYdPdbj5tw3NT zPA=P$GczCYzSRvqZSsZIo2@IfnYvCZvyY<8orB(uHtKfpP!s33c4vWDkk6sl{`#K{ z)7kcJK8aG$^iqJUZqKE>^}o%(b7e{W=Pw2$$lF5I$*phRTlvG(>eOT=l@gmpmO9Tv ztNZ3^(Dh5)P2n%Lf}V)tSp4vjqH3#-n|oc&syI75@i|}!@}C?kOTCQoe}@YGy7$ID zd@oTd54=P6PYiu5NyzgA!SjV z5L9#Iip_|kh??6-Fwr?iIhyJ%!=szET?&1Cf!7^XUQJ>m5 zfxq>9ui@Nbi3IK-<3j5v0k~Dp_xvT~>vpKUft6Hnk4HrV?)!6x^_7t?bextV`&O?9 zx)Mbd2u6}zo{wH-=Idw2JUd_qcyHD9Et%3_0~ci=rf>B}F1Eos*s0&rRhRuhz5i;g zmQdI|l3!Dg-UdW5+jD@%SZPC&t3Dd0%hKr~?BrAJnjl*7G3fZO0_T|JFvQxd&bIpJ zH!F#@%MI61%<&JK0WC7u?mNb zep(Zl$s0q_wIwN5wuq&_ler9eY|fwXjWuv}&&eKQa`kq~Pz(LUDJe6oM3oqQTuM?%v{r z;_gtaSa2)F-6goYLvY^Q&w1~8&YW+Voju7U^WRH;>so7x*Y4o6Y&mYx`mxjJ9HMfA zk64x{0?5EQPeyyEOR$~W_i#5eM8}-Lq@s{s-=vZPtbqOC;$9geet-oZNd)7%ccq&+ zmoltsjL*zy39nO{`{ctBw%&2e@4j%{>qQDF1p`FtW|Kaqe*GkD5LU6>5}ZWqtUCEa znD#^BH! zif;DLE5Ui(FGEmV5RA+ZM`w#|pv6 zml)Q1e5u*Zx3&W|lzr*D;&=E7E7tE5arO?`j^^FH@08z&{mS+ai8rZe<=drOUedLc zE^^i|IGQ1g<6wF%!lKBOetCsm;aOxi>PdDPQR@3RE8^_%(0cb$4Y!zp=q_^Z9Y&ss64=(QL56g zt~h}FW388Cu`bd0^-YzB&e~E%HNq5<+OIJD<2C9#Jco;}qm{*nG_bo%EC7k0x)7IZ z9_n%;u$$$5Qhm4sr|@Po)IcAwO&|*l5a%4~PlD3a`=t1U1Hy)dScdtk@=Kq`Fg znOP+=a>lTE#C{L~cX5V-w?1e-L}#V<0)_k%Eg=2jw>jzj>5A-;wN9BE&&ZPhq!C461!v`Pbo{d=@qs=MsdvZrU|azbE3KT)d(44NQ7cqGbMKT4_69{ z+65%WJk$Qj`~BafIhb53J=M*X0O?#+)EWuaQCSBa!zLA<^2?slY2F))l+#6POH1Y3 zKNVI`mGyqRZq9CKqQM#r_uX_f$t;?_vzSUrC!u6L1FN>_w=u>}FF-542KFeD^Z8F@ z7UfVLGOPmBxHg6X;iSz^aUjtFO&NSrf?QQ2CFwe9BvjC?qnH|`LcyuoE-vI4D<}DI zd|h;F$-r*X$NHg6|La^!$+_fAj2&g7F+g}11>_8#^h;@}iZ#kLD+=?C|NKrCvAUY^ zHF~Ut<#0euRfsS^P6j`+yGNu#Z02lHxGd8(YApjU$SvG1fo~c)o0R&U4cY>*bx#@1 zMrQna7;P-oWAV+Lps5u0WnD4)15+!k_ix9Jd8UzPmu`Kee)6J)L~1ZB)cwR(iS=@t zBD_woOrK-hkMkpo&7A1KjE_8c)H!w;s?;sKSC;Upq(c`ymC#)4)IF&VP*Y#c*3F`3 z18P8mV2R62q`T3~41%Cf5souZ+2m=jnqw)}QkHV2y0c}d*_Y}2PtI!H7bp!l4T@O( zGv~|=ih;0#EUjh-eeL*!p=ThALEyt@k#5kAo{rUmAoELG=Tpl~p(3Z)tH&tnH&oIV zE7ZD8o`=|%=nDt^NjgOuHV_GC4&0h;khy+SoZkGm+3Qo@0dm@f#dwyUMG4kR1N8#i zwxv+Q)a|gX<#XAEF{6h(rfJS#+vDM?;4R55zb|;-Jt3YeTh>d!T7iL3Q7l0KBvNzE zLS_#G?GZbCHm~9m{&%r9tImAlFbliMT80%CdA`e8lc_XEG9a8>dBncb9_6|mq0qji zFf~aj?!qKkLm}0`eOQA#U@Onb2S^@=E;ktFzE1!f7crciP5C|w@C>_G^t(MLxnG+K z71<5Yow@-`%VQ_oF;TtM6aRx;s2P5uVcjSlBrE9TsM;U z+sC}D@1*OIPB~i+2eGVsu%;cFZjPqTi4R+`0U{M#5zL6WDhs2&DQyJ+Lxri95cv{@3$v2!wevZPc>^i?Y7{XQ2)x0{J))quy`uS6Tvt{`Yzq5)TmpZ5j1CC%TZF4Ru9k?D zJ6N31ihPelZNlt}q)vTo1{Xe~*^`x^NYbTyf}12CINJxFmtwjO8ENpeiMC=1i7-Be z>UavPWbf$KWhXEg!Q8g2_v)yEZS88ZBuEu~v!r$>oL_{K2yFlmfsf9hIR(wDSu5T< zzqGMC74Rh`y%l7!ImZfLGL)S(dZRAu_%sUFU`ep%8m^?ze>vAMrvK=g(SAxg@XYp- z*+}_c>*E-UeYGL_%Kw(+wf`-vckF+!|NpkDn=9w93~hA82cMhUZKjv0)NsoC#9x2K zU}7o4e0B#`nH$u<`4?`fkbit?{)6&X{Rc@&%zKWKoQ()Q)W2xNcdAYJB*#3z-Ddkm zCF(z_1Zh})`iUf4B?-YYEvZ>DA^rvE_HXKDkY8wwL)R$Z!kIv${4Mt8t=awt5h?Y% zY2qTp|N0C7@?c_9TV`N(bz!O8P_hNrD8p*_Pst?3jg=cPCD{JtT0=;wr-|OZft(pp zDf_D*m@o<~ueO?++F0nS`k*L;sALR`25oV)wU3|9AEnAR+&TzV`Jwr3Oh|(oI^kJr!SV4d8C@Jf4LPo z74rydI!393(G2GB)YH>!coqY!RFCj&qTFmP6=+M=FdjIzVhs3Rr@dbfGMuJ+gKv3+ z3dofr4l4Mp;u2XCxj{(v9aWsZr0Db~&HiIS$%D!hllb`u-4+>Ts^~J}oZvcr2sTNU ziE6p}GmrFju@{sV6A6=gXe~G`{{-zCpW$6iEma@m?w~(!yuTW4AO9GJ0v+&;KuDMr ztyq}(r>ZwJ44V512K=9wPfNyx(@52Qlp!obq7#&u7$A6iq;O1cP5Bu#_#^$?K}yJW zs%?vS$mx(O8ISJ>j!LyQsjHP)On034lu;O~pw$GXEbEr(P=Y+EU^aNS^UtdXKJE{3 z@4uQ_Z_`l29(DwXPvljr8$2thMemXhL=Rl>3(6$F?ajdC;)XjPsbSE~54u^VCl;xF z=R-Jq)X82vwb=w)+J7pHnj{cvvqqc;X5JGie9C+#`s63jq8?oSJ%J2Fg8uUa?G#@jXvuR}9n$NXP~SKfTnhV0q(CNKm2B_B z{=y7f&!Gx;v6{qBjM$QizTfQUD|70YL=av2O3G2DFz{z%rB>-_iy23Marl>wl;d35 zK;Thi9cvdfV2hd@YX?L7vEe)G=)ZOxK3Np>McSe3@?tS9h&&Si{xavSNs5Cnedwp4HoQh{=B9^p!`idl>V$_7~9%jhOcPKjXQqb@?goi2n zH~e~s(N{?=JFviqRE2<=A=PSt1N5tV%*yhK^b-=0E2rBp-O&G_#w$S`J7<0Z}JcfWLjtntk>SmV@3*yk0H~ZV%h5M zw@ePmc*hMxfwi5Rx0f@cLUI=VUXq7Gkp+t^wzfj~iYm&so#GtCiz=3$^y<{;*mn;d z_@}uzeVf(7F`q!J&cQ6?Py!Z_tfKpa{HP@D934E)xS@++UOm*nB>;)PEJ zd7BtPH}UFTY3fX2May#q1wQ@qL9?$pRQ${@jz!dJwDxm7(wo27)`8t}BA8MRphKu6 z5;64+ieIC?XUR`rO1?+`CH7@M^b3VrVWhJuSx4P$MO5{!<6glzd%z*b@2y;ssd{&FvU`>GeY<4Bw2Boo%3 z?bC@G?dE4|Dl_loLK#Cae;VPrd|0MKL{DFxX z=P|1~Ech6=7B$AC2C0ldT$?WkS{o7>$|aazHZj7Mu|WRy?>|Sxgg|N7X)Pjppm&{KK@0T%@LCC|0m>eWhJ%_TCsz}#6un~(yOGP^W_^(H~{-EPkS z%wCC}QKV}$!%Q09Y*5dAL3NIgY2d7rJPp9gDEn8)k&>Jm>k(a?{}7~CNlq`2`wsX9 zl6q<&r=Y(Ou^RK2jZ$!ASTN+|8x~nl9L{%|)V`C&)MRU?BxvdGJ~4T^5oH?qXn2*g z=DNl4Ls&uOP=X$GdG(AK=%N6ub^4r8$_A_*^+6u^yE7#iy!c-h;B8FRE6LE?jx&V& zYTzijpgh^4+O7@>yCE{k)-G~*`cIbWjh1L~5(!*#-#sO3D`Fn{MN5`5R?8H)UOgeu zKO1H$vslwZHEg)iK#Xe(V*dK&q~RZu}( z-Z=Y=2Ky4_xP06B*tFPJg92H=9r&Q5ZP62+xHZ{(%qqLG-RD)~Yd|RGwWXaQv9cU) zIx6v+h3<{OY^hR#hyU|Yne;=3oKDBhp$QCXTFDa^wq{e<0EJ#Tla2ZB341`ial6C~*^y29&{A&`; z@<)3%-Bi@KCbJ3*K7M#$hBo%8Tp7^s*nOGYVlndW4g+3#>|CxG+lgp@MO<0Gwx+GA zA2YF}c+j?5VQ4*GVtq|SK#ng}&BbC~WDjW6U$cnxtcmWaUKp*3IJQI%$yO{Vp)q^M zV+-4nTCIubvnvJAgVayhBI>&@D*NFjLJkmOYp}igA{9ESsqb>mY~+g9b7YaHL;j)X*G@a7m+Uo(F}w%s%J^655wCQqb>`-sse9j zQU=3sYHz^%yJ-HbIZ|vT5(pvjabeCpO2TZhsq3$=&jf(P^tc3;CS$XRKbd{w?PtTiK_o&4W<`AUbHl09$t z0pIV6Xt03W^CMdUkL!!B$<`SEA=KF*NNZC}C?ZAq`+x zXB;TOq}#1=IhWRhV_)Ve#W}v!a8_jvLfdCdtV96@kzN3tod%>o)u_hHYfu6;ywtIc ze~AYEaGV&H=95kOUB}6~4|#X7o-!PFK<8woi(a?M6)Oc?h|3#zW_MuX{lhbt2$YSG zlJA*9tIP32`IIRh@f!zqOUlmKYIB32fIjspjztmDR3d|4GR?=~&PS8#B2`qbdcdW~ z$b1kjSkmxB$P|U1PW)DexKX)8lrg3BU1@7kKm@|K%Od@{r53e9f*A6A)`(Wd;ahxW zPSuhCV3=SZgdk&3|BOS@a`24>1w|<0dpuWb8Y$Z( zq9Fd0d?!Vvqrx%V{gEpAI&AX-)i0Ts% zg5ripD%*#2K~UaQtr7+C(J`7XRnjv!2uNJ%S*Y;%L1I%LBz{`~Iedby=wP3w^x;JAzfAj%RzJ4g~g6a_B z6WuyCx|>-~Z;TwXySI|!xd*cIhg$~jDPI7vX=#&%M{?D6u{)^fEjpr+v^?g%J{bTDaL89MFW? z*RIU=5y%;$FWl_kbKp`GnU-mBWha?^0YIFkoSJnnAJnc8zQ(TmOA%VL6VcBtOCoM8 z+@`n+v6{m0l-AOcC|Kc%^5PB_^QHT@yHVx~$qF{%gytmmp;dR zj_Cyhl9dj_OCJ%Za`^b9#}{PYwhdHVJbf6xYvWn%{6JbkAndqx1>%GT<)jp9`l$ibFMN%Yz^|Y}bMc%d*{lz?pSRYWi7c^;op0Jxbc2 ztLAXDXH3kH$M5ixpOnoyJK6lASXkG5C_v7;BR~QvEN}x^k-Sb(Sf`8)_~nH7Wlf42Em@NZgf6Dv#w9b0c~ukHeXc%V<{qvahz>R>7mg z@VM?Wtdz=*`SUE*z4LsJCAhk|M{1Zsypd`O+&BNKz5Io2klH$9HuC*?tq(rEBfH(L zEKqbb4S>(7V;kk9GK4)2HRRI--ApIqcQFR2XA$^U%%^>%v2Jf>u&e)whxZ$k2K839 zrWTQb;SR|D_QyKJY2q6ABhoaz>kW)9H4@3m2< z-T7vlysP-7hXN#cEB;x6_f3h#`&%yl5`GHVWp2fcgWXWj^3m5+KR)t>`}986?1w5| zHu5LJ3^9Kxsapw}$?X3n8EY(D<79}qQ-*U5XGCbD(S7m1VD|sq<57!U@@JB~?_8+! zrgr^b>5JLbT95y)7^=JIWth<1+qZ9f8QprK*OB}<($h!-Kfjg)4z3&HAfCM*@`k|e zn<8C>52?rfNgtsGvK$vMyRx(VY8|nHtBU=N1E(lv*%~hASCRa(JLlh1ZFDlp@FJ2A zl1*@a;Cm?mrgOf@%6;&T=lrUZ0P8HJHUlE2D*xgl{70-uJVmU5)c^`A=#?iaSPaJO zdW}r^>hkk22s$U-t@5KJCGL@^SuVgh$e&KCM+}B>M|_Yq6J=Qw-F#aWsm{KoeE!-_ zBHq*IMSA9QPv5yImG|bWrG@3LicHu%tSNX|sKIG>l;votJ=00|YP15@_|(gCbaG;B zVL=bGU|gwrdJ<8fEl3EjOxW>3T=MR+>L>jZ_bB&yr|YMtTYoMN2IZD{}v^kbd61)3dhy1MRwc03o7^e*hlX!a6ln(ka1 zJIq4Uz%uSWFp?yaon!yDF_^XYh#NM@P3PP28$sF1Iy#+<7^8`In{I(=ju}O!hf?zW zBQ47JDLM<21{SV@IbX zCx>6Re)|taxt1Q|Ah>bZUAJS(s3_Nt3B-PV+%wOG01RB6gial^LT}Fn8Cs(`vrpQk zOog)SPC}Qo?4gmA z#YnuJXO>8>)O4TNr*gdEhfA9SzfrF14-JKO8MBG?8;__xGK;m|b=1jrFtS-x{eI1c z4{F#+UN3)8VBX()b{eU5loxMY80zTHbvWc6i=Zr`oHNAR-?6yj?D8ponx3UGILw!^qSHwEvj!3f zH&%!31!pWjVmyo1xa7%^2m5t?Kvz-ksJ|09ccQ&^w*8*^b5y9vh?UI491Nqy!{qes z%KSnP#j&eHyB}87vd=3%a7S=@L+G+^Yo*A!;=a8luH6F5!lLNr=v({all7a-W!sm@ zL%#FBHgji7^;&07S_XeFtJ~)tQFkrMgK7;I6H=v=2zkU zgMGX$qSlK$U4a(Goh%GcwB>*eZFpJPx#RM05Y%|8;)jppKvZNGwEyq=l|yRa3L-%l zN(ej~Z9H!Ke?w8hSBz29HH%$`LaU4IKC3Uz7uDgq3PU}iAG&+;K5&UFRjLGj^=pwX%#n;0ZxauXl$VTP#2g7Mu>6-$ zQ)|+-89xO5JXDKGJp;yvkr)FkJe{PXrPQfYBbD%utN&;zR1~y9NR>Dt%KS~)tb(cW z;BlC`*PHM7ltWM=`JCFsL}Z`;kIL27=#Wumjrwwk ztQ=327Jm0f;IE;#6xwKjc1Er!aekIUd=Za2DnTZ4Eom-@m|;Q=8Ra{h-i_KiJI~-E zIS2&Q%{;Bb>K>$wGo|(3)x&zPEecMDadic29uU0UX)UF5kP##*p-bN=x)G``|V z09=F)`rd+8XBX>0klDPG@XMedNB=1QR*j3?aUJ=;EFe3nf|hBP6$rq09$*V`=_Q3w z|3uVTLEmwmSCak+Ri>2{JMY}h_hPDb`v54r?G6#}xR*^(ttK%6fgd3PnhzgRABe!A zc`k7kig<)%YD4{+N|Pf;vBDW+=*^8)G;Z5Kt%vyGXIoS6ZsDe1?l9o8Ue3I(VSDG{ z-#;0)4{^gL@pX;cm%Frl005+-QhDKar9vw9t(X_!X_f@y5>K8JD*Xk*<*R<(^iLmd zy<)|K?t1a0w|Df_X3z!rB%pLr|G7HBv5Tl^s|3cY#2IV#JR%Nt%X&#)aCJR2(UF-n zMTUgOR$0Vk)1aFjTh#2DWnF3f9o6n-tjkwz;FU?zc94UL%C#_YIUpR2XEzj44l1-e zaFc+y6KdxkLZ#c~MBK0nC0+i^!pR4vvR+AC&Yjz7S zEN(%AbeiZn8Q{O`C2yoT)rN6v>=IZqBWt56>+?M0ZQ74ThD-?a8wy6{`w@YyO--Tw zci;HwZ*}~z^z+@py+v&UaZWhRPe#;t;&WMB8!d{zeHN2NZ&KlOrzFF}5}YmzU$X7| zF}kPkL{NF5N>e$J5`*EnP^Ckh%e0J9GuB!?KRWgDPqYtl3I-P$K2#DSrPyt2ZnhGn zY7fjVqwPTU>sAGvLy>S}wuGL2j)=-Vrn|SLJk`S{iPsh|>|<-tUpKSz$BuwW%D&Ci zIVH@qb&)#o9^WFHB+f%!>>l8$mV}#bS|f4YUzDm_F(ewtvA}oR@pXut?3w&k+W>Jx zF@}c}+bwv8^4jcJ3*7qDY%tsrc4|%apnvSrQ6_SMwfMfHMy$827St<>&TkkRy#D(7 zhNB?APnk+2Vxii^GKNZq-xG8F7Nm{>js0LxA>n$3`dh8I*4A-@!0{0^@4=oD?F+1= z`?Z?gPTy3C?>)s*t1B7biU$Q>{fnQX_bJ(;JGjLShtHrb>}gpf3XaR3sj%iL1mL)r z5ipYlVW(N}5K~)Kj_T*1{?5rRmDE5UtcA%@)M2jC27M%vu%T+QBat|W89}}SHPeqv z=*)ev@+H9!Zt4)wcHgQfNK9qB*=eH$na?^)xnM4a+n|3|E-1CnL#o1}3(CaS$^%(^O2cb*;AN9e1g4{;~&T-fciAOjBz0!2F z!Tulg3L6ZF0OA2y$&uW%s3=A5#$rT0US66#?~lY*Ge@#o>KnK!t~W^3_Y19zxkxaE z&3_k^ntl#4rKEMm6ba=Uk<-`oaHUDm`$*_kkdY0n?a&KIyL6esq|p_Ei0jxF^7{wk zQh*pC3sfMG>2I5~U|X|a0j8|N8!T@j{nA|SGmQl)ox)%C8QnuipoQb+O)nQiNFNvp zH;5PK_2;iztakgI@^8OO`J~5UUOlS+D|=LW){?@;Q|<}K$&t*TH^-Z5dvmig-+er{ z(s?*%&|R-(zoxN%U*`4ZWznwH?E$I5w3dufftS~%8e%bOXW%c1o?lJzvp#_W zciD`b4+!4IWdF;G$TcApb)XQ4(BdvWjkOW>-;8m@LP&pke0H0(&RWLWe;_)nE^pg! z0pR99t*YgJ2nVu$Gy1$CEq3J$uGQGr&>HC=jp~#@gE*cz8!7j=uB!3p+WZj(tf@^e zzET%Q)nIW0%c55p?X5Hh*}{UD8w}cOSr)rDO)Y)o%ejU-NP>=|oA5x(AcmxZbrY`($I_|vYAA1hK%Y{@HJ$FSN3T*d|0lUdS0OV~DVQbuhc0wP^DT`nb zDS>wqZi{~B)SfVzHiB5sZjSllX{KVcaHAesoEi#?oS=G5be~vxu~G#0?O_~ipL4l& zNnP)dQ}a17=|3BvY7QcAD3>*VF$T~t4EEn--HI~bgP`nsCK1v5X$O@%M!Z|jOV@9q z^tx@XKt)bj1hQnQk1H6!92Aa-+sez%)&fQ{R#i)zjK;}}3`m2^tY;y5NAkNGt`C7CiW_$cg-S0R`hrd8x+Ul ztm_@d`NduyW4rGLEh(Lk&I)27=S#oyrK!Au&RtCEXwXV~67ExUV3CIN&*FFFCgWJr z)~WE&&SvC@%cy7S&`~$MtF9A1E_yT+;PNqU*t0hCI(5)$|I{yuZaZ%RYw3~GUz2tg zC#e~Ie1*A))GsiTz#F-(c;cDIk}XQy6I4QX+2Mn$`Gb%{vQxa8Si;8|ou61{X$7%v z*?aJC4%~;urr!ls?2VD^K?1 zo)>S(eNWZ+pS$4e(=uXF@2Otczxr;_@?T0(y?3IlKdxKKsrvDf>C(JJlWasQ+zuh?!~st0e14#=e3g=x-@@i2I<^X~X|o z`2R@B&fK_ij6tZQh(x5zz2R&2lZ6ah_Diy`*HugHyIzdieM4p-;g+dZpI3xliqrlN zJ!}blpbH|`)p8n@7GipI?n2AB#(4)S1IXU7De84e-bguzN@9TYVN>VxRk{+1pCD)7 z?8$&L9jbPgaiy$8yOM<@syB=wZclM1wCWN&sOq-BR8NR9-H5&mOo3$82cRA}^kN(I zz_xXuG#E}p12R+Fyrt{#_(@=+oGiB~Tdcl^K7h_RD*aD8_}n7`*5K}VymRQG%{ElE zy4Z8bh<&mreP>%2UFS=_KCK5JVx@OG&eeETt+cj5FB&7C{fNr?(jU9l zuH=gef7y%Om@M`q0Q}2-S*Pj^rFxDZ2H#&5JDqc7cNLEL5haVhc=zI1o^F5m#?b8uz~EnlfybLwzkM@8OK=xf zm0n*3pPPDr#RTfMglw*)stN%k`a?3Z&zOsmn&@ELFkIT^UC>};Q=?+VHZfUU$2;oZ zd3kdUcKZ*LcGpRZ^grH?sGpAV4V^9f1Jd;a`_8yJy5`MCp9`;_c+I>rL8V zWm{P*l0r9Z(hi1SSg>XgK5|X>1@#*U7IM=T;4h!i)p@Yd`&bv^WY0EwK+ZK_YX(kD1)t17 zmr~Lz;t&AYRYfrFxY0hLl_}}E-n<0`awi~Lc_X!ZmZDE(ZzJHfu=+mpgh>E+N*OM! zXHG>q#10n6kC7Q_{&7Kk=%%ToxyCyn3?5<^d-Oc>X|8Fq4vn+RkhXkajd-j;)Wbmg z9q)!oAWZQ1Exq6#J^5A1WTJjwR|z=v!p*U;ZUz0PDI&x{M))A8S3N`j&(YD#o|?D) zw)MtRoDX{`W=UI^BRKkb?P8D)Tptr`k5-~f)*78GP-NFPxs#oKH)fkhk=f9!G*Xt_ z{+ei?G*VO8oC(3VmC$W_i^cszx4>(l3#)9ir&6Pm=3=t);?|?6xtVu$WlrLfuZRLT z3kHR*aMP-0+xc={K>!;#5q!f9*TTS8^`=Z9*AscAbo)q)$HB@)vVfVik@nFOY zUoN>%8)ef*{!|`0u_&8Wiqzg8iBw-4M^5ZOurPD;f}RSy#S1 zv_~iSm{~QmdCh3}w$IvwGG_UXb2yDoijUh{G}C46yEh(!dpy#EqSRt42fylHMp(q zRjZqgjQ8f;d1f-W%c1Qy=#0~EchOaE7fDDahQ^>ZA?~D*N$Z z?)*%vJxZqinWy!kuRYNHr@_-?@_7!tKKlv#(|EhPSsZDk3)wzuiTm4$fuXt%wxIc3{oCKkZ#BrDylbKFclsbGHuP z=G=P{rEAs%-ZOvL{(%*Bpy7gGG!|K9W8pV1N3dY zATTF`&CmJHrw*Tm?X>Zw{^d`ZNh$n6`uTH^!mlhO)F4|G4Z=N|h7WBUMzvkVKie#?^L9qKcBTv7vZJZ3#l?mwot-#LA|L|9*x5w< zitylQrS(3a8dbZRW#`)}8ln=E?W%9Rf<^<#8zzHt$nJ0qBc2aKGB`(lfGN~Px5}MM z3CdYh2<0O9WQt%a^!vHpg=(X_5~`3JU}~RBWXT`DxDfFDLq)!Ie4NQIA5+F`#?&s1 z0ZpyYq~8>d$K?NI0g4aYi4>r=GY9s}uN+yk#8e8^Whkp7`^ffX0T7hpIg^T`>&%PyQed_PK=6re2UlFtsAM5)XM&&0K<9F6J?{hEG zBt9Th`9Z{s(B}y6EIvF?h7yg+=iPd4c--gn@!%i0dJ?TKm}w6uGQO+6vTzZkr5EbI ziQxhA@IWof&a=R>5=t-PnOC?pqEDy?xWYI-SHWw2S;!#=;i54K;74rMr|PQBVXcm^ zDexWssL#4fhlG6;2hrStJjaIlEG(&a?No(NHwDke>iec9FST z5HRc_1(19hxdzf{i?BFRnP}A7#-k1h(<2JkF7}`!+D~jG5mOxIsUB(#SgOTB14pY_ zCpGEt`nOlMu%#_1D-@ueMFEyyhtQ^y0RblFU9iSmGnv2<5vWnt)(5c)YzMD6y$Sc^ z&=?*Sgy6thqXeQQ+`Lx?1wJuoy z&PcSJUd!%3<-s)DUF%c{&fOqj>nJlo}4=HXTW^-gRF|Yx*P%ZyrK4wpufF9Zn@L zSf!jlF_{q3LP#q^&Hkfyv~H5X_lmXS&A+`6CnQRg2-Dv zFgA|3le`j?W!({1#b;hjq4Lvgu(bs3T7%Ij&VyJkYXeLVb-Uu~_E-tP`Uq_X%EC?c zC}(g%`{?57EvKfILwi5g$kSERjcvI*j9qCkn=HKZo;Bj9Stz*pIRm4=c$fLM*5Ovb zFvUIlNNV-Yt1AtjYJa$If@pz2a96MH<6nHpT}S$3F*61WKv<`DR+J#t6E-%XM2pin zWYK>*@~9|_v5%vwRt`Ow{hv6?rRy=ntCHlopPv)r;C&5nx3j_jjG>R#I$KV!+GrB0 zTG!#~em-ZxuG0G(YLV5OpZyGE_1}5#u{D(4{a);uNBH^uYG?QAEheka`4s>8K&;_y zS8?@SJly!Uoj(5RqJ4srTf{N@rX8N!?ud82!1cOVi8ezBD?>2)`w{=fjf&#~agg{+ z!n3aKk93%+R$}@-3g;MxCJO*kkqiBt7?|p8itG#>dY#N>lG6r1 zTMz$pUg>Uh_|x4;jsI>sfuBilobvfXO=*1+;VYWTaE%@wJ+H-(_loO&?zFY|BboU7 z1Ps_l=&W-5RE-TgV^bhDQZ`~&Hotzna(M00ra4$9!MVz}`W|xjRI_BaimdiZ@KK(A z;>B31wmJOc8%T|%lJowQiK`LSr+xDS??}^=l!6U~n=9kme zFFp@fO&!fVOV2nyhq?}yA#O%L_s9Mh&YXFViLd4($a^w^yf>YQ!2efE_n({m97w32 zl1}~|lQp!%D;ytht8fv8(ClzH_;KfK{+uk~Y2a`wn4{O~h|iNFE+v}Y@}o(K!f&rQ zOd)L7Oq4Wj3YT1!?qcyA%;)?~;8c}r`{QjC!pt1mhmkK4LUJViz0`_ zQ$QS+rZVy;DQAdZMWpI$`ZpvX+7FtQaq1xoy=zpwtcmCgkU@B*UAI<5kE@|fv#V%&r}XWzsKl5ePYpo%SCYakYX?vER&wD@0?I9 ziSlgWiwWLhRY;mJJf)bLLCzw+6yq zec%tmOi@OD57$R!&D5B<06N|?{P9KQcjgALc|P)cToM0iLnB}Q!Vg9MZI}j?>Fh-! z)?Bj;Sj$@{x7V$-s&9^_`BVS1u0HU)Db~__r#RZkLC9m4`uSxPX5sEwUVAypK_OP> zE5L+a8`Zu@Y#^1V7*zBcME-PC>~t^$?kcT9Ov8QJ8e5yle)1GP$MQ$ldij_A@0HjS zSL3~!*v|*C7Xe$bC!jqx#_i1ttKZYZYF~%PjrZ-2Jlpz$P1V{W*<5u4V%17Sghhzp zXYN}bp`gN)ZEL-pNi93aokF)9V6Ap&8ZvGaN%VmnkEp9jHjB!TDhIc^V8X*?Pe<(Vw0M|Vz8D^J4=x` zS*_=+^+MIh&jMHxQ_A$2MEKw1Ge0Z5iO%q_=Nu{CHEdL20QKN;=5#wty){}b@WG59 zcb+D$IS0v6_d>&V4+S(Y1=8u?)PyQrg76JmOqtxleU_vIEfRz1!#02Yc<^qit@6fI zW9Fdf1I)F!-Om@zzg#DnTH+Q^ptPwl6*iUwua8tJcIKsetKkwKkR+_q!zHmEO`_J|;NlkG4n1 zGCXZ4AX@_SXGQ*%Q4NGTUnwcqp0UR+WS-7B-%Di5RA~`wrU`{8q@P=1OiYtr35W;(?3BcRmzWEQXs)?07 zu$E0#9TT%D+f}Y$PUoUlBm0gydBsFF)1_>by?^Qbwxd`DJ5Rz4i9LM<#&4InUS8yo zQll02Q;s1Qm>q2?7~mYQyVohAqk zPy8cUnp1?A*0HfWq)O1uNZqQf?WT7ymAyVj*15ggzRd&=N%`3WKZ_J|)_FxqVW-49a9%)fK{wcs(`G7#)##{q^ zkY)aokO&SFH}(P0F{ETyfzClWyP#FVNoX~32aiCWD^r5aJMo!huRS6-80TNt>+TA> zqtd5?E<524m-k}^{v@k@$Amr({s1=3&a9g>T`vK@{VA~sjP?sN;hRl=Y^A54**&yk zcT@Z?GgX_@7Gl8_vA)>d#Vc5%H^h$HqNr_4Rje5Rkyn%grEN#NCCRrlVI?;%E2?kD z4RhK&pRvEzg?)Sve8LXdCmwI-lyWi=mgY$h+~nBk65V?;7mZ`+v0- zzYCbHkl6n45B>Ql4^y_AW-`o~ck#>Obo_OCuJ*p zonA}j;?L4)Yha{o#;U1>F7Da)6`=z*Q-W>8-Fw-Z7D|s7=Q1ZR54x~Ee?kCTd*@Ix z{BB=q?kXJTY2tt7K7QGVMCuwLLFdY;KW?Cm?T0OsamyuSa7QH$(S0x^w zQP%nQhfIUTw4!rt6=}s6v!rA@27mgO z?084t9wiTc#;1I|NIqY)5DjJ_bOdW6-=|l#M)m@QWQ05rZ>BOXqqWn zihAZ&Xuyh5M?V}`D$%$7XS8LgXSeTBgem2!-B5yP6^NrMf5z&qOXjIVb#+X^01B{n z^#jARe2aW(nD5W>3~BR&j8sxNS?G|@4t2b7`ei6T74X`s(6|)IMF&uXzKdp46GR@+ zET*4*@W&Z4Y*$lwcS-fSrtL+0p-H**iNsjz>rgYb-Eta%C(ODkOTSn6#mpXvC)o)T zV0;H$o&IHu=)0uvtATi5-?U2Cut8Fr?dDg06%0hMV$HIe+8}-h@G_%cb8fE(_xm@t z8vd5!zW|*m*>*GR9_Y9$l|9*P!ha-`(&qQ(j{f=caYN7go)Z8$*5g?-L?5TNdMaet zNA+BdsN>6Sw@Zq&8&8Jy(Atew7!Qz^tML6Ml2y@|0Jg2 zr#`Z_S|^#OY*!SroMQeJT;l?d6#EZ$0t3R(yVM)m69>w{3YT|v7F4ej7q4y00VCt> za^8K6G@8TnQ$vn+gx8NGvSN~iC}Hl{{=mq)yt0rg|v&-Y~>v;N0bPm9qN zINZ3R0SRNRRJeXOYK^xuW1AOqqOtPeC-PC>n@#@v>f!);%D+bko(hzL(OnC*#2EsS z-#0!#mpyvb{nYWk^kSEMAC_alk8!+P($)yCapL?^k-T&L9JoiU!gii;(>U>fv0?A-HRYrd-NP=ugL4xe(EpoZf zY~(9ZlRGh`WA+JwQ1-VV-wvs`CaN zrL{J6^2U9k(~T*<>(D$i;LcS1bjGr$?bDr10%jRj#qQYC-hIuIEg22nqdpj=bhycK zaGHfus^H2i|1NBix74fU!kS&zcbpdQbeaAdozCqf>gURYSIYIUFX^S}f(PYPZgf&P zHS4}|YZ>GMD6Uze){4gaPB27*s3*rIsM8Y=dYJyMmJ-?ag`ln5im6OC1l_~gU;CyK z#})u6f2$|*lA)Zxt%WpGJnqwmpeU0+!)}f*KKcDMQ=g^W`Lxf$ZV)xoonBW+!hO12 zoHlA7^rrxHC-~{oT)JA~Ztjx)dgWd9)*=n4?;L10P*L3xI{$H{|E0ILX#Dyo+=4jX z3A|6EoTa%&U*lOn<>EBL?~9KIYUo1#f(k57G?mR~`7nF@a3THs;|j-O{5Mzz6DIQD z3G-mq8+OkE!FjVvp=BZx_qFGGc23;=`C=kYjx7Vi%VTbF&Yj(Lh2^ca#}x}!KL^yK zpZW&HuU#D{G=@8EHI3CQ3A6(;Rgn+a9_cp$L~`;>dM55`<-(l?1YCT0dha9$i=30E zm>0*CopV}+Xt}zeq)5S51cm%q+fFw5;%!YJ_RvUj1*STOQir;(a7eX3Sgba4dJtO3 zUcouEoVHzVvC0Z(nZI{$j~w`sv8G(fX3PYBX52|@1oD~wm^ml$F58mmmW0p>vL@LZ zh)Ib0V&DLS->IKqZfQGGwb)}1Wu{DtKEs#>VsORN#$U|jO`K_NZbNCP?G?d8wN*gI z4#rjYKd54VxVsQSHsCBiUL5)7=IHGG39@}5LBZ{rsM{jAGv-)F!7Eahiz}CeN9b-* zPbkNf3F_?fsys?Q`tOurlCrebizcT$ccnp85l}yi-GHlAMGpPBQV+tpc*|-WO~p=j z@b+tY4s5q3#0e(-3nL-E;+x1ZRchbCW8cxMkw;0ttH;yVxw55NG#A#L${l7nbWZkV zcyIsZ2Jx95XYoL-yit1SpH>ul$|BXjg4S8ft=4PEAjb;A@%6F*=N$g@_9pyBfe$9_ zMYA#7F|jA-`1A$8VN<+?s#{XHg`P+8_jE6XgZICD-|yZS z**b`u^|qU5)TQx@oO!ppIdr&xcZQ-eRk;RcIv*=ibd`y9>A}#&TY+C~BvwZ!slkn$ zN>!JduxeE{k_LhcIaBn~VfEH5ef0*i8k1wmGHtI6n%3iVMTIl{Y3o861f1*!Q){D- zm~PE}p^9YGkyO*XnfTRP%k%KFdaB~BM7wg@5tgOJX4x(>B*|FM1A`tYYSZB3Nk zaOUGLM6^uZxmN=$@HoyTs@D`3ik(w2?re5wMh+2f-GW(>y2$`5C6*BfD-3={#_IbE zf-%)uc3K_jO4}30ncO?Sgq7P=@;G8xqrF{17L{IRZ3|>Omi3p>YQE z1thdpX70lR3Z^6}^XK>;^Ao-V;1JsD;i&81O8gmrQS@F)dPQR>1?y?yZ47y9wSmaY zJ2S#sdwgAAiz?=W_q;}8o-(U#^+FwuP2QG2H(lahGa`%F(#Fu<#+V8IY<=o9IOhDF zS$706vamot`2W}||LUd6#gbge-jcKzJRyXaB36C>$6P_AV*}o8_QlX3;#VYnJ}$4% z_sk`sU6Gx`!3ibtK`#9lx2sM#fV+MrgJ67tc>b)&#Z`qb)9Rmo58NvmD6`N+hWudD zoh4Wy)p08t99+8TbGBUlOr*ufo&MM5P#aH=Mk~eR(VjlDyFY~Q2wKPI8c_Cvg2`aL z&cuoD0zBCoVY01KREjq~Al>Ir5@pYY#iP?Q@gsNhyJGPlg}ic^iVcf*NE(j`aqchs zctWCL?gAe@j!D2k(4UhHf|{Z^y$g z2Bynl>w6T&q&;ocd2)b1lW8;L z?ZQ1?!@lzR40$pd8eQeb!lYA1D>soz@T1I!zL!wki%!?>?wv`3bQl{G664fC^~4eB zOuxfHw>Yb4JHw zH`!^PR8|^q$O5V#3sZheex`0n&LqHMPjcAERi_26H^I}(pe62dQ$7?9N_r2My|T0d z)eY&tf&da{emb$FMruyjN=$!~HYfcM@gXO2At1TpzV3uEt#Ba@&}hZw`gN(P)}jDk z-85zXN@(ub+beAoN06kaf!PvRD2Rha{EQmU4IR*Y^9hQ-(7OUqG?T5 zL`3pPV7rQ%Q6oAN@*n?iLOy&dRU3=!%+i<>Tg_jr2HF(uS=xp+ydqMQ6aCF46V@fj?l9a22oFrRqA^A776^6L9L zx5YFn7plgeW3!STLYVGc&BAEex$gq4yC=sSz4d(x9lK-uuj#y?-2*&KyG)InfzQK6 zZS~oUGsSb_gLcrg8LP-6q!ddz=wZeyuvd(5KlX?S4U=?jsWjmNWLt#)Qh9G{ZD?m1UyMV zFJM9_)d7?=LEBNT7r5}=6Vn71hw9}_$q0{4TAK`|5k-0sAoRDexuthxoRmnYSL9@L5Jy|dt9F`qQ*QK0o&2Do%X9DVX7uX_bQDocRFH7-3?-^ z_T5>Th3O(Du(v&Ap9h}P`%)k2zE>3FJERTIOQqQzv24x?UVJNx+57K^ahFoaE_>e> zU01Apg^H+n+QueX(+yZck;T%V93S6c?j0Vm<0DMFq2Y*)KWy(@FG63?X3B&g41$w| zKYt{@;Xt(=KANJ< z^ReQsb&%gg>z7#1nW`#Pr5jZS;ZdiFKjL(_Z6dw(1&>QmyN_wc?k`8{IfH$FOmz(; zor|fxj_^u6YV7*&XWtJ07KI5@En>n{bAj-Vf4lAf$K^U980juZc%6_bhrS&f8>`ow zL2u8bBGF8oOhM}|`R}oq2(*T4*6OpA0DP=~VSZ0-ra3Fu_f*!g^`Tx~d2F~jWx#X?Ovc_N%lo2{3 zip4a|d{D(so)jWR4ePh{HRzEMAoyWnxd~+@4!)mmrhaLKfk|fhCuq;oQvj{Eff{|q zdW0TlP2i4TylF=mEb3TK_c+LDe+R9G*ZTXWzI({h?ruDTEGn1i(*(Pc(#+peP30*+ z(YJmjgLn!6ylD@T-iVi_HR>H|C1qx3)5?k%VeukAnBQJUi*F1J7%QvBv`TA079~}(m4s2Q|9s(i?j$+w~Ziex601_{5cmi}-8qR=Rc4QQ9^jKyA z{G`!REU&RNOY`?gVk}Cc3yzigj4RZZ?8p>yr%0Iptp)ULPq4?PhPxWDWJ`ozuitlL ziEMh~6LHI+Z&e__Q%C7kjc`(2l{Ifr8+W>&7*d*4^Cs z_*N^?Xj5v5%xK=?Qjc2SL{$}=kxQyY^a<#lZ>26RGyAq;&AiEb4fU3<@Jj zZAm=#_kLB1h@~%Q@SrDCy?$D0ir=4i6(4g>{*Cam;KH}rbc@;fofQxiBnGAkkx+4=zwR5~ZRgK4vEx_*StnD@gd8bg(XCZy| zsSU%+x-ETN*JvTids5%4W<+ed&>8a!IMo3W=Mfux3q4f}D_kT=c1xum>}iY%^w6EL zIvkMPotcqL_KnTmwJsVjz)aN6XWyCOU^e6Q0l}l`cunFt$anuNIx{(y&Rw%DBf5`m z=hIfh48&g$-<0~DRa<*J-1zCTDk|w{{N~wUgF?4?IM#Wkv3f3#X zwWB^bv$;u<9N3YKgalK3^Yso~sLsPXP|n%_n@iQjtp)s6{e@PHbp>#?4NYeu2^_Y4+@Xv?cA zA+>xWb8I?WUVcnrW!QhUELK;kw&BErHVX>pg&-=E(?p zAvS_XhlP*hcHGNlJaHXBZ&_I4BfBS^PmUhyr;U9${QHa{@Pr5q%o>oFOZhxWDDXhj zT53-GaomPXRo9y8EOXa&6r-IPP2@a>hYxI#%y*n1@$a*xa3|lzC~oFrLpITR3fp>} zdA*2W3PeeY>(dOHE4_2__-xtxv;b zn_TZ%+x4eo@;*`bh~xigLH}w=1m}{Jt|xz9M57^VogMz}yApp6Fs}2(8l=_dIOpv^ z{QaDGk*#;}wDI&%<=cBLPYjL5;IqlP{XrR#1NWJ*R;hmT5Iqxs%JkES4#BKe(#;=< z)R)SNgz7*_jg#oSnnkkb-FRKB4YGKEbbV7n7vDT++$C70&IdaJYv7UoU7a(HXdNFn zW|)0cik4MY8TE9pvd+M`|=W6R%+mX0Jh zQ@rfPJL!4fF(@1FbH-(8VE5*wkmI`agVgq9vvO6yX7XLj`n#R{wFlDTSO#A{%L7O@ zdh%eOxjNHnnDPv_bx;n?I{P%Uy1*%Vn$6EkI-QQAK(4p1Z0To&eu#;@3Y`w9q-Vd> zsPly6nz3S1bBRpUrOcybKle%EV$u%aJ>^Ip_(U%W|IW>|rQLZT=ztubk*h(YWRz9*a zMZb7WHzI74Ig%(`(#|2Au-C$xNB3Z;;4Je)`s4_#uIh+KXn8Ei^P&5Qs-k^{BAzb> zS^~)4K;gZ8lk=pvZi=i<1T=Bb@ass=4x%ho^3ygcSX=b!tq>W5>74xfs|_8f&#L7CkFPKPvVEK@ZL*wd8kiH zb^clom;|hToB4tBU~2sHjnCUL1-G%4439wXs_13MftoQvy|b$OrDOie@o`ylrG1Sz zdQRq;WS+Eo{foUN!%6294gX{=cQ)Sy*W~TRnBx*z$J^y0{V?IE!KL^8LZ*6E!s@>o z=IN~}nwSRcU%ff~WbW`}0(_qp);IZgnccXvF#@`=kOcab*f2zNRMJh9%xr(ftJ}}q zGBt3fq|hfs@VrnlRtIr9(NL+Xx)u5M@W z`_fVnwf>ew!pEkQTYHIQBXx~zE5;NnYHGP``iso-^ItJM!{1>MR>x~#57IO3$wv1L zZ!NQ*+YTkaWLnDIbAGMD_y*fx^OrNj@2~BpN}h9St~t8@+|7A(M*>6)wPT13ZcTCd zO=F*&lrcYsyHWYSy9|iB`kW@>{UnS1$#xa!{OeM5n(%~Y94z} zs2GL78b+8M+W7mxIgpbrG`{8b+icpsSPyH4Wz9 zNV);r=7coWRVha_A)7J2X*e`2*2up?m(HBc$wEV1R5E&hmBjla(|RhVw{w$Gz2zDB z+NMO?^8D+7D|Cx#AQdyAq(!92ol%Z320v&Hc(}jqDjd#27if{vPiF@dpU4(GdR-I9 z-#3Wvnaz5t)BU^iD)q5E5>m>TdK8XmTx!C@M&Z34`a+i~3Q-Wat={dZ{^L~Ksat9; zyKmi&=!Tg!;Wr|9)mlM1QbSFYjk}_Pz;wiPoE6m?40Hu?DkgO05MHbv5Xir3EsjJg z0B;JQhF1u`(0CO&nwf*O5e_>lRYnaU+bD{bl&E>jxSRP)62|Z^;WYEny1uAm9wzYJm{A+-*&sZlRk}-Z9;2lvK-NWsMdp%6YO;@w8;3EYe?P>)qpHkn#=($RH*18)Amxk3j#hwIXgX$POACBFex1=p{ zE@yp2az6J2O056*#StB;13|MLlDE=F8eqHw;svXdu7QzQzXn8J^N z%^~(LM_=e6zeywXYK8S~a<{%MBLc7iY_Q=iOvhu}*ZyvTtKY8@$x*&(o%mEB{LzUiXN%zz+tbb0M26#Dko$aa+< zq_Y$O)fH*V=S-ictiZyR^vF1)J+@TacE?UwNljZ&I}i$MBZE*ImO+x?oaqI%T)m<; zL?WOM=?ZR>Vs`iRru60Jb~u~gIftaRJ;;zklKE|h$))m%ywdYH!^9vv15)AFco=%a zW6$zSUA&8yK`eQ2r<%q6CuvhdZ9#+pd7#c6!*S0)bh1j5L9mwFzS66I5~AO0;d2d- z4vmkGUo778h+=>|>~PVb#}9|vZj5GuetN z`GegMX*J|}w8$b@W-QvG3R4E6nX&+t0%o*;gm&l(L+dd&NF^qS`z#IB=C!@z2BGi! zHB9rw*QYBVJ~fro-bOwojlk+bh+3|uf71-`J*Jj>#QS=fESyv=%!yKyccwMBbOY&R zWtPqpbmt^OMKL!3CWR^Sy9};aWKMxAy9L9oP&^Q^#dwDn?58u2gqQge4OxouUO{GR zvM>pwQ#vT=usZa5#Q5zxctcdZp4jm1hrFB3G$&_XA#VQhVLvweamyvUYHPc#oXgZJ z4V`S;CA4M)E#Wn&V=BmrpTVL$?Qfg+)u;R0!|N5>oL+CUmdLC)EfU56LffD{OP@{7 zU>qh)Krf0j2%505EyVP)+3jJtyKSxOL9^Kn!3c-Qrd4d{)t^}(A~<%6S+t&9aA8@p zl*R{A@y_iI_FQfM@N~19f+uYD@N^r0dH0Y+#PC*o3CWV2-YMN`6ZnL&QDuTryG_B+ zb~X1Z6kjkk?u_EXtpjVbtfS4Dn8)$np{t_9VV8}M zIGjibFr3eAAO4a=Z-Uq+B%-FDT4h{nlt=j%g?9S&2nR(%##-1MkoM~cT;O2R!`{Ww}4K< zDvTiIk7J;VGfkB3>2}*VfVcoaW%9KKIA&DS(Q-(t>7?t z*G9!(f?vj@(78z1&?g}MR;@{z+S(yeERekxoy?RGr_z_Dm55H@Ar+pxH3F zQf*_0FXRUubRN??#cY-H=2_+~WjS9XeG{xP>UD){^2R^ATbP?&p)gajYxP46^MY?&nKK*93{`?%dV@5HrL(Q^ zL`7XXZjym}NbY^4q(k*fzQCn9wdnaPc6TQzuh0lhWm8PM#=V4_N#A#NX%%1Ulyd>7 zWoxx_RrMj=v9{nE2wjb3vjoHs+>dYAed+-Bmx??6yLxy%7MFHPnq`Da5u;v*gYWH_v#I zpLjQnODA3xt6u#RSPMRE04!)W+|~9 z*b?F{b@>HweYe1k%lJ0VwO7o1ZA&m}|KZ@qkx6=nq5KJdY0A~DmdejLyNh%6s*d29 z%;e3FWE^U3OQ6G|pyiz0Ia&H8`5Az20{(if<$}039Vee@cP;U*z|^?lGJ|=!uXdwq zj^>Q2JIU?q^7bZ!gZv=EX$D2N%*g&Qs3Ty=2<$pnC{@paI$o_rMWuWTvPbR>b@?5m zqJs9f`|8mYv_X$|t5?@86SS4lnws* zq?_p@zWz5?bDOXNRTqpVg;3!H2Vah`k>AG^yyLsCI-MK^Wsr)2R;#u=Y+dADK5Y@F z%8&=d=UP1Or?mfWQW_gaWW^n%TpH5Hp=pq&I79Z_fP1v=%{ulB@iJ9k1z1J@gE1*? z>ECw*-&0C zYyqWkqm-wAvxq(Uu72Z*1NM4+ifPWu*Pq(;a5t1~;&)v{5@lnYZMnmTeTsc=o^=C{ z?rE-mXeH%k7Pr1#sY&8vDKoT_--pnjv*t!3)@K4ZBW%k{VE@3tGQ5!HR+M}ZnHErZH z@hxpJ{Ir`N9O(-XvJu3f8}3!)E}BOc4Z7R)S>HvA#|Iv#(8~G91?@H(UqihyO-vaC zchGKM+G*=;1sgwWKk5Z9K*_+;;MDhLOqIFl@0y*7{4vXPIP*Gpy?!+2{*y6s*nJ~FBC1Eo=eVZ91YmZ6;1FstD<-UkRk&q) z3akCHe(ueic;RP1a3~{v*Q9pW>}veTt-js+UF6cnvbrC<&~e0F*L7E`h?!gDXNzpk&$9j|bpkFd0LzvMEH~8tX>>YXACa zI3{xx%MRyhUBqZ&0Qb|;55gv5Vf)Hb;lGt?Svn995@3}pV zx(|7(wFcNRPG0 z5`z1H$ipQw7&m&5XI${Es#1*`$%81$T(0t>fC4>1~FpCaRzdtm^mYNHzj-$tk$qc z+*9e|ve{50H}yX^1cWYA!{Kj<(;C$iI&o`#)m+sb(ObV%;9>q1`$sP%Dh zlvS5FQUG{(y&jS}z~-fGxgr_rt#m`;KOm)xZE|y;Hz({4Qt2MzwIfvnuM|r!?u%&~ z(9u7uyqswFckZtyokwV0o!g@@L4Ud+WW??#Ekte$TsHG2iK%Bc=UPDehFC62L+-|M zoij(l=bG}*^pX&H)4KIWhv^0JK^CqsQtwaJ!!U5a6ZfC@6M<#?6Tvg?WvgqrYp_$fBH{{tI<#$sl#2o_D2lF}R5Ig|?ts|2Dr2FD5u6!80?+=|x{wD3{kZ1`h z6-0TzEI__v;|d~D=;V?jR3ADEBGq+Ihp}m0QH@h6Sjx*)oUF^sz0>@CkFV}qSxkCY z{qR8`pG10IGSBJ~E`m(HkLq&q3lRqcq~~PW-f6{~5kkHiHCe{?1!9ot@Ywjp{WM4a zkk#7~T8lmw;U-D@I7Ykn-yaH7L&ekQHs)4ecStR^y%(E?4=7w`(3d2j#W>+@XK6q6 zN>DjIN43GxNXEdg?|v~Pj%8DW{+l?@^b-G80E0im63peDCjam)=*$27@1zn#O-ftP zsE6^HU0$%mx%NM44L)az)F%c0rOtPxtSGm6Sa$FOth4`-9e_Clb;nv30{J<-s!5>R*Fg1y zcs4b<>Pw@g;l*z|thP5g+*cerXgmW7C7j&+?3lzjvng$ZhK#o_msaJAXzqH?Z3S9C zkr}65oT2ZY=yS%iIk|*|6CLn@LIO!r7fq11uk0yjOTSWG5gsL7x~!%t$& zgevw^67c!Q+nt)kVs8C0XJ-0>yeOi$wOMAXin&c6QpuntaG%1m!yGNKbIV56C|l|1I>$9D!3ATHfB zr@`g}I+6h702Iq5r#@F=PcheAzENes%5#5sW&}Vzb8p1G5_VXf3VfusxtR*&eX@iz zaQ`WZo`h?!ce(^nGa=LEzLuc(#6DdT=O|tdDhI&lJOj?9*81V?Cpew=7?>XHQXq0x zSKb9J=HcS`LVyfc6CA%4*Zg(J35Q0Gev+HHT4=X;vg4yZgG)np!vm~17xt?C?!PR( zr#kL~aW@g{YGB?KwrZ9FK*M|s*qOnt5mZp&)+Uc@xzUR-;c8VB0nnye2#C1J_31m+ zVX%k1H2cJk{^#n5slb4QR=b9vWiW>I`p49LcIo0)_z2fA3hBKA6>6ZaG!`1yO6F&q z=XmlD-VU0UpCJY@ltS<&l(ke3fR3twcgB-~-^-j==DFI-bglY+=^T^dJqu$My7Y;>!D)g=SZw(l-=$NxAX`?H<=b9IkBFK!SKp^oQ$eP{fg4&H zZ42o}tIC+0h{u)-{WJV79?r{rT$qiZ0Wu#z)7PK#3?Y_ltIo=P_S9r50+#t6vDMjc z5~$5Oudzl~0U3~d?&;tpBX+#M%}9h4tP~|JELKY7&Bcf?WS0!;uj-`Le=TrRaOU<+ zX>NWlv<-2epadEY6I1s{=xra%(O6sf+IX;(RYc8--!8YAcWms&msw+O?5r|>ZI4Wq zh4`3y>UPr5P{C+fU3`;ahF6Zw;rlq$m3ezS#~4m3`@3`J4Ti$w6zFTPsJp-s2As|w zL%Y(>^VwpsDDG!VS0HT#og*Z`@ZH3#k_pPWe`^88z8gbe+ggFfUmBw+Gxv7L?_fBA zN3-*nQGt!bOEYML#V#3+Iu*!)(J#5q_i^*%#ibtzam-yX;=!vRL(qq(fdX$%MAo#0 z;yZBMV|D$@%gmzZQLpD@oEv}{b9%AL14}~M5&F8%OV6`;>|J(fmhJsR8U+6I*IF*M z;I(@ll64}_M5K`iA|^SnYyH=hon+2~OzsOn{cLjgs-K|5m>5FmK!}Fle()KsgXnFg z>Vv>EXvdOIbTd3{-ZHjf;Pd9ICA9B&+Qp{S_Pt|xZlGhkzsc^bc>)w_$_$7adz(4rK%bnUJ zCM)_UF>g*#ORkIF@fzUozzM7|M@GG^+b7%p=}7ydZDe9u|5PBiA4FWPsA>f3FQp#o zf$i5)L%RC_3Qz6it8%a>nd>gr@>5*@$Ay@B&rQGl;r1X$d5UW7<$7wf?@gz;xT~OO zZ)i}l#w(Y{#b+YvaU~2STa{(r>Sh_5WM&g)*WL)SE3}v9K5%t)@doI^cAr*KEqyKa z8q|6=o{%khxw54#>#G57%q`sJLTdb%${%W-%TzkvP0otDq<+sFxj*ni}5jt2q=}LGZ=A88o}c+sAPX@t}!1_-krM7LerO2&WI}SUqPvjOKG5-d*46WYAQIagKO%3Bt**;E#A(JFQufzMbLc(9-|lLF zmNnO++p94`S7^qsEJ=7iw^5QopEmKwb5(qHJr=4Yio+iJzcYt#j)lkp4Ji~mz5Lqa zwtV$jN!!GDkD8qgIS^c*q}X!}K`)74I}AMa3Hf5Y zHDg@BKht+VB-=t(&b zb;$5c9Il=7EP~z8_{icZ+q4}wf22ultvL7R8;c<g+5E$;i)ARFkorD&$!$Iq={HB1X%HFh%yh9987zJsSc)Pp`Ha|Jq zb#LfmBrjM`+%m^K#DKdv<;35$FvirRd4H5KtflsIJK#OM_TK4SXqbOZIbv=#>#pU} zb}~SL!tx7Gz!Kcld4&^!=|Q0Qsj|v+otDKCc;(VxDZJ588OI)-Jm=4aXOiqKGPeY> z^X7)FFYmh_kGFz}`FTS;p!ewr+pgS6#@fr2?biCHIoi3KH1?GK#yHE;%btb60=t5H z+oc>k;FDTiQh{=u$VwgilUGPixPT+9ws;9?zm|ZR8w7(6`_fKsKZK;f1A*DM{qIgs z{j(DKJvaor-t`Ia-RDRq!fAX?YR1QSO)U#~_I+*FBkC zkLW@f*P_~mmoS(^xBr{NM#Keb+W(~;`B0^c{9=!@t{26@1Nh^5P4^SxpaK|;Inm{? z;LU4BP{_a=zA7;%%hq@X@2Tr(avXPQN(DsrmHCMET-A{$`?$02Aqm`(bQ`699*lvZnjO|VW&IwyeQ$%pXr|&he9NyKD#2wjE+Dni6FYo`RZFE~5ocCx5 z-AJF_SWqI5d`vDw(ZrWk-FsT#`Lw1jn7J-sDjMj3t|` z&-rce24Vg2E2SaU6cFYal{y-=0-Y_W{f#g8iQ_l zJlc=%usBN96#apFM7fkZ1}sje0GQldrRB@#0Ep&!{TOoB>y79M?T?HO& zi6nASIDJ#gWj7@9N+!xmT{b!To32DebOzsBXwY%>Cfn!20Hg2QIduYcSj%tDUIm$Z>~>&Rg2KOuMGouvY0K6e@q z7{?v|47OXio20@?7gpI|#Zjp~x(@L==+efN?eOTv2)7sLP69sKsIL|obEW$0%U`-F zeV3+qX;;%N8uToI@d7g7i0cUqr>ZxnXS(a;{Q3_XCD->D!&HgyfV;NO9Ib=o5YBgV z#N!*@Il+_!f8|74bl@9=2m@NC4@!>R=yvXYA>owg>xK=C1SHWW8Wx?h`N!HY)QOej$>tj7xv%wk^`;u#a!Uqe1jGT>-* z5nnYJ-L3;k{5*v>u1)i;;Lld0!>SwNu&1sm4Cbu#$cnfL!^bp#uaW0bO!CSueZ!X) z`fSWLt*P6&V7SeB+m{>vkR&mkW{iHlch_;u({LpYZ&JAJh`+4^{}=j@R@Bl1G9DpYggX z{lhs-k2(>j;=n90*1)y{)$m%~pM^YMn11~?Y!Jbv|gtA5KV_)d>VHnz3uFne3TO#BuI zcATu_o~c_NA2~iBs>9i>?-q3EiEQN?WBzq8GU|nCXFbvL(L+3gNMjD0{R(Ms8gpIf z%!L#)4MujN1ym=i^$@_VbZ=1aIlstJ?@Wup+<8I9Hc&= zG|nCHg>M2h@RUnmTy**6M7FhCP1Fj+8|$({RE3sNE(|(I_!#B_@<9Ot4kOY&+4>XP z{?p~YU!pnbp6~i11iB@`fLWAsuilO(S&FLxCLY}2a>Itp17WFT9tj9rwKhGU9EJvM zVmcatPW{{`()Os&R~|$DOI-eau_N<>ZpQSIFzoYA4S$DSmR+U5T(APWmM*>gr8eHw zfJD1k@f`+tp6i~RC%ZKM9)90I*_iMm#BJ-oxh%;l19_NE{h&0ErrjHm45bK!w}~zx zp!bc?>0?LwQINo3d|f@7uT&tQixl2RViyz%x2!FKZu`?W;5ca@r^d~0K!HEBbhP_J z5Wf^f(#`qpJrd|vQqsR`0D6+xx?A*WTRr&V`9QQT*W z%nh3_=rlH4ZB!9)g3Q&6{hkP#1eqW!RXMgR;Qb`izhf*XOse>|To_g2gCIo^fA2-X z|Cps1Z9Y*`k;)-c+LxYypsU04vPVt=d4h}Hn!BkF79;DC%N{9SllY+p`Z;EU;$*Tc zdbJ!<-aFgq;8!kRwlEv_jXQdW)xhYL>4^zgGBdhl4j}LBxFY)OF;&JN^-(W+4#Z%e zNWx*ydqVDC>S7u{4)8kA8)1Qfi{fyi8I6sN{S-o)*9DT^MACu!!22c&vB)m~1wf6d zT17EwPhljwXAQ66RltvO=CZVVR7`N`AT*yPgRYoyP560aX>Ib6iOC3_@}iFN061i! zTX{ja0^lB}0zTgD3ex75=eQBcHw#hiARHGQ5}01V+3nK=r+7`hlaJex)nO#czom~0 zm`9;Ih;&_{iuoSH78axkZ)qL#I^}RD+pfqX*syDJ&b@qRKGeM7+@UV#NCQKFBtaJ4 zMjfdJ_4&t7Bx{&mZRT4~4c|Kfji)i87i=L(uhD|^17#PjKd1VZ%7A8i;YOlt z*J%5|kjW~6pNCD9h?&)eKd2j_h3h|2pDwl0B-uA|DBpnVag?+QlOND*iEgvW>*Lm1 z`vn6ER^Js42L(UDoN7?c-^60U7jA{?A`*<`3=GQJv)BD;sp|8dedQmg5h3V3oW^4@+LIcF3qF9~}sLXWy)jwUr0G9*ZjB~`Me}S6f{4sRP z@|;Tyq4JIu$2W_kYLdE7`?$bIi?@yV+(*MHe*6>UW(;=(cM+RMy4 zi7^j4m~6bGTQm}xTycsytle?r|65dLGDQQF9j@yUrJEeX@U*yT1Vws|cjf3aO4Zy! zh7fv%IRP$_uzj##Dz!TXK4gZ-_RY<3d0AC(rYp|@4CTRY=TV^ztK&JZ4(o9)0~Fcb z6TJ6QvrU)=v^k5*NdV8Z+@7tyUxNwn)_2HGVgHe=4965aer01?sK(!1i5j)fK0$tU z++21G&HP&n@T6i=e*K7jR|_voVw$fKj^j&ut(1FSdu1!71*g2N~fUaHj5#}JzkipXBhU~`_VF@a*Kqh@} z!2E>FS1#R=t!Kf&Z(uX0TjWgLw^AR{aTTZ}YH4b&vsl#Xufq8&!zjJ*w3Y(D*da`dtRStazt z(Ja%MHvb=t4BZGvDtuZyrX3kZ8%kX@y}rWQWV3Jn)d%;_8s_6%@z;zI(>7!+3Gl4B zC~L4Ii`^;D|Ben;^V5sr12Q7Ix<-Cxg{kFtX% zH5efzP2B+6@2L}omYz767YEFQKsQBF5hJZl6v^_~OGnQ(dAM{rK#;t9t<6-MQwo|a{d*6ZI4IN_MUNw0+F*Wt!`(s(+vOoUV2*>sc zl?)UhfnDJH30&aG%xSQgOx?|)xaS=x%V!(qlI?r8>Ea^0+8%JV0$;^l6=K_A`2UTz zY=iPliaDW7I`}>0c9}sx{znWZ7sll~JERY@Lf?=)ATKiS%?5C9M}9>4{ZP`x_Vtj%b9WYvL@dl-y<=N; zN*Q2o{FTVtMy)x7lxeD|s5CLAA<@}^Zif5Q(>?3c&TDl5MS`=X&lQ!*?s%SLuq2uo z3xkcc#{~Otw|g>){KaX*{Rs%Uzen6ZZ0<_P75)4T{nG}AX5$C3d$cN^)WFkakhF-| z+>7{;ak^`3uNjR)YLR@Ruj+W33sDnS?~>l%^Ad9};RCKp)9(3Lji45w7^8^aTugck z1Cl1C!fxhMD1G5VE|K^RaV_3(4_+HJ?f|;U2t#Z>$uahKcOE=A&{OeZu3+%ZL#>!Gs`g%06?^YZ?W(-}IVb1jdcQxf@AbK^2&xZ^LLEgud-arT1@xa3&aP#)rv)Mz$JVVnfqxO# z#$0PNX@$NwHqJ5w^2EA^Y3uN3AGT^=ybu*FTro=%70P_0(B+FG!n9YA>ufOvEc9OX zqqkh0>@;?tW;&)wh#GeZbU|)Pks+i%Sn|y2hnaqo4cHWr42j)XrmtybZ+Xv-#(Q(irLOd=%rC|` zID|Ucub?TDxf3e4EB3MC%q_EP46A!QZ~C&AV@_y5Vn7yJx!!;6LN3|Y+|16II=%YN zWjV$0P|gIOj1%KPf-IFHGc3)HS|fngKMc2SN?klc&8;(TBLDmI%j^xJUe?OR88K13 zOfRnpU;1M=eFD{S7krp3&G?k*%!>_ z3=zGGagv8-2B-Wxxe`tb4HbXDUFpiR@fR=1w6-N0I)H+es?V5QonI2!jiPnyte#Hx zd~7(Xjr|tv0{0vpUsJ!nd_6Jaeg9~oVBGkbZ7eZX?;CldZ^7PPHLi&@MjhmmcsSToLJ1`*^EZ_8$RcV_k^toK}OdhN~iTxlxkJ z_dZ*GtrtkYU4x}+SE_lQLebB-xnEM>v(`y(_w9n>z#(gOtZH5pm$iO!#yl~4A$`GX zSQCoGJ~IxVGvEU5caJyD@yNitCNJIn&l{^skK*Ye|q^ z6u(MUb+weZI|e@BA$2)_ek$P%zA&OiiMbraLt#Fn@AK4c3FO~|0B2lVK-N9&^e=2*C=9`#05*?Udx%s-|D9Xu!O)R&qWboVAsvt z-rx5tCn-ay_SsEMs3!*l@J3omxr+8zzX2qP4xW?px-hn@N8in@($Hl1=IzJkF@OaZn9@?oJBJ|H)$xoL=RA9am{E%b`PFGb$8B6BvXjyIp5O!WMw8qjU| zI{Ub2Nr7Q2p?82(sy-;9j(&-?*yb(+j>7OYRf4s_wxtP02rhX?sb668&syJpGQ>$#UuV5o{LX6{f4`0(b%^FmCi3l)zF&0GU|k^1*VrPaj_K)cVxft+kidGMIxMh`;M$|;_$`I3Ku|$6nmY{9Xf%QQT;fQcojc}0J zxnZQX^oeS}oW*HrF0FF;9NGBQ$0eYsexXQbD$;?gLGctAwck9=u$DVtParhEdqB%J zGjwM+(`&#Na=tL5c|uu9d{Gx&y*P^taSztyXV7h+(IhFOoW3yx2yP@wYbKm?`{SI3 zIZ~4#*^JE{W&n8o&&Ov+8}Dk-nsk=iD5xaoP4S7E>$7#?(^!GnF$H~S!bIV4X%^O` zm8&1kCGQresVUVDvfAROinX@PzB$h~9a2J?!`A9fF|*&d*3iFG!dN;BWQ|;!wd_h*W*i8b^|HObA#77Gep@Kuah3r%$1C^ zfCnGw-(!Q+bDuyiMNwv6DXa-$K9U51h)kmDO-OG zkE#e(4}Z=XY!565&E9ZOZfKvumbEbTufFZ+9ew7XL4CA+ zz0mM#4#yFm;GZB0@h_zR3X)3LkKYTO@mb?=MP4?e*pFDTT^)7u0vCK@r~C`NRnYi& zuxi;;Wcy7xSFKUC$lhp!nV+1aMefo04GVY94(5XnKztipirQ$Wje9!YVpwU9Kk3^# zG2Cvf&3utHL+MQ=UzEHoa-4AHVdBNmalYl=D)w;YFD;Z6cp=yk7E5R{=?*fvV2^1h zwB4li1}VgDBfSE=6?`!1+`_w2H%im<;o{GdWWnkCngCqJLpA>6tMSF(`6|7sSOTAG2uqMgHA((Y#7IJ*AsLdv1hwC3jlEP@M97+Gob;3$6 zZWkA+Y;EH;XTxW=h|l`1oc%jnvXA18@vm4Wi5ps@EOQGtd$QgEL4L!_x))# z!6Q6MG8kzUw_yKF>*&w|#q1@44W_q$kfmF6y_m?7p>?g-?Zvp^)vqu!06*FvwTO$d z(~01i!B_RGariHrep`b({#CKCRb{yA47YpXnmgvBy1hLit5 z)&I|%M;N!vqRqQOuP<-VtFWe&`u{<%Ql@0uw@S{Jf}E%-+qXqVLB7}i&0kjsO^_hx z9iXzs(H4ui2TgCStx@T{q8!Vg#bcjK?{R<>hP~uw>0k@`CIc1 z^DEt<87ooHS6*19)|XtolVJX)h}bML>_JN3>&!QPg6W-KrGmEXe~0NW>1O{l%Y5-+ zTZL_yWj8VVZBhGfV$vSwBFpFADhmC(pW^gWJ1mq6mB`vcF}#aX)}Ri5L%gNIAvUJ2 zaUfJw;1gC$QlDsiO3VN2)7uB3h>2gRSXAfN*3jo0?Ke&pUqYhij@mW7--gtM+QBZ6 zK>Q^(qen^HWB+Qqaz&i4JuJm>;ZJ&yFW6DjTe`kG(=h|WT*!o}ZSohPO48&_^9|s@smR)XiGskQg;DfP zNVry4`o<8eoUqfEcLIGYWCIeRD_u3b*CM#y{pV93Ia;-uuHn$Zmq_RqAmblVrW|d|3-{{+Zy`P1D>_cBa0$ zQr?Hu+c}iC!inwPS$$UZi12y(H`KM^+6jmPaIW-@5I@@{>lDklzL@t>@xj)gini~G z`8myJK=r~X!0MJeZ_S8aD9N7qL&~MC#?3lI8zX`$4 zENJ=eh}(|&OTJ&t7Qqj8Q32mP$^9P|P=pmLken!Rh=n4PdlqFnMp7UQJ0RXuj~&Wx z095F?aMlTUR@Za?pXr|GoR*f6!$z)ktXPAY&fBBX)24K`=2sA|fLZlu2=F8$0E%^W zVm>{VZO$*fs4c;Q9A-s#nti^h?VLs#z73kxv+LEg7jQtLp>6hBR1@+qVu)0nk+nV#&yL3Ex}3^A&c-Ep-mF zO^Ee3JCEq50Oxf?kO0Wh%?|*vk#Pa39Zno)m!r5^xeI(H<_?(0*@pakkEnV8|JiCm3`e@4RMMa1SIq9P1NQX}2~sW>=X;P^9gL0VX8)d74W%1X_w zMXUN|!T&LQT8Uv5!M^%k+yB|eLlsT1*na5F9?1HY4fJcepxc0#i$tir z=z1?PpY`+;?ekjsfu@eb4V`DbiXwN*bc+2%UbK+!o)N=F*`#9B;5jhC3z%zY0RL(K z939Yf$?(xtf*>U50q~EtoaGrw46j5_Of?>6bU^YjR+K7L(7!j}+q>3-aMl(wHyaj{ zCIwO5+oC&bqk{JQz{5Y-SYSTm#}l!UCNJGe?awTt+XL4+*UA&tFwAcrJ7RrDM`@jX+Ph{w6vQ?pUW9X8tMo+S(NUN9POKn%*dL(R!gMwJX`$ zf8T%wRwhv)7PkgG7A6g7ucI^lkEHxo%AGEz`xf^LP+nhMaG6rN{|M{W^9zp{ub}zO z9&z86ayA^&a_DGd5_9Xd?r29C00v((68?T1|H?yK@3}!*E@29MllQxR?a9}oE;X|k zv|Hk@4!`E zf~%Hyv{#>z4o?cYhnFkG$Cw*+FxROZILGrR6PrUHr{|>p;Eqf*T$ ztU6v5Ih>YEZ%|lOl$|G8#K@2<%O7(SBecTuwU^CYOOxL1`Rrcud!{tbeJmK#FkXzX^g~iu59b(PRWZv9e{4Nm;?hz#A>h;^vY8W|FC=_{0t)7v z-jr{viLnu-W4wNh%(KIM{9Ih&ULRmt4MSq9i)R&=-ANCbyHZIu9^CqBu7Q*O2v

0gKIT5a{10nAbdLRtXh0t$-R?s(LO0~4bv9%$nQ7s|NiyIftnV5G+)Zw zSDS@*O2}EtxlK`$<2blvdfD#wwU*K=5MBm4g1TUUUizPid!O=MQ?qrPrsGAd?XPP6 zuQ>6EOpe<#2l8nU`jtiF(!UP9VsB0?AHQ zUMu|OudMun`{K%f8Vz(NN%w;u-%FddfJqYP${%FoZIja}vwk_^rW%S@Tqf%xp zbF#B>+twp%)$SpoFFF zRv4K#h%jd|F?vq9L_LR&FxEZbG(#p1bwB+$%-nWI+k6z!{l}Ys_K9e)Fh;nD*W$DP z0g{w7{YNxETwZr>|1!>1i3MR9YuUP9 zr&0Uf`wT_94!yVATM5NJ(n=Ak?Gt` zuR9#RqG*Bkt)UQ|v}BV9Lx@C&+3gtsIL?`GgO1!T?@<&_MaiBr0svi$uwc@`%si`J z3Pcw&!y7SgCl-Gjf(X&oYUG)tbKpO&H%*Tcqch*BY)*NB?S_dV{Aosal4;)c`hiq^QmH+-$j z&Lc9&g%s5~x{I}zA$Rf;N6g!IWMRxNG0nWuCGGo-MdhWSep*nW?#^YFlR=a{CwamG zw*?i$0#jN#gwMLs(}SowWp$_bndj6{Fhg5{J*4RLGq1ovL)}KV?1-<=jO3fGlxlEz z{jFi9RIvL%_(<3|a`O#9OhqR#g-y==VB1%p(j)oBHf29K$i`LW7LNWpfb9aNbOtc# zO=xYb&uvrpC97K&$r`PXdxSm(cP0-65tM z2JHM1{1;dU_dq`X((GkaYOl~tcMU`}<)beCTA!qL|5+%$d8s$G4L z0bNqhOI$rKr>We0X8mU*NQ|>Gxrz!ss4opijw?y zAT9B{BxyL3IKmc+ES}+*D*cy82$h_u(;31L-5zvXs{MSJ<$8PK6=7~JsFq1h72fXI zJh!;V6j>oIrt9NXbpm-?M*1#aKz9)G5N}p%M4fiiG70Gtd^?x!_FH|>^^xWuu|a41 zxmU?z)pbdOGAWR8NZZG1*HSuwDPM}1_oSA7`+@DN45)sn2yk*`;)!qmD)$Hecw?LZo+7zimwAEO0z>*WG)BEhtMNf`i4y4x3s=zwWB_Lj@ zn2~|_R3~)-)XTa@8-jpqE%mbP@XQT&R|-_UY?eBHUoZ-Gt120 zmF?;GM^`=pF(~@aSrIJZMl-%%trO$T8}psn_*{nyYrtfp$q6qMW9=u8I&Sp)s0Qs5 zDe=$nzrXb3dcQVveBGoupRdhZElrLOD0ZZ08@~YjZDHdc$s#7H60*VqKs(k-DY;ae zvL$wjd9Ms8PCrbQs@J&{1aclSTcjOv4j?X#h03)p1z!qmF1+X%!1v z68iIQQQAME7=RTfKOVP;W^Ozg50oN3m!T=}bz^D1!-(?)@7d^{{Bz4ncHSfb1%O!+ z$~)yu(pHvZu$1lC8IR;`cVk=;Qu|@#b^*J+`UTyu&S^^wnRfcleVZde&Ddv|>*a2T zj?L;wq3eaK?yGLVg+|LExaF{#w2Y1lIZZ2Zt1|HkZT3JmbxN|n6oLBzDzwekyN{wp^2@<3y_(I27tRAhl=uau?0qkFTZN)X zKIC-6smSh@`nQp~*hWIEp_Ff) zDGoNNkRmC4p&?CPB}D`dXqUt{D$IMTn`R!RfzjyP>;s3{`l@n9CNb}Hro*A1F~P;y zUrO^@rV7A$X@3eH>mRQN9r@FYb5A4^Yd>h?oGjh48f=Z*Xg)yfW$3O#W-2d4(|euX zH0sxT{gtJCUk_&hV7Zr6I)(b$7!ejQY`fo_<9udAQ|wq{^&W5cn;5GTQQ5E5r_k}Z z+D}Z)hNoivO}Kfxv6Z~pUqC5dT8#ZHrfXYFa_+W0^g5X7M1jvwqcPJ@-|2dzajQ$} zWcK)4&F>w#$tj528u%({FA@emjPr>bZx z$-+w_R0j0o>RsQ}7|ljLRJ{BOAumUHez{aK-H}|Gtad`bxJvlV(%(dPN`K}E?ah;7 zYdl$AHaH-cn;o_g5%ClPrsfjEI}m@#5#yCy9H;yDcWA9tSCrLS4>T<`QU*e#ffXg$u z*5Sl;=q4YoeD4y)VdUFJKMi|{s$jO3Oh#z&T$<_va*25S@z$x6>5_KB}=-m3>a$9gdx1t$Q z=v#n%-PxBTN<7i_O`>-V?ao6a(WkSqWgVX)dP1Xfx1-|I^LWMNKfBIz@^Perc_QGH zqNJKLt~{4C;~cwIGk#X)fA{}~1>8^C30=lPlTCe2wK?Z_tY>5Eymm#~wnL?|_bx&S z@$E-@*CBw5eg(ISH4FSyB;Q6X=+vw2GT%Tf5^G*P#_n@tmRQ&*?@}oy7&>-{B{FFa zn1hpa-#n`*55cs&?EBe_Krr&1nWn8^pUb&cB$ftLfajiWsGV#eLky)Svjb4`O!ONV zF;`7%1C_!FOhW*Dng+>!IFn*WCnP!=RKxu!woQ1|1Sgm*SrW}RwrUa2&+-d&8McLl zW6{@g--W_o)u+~82! z1~-Tn)bzdOjgx!ji)8ZJ5PD30obFR4xwY%HiL7u&Fma3BG8mi3$+Z=iZT=x?c;bU# zM3LY`Q2-?FgOJy9B~b%ZgPhrS!|G25g~})n#CVZof;H||ob=OmY+0i|PYJ>*l>7|M zlL(_cn})giYj`$Y6tQ2#oHUlJ0`>xJk)M5>%LOZEGBqs+uS~sF5I0Kf;8Y?GMy`u( z5V_CLCo|;=Lvqd9c99JwnM(Q%JbeIewv~|QOU=ghlIK+l|D1P*xzB%v0qy2!UWry9Fe%D+<`iz2f;1831X$lmS{eh$QOrB&HY z0?t#w4%TkBQos?CJ(ThS*wKZSvO*X`BmW)KYA4705O0yrjTURt2pJj28U-lEkEcBi`Y=~&WofnCip_XtxRb+WmZL*6zTG`NQ{FP{|3vWchb~ zmq5Q>4>%jcLEwU@fleC2nUOc#sb8<^eTseclHgaD^8SiOKUWN$VUU28IiJ7dX5Ti1xh67y;`V59!KeeUl$lC7nV zFn=IhlT}N2{l7K$29hjLA$U7YJ1&$*B~Nn}uW|n8y|it6K&kVJM#8#+llLUS(HV>P zZ`cj>cOi6c7RHXMs;X+KOWd>^IB@rHX@x1qm!c|K0*Q4a3@@XfQ&`ZCoN*Sm4`Y~OH;nkwU1}6q{>;&8r@BL>)9t%JhM=(A z+b6WF|9EM~+t4C<(c*_@#1Wo~%N5TUr89MHrJ~Biiq)rv9!8NQod<~-_vZcUeGFO_ zw-E3H_x(6mzRFbq{HZdsW*wV_JuVGPSIjiuuj&#udL1Sz<|3Vu{gmu}EH{1zhI4U| zcV+_dCl90O#XP>c=vbwu(23U&`P@r?0Z(;o zhm>re`mo{Bn`>smeO@hI@V1?V`h7rM8~E!0&(k`x4l^1zlg-LU+rR4gAOGbMze(Q$Q7%F)d(%Cn(dIHp7HD?Vrb^?nJfL$oi<($JQ=46_5O;oEY4UqqO7Kk z9Evr@^`qP?pQ!*T3?s5`k=T%2<&nA&_4oXW>l=Hk9+ayWuRB2{{xSQ$sm`pq$QRvD zaJ=vzpF7MX;=K-!E4cS1>vK_^A9ig7)$n!6zE5+gldis-TnZ_&jB%cRqJ0|Yxzt5c zRZ!GA%%4ctWP=uBL)P#S>v76jiuK%+fr&gw~(p<}ZNF zj^t~xvxI3vwYgnOq7Q;XjZAl-=W0Idu7!%qEnhfNE*iEG4W+G6M1?PYdd&scd3)oH zGNRsAoSUm&@~TR5Qw(k8z7V|5b8jZU5sNr`aBAMzV;SpRj;hml#A+;_X+=;&t@)%2 zrN5Ze1&7A4`B{67J8uVlItpObmcIydy6hsa!Xn7(0-@Ekv___}0zP^Dj~p7mu=%5! zasn%db{wt-YeugS>)`JdOaszddP%Km3%1tRdOCYIlLEP-PaZ|9UR_S4A?^66zy-PG zQaPK6wrW`;lA_i+8j`>_SoxHEM)t2L)BfvV2Un-;1iEdvY!#A{+U}z2GoiP-AZ(*< z6}Os~C^W3}(E3>Ue_A zm`YjM)_wctDy}z#!Ry1aFf_9xkB%`sD7A4V^2jC}=s>^K&ydvLPi^gLP30E1+!sZc zmD?ZIDJpxQZg@tm$R=Waq3#U0b3$W;huv5Z-?41CJ|`bMV}SAHl2;BSx5rzvVwbwh zj4oy29ucj*k1jNh@1UdkDTBb%5Vu-Z=Zo{~rYX zzfby)BMQ?BGrYHO%e8xFK`eVd1gWO$Gc=)RAH#B8+cT0zu<}Rm6PiVJ+kYp(HNS&$ zm$+@WVr4dtc^tw;Gt$W z39rVV3Ul?3JF?Z=c_Tp7Hi@n(|8Y7a~M+X5*Tc`Zn@(_4_E<)@3gZmQi|y z2Luj~Esyqrq$O0dD(a&CEU^Ec@pQPaG-DRI;!LI&Gl6+@Jg~C6N=$s{!Lj~J#yPsS z!63o&#bU-&cwH+&y6eh<&3g2v{-q)))>nG(>RfG$+;6?{q&@R2&)5rh_iFJ<98d7Y z3F2o>&S1NaqjgIr8E^GJ`_p%Gf1~9t@|c^!{35*~q2Rt`yx)>axM2s~He3wqR{(bqr(xGo4FuOe+oEWMpd;~QxspJeFz zA|0{9u`P6a{b_0M^0>B6+kTBDoEcpMtN!!pa!as@9>HxmlaIn$&gI!si+{H?TABk` zPz6)M-kXF-*uX3+Lc@9S0o9KZUW#6~+_sIq9{0LaCc9#-QYe6&bOfiAomX}Bhp7U_ zrf`_9kj(FWrw{wyzqNf}zdc_)=e~0!EOsj%3g=ubjjN0HsjJ{j?IXiH(HfBCet2m5 zHzag6?~QW<{}O`9YQLcBDQfObi(*&f)5sd|oa*+1|8y}c*2=qk2r^x*5b+4N{&4-l z-u>i_kSPyi5J#$^Zs4zoX((JiB= z59y(ycWnywP{OczUko`uiyML1*-iAimC5%q@CoWjb{G4&MTz=Y$?-btfZcb)h!-n| ze+8KzP6Pcx;QT6%$8EDvrm;6>LTq)kLrEI)b(wEp$!_0#({Uh(-!k`0^D1$ikn+er zWs=WZ>B8Pj-+iNa9*qD93Fp=QNqivo( z1Z|}FY5g5ZLu&mBm-IE(B!jxah7V~wK`;$i?N2X6>!RITgV`fNTKIBlh6b6aPj&Y_ zF-%$heyE|3Z03>Y(vRGoCmdgv#<)A)_s&&J)P*9@F$f#CZLFpy;T0`DP4-d`6}~v!y%E^1xu=p?dyErU8t#t`@9t z{eaT>)|#g643*@vAYPtR-IvJs#Z|mxA{wmSXs-GPu_Vq_rUq~4kl-M5xCLIx`DgRd zF`d6*D#CPgB0o^v7SzK9X5-p5#QjCWmf z$g8C%YSqqnxJooUZ!gk3kZYhvzmPgu)?u~?i+wP6Z;3qfPdu}Kcp%7>D*x6-H#ruc z!;3qs3`6m{taxzY7^W3mey-%%DyV5Wa6gx)=`raQ3geZNS(9WZ)!bQ0(+zKt;h-IP zT6!rj$VsYAER%8&o~p}`exF&~_prIoSh(o0-`W!)Aa(fXSG@I%Mm)Ooo{za~?B!I) z#f!g+|HA?#liwB1rXuZlNF~1aae^4RJ$diGya<7Xe}mxO`_r${DLndXxY|j;x#jjj zvzE_dW(qy(e9`Xd?FY_Agwu8z6GB=?ffHU_s#FBJ9eOh8oy*tit&{1s+Hmvu8=USa z_KG%BUE$!;t@KH-`*kB-_jY#^ml7LpP`KYBP+4eM>7@F7<9f3B+*9_lJQlek+sUESFUQxg|_rCtMd8 zdeL<8JVR5@kflDJ7P;bGoBq4caGBh2u{OCdveJQbAVF*h5T7A%BnA+s-mm;7IX_on zer*2~XsE-47f%nvIl1A|72fQOpK3d_^isw0&$}b=wBzBRnpu+TUkea$4Gj(_&mSI9oEwKjLbaoUds>@QX+zA7XEUoZ>n|gx{p~h7x1OLU{cgGW*he01ba2TBUV! zpC3v7#Hn(w-*zaWlBo(C#x?Ej|6&yj9)=I4ti9(P!OK_fZqBnv0amapo9yyr6J-|b z1|muJHgR;;8Wkl2SJZ87exHWOufJ^qZs7TmHJS=}n=rPH0w$R#HfUs0@NGJ_D z!fVgGv)~($`gf=Uk5=Tr2Tyo3tP2+&s&w$Kz1=Pi=&C zKkdj$XyuR5cD-$f`I;49-<%*=E{(YTI0v05k1IfIOrWuu9sUQofAfua7@erU==wax z8dCR589V@_U%?fqH)H0F4xGDAuBpQm`qC3E)SN?)K|Sx}Zx`*CHCDoFdviZB+FLHD%C z`8j9QW>nY1G8R7=KZ0*i>`q!gTU=ovP~}e~jq3~1S#xX8@lF#aW<1Avb|r=w&|W&) z{r#1M<$eg_M>`d%)SOcKvwKqM>?DyRS!V7HtNtxnXOLb!-e#)`14k(*NeQH{tpDj5 znzOR~u#3|p*55RD(kU#BQ;B=%md7T1?|*}X{~+06=7)l>fnR$ihBN<<)`kk0`rJ{y z!X!32wy#TOdhdXpE-Ev9XT`5+z1NBflWS|^ge$k@(exyV3RFd-HS!5xe%u_GoK{RJ z{;+cnnqF|P!E+@f!*AB$q+2|5@~}yy$Y)1>%g*4$>y}dWmZ|v0W4Th7A2}Oq+HAp< zH3LD2Si!7|Um5-{^J znzyKnC7vi}-LxM@#2YiW

7f7%7JE*H`qOjfXOvtNba6vwwdVT6_C$yjf_gOq9Ax_}sX={q_R8Lmj() zm3f)hPS_*-XvfZ87sRwL%i@D3>7ZLZOecS_$mXlTSLNm%hJcMR?mv|Q#`~B0pVpLndpDF0dpmLtvyG+V=F8nx@KQ>VdVa=M9CY+2NKa!gT0b@bZH1(ra`-+S- zMPJ&>|A-3taM%3gAot|5YaJ(B6y0$p;1CVair2Q(2RyjRoJc2~x&^f@Rj1(fPxIgArFa^OHSMel&k}9|yL_iTtSclo_dnQ&S zqYYUbdGV)~S%a)nJFX^A*DnPd-2z?VUX-W?V6$VL&)j0Y{5Q}mAIv0q?8=i`qjlR% zt>ZvRIBi?$A4y_KQw}xNx2m3-T$?Y9Wz$ zJ;K>c-A%HQOKwB5+m;-1SB^H1$8z#2r1d}v&>zF)esxYGJ>v$WB*WwkbEtPq*aQWJ z?r)*}N*|P*l^l*ep;Zbz&*=BK`=;Wy&CwMx7&;%N1mo~xhX4+Dk<9jYw%!6PIr};_ zJc@#rAG;db=mPAZo_Q&*#^-H(ZFz)sO1>@l(dZV7-@*FvRmT-@<2)7`3b-hdxa@!! zS$pi+H5qSajkYbnv5ucs9Bj%n&~M!tTcCW4n%V1u=|oAO0@nhPfMm&eQ=iSGS# z@c3!xS{gm=`z-2i^vsXtdpMJ-S@Nm%GyRJr`3?KR{LSHp^S*H;oS%=A_*;(*)+3D6 zYY6E^E0;~#n>T?QYfFf4ypa8V@_X&XR;v5y!md22g)^dsYlc+7dwj0%$qo9LT4@Nj zX|)3O3M>?MK0I>P{a(!@1_Sr~Serhxu&sUT=De=i3w`2~J>(n1_|L5Ud4+rFNn^4& ztzQ#iqP(L8x}2Ojx9GLH?e228wv*eXImqtjH~K#gHdtWCCG$_~8#h}@preAd!2d-G z`(n&hTAjXYsTPui%RMPvL*aF4UnX>tfInDYJnU#X58))R09pN<2|U_84Dw$&SXev_x&stBwoyG$*i|J!v?5(h%WSJL*CK zX0D-)2pOjPQwuZe67T9d+F_BV;w(84GTDFY5uwzE`)7K@_wv zXZ9~O^HAFH1C<3RQHrAYZlZ)+JRkgT3$*MSqdn_nI4K~vJKeTZOm1Lg@T&gz;2@>t(k%92FlVQ+6sVz%ypmt`?`vwM-a!ty`3@)J9HEWZpOS=v)o9c!z>iXH z0sk~m4p>ZpJ8Hnejh*goQYFwf#?d$LX~m|lE7THcBf zf)cB%eO7J&onPl?clui)^n427t~8TYeQ%BtB0Z-BuP2cs+i~@p4r~gN#OK-nX-yf zu$`}{hPXhB`hp~+Rd0c_TK5IzbP4_)U>zXtgMDbMk$=Br@b2}@{dVx&XV8{=VQUyq zUOQH!V8Q>z%}z?G(ibBkvDkoKV;@T+Zkr#4)=!jC(t~WUH_2l}9f7b3`NjXZdudPT zp0<)9%k?Y@wOp#rF1WHLO*4@q#zU^#1h3+&s?oKepALH#!L+eLM0Lw^6{nlL+Fn9_ zzi8XAuKo?DE=bzwAYgAQv9VyyzhBAo6(C)nhbprzK7dv-pQ%qV-?A|62Jt8An=YuY z+Swe~(EDakgfJm8jwk%!2;a`$Cpy7)2He6K3*N!x=B8iKRkEyS(6v1fBdHlMD{i; zoxvcK&t>ACsCTev;fO@E}#& zlQ;`-yVPFuzo&a-|6dAw$pQbviiZXM2xRRva4q;hE2}6;WeO3JLw7U0@n8Ev#wnq+ z#{hMSI#U_F1P)m!5Y~4$_A@ifftTCjw8kwS-rhGU*%*uMpvG2PD7I-m#NKJRixAX> z9jmMtZ7SS#E6aEpOD{Qz~Yel?Sd^MI@s=Svo~}8cmbROQh)NdUp0pC4%)RvI9UC zOnzZiido2VF>}Qo(y3z`Zil8x;1QDC<$%25Avs)aby$_61rq0QVV?md1 z^2~B?v+wnSL2*Z;Lp0M0&wqMpQhgdZ`K;J3)GFirKP({mGVp;n=*x`IIVO~i4K(?@ z5;K`fd+xqQRKnIkgcfraBOSww-aWlcWJ{z?xU~LrTK$iInxP7_Q-!7`1gn7kwne+m%W?MeomyH&mo2Iu5&)MM z8FGgKS;JN=(1v;a%JOT8-({~M!>XYwJe8BaTiIysZoUb$+v%>uEWbmn#nj28t&Rr) z5+OH$`I9gvkaWAT5fyD4+py2~xE)csLt-;g9&9Ls1YFr2+Tr?3Xf6sqTt+^kc8{)w z(+P@-rT4x~awclWiFxf?%Bz;GOxw(F5PdXP4v<2o`srxEgzog`O2$m~0Fkv0N)wve zE-E@L-8tRhKIw=br+x?Jt*{g65w`R?NJzPq`j!56HC^R~cgNFnHNr`fO$#dNv-e&T;7M#g=?O7s{FYlxLE`D~)}y#^`+5 zJ)&UN4ZgWy62XRs0HB4EOFUN(s5H>c{Y>wZU4iCOJe3W+h6Vx7>0UA{Nf)v`szASA zLZ6GkbAXGD=S1C6QPqi>)im|#o;w;qub{{zs_7HR;ZzS-qg!;?*Fu|?28SVl2J^Y8 zvUHh|@=kZs0sWL$NMCDH1>TqM$BqYbB1bEvG%O9@P|oXBhkoiUyX!jLm~^4V**OGa z`Br83GWv&d!6+H$C<3uKwCRxu5_X5l`9eNNfBI}_NkvSPV=11A_IaG9@%Rg}rj72s zh`n{o;Z8gR4A4sfp-N*QjfwesD99Q!5s2w7$8O(ARMJn`Eu?U6Y}1w@xA4=AzJaVL z)bu4c-;T^Lrp1Qbb?@}rbzPBNkMmx*h_?ok4@@f?c=#9ihiuAy@P`a1>H{5Z9FlYbQLjjgk@&cOCtW_?TW`F&FPHt4!uBZ^oCe1^v2L zYH-J&2<&pJ|L#Gzfkcc2H(zg+QC|TyET5cX7I+m^5Hde{9#|_A^Yi1ZeAliM9F3eS z?NT*%e-Qe?uhMxT-6^FzQzk5Po1EgIAkB6L*3x~>X)uyC3De!MO=sb6rPwpWlU8K?VE@ zKJa=I2>r|lSez1}4^E<-1OwV$g(VK3Exu(Z*rf+a+)bHZWAw{>+}nb35@0mp2BN^^KjD>d4xcx+ zWv*H-w3+0y9M-@9YKa+>xqGrZ(m)duydL?g7$EHFI)C6@e&gu+zaL#14poSY?uVDzUFb}mTXRUo(+&9Nm$+#;4 zR>W)t@Fl7hLAA&1`0wK2x_%aJ~@wvx1I})kDm5(-&sH){L9;xJzJ^%to?R&B~60l0b5b`O*c)l%&o5pCWy@ z8MLIM;6;tac#2r|Uz!eRC!!|$@jXq%w&t_o7a*JehphJwXFGn|{;8s+q>8E;w2CT< z+5}Y;HEM54trB~Spo-e9S+%LXSJb9f>`f%KLQzC)5$l)devbRNzxVU|`}6 zp0Bf~`iqhR$Y;cv`Ot-cqH3h_d)yUpz~NwDQO^YJO;ndQ}V$6nP+XE z?;uNvFk9}U#p3(J5aI)GY0Fq8poy@SJR8%Bbc@Woy_q#}!`YiZw+5F>EN2|18NYIa zJi7fJC*JgKt;a&%>z=HUUm@eEyx^Icq2=b2OLDLfGhJs5Yh~lPh~~PgcsZdanYV({ zdTc`BmXzsv=5x++*oLU$Z6z}A=$i{g2>PjVe}R#S@DgXZ`{^r=36fHl=M8YhcbC+F zvExS=ymoNqwC&`6y!cj_9O2rRVu_awn)MBC+Oq&2Hz%R+BbCzl-|9_A5`SAF>J?P> zyf8J>-3RGj*w^ITPAA;-EzE5eo$tv}u1b zhQ`RGNF|ANE$ZvXuOuX0*>4D{$<>6+55db@_)+ewxojQCty4rYL8ifc<8+#*09)B> zymd0$tSt;OJ8d@erva=X3TT45a5UKE1?0tPn$t|+V4Cg^IAgUpMkszRlC$$3&YLRV zH9<^+obUtyVTS7*m$SFCu$y+|;2M69rCjyu(q;90N^{hOXfwOt>&_y(?XiaEMmbW2E8Ws`%T#xb}O2v3=fM z2iLkDWFG?*pBf~Hs+NLTpG#%EhW;S$?5(|b6QFtD{!HtLrFnjpR_ovHAoqz$(?n;$ zfjWLMuxU1Uz5IC3692PfyBMk+*l}7f0tI=nR$gHeE{g#0Z`-P zzLV!Eq>F6nC7VCsu}lchExaAYdQk->w*$Bv9K9Hl9G~?$E_2yf$!zaG%@wF+C%?2x zXy#p(4g}VgV-Rjj%xKHPb=gl)63~I-pRscwNGt@W?zdmebHXhiWH&e8yi$O)y+=9% z3?^D8Vx2&4k@T0sSxg0Taiwsx8a_!^>d8{E)^ql1A!YJrxO%^##s0qnMHyT!l~UTD zwU|E~++?<~&xU^(8bc&E_g%IUk2pO{<|D{2qq-Fa8Jothc^F$iSQ2$>y^Z}_Q98Z( zeEg9naL6dgnZbB$z0~t~_@l^c*T5HBrI{HwLvFC^!qMTT;G^Tca=8L>-wu<2f6CUZ zg8L)x|4aCgVf_9$OT;ZZ^!$Zqc1*MA|JFWmM|QdMYYD(*$WCjg-`axsP4{F*&P^Ei z(m}kI+|_k8ehM8op7|3maa^7R&WXg+W${D=nE#wrBi)VuX*WaH&_Y-2_a>vbbo(&m z`z?A>{uR21PI9F6bQLpQ%Qd|IC1X7{&XexWygum2>#yi^bm!0ShCH!_aOL;$oqdY# zap-g(r8|HvD+7=m$NtLMcMDyvjhBx(>6Tk355mmDVY zwh%E7dBR&N7oQPZtlAnUH|ANcwwB-%dwJ~D5rz#EA&JjtLA zlj}*o^aP(0Oz-x3hWm6h5yk(HplKrjE-h6(f zx&Ph2N7W)vgX=3RrsYgyWGC$x6G>-pDqpkV1$7=+7A;9u%$cw*8~VHDuU?ZZQjWPS zO^5(*G=p}QZ=~`4mN@2Zf*&pD`nvWSM;TluN9d_CVKJX>WEO8wg{W3ESd^-3#*eD~F{^5GioBoP`_GLS(_auoJUKW^qc~iM3TqatS+2>`l74z24uNP9 zSMyFN&xI>6BN+Maly?k1h8)Y=ZuEo-1N?|sjeJsG>z%U0BA9IE$dDnJG!plaqWQ~7 zSB!FoC4ScyeG6u5nony*+4AE9#&(~{d1tuY84IqS0(TTO{Oc}Qw9d`4f1?wK!w#tm zL{gN)pCeonxk!UwGX0RlPm5iZTMgLE)eic&n2Ot^?sn3^KWY{vxK7YHlHh%)er&L5 z%so0Su`#XSJ0hPJ3z~4=pR_VHl&ujQWUetEov4me2ksL)^K|UaH!1i=SHQpL@QQ#@ z-f{>{>~<4|&-+Uuv3lT40o9LtYCuGldl$(*Q&A8qj`iww&ISEF)P>RRB*VN{&kQ*} zm<_R1E-n`*MjYg(zs$C#0Hv>Sgdo#GN7!r#0g-sjRof~D2|@ZH#tNVQeu*duX{U71 zqDi52MK!mX4;WZvvybAl!IV(()vWpX0Xgbne!r^Sf*oy8@gFih!RwEwOOIUf z?`O|{R|{$Esc(h&+zbeIkxh_QFdPflkm^ErYycmrCAj~xe0GL^4ltIi<)M6T{|W&t zaY)Br?Zl98BXFkRu|N%+JXQ1^bDI>KGOVb9+KsW z&jiqyWmb3H4=hfwxLa8l`}qFC#F>r*25`W*665(^=`!tO6TMVnc6C$P+6OQ^J*nI? znTgrME9EF1ofP?J4Y44KQ{RgqTCjbQUEj*2*3a_&EPiTC_>Qz!u^YM){(Z!T#WOYw zZV8) z58oPoEie1>Gq7dH$ttG2sRO${hXF2ujG*OSmv0a2?ny*BKu7;W5~gGP9+oNcVz3MH zCH;ww%h>;X`ak!%YZ*cyqLiQhWmaWtfvI>76i?~uH-B;Mc78nF6!EuvWBvGT2A#~& z3)pbavgQtSYpy4ku8v4axX`Vbu5kwNEcAlzuA*ZaT@@2h)=#ZFhSNla=7kUL5zm)? z{=?`|6E$L&T=s`$Tkk%r6FbQ%^OqG(M0P3xCG(j6TMO8ZkJVLhZp=-~|KkF29YCm| z%cKzc#~zTi;NIM_3?m*~9O9p|cz*7DzsJTq%4jY|Esh2}wN@-~7UB1-A}@4bPu7bB zBHG1G*5$|987dM%D{}vU6h~Z{Fv9zYFM#fzlaSDLM%yHZKN#HKL!JvpKOIBN0;NAc zlflss&VyiZhcs<2w#cb5=%hB~ALd%E75}D(u|hQ+lYOZt17i!~(ExmDXH3?h-)>$V zpC2D6s-BN>QKGG?VE0c!AfK#{>*E~f#&#bbLfH6ZR_dcJ?WpeqmF)I;8Ze(Mo6X+8*?eeBR-Z4-s zispWxJug_e;(P>?~hDzo(>07@n_T<(*H%$anWikh%yvPebPZuBt)s zu+OXKf$WOp6J!m=4sB|!2<%t>yF1_5v7>-<*XU7dMj4)5@Ide>GuSU}()pXE@^rW> zbDc_(!h7W0Od93~GwO>|tC+=R!TGB`pT@g+t&y0Z3}xOPs4J?V;zNgSt}i3JSSGL` zTs%bs1^-pGLX3xeuW&iv|mCSPV;)q!n7$1W@XE;vf|^>f!niKjuWAp=nxMY{GeREk ze#iz=J||FNNAaIlcN=q2hq47VRkOw6UxALz2$>bbripy%`)i(aMj)eqJdns*bAg#n zvjbfHxT7cLP4NEjob8;O)#8(>HSv?x&MQxR>IyP&sq$npZ*RG?diH=MWmegIEHB1; zEZ*L~BnNsGx~~0l-MIzs+vJh0H>NYx3}5x^7!5BJz;FnoLp-3I27fQ--Ia$J`+IX5 z-)W;sOtr6+;(-u@R-7Tkz+!iTkFk^UG}_XmVLm|?JP@WMH>&_Hy^j|rMt;I zpfmY)Bz6=|0Q=7UaPkryUX}E`#kINg{%nm1?aU718jBXQL!WT5bLaHNf|+AvZmq`y zH$*>-BsLNcnXO8nd*I9uNzJY{KfN8JBba&*#>bvkJqRw_+_X?@W#7E~AzJAf7276e z*}J*!bSEcMLA{@Zy0E&pAa>Nkz5?265Cy#iGgdQ4j1BfY$ilT$9nKDW-(k z2kgunRxe!`WMzXgoFap%RxY(4_5Y6nSCZrgW@i;o(0pH#EH;QV{Ra)=|5|acgW+B3 zf+mzjP&(}SDJN_?jI&jAl`zG z&)@2v@)C@`lrB##`hB!URNPb%mabC%vw!gmX2xJoit{h~It~R}gi&ZV zf*rygx-ykA$Dfe#a;uM%e}z1-Jk4NX^Ta$@(}sE9n{#R&>$$2=K_3h${>FPh7z53eRMrg*{@e1ZQH zV>uJhJkcG;Y|`JM4(I9%n8THrMsx0f64HA*Di3U>d7m}va&oIQ)?bvgHRO%X`AD?2 zB49p6U(G~WxgvKfquV?3<>JG=dzQo{GZ3PZJKZvVxzvCl`3vD)p=`>-k(g_`QECe( z%OY4GNxoF%XM*9P)(m>*r@ISWWU#HiIJpmTaG;>6#`~?$7zeYJ=EsyCzGC=kynI@s zD}C-@)B7%9?H4~*-=H}d24G%(oat11-;*`-k;--2k={Tr+1un*@%zC1xne3;WHD86 zv>E+dxA8i2Pg^aApXPY>(VvBS6J#)slz~UO>@_NqV5`=6h1PDumF)b)I_Kzz#nB=@ z4(T$=q_Tr3=(L;nm|9OO4cZ%ELm@2Y0^6a}u5^nsYoB+8Qo5ak0$DtV3c#%!BQA6T zfp?^Sy9gU93k*-VUpwv|S-0ZRND}yU8@okF78t%1yk@wuS8%|zSnI^%>@+cWGQg*e z4{2h291`Bxjcvx=gARh#oX40G(2SJ_tNSu-9a)(L0M zuj0)Cv16&Wev_O^JO$&@CULlml?yksEhcUcs|4t;CX&l8*W8@7?i44xR{SgSE48DQ zPBUaLjK&byn;5krtEb0&2#iBgH@2Ud9-2Q?WQ3xzXgQ6AsuIjTs}*3I3A^4fNjw7B zZzo>K(|Rjw|04^4OABRdQ+CWq$UUzc5T!03i^D=8zV9bG{I5)K?H28xhJ?=W#Z2Rl z8qj2C+etq3Y`4n7A6t*#SiU3;S{#Syh<9$wGNr2XAJzn?lV4>f?Er|Te8=ejK3{g) zQMfq2$M|F!bxbTdZ1oMWEu5-GXRX4L>7PtKF!r0^Y80XK|F|h0uJvbR)|lC$ZNPBM zC(3_@8H*|0{tcY>gd1rP>Z15T6q}83Nt7Ggnb>A+NaV_XuTeS)=Exhk{cB^FLGnO` zVx&ClO5)6W(vr@RqrCq&-VX9Xo{`cL9wMw9HvN<=ckA0@2c?aQE=k>6Le-f)J2}9q zjd7u|GjU-wF~V5w3D*&0uUU$d2mEr_t{miM`I!yhJ0>~Hs1g-^!i3I{E6=T8#`dN* zKFJw^e4|mpL}KBqlC{E-95!|Hk+{O@b(=eMrg&R~KvK+KPUhbgCr^WwO-)|NpvVW++`~i&ijxnw&ePk9OGQN`vs9>(y4sl;-J>|64%Yk@(mO^0}Cu zwBt!pd;L@W>N|`=dOxgx^6EY9JU)9P7p}-C*KKrrZ|$C(P3^C3bbVa9Of4+%$y21w zn0Wryzu4j;hSo%oP{Ba9_FTC(gbMS3;e}Mi``xe7bk0W;oexdUH#Nfq0#)f$X{*8f zRlrhvKvveErZR(h&^|<#_ZPHf%E!CxA|@`v6_?wwCk|Dzyr`EeACNodXh&P*v|mJ9 zH2YT6<0^IExan}L$El@!Ou%Z{*W)`qQlJJXg&IeXv z8Wf&#dlhN-zlUt;*Oc4#pGf53(4!rMC#S)SB|7VOoQ^V7t+I?u$BP~ke%I)F){&`iHdKYZ{dhU3O1g|}Ti~~i_<8<3) z>c04LC4c&LOLB)i{5^Jq2?@PT1Vnrj^>U1iVtper{hYo57+zTKxz@vmne1VkaQS{Z z$WbD>w4l+n(*Vx7=u4A5Js9|bwizm3v})Z`^-@?<1S>uh7&ZY)#gW?j5pq$-)whHL zSq9h~dDq&{>Yxi4*1-XQ^fX(LP}fkzJ=EXH4=P_t7DU#{sg{pmiZUQ9Iy{DA&)9 z{JZZt8E<1?2lB|NynN|jUv0X43X;Qx0z5JmPHydbntLT5XxC6lo+WjFy}yxoh5B)& z{?UH`v?mSU+auX0nIp@UQ_7%~S%)mIj%_w^=aE!*v#sSPu);$=u0TjlfM9vx_8(%f ziJwHI?BS!9^(8w~F8g$holL?56~p{#QI+*O=AKis{@0* ziO#+_b)7nlD)!cv`mYd-rWektl38`!gP-4{f7MxP{khC~UaiO2#K&@ve*aPiK!SS5 z8GZ7W+aAF(BjWzBPNx}a$a_&UtmlV#n;F7F^!HD%%tR?XfSr3FJ_{WK;+d?JI?wh# zW--Ba+n3x*YTa+`we$e>kag_SK7w{AqJG6=X_QhJSY>aSe|xBqG+iz9L537T@+~2D zRsNDvy;<%V4SqZz7~Us++y~(e!gJ3b%*(W_NQkF@lo79DQUPULYlB-$`JWm zK#Hr2`gz@(3UC@ByUOknbjf@%HNZ%<8oIk9%!EK*r<;ZjdodpsM zr~ox?*JQ8nJ0D+a+W)5z8Qd!TLPf-W#hOfl+;V-S{eL{L{{C}>r3-#o-GSd8 zJ!}6z<^c(w<%OK=t0_0g4L8K&aPs8fz;tMEp^;9gH4JTgWslXhLgxi#S4ETWo3kYz z?pyB2doYmp5SPc%UN5;5M4BFpmueuJ(Wgn;@^}2O*b=MNEe!f_HqUFe=6@B=XD?WAZxDaiXUotU{JV!%dOC%`U7x@ex^XJlET8#^}b+GrNV$#t+Qs5c@iBw-^_ z$5ESGTJp&LzqJ6}wKx_w_NVrl+X>`nlN#@>jMc%w2?GI>@Fb-~-ky=fl(*9jVXh;-W4((?XT8hCMp?@9>P0bT&E zvzKrOo%w(G%&EGTQS`B|o+lXbw&l%4Z2}6%61fvp@MGV?QhZ9y57d90^K> zl3Xbr6HtL4wDD9vmk*VVdfkf?i?g^STfXF%vVyzJh&r4Tq|zVPQNo${Ao6Xx+SmbT zg6i6*1f529av7mB`)Yk>mqrn`gzceHP@FRs-?_BivV|)m}Ty z{@`8EuF%64I1xsU(s}+|Ms5C-l%_-Bp<;Lt{VsiC&ojy%P?J+z&5jX_uWrCV{pugZJN$h@Ua)vhYb^Q|^&XKZ2An=wVxKwml6#NC3H z9G|O)0Q0~Z{^s!{+7ISz&mWh=&kNRD@85$oVUb+RBAOKy$ujHZ?Dn7Fx2>_a6KDGR zv_oaP$aASU-`)zGHBLSV%pdm+h#|czwA!Tpe5ko6YL<~XL)soCbBt}2`c=iCWq`jD zY_HH-mYWO&oeEu{gAY3=<{{XD!~Gl8tR?BxL$~0@A>%b%M@wHKk0^fRENHLsWYvrD z<@$5oIe%P^r^u$bhauaYSrXCx?yR z)fSqz0ptPkN+-Dw3VUFA>pmR&xpzC? zcaoi+M?*-V4iT}nRGjDB{blVPnBIm}vHcc{}V~_I@`>KC)m77by%%HCo&)RpU>w&x2oS+0P1FYpAOIdG3%D^92 zLW8PKv~ia11kzXh{RY+n}s0R5zq%RIC1n zDfioZ_10cPC7dD!n5*H_BNAQq&uLX`Zg*Hgogls4sk|LwG3|mbq-u|{RJ^K19 zqBowpxdN0}A9Stz#fu`5Q;T><-+MAj>zJ3b$LZR^2GEJ@&;BLYJKk2ev>&-X!0V-R zXSrey*?;yG_eMJnFoz~+^R~yZE47_n?rR33NZuu1+tRQC#YLI6JmzB46hl`>?*LBO zvj&&zK+AG0F0Qi@a1Bq`4iB>k_V6$b4hX1N!!7p<-E^+i<7}y6jqq!!(M(){g%sewf=!;DW025h?4lkKdg3Ujh-Wf1PKQ5lv}J_L}KC=jpRLK4zP7^#Sv zyY1!2tulA&%tt3n;~mq5u96bW}=v<8ixU^ad>M5DuvVVi`rLFJAbBT|acI*#0n4QV z=&I-6EH#Y+ejTnD>!uElY`4HS)RLNAXcGb7qAJqCh`^VUYh4ZIXN6!5f0$tJxAKNP z<6Y)onvPCq$R?Xs8`;ENZ*C^onJnt!;A}*7?HM7Swef46&CDl|rWp)Z^i;5?i=991 z02X0_o||>PpB0zN^$`eqdk!m~@i`%=6a>aC=C}^~fV&n|6#(N4#)n#7WNLN3FH>nf zU=AlY307Mr*&yE~Ant49uK(h8-$n2{NNG>_H84AuQ##AN94{i#w}>k;UMA?LwF3u^JsId{Y=;|^YMr4M0%E6+G_FS2wqC}ELX%Lb zvbQXbLaD)i@rtOIXOgexCaMhah}k0|`$QrO(UC}5{2Nbf@wN&edhd(Har3z7gyFwu zIWW&6;}VBS)v=4|ejL6EH=&!JTC*sEqi zTEWeJ4$On#<0e#P|Ml0HTEj84hjSE4(r|JkyF4>Z{gP*`+eyANdqKEwsAqZaPdKZ+ z7#Fp(`q+SC2wQW-Wf0U8RvB78W`#J&+xj$TfG)rO!i^b9fD*?xhWQn0D1Q}VtKh96 zM**zPNo9;yBdPrO$rQNK}j`wwJ7W`{!sIec;69N``lC!rhYQ z0ecVqS59*N-e}K_5jLMW#RH}1(XRc(vG0QNnvx7}Mjl(W?}y6jt%g3hxx6oCzy7yo zfh~1c6k@xZ_ar_uC-Qpz*bVN~XhMZL*{I!#R7v1Byt+ux6bH6m9rDR}L2l-Jx7YW` zMIwu7hlSZs{&!G|AtzMwlO#!+$kzhA?cAT7|9SBLUrUmo9vSFjVVvz>vv`}0+c`~E z*0oQw? z$$Cm0Y7249`%x%WIDY$kYrdsdda>) z1nnD|=g-<(;(7thQf#lQn+O=so&4LGpIEnq_c;4zl9Ozf4PQ&LkxRCyx$rDWxldpZ z*+*fS+{W@jdI}r1)|9WMNiD&&z0{(S2YnK_>Z=jT?TN(5)h%fsD>%hZvC4Z-Y`?xo zlsE@c9gMQH!pqs@_Ti7HJ2@q>QvyMAoM0{&Lcm~1LM`X~_}^KBVz|tC$&J+OQzG}| z3d6z!jo4_m@KG@2=d04x){hxxubz8YOrP=V*5>1a8no6iFLbrf0Y%8iQT($Z}e#McUcQy_NFNwdsOM4Y}e4Zxog z&~T8RH!YFyCn)+Mr!OqQvC~|^R(VR+*av}-jqZW2n}-}TtAf_$Z7t#JGNq0ClD(Fn zcps}ls2OR0S7PIkp$+TUj!j5)g)48{b1lAf${oanq5x{q%4be@i&;$ zZ7zx#z0+KlKaEsG#wOA1PG(CqQ}-mcuT7>C-JEKshWt@_L?Ks+-&?Q9=ru_yAJ*QO z(yogvC>3xQcu2VrCEDC)86cWt?&saxOBrmXF-^^^OViZjc{tMfQ221*3e?NcMQw`` z&50Wj{mn#-q~FWm{*(Tb1FvQl;^X77`}iSL4>ij0XR2GU&Z+m6fr9U3AJC-C!wY=7 zOwjsulN8l}&ur3j4ebYPa8?l^>H}kekY=7{q7fDURc3Am#}+(A}=%d z(>^YY)omEBJgg(oyU-@gCqJvy>p1OW6LEb@>cK-Qaurvo{@_yg-wlL7+3En>g)Zau z?z_m^?yt4qi##j6RgtgE_sq;Mw{QKZcz0X}q<4Cb(bkf0 zi7j)DAyA5Aw|~-hi7=ROp15TPcT?_u@V%u3xDV)Xay!qJC0(X(bS+&v^L%Kue%)wf zw38_rnDx>9>w(7@L^v^UHoF7ABV zekGYDi*WGViT8p{Da5Oa8yK9iGw(Od=d(EYKjU>$64-9ZanbXL81#6Z`?F|V$h(qb zljZbteWc`L`ojlw;B_9~Q1!R)weJ-;VB)Dog;thj)T>=a72}x1BQm!=etP4W_ZjSK z^OCJE9%@(Vp1vRafiPfLaqR*Hsw{0>*xpGty44TQl+g8-43oTQQgHN@EIu$F@l{MS zqFm!vBUfwvK&^SrYMf#Z>Ek}y5x$k|$K<-|wx%l?X!zmY+GBRD{YRaTpI(yT=+{UW zL~V8%!_2rG8M&I(HB-*LTOn>)qBY_vkaTyE_@^Z{-0-$OGbg!o79WRA;O(C;AX9u})&4MuF>l4+NXkLcQ!JbohhY86}8O}7-1hM%XvtEcwrEXEp*LeRRX zctT_A*eS}PcF`xY5bN?h?J&R-adIW<3bQ;z*x^cNhpVqQ2Ft6je~j%x-V6+AsYwy4 zLJ|V4{#y%R=8QX+{U0CK^(T=R06F`Wyn9{%cf0=oWaa#qv=V;rXU%kqAY>IkIOyaW zIPd9tU5+9zmh%iaTjCzyV-0qbFqK=R`uie0uTbZMN3<4~9`BD-Is~2eO8yt_XkBS` zzDZX9_SfBIgZRp1PUi4cj?)ky@z?+vkvCui#p8ojow6WR_xSvIiKX0L^UZG`=Xg}) zTI?#e;znj-cK`@Z`+#jz=$M; z3^U*_71r`pWZ+*S%}O@%(sX;BFuY2g?>{C0E`Ku*Xm$%ph5~973}TY$fFu;L)Lduu zvCXQrU%jLF#S|%Uw)6cR=VC{LOomzTs2q2B*2f;`cZV?o0l3n-Ski0+&1+;qZl7-3dH=9o z+``j}pM+{%hJdd5I!g#*Gh2HNXpX^Uaf$)^XS%HZ;X&<}8)ypW)koc+{gvkNUn9)- z(ghJu(=H!bWg&=B`NU3I?T~B6Nbol5Uuk`kp(0DTV zqc91+-x1_1VKv*#7T~v_l{}I@!G@@Ir!FT%?T3UZ*&G%whSB-#<$JG~0YCPxgO-5C z(;%URH6#5WPP$`_Iq|ZGSwX3Lpr^=|uUrCWItws9*&8==0BZ9zJ;q1Sy0(3%bQ_Uc z5cW1H4TB5|)_;4-Q>~UjIMGLYc_UTxiw@aCla77kl*9K4!hQ)z z!_yMl6P3Hk3T$ap;Uy(g(m~_eo01*X1KX{%l^l5It%3KIFn7~k+I0lQq+rUt6 zt!Fv6o$X4c=-r*S3X%Js8R#5C{^L|Y@Z9AUb+TcB`6orydAQWuL}OyPZI3FdCOhC;vO|k>S3Ta^&OMdSGdn&U9Jvo%B%HFO_CYEduWb@ zS4cW+n*8Ba>%%c0xRx;pK&_mtc@+8nCGEexLV74nq>wduZWOE=TBGXlTN2HL$*Zq|Xj>fu6BBVAdqphYm^L#^0 zU`)llig-P9{HyObE;aWe{V_p!MCPywGqb(*76%E=rHi~-8y#iBvysk=vXgj#iD7uT($fA?d_j)A%`e)ICT2^R21u-u9VZ6TV^8?5RDxe zoJL2FN{+wYkB+cm*M2)t+WBsfU+))LxnJ6I_u1UL`6Nvz*nSmnTn^;C?`^@LSKr3C z+9w>e7jGRr{*-wA)n^c@0O~E$TT(t57c(|2)^Z-9Wb}-P1ojsJYV=Q)@6lRx)UHwH zz-vgJW^Z+=bPl`U(OX_n_pWxGV-4iDUvQByw``r`&&G_8fdVeV)1dnwys@T*^_wET z*J(t~Juf%U{$~{8Vure8_A)~w37iFOwz0vH^#8rT?}~i2o;n=M8VBVy$z09Ow}t_q z+uH}1%R%>dK&C;?wM%WHfNS8<$M%<``6niegp@g*s(%Qe&`OCT3Z2LUdguIVOmUYk zEm&(MD1k1M(>8uJxAu_PZ?}M$QW09rupr{bE%!5YN7QS~Kf7 zJkP_CjsjakZhZ)=&o(~Is(Oc~4ZPc_kGQM$)Tk2fmOyP`WLO*5lmVb2Y# zlgQ7!0+`I?CQLiAttUY@E7+ZKxpT#UZquthhMU(p?I&dx(#_RtYc^m5KGyZ_?$Hc! zx5DXJ)!&G1_KvoOWa|STL<#r6p#EsaA-jHiM6U`|)W6%Q#s+9SEISj$njr_+Hx$-N zIg)$u9yosjHXWNI-3Nx3$(-|~leE-0E1u>uq`d;gYiV7OE8DpGjwb7zOw6v^uG!9{ z;~k!vRjUcmPmqyZNch{mG8Z57-JWL)LX&{bpH!D6bhYrUIkadG>R3hIDn&Nn_V51g zz{OXwX1HaYN6gUVQ6WO-Zak7tI8VjMk@U~fp`{n)cq=n)=}qA4>AwX?I&;68Fjv$C zP;zT3<`1&!&qEQ@3Sl3D;nf^fr!oOl=%l=1Ni6K577WZnJoJc*^S|Xc3~vnVMv3yh zf2&O}Qh=G46EU*MhDikC7GW~8f{d!mLv|?;glwABDSh3(b}d!uMb!5Y3=`iiJfY2= zvPQ*XS^=JYTi3$WFmOf%fLKZ>UuVs*Q)hmAfiNRIUeV&kkbUSng<8O7Pm{on3}Tg3 zS@Et30jF=iiC-zN5~IAIqr7fL9E9FaY-SP{bzmkf*A}YQ2+*!pu}Kc7{KYf9KFG^- z%=S2}CEDy~^SmPfV|l_fcr_NUF|%LGu*bCj%i!0|1lc*o1ED}JYf57mR-)DR&SMgK&sSkrq}V555I>+&v4IazJhtb`z2AM2!VBD z`D|+A?M|kvNA8ydjr*3Fai4_tZl`9XhKPO$$5fhLy3S9ZdJ`ue_%N-m z9lf(MH@4|7TY3JV*FA#uDuLs8JJHqaOXY&Z??f}vd+C6Z=FR8neiB+wzK?JW`Fmn} zwc>c2dsP%wIA>OZ?Z<| z{nwRLDNS@h4%6}!6{lwXyE;E%oMtc>f2sX*7-7EAmq1kWci_e4om^+}ELf25XiN|D z;;Lti_f6>Pbr{xkvEw3Yn!pfGo!!P&3bm%1S!Hkhry(qunDKjLrihyo*+$PGy=uDg z|0J>giwZ{Pei?okzT;~NJFd-6 z9ltVw^}Ky4KPLJuU7}8X!IyP9R3>LC?}MTVJ)PTpwY)*qi5=5L`|Az7+V2n#!pm?a zFJb%Y$7&SCmtZC@-i~+2y3xs8;nJjBAf@g~Jkv*^w}^1V7^_uEy~Rr5c{*f2njK@% z=D9wG%l!Z;)Tp>Cf#;p-CJ`O0q}x6|5ZYED2M!XiiRG^0I8WdCvX~B1$tTo)jE$<_ z&Iigkb$`o_jU$t&HzL}J?>2r|_cIF&N zurWLl!RC#n%RH$%F7MpBi!xd7)%vj7%-Ir4yq{FNz}@&=Bd~tQo9 z6&;(+6dOVPFmFz}gEIw>10z*L1RG9*(|Ay#*VK{l3fUHhVQWaJ-9s@#oJ?OaEO z#%IRltfJOf1StC19%N`mY4z9gqdp3vwr>&kQ0cNrO9E_LZGQpZz|1sGAjA3uNt7(^ zybF+apE5A<)XJdp`mLAj#Bi-&@>?Ca6<49N#*8Whqwq&<&W5daHiUk*yWq2+sn4_@ zO~IXFVizb-lPd&GddgFNY37=SSuG&1O5`9kCkPdgTfO~1!&TLTOAJ;B8%WT(notHJ zyS%Lmswt)T1&+a3+aXGeFpQhtU)Y)6v|$zTsh}HI#90xr=rwl9{wl4yniI z5rM4Yw!)C(Dh9$i%?3w zKC_(FT|VW<=m}ppGldI-Maf~$p2@BXT)H$v1GlY??c+=yevq09$jPm*AE|J74%d6^lAK^TQ;~s zBfs*tQZh|gBqen=EOrzVQ+k_=K{`CyF= z_q{*mz|1qz6N*HHNTuOC6+h^9E}bhd@a$Ce$~)5|YS|=dXo{1D)o26LWb$<}4@^hh zFQvf)fJ-twPJf;CFf;I5l;jgKKX1SX8636N;I~)*Y*bnwKlHM0GOvDloBJtk%}Phrxeq0UfLVuoB5P`0dk5E$6*I7chc>%&ciaK%MP#>d8mR zpX@VKwr*^8&-z+1cC%FeUrZ?9@JdBl>qMK<9pkr-Cs#R~N*k&Hn_0h8bTXNqxjrsN zywv_eQ7E70r<2B{lfd+hHKtH;))SJtC^2Ldt-&|K2UWLb%olms4yzsf&IKce8m}um zqId`UtB_C0oYhOz*vfV(3h35alJ$9yiSfET2g$vkmi=@ay^_CYhubC)F^didq^k#%hY7=3=%I(vI8)=S-NB6K3Bn502ZvgeTl>JOmk6nky)t=VW ztGqt@pDpl;Xde1Cw#g4vlwzSI{q|Zl=o^|Gbo@8)%c%d*inz~U+&6pV#wGR&=>>;$-ZksULcu*|G;z?JCp;je{o|#rcIaopi9T17ATRYp@_q8kN6(?J zyF|+t%MS}o=RF4k>1xfD5Hrdk!VszP8}>O|VahptMg1tUk*lg^r?o%RUr5V~Nmy0? z3O>PYAK%Bu_;|5ReWuQDP#@;TN}DsC=~a}*njK{BqwPRea#~Q1%T0qMvuiYp7ErlH z_lJqGyMjwFKPX$@{Zdk_$`EGEk=ROG{N>Q6O&|Rd@_}FF{j98#=88CCO#)tABY2nr zEjZ{_PVim#ne`^`=~e@9+?aXtvO_Grr@ zygatvjI$V$=BCv<#%80O1Indx2=f{Lepm$d>OX%3`z}tkN7v=E2;3(e{L~1^10od1 z8FN3;kB++QUgVhC)+Yg}lclt)#xK=gXRhlPnoO`G$&N`W!xS(fJ>Pf!R*CNQ@6 zN#}mci%1BAuz@}AxO}4&%3+K87=1u;wWn@51$1WHYEB5sfL{Av=Vf2O#ka1v^;8z~ zTpV}_Xi&Ga(7C3BLVZDSov-H~o*hs}fIG+lVJiZcWOf4yRJiA6QW>c@$o9-Y`k&h8 zJa~-O@@ux}i2=#@-*xg;cC{}ykNzc56{$sVz+y@8h9a6*!M3uD7u_&T-jDLC(w zzyZ1DGz=-qxw%5L_0S?>oZ74u4*+~OW|N6B56T2*TW!x;)aLFo|B&=+G6ZMVr6-s#}szwIVJFUcu={C&nbFv>1FD_WKQT zi}o0!r7M>Dw`D7kf2RnVk#7S`j!w+~_w`lLqu@w_w%=>7@{S+0rl~t4TbpG2eOqhN zJ~QHTasOj66(HSl(HoAM4Q{IGo^I&nE=?goZLWSVydn(U`qQrr=LzxtCbakUm%4m5F}{LTW@4A;!<5e@yM47} z-zhRa_|zs1(Hg69t+1&{P2s;_ck={x?N#`z4-Fw~?#FUKU!W zE}dsyj~=jIEir(q)Arb$-axYOM1j{1;~6N9oK(LiLO{ z;5i)>N#Q(?c{73uESXc45lhSHtFV06Ri7^8ptzR&Yq@ALltWn35hvFqIDKIe1J zk#!K$-;f`;%RA&3-_+L!z^DMz_P&X=ekTXh*4=v|g(berv46m?8|956#t-n2+^m6{ zd3v&Ue_2ZwNdexYV|csEzRUr@9)nYy*v(;ZAr{p-rgZeu9p#2V^zMv?NRJgkX7DKZ z6GLGE@N8Ot3-fW_iGUB18ohMsR`+2^H;xyb@f-&?3ji)>ZN~W;sFPK^dL4f*hhJ%y z(V#Egt)daczvRG>jpJpX=Sc1b6bEpV=qbMM1UluMPQf-Mhc6m;cM@gYyQajg?~TeL znO57e-!OAahx}HMrD$iwK?O-Q;T4ZW3L(D4yz#Pb_u3PGm+{L+(!;2ATqQI5$le8g z+GM*_y3PUrN53JsYwR<()3D|Dm#up{2OzI_JKFwTTrQM(#8Cp5EkjbN6tv&}EPZBV z?|AOsj<32BkMN+h-+h_c75L3?u=?*Qhu^Mnlll7WU}p8rKd>V8>n)Xw_`!GkS9{1D z^_xp%5q=T)-*twdU%7VOz-*&&de8Yh(*Lt+ewJ(a_Xx4o$Hl_K{HeS0Tdr!PeO|$? zWHt|nB&EKtK_pjMwDGj;A80B}boGeaV%{a|v3i)y`ZqOYsS_iY=*ZvZ#1f;_&jX~= zb9IjV3J=PyqUGeEHZQs`^6>>fJHZweYAE{+W_?>5sV-3wjpZ`$is|u)k3?5hfW{KS z)_dx`XU1hStCz1_o7;*Hzen#I8Q3LV5v?&qa*?5y#Ya4$uV7EAs?k`Q>FY&oBcxRlr*ub*M z4oxji4YY6Z+iq++W5r%{Tnx>bh_{|@Q#<(Gw#1bJj(z@b2;wR_CCKZiII)fmBCETU zZgBShcL$8$chp4bH(zWQN4H>%hLM-+TIzmoej7J+3w~>pmumZLCgWQd-#;N(Z#XGPVVrvt_FgSJ%sf#ug6M?DlIP9y8B`Sa z2j*=CTBXsTUlcsB^-THX6%OZO!hlOymou5g?{az@!EFU|pyV=1#G4Wg0;jixlrrWe z`uF3%s=m~yf5XNtC}L#JDA*Gl^zf4BYgxVKDx%{?=zefQl$PW858Btzeo)Q>8g#6n zzl5)EaKT&`gJ{=qTJk`lrO|Wq5Vqq54u|dq(wzNGO@cvr6+PZXR_fLkWH;ux)Ni&-4+pONUxpHX$J+LiuR%yT3B;>4np9RmxCViMKFR}z=x zUQ_ghlT}1518+v#744`G4g5OlXu=-?uJ{{y?0=O!R3STovW@T`diWJC?YwTdKOtRT zW>D7pYprT{i#TAn`_u?|gL%I1s}_J;tOcJQk$bz>j9s6;D?B_lbx%sWiJ7%Bu_+l) zlZq+-4L&DovXQ)(kEaTkJ2i2-4q0wDmEDHuQXe8OVp#R)_b-!*iaya&C;VQo0;zsp z4OEos?f$&LJ48?F(wfT&aU|6b)Qh0HkF4iY=~=M@@@&9GtM?ElxAR9$&w`)S^7-76 zA^;|2f(1vB6h74sSJn<8@V4zM4?)q)SSq1QPVSvlsXNnX#Xp1=f2+2>;nmA7bsb!t zhq!7T)H zpVeqx%_~G|k*$J%Uq|5;(LOu0PNbNnnnK3_=D96$58KcJD~ofm`-u_0=ygkkvK6i9 z$Q9jP`HRNSrN2Ze@5I(&K1ohKK#08=w>w{&*Nx?oT~ZjW61e!c_qQ7k)y4(_un{7g z!6Ik-lXU_!X!^?zsse}c4Aki0RcOuO0lB^m<9oKQ*|?3#5Ob=`97|~?#hc9{OBUG| z8i5^Z6e6(lZtxN5Yiv*998SZWYd8?r)IIV&M2(ro;BuDQFOcfwIcg{Oi7$Jd(&c|t z3!l7Ak?CsaW#9F8sy5P>YQ%o%2ObTiO(hB-9q&HTyM(m$BluKY6k)VKu}k?``u-bV z)XMBg6MLD%zo|o<+FvShZ^}$VerhU*Yq?GI!fBC_s13B{{ipq`mEP2>z z@}dxaUgCfDhuCk|ETTA zS`wBWPA!D3!~vxq2~x!DKHY)FOmeCgMYG{wX))`VM<*9lfbX@_fp^(h9&AuI+LSsgQO ziB;JZDlC1*y-O||PP|-MOw5&=i@BCmVepIKxDIV|q)Bqe_sDh+^ItYLYxtw`I&pH2 z@P&+M4E*pN_6%0DhZ`k3WQFYUu`&tmhFt(QfD5e!~kb6$@ zv=H$++dej=lFDB2ISE&O$|`N%CN+;X=l6+1O(_K#gzQ?T^tb0TAH}{Eo1GyTn6D-h z!;ofgWBFToCO+yt;X-$ zOdI?FGEQo(*Ls00_f6jT#mHPdjt&&WzWqZheW9V@$5lX4^u}d}0wPH*@|0_sEbd!G zB7myN-J04AVDA$z?|>z3luEFfB_Y{cHJ*<4K>+?*+?Gf8@LsyUB?P{M;0CkkItN^8 zld5jDEp{f{RR$)M;J3hX{NM|JjUI)>yDN3esN#R2edEKMP~fGp-^TEDo@492(Z#?a z)NgOE*n0_=l;lNFUhk!fx!P(ES6dB|!ZPN9wR^I9AT`Rdj~Lmr_@*=`%e%NaWoFPh z<2FO81NGcYiW=f?2wY}irLgm;==%@ z0|5?vuvkS9rKl}f^MG3VxsJQPs^WWmeN2-4#95^qLzsWsrAP81-pEpaw3^n#PVqEk zG;lsAebvLBMtUAwe`{A)!SoyRXyK%n3o#c+iJ-3GyJR^a#K-bRvWVts-T6P*HveZx zJUU`dG)}PlrgPX;TGREANomqFT2TG>uAsmsYKV2fUcfUs2$KCFM2gVuKS2w%VCf@> z*d$39U)!)YLD^Equ$tEd3%*=MWiJTF*Hj~YcKn%~)s1;GxagVRh#TT0o$B^Zt6!En zt_R6-(0*!mDNj{a+0K>Hx2Z1J_rf=7_qcf%rpa1ZGwOu`gBr?27$;ygRfVoB$KV=x ztvJ`jepN>F!JqT+^Di^VYEWbd3-^NaNY}#Ud?zW8ZGpqEyLwk}s85AClV>D5dV!7^ zU;IP4NsLd*wCZ@NMee`RObE$3O%reSS5?AKOVg|GVQvpQhqn^B95*j-uaUV<=ga{{ zYeigcmGj%{gWazDF?46@`6~d4K98R5KNZb}Z!ch6i`CALATSG!GZVd_`pQM)`5ff4NiEiGENRZ zKsWbewR&5n=Usb-*$$h|1V=euqvffQo3D<-?qXQvW6!3A*^So7t7q;rH$QeQyP5;w zci*d(u$?XUfYs;nqpo1to}1mdGbRbtOKXR5cn%Y1Kw@%Le7wo>&nw?omvLUYl<7@GfxVCYCZlQ?PeU?Z_;hmb&oMovkI<1HkAp*loS$sdEye^0T6S#N}to>_Q%Dx`_1fG!x=*3_=@mQqLRM!aaEytl2ijHphy) z(mh#5Nc-wJ8%PhXZ>{!+;e5)amud%>kvIPSzv%Z2%el zwfv;jISM`)4LsBB;}DKbdsr1SsLVwT-u~cFD6mcD4OD~oz0wE0>4v@C>lO9yQ}Wm~ z(B?ahiy*FDQERVHmPa3gR%ZHBg*j`-=q=2CSFh^w7g1vrJ0gsG%R1>^c}X^#D?qp6 zr3|*^{b;ullNQ?{t-DSl)qXF@yiPOq%~e>IBSSKE)BBi!jvh02=2@$@dVzYc>}`WV zVvOUbYV;*d7~b8|QW0?T1oh1j5Cgp43MdXA_A9$dMsr=9O-)@`mnIw0jpR;&e}(r? ziPT1tn%D=pzBdBRKtP&Z8>_DhlHSowD^B)YRX_9RbATRv>S7o7WO*GKsL5TulTG^Ev53u(N*V3fpuH=qqzUQ@F$s72WrWD1N4KByTC1O~KsJ zotnxXDN)WmPU8^giRjMtXIE)`{hII`r=3 zut{3}CpQZ^*z8li0$07OqkC_pgcd{0avzJgtx)Gf)oZb|@Y6PZS?V3-1ut}^>hWv4 z`{Qa6ek?M2G35>^@`DQPI!1ePdE%pr>%?V~(t& zDkE=~2Bcbf#jtn2qg@v`YNzh>2m*=+D*=Q~G@uN^^HtX~!kZh}5~#zyG!(vk|o ztNDR^`NYBae0oTHI$xc^$G+X7yXN0U4dqx0yT*Y2w%>ps{1g#!kC7I^ECfQ7WLrgb z7*9IH;EOQ&q+?GLH<&PAyq)5%W5`W=o{;qDAMLVdEsH%B8*vFhtr`!bMn}(_hyG+; zRQxtmBoioC_B9Xwo&Om8j(_OYE{Yd9E5>wG&Z3~k{`9ea&<(!1Y-ZJ3hQfd|XM}L= zCeF=0r*{EcM78Qzn3++YZ5%-lmz%urV^8?Lgdl5{u$I7Q4L}Wnm#PdR`?#e1YB%ko zz4%#=vMMC^CgdnBU`KU)B(R^jNXCFqDy0=kmKWFhcEmFTMlbSPPE9>k)u2@1&CXrd zIVsfk;hMsA^l;Yp0@5?vspUM)fA1E%uuXrniyUp=zm9M;-s!yT#99|ZQM(5(PgNr@ z6(+wwB)(rf58V`VPLSwQerI$#=G61gbwIx-Guh*$!*(^v zQ(^M_+2<~y)ii?ioZRmUE|fiH_^#GeilG;Cx*N>{ywuBL#X~S zM4fapB!hcHqQ|@EjHQ}{Yuw>(UB=h>CRE)v@8PDe*7XtAsINI%E{x{H<#LKIe1kF@ zg6^>d*g#CE(;CzzS!i`iEf$p|fvv8Aopo3y3LJm7%he z5kl5hFVtGYsD<-TVl&xlRI&}B@#JSw_BM_2oUWd-?Tq;3i;t|z#TZmbDg`^kMqub1tX7>iS&Kzxgxf;BJV^(jyo-&zhIn^=g zG4y@ZUdh(MA^>TodaU3M)M%= z#hGm&1npc&U66-05btlXl@CZ3D)qiaR#3mAW4)+=7=Yr_4rHu@i#S2)0Tib3k#)<{ zSK$I+N-+QC(n^X2oh|JlFB}r}0N$F7xZ0xGfH+b@8tK%@w5UWvecrQ;(8LK>jL^pc z{2ndl7DmVWS)xYS{=S0V|I`y$rCbPce!}~*3zc1rUH)1^T(J@D+`}O7Q$IUHj`{lG zmQ=UMBtLvG{Drzv0Ni|hBVO>V70_UwyMHin-@>||G{6$4Ln$m!T{L=M;pDLu@1))d zQIW6&NG~-yDN@~Yoi0L8L5-5|u#EvZ;}*#WvL+UD?ot5N1<$b00l%^MSh4kO#JE3d z-H_W6WX|GC|5>UFV1-SMJx*_$zArs%xb=DZq#b!+bv-k6^Ex@;cHBG79VZijN%t1O z?0PKH#Ubf{mnLXqdwBG{ZisI@xgW4s#_z93jEYk7Twz*3j}7*9QY9N;W(@|< zk5~D}DlKcT4oV*oJl((9l#FqAOBJHK3X<*&+~0&{!n_s&l^hMy&FU|Ml=g4iH>m7y z3Pl%MApNjNS00Ri35};4c6u_)6a8~95JO4mZ+jl2#LUk7G}$fer>TYBj!GfjBkpfi z4@?H!e(CCMXgN45(w!L6rIoZboi&tVDiAP<$iG>(D2b6E`xk0hqo!}$P8~C)Uid27 z?5my7y8W@pg7YWT_s0`l(sX99Mn34238lvjO_$?ofeU_!Eul$aDIuRQz(Nq!3FyS1 zS+85Au>+sHkgxOM9Bg(elbU?L9i=Y)PGr!jhnE`dv0BTkNFRr0*P&rUm7ag_pLnwB zb|U)Ss9Tw_E6egt&B_I(ZpkDOxgTR;H5pUC!6W@g-XF}7y4VhUq%{PhM#++W-9mXm^;maeWALhgx z2eP2YwoMi>q@X}&SwdF|5~F$7A1bGkJ>~9v*qYF`tkr`+2JF*d0C89#ihz;!wV_~a zkU!w7l9*XoAO(9ce|8%2&QXKN)O}DJX!XuI41NX%zXQUN_XEmL*Vh%(L#W*k4>-Ix zI%{r_0q0W}lS;K0kpX9g7d2%!tw%yHSRIcOWb7p&9g=Ok?*ByW)BZ;bm?x%^q%@$9 znklsOLcS#{;TV*eSMG_gAX=La@ZNi>o>jF;=-cqdScJ=Rv!1KEd6+gwK#$vdJsM>d zZ$sVqRQR8$-nim|+%1l0-_UoKKg;IT+xI(?aq^UK7?I2IhZR2=jhCPsgU7s2DiY2( zyU>0;Uf2H_p1GOCNZ?^Qfv4{7Ey z?+$UErzC{o2$pG~za+SaZD+o%s%0$Glvx?w<3`$x)ucWQnMF)UhyAh|O<53+Oa5uK zJeBe6du-)sPH$tUA~|;Zob^n@rXwDBJUh<--xQ-`)@>KEon;| z`)@@2iAThr#0K5}e?)YA)MHJtFCU$Ey}^b;Iv?Za;4L@n1_1&DAy{5K#WNuihnOzNYdcblO6+5%%TIwb65}li4m`S zSfU>DeeDj?QYXPcz8>RYpmB+2;s|f_nLN1R6HyHNdXxLw}i# zk8v?OZjv$Tq?@VxXwT70*Cx7NJOecpv>LXb0?+F0}-$r0z#8~CGpc~BfG`vXS(H$l07b8?fL7N!%eoI_^bDy!w)AY zwAqS2PL1x#PM+tSOvkp4c>JhIIGsfE2^KFv#-c_;-IHtbd(cwq6Z)>rp}@`pn=OkK z#&;1kK*p6kASazg9;ipLG#FJor=|v13m8$IyyaBvHZa=HQi0?0z_*eC2pJsmmb&pA zm3~3J-&!o=vw^+{?_QYj6x>m_gv#pS^n_w~1w)bnVc%tlB`cvT?7F=WW z#3#%k@_fQVuHwrVO`FK4v8hmH(T}p9;r-LCsA7q-U zLoe5AY@2)=1rL|9S+Ud4q;2E91A*9))xEqd3-m1Z2DSetFut%ciB}_K(WdB{!Puv=+w!{VV!#qz&>k( z8k4*IA>CIOcw{wUP*i?zkl=Ulb~0FdpITK)hQNZWtYY56Gm2HXfW6_P@kq1N1jF;U z68)}!yw2{s2J?fq6is_B39V7obI*pY-QG1_naeIP79dED$Ts8ad*XhOng)ph%gc1xY?l5VWKSaiR=%Gb z<68QNCKvVkgLl`IobS!cqVtqN7PDmEqE63Q@)(bQobK$jr*20aAeYXv!vzlEkz5Qz zYGG0X@nL%*<_AE=S~_yYm~VxFn9I786V3=7Djrq0A=K8(B`ik5j50r!4+u@po3cy2xl%<>(=P8o6y?QvwOLJLnQ zYJj-Una8_>GpKXSiMg5OPhB4A^()53+6XI;7O@U9M;wZ!n~vgv4^q!l`8BCB=wBrv z*+)x=BH=QRAX#WM#d~JU-p93k*HeKOfCaI6`(rYrHd6R_h=t6wHNAk#PBF44Tp<6s zjc)?*P<9LdI}hAj7xdF1uO$u%V6w+fc9M~z%<)BpQZU4Onx+k+PU^5B7C4}aQfRVg&3_bJ&^{{HD zLP346ALOSMpVRvYE*!PxMC2U1LT)1danE8~Snkk<-+s_q8e89!aIq-Xt2jzpqO`j6 zuj*dkv%-fVQs2}sOkZpw(tTS6nYZ=E(IZOdKM$pVSacz{X!r{2w5@Wx6Mb?)?O%4& zZV-^~G$%C`Z^-QJ#$y7hS=g_cb9DFeDtZjOJx7O}w5KpopJp2qwDu>{vLW`{&QdUU z!%B1Oc8|Y%P01aGeBo4Ysjrorn%-bQ@ylHw{7C{AF(X>4F}rHJO@g7pQ4A3P(@|#` zx>|w;==Ap%VskU%#xEB{E>gYA{e~m_=mBZ(tJp+81~-%(q4@Y-`LH-5S|tfuy7aPz z6(-@L+Wb^&ay{?2@Mv31y+%yn7osakTjH6u3>q(wyz^}iulufB0OTD(wV@)_DR;)* zA+30-RRji6O<1#*M${6pif~)~reJDN+s;$)o0|)gjX2H};_878x3;cGZhhbUUXG$* za*^G&~%d~Xy7(cu)yNerqwUx6e<+||T zaI4(Nw=Ot|oeMvC1+h`fP1^iBv0DM~Nx+Tp#qZm0e!ptSI(T z>B)ZD8IC-U+WuaQ>f#m% zH&>?!q-sm%2PqqhmPUl0d3X|-fHwH8`Q26DyRmXFX18JO2A=?W4_3aSR7Hn%5AxRuy#>`nNp@>;=mJ~2U~iSv z^^dZRoTFS#LO;4@-1HV*%HnHvx&1EW7kW6rCt5!i^57S*jsR3g3-*y`S~r(YlgEIj zc-hEduMn_xrlgl}*(0vntK!cqHyXEm^)+tw4J|BZP5nyf{t#-hbfCSM7}D?byM!HjN0k?2%~V;W_bgcI_u(o5+z@t zDgvT=cx$w!;Y$`vQw3rZE=@9wk*pA_{BAbV7NvcmeMNACa57#>uLw68JqdMu|6(UL zSn!<3c^cPWnyf$b4T2cmGgY8`#q3$?KYgF#E>RqS$DRH8YqeX83#%*ELmQjp<_F{=sCNgvFK6L%mfNU0m*M~9A6z*4vULkB}fSQYT{#+CVG_+wW^LIWi93QCeQ~l=!&y^G!TlW{ zK&FX6QHf{K&W=jj?rB|fw*E?PlFMx#7M{yQo+k&sxIm@vzcYucM4UeevP)sle7pm#CmJdcfMUYq%1KaSwfrA!BcH zl~&qAWSMwbPoGpN*FR2)ng_VW~LEGH#H4edS)F-kmQ66sj(p%olVUaF_XWk>Q z3rnN&q;fqXY3NRqQSUlKPiV*>qUqXfD#*CO;eEZN8U)f`i*uEP3Y9iw=^aK3PGpLm zB|73G`Kv>xeyOM?sV4YFYCy9m0_pFaf4i0Gae6WipBTR0LQbe(E$wgp!8qaXNZ+;p zQ=^W%ZNGDR8VS=8n851k)G4t#QcLV9{gaeGQI;S7?N1RYb*+@@V^^sh!Q?Z~N1@Ii zl)674eM%&+Q2gfJN4lYs`?i5^vV2#Ut*T@JSX`QI-GwRhMb4|ONB;0;DDDMlKdckVp zM6v9xa0dAM#Fth=7=hBVIsEMt0mL-^Wk4;6O!ZVv&~l!_b|X`(mlf!1F#kbv7$_A4 z97k$$*@iDLv|gynXarJd2)J;lzX@PD+h}GmuoyB4qvfP5m?KtQrDhKn zf}u$Co@1%8IyUr$bM+sxfZ_E2{)DI=(ZS&LXU|B3_NSX?mM;%PfB>XVkoS zW*jJUpE-=36g2&=r}rGZNzUliVDGA7(av|cNiB0BPyK^bgsOqAD$lL+G0n0lQ0QOWQoo&dTJFgYIUI~EBDom^!TEg!_9^$N9GGQB8K zEOWrGgMygLQUAih@w3;)D|mhiyu4l*O-5oxrRTsSaO8FE&C#64DG}WF1latq9<3tg zW5gEH%OxH~cq4m03WrXsVb+Kx%O_Aa=+a=KWsi|Pf9!O3mZv@OPew3GAjruHUCILG z7}}uym-5Sb-%=ffdsvry_KhWZt93CfyoA^Xr_Yh9WIOoLo*a3{p)>}Zi6B_u{6YWE zt;5kgp=OS(&&h5$LnA(a2MqtyjoFi9dt3gS!LE&Xrl0K#(2G?VoK@Db41_6QV@AD4Dd&G@Riu6`<2t;_i9r2&zWlIw!dJ z1{)!5p-lXda6D_%Uv)QcO#aT|@QBA%%>cb=6rscYu=w4M4B7Mw+TB7NjLu&2X?&J& zh$^$1`R|8K_ZxP@r0q<===gc8vT_!Vqul6bRiej>%HXPe3*iUEPM2a@(_5g^d+R(3 zKAdW#W{~9Q-Rgp1|7Ux?wZj+uMl*ket-0I2ixQLcNRZwUZlsV1-@A`4yn?{ptcIJ1 z5R@<3qko-Ab=JBf-S$NL?kM5;zrp?9t#Ur_J4YdvzG2wV_+cFM?`*Pa(uT0NEUT{0 z!MlZT;`@*N2+)Zu>{A&$NHfK^y$4)Wi^f#XKbapjqTT0h}VmVHx-3&g>53$zYN-gsnO7^-WBWI5TKWWKxx#)?e&_$ zjNg&g#i`6SaTn&=zj|ountf;oz6!t?rEZ)lvGvwQdEG=blXs_h^6k@b zuoetfMMyZg^kqNgT+3XGcs6wj-MbE5NrGAE=IXCbC>L2U9XeD%a|Y|pId?jn6y^i8 zVWA2U2PHLvjd6v$C*%jaFXhbDnI$(L_B@MlHR;y6or_{1xk!;)cqDNhPh6{&!E-xg z^Fx04mBf>`z^!PRx3Ql3Pek==c^xITwI6-nzlEFTv|`zOcPQuqwZSofSV-*# z9qv%!8wX#p$+8)ZBy{NReUnOD=vcjlM^S^BDAwJ_f}tV)QhTD-lywB+0qnJhA#HYr z@W_yoodM6~XI<^k(#FA`Mrc-%JrDG6Dah_VYnhY(#W_0qb`^Ul=FcPUFM`r2ee{1k zp5(H&v_Jo?X!bl>yxt6!YITSF=cE5(t^ddE(ITmwj$>sq^1V5R2WYL}&Wn*(7=gLg z7`+mm>8N5xbAcoOm+THJPHk2r>JRobBTRfn|_U|tmsjhsP+;MqkLj% zzQUcZb=Z6JVRc$N&2q`Xf}1(E8v?6I!kZ*l(VC#2`ZF3K(Xx~VZKNOFIH~z0EjQO; zYcc-6h9QcvDvv8h5}lrFv`#0G87S3QXohF;o2$B+n=+p+13Pkr4{1dyTbLW zM$?(ZS4JqRS}U;`)H@ThOBEhhzHhU#CxSgS+ECw2)_-`pZ-4z=)v$%C`h@t_F>=FA zlT116JED|DZW?Fh_iKKCkhl%+4fEXFwK*q@K$i66c*O3}iqm%ew0$zJ+Ym_GQwwRQ>l%=zu+ZwN?9f#7 z=R)JqrLX$MnP?eRe4-SZoE9IF8<@-55qru~5wJ0jpfk;>7lNRG${}B<__N>hba$o=Ua!ULTgPD#`9SWbL#tScfKV(y?W7$O4M zCU&;*Z-Y>>-zK%3wq+u+tf^7o7Zk$_oi@&>kADUX|mG?`q`T3;gq?b>W zN!BkZxBZaahbp2jY|eoWK(d~yb}SD+RwV%4Ab=U#Zyi)l#UO|KFJ}h2unp=y%ey0+ zl!junpDj++huFWINpHG_I{qj*KC_#0pE<>9d#w7suT^({-Zbkl65P1)`Y!VIYx$58 z+_@#(LRA48Z?qSVf{lprS9f0Xoq3a7WjFE*utt*XxL)yhQQfB@gJ5E)vr1IkB;K^1 z^db^>gd)8E{=7Uki=Txr%x-@^lyzEbxVCXZ7JHan{_wvr@mG~O8@_ql-X7BEeHIF< z^C~!ILqzJ&(;QV#t>s4BBGGmzh{)G)tN_q6qs2>$5L_V$d%zT&8_ei zs3U!X*iG`S-1)6I^k?cGx&BL+xPj3Q1_tC4jzY7jM^Dzjq-k~4Q@=(D2D#Y_*@ zsV1j&(CSjy@*S`%=UV9=IN*>J@xB>fu)!46m}Sr^ZOrT z(?2NmUmle&Aa87&&JO{<{Z6;U=5K;A-3u3o5lfK~A(h{aqW@!%-;jSY-Sz%2mI>S> zD-mD@Zf+R?>i)MHdO~Iy&v_|0^G*Ql|7zCvaQl2*h5>GJJJflDlb#;%@*7Ya>a>=u z#bkE1o2@!IT2|T2QnZ_KY!KUOfn00p2ZJmBD9p}e^skQ!0;LDn)xYx5mJ{YdZn$gx z6z(zK7tRKtlE5%7aJmXa;<1kBX-Y>wK=djIYB!H_bHgR`RY)wWWF%3J(y?vMM-P5j zW>-`({COV5>Z~x-y%RheYt3g}uNOZ(QgS1-(5HW=L+^{X_^}BrG&pj3O4r~I z19CZ>jU-^8z`tK=NlUz|%!;NS;vpunQ<_(O9(=cZ4&1w zBj#m>+f&acfRFXASAo|_{);LyzYCLtZ&u=c4SS-t#*5Uh@65 zwHsqXa~}_0?c>VR^IA>Fogl) zwH#@XUT1lsZmnozhd|~5A@`n^CF`cF(?Vfwu{uPeJSc?7lfX$Gi+vrNjoCciciFro z1g?9gP};W7XhGbt9UOq#$NS_PIWF{QY z7^@~R;rxwL%O10ic$b+9#(c36xo9w4)gv z2nqxo5U^GMv43&W4EzU-nWb=t16_d6{rG(g9cycp>4E2)-6v1>wQsk!e7uhiG?7P6 zH?L)|A;{nD%+VtFF=BRq^zNt2Yvaqg-yooukvC4ZiC$-BhjZQr#Ag3qV%?8_|KU5} znC`H%iz|3$vT?N`>x?R^F02G`6-VujI8atu1Hg4xRhVBt-dU7fJ6CD4Vi}1W*Fj7K zx#T71xfxSeS8!tIsBidS7Js%3dY5Qr#Ls3ANKQx=`$6D?K+v_@BKlmdzf?>*Yhuw9$nhp18J?-zF`$x|o zvTFspBwb*u-Nj-n*H#Ls>w>GCUqy8gj7Sc^y&&Qa@ zM^NV}fO5LpjaM8Cy9zXBs6K+SORfZ%^;bMKpx)M1KagHyW9v?#kjlqz(4pk2fqByQ zxk=Y$xl9#t>MoNpDeF#IPrG!RSA8>WL(5Q-8mobnyo((IPg};oFbidZNjS<2}jKh z)r*(sd4swTuHUiT-<*?jIp_k$e~8L2C~WIBbaXKe2fnQKw6*`^8zw$juXQ&_@c3Dz zP_Xkwc);&(t1CpJAMA5hpNu+5iU>xT$%NG?AXgI}i84nDQdAnp*yL)WA*({4uC{cF z0Kj9`Dk%Ex#M1_f^t(?WO|Q|))Gz?l$*Ed=$Bhw=-7(soKgYOvjdc6(^g%V7B;humHte0Q6t54m#?r&v41bVdJZ4yDk@IM)MgI`Xx;nCU5d+d(CoPm0!?coLrn*uGBf`~EAC zRb!8l^)7sc;G zdZJ^6TliMSo~a{8-rKpU@=euf0?_zb#=42jOGyS&OMK9XbLbh}>Q`z8b8`KY?p1ji z#2c!{+Z2{28NmVXzU$aSVu++FeU7Rh0W^?;*)zTQq4OSo9Fx=!(BNn}&HrJF!()=P z0j5#xcl4C%)jHVweN-Tb5CS)!R@CO^Z{T)sOY;A28}Z`gCI}ZZbLQTm-$mC3-=i0V z6g@hG+6>Vo_NL3p=wI#V3YB(bEwfZPCc0xJ5y1JvU!V#b))=w2=;j}kBt7`6)R2Kx zr`15;1`{@%Y;u|zpqxXkQtejtq`NU&#&j?DG-QRU*Om6{pF);<^Ral%tfdrd2SIg+ znT8zQ^*H_Y2zrOyeJS;)hcX8aPuEsKe?y)pI1ABf6*mh5tEh?|OH6WL5}BgU7u8=}(LCGM7Q)otI1%EF zN0=D*R9iu0aMgTRR8vt^$mXTe-FOL;KS4uKSGgoxR=H+|Mlr)1`!&zj*oIihe_5d4T42~JuK z;sLQ%%h^9(hKVN#(!IP}ey=E(&w=(HR@wviqvKVmUb7L@GjQ<489sR#Jb3bcf|b}; zE>bu>rjJ21`hnNuO1hU^2+N8s?IIFaJFYT>$H=M1_LLm+%V#5+0W%$s{gwK=993jK zhM%Y#&XnO%i^K1|_vAt~*4DcC%Ka@&Pp# ziq3b(I##h{?0-!sI_GoGlo>S)M%ms>^Os`AQ^`1`;Ug;m5?chpeAcq*_~@9<6ql{h zZ8af?W)P?8G}8v|mcyU)TdODB1WMQJ3aft84NWbz%Ul!y-3WW&M%XmvxuNKfGBYRC zZ|3Eih^PJV+qfTr5|C`b+y?j!V8(plpPGNqbCicfKAuz``w64Z-W1mE>Rg)2EePAr zhwNVF_?$`?GYasbJuWOFSWz#6q{}IJs?S?1Nf<;JV%% z&biNhzmBX{*aIGV*or(CCWtjp^kza<0P@+cJ4U-mXe&NXJU;SufDn?|nda4ghlMIf zn`kgSCjLi2@_qw0o)fnfP#8b#U5( z2R9G-zDN6$9*sNB`JEh}Sh~Tta)9yvf07}qV&-~{j98OshKhlsmvTMVDaS9knia;1 zdcLhvodoazJE)LjL^IAtI|j#5;>jZ~+asFpus^sBq^t-!A8GwT}}$FKJ%kA5{<>fG(N%#Cusy zi!1d3HUwFB8I`pcyN{Xsy>fXj8{T}z_6SkDf0N&J`ei!!T5gXwXzifY_sm*h$0hbDB{P z8`c{-yrsn zk^$kJ()#1`sX8lokBIB$muRk<7}@9Nsdr$*W#HbU7}29nKG--_q}cfz0}EJ>)CL{* zLsOE4Q3q#r*LTpSjhxCuM3UbxS0Srp&V-+6lqdRyRsa$mtePle#ce0J`zS4iPeYL* zPqe67L{wfNS#!Fjlu$9@;#G3G&}%7bQH6sqpv4l|F1kT zP}+u__>a!JdUJKV21IfxTQK@}Pxhbp^KQOVG3A?>$jQIYzJ{8??6^B-mLGD+4yl=Ns37`c7_=ba6$|aH)k7CTVcfw^ ze!fHM^3jv;7z`nuk2Gz~zrG%-gNeul73AiDzqHurUXgTR*wD(8PiUF$sfJHIXzSu2f+gRLAfUlSRX9pzDq&(Yy)B|iIs4wI$U`STi)x_HI0c$+Jo0?2?rjgj-Lk^7$3dvSNe z{{=tDvJ{{OwLVj-bB+MNo4^S>+`)Y+#wUon+GK`xtV;5ArLfmx9=KFeTUe@d-8g>L zQ1FKzUllT!%0uu zI{{HgMGv8^`u*rq(0T66i0D~KV6mDa89>%CaNbb#Ul5g)_s@=Q zIny(75ACTPXAvp6Z)4|$y~rOu{%zMakXTi(UG7^I|Vc6 z`sz3d9s5{0Iqr3Q%_clQpeNO#SW3yMksP#L)j#8W;GgUZYkN-16!T9N4!zL;XT$Ah z>=}p3m~ptu+5)Vceipc@O0U7Px;(CjR%W<8_{v_S$RE+_CtB=nRjkixNt*c9S>EHl z#mRVjbf3ZXjfVomvCziC7FoLzKrxGC3L-n1(*81f5V?qi!1oHL>wEGRq9P(Sb7vVq ztY`Lszd%$A!70X&0sBH*ed_4yK%*+JV=fcdt_ZlG<&T?YeX`u;__{ZN;yN7C`(L$T z4~71#1-!47_tUZX0%~H`8A>*ZzsG*BDh{PhV%}+bL|YNz!no`~pOMLi4jyKy3J&BS@-=Q6d2L8e-p=O%&ry60%{88tY;#k}Oi_pi1_<{>6g2*SAt2$je#aH7Jo z^IOP-G%59Na9{jE$g>`O{!JqrfU%;9pd8x+qn`;AMp!H;oKcvPOkd&jzA?+D_S2}< zH2D-%l@%woq`D629$DC=>vH~pjQ^5KBr$7(yMdRVyciH9DKqxnuBu1AFgm5kTrZ>s zm`V4Iq@^f{^2zE9Js;<&y2o|N@&r>^;BeYCK+2NLEz@Y~;#7Mj^Joi0A6|bMd-jmi z$+O(?0EKrLJ~&!m78K=fJrKm2p1yW9I_C?zVWvO{Mr9cX*EasEY530yw#f|x;V~Oj z6aRZ<#^iAk$##m09xy#=pISh*=9iR+ns8!mAgG0Q*e1Ob>RY8Ut6`eNf?oeJLz>Re zn3@jMwaTtrO&1cDz)-9L3B=qmSGDc6j;68EFSZ!wTI_(u3cefBSc^{igzn#W#A4Kc zpYlY{k0eJ6R~r8QXwBR=X{%yT+0HZxsh)&JNVvoTprwUX?^jDHzc z>oRE2CGqe*E4$^73i{|jKN9fG$y?`Lrcr=*-%qiA-g!QlT26=KFYuZeYK}Qxwt`z} zNooaioF(AGFW}Jr###71`NM;aq8REII5(U51giaPFoHBnFwIu%c=A!q1q~w6xBg84{v*wbP9EPfSf0 zRe@ql3xPu&oN+4grL6Hj(7QkLXPAP6dj@LV^s7rAx58Um*VqnX)$I&0uOJ3pAx91oQ) zK3nhQtt#ew^W8WmSYji4zBhTzd>3T zJw@NRhLaRU3MLWTfgdvzU)5F!Pa&w?RX&Px9a7&w@-FH33hLmsTQ!*HA8zX|B4;LU zDYSWBw(P0Bn5B~=DMA@byi}r5zMcJ^M--K!^C0EBY02(d!V#;v&4oGrtHMX@7F+SU zN`Wg)shd?@#}{B!2iZA8N^--c?Vd+CWrs3QN`OK6v=(?-hfC&A*RM> zSy=}iU>RR@n-m@Qa203@C!-_J_(zFA3+PP<$nnMm> zrpr5fCoy&p>~k@b*WXRgfrDrc8F5upX^-pcF!7Ow)F-l^P!A0fp4?kW<;Qqp6= z*;(_;(8QEKZrS9g(;d3557O*yBEys4(FhO3+>JYEhy+0wbV=HO`B?c`bD0Ugr5LFg zct)k>)6zqW8L*|M`rDd}1BK1kw2>Tve6+00EAl_XRa-AWztS&hZC093q?i4T3gxN>s$M1d$+7hU|W%s zgLcOOr>0-4^@?HBmhn$&pRp-4RolG+$yO8Me}e5?ta5+coUwWw&LWVeJX=HEwX6e4 zWhZuMQT@_E(^^128>62Xx(Wmc_|6M(s9Qi#>67kAddG<;57W$ki*Wesb<1e^M9z_~ z*=@#pT^{WQ{Ee-%y=^eKgcKAxePpDzW*(yW!JZ|aLAgsAs?8W|mv!}x{jV;}<)KQw z!o!MR(w6?Jz8`@fYvWa2+Yv2F>bC_dq9%*ArszhksmWCO>5Hk*o6>Fo*1EWvug)Q_;O5o- z9xI)}EBF=pxK~>+?FVpMfL~ReNdWc<=i*u1##izOxe1@LU{*~OOlM2MlQ4Asa^8;N zFfY{Drd%b0_Z?$Obdp2h<;C_Vm%C{+`FDp_g1|I|s27BOV3$=OCTKDv$Sf_+utK6OUV z-FuJeb62D3(&Ju6Z1%>i+-ua1?zlH0T~cX9N3Z(69$6+hz@1IXJorQarN5dp{sP(;%nalc^;We*YfwyGXzRwj*zw9f+6DveiM8 zyPF?ML2qgOdV{j!P_!`-bRX8)9*xW*JOp;Ux4&56ah>6;8swU<1+^GovlR6(otGtq zU!GOoW0Of>)!#IBCgq=G4_O#}{*p4!CI*n%^#l^^7Gn<{2%Pe#7R4`wZ6?^j!YePx zwn?M$P<3sktLMY~P6H(y;y9WV>Mlla#;-Co1UGwBBilfCocNY>g0pvDHp2t>_Q4}@ z=Qm9H({s$pF8d9fyCRVOZFI*ST8jcx8}4Gks$o9F^@D!NNAkqif7+QB7L$EPP=uI+ zfyiR>0@Hc=;tQvv?A=%{o55Rdi4MQQ6|e55glh-xsCIUH55^k|qCS<6+>$*pk2r+~ zruo^F#dc`0RWqu^0``Sv?B$&*N6gAq%fM4xp?&c4qtm`IgG@#E$-;17;k;L@i{4hn ze?kiO7sqG+UCgT;ZS-v$BK;)a*RIGb> z++kfUV+pXe)VChNt}gJRwQV3Sheh`x9^?XDf)=98iaA~@|C$NJFUHD-KT9gQww@m{ z+SbI|Vf|`NkTxwlZbj?cE!jC%wx^&&Nj^>OH68H+xZ!WfUpny09v7#&!^bf{rYBPtri~6(S1f?1fRHuAYrz=YTJiFF%knuNhb5}fUq8j zHNV{Qho%T?flhv}&7K&2a$dk6amUS$pFC}X9@(4%zvFWv3gL#eJoLyHtutuzqd`70o~jV-ArniH zCY?x#Z-Job zXIuw9SSr37chkN^h$?mY>yVbtV#EXAaRgMG1glMPMfx)e5*;j$R=yyImLyFnL< zEZ8WJ&1Kg@T=jKgc~{T4>GPLRBYYhBd42V4?2wVai#o~2v&Ggw{O0q8N(Q5f0eKo+ zBAq<+zH`zG{b#p&k~{O0cTc7g}I0%A*S&x8cP>H*r{DETjRC7_Yfp2^n2 zfG`}y^vr9;p|K|hfW-j3Ej_c-YB(2oIoY4}U`}A=rup~I>?lr&NgIVz znk6-OzaJII-$!S5x({1`*t!2I>gJoV5SdG23G)2csaifQzvoDF`Y;*=x$$2u;Fa$D zeEFgzuZ*SE9NmMrQ!GYAP{?XEB&v^|xOiG<-Y4lce>*zl`OEum11Pt3{GzIHSN;x{ zwo_zb-vqVqX6U2A6V*_~l*jxZ5U(Sd)cwNa=Xzt3cNw3Qs)V9bsP7#YOtw} z-M`oIi1A{crse>0rRA=r>f&LXqU`D-%Gf639>g)5Vx&(z`eo2vjdJoSe?bZ%Ml|Kq zF0QrtO$Mkua+A2jb;zNYsR`N+x7o7tHD1q zp{HjnfqOqhXXN4AC7?-I;89dWM6|W4TQWmN4;>RAu<=>g!fd-V{iNWZP~Cm!DzJyV zeQyCnnw)tq(6Sns$#BmqejqmSET!)ocJr&$&FVLIAt@hj&8jYO1;#KwqIVBU24gWE zS4=-!IKn=;jy`z_@zzK>b5Q;AQvh%hKCsMu#4w4D{7L4B7x&-ywbD6O#{kG5GGnwT z@(&cf7LfuYy^{NqL`c+feY)GPjG!{ot(UTk*~WOtB*-gioFD4WU_WX^&9NDEkAO(p zJnP_|wGeNOt95nT#|_2yA35J0PbmqJDHWu`ylE7jiMR zk0wT$UpkBdKK4?9AUWK6F#2`$chw*YBOnfBuigmQ162LSH*ya=ulZ>GWdmufs**wU zq-ioRtE&-x{kQ|6rV$ z@I5;eHksMnJAlvglN!&rS|^sG;jc^s;Xj;>6-LhHRanZK3pAiAHN44qWfW-%f6rve zkWTTQsnU6(L1?WpKbl&`a}fDsvweB}GvEUo(m`Z$(ZGIKSvY9tsa8^@^+e-c$vaHz z(&*yTkC}HoF4QDu;nQC(n9FMjIJA~CkSPfe;Al0cn+k9cuqg`ozZb&d2O?;r+&O#RJ~V0sD~OFHiJTN*Or z5R(+}#9*qhx%}7_i{z#I>#XzOSg6kARGaB5%g+Z_^vmf0tTY)2jA3Dx8_+N*&LSwrdxy<>MBK4=f`PG-(ylTOzg z2ANu@bgSt+{=dgOn_)`*exw)^< zJ~nQ|^g;L7FwlTA^h~i8x|$Z9wb5)=GH^mHUk!tANaaO0mu-{?I(n*^z(W5f=i$?$ z-Ep4SMH8>5x|s@$FW(Aq2{;tBrFhE8SS*LwjEM&b;=u#JmACnAmCio!x}7B!_5Kcr z;>7s{CBi~;xGW;JU9g3*>rmYJievDqT#@wRt(xBMk4bi^_Ti%0&hym%M&|p{Bl0MI z@G8^q*H_j;Ap13QkISef=O!ZHHagX6@l z`O|9VwgG93?mHItv`i1Q{gZ1J!J9|JThMDL_c9yy$VNcpXZ7tHwz?%YQWm0?Wf=$h z_WA_$9o_Y-ZpL&S)Rz--wRTzL_;s>(R{675M+SmKBvrbMY^lI*+j9!GjjYx*~Gfn>!ka+8YS@|tfC{fO0bSv9pIuLipgH?5Z=VyzJ zoM)oqr1fbUe7M}I271el1Yj?U@l)?==Z}My$P{7bTFOJN4{#0l}wzjZMQh7kcaeeR? zP~R@KqqY>`)O+58Qb7XTctoE-Ww3;;&^qj4FmD0_&!-&VpYqoC9)S??J7oYi`Wt=% zJegJD7iNa=**t#wG1!Evi6LNv zYkzT1`?y)*$}8AWyRf4@!{gVdp{^LhGsYdB8Ja&VidL%CkaoQe+DYl?LcSH&W!u`X z&v2E$NGVz`U9F}BJmdz=Zbji?jtysQa|H6MMwW@;vm!^oBB@=MbMw{-e0-to;+=CF z_(C$NQ}NJ5VOr|+NUF8iW~lirytQzd&gW81tdy!*^<`%Rk<`Hb(K30oq$^IQI?rgB zU5Dr3`C`YRV-NJsynbV!tEGk_mI6+atmK%ysx5q#v3_~8(RWcp6S~65rgr`i;S`=f z6Nd_g+(3^ssNP$CFq;c>JWglA8w9gzJp5799kl`CRy=kpwVGa~BvPACrSi8|LO4m% zNQdc|;CSP$&2W)D{<&WFsQ}rM?W@OQm5t?;jZ_k1Rj#3_P7Y5D_q{EHD@!rcxzQ4G z^yY*2Dy??#>Dd|5;@cMoIna6NyyW@kPLCO7j^6cT*pP7W)Tw9sRZ%6zcf5ubhd2a| zjc)J5-Ur3%DGG3T|F=k!LTx3$8(VfZ8|yLnmZm-ciI-jE+Rxj@^HJ=Hma1v>9kf?s zYX76g#DDnq!}D&6mB*%9<$FPMf; zu?YWS@P1S$)0~iFPG95l)b;864 zS&_8~vC6S}K%2-Q2$2!jc^f!}?)Hq5fpP8E_mS^f18LEpnL7T)tLcJAyy`wZ*s#nI zUP{qDQkxDSlz3eqcbu128lN${2Pg7z%P94TY)A$_7U_7b2G>1V<-iWlbbut6Lli-$ zJ`-GVqUX(Mvci*=8N3Ad!NQVt;}`}R*0kcZsT}6Q>gA`fvkVMvpA!_#Y~E#Zc6M%+ zsuW#y==^7F4m7&?df`9LqjtUExpr``N5cOxz=q}1Og@~nECmG+$K_1@w+VG;i{7X6 zEZmNe@{RrXKD}yBZB(u0EZaNPYGHX%XJN4Gjb{_0Bm`={g==CT~wL0aD!AETD9zCh^(wHQLu6B&hM z9nI1Vp@Yi_vldT@(wr~Sx+$;N*3;j!Yo?Pi9vU-8vxXdc$9g0NQF8cq5-E!TjH?KSEmI+G9|B0NF+pmQ>(LS>6DH>Z$Iy z#Z^j^VfTAHRieaITsf=4Wji%3pidyPi06p{7D`Mn#2+Ty^q^i70~Mrcwv3AGzoz2T zW?Qjrq;!ycJs%n2L|8ocMLeb}6tblRWQ@LG><++N9 zduh?Q!^&HJfuogHnyUAlo=R+%OvSxJfcNaWTdiOgv!!c}mLt+k&*z=0$3sgGlFm>I z+QL;@;{klY~}_)L_Wk$f<7BG_ErIMnw}0Zw?q z#H}#u$?5L%zABDAV4NLv_l(xul>=giL+G!6;z6dZGFxb#FIuQU?%YzLWt{-m3i#Si zM)&DHCysMgE4No9Hh=3-z7gyCE)ebUS=5Ef_5La4`lOh^{vS>%tgf#76J>RfPF7ok z?s7-%EyQj9nCp2+EsJ%AbXi!H?;{fxM-6Uq;-Mve7q+L;a~LgPua(lZ?t@^PP!~cdy$MGgmex5a^#};egNJr|TQ{OVgc< z#$|l-wQmEl^^mS!!TN`ZFWN7UgKPA%qkArBE8*DV3W@E>KQn#{R%Sr6gN`3g{EqQ3 zB_2-p8(YDjmsu=ET@Wkj2scF1?RX8Q&I^qH{H?PeTf6|%dit)BIMo{{-E|Ln+l@T9 zhS~}3pyrUVNS6I^Y~GN~JsJiEBSlb74!56vKNJaEvWfAn@n0+==QWp_{=Slxv!)2R z(Mk)lk>kIhtl^mW`np&)`PWTz4J}#qdg-XIGf6)90Md!W+v|Q9SYF4wK6kDfy^T`6 zB4YLNiPhL67QMgzDj?J35hQ<>h`6RdhYJ8Z3KTkiru!h)tnhZ_3j71Z7L^fI7Vayg zJ)1XRGIN<{!FSBx@gqF4@1x^&R@aPREo<)PWe_2Fo!p2}6nd^_Nyf&oTWVVBB+$y# zEf)XX2wm)|H5Qvk8E~<(bQ!-wy&qxicIZ8=RsG7ZbV}Lguoa+{!$%Nr zL~ySJ=MP+IMEjGa>ezosL4C_AjZq|-PF?tawE!E6N5!R!d=eGCQFy+gIJD7vDBhqI ziEJJ3+xnF5N9;UPX~#cFo(K^+2*EDBLX;P|Wp3c#3uYemH&Puy$uPE!6j^EVn(4Vr z(YUpJ>EgoS_balYoG%XgBBS=?pRP%vPvbliy$F{`S~6S08_yCk~Ep58yLe*3634#tu&^F(WLiq(1E zfz~73@GzT0d|Ul=;Aw_yK)!x(lH^^VDOKx>GbnI*NxUicxz%DA7k zfsqB4jpY5lmv-Vf;oa4{zzh0OUoKu}WOb%c5N+{XUVZdV?fbF3XWdaNzy&Y&DESXo zS(utd>Zp*aMP@+<*#$@HD)7RE{zZnrPvfTCO+dRdR^7rTk8c*c>gW>fau^bfKM!Dv z#tQC3!CDzHp9DcR0r4T-d=9mQ8Fe4gmqZWP8>6&e;d1vDC8Q#sMM|-EuksWoz=l?w8t^Bv&tYkc_q6nKR5qa4=#DbkUI_nUzw5%1M{Tdvu^BCOeB``bH#rQ zeNxljs+6RX!Ndf%dM;H`Io)``T!=)i@cwl8bvAKzA#36$63t?5h@513yS~|bL~o_a ziaTBf$9kC_CY4vOwv9SfO=*3(Eqae1=S8v*xl1|}w^ouX@W6=tDaN%~j41nsi-d`J z9SWPtwacSw1Niw*lJ#K7PW83PM>|akP$8GmU0uzB@#AY z@%p(3KG)l7y6VSOCseO_+UtOA0q#`XZM%B8yOiTzKk_vFdG{<3t;ZA2q+)#NPa7Jo8BaN#3X|EM+t{|Lv$}XU?x$CI~-mfD~`awQq#AD6X!-^oe8`&*J;Mlm&2Ze$Tf7j zHL~?F9sbim+0M(P(1i9P`WqGZjVzmoBYT~3LwobG2SWRRHO(pMYTf1_ghc#h5f55q`x%5VQUOZBEQFV9c zT}gYFZ|uryH88n>yUure?FV-cc|LH@kDO_G^oEO@-nV9Q`D^2ZHD}Ed)1SqLr3UU@ zk)GHvC>AFY@NzuROrCgu)NOmSfeyVC$e>CMWQ?$Rz$?a?q+2X9w zTi-G9Z_ced7e>p+0WLXrXx->L%lucsI{5T>`_8Z^5HhlmtRZL4z`nrVE-^SVkm8|e zt+^w-5$$JaVicAe)A=HeG`2m{!HNjKhP%KVu-vLxh^ZIBon@bHJ!u-?-aXUMbS>IT zt>nygRtr3dg(!mGPMw^L;Y8tg1LUv#2NCn>N-6JuLKt(kM%Y9F^WhD=X+`X5mv&_1&lJ=T%c&lWcIiBd8N z3|y9j6i(VqiWxvqPC=&XnIxjNzQ_feV!jaC_W+Wg5cPBsc17ltnsQvqW><5q7vX_b zFTFe|^rwk_@{#>y&~ta;vy9(>c@^beoiIGsa`>d$gv07Kyekajd7HU8yzj3SJ&KA4 zV3)~=9Sx2W^1k6&Dvn4Z1hI1*Jqc%cCmzv2N?(X|@A~+)i+x14;v!6lIjm1i_fPuZ zHU9pbOfF3Jh_PF~HCO-YkcW|)!BYhK`m2r(+PA~u7y{$fY+wNW4%O5{^?r65*!~c0 ze;24IHGd|P`G%1cHL05 z57O!#JG2F{0g0DfJCMAwKe^Et2fc>c-(r4?TYE1@DN5%W%V{foH(7vwUkXvGH7et1 zOARkw!m@i!u$O0QNExg-loL7=oj{5cLoDR!tmDT4%TjQSZHbMIZGZg%r>r6cPKj|K z{o2nA*F|~jrf2GDKOEA>xFPm#r`c$#eJbv306LqCg4NpUdZtkQL8I)Kx-b7Atx2d} zblql2PtpyA>@szH1EPh>aelH4jAee@754o2?~`%-H!ifJ>Xi_oab-zYbFL3gOh3|} zt9e(zQ27-8AiK^1b2X ztsBJ@E}}4|3<7D(#O^=p5#T@m+a;1?z`budQAPW(f}t1+V-Z%?9+k+mM4D{}!M6Yu zD?+VF3p&ZOCb_~y3+CHAyR9k-vNGhC+mNn(i%pz&cKt0SSrPE(THRX~Z(PhUE@{MY zfA0bGUSaMAoBoR4Z`EL}7t-CC-v3w+a0rQwRlK%_bXH6s>>94{=c=zres4E);$fd` zh5kC$vBZS^@n3C%^-wr{_!x&qmPp9$R;EQH@6EfvmC!4(we=t}=dj3vOz22~===jhW3+XBJe|+1 zst6T#g6U?=nB;ZtH&)CoxT}D{tu{oZO6;{UQTshkC5c zkf^Vcb^!d1#;W;s7r~jTXU*BYwXf;iIJhYX?`P>o6|Yi|?M0k(@mafXpA&b~g~qk^ zzS`K(#V|ahlEyzvHYS3zPP&Xabf>>%Y+QaDF1hIY`@p-=;B*dKm35XMbgPAga*_VK z724j{mlj=f6g+pd1$x_hde~E^(|W4#gW&lU@vlgGo__PS#gBiJRI2*a(4XNbouwnJN~we zSDQR3j;a~NR>&YG6H=kZRk0&g^=~+oe}p6cK>VP!*KU2Ss!ZXWAGtz_zo5c_hLEpC z@)Uol|F<7e1h#6m(T^Zk+euVbUvUx?0}Dx#FX*U@y{&h2M{wpaV>PeEO{84r-WAsi zq>I`u9o+@u5RG>s3a^((9b>?ZMb*D9o8;j3q`lnN+++~XlC@?Q>7qq_smeRTut|>j zSBne#ujbq$T(D~KOAqhj39zSiX*_{OS#@?_hTLVQPX0Tbol66!x@jQ!(Tm zDZZ07tIbJT^@Y};79+LAAJd{=cI4-N2RPi{fQY#>qrqs|4F|t?*`=pZ%c+*l6jXt5 zTiE+dH@$IBLZw~36K7hNZ$Y$Dgl{G<_K_L(PqF@Te-jz_g6FYW-?o+9j`2Je{) zz(eMfjpx2@XwNY>oMfXN+i&d@h6ePKY-Yw5Lbw=JwSy#k!g?hre{2mP!B!^_lJTGD zmdIo6{ky9Fa8!Bt)yI?@b1m8AZU9dx1}+KUn3Lbv^%KeI-L(vl1 zp_;Q1EPsP1OvG%U|5}SW$ffV5tkUsI??gs6Z^h$ygx?~~ACr=N20X=iAa_IVNt%rIrZxx~}mw}=lUls4X83fD-^W-?0{YEt{;(+;G6$qocf_u3_5#y2dTaGVc;TuaeNpv2s^$GB@^qW`%N!?d-i0u&Qa%R&X?M%E9V6NkYp!LbI#LRpBd#LF_7Wl@52O(faAB>zh;;ENgB}${4o-BUVYPqv#rBv@F4HB$= z^h|p#4@zHWJTP)BqOIjI5TV&5e&Gwq$4t>I(s_Cp`$4DRkKdNk zNdBSIRxzhBe}WbV1nk{p1Fyf4`EE8*D}dShh@ zL0varMAqbfzT7aXkiH8AB=`y1k{Fgf`;3mF9?1DGLrpv)Zv-rUpcSt7s<=&UKig5p zo~O6Ki1)=+0mz698dwp>`>q-9X!@6JC)KySK~Gb@)42wf*%DopIIXxIW~!Wo7wSG- zGy3lGBKeL*i{y$jC+w@nh}rxwZTyzNQffA16DXSU+apb)WolJWfzG$f1N8)5ZAwo{ zsBVhaOS?(tDFRi`jCSWLxrm4p?5hP)?y|D;F}&PBYiXg5V&-2+UWNHT6ohkQiWK}G z{%bp>bY?;2b4}F#Z|T$(+)G0sA6?WR64B4GRvkM%#qrGwGO`pBP~{WC zAo|kjIWN3J1S&R!m`ZsKdwz}Xn2`_>WkZS*?SRQv9+~<_C$IMYsnJcl-4H$1omFYBCoP6gqcZW%vy~ z2Wce(^iQ_r=j~nWh;G>Zd_@>qC;a|6oWw~AK`;!3BU7S_@=BwmQTctJutBy1N z?dp%h?e+bNiCiEPv&|?xFhK&1L`*)M+CE5B{kU>6%(Fr<-?QNP-6VQg)J zFVBYVGEJmgpX}pk(2cebzVbyn7{7sLuE_Y3juL@? zWdc^rT<)OQWwA#FwSN7pvK4`*cf+=J;gJ0)_S2~OX}VAymdP@o>?lfYWW5ovOxx0q z5L(4=jo2ltzHu(S=uT-c2V7v|&L#Do$cb+w`5<`+)!E0tH4Ls%e8wGj&&2L!SkB;0 zcL(-+wHD!u`){0&Z&2uqO-a!GyIwbVLM*9o*?I{r?NFxW>E(2uh<0d?Z{9*FR<+=1YwMnkFJW2rbSvvjikvBW2B?iTUbpwk#luGlYg(Dz!21I>TR_WE zG3OIr=u*ASbdySAed@FY0vmaqSe#+lk$DhKR;BI^mI2)bhb?p69e|C8Uk9pFzEleA zI>2PQ$Dt{lACCEG6WIZbcfS6)*_sFNn_JPJW;4-?SAe`OxS+S5Vifxa>g)PJG~oF! zNPK$k*x&hq*BaXX}=D!8!e^mzYzs?ffm z!x6z486M&kS6g8dBTCku!x;lCmA;Cv>ot%zdhg3u%CWLQKE09NlallfbDvfy=4w$2 z9}9L|`DC)Lt+|=raDTyVGdQQ*yE_B|d5|XEcf-`3DgZe7^MuIA=1c5h=dte0L@{kg za`|;4$HfVE9J+Z$vwQ})Hd>j(dX)o4qx&&=cWit74!tqq=gXYpwB%g^PZ_@e=*&af z_VY|gX<5Xfg0#Kd^mI`zVeZo@Qy0s?+0aZFWxcy4>j8` zm`U$qDAUmEiEsa|(f%6*7`-Czw;#(tP9YEEgv_fQV8BY5_D}{fD*&oexzK0i3HrmAPa*NW=K-wRB-1NhTwJ7@?PeS7nwGwsBo;b9(uL@I zMh+Hjy!Duv%aG7lAtH(^+TeL*mQZbWv4hsWZJDj*@bYP>#b2*j4)js>TWgtD1p{@Suyb;tcE<|4t($nex$aB~#{dQ|9 z-9_QFWK5QQl5`EV3xPunr7rJnZ!BwG@%1a~I+Ts6DVO86zWa``hU$l*FcA@}LF8~m zbLd7hx25T>7)Ufzk&^!-A5jMHHv#*CrsLKAq`(96lkJv+M>u>w5||^frjv#_p$?i7 z;V7N7{K3S_W}`8)cxiUTaZ;69jG_nf)G^3R-nMCamwh&b6FChqg>8qtLucF2FX`Yi z$%0THo7o&u3Z__T=2uuozs1Oq)noCQ$1D1E_fy$fw4%Ob>ZknRI~L;njaxwmEK^)n zRs63~3oEDWsu^|r-_h^CKvnhl3b8jUbXE`C;M&{D<{BCKMa~K4Yy%uJV&6?7qgMHZ z92=^7Wbwr9NBH~jA4l7khtLKqQ)Eg1fmY?4KLva9*S`TIWIt`MRxM$X{HA_6Q@89} zg;W`Rg}mpLgCVK{ANhatfj9b&+nTojvAjX4!jhRb{ zcBzG$a+ZnF+i2|;ic7C z>az~OjxcnGe>Hn!>W5RgllvT9^ATBXZ)eV-K?}|A0}N>3B6XXdvIQ*H!JmxV(|5bX9`jwi@f~P)N%2y^Kf9ooXqx%fe`x$B4d+bG$EB_`Jj^gF*|K7N_$RaKWd&|#EB))&+W7XDNUvmCUedC5(A^r_@ssQ2=m zGzw#r3Yz|7VHDcWil!N7`&D|Q$LvVFjXG~H9S%F|a@07o6+L*on zxeRdr^x~_Tf8|I2lm`#}Q)n9z9{-zIefaJr4+pR6PHcPMZq{HmORJBM-!XHvd=pXu zag^lE8n*fWxcbkqroydj6t<&+AR^KUf)qh&q+^gSB3%Te69_GU^co`4J4lU`fb`x& zFA9VfdI=pN^cH$AU-tK&eV+F@zwcc6v97h|J?0o=&hfOv*i4g^E_CuYbZV+CC!4er zDtli>$bSN}M1Tu1-4N9#COJboi6E=Y9;?c|dmkB%Dm~)VPE(e^ix58|2gg`bKVCH< zepOURr+i%56SD0Fu~XmB5T5i|sc?#6^0RTY#;GP|m;UrA(N|oryygkFUicl;TkOc! z*ypdkKfA=ir{t)>Z_HKVz0jd)*USZeI$Z^S^3jfQm5OXz2ZCAdQ%r))Wd9C{c8#Rh z;g5h+lY9`;_*3VR?L^xpl;(z&ik?je7R}T{bNW|We5Yz%vaUn)Kpbl|l=EVlO5Adc z#dE3sb&F|^W+^!;)?d&$d{VtfK0`B>PhHt@<;f>-Zw`0^vN#ZIA|yw7!!~ea3>==g zKaykCw&l+lMNbG$eF@7h(Fe5mXMZl2z}8taysOscuqo`dj7^R`5#RxAMqT(hHx~O4 zfjE~6BzBHz$!exv_3v(d6jnuA!%bj2HE<=s#iHu^J(1s}n&e)qM>fl?kolO;of^ijR}Q%T14I9x|x- z$LLttc(#XFg6pwa8*IdN*|Y&l!%iZ$2AkmVT52~dxxGy~wI)`d;<}30bpF@uJt;pw zw0!KL{KiFT4zxORl|J!4@%^z+x{v{O6YRC_6NE?cj+{+KUof74)J_h)2S2Nk*ZJIW zAAfCpz1f^#2*pZFs3^IWgc;swELCj*3}ns8V3b=hdwZXzS)RbPT#YP@PIVKoC+;GBzz7Pn$vl&W9PA%12<)^XSdG2rdih454k&K zh7l#wnzH!lO0G99a*%a3mSj)HS?cn2w)Z&^{G$g~avoKFjW&fXcgyB(ZU1h6$#as8 z5J*({HqIxw=l&{_!Wvo$z$#bc!niNvtoNZi zHiU8ek506t z;QR4dxD)#Z=7 zbkJy>X|A#X1I;!q#bpto0u`bPb)I;>Z}M&-w?5ZiNbGF&yfc?KZu4`SkoL46@pc72 zJU)tyEU*~laweb9rd~tFd$fnVRD>;P!wqoB_G?WOm$|vB&V(ft$rF1)k2Kh9_x~WD zXsu{2#e^AC2j&l8%va-$O7Fkz8}TK$DmhOq{}VIv=hsd|i64(|nrrUvchIeU(j_IP zfv22s_wQu5`@3CY^}LSXpH!3t4a*b#Q>}o09NFn&;I2ke-IvGTU7R7}=c^guqSIAa ze>R0m5S{vh%#Oka8!)2sMM8IF*gQBd1q?E4qFz?rK=>^>!iK;KcFb?_ zd(#&>wBCfZC6xw6?}n_G%;s$s4hd5N2{7a62EY<26f3gxaHK5t!1-w|me%JHA>~Ct z0*amClH7naoR_iF?&V*v?a4iO&;<2MyKdmN{SG6-atT1|!-aHEby()j_d&c>y}`Gm zNLueMBi=VeS7QmI3X0}lrY}}s&~#C#9lZpJxtj$PwFRqm3d|{r0M~Zz#&2uR8>kw! zD@2964%Gc;w8-_#haJSO!2>cvdvjajz3@s?LOtie+U&NJDza(t$YgYckcFOHx`}N* z*MiMcUHg(^6%2NMT5LtG?O)QH8aeE%j}k^QJTZj0%oWtmbbM^l8|on<*j?|(bvLiS z2dRhzh6f}xKU7L1Oj+&TPHc?#i6IX3C32Xk%m8kQ?FSA= za#|rfLmD?1hNd;)yKem4jEiQhWAKw!;PFM?FAKX+o*#omYM?_IDebnq8w!2t#t6XG zA*cZf>!-Sj9OiW%Gfdm}DIFb2yA*c*7EcwX&zwYb7ySKZ+r6h)o?@r&Lx zaFvPu*DtC?@QVu0xK#ZwzbH}0oyjbR-S-z)t7)*SZFv37cny5J8n>dr*afhu!M1g5 zM^w!}>4dh@R}Qr$O)u2;J?Q-h^+!1*Mx=vnEg35(1t773$`a-W*%23874`#^5Fk=2Eb^BNhlf}6E=7I&x9F{` zf=AV#cxZBm*{^BB>sxI1=qNG+su_e?K7KrXKoe_w6cswUbg2qOg?3y98yTx!KZ@qh z!7oudFmU6t;QP0BTa%>@jau2N!<q9Ey@Q70SVfN{9%R0n{w*{|(t#^1%D#zck{m+4672`7R|dmW zAYUkNnLbd6zV*o0@8M7G7}-+0C&kk?>*PCJGYZW%E=t@XP;w@=R;Rf$K6jV5ENv0XNV}bg+!OoQsz~=i?f8cWDTYClvYX(!KDtPE$#WMW z5n1E1M7P#vHF5I_BzkVLSJ4H%`~jlK1_GqBVB$z+& zJNpmE+jI!sGFu7rIU}^r5<*F(Ct%YujJC8cMs~&2rl`!G{+S5r^gEvw)7(#a1EW95 zH;CXgMBAYXDcdo16I?bkx{oI~VZ;*)vJK&x;B}%ncA0?=XHPO?N#JaI180UG=A`1C`x)>$4ZH(5kJ?wsK z@oChX)KSz@>0RA8J4mAs1m>f4VnY7}kPewd{`C$Jr3Q`9KlRwtEaldu(;(lp|6V`^ z97sgdGlgE0*kS^Zm%u6)y8K@gbkl;xIVr?Im^uHINkNoY4ddz;CJd1r)d+u^b;*!rQhW1@_JQ- z%k}%<{U8m`vgy18UVGo{%|J-~c==VQi{vWmWtYNTMH@-|ae9tP>I2zD<>ZBq(u*)Rl#!W=9#H{b zV3oJ==zW~cC@;=qck|VRCy4fa|nH6BrB-|SVnEzteD4<^-w{qB;xK-p`eA)lH&b@#+17kthrguK(K)J!AGcp zy^I;jVa$Z0!3lF0tA6ZhcAVSY(kO&YyIW4+9RFAY@T8UrwVgHa0J0(E4x>-Jxjt-B zVq4NOLMN?}>H|s_I)wlbFkj@sxA1F$0yM)(t)r0D$o4V_TR zb(V5xY5QBi)VjoAr19O(hz65c|3^Z;GlPE~5Tdh}d{UebvZ3WzUOGLUwKaDCOii9@ z?r@fw8UD0n|9vZxCzGv1I|hUD9=ZF+E!!+>$bK#jtWtn#|6sp zKY`kN50UEoZg1|pyWsEGK|foVJ_f&por4 zWwY5bBU(IYTAQeY>AjwHs8OQ56>^nPIrTE3$6j4<=pjeYpjPa2EjB_8Gi(jK>Ta0x zZ>&bxIH`wmB=0KpKN||QFF$f<6E5Nsv%%`Cj&_0gM!DlQ!GH+m;i*$IAa?Ur?E{NT zqo(@MHj`i+4kj@-k9N1@-&dD>(DABH7DGHoF2-z%YS4T0TX7JVb@d1nu(vab zp=Um#&T*|Cv$bWR0rtsx7T~#{Gb52emAAo>wuuo{GuG3~kH(i3N31ozb?VmiA>Ni< z`JJdez$985RmKA)c0uS?_k2pGqPx(JuIpMpBHu^Qusrmc;=~6BTk!Me*QQ!W-BvJ6 zS2+_3^iI5QGl6m)#>6!-0S)d`s=}Z?V}_l@B0$1KNJfvCfRjmiVmBtN7#mT}BWhJ9 zE$X*qnPJF5@e7*o4GFXnb_xOT`XC0D5vsOe8#{U{wdCI^agQc?_bU3ni|qe~Q)Ncs zv=R~K$TQhKsbtdWDZ7~I2aPB_gsty}quI(q^A}}E$&BpfU@NhW7X?%(N#YG4)jZ}6Fzqc@gh(VgnS>X>eTTHvuw&l) zwDMFhjgXPu@3wdXKW(eMUL;zeg+<_T+pv_=U90Kx&rj0;$1e+-(x6m>He7(2-mIo= zFFv=|hD5Xl_v@y1-Aip+UAX40yVm~81(YH)D*JwZ*b3ddS2|bw!}w!9nEclp`W@w| zd-(fu*v1}41Ks^*F0J{!5>!ROtE+KAsPexf#k>Jcj|CT|rK5)LpzZ0eFLoQ&jH|Tg zO}yx+Vh1E>1+CjD@B$h<93({53*0SJw78&XFoI0(E_)1O^sSXG>4xR?idA?bH8Y}+ zW7M0%DEVJvNJ-nXm(z*#HID+ZN=C`})4jv(ho<=l z?>xCSy$4P(`e5PG{fyMy1#ghTr|r$jm3eX4=?Ear$MMEM-sQOmh_vQW^LpDIohH;RVchg$E;`(6ns(22(Tk$b+Joc^=^(FT9lHNHivizW6t;# zPKS(M(Y^IaQ5ACYPZs=xHZ0?(?fMbXW~RxOVb|ZK6he8}5g3!=B?jGUtzXYoJzK;B z`1o>?%@y_F<|5!GdNlcY0k7Wq=ke_&;`TiEO>_)7VO7hzwnxXGasBw*!1R;b4fMxA zB)|BG7V%X$cKgsg^EIEb4)i4j+`(JSh9&J4apI(x!BijZgAO9zZCk3Os0}iz=@rxY z-%)g0%LRspP>*S81Yg=`1V@@fQfgz@r-TPOB!5MN$K*NVthn9+bAKntie+@o1T?BO z2M98#Dc~(Crprcid?zt}Zme_J1 z*=hMDwD*XtbbnUCz*kVXGHvQHF86?Eusrzp_evbufoVTQ0erF&v~os${W`ViPXADU zuE_kXKj6lwr8#nh9oc@=?z75H=I{zzdiCdI@#2OUz|(x0eLC5eyO$XSr?1%t?Tc-a zJ$uDJEtas68-t$8-A2%7;qT=CTp2-^q3*mS^5t9eK`70V$E%3Dpnync#J-a=EO+Yh zcFmeV{y+H_fA@pA?e&bdvzURspi}deiU;W|Yp#f}8PwUsvqUD@h~nPatrvP17}f-o z^t3;@kNXZPn3KvX2*r!DD*cq&=wV~8$3d}Q%lpJ(z7(ZM;mXy`AFL+DpTE~S@-+n_!Pf3gvmFMiZyoCVC1684(3<{ zDjf$ty;W6!B+Q6Cgr!vt)D^3M)ZIRViskH;)PtPfT)m-Qt#ros6<3}D7QH|@jXW9)|ut>S@5BIFWEq+R&fZb7EFLP z&!Ge9(SW}5zBFvbqIZs%pEcT8h&!j$Ky^kgKNqj^Uu5347GM~-g`hmo=p!cR6nnq{5 zo`?z`_g#&7L5Gp`6$>=euGbUiaXjzO9QV0#3ApHoRLhOa;yHliKS3 z!=%4r5LAb#YdsD)@zTFju`L-;o^E>Pfn#~8sYo}mO=0o-M#kd2iu+1>86auH=k@?5 zr*0#U&J=a}nxX6yU$GkAUrv?)Q%uu6|SQrY=!MlwaTpV6g0eisE%SXSDNS z_5tql>Y#7-W_7IXjLdLgyBC~Hwz@8&N_G+?!9%AA{pFv`Sv}Ma=^b8?sil*nNEU}S z=8*}-%ml~SPjp)(+fc;z#ShN+QD3bFwj94&fT;TkXG~@JVyUz^sQ82?aTP6J=#+Xk zWk_kkP*^xi6?t}N$!Q(A#UIRrd=IV5YNIPYb6jXRJzZYoP$30c_mVlBd&|hfn3tAL z4MBsTnKqi#5oY3@8!r9f8-dC)N}f9VYo+Idx{l1wH%Pw}cyU?Kl*eOXZtts)Y02E= zRpCSQiq!XCC(|t%LyCGKC!$MopLawY*Y0|_#)V%}z93_Pq0~c)05WF9tVay}0p5qm zJsqzV<{!%HTK1D1_m0_%@^OzY4Uj$lwyR$Z>B@J>d;E~)z}PLw#{sjacOC9kyhOEp zIoFq4wx5;KXoEb_jk=Ar7_W2ut3`@71A&37$J1rViNViyjfi83@`e0Tkay$hzoX<@ zP)!nkV6Vg8o6Bd{{@O(!zRktol%LTVGC2x9j*iyhYrm?+h)`Xh?#VU%MY%@OT zxV_{Zwas|r6nyXY174lhY&Y9C(#`&z*oP~MSx-*GW{wAZaYL?QZiqtd zIV*@fgp>0Zf*<{Z(9e>wtMohmq)p*pi%}P_8e%a3Ap|b(L_*E^Q^ljP^329S>s(Z(eX;cvs|W zYinx(8FNa{z?=?~wkPiOgkd_^fwqQ+=Nw7oy%v9&x-c7eQIVK81hh72M6j7&TyawtZe=uD$f~8jn7? znQaN#OE!w?JfrUZB>{J&D{V-#?E?WG9^9S2JHN`WiV_$)-^>fQ^j!N{ZBCnhqqOFMuWL3SM5$+MTdKlv4F@|rzi!B%g&mb<)vT8gXb zIdx;Y^uO^3=1Wkk9+jiwAN^8F6CfFtkee(49lwlQXZh*y*3o{D$AX#bqvZNXM#QC( zfqmtx#F-Fbrcd|A4JU|9vwF*`UO!bnQ-ban3ptX(Ixtg~{qJfgtZ$9VP>bS&PX{Kf z5B%lqW`?aAeZd+v#-VdLdGry-`k!GP`Y?(OTF2Qn@H?t|Aa(rFpHk-{-qI%*ZfTFG zL*8_0#~~#SOd49J3|98&BOFv$!J{|a#JJ>D#7#J}@HiAD>fVw{V;zBE@!5{(qIhkT1r7abA7jEAs^^o(0DL4`?iEEfkr(>Yt6eS>aU$ zzz*>x10yE~3#aGKUS5`+2PPooWV)$Mz!Qbzk3S+}ru<__p}${+)c;uzB>hr#C;4@K zvFpQx2nJz`i8zFm?QoeQHT2&oY!=>iiBc#hR;ptL^>QH5^eWhLvu5A!k(V1#ITuGcg*? zF1OF~?aJvYU14@C3_L6-R>-+Mf7cI;ztPjpfg-Ul>g48aXdfn2U06@u{c>Ef5w@Y6 zK71qs_;TJv9LNIX0(7$cKwdqZ5EH0eJB~wW>A_?*sBEgL*Bd>e}_FnZXw}$!7zYE(~=izkUt#>7+#v7(A%%bNT?h zp0vPjp6t1BjZlCrPHlMR*XpdSc&@{ko5M5BiYn9DA`e*OY)Vt#I?=>7cFk0EYd0hg zst~#|Zs&`VGHzbVeP&=`8sS15J8~$%+veNGAb$REG|ANTK<3XS%0a#WdgN9##etMs z5!-Hbna`6)8k~Flo23n*Goi58l~)JRXK~s!h3`|K_7@cqwP>arjoeR`gzud&`qYqW zBX3A&BJR}Pef&`J-zz4221Ho#V_YNg#=UtC)`6A0>FGqm?|OY>ZM&vB!>Wz&L0$S6 zk=Yk6Qx|+{IW|L=GzMOg`ZpqqMJ+omLcHx4(h$dZr%b7htHsu!OBquAT!{{M)cMQ3 zn9W1n2tTNq78iAW0;e;&`2#@XT)2||8HlRn29LBm9n!CkfOn6|=U@ze;74g=isAa5 zXy%7!C=fQ$0m-sfy4Os}RJ~l!1NY#I&OFgGKOY4!{<|*G*KK9b9I9!3Cn*=r)$CIB z@ZcE;x9XbnF6Pwx z{6;+eS43JDGA?!idmS=D9-gh9%*I`1Ifnfu4nz1=aEDLEAW{Ps6>Jw71~CrQ7HmYD z+@ZOuo9tVq97BeT-AVUV10P=NDR9O;0*C3q_q(ZOJLK$8ce_6T-?1!pVaklu*GJ^_ zH~Z_JA}u&M{>ufR0))^nDD_@`nfx&AhQL=@le5J(Ey?Rvn*LS;@#DvGF zHgo0-GO8o>4=@WP)p+NoAGeV@o7OwWR$fU-;0=Jj%-`m~YI#Kh$G)}7M|AP=;*R1~ zykdmkEFb28FKzW@4$!=>)KK{V(1)D4zL-{pA77BHJ^{adwdM04g7N>slyFbV35CNj zZDY9lX@^a%!vA~lAHMOLoU`>oC*`d7)!xbu-1D?MsAb*`58t-7GcsEhaQwA$SDbe< z?1`5FkWNZ7&j$MURWkn{HsvxJ+zM%q|DthbhY;NxXg4OQ%qo+iVCuOkQaM$KkO0)B zhRt~*N;$2H5v3-@ zzm3vN&f+7q!B;yMWq%2xz#%w7NlW11HJTPX@t0cKP%_`vJ@5JlQ_Q&L0v*EM&a0pb1kHhD?X{mB>gU8r{wtA&yqi;dlqSf1iJ zRrPVe{Rj&k%v0{oJ{`TaT*Zn%!Q>;dQrII6N9!bnSqsxC;$2o`0g>p`T6tDT`g@TV zw=(oP?CjFO_Qg+4m-&f4{^GuTf}!!tL+#1AOWW?C3#$tl%4c@E%R+fy9dr-4kIVBtp#(Y&xe>YOiJ!TdKt9dpju1LA z-u&}o3~Ei_j5JqP1kf{Q4pghe6gfCI5o%okCcM}HVz_m6+7iKV2{kH1@d{?_aFbuB zusDHR&-vk{=4~YDY&eO{{DeK}7eNr5F>W_Pu zafo;@B*DH0W_L6yz^gZ_VlD0z(I(LMNiNY{NTBk(yhOT%^oSYAO65+r^V5#2Z)aPo{Gli0?4HZi^Ug;;v^(L?+CAy$(&${?TPX1(y6Ygo|1%Y zr~9^q`X{j+r+ELh+K(?~#VXF%th3|Nsn-OcJUTrb$!Ie@*CS9_IQM(XcIb%!(p%sl z^#E&|jpoCXPLCI7PCM7xn&_=j8D>6~f{eR7zZ9sn&P{#)Sz#>uPl?Y)yAbJ=*hj;e z>0C^1xoh$9KpDUK4&csHga?8OHs&(1)1|*9P#G3VATSd_2z1RP{8a36sHV?w>i`Mw(tih8}zK6@H6#SYpCOr01 zZIp<_HA)}K8{t?CYk%3^TQYU9*&D^H01w*?Ww!&*a_%(ix;d&|__WOD{;3{nO~cO; z=bv}zIeYaT-!PQ_{UtT_T4^gxbyISoKx#MbVG`U{){#?utu;kPq?S2Jb@`ZTwB=MV z=koj5a=Ovkr_B5K(Zc{$4x(zd?9vcRM{1PYWam063 zdE(Rvl0DEIKjR~XV&2dR=i=Hjgp_8Yonr%{g07`*-Q>h3zqPByTp!@lg>)u9htze5 zRGzh=E$2sLtl_?yfBT=%Z+E}WLKiAa3VYn!i_52&dNdp04IWX)Y-8rA==8mp-rD)q z-_9~Pd)9kx15|9zBuUT|*phFNR?OY!9dhB#ch%FaI9oznDa@w}v>0nfT4N{tJlEKJ z(0$y-{Tu%L7{P!_&&x^deX<7t%8T+~*|Kt=J06q6EaL}4^ z#M$$LPd!LlrTP1?-d((iIU9|!tl>M-;@rC)V^Zg@V2gQ$)m$7M{UQ}wUWg|J&B@1l zg5Zd_Un0jB8b)F(V<1$$l5)2~DpuBR^={qX=%a(apL;_{P+u>~CjHPkYipx5UMW>I z>ZCfdq}Jz34>q#ryZJ4$ZGp29Vs8g}A}l#jbF$YJe$@l;;q|$Sy7rhsQ@i0_`gls9 z-x-kvY2!N(q0^ngk?C0-mjZL!?xO>R4Eg$zKTB~MmKO%Q_S#&?I%{!#CFa0aZO0@A zJO*32!xuNxja5`$N79J;SN02@PTa(2zDu(HtG@h@mrk-jC_fuOOzY?g9d_MY5sQ^d zq2Ef=<&Vq>kO&5GRUg7Mp1w}%M!Y8Tr>D7EO%mf3Y_@5wURCqI3GmOuWBjnu|c-hrp^FivDCMz=@2jhI(1|}dS<%9ky;B-5R3A9E6;wN!E$SKBxr>Zx*X+Df1-0?$1*qGiZ%4YT=P>rYlQ$fVq^}Zg*%^T>p z7_x5320m_RE%~>ZKrZLb3pIm@$8~R;VvG z^W-|xzRI?lfNd3rQWhYu$E4AUrrzDo0{v?mdafUs)#Kp5U(G<>HmTrw+z0V0s%aFQ zNnz5$#O8vB?x=@AT&l4Zl&2Y@v>nD+fMJ{?DqT0Qf2V#8drDa+5Xmh+5W$?-d+Otz z>W)r1W8#24y4dxIS-*nU<-mMA@y~IayzSfr9WC_@VP}M1Tk>@Nx`w*>JYHmz%(`MiYRZOd=K-(iwF6t=S!P(Ws3VTyUB|0bcrDB&$(fS6R%mp0KFnq!QBI zZFN#g0>Vh9pB`$S(C;L7yT^*$KBS1O-q*btop<%Eot>LGl=&RgY%cRAQ1?U+mJB;D zGRpWwv>iYo>$~-+qwTks0v@f6%!KWY#Dv~E1s?g234so%Zy3D)O1L&NW-Q52 zQ(8A@4^xxbn_VKAKd90r{=#O8Z%tsCcOk{4$(eXHZ__}VD*A-ASwgD8h|hwck9O(X z_@(YgYIqj7bZYs{K}tRwTG|^BM5Wp-BgAo|K}^Ab4qKG_xT2odi>Y`rvCe;&xYkTU zUa8I3CJ_3KcuE6iGspWBUo=cEQ(#ztd`o>Yc#}Mu1Z2lL~A|HZBzoblBhyv!AD)?0OjHrdeb;TvX_vTqE-A%S>Ngp zk9ymaB+*Na&WS~qVV~hxPg(_`c*@Si++p5CTEt*Wp!KT}VNn7{3@D(cV@NE*q$o0r z1EG6mceU7|nkuSPQ!tnC*w(+%6`{0+snYd;y09)0fSL?s*z;ln{n>`3d>MG~j0K4B zDa`Enfst#e`t2Cw78xFo5SsrX7Jvu?9f&@Or_b#LWLcc(qmgrPT-lPyLNnC<~d$JJ2 zajRX;2Oh3wD|*|8o5iqIAeGm&=`?bi@r_gY=63IuSG>iFd8$>WebBbu&CeR{`r^^! z7l;8cos#&_wg3`JKwi9`_5R%d7SlcIUT2@E^5;R1Kl8d02QPfbcLN%RDcby?yYf?s zz-JP>FavpAdOvB|zXb9gfY8%I)2pfc;Hz#6h#AO4t0^AoxSjp`AhlWl=B_+KNq?d@ zqiJG1`+zDlz8gcUO`?>N=!25m-F)j*E_b-4c2fZ`m#&M(tL*ncd)>@H9oh+Jjm1%p z8Ku$Mgz2Y=FGz%7KY``k$m(AXDTntoY)3KTal-K3yJ-mc3mjGRQ>=t=Zt`?jkf#10 z$^9+oG+fu+gjE|hn{YQU*fz#HugJ$DZKOT^ghAwRp{~Ss*RV+6Y**405#^-sISwR# z_2VQ&e;&wFA3CDOE9?kfBalD%XDj(LZjQ^$V|y{9`lE{CKa!lpM`mej&XIp_NG*5& zCTW=PAmsJaw0lgeW2u}^`oVMx4W!`ak%fRki+)rohBYcZvi$6**1&Aqf%uGeT8s=8 zL1Xh~nxRL4;wL31a8oxH!P<-2bt|ta|65+NB_0BrQwn&1P%Vd2LCoGy6K-I3^FNJW zB|XXuLML8Ciep7JGCp-}(!o+=+K%UbBZCdOcE(V0CyBJ;rUsJt3{3xiGZT1_=lb+x z)5N4uM-|2De+$3Jr^qxIeXYA-&S zO!9nHSn|4?Ofq<{5Q{BsaR;TY#PoI5!h_GQBbEEWDN(tb#^Bcz64n$AuOcFp30W%7 zq$i)4Nm_))@Ty;P-R|q_{nz#iz;(38Vm=JX%-*`=b4DklIf^Du25|?PSB5LI2+z#4 z4jF=i6B`W#FMmd4N@u>YV;LEz{Vx}=^gf*bRJb*|PD)4?{cnEPT|z-TjYUb ztK_-~j^SKuU}_%E74Y~e2arl!f2-)cPzMtW=9=HPj`9BXqW6Y~$Hu?GSt`O zc~7`H|2ob zjJMcN&vk$r_Apqn%=Ov43FF_hC(hC!U>g}i=AKwM_PmxfV!5_Y(Mug}`5<{gLc#aQ zdVUJ>(?b5LNG4iOqqF|Su2t1p1>mUEe%Is=h*Q#0$&pqE$+CAS8a>$RY1esCyZ9@O z5wHm3$ss#sx>;{iP60%c>x=~-4jh*69a{4{8Gl1_cg@EUTZ zI?+^>+_IZb=V)ostn(PO`yfk|7JHSpFbUB)Y+o}G!Oy3P2$L8$f&}6y#!;;^UXntp zCfBvkVrlu<%>N8rZyD*xTu5EUWk&pM_4qbr3W-qvNt=9q?#w~;=bXf*Y4JBZ7W0a1 z<5OhMBYGO}%Twhpxu^(^rTZar0@2I%!;yIjjRF*D>g5k25bbJA_>}CEUzXKh`ue=` z_xxQAZS=y;VvGEOS$%9)k};H<@tfV*8TJtQ9I+++pkvBWVPbNc+d2S|w?_e@jjm%) zPD3#yPEUMN|Blzz*qSp_*heE`5TQIaEI_4%xI#h-a>;OA#n?})h~H;)-mGEUvM0v6`1TO z3<)wwFDZ-<&Tp-1@~l0~i0!)Q9d@?8siAzu@wJ2&4Y*4Nv*{ut8@NXwiv^kZH7I-- zGp7wBwcc6naVwXkv{#u5)v;mNJkk@;f7cjvPs^c*0{;Nb@y$RNCqsJVvv8pB_B_>L zYxfsukH>?J%%u68aIvr@&>zmb=OBm>@-lA*CB!RA`qMDPVA>R~7 zXFyIdP47j772#mBS=bNcbqtsUrzL_{IE<>IJK0c3OO*1WHtJwGJ#`KT#B82zwlKC_ zw_Fz{!H?+pJ^Q?!>5ib7my078B7E?JB!}k3>q(u#Q563wBwUUf7@}!AHrjdO_jBZU zPD`RXQFSo{Rnq%`(_G)Q9dYs|P5hDdoA40RZ){IpzK8tM?36O`N-1)y{33RAS5R^M z@;y?jDNak`GK+aFF`jC?w9|Hl?|wnJXYK+FJrhump7@~;WELaSQ-FMVv)V4%II%`m z`1CG_&!tPq<~@vp1Nzuph_A+sq!KUQFCkc3FHVgXREsKLKc|%xd}uB9v(uP94H!|& z3}m5bztb6u_!@wf8C2yfRqR(fm7hv~!z@4{KK^pANa@Ng7@VG#Rjn_aL>99vBTI70 z%UpgUWv!XVma=VD?m10>UD`J9F<;8wa_*6l5trbIo z%H3T^=6k*`WCmDmpg+h9|MFJreCD>koOpEy{O~G_S(6uETg>}gtmsb{B!%O4?h1sx z-1t%XVP>gX0z#0@L)}rxX&IRjWx+Cv$_xW0x)VH&&bYpau2XRzUYxVjveZ06)d5&J zn(fy+QzZa!$sUx9K$Ulj^O}D8s#~&&m zS#F5irz&!tGBlfT1<~`~ww0M9h;ZZf5JTrF+5sQ&K1|J)0M%p#i0G2)a8n#O`=I62 zoacBi(rD#(FJ>45d6iN}kN{AP|53)P;*cR}s*R^Kg)B}Xv2}xXQ%8Sn^>pps3f?%G zDOMB5g^W+h% z!la}`DFX%xtp8_0_v~&3$Z*<#hgSgE$@^|#)|iC3j@N~gw~CziD*n+jEF5Lvq_G@O z-Mo*`wGkXQs)=|WOsD2-tIKQU z2`}t6XC|UHIf1=yHdv2*AH?hY%g}|amUDzx-E;Mhm{3fIf}vhML3!aeEvC?J;@ml% z(N3G;G=#ihC|mnp+~zZXANSY>HI_(`i(!SVNRyA1SH}x0SiLq%5jbGpJF~+nKHEDz z?W$>WTE1Rs!a8`n2eaT?rmmJ&aHq))$*0@!Gxoh|{PmZmi&ET5%<3y4+~#IdRBn<- ziN>yHi}-F6U%r;(?Bn^{rdO@HXD{uU%JYTZrds6j-$~uaRdgW4DRn(;(cgL!7EO=R;8TeaFsXQe0wq{l(nU z1c7=VX%*#4uYvix{2qdtAQ^fnsarVs6(dbW0&^_?u$6#J-?MB#JpZYnAH;7f4zlv4 zbrYB2SZ@P>FJ{*$>IX-X!60|p8CCfi z06`vN0pb$fDk*d<*V`2_FtX=E6B31e)Iw_B3yQ*O|ESJB(-B@oe|6DY8opQ6^kCV*KC(Ar6n%vG zvN}w3wINyg1ubg&FS7++xDjeQvLMm9=N`GI-AvzdoeQVO8eKb*1o7vXL=tGecG28( zchOiJpKQw2-Fu=zfHGOgPnCvNQUXg@fnlGcH~hV!>NDO&W~NsL?=7o%D*B~y$B2O- z-*;hp*vFAV=DXsI7#&~z|8aF5?ri^W+wZs9 zYOAEG_DIp9rHIttwc1jns6At}V#gMIwOUl{wx~U7)ZRN$LG0MEVnzs0?&mq~ zxf8cQNd0*Fgp0D#NVvH|x8!N}lJhe$T)*VLkoBc?tEg=tm{8V}rrEjG}Q5&*< z@#;%MW4|kewCTMUADjLY%{uTrzjA46NScL>5PDGcsp<&Rblo|bf&yb5tuOZd@l z@IDXm6nUj6fL#R4dm!ButXU6VwJoOz8NU6sy;{9LtXT`!-Kf$Y zzXj9#FYS12N>@arHa(?Q-O2p++e5``S*5x{oYpPs+)0$9O)ga`gdT4MuZ2ns}$8&{2eRKhg*mA_1M;<%soOYKx63W?KXaqet zXymLpy?JYK?pFzGvR!<*%ba1K+qe4UUnmq~Hs>mrxK;5`r)+2dea{$m-OIG5Htu56 z;h1kgKc7d9-u`+dkuT}suN#dyY7ZD*b#}%0nM&~=i!e%A4-$uc&5Fp>jT`zdtj-*< zr*AACHMo`WA6$KMxM2+c>ZEN|vH2hg`U1JCqHdj^xy95Mc41pwZ6QkSNvrGP^!I)J zeBDZO%cue}D#qBtNNjo)`cziH?x7~C$%*&tE&qJ_?dK&&+-Ig{KT!c2>)+ zkAl9@s&ByVr65;xTChoF6N6%ko92*dQikc*ivf$^k@^56wn@S7zqNoKM~C50LS9c~ zI-hh5$srQi=b&1rFDy|{dms?t#HSGkk>3VEk1#Dh_xTQSZ6OdTZ2<0BdiUu2;PF+r zdGa#tPu^Dn;XZY ziqawHy;ev?fK}i(TY?cUM#`qkE?l1(^bAk#gO z?uTnt1z|jEWU@kemG39KT@a(VFzZ}dDn}WoPDLL(W9!F2(9wA3 z_2BiR-Wg~24M+Ch!qh&7vQ7%@nT;M=Pr!)-O^A5%V;i}%q%R8?Y`Q5`ryJ+AY>X;z z$Uo%iOD5Fj@AKUdQ6^lt>~}%a%=%hkMg%9(&fp*M*o8H?!*|Kj2daWn8a&uhbvNhW zB)JVNXwv7YA+1UHY&q#q{)x5Oq}wN6#rLOw9zyl!L#G{=)Gi}B0Jlle8f(F!djvb*tuh z1-iWg1`OUk!f5{70Zy(D5sY#EQm2CAFTnbxH69ZXc>Ft+1W;p~hQowB&%}HJ<@)ZB zw*@@|REDM>6rU+^-8nB#W;vavNLPTdk5XP@=U|tguLe%cuB9>X!fMYy!dJFhTF}(h zh9tQpz2~KTqMSIqw~K}-W`@7OSg__wy>5sJM8KKhrmz#DF0gH%XS2Hx$NRPJIKw4t z%N;&bQrj+vNrOZ^>r~44JJW-B8eqPgQi!KGJ08*lUK?BLb_(N)5^V+pY~Wa~=A{a* zt8$5p1=_zS;!_x9!9|2SOW+Wa_q&=E7svcOYfFkM{4(%>-V*rS(BUoJ{;YbFOFwje zML9pkBsisrbQKqcB4%!hY}y{)%`CElI5-&!i!)EVW%GeESF(|$H5o1*aew|Ayt}j4 z-4yn~^Kag%+taf*(CD>bfxxzuDB*+m63BX{^S ztd{THdIYtdELZ4l-#UI&ZFOiIA9DYL9K!L!zSvXE4O^arUSX?u8|f)uEH4khc?kee z94%2}QWcyz@wj~i;6RCg`(j1q0hV*~8;w2c_d_xLHxC4tZtOx;^eEJ$0-K$~6yB}5 zpR(S0n(mLP%Z--P;%=teSCgjZY_k?+AKGmI`K}+63=!YzIkUfmPfcO=%(|MVZ0rhu zox1n?(Wb!2vgP3~K;_qLyA0q*CaC-ts_WfVpKZx0YO#xKuQBn^IF9ET(rt%2S#ys0 z8OkB_*|gWh*R1WpRkvyyCKGX0!u;*ppz4f|m*1b&U2>+b({!?hdSWjmOFX)n7G}oOjuTfN|kpK;fTV$`W12nZGuo#sHk`*TZ&BQSUbKE`~0sJb- zC8@by#0_V*j!-nYul;!5+E%qBla3x%j6H0Zr$EQQ`$Iwiet?goR*NCLsgW7_I?Czl zVIVUC*APZYfdq+Vq0T9ePIWA&y-M^Fr=qt=SKrN-_5G9Q$-GVJ5C)c#9O=JD?P;d^ z{jEJ9nin)=({VW8F?ns0+Am>`mI7FB&mK4EbvHY=8$|k4hYedg6w9UNtIce3EcoMV3lw`Bp z?vJcg%*LmztO2z*Z)~D9yi6!z(iD3)6q&(@DyD@=c2)0l3}CMJTM-HKXzN`wqC z)J2_^*PxaU8~GapOAiBHm6qQuOLc}t+-~n}xGHhTFejPE`BG~H`xh+~ST2Ieb=UeM za`1QvUE;kV!?ir(1~}W9?2G3MMR;OU)1Nje0fC}SF*l#(Fovw+E_ z#7v~7J{#=3$+k+u2H*1L+(hg2_<9Ac>I?UcIXWCA^^zQ1zj>z{B!7JI)hz6o{T(*+ z@g@_gk&bV-W6~!m6FawK&=ylFG@8-8>LT-?4_-CGthe%j(Sq;t-X`D9MoNk5!hYTC zCTVSOu(mwb$4mgnD(D_W_XP>Y@mIE-2qXjmi)HTB(;J1XsG!Zy z^_79yA=Oq(_knVON*i^aq-RJ^98p^zrV4~Vi=H~6-+!@m^K8uW&I;E0pKzSfJUy|8 z^1cL3#)zM=X?8vEUeAH*kw^L57aB^+BYKR3Q_^!wIoB&G3`XU(KRmE_o7bbnhnl$-?UJoJkCMGtK%3`)o)Pu9iK+4Bsauh_QG^g z?4|DZhvdE>$2OTe=aL#+d~jIC=VFPr69WeCNgqtLrZ>%l`XsA`CT*M5o5Sd>lGPcy-*Cp<76z8jY8oOWiMN)uwZ}NDG>bA zi|yr{xbT+7Dld!x9s4zMsZ~aM_UNzY+_ALkXP2Tl<`~Ij1_=I0?6Vj}NO2slTN^h9 zwj1w;9fT;0KD=G6UhM{p|8kE%)yMh8P_SIM1ZqN$bo7iIJ z93x6CG;+C=Th(^KN8Q@Y+aG*-@7{S(7?P8j9a@gl6Do-xGw%EO;aV>COy^{1jMDX; z?(<%#{8pAwgkViP-KrAn_)}@vb|uqQMI6Ni+p|V8#?t=Xo6ZMb+Q-Jj%TIeeR27f` zjBNz+ZWnV1&ImV0JKSM7BPVBi8c`g7=a*z*?y+eW>7PFRdXWA!ukWXw*Ly*{ zKsrpzHC>WgPhrBpOG{q$WOmrm*+Bt%@|jSo@9_3DnBf~^MBhMVWS#@(Kl4u{CwR~Q zy4uGcROc>H#DFXn%2KB^d3^D3OXb~sQOln#&FPVq@qD^}NVP@Ug_IP)Ms@u-*Nv`0bjlZ)dt3`l4pr{>=rFZ*v;J`rG{?oyh9ypZj?VWH^kmOWECNx!gu@L#hX#oz?WQlncKO2XPR>Ow4J_?mA@8Y| z`YY`=&7VTwq(FZh$=Zu_*v~w%f8)UnjXk_TbO83_=E1J9tEhcYeWAm9b!r` zIi8gOM{P@tFC11yuTL$?<5H|ghcOO8Gcim-h`y$>gSz^4Ph6ly6#7wj>EPMh6a5|X z^D**ppnMN}r+!jCJ&>_pVc*Qo;lK1s4kKYO9&m+72$8AxJNj${u>*4H5ULNPEko9@ zgl~%H!3e9ox@rx0B05o7b11j)QU&@sM%xXv7SQ?n~-G6_A#DR7d0=| zk9tg{b1Y&JFZj*N^6Y2ui(0FZ!c-ZIsVLFgaqCR{d&5A`-;5IamZXTb_>YLlwCzfUe@gDJ!NqSFkXw!j(^*HB{56+28?^t zL|V->*1OfdwDj=@-~JTSYq;$Sk?cY7)_;x193M20<88mvx?t|*#rz$Aye`YczUkiB zeOEiJ9liCpwB}>mir>_>+tEfkl#$c0uunq(%-&$~e`fUOfQKID7DR(I#8N9!+wvO-gxG_YZtEn3%M;r9wp~SyR1C zH&FDv86+E08G96792601{PLjU?DZT+|Xm z;vAvVGTI`^mVL38<)aZAPlep1@D2$*dX$GKuE5HD)j;Lkmlcg~9)rT2h`D^b_ z`=p#}Qji!6hgdK}^*GCs9;VQuB7a#ECG$g4+Ry=$8XuBWg<9Ms9Li@@xc@N?gij$)M- zQmGrN{$ejv4H=;F^M?6qL&(B(HeZJcHb_F5d&Yn+}yJ=HJkOKy-* zO)3_wAaG>SYu;}=rMkL0TX{sGI*Y5GKH)1!sv`Y%QyhC~aSih@kxwK5Xy$~B(X+B~ zwdFHfWXmmf#MP2bCXabVN>Ywf9%o-{-y1S7>Ak*O79V{4w3ahqocvk5>Zb4-Yv$Sm z1=FY3x2ijmb7)qWDZ#20%|OBqTyMgd>YF6l)kU+duVvmp`kiF6W$!HLFjk~bRb`GW zGp=FT8qxr%v>CU7-tiXs^X$M2oa*-$%T>H~@OOxK%rIu;e71T1Eb~cz;~Bl4ou`#; z3CRsIow+Usp02Cke_EctUiH*l9;sT&ya^(N4vCkzX`Bjcma4X1I+gI_xoZp`ZdW{Y z_MO)TC;c8@RT$Zp885)`;7m79Q%}(0FS##G){oU_udy8k-|Ebc_V^GWxwX%1!LdNfyyx_Z_ZMn_Kj}?v3RFY`nu#4;Eo~QoJFT}h(Y;b zS)ZEKesp?W&YE`Yh~i*djXYPZhZM)s=B6Q8`Co?J-vIPcfksCBZU{G$ymrYmT@HWD zMeewQEA|^WsNe)v2Hm;5I}_^b2vSwA(B6`46el?!xv^lH^asKImWt{U)6+MGRAFO| zW>n;H-`Sklz1eI#B0sV*rg6fqbQk66_9yr0t5xgkxJnE0?m?;5f?u}f0a#6~C!f<5 zl!1TbEq<^>aLbQQa-jVA_YAonemh+@60_C(lr5HdSjT)SbfzstQnR-R6Qf{q6um3` z#{*qqYy9MX@dLI~wt{JV?`hAsq;-r9r)=9#)ZGcw%&WL>Z-tzYwMj;p5p4SR8CC1I zS2YYV$@UsrXF^C?ZkHJ=*{iL(!Ii}Ve-1#!Z&QX1zo!T?>jh1m)j)GcT!}(t_MwJ9 zjI8$6>mN-~`8t^IE@$5*w%9T3<@WSt0F>CjsA;+^1+WO-QgNi>amadtQIzr7uYeB8 zGJ1a(c8ta8DYbcTH{Lp8Mbd$N_2B(p0F;td)miKCf^!ge7x2Z1dA6P1;Jv+Sol7Y$ z#fuwUv$Q^n|2dWFUq3ci9J;+FaxK$Q{KWWweLvUqLP1;#q-h*KkbInKLrj;`0p7v& zaA`uS!?(YMhbI$Rq^gw@oRb@FEzNUqt=+5-rogkWzgw&PbW;+f3I3ZhU@`g5nMrt? z75Uf{q*1jfhKv1>%V;2c?97*)xGN^<^{bV%0mVwW)YiU!5OXXvgmOrNtPg9mj1p;9 zKb5RetYbT{VD6dLXhX_auyO>P4?C zcLV5gZ>WCGu00P&T+kbm9U&>cXKlo?#wiDoM~!E>j|cr=DW2W_Wq`bF^gs)=Vp0S@ zBbBp!Sj##0dphS8{Yy*h;@nYDB)+u}S$XbI*0?Pr8XOMdu!_?^_}H;=zw~1DQmaS$ z{Dldb@DC0ia0j9TQEzGdB0?rfLf~Y+L34;S$I|h!#NZliD$Q~8w-K|!$l3SXJmJaH zwoo(!P)%n>f4S5mywMlw`3IbMk(8~s^p<=?Xo+I0RtZ{N5}B|3TcIM)414Y_mbLQfg9#A}sDp z*$~O_%oyG_A>&h0AKF(~B+IZj9Rzil1P@2DHL>}d!8mI@|WC>23@C1z1sQ_)vsMhA{ zPL_ld-_DnS{j*CAyet*7wY(ZB4{5y`24Ah_FhMOnucw;(R4m?Yr}obfi+p~I()rfA zugd7Lmt@;ZueQokbM#mMzC=r|I-9SqG)er8$l-ydkRrVX`=a8dVhp5o^syM1pTr!2 zaJlM-03i3j5sy!h%;oc!4+gs*&n<_J z)PTfpxLQ26ZRi~rP5%9u*5vKTv-`I`DNMW3w?NN=p*zQ;i0D=cap3;pd$Z(BuhrIU zZp@I6!{^=aX}pPGmM7G|v=Cot$2HI~fRG^Zeyx`*Z7kZGVaR8AQU167gbXo;Og{E$ zq^g6fmp*~~wQ;<5-{?f_b5#r)@y|Pkb1@jJ2%HmYW|?XU#Fj;E6TiA-w-%n7f37iX zORdjW`icCDe#C!TPw)aD*Izt|)calEFX)S*5@D0~!7#4K>wjs^+bqx#mwJpDI?bm{ zG@1LOt2zIA3>aHYHlStkGYw@aUo^_B#(R6zD zRQxAh9~}9lqJTtcoDN|nn)f$SWB)Tm8%(%;zC1o)b-C_~>h7K=w~vq4f1W@FTpYS8 zph4z@P+5SBt3D0oKwGLr5X{jBJkj>_k9s6KFLD{NWk9!8^)OWs3}nO-IC$B!!R%tL z`;P{Xh6HkaKfaloQp_QL*DojiFaQ7gdCe91iC%C9#xWSl-=U=^9+@kuzS<;(M6{dKV*;yuE#Ih7>GKqncyZYt_8jOP=jh-{be5eCUbC^@40e)8Oa(AWwEK@(jH6%f)3vhJmm z^Ugv+5ul0$t$;e6i4fkkMovgmNT)9%(jTy|I5V%-On$g3X+&xNA(G!&5p9W=f#-hm zC|VE~*P2xPnqOBqV0v^)@tJ!JlfINIuI9TrScPNyMTXu2IQ zpVEOoMqYe4v&{8*`94|}B0}-XZFx~FybFSDky6Wyov=GJ(+R0ZzCuchE`O1YpV?FU zCsYGhK$O-Ouuo9A@HGxFzy6DzuhgeQ8bFHqVmkKzO;Fg&bNt21@G|(1l`hSxi;q%2|3Y zA9=nVYFcDv+rQd;x6u6KMBr-1+$sd^(zr^A{=b}NVhUL0vRE)Z;Tlek&AC6#GJ&`< zCRJ$mW|UjK`?b}r54R534*X>paBzigyS7fyTlV}ttG49zlV_R3={b5c+>zH4D!-uo zj;ePTMb%@>1?j~f;so55!@z%6tbcwM=PGQhh{ z0PT+2bmitx@lGYzg#C%5nZD}}VnbObib?8{3!uOLe1pZa&p=#6L?g-IC+F%SibVWMTdXS6vp|Tv$kep zu>Qz*n>y&5Jed|f+pc3S2z%(k4m$t%E1ctVymnay$Q7L!a+ayEw&>k_v9P(bXvKMn z4$M(p7YzO~E$z299TB|(#b42JkaMM01xI8^_ zCtko6+7yAnHL7M%ueuiGWB%&{(Tb4-hEz#sV#E7n=PwPB_j)>_86?#6{;c*iS9!pS zi>TB<32YQ(K}$0Ds;|%Y;c;bim$4yd9;Tm)@8iOoV$5B7#lI)74XZZ>Y3wG^X4!QV zER`2b-`x!GlFv5?;l8|=4LF_5l<8o6l=SP`u35n%UhrsyLS#=wza2cw>{Sj2ZHH$L?f{;w?Dcp7MRyUaQd7!Jm6Ug z;nph4z-t_(ch9!~RW;H7IQt?xH_kPkW?Z7{@s(al#?CqIzA23--udW;pt9mw4DfSr zQyJdj+j}z!QSsoiZ960=+Uu#9_s2S7^j<+TM9cX@$lkbHr)0=lGrf`9Qig<)$xH?p zq~(~Z-w^E@9|IYIsj=~#61C_dY!2=*u#BZ=X|{a~8^Ax(Y|S`M28i4c{Zi+Rt@yx! zXG`HjtZBr;5rwp&?>b>NAhIPKh3NDi*|W=E3dI z!dT|C#X)7AWxo#@&K)`(_Yb5rWSHeiVI05{*qR@^yk7x(*9V-wbog5JSCEA*K zDC$QIyoWP!1i~?zdGOXSPdDrjlJXyW%Zwl;-x*KjCymUp#MTTgOVW04;t)g9z+$B1 z@={NDaU=@^B>B&?G!asyF-qE|xGY+~hG0M%J-=%k^S(EdE1z*%o5*s~Bh?uhO#&0b zwlzHCC7fni9COnrZ$KEUrQ_S0{COOStj)JB;K9}w9Dk@_fq6#%UYJXDMS>#PGX1Cd zG8w+pR5+HDNp=g$f4g9*V-{)wA;uS*Jfpb|dY%L#G$y)lA(wUiZ2}dv5S#ZkP)p`= zb!Sx=4UWjHQmI57Z=(#5zdMxjn`AjC%1LXlt=NlwaRsVi471I5wQVox2tXG|=a2e# zaRgWVa^xQBy#gLuEBYh^tt@?!r*h5eIXhliYdL_A+2f%i?Ec1)zpJ*%HMxJXo^Iv( zdHn(ZIJDh^@JXz62vXJGUEL#w9YCImW^&moaQ@*f1C&%ik~`3aoY)l8TbQ2r>5@?M zBinO+chp-M*if<`lW!W9gF(s@AnOT`hW1aVWyw!G*Fhvh$K_a6s3!Iw#gt5SWw0e~ zq=D_T06Xv3(%J=Eabq89S#9R`A9Y{eK~#6$(&>iVmGGBMLFC*+WSC-B`^@j#r@is` zpy(03anNIWPlMcY@u!n?-|;b2Lk7pIJw|9)vYRsp9*2CMIC^m1@eHNiC{>luUlw`* z*U1Zi&KrE!>X`z|kayb<sn+4M)HfxXuME)=BSM#8{1j>mIX~_44dnEPeu-{>rcu%CvUuWjd)dEZOGXJs~ zp=XO%z^}G9+m?r)#U?5FSax`u&$%+%+eOGlt)skKPXQd${sfZ`ffl%U&a&2ksH5e? zl6*n_E5{9YJ}xWtZS6 zXRO`Ui?LJt$-Ou8&?tfEGqs(<38iDEG%NJ{p zFB5^6>#?}S#njG*t9)E%ZvT_6JHKaOtwVs7{oa%A#&-OFcIHK(U>spYV|Nw~KVa{G zUu0SV>E?Sk&I1(E0rA^+UFRxJJrsbvQ>t#x3nW5Y`c#KZO~PPsyp zx*jmpK*HbnY<7b_8~nN~?Jq zP6|tJTbrYvIl?kGR4jg(LEe=|R{)QY!!KpO`nDch2#e=eT|G5nu;1J&*bMty=V{Lv z`@<{c@Rn=XfSv@=ADt#-^1O6h)5~fsDYtS_K=^9%&KfZ+0QTGvxKdi%Ldc`o@cAY} zY%8|!<4k5&zR#;009@U+Uix^~TAGb~yt zbq6xoRUHph!hU%zPgMw$Z{$LxMz%qVK8ou~4BzrXI;X29o3Ai_Bv7jUtjrR!Q<(;% zd_+Aq+>W5;#bBuP9&PYSx9O0$)e6bjY7F#_f3gCw)iUTm_8JV{y!it}SiBUR zzi^%L2=rSZDISdALX$y`V>cc{w1}aAeJUi1lXX;?>m4&(m({l9l9Tu@dj3xDDKfCkR_#e-`pF1&%O>^3#eBn2l)58^yj$+ysu;e%bBzEcuLMYbZ0=*#?d zOTZLzn4QT#7~t+ z^ZB2OcQHE>14GaB7Y|6W zlO-goWfR!=f+qylm?8(>W%jfiKd5A7!Cx=VaO=i5d}c}ZT?-Qty8lR%YxFJy{uSD} zY!s1I2jeN&38P)PLsbggD14MA29>NwRH_*$fbTR?yU%SGkcxje969c6elt@HDqYh= zptIf4gU!!a%P-181t%g6{KI{6wkixQC6>kAXCDHuWo(Kk>O{E;8m`SRxxh;Rn<5F7 z0z0~XAT zQQ4C2<(r<+Pdqo)ifmp-bAE(kS~7W|+qBc6f8(9X<8j7u{if}xS{u2_^Tj-A8TqyQ z*A;4X?rT~>3uBLVJfOiuPdPOI>K04-4PaAZ?9B72&}oEH$n(!PQClPiRNKGaUXeph z+M;jjEmcmbPG&=)uMsn`!i{>x)-%y*A84G6L7rsRQGbt^u*TG(o}l+>MY{p=W&m6f zGpW^9yQ~2dF%lf98OZ|E9pX-?WjMYC=eP+0Hu$6)t&IeKHFWlT)<$Ct6E7eBIfSS( zgW73RLiMM9F`G#Z6a9g|J8Q>`@qb9nB*ERiX^+<1P!nrf=$gE~kiXtF;XhXxYNayG z+y1yk>;Wn(E$O=tH($ehG}_ob120qOzs#SHDn`LC zc}r^PIH{z)tY6DAy98M_yOw@zWHQtNrNhu4*}?ifOVKwoH7Mo$f~GtyUsQVFurf%# za5Nqq@rWa2MVY0D^q?)&=V&OP+Rgj9$xwZNHIIg!aGDQgZ}j;-6Z~QR3R4DMj@l3Q zM$a>iQKn&j^or>BhMN@yafozT&Z9kmOvHjI$g=*alaPmpWitBCWt{qIg4JF>`hkgq z1aq8r`NuJjs4N9$)rAjMa^#wzTl!3WU~pbLhwM_<5Xjp?%&NW4K;K`P`*{z|TCIS3 zipl9zy;yb#HJ=;sa2(=w=2E6SAp4!8@r7-Sy~R-cnAtki{cH}Ue|*pWqbQj5_9y;u zt`4bhBIGBUTVJmq$iqr8Ke{YUR(g+SR98Yl;WA|F-dGO8>!tT=-fOAqVxN~&W?R6_b9to}N)`Z22MdHwya0@0k~VMiC2tTnr2;QSVl&UTPS#K4MgRR@ zk-}??lltc^f)#Do;B$<#xc~J+T(&Z@aK&Z@i^l-kK-vVTvpf88{sHB3#YdpPkJN;n z4^`Z6*dMumMtAFSIoDld=W|7jsnf96_syE?C9TgGyo6tEn1VDrPpRIrWg0>PQu&7@ zs%yNJ`WVc}Gh5z?)0B2`hkdVHjdgwh_e#L=SoW-T3BuLMa59a{2U>+7Suc#X6yLV$ zJ;<5Ze`(b~$*AT2@D>M&VzwamdhE9hsfm}CivEklSNR#ye>FooBWO%nit#m){MeYT zI#BH`)O4~S_q_dn`?1nu9;t)raGVAOQjSY~TVwBPWA7n?@Svb7zII?{AW#dMl z>5H;k+0ns2&2=WMCcietqz#p(!|xffE#rPvm0P=hHB=~(#Kdpg!Spw0*kPg#4`Q$M z(I9v$3{gkG;0oDHooA<$AJU4704bv#(q(gJ50Iy`^HJq+JcgHOEV-}uP9c4X=m!J? zZ4WJMGdfz(_A;E1CEihVchSoQNh&ggjhBr7Q8Hr3p^`cv`fI{-^;QkkKAa4XFwb^Y zuz4;2BAM3YymZ9w()kTeR;NIe`r!5wpk$4n8DDA5XW99ix@Q^p_WsYeM%*P89Pv#Ro{G68}vzQlF4Yj zwziymZ}!kek*DZ%*pl$i+LI4}Z__>ofykKni_U*t#OmZYjYlEb%bhz4>2!T>@9+94 zO9flE@kB_<=p5Q8m=)HiBLrDA!~GGHzIWidwBPZ+TO{7a6?ii#XIA(7s|lte9$4N} z!7e1FpgTB(SA%u-NtxIb`?hv`7&MyZUdYvUof$CVJ@7A0a{bK-#f56KvH4%IKG}0_ zs=WCTS-Zx;V6nyd9?Yt0wDz)mXiDu9HUo6eRrJ_zBvoS^bFcTRR3aOnH&+q4M-G@E zPR$udJKAZkjfR;ocxTK6X#8a(JXM5;`@D`Ud*N&Rn|Ll2lC@*B#y(Ur^s{mHhLVUjcxRZMFGFGc>iKCrHSh^LZarT zE#E_;eX6v^q_*uk4pu%Yk*R{rE?#5YUN&_SdPpzFt9F`b#Ui^}SUYIkKA#`Ur2i24 zK6|Z^$kolE7K`!6Dx2#we@1JOdU~!^p4TwfaeS#9Q)jm1zI;GDbqBjy9)>#db`Z$nV8 zMI-sWq^`?p6`>~7r~Nd_o6ZHA&`H0~N!92zchTgML@U~tSuw^N55@Y`2eOWGY`1yL zit1_E6oZ_A=70-HRYIpRDYKui&}y-hAqH^zaw{u?bf=6pKw1TmhUeTba=Vi)P1Qd{Wz0T^elhL$m-%hS?V>Q(uLU z;&q=)U1~a;KyTQi_i90Zza!QKf3T~B(df1yo%6!JMuS~uB0RuQRNdBOOHHP5lI7BO zkyMG*s%h#}$$>i1Nb_U6v=8hmJzE+ELK5y<^L6ZUZ@|byWfhZqB3o2wC6l|w71K(a z?ujoNCE6RF&morwG}o=IrZr{T6(;Z2GOZLW-o_%e-fH(atK5A3wD1f~{8-7CYPscZ zu`C|4{xga!BP}5_0Xj-v1&el2+MHerN&G4LM4~urcB=OmKoJf*4=M!xRX1>)ia0NX zvHd1}LjwDSMFGC*mTbr1dQ#<$gMyZS`<2=w?|fWW+B)WVEj=R{PH=gZltH=KaQ7Tx z-#Rwh($k@!l&OhHlHe(_`G-2_W8=+DZKsB(NBwgshb!b^#XaBXmq);Leo#eO<;25E z`srfukShNxlx``%Yqs$EkRPY~_sVVF-b#6riX-qC7zaVV zi-S{Ndr~<0R1_TA!UseSr;`h+*20rNAP*?T8)#!IAR%J@mM6C-D@KEG*GkkJd*t&P5ttBWRon=UY!fQ6Y z8@Y#lw@BpQ;e2ENEfuu>(alpYE8{O~O65Q|p^av92-KyO-j$-TnY%Zg@h-JFi0PeR z^S^<;;J||!C0Vi>0c!s1d7gmO_e~>3Pl*#Sektv#jDrwo`NIB}$k9j{1FdrbgPYyf zTMI^YM3AXGio ze<59{_oiPBI4Q&uIrNl=E*|l){i39iJk=&0nK6p^))+N)HQDt2(#_F?OQTVN(yVHegxvtgk z3X=1AE3qpXSkqjWkmpFXe%4N~XkNj`fX*+Ef3$|-=vMUwQsV_75$<}VB9fDbI?tG| z^O+oMNUj@wiM~GXO=dAmYh>0j*Dotz7>PmPJrq#%azyHixYt=8yYI%d(1`auqhRlm zauP%tJuO-VmN`NlWIT-1l=*HOVL$6@3NJ#(%DG9qjQs)a?%U>s{8>yeU)ZhGm>lbTN z=PwDFpxR8qV{~3bku&xgL~*>$bDQnzkh;!wiMOBJW`V1ITmeo0>Qai7YPb^#yxYMQb z@Q4B*_?-$id+&@HZd>Q|iq9F>Kf?={t@c$OdI&H~nB6ZIZ+ul_=(CZ6d?JCb!O9MC zu0S#-i#^siToDM8lu(@Ec<=o69Yakb?L7&}=hxWf?4!`HnYQm? zuMjovmAfr8OnoIvI#ad9pwz$QzOa`L_Xw-1|JPDc(&>f*{F&q%0tQ2zRT!OnpAAlm zL4A&|qv4ZS$RU9ph#d+>Qr{C2jaI0(8+}Y$t*u-<*(cv&S4YU2I_EAN_5-FB%Jw|b zQsASF-z_m2I$ghL>m$?FZaSHX?I&!Ccy0Q>RJ$wdq zuk_{+57EA=G$PaEh%thaL3^~2mpN=Xon5Lc`~{Oi{0Qt_nD_Q-&RR7KqTGyItL;bk zXiepqS=^GA?_I4@K3qzEIo|X%>yPq4VK`Df$#wBuNIAkJ|LMImYvj*Cf8CIvym1HQ z2ig~l;!Jh7me~Gk_wd@Pj2+w?Ju1*fZ<{yTAC0#|O*ADBe;ym+(_|d@=F`F#*mbN~ zq5+JkfM__fIjZ<%zLRoD?0H%^A{D3d5XfIJDs9_(V_=jRjoh@PFC-S;gSWWBTVj`V zN{%&tYn;n@)Yi}(GBl_?+m8U<*uPzF^6n~@_hqynEmXcQWArX7k6EYEAg-d5C6f0u zN4&@jzY-qmLC9wiL-%rk7O5IYU-OfS6~YuI^blD50bu2*VE%d;#$`eSk3PE04Nz8P z=RN0_whCPv5VA+BK4iGe>3;n)L-cnsGKzbc!5 zks+-$;!*LstuH*!&Cm51bcdc-S*pja5;y`Cxq*5M2^X$3Rn35OTHS%$G4yh1jz{_| zn9>_&K3-ikzv+1od>ZvOz?Q3o9s1$8W_lA+@^k+2lcWr4GG9a*D@5?lvV5G;Ralt^ zNVI6%z6JJznH^4e>BK;Mi0=a(dSJ^5wR=>uCij1`q&4EE3&(hfTPoW4F@_VK z(7^|Q0D5Yf`xv2LR8iZnZeLwlbdSDhvW+3#UAv-g+bxO`<#-aVUZ%GVLg|?+gVEJP zQ#}DXe_!MO3Am(c$&&R%w7;V*Rkm?BryMK@YPV_NyI|a}tXTH^7s$kMwN=`yMoRZ` zE-8dtp$vT6i2jzyw6|(YpVR|c1S{??sA824eYwu|_}K)OgF9C4&pYRdrHb|=Lwq<0 zG0E9bACZmnp@XUr_b%S(S|$q~zjzJ6-3!5;tPI_mvf z4t&&H-&h^(tca_UOYChYSkRu3mwE4G0w5-ZbzsuytQMA`|Cx*(kgv7L_j`O$!c3)nL1p(bLTu31^bnUSTKkmibRJ(0Ar z0`F3X&iHh6pQ{pT9OrbdI$_=a{v8b=+@Rh>^BZAH>AX3od%V)?>M|i^4*87csO;9K zdVK?rSu>CDm6E?`%r5>9S8pDcb}3?sAu@4ZE~dNKMTg z5J_=B$SgGnv`H;gDobmd5;-e^Gv-8Qi6bbeXex*(gG`6dIls^Op6mA)@Ls^R)_T`^ zpJ(0ce(t-hu*R_bptJe!2TQ?IM^rLtj(VZmpAwx;x+vt&xH?Vg(+BphjuoAG)$rO} z|Jd)u^jm_s<|hY-yq;d+CSwD1z6{LgT3OB9Vcz}&KmFdv&d)7Ob!^m*!aw%HJM@TB zt50=V&Gxku0O7L%{>DgjV|hH)@7qVrKV$0R=Ndx=wgcirVQa5G$HfJQ;scNScwaXO zVCes{T6;_dzDc^Ik9+>6@U8Y1{(rH6pFd+(=s8KKAN@Rosp<{kqklwCip6ZR(y&2rew~u(Vg79ELbJbq(rnvd^9ZvqEWXzy=B#^G6T?Qb z!RCw7pL;bfV-A)TVr(O}{W`x5b86N3xmv!Z_Dt2G;d@%-nA$5-=hM4-N1Lyf`rP>% zUftnAN3Rs(cDVWy+700y@6|Op5pGCC(Lr|B4iszeMzo+%;=H;O)OtRIP zybI5V)9xt>=^heUXLr^<(AtN8i~C*NqHK_=c0RMprOKeaLV@gT6l-nLIO~}FwM5hG zfcFaxeMwfrk202r{q^rG5Bx28R# zZy=)Q88ZJj${{XqLXTNaX^zSFKV9hh341EwHA;T@P7CKadRI!^@0`Tv+FfKaSqMI(xm~dm)&V&Yz9$g;e+>`^Y+@qTkma#Y#c#36OV9*|H`9 zHxAOWwvd0LcX&bWG_ECi<;A5X3^YrAM;G95syvJaL-M<+b#-03gGI$X;T@_!$4;lsh2q0-iuOx-bg6q<=*)Vxv3qJHKd%$Zh+2+q^cf!c)!K?f+ye2i)NawmWdm zJ~6E`q2k{=;MB>ZOeJi>J$bV)Kc=hBFtzT(iKbK%nYaP>`Tj8NHt$I2zoW~w%U0vl z?94M_b^U?0mB-Lb75{Bxf+|k4u?@|b#4>M{{wk|uDUV90HaO%k_Zey67}lT`@Z%ao zmrm;2#deoUm3v&L?Obb+7SlG}s`J-EevY>Aly&&`oQzk*j<`CsIk){U`g(7B>>cDH zv&d%0ipI1&jc&|kdnE`yKXu`KPvPEVsR$KR-OKzgpC<{7ITX2${eH zz_plmYle7(QA>G!l3nM0XL~X6gF3tl_yOxpu4N?ouv-kPO)q}dCwHjO^y69zS5mkW zJ6*@0*Ty=TG!;7*cALU%QmSh?6$_!#EhK$^+B4FZpxWs~@@QS)Nys-=iUcwTY0({; z%Y|mBtm|aA$8He(oO?QI@F{Dx#L$wz5-`50N>c?h=BEyQer>>e&hTp^boSO=DAR({ z5Y=Qzra}!sP&eNW<$A>q)b8pr@<)&X-XY3C`@8p`OPJA3YiObRCH?XN;PkK_Yly_NZOx88A+j3^GK4r^5J=`pTF8PC9q7_coS_p`_Kv)kk9 zklF$tD?_-CdF|(9k1pz(35sHIJmPJwPovd%0wfLQDzBZ6b2fmwM!=_yBVHtX3{0GX zytNv~ak{u@Lc}*-N^pDOi&!{KgXTjvt~bQjo8a{C)EGHy#PQQKrl z+SOFYWw(CKnm$-l)UjZvSAws)`HwvrQ}a7kez9o4H6hMQt!S|3gJY$Z_dwu5vS;Df zcGS~zO`OB}zim7YwRgW16kfUAj-P%DW;zEyXukoz61Cp({f!xn^VIaBY~`E9S&iuJ z%dft@e37Iai`2d5rF`Yq`mydKit>x81yfNRV>J=S@N<>J4ej}Di{ zP#!E*TB=C=@6yPAfRu%UxP%snzk;$!wMYAnupVUeC09ck@NR$@ft6n zwuU3!`4hdEVm$NAcago}_+dYV67j>%6gA9A-mbTiwk`{pw6Ky*`o`v%ly@zSH-FxR z7v{5oHMS6Y0U$oIC5l~#wBQN{x-e>ibEGc6yg@7f&(*Dd2+Jr5iC!`1(= zdBq=Om$R=f)ZO^Qs{Y2^!K9n>jii6V)DuqMarI9~kFc)2rEgnVvMOi2M zwkjN0B!^X>eT-3fs=NfMh4^`MqT6&We2)hVrEDSZ9H@y5`=M}4>HX~iD(t$10qSfw z`?tpQ^RQOt#sI4up23cNPvX)P~i6_U@6X`zwlgkcd&Z5SWIW z>aUcWmA76BpY3*yD_Q!32fWMbZ2LcVZNgb%atE~*i8oc)NuKCV=l@lzRNPZ z9SB^BlvIiUKw;zqRQy~^RkCcdMa*!~7}o*T$z{Tp#F9<{r^$+#Kq=%lC2-OKwD9q0 z56NSW-l=hdV)=F7 zkN`q*sChT)j4#Cj)E%o(lStG95=_|G$lmrqlA3#c3@`zMOQcPLO;M}zNa}==OvWy1 zl}{AHJF?kCQyGn^3~Ue=9h3_Mu{}Q}iz^OCm`VMkpi--vehTNtxcqW7% zlOUN`s%_8C1khq&lF3O~Bg6nj?H0EXBex(X4wBmGv=tn; z)=KV*5a)V7L_VWMm95q4vYA0bZ)Pf51V^hN@AKTa@Y-<$6l&oFTTt>Ig;J4}a|Q76 zppkL~Pp1cHtrI3|5y=M);T=F4vQ(+*n5=fJD}G!H7$xQ)W8e<}BE2M8Gap!G;9D*g zB&s2@;~Oo17V0I^qh;)HV007Y7NZf^XtNWZuSYL&Z?1j^qQ|(S5_o+^3E2=D!V|$P zv14{(IGK>`byK@*A?r758>TOm`sv_Z2Tq$580W6uA5Oe~C zjngQx-3)+}@LeM9Y~p6iDn#5w0U7v8##Gj52dW9V$r_zNePE0j1&l;J001R_n>vHI z&23zdStWWnf-==3*s}^4m=R1k_i${&2IPar8k<+iGPDFAE}I`vQI-g&R2TrMuNPNC zV?sy1JgLl;ssPeC4$HR@R5KEjKwKcS!0m|;u^l5-0G#9WsVLS3OSS=6R|_c?+p**V zHj9&qS{9rZy7b7t(Z9*(3}mA3$xmY!lZ4!2MPtPYa=B5wHIgCjcAI!B{5Iv1D33ib z?=}l50<21BZ%cj(%CYN?(bsB2kek`y+I8Z63@5twxOzvS-Dus1B?kW$qoO0oe&{sx zhfEp2P&Hu&K0M93J(8Q3wqwnm&Np;10hiQiyEgtjIffJoMpSY1gJiY)8M z8k9i8KgCW8UArk&LCBb<>&{1w_piEl$U=hkKT(bIc-vVSj7=^ohPc6j!Y zhS3W9Di^Rth_>mBv-j2h6S5({Dsy{PcpGz+F8GlrlOgB6%-W+zb6I~lQoXSk ziS1;KJ@>bV-E_8y`2}6NEFYZ}osJV6R4$5L(a_uqcIlu#SJ~l4-4rkx2*f{e2I;Mw zIj=uzeFG0+hNA0wz`MT`pe!Ds&N<77hckYhnDxC&E3Au?x9LPUO1^h!E^Y2-T4$dr z88o|o``_k&l0I#ePig1d793rk{^$1k<_9LF>}$Adn@hG`(#}76O7Wcs$0ps<4zZgA z!c_z&@-g zk$XQ)wOZI!D7d!ntHr6@l;E&ZaJlLpa>p7<34@Mt#ximI;^J)GX z?I7l`X6|FF8?E}TVeh`hJbS11`28f)A#c13-<%pqd$G?76tqI^kp!l^zdK{(21_Pe z`sFP66T6Q{&S*SbwBM^iSFXug8aegs$OGJA-ebY$ljeq0|5D*S>Eff*kR& zngEGYzs@AYMr@|Q)@At-_OWTt7YCfAOvOBxh z&|iJ*3M{SE5U3DnDkyWm8^)m@tJgP z&kCtt{#3}9W_Q+d60C`doMi4&f)Se3B$yHwfmaY?rU|lHVgj>M%zgqHM?oZg$%4^Y zq7V&Elj0iLS&)fnFoH=FGq;ElOri@DBXHbh6VLY=8`AKFm znO6tqsq#$49W>9+@)b%%_QEC7q|RgTY7ccm@^#r2c|rWxo1L~0A-(CNa$Nil%mA_S z!CwHYwxk`8kS(jK$S0yW(q%az8nvW@123x*<$_r|2CtU3=RX%v(F=WCPvqA1IMU%J zcJ3Inr@iXL5^2Tt2Z`S^L=n%hbRtLxiTQEknhNezyJ=1;_#Se=G#SUsaLgfu6W1%n zjAQU|eQ?wX;!0)0eyG@&TRp~pf}X*TZ>Ro*KJhu2dYnPu>CL#p`T)EY8G zswPIZ#Y|%0<2sY)#k9NL%NC?CLW}7UoWQkPKg_iNXSaI=H!@q+ujT`BXx0(yM??c^ z$7c-K=?Wz{^9q3%iJ^yB8yaJj@#|?8#1^I~J#;H^mQQskTJR;|gdbM&APq-|D}xwD z8L<9f1!=yfj<&YmKwh~{Q4x0c0W)x-$Mc?Uq^Q9qC8A_-jByOfm3+WJvKJPWiOYjy z%82<=c)JcN%G*aU=&c2=>B|dGm>`Ysq)L1GpcACmdf?N<)#n&x#7JTQ?*k^{iRt<| zwk}mVUGl;=Sfn#4Un{9&gOSgKjPJ4)56BaoP$9qQ3Fu2M2M&gDaj6{W#Ig zie~{i&p_p(xU6=3H@Igxv<7BC=Z`pRozZb0H7 zwY7F!RjP5mifS=;&mHH**s$V%0)$0*s+o z6E!EGS_b$qV z#81%X)}(5K5K-ea25uv_gJkRbR_gn3^bv(fX}_2ePhAbISfd)S;!(iFU%L<^^-x2^ zNVJKJx-wdKf;hJ@(^Di~h~TXgmP(<%j1plw3H)VBtg64fSs;Hr21z#^Ump~*JkvE;#mkXA3M5w?faQi5;!;bCw0U%DIQ>B>@3p;j;UQL&I}HB*wH(p1`?naLZ5)0gcSkOr9zGNEV%u&#Y!ZC z#ZG04iQq(5Q369u%#)ULpmag?x5Hc7Ud6 z{BJ~XQtzwwUJ9lBjLhD2m*CnyVDcl_#mVoh(%TCrPyP_k@Lab8$o-^de$Nkvfp6C3 zvA;qaZ&c=l>bn1%;}d&F-Ba)J&*Z~V+wVE`U3~j7_lMto_cls5vhyj^3TgCmCTpq< zAMoT*y67Zxr}87d}!i8%|*O~FI57$mxYw&*j z>zmjr9of4ynIR5BR#vbZd9d37Cr;h8(}mQz|MB5^*l5txG3b3Vn^~l9^gED5$U@NpMNu<(oak}f_!b#)Qo_TkJ(l8@* zqz^LaMd*%P&Bj=@mmNU{{OEM_TFsPS*UGZB_ux?cw_|U&f{jyOuS_=i#tD;{R+1`& zP$mXT<_zJ4sYrW7%wJ)#$Nwxuf7@XW8JBX59=efvx&pQ)&j5SMR*C zGADR2)OPWzmlAic&rP}Qim}U$i4dfx-7~3fLD43*Lf#!{1;kxb0ahM4#>OBQwrDr# z>0=_*UEkl9z7W}L(RXTp3JVFlddA+$+*G*DpYhyQaAoE~lV;vee3v1n3J~R@!+uWm zISi<{4tZg}p1w=NyiFP( zm0m3D{lxrwW^0;v;PT3$!@FMDr7c@zpk8W6Rg=8zGF#FaF}gj-dHwBQhx0oKy#bb? z#Ww7^Vd(E~cziH?d?Ab8XuxtOJ*h)^>I;@K>zsLYa@m~zs4&opLmDC#m5;H zg_U*UI!pGbMTVWE1I9YpF+t{}iQP}T4{HhxNak!{NU(k6N=58))pN$wgbBH=6swob zcCauSgWs~RAy+-L97e_WYAil!6T`_R^Rr14P+@PP888%eyq^YXFdgOftDmxyf6n)f zbYHZV7YvK4VE*L6e%C6UBCVyt{_Vc8F>@ioF1*#scPvWg7eeB?jZzTB8t9ZTAR1@| z-#_!?IaZcwEqa&1sLCkXQ|iEb1zqpZ!THHQjoy|A=8->95@HHg2tCxu-#o0L zcIgd{Af3}{$k57Yp$(%<~FT{9*Agk9%; zp7w~J?MRaC60{h!V%Z{_J}F*3#!ePe(etUI?Q>Xfxtx+NII%3zF4ow^|J$jLZLhB5^ODiBFnWQAY`Xun9u z9{9bG_fV((<}3x#!ebmCD-3L`yvl!Q&Dw05S?a*q3~hm7A%td$DzlYE+ItewlEHY$ zBAp7P#7;pvA5#+j3g9C!rX(0>S|pR`bezj|V2VhZ9w=G{!+?dL@rnRXSU{`(XjyOq z@mT+t?FP#hHS~qW2Wu*X^ZdA`0op=n75T#%!@@yPb2#GhX@$XO5e-DRRn z2Fnzaus*LHN@+Y0Q=eVP4$UJ&#{(&8z7*nNbfwYa0dyeQj(sGzFbs2T5%m?CF1FLQ zHob2$%x>>7O@AH+d$y)c2CuJfF!7DQQZVP^z9F~p_IF42%{i>5i36|ITJ)@xtZ1~3 z#xB`2Rc5=ZX{K*ye}-vVA%(Cv#-1k`uA8$*nPT8MbclK(@~VCO?RChk#2f`gG#)rpVn2Zvt`P)(e09$ zO^Hk90re-3cysRAQH}2i724F-w;1-+GC!=DO)5_lQm)UP7VDLeSm^bQ_tLi~9Daa{ z8hyaspQ`dKig<9~(%%>Nkly!ZtStAe&6vN3jWjqu@qDUOQ_!W9Xs9gmKYQ}>eWQF0 zFrXc9S^TJ*y1gdgJ$>&R4Td(5vY%!9_bb*;8?#t0_9yq-KGZiA6!oduiKQjyia;2x z`U8en$v`-=;BNlKg-dB2jBynRiMP4$ZHJAf0KnPtXGy?+&=G^fG2j1-1^g#U%ao6u zinh2u`R(5gls`Of(65pHCvq#`6kNh)b`zXhETE%0`+tDy%EBq(4f)Zj8qq7Alf4*y zTKgYJ&Aq#MIZD}?SsxnaTT(8>20V%xRw>GQG3^VEtMovpZuh#Q#d$GIzVzk757Eqi z%!$2g5dp`>oCZoyU~JgRcK&Av1h(WV7&hDLQA6DQ^TVkIQRYAEV}l27gk_$5$1BPH zjQevfIj!ikWpC#aqhOADW~FPmeXnWh<#0p$wUF%Wqz9I7DE_1(7cC`?yBD^BZd5w| zlM?@rudvPfU{wU67@O7QE znvUEYh{y=tz zw<8}PTQ=_vyjRGr(LkP}-6KpuX(4pDx1cB#XhaGnER2RS4FR&t1fDSf4ZkU4XZvDS z;0mL3?#Wev{0@OPh(*H_yM?{M3}38lQI95lMd=uG6wC_?f#OSqB~wQ&h@401uv4HW zOkX+Elqrz0P#i8@_9u;(htlMjNqq;)V_9+*siRTGlBdBX0+QDhN^*`MCCLK`eR!Iz z9+*KFEwXYyh98b)p~Sq{yrpJ^mo9~2*gv&|;?~EC!LpkKF-dxkz%s{X(WR@wnUp=) zCvY=$mef64m9S)vO|M0+Kj-p2P)CtuCSuG);r}O|HesB=3S${rSjBKGbF(}2v#2OZ zF?T%_mqo4b#EFH~-1tGOhR#W~im3(ryvb^S#OXn(<8liUM3*Na(QfoplUZ~2rVt|E zm^+3R2MKs%Scw-wqy@;bLar2ZOFWSFbK-C;!IHMVmGUW^HXA1@^ho@Z#{J~c!Lg>p z5$jsqps}WJM98|(WaC9~A69s$dx}08m)HbT#);=rl?g)&llO4tWkBKEy3TsgT8n^u zor9w9^lX&A)*zZzNSeirUmO&K(Jg4Qata3rPFx4XqX@KsEz})7W?)wAWHm?rCcsXn zLIY5(`M)|XI0@hl>-%@Vu#nxtxgC~nTt{Y!6MreV1~_P8#r;eL4+Y?fnsbJJ5F`3j zfCe~zH1FsFC_wabcEFeC*D1V`%`1lXksbALYZ4#cfW|rW$m;9t#Nibq&qlhHk9Z&q zoTa`!e$*2wREGX?am=qvd3{~#l3)|hXc~h3u~|5k%(ke|SUpOe>DC~bRz&$~0pd{K ztzv#ITm1a7=GQxUFMGaQqsgk`&yN$=hpqwVUS|HHYvH0!fY)e(E$d~kFapK=x7aXZ zfmWh1ZZ-AsK2ig49J2b=h~jYhg0}=j>}JDQv*5c zT`tTCfHYQ8L6tQ&&C&x2;!%(GMyYgJG3CQ2Ov2&el71CnZmc-97d6dfFO0_ah#hqy ziSpD;jrOriEn`68(^wT@GdWDIx#0LBhO}hC%hf;}rY%;lmIxB}(w0j(8CDXipc6wA z%Lr&8Xp_iceqqiHq>reTqIsJk@-Ff?%Y_NIXH6PXk-avkKWS3DBNZ+hl}&gcZAmJ1 z{CYHvxp4QfM>_}E&0MueSrj<(LQwL=AJj1uMelx^Fnnbdv8)GhQ6p0$Tvaw)gIcYp zY!W`FAP>nFSdN(gygS;As@^UFp!hIuDpnfiB%g+%cB3Xa6kw#7l>d-kOHXhVd=mPS zmD^>eGRO5q@F0n`AQd2%NaR%q;w*jbNw#9;O0IFyK=FH0GEfsD9XDZyW2N^Qs;v@n2B}$SC?P#QHvp_M>oLvoghtW+jY6VcVK{=6@=m#h+`zDo1MpoXFT8iBq=;klU1*}4@2t-! zqS2cRW3I&VEj--k@ET)VYEleT9M532(Pg?tV9Dap@X)KV&l&xW4wH60VZr(b(*f}K zpO<@(hOpz_-6#H;n)Wh+#C~3RqivKNH@Y`4*Cf0DYsr_3x-M;DJEztJ}UP zjp!EsyWO_4>rU27^7W-j-yHy>?>PzF{F?pb+a#p*L2UJMxs!TL%~Okgjn{Zaq2Ds~ zq&#|S{b~-&@N|XYM;lY$0uA1Vxd1nI^^U{GKifQBx(WHd97FtOYBnk8!>zAwBgJT)vP7LSrmI#ZC- zH1Wx_;pl%GAzAbP=O9IqPRQ%FU2<^Kj{R{ovYprUJonpA?*F^{Uk<&d1c~e#j-AGn zPu^wmj#<8E#VsckV<@{ZsXWM4*d*%W$ zM|rfSd;HB5F{kZ0>i5$uC!@XLiXV70k{Nx6;{v*sBR@KthHZe(WWCi+>9ZyKg=Ja& zTz;u`Ch;4`sfXK~9B6;!z&ZU}S;p^hADEVG4etklXys}(!({ONoLy_zqP@qu_6USY z+I#+>gw{cv^zVc8FJBJ0p1%DjKYzc<_49?z)_gC{1zd?y#Lbmc!`H!*r%KbeZ|Xcs zd7pEq0=WG0M)>}8p}k9!w4djERMiM z$<7g`P>7Qtmd<&Iew+L|83n$GD?ro)%e?(lTqd< zl*RU`$WB+pa!^@$as^$dhbAU-p8*w?y$qm48v6|(K@x-{2}q+B#neEWA_rH`kpzug zeNJ2{mu*2k4)9lI$#JQ_N zbCC4w^xNC?m$=MCHi}aQHfk&%av63l;g@NTl=1p}>#W)T=4ptNJ4Tx-FMX%=i^OILj3Z}AUn){Ln+^4L8> zC1~Z@92Zl97I>SYD_dN_JA(x)?+SLOhRJl#_QB?yw#`Mws`j4k z9~>tUR2G7KCRg+BRQ3Y=DtT)RxV&dlojM=P21`{F_4ypj~3{%DazC=Af0c zwcs5p;}pjp0cpjG+1!IN=Ig5<9H7372{W$aNIVWt&m2T9JSO%d+o;_c0XXUyo37X$ z^BFqtw>Mq`^WS~6?lW^obwE0G6Tn=?Fz@1|F1nH04561HkMTj=X9UZ7$9lectgHn| zF&XF5&|NP_7LlI6nIupN-PBp_B!|Q|$}BJ}uz!AP$E<=A1E&8-tKTbbNNG=wLK?amOW$Y%zSwXd(D+k7)4BuK_pDI20YV}L}QqGI;3pbfz!oM=hzr-$mT(@|u-!%_t_Wmj0 z*j`3WdnXxq@BLJ3^&#=}4r#U_Ta9}mr0*dfEEKx<1>~E!5;IJXP^t4{lJJt7f>9n{u&+;UvB4#)GV@|XXbZM z^%1X3-|^rZmgdq^J^d{)9q(dSF{%D8r|sOsEZqkJ_QT)4_%9ZqVw&xoiru4WVjE1< z>vbppH;PMEj-6UNrN9Tun(w!vR_+1U?Eg!%xV9NtcUU=oQ=^2%5%SV7_um_R zBdLHmYjptP^K+|X=~iZnK(E|A``+rv*Bc#}V^uS1FaGWgA3V20J1|e!)0*NQ(NLF# zz4X-Yc{t~7m;UJx=EvyD4>fqawf|g?;iLC=o%bF2GZ*%#8-Hd!Ur^$@!GEXerUQ_PMx29S#L8doC^@_{8YOa;C~^p zk($zG9g@8jYj$8J$WWu=jUe0D@hZUMcZkK_AzKcTuw}fs;~4QW>4mqC1_g|U-gS*C zY&)#H|0;0!sW()5qA%I9E5#$A5VN3ScJ(TPrp_M2VA>D&SEnv*Au*7!rJUlay*C78DlNQlrvL;!f`FDrVcME-pAJji59?M9h%6v$n9V zZ+sx`F)Z2Nm{+Bxt2=E78dL?V4!5N8T5k*)8=st;$;byFj_*z_yf%2=0OfzWv}osl zjt7{liDq_j@G29mQROxMEutM`dho1C;qJ;ozRTj6j&0=LQFA_du~~MP&(8h|2j9;n zCnXLPK=d(jMeU|XPwtg6%-m_IvLGH zUIq20jDpIutRn3t5$ixu@M6YLRE|W6Oe2}-IrI0?8Tc3@k5-YXJ-VL!y>J#<5PR>1 zmix^q;d4*I%)}>?j@CJMJDY}ynlaeDyV+!xbzrU3!}eh7_iwoxX<8oWZH19%A6UzT z8@zD6;&);O4TUobfjTe&b$6cx3(a&8Lv-{KgFX1A|_F2@5*iUmOkIDsThX!f?1J4kKVMmFczC*RSf;ZVe42 z4JJ-}A@W@S!Qk~A(==&g6We3;HSkDlsIfcHhEa7b6Le_k+x&88ND=dzM;iMDGoc_J zaopYJ0a<+R_g&OQfK}db5%ZVq{ z*a$mZZB%nia9vSw9NGZhmR|_l+l=N>(hWWA>|z|23fkRkl~%HN{h1>ppzL5yc1-hP zfq6h16@Jbq^8B2{{9XOzqP9VqjXVs;guS!je16pLV6G>&ELqW;vlr~`9|72MGVfwz zZiLxO3wi^Y4=dlD3z{P&zJ+OQis=Z=j0RJI2=2NnPT^W>fgZDUygLqAFwhe}w1%Tj zv&$aFw8rhC7W3fVNYpEq?L2|F8x#to#<8Qfe4O#;e8Ml^`t2@&_eFqt6^X&Sh|W^O zPl?2neLCXg2s+y<^FjFLmE|?BEA|{j_B$7qR=lmh?G~=n??Nq6m5dEZY@#5VOeBUh z>+IanZ}c)%9QQGGq*bPhtNcw7G(Q~WPTcWjnmr&y5I`I2ID7)nKZZSmAB6R<9b@%0 zg-nUBuU$A|3R@hcx?R2cYhWc*pLM`9r?X&i|HOkHf+dAtE^Yhv#O+%K^IX4iQjux}| z?<&HD+wQys41OrEseBkS+hRQt)R!NdA86zG<0xQt18@h(_yPFzryQ!+eOQLtLnSg< zWA_2zGtJO)cXp*&j`E@sOex2V#q{d>zAt$w=BnxwtXVItORBSSpXh(mb()g$`Eg|8 z9pmp_td>m(0NgLj^FjD}jbWdb25FIk57oa&dNAC6X6X3E)%%(&Yg(VpBn2KIm)!7( zh?GTZ9{dcKCq>{#tdW()A;IKoeRGHSIUAk|Anr>0TLm{i=+ghhN0)zY|5hOD&%Kn2 zLW32yj*0!pps?1Nx-iwvUH=k0_gbw~?A@}L{bT4-w?WThZksaT08PLv z$=hi^xp740)|Ij3jKRZCMpJ&|9Tf4P7rX zW2)qSO=^MMes1ma_eEmSzkr|AE0fBd(3{G)?Ma{4mK)k}6-tu3%$|n4U2cy8_-p&O z*eSPI+@P!~{BD48 zdURoQp|s(Z;QUzO+mZ99_3dulwYr)@7*;VP9M2BgJvtn?_;=Op8S}9{1ME|l{!>V; zd+&IM!dnxy#X5pPwyk53U3PZNmY9^TbCq80DXvwTc4(lDCED)DsIN(T7#UhKmR3?Y z(jV~U1cHg*`0D6q^LJH6d6weiMFTs_OKY*vOW{cEMK$mR@(XM(wbR`RlP|%%gD)ujfno^)H5Q0xGjMysmbSHnyzNH2=;{ zdqtk8i^&p|OzbHiSQ?L%ccKdi>T!=?^IMMJqSO!c`Jlw6daTeM_|F~vgyORNBes+Ljla!~+XG;;ZTIm3#tm6n4<7ns9*YZ=sR%Y=r+#I= zejrty8f=^{ZQj@f8wq=DecT2OivdhLsAu+-V+Tq2k-r|)vu;n>94=beW)o9a5|zcQ zGgR8fGjk#v>Qri}6hxlw&76J2G=?&^4(N6)Y<={J06MmjChN*zeYh&Ls53?AjaicI zYR-^`Q==!opwpRFcJR$kE{(<~d64@cj}PI9k+|lF%9JxKs5q2NkB~X4p?qpj*@Cm) zgpB0`-Kg3s+=fc}ODnu;NLhIBc&Jm=+aG`FelMvS$j$mIpd0?hpnj`O?z`(+<)TM% z7L|7q;gHQMe}(;3Z1^_F#bY9Oz-!3Tt{9K{n3dwQU9cnIbe1$pd^a5XK&1vNvi)>7 z*zR4p+8E_h@anwTDYRbYR>9_f3DN52l%CFtKW>9^leU1uKei(Gke52+k{Jf~ng%vU zSNR4^Qa^FWt6i5J^!hbOt-1xlvkuef3Mg$Q{w|{Yg`v!70|+=}F~Sti#Te!d-#?l9 zVK{7Np?qzv%G`En@`6cRB6b&4vQ;!;&RZX!Ujy3p$J4DuGxegj?8lIuEs~4dE+B)p zd&F^{fR|5SXRQsKLn1h=B7J+ndK@~qwV#6dYJYcZw;g-!YiKtD=#ic!?l9>M7#!a6 zzC1C5b1O;h%!9z;sWx*Z3gCMc-j~Y@GwZm2>`v0O`6;Z5O-U1(Y0wq0sG-rNl2dDs z?b=|L}{w~*X=)1`DTBnf*w#}=Bl5<_OD4hmP0Nb>phtr&~Z~Q+^^Ho z`=61&G_Dykx}!N_`%R6gB|I&}PTjKo*{<(_30+svSp)&^-yzF8 z-<4J`FD~U{N}Ixrp4Q(V;Cgn?sz%Dg*pt@^?nbnFbq1;ZiJ&@NHjb`&4r@srKT+ci zMTZ@Yo=w<<0iNgPn*U*21@5d?K**mH6(q$N{*|3yPrUKyEd0rw&D#`DtaU|U)2bhh zsqft2{rVHkYAWkEMQ6>Qo$9I0Xyf(8em0xP0e@CJ>#ZcuVsov>Pjf%2B*c=BH;WG|qIG*pSQYnV)UZ~Om0gpxo?dK>M8U>pRWJ9%e%or>qhr3=GK$n8+AUC; zCbZelz5e4%{>#J2GkWNK(vVb9<;jB zvTpVs$K5T@+m*GCq^k*Y*nqVAi}(lT@w1~V0rbi8k|U-DX8^dZhnH%qkXuJ=(=KY( z{TB;3lTfGOZ-w5dy=$+){t@`0%@O_ce-Ax;OX|1LF(yZhsqd%>e?dqSW=>QpqyCGzm&9|CCy6*?0WL-QHyU zcH%dmgW_}9gdiX0yQlqeuI!dSvac73Q@D*9pVamYR4GmB_h>mAbsf!VBZsxkhF5`1 zo(v%xHJ3IJciU#Gz4%{LeRWinU)wbyUD6#AA_5|a^Q_Wd zvtxTx2gP88>6hnDM*a3;-(HG=aBblP;5p|9UWgho3Iq3XT zXh9tW+%Z&c8}Hr55gT@FL=u#8fb3mAvcPCM>XjQ%*rV}$gtLkQvP}O5lk99JIexFXrYH!#PPi6jFE%=N z5n`->#N<&W%$U;)zc8B1ruGoDf7!nv-tm%1shAsDADZ)XPHcjf9h)fpT%7n`%cMCM zGnZJM!pEL{qx-_~Y~RN}@wHARlF_t+v9jFxhGc0podvs*enxurEEPPx!_mzS61O|# zMD^6~z9^|DvLss2Q~owp31T&)*hoHh33&n zcmbK}x$z{Oxf_=l&6HD#Sx_l+pZc>NEX-KStsnx6o|ZjZns)xh8|3Qf%Z!mG=jE-C zIKcW!z=b)@F~dEveDreYKPp*t5$52R)m>33mq!(z%X-TGmtiX=zA@6xqw(Uj>i2JJ zC@=zzp@EQXj^Gs zDyly(PWXCi8FU?b-QR~(ll^7W;B^)|u+Z?)wT0#q2M9M_cO1W$xhz|}tO|FhR3D1R zWA6G5hL?DC+@xtp@J^(kDGpxvFr>(GJZ^9g^8@8gXUQEWkP17(5R40_1DoDIsR08BYZ>su`!6t<@W*iASX} z!7#AK!0z@ovv0kg)jwIqt(_-Wz=Sz7wD8SI*~=Mq9cSycu{qd#_+FO?Yrt&qy2erdt)U(ue7%p z=0E=M1?AoMvqASAv0FYx2Fjz3PvoV7t zk1+E*l5p@!Cvon13OijBb0R<}TPA|`um2v4F4II9z1O!7OG%y%b|u!O?J=rmKPSA` z0mLSgPu;t3Rf^4OEI*Uoet+Zgf$tJ~PR|v=lKN)-MIH&o7>YWj>{H9^%^#Y9`@+E>b9I?e$nFRQ*9PEd+ow!)nthayz_Oy&*AWeW zBgcalmHG0WCO>#tC+VE-3Mqh>f$atVH&bP{=UA%N}dZtFhGUB&Qr9It3MI|Q%n`fy;99! zBwwT0XG)j`su_(!3yTgA>}&$bxZOst%{qNUl@Dn5@{=Dd4@{-+pg&mXCj^>xtC;4R z9NigGFcl93zoGG)4Tnn;f_&RZthz(Y+AOqZ%f@c`z$Pi>4 z|EA0U`~{oB)FV@UUUZcgak)0$X#iq#WV#%+Fu#vsZF`x;5V371NY2*e&n6|r8C!ES z{kO(P>K_m33cY?X-z3KIP>=H)dN){pKXv_2zvLY)+Vf|}K4xCS((OR@MXq0#*yyai zEw4v(Z`tvdjSsGf_)B8xm}k-AfOw}>!Khx_P_VVZ*G$Ews;X#lV-W93s?P~N!THWN z=g}1lHcmdoTj+uZS!Pnl%sU#fC(tL+F_lyk5+!NBFBV$5=50HbJ~~M@7A?u1eqj|x z+P#+$cbV;2JS~nx5eKn|(2XjxSqac3JRdXvM6k|X(Pf-y8oD0tnYf@APeB;8uxm3R zSu#2w2)dQb@y2708+j}{|I0I%C70-NWOe*cb@=ZU*b!? zV1LG$WBUT37-nf)#z5!`^<4v?VOt^6wmPH{UXi?ar1i+*3$lfNhM=Q>;FN5IpIcY# zwx;vhF+)W}8bJZnl$>Jy~7EnA`-XB9!~ zo_IzCNtej1S>X(=x5T-=ZzLA2Aa8(@z8x>S0I$9PYwkWeH_EoOMb3}kKQtdrZ;AGV znp-`O{rJqX6%Z~fPk(Y)MA7b(9(EyFU+N4Crp=&*JS_re|VJd4DAvSArM`;pcA&3dYkJeawcaF6)BI9Uix zeS_zV-Xxbd?>g_O{>G|3mrWU){?T|#KTQ#h7iY!gD^c=&#|8?-76kiVHn2J>D6wq* zMxG!7#A9KvkGKYz`@!EBubAG4@jEc{NgCxxz5#SYSNJB|dTL zu%Eqmf3B$Ci=<6a5gnci*_x1t5lE{%;_K>XvO5j*N#KEloT zbib>ii_-v;l^Zf4f?ig1ZxJ)9ka&QoH>iDQxjcQtopq>Zq1WW z{rT8PPAFxhn~~SW3`Hfax_52Hd~@Wou|2$HvHgS+>PdD1I?U}ItAtRPzA1Q4v(YPK z8hGcb-zFzTu$(C^HqQ^jV}Co=Ds+8Zv+HTBKix-C2#cWX#;(t$iA6ezvS-b*6|3y4 za;VtGXWw_R%~P{jIa$nc6iENcf(N&!AD060DaA$;%zt37id9>&=E>Ifuh8E!UF41- zD&D*1CU#kVMnLxvTI_M%yY{98Ik16z_l132;5Ar=yI(k7JkTdU1!G^^do-xuQteb) zpPaN8=Gwp0%`!xU#Y;y!(CqvolH_e~!e|npK1XWuW1i^BKEc}>)i)X*jj4@ zU;r-%z#GUI5MzUw)R4-uW|tHb?(A~H_b_{4@tkBW5eOynBENJLn4Ke_3`aPzH^K&&|nK*E>>z;cTZByxd^_GXGkV}m*#Fmo%N zEOGp88RV?*&UC8_+=0J_^W&d`lJZkq{&wNVu8-sQXi7ckmaT#bxyfgeu^csqUO4*> zX_JEFD|g0fX9>S;nziE55xEfuWq=gzX(D8i(W?qe8zBO#BkVWsza2Lsp0x<`PrR3S z$H@66-hHEFZ}WU;>th!^=}3Ii_XAbT2*D4%P9G+#1s&!k)No&%0I292(h2+(iIsRa zOvNeW!4CQs_!OqNc;5})moY&NOUF{_>z#cgZOC--uR^@H|KS2yxvmR~l}_~Z9K9f* zr^;f&)oiT(iM*@wk1#3l`{>k5MVe4*Qe<_!5-gkj3(p)X8eD#o#oaXG& z{(1OP3pDLzlvp?E-V#JCaFFwid3`FwM~BIfS-W9t(U$D38yhqqamWQ0(wv`^NK1fz zByCTLe~roh8`0}IP5*b$!@v433B+&x?=QY9B+^jX3!a$%JiXvKRH4-qpg1&@55(VK zYmo4eXrK_wPdiTeeKOJ=fnw`xg{Fo|P)Bb&fHZrvZQS(Cm6(WR2liRwJ{GI_$YLAI9SN_CUU|Ri`qsnORtg69xvxc(3hkjf$dJbAQ*-*5V7HSnccB zO^Pq@s+Q-+3T(G8MBAUQZZAyU$7uJziy5AE^V6A} zbbcMU6lX$#EN|yMF~=r6a2DGhGXc2mFuMA{dDl{)X|n&=NRVnjJ7|0`4KmZ)-kEY(i`wM=u5D+gu`>0wtjYVOtj$X9Zt&Hx&xUPgi~_syE>QbC zSxB#J?;*Fftqrmr2jn;2DdnEU&KNmh2%{9Gb{bzMCc`CZtrAu5)%ic-e*FO%9 z5^g@r2WgI8&o6jCU7l~C7)2L}aUC>LJpP?)-MHb?M(<9s(S|?|D(zl7f%;@dxUa(q zW=qzi+a=&a7@HxFk^%kh30q8SqyuBq+^An0s#Bb$g!%9uP1oN;_Y3v;FLAidY3Vbj2RG6 z%xP8ZG01{{pJvU7J0)*x?|1Fxraeiw%l8iK6}p}%P>5xdn1Y!ar?*o`0F|1N)itMHLhWw`Ax*NJxjZw=_lma9}K`>V)!J(Bqajz3pU@C zU=*EApjQuH|JVP`C4I0UmcnpJl^sY?RN=NT&%YvX{@pdUh&xyCKsBk^h! z2+Z4R78~+R1u`W38!Qz*2N`_;?RYNz8HPqD3SD-IKyX6{=)`mgzfo!5xS4`JVTq}S zr$!%gQ5c2?q*=wqdtLd2gpQ zDoy=O0LvSgfzB8^`MRi9I4v?+We&mQ{Z8w4A-OWb!{U2?T>?bL1;?zP4&GJV0IH(k_^>w3!t1WF$2At0=}yM{uv#)c-uTHg<|&S{<@2 zZ`o?T;WeS37-`i$ysjY`b(?4Q2$fF1@ri2dg`@7JyK@$N#NEdy(!OfWfXhyjXz_cUQXRP zSK3j1Jdgc+tY2~AD&y1YT%>XvLFHi_Wp#jSixuY6milKeSM%4-#O7JX9bDaGjh4!! z{#|XgxY-9fVp#(OVrRB)CTtpD<0R#}p>TJyE0G_pG|1t2G1+5KM|%vGA~{}S*#X6x zm~d@9#EVI^6*h**Z1CeH0*+S>o>(l<0<&w`$XE@eGV)DVZP{uq^Jr`1h-cD`a8K}% zY6xwexBLc45mQ6eun`p&p6>x``xy0Joy8>0CE6l5u{9@iqduMzDi>+qKMy z>dq9-bqUW9`3e@z9TPhW@^QI9aM3I6Bf!ml`6d50QT}U90x=;|I2yD*7=7g8M(&Md zn#g}l5v4fo z%jmm%48=xzV8PYH%q9}nU)+%0G9tmPc-*JaC3V`!XNAd+iXMS*bVsxyIAA}5(#c<- zt=XN2GM^&6V`p6!d~l}$A_Ucng)SlrW~U1Kb!0}@4}X4HbDhfw6!-}VMWtACwqKtz zV4QBy(Y28eM}&9}g%n@q8-CkkAPF}`3@Q^{d3Bejd$Suu=04r(r7@&#)q@(FwUoVw9Q0Qe8;!^a)??$u7;^Z z14yTx#0Z4%dP;Avu9UL_7t!W*7I!gL27e0#t`jPAMjO8wOSD&LN`uq3Z`1-SNp=U% zRPSC=_&3l=i_yf3 zIz<7xOneVYcR6PFqg{U?(!FD%puB5=17-&{R_E9Hbpqnl@IQDo&EjK_enow@+msfh~QTk3* zzGgG#=Br&^>4knsVUZO0-1rj<``XLEa4f2e>!pVQW8k2^xVdpmY?pAn%{w-BIFWFy z+*ZA?X%u%@p$+rnTvvgR$;Wi-IDjDzX}YRz0t*7Xf#AaZ_f)$;oc3~q=i=vye;HQK zh<>!H$4W4Kow|r-y_Co9(~-MC>f)En=b$z`dz$*>Y|cZh^!fa^?64gz#E>L6gUd}UdY-vYgXxjM<&WkmBg6t|rt55wXu;reGKWmG)H(}Bzl4Z;1(-HCuJJ_w zZp_J>ds~qia#nqpai$nnlzPA^wcRPvqQrbXEXHXYt<1hyb2;8k-|vrl$Lwry$g%Z5 zPUU}ZGFRF(PK>>X_(L9qc;k7||HU$5eG7z^goC^5&dJvJ+GVrtfkUDfgzFn$v|?2{ z!%~mH(lC--vFh?Oz-B2ei4xzZ7!zxLHvE>3lKciX2*?U5+K{loHW47 ziTG>aY;6?pdrd_mS>@x93f^nYq$1+?Gd@DYu%$o2J`Mi?l5S7A{5lm%QG9dadUyKw zdF(cnJL33GJyLc*MD9|5+-^?I>#w-a%D<>vdopF}&ptcR-zAGHi_)OMIbt*x1fV9b z!r?|0x2LxTKVI!Fe4heg%K7pt_uXBUUH9^X@>&>{`By;H@|BL}CxDY!RImVtGy{g#E~JU$HhQ1@d`+}-w}Pn zErMNg?^z_}>Ya(!McBef?T`W8Z+tVHM`sD+m)G1<6^w3gam4`5NtBtF8`6cDsY!U3 z2#rJPpcPv-3?@BgYpxj#eb76FTn9{!^PG}SuG$j5CF)$HA zngur-YkL+Sym=NpI)jVJ2Lxy3JNS@ozbLAlea!jk3&pk=K;H@%lQ2#Is$!wO{lE%< z;25o~Nx6kbS#ZWOzi$&Uf7YCU!25G@*AQeWYoZBk>a_ls`?n5h{(a`?$p znw0T>ksTex@A8X@0klu6d^I3XtzT^Z-`(|8&w`7bUA9*}`X4SpRv`}H)f)>B2o`_j zRaav>4Nk(j)v4r)H052aW*X=OhR{UW56(>rASK!ZoW*}i6Hy!iZF9H z{k-kGpVB_HWw3xis<@5OMFi<}?HegIvSvwzX0Sn^1H0OrJA6qg!SF~(>ZKf)5tW7f z`4^X#FK-`!4f74Vu4=@Mzhe(($gU9>+~0P7nbK_V!Jmi4PX}hG*s#tY!wD9L#D3xhtG*gV$HyY_aEx zZL+1>L|+1$)I-|)+%Ww}zdSP`LE)^#wuzYY^cIuj(Wh7>V*v=CQvZ ztZW|erHpXJLJNbQhaS2)k6VfproPcR+4*{$wiz~COF7OWHCvQMP^AYmw-7;F= zZ*9PL_Y@qAN|Hyqex8#!X1L|2sG+4qp-LI^;$2m(_PWsYrKQ>rGZ(aP3_hkfm z?xKtrTE2&?U%Ij{?Y~;EUR{eQQQZ|j?cl%o_ep8td|&>15kUSl#JFm!G~E_3lZ8E3 zCL-9{3ct9mz`7%vF7vzDKGK)pJXuTq7~P!-6(^Lw8@ykm_qg2(6Mxn+@yI1cB3Aq* zMhcCRPl?g==nBWrBONmO zmn0}5kDnC2I}#d4Q8jX!ON9%fw|Ew+953F-?;~8pc2e2m`5 zZ&O}GTxC$%Ck%#?sF&&``o#>{vAzKym3Snzdq;WiR{igY<-!Y# z?h#r>sc`{)Ucvz7RR0v)u$MW!GZ6ckONQ&WzluXm@5crBQ1LW3!`x@!E3%+SQi@2T zr$_8)5M_R3yhMciPVV&&R`@CfO`1CM4gOO~L60(=039Rpf0N6ejQ^z+Y{wdBo89C75AB=Vj`MZ< zLvV=_o)5W?qqT_5f3ku9O@d&cjm{MvbJ`?c}*AKXW};e9K4{vr_SW|jRL}gWjZ$} zD<1fI0uk#wPQLxVrO^c3#qN;Ie5FBIbUY|UUV5S)?+DKlzvssngI%SvUzr} z_rXMZ)Fpyo3Vr25$Afl07JU=XeCAPRC7t}t*30?NgLMN$Zc{TQIi(`;mU1G>TfL<% z3h1GAZNviAj50H4&*YtYRXrre|t1i264gXr>M=4-7G|TPO(f9;`iu61*I3Uf!ea% z+g^PSpV#`xP8O5`M5!m+rHx)l9A*MS2E|8<{~kreT2-zYd$L9PP*9sN6~>fu+LuAh*~Zj})B!-d^P``HC}dl5EECC?aw?A)&o#SOx$85vMvpj%RR*a-m~ecoO1gM`EW{2n zi-SibdO&{)Ssr=i{ED39UP(|fnzP^~qN)?J!U3fNJ6b+}jDM_J>$TdbqSKeCCmKS= zI~|>>yd@qvJOl#DIUVTZzpZ}vYFU04aw23RG@%sgchTaQwx{|RmrW|1cjC4YalT>k zPA$XJ@WI%4;={^dJAm8)9tr$Qq~oIq{yRwRx}Es%{h7INhEb?gILf`4@{Y0cxXH=1 zCTUjRIbw$3K<{uFY@NqvimdddF_-Hd%kOlrluo++n+u4iHUHUZ!q7X`>jse2KzAG2 zW|id%qz5o6>`7Q=O14Y9F)M}!$wqafkYfuY{-|+~>(02!VhBYpTbztC4iW5u=o6^oO}O~OvFw*4&s?TF zvc-iE-=8eKg=JsxHCe3pM(N_Ur0XCa3U83niD~$J#6}mEn-3I``TA8GTCLs2QX!H8 zd7mg|#T#O04va9n^OeZ0F^mdF^1Cz)xUF%9D96fR)VesV2T{W_t{5fivqbi}#D~5M z(Mjv6p9Oh0)O=o$)>)g&<36nE0;?oIINh7sdP)J8R`2JNRewPnB>H%r#ClQ|QiCOr z>p3rSw48fa%n#~+6zMLMOKq_;evq2fFiM>uIMdaeoI_R0M_zE&cE6{DDsRd=N?#pJxO`H#!YrYC7i>qB77Im^<4x_yqnrmIZ~K2 zcCa%!>RVwBs=g!t#Z+j@*V22tN;cuj-1bd;rTX}#>}edS3~aU`+`Mad;Jw>}S2!ndvSn?qG zmhz4^oXlTw2S4`hX^cIRsR%-Is}tfT8al_Q5PAkl%12-K-9SJ_CjUN~Kv1`DA=x-o zJ0PJbXD_r*K0#LkTaNeQOfj6X7A+a)WB~yiYPXzsinPs7v2xU_h_(?nj!NH?n)tKk z7f_r6J#>%uS`g%{cUXb^@h`UaGhGqN?m_11-l?y0++c*Zb|(BInxaK^njUdsjLudVAjNXy#S>qJ$IsnpGi+!I}0dfe$@Fa z!h8TC{(H5BtHk-tD#!f6M+>pH??9VSqrL9TGOL=G;_?w>Ca6{D*DHEP=(T#gm8MIc zwZ@W(s}mUb0#qNGj4^dn6Ju$%tx{x)La&wdEM4UuywKGvRlMyquRL8i$r4kLCHz8$ zSL!~xp$K^zUr?E6>N%c=QM0NMDDk;DvxV90Fc8T8VOMSbES9IfO!NT%@)3cvv!4a7 zmUEqg*>x(JeI`h<}JVbvoZ<=FnR*g%}?H*cSqS+@~q z%V)P|CP6!t0dE=UE@AOX#u^(057mrfL&Uxx_W`Ppv%Y=ZmuC98asH_#@VUqiNzlWX zpGiob9au`J`boUUn`b?p%YVKg{izgk-nVJRZwuXgWVL;e%figurk3W8HFiM+SV@hi z167m5G0ei%mLT0fTmaG&Pcx<`=v6rsz*9=_1Y0rRV4C4-IaY+v&dE%*pqX_ zVU>s7!-AV0aVW9Q(CQ&|FY;7AyHkkkoW}h}hfo1d*$i-Xd7c;6z1)1iByrz(bIDf0 z*zKbD=PZedR?a(iVwqpnqir>L@+`?OE*Jz$Blvz%7`FMTo!HFdW=J~%C@Z&b%-&|I zb7|Jys(ErNLi%01K^ggu?4{@eJxq~z$WgY}o3DE7j%lk%mb{uRrf!>ik0sjY^@arc zPlF|^RlM7NgfUY9&XqC+5_bSg*=6K|hE7JWLV%s`)uPJhqI_KQ~;_(3ZL|O&`KqlmD{JF^I7aRANQsjcZ@k%DZqKd zaA`o&?KW`@v_df46muJ@65y{A`94SNoc3{XZGQmpN%=f5gr!4YA}<$Ha8_OBM!q@sl-ob@=srz*%*VXF>hCxS9X5s|vUxfVun|e8`cHxVubmnA=jq3r zwbh8x1^<;!)F}dZZ5LgwkZC%QnRWBK2x?xjspjS47B2q0g>k~=L8G8ce7Lw6M7#g7 z#%D5KeL}`e#-&1}p0W>DVd!%ERyZ*;=T4W<4fhXdw&5{qPQ@ZyYZgCyM3Y!)o zX(ylRTO+X0gVA`1$(Z+?x0_(+Js^`|;?obw{9eT%zA%CKZd$aGX^G z{K%Q6;esOJd^0I3=hSVs+yaZdE;rhwB1DaNv8y%e(UsjBpO47bV0R*Be^C|HO^5FL zy%l$6yM00$_}8*VLFb31?nY>v5#kjTT&_`wz8rQOd*$} z9%7`wx(J|RpZfzZDazHqV(yUBT-xix2>6Tb@ZSE|E$m&#TJV1VJZrj~lYt@#e70d$!^9{deKY7fyI;I`XRBOK_5r?{F(dIJg`1=WEb_Q&G^x* z#Y0sYOaoEaHSd(jJV9h$h2Pj(UP`Ag!{BPmXlJ|imrvhUj~;i^Kl&NRh7W9ifZhq7 zcaA-IEIXdQfh`x_;;fhAkjM+ND3oO{Eoyvl6;(9;F8Pn=lfg+Yiv8Gl@|XD>gqQ3! zUXZg@!y;>r^6dWo55Aid!PODsenLZbkYiH5fb)e238-d6u)i${;(?!8(Ch0jT|Z0M z2{+JNAV~6>gSoCDq2e|JDx+lAqx0+?KL9O?TY|HMD#4}=nm4c!AJ`q=D6>!MWAU&m z>_3jf`i4ciyrofzoF(lbmd#N0t*x7t`fhELdV2Aw^30T|Y2XQ69m$6nWVEq0)Rr%m zCedoIWJ@GPO?fVVdCu-vnp}ai86|}z7z@KzfKl;Ln=+i@z4STn#df8dLy)z}dDExZ zWmRz;%3+0n?q7GF#Z5#oOu}w|HWu!y?f%t+faTbdeS=h-iYI;j$^d#fiMJS`-5E3L z8Tcbu&?ZM{-+o?tkEvkp?OWK6lXFNLW$!*Q`XR1CLO{%R2};dx4vSeUAn)?TVuyqk z@;YKP(R#k|)wPeicik^+$?#K4#Q~=XF?sz*<$a;g0CaH`c9PdTp#%@VAP#GcLVAT# zeweZc!LqyCRr)R_84}j>#@K+1W8L?eiL-qT?AyMJGd6+8Tb^~#ex6U2piV7NC`%_9 zI6NpPBPM`Bq*0;&yT}d<>2o=iwl2H+^XAz8!0)GNvO@jt^!%;VF3M!)hSTV@op#T) z|JJ3yvaH|rhljv?PEd=d?#$Z64(!&6O}Sur6BfTrzkZZfeq*%KCcAeWo8m20d5HeN zHa8Qs7dJgdv3BQ&L|wF;?Dtp8F8wgwoZjn)BmX!nM$fX9vL6a#oK&^AUAZv_b~=Z` zpZw_CPk+@E-++w#bGsj_(x1GrC51`J&EV{_*j{obT(f}>y;qOkHBO+fW#_kSa8*XT z$=La}SBG3-WBvyOrmt6{ws z^h8u1IWTJMLP|@Xa2G+jGv;3#%?Ll<6>_u>tt?-2ly;=|$bdy_F1{w=eI#-TgyQe&m#Q8;k zW=1rv)(WlF`1!RkJ~no#LKquXOBTd^*&@YV{#QSPOLA8>MYUB(!~-iw3daXa6N(K$ z8TjA29vlmKHQ38W@x!B1#Y~iMqP^g~6c2Ib&}?^iwXC->*Zu6x1|N@*ELT@Fdt*tt z?h`ZH&T9|rC&SwLSNNNHZ4qtjsmLL#C41pG=rfH8TS+<0c!a$+Z-)OL*ZeP>y_2C$ z^T()C!=8@IDawRVW$64L7`}7Y@5m%wl4!8$$Guqa+{%wQ44RIun6H1-PM_@ki`*q# zoIT^t9LwOrJq}hT#m$TRlgD8#$DLalz&DFGTFxJnkg=*A1*k1WpJfpN(JO^++b2yH zKyJ!cETH2dGU_2G=J}!pj6z}x`jsJ|s&g7wt@K-uMC$&$>-)h$*GaMd-!4=@&Gzva zyXIlR$;ooUjcOMsJPLIVt@W3;v`D^?)Joe4A31S zif~KxHCJIY)-if(RM%>IT-kxaXKnK#&3sHSbp(Q zV2#Ad8UAy^@{P-jCX4Jir@=XP=Aq0@vn}8R93Td*6dVko%arg!sX`|$GaB?xMaU3Rr(VyLQF<$|z9L96GslF~$Z~I;OK@)>40%tth4NJy&?9S*k zRRzq`%T_iBQv<=I2(!M2d=duXe&;}lc0wr%}=7WOblv+582EH&;IPg#s5ZsnC& zY=AG$%b~gZ7O(!pMWd7bwQbgWpNbXMj|bmfXF{DnT&_<@5f~r*U}@5=UphR3Y`_z1 z&a-={rLL~V$EbUM3v{UnN2-u+P1^p@BL&qM;`s) z)v%+~R)WgsvR68>c#qC$Ym3bEZIbm^r??`@f>UpFj`$tal}(G1-x(dh3@l1KG2~Us zeP+T?{}XD+9zd7qCZMBPZs4>YLh9qWRUbSxulhPGeuf2;x!%QV{dk^DhrPgz{VXHI zc{_qMCPa8y{Yf6j4QLsW_t{QC2tKv0X0A6M;=Un-jYP2sUTyl~-*jP}uWf7ae-%$o z=>KS%S5leO=(3OGp-b{QcVKNCl#@$wK1}k@zLso6dE+m$kB_?T-?C0B*4uB${wi+w zBb5W@F0e}Z%x&GqX{D(%mUm|{YhoKf#X$@pG0m+FOZvXcXc(30vMsIf{ zfgUd?8DkIF2lZ~LEJ@7%!Mtw}v_;Zo7e;6#YUSS5(&B0vPzCA4e-0Rc61xz+nr-=H ztJ~s0*#TV;fCZ5o zVK1{FoMK$rKzish_~~%l!rP$tbF@pLutGM_mjsPmm%3mpY&<0J10%DaMVT~{P$MxE z=la<~ZsyC;3IBLCu~6Z@b7aRF$Ky|_dgrzM9c{1YmNazUGBr2uhjBu1M?KW3=jSGs z(YScFGvwBZDQ!AqYO2zwgCI%hCeUp67M{l5JZOYtToy^vw^j~T3FH%W0Vv%ik~+na zz1F&92yk--TqG(@8pO&ea&1TAhp(}37zR2F&fSqWsHy(0F-o_Quu=;R^w0||IsBJcP8!Y}xVCWt zWq&>$sXTAU!%Vpd>w!IgBlUDObITyI|L^_sPr2y@&p?>kt)EBRo*-3gTxHy!Nx&|e zO>?4uckTE|BjT6W>HHZ)!bj)`HJ2jftLmn)A< zzVgPp1`b|dmosb4Sb`OP?th;$_wC*J9=2YXJp*D~;q$%ehR3;hfJiFNgk!} zgLHRGGGcDo4fx8Fb2B@BMN#iIkM5qdaWNnhPo&Ltke2VXN?p3+g4v|&-rWDg1%#T9 zx-Mh46e{2gIWSg!$=Pn3wWll3APobH$f}$)$`$5dO1dsy_Ti7ABx?ns#2}R%2`6No z<&dCqsw^Q7&lu_rJV146tkJfBNKV;Tz41h}b@b~Sgb?MevX01^QR0;saS$c%7@6fR zVkJ0&ZJ}{6eLJ6c4zoU>Gv!!PDSVMCT`}iwm%3N@@Lvu!bXZry{5FmHBA%nzX!TzM7iT*Or zQ>trw@w304YbS2jo;6Xw#`Sai+|+pDdJrEhRlm9y1BWiSpnbaw2;AC~-OAuxwrUq! z3G_kBE0vMOokjetVn!aOHBUy?CKROE19pOMBgkbM<{dSw$NsC?kaNL%+>T)=ONlpH z@A;A^l7|25J4}0u%x%R9Z1dSq`l=~$TxK|bC=^}&Uj0R;3mdUZ#qhk+V^e`G)POlY z(*9s2o5Mv-aQFP-)PW@~x43kZRhM%(>k4>Jo=n`$))(%Y zQ=7Fm7E;^Bgss3;?VUUNaGM^`z7QoB$PwbfZ?3%7LEaJ4MD#!|Jj)x-O5rz7 z){el6)0i~!-@q96aWnnrf5|NE?x_+0JRcy`q9&iTj48d)KB!*(TKkJ2DEfo}MaZov zp|@GTTMvi*WZ2{0L>C47GOOvlB%9U-<>lV%oaNUAQVslupw?mxM4mv^M+qOeX>n z4^)Nm*EnVbmi6RQmpS0Wk~!!mW+%c0kC=R(mom+(RU6!zL{t(e!g*LiU?hNkkt{>;#^PcbC`>)r`pI+3utjMl_v%HX_q_X=6h=#h zq_-vg7lw2-&52s1hb$lMS0~PxJ9t8R`FC)m)ZV5;=!N1om8ElRhv;3&7tdJ=K9uX2 zm76&b|1zi0HWBP%-f(88MzWXCG`Ou7X$n@XCZsT!UHp+5no0EMI0B z+1k9?*7tZw=&M@Rg#GBMClSL$r6~*LGwH;})dIy>A1RfcOgtFngwddh7e8~SZWw-< zA-=q-R|`8k2z+mYu-r?6;o=&lHxRcp*1EeQDBrn%Md_HsQk zz4`Qiyy`~CpDJEo^)mEZ#g{2rivhF$DCho*FuzqY3NVOS@;*t4S@yk|bf?fyYhYug zw-dT{;JC2sQfwnTAo!zFcS^OBoh-e#jk_HGc{v*5&U%rAD4#kk`ECw&yT$X8SCscy zvb{bm$Df~h2;Y|$0s2fB=BY}%e!=0ilmkE`+%h?E;_0l_Pza8A$g^}kIJhv@4 zdbR2?=7KgAj{=O)eW1+F3g6$ZeX|NZKqk2vyzKxL`Y)jx%(Y(RIUIWJ;Bfrt?gT&UB*=wdrViOW7|p zJd|q}`L6$HS2#Tah2Yw?epi0Ya}QfGkqtGow89rq*1eZ|Wo~H@+Q!|hf4+{#m$Nf% zdPyevQ(&^kR~&RJ)5Xv(e6vR#f?@u-qc-XOY`|4%E~{QU*mFRo(Q4aTZ{oeHBuS0! z1|RV&3A0v5z$kFx;ks@4{Vna z*&zw2#Qe;qPg1e;#%u}S?UOa?O3}n;!W-gWcrtb3fh`Xud`cnw+Vhi!+B%CLcGKuC zF#eEVYY9C2yNx1I_Grf1RxoUT%!^g(wzfbnWhRSW_h}zFz;*`@V}xEAAVH3lg?B-v!o?;0aJ`G=C-Li0}NV9M2AibnM||OT^lWJ=He+ zZ>cez!qx)Gg%mriG#gZGzU`_RLawq}R-48^+P6)ANn3G}w#@+2oI~5OAjhHa@DZW4 zd(DqC87gq)!;aTTjL1`aVc-Gpd(qJvQR7k+Q@XuvQ}=~Ia1Ge)@5Bag}|Oe{Xj_4}(ZLUj=7IyX+<9`WyQ9T+Xa?R?mGCva)zQ z#1v+b4}Mu%Qhm7?qjHf#(4V}fU-q>(iS~peW4Nd^k*NU>B%9qWDCv0?)%lTnD#Am# zd5{^EMVL7FsxZbmzWqwlcH5BD;5LJ)*V-I+C_&{TZd48;X+?P9Ia@Gl`&`tzU&qD! zsFTTKe-&9FqgR;2>){W%A&TnO#}Lt-XLB=lr3kLw&9o)i!5#z7xo5y6zs^$aEWD;m zl_R=|Kqsy7pidL837sGB^miI!cYe){r97bdpGxAa(gg#oX+Bce6Ru^N(h3KXH91u2 zl_RM693*c!e$A}OKQa)YWDh^uJS%d+Y#%JRT{!V68;&cG_KT+FCL_%xae^5QJqgw( z^W#>&yNC3)?s;Gw+(nx7jF8`UQ{;#dCmoEHMl(6-xUd8z|%GScY0Ugqs`Eppg zr*}UqMT_IyFrmTOwuDD+A@*_VuulsSmLrgUUpl3UKl^$5Nd+0!mo-1_kYmtnIjuGt z=UZ9A${Pz}L|b2D%cp==w}gFXEeXXEa~4IIBh&BT(jZtSW7_W>-~j|r(Y~4m_$}5= z4VI3G??04tz3UY?Dw``FT@2xs&x1y%Lo!h<;b3{>U9Jj zull}ex)GS=F}=qfiwzEwB)=tyK_C~AA^1f(p1)XhYQNtNeXq#G$naVBp)m(N!I)ZSI=1Ljw1PVY(VU_7LI8=zj>2YMo z@d$>g>lB6Z>dIhgaRoRbEw^0>pJMvxbI-9DOLfwTuJE>0q%6QDYFMPdtC~4@c|Pnu-8uo(N;xCTd@~)1|Gjx=sJ%QQ)EA0@c}?|Lg^Kx zuc|5ykUx;RU$@{y`|F(TG&N4Dr^l;@NxVJpTASqGnRu@k&NVKqqPjRu7fY#fsUx`w z)!KyE8Q0r4KoR;3eRzlR6gU6u$Z$}LVtz$) zLH?2@<*hbVitW3C9_F?=V3ZfhiRDJ_0`L#!O=%DfwhIP47(=9dX>+1Rf=#;Ep9eYSSb9RR+G>ew2P{1iG|0LDAct2K)!rO&S zpo9i>N*ymBPV=NXX0pC0JTAg>|-u017&{S-=v0Fog?^ohq3^b5tz(UIdnH zM{+M}4!>75fT|jJj$)-L{4~kDc0a-?1pEL0Wp0O8gM`LcP+E(ATeVe`I1xYkU;StO z-p%oUxPbp`Pn~8~A$FRzA65-Zk1qP0wy(Sf6mzuTuFX2L3*;!YogQy5JI`Ty)?`;& z?kUunt&x-4i@mjNbGTNNh&P$+Fl{ zb9qqKCc2|Mb9E8GV%r}J|J1CM%mu@lcwQZG`M6r~eUMDP!UuM;sn7{Ke#(ywHzWb5^IU30 z^O4k+Sx>HkixHo+JLjS+P#372B)b-*t;E0EChj)30=9lzv#*R$%S|bmeV6fV>w3j^Cj37Me~x`q7F7$3%0sn!@OPdHyUI$at4q1+{B{6~G% zHzl%6N~8~S=fs0hbDOM%6nFfZ1TSYNiXR#Lquk#Xg)g*Xg|5qN3&9l#n@D-01Wucc z3&Ru}R5%Wpakd(_k!)OI<)^yb9SwbdL#y$HKp%QcbuRbc`pzVYMJR@kF@0Gh947UhY-HXfIf0)@UNH5sEohuC97Y$*!F9f`HS}fCH=a=FeMvs3SBy51-6F|GP>ayPVTL=5t_%i*S)*g!~6=I)!l;qIud6F0DdzIy2IVo7yI~ze#%tU!`=qmNp02)hrB8HEevq0k-H~ zg6H@(Z?KQ;nL&*hrIM~n6S<>I3k5O=rT>8#5j}5N3QwWH2dtpHim`eZjqJ1XI>5^O zXYuy&pG^D{6)BQ04A{NG>$9@?`-~Iw4|!sZ8Nr`H&LkmNZ^gOFZ_~%Hfx-PA2Ms~L z@9LC6=T_~kk171usyol$F%J#|PM=0RB4#n;YmvgO(X>T>7$S_G{-btU{^O@G{`^vN zvttAW^rleV`dV!t091eM3 zY#*_5yv()MH3?r{J2iT8zClFJ`ZDFanNA$ql)C4aSyQb6-}*NZf-`uuqP`M$bya$sdw=y@@@5dZ@(}O7yJa^?=}YwWN&JD-Tm~G|hNE)$ z9~aVpU7Q+;poHipy&#%Zr+57CpI-m--y@zIIeE%N(BNB6;q-O)_utxAOCCKre4nGV0y!-s2m(xx-OBK6ebo7*2yx~&4*WD&_SCZYeF;9xMRU|#El-ngr=;V zf(WY0vPW@bd~{goLjDZt_OwR6jwwlK{E~VTq0>La8+V`M4Yx?@%*0TfGj{9*BWCWX zstCEF2;qasF&x%w>-s(3_KQlT_H*L&sel&Ov0QbF9)z2Cq2FfWCyKtK=j;<{3zjdBbPsV;BX zIj79edSh+s(07Kv4Xdv6Lp%e>wn_dXa1sD@79U+Odj`ZV0BBHZnj*HqZYu>@4#TCo z0icvH6n)y6ZXeeT8mB)G!Q|8_B!zKs3J9xpo&!RD7g&ls4BeGe&H8~G`Icr2k@cXs zfmmcsvtOwYfGzv#6qk)cCHibvy9cRhLrJn3NhldSr57vE3Ixz zT=pp&GEqG9I%cnF5II%-Vk{^3U$()mS~dXtIYJ`xYfz*_*7LL*fwQwVZQwYtxK3FT z5O_s|PfgUKO`*_I&=J;imP9dsf=3OA7`2Erl=%skIh_1aeulo^{xenrtAn4Ua~$V# z2a?*weT=_R{x*7Nn+okk?hL)Xg?b zAzE(xEXzJLU|o6kz3I&pNeEz#}?O3-R*0j!%M06 zrb7A_C?yeRq(RiF6kW)Vh^qd4{TW}fy0xyz7RuHe?_==McRI@QswPL`lGat2hJsYO ziV6Kf)B8k2J!S8eSrs6U5yckDqap@{2Ww?a%~^dt?j(gsDydF5K`|SAYk%kZzyFtY zznKQYnLgX1e%AN1<)1k;hKS&u`VlnKMckZQc{@*WYIshfzq(_?r>;Rft)<@eL?GqO zG*{bgixlpSDxg$a_&dkXpKdN(j~s_WTUsaYypPyY`1|ZNOB3PIBz3bl0ws)}NiSwd z*~;GnVQ0QNt*`6D`9AH}=dr=I_P-`@U!|pe=)C*&%*Y)3R_6`=3X9Pl-Uf`CYkNaL z9UPU(iQ}|uPutEO$m}$|1_(B1p)@!JkI&m3jWXqO)&xKD*;R0JQm)vjo@Y&{>`ot} zShc!8S^mJ7QXe1v0nTTrWi%w5g1PEQ3U^kc4{klbu8c>K*lR#bOSh9^&R|ApUG)Yg z!rOExIlZ@uIgltAB{p|S}kDC~QK|(6Y%oXD_ zW4akqZOeptS=HJB1M?erT+pn|`?9bH&nK2FZs_4R74F$e`B}TU@VYimr4%)oA>j#L zRc@T}o$CHQ+#;HgZ?SFi8P-goyU{KQr{etiy(&t6&GnmADmW5orP!%o#$jW>&l~li z-f+YJcf}T@Z8rz&F=_A|9F8#|*6HDH`-QoaEz>KYa}VB9VZuY9m@Ir2=V{jFs^orO zeb1QTwIg!c7Xl3wfoAC7@*e1to)JOtLv4GN>F0}avOaFr&-6GZb6X9uKQt5^#Srfa zz7Gl7s1gi~TVTT(b}!|y=iNdIub&k<=fQu1V5oIohj_l89X18nUhCN23Sw%nF%OK- z>-g-D`9e$O?8;&`v=Q^X%J!G z1`=4cQGkNA=c{3WGHl>iD?Mk9&mNKE)|sJYzs=akif(r+Yf^E4-P9jP7M6)xrfY$DZG>b4Z5hVF*VoJ#7Acsz*}nCevP(? z5n0cW;{uZx6c@@?iU`)x~{k1BG0^7yZSn$$2HSrtFH40ETQ}xDRbjX z{UQ<}vIqhHIZw9(M3=NkK#F{&8R3YD_BK|q2wU7c4ia>O7?OKU*AU*#Ui}vsBG_OT zw;syM2pjHvNMm3~&rJ0mihyd7CAF$i?nBQTYY_T>Ys(fB&+vm99R40rf@YSg)s}MX{PP(Ji~Ol?Ovep z;(->WVegTsdtU!B5_qQRsk`FUpxlw^Ss7wVAHr2joIzb$wIyL_sQLNxTFbvHj&KD6 zuciMRbUDbG8$Sg2$+50*-TrqqLy8YLQnwGr{MM&+EYSFBK(I%%!nHSv%_sQizJ=7_ zjzEL{ApGkaOq@ne{i>>k++$u?A!pz2hO!M&p8msO5GFc19 ze@IGuFuflLhxkW?N`6ceI)FDkKVHfnAhy_?XH_86t99mzpz8GCl?WMRov?pPLqB^z zEGjt6Ci63|k?wY_ym!x=MY`Z;Ymd6Ym(4HR#DLCLwf3U8s5K#yH_`MZHE?hh2kTC+ zV)bsHSg$PfM?{O*wsy@nPznF z&y9!&6H80^L0Iu-(~8CiL)YqC2-8uan(a90LmyYRsZv&jIx{YBb&w}=SSlp*t;O9= zyH&ezQTwxCXF@l+58U^^^A9=UdOKeL3LVQ;v6#zVoxTcDU&##nzH@)m>T*M&?a(kJvaVA*@IL0@f@= z#9HRB7fz)?@Rn56e6wr9?~2NyLR+=E6%6ZC!?Vpd>r2J2GZP!;%9z?RykrURkQ6W;!|r3Y*V_Iw?Qe{4#bK*%uNNyW zpRZK;edn2ul?B;{_nRct6Bxi2yR^Va@MRV3p3AlAdyPVMv5SJTN}|nN`FGRGcF0C6 z@s*cz8`h+&T0>{$$Yx_3R?k!42Hyb|lxW2tVl`-fM4IUhjr}9s--iZt$AJVJUGZis z5Tx#YEiLf8VQUuV+DQ%NEIT(`VZemPmY+x*nbp;R8Ku*w3QSceb&6; z+mEmP_1GCpk(+a$sB4|9Rp{l*!n~rfFZla>>*Qyv`(>?h(|#xDZh6p=S7`9aJrcqI zBdJ*7VyUUM_JSUwc2-+YsWZ2MA->R|Y+bI94LAPBzJJZ4^A9fX zU`0M+s-V$h~_53m{i-=*un5m|jVN9B`9TQ{Kt>GOZLmZJUt+%is1 zFbk8j!@FzYjZb$UF08dEEeVo2)2-->l`p-r(#MNX#t|6JDz&cqBqM%E3{t2ps_03+ zQ=STrE)_$2+wfkc9chb-GhUle+D6TUay}Shhu{k7z6TU#H{b=O+psva0~SaIC84j6 zn@O!#L%U>UuAkLYI}JKa++D zM@f|Xm9$@xCaW}0f#l+$Z(<;#`a9bLPgE6!I|CrTGso1o!7fQo4n$NyglC75sZy!Q z(>&6fM=7!~Cs>zNyS!B|q9xvd#Gl;*_!{To$zl?yNH#Em2v^PTW44 z*Pf-V_!IG&4XnR5jafjau=lTTIw4S-z^|6VuoGlmE->eZ3D?wCtnQ-TccUoubQ&v) zmEu*um;@5L`S zr$)$y-ZI4?bCwYJOrb0^K~TyTR2r0@{;-S16?1hX`{8G{`9o~Fet-lc z(tUYM>wLmWb$!)5?W~48dPLi4LAu>*>vSX&qAU%P7;DOWNw)jfN1H|Q0K+JY_8&C0 z&2+1dO@LQ+tv@!|+9dD&kC^)3{g~q8-9ci$eC(;T!91{n`*gDrJ2e~WXl#6QgcP=-?rX+$HncZ`N`e~rv^WklIu-0=U8F* z?edJ?AzeghK z$>brlF0U97QiV=yVI)(ZuGgc}^7-mj6(x#iReldxTG83|=6%hur0up$Wm}v*y<$sj zs(_z87x8M3hSd#?`@G#VHq}1rMy%$J?iUM4MoRdTENth;!{lnSLMXn$qj+;V7v0-; zCdktXizTnavf#w8cu>CJ;=DXYnEXlCEVQlg=SMGkrYp9U_73IhsgXk85}ra#-r0m9 zzrxbhlX+v{@rUq(_(zF%>vcQ-!*TuB#bOSzOr6Cdyt3{;t)-CmEAw^jn}$G$`n=Bi zoRe;}_@c~x(h4CQEU4eiK&Mu_b7zPww%8?rSBdYhnk zlW-w+Y1KgO=1M@xv;mnVVss_jj@lKDG+lOB>m?s1O{i;mO(;PPf2Mw85k0^VNs>AP@H3FpZvBqD-~FkH3a zP$(zbbNdhG{q;Oed^twxUs+%xm5UaN{e^tQPEmHA-rZz*EQ~me05Rox9XoAv-L-30 zbX8~4?L(n!6%f02$I?c;&qKf0 zzb?+?BA@;X)Oysp>$o90p#A+oGCCd5sZ<&b^Zx1i2a+P zM)n8LyLpS4I2h}X=zZx@AMNEZ1;p>mGg{g*ZSO!Sze{Qc6j%UqBm0kDEib=s#C_rF zb2CJBOh!dlA@F?AYkLDq_pFvW)=be`yJRHq*KTTj23Oq}0(dt=c=k?{d$i5v1|u1h zQU^lX79139v`l!j{r5#ChCi5iGs$CJfV9n&TZ?^$VodYC(P~Ri0E~t4sq6a(=km`J zX1>%O`5HeblXX5%XVm(A0D0dyr-Dn#fsi1aYUK+M1e4TBq1WqyLlLTT%*0%{P6~%a zn!PeVpD)Gm{D_oxGd-ZECVG=>uRIwVRC4Pfj9OSy*>K7KgJj^Y-0sS%IGK<7!|GKu zt_w&pkvPwb_K|-KJeUW`(k+p7?&;JJq%^{3w7bej zu~KWr&h}cTK*S*4BFCWpOmJbp*ix8~j?Opc_fA$*!Ax^KR1rfbYwQt|P8@*O6UMuu znr*hd=<%|ESb0T4dmpZrSvv({h>Jy4?Ph-XuZmq$jCxCas*=h_0meb*d$6EuosapE z%zRLh?{l%B-&*XWMs9nAp zxumi5V62seqZX&r4-rq3T*pV|qjQ;47Z#J4nL)R#5poXT3ccZ2>$*_`L+J3Tm7?md z>GXX`JYTKdMC>1bo_U|xWns(;ZuB{;LvEad-Kz^8iq3|?LAyP-`U#K0?(YSutilc2 z%>H-pq}_oTK}QY$p~e0e)nDg;0;AlnJ6*RGU-{o0nh?)xp}Ty_2r$p|g{5k+FNgI_Ljz4evfek#D^wunqZ_Jc|MXhTRL}2YqR6g zXcK~6lr<8T)8mA2DW@z+Ie=q86-#+=h_r9;2J#j^Fs)tk{jSBk*W!S`{TVFi<0Kl+ zXbi*}(ArlAs~9DiLGa_q_5hE{=@HmKHgACk^_H2Xk80RpM*E(Nz|LwOmM)z9%^eLj9()S%aSUBzf5^T) zCw&SRrv6aL`i+I}%o#s`VEC;Z{_VL7`ri-Wy+o+1ZNwkQk@pOh0=qJ!1|+7Xbl$sA}D*(0dS1yg8;!PM&Lgb(UIY z>-c@4lD*N4MU1NTv9-7Yc)pN{%(~*>JM+a{gO=Z==6k0-LGG8tR#zZHE+pH3Vm<^Q zLqmf*UBt_zCnvh$)}cQuE6uBcxJf}l8IHt9GTh#6rH#=2#gu?b4_Yl!SdFR`0gj~S z+Ftccp0#i|>i zbAkj{G=k2eUacJrm+2{fG5bFK?n*`J(h|<2I}Uc$4~IMV@6sWOcyd$<31r;-w)_qy zN4mBy*<}^pJ}T&FT`c!A|L`9!K)Tzh#r&!g2i|Bj`E9M!SH@g^gPw}>tz^ymp3AU# z_jfAXeX1hPk*xDyh&xm+;nd>k8@|;6%c^Th`qUQ?V`5bgoSOB8$Af8@P=rw0`kR792vHLV4*_W;l+0b0IGZUQ=h*&8g68()NSzg&27VMV<_PbtNr#oYm#Qh8M?((eNh) zpy&Hy7SCn_+hU`-rP*tM0wO@`BF5+8K5^*8GsG01&EN<>68m9zfo)m3CFe>{OXLDQ z{WBnopI>SJq{U2IVr!=PfpxvkjHA%M#g}nsOjK7ag%mC7+EA4#nCvU(S2E)J0>>g4 zJG0;>8^{OpR>#Bu$HJG%$>)Ag&>PZ_KK4WR5OG(Tvb!j~$XWyjT|9L8g7;3GVeCmQ zrqo-C?VW{yMJe+FPTx36AD;PNx;T*n@U>a`O5GLlhK{kzt7z~&mOpkZnyj2Q#Kpc= zuA-DHK}-8JrpZ46ZKaNwf!o1n%;!NOImDlL=-y^u*SLeA%xROS<%Fbm4MU2{0YZzqMwxDLW<-kyf2v-4+W>J%^7BZtiqCPV`NsJkugAnN`bFzm|QSh-vQ@ zpdA~eeiiDk-`o-p!IQBP(jr2U^n5E{PJpe@FBP-8XDS~=!zD;!H1b#z5DNR;aAAY9+}Q#K8; zNGD*y-+1DIQTbv?LHF`L17Tj0%wmjoP3Feop)vCSUrQ15;m#*ui-y)3>G~dVQtiB3 zRgeTwc2S+Wv1%barbznjL)0G$Fml5b;d?7PUivc6pRJWyzi=jk`T`FheTQ(mQoOg6 zH#V6qc?DT%i{>r#p$<(y*%bs=pIep*_aBRe1`8T{fOv)=?t%M4=L-C(G@af<&er2I z@0V$T{-^ZGtj%#HRth9tN(F;6Rh@`8@3}}Sl18}f9_~lh^teVUd#o?X`65OQ03XX{ z__qv=9{DaWkk9qqZw5_QShvjy30DNUQ(14`VC5$Lzuz@G6dz&d1F5zspZ^&Q1;z#( zF|V8uXCbD!8MJ~tE1TPNw)rcS+fBx)S+~)0fXJBmWa@Pg{bmgM_fhK-^eN#Vfs!P3 zSa*Sufw#ez@2j1~E2F5n6rn1ZPNIEOwm4I4HU~e$in0fO#cxHzdfX$_g~hQNWxhAO z=YrmSvoFNUo0Lo=n_?$4#JrFqZ&M}w`pOidXaBmjSz%2|9^KInZ_JEUf16t@(1LCv z&1lT}F=pRLrUuPzK`o21eXyZNv%D!+{PF?`znfsJMqD|V3Yz?l1uv{9NDZIOeez?R z{9$-z(Itn9tRD51L`jFX$Prf&)vO7=5*$WSCu$e)r9TUpYa8fde1Xh}3=E)YchuPA`lRxyvZ&RP_@uBCII-X<~&R z_}LU=zFuabU%KFmnAUokA{o&4(-AJ98XFfJBF_o{QJT0wy5^P{D`NJD5|Quym?_RI zyWM zV5@YKrqX6Js}||AIQ^>{11csiHt;yzk#qGa9#Yihxg_3uPWIGlu4)!rs%z=gRl)U^ zou~f%0E~l?PV{rpJ3vFDCNQM!?N4S4s+8@JwZf;+?QlT1v3kG}qY*>D@y7j3#@E_( zT=W)5x6~oymkZzHT-yw0E^v0@e3FS#h-vB+`-HCmbtiPgfwEI|5`E$+#8o{Yc>n{L zid<~)P0@pT7WO)^PEJS#$HqpwQW3imb2s^&I^$H|R+?xo=BHBG|D|qVzgV=g>)&vK z(n%eiXrQtktF5)-l__3@2`#hc>7vw6XoWzL^XgckstNiYU%)7qDP4TFYT0IKFb=P7 zb1;ybn!c)TQEMO63Q_9zBoZg4l7N53F;B4{F!j;6!}+TJa(mV>_0=jQ zG_1-XX5LMvl9QKQG+uBmzxDUj* zf~%}AJ;5GIx)g4KQJyg-$rWB|(9<1Uokxg-VB&y(?^=uKdcDxq9Z_bBl{gF_sonIJ zl1;|&N%mb}Uf8+fV>&i;d?g+D`|Uj^scjoXa`!I!gmMwvS01G?6dx>CeM|9KX92Jl zsIRu~JYU$#NM}k5VQyVKdkbk6l`S{DHuq>L&W3|tX@4M2M!G$e3XKvr3HQ(^1#CEv za*d5!pOtbmbM#Fp?ehQ!v;rG5Z9u^nhsliV%Q~}Mz|ZeRwQ8?1`iUkVc4Tl$cOsB| zD32eGf`#0#q7GyA4I(Uec#UkXve^{1W5f+Zt1XA^6XTq64O!_8^U_eSJO+7LgH~ROQh9 z?&m>1*!cy5<1OFFFe0zGaoxiIk2jV8ZR`rcx9$hFf5rKeu|2V?Jvk~ zEc0rc&6;i8Z^;|!_UoJIZ5D0&OxS9K(`FUQI-GROl)jY+#4li<8+dl9+Z|ay-Hi__ zv*}2<{eR1@G0NqgABI#5mgoPJU8ID7Bk;-%v9gKr%g5;Lo4dEpbp)7Jk?GY2|f zuoaHS3k@wje-80;szV%cI~}T|kWmWPbM9lpNhX@gXo5;P^miSqI)Xo3jD%g`+r^mN z6$^d@F2WYOqqWi);ogb>OHm?zZkZJU}$~W7??h&_w)FXyM-txsLb{V|LweGo9%fQ@Zsu5 z>rzU#7H2<>DXHLJ9GMZRvmzopuflbsg4Y39;wLrm@aR(%CZbp0N*!YlT^2~Hz>`Ts zIcN1b1TLv4;^_phjMAh71D*bGDnhAUP^Yt$oJ^j|we@e~%FW-p_CaE-;a_Lmnd5Fl;x?`1;a>7;H*M{=Zv$*uxXR{i zLiMfjTxjhzwp|Zhu#!otWMK&$7n^51OG?FI>3Q?X6~xtl5A=(Ne7Q_#h(Qf-&@CTD z-EdrF)iCKRET-Qozj>I41b&@}IKqrsdU)lzCLZMYJuKw%CW%ENrK^?0qJNCXrgNJB z_+sgZovOzy9@CQcz2m&FHOvSBq6AZq^F5WVKbg5|1@osfi?;Iduhl#cWPW#1R4!sw z_YJir4S5BEyKGiMOhX=|62N{j_iYtyOWi%a?m!POmo~)oYKuot%qFXKXH@W^ruKnh(iz|?~ zALZU01cJZyi7oZ%CjTUBs1xqwqaBRddH=&~KWbuEsAmc#!0>E)t^jsY_>e0F+V$h- z#8REi!o^M^CvXbLm*hw{VNaz|FyEaLQk9px;swWuy9z>AN-lW695jVE?yd5TP?Di6 zFSmtoR~U95B(ZL2_*QsqJ$g1fJsUh;Ud^7xaWDUiS@FRT_Ix03EF{E*~7Ahiq^@5+c1LF!!pZ#1)B1Lw;aq=BCoK%Jh)G9eb$Tg6(;| zTnW&1J9VFE+a#H8RM`;PZiNvKb_pEqT&T^m8u4Q2|89U2{9g)BhXXUJrN(S~+W#hg zV8pjSz{dQ;H@+x_zlT`Kmi?|K61-JsGsgp;EyXp&onuPZF`e9e_5PsMcK5od|8S^k zmwcB?K&kGb>_{tD8?!>*$}PU zo~$ct{$l8%1lyHRAwm(FvJ5d}c?3g5@z9X-m{BOBvH0*b)*Xj6L0*{f0a?odT%!SK zVP=FHYAB;uQT_IJ4OLkUXYo2^w1`kfli~53&^h6S-r&Kc_3WnudxL*+6)nMSzH6S3 zr*}JNEt$`6{V(DuH(32I$(}o7{DNLpF}#mgN}0WF56?HJFAwcEXD5EQNRM~U!d)-V z8j|mGaYAcleJ4%KgxWe~m z&bNDVtQ!fl%l}gC+afM@Sl4sD*LyvYV5z3GW7p7;q zmoVkW$d}M;vVX^gCWGa*RXS_aL>*&=2&UqtUkBETLV&yg=sofK;R$@ocSZ(Ffp28i zyJ$0+>FKn5QhjAYD!z4b%*0932fn{qAYV2=CCb$<9b(+q(R!6XOn{NkJzmFJY@9=c zH}k`Ddej#lQZn|>IbV%ESZuahK~~F!P8Y6z6iIo%k!NDRp>3Kxm$ZiWvNN&did}ob zacl;w?OHIsKJ`^8qSa!Pvo|jG3NbwdpVt2T6s(X)TqH=hf57UpzvH+n?mf`0ojV{S zWu*G_F?Cpm#?m&s(=Fr`atsPaTWb8Spo*|RU?zn_t<$egkfHR&K&iv)*UTeB;sMjA zVQZloOEZ~j&foEx0@M9`@UW=KMyz(N%T6bIzg>YACWU{X)B3tQz1Em z#)ai97;)}`rWHA`OL*L(#FP)_2rsObWucwc`)c1%BwD_;`MWMk#a8}9=u^S1;0`)G z$^_0v9lDA2NX#H-A43y zH$(o!RP>)|Z)-U(?AoVG0<=I7Q{mg1@h3)`q{nlL!e@D`RIdundRzaQD3bY>j$MtJyf6si5?ZX(qyIfR+#2U*XI?mV)KMZ+a=Ku#P*E@-hXoMrI%?NaYH z*{p2rUV4Y(tCRpU^ZSMiA)I<0d%P+s8!oebw^r|Oc_h7=Y+o0p-)3KlCfI-*xPFA( zYw{`|omc`fbIhdJy-pgVT=6PGMrddo*xmg*e;$%Du+_2b{}#MH2STt4@Q!*`hf_qC%wlI6=*7+Nc4Z{$+xfdeF9(0L(KcrUVXp&npO-7{;JPzG-A{LsdqYpbQ%WOWq!s@og~!#ay0gyN72FqsXQ`vM_-9r_PkjHo8m%)e)|Q`bK5KN3 zwfE1VnayD@r*VX5Nvs2-7p!ace)o78-bc30Ue9>T&DUSPuw1j*Cu(!0e;4R_UgwJj zG`T&=K300FE>5|ZO4Stj|I<4{>H3?}gLHkH9bhVT{Qr^l*I`Y^kJmpgf+9$WNXI}X zC@CP_paM#VbVx{!?wYjH-7rc4iO~%sq>+$jz-W-}!N%Bk@B4Ru?)&$BfB)dmaa~+o zdp%#za~|iM6q-YZJ%=KgpjKc&CFiSBmptc)G{sHv=% z!f1X+1;0N}F!|2!(+p@d+MN`^vck$IlADS(MmC~e+E;mIlW4)28c|_el}%OPv4Z-_xDy;4=l2D|C2psO=C(qrlj zIgp0t0625iQV>1i&QaIq3VLG28}Ji}h+n{vf8OaPh*Vsf2v(uQBtfZIMv?Qh-78Qi-tnAzU6e7PCnx@^nL z-3}7;^ZY|wC<{eSjzKsI4YDBKZoA578D)Wb!5G>G)hbXq)6ih5WgJq)!~yr$$VP%< zO(B+-tt`=b#oWVo*~A}5vp-D>w;U;)&FeS5C=0m2L-G$==w1G_RC?Si0M~0)#hJG) zJKe=UXM3mjzFO7rCVlkp_0+V+*^EF;(fbH8G&_;m22hiHgiHM?aFS>4yeeLzh zezu{EO#I)M`3no>1tX3GWc{hzt)k#2BA5_u@*6t>n+$Z=Lj7d@UITDL=U; zaJO$bJk{cafN9CxCdyT{pj$u&ez)SeQ-cA(ND#C7(@pv~p?iniznUz1znTgt;}#e~ zq7X`p_%mInRxig2V3;0Ia9*gRV8eTSKhM#>bO}K!e~_6huefYKzLaiY^&g(?p;bpH z(!a^K>UddtO#SDXBRk4Uxz&v0R_`7!z;qxxop;s78TK90dCGa4jUI>HJv8+}OPaR2 z;6eB9?ntqXu$A~KTN%@-hR-U;EsrI3j=EPOj|R$cKP!=du1s>7Z*_p1*GEr|{4Us< z_fH30j=smQcgD+vqw{|)v-AE{8s%m6w(m`X-Cnov<6VQgGvRPmcJLbaHB}Tvj@k3)!i(Y>iDwt zb2I#t%lm0Lp6I{JEHmR1KxeM z_lO9FY!ky5rS}*A+?|zVuu8L(|2l6V|7T&WIZ|%s&x$d$AT#>Iv+wW42RW6}uCZoC z>9fC~=dg>JfSaDsQf2LHwd~axkD~VH0KM%J9PZu}3;#tabA2&K%LQ>&Eedb{Z%R27 zM=2ZQycrEmxztF#lCFcJdVR@-v2@rQRGF16X zf%&rQbzz-Vm(P7~7CDXQBjI?~z2Wp?bD1;rI7c(MNIp2c2PEhOSAW%5il_}`+JP`mr2GC$<$sYKYM5Jj`B$Lk-l7l5@91cu{!4}cX6z^I3TZ%hI(X15~O z!?0@`R`eoP^`Z^?%V|Z>aX68PHKs?G1uNDZZDQ_dLIxdU?ak(}E2Fnu+BZojPDPoM5} zU$=cMg~Y(^{hh>VvG}f`8)MwShOjE7E6$ii&C&bjlE6Vdjk;g%fC(i0xI`UrjbFJx zW4mCZBOo#5fdyG(bpJ_Gq*x*em>S;y+BqQ)_UWy=n?GqsOBpMvA2zuYnqY=LQhkxU zP~(1p@N!}he%_MB=AmyYrt!(75Re zv9e1Z)0IwhfKn)X8+|@V-{kD9S?YH}`gPgc>tvS6{o*5Dx(Xn{QB>sBWR2yAD%UI@ z+qbD2zLd;O`YovM0?Q?F&~#~}>L>Tc+|LDe22@S6)$NU=divCJ`M233gO~a^7(Id8 z)jZ$c=(E|+h#TA{fQ4nITv}t5aY8r;9eQj(d{T}&kZPgC7f!bsVQNsn;uYZ=%I(#l zp4tLx4irofxvFdgh8{NT#5#GHCFUaqo&bBdi)oVb4^vGa%vh>JC@4;z3!?jPUT%k=*wbdyT+ zoavutp*u|oU+k|QOWCwXyf{shD6y1{bpM>Ne+y45uHORESq5YF{J66=jBC00u7@d(zg zoU5pZZGX8rq5dMgiX;^@IM)3c7pr<-^6hh_LT2kWpawQ)XR+k3y^TH0!MFCM?60OL zv9UB-zEc_0$#29ciVvPaF$^=`xC50?dlP=<@A!u)4Gtvr5GDPAv9}B4$_b5d&xbiwLv`eY13)c~y&NrN;^hw4dORTBWHyg5;wwy~Gu!)c6&2jP?IV3z%!x z+jehv$B3^q`#q5HKj&#j9r?EV-Vm>dN&bE(#ezsTS&<0cK49{z29u9TUzkf)%OGn8 zPEI%=J(lA^^zr-t1AKu;bw1aW>KlpbV8-~sqp9oNbm_==@ZreybW>-AMCQY&N3D28?02zVPmhP{-`)ogN~v=jx6D(9cV4v&y zhglFcc@T;&$L~6bF*j>HSL}2No_;#V*B%G+JJk(14%fq-J?$}ih~}@4X^^g$E^*=8 zWLrS(1O|Z>R9hA=_~A$CSLtnMAa9HR z1~ct(V5VUg+~>c*OiXStmtJ+WgWgfw*{p=Ri!|7lLx{&6VyxpThv)a&`GY16i}BaB z+Q>^@VIMDE^U~`4o`@*MgGB57M%r8j%?C_we9IcIUBRX1YxjwDu1h<6AjD!n*NR>X z(1j^51V(=46zUjIIjiK)U;o&>xY9?3HdLswRcTuc12LxCy(=nI?Jd5+vnHc&Gy3HK zeVV#mL7Rh5lv2g~ajWDK+Q%nwwsxP82D<)7WTnS_9QGB^dGh@3sxSSd=d!%n&5!(F zO{6PoL4CcKGhYflj(uc?sRMt9V#%?@unIzq8OjFxX#8&Nc*7EQ>2Upx*qJ;K!_|!C zGV3vcph?ugS9CePS9AwurH#n%9Iw&8lSMDfI9#{2$5$^nAirDqB%^V`a{twGSPYH? z+4s4XK=f?Du6QJGj9_s#cl(HbZP>Yy52^`w&S7Sq*X`DZ%+O@a7}VV9Dvfl!zx4U5 zrK^i%TV}s|b6)Cem3>e7$`h`8;LaO;O)LFeJAA8^=f~?k4Ik&t7*|UnmQ|M-T;wL% z-3tVNtRB{riobwqcaM@|>pp1t7C!$14@ssDe6G_&30e*L36B7OWBIrf)N$s-ta`tm z%wUU)ETA55+VlAj9U0oBWc&D1z2R^Jc(RW72O~ANKSuIT-`-b_Ax~mu6Qfon!I`k_ z-Tkh5vZrDZdtbS)8bIQ>pjkp+TyZvk1Wx{!f-Opy!8{+9E&t-}kbSz)Lz++!!>?3T z`UgkNgU7>xR`;OEJC6Wj@6_y7egduEdrqPpNIN)gds%G_eW2HT_@$lYCMj!3!tr1o zz?&bCsBY!2WcvX)po#!EUg*>YWv$z_G2GfFO=8E}kFnhi2WCx@(#!%jc@Ck@;h zeVMOPe(~izVk=@p;MeHI7nZp@_1YR3gN9zRL5^VYXmm-B2+ImBvd%e)-TKe1bR|*| z9_Df(e-|cRM3p{pMQdL;hA%$2ap%b4nzJ2iySoLT>UL9^Adn$tirB=E?rH2i&-cv3W+XF7(o$k`Jgn#FKhpS9b`fVKIYzf)) zlS~>o5N0U8xc^H0rTUq=n-F1kEJ(?)K4d2$F=ep=$}Q!$HSpoAnQ6!e7D|Q|blktw z0NekmbHrWoE1sk<&elyb#B~+dw2S;kmURm(sxEPP`(X{0g7TM4a`{{}$$uj{{FtC- ztub>|racUVb1tR`^{QQIf9!>w2XZO=UoZK397kSPq%_7(^7dwYqlPbt0)QD#Kb=qS z{1z#V6qCGO7+(*zxy)T#7$*oknSyk8K(5~$1)=QzgU1E^OLy6;8K^!_RDA8fyLKWn zi45IVK(Z}^0qo?`kKjvax|{TI!pr52L|lql`sXn- zR|;UWwmZCiUOqNwW#0m6e80fseJh8HzrkaEC6|Uh2*R@CVheMtQ(%#dLFu!>;T_tP z>c%pMU#1A%FPzD#kk!a+yM2;y>Y(L0e#0+q6+TRgvkm4359*=y_`}|+14YNWv%Uf2 zL-l%)Y0W<*X2-KeX?0cx9qthrc9*i_nW=hx>Bc44m8Lm12Dfy7we){8=eVeo(QAA- z`Kgi1WFxEd|4&{6#q*dh#PCu)3VFTK_OG*O9aHMi*4;`PdilY6DybEjMt z#b+S7$BOvDQs|?5P=+~#X6a-S16hB8bYq?b3L&{ueEegR<>=aMr#v5Xr@6oRZhOhX zK#bbmeWVx}Iq6+Um=&qL-ZSahem!P%y%H_cjWi9SkmLsT;!aEWYtVRci>n9h?Rk@4Zms4$`;{NoC-ndV-9d*g~$*zFO zrs5@Iv|$&bM;DOe+mt9Tvuj3a6qi{)N6@9w^?~!9I5W0i?_@U}_Kh5TY9M)$slK|T z2pHI`YIE7de#qZHU4%QYH;9-Ha6w@adWZmgXEVuoE)u0b394Pm(Ui2f19yf?6C7-I#9YSn3b>JzK*y7 zzE8g#5ucNtOpFn7&`l9Ouq(oBIuNhH9N~YUU_JE0sEL_Uin^&$$2k5J!KY7OPtOyWYcu}qo5eG zA8T1^qCUcfvx<|tlL&kn3nrq`QNI^)0eW~#d8r$;Lyj7(tCr?<=wRxV5{@F;Nr}@3DiOx(S81liMNWYj-dqlVA z+T&?7P|lvZSfUB%@(YQlJp9BIC)g-OG*B7W#JJI{K9iJHqyeAlKg<$24@#K#Hff*J zHA~Zr0hPyCRbMUe_)j~qg!$Dhu|(&-9sHi??54_dT)*9UB#?9z`cwj3O>zgUUZ};DNYAS;zTlw38Y@36wWieALAjs90y~&U==OoOi3yzbFqkT*Q zc8xE9dPn+{WK6n%@CM-ftOVdoQWCbH5O01~Ksd3)v4my$3GjO~MJN-qtw3Is8neTE z@2CavL=`FhZF?!Sx}pUsec1+(AeRoq$@N7Yb6&`TwsU6gqh^MYw(-wF1Izj=?tEE< zRz>{kffve4r$aWUCp4E*8xm%{dUtEi8`;=RPhw_Z32&X6DLU_9Hs-rJN2wrq%koPMUl!$~WKG5~mM;lrCV-Mi^qV*eIS_N)Sc1vKL-n( zB*0vtI(HW>iNDl_UV-~g2bOjOVI19En&%pmi+A9GO&R508c|PqBQ6ziO|ywF%Dd#L z1W3NglZO>46<9Fp(pHjVOu#OQQ}2j+Tg>f?UMJ?ShoP*IiLAP`b)AhSo47PLJo(3} zjhTTw{2{`#t2P>ul~46|@z-;vD#(LFn8W%g{25D2 z6>mn8iKwI8!7aayH%8;rP5^Whqcu9b@j!_QLt~n_d)(G@v*n?7yBlqnk<75QljT4Ma{>Qkl!0-H=KF5Gsmm{5Gc}sTkoL9 z@j>SdqR1N?S5#3v{$QM_&;MuvfL5BhFO=sF>dyt&?6^v*}UaC zl5|*u5l`@cF2GFke0R#5aEr)Yumh^C$=ld}k)8eUh7x%5jxBHc>ca_^e6dU>`&H5f zZxWjDq4=K{B@d;Ny7FhZ& zpUS=LeCEayo=d-2B9<_1I~_lLEni45agXgS^HN$>|A(i_EH8ee2A$Y%w1R5Obn>FN zrX_hSi*m>@J(3)KKlFd7hg_c0uw+cA{QMfg^XzY-+`)qBnQ3Q1B$Fe3wJZ2$G{)f% zh{m(cbdEs$GM$VlSGZH<8HL4B?i|}bCrjd+DmHLH5P4z z{;0}zHDhQ2!D83nEWIoGn7U<@gP`2{nF#ncPPf}|B#viq8daV?5wv7xf4DDgPNf2BZeXC5DL01VN`7?l%^Lf#}Y?}%)b`&7~F_qaRiLIq+ zkOF?bZorsj$#`zXW$jY+*tgtYNauH<(kSn&$8v5b+yXg7L}{&=LW)H+LhX(!R}X*Z zB}gv*JbRaxcVsyqDYq48yf4X7v>VlaMyf9@Aw&-5ZB#k=4DO`fJ{J==u>{uq3kBko zu_J)SXxc)g+|$@uh|;j)tg$43;J9N?h#Bg=F8=UXCf*E_K_BSxHU_ZW+v*1@2n8}i zLGgIQzZ{dRW@eA2m_LA!=Xw7yruepW?!kvMPV-%^6e+;aXEtB|-UlAu*I;Ji^YFQi zAR_u}z^7Dk*D-qWsz^*!cx14FR5{w>*8Dvma7|QvnSr~bDWb!iu55nVYwRGMo`xZ^ z$KdA0_vt4T*9rJL;Y1XcvzPjwsd_ZNs=>uMvU4!cjw&(uqFFL7F2k8t;ZQn9m zH_%P4&Vb7Egphnz{CNQx>6j> zs&Cqsuhp9`kA7rdr&4KH%2MSR>$Cb&0$F3S`AIVqxhM`=oNcn7{AoacIdIDesRsR+g0ZT(%D0gXgQ0x+R(3EdXCC$sQJ8`>V1e zYqi_vmbmLW(=(5=yV%$3I(C*M#Jz61-Rirjbl1(l& z8}6v5`l^-RIBx0}&uMz4bMUlOQ%zOQ-4VD>yfCEoCC8hMd*L3wh4i9j+^a5uyaA8S zo|5gTwMW^S*_-wi-2~HtoT)l+d!$_n=a);??_rm?tuQJ@>iltn<1ID+Wu(}I-;1HA z94tBMVWKH@ab3o9PJACa2!DK^HAdd7;KlhajD78p;$~OPccvtx>Vxa?{gcMwZElzJ zygvxA5!l-*|JVK(noF26_4OqVnNWY}n^#N70}j`5LG`s!OF(xS&I$vO%M|;gBCF8_ z?iowoged=U3*Q~P)iFUO?-jBfso1_UCdNE_SKlmGP;1v3Z_N^@I!7pDUk*L_W=*zr zf65dz^z7K8sc*83h-~^8r53%PHE`zs;W!8FcH>84pIUtDj=;hT=~D64+Q)uQWGP~E)=@~m7nNdmGHz99uH(n{e85+#byX(%M~w-63P`0{x;1T+S4<7+ zPfMAmZOd&*7Er+*h+i+W-%oVyHbBbs4@Q*Mvzhl4WhIy7%;#AD1@U^cZqqMwO`Q&U z`M#N}8Y(+HUztoD@n$mZxW4z*B`(f)6Ee=@pH4JG)~=p`in~ z^O^-6zz+ChVx^=L9J>5eC%EuA={q8tmn1Z*dj!f<>=C#Uf~w_~YB@5LbZ;LiO*qJ@ z40K5TH?wI)TvuF&^OfJYTOOOPLiJ-2c6*G&M-jNR=e9= z5l}GIcmNW4@=$0?J83achIuDgW>3XCt6qss!04$N2XDgL76^NXz% z6{m`=jcT39_!&Gzpu?bgKfL()b4-G6xQNP+WXO_QjShvI^7E0jDJB;I1!(8vKc8Ff zTczJ;_UA=ow6z&?^44|_n729Sx6ntw$1KU$^K2mfik+yw>yLQqfg27!x6x)@9qQ8G zJ&;n(JrAABUL#Qr`#wACKf3xx^jr@YrOE1{X`CvWu8nP!n?&L7E$;^dcj*~AB@bq&V8RwFnSY7`}ZNc{1gWVVVn|)YEo>-dNT_ySV!FvvpY0-bHwi0XcKcPo!7OMK?s5?}8`csOHX_`S{9apv& zRFwkSwe!EWX)w4L=Ffq|A5Cvt(#X-jPQy|X@(l6$^#MQywc1BBO|Q3vZk4ugjn?(| z#hX>rg3^kVsXr$Mw_GV4s8+Us^A&^)=M|xz5fo|rOP-uwe%wi|&lYFs7rD!ecC_Tq z^hY;aRsWhe5o?J}1pLAqI@xN(NRXWaRX?$O%(j{rY5kIXl}XCjREE1uB{@~iO40X5 zgGRIL8}gZszg!C?Pm8<=QR7G*#al?@CDCrhYit4xIMG{%QWJ8QKkDB7G0fEvWsLOn zC&5K6;&r!<;5L7{Ab`KV0VABhm<&*@s?>QvNA>@Nvu}TrH+sB{~?Pzh24B zB*$DY@rs8z@4B?f|Cv#C>+|OhwYp$y`J4MY;oWh-wIP3l3DdwdC~3eA)Pl!kaJ=!{ zH7Ulm$hGIO!39un(LB;2r1d=~i$O`GVBD*#%>@4>{)ho6e|D3C_COI+Md|3)JYr43 zzjX?o5x5Ws%;5@6QGc=#id%!&dI^6?Y4`U6R0rI&uFN+V+_XU5x5|yI46}pt`d0PQQL#IfVNOzP+TDgKTLTO^Rp%Te;mglicDk z`^50QBK=BieKL2T1E1THTDAI4@a7ZBkR+WTLk<3q_W*h2bG`M2!w4L?(K&1!cud5^ zJQw)8N_}ggMify1Kp8a3v$^+e3R7NG${#cPLB1`O!8qzAmitu5QR&g92v+eoC~y0n zXFprjoiFIf7SMzWyvDG&CQqEvaH(LN7Fz!2SsOC1_XvYr>*SD*7?8$tOP?)_uXdK? z{gzS>(7Ar0GQJ#o7gslEz2FT<@HV2fUfJi3gh_ zH8#emPz5ger5FXm)T8~ivrggd&Q5ZZxi7W1vU4kpQUS-aLMe!6U5*bA)Vh~5s~;a7 z7D{zQ4=o60tOPN*AanJXygnfKuUtIFnRWp;Pt>H)Bzf0_uuwC!*`0sDr8+Fy278C- z{f7qp4#(i%p8SBUMe@PEo#U>*f48_qmt^FN2oZ|uP*%W^<*#EBN<2b$?klQ>BdQL< z^$z0z6P%Da?QQahtaVzvV6KtXurf8=;9T$ldIqih$%#|GBz;l%QWR(Ias@V>6?oWr z5^2MA{4>+EH{?!@O4KN{HB`GL9QcWt=;Tb zF}$iSB%CWeI`w-xCI?gs`5=lYnm42&-UsXEjZ4m9*qADuhU_=~^l=)hxE*Xr5UB8e-rSfeQnPE8dP_rVZ zYvWRnu?7?Sd;WK}!E<~jJ^M7gt39dZ^GN4qAG}Q)HC3P45bf@p1gx5OLnU#<;R>0t z#zk-7AhqFdwX3wtTK*r~zuCJ78z~^EilE2bQV+LI2&Uz0(5w`VJc@Ih&ajL%T%NOX1ae#l`g7 zPhvtGG^iY6B}A0R4XT~k8<;+(`57UhYrhh{vxwu&wuFR}))2MCNvS4%Ho@q{NZ;D| ziwT(yay^q7_!r7qG3H+J+UwWO%Nbc5bAC-A?X^ZZ<|bC0&GooJH5?tc0W{F%`XGQZ zGWXZmFB1F0Y6p0&ESOZ*AP$0k|5e|9hAYr?`g+J&QPExo2eL^gozTZ^O{{r6XlZ=$ zn2$2oVE>orlueXq!(0h^HVwy81pZ;L?07R-;g(e1=nm4!rNXt?gd2K4b#%ZXG4D_R9B{LC!efvdK=}06QZ}Oq6z&)lbkQwedpTsPq+~d#IMX-kuB|{1-**%<3 zGajcAx6c92aF(EFYRc6ea2Ak3m@yQn@V*Mu3a0(n7tmm$Sy{fNHKO3F$noz>J%}cD z?Ztj;#Y73Dm_X6DqBB3V*c7jJBH07SN?KDQJ%|+`_y49)Os9zUf?svX*UrNcoFcey zCa$#3C61IN@(@fhpTljL0cCMc@$7A$aRwl(<7oLglD?i7=|KV&uH8pvo(!=YgdJc? z{JRKHhw6tUS^-IKk^c6!M^7eO@4tljD;tX`FVxb}tIj8;QO$Rx7Nd3;G0KMZ^0A2f zwey+B7=ib*&1_FdU)$R(Ckt34GOeIl;s?z4=@oyZ`F3Wr5V?^GC0ILtD>d*ifUrI^ zSkxFhEKhFuyn@2D4e0^UrKRFXPvaFETp6p(?b^6LI$FBb=Fi#2k~OE4e2GYIIJ1&M zr~l^y&-|mdGW4;Um~nM?Vhs7Vq9}Ol=}L@Iq%Iw|z(!su;mtudcCZ$8v_t+yLNrIkRdwIxT_B(5N8`UcV^p!;@48K< zq}w%uJV-*f9(K7ai=Hj8SeJhoE(3e&l$eR7!dejjWxq5D2s2PST z022?324BGLWKLSZ*Z#XlZIt6Ua|7mk_dpU^m+pGEC*+aqM`@d)?d9%)Mt2|EuXM%& zg4dQ1rnBsC|NbPh{4OKZM?uy(41uZaTFX*jv`#f{PO<=sUU_mu&BwRtrQ3 zvuOmrTdy~XDf8hz$smf!kmoSk|DzCTH_Q0Ds=uZp&UytELzYID5E!~NKrVg}DDm0; z(&TRJ?qv7XvJZm8O!>cBG9=IPrJ4uG-D@Xp~hfN5NQO=;o0PnAhzZPs*erIX)p;E1W!06ckz&>3QW)fS!k1 zV>I$BPa`_4t{`uMib_UfEyjl5K`o4nT1vl#Y;{wRK>-$vV_$R3WzyrXPKRecUT4pl z^^-$Qx|qhLL!B|%GX2iC`{3^bup6NR$y*lG5J@_eQ9hM-bkT&7(Ni|BP*qSRj9rz= zf(`sUORugjy7;+)*XL@x2~rpMt|3oql)u5(s0f|43L0k#ta(?++Y+z5H?k7Jo}8ft zHpIRnc9SED&~-}=s|D_N7zO;%l_ezpb234oo1t9;T-;nZi6Mpk|`+O?+m*ZyY$~?AuK{jh|Rg z70wtl**FnLbzUO#kxb?%&Y4 z7@c+k0hZG)4rb@YCf2@5S;VtJRX{}qPK|5Bv^%(|?HykO6)du&p6vc;9I{}W zy@bFT)(+_N`-0fy}9QzTa!6E=reFkBVoEYYf_I&3lQj@s5%bP(?PVO0=K0yv5KyEc2|{)G5r zRplP6Jv^m&2-Ts~p^#65B^9=-wAkvmj3Rvp={*5si`XxX1r%;`LC4YQlk8erTb^ceQM_= z()eGG_T}P?Ps#UbW(dOM`j^}9q5uh6A#(O0tLQJeG)WHrm+T+mK{F&KT3}*xd^WaV zd*}qPD+upGMF}_BYKK8rv^kw>OQk??Wf{9cD~*r8F#h}aR}=rF{wP@O@Lz$LtDV?D zHd@d1&LwW7)!8&hJXR2O=YmWI^hHYFk&Ff24mFQ=;`WHD&sRh9!O3^iyky=#cgJ(& zon`0|G8*l+?5NhnYS^f#u~i^p28-&?6Yns#C+_Ur9_q7bLKu}<5_ur&+intr(`|!j z;NlVI)iRR`Nh~4jP^TvBy}Nw?ROFsL5)@kDm8bS~;hF6v(_2g51K$s#6Ud|@I|dnZ zmw9}}j;r)_(9e>IqveQPL1cd04)a0K73K9P0LvP*555!eLCwKpAGelZ;+;F=0G)U2 zra?#(jq_8f7s=amJk>?6xA&x8!6@$&iC;)fK#bl(%OjKcZHpKa2rdH010Cz`s+|0^J4FMG#XUx)=BJik^b+(ETg00O*j+SA$ z^*f=brXY$@T&ka1oplXOJUkz7mm5Y4;)2LI&gzM->> zUao*j|4)h)kU`?efeISy(zrLDZPww2b;GW98%T)#2zghYRhHK)^xWjxb1RXF#iM&v zoI1|I2XZv(I$x`q-bccJuuQV;f9?$K9t(8*pjF8DfR;bpkUwM~xUgn$BUAnzCE6SQ zGMw=y@vqxU_IQeRE9oJDPlLrGKW>{{Qe>$-{969xTg2$MzQ|(lmLaK@lzcm7ts;;p zkvVi>zEb9sc5=0T4-0`|;;+G&ixSahETc3!9t?opIo}bGW5-1J{jZ3)k3=i8KF0qb zc1eDNOE4`5%_}!%>=wwhg_+ux_-Bl&u{KE9UYz7kQRk@Xu0GAJSK=(Di;c3YBzF6w z;w2%GG(Iu*#a1WA9YC|V`#b|xvha38HDSr@Q3tW}&yFaMpc4ca`@lv|j-8t7vqw;& zF1g+_Bk3sLSJ;m??wY3wq-44}5<1dkI`748zn6o0X4pRm`H{Ept1VrQQuZxj>kCY{mE6!E+Rtq zZvcA~%~^ago;H_QgWn?-jt0CWttNALe!9UI{PD6m$pb|R{sSwWi+g7eHwjdTa5dw7 z)GQS5Ye}aO=y%hgP^oDvDSE2QnDo%7-*yK|4Kfi~De#eLb_zHG*=qomk0f1^H+ZHsrBR} zNd?jEdma4`CU7m?N)HtU4%(rEJw|d>zDA3>6S);e{`%49CrlEOCtAa+M z94K)TbvGt`T!^ND$QN)0vDe;z|AJ~iZ_XTZqeMbI@N=xF7`V(`CyHlGG7g4Fer<} zcV9IMR=hsEyt7?#fv0Tp1MHa`;8i_WRM`SrQi`~S$jyBGWs>Q;pRBZ|gAIRJh~=qU z4!Pv{{aB-8-);JzZ`>yI%|bq|89CSh9^%Y(puPKtwT9AazVDyBwz&?VXFpc}n~MMC1qUwJg|4XPMr9Z}|8;tpzZjKiTW_EB@F)ysvdy3PfJ$%xEcJ zj$ZzLwBavh4qNeTt_CyhkYBle4*KSe1M3$5P1ynhXl-OrIH%@9yBYo6tfvD2zV98d z`MKDCY~9v5swnsS(PS{!$b+gfMB;8hO;>Oy)Yx>)HQ$wn9%}g>at}es*N}eUiLZ=c z63xa#<(az(2Loo^1%fAc^T5wLXQUS2dKCJUpri#fAzdC3!ms;0YD1MJdaVSK9YfwD zgckpi{hVSN{n?iBL1xC7L%yx~e!laIGNPw?6u9vYl;NNAq8&`DX91c(KhylQ^9wH(TT$d$?k4K_L%<3kwf_PkVzUb4a`mJi~aFbOGNFJjX1>)ULEVeM}ufjF#~(8^hCv-flX z3gUj;fntAcSBBoYwauI+AKA*>+H#2hEDe_Z!^HZ#5bpjzbvFO2)!ZqO#8IXlH|f3@ z@xSXdt!D*b|Dy#2tm0&~6P&C@N=Bw;;*Y)!jCPni%Bj~zXkWNf#ivCVeOrF;jo-NR zKLrYeBLx=Wq$UBc0eyr-g-sDiSiT5Y%+jX1aZ8AMm343w`( zeD98wT;tI3Bdg<#M)2>`#1xH^O&|sTFS{%rN|^Ye;;A^^9ce<>BqL`UOWB~nyZi4X zs4@iTN3X`#TO&}XKhCe4pwjU>WL1_|HHs&v;FGrN9+?}3rOUGTqPFuGVtuBxWIEIv zg>8~Ho1?dR2kT0GE0W7{d>)579>jTz51b{!D+=|+>muJwmL^jxzY~!G3K>!z{&l=x zq{&*9`)A_d=uzReHJrFC*St_ZJKD$58hUD+;HW$Jaq2s90FNQs*>IB`uP}wFxMWkS z&{_NU7UI4DOod2sc*FQA_xAJO{N+s6!?9uK)4@MM*)9|Hq8Y;Th^gD7Rwn=W09tRU z8~!Eq=oF`w^mjM_%;=9x=bZ;eid32PmFw}Y$Bv}CC_m^3zZE(2-fM*4`_mh)B=hnL zqGED&Pv^-fZ$O6E8mG@@21_yg)(Vb z6(Sc6Ebyg*7o~B_y?!X9%)YJ4{4p-GpvKx)>EC4?%J!TAct(? zCgq#y=>oB4P@B(n{(JR~-O-ToT@Hz)Z%awvM78i=re95t*nY3z(n+WU9MIS%q)brg z4;RdN5b=~;C0^zdm)1o5P4-LVRXbJ2C=G3r<3m3er>S=&>Ciso04sC`Vi@w&Yx;)! z;g7_XA{@8OYLnHH=!G8){v{M26oP)q;m@-uwKTHLe5IWH)q42Jy6X22gO8@`@3Z+Q zQE+)QL%-GLY)DN7JirmlpENa+P9zz&vbn|4{DXfZ$eLnZZ=Vj#Z!X3G*CC~sN0zPM zYjQUE8$2VzQR*b+;86Hhq{o#UYceaPhF z$Qq^oR;xfKs-OWOwk;#Ip7Y#mCPwe<2&hvnftJ+H)vC!^`Dr{CT@_RKqWgojUQR|L%td>uq)st*u;Sv7%LXXsKWW^n_qgiust|6! z?`xe@vqoQVy_Ktto{fT@{*-CS4*p5m>}$sl3kZ%RBHp?tg<)Id{*!AR*t)8-)3Hwd zBxQiwGtrdLBkw7muUFPG+-_kIFvta3g3!%(R*$|~4Gyj|;Qk@T2c#u|&cx-T(Q$IU_Z~ZCTvQ(49!N~+v5c~qRd+B(Dl0S z(teW$nBtQy8ZChv&c<*gh6E_su;dkI^MFVxLMG`+QS!j*-NQgc*yT>8e&5aT_h#Hk@W zy=CrR9^L&Oa7AmYuh(BMM>4+!?;PS_-)R4Rh2;&@_>Ea|`u-wcq#uhT_FTFbsg=Ae zW$qlYRS^vCy65*T&zpUBdK^r_o%`22V&PeA!7)HX#gPG6kg57QG2j<1#}pkqN^PQ% zr{8=kEZ}+ef+G!OAo-(agoh%=o1X$Q9S>BpZ@i~{-w224I!#I4l9e6new0O^6Y7OS zpm+n{;A)nI#|jfQu<1~Y#PRR30Z3O7>=YD$Hp4dgY%-X2KL|wLoYUkDe58Sz1BmK! zrMRzlcA?{;yqAHb(PTle*X`zatY6iRkv|PKt_(kRtnIPQN#LI)^*Lw+$`rU|fu4XE0`H}X@vCx3&B`56_O?eH4azQ5K? z4zaX-2XgNGN8zqCG2OPpS#RFcz1DJfazeI>BKS-6-=|9f$!;BnI?9V-@Bft26SCvO zzjuxco`eF59nx2%lXn!o)!e`jO+<8qfvhzk8%~;1+O?1{=QkuWMQ*2|oW?*Zm~lI9 ze(^xX#OJl{4=W+pCep`BS*6eM5>hgw+Rh#@0SPmIF(xI34S1Lp#XtX}5hf?b&BxgD z|B!XoVNJ*HyC(#cv;dJ5P!tdZ=|-fK4(X8YZrDbsARPkI-Q7Jlo`0RQ=pZk8E=XIz0kCMZP;g6mBU$co|>^`d*aw&*G-tTNR3>@x} zjdh4pQXyxpe-0FLvcLTnCLb3ykG%MM<9m(`It{#DE~xOk748l@!?6mG{xlJHFD0pq&_ijg!eAL{^ZCIH?K~A+|Vn@?-+G+$FAV)VHU2L672qyPhJj>t2zCjIG%t+KZ)rvR1FgI5}z* z4QCLX^NU6KO>+!sDIizfu;wGR?t{TCX4BGrxwTTfNW2*-;>Sx?Vsyb4D(UouRbCYD z4!1=~*gdB**;N7wmf9jUqM6vOXK_Zv;}=JNLL6>Zq4#<$KgDiFba7;}D@DQvIGuBXpfC zho2Ankpk)(s2{4K$Q0QVy5=WUFZhtI8eze6v(ifcN)*8K8ow^n7V%X7;eGUoj`8dN zv3V{b0e!u7YdDMgzKpxg=0?{_4Y6`iW6jN)fUfRl1tTiMI3%DZ+$y019n}LE{uf@D z@u+|2h%j9lNEg z;M)3@ay}E&X!8&234GCigWzd+UYv+IyI%CErMVY7Xn)ca&h&25^sLO_j7M{o*($ka zMvkU(ur?N_awK$Oe_wL8r0D7^(gcnUIC}sX4P3f#eWaF&+6flA8&8+qFo{LrilU9X z%gAw<)&5=W{E?l$Og2M~H?@Jk0IP67RG#@-ZD*_^|K%Pqh3=2zstRt^i>t$Kzi25@ z-fX#;nm-E2?(U=(;Mzdp_4`X{o7f-_T`H@CNwPK90awOlRcUfL|tPdLJ);4(;j*vz(@&(z_sg4vf}y#y2% zZZs_($v@*u{VCY=3dUJbSDM{tqb6>OvYZAO7jWD&x9A`^9khdR-9nCT`b0 zfLb8Bb$wEz!KqVG;J0|>!;geQZxEDTR^z%KJ!hc}$EzH2jvomK%KX^F@ng8U5xhRX z+*|G~w#T(*WV2gqy%QQqFAT{X*xHa3z8sKZmoqbCm6YpkV-CY%Hk2t-zQ@Nri!<3k zJkyw{_sD(s^|$aCeX_61iqKB&&TGMl%%kids^aGqOLLv4whJ3dDVV&)N|eKx%{e+S z`y@YOtX8Mnmy+sY4^C)&9CC9oz0ig=%>>-Jub^k1Tu(OS{54SrkOwk@na2UXdDF;m zZA?C9$26_2B7ggDULZK$V8rG%Gd9*Qks#D=_drw4!7VSLn=6R{5&B0^sGxp7oOdV2~sKa?U)7lJCxYr5GPMl zt+UP0YMbkbmdaV*6dNJg0+Hu%^#%nX2TsY}G*2cSww;oq&0btJd;=;XBkI%CBl-m_ z(*jgZ%=pfDQ(N8qzE#+&ZDPzY1Ymd#_Fm3)4Tvz+Ww|$}8$*gYgwLN3Bs;c(e>=v$ zy=ALf=?w3NXwtt4DMgW7h%Oy)xsqU6g69Pf+U<#8!8G#GCuK)rZH>yG%C*;@03_*~ z6Rf=Fn#;a^FO$9TSiTSdYW8}_IrZ5(*v)Qr)UWsMUp#F9=g29@^OzlrUw4QUwy5^_ z{M)sj_r0w?JX)E00$BF~bhH8iv`X(|WdFapvtPKmv;KAp@BiwZjj*JU6BXRt+4Xri zq+I6Qd^89vAgDb?`}z9{2es^;qN3(#3~5Lt*~3rn__fc zlECH>_8fU$0lFet2t1y8y|dZ8yb(TKmbP)#78rlpN->JNImr7v`!xwqa&ld?A{

  • ^)5I=A|2UppXn{{zdC*8f@*D9`E?^*#VqjRRjaBYD1k1kE{ z@ZB=rgUIZ_1bvE$F|ct1%4_Hc6}-vzduiima?P!$@h2D5z`K z^Ud@PR6-DmdLR&5tXRchRBC9!5n<*WBez`w$cjPV3oB;Ic1 zjb}q1FrhmPLBC*$++AVRavXGZq8wL5Zs5wH+N#^p4oqAF_wIY#?zkH(6}o$!w`in7 zLhx2jo6T35Z{vIE=H(n+G>!6xg$ZMzcG;4+Qr;{ZorC7-43Rl;+^HI#6`F?N#c?}1 zXzoS;%^u6k=CTA4!vXd|mgQKc)895X&&J$Ae>w zgPLlv_dW0ZS@nGNtpC50Pw-B}M+_I*@^(U_`pDS-l@__?_IwW)R52QLeoUgZl?<<` zXX?m$x6_+4>A}gKU7)~6@K$#S9pcfiPE~4aGR~x(i%Wc#dzV&x0CpvJ%d2}OaI)zd ztiWfjV0%ZdfGbZsJm&J_nM@k`p98ZE=@;`VE1hyBP6wz|l+(PQyla&={&){RW0c~k zTsjwV7#!HKvs!;j-sIR$mu7wUs^E{y(~ejFR|{~tp4{cYAHHUDvZL$A({$!Hl(W@xhCHu@fM~wDZ{gHnp-caT+5su85E`q zBR2bRzUV(NDJ*?Q+Jj|}M+dL_?Z$at;}nqm=DF;aHbhnkoX(G!q(`z4Of%F*AFmKj zcjj62?dEu{enIe5b!bNDuL!8>is;0V>t z3t{lbaTLWm9v+tm;Wc`$%$A4QLYYLuP&AGr9lWB5D>FjRyRjIsupzhIDEJPoe08=w z^nL<|RZf~!LEV6$wvuUg=Cf47^b$g6g@RXJ^{qyj>J+o#w6jy};g5CXj(l2H8>YW8 zA=E|^8hBlcuARAP8{qnr?9sE)Xw()`ubD<(Ni*&K3BzBI{;?wHC)J`5H$S6zMc!ob zjA3o)d9H1vA>ql3;AidMAGm)5ck;5gygRpR^`teLBqL1=HSMF{``Dg#HpMF;mDPx?(2>8m-HCT+Jl|A7b3>L03@(7+E5u@92oS& z#_0&Qq;01}k{Bip*@wiN_up`wid;QVtb)1A;?a*P@l0P`Np6&YA)>R zGJRo%KCgCv4){GuXPi~{5A}@&@U$Cois(}{BvC}rHOTZE=FaOfI{TEj7H&4OB%T8J|0(FHGsj9|e)4>9szxSsP}>eDScy(XOdwjzy*(nb)HFWQ5;4 zgaZzguI}wutq5ig=(UJ~+sm6~in^3I{E6i*^U7~YPPa0W>}6-I?cOYM+5{D97Y}KK zIhi&z`53Eh?a$uRDJ6D`aO3y^;ql-($q;roZrulck14zI0PpI}rqF0f?FXLQu^n-X zQdN_jc|O`C$Pw`nox^;>1tATm!InmA0F-eMikbXu$M{u92tLR5x*ZyxQctJ7#Jjg( zqrSGtd!E2x(xi)T#aYF79|`#zO&{LRZ$PG-EBq7GgYT8LLpt|mOt(E(7g@eucEaZj z{G#P8Mz3E_RXTI=5Nhpjj)7jOt?&DJ0KRXDhJ?=vT{|D6L#{c&)$_d=CBT#+eRGn- zI2t%d_jlKJ^UM?JQ2`@smii|W7+(@=^&?kCHv^oe=>zft#IRG~)5=&R&C&s%140TQ zIhm{{wn_pqw<_h)pb?eY6#M!4gW|l+N&t&j3ZQIryM^MQ?%u7Y-19s51av?EaTlR$ z;JKXEr@f8Xj%-?7AxLmV;zWoITVPJQMooY()=BWJkE2ObFjHsgO`8o7h^znjTeo3z zPeRiSw-$XdsV~k&1XF$fyY8xDL+?pahxFK%;^W?r^R;hn6dxo8WtQo~qx%Ct`Tce^ z!AT|yq>KB)1G2&|wT}Gr*XJEez!;*4>zcO|AZb?lH;+FS0wxQ% zn+p|y{rP7aAC^&nwUbAN%jnH2!Sn(+UsJGhQ*UbRhhj0y+5JD$76&2gD5Z$yt?@-Z zc^_Y{On6+c@@r+^S@QORX~v1r6X>X_zE7>rO5x!zlbFu7xc8;x#-!nYuwJf!Fd?4a z=iuCb1K?NrDc9W}`scPK(zH|FE}U1d>NWrJ;+NmiAHyqjLs72#TkNHS5_w%O7JSZi zRGNJyzt?#&fNQ>5C5vtCDR=0Z@6%p<>*z^5J*4MQ8x>3q@4VosQ52xG0Dr!cEEQmQ zJkXdddwlhiG@dqCB^|uGX@P)W8BCzlY4g@K+mtHB;Evs$TgilxE?C*>h?_aBb3}3U z7_5vqvYQ&bK9dyYON|N(bs$`12k)*}cpg0Bc^ta>jbIIHi0R_4hm5%W9O(Ih^Dz+& zk@S7O@glz0esETU&I};ra5w5lrcmWe^r>c}?-!<^AaT38Y>~y*#(SZBh)Ou)%#Nuxx!4uS3wvVBbeW zIsGA=EINI?%X}Lew(YQsv*%=Rqb1RqyzS=XZ9F3I27)sn9n2nAZ}g+3DBI)m9Pm%| zmf^u=uSktw@rThnem=Hi^#wxp$v^NIya`S*^x2Y@T}Cn4f5f`x`}Z6hL=bc#r3eCXl z>w61<8>2v{1+HpQZ9Ddt%&SH#-By;BCnFE?Wd|qgIO? zidyb{WAvuC?<

    _+7lW{y|Y9|I=%ZnPqBcU2eDD|E@Y7UoTx?l6&%!DURajuqRPF zU0SiA;ep&#EE{_+{hNWtTL+iD&H8b+Z0j$~)+AdlV@r5&a)dZ9Z?LV1*K^`STr^1cxa1?DV%|Z4UuS3f z?+k`k=hQ-9`l0N(McmDY_U0&`xuVof{B*FjN+UPVQ*E+;#An%;F|#|)+%{uvdU8_W zTWrGc5SmdRJO{yM8KKD})+P*B5`yI#^x!yY@wm+&A{o4wb#3rdvVd-F1Wklf!doGP z@-4a6NV-eljGbSA-QfV6L}gorqbeE6y_lgu52HwEHa%o{ILK~ir=_=S!H+nZQ75#l z=5sI}pDw9xr)fS{OZwpXbkb!qYa`>96+EzfL1RCh6&|=Cm!d;?x0H|)Y^#-^Q{t1L zQ}iYQeKi0<`?-MO( z@Jq`_+f^4>Ru-{;Brk6nBXT<~#_1LFG?d9%3<;<`Mz=Qa7u;|=hGES(~?=ORu%Pa{uz7=<~qFOjC3yLH3;olcaYB*0+EsA<4{=W{JRFVOa*rD8q3 zX7fR#_#4}l@H&%%;UY0oUz+Z)+mA7Y%<*hDsv#lpVY&+bwtlD~I;Kq}6kwY}K`$GY z{lw)edZ8MCjtDZ{b z75hVfSNs{za!BCxl$>c`sUzETWXVOkG!Y}%LryL`jMFf9>u3?XJf`o z&y}w<1FH-&s6efgv8dTuyJwUXuN3~>O-S1QL>YgFUtsb zrP4m=NxZ4jd6xI|!YRr1HW#K@#2MHHBV6nvU)1pn^X zGc&(V+cUcL3~ML`V!%KIBqD*-5zG$G&Xf z?AEh2TgY7fjWHzReEU8k0#kdO97`=jxQniH-}3qarQ}*X5VA9XN`Z2tIu7Z6dZa%O zGnkXkj*e5g2M78Wtpj?>Ki}CAT0^71;M3dw_+yQd{37lCJvwWS$L6+dsAT31CmeQ{+xC@6dI$1 zPx$NCQ$eZ>A-{_ETM(p03kojk)nJaeeZ_z1g*?!r`t5Uhuf-c)Gh1REpr9^c+t?oNC^5ilsV=Qydq{weBXu{l`}=%gravWQEOkE zw^y7I#cc?>h7R{n-)gKq(@}?(Yd<27+c|=ogJHAtd0afL8-~8shoYti?*xQd_i=h* zv~Ewd8K!cB>A9pE&KF#(NSGSc=?kTe965YLvc&mDp@dXzCkQ|5*Nr zkjiIpR%Fpa@TF{Fpx`^XivgMWRNbyZvCZyKi)R?RI}Kh z`m_6(MPpdpd=b;e#bn&m^MV#Z*P>S9FuK6!>tElI*VusNSE*BKb(K4IBooBYMsNI5 z9tz)4oEU;wJTt$=eJ>IhP-Zg{F!hqxhhV+8YX~-gZD7A@Wo-5AC7fq0ka-z!o}|ad z)Cz)Wgw9OZ{pCp-EDy7jM9>>{GMI_}vh2?+Hd#zkxiFQz^oR4|iZjEowVzz4M;K_2 z2mCY{C;sM1R+y3gh3_67){*$L<*=ir)*Ibb+hBsha_T>*{8yEetDktLzvQUV)yMnT z6kh(%v5A4f%n2WzG+e67ntyJXa!+4ulea~oP!4a>?(2;cJUEcQR-lfDgP zSz-G0vt5)FG!V(!jGW6796?YH^&q%0{)nxMJ&2u)>AaRUKe`yEf7ete*HoLGCL6qV z5w#)*S>;B<8?a#wF+77t?&6Z}(WSlFRr{dwbOX7Z!cw z((V_pglxqrd4q?2Fgh@6Ai8FXYSv%sW*H6?o*>uWv8%ts7zxpr?KlK-6n^kY68Ti5 z63ARrqai6uYL^11il0ABm%JRx*)z6c#Yv2UfU4>`z?)vw*Ge&-VC3V4L+Kr{Ro4Qf z{#tYL7%riQVKg9fMhcoAa@Tb*?PsVpwdSwRO)`djU4@_^N1*;HrV~%GK)zHJ0Rns} zy?lu&m(#T$&I={hf~+|vDK>5fm71VGDsCxZXG*#qpFN8ozWnqOauRg<^7RaXQUP}k zutcZL?uxCn$QUeFnYb`cP^+18;FIK71~|3$K~O&5){Wl0H zCQIoqW(_iaMI}sv8l$m!qx}s^|chghSu**+)WdNP16 zV-~J@RNnWo(itaT!krajom93($Z)NX(q&9+;qc{406#aNw-`}{J?f(XmBq%Zk`Gv| zUR5=n{2gs5@>>w;^ZQ1M52%35x+D)k*x9!-W`1BhD%GzEsw>yZ!I})A(#YGf&#KNH zfM$;W%gi|%-#McU!aMrOW<$c?iN$z|S5z8Es_ER5MwaOSu!;CFi@x%XD~;UGhb3Di zUP2y6rU;&kQ?3RaiF;ZP(qiv0gYJ*+-P(j)Fm8RS@wuS)abF57OuA8}PT|b+5&T^a zrA_DO#DrYWZ;$0;M&|qA%Rl=L0Fwai*X(+DeyydA&~Hi_US zZSdk$NR!T(5oSK(v<@RvnXSViE*1wb((tq?N&8`I&&Hfx61$GmsujE(2lIPQN+JwC zb;9WcuS-eNdtGW$U9Q*_*vF?Zhu6A;*SnX9w?~+on^iNnnjuRAm8edgj|Dl~anMj> z&|-@0e7Pp&jgC#PvnckYcjlw>_|)fv50c9zQJ;GxsWO}x(LQPltK`T+P`aFH&ZujhNZ(|=DSEB26Y zM#IW%LiCAt(B<6;_I#k*s?$jbb4smX>Yo*MZCxhm8liC8AX5$Ma{Y;|XzH9ps`a5y zWjVkLckxPGZl`|yDEQpg(vfQjzRZ<~>>m5ulC6RTmAWn|nRin|!2r|ykfC-fOW5+( zypePl4s?P4wUpHQ{n~7}7if6steo(<%t@P-Zvi)^#$4Kjt#C)xm6I0rcmo6P*CMBb%9WV^is#yOpy4TEV^c%ojTu zXcKB16i?x@)u)4^S-0rdmp71H@*aurCXv$X9?s?fc9+6D6TQZ_S#ho!0c{zX))$%GqX!RBEkMB7!AyV-^6$nOzHVc}eGh<09jwpbXJuH1385)rdemyC&1v%B+Dlz2( zBB#o63-zB;j9s>Mhxvgw>LK`#QVlil?O!hNOTz&2zZBys8uC;W4(enz8$n+}X56hq zKfoa1W1;JOHfNGNCCg^-Z*{N z%A{MonTQfeWP*&1sL$$vB`D&sq?S8lNpjphOIY`jgJ*4acu&9sfL0wfj`NN$WA~niNx(8+NH`!wMYQjjw^~1t{aRN1e^~^ zl!J^hEY7BO}FK~UGdsSGDi@ynMp7X+*rDTZK;n<)Gd-0&GRNLap4h{7uYcgoKA z12^(ijQ*&4W%&0g10;IyS{Q5YvMw_hb9?EAam~@r)>RMV;BPPn< zcT4_bq|f=@dsSZWp%UL|7}7UffPV8(_+3)kM^KSz2o7}mLGi#+kLHVZK#!O^V!LzX zWGE<6TX%S|hI-FFk?a*?-)yN|X-q>de)e^7c^%$Wv}Vn24a9 z^n+sU8`*;|*yK-uGga5tNSX?`88DT#HOSwyft~ny%ch}VmZPDx^Fl{ys$QV^kI>*N zq3U#eAYAQ=C!1f1J~^Sa(Z0LQZNOtgs1ED}o`h$^you5jY~GH+$f)=8?bEReWALrc zL(O=r@>SGH;E$8nx0F(dlBHB+ zYb~MAZrMv-Nsai_BI%<*B7Ntr$+}h7?iY?%xVGW)<+Cd2;j_=HDbsuRic9}nyKq=g zoV`Mrm8w7N_EG#V==DD71Bpk6-MX*-Q^mZhWYv48Q|6Ou!p$^o0Y9r(5}4M=ba%l{ zyIsee&B_BvkMfAxryyNIhJ94Lern;l#6JWZXnxRv+5+<3p__BG6#BCoVk>?vdnz5aV zh3vhZ!5?5TUO#Rz1|Sri^M*8gw$M0#<61A1W>8#bSUr7pR#R1n-s zJGf^5V!g6UAZtE&rY20kkMkWdl+W$JkeUgcJY^J@Iu|Ri2Isuno&jSIRpifOhh}6P zZ+bosTGNP+|Ae>%db$3_tACa<*2B2k^{7y7=+|#fg^laccp-PuTY%`t>}#Km*XjSg zJGWKfQLxgOuYB}t*vf&U^_TJ+-mScg#;am(uDIJ<-ou@~1A+sp(#ndZnYcZUQ5vwa_%(3r94+5U-nv-VtLcJDHvDTL1`8I80 z$_zh3O_Fv|S}wSK4|snY;axSMfxl`4^Ey=no6O%o3XZZwK0~_feA#W4EK>Fh?*v~w z(gHj9+*Z(dsvIh+;rrSqhoU|`?>4T0&szM2e+&=_{IlQ7PJ{v-SbHwJ#mE*N zymoIVL;6F$+vf%(NdmLrDemfiV+Nc#r?U45P`Z&F@lh=(av{o9F}@fKlrGfWmE3b* zFfr(jx8J{!mz-X0JqAdD)GJ)BD~sIyj#-*0=pjiWAJ0qbe)6*u#;O0W7T^jpQ0+Mc zR}g@Pf8!An?+7wTBy@dr&wa{(8;jw@5|2|#bOE-O8w-)5&ljZUxDzNn{Oxelm6Tv6GGV~VT{1(hy>5(|_ zQYp0106y1YJ17^iENpdz0HHIk)meMqqF6Tl_M?^YHWo72RVwIO!Lgd=+rX0YRjnC3N^oso|Pp zb%{D$Z`;yAG-TlfM;zd_fZLLVEb2jSwj5wi{=5XvwvwxUSb9PAQ-q&gL4$3lVwf2q zD2g{lC1f+BAmJahSk=5j*%%Ar5dj4*5dI?z{+xm+Fgwu^T@XQ4PghOqkYZ-qP<$EV zi7nEH;d+*Au6wMKAE1i`pAu@vYFi@<$t@iFKTGu|3-oMH^Ntvet(^=p2EM(+K#$z1=1!0Cof9|} zC)@m~DO=QvKJ*-q$ZLk6?}adNO%ti4NfdqMcO<>AegZPDvUWqV&n*mZKnqBdl%%WK zjE&53Y}%HcG{;Gt3aojJYVy+4l_|XchY5ROu853Ndi;4ZMCiDy0;E16xlPlbXFIxF zp1v(BM3QJT(zKIFLZ7IxkY!rgjHzJTesgntX6))zp+)n#tvPbdwGa=0Kba)YPg55o zIKO(VH760s;LUmIoeBG!ZG$sm+?A(=`t-?L^lm1Y{bwWSc!pN~27qDq4w)99cRtoF z*I-NJxr;U1t7xhu>o<;R9=w6u71CkUACjf>&vH zKju_`A8q{p)OPSvz3MDCbTc@`E!!B+Fy+uP@5=S6_W5{kGv$0Gyy3m*D;SibbzRSE%BEbC(cQcp_VGzJ&KkVjMGzl5dpJpZ^y{)a-rD-QTV$8Jx={`Vwo z_8f>{Wrxo#?rL7Nr)e#7q08h32IUb<_I%VY71)uV?+Mf{jJuy99SylD zb_6jo$Y>WX9NzzKa^`E+q4bhXAp^li=~KgoTQ0v})=eqhUD^-!$VgM={3t%jOf`FJ z=u&Z;`r7535q;?K^XHEVLM{*LANisuj{WTLTN;R~2=+_qNdF?@d7QLfQ?@dKpB_yp zpXxtiU50p$QAW*v51#7_vp3~+A%>#E$gq+60a;mgfdrkfoGJVNs_s}wp6f0JIgwo{txK#q6zq zbY*n#DCYt^WS=47Yd1mVZB;g(b#r~l1a@**#2XI_5zJH+0Y7co%j?yqy)eRL@C`Q2onnSh6?ylYk*+hU}y zEq?!%h(aJyA&rZzn=FYvI3f#VRW^|{-D~!2eZB8S#{d;T6qtXzQluW{faiku=*IHB zh6j01Nj&lcy*4d-v%r5->9^@gNC7td^rzi3&Y}iSMP(I&vIbYAQ*_ioqqQjq)s?;9 z`N_*FkidzDP$8cM#jQt6N3P$lI1FSq%2hfUdv#mHsUIn<`sw;} z;IWoJ2=&H|9;VKI## zd__?Am0<~4h2`7D?`4p?=I0iD)LHFW!tW#AeZ%}_yhEiVx}9@-gSdxVi3GAIr}V3g zMDjEXXt5p#GD~!*#?)7MQ;p2tiAk{u(c{RSBz68C2`RQ^46y7(v?hh>X5DFp{djaP z8nee$200mV7hEcUr0h|Q>vXo+JM&VBz5fGZ=Q~K=A*Ih$8k|V03ObAr3|g4vcj}^D z%GHhK9~MCFJils(Qj!nQU(>zbp_Tq!L0)i-VIVB60kl>=dwQwDP6#k6nQBr%C8#AE z7LxPlipDjFIC`xAXVVRhI!3g_+tjLSQA8;Bye=(4X*v6(H${LMmeQ%K0i#@hX549I zeO`2=Zs*Vk`F%XQ&*L9q-cQ+b`!l;!gVc^8m)*`~mH=`by!OSW@cT#K(FI&xuUH+b zQFxIM^k21Z=Ie2wEZ~Fu_79a|X2iE8#$GdouCmi#tMKZe zSm($qz|=fDU;!tO%UbEY_VNbZjE^m9uNY+O47)!wj=Q|;a-i5kIz{FATv~^mo6sCs zJY;mgf*fmTXGQw4r#5mftJU>V__zE8liT_>nd4GWsTTQvzx#VqsL&UiO|i^WyL`iK zv)erYHO?Cr5I^(|?Nu1pk|@PwL7>2_w!o7bw#+-!e9wX!?lvx6;)f6h@1u>s?X{g- zsqx*VSjj+d?R13HV0vz1#w?W~gsC?hffyfp4mDTJCqY|A#$}f4H7gt76BlI2$+bF?=C;7S;Q8FEG%AKDw56Eo>A4D)rkl0Gn@KI_KWPz zm-pvRBQ87}?dCL)()-BI$bQ#L*yvgwdF%01@-#&!Tv~H9&d2BYB&4SL(A;ICt6fpzme;B@AX1T zHFIH7m!{rmT&?V-M}ZVko#MOItu%nnpuZpFHGbD<7%qp8$k+*frq{}joW;*qMn;!G zf7ENOrQtT`)_(utEzfd)6+;?`Ld~bImtpuP#{P58AY}lZ0vqwq`|pW;%YlZ?-$G#x z^*rLQiDVw))@tq}=jDfJ3*TrD<)I%7dTzu^4AGzXcY_uEwU(>@1e>X)7^*;G+?^;= z8uenaVRH{GG8guq4-tXpmk&^3K^3>83Qr|JNgO*>E>dZF$Zw(lb(UJ@qCku%>(8iY z$lvc@{ts2>9nR+a{(YlptE5|NMeEa|imJVmsG`egY1K?i?Y+fFsH!eh6*Uu8d&J&? zQhTqc6+6ThkqF_rKhN`gzrW}C&v74z`$+CP$8}xjdA{GTw`^{RvGw$@?b3TEvzohw zmiF>PFZ-5!5>`f!il_ali5C8=0`;_w=k>FRDF+KN{&Q61}Z9@KS>y8K_-VDOV``DK59Ag#u1M0O8JlZ7owZh&%4Mk6a zYYWVKRVli8z)NDh6s`uS^Jn(>v?so&M3B~Eo&_LCfgINlI>9H;%-;(oN6nYyXQY$G z7>^gz4X!PuKq#ov^oP!fM z#A*f~e9j{@W|;hodnVMKa(XB*VxYY^Kkz;U^*0E>v=53uWZK=U&X zI~MhT(KNtyhcQ#w`2bm7x#+c{n&&Bi7^QUb>yumYuSF~dQo=6iW}SfP4_IbN8l%qg z8A7wm_M09m(P`nS?D~fPN+1Cov9RIsR@1Nu02G<_(svwLNRAisIOKgb&ttx}9U1|t z!K}P4Eo?ba%+Xkr*#o6x))iC@8@4_|BQA5cXa*6`egtOg)FI@bzu^lqVpyN``|Z4M zbJXZV9$p4anqT06K;pLo(8pu>uJm>+_-B-w$L?&%R|;-CpyKc60S-({^Fs#%M3WXA zXe=fVvsxD}xVHPhefLiO{(D}q`C)p}b^80|5DL!I;_Wi4(3|?GlOJ`ag#x0ubKy<^ z3Yzvbl>OMHD?9{xYnZY}=>R51?i9wUd}7GN{sQM5xUp5l!%5$JmR0E20@uHF=#SH8 zgk_aHg)0n=Yr$i?sY+$M9p#pKUzgLC?BqTdDrHR96GX@eWZnTj9p$+M&udkHY_oM9 z&W0|tX8Q}x@ovRfXG0Rew+QFoM2h{4IwQjP=?XMl;UNHuqgC)UU%=jFb0?g#*>Ulj zl*ew-cEm=|tfLtIMX(;6xGG*Y+dbyt(k7#$bIKbyUQp=QZ6knQs}<_H&YJx{qQq+_ z!2tkhGt4aAD#u{A2e=;?@T0sP)A;ubh0 zSAy_|I-i%)jUUHK178%b`pfRCi8Ti#y&ylt`F%1<*A(@9f@d;prdMr;+vL@pC$35# zYerq$rbghYuJ&G&PFeWh3`$5q8{398krq;aFg0SG_+{mBOj*qAe|iDi zuD2(%xHsJ6kLvvv`tV_a&VHmd57GLaXQ2mkTPuk8m4K;Z$rPw3zXZ3plTzR`BxPPe z5?b?|Zn`gcZ>bT~d2qGUwVIw(7!&^-xv9z1uI5gp^tC;m`kkj#l`*^ZqGL!prY`cZ zX|Q;6zI}D0Ac?B-)?X*f7Z61#6M7hp$l=>4ezze+Avgz0@}81Y@dDRZt?E+1$3He0 zgHo#rsH48!#pBiEhj2Rdc$3oM%D`%eZ<;Vd9*-TUKHd7;({d``z*xkvUY83N>J8iOLX_D}UAZ2g**{SI zyRoy+!%KaaEtRL=jZAK+j-#q1`WqtL2Fc$0rhYR>p-Ikn;;i722Ich|Gq|(? zuJpGp3$v)vq7a^Cxt38WtsV~hCC?v9b1|q8{n0tZ`6P;0*HioFDt$MIg7uN_&(Eut z-XQTjb0sJZ7OB2)`MF@zTI`y*@Ls!jXm+kD*`O$<_sYEA`<*OQW<|4$ zms)K@OPV7TXU{sGDk{52yOgN0)Ta~NpQ)l_3;sL6aEts)U;B^iFZ=+ypp#y){ zagC123HC_$zNKQ2z}kIP#3?R~l!cg!kz)tkl7Mm!u>7@Ux=Ncw4ESzZe!jvRa28@0 zm_EQ39lG_A?cONB3KL|q7T9@U#v}?*URg22za>R18c!i^G2OW7nf(5+`Z64*bnF~S zvpxcx?YembPU6Mg7a({&rw$&br`UDPt!ogj%dP=`M!y@wzXme9nL@^v&rkGwz{)FW znV>L$E*t@QAec>W=NeFe$a-kJ$(9bzEN8WpT;=GLLs$LWy%reyryNdOIQ6dzLC1SQ z0ak9?r@lKhX`tkfF$>q9Uy$zMN`9$lY3W)W;vHBR8p!dUq^9+mL)Y&&ECfEglLset1VZh1bY26(8JNtU^s4SQ7A zA4AAuz*A~d*aC3k1*@+qW6aP>dc_(M&Jd-_0R`EhH<)1w2s5U%RrV$lm|-!;%A3!{ zsK^EbXOn-7*0_KgM}%Rek`lnnnNJAKqI`^yym+#js|O+nqeKA3;sjk-gR*L9@1+ES z<%rJ^V!PzfW)hHqPTQXVn5+%SD<4mzaYVCbOLuUb{6Ig^+j)uO-&W;g#_9Ryl^-`* zZ?sBQ)|U`P0a|Ew;M`|`!90qv?4oOgRxw?3WO6(foyX5)O6STYA|F|G(}BE$cc9)x z6*=xicpxy{!tWsWXgZ$S?DtM*Rscg)fW*T~9J}jlx4;B2fiTITUjuR zyO4CG9JJg`;FO_`GX|b9W}~Yv@jJMpa;8Ev_P9AxRN{Q52z_fq0{jQB51z>o{FX=Z zJoQv+pm0I|>GZJ0f%+1P6_MTd>*Q+WMo;{HI?8GV=kF$^dRs*z1$+3q9z5;45x=c` z899UUa)g&MtSDMb&DAPxKE1I}c~Q4DH!>{6$~OgtTz#oxu~`k^7vXSH9Uk@C9{INx zNo+BvlD2RGvXG&u7Wfo78sfZumJ10DaEci9`(PlM_7r z(s4Vi<*oaln+=W&Vp{u0$+e$!4{&>RxIex7oUV3bjDe=6UL7H8iDJ}2^Zz@8$`5W} zK-*U;Je~iG+rR!|COtg7?Q{C}PN44*gUquDkks0yw2@!c_zxnt2CA<3EHjFDs6Xp3 zlXyIPWV_D=5w$W(3-F3wypw5XN_y#OrM-12vY9ze+bOa?^pefxOz*$xg={l|2GhI*T@7DBk z?N2tD+uvjMW|*Z%q({bb5IC_hF52dJC7Wy2vw}R!OZ_XfNV17p^2+GIb8{S0^LRE~ ziUd8R-7s&U>Q0gQ8VaM1w!x%k)FFt{sDMi&qy4qoe5bSAZS@ohb8g?eq^L8Gxczs0QH2=HRvA+2`MNl6P%XUwLK1A*H89$A&aA;3!)0<9*jYy zQ;6}dcNX5C2o)($=3sm`OW*RhjB&QNiBI)?$#3s$;n; zOOmUZP1((g^KRnONIW8D*cvRkcZIx$OjoER^Ydu(*USi=Hxu?|aZ$3c_ zDbFMSlCOK|hKq$iKL~QVn!mXvskI1|yJ}kPv!myj-&gJJSKP*)y{Xo);C!YN!hu$( zi-&nYnsdx6)0lo5T+KhUjCU(c*z)Ir=&>~19?GNII@s2$-qrSN{MMPA9;nMA@=1Q# zDcmhR=sin7Eh%*2^QpSN=P3)!evt2s9MkRI_d{1q5^u>~ zE31P?VG`!=y%1$>LTq9HkF|h4F`7f)!>bU4kw1@?d)IooC63=YiV>I@D56!lMZDjO z82#!EltV4DOkp~@n0yI@u&rc)7U}$bv{{ zjgi5Qes|1P_$@@ z$n5~Gl`$euPB88RrkKb1~vd9S>iO&WvFFjQ31Ch+2;V_s;$k z{vv>L{d2<_@wW+@p+$Vs`2ppnzI2;R$)mQC)UFW5YI~C%qZPOOlkZlS^fm<~wpOZY z+BOVBMGg_}L;YnN0jm0dffch4`WbP^qVD_^9qas4C3 za!`5rszWK{f~TV#Q@P_=QSy@6V)CCG6$`vUAsogAOnFs-6#?nR-u1*Hi@bec8mY%R z)+QoD7h2^m*h0& zx?K(VI#IaRr^3~Mus+uh`iK@N(`{#q4p5SbH_k%2>&Q-$EOHaVdF=8H#rYnz6}WR! z3V+k?fVu9>#T41^HEr0D7hft6MqZDOhTH|7qkm*H#A`I||MRC|wcdg#FiHLgzwF4G zEss{f^kPT0_M@W-FS-tKz7oyzHTNhwk@*0Oq4}5D!ADNi<>Znd^MpB#EI?Zda9)A) z3SZEYbH4+inH>xH$p!y0a?OJ&pUS7S`YinI7I4-gG7YckpvQi(4?BH?dbq~)anW_v zod68@4lz^W^oy()`?oo-ixBPK6jJIS@hSKT6%^5P!n^lG(plw*d)s>auR2P~6QDIr z`5^v}0|_8Y&iq^{c-!gRh1+*)t~0;=^mFT4aXPjfX5kpdWn1?Q8#oF&a=!8f>3X8M zYK!0MTbJQB{;v2VR}t1>kuYDB;|uapi6|qYfMLK(Sixdrqr|@J{DA*7n?=a z=G7VMBWOFrG2*dnUfBL(NSW%eTOek@17U|29A^|vu6B}rH=+a5P1g=2yLEb6g(*m> z7|><>U53Xd2Yo;NXn-8A+N*7uTJ;om>o_rjCoDQL)4xo0M;tfB2H|u{X)HiLy>wj)G z9A#P{7ro6Je14@bnsrN&+VPZ#B)oY^SR6!ZK2WlU`khepc=H_IX=^;A7ym@+FKVlU zoKx{6q$_KHC#;KPF#Rxv!P55Ku^&JC5_k5i@|y5sqSoGe?Kjq3oSDM3>)ve;%$(@h zhW;y-r)QMnxOPbiao|$uBG1Ek;&F5?knP}5YxR-Ze|iDA2E?(eGCgzYxR&t_AN!Uf z=#S{S@`0}Pf0Tz3g&~S<%acbBMrL$;%y-7yhx8Eh4)?8`6@>1c13rs?p%kh5d^$3GERa05rAu{alCLu1j_s<7>T}pLm*NLyL z?Uhtm+mYJvWPO!Y>fT@IFX1AvvaUdQdSq}6twTJ=Zz^I_cv43+;K$x-6c8@+pkb@d zM-ZW3bMSL)ed+{QT;VGDm@rzMG~p>zJ<(^#OATd>aH$|OT~i>j`{EJ^DHwR@Z;p-P zkyvhbF@$-jtIZjl@twrDaB|_$@{)8wlTMk)_Z=oRx6t}B*R#im(i$#;CqmcN{r2B$ zd;GE8)rrW@q0zOp7A!p_V>$LDzY@EW2S64Eb|J3M+Na3+I|BBK%95Z18IH&iOMTlJ zKG77s$;vZ75N`@THcksmsKZMG|GtM^BRD>+%a5OT542_cCfjbF^8ToCbbK1o7V-Dk zVWj_*zE^YZ&0r74t~uOk=fl)5nw+4hPqyqH;J$*DGwVFJ#B{=n zbEbF6ur)4ez#~_qWtGGt8Zhcm7Y}fOwtM_pF>B1XVzuXVK0zR}Ns?vP{IlI>g66~r zF`NIOmLl2}5Up~V?gqHknv%?koqe;c)W;1*ESUULA69vX%p5ZkmUVi+e8m0b10!nU z+KWS|OXaW>9#N%#>uo;F1*brHe-g3QIh|1ZH%XPrdOD7i6u6_KXlqP#INJH(8v4h> zne{b3(Brq35s(qVEsB`8dJZ%tIbx##e06V=7Zr@6#d>-Rs1ifPKzt2j zZ^zO|A=%SB05cRtMpo@6h`9Hc5j^G33d!D#LXhSMTGQzL(zzw+lmsPdfqjzxrug zKs(_wtHDfA-S}O|3;?VP9}8MTP&eeqPXVbo7#wyS_YJ&OdT*lEAeO4X7NPgVFZ*aV zy{r7}yMO6(C-{KvDLCquJc20<-Rta)us#w45PI1McT6oqiW~)V&A#Wc4*!UA%|OBj z12xi?PIRgoyE1*}-xk~Iixxe-+1Cvq3yL7N1Hh=2LsYm%>>2)MTdES!?FQsS4Q%s- zuT?Zy&(vY?UE5Mka7)9r3bCJh)BVdDdRDovxa|;SI8AI0G!nNTlC8@mD)+hm4^We@ z^<0G5-F2HwbfFK)qF;aHOd+a&7r5*DMzI>AC^kW<;L&&B5+QPYa$P$8X@*t*P{x*3 z-yzuF`UykW$ZM6sJVG!O+%MGW-c5eF?)u6!Fv2Ev=-@LdF!-A|B>1kSV>NGt;L8Jf zu-g~tyX!>H>lbqYo8f6u)|XvdL)#LPWz3>Z|K7RTD{6qlxIt%;O-_=fXqwY7h#ubZ z>+=45l05_v?sQxQl7Tp53nx3PKj}G~9}kRCd9We$FQEOmo+s04;-As}z)abS3Hk|? zt!*l1F+5SG7W!uUBh}*l@p2Pw~rFMCkrL2H3CSh4h;! zK^7tq`d+o^Rg2yIv?9VmJqSH`1Wg$IDySOh|44W*159hP^&%wWUT(-OTF4w**9v)f z^o-btTgWubyP*LO{FbZ#i<1pruAdI3cJo)f=VQiLh+ib-5fOf=V;7{T{b?Cdx@gyS zP?*Z<5Xcsqe&BwdCj|wjy>sXmNP78*^;SnH&k4zFPL->$2R=qGbHotX}8Xoj3g~LPs=YMNk3)9(#2+q z3WZ8u2&)eN$kwVJ+2zV{4_n5J53RL8m2cP*s#nw@G|iClmw#U7?AAW5OiqiQHT)7g zrgUc&FO(4=A8$10qnc&weXM#*fjcrzTb_&L<1>5^5|p?y5K*$X%a8wz!ztq6P9MAGnz%?gpPPJ-hJ_A3BMp1I@=#B9+H?w%%&q zATe;2Q-bTbctObn=c)0F6#oe|OU9m9i{}%*0Uw>+*BW9WD++dXnq@xsDJ3B~xjr^) zl%v!Jl#F&f)(|Nw2v3>J#_h)wU0?-TW_J)P_5Gil zr*|N{`Hl~cUTt|_Y-i zZ5=Rge)peI+Hz>S{ygA`?;Wa;N4dWg2=?x!aflBkC?z^SN?Us1q*1Ev5@;6#Y(%m_ z2FW*o3^yfE^^0^pr}RdD_&}Rf1(TwC?*j7(bgwaY!lKcH2e3UDO!N!U?~xZ%D!)t9 z;J;o`RI&A7vIYT4&lO0_aXph<;i6t)3&%(1(E|=3If&Ncmvj1i-)3XvKvF(D zn)Oxv3(QzL8gRyZfiymZViwwKLRW0R0mRT;y>}TX?K4Mb1Q=I&+c$d}C3}Uf=EXsc zZFF9S;2DnZCU$p&y>IK^{@-}6UgRsQDE|7MMK(UuU9LaN&GvvR%#r-jh|Cqid{T_* zy9x6ujn?$&h3}H!A~S6{w^~r*W_i?I54*Ftb*aE1=G93Z(Dy!W1mF&Qfwf4Oz#ZAI z8f3FCYO5FRDC?NuGC4YVh4#w?^%s}G<6mYF^~82qjwui~YjB_EiMN5EgQ_9#M8H0J zR3qYHPsqE%;@xtAYp8{~UElLS6b0v^Y74YtffLjE9KJKOe-U%>hf(NrfUidl;uFoTw?c`y1ZonzE7LT~BhTzp-c z?d$pq98!`A$k}^)G6luSJ{xjZ?~PFITX~~*fIK)<42<|R_BON2HMdoPH=qlY-37TM=+651EW@uy zj%By0mMhl4dobNHLxC@mgb+n4g$vU3hT$#&C9n8Z|k5rXk-aCtHroJj&(dEDoYJB^KMYqSoH5n4E_0oKe#;T z>xBt++Sr^E{D#@Ni9_oZD~neFMvSI1YO?wlabO{Mbt6vhZBRjb;_2L%qm~qU?4?Tq z4ld5PZ!1%T0Nt(0QQux5pBt-4>`*IS?({j#T(>E8`DT=^eZ9AxG+ZDNTv)m>%kzlLuq2e!)!l5phu()JwGypGztxja|h zb?`ZTV`iq2F;iS)+z?v(ns9jK2Zh&-IQuBV<;g;(W>A)_xR*>Ac!ka7jUAVfi6BS5 zg*}q}?}k>^LJ@M!;fzrBo%ElZD%OIHw^SR*HWqEM@#Kpn)|q)y`CP&iG<(&mGV!XB z8$_Y`n~@|U;R?mLBlSa+P-!} z7U*~hyZRfjByOAgI=Z(B@b2}ljCp1Vl9AfAiH<&#;*O2(9^@3%Idu4_{iL?S_{x-< zmD!P8;OJsza$`jG=mCzkU=37g5{zWh5_X%7uyE_atAQAdI2iR;OwFu|C| z8Z^`kh8cXu_zN|urK`K7uVsdfb=9rTX3IUy;lt!9< z>fhuSJ7la)YxvKOP0wU;4=A*p@T;Fvw#Z|i%rs5t6#OlsXLn~&m}7u# zh@lD9Tr-d*lm_+=mXFzl*0^ADIw8UL(w(G%u?yR1In%BM>r3J%km1!2ethGqSzNFj z>rz&coz`P7H4NSBNHs=&dx#$x*|}6`fnPqifTbzzF0zAJe(hn8!A8%;Bj4a?}W)@}D9bD#p7K-Uei++7+zEYQQOFE{{C8nLr zm`Fd$oA^&JAmCbcFlBrm2u226R`S`(*|HTFMO|)9-`2!KUBj<(t@X4pW1y*2i9T2k zja~I$j}E!s21IYa1O3)J2Y^{$Id>u)e$d}VK_Y>a$fWBP0Og~(wepWP7_E=VR|(W` zQdhy}Jh$`|h~31*S_Qt1eYwM=V`h+Dvk=|)(1T5%(sNF?QwMdKtuxTris?DKizf%b z-L7EnA#x3@;XMQ<`oGT;rWlz6t0SHPS7-Y-Z-m!ZL+K zfMqPNWx5wZx=#-X0|6vO(N-W!C7pCmz~;yM_GUN>3!u6!)@1(RLROKk*}(-DEtdX+ zj_TlJE9%92ywg3`@UKd=`JqzlWgehD(&EODUTK&lJw5yL0%9IPP zVW(yRf1%GmmnyJ#82qZll;Hz}64j|%Dm(=MJX_JBK+jIq2@p}40~+4ksf`Ww)^8$* zytutxbMp{DT26{*YK>R2LdC(szH22=_nbfB4ZJVEY{)N=0p3;!CjTBWYF)-Cl-T6vT ziyf>jyu&YWE6AxUg}_$j`bSN^_xTKMFw0b`&xr0r#ag|gj%&~Zs4JnKOHDyLz}QwX z{)zU%mkn&&ZcF6noz1;KgQ^T>9}E9LLR(7uYKJ@t302T0U2l`u83@1m_{u8ZDjyI5_*is-T0 zbM&jYfHey+xQGg%xr9C1*?N!?5dW$y8DB+LbuJ!Yv(kRRDWNI^+m`r5Ni+3~=s*Tv zmz?Ue6?j}=6O8)!BcT5lz(+E!T;{jds;X~h-WWcwGsOsmv?+wz zZ%vbez#|KV@niVj(c!~y61AJGeQjzoc_fJlWIblUF8JlU2s@b2-z(?-dBEMG!~gZV znB>`qeDF$qU^8M3@dV4Kz_Wdmame%^m}ebgnJ&u;In1>wc>gsZcKo5bm= zbE(G0SiXNAtf+CKwkf6PfDOuxIludhj!@nQlHilyK}^qvc*l#S<_KrO&(L?`tzKfi zKONLTypz0pScBz+5RVtSj;v8JlodB_@1#-r@=8?>!M0LvM_q=aeiNi^Q-1$eo3nDV zfgrv!?nvc;ivQe+Qi>{2HcI@(T&2;*|D1)b9k=!M9(3T#-wxIuII?5^&RI_tk*rT@ zJa`P`#TB;{j!68ukKJ^IpqFsWvkggp11_&xt4&YA2W)>K!OSk|?FtH23aJp(^JX&Olk{M89# zF6qfczM^qmt$};uD)}Ix4uW-vcb@$Im^vQTMO5>Pzh5}Tgepln1D)(|;0$Cef<-$? z8dl1xDRrZTIT-AU^DZw0R2S7Y;cA#vd`kI7Luu81N)<> z+c*HyJ=_W_l+j9=KfS5lNeZj;&)Eq~=#%8}jF59Tf9EJSstsjuRNTdkZG8<|{?#L< zg6XmDmdL%Sf!D|)MO@ekUf|9*{oNszMWhz-UBv$gWmjKBmjLY`;2`#*ew3uW|YTZ}7aT;j-|;pP39+ zQsotYvE9J_m8~K9J6_LV9xXp)+_DO1Uqv=GH$w_3mxbBw(geY6Pd5X~3{x%wDmH%9 za#};Bc#@s|J~O5`61vv!%^MuYqie`ux-+J7u|`mN#P67#=9xGIe;6VkiTrJ%rL%L7 z5nQ6r-pSA6FX+rF4DxDFc7h>vzj+$gEOd2Bj0T>oUXsxekl#P3f*%(J1imYoeTE4_ z7Wa1AnA0DWYmZnox=WPFExyh|D~nC4;a~}TqCu)gbsWDRx=uoPrhUwUM)0p$d9%26 z>vk?HGq;(6#v+!6D(dQ`h1_b)E3cd)h-uBJ*rl(F0>bSSmUjctui*0xob)3>S z3_j>PcBOD0|AFS~9sYqD5&Rh=^d5x<C z)<~kcVv6qbIl_&3O?U}NKF_g)$IxY;uk1M=6K{!Ftq2F_E?BUN=}WUO=qgc)6VelZ zCUsWpn%!3DLLzXt;kAD2BXAUek3Q7O-6x5l<`s6BGI}QvY`x-c79r%*b$UiZzI3Yn zBC(|J|6EBnnqgG3p!d5s!lC;efUSIQ;@GZX=a^V-gxg+o7@sPEa9nOEtFEd^{3X}3 zk|gRNnG|;^cj(bj$qP-3p)&rYM8vHVhGB(-F-j5Xc`MB9O{rTU^nQMC3 z*j_1)+!N+Zr}Zf;nIwPmX#pqRc-iiI)q@X4|7fb|mDX;I)+DD6*EM9@x~k=20~tMZ zIF1%TiKxkqI-Zjn?K@&Lm_oPWk1Zw8hdBRKIb#b%IV}}`tB;Mew=z_NpcPv)^hQ-Gl zI+fYWNs{tGNfKQ094a4EN-_-=#?32}FA*s6YF4=Kcx;dosx(gyAr88^6{5LAQV6b~ zO=Jr{uW$!-%V~~kf4KsFYv^(AiScS0bdcelL`V$he(5P#Vn^mYuHaUv{iYBF5^29O zPDNywyy0HgQ@N?2pX&Lz_3ZqW%6VlUCGJoLUR}VT&d9|w@aj!se_^EJqO~OPybsyL zGf}eqO+iZ{*@ja9pWJ4eeF3Hu4t~hQ_I+ZM3c;G6VFX!RwX2@FAAWQ#w>Pj?r#-J0 zG?P83oy|1vw`1DqJIX3?!tWY~mw?-DbV$q^{S@X;vw80E<^J{24YLrN_qs_%f14hH zQozN75vu||W5HJD&FT|O{llI8h)YU&9u`yeuwDC#=KZoh@615(ot=DVr}f5dGtc_& zMR+WNx-wB6G%0T?An(lD?^E1Bcrxkusofs%20tqvU-R-HN)dq zPKi9i@f(j$p#xG_axR6Zzm>&e%Tw*0_nF~(F8@O{?=B@Ts#RJWEUQ`X^n(p1yZxE_ zDSfJaJ+2EJk)GL3B#rU?n?WZnSo25bx<$GRdTAlf`O4Np)b;$GS^sAuOb-#a-vnDR zI$JpvS7JA<^6RBpzLxEufd?6~IG@>I|1f*#2?8-S)Kq=4Scf+TYT^$sXHvvzSp(SzvJCdL5HV zpfziv+M2*=k^240exvLdm$Y8@KmDxLm(0ozzt)XxntHqP73Zo$9Xe5Gj|6We9bI$Q zea2i?T`dT!X3i>Z&XXCXeB-`j-x2U|R97GwcyyT6U9U)bhX%gcTsd%e;`fy_b0%vf zGb8aS)RI)h%uzU=e2cH&a<%9xtE|edS?_ZvPm=A2%~)U;n75vD%SCB!S(Ad-7wIg-DKP(Y7!=0LSCso}%V7xB1dSvN517-}nu_ zWd6>k9NPSrqJAms$WaVC!grnMOP@OLULv*olCG&da895KbfJ0>tU%a8?$`a=G~WqB zQ1x0z9Tx?ok)9p4Gb4gB5XZU9QPjGl&hf48A^+tTLz1k*>_~at$GjE=V}Fhn?-&Ba z_+_4zp}&PEKrQnACN)m{V!ossY4bQJ;$~YS@gy?A1?$8;7r%s~jFXi2H2s6f@PFDg zpQ<5^76b2se>x5Qrx!5lV0OoPO3imqDVl*_J+k`PHM}j_cULlX$+(T86SPb!+3O?Z ze}3$6Ov`nF91Yaa=b>=u0q7`(Zgo5ZEdbNVsGMoDEINg-&qJw&A9~cs5O3)T)<44% z|8@WlsMu#av$v>4E0%?bn%kIhCH;fzp`FC+=enSWp)i>rHFW10&9C|(K`{sdBG3;j~t~Pe`!8n zyTE|Brgqx;%o{mxZ_8a`Gw7fs4h)zyrwsA*ciYatfuPxYUI z;tJw5@YX{a3;DTX9d&`kpnH6%q^k)c@`FD(!G_;!S|YSipHvsS$dBgr(mM#aHw2za zjyD3CU$phNMXJdK=5lXTE%7%Cwwi5qQb&sKLLCZ@&RXRx#h5wu6}AuYrPvV&XcHY1Ns(M)jDA7gW34o{vKc}%Kni$JoQqEhe#(rsbCk%q?;`cPDo&mlxBBFGRGG>-IvffpRS@+Bq==pATPP&rGp{ z41%=27-sY7vnQTRkq4fEqDzZUU7IRqB3NZJXNixglS?@k99+oSN&R7Dfyk%_5|d)k z`B6b@R$PQ*1_2J?1nV^>3%Pc zesAH++#UrhS%>+4Z46PrNWri>upHLN`5#R-pL0wq3i5F!>WAfo1O6&=@CQ9NDC+mb zOPI5BKcnYba#C<%_y)ER_(kCEjW7a9yV2asGBov&R+a*JHcxtjjsy3yJj^qco~$py zUL&a32_y5>=4^Co5O(e}ou(@l2`FS{a=eMUbZdrHFk|*v69w;& zzfa~&1xaUVV}ld(uE9G;_c&O+$A$&Qg#Rw*2P{_}_Sb*0l%{@}=uFA7`5;fsin?v~ zm{I`7nH%hz#jo@npc~+w$+{X}uSjROmTY!Mh}PSUF*)g(nBXXCx-nXNzkQG&~O%7+?Yiy;bvwC*Kq`rqBpL`%yl$qYALcpFTLSD zv3PgPA9oTlYbye)2$DvNTpPi?a!tey!TqK+sLpX8Sv-D(o=}fZT2Gs50?#Sv#U_mn za4PQHg>`SA3JaCEXlKPz-@9Pe%vzrH2v>rz7)=9XY2Ap-?{ed6S*iF{Y~Vq8RN$_H z)DnFMdQ8WAVn`w4!Vi0~|97(?Uh;$I!=@#sdAw6UtNwSx0rj4~?RvNjMcU%(4$F-o zzz}*<9E_N+%U-c=8rws#K8x8u*7&-hYRJFrOz^0?|%^1e`4TtpCq4D*^(J= zY@#9iN7AcE?1H@S;EBwurgGN&k#?V&xpn<9_5t^;qPESI*Lw&KIUDsh+@k~f9rL%z zey?i$Cldzx?pJha+1 z?=N}l71w3(3E2r;oW6U$IOxpi!pm`u(4c~xW~+iJ%8Nbq-`^yupT7Yvbn+a zrQQdF;=<6?)$!a|Zc$dYc6k6(5IxoZFk}go(i%u)16E>Q8Gd#t0XZ(Dc-{qJ-Q3#? zX~Z}M-7`tb%RX3xWmSw=_;DGe-@DOW7ii;ypOCBk1FUi=v8k=2^ z@uHu$&bgyo6SgO@F%c{e4=PiS?_o;;%dhX;vshNR^CqWFo2jOODX5~Kxd!WReNAd1 z#HygvbXn$=S}0x{x%@s~*TQMPAm1XJ^&c)$#T{zn3n>CiNvMHpe=qC0X-h#5D0>el zkQxo$*o*xI%!;k{7kb=WvyhxU!3$Ri z@78uX?dkT3Z=xu-n0nYnly?W2$!BEEA!m~G1a`+V`?z&W_Oc_bxQ$cX3NqZ3d3rdr zk!P32?ujf)#D*Jiuis;6^vf5ON0|hxto{NCA7@<+igC?NdW;R4b+#WkcUV`xE&`Tu zhzT`fH<8?z&|0Ui{D@b&|Jm3R$=-Qy3KMLp62%*nBJX&Sy8pve4VK;sYEq;OGA~Q_ zugDHX{s}txnlXAuALP{UX+H>Wua#u6vw~%5aC}cXTB54KPuK0XU88>*ccNPBklxkJ z_w1kf=aQSRSwQqG=Tt?XEss@*ilb8ysq&5wOiiCGTUk|r<4&q!od{&dP9L&%Hpksc zlzPYc-r}@5N7g~N{0p!<-K$`igR|`d$eL|6$*NQCtD2~*{`~;zh-U%Y@SoxNU42)S zXuS@+7g>;V9*r~(%Gi97>QE>~X#6IX9tJ&`OV>flgXH$v6;iWRasC1sBWwyn|Y;?5p?3CGX@f zJ~daZ5tYmqYrB+P++^5q9kqFx&eQ{$v+;cCarsRDjdpVGnzqx}-m_^7qs}E`k&T6S zW*Tp+{cD!qWol)m zIV)3BbLBQ?R#xUn+>45wxN!@pSy?%AZ#4JL6}hnKM#%y0kqQb<5C@3L=~>v+td_q1&UXuovEgTEXV?|zx`-!yZOwA#d;We;-HX84$ujS2 zN1n;M>ygF`sk`Vq)Tud|KVvWqFa+P{AWFiQeZ~?G(Z>b5%!OLi!J>+wij*bWk$;9l z3%2$TP;zyIR_IP)_Fl2ZEZ-l~Hqw^b{cO)&DR*lXf)O!Rc~X_yk2apzF+KQOHM}BE zcU=au+l+WNcIn2`hEdQ?w1BuNxfw|7#_?ls#PfUv_hzgfklS~Aue7o=8D8M8kBV=2 zE(!JTKR$d{Gedb1Aw1^)tyU;p#ZZLh-o(r9=kc;C@>h`B4hp89UG7VE`!lcF^N1}; z6=ck*Lde>qWQ(@y-r7>3DJiPq(-&Uk3(P}o$v!t_(NzfYBnz;fZ#h$IYkhYwkiM2B z1rd_}5UasOHV3S{n7#EpbnrE8UTq1u2!8B+{x)-?P_%1>(60d{oj-Lkt;JxGfOq^x zNfqx04b8&05Lu63MtLA89^Yb4zL1fuhK|p7*0MKT1g{p&Qow!9*9SOa{O)}P+R};!T)FhGfqyxq#GZx1Ns`C;jAhzz0%NOg>*yD zUH87nOVIIy6|rVdQq}0!d#+wc4b!D~B?Kf*n$3&5&A}dw_u>YXZGpIz0G0`FGNC=f zFMlV)q?Y|Z^#Z<6rd*aXf%i@qLqvAt6qnyLH1prSxuaonCHm|XB&RSr|E;FyPjA^I zP;$Mp{$4b1;H|Jxu1idZBGtr|KWdU`s`MKQ%8fwt_Fv! zt6mGCNSbgs3s%QbNuo3}*xI6Ko#>%~t^&7JY`F+6nfRXo1kI&QKbT- zLh@p;8MPOEcptSNFx0%{Y>btV&S`%48C{AvYMU;54TmI5U=4xJJwg{x6cm8Q zBW;M~90I_J$lE?%s@;?C(0pNMKdYpnUfk?%AEbzx|gmL(mMB98AS4!7t($LB^W1jftmaVKUSeZzdACEn$qFK^=&&1v{2 ze8zM4rw4G z1r{GRuigUok`Aesgs}1{0%LN|Ds=tFb{djjbI2W3fcxWLB1cKsUdl_{7DK{MxRE|3 zmj7gLg8T?A=fec1p{I#WhMwR>svUr+u4jAJk-33Q2#3`=r@?!@NBG*Jm7;a1kB=h0 z3biVq%JS&2F>E0!NNE0E;K~uP^xe|FwSgs0Kfx@#IzcZ{rEh zo!HcHT(+fx%Xt4^4hs>Mn6GiGD#c;`Kenk}J?g7EzzbRSSHj}Jay=IJ1eI__h$8t< znLGqxGn$l9ls^f4E%<~PrqEF@gKB=6Jm~Xmr5JgUjz2L4NqEC$#Nd|^ezdD6d zsmYyRzdpu}=I>RDZ(1j@Uf{`-(>RA$7I6cy)V%$7Mrml<`L?oeVF1+`bfqnCXq`)m z^8z&$l6$L1XEQBr+umUfOtis5YljFf>wem(c?BnNL-s8jx26XbksBbLf-&|~)LjHC zcc@)`uOvFvs3*3|I*ssY8#1WKI?6AG2f+)PbS(gP(hvO2>?U@upvX^~wagbn5|2^V?kB7b?k@%z)6i|21RhdKxu@)fX5sH$bH`kJuLxIja^ zUI{5xXx!_!u87sdW8@-li~h11!xKYS51#gddBm!RCVwS6_<8w(W@{h0m?;5NG|@Gx z)GM}oVv&<22s?j-Sxc!CDOK7a0hD>mT6Xf)J4SQy;5UIUHcFM{*^6p~@!}7Gl^6a@ zhu-Jd?p3#k;VMjzgM=XO`^`~&@BUd|9={E4Q@uR#vyi^FsGA) zV>+dJIvA^E_}Mhm7L0(Oz`baxnA$1hY{C9W0h`>it?J8IOp~9A7vD~ceb%d@<$U&V zEoX04ihO@3FlTluJXFV?=EPiooAn8C`?7|gbiA_u^;KU5y`MjidfKN9sejv08|$d)DT629@?MUr_oT^ikbB z8c4I}NQh{w`%uf+zp8kt(^BAB{;wyY5mf`v(YX&hez1MUhw3>qu!K$Q;o6Md9IT8u zLu&o%NPIeY1(DKDUq|+dT2JeQ)rc@gO>skqjN`BHh0gsU(jQSq5mUVDa0Kp8S`&?c zbn_0zq5HZhaP;VQw;aeHV2dr8MJuJp##(=IL@BbA#LshYWuZC+J!m!$Wm(#@O325+X$T%FNg^#ovplpW<^2g$8waU$lIM zwksGPsl1*+|JX=V(;+Y8WyYEi5w(Zy zCkU6+|LtdIJ7u<}<|@m85xcvtBTo;phcqy7N*7frjvh>9zv1{Whu_@>udL>-HC+8f zWgj+~-RHuVz9Ehtx1)U%@)~>m8<;Ow_O$T|pwlI8!-$KR`J!jQJ=1O}d@b|BCjS-r zgPQw3kW6q#>*Jx^32mdsqn%dIHG*WK2b_EZc4R)czuQI~f|HP>Rhha`$s=a$P1*6! zPCK8&?T9ua=->x&+aXcZ(X!-ydrOPS3JM=uDb-x({&^2K7!) z4Y_3BA7-yQPS?6>HYY$*o*8}&D%X{Bcrp4sMVOKNAlO(8RX&sp#WYnWPK%sdDty%d z5pQwV2)5*?Y^Ny{UXuk2;2yWTZEsfvqMOp~x(pJR247vAgz6>PO|nJC0b|CU=HzsY zRCIJ=o4dSaF9B~O#20J+*d9-=X#nn~?G=WLo^*+ax_vUKPRRLs%fESi3+!RXWJg+- zV_Gw{@Jn9-I{dz#3x1+3?DV>On*@~!B3q6Ye+9b=$7i8TuBUu@bsU;AA<98 z@{I%oP~3uBuS}iU>>Qsb;=XS8*_TgY>z89hF*XJ9mJ@Nj-~5C?j(k@|7$u2e%(mUq zDNL01;dxBHj|^MQdD8ks@Q@3i&gM(~$$FO%-O={~%OV-A@T0lf?eWhOqhhG-O7g_AFad z?DLa$PAg3fSL6pO>Y$^+cy49ej@<=Go|!LsMPY@lhFvMBT2N4Qh35|Jm%iscTjhnQJXOUf-<}D+X=`}A z((08P#yX=KvT{41HJ)`+>+NQNuV!}vT|HP4T8tMUN$|{AJKeeJP8hRt6)EI4(IFl} zpP3Z4zd8B=(QjIc5%$gP*AKk$ZCj`k?NTeN{O^~&d@@@LDlGUF1m>P_=X956EG%&- zcifrh=PCD4cu{Ol%Wl01eWz%$S$4rN*Mbpw8`Fi|<2iv>HQl%>zSPP4V4(l7 zN%uAVNDsj3Wuk|E!m6UWN%&M+o8#3xEI$SMqNB>F0JW%o`n?Rlx!G}l%8u@VT7BM} z<8FK`mA*8L-O#R25wU>}hUdT&7AY(+yW?Ec7hyH}_!0)E=wBEjR{K~REpL%OI$RD! z85(veWGp`UC@4DPQ5$XQd=@m&HksqWw~CMfP_l<1l}3uEEbQq68g>3`H*AlZ9XL-F#6<%{-U0pN!CnzPz=^By z@5;X=8-^P0+L?gI@50VhJgKYSm{j__l%j^M7u6247#VZ6-Ae{fiq>kiwK$<*lr?mB zoz6l0=E3+L+`F?gl*H5=iGyF2{^LC9I59$RJA_dG`z#rh*@8Pp4MFir^nuE{D!bDAj@*R94Uq2pC^vPuzUFNj?B zx#Ulm9|lCQ`sMVwlr>B!yh+`bfxLOIeksOJtSMvnMt`i_)V=o-;4%5S+L*_(O%oqae2nWMo z80W6X6I0*DxdTUje<_}dygOU1!>jjm#8A#o!fQu>tMp%#DP=|^6XFT!aPI^T&HHo(G z21C4-;T3ZyUg%c)*yE}RHYAHo4seT!KbHyXj-TD9wSs;H2JCen~fA4>tOdEtFRqWyT>J?~1FQHnM`L6k|9iXrteN zLx{w$qw_4qhiB%;nt$gxkZ{n!FiOXkdj!SSp%1{>a!W(>djcUvXEya3I5(>bsBu1Krn z#P+Bc>kM}uv1k)(DB?!d->b^-f23%LU~duebjS}43B&8f(o7dK~lbDUC(1`tuNEQ zD3*^vm0Sa{|B`)sEefwyDwVn;HGu5%HoTa-JHohPEeteU@y=EH(XdqU+4T?lT+RS15edHWXKv+xw17$hr=35hZW#%g`eW{bk!>1p;bsgV zJ1nyy_(W8@jSM23+rL@`-+>0y%dn|nOSuJoB}-KWcf#T=waX7#FjygVd{jzpL%jO@ ziW2dphv!ezD{i42^3+2Nhx#B}d40>q% z#bo)^PWb9ORtvSWGvz!cs>1WN)!wn^6N_qsW%=Z=spBnu&Rz|# z=G^ELOSCYo;BU9kOH9GZEk&tH6zrR?$XDCalEg6n?%`R9Ut)acfVS%S3hXO5idGuf zmdEqk(>u$Jw|_rnKjYTW!Vy{8DQ|k;>*JK&a`e<`>g-hZP{^LP$nebG(=X|&=|7B; z8rsA+m1sy*1W|f9){e65Z%Hy(1TlU+nKeY$cmg$PSS{6?R3p^a*(roX>BNZS1emDy zvO>GQqqBfIylOuJtczk)=|=DEHuIfpO;rhXvh1pb>L_u$DPljZ zHUINVxB1bc8nl_SVC?kvopG5Q*EcBo#r$PN5b1VJMn)i)TL0K@qzG(39#~U#(6|Yu z)24LljCu|N|4$U9TvCTxgd&FiIvo8UX1Hm^VgujeI9_Vx%s(`x#LVu?%j=T=9Q&z_ zjgWE#kNakn9S6Kj`pumo&7}r*SmnThk{Vqtgpp>FTp2Bc3dt_3YSh62ntfeeET;e9Q)y`J z;}{nuN42(W?~F?2g<_2wgOv6@g3;&F{-23bpt0mj@A8$g#77Aix+L~Ic=Pa1dF{

    %$P1-E);|_%6A$0>&EyTRdEs|Qhq6gv@3 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%0Dmm9Wcz2PS8Xa&E{R&4e_nWX_o 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

  • _5y-_iuUQaJ`5aGO&-6+(|t4XL1b|$1{ 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 z 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

    }CsyV^};Vql& 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 z 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%0Af;PtF)gR^XSNn=|2WrK>Fmb%v!>U(VpPpaa@U`w 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

  • -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 =uK;BKDOUG!( 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 z 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

    diff --git a/src/octop/infra/knowledge/parse.py b/src/octop/infra/knowledge/parse.py index 2c6c01a7..ce52ef23 100644 --- a/src/octop/infra/knowledge/parse.py +++ b/src/octop/infra/knowledge/parse.py @@ -3,11 +3,12 @@ from __future__ import annotations import csv +import io import json from collections.abc import Iterable from html.parser import HTMLParser from pathlib import Path -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from octop.infra.knowledge.ocr import OCR_IMAGE_SUFFIXES @@ -23,6 +24,9 @@ ".yml", ".jsonl", } +_DOCX_FALLBACK_TAG = "{http://schemas.openxmlformats.org/markup-compatibility/2006}Fallback" +_DOCX_HTML_TYPES = {"application/xhtml+xml", "text/html"} +_DOCX_MAIN_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document" def parse_document(path: Path, *, ocr: OcrExtractor | None = None) -> str: @@ -50,9 +54,7 @@ def parse_document(path: Path, *, ocr: OcrExtractor | None = None) -> str: return text return ocr(path) if suffix == ".docx": - from docx import Document - - return "\n".join(paragraph.text for paragraph in Document(str(path)).paragraphs) + return _parse_docx(path) if suffix == ".pptx": from pptx import Presentation @@ -82,9 +84,67 @@ def _parse_json(path: Path) -> str: return json.dumps(parsed, ensure_ascii=False, indent=2) +def _parse_docx(path: Path) -> str: + from docx import Document + + document = Document(str(path)) + return _docx_body_text(document.element.body, document.part) + + +def _docx_body_text(body: Any, part: Any) -> str: + """Collect every ``w:p`` and ``w:altChunk`` in a body, in document order. + + ``Document.paragraphs`` only lists ``w:p`` children of ``w:body``, so text inside + tables, content controls (``w:sdt``), revision wrappers (``w:ins``), and text boxes + is silently dropped. ``mc:Fallback`` duplicates its ``mc:Choice`` sibling, so its + paragraphs are skipped. + """ + from docx.oxml.ns import qn + + alt_chunk_tag = qn("w:altChunk") + lines: list[str] = [] + for element in body.iter(qn("w:p"), alt_chunk_tag): + if next(element.iterancestors(_DOCX_FALLBACK_TAG), None) is not None: + continue + if element.tag == alt_chunk_tag: + lines.append(_docx_alt_chunk_text(element, part)) + else: + lines.append(element.text) + return "\n".join(lines) + + +def _docx_alt_chunk_text(element: Any, part: Any) -> str: + """Expand a ``w:altChunk`` reference the way Word does when opening the file. + + Converters keep the bulk of the text in an embedded HTML or Word part and leave + only a stub in ``document.xml``; unexpanded, that body is lost. + """ + from docx.oxml.ns import qn + + chunk = part.related_parts.get(element.get(qn("r:id")) or "") + if chunk is None: + return "" + content_type = str(chunk.content_type) + blob: bytes = chunk.blob + if content_type in _DOCX_HTML_TYPES: + return _html_text(blob.decode("utf-8-sig", errors="replace")) + if content_type == "text/plain": + return blob.decode("utf-8-sig", errors="replace") + if content_type == _DOCX_MAIN_TYPE: + from docx import Document + + nested = Document(io.BytesIO(blob)) + return _docx_body_text(nested.element.body, nested.part) + return "" + + def _parse_html(path: Path) -> str: + return _html_text(_read_text(path)) + + +def _html_text(raw: str) -> str: parser = _HTMLTextParser() - parser.feed(_read_text(path)) + parser.feed(raw) parser.close() lines = [" ".join(line.split()) for line in parser.text().splitlines()] return "\n".join(line for line in lines if line) diff --git a/tests/unit/knowledge/test_parse.py b/tests/unit/knowledge/test_parse.py index ae8e5891..15c99069 100644 --- a/tests/unit/knowledge/test_parse.py +++ b/tests/unit/knowledge/test_parse.py @@ -2,12 +2,65 @@ from __future__ import annotations +import io +import zipfile from pathlib import Path import pytest from octop.infra.knowledge.parse import parse_document +_DOCX_NAMESPACES = ( + 'xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" ' + 'xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" ' + 'xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ' + 'xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" ' + 'xmlns:v="urn:schemas-microsoft-com:vml"' +) +_DOCX_MAIN_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document" +_ALT_CHUNK_RELATIONSHIP = ( + '' +) + + +def _docx_paragraph(text: str) -> str: + return f"{text}" + + +def _docx_with_body( + path: Path, body_xml: str, *, alt_chunk: tuple[str, str, bytes] | None = None +) -> Path: + """Write a .docx whose ``w:body`` holds *body_xml* verbatim. + + *alt_chunk* is ``(part_name, content_type, blob)`` for a part related as ``rId99``, + matching what converters emit for ````. + """ + from docx import Document + + Document().save(path) + document = f"{body_xml}".encode() + with zipfile.ZipFile(path) as source: + entries = [(info.filename, source.read(info.filename)) for info in source.infolist()] + buffer = io.BytesIO() + with zipfile.ZipFile(buffer, "w") as target: + for name, data in entries: + if name == "word/document.xml": + data = document + elif alt_chunk is not None and name == "word/_rels/document.xml.rels": + relationship = _ALT_CHUNK_RELATIONSHIP.format(name=alt_chunk[0]) + data = data.replace( + b"", relationship.encode() + b"" + ) + elif alt_chunk is not None and name == "[Content_Types].xml": + override = f'' + data = data.replace(b"", override.encode() + b"") + target.writestr(name, data) + if alt_chunk is not None: + target.writestr(alt_chunk[0], alt_chunk[2]) + path.write_bytes(buffer.getvalue()) + return path + def test_parse_plain_text_and_markdown(tmp_path: Path) -> None: text = tmp_path / "notes.txt" @@ -45,6 +98,55 @@ def test_parse_pdf_docx_and_pptx(tmp_path: Path) -> None: assert parse_document(pptx) == "Slide title" +def test_parse_docx_reads_tables_content_controls_and_revisions(tmp_path: Path) -> None: + body = ( + _docx_paragraph("发布说明") + + "" + + f"{_docx_paragraph('第一章 总则')}" + + f"{_docx_paragraph('第一条 为了规范')}" + + '' + + f"{_docx_paragraph('第二条 本办法适用于')}" + ) + path = _docx_with_body(tmp_path / "nested.docx", body) + + assert parse_document(path) == "发布说明\n\n第一章 总则\n第一条 为了规范\n第二条 本办法适用于" + + +def test_parse_docx_reads_text_box_once(tmp_path: Path) -> None: + text_box = f"{_docx_paragraph('文本框内容')}" + body = _docx_paragraph("正文段落") + ( + "" + f'{text_box}' + f"{text_box}" + "" + ) + path = _docx_with_body(tmp_path / "textbox.docx", body) + + assert parse_document(path) == "正文段落\n\n文本框内容" + + +def test_parse_docx_expands_html_alt_chunk(tmp_path: Path) -> None: + chunk = "

    第一章 总则

    第一条 为了规范

    ".encode() + path = _docx_with_body( + tmp_path / "html_chunk.docx", + _docx_paragraph("发布说明") + '', + alt_chunk=("chunk.xhtml", "application/xhtml+xml", chunk), + ) + + assert parse_document(path) == "发布说明\n第一章 总则\n第一条 为了规范" + + +def test_parse_docx_expands_word_alt_chunk(tmp_path: Path) -> None: + nested = _docx_with_body(tmp_path / "nested.docx", _docx_paragraph("嵌套正文")) + path = _docx_with_body( + tmp_path / "word_chunk.docx", + _docx_paragraph("发布说明") + '', + alt_chunk=("chunk.docx", _DOCX_MAIN_TYPE, nested.read_bytes()), + ) + + assert parse_document(path) == "发布说明\n嵌套正文" + + def test_parse_csv_xlsx_and_xls(tmp_path: Path) -> None: import xlwt from openpyxl import Workbook From 94b161e61fad5482006013d01da2f8a4434ca672 Mon Sep 17 00:00:00 2001 From: liukewia Date: Fri, 4 Sep 2026 16:41:42 +0800 Subject: [PATCH 48/58] chore: update product identifier from "com.octop.desktop" to "com.tencent.octop" in configuration files --- desktop/src/build/config.yml | 2 +- desktop/src/build/darwin/Info.dev.plist | 2 +- desktop/src/build/darwin/Info.plist | 2 +- desktop/src/build/windows/wails.exe.manifest | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/desktop/src/build/config.yml b/desktop/src/build/config.yml index b328236e..98ce1482 100644 --- a/desktop/src/build/config.yml +++ b/desktop/src/build/config.yml @@ -5,7 +5,7 @@ version: "3" info: companyName: "Octop" productName: "Octop" - productIdentifier: "com.octop.desktop" + productIdentifier: "com.tencent.octop" description: "Octop desktop shell" copyright: "(c) 2026, Octop" comments: "Wails v3 + green portable" diff --git a/desktop/src/build/darwin/Info.dev.plist b/desktop/src/build/darwin/Info.dev.plist index 1b2364b5..15853910 100644 --- a/desktop/src/build/darwin/Info.dev.plist +++ b/desktop/src/build/darwin/Info.dev.plist @@ -9,7 +9,7 @@ CFBundleExecutable Octop CFBundleIdentifier - com.octop.desktop + com.tencent.octop CFBundleVersion 0.9.26.dev CFBundleGetInfoString diff --git a/desktop/src/build/darwin/Info.plist b/desktop/src/build/darwin/Info.plist index 8a5ceba3..5da447cb 100644 --- a/desktop/src/build/darwin/Info.plist +++ b/desktop/src/build/darwin/Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable Octop CFBundleIdentifier - com.octop.desktop + com.tencent.octop CFBundleVersion 0.9.26 CFBundleGetInfoString diff --git a/desktop/src/build/windows/wails.exe.manifest b/desktop/src/build/windows/wails.exe.manifest index 3ff7dde8..a2adb2ee 100644 --- a/desktop/src/build/windows/wails.exe.manifest +++ b/desktop/src/build/windows/wails.exe.manifest @@ -1,6 +1,6 @@ - + From 668434c457d85a0f3eba6f66e2675d4adf7f5ae4 Mon Sep 17 00:00:00 2001 From: liukewia Date: Fri, 4 Sep 2026 18:02:48 +0800 Subject: [PATCH 49/58] fix(desktop): stamp pyproject version into packaged app metadata Release packaging now writes the package version into Info.plist, Windows VERSIONINFO, and NSIS instead of leaving stale hardcoded copies in the shipped app. Co-authored-by: Cursor --- CHANGELOG.md | 1 + desktop/src/.gitignore | 2 + desktop/src/build/config.yml | 2 + desktop/src/build/darwin/Taskfile.yml | 4 + desktop/src/build/stamp_version.py | 101 ++++++++++++++++++ desktop/src/build/windows/Taskfile.yml | 19 +++- .../src/build/windows/nsis/wails_tools.nsh | 3 +- tests/unit/desktop/test_stamp_version.py | 83 ++++++++++++++ 8 files changed, 211 insertions(+), 4 deletions(-) create mode 100644 desktop/src/build/stamp_version.py create mode 100644 tests/unit/desktop/test_stamp_version.py diff --git a/CHANGELOG.md b/CHANGELOG.md index e7c8112a..7c8a35e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ ### 修复 +- 桌面客户端打包把 `pyproject.toml` 版本写入 macOS Info.plist、Windows 文件版本和 NSIS 安装器,不再沿用写死的旧号 - 用户发布专家卡片展示快照内自定义头像(`icon_url` + `/api/experts/published/{id}/avatar`),不再只显示默认 Lucide 图标 - 用户管理表格(桌面端)横向滚动时固定用户名与操作列(与专家列表一致;移动端不固定) - 运行轨迹流式事件在内存聚合、回合边界持久化,避免逐 token 写库和重复存储上下文全文 diff --git a/desktop/src/.gitignore b/desktop/src/.gitignore index 47359f35..c51fe70d 100644 --- a/desktop/src/.gitignore +++ b/desktop/src/.gitignore @@ -5,5 +5,7 @@ bundled/portable.zip build/windows/*.syso build/darwin/icons.icns build/windows/icon.ico +build/windows/info.generated.json +build/windows/wails.exe.generated.manifest build/windows/nsis/MicrosoftEdgeWebview2Setup.exe build/linux/icon.png diff --git a/desktop/src/build/config.yml b/desktop/src/build/config.yml index 98ce1482..0ded6e82 100644 --- a/desktop/src/build/config.yml +++ b/desktop/src/build/config.yml @@ -1,5 +1,7 @@ # This file contains the configuration for this project. # When you update `info`, run `wails3 task common:update:build-assets` to refresh generated assets. +# `info.version` is a fallback for local `wails3 generate`; release packaging stamps +# pyproject.toml's version onto the .app / exe / NSIS metadata. version: "3" info: diff --git a/desktop/src/build/darwin/Taskfile.yml b/desktop/src/build/darwin/Taskfile.yml index c7abb0fb..a9d69adb 100644 --- a/desktop/src/build/darwin/Taskfile.yml +++ b/desktop/src/build/darwin/Taskfile.yml @@ -36,6 +36,7 @@ tasks: vars: PORTABLE_ZIP: "{{.PORTABLE_ZIP}}" ARCH: "{{.ARCH}}" + VERSION: "{{.VERSION}}" - rm -f {{.ARCHIVE}} {{.BIN_DIR}}/{{.APP_NAME}}-Desktop-darwin-{{.ARCH}}.zip {{.BIN_DIR}}/{{.APP_NAME}}-Desktop-darwin-{{.ARCH}}.dmg - | set -euo pipefail @@ -141,7 +142,10 @@ tasks: - cp {{.PORTABLE_ZIP}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources/Octop-darwin-{{.ARCH}}.zip - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS - cp build/darwin/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents + - python3 build/stamp_version.py plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Info.plist "{{.VERSION}}" - codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.app + vars: + VERSION: '{{.VERSION | default "dev"}}' run: cmds: diff --git a/desktop/src/build/stamp_version.py b/desktop/src/build/stamp_version.py new file mode 100644 index 00000000..8f0f1cf0 --- /dev/null +++ b/desktop/src/build/stamp_version.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +"""Stamp the Octop version into Wails desktop metadata copies.""" + +from __future__ import annotations + +import argparse +import json +import plistlib +import re +import shutil +import sys +from pathlib import Path + +_MANIFEST_IDENTITY = re.compile( + r'(]*\bname="com\.tencent\.octop"[^>]*\bversion=")[^"]+(")', + re.IGNORECASE, +) + + +def should_stamp(version: str) -> bool: + """Skip placeholders that are not a product version (NSIS needs x.y.z).""" + return bool(version) and version != "dev" + + +def four_part_version(version: str) -> str | None: + """Windows assemblyIdentity requires four numeric components.""" + parts = version.split(".") + if not parts or not all(p.isdigit() for p in parts): + return None + while len(parts) < 4: + parts.append("0") + return ".".join(parts[:4]) + + +def stamp_plist(path: Path, version: str) -> None: + if not should_stamp(version): + return + data = plistlib.loads(path.read_bytes()) + data["CFBundleVersion"] = version + data["CFBundleShortVersionString"] = version + path.write_bytes(plistlib.dumps(data)) + + +def stamp_info_json(src: Path, dest: Path, version: str) -> None: + dest.parent.mkdir(parents=True, exist_ok=True) + if src.resolve() != dest.resolve(): + shutil.copyfile(src, dest) + if not should_stamp(version): + return + data = json.loads(dest.read_text(encoding="utf-8")) + data["fixed"]["file_version"] = version + data["info"]["0000"]["ProductVersion"] = version + dest.write_text(json.dumps(data, indent=4) + "\n", encoding="utf-8") + + +def stamp_manifest(src: Path, dest: Path, version: str) -> None: + dest.parent.mkdir(parents=True, exist_ok=True) + if src.resolve() != dest.resolve(): + shutil.copyfile(src, dest) + if not should_stamp(version): + return + dotted = four_part_version(version) + if dotted is None: + return + text = dest.read_text(encoding="utf-8") + updated, n = _MANIFEST_IDENTITY.subn(rf"\g<1>{dotted}\2", text, count=1) + if n != 1: + raise SystemExit(f"octop assemblyIdentity not found in {dest}") + dest.write_text(updated, encoding="utf-8") + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + sub = parser.add_subparsers(dest="cmd", required=True) + + plist_p = sub.add_parser("plist", help="Set CFBundleVersion keys on a copied Info.plist") + plist_p.add_argument("path", type=Path) + plist_p.add_argument("version") + + json_p = sub.add_parser("json", help="Copy windows/info.json and set file/product version") + json_p.add_argument("src", type=Path) + json_p.add_argument("dest", type=Path) + json_p.add_argument("version") + + man_p = sub.add_parser("manifest", help="Copy wails.exe.manifest and set assembly version") + man_p.add_argument("src", type=Path) + man_p.add_argument("dest", type=Path) + man_p.add_argument("version") + + args = parser.parse_args(argv) + if args.cmd == "plist": + stamp_plist(args.path, args.version) + elif args.cmd == "json": + stamp_info_json(args.src, args.dest, args.version) + else: + stamp_manifest(args.src, args.dest, args.version) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/desktop/src/build/windows/Taskfile.yml b/desktop/src/build/windows/Taskfile.yml index 6536e9ff..64a562c4 100644 --- a/desktop/src/build/windows/Taskfile.yml +++ b/desktop/src/build/windows/Taskfile.yml @@ -14,6 +14,7 @@ tasks: - task: generate:syso vars: ARCH: "{{.ARCH}}" + VERSION: "{{.VERSION}}" - go build {{.BUILD_FLAGS}} -o "{{.BIN_DIR}}/{{.APP_NAME}}.exe" - cmd: powershell Remove-item *.syso platforms: [windows] @@ -21,6 +22,7 @@ tasks: platforms: [linux, darwin] vars: BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}' + VERSION: '{{.VERSION | default "dev"}}' env: GOOS: windows CGO_ENABLED: "0" @@ -49,6 +51,7 @@ tasks: vars: PRODUCTION: "true" ARCH: "{{.ARCH}}" + VERSION: "{{.VERSION}}" - task: create:nsis:installer vars: ARCH: "{{.ARCH}}" @@ -79,13 +82,14 @@ tasks: New-Item -ItemType Directory -Force '{{.ROOT_DIR}}/{{.BIN_DIR}}' | Out-Null" - | {{if eq OS "windows"}} - makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" -DINSTALLER_OUTFILE="{{.ROOT_DIR}}\{{.ARCHIVE}}" project.nsi + makensis {{.VERSION_NSIS_DEFINE}}-DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" -DINSTALLER_OUTFILE="{{.ROOT_DIR}}\{{.ARCHIVE}}" project.nsi {{else}} - makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" -DINSTALLER_OUTFILE="{{.ROOT_DIR}}/{{.ARCHIVE}}" project.nsi + makensis {{.VERSION_NSIS_DEFINE}}-DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" -DINSTALLER_OUTFILE="{{.ROOT_DIR}}/{{.ARCHIVE}}" project.nsi {{end}} vars: ARCH: '{{.ARCH | default ARCH}}' VERSION: '{{.VERSION | default "dev"}}' + VERSION_NSIS_DEFINE: '{{if and .VERSION (ne .VERSION "dev")}}-DINFO_PRODUCTVERSION="{{.VERSION}}" {{end}}' ARG_FLAG: '{{if eq (.ARCH | default ARCH) "amd64"}}AMD64{{else}}ARM64{{end}}' ARCHIVE: '{{.BIN_DIR}}/{{.APP_NAME}}-desktop-windows-{{.ARCH}}-{{.VERSION}}.exe' @@ -97,6 +101,15 @@ tasks: summary: Generates Windows .syso (linked from module root) dir: build cmds: - - wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso + - cmd: python stamp_version.py json windows/info.json windows/info.generated.json "{{.VERSION}}" + platforms: [windows] + - cmd: python3 stamp_version.py json windows/info.json windows/info.generated.json "{{.VERSION}}" + platforms: [linux, darwin] + - cmd: python stamp_version.py manifest windows/wails.exe.manifest windows/wails.exe.generated.manifest "{{.VERSION}}" + platforms: [windows] + - cmd: python3 stamp_version.py manifest windows/wails.exe.manifest windows/wails.exe.generated.manifest "{{.VERSION}}" + platforms: [linux, darwin] + - wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.generated.manifest -info windows/info.generated.json -out ../wails_windows_{{.ARCH}}.syso vars: ARCH: "{{.ARCH | default ARCH}}" + VERSION: '{{.VERSION | default "dev"}}' diff --git a/desktop/src/build/windows/nsis/wails_tools.nsh b/desktop/src/build/windows/nsis/wails_tools.nsh index 2c88b92f..5212bfaf 100644 --- a/desktop/src/build/windows/nsis/wails_tools.nsh +++ b/desktop/src/build/windows/nsis/wails_tools.nsh @@ -1,5 +1,6 @@ # Shared NSIS helpers for the Octop desktop installer. -# Keep INFO_* defaults in sync with desktop/src/build/config.yml. +# INFO_PRODUCTVERSION fallback for a local makensis without -D. +# Release packaging passes -DINFO_PRODUCTVERSION from pyproject.toml. !include "x64.nsh" !include "WinVer.nsh" diff --git a/tests/unit/desktop/test_stamp_version.py b/tests/unit/desktop/test_stamp_version.py new file mode 100644 index 00000000..c5801e52 --- /dev/null +++ b/tests/unit/desktop/test_stamp_version.py @@ -0,0 +1,83 @@ +"""Tests for desktop Wails version stamping.""" + +from __future__ import annotations + +import importlib.util +import json +import plistlib +from pathlib import Path + +_STAMP = Path(__file__).resolve().parents[3] / "desktop" / "src" / "build" / "stamp_version.py" +_SPEC = importlib.util.spec_from_file_location("octop_desktop_stamp_version", _STAMP) +assert _SPEC is not None and _SPEC.loader is not None +stamp_version = importlib.util.module_from_spec(_SPEC) +_SPEC.loader.exec_module(stamp_version) + + +def test_stamp_plist_sets_bundle_versions(tmp_path: Path) -> None: + src = ( + Path(__file__).resolve().parents[3] / "desktop" / "src" / "build" / "darwin" / "Info.plist" + ) + dest = tmp_path / "Info.plist" + dest.write_bytes(src.read_bytes()) + stamp_version.stamp_plist(dest, "1.2.3") + data = plistlib.loads(dest.read_bytes()) + assert data["CFBundleVersion"] == "1.2.3" + assert data["CFBundleShortVersionString"] == "1.2.3" + assert data["LSMinimumSystemVersion"] == "12.0.0" + + +def test_stamp_plist_skips_dev_placeholder(tmp_path: Path) -> None: + dest = tmp_path / "Info.plist" + dest.write_bytes( + plistlib.dumps({"CFBundleVersion": "0.9.31", "CFBundleShortVersionString": "0.9.31"}) + ) + stamp_version.stamp_plist(dest, "dev") + data = plistlib.loads(dest.read_bytes()) + assert data["CFBundleVersion"] == "0.9.31" + + +def test_stamp_info_json_copies_and_sets_version(tmp_path: Path) -> None: + src = ( + Path(__file__).resolve().parents[3] / "desktop" / "src" / "build" / "windows" / "info.json" + ) + dest = tmp_path / "info.generated.json" + stamp_version.stamp_info_json(src, dest, "1.2.3") + data = json.loads(dest.read_text(encoding="utf-8")) + assert data["fixed"]["file_version"] == "1.2.3" + assert data["info"]["0000"]["ProductVersion"] == "1.2.3" + original = json.loads(src.read_text(encoding="utf-8")) + assert original["info"]["0000"]["CompanyName"] == data["info"]["0000"]["CompanyName"] + + +def test_stamp_info_json_dev_keeps_source_version(tmp_path: Path) -> None: + src = ( + Path(__file__).resolve().parents[3] / "desktop" / "src" / "build" / "windows" / "info.json" + ) + dest = tmp_path / "info.generated.json" + stamp_version.stamp_info_json(src, dest, "dev") + data = json.loads(dest.read_text(encoding="utf-8")) + original = json.loads(src.read_text(encoding="utf-8")) + assert data["fixed"]["file_version"] == original["fixed"]["file_version"] + + +def test_four_part_version_pads_semver() -> None: + assert stamp_version.four_part_version("1.2.3") == "1.2.3.0" + assert stamp_version.four_part_version("1.2.3.4") == "1.2.3.4" + assert stamp_version.four_part_version("dev") is None + + +def test_stamp_manifest_sets_octop_identity_only(tmp_path: Path) -> None: + src = ( + Path(__file__).resolve().parents[3] + / "desktop" + / "src" + / "build" + / "windows" + / "wails.exe.manifest" + ) + dest = tmp_path / "wails.exe.generated.manifest" + stamp_version.stamp_manifest(src, dest, "1.2.3") + text = dest.read_text(encoding="utf-8") + assert 'name="com.tencent.octop" version="1.2.3.0"' in text + assert 'name="Microsoft.Windows.Common-Controls" version="6.0.0.0"' in text From fa2f6a7f569eb0c6344ea5f071294c8c67da91c3 Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Fri, 4 Sep 2026 09:48:39 +0000 Subject: [PATCH 50/58] feat(browser): isolate harness-browser profiles per Octop user Replace the legacy shared/default Playwright session router with per-user harness-browser profiles (`user-`) so concurrent users no longer share one Chrome session, cookie jar, or recording. The backend now always derives the profile from the authenticated user (or the IM thread's agent owner) instead of trusting client-supplied profile/session ids, and a BrowserProfileMiddleware pins tool-selected profiles to the same boundary. Also dedupes ThreadRegistry's session-refresh logic. --- dashboard/src/api/modules/browser.ts | 66 +- .../src/components/BrowserWorkspace/index.tsx | 6 +- dashboard/src/hooks/useBrowserSessionState.ts | 31 +- dashboard/src/hooks/useBrowserStream.ts | 8 +- .../pages/Chat/components/ChatDockPanel.tsx | 4 +- dashboard/src/pages/Chat/hooks/useChatSend.ts | 3 - .../Chat/utils/summarizeHitlAction.test.ts | 6 +- .../pages/Chat/utils/summarizeHitlAction.ts | 4 +- .../src/pages/Control/RemoteBrowser/index.tsx | 91 +-- dashboard/src/utils/browserProfile.ts | 24 +- docs/api.md | 4 +- src/octop/api/openapi_meta.py | 2 +- src/octop/api/routers/browser/__init__.py | 6 +- src/octop/api/routers/browser/env.py | 174 +++++ src/octop/api/routers/browser/harness.py | 87 +-- .../api/routers/browser/record_replay.py | 122 ++- src/octop/api/routers/browser/sessions.py | 704 ------------------ src/octop/api/routers/browser/stream.py | 10 +- src/octop/infra/agents/manager.py | 2 + .../agents/middleware/browser_profile.py | 71 ++ .../infra/gateway/process/message_keys.py | 2 + src/octop/infra/gateway/threads.py | 95 +-- src/octop/infra/utils/browser_media.py | 30 +- tests/integration/test_browser_api.py | 129 +--- .../test_browser_record_replay_api.py | 77 +- .../agents/test_browser_profile_middleware.py | 78 ++ tests/unit/api/test_acl_gate_coverage.py | 2 +- tests/unit/api/test_browser_stream_listen.py | 30 + tests/unit/api/test_harness_tabs.py | 10 +- tests/unit/gateway/test_thread_registry.py | 101 +++ 30 files changed, 814 insertions(+), 1165 deletions(-) create mode 100644 src/octop/api/routers/browser/env.py delete mode 100644 src/octop/api/routers/browser/sessions.py create mode 100644 src/octop/infra/agents/middleware/browser_profile.py create mode 100644 tests/unit/agents/test_browser_profile_middleware.py diff --git a/dashboard/src/api/modules/browser.ts b/dashboard/src/api/modules/browser.ts index 767eafcf..26287bc8 100644 --- a/dashboard/src/api/modules/browser.ts +++ b/dashboard/src/api/modules/browser.ts @@ -125,14 +125,8 @@ export const browserApi = { // -- Sessions -- - getSessions: (conversationId?: string) => { - const path = conversationId - ? `/browser/harness-sessions?conversation_id=${encodeURIComponent( - conversationId, - )}` - : "/browser/harness-sessions"; - return request(path); - }, + getSessions: () => + request("/browser/harness-sessions"), handoff: (sessionId: string, target: "agent" | "user", reason = "") => request<{ ok: boolean; session: BrowserSession }>( @@ -144,12 +138,10 @@ export const browserApi = { ), /** Stop the local Chrome process. Login cookies stay in the on-disk profile. */ - shutdown: (profile?: string) => { - const path = profile - ? `/browser/shutdown?profile=${encodeURIComponent(profile)}` - : "/browser/shutdown"; - return request<{ ok: boolean; profile: string }>(path, { method: "POST" }); - }, + shutdown: () => + request<{ ok: boolean; profile: string }>("/browser/shutdown", { + method: "POST", + }), // -- Browser stream (WebSocket CDP screencast, ~10 fps) -- @@ -181,44 +173,6 @@ export const browserApi = { return new WebSocket(wsUrl); }, - // -- Tabs (REST fallback when WebSocket is unavailable) -- - - /** - * Switch the active tab by page_id. - */ - switchTab: (sessionId: string, pageId: string) => - request<{ ok: boolean; page_id: string; url: string }>( - `/browser/sessions/${sessionId}/tabs/switch`, - { - method: "POST", - body: JSON.stringify({ page_id: pageId }), - }, - ), - - /** - * Create a new browser tab, optionally navigating to a URL. - */ - newTab: (sessionId: string, url = "about:blank") => - request<{ ok: boolean; page_id: string; url: string; tabs: TabInfo[] }>( - `/browser/sessions/${sessionId}/tabs/new`, - { - method: "POST", - body: JSON.stringify({ url }), - }, - ), - - /** - * Close a browser tab by page_id. - */ - closeTab: (sessionId: string, pageId: string) => - request<{ ok: boolean; closed: string; tabs: TabInfo[] }>( - `/browser/sessions/${sessionId}/tabs/close`, - { - method: "POST", - body: JSON.stringify({ page_id: pageId }), - }, - ), - // -- Browser record/replay -- recordReplayStatus: () => @@ -264,11 +218,3 @@ export const browserApi = { }, ), }; - -// -- Tab info type -- -export interface TabInfo { - page_id: string; - url: string; - title?: string; - active: boolean; -} diff --git a/dashboard/src/components/BrowserWorkspace/index.tsx b/dashboard/src/components/BrowserWorkspace/index.tsx index fba0a4e3..10c54a7c 100644 --- a/dashboard/src/components/BrowserWorkspace/index.tsx +++ b/dashboard/src/components/BrowserWorkspace/index.tsx @@ -32,7 +32,6 @@ import { } from "../../hooks/useViewportMode"; import { normalizeUrl } from "../../utils/normalizeUrl"; import { viewportModeLabel } from "../../utils/browserViewport"; -import { DEFAULT_BROWSER_PROFILE } from "../../utils/browserProfile"; import { showApiError } from "../../utils/showApiToast"; import BrowserViewer, { type BrowserViewerHandle } from "../BrowserViewer"; import styles from "./index.module.less"; @@ -42,8 +41,7 @@ export type PanelMode = "hidden" | "bottom" | "right" | "popup"; const DEFAULT_URL = "https://cloud.tencent.com"; interface BrowserWorkspaceProps { - /** Conversation/session id used to attach the screencast to the agent's - * Chrome. Falls back to "default" on the backend when absent. */ + /** Harness profile for the current user. Server enforces the same mapping. */ sessionId?: string | null; environment?: DisplayEnvironment; style?: React.CSSProperties; @@ -171,7 +169,7 @@ const BrowserWorkspace: React.FC = ({ } return { session_id: sessionInfo.session_id, - profile_name: DEFAULT_BROWSER_PROFILE, + profile_name: sessionInfo.session_id, conversation_id: sessionInfo.conversation_id, channel_source: sessionInfo.channel_source, state: sessionInfo.state || "idle", diff --git a/dashboard/src/hooks/useBrowserSessionState.ts b/dashboard/src/hooks/useBrowserSessionState.ts index 4a579aee..3cce37a7 100644 --- a/dashboard/src/hooks/useBrowserSessionState.ts +++ b/dashboard/src/hooks/useBrowserSessionState.ts @@ -3,7 +3,8 @@ import api from "../api"; import { getWsUrl } from "../api/config"; import { getAuthToken } from "../api/request"; import type { BrowserSession, DisplayEnvironment } from "../api/types/browser"; -import { DEFAULT_BROWSER_PROFILE } from "../utils/browserProfile"; +import { resolveBrowserProfile } from "../utils/browserProfile"; +import { useCurrentUser } from "./useCurrentUser"; /** * Session update event pushed over WebSocket from the backend. @@ -57,6 +58,9 @@ export function useBrowserSessionState( conversationId?: string, enabled = true, ): BrowserSessionState { + const currentUser = useCurrentUser(); + const browserProfile = resolveBrowserProfile(currentUser?.id); + const active = enabled && browserProfile != null; const [session, setSession] = useState(null); const [environment, setEnvironment] = useState("headless-server"); @@ -73,7 +77,7 @@ export function useBrowserSessionState( const fetchSessions = useCallback(async () => { try { - const resp = await api.getSessions(conversationIdRef.current); + const resp = await api.getSessions(); if (unmountedRef.current) return; if (resp.ok) { setEnvironment(resp.environment); @@ -104,7 +108,7 @@ export function useBrowserSessionState( }, []); const connectWs = useCallback(() => { - if (unmountedRef.current) return; + if (unmountedRef.current || !browserProfile) return; // Clean up any previous connection if (wsRef.current) { @@ -149,7 +153,7 @@ export function useBrowserSessionState( width: 1, height: 1, reuse_session: true, - session_id: DEFAULT_BROWSER_PROFILE, + session_id: browserProfile, }), ); } catch { @@ -168,12 +172,11 @@ export function useBrowserSessionState( type: string; }; if (msg.type === "session_update") { - // Shared default profile applies across conversations; also accept - // updates scoped to the current conversation id when present. + // Browser state is scoped to the authenticated user's profile. const cid = conversationIdRef.current; const shared = - msg.session_id === DEFAULT_BROWSER_PROFILE || - msg.conversation_id === DEFAULT_BROWSER_PROFILE; + msg.session_id === browserProfile || + msg.conversation_id === browserProfile; if (!cid || shared || msg.conversation_id === cid) { setSession((prev) => { if (!prev) { @@ -182,7 +185,7 @@ export function useBrowserSessionState( // HTTP fetch to complete. return { session_id: msg.session_id, - profile_name: DEFAULT_BROWSER_PROFILE, + profile_name: browserProfile, conversation_id: msg.conversation_id, channel_source: msg.channel_source, state: msg.state, @@ -230,7 +233,7 @@ export function useBrowserSessionState( }; wsRef.current = ws; - }, [fetchSessions, scheduleReconnect]); + }, [browserProfile, fetchSessions, scheduleReconnect]); useEffect(() => { connectWsRef.current = connectWs; @@ -240,7 +243,7 @@ export function useBrowserSessionState( // Initial HTTP fetch + WS connect useEffect(() => { - if (!enabled) return; + if (!active) return; unmountedRef.current = false; fetchSessions(); connectWs(); @@ -260,13 +263,13 @@ export function useBrowserSessionState( wsRef.current = null; } }; - }, [enabled, fetchSessions, connectWs]); + }, [active, fetchSessions, connectWs]); // Re-fetch when conversationId changes useEffect(() => { - if (!enabled) return; + if (!active) return; fetchSessions(); - }, [enabled, conversationId, fetchSessions]); + }, [active, conversationId, fetchSessions]); return { session, diff --git a/dashboard/src/hooks/useBrowserStream.ts b/dashboard/src/hooks/useBrowserStream.ts index 1c33782c..773c0453 100644 --- a/dashboard/src/hooks/useBrowserStream.ts +++ b/dashboard/src/hooks/useBrowserStream.ts @@ -29,11 +29,7 @@ interface BrowserStreamCallbacks { } interface ConnectOptions { - /** Optional harness profile name. All surfaces (chat panel, standalone - * page, and the agent's `browser_use` tool) share the same `"default"` - * profile so cookies/login and open tabs stay consistent across - * conversations and between headed and headless runs. When unset, the - * backend falls back to `"default"` as well. */ + /** Harness profile for the current user. The WebSocket also binds from JWT. */ sessionId?: string | null; } @@ -119,8 +115,6 @@ export function useBrowserStream() { }; if (options.sessionId) { startMsg.session_id = options.sessionId; - } else { - startMsg.session_id = "default"; } ws.send(JSON.stringify(startMsg)); setCurrentUrl(url); diff --git a/dashboard/src/pages/Chat/components/ChatDockPanel.tsx b/dashboard/src/pages/Chat/components/ChatDockPanel.tsx index 135dab32..b383a9e0 100644 --- a/dashboard/src/pages/Chat/components/ChatDockPanel.tsx +++ b/dashboard/src/pages/Chat/components/ChatDockPanel.tsx @@ -24,6 +24,7 @@ import BrowserWorkspace, { } from "../../../components/BrowserWorkspace"; import ChatDockPanelShell from "../../../components/BrowserWorkspace/ChatDockPanelShell"; import type { DisplayEnvironment } from "../../../api/types/browser"; +import { useCurrentUser } from "../../../hooks/useCurrentUser"; import { resolveBrowserProfile } from "../../../utils/browserProfile"; import type { DockTab, DockTabId } from "../hooks/useChatDockPanel"; import { dockFileBasename } from "../utils/dockFilePath"; @@ -79,6 +80,7 @@ const ChatDockPanel: React.FC = ({ surfaceVisible = true, }) => { const { t } = useTranslation(); + const currentUser = useCurrentUser(); const [browserMounted, setBrowserMounted] = useState( openTabs.some((tab) => tab.kind === "browser"), ); @@ -171,7 +173,7 @@ const ChatDockPanel: React.FC = ({ return handler; }, []); - const sessionId = resolveBrowserProfile(); + const sessionId = resolveBrowserProfile(currentUser?.id); const activeTab = openTabs.find((tab) => tab.id === activeTabId) ?? openTabs[0] ?? null; const terminalVisible = surfaceVisible && activeTab?.kind === "terminal"; diff --git a/dashboard/src/pages/Chat/hooks/useChatSend.ts b/dashboard/src/pages/Chat/hooks/useChatSend.ts index 69acd868..7ef5dd5f 100644 --- a/dashboard/src/pages/Chat/hooks/useChatSend.ts +++ b/dashboard/src/pages/Chat/hooks/useChatSend.ts @@ -268,10 +268,7 @@ export function useChatSend({ setTimeout(async () => { try { const { browserApi } = await import("../../../api/modules/browser"); - const profile = activeThreadId || "default"; const data = await browserApi.startRecording({ - profile, - agentProfile: profile, name: activeThreadId ? `chat-${activeThreadId}` : "skill-recording", diff --git a/dashboard/src/pages/Chat/utils/summarizeHitlAction.test.ts b/dashboard/src/pages/Chat/utils/summarizeHitlAction.test.ts index 6e47a11c..d6cc3891 100644 --- a/dashboard/src/pages/Chat/utils/summarizeHitlAction.test.ts +++ b/dashboard/src/pages/Chat/utils/summarizeHitlAction.test.ts @@ -122,16 +122,16 @@ describe("summarizeHitlAction", () => { ]); }); - it("omits default profile noise and skips empty args", () => { + it("omits server-owned profile and skips empty args", () => { const view = summarizeHitlAction( "browser_use", - { action: "screenshot", profile: "default" }, + { action: "screenshot", profile: "user-7" }, tZh, "使用浏览器", ); expect(view.summary).toBe("截取当前网页截图"); expect(view.rows.map((row) => row.label)).toEqual(["操作"]); - expect(view.rows.some((row) => row.value === "default")).toBe(false); + expect(view.rows.some((row) => row.value === "user-7")).toBe(false); }); }); diff --git a/dashboard/src/pages/Chat/utils/summarizeHitlAction.ts b/dashboard/src/pages/Chat/utils/summarizeHitlAction.ts index 43f0b767..db543e74 100644 --- a/dashboard/src/pages/Chat/utils/summarizeHitlAction.ts +++ b/dashboard/src/pages/Chat/utils/summarizeHitlAction.ts @@ -20,8 +20,7 @@ export type HitlTranslate = ( options?: string | Record, ) => string; -const HIDDEN_WHEN_DEFAULT = new Set(["profile"]); -const ALWAYS_HIDDEN = new Set(["session_id"]); +const ALWAYS_HIDDEN = new Set(["session_id", "profile"]); const TRUNCATE_KEYS = new Set([ "content", "body", @@ -84,7 +83,6 @@ function isEmpty(value: unknown): boolean { function shouldHide(key: string, value: unknown): boolean { if (ALWAYS_HIDDEN.has(key) || isEmpty(value)) return true; - if (HIDDEN_WHEN_DEFAULT.has(key) && value === "default") return true; return false; } diff --git a/dashboard/src/pages/Control/RemoteBrowser/index.tsx b/dashboard/src/pages/Control/RemoteBrowser/index.tsx index c45c4dd6..8bb7bbff 100644 --- a/dashboard/src/pages/Control/RemoteBrowser/index.tsx +++ b/dashboard/src/pages/Control/RemoteBrowser/index.tsx @@ -50,7 +50,6 @@ import BrowserViewer, { import { useAgent } from "../../../context/AgentContext"; import { browserApi } from "../../../api/modules/browser"; import * as chatStore from "../../Chat/hooks/chatStore"; -import type { BrowserSession as HarnessSession } from "../../../api/types/browser"; import { request } from "../../../api/request"; import { normalizeUrl } from "../../../utils/normalizeUrl"; import { clearCanvas } from "../../../utils/browserCanvas"; @@ -76,6 +75,8 @@ import { } from "../../../hooks/useViewportMode"; import { useIsMobile } from "../../../hooks/useIsMobile"; import { useLandscapeFullscreen } from "../../../hooks/useLandscapeFullscreen"; +import { useCurrentUser } from "../../../hooks/useCurrentUser"; +import { resolveBrowserProfile } from "../../../utils/browserProfile"; import styles from "./index.module.less"; const { Text } = Typography; @@ -127,20 +128,15 @@ const BROWSER_AI_PANEL_MAX_WIDTH = 620; const BROWSER_AI_PANEL_MIN_HEIGHT = 200; const BROWSER_AI_PANEL_MAX_HEIGHT = 520; -function readStoredProfile(): string | null { - try { - return ( - localStorage.getItem(PROFILE_STORAGE_KEY) ?? - localStorage.getItem(LEGACY_SESSION_STORAGE_KEY) - ); - } catch { - return null; - } +function profileStorageKey(userId?: number): string { + return userId == null + ? PROFILE_STORAGE_KEY + : `${PROFILE_STORAGE_KEY}:${userId}`; } -function persistProfile(profile: string) { +function persistProfile(profile: string, userId?: number) { try { - localStorage.setItem(PROFILE_STORAGE_KEY, profile); + localStorage.setItem(profileStorageKey(userId), profile); localStorage.removeItem(LEGACY_SESSION_STORAGE_KEY); } catch { /* ignore */ @@ -167,22 +163,6 @@ function setStreamActive(active: boolean) { } } -function pickProfile( - sessions: HarnessSession[], - threadFromUrl?: string, - stored?: string | null, -): string { - if (threadFromUrl) return threadFromUrl; - if (stored && sessions.some((s) => s.session_id === stored)) return stored; - if (sessions.length > 0) { - const sorted = [...sessions].sort( - (a, b) => (b.last_activity_at ?? 0) - (a.last_activity_at ?? 0), - ); - return sorted[0].session_id; - } - return stored ?? "default"; -} - function tabsFromStream( streamTabs: { id: number | string; @@ -313,6 +293,8 @@ export default function RemoteBrowserPage({ const { t } = useTranslation(); const { modal, message: antMessage } = App.useApp(); const isMobile = useIsMobile(); + const currentUser = useCurrentUser(); + const browserProfile = resolveBrowserProfile(currentUser?.id); const { activeAgent, activeAgentId, agents } = useAgent(); const [searchParams] = useSearchParams(); const threadFromUrl = @@ -471,14 +453,17 @@ export default function RemoteBrowserPage({ setFrameReady(ready); }, []); - const attachProfile = useCallback((profileId: string, tabs: BrowserTab[]) => { - profileIdRef.current = profileId; - const view = viewFromProfile(profileId, tabs); - setSession(view); - persistProfile(profileId); - if (urlEditingRef.current) return; - if (view.url) setNavUrl(view.url); - }, []); + const attachProfile = useCallback( + (profileId: string, tabs: BrowserTab[]) => { + profileIdRef.current = profileId; + const view = viewFromProfile(profileId, tabs); + setSession(view); + persistProfile(profileId, currentUser?.id); + if (urlEditingRef.current) return; + if (view.url) setNavUrl(view.url); + }, + [currentUser?.id], + ); // Shared stream controller — measures the container, resolves the viewport // (mobile-aware), opens the WebSocket, and paints frames onto the canvas. @@ -524,21 +509,20 @@ export default function RemoteBrowserPage({ }, [t]); const refreshSessions = useCallback(async (): Promise => { + if (!browserProfile) return null; try { - const resp = await browserApi.getSessions(); - const sessions = resp.ok ? resp.sessions : []; - const profile = pickProfile(sessions, threadFromUrl, readStoredProfile()); + await browserApi.getSessions(); // Restore stream only when the user left it open, or when deep-linked // via ?thread=… — do not auto-open just because Chrome is still alive. if (threadFromUrl || readStreamActive()) { - startStream(profile, ""); - return profile; + startStream(browserProfile, ""); + return browserProfile; } return null; } catch { return null; } - }, [startStream, threadFromUrl]); + }, [browserProfile, startStream, threadFromUrl]); useEffect(() => { void refreshEnv(); @@ -713,21 +697,16 @@ export default function RemoteBrowserPage({ }, []); const createSession = useCallback(async () => { + if (!browserProfile) return; setCreating(true); try { - const resp = await browserApi.getSessions(); - const profile = pickProfile( - resp.ok ? resp.sessions : [], - threadFromUrl, - readStoredProfile(), - ); - startStream(profile, normalizeUrl(navUrl) || DEFAULT_START_URL); + startStream(browserProfile, normalizeUrl(navUrl) || DEFAULT_START_URL); } catch (err: unknown) { showApiError(err, t("remoteBrowser.createSessionFailed"), t); } finally { setCreating(false); } - }, [navUrl, startStream, t, threadFromUrl]); + }, [browserProfile, navUrl, startStream, t]); const closeSession = useCallback(() => { disconnect(); @@ -736,15 +715,14 @@ export default function RemoteBrowserPage({ setFrameReady(false); setStreamActive(false); try { - localStorage.removeItem(PROFILE_STORAGE_KEY); + localStorage.removeItem(profileStorageKey(currentUser?.id)); } catch { /* ignore */ } clearCanvas(canvasRef.current); - }, [disconnect]); + }, [currentUser?.id, disconnect]); const shutdownBrowser = useCallback(() => { - const profile = profileIdRef.current || "default"; modal.confirm({ title: t("remoteBrowser.shutdownTitle", "关闭浏览器"), content: t( @@ -756,7 +734,7 @@ export default function RemoteBrowserPage({ cancelText: t("common.cancel"), onOk: async () => { try { - await browserApi.shutdown(profile); + await browserApi.shutdown(); } catch (err: unknown) { showApiError( err, @@ -961,11 +939,8 @@ export default function RemoteBrowserPage({ /* ignore */ } - const profileId = profileIdRef.current || "default"; try { const data = await browserApi.startRecording({ - profile: profileId, - agentProfile: profileId, name: `browser-skill-${Date.now()}`, }); if (data.ok) { @@ -993,7 +968,7 @@ export default function RemoteBrowserPage({ : t("browser.recordReplay.startFailed", "开始录制失败"), ); } - }, [t]); + }, [antMessage, t]); const envReady = Boolean(envStatus?.browsers_ok); const showEdgeControls = Boolean(session) && isStreaming && frameReady; diff --git a/dashboard/src/utils/browserProfile.ts b/dashboard/src/utils/browserProfile.ts index bb169db1..f771f3c7 100644 --- a/dashboard/src/utils/browserProfile.ts +++ b/dashboard/src/utils/browserProfile.ts @@ -1,22 +1,10 @@ /** - * Single source of truth for the harness browser profile identifier. + * Harness browser profile for one Octop user. * - * All conversations currently map to one shared "default" profile so the - * headed chat browser stays consistent with headless/standalone usage (instead - * of spawning a per-conversation ``thr_*`` profile). The chat status bubble - * and the chat browser panel must both derive the profile from here rather - * than hardcoding "default" on independent paths. + * Shared across that user's agents and conversations. The backend also + * derives this from the authenticated user and ignores client-supplied names. + * A leftover on-disk ``default`` profile is not reused. */ - -export const DEFAULT_BROWSER_PROFILE = "default"; - -/** - * Resolve the browser profile for a conversation. - * - * Currently always the shared default profile; the conversation id is accepted - * (and ignored) so per-conversation profiles can be introduced later without - * touching every caller. - */ -export function resolveBrowserProfile(): string { - return DEFAULT_BROWSER_PROFILE; +export function resolveBrowserProfile(userId?: number | null): string | null { + return userId == null || userId <= 0 ? null : `user-${userId}`; } diff --git a/docs/api.md b/docs/api.md index fe87f8ad..6e99efc8 100644 --- a/docs/api.md +++ b/docs/api.md @@ -374,8 +374,8 @@ endpoint (public, mounted directly in `api/app.py`). |--------|------|------|-------| | `WS`/`POST`/`GET`/… | `/agents/{aid}/terminal` | owner | AI-assisted remote PTY | | `GET` | `/agents/{aid}/terminal/context` | owner | recent terminal context for the AI helper | -| `WS`/`POST`/`GET`/… | `/browser/...` | user | remote Playwright sessions, screenshots, live streams | -| `POST` | `/browser/shutdown` | user | stop the local Chrome process for a harness profile (`?profile=`) | +| `WS`/`POST`/`GET`/… | `/browser/...` | user | harness-browser sessions, live stream, record/replay | +| `POST` | `/browser/shutdown` | user | stop the current user's Octop-managed Chrome | | `POST` | `/agents/{aid}/upload` | user | multipart upload → `{workspace}/inbound/` | | `POST` | `/agents/{aid}/files/access-urls` | user | refresh inbound media URLs (signed) | | `GET` | `/agents/{aid}/files/{path}` | owner | read an inbound file | diff --git a/src/octop/api/openapi_meta.py b/src/octop/api/openapi_meta.py index fa7726aa..873ee064 100644 --- a/src/octop/api/openapi_meta.py +++ b/src/octop/api/openapi_meta.py @@ -141,7 +141,7 @@ {"name": "update", "description": "In-place server update checks and apply flow."}, { "name": "browser", - "description": "Remote browser sessions: navigate, screenshot, live stream.", + "description": "Remote browser: env/install, harness sessions, live stream, record/replay.", }, { "name": "mobile", diff --git a/src/octop/api/routers/browser/__init__.py b/src/octop/api/routers/browser/__init__.py index cf572c0c..61fa8c4b 100644 --- a/src/octop/api/routers/browser/__init__.py +++ b/src/octop/api/routers/browser/__init__.py @@ -1,17 +1,17 @@ -"""Browser routers — Playwright sessions, harness-browser, and WS screencast.""" +"""Browser routers — env/install, harness-browser, record/replay, WS screencast.""" from __future__ import annotations from fastapi import APIRouter +from octop.api.routers.browser.env import router as env_router from octop.api.routers.browser.harness import router as harness_router from octop.api.routers.browser.record_replay import router as record_replay_router -from octop.api.routers.browser.sessions import router as sessions_router from octop.api.routers.browser.stream import router as stream_router from octop.api.routers.browser.uninstall import router as uninstall_router router = APIRouter() -router.include_router(sessions_router) +router.include_router(env_router) router.include_router(harness_router) router.include_router(record_replay_router) router.include_router(stream_router) diff --git a/src/octop/api/routers/browser/env.py b/src/octop/api/routers/browser/env.py new file mode 100644 index 00000000..62dc02f4 --- /dev/null +++ b/src/octop/api/routers/browser/env.py @@ -0,0 +1,174 @@ +"""Browser environment probe and Chromium install (SSE). + +Live sessions are harness-browser (see ``harness.py`` / ``stream.py``), not +in-process Playwright. + + GET /api/browser/env-status → { playwright, browsers_ok, harness_browser, … } + POST /api/browser/install → SSE Playwright Chromium install (or reuse system Chrome) +""" + +from __future__ import annotations + +import json +from collections.abc import AsyncGenerator +from typing import Any + +from fastapi import APIRouter, Depends +from fastapi.responses import StreamingResponse + +from octop.api.deps import current_user, require_permission + +router = APIRouter() + + +def _probe_env() -> dict[str, Any]: + """Cheap synchronous probe of browser environment availability. + + Requirements: + 1. Detect system Chrome/Chromium **or** Playwright-managed Chromium + via the same ``find_chrome`` path used at launch time. + 2. ``browsers_ok`` means launch can use that binary (screenshot stream). + 3. Install (elsewhere) downloads Playwright Chromium only when missing. + 4. ``playwright_chromium`` flags whether *our* install exists (uninstall + target); never implies deleting the user's system browser. + + ``verify_chromium`` is install-time only (see ``POST /browser/install``). + """ + out: dict[str, Any] = { + "playwright": False, + "browsers_ok": False, + "harness_browser": False, + "playwright_chromium": False, + "chrome_path": None, + "chrome_source": None, # "system" | "playwright" | None + "error": None, + } + + from octop.infra.browser.setup import ( # noqa: PLC0415 + chrome_source_for_path, + playwright_chromium_installed, + ) + + out["playwright_chromium"] = playwright_chromium_installed() + + try: + from harness_browser import BrowserSession # noqa: F401, PLC0415 + from harness_browser.cdp.launcher import find_chrome # noqa: PLC0415 + + out["harness_browser"] = True + chrome = find_chrome() + if chrome: + out["browsers_ok"] = True + out["chrome_path"] = chrome + out["chrome_source"] = chrome_source_for_path(chrome) + else: + out["error"] = ( + "Chrome/Chromium not found. Install Google Chrome, or run " + "POST /api/browser/install to download Playwright Chromium." + ) + except ImportError: + pass + + try: + import playwright # noqa: F401, PLC0415 + + out["playwright"] = True + except ImportError as exc: + if not out["harness_browser"]: + out["error"] = ( + f"playwright not installed: {exc}. Install octop[browser] extras or harness-browser." + ) + return out + + if not out["browsers_ok"] and not out.get("error"): + out["error"] = ( + "Chrome/Chromium not found. Install Google Chrome, or run " + "POST /api/browser/install to download Playwright Chromium." + ) + return out + + +@router.get("/browser/env-status") +async def env_status(_: Any = Depends(current_user)) -> dict[str, Any]: + return _probe_env() + + +def _verify_browser_binary(exe: str) -> tuple[bool, str]: + """Install-time check: binary exists and responds to ``--version``.""" + import subprocess # noqa: PLC0415 + + try: + result = subprocess.run( + [exe, "--version"], + capture_output=True, + text=True, + timeout=10, + check=False, + ) + except subprocess.TimeoutExpired: + return False, f"Browser verification timed out: {exe}" + except OSError as exc: + return False, f"Browser verification failed: {exc}" + + if result.returncode == 0: + version = (result.stdout or result.stderr or "").strip() or exe + return True, version + detail = (result.stderr or result.stdout or "").strip() + return False, f"Browser exited with code {result.returncode}: {detail}" + + +@router.post("/browser/install") +async def install(_: Any = Depends(require_permission("browser"))) -> StreamingResponse: + """Stream Chromium install progress as SSE. + + Each event is a JSON line conforming to ``harness_browser.InstallEvent``: + ``{"log": "..."}`` — progress line + ``{"done": true, "success": true}`` — finished OK + ``{"done": true, "success": false, "error": "..."}`` — failed + + If a system Chrome/Chromium is already resolvable via ``find_chrome``, + verify it with ``--version`` and short-circuit (no Playwright download). + Otherwise delegate to ``install_chromium_stream`` (which runs its own + ``verify_chromium`` after download). + + Returns ``text/event-stream``; the client reads until ``done`` appears. + """ + + async def _event_stream() -> AsyncGenerator[str, None]: + try: + from harness_browser.cdp.launcher import find_chrome # noqa: PLC0415 + + chrome = find_chrome() + if chrome: + yield ("data: " + json.dumps({"log": f"Found browser: {chrome}"}) + "\n\n") + yield ("data: " + json.dumps({"log": "Verifying installation ..."}) + "\n\n") + ok, msg = _verify_browser_binary(chrome) + if ok: + yield "data: " + json.dumps({"log": msg}) + "\n\n" + yield ("data: " + json.dumps({"done": True, "success": True}) + "\n\n") + return + yield ( + "data: " + + json.dumps( + { + "log": ( + f"System browser not usable ({msg}); " + "falling back to Playwright Chromium download ..." + ) + } + ) + + "\n\n" + ) + + from harness_browser import install_chromium_stream # noqa: PLC0415 + + async for event in install_chromium_stream(): + yield f"data: {json.dumps(event)}\n\n" + except Exception as exc: # pragma: no cover + yield f"data: {json.dumps({'done': True, 'success': False, 'error': str(exc)})}\n\n" + + return StreamingResponse( + _event_stream(), + media_type="text/event-stream", + headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, + ) diff --git a/src/octop/api/routers/browser/harness.py b/src/octop/api/routers/browser/harness.py index 0569858e..a992fbc5 100644 --- a/src/octop/api/routers/browser/harness.py +++ b/src/octop/api/routers/browser/harness.py @@ -9,11 +9,12 @@ from pathlib import Path from typing import Any -from fastapi import APIRouter, Depends, Query +from fastapi import APIRouter, Depends from pydantic import BaseModel from octop.api.deps import current_user from octop.infra.errors import ErrorCode, OctopError +from octop.infra.utils.browser_media import user_browser_profile logger = logging.getLogger(__name__) @@ -70,14 +71,12 @@ async def resolve_harness_session( ) -> Any | None: """Return a live :class:`harness_browser.BrowserSession` for ``profile_hint``. - Resolution order: - 1. Exact profile name when present in the in-process registry - 2. ``default`` when the hint is ``auto`` / empty / unknown - 3. Any profile already registered (agent may have started Chrome) - 4. Create (launch-or-attach) for the resolved profile name — only when - ``create=True`` (screencast / interactive clients). Listen-only - dashboard hooks pass ``create=False`` so a status WebSocket cannot - spawn Chrome just to watch for session updates. + *profile_hint* must be a concrete profile name (``user-``). Empty / + ``auto`` never falls back to another user's session or to ``default``. + + When ``create=True`` (screencast / interactive clients) a missing live + session is launched. Listen-only dashboard hooks pass ``create=False`` + so a status WebSocket cannot spawn Chrome just to watch for updates. Cached entries are health-checked before reuse — a dead/stale session (e.g. browser crashed) is evicted and replaced with a freshly launched @@ -96,32 +95,28 @@ async def resolve_harness_session( ) from exc hint = (profile_hint or "").strip() - candidates: list[str] = [] - if hint and hint not in {"auto"}: - candidates.append(hint) - if "default" not in candidates: - candidates.append("default") - candidates.extend(k for k in _registry if k not in candidates) - - for name in candidates: - cached = _registry.get(name) - if cached is None: - continue + if not hint or hint == "auto": + if not create: + return None + raise OctopError(ErrorCode.SLASH_BAD_ARGS, "browser profile is required") + + cached = _registry.get(hint) + if cached is not None: if await _is_session_alive(cached): return cached logger.warning( "harness session %r is dead (stale CDP connection); discarding%s", - name, + hint, " and relaunching" if create else "", ) - _registry.pop(name, None) + _registry.pop(hint, None) with contextlib.suppress(Exception): await cached.close() if not create: return None - profile = candidates[0] if candidates else "default" + profile = hint harness_settings = None if server is not None and agent_id: from octop.api.common.agent_workspace import ( # noqa: PLC0415 @@ -261,7 +256,7 @@ async def harness_list_tabs(sess: Any) -> list[dict[str, Any]]: return tabs -async def harness_sessions_payload(conversation_id: str | None = None) -> dict[str, Any]: +async def harness_sessions_payload(profile_name: str) -> dict[str, Any]: """Shape expected by the dashboard ``BrowserSessionsResponse`` type.""" try: from harness_browser.tool_interface import _registry @@ -271,7 +266,7 @@ async def harness_sessions_payload(conversation_id: str | None = None) -> dict[s now = int(time.time() * 1000) sessions: list[dict[str, Any]] = [] for profile, sess in list(_registry.items()): - if conversation_id and profile not in {conversation_id, "default"}: + if profile != profile_name: continue url = await harness_page_url(sess) sessions.append( @@ -295,19 +290,16 @@ async def harness_sessions_payload(conversation_id: str | None = None) -> dict[s @router.get("/browser/harness-sessions") -async def list_harness_sessions( - conversation_id: str | None = Query(default=None), - _: Any = Depends(current_user), -) -> dict[str, Any]: - """List live harness-browser profiles (agent ``browser_use`` sessions).""" - return await harness_sessions_payload(conversation_id) +async def list_harness_sessions(user: Any = Depends(current_user)) -> dict[str, Any]: + """List the current user's live harness-browser profile.""" + return await harness_sessions_payload(user_browser_profile(user.id)) @router.post("/browser/sessions/{session_id}/handoff") async def handoff( session_id: str, body: HandoffBody, - _: Any = Depends(current_user), + user: Any = Depends(current_user), ) -> dict[str, Any]: """Switch control of a browser session between the agent and the user. @@ -316,14 +308,17 @@ async def handoff( session and reflected in ``harness-sessions`` and the WS screencast so a takeover survives dashboard reloads and reconnects. """ + profile = user_browser_profile(user.id) + if session_id not in {"", "auto"} and session_id != profile: + logger.debug("handoff path %r ignored; using %r", session_id, profile) target = body.target if target not in ("agent", "user"): raise OctopError(ErrorCode.SLASH_BAD_ARGS, "target must be 'agent' or 'user'") - _CONTROL_OWNERS[session_id] = target + _CONTROL_OWNERS[profile] = target - payload = await harness_sessions_payload(conversation_id=session_id) + payload = await harness_sessions_payload(profile) session = next( - (s for s in payload.get("sessions", []) if s["session_id"] == session_id), + (s for s in payload.get("sessions", []) if s["session_id"] == profile), None, ) if session is None: @@ -331,9 +326,9 @@ async def handoff( # still flip its local control-owner state. now = int(time.time() * 1000) session = { - "session_id": session_id, - "profile_name": session_id, - "conversation_id": session_id, + "session_id": profile, + "profile_name": profile, + "conversation_id": profile, "channel_source": "dashboard", "state": "idle", "control_owner": target, @@ -348,16 +343,10 @@ async def handoff( "/browser/shutdown", summary="Stop the local Chrome process for a harness-browser profile", ) -async def shutdown_browser( - profile: str | None = Query( - default=None, - description="Profile name. Defaults to the live session, then 'default'.", - ), - _: Any = Depends(current_user), -) -> dict[str, Any]: - """Terminate Octop-managed Chrome for ``profile``. Cookies stay on disk.""" +async def shutdown_browser(user: Any = Depends(current_user)) -> dict[str, Any]: + """Terminate the current user's Octop-managed Chrome. Cookies stay on disk.""" try: - from harness_browser.tool_interface import _registry, browser_tool + from harness_browser.tool_interface import browser_tool except ImportError as exc: raise OctopError( ErrorCode.INTERNAL_ERROR, @@ -365,9 +354,7 @@ async def shutdown_browser( status=503, ) from exc - hint = (profile or "").strip() - if not hint or hint == "auto": - hint = next(iter(_registry), "default") + hint = user_browser_profile(user.id) result = await browser_tool(action="close_session", profile=hint, kill=True) _CONTROL_OWNERS.pop(hint, None) diff --git a/src/octop/api/routers/browser/record_replay.py b/src/octop/api/routers/browser/record_replay.py index 21f359e2..e906e5a9 100644 --- a/src/octop/api/routers/browser/record_replay.py +++ b/src/octop/api/routers/browser/record_replay.py @@ -9,13 +9,12 @@ from octop.api.deps import current_user from octop.infra.errors import ErrorCode, OctopError +from octop.infra.utils.browser_media import user_browser_profile router = APIRouter() class RecordStartBody(BaseModel): - profile: str = "default" - agent_profile: str | None = Field(default=None, alias="agentProfile") name: str | None = None privacy: str = "mask-sensitive" @@ -36,7 +35,6 @@ class RecordStopAndGenerateSkillBody(BaseModel): class ReplayBody(BaseModel): recording_id: str = Field(alias="recordingId") - profile: str = "default" inputs: dict[str, str] = Field(default_factory=dict) @@ -87,21 +85,47 @@ async def run_replay_recording( return await ReplayRunner().run(recording_id, profile=profile, inputs=inputs) -def _latest_recording_id() -> str | None: +def _latest_recording_id(profile: str) -> str | None: try: from harness_browser.record.store import RecordingStore except ImportError: return None - recordings = RecordingStore().list_recordings() + recordings = [ + manifest for manifest in RecordingStore().list_recordings() if manifest.profile == profile + ] if not recordings: return None latest = max(recordings, key=lambda m: m.created_at) return latest.recording_id -def _effective_profile(profile: str | None, agent_profile: str | None = None) -> str: - chosen = (agent_profile or profile or "default").strip() - return chosen or "default" +def _require_owned_recording(recording_id: str, profile: str) -> Any: + try: + from harness_browser.record.store import RecordingStore + except ImportError as exc: + raise OctopError( + ErrorCode.INTERNAL_ERROR, + "harness-browser record/replay is not installed", + status=503, + ) from exc + try: + manifest = RecordingStore().read_manifest(recording_id) + except FileNotFoundError as exc: + raise OctopError(ErrorCode.NOT_FOUND, "recording not found") from exc + except Exception as exc: + raise OctopError(ErrorCode.NOT_FOUND, "recording not found") from exc + if str(getattr(manifest, "profile", "") or "") != profile: + raise OctopError(ErrorCode.NOT_FOUND, "recording not found") + return manifest + + +def _active_for_profile(data: dict[str, Any], profile: str) -> Any: + active = data.get("active") + if not isinstance(active, dict): + return None + if str(active.get("profile") or "") != profile: + return None + return active def _raise_if_not_ok(data: dict[str, Any], *, status: int = 500) -> None: @@ -116,26 +140,28 @@ def _raise_if_not_ok(data: dict[str, Any], *, status: int = 500) -> None: @router.get("/browser/record-replay/status") -async def record_status(_: Any = Depends(current_user)) -> dict[str, Any]: +async def record_status(user: Any = Depends(current_user)) -> dict[str, Any]: + profile = user_browser_profile(user.id) try: data = await send_record_request({"command": "status"}) except Exception: data = {"ok": True, "active": None} - data["latestRecordingId"] = _latest_recording_id() + data["active"] = _active_for_profile(data, profile) + data["latestRecordingId"] = _latest_recording_id(profile) return data @router.post("/browser/record-replay/start") async def record_start( body: RecordStartBody, - _: Any = Depends(current_user), + user: Any = Depends(current_user), ) -> dict[str, Any]: daemon = await ensure_record_daemon() _raise_if_not_ok(daemon, status=503) data = await send_record_request( { "command": "start", - "profile": _effective_profile(body.profile, body.agent_profile), + "profile": user_browser_profile(user.id), "name": body.name, "privacy": body.privacy or "mask-sensitive", "screenshots": "off", @@ -148,12 +174,23 @@ async def record_start( @router.post("/browser/record-replay/stop") async def record_stop( body: RecordStopBody, - _: Any = Depends(current_user), + user: Any = Depends(current_user), ) -> dict[str, Any]: + profile = user_browser_profile(user.id) + recording_id = body.recording_id + if recording_id: + _require_owned_recording(recording_id, profile) + else: + try: + status = await send_record_request({"command": "status"}) + except Exception: + status = {} + if _active_for_profile(status if isinstance(status, dict) else {}, profile) is None: + raise OctopError(ErrorCode.NOT_FOUND, "recording not found") data = await send_record_request( { "command": "stop", - "recording_id": body.recording_id, + "recording_id": recording_id, "generate_steps": body.generate_steps, "name": body.name, } @@ -165,7 +202,7 @@ async def record_stop( @router.post("/browser/record-replay/stop-and-generate-skill") async def record_stop_and_generate_skill( body: RecordStopAndGenerateSkillBody, - _: Any = Depends(current_user), + user: Any = Depends(current_user), ) -> dict[str, Any]: """Stop recording, generate steps + skill draft, and return the skill content. @@ -173,6 +210,18 @@ async def record_stop_and_generate_skill( generate-skill into a single call, returning the generated skill markdown content so the frontend can display it for user confirmation. """ + profile = user_browser_profile(user.id) + recording_id = body.recording_id + if recording_id: + _require_owned_recording(recording_id, profile) + else: + try: + status = await send_record_request({"command": "status"}) + except Exception: + status = {} + if _active_for_profile(status if isinstance(status, dict) else {}, profile) is None: + raise OctopError(ErrorCode.NOT_FOUND, "recording not found") + # 1) Stop the recording data = await send_record_request( { @@ -187,6 +236,7 @@ async def record_stop_and_generate_skill( recording_id = data.get("recordingId") or body.recording_id if not recording_id: return {**data, "skillContent": None, "skillName": None} + _require_owned_recording(str(recording_id), profile) # 2) Generate skill from the recording await send_record_request( @@ -232,35 +282,23 @@ async def record_stop_and_generate_skill( @router.post("/browser/record-replay/skill-content") async def get_skill_content( body: SkillContentBody, - _: Any = Depends(current_user), + user: Any = Depends(current_user), ) -> dict[str, Any]: """Read the generated skill content (draft.skill.md) for a given recording.""" skill_content = None skill_name = None skill_exists = False - - try: - from harness_browser.record.store import RecordingStore - - store = RecordingStore() - manifest = store.read_manifest(body.recording_id) - if manifest is not None: - import pathlib - - rec_dir = pathlib.Path(store.recordings_dir) / body.recording_id - skill_path = rec_dir / "draft.skill.md" - if skill_path.exists(): - skill_content = skill_path.read_text(encoding="utf-8") - skill_exists = True - skill_name = manifest.target.title.strip() or body.recording_id - except ImportError as exc: - raise OctopError( - ErrorCode.INTERNAL_ERROR, - "harness-browser record/replay is not installed", - status=503, - ) from exc - except Exception as exc: - raise OctopError(ErrorCode.INTERNAL_ERROR, str(exc)) from exc + profile = user_browser_profile(user.id) + manifest = _require_owned_recording(body.recording_id, profile) + from harness_browser.record.store import RecordingStore + + store = RecordingStore() + rec_dir = store.recording_dir(body.recording_id) + skill_path = rec_dir / "draft.skill.md" + if skill_path.exists(): + skill_content = skill_path.read_text(encoding="utf-8") + skill_exists = True + skill_name = manifest.target.title.strip() or body.recording_id return { "ok": True, @@ -274,11 +312,13 @@ async def get_skill_content( @router.post("/browser/record-replay/replay") async def replay_recording( body: ReplayBody, - _: Any = Depends(current_user), + user: Any = Depends(current_user), ) -> dict[str, Any]: + profile = user_browser_profile(user.id) + _require_owned_recording(body.recording_id, profile) data = await run_replay_recording( body.recording_id, - profile=body.profile or "default", + profile=profile, inputs=body.inputs, ) return data diff --git a/src/octop/api/routers/browser/sessions.py b/src/octop/api/routers/browser/sessions.py deleted file mode 100644 index 2d411fb3..00000000 --- a/src/octop/api/routers/browser/sessions.py +++ /dev/null @@ -1,704 +0,0 @@ -"""Remote browser router — Playwright-backed sessions (P1.5). - -Surface (intentionally lean — finnie's full router has handoff / -multi-tab control / SSE install progress; we cap to what the dashboard -actually drives in the octop MVP): - - GET /api/browser/env-status → { playwright, browsers_ok, error? } - POST /api/browser/install → run ``playwright install chromium`` - inline (fire-and-forget; returns 202) - GET /api/browser/sessions → list active sessions - POST /api/browser/sessions → create + return id - DELETE /api/browser/sessions/{id} → close - POST /api/browser/sessions/{id}/goto → navigate - GET /api/browser/sessions/{id}/screenshot → PNG body - -All endpoints require an authenticated user; cross-user isolation is -in-memory (sessions are keyed by ``(user_id, session_id)``). Playwright -is an optional dependency — endpoints return a structured 503 if the -``playwright`` import or ``chromium`` browser binary is missing. -""" - -from __future__ import annotations - -import asyncio -import contextlib -import json -import logging -import uuid -from collections.abc import AsyncGenerator -from pathlib import Path -from typing import Any - -from fastapi import APIRouter, Depends -from fastapi.responses import Response, StreamingResponse -from pydantic import BaseModel - -from octop.api.deps import current_user, get_server, require_permission -from octop.infra.errors import ErrorCode, OctopError -from octop.infra.server import OctopServer - -logger = logging.getLogger(__name__) - -router = APIRouter() - -_CHROMIUM_ARGS = [ - "--no-sandbox", - "--disable-dev-shm-usage", - "--disable-gpu", - "--disable-setuid-sandbox", - "--restore-last-session", -] - - -# --- module-level state (process-wide) ------------------------------------- - - -class _Session: - """Browser session: one browser context, one or more pages (tabs).""" - - def __init__( - self, - playwright: Any, - browser: Any, - context: Any, - owner_id: int, - ) -> None: - self.id = uuid.uuid4().hex[:12] - self.playwright = playwright - self.browser = browser - self.context = context - self.pages: list[Any] = [] # ordered list of open pages - self.active_idx: int = 0 # index of currently active page - self.owner_id = owner_id - self._lock = asyncio.Lock() - - @property - def page(self) -> Any: - """Currently active page.""" - return self.pages[self.active_idx] - - @property - def url(self) -> str: - try: - return str(self.page.url) - except Exception: - return "about:blank" - - def _track_page(self, page: Any) -> None: - """Wire lifecycle hooks for a Playwright page.""" - - def _on_close() -> None: - asyncio.create_task(self._on_page_closed(page)) - - with contextlib.suppress(Exception): - page.on("close", _on_close) - - async def _on_page_closed(self, page: Any) -> None: - async with self._lock: - if page not in self.pages: - return - idx = self.pages.index(page) - self.pages.pop(idx) - if not self.pages: - return - if self.active_idx >= len(self.pages): - self.active_idx = len(self.pages) - 1 - elif idx < self.active_idx: - self.active_idx = max(0, self.active_idx - 1) - - async def _on_new_page(self, page: Any) -> None: - """Track a page opened by the browser (popup / new tab).""" - async with self._lock: - if page.is_closed() or page in self.pages: - return - self._track_page(page) - self.pages.append(page) - - def _wire_context(self) -> None: - self.context.on("page", lambda page: asyncio.create_task(self._on_new_page(page))) - - async def sync_pages(self) -> None: - """Reconcile tracked pages with the live browser context.""" - async with self._lock: - live = [p for p in self.context.pages if not p.is_closed()] - if not live: - raise OctopError(ErrorCode.NOT_FOUND, "browser session ended — all tabs closed") - seen: set[int] = set() - merged: list[Any] = [] - for p in self.pages: - if not p.is_closed() and p in live: - merged.append(p) - seen.add(id(p)) - for p in live: - if id(p) not in seen: - self._track_page(p) - merged.append(p) - self.pages = merged - if self.active_idx >= len(self.pages): - self.active_idx = len(self.pages) - 1 - elif self.pages[self.active_idx].is_closed(): - self.active_idx = 0 - - async def tab_list(self) -> list[dict[str, Any]]: - """Serializable list of tabs for the API response.""" - await self.sync_pages() - tabs: list[dict[str, Any]] = [] - for i, p in enumerate(self.pages): - title = "" - url = "about:blank" - with contextlib.suppress(Exception): - url = str(p.url) - title = await p.title() - tabs.append( - { - "idx": i, - "url": url, - "title": title, - "active": i == self.active_idx, - } - ) - return tabs - - async def ensure_page(self) -> Any: - await self.sync_pages() - page = self.page - if page.is_closed(): - raise OctopError(ErrorCode.NOT_FOUND, "active tab was closed") - return page - - async def close(self) -> None: - with contextlib.suppress(Exception): - await self.context.close() - with contextlib.suppress(Exception): - await self.playwright.stop() - - -_sessions: dict[str, _Session] = {} -_session_lock = asyncio.Lock() - - -def _user_profile_dir(home: Path, user_id: int) -> Path: - d = home / "browser-profiles" / str(user_id) - d.mkdir(parents=True, exist_ok=True) - return d - - -def _get_session(user_id: int, session_id: str) -> _Session: - s = _sessions.get(session_id) - if s is None or s.owner_id != user_id: - raise OctopError(ErrorCode.NOT_FOUND, "session not found") - return s - - -async def _session_response(sess: _Session) -> dict[str, Any]: - tabs = await sess.tab_list() - return {"id": sess.id, "url": sess.url, "tabs": tabs} - - -async def _mouse_click( - sess: _Session, - page: Any, - x: float, - y: float, - *, - button: str = "left", - click_count: int = 1, -) -> None: - """Click at (x, y); switch to a new tab only when one actually opens.""" - before = len(sess.pages) - await page.mouse.move(x, y) - await page.mouse.click(x, y, button=button, click_count=click_count) - # Popup tabs arrive via context "page" event — brief yield before reconcile. - await asyncio.sleep(0.05) - await sess.sync_pages() - if len(sess.pages) > before: - sess.active_idx = len(sess.pages) - 1 - - -# --- env probe ------------------------------------------------------------- - - -def _probe_env() -> dict[str, Any]: - """Cheap synchronous probe of browser environment availability. - - Requirements: - 1. Detect system Chrome/Chromium **or** Playwright-managed Chromium - via the same ``find_chrome`` path used at launch time. - 2. ``browsers_ok`` means launch can use that binary (screenshot stream). - 3. Install (elsewhere) downloads Playwright Chromium only when missing. - 4. ``playwright_chromium`` flags whether *our* install exists (uninstall - target); never implies deleting the user's system browser. - - ``verify_chromium`` is install-time only (see ``POST /browser/install``). - """ - out: dict[str, Any] = { - "playwright": False, - "browsers_ok": False, - "harness_browser": False, - "playwright_chromium": False, - "chrome_path": None, - "chrome_source": None, # "system" | "playwright" | None - "error": None, - } - - from octop.infra.browser.setup import ( # noqa: PLC0415 - chrome_source_for_path, - playwright_chromium_installed, - ) - - out["playwright_chromium"] = playwright_chromium_installed() - - try: - from harness_browser import BrowserSession # noqa: F401, PLC0415 - from harness_browser.cdp.launcher import find_chrome # noqa: PLC0415 - - out["harness_browser"] = True - chrome = find_chrome() - if chrome: - out["browsers_ok"] = True - out["chrome_path"] = chrome - out["chrome_source"] = chrome_source_for_path(chrome) - else: - out["error"] = ( - "Chrome/Chromium not found. Install Google Chrome, or run " - "POST /api/browser/install to download Playwright Chromium." - ) - except ImportError: - pass - - try: - import playwright # noqa: F401, PLC0415 - - out["playwright"] = True - except ImportError as exc: - if not out["harness_browser"]: - out["error"] = ( - f"playwright not installed: {exc}. Install octop[browser] extras or harness-browser." - ) - return out - - if not out["browsers_ok"] and not out.get("error"): - out["error"] = ( - "Chrome/Chromium not found. Install Google Chrome, or run " - "POST /api/browser/install to download Playwright Chromium." - ) - return out - - -@router.get("/browser/env-status") -async def env_status(_: Any = Depends(current_user)) -> dict[str, Any]: - return _probe_env() - - -# --- install --------------------------------------------------------------- - - -def _verify_browser_binary(exe: str) -> tuple[bool, str]: - """Install-time check: binary exists and responds to ``--version``.""" - import subprocess # noqa: PLC0415 - - try: - result = subprocess.run( - [exe, "--version"], - capture_output=True, - text=True, - timeout=10, - check=False, - ) - except subprocess.TimeoutExpired: - return False, f"Browser verification timed out: {exe}" - except OSError as exc: - return False, f"Browser verification failed: {exc}" - - if result.returncode == 0: - version = (result.stdout or result.stderr or "").strip() or exe - return True, version - detail = (result.stderr or result.stdout or "").strip() - return False, f"Browser exited with code {result.returncode}: {detail}" - - -@router.post("/browser/install") -async def install(_: Any = Depends(require_permission("browser"))) -> StreamingResponse: - """Stream Chromium install progress as SSE. - - Each event is a JSON line conforming to ``harness_browser.InstallEvent``: - ``{"log": "..."}`` — progress line - ``{"done": true, "success": true}`` — finished OK - ``{"done": true, "success": false, "error": "..."}`` — failed - - If a system Chrome/Chromium is already resolvable via ``find_chrome``, - verify it with ``--version`` and short-circuit (no Playwright download). - Otherwise delegate to ``install_chromium_stream`` (which runs its own - ``verify_chromium`` after download). - - Returns ``text/event-stream``; the client reads until ``done`` appears. - """ - - async def _event_stream() -> AsyncGenerator[str, None]: - try: - from harness_browser.cdp.launcher import find_chrome # noqa: PLC0415 - - chrome = find_chrome() - if chrome: - yield ("data: " + json.dumps({"log": f"Found browser: {chrome}"}) + "\n\n") - yield ("data: " + json.dumps({"log": "Verifying installation ..."}) + "\n\n") - ok, msg = _verify_browser_binary(chrome) - if ok: - yield "data: " + json.dumps({"log": msg}) + "\n\n" - yield ("data: " + json.dumps({"done": True, "success": True}) + "\n\n") - return - yield ( - "data: " - + json.dumps( - { - "log": ( - f"System browser not usable ({msg}); " - "falling back to Playwright Chromium download ..." - ) - } - ) - + "\n\n" - ) - - from harness_browser import install_chromium_stream # noqa: PLC0415 - - async for event in install_chromium_stream(): - yield f"data: {json.dumps(event)}\n\n" - except Exception as exc: # pragma: no cover - yield f"data: {json.dumps({'done': True, 'success': False, 'error': str(exc)})}\n\n" - - return StreamingResponse( - _event_stream(), - media_type="text/event-stream", - headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, - ) - - -# --- sessions -------------------------------------------------------------- - - -class GotoBody(BaseModel): - url: str - wait_until: str = "load" # load / domcontentloaded / networkidle - - -class ActionBody(BaseModel): - """A single user interaction event to execute on the page.""" - - type: str - """Event type: click | dblclick | mousedown | mouseup | mousemove | type | scroll | - keydown | keyup | navigate | goback | goforward | reload""" - - x: float | None = None - y: float | None = None - button: str = "left" # for mouse events: left | middle | right - delta_x: float = 0.0 # for scroll - delta_y: float = 0.0 # for scroll - text: str | None = None # for type / key events - key: str | None = None # for keydown / keyup - url: str | None = None # for navigate - - -@router.post("/browser/sessions/{session_id}/action") -async def action( - session_id: str, - body: ActionBody, - user: Any = Depends(current_user), -) -> dict[str, Any]: - """Execute a single interaction on the session page. - - Supported action types: - click / dblclick / mousedown / mouseup / mousemove — mouse at (x, y) - type — insert text (body.text) - scroll — scroll at (x, y) by (delta_x, delta_y) - keydown / keyup — key press (body.key) - navigate — navigate to body.url - goback — history.back() - goforward — history.forward() - reload — reload page - - Returns ``{id, url}`` with the updated session URL. - """ - sess = _get_session(user.id, session_id) - try: - page = await sess.ensure_page() - except OctopError: - raise - except Exception as exc: - raise OctopError(ErrorCode.NOT_FOUND, f"session unavailable: {exc}") from exc - t = body.type - try: - if t in ("click", "dblclick", "mousedown", "mouseup", "mousemove"): - if body.x is None or body.y is None: - raise OctopError(ErrorCode.SLASH_BAD_ARGS, "x and y required for mouse action") - if t == "click": - await _mouse_click(sess, page, body.x, body.y, button=body.button) - elif t == "dblclick": - await _mouse_click(sess, page, body.x, body.y, button=body.button, click_count=2) - elif t == "mousemove": - await page.mouse.move(body.x, body.y) - else: - await page.mouse.move(body.x, body.y) - if t == "mousedown": - await page.mouse.down(button=body.button) - else: - await page.mouse.up(button=body.button) - elif t == "type": - if body.text is None: - raise OctopError(ErrorCode.SLASH_BAD_ARGS, "text required for type") - await page.keyboard.type(body.text) - elif t == "scroll": - if body.x is None or body.y is None: - raise OctopError(ErrorCode.SLASH_BAD_ARGS, "x and y required for scroll") - await page.mouse.move(body.x, body.y) - # Drag-scroll sends small per-frame deltas; amplify for visible movement. - await page.mouse.wheel(body.delta_x * 2.5, body.delta_y * 2.5) - elif t == "keydown": - if body.key is None: - raise OctopError(ErrorCode.SLASH_BAD_ARGS, "key required for keydown") - await page.keyboard.down(body.key) - elif t == "keyup": - if body.key is None: - raise OctopError(ErrorCode.SLASH_BAD_ARGS, "key required for keyup") - await page.keyboard.up(body.key) - elif t == "navigate": - if body.url is None: - raise OctopError(ErrorCode.SLASH_BAD_ARGS, "url required for navigate") - await page.goto(body.url, wait_until="domcontentloaded", timeout=30_000) - elif t == "goback": - await page.go_back(wait_until="domcontentloaded", timeout=15_000) - elif t == "goforward": - await page.go_forward(wait_until="domcontentloaded", timeout=15_000) - elif t == "reload": - await page.reload(wait_until="domcontentloaded", timeout=30_000) - else: - raise OctopError(ErrorCode.SLASH_BAD_ARGS, f"unknown action type: {t!r}") - if t in ("navigate", "goback", "goforward", "reload"): - await sess.sync_pages() - except OctopError: - raise - except Exception as exc: - msg = str(exc) - if "has been closed" in msg or "Target page" in msg: - with contextlib.suppress(Exception): - await sess.sync_pages() - raise OctopError(ErrorCode.NOT_FOUND, f"tab closed: {msg}") from exc - raise OctopError(ErrorCode.INTERNAL_ERROR, f"action failed: {exc}") from exc - return await _session_response(sess) - - -@router.get("/browser/sessions/{session_id}") -async def get_session( - session_id: str, - user: Any = Depends(current_user), -) -> dict[str, Any]: - sess = _get_session(user.id, session_id) - try: - return await _session_response(sess) - except OctopError: - raise - except Exception as exc: - raise OctopError(ErrorCode.NOT_FOUND, f"session unavailable: {exc}") from exc - - -@router.get("/browser/sessions") -async def list_sessions(user: Any = Depends(current_user)) -> list[dict[str, Any]]: - out: list[dict[str, Any]] = [] - for s in _sessions.values(): - if s.owner_id != user.id: - continue - with contextlib.suppress(Exception): - out.append(await _session_response(s)) - return out - - -class CreateSessionBody(BaseModel): - width: int = 0 - height: int = 0 - - -@router.post("/browser/sessions", status_code=201) -async def create_session( - body: CreateSessionBody = CreateSessionBody(), - user: Any = Depends(current_user), - server: OctopServer = Depends(get_server), -) -> dict[str, Any]: - env = _probe_env() - if not env["playwright"] or not env["browsers_ok"]: - # 503: the *dependency* is missing, not the request itself. - reason = env["error"] or "browser environment not ready" - raise OctopError( - ErrorCode.INTERNAL_ERROR, - reason, - status=503, - details={"error": reason}, - ) - - from playwright.async_api import async_playwright # noqa: PLC0415 - - async with _session_lock: - # Reuse an existing live session for this user instead of spawning another. - for sid, existing in list(_sessions.items()): - if existing.owner_id != user.id: - continue - try: - return await _session_response(existing) - except OctopError: - _sessions.pop(sid, None) - with contextlib.suppress(Exception): - await existing.close() - - profile_dir = _user_profile_dir(server.paths.root, user.id) - pw = await async_playwright().start() - try: - launch_kwargs: dict[str, Any] = { - "headless": True, - "args": list(_CHROMIUM_ARGS), - } - if body.width > 0 and body.height > 0: - launch_kwargs["viewport"] = {"width": body.width, "height": body.height} - context = await pw.chromium.launch_persistent_context( - str(profile_dir), - **launch_kwargs, - ) - except Exception as exc: - await pw.stop() - raise OctopError( - ErrorCode.INTERNAL_ERROR, - f"browser launch failed: {exc}", - status=500, - ) from exc - sess = _Session(pw, context.browser, context, owner_id=user.id) - sess._wire_context() - await sess.sync_pages() - if not sess.pages: - page = await context.new_page() - sess._track_page(page) - sess.pages.append(page) - _sessions[sess.id] = sess - return await _session_response(sess) - - -@router.delete("/browser/sessions/{session_id}", status_code=204) -async def close_session( - session_id: str, - user: Any = Depends(current_user), -) -> None: - sess = _get_session(user.id, session_id) - async with _session_lock: - _sessions.pop(sess.id, None) - await sess.close() - - -class NewTabBody(BaseModel): - url: str | None = None - - -@router.post("/browser/sessions/{session_id}/tabs", status_code=201) -async def new_tab( - session_id: str, - body: NewTabBody = NewTabBody(), - user: Any = Depends(current_user), -) -> dict[str, Any]: - """Open a new tab and optionally navigate to ``body.url``.""" - sess = _get_session(user.id, session_id) - page = await sess.context.new_page() - warning: str | None = None - if body.url: - try: - await page.goto(body.url, wait_until="domcontentloaded", timeout=30_000) - except Exception as exc: - # Tab restoration is best-effort. A stale local file URL or a page - # that can no longer be reached should not make "Start session" - # fail with a 500; keep the browser session alive and report the - # failed tab as a warning to the caller. - warning = f"failed to open tab {body.url!r}: {exc}" - logger.warning("remote browser tab open failed: %s", warning) - with contextlib.suppress(Exception): - await page.close() - # Page is tracked by context.on("page") — only reconcile and switch. - await sess.sync_pages() - if not page.is_closed(): - with contextlib.suppress(ValueError): - sess.active_idx = sess.pages.index(page) - resp = await _session_response(sess) - if warning: - resp["warning"] = warning - return resp - - -@router.delete("/browser/sessions/{session_id}/tabs/{tab_idx}", status_code=200) -async def close_tab( - session_id: str, - tab_idx: int, - user: Any = Depends(current_user), -) -> dict[str, Any]: - """Close a tab by index. Cannot close the last tab.""" - sess = _get_session(user.id, session_id) - await sess.sync_pages() - if len(sess.pages) <= 1: - raise OctopError(ErrorCode.SLASH_BAD_ARGS, "cannot close the last tab") - if tab_idx < 0 or tab_idx >= len(sess.pages): - raise OctopError(ErrorCode.NOT_FOUND, "tab index out of range") - page = sess.pages.pop(tab_idx) - with contextlib.suppress(Exception): - await page.close() - # Adjust active_idx if needed - if sess.active_idx >= len(sess.pages): - sess.active_idx = len(sess.pages) - 1 - return await _session_response(sess) - - -@router.post("/browser/sessions/{session_id}/tabs/{tab_idx}/switch") -async def switch_tab( - session_id: str, - tab_idx: int, - user: Any = Depends(current_user), -) -> dict[str, Any]: - """Switch active tab by index.""" - sess = _get_session(user.id, session_id) - await sess.sync_pages() - if tab_idx < 0 or tab_idx >= len(sess.pages): - raise OctopError(ErrorCode.NOT_FOUND, "tab index out of range") - sess.active_idx = tab_idx - return await _session_response(sess) - - -@router.post("/browser/sessions/{session_id}/goto") -async def goto( - session_id: str, - body: GotoBody, - user: Any = Depends(current_user), -) -> dict[str, Any]: - sess = _get_session(user.id, session_id) - try: - page = await sess.ensure_page() - await page.goto(body.url, wait_until=body.wait_until, timeout=30_000) - except OctopError: - raise - except Exception as exc: - raise OctopError(ErrorCode.NOT_FOUND, f"navigation failed: {exc}") from exc - resp = await _session_response(sess) - with contextlib.suppress(Exception): - resp["title"] = await sess.page.title() - return resp - - -@router.get("/browser/sessions/{session_id}/screenshot") -async def screenshot( - session_id: str, - user: Any = Depends(current_user), -) -> Response: - sess = _get_session(user.id, session_id) - try: - page = await sess.ensure_page() - png = await page.screenshot(type="png", full_page=False) - except OctopError: - raise - except Exception as exc: - msg = str(exc) - if "has been closed" in msg or "Target page" in msg: - raise OctopError(ErrorCode.NOT_FOUND, f"tab closed: {msg}") from exc - raise OctopError(ErrorCode.NOT_FOUND, f"screenshot failed: {exc}") from exc - return Response(content=png, media_type="image/png") diff --git a/src/octop/api/routers/browser/stream.py b/src/octop/api/routers/browser/stream.py index 3413744d..f8c3b4ad 100644 --- a/src/octop/api/routers/browser/stream.py +++ b/src/octop/api/routers/browser/stream.py @@ -46,6 +46,7 @@ harness_page_url, resolve_harness_session, ) +from octop.infra.utils.browser_media import user_browser_profile logger = logging.getLogger(__name__) @@ -335,14 +336,14 @@ async def browser_stream_ws( await websocket.close(code=4001, reason="missing token") return try: - resolve_user_from_token(server, token) + user = resolve_user_from_token(server, token) except Exception as exc: await websocket.close(code=4001, reason=f"auth failed: {exc}") return await websocket.accept() sess: Any | None = None - profile = "default" + profile = user_browser_profile(user.id) stream_task: asyncio.Task[None] | None = None listen = bool(listen_only) @@ -354,14 +355,11 @@ async def browser_stream_ws( await _send_json(websocket, {"type": "error", "message": "expected start message"}) return - profile_hint = str(start_msg.get("session_id") or "auto") - profile = profile_hint if profile_hint not in {"", "auto"} else "default" - if listen: # Status-only clients (chat browser badge) must not spawn Chrome. stream_task = asyncio.create_task(_listen_state_loop(websocket, profile)) else: - sess = await resolve_harness_session(profile_hint) + sess = await resolve_harness_session(profile) assert sess is not None # create=True always returns or raises start_url = _normalize_nav_url(str(start_msg.get("url") or "")) diff --git a/src/octop/infra/agents/manager.py b/src/octop/infra/agents/manager.py index 17ea648f..d4db6b45 100644 --- a/src/octop/infra/agents/manager.py +++ b/src/octop/infra/agents/manager.py @@ -2481,6 +2481,7 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: policy = SecurityPolicy.merge(global_policy, agent_override) from octop.infra.agents.middleware.binary_read_guard import BinaryReadGuardMiddleware + from octop.infra.agents.middleware.browser_profile import BrowserProfileMiddleware from octop.infra.agents.middleware.reasoning import ReasoningRequestMiddleware from octop.infra.agents.middleware.thread_artifacts import ThreadArtifactsMiddleware from octop.infra.agents.middleware.workspace_image import ( @@ -2496,6 +2497,7 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: *plugin_middleware, ReasoningRequestMiddleware(), KnowledgeSearchHintMiddleware(), + BrowserProfileMiddleware(), BinaryReadGuardMiddleware(), WorkspaceImageMaterializeMiddleware(workspace=ws), ThreadArtifactsMiddleware( diff --git a/src/octop/infra/agents/middleware/browser_profile.py b/src/octop/infra/agents/middleware/browser_profile.py new file mode 100644 index 00000000..ecf3b35b --- /dev/null +++ b/src/octop/infra/agents/middleware/browser_profile.py @@ -0,0 +1,71 @@ +"""Force browser tool calls onto the current user's isolated profile.""" + +from __future__ import annotations + +import logging +from collections.abc import Awaitable, Callable +from typing import Any + +from langchain.agents.middleware import AgentMiddleware +from langchain_core.messages import ToolMessage +from langgraph.config import get_config +from langgraph.prebuilt.tool_node import ToolCallRequest +from langgraph.types import Command + +from octop.infra.utils.browser_media import parse_octop_user_id, user_browser_profile + +logger = logging.getLogger(__name__) + +_BROWSER_TOOL = "browser_use" +_MISSING_USER = ( + "browser_use blocked: the current turn has no Octop user id, " + "so a browser profile cannot be isolated." +) + + +def _bind_browser_profile(request: ToolCallRequest) -> ToolCallRequest | ToolMessage: + tool_call = request.tool_call + if str(tool_call.get("name") or "") != _BROWSER_TOOL: + return request + + configurable = dict(get_config().get("configurable") or {}) + user_id = parse_octop_user_id(configurable.get("user")) + if user_id is None: + logger.warning("browser_use blocked: configurable.user is missing or invalid") + return ToolMessage( + content=_MISSING_USER, + tool_call_id=str(tool_call.get("id") or ""), + status="error", + ) + + raw_args = tool_call.get("args") + args = dict(raw_args) if isinstance(raw_args, dict) else {} + args["profile"] = user_browser_profile(user_id) + return request.override(tool_call={**tool_call, "args": args}) + + +class BrowserProfileMiddleware(AgentMiddleware[Any, Any]): + """Prevent model-selected profiles from crossing Octop user boundaries.""" + + def wrap_tool_call( + self, + request: ToolCallRequest, + handler: Callable[[ToolCallRequest], ToolMessage | Command[Any]], + ) -> ToolMessage | Command[Any]: + bound = _bind_browser_profile(request) + if isinstance(bound, ToolMessage): + return bound + return handler(bound) + + async def awrap_tool_call( + self, + request: ToolCallRequest, + handler: Callable[[ToolCallRequest], Awaitable[ToolMessage | Command[Any]]], + ) -> ToolMessage | Command[Any]: + bound = _bind_browser_profile(request) + if isinstance(bound, ToolMessage): + return bound + return await handler(bound) + + +__all__ = ["BrowserProfileMiddleware"] diff --git a/src/octop/infra/gateway/process/message_keys.py b/src/octop/infra/gateway/process/message_keys.py index 2d551c2d..8a454dd4 100644 --- a/src/octop/infra/gateway/process/message_keys.py +++ b/src/octop/infra/gateway/process/message_keys.py @@ -74,6 +74,8 @@ def resolve_user_id_for_message( Dashboard and CLI use numeric ``subject_id`` values as Octop user ids. External IM subject ids belong to a platform-specific identity domain and may also be numeric, so those sessions always belong to the agent owner. + Browser cookies follow this same id (``user-``): IM members of one + agent share the owner's profile, they are not isolated from each other. """ if msg.channel_type in ( ThreadRegistry.CHANNEL_DASHBOARD, diff --git a/src/octop/infra/gateway/threads.py b/src/octop/infra/gateway/threads.py index e2a359cd..2c4911b9 100644 --- a/src/octop/infra/gateway/threads.py +++ b/src/octop/infra/gateway/threads.py @@ -57,6 +57,37 @@ def replace_repos(self, *, session_repo: SessionRepo, thread_repo: ThreadRepo) - self._sessions = session_repo self._threads = thread_repo + def _refresh_session_if_needed( + self, + row: SessionRow, + *, + channel_id: str | None, + channel_metadata: dict[str, Any] | None, + ) -> None: + """Update a live session when inbound channel id or routing metadata changed.""" + merged_meta = dict(row.channel_metadata or {}) + if channel_metadata: + merged_meta.update(channel_metadata) + if channel_id: + merged_meta["channel_id"] = channel_id + if not ( + (channel_id and channel_id != row.channel_id) + or merged_meta != (row.channel_metadata or {}) + ): + return + self._sessions.upsert( + session_key=row.session_key, + agent_id=row.agent_id, + user_id=row.user_id, + channel_type=row.channel_type, + chat_type=row.chat_type, + thread_id=row.thread_id, + channel_subject_id=row.channel_subject_id, + channel_chat_type=row.channel_chat_type, + channel_metadata=merged_meta, + channel_id=channel_id or row.channel_id, + ) + async def get_or_create( self, *, @@ -76,53 +107,23 @@ async def get_or_create( ) row = self._sessions.get(session_key) if row is not None: - merged_meta = dict(row.channel_metadata or {}) - if channel_metadata: - merged_meta.update(channel_metadata) - needs_upsert = (channel_id and not row.channel_id) or ( - channel_metadata and merged_meta != (row.channel_metadata or {}) + self._refresh_session_if_needed( + row, channel_id=channel_id, channel_metadata=channel_metadata ) - if needs_upsert: - self._sessions.upsert( - session_key=session_key, - agent_id=row.agent_id, - user_id=row.user_id, - channel_type=row.channel_type, - chat_type=row.chat_type, - thread_id=row.thread_id, - channel_subject_id=row.channel_subject_id, - channel_chat_type=row.channel_chat_type, - channel_metadata=merged_meta, - channel_id=channel_id or row.channel_id, - ) return row.thread_id async with self._lock: row = self._sessions.get(session_key) if row is not None: - merged_meta = dict(row.channel_metadata or {}) - if channel_metadata: - merged_meta.update(channel_metadata) - needs_upsert = (channel_id and not row.channel_id) or ( - channel_metadata and merged_meta != (row.channel_metadata or {}) + self._refresh_session_if_needed( + row, channel_id=channel_id, channel_metadata=channel_metadata ) - if needs_upsert: - self._sessions.upsert( - session_key=session_key, - agent_id=row.agent_id, - user_id=row.user_id, - channel_type=row.channel_type, - chat_type=row.chat_type, - thread_id=row.thread_id, - channel_subject_id=row.channel_subject_id, - channel_chat_type=row.channel_chat_type, - channel_metadata=merged_meta, - channel_id=channel_id or row.channel_id, - ) return row.thread_id tid = _new_thread_id() meta = dict(channel_metadata or {}) meta.setdefault("channel_type", channel_type) meta.setdefault("user_id", user_id) + if channel_id: + meta["channel_id"] = channel_id self._threads.insert( thread_id=tid, agent_id=agent_id, @@ -161,25 +162,9 @@ async def get_or_create_by_key( if row.agent_id != agent_id: msg = f"session {session_key!r} belongs to agent {row.agent_id!r}, not {agent_id!r}" raise ValueError(msg) - merged_meta = dict(row.channel_metadata or {}) - if channel_metadata: - merged_meta.update(channel_metadata) - needs_upsert = (channel_channel_id and not row.channel_id) or ( - channel_metadata and merged_meta != (row.channel_metadata or {}) + self._refresh_session_if_needed( + row, channel_id=channel_channel_id, channel_metadata=channel_metadata ) - if needs_upsert: - self._sessions.upsert( - session_key=session_key, - agent_id=row.agent_id, - user_id=row.user_id, - channel_type=row.channel_type, - chat_type=row.chat_type, - thread_id=row.thread_id, - channel_subject_id=row.channel_subject_id, - channel_chat_type=row.channel_chat_type, - channel_metadata=merged_meta, - channel_id=channel_channel_id or row.channel_id, - ) return row.thread_id parts = session_key.split(":", 3) subject_id = parts[2] if len(parts) >= 3 else str(user_id) @@ -263,6 +248,8 @@ async def reset( meta = dict(channel_metadata or {}) meta.setdefault("channel_type", channel_type) meta.setdefault("user_id", user_id) + if channel_id: + meta["channel_id"] = channel_id async with self._lock: tid = _new_thread_id() self._threads.insert( diff --git a/src/octop/infra/utils/browser_media.py b/src/octop/infra/utils/browser_media.py index 8c7e9fbb..832340f1 100644 --- a/src/octop/infra/utils/browser_media.py +++ b/src/octop/infra/utils/browser_media.py @@ -18,6 +18,29 @@ BROWSER_PROFILES_REL = "browser-profiles" +def parse_octop_user_id(raw: object) -> int | None: + """Return a positive Octop ``users.id``, or ``None`` if *raw* is unusable.""" + if isinstance(raw, bool) or not isinstance(raw, (int, str)): + return None + try: + user_id = int(raw) + except (TypeError, ValueError): + return None + if user_id <= 0: + return None + return user_id + + +def user_browser_profile(user_id: int) -> str: + """Stable harness-browser profile name for one Octop user. + + Dashboard and CLI turns use the logged-in user. IM turns use the agent + owner (the same id already stored on the thread). A leftover on-disk + ``default`` directory is not migrated and must not be reused. + """ + return f"user-{user_id}" + + def agent_outbound_screenshots_dir(workspace_dir: Path) -> Path: """``{workspace_dir}/outbound/screenshots`` — same convention as IM ``outbound/``.""" dest = Path(workspace_dir) / OUTBOUND_SCREENSHOTS_REL @@ -61,9 +84,10 @@ def _maybe_migrate_legacy_profiles(dest: Path) -> None: def octop_browser_profiles_dir(paths: PathLayout | None = None) -> Path: """Shared Chrome profiles root: ``~/.octop/browser-profiles``. - Profiles are shared across agents (one headed ``default`` profile for - dashboard + ``browser_use``). Prefer this Octop-owned directory over - ``~/.harness-browser/profiles`` or system ``/tmp``. + Profiles live under one Octop-owned root and are named ``user-``. + A pre-isolation ``default`` directory, if present, is left untouched. + Prefer this directory over ``~/.harness-browser/profiles`` or system + ``/tmp``. When the Octop dir is empty and a legacy harness-browser profiles tree exists, contents are moved once so login cookies survive the cutover. diff --git a/tests/integration/test_browser_api.py b/tests/integration/test_browser_api.py index 1b41900a..f42da999 100644 --- a/tests/integration/test_browser_api.py +++ b/tests/integration/test_browser_api.py @@ -1,14 +1,9 @@ """tests/integration/test_browser_api.py — remote browser endpoints. -We deliberately don't spawn a real Playwright browser in the test -suite — that requires the chromium binary to be installed and adds -~5s of cold-start per test. Instead we drive the *gates* and the -``_probe_env`` helper directly: env-status shape, install spawn -returning a pid, 503 when browsers aren't ready, cross-user 404. - -The happy path (create session → goto → screenshot) is exercised -manually via the dashboard; once chromium is installed in CI we can -flip a feature flag and let ``test_create_session_happy_path`` run. +We deliberately don't spawn a real Chrome in the test suite. These +cases drive env-status, ``_probe_env``, install SSE, harness-sessions, +and shutdown gates. Live screencast is covered by dashboard + WS unit +tests. """ from __future__ import annotations @@ -43,7 +38,7 @@ def test_probe_env_when_playwright_missing() -> None: """``_probe_env`` should not raise even with playwright import broken.""" import builtins - from octop.api.routers.browser import sessions as br + from octop.api.routers.browser import env as br original_import = builtins.__import__ @@ -62,7 +57,7 @@ def fake_import(name: str, *args: Any, **kw: Any) -> Any: def test_probe_env_harness_browser_without_chromium() -> None: """``browsers_ok`` must stay false when no Chrome/Chromium is available.""" - from octop.api.routers.browser import sessions as br + from octop.api.routers.browser import env as br try: import harness_browser # noqa: F401 @@ -81,7 +76,7 @@ def test_probe_env_harness_browser_without_chromium() -> None: def test_probe_env_accepts_system_chrome() -> None: """System Chrome via find_chrome is enough for browsers_ok (same as launch).""" - from octop.api.routers.browser import sessions as br + from octop.api.routers.browser import env as br try: import harness_browser # noqa: F401 @@ -111,7 +106,7 @@ def test_probe_env_accepts_system_chrome() -> None: def test_verify_browser_binary_ok(tmp_path: Path) -> None: - from octop.api.routers.browser import sessions as br + from octop.api.routers.browser import env as br if os.name == "nt": # Windows cannot exec a shebang script; use a .bat that ignores args. @@ -126,14 +121,14 @@ def test_verify_browser_binary_ok(tmp_path: Path) -> None: assert "Chrome" in msg -# --- session list (always permits empty) ----------------------------------- - - -async def test_list_sessions_empty(env: Any) -> None: +async def test_legacy_playwright_session_routes_removed(env: Any) -> None: + """In-process Playwright CRUD is gone; the product path is harness-sessions.""" c, _srv, auth = env r = await c.get("/api/browser/sessions", headers=auth) - assert r.status_code == 200 - assert r.json() == [] + assert r.status_code in (404, 405) + r = await c.post("/api/browser/sessions", headers=auth) + assert r.status_code in (404, 405) + assert r.status_code != 201 async def test_harness_sessions_shape(env: Any) -> None: @@ -204,103 +199,13 @@ def get(self, _url: str, timeout=None): assert [tab["active"] for tab in tabs] == [False, True] -async def test_new_tab_bad_restore_url_returns_warning() -> None: - """A stale restored tab URL should not crash the whole browser session.""" - from octop.api.routers.browser import sessions as br - - class FakePage: - def __init__(self) -> None: - self.closed = False - - async def goto(self, *_args: Any, **_kwargs: Any) -> None: - raise RuntimeError("net::ERR_FILE_NOT_FOUND") - - async def close(self) -> None: - self.closed = True - - def is_closed(self) -> bool: - return self.closed - - class FakeContext: - async def new_page(self) -> FakePage: - return FakePage() - - class FakeSession: - id = "sid" - url = "about:blank" - context = FakeContext() - pages: list[Any] = [] - active_idx = 0 - - async def sync_pages(self) -> None: - return None - - async def tab_list(self) -> list[dict[str, Any]]: - return [{"idx": 0, "url": "about:blank", "title": "", "active": True}] - - with patch("octop.api.routers.browser.sessions._get_session", return_value=FakeSession()): - resp = await br.new_tab( - "sid", - br.NewTabBody(url="file:///missing.html"), - SimpleNamespace(id=1), - ) - - assert resp["id"] == "sid" - assert "warning" in resp - assert "file:///missing.html" in resp["warning"] - - -# --- create when env not ready -> 503 ------------------------------------- - - -async def test_create_session_503_when_env_broken(env: Any) -> None: - c, _srv, auth = env - - with patch( - "octop.api.routers.browser.sessions._probe_env", - return_value={ - "playwright": True, - "browsers_ok": False, - "error": "chromium not installed", - }, - ): - r = await c.post("/api/browser/sessions", headers=auth) - assert r.status_code == 503 - body = r.json() - # The specific env reason is surfaced via ``details`` (the message is a - # generic localized string per the i18n design). - assert "chromium" in body["error"]["details"]["error"].lower() - - -# --- cross-user isolation -------------------------------------------------- - - -async def test_session_404_for_other_user(env: Any) -> None: - c, _srv, auth = env - r = await c.get("/api/browser/sessions/no-such-id", headers=auth) - assert r.status_code == 404 - r = await c.delete("/api/browser/sessions/no-such-id", headers=auth) - assert r.status_code == 404 - r = await c.get( - "/api/browser/sessions/no-such-id/screenshot", - headers=auth, - ) - assert r.status_code == 404 - r = await c.post( - "/api/browser/sessions/no-such-id/goto", - headers=auth, - json={"url": "https://example.com"}, - ) - assert r.status_code == 404 - - async def test_shutdown_requires_auth(env: Any) -> None: c, _srv, _auth = env r = await c.post("/api/browser/shutdown") assert r.status_code == 401 -async def test_shutdown_stops_named_profile(env: Any) -> None: +async def test_shutdown_ignores_client_profile(env: Any) -> None: c, _srv, auth = env result = SimpleNamespace(success=True, error=None) with patch( @@ -309,10 +214,10 @@ async def test_shutdown_stops_named_profile(env: Any) -> None: ) as tool: r = await c.post("/api/browser/shutdown?profile=work", headers=auth) assert r.status_code == 200 - assert r.json() == {"ok": True, "profile": "work"} + assert r.json() == {"ok": True, "profile": "user-1"} tool.assert_awaited_once_with( action="close_session", - profile="work", + profile="user-1", kill=True, ) diff --git a/tests/integration/test_browser_record_replay_api.py b/tests/integration/test_browser_record_replay_api.py index 03ea062a..71dd7d6e 100644 --- a/tests/integration/test_browser_record_replay_api.py +++ b/tests/integration/test_browser_record_replay_api.py @@ -1,5 +1,6 @@ from __future__ import annotations +from types import SimpleNamespace from typing import Any from unittest.mock import AsyncMock, patch @@ -49,7 +50,7 @@ async def test_record_replay_start_ensures_daemon_and_starts_recording(env: Any) mock_send.assert_awaited_once_with( { "command": "start", - "profile": "thr_demo", + "profile": "user-1", "name": "demo", "privacy": "mask-sensitive", "screenshots": "off", @@ -57,7 +58,7 @@ async def test_record_replay_start_ensures_daemon_and_starts_recording(env: Any) ) -async def test_record_replay_start_falls_back_to_profile_without_agent_profile(env: Any) -> None: +async def test_record_replay_start_ignores_requested_profile(env: Any) -> None: client, _srv, auth = env with ( @@ -80,7 +81,7 @@ async def test_record_replay_start_falls_back_to_profile_without_agent_profile(e mock_send.assert_awaited_once_with( { "command": "start", - "profile": "thr_demo", + "profile": "user-1", "name": "demo", "privacy": "mask-sensitive", "screenshots": "off", @@ -108,11 +109,17 @@ async def test_record_replay_start_returns_503_when_daemon_fails(env: Any) -> No async def test_record_replay_stop_generates_steps(env: Any) -> None: client, _srv, auth = env + owned = SimpleNamespace(read_manifest=lambda _rid: SimpleNamespace(profile="user-1")) - with patch( - "octop.api.routers.browser.record_replay.send_record_request", - new=AsyncMock(return_value={"ok": True, "recordingId": "rec_1", "events": 4, "steps": 2}), - ) as mock_send: + with ( + patch("harness_browser.record.store.RecordingStore", return_value=owned), + patch( + "octop.api.routers.browser.record_replay.send_record_request", + new=AsyncMock( + return_value={"ok": True, "recordingId": "rec_1", "events": 4, "steps": 2} + ), + ) as mock_send, + ): r = await client.post( "/api/browser/record-replay/stop", headers=auth, @@ -131,7 +138,7 @@ async def test_record_replay_stop_generates_steps(env: Any) -> None: ) -async def test_record_replay_start_uses_agent_profile_when_requested(env: Any) -> None: +async def test_record_replay_start_ignores_requested_agent_profile(env: Any) -> None: client, _srv, auth = env with ( @@ -154,7 +161,7 @@ async def test_record_replay_start_uses_agent_profile_when_requested(env: Any) - mock_send.assert_awaited_once_with( { "command": "start", - "profile": "default", + "profile": "user-1", "name": None, "privacy": "mask-sensitive", "screenshots": "off", @@ -166,9 +173,17 @@ async def test_record_replay_replay_runs_runner(env: Any) -> None: client, _srv, auth = env runner = AsyncMock(return_value={"status": "passed", "recordingId": "rec_1"}) - with patch( - "octop.api.routers.browser.record_replay.run_replay_recording", - new=runner, + with ( + patch( + "harness_browser.record.store.RecordingStore", + return_value=SimpleNamespace( + read_manifest=lambda _rid: SimpleNamespace(profile="user-1") + ), + ), + patch( + "octop.api.routers.browser.record_replay.run_replay_recording", + new=runner, + ), ): r = await client.post( "/api/browser/record-replay/replay", @@ -178,4 +193,40 @@ async def test_record_replay_replay_runs_runner(env: Any) -> None: assert r.status_code == 200 assert r.json()["status"] == "passed" - runner.assert_awaited_once_with("rec_1", profile="thr_demo-replay", inputs={}) + runner.assert_awaited_once_with("rec_1", profile="user-1", inputs={}) + + +async def test_record_status_hides_other_user_active(env: Any) -> None: + client, _srv, auth = env + with ( + patch( + "octop.api.routers.browser.record_replay.send_record_request", + new=AsyncMock( + return_value={ + "ok": True, + "active": {"recordingId": "rec_x", "profile": "user-99"}, + } + ), + ), + patch( + "octop.api.routers.browser.record_replay._latest_recording_id", + return_value=None, + ), + ): + r = await client.get("/api/browser/record-replay/status", headers=auth) + assert r.status_code == 200 + assert r.json()["active"] is None + + +async def test_record_skill_content_hides_other_user_recording(env: Any) -> None: + client, _srv, auth = env + store = SimpleNamespace( + read_manifest=lambda _rid: SimpleNamespace(profile="user-99"), + ) + with patch("harness_browser.record.store.RecordingStore", return_value=store): + r = await client.post( + "/api/browser/record-replay/skill-content", + headers=auth, + json={"recordingId": "rec_other"}, + ) + assert r.status_code == 404 diff --git a/tests/unit/agents/test_browser_profile_middleware.py b/tests/unit/agents/test_browser_profile_middleware.py new file mode 100644 index 00000000..fc9ca6d6 --- /dev/null +++ b/tests/unit/agents/test_browser_profile_middleware.py @@ -0,0 +1,78 @@ +from unittest.mock import AsyncMock + +import pytest +from langgraph.prebuilt.tool_node import ToolCallRequest + +from octop.infra.agents.middleware import browser_profile + + +def _request(name: str, args: dict[str, object]) -> ToolCallRequest: + return ToolCallRequest( + tool_call={"name": name, "args": args, "id": "call-1"}, + tool=None, + state={}, + runtime=None, # type: ignore[arg-type] + ) + + +@pytest.mark.asyncio +async def test_browser_profile_is_forced_from_current_user(monkeypatch) -> None: + monkeypatch.setattr( + browser_profile, + "get_config", + lambda: {"configurable": {"user": "42"}}, + ) + handler = AsyncMock(return_value=object()) + request = _request("browser_use", {"action": "navigate", "profile": "default"}) + + await browser_profile.BrowserProfileMiddleware().awrap_tool_call(request, handler) + + forwarded = handler.await_args.args[0] + assert forwarded.tool_call["args"] == { + "action": "navigate", + "profile": "user-42", + } + + +@pytest.mark.asyncio +async def test_non_browser_tool_is_unchanged(monkeypatch) -> None: + monkeypatch.setattr( + browser_profile, + "get_config", + lambda: {"configurable": {"user": "42"}}, + ) + handler = AsyncMock(return_value=object()) + request = _request("read_file", {"path": "notes.txt"}) + + await browser_profile.BrowserProfileMiddleware().awrap_tool_call(request, handler) + + assert handler.await_args.args[0] is request + + +@pytest.mark.asyncio +async def test_browser_profile_blocks_when_user_missing(monkeypatch) -> None: + monkeypatch.setattr(browser_profile, "get_config", lambda: {"configurable": {}}) + handler = AsyncMock(return_value=object()) + request = _request("browser_use", {"action": "navigate", "profile": "default"}) + + result = await browser_profile.BrowserProfileMiddleware().awrap_tool_call(request, handler) + + handler.assert_not_awaited() + assert getattr(result, "status", None) == "error" + assert "no Octop user id" in str(result.content) + + +@pytest.mark.asyncio +async def test_browser_profile_blocks_placeholder_user_zero(monkeypatch) -> None: + monkeypatch.setattr( + browser_profile, + "get_config", + lambda: {"configurable": {"user": "0"}}, + ) + handler = AsyncMock(return_value=object()) + request = _request("browser_use", {"action": "navigate"}) + + result = await browser_profile.BrowserProfileMiddleware().awrap_tool_call(request, handler) + + handler.assert_not_awaited() + assert getattr(result, "status", None) == "error" diff --git a/tests/unit/api/test_acl_gate_coverage.py b/tests/unit/api/test_acl_gate_coverage.py index 62015656..d9f9a60a 100644 --- a/tests/unit/api/test_acl_gate_coverage.py +++ b/tests/unit/api/test_acl_gate_coverage.py @@ -28,7 +28,7 @@ "routers/connectors.py", "routers/knowledge_bases.py", "routers/browser/uninstall.py", - "routers/browser/sessions.py", + "routers/browser/env.py", "routers/desktop/install.py", "routers/desktop/uninstall.py", "routers/desktop/status.py", diff --git a/tests/unit/api/test_browser_stream_listen.py b/tests/unit/api/test_browser_stream_listen.py index 807e4c3d..a255f78e 100644 --- a/tests/unit/api/test_browser_stream_listen.py +++ b/tests/unit/api/test_browser_stream_listen.py @@ -106,3 +106,33 @@ async def test_resolve_harness_session_create_false_returns_none() -> None: ): result = await resolve_harness_session("default", create=False) assert result is None + + +@pytest.mark.asyncio +async def test_resolve_harness_session_never_falls_back_to_another_profile() -> None: + other_session = object() + tool_iface = SimpleNamespace(_registry={"user-2": other_session}) + hb = SimpleNamespace(BrowserSession=object, tool_interface=tool_iface) + with patch.dict( + sys.modules, + {"harness_browser": hb, "harness_browser.tool_interface": tool_iface}, + ): + result = await resolve_harness_session("user-1", create=False) + assert result is None + + +@pytest.mark.asyncio +async def test_resolve_harness_session_create_true_rejects_empty_hint() -> None: + from octop.infra.errors import OctopError + + fake_registry: dict[str, Any] = {"user-2": object()} + tool_iface = SimpleNamespace(_registry=fake_registry) + hb = SimpleNamespace(BrowserSession=object, tool_interface=tool_iface) + with ( + patch.dict( + sys.modules, + {"harness_browser": hb, "harness_browser.tool_interface": tool_iface}, + ), + pytest.raises(OctopError, match="browser profile is required"), + ): + await resolve_harness_session("auto", create=True) diff --git a/tests/unit/api/test_harness_tabs.py b/tests/unit/api/test_harness_tabs.py index ef79786c..b79c502a 100644 --- a/tests/unit/api/test_harness_tabs.py +++ b/tests/unit/api/test_harness_tabs.py @@ -92,7 +92,7 @@ def get(self, url: str, timeout: object = None) -> _JsonResp: @pytest.mark.asyncio -async def test_shutdown_browser_kills_named_profile() -> None: +async def test_shutdown_browser_forces_current_user_profile() -> None: result = SimpleNamespace(success=True, error=None) with ( patch( @@ -101,10 +101,12 @@ async def test_shutdown_browser_kills_named_profile() -> None: ) as tool, patch("harness_browser.tool_interface._registry", {"work": object()}), ): - body = await harness_mod.shutdown_browser(profile="work", _=object()) - assert body == {"ok": True, "profile": "work"} + body = await harness_mod.shutdown_browser( + user=SimpleNamespace(id=7), + ) + assert body == {"ok": True, "profile": "user-7"} tool.assert_awaited_once_with( action="close_session", - profile="work", + profile="user-7", kill=True, ) diff --git a/tests/unit/gateway/test_thread_registry.py b/tests/unit/gateway/test_thread_registry.py index adc5be97..cedf0155 100644 --- a/tests/unit/gateway/test_thread_registry.py +++ b/tests/unit/gateway/test_thread_registry.py @@ -178,3 +178,104 @@ async def test_get_or_create_by_key_backfills_channel_id(registry: ThreadRegistr row = registry.get_session(sk) assert row is not None assert row.channel_id == "ch-feishu-1" + assert row.channel_metadata is not None + assert row.channel_metadata["channel_id"] == "ch-feishu-1" + + +@pytest.mark.asyncio +async def test_inbound_rebinds_session_to_replacement_channel(registry: ThreadRegistry) -> None: + """A deleted channel's id must not stay bound, or proactive push breaks.""" + sk = ThreadRegistry.make_key(agent_id="a1", channel_type="feishu", channel_subject_id="ou_x") + await registry.get_or_create_by_key( + session_key=sk, + agent_id="a1", + user_id=1, + channel_type="feishu", + channel_channel_id="ch-old", + ) + await registry.get_or_create_by_key( + session_key=sk, + agent_id="a1", + user_id=1, + channel_type="feishu", + channel_channel_id="ch-new", + ) + row = registry.get_session(sk) + assert row is not None + assert row.channel_id == "ch-new" + assert row.channel_metadata is not None + assert row.channel_metadata["channel_id"] == "ch-new" + + +@pytest.mark.asyncio +async def test_get_or_create_rebinds_replacement_channel(registry: ThreadRegistry) -> None: + await registry.get_or_create( + agent_id="a1", + user_id=1, + channel_type="feishu", + channel_subject_id="ou_x", + channel_id="ch-old", + ) + await registry.get_or_create( + agent_id="a1", + user_id=1, + channel_type="feishu", + channel_subject_id="ou_x", + channel_id="ch-new", + ) + sk = ThreadRegistry.make_key(agent_id="a1", channel_type="feishu", channel_subject_id="ou_x") + row = registry.get_session(sk) + assert row is not None + assert row.channel_id == "ch-new" + assert row.channel_metadata is not None + assert row.channel_metadata["channel_id"] == "ch-new" + + +@pytest.mark.asyncio +async def test_same_channel_id_does_not_rewrite_session(registry: ThreadRegistry) -> None: + sk = ThreadRegistry.make_key(agent_id="a1", channel_type="feishu", channel_subject_id="ou_x") + await registry.get_or_create_by_key( + session_key=sk, + agent_id="a1", + user_id=1, + channel_type="feishu", + channel_channel_id="ch-same", + ) + before = registry.get_session(sk) + assert before is not None + await registry.get_or_create_by_key( + session_key=sk, + agent_id="a1", + user_id=1, + channel_type="feishu", + channel_channel_id="ch-same", + ) + after = registry.get_session(sk) + assert after is not None + assert after.updated_at == before.updated_at + assert after.channel_id == "ch-same" + + +@pytest.mark.asyncio +async def test_metadata_refresh_keeps_bound_channel_id(registry: ThreadRegistry) -> None: + sk = ThreadRegistry.make_key(agent_id="a1", channel_type="feishu", channel_subject_id="ou_x") + await registry.get_or_create_by_key( + session_key=sk, + agent_id="a1", + user_id=1, + channel_type="feishu", + channel_channel_id="ch-keep", + ) + await registry.get_or_create_by_key( + session_key=sk, + agent_id="a1", + user_id=1, + channel_type="feishu", + channel_metadata={"chat_id": "oc_1"}, + ) + row = registry.get_session(sk) + assert row is not None + assert row.channel_id == "ch-keep" + assert row.channel_metadata is not None + assert row.channel_metadata["channel_id"] == "ch-keep" + assert row.channel_metadata["chat_id"] == "oc_1" From 61f4ba6354ecb5faadb307aad3290f5cad13bfd6 Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Sat, 5 Sep 2026 01:29:13 +0000 Subject: [PATCH 51/58] feat(settings): move voice and search settings under models page - Relocate voice and search engine settings from Advanced to Models page/permission category (nav, routes, permission gates). - Add /admin/voice/providers/test-configuration endpoint and VoiceManager.test_configuration() to probe unsaved provider values before saving. - Redirect legacy /admin/advanced?tab=voice|search links to the new Models page location. --- dashboard/src/api/modules/voice.ts | 28 +- dashboard/src/locales/en.json | 18 +- dashboard/src/locales/zh.json | 18 +- .../pages/Settings/AdvancedSettings/index.tsx | 36 +- dashboard/src/pages/Settings/Models/index.tsx | 104 +++++- .../Settings/SearchConfig/index.module.less | 16 +- .../src/pages/Settings/SearchConfig/index.tsx | 102 +++--- .../pages/Settings/Voice/index.module.less | 16 + dashboard/src/pages/Settings/Voice/index.tsx | 342 +++++++++++------- dashboard/src/routes/controlAdminPath.test.ts | 10 + dashboard/src/routes/index.tsx | 2 +- dashboard/src/utils/permissions.ts | 21 +- src/octop/api/routers/voice.py | 21 ++ src/octop/infra/users/permissions.py | 20 +- src/octop/infra/voice/manager.py | 28 ++ tests/unit/test_voice_manager.py | 36 +- tests/unit/users/test_permissions.py | 2 + 17 files changed, 539 insertions(+), 281 deletions(-) diff --git a/dashboard/src/api/modules/voice.ts b/dashboard/src/api/modules/voice.ts index 741c0e3c..8562a641 100644 --- a/dashboard/src/api/modules/voice.ts +++ b/dashboard/src/api/modules/voice.ts @@ -28,6 +28,16 @@ export interface ActiveVoice { tts: string; } +export interface VoiceProviderInput { + name: string; + kind: string; + capability: string; + base_url?: string | null; + api_key?: string | null; + extra_json?: string | null; + note?: string | null; +} + function recordingFilename(type: string): string { const lower = type.toLowerCase(); if (lower.includes("mp4")) return "recording.m4a"; @@ -83,15 +93,7 @@ export const voiceApi = { ...(provider ? { provider } : {}), }), }), - createProvider: (body: { - name: string; - kind: string; - capability: string; - base_url?: string | null; - api_key?: string | null; - extra_json?: string | null; - note?: string | null; - }) => + createProvider: (body: VoiceProviderInput) => request("/admin/voice/providers", { method: "POST", body: JSON.stringify(body), @@ -122,4 +124,12 @@ export const voiceApi = { body: JSON.stringify({ mode }), }, ), + testConfiguration: (body: VoiceProviderInput & { mode: "stt" | "tts" }) => + request<{ ok: boolean; error?: string }>( + "/admin/voice/providers/test-configuration", + { + method: "POST", + body: JSON.stringify(body), + }, + ), }; diff --git a/dashboard/src/locales/en.json b/dashboard/src/locales/en.json index beb78869..b50d5d47 100644 --- a/dashboard/src/locales/en.json +++ b/dashboard/src/locales/en.json @@ -2350,6 +2350,7 @@ "voice": { "loading": "Loading voice settings…", "loadError": "Failed to load voice settings", + "description": "Manage speech-to-text and text-to-speech models, and choose the active services.", "sttSection": "Speech Input (STT)", "ttsSection": "Read Aloud (TTS)", "free": "Free", @@ -2360,7 +2361,12 @@ "activeUpdated": "Active voice provider updated", "activeUpdateFailed": "Failed to update active provider", "configure": "Configure", + "configureTitle": "Configure {{name}}", "saved": "Configuration saved", + "credentialsRequired": "Complete the connection credentials first", + "probe": "Probe", + "probeSuccess": "Voice model probe succeeded", + "probeFailed": "Voice model probe failed", "tencentHint": "Create SecretId / SecretKey in Tencent Cloud console. ASR and TTS include free trial quota.", "openaiHint": "Uses OpenAI Whisper for STT and OpenAI TTS for read-aloud.", "mimoHint": "Xiaomi MiMo ASR/TTS. Choose endpoint and enter the corresponding API key.", @@ -2800,9 +2806,11 @@ "ollamaNotRunning": "Ollama service is not running", "testUseSavedConfig": "Uses saved configuration", "pageTitle": "Models", - "pageSubtitle": "Manage conversational, image-generation, and video-generation model services in one place.", + "pageSubtitle": "Manage conversational, image/video generation, voice, and search engine services in one place.", "chatModelsTab": "Conversation models", "generationModelsTab": "Generation models", + "voiceModelsTab": "Voice models", + "searchModelsTab": "Search engines", "addCustomProvider": "New Provider", "loadingProviders": "Loading...", "noProvidersHint": "No providers yet. Click the top right to create one.", @@ -2915,9 +2923,11 @@ "advancedSettings": { "description": "Manage runtime configuration and environment variables.", "search": { - "desc": "Configure AI-powered web search providers to enable your assistant to search the internet. Each provider requires an API key from the respective service.", + "desc": "Manage web search providers for agents to retrieve from the internet.", "tip": "You can configure or modify search providers here. Changes take effect immediately on the next chat session.", "configure": "Configure", + "configureTitle": "Configure {{name}}", + "probe": "Probe", "sourceBuiltinTitle": "Current search source: built-in search", "sourceBuiltinDesc": "When no third-party search provider is configured, Octop still provides its built-in search service. It requires no API key, but its stability and availability are not guaranteed. It switches automatically once a third-party provider is configured.", "sourceConfiguredTitle": "Current search source: {{name}}", @@ -4952,7 +4962,7 @@ }, "models": { "title": "Model Management", - "subtitle": "Configure LLM providers and API keys" + "subtitle": "Configure conversation, generation, voice, and search engines" }, "voice": { "title": "Voice Services", @@ -4980,7 +4990,7 @@ }, "adminAdvanced": { "title": "Application Settings", - "subtitle": "Environment variables, search, voice, backup, HTTPS, and updates" + "subtitle": "Environment variables, backup, HTTPS, and updates" }, "security": { "title": "Security", diff --git a/dashboard/src/locales/zh.json b/dashboard/src/locales/zh.json index 0cd6f4ca..9d24ae4a 100644 --- a/dashboard/src/locales/zh.json +++ b/dashboard/src/locales/zh.json @@ -2350,6 +2350,7 @@ "voice": { "loading": "加载语音配置…", "loadError": "加载语音配置失败", + "description": "管理语音识别与语音合成模型,并选择当前使用的服务。", "sttSection": "语音输入 (STT)", "ttsSection": "语音朗读 (TTS)", "free": "免费", @@ -2360,7 +2361,12 @@ "activeUpdated": "已更新当前语音服务", "activeUpdateFailed": "更新失败", "configure": "配置", + "configureTitle": "配置 {{name}}", "saved": "配置已保存", + "credentialsRequired": "请先填写完整的连接凭证", + "probe": "探测", + "probeSuccess": "语音模型探测成功", + "probeFailed": "语音模型探测失败", "tencentHint": "在腾讯云控制台创建 SecretId / SecretKey,语音识别与合成均有免费试用额度。", "openaiHint": "使用 OpenAI Whisper 识别、OpenAI TTS 朗读。", "mimoHint": "小米 Mimo 语音识别与合成。选择接入点并填写对应的 API Key。", @@ -2798,9 +2804,11 @@ "ollamaNotRunning": "Ollama 服务未启动", "testUseSavedConfig": "使用已保存的配置", "pageTitle": "模型设置", - "pageSubtitle": "统一管理对话模型与图片、视频生成模型服务。", + "pageSubtitle": "统一管理对话模型、图片视频生成模型、语音模型与搜索引擎。", "chatModelsTab": "对话模型", "generationModelsTab": "生成模型", + "voiceModelsTab": "语音模型", + "searchModelsTab": "搜索引擎", "addCustomProvider": "自定义供应商", "loadingProviders": "加载中...", "noProvidersHint": "还没有 provider,点击右上角新建", @@ -2912,9 +2920,11 @@ "advancedSettings": { "description": "管理运行配置和环境变量等高级选项。", "search": { - "desc": "配置 AI 驱动的网络搜索提供商,使您的助手能够搜索互联网。每个提供商需要来自相应服务的 API 密钥。", + "desc": "管理网络搜索提供商,供智能体检索互联网。", "tip": "您可以在此处配置或修改搜索提供商。更改将在下一次聊天会话时生效。", "configure": "配置", + "configureTitle": "配置 {{name}}", + "probe": "探测", "sourceBuiltinTitle": "当前搜索源:内置搜索", "sourceBuiltinDesc": "未配置第三方搜索服务时,仍可使用产品内置搜索服务;该服务无需 API Key,但不保证稳定性和可用性。配置第三方服务后会自动切换。", "sourceConfiguredTitle": "当前搜索源:{{name}}", @@ -5091,7 +5101,7 @@ }, "models": { "title": "模型配置", - "subtitle": "配置 LLM 提供商和 API 密钥" + "subtitle": "配置对话模型、生成模型、语音模型与搜索引擎" }, "voice": { "title": "语音服务", @@ -5119,7 +5129,7 @@ }, "adminAdvanced": { "title": "应用设置", - "subtitle": "环境变量、搜索、语音、备份、HTTPS 与更新" + "subtitle": "环境变量、备份、HTTPS 与更新" }, "security": { "title": "安全防护", diff --git a/dashboard/src/pages/Settings/AdvancedSettings/index.tsx b/dashboard/src/pages/Settings/AdvancedSettings/index.tsx index 9cfd1fba..16b849e2 100644 --- a/dashboard/src/pages/Settings/AdvancedSettings/index.tsx +++ b/dashboard/src/pages/Settings/AdvancedSettings/index.tsx @@ -1,17 +1,8 @@ import type { ReactNode } from "react"; import { useTranslation } from "react-i18next"; -import { - Archive, - Lock, - Mic2, - RefreshCw, - Search, - Variable, - Activity, -} from "lucide-react"; +import { Navigate, useSearchParams } from "react-router-dom"; +import { Archive, Lock, RefreshCw, Variable, Activity } from "lucide-react"; import EnvironmentsPage from "../Environments"; -import SearchConfigPage from "../SearchConfig"; -import { VoiceSettingsPanel } from "../Voice"; import { ObservabilitySettingsPanel } from "../Observability"; import BackupRestorePanel from "../BackupRestore"; import { HttpsSettingsPanel } from "../HttpsSettings"; @@ -23,14 +14,7 @@ import ForbiddenPage from "../../../components/ForbiddenPage"; import { useGatedSearchTabs } from "../../../hooks/useGatedSearchTabs"; import { ADVANCED_TAB_PERMISSIONS } from "../../../utils/permissions"; -type TabKey = - | "env-vars" - | "search" - | "voice" - | "observability" - | "backup" - | "https" - | "updates"; +type TabKey = "env-vars" | "observability" | "backup" | "https" | "updates"; const TABS: { key: TabKey; labelKey: string; icon: ReactNode }[] = [ { @@ -38,8 +22,6 @@ const TABS: { key: TabKey; labelKey: string; icon: ReactNode }[] = [ labelKey: "nav.environments", icon: , }, - { key: "search", labelKey: "nav.search", icon: }, - { key: "voice", labelKey: "nav.voice", icon: }, { key: "observability", labelKey: "nav.observability", @@ -56,8 +38,6 @@ const TABS: { key: TabKey; labelKey: string; icon: ReactNode }[] = [ function parseTab(raw: string | null): TabKey { if ( - raw === "search" || - raw === "voice" || raw === "observability" || raw === "backup" || raw === "https" || @@ -70,6 +50,7 @@ function parseTab(raw: string | null): TabKey { export default function AdvancedSettingsPage() { const { t } = useTranslation(); + const [searchParams] = useSearchParams(); const { allowedTabs, activeTab, forbidden, selectTab } = useGatedSearchTabs({ tabs: TABS, tabPermissions: ADVANCED_TAB_PERMISSIONS, @@ -77,16 +58,17 @@ export default function AdvancedSettingsPage() { querylessKey: "env-vars", }); + const moved = searchParams.get("tab"); + if (moved === "voice" || moved === "search") { + return ; + } + if (forbidden) return ; const renderTab = () => { switch (activeTab) { case "env-vars": return ; - case "search": - return ; - case "voice": - return ; case "observability": return ; case "backup": diff --git a/dashboard/src/pages/Settings/Models/index.tsx b/dashboard/src/pages/Settings/Models/index.tsx index d602d73d..6aa191a9 100644 --- a/dashboard/src/pages/Settings/Models/index.tsx +++ b/dashboard/src/pages/Settings/Models/index.tsx @@ -11,7 +11,14 @@ */ import { useMemo, useState } from "react"; import { Button, Divider, Empty, Space, Tabs, Typography } from "antd"; -import { Images, MessageSquareText, Plus, RefreshCw } from "lucide-react"; +import { + Images, + MessageSquareText, + Mic2, + Plus, + RefreshCw, + Search, +} from "lucide-react"; import { useTranslation } from "react-i18next"; import { useSearchParams } from "react-router-dom"; import PageShell from "../../../layouts/PageShell"; @@ -31,6 +38,30 @@ import { } from "./components"; import styles from "./index.module.less"; import { MediaGenerationSettingsPanel } from "../MediaGeneration"; +import { VoiceSettingsPanel } from "../Voice"; +import { SearchSettingsPanel } from "../SearchConfig"; + +type ModelCategory = "chat" | "generation" | "voice" | "search"; + +function resolveModelCategory( + requestedTab: string | null, + canChat: boolean, + canProviders: boolean, + canVoice: boolean, + canSearch: boolean, +): ModelCategory { + if (requestedTab === "generation" && canProviders) return "generation"; + if (requestedTab === "voice" && canVoice) return "voice"; + if (requestedTab === "search" && canSearch) return "search"; + if ((requestedTab === "chat" || requestedTab === null) && canChat) { + return "chat"; + } + if (canChat) return "chat"; + if (canVoice) return "voice"; + if (canSearch) return "search"; + if (canProviders) return "generation"; + return "chat"; +} const { Title } = Typography; @@ -40,6 +71,9 @@ export default function ModelsPage() { const canProviders = userCan(user, "providers"); const canOllama = userCan(user, "ollama_models"); const canOnnx = userCan(user, "onnx_models"); + const canVoice = userCan(user, "voice"); + const canSearch = userCan(user, "search"); + const canChat = canProviders || canOllama || canOnnx; const { providers, presets, @@ -53,14 +87,18 @@ export default function ModelsPage() { const [hoveredCard, setHoveredCard] = useState(null); const [addOpen, setAddOpen] = useState(false); const [searchParams, setSearchParams] = useSearchParams(); - const modelCategory = - canProviders && searchParams.get("tab") === "generation" - ? "generation" - : "chat"; + const modelCategory = resolveModelCategory( + searchParams.get("tab"), + canChat, + canProviders, + canVoice, + canSearch, + ); const setModelCategory = (next: string) => { const updated = new URLSearchParams(searchParams); - if (next === "generation") updated.set("tab", "generation"); - else updated.delete("tab"); + if (next === "generation" || next === "voice" || next === "search") { + updated.set("tab", next); + } else updated.delete("tab"); setSearchParams(updated, { replace: true }); }; @@ -159,15 +197,19 @@ export default function ModelsPage() { activeKey={modelCategory} onChange={setModelCategory} items={[ - { - key: "chat", - label: ( - - - {t("models.chatModelsTab")} - - ), - }, + ...(canChat + ? [ + { + key: "chat", + label: ( + + + {t("models.chatModelsTab")} + + ), + }, + ] + : []), ...(canProviders ? [ { @@ -181,10 +223,40 @@ export default function ModelsPage() { }, ] : []), + ...(canVoice + ? [ + { + key: "voice", + label: ( + + + {t("models.voiceModelsTab")} + + ), + }, + ] + : []), + ...(canSearch + ? [ + { + key: "search", + label: ( + + + {t("models.searchModelsTab")} + + ), + }, + ] + : []), ]} /> {modelCategory === "generation" ? ( + ) : modelCategory === "voice" ? ( + + ) : modelCategory === "search" ? ( + ) : loading ? ( ) : error ? ( diff --git a/dashboard/src/pages/Settings/SearchConfig/index.module.less b/dashboard/src/pages/Settings/SearchConfig/index.module.less index 3e2aa267..c67769ad 100644 --- a/dashboard/src/pages/Settings/SearchConfig/index.module.less +++ b/dashboard/src/pages/Settings/SearchConfig/index.module.less @@ -252,16 +252,18 @@ padding: 48px 0; } -.modalHint { - margin: 0 0 16px; +.drawerHint { + margin-bottom: 16px; + padding: 10px 12px; + border-radius: var(--fn-radius-md); + background: var(--fn-surface-sunken); + color: var(--fn-text-tertiary); font-size: 13px; - line-height: 1.55; - color: var(--fn-text-secondary); + line-height: 1.5; } -.modalActions { +.drawerFooter { display: flex; - flex-wrap: wrap; + justify-content: flex-end; gap: 8px; - margin-top: 4px; } diff --git a/dashboard/src/pages/Settings/SearchConfig/index.tsx b/dashboard/src/pages/Settings/SearchConfig/index.tsx index 07a425a3..3b1972d4 100644 --- a/dashboard/src/pages/Settings/SearchConfig/index.tsx +++ b/dashboard/src/pages/Settings/SearchConfig/index.tsx @@ -1,13 +1,13 @@ import { useEffect, useState, useCallback } from "react"; -import { App, Button, Form, Input, Typography, Spin, Modal } from "antd"; +import { App, Button, Drawer, Form, Input, Typography, Spin } from "antd"; import { + Activity, Check, CheckCircle, Search, Settings2, Trash2, - Zap, } from "lucide-react"; import { useTranslation } from "react-i18next"; import { envsApi } from "../../../api/modules/env"; @@ -67,7 +67,7 @@ function searchProviderLogo(providerId: string): string { return getProviderLogo(providerId) ?? customProviderLogo; } -interface ConfigureModalProps { +interface ConfigureDrawerProps { provider: SearchProvider; envVars: Record; open: boolean; @@ -75,13 +75,13 @@ interface ConfigureModalProps { onSaved: () => void; } -function ConfigureModal({ +function ConfigureDrawer({ provider, envVars, open, onClose, onSaved, -}: ConfigureModalProps) { +}: ConfigureDrawerProps) { const { t } = useTranslation(); const { modal, message } = App.useApp(); const [form] = Form.useForm(); @@ -120,7 +120,7 @@ function ConfigureModal({ } }; - const handleTest = async () => { + const handleProbe = async () => { try { setTesting(true); const values = (await form.validateFields()) as Record; @@ -183,23 +183,37 @@ function ConfigureModal({ }); }; - const modalTitle = provider.configured - ? `${t("common.edit")} — ${provider.name}` - : `${t("advancedSettings.search.configure")} — ${provider.name}`; - return ( - void handleSave()} - confirmLoading={saving} - okText={t("common.save")} - cancelText={t("common.cancel")} - destroyOnClose - width={480} + onClose={onClose} + width={440} + placement="right" + destroyOnHidden + footer={ +
    + + + +
    + } > -

    {t(provider.descriptionKey)}

    +
    {t(provider.descriptionKey)}
    - -
    + {provider.configured ? ( - {provider.docs_url ? ( - - ) : null} - {provider.configured ? ( - - ) : null} -
    - + ) : null} + ); } @@ -327,7 +331,7 @@ export default function SearchConfigPage() { <> } - title={t("nav.search")} + title={t("models.searchModelsTab")} description={t("advancedSettings.search.desc")} /> @@ -457,7 +461,7 @@ export default function SearchConfigPage() { {editing ? ( - ); } + +export { SearchConfigPage as SearchSettingsPanel }; diff --git a/dashboard/src/pages/Settings/Voice/index.module.less b/dashboard/src/pages/Settings/Voice/index.module.less index 83d0dc1b..db8f92a0 100644 --- a/dashboard/src/pages/Settings/Voice/index.module.less +++ b/dashboard/src/pages/Settings/Voice/index.module.less @@ -209,3 +209,19 @@ margin: 24px 0 20px !important; border-color: var(--fn-border-primary) !important; } + +.drawerHint { + margin-bottom: 16px; + padding: 10px 12px; + border-radius: var(--fn-radius-md); + background: var(--fn-surface-sunken); + color: var(--fn-text-tertiary); + font-size: 13px; + line-height: 1.5; +} + +.drawerFooter { + display: flex; + justify-content: flex-end; + gap: 8px; +} diff --git a/dashboard/src/pages/Settings/Voice/index.tsx b/dashboard/src/pages/Settings/Voice/index.tsx index 79d47215..470a7842 100644 --- a/dashboard/src/pages/Settings/Voice/index.tsx +++ b/dashboard/src/pages/Settings/Voice/index.tsx @@ -1,12 +1,13 @@ import { useCallback, useEffect, useMemo, useState } from "react"; -import { Button, Divider, Modal, Space, Typography, Input, Select } from "antd"; +import { Button, Divider, Drawer, Form, Input, Select, Typography } from "antd"; import { message } from "@/utils/antdMessage"; -import { Mic2, RefreshCw, Check, Settings2 } from "lucide-react"; +import { Activity, Mic2, Check, Settings2 } from "lucide-react"; import { useTranslation } from "react-i18next"; import { voiceApi, type VoicePreset, + type VoiceProviderInput, type VoiceProviderRow, } from "../../../api/modules/voice"; import { customProviderLogo, getProviderLogo } from "../../../assets/providers"; @@ -25,7 +26,7 @@ interface ConfigureState { existing?: VoiceProviderRow; } -/** Voice provider settings panel — embeddable in Advanced Settings tab. */ +/** Voice provider settings panel — embeddable in the Models page tab. */ export function VoiceSettingsPanel() { const { t } = useTranslation(); const [presets, setPresets] = useState([]); @@ -41,6 +42,7 @@ export function VoiceSettingsPanel() { ); const [mimoVoiceId, setMimoVoiceId] = useState("冰糖"); const [saving, setSaving] = useState(false); + const [probing, setProbing] = useState(false); const fetchAll = useCallback(async () => { setLoading(true); @@ -103,47 +105,88 @@ export function VoiceSettingsPanel() { setMimoVoiceId(String(extra.voice_id ?? "冰糖")); }; + const buildProviderPayload = (): VoiceProviderInput | null => { + if (!configure) return null; + const { preset } = configure; + let extra: Record; + let baseUrl: string | null = null; + if (preset.kind === "tencent") { + extra = { + secret_id: secretId, + secret_key: secretKey, + region: "ap-guangzhou", + }; + } else if (preset.kind === "edge") { + extra = { voice_id: "zh-CN-XiaoxiaoNeural" }; + } else if (preset.kind === "mimo") { + baseUrl = + mimoEndpoint === "tokenplan" + ? "https://token-plan-cn.xiaomimimo.com/v1" + : "https://api.xiaomimimo.com/v1"; + extra = { + endpoint_type: mimoEndpoint, + voice_id: preset.capability === "tts" ? mimoVoiceId : undefined, + }; + } else { + extra = { model: preset.kind === "openai" ? "whisper-1" : undefined }; + } + return { + name: preset.id, + kind: preset.kind, + capability: preset.capability, + base_url: baseUrl, + api_key: + preset.kind === "tencent" + ? secretId && secretKey + ? `${secretId}:${secretKey}` + : null + : apiKey || null, + extra_json: JSON.stringify(extra), + }; + }; + + const validateCredentials = () => { + if (!configure?.preset.requires_key) return true; + const complete = + configure.preset.kind === "tencent" + ? Boolean(secretId.trim() && secretKey.trim()) + : Boolean(apiKey.trim()); + if (!complete) message.warning(t("voice.credentialsRequired")); + return complete; + }; + + const handleProbe = async () => { + const payload = buildProviderPayload(); + if (!payload || !validateCredentials() || !configure) return; + const modes: ("stt" | "tts")[] = + configure.preset.capability === "both" + ? ["stt", "tts"] + : [configure.preset.capability]; + setProbing(true); + try { + for (const mode of modes) { + const result = await voiceApi.testConfiguration({ ...payload, mode }); + if (!result.ok) { + message.error(result.error || t("voice.probeFailed")); + return; + } + } + message.success(t("voice.probeSuccess")); + } catch (err) { + message.error( + err instanceof Error ? err.message : t("voice.probeFailed"), + ); + } finally { + setProbing(false); + } + }; + const handleSaveProvider = async () => { - if (!configure) return; + const payload = buildProviderPayload(); + if (!configure || !payload || !validateCredentials()) return; setSaving(true); try { const { preset, existing } = configure; - let extra: Record; - let baseUrl: string | null = null; - if (preset.kind === "tencent") { - extra = { - secret_id: secretId, - secret_key: secretKey, - region: "ap-guangzhou", - }; - } else if (preset.kind === "edge") { - extra = { voice_id: "zh-CN-XiaoxiaoNeural" }; - } else if (preset.kind === "mimo") { - const mimoBase = - mimoEndpoint === "tokenplan" - ? "https://token-plan-cn.xiaomimimo.com/v1" - : "https://api.xiaomimimo.com/v1"; - baseUrl = mimoBase; - extra = { - endpoint_type: mimoEndpoint, - voice_id: preset.capability === "tts" ? mimoVoiceId : undefined, - }; - } else { - extra = { model: preset.kind === "openai" ? "whisper-1" : undefined }; - } - const payload = { - name: preset.id, - kind: preset.kind, - capability: preset.capability, - base_url: baseUrl, - api_key: - preset.kind === "tencent" - ? secretId && secretKey - ? `${secretId}:${secretKey}` - : null - : apiKey || null, - extra_json: JSON.stringify(extra), - }; if (existing) { await voiceApi.patchProvider(existing.id, payload); } else { @@ -301,16 +344,8 @@ export function VoiceSettingsPanel() { <> } - title={t("nav.voice")} - description={t("pageShell.voice.subtitle")} - actions={ - - } + title={t("models.voiceModelsTab")} + description={t("voice.description")} /> {loading ? ( @@ -335,102 +370,129 @@ export function VoiceSettingsPanel() { )} - setConfigure(null)} - onOk={() => void handleSaveProvider()} - confirmLoading={saving} - okText={t("common.save")} + onClose={() => setConfigure(null)} + width={440} + placement="right" + destroyOnHidden + footer={ +
    + + + +
    + } > - {configure?.preset.kind === "tencent" && ( - - {t("voice.tencentHint")} - setSecretId(e.target.value)} - /> - setSecretKey(e.target.value)} - /> - - )} - {configure?.preset.kind === "openai" && ( - - {t("voice.openaiHint")} - setApiKey(e.target.value)} - /> - setMimoEndpoint(v)} - options={[ - { - value: "payg", - label: t("voice.mimoEndpointPayg"), - }, - { - value: "tokenplan", - label: t("voice.mimoEndpointTokenplan"), - }, - ]} - /> -
    {provider.required_keys.map((key) => ( ) : null} + ) : provider.docs_url && key === provider.required_keys[0] ? ( + + {t("setupWizard.search.getApiKey")} + ) : undefined } > @@ -239,35 +261,17 @@ function ConfigureModal({ ))}
    - setApiKey(e.target.value)} - /> - {configure.preset.capability === "tts" && ( -
    -
    - {t("voice.mimoVoice")} -
    +
    + {configure?.preset.kind === "tencent" && ( + <> +
    {t("voice.tencentHint")}
    + + setSecretId(e.target.value)} + /> + + + setSecretKey(e.target.value)} + /> + + + )} + {configure?.preset.kind === "openai" && ( + <> +
    {t("voice.openaiHint")}
    + + setApiKey(e.target.value)} + /> + + setMimoEndpoint(v)} + options={[ + { + value: "payg", + label: t("voice.mimoEndpointPayg"), + }, + { + value: "tokenplan", + label: t("voice.mimoEndpointTokenplan"), + }, + ]} + /> + + + setApiKey(e.target.value)} + /> + + {configure.preset.capability === "tts" && ( + + + + + {entry.auth_kind === "custom_fields" && (entry.credential_fields ?? []).map((field) => { @@ -1957,9 +2009,21 @@ function ConnectorConfigDrawer({ )} + + + + ("builtin"); + const [activeTab, setActiveTab] = useState<"enabled" | "builtin" | "custom">( + "enabled", + ); const [drawerEntry, setDrawerEntry] = useState( null, ); const [drawerInstance, setDrawerInstance] = useState(null); + const [customFocusServerName, setCustomFocusServerName] = useState< + string | null + >(null); const { catalog, instances, loading, refresh } = useConnectorInstances(); - const instanceByKind = useMemo(() => { - const map = new Map(); - for (const inst of instances) { - if (!map.has(inst.kind)) { - map.set(inst.kind, inst); - } - } - return map; - }, [instances]); - const configuredCount = useMemo(() => { - let count = 0; - for (const entry of catalog) { - const inst = instanceByKind.get(entry.kind); - if (inst?.has_credentials) count += 1; - } - return count; - }, [catalog, instanceByKind]); + return instances.filter((instance) => instance.has_credentials).length; + }, [instances]); useEffect(() => { const oauthState = searchParams.get("oauth_state"); @@ -2092,6 +2146,7 @@ export default function ConnectorsPage() { await connectorsApi.createInstance({ kind: entry.kind, display_name: entry.name, + description: entry.description, credentials, default_open: false, }); @@ -2114,26 +2169,6 @@ export default function ConnectorsPage() { [], ); - const handleToggleEnabled = useCallback( - async (instance: ConnectorInstance, enabled: boolean) => { - try { - await connectorsApi.patchInstance(instance.instance_id, { - status: enabled ? "active" : "disabled", - }); - await refresh(); - message.success( - enabled - ? t("connectors.enableSuccess", "已启用") - : t("connectors.disableSuccess", "已停用"), - ); - } catch (e) { - console.error(e); - message.error(t("connectors.toggleFailed", "更新失败")); - } - }, - [refresh, t], - ); - const handleSaved = useCallback(async () => { await refresh(); notifyConnectorsChanged(); @@ -2150,6 +2185,15 @@ export default function ConnectorsPage() { subtitle={t("pageShell.connectors.subtitle")} tabBar={
    + @@ -2172,7 +2219,92 @@ export default function ConnectorsPage() { } > {activeTab === "custom" ? ( - + + ) : activeTab === "enabled" ? ( + loading ? ( +
    + +
    + ) : instances.length === 0 ? ( + + } + title={t("connectors.emptyGuideTitle")} + description={t("connectors.emptyGuideDesc")} + steps={[ + { + label: t("connectors.emptyGuideStepWhat"), + detail: t("connectors.emptyGuideStepWhatDetail"), + }, + { + label: t("connectors.emptyGuideStepHow"), + detail: t("connectors.emptyGuideStepHowDetail"), + }, + { + label: t("connectors.emptyGuideStepShare"), + detail: t("connectors.emptyGuideStepShareDetail"), + }, + ]} + primaryAction={{ + label: t("connectors.emptyGuideBrowseBuiltin"), + onClick: () => setActiveTab("builtin"), + icon: , + }} + secondaryAction={{ + label: t("connectors.emptyGuideAddCustom"), + onClick: () => { + setCustomFocusServerName(null); + setActiveTab("custom"); + }, + icon: , + type: "default", + }} + /> + ) : ( + <> +
    + + {t("connectors.enabledSummary", { + count: instances.length, + defaultValue: "已启用 {{count}} 个连接器实例", + })} + + +
    +
    + {instances.map((instance) => ( + entry.kind === instance.kind, + )} + onEdit={(item) => { + if (item.kind === "custom-mcp") { + setCustomFocusServerName(item.mcp_server_name); + setActiveTab("custom"); + return; + } + const entry = catalog.find((row) => row.kind === item.kind); + if (entry) handleConfigure(entry, item); + }} + onChanged={handleSaved} + /> + ))} +
    + + ) ) : ( <>
    @@ -2202,11 +2334,7 @@ export default function ConnectorsPage() { - void handleToggleEnabled(inst, enabled) - } /> ))}
    diff --git a/dashboard/src/pages/Chat/hooks/useChatComposerResources.ts b/dashboard/src/pages/Chat/hooks/useChatComposerResources.ts index 7ba748c0..ff286fc7 100644 --- a/dashboard/src/pages/Chat/hooks/useChatComposerResources.ts +++ b/dashboard/src/pages/Chat/hooks/useChatComposerResources.ts @@ -134,9 +134,15 @@ export function useChatComposerResources( .filter((i) => i.status === "active" && i.has_credentials) .map((i) => ({ mcp_server_name: i.mcp_server_name, - label: i.display_name, + label: + currentUserId !== null && i.owner_user_id !== currentUserId + ? `${i.display_name} · ${ + i.owner_display_name || i.owner_username || i.owner_user_id + }` + : i.display_name, kind: i.kind, - default_open: i.default_open === true, + default_open: + i.default_open === true && i.owner_user_id === currentUserId, })); setChatConnectors(options); const allowed = new Set(options.map((o) => o.mcp_server_name)); @@ -165,7 +171,7 @@ export function useChatComposerResources( window.removeEventListener("focus", onFocus); window.removeEventListener(CONNECTORS_CHANGED_EVENT, loadConnectors); }; - }, [resolvedAgentId]); + }, [resolvedAgentId, currentUserId]); useEffect(() => { if (!resolvedAgentId) { diff --git a/dashboard/src/pages/Control/CronJobs/components/JobDrawer.tsx b/dashboard/src/pages/Control/CronJobs/components/JobDrawer.tsx index a15f4c5e..3918e4dd 100644 --- a/dashboard/src/pages/Control/CronJobs/components/JobDrawer.tsx +++ b/dashboard/src/pages/Control/CronJobs/components/JobDrawer.tsx @@ -173,12 +173,18 @@ export function JobDrawer({ .listInstances() .then((instances) => { setConnectorOptions( - (instances || []).map((i) => ({ - value: i.mcp_server_name, - label: i.display_name?.trim() - ? `${i.display_name} (${i.mcp_server_name})` - : i.mcp_server_name, - })), + (instances || []) + .filter((i) => i.status === "active" && i.has_credentials) + .map((i) => ({ + value: i.mcp_server_name, + label: i.display_name?.trim() + ? `${i.display_name}${ + i.shared && i.owner_display_name + ? ` · ${i.owner_display_name}` + : "" + } (${i.mcp_server_name})` + : i.mcp_server_name, + })), ); }) .catch(() => setConnectorOptions([])) diff --git a/src/octop/api/routers/connectors.py b/src/octop/api/routers/connectors.py index 6c2412ec..6980f2a1 100644 --- a/src/octop/api/routers/connectors.py +++ b/src/octop/api/routers/connectors.py @@ -37,7 +37,7 @@ build_instance_config_json, read_default_open, ) -from octop.infra.connectors.gateway.cli_dirs import cleanup_creds_cli_dirs, cleanup_keys_for_creds +from octop.infra.connectors.gateway.cli_dirs import cleanup_creds_cli_dirs from octop.infra.connectors.gateway.cli_install import ( cli_install_status, get_cli_install_spec, @@ -64,7 +64,7 @@ probe_connector, probe_custom_mcp_server, ) -from octop.infra.connectors.service import ConnectorService +from octop.infra.connectors.service import ConnectorNameTakenError, ConnectorService from octop.infra.db.repos.connectors import ConnectorRepo from octop.infra.errors import ErrorCode, OctopError from octop.infra.utils.locale import resolve_request_locale @@ -78,7 +78,9 @@ class CreateInstanceBody(BaseModel): kind: str display_name: str + description: str | None = Field(default=None, max_length=500) credentials: dict[str, Any] = Field(default_factory=dict) + shared: bool = False default_open: bool = Field( default=False, description=( @@ -91,6 +93,10 @@ class CreateInstanceBody(BaseModel): class PatchInstanceBody(BaseModel): status: str | None = None + display_name: str | None = None + description: str | None = Field(default=None, max_length=500) + credentials: dict[str, Any] | None = None + shared: bool | None = None default_open: bool | None = Field( default=None, description=( @@ -146,11 +152,12 @@ class CustomMcpPutBody(BaseModel): class CustomMcpServerPatchBody(BaseModel): enabled: bool | None = None default_open: bool | None = None + shared: bool | None = None @model_validator(mode="after") def _require_one_field(self) -> CustomMcpServerPatchBody: - if self.enabled is None and self.default_open is None: - raise ValueError("provide enabled and/or default_open") + if self.enabled is None and self.default_open is None and self.shared is None: + raise ValueError("provide enabled, default_open and/or shared") return self @@ -273,10 +280,13 @@ def _instance_to_dict(inst: Any) -> dict[str, Any]: "instance_id": inst.instance_id, "kind": inst.kind, "display_name": inst.display_name, + "description": config.get("description"), "status": inst.status, "mcp_server_name": inst.mcp_server_name, "has_credentials": inst.has_credentials, "default_open": read_default_open(config), + "shared": bool(inst.shared), + "owner_user_id": inst.user_id, "created_at": inst.created_at, "updated_at": inst.updated_at, } @@ -404,18 +414,63 @@ def _credentials_preview(kind: str, creds: dict[str, Any]) -> dict[str, Any]: return preview -def _schedule_connector_reload(server: Any, user_id: int) -> None: +def _schedule_connector_reload(server: Any, user_id: int, *, all_users: bool = False) -> None: assert server.app_runtime is not None async def _run() -> None: try: - await server.app_runtime.agent_registry.reload_connectors_for_user(user_id) + if all_users: + await server.app_runtime.agent_registry.reload_all() + else: + await server.app_runtime.agent_registry.reload_connectors_for_user(user_id) except Exception: logger.exception("background connector reload failed for user %s", user_id) asyncio.create_task(_run()) +def _can_manage_connector(inst: Any, user: Any) -> bool: + return bool(inst.user_id == user.id or user.role == "admin") + + +def _assert_can_manage_connector(inst: Any, user: Any) -> None: + if not _can_manage_connector(inst, user): + raise OctopError(ErrorCode.FORBIDDEN, "not your connector instance") + + +def _raise_name_taken(name: str) -> None: + raise OctopError( + ErrorCode.CONNECTOR_NAME_TAKEN, + f"connector name {name!r} is already in use", + ) + + +def _custom_name_exists(svc: ConnectorService, user_id: int, name: str) -> bool: + return any( + item["display_name"] == name + for item in svc.list_instances_for_api(user_id) + if item["kind"] == CUSTOM_MCP_KIND and int(item.get("owner_user_id") or user_id) == user_id + ) + + +def _resolve_custom_target( + instance_id: str, + *, + user: Any, + server: Any, +) -> tuple[int, str] | None: + raw = parse_synthetic_instance_id(instance_id) + if raw is None: + return None + parent_id, separator, server_name = raw.partition(":") + if separator: + parent = server.services.repos.connector_repo.get(parent_id) + if parent is not None and is_custom_mcp_kind(parent.kind): + _assert_can_manage_connector(parent, user) + return parent.user_id, server_name + return user.id, raw + + def _is_public_http_uri(uri: str) -> bool: parsed = urlparse(uri) host = (parsed.hostname or "").lower() @@ -451,7 +506,16 @@ async def list_instances( server: Any = Depends(get_server), ) -> list[dict[str, Any]]: """List the current user's connected accounts (custom MCP expanded per server).""" - return _connector_service(server).list_instances_for_api(user.id) + rows = _connector_service(server).list_instances_for_api(user.id) + for item in rows: + owner_id = int(item.get("owner_user_id") or user.id) + owner = server.services.user_repo.get(owner_id) + item["owner_username"] = owner.username if owner is not None else None + item["owner_display_name"] = ( + owner.display_name or owner.username if owner is not None else None + ) + item["can_manage"] = owner_id == user.id or user.role == "admin" + return rows @router.get("/connectors/custom-mcp", summary="Get custom MCP servers") @@ -474,6 +538,8 @@ async def put_custom_mcp( svc = _connector_service(server) try: servers = svc.put_custom_servers(user.id, body.servers) + except ConnectorNameTakenError as exc: + _raise_name_taken(str(exc)) except ValueError as exc: raise OctopError(ErrorCode.CONNECTOR_INVALID_CREDENTIALS, str(exc)) from exc server.services.audit_repo.write( @@ -482,7 +548,13 @@ async def put_custom_mcp( target=CUSTOM_MCP_KIND, payload=str(len(servers)), ) - _schedule_connector_reload(server, user.id) + _schedule_connector_reload( + server, + user.id, + all_users=any( + isinstance(spec, dict) and spec.get("shared") is True for spec in servers.values() + ), + ) return {"servers": redact_servers_for_api(servers)} @@ -504,6 +576,7 @@ async def patch_custom_mcp_server( server_name, enabled=body.enabled, default_open=body.default_open, + shared=body.shared, ) except KeyError as exc: raise OctopError( @@ -511,7 +584,7 @@ async def patch_custom_mcp_server( ) from exc except ValueError as exc: raise OctopError(ErrorCode.CONNECTOR_INVALID_CREDENTIALS, str(exc)) from exc - _schedule_connector_reload(server, user.id) + _schedule_connector_reload(server, user.id, all_users=body.shared is not None) return {"servers": redact_servers_for_api(servers)} @@ -562,8 +635,7 @@ async def get_instance( inst = repo.get(instance_id) if inst is None: raise OctopError(ErrorCode.CONNECTOR_NOT_FOUND, f"instance {instance_id!r} not found") - if inst.user_id != user.id: - raise OctopError(ErrorCode.FORBIDDEN, "not your connector instance") + _assert_can_manage_connector(inst, user) data = _instance_to_dict(inst) config: dict[str, Any] = {} @@ -593,7 +665,7 @@ async def create_instance( user: Any = Depends(current_user), server: Any = Depends(get_server), ) -> dict[str, Any]: - """Connect a third-party account. Replaces any existing instance of the same kind.""" + """Connect a third-party account as a new named instance.""" if is_custom_mcp_kind(body.kind): raise OctopError( ErrorCode.CONNECTOR_KIND_UNSUPPORTED, @@ -607,15 +679,15 @@ async def create_instance( repo = server.services.repos.connector_repo svc = _connector_service(server) + display_name = body.display_name.strip() + if not display_name: + raise OctopError(ErrorCode.CONNECTOR_INVALID_CREDENTIALS, "display_name is required") + description = body.description.strip() if body.description is not None else entry.description + if not description: + raise OctopError(ErrorCode.CONNECTOR_INVALID_CREDENTIALS, "description is required") + if repo.name_exists(user.id, display_name) or _custom_name_exists(svc, user.id, display_name): + _raise_name_taken(display_name) cred_input = dict(body.credentials) - old_cli_creds: dict[str, Any] | None = None - for old in repo.list_by_user(user.id): - if old.kind == body.kind: - if old.has_credentials: - old_cli_creds = svc.decrypt(old.instance_id) - cred_input = _merge_credentials(old_cli_creds, cred_input) - repo.delete(old.instance_id) - break try: cred_payload = await _prepare_credentials( @@ -629,19 +701,18 @@ async def create_instance( ) from exc instance_id = new_ulid() - if body.kind in ("feishu-cli", "wecom-cli") and old_cli_creds: - keep = cleanup_keys_for_creds(body.kind, {**cred_payload, "instance_id": instance_id}) - cleanup_creds_cli_dirs(body.kind, old_cli_creds, keep=keep) repo.create( instance_id=instance_id, user_id=user.id, kind=body.kind, - display_name=body.display_name.strip(), + display_name=display_name, mcp_server_name=mcp_server_name(body.kind, instance_id), + shared=body.shared, config_json=build_instance_config_json( kind=body.kind, default_open=bool(body.default_open), email=cred_payload.get("email"), + description=description, ), ) svc.encrypt_and_store(instance_id=instance_id, payload=cred_payload) @@ -653,7 +724,7 @@ async def create_instance( ) inst = repo.get(instance_id) assert inst is not None - _schedule_connector_reload(server, user.id) + _schedule_connector_reload(server, user.id, all_users=body.shared) return _instance_to_dict(inst) @@ -664,11 +735,12 @@ async def patch_instance( user: Any = Depends(current_user), server: Any = Depends(get_server), ) -> dict[str, Any]: - """Enable/disable a connector or update default_open without deleting credentials.""" - synthetic_name = parse_synthetic_instance_id(instance_id) - if synthetic_name is not None: + """Edit a connector instance without replacing its identity.""" + custom_target = _resolve_custom_target(instance_id, user=user, server=server) + if custom_target is not None: + custom_user_id, synthetic_name = custom_target svc = _connector_service(server) - if body.status is None and body.default_open is None: + if body.status is None and body.default_open is None and body.shared is None: raise OctopError( ErrorCode.CONNECTOR_INVALID_CREDENTIALS, "status or default_open is required", @@ -682,21 +754,23 @@ async def patch_instance( "status must be active or disabled", ) svc.patch_custom_server_enabled( - user.id, synthetic_name, enabled=(status == "active") + custom_user_id, synthetic_name, enabled=(status == "active") ) if body.default_open is not None: svc.patch_custom_server_default_open( - user.id, synthetic_name, default_open=bool(body.default_open) + custom_user_id, synthetic_name, default_open=bool(body.default_open) ) + if body.shared is not None: + svc.patch_custom_server(custom_user_id, synthetic_name, shared=body.shared) except KeyError as exc: raise OctopError( ErrorCode.CONNECTOR_NOT_FOUND, f"instance {instance_id!r} not found" ) from exc except ValueError as exc: raise OctopError(ErrorCode.CONNECTOR_INVALID_CREDENTIALS, str(exc)) from exc - _schedule_connector_reload(server, user.id) - for item in svc.list_instances_for_api(user.id): - if item["instance_id"] == instance_id: + _schedule_connector_reload(server, custom_user_id, all_users=True) + for item in svc.list_instances_for_api(custom_user_id): + if item["instance_id"] in {instance_id, f"custom:{synthetic_name}"}: return item raise OctopError(ErrorCode.CONNECTOR_NOT_FOUND, f"instance {instance_id!r} not found") @@ -704,18 +778,48 @@ async def patch_instance( inst = repo.get(instance_id) if inst is None: raise OctopError(ErrorCode.CONNECTOR_NOT_FOUND, f"instance {instance_id!r} not found") - if inst.user_id != user.id: - raise OctopError(ErrorCode.FORBIDDEN, "not your connector instance") + _assert_can_manage_connector(inst, user) if is_custom_mcp_kind(inst.kind): raise OctopError( ErrorCode.CONNECTOR_KIND_UNSUPPORTED, "use PATCH /connectors/custom-mcp/servers/{name} for custom MCP servers", ) - if body.status is None and body.default_open is None: + if ( + body.status is None + and body.default_open is None + and body.display_name is None + and body.description is None + and body.credentials is None + and body.shared is None + ): raise OctopError( ErrorCode.CONNECTOR_INVALID_CREDENTIALS, "status or default_open is required", ) + if body.display_name is not None: + display_name = body.display_name.strip() + if not display_name: + raise OctopError(ErrorCode.CONNECTOR_INVALID_CREDENTIALS, "display_name is required") + svc = _connector_service(server) + if repo.name_exists( + inst.user_id, display_name, exclude_instance_id=instance_id + ) or _custom_name_exists(svc, inst.user_id, display_name): + _raise_name_taken(display_name) + repo.update_metadata(instance_id, display_name=display_name) + if body.shared is not None: + repo.update_metadata(instance_id, shared=body.shared) + if body.credentials is not None: + svc = _connector_service(server) + merged = _merge_credentials(svc.decrypt(instance_id), body.credentials) + try: + prepared = await _prepare_credentials(inst.kind, merged, server.services.settings_repo) + except ValueError as exc: + raise OctopError( + ErrorCode.CONNECTOR_INVALID_CREDENTIALS, + str(exc), + details={"reason": str(exc)}, + ) from exc + svc.encrypt_and_store(instance_id=instance_id, payload=prepared) if body.status is not None: status = body.status.strip() if status not in ("active", "disabled"): @@ -723,18 +827,31 @@ async def patch_instance( ErrorCode.CONNECTOR_INVALID_CREDENTIALS, "status must be active or disabled" ) repo.update_status(instance_id, status) - if body.default_open is not None: + if body.default_open is not None or body.description is not None: config = dict(ConnectorRepo.parse_config_json(inst)) - if body.default_open: - config["default_open"] = True - else: - config.pop("default_open", None) + if body.default_open is not None: + if body.default_open: + config["default_open"] = True + else: + config.pop("default_open", None) + if body.description is not None: + description = body.description.strip() + if not description: + raise OctopError( + ErrorCode.CONNECTOR_INVALID_CREDENTIALS, + "description is required", + ) + config["description"] = description repo.update_config_json( instance_id, json.dumps(config, ensure_ascii=False) if config else None ) inst = repo.get(instance_id) assert inst is not None - _schedule_connector_reload(server, user.id) + _schedule_connector_reload( + server, + inst.user_id, + all_users=inst.shared or body.shared is True or body.shared is False, + ) return _instance_to_dict(inst) @@ -745,15 +862,16 @@ async def delete_instance( server: Any = Depends(get_server), ) -> None: """Disconnect and delete stored credentials for a connector instance.""" - synthetic_name = parse_synthetic_instance_id(instance_id) - if synthetic_name is not None: + custom_target = _resolve_custom_target(instance_id, user=user, server=server) + if custom_target is not None: + custom_user_id, synthetic_name = custom_target svc = _connector_service(server) - servers = dict(svc.get_custom_servers(user.id)) + servers = dict(svc.get_custom_servers(custom_user_id)) if synthetic_name not in servers: raise OctopError(ErrorCode.CONNECTOR_NOT_FOUND, f"instance {instance_id!r} not found") del servers[synthetic_name] try: - svc.put_custom_servers(user.id, servers) + svc.put_custom_servers(custom_user_id, servers) except ValueError as exc: raise OctopError(ErrorCode.CONNECTOR_INVALID_CREDENTIALS, str(exc)) from exc server.services.audit_repo.write( @@ -762,15 +880,14 @@ async def delete_instance( target=synthetic_name, payload=CUSTOM_MCP_KIND, ) - _schedule_connector_reload(server, user.id) + _schedule_connector_reload(server, custom_user_id, all_users=True) return repo = server.services.repos.connector_repo inst = repo.get(instance_id) if inst is None: raise OctopError(ErrorCode.CONNECTOR_NOT_FOUND, f"instance {instance_id!r} not found") - if inst.user_id != user.id: - raise OctopError(ErrorCode.FORBIDDEN, "not your connector instance") + _assert_can_manage_connector(inst, user) user_id = inst.user_id cli_creds: dict[str, Any] | None = None if inst.kind in ("feishu-cli", "wecom-cli") and inst.has_credentials: @@ -783,7 +900,7 @@ async def delete_instance( repo.delete(instance_id) if cli_creds is not None: cleanup_creds_cli_dirs(inst.kind, cli_creds) - _schedule_connector_reload(server, user_id) + _schedule_connector_reload(server, user_id, all_users=inst.shared) server.services.audit_repo.write( actor=user.username, action="connector.instance.delete", @@ -798,10 +915,11 @@ async def test_instance( server: Any = Depends(get_server), ) -> dict[str, Any]: """Probe the connector with stored credentials and return success or error details.""" - synthetic_name = parse_synthetic_instance_id(instance_id) - if synthetic_name is not None: + custom_target = _resolve_custom_target(instance_id, user=user, server=server) + if custom_target is not None: + custom_user_id, synthetic_name = custom_target svc = _connector_service(server) - saved = svc.get_custom_servers(user.id) + saved = svc.get_custom_servers(custom_user_id) raw = saved.get(synthetic_name) if not isinstance(raw, dict): raise OctopError(ErrorCode.CONNECTOR_NOT_FOUND, f"instance {instance_id!r} not found") @@ -811,8 +929,7 @@ async def test_instance( inst = repo.get(instance_id) if inst is None: raise OctopError(ErrorCode.CONNECTOR_NOT_FOUND, f"instance {instance_id!r} not found") - if inst.user_id != user.id: - raise OctopError(ErrorCode.FORBIDDEN, "not your connector instance") + _assert_can_manage_connector(inst, user) entry = get_catalog_entry(inst.kind) if entry is None: diff --git a/src/octop/i18n/en.json b/src/octop/i18n/en.json index b67dd4b7..23be7618 100644 --- a/src/octop/i18n/en.json +++ b/src/octop/i18n/en.json @@ -338,10 +338,12 @@ "PROVIDER_LOCAL_PROTECTED": "Local runtime providers cannot be deleted.", "STORAGE_BACKEND_NAME_TAKEN": "Storage backend name is already in use.", "STORAGE_BACKEND_REFERENCED": "Storage backend is in use and cannot be removed.", + "STORAGE_BACKEND_DEPS_FAILED": "Could not install optional components for this storage backend. Check network access and retry.", "CHANNEL_KIND_UNSUPPORTED": "Unsupported channel type.", "CHANNEL_INVALID_CREDENTIALS": "Invalid channel credentials.", "CHANNEL_NAME_TAKEN": "This channel name is already in use. Please choose another.", "CONNECTOR_NOT_FOUND": "Connector not found.", + "CONNECTOR_NAME_TAKEN": "This connector name is already in use. Please choose another.", "CONNECTOR_INVALID_CREDENTIALS": "Invalid connector credentials.", "CONNECTOR_OAUTH_HTTPS_REQUIRED": "Octop is currently being accessed over public HTTP, but Notion OAuth callbacks require HTTPS. Use HTTPS, or access Octop locally through localhost or 127.0.0.1.", "CONNECTOR_KIND_UNSUPPORTED": "Unsupported connector type.", diff --git a/src/octop/i18n/zh.json b/src/octop/i18n/zh.json index 54002d59..b1c3952b 100644 --- a/src/octop/i18n/zh.json +++ b/src/octop/i18n/zh.json @@ -338,10 +338,12 @@ "PROVIDER_LOCAL_PROTECTED": "本地提供商无法删除。", "STORAGE_BACKEND_NAME_TAKEN": "存储后端名称已被占用。", "STORAGE_BACKEND_REFERENCED": "存储后端正在使用中,无法删除。", + "STORAGE_BACKEND_DEPS_FAILED": "无法安装此后端所需的可选组件。请检查网络后重试。", "CHANNEL_KIND_UNSUPPORTED": "不支持的通道类型。", "CHANNEL_INVALID_CREDENTIALS": "通道凭证无效。", "CHANNEL_NAME_TAKEN": "该通道名称已被使用,请换一个名称。", "CONNECTOR_NOT_FOUND": "未找到连接器。", + "CONNECTOR_NAME_TAKEN": "该连接器名称已被使用,请换一个名称。", "CONNECTOR_INVALID_CREDENTIALS": "连接器凭证无效。", "CONNECTOR_OAUTH_HTTPS_REQUIRED": "当前通过公网 HTTP 访问 Octop,Notion 授权回调地址需要 HTTPS。请改用 HTTPS,或通过 localhost、127.0.0.1 在本机访问 Octop。", "CONNECTOR_KIND_UNSUPPORTED": "不支持的连接器类型。", diff --git a/src/octop/infra/connectors/builder.py b/src/octop/infra/connectors/builder.py index d20bebb9..476155d0 100644 --- a/src/octop/infra/connectors/builder.py +++ b/src/octop/infra/connectors/builder.py @@ -441,7 +441,7 @@ def _iter_active_connectors( connector_repo: Any, user_id: int, ) -> Any: - for inst in connector_repo.list_by_user(user_id): + for inst in connector_repo.list_visible(user_id): if inst.status != "active": continue entry = get_catalog_entry(inst.kind) @@ -476,7 +476,7 @@ def build_mcp_server_configs_for_user( agent_id, agent_user_id, user_id, - len(connector_repo.list_by_user(user_id)), + len(connector_repo.list_visible(user_id)), ) for inst, entry, creds in _iter_active_connectors(svc, connector_repo, user_id): try: @@ -537,7 +537,7 @@ def gateway_mcp_server_names(*, connector_repo: Any, user_id: int) -> set[str]: of rebuilding it. """ names: set[str] = set() - for inst in connector_repo.list_by_user(user_id): + for inst in connector_repo.list_visible(user_id): if inst.status != "active": continue entry = get_catalog_entry(inst.kind) @@ -581,7 +581,7 @@ def inject_missing_gateway_tools( if not extra: gateway_names = [ inst.mcp_server_name - for inst in connector_repo.list_by_user(user_id) + for inst in connector_repo.list_visible(user_id) if inst.status == "active" and (entry := get_catalog_entry(inst.kind)) is not None and entry.mcp_mode == "gateway" diff --git a/src/octop/infra/connectors/custom_mcp.py b/src/octop/infra/connectors/custom_mcp.py index 7ffb4385..5d8e3aad 100644 --- a/src/octop/infra/connectors/custom_mcp.py +++ b/src/octop/infra/connectors/custom_mcp.py @@ -12,7 +12,7 @@ CUSTOM_MCP_DISPLAY_NAME = "自定义 MCP" _SERVER_NAME_RE = re.compile(r"^[A-Za-z0-9_-]+$") -_META_KEYS = frozenset({"enabled", "display_name", "default_open"}) +_META_KEYS = frozenset({"enabled", "display_name", "default_open", "shared"}) _OAUTH_KEY = "oauth" _SECRET_KEYS = frozenset({_OAUTH_KEY}) _HARNESS_STRIP_KEYS = _META_KEYS | _SECRET_KEYS @@ -30,6 +30,14 @@ def synthetic_instance_id(server_name: str) -> str: return f"custom:{server_name}" +def shared_synthetic_instance_id(parent_instance_id: str, server_name: str) -> str: + return f"custom:{parent_instance_id}:{server_name}" + + +def shared_mcp_server_name(parent_instance_id: str, server_name: str) -> str: + return f"custom__{parent_instance_id}__{server_name}" + + def parse_synthetic_instance_id(instance_id: str) -> str | None: if not instance_id.startswith("custom:"): return None @@ -145,6 +153,8 @@ def normalize_server_spec(name: str, raw: Any) -> dict[str, Any]: spec: dict[str, Any] = {"transport": transport, "enabled": enabled} if raw.get("default_open") is True: spec["default_open"] = True + if raw.get("shared") is True: + spec["shared"] = True display_name = str(raw.get("display_name") or "").strip() if display_name: @@ -362,6 +372,7 @@ def expand_custom_instances( *, parent: Any, servers: dict[str, Any], + shared_view: bool = False, ) -> list[dict[str, Any]]: """Build list-API dicts for each custom server (independent status).""" items: list[dict[str, Any]] = [] @@ -369,15 +380,25 @@ def expand_custom_instances( if not isinstance(spec, dict): continue enabled = server_enabled(spec) + if shared_view and spec.get("shared") is not True: + continue items.append( { - "instance_id": synthetic_instance_id(name), + "instance_id": ( + shared_synthetic_instance_id(parent.instance_id, name) + if shared_view + else synthetic_instance_id(name) + ), "kind": CUSTOM_MCP_KIND, "display_name": server_display_name(name, spec), "status": "active" if enabled else "disabled", - "mcp_server_name": name, + "mcp_server_name": ( + shared_mcp_server_name(parent.instance_id, name) if shared_view else name + ), "has_credentials": True, "default_open": spec.get("default_open") is True, + "shared": spec.get("shared") is True, + "owner_user_id": parent.user_id, "created_at": parent.created_at, "updated_at": parent.updated_at, } diff --git a/src/octop/infra/connectors/default_open.py b/src/octop/infra/connectors/default_open.py index e0a3a9a0..5fa817c9 100644 --- a/src/octop/infra/connectors/default_open.py +++ b/src/octop/infra/connectors/default_open.py @@ -18,11 +18,14 @@ def build_instance_config_json( kind: str, default_open: bool = False, email: Any = None, + description: str | None = None, ) -> str | None: """Build ``connectors.config_json`` payload; None when empty.""" config: dict[str, Any] = {} if kind == "qq-mail" and email: config["email"] = email + if description: + config["description"] = description if default_open: config["default_open"] = True if not config: diff --git a/src/octop/infra/connectors/service.py b/src/octop/infra/connectors/service.py index a012e7e4..bcc006c4 100644 --- a/src/octop/infra/connectors/service.py +++ b/src/octop/infra/connectors/service.py @@ -27,6 +27,7 @@ redact_servers_for_api, server_enabled, set_oauth_required_in_spec, + shared_mcp_server_name, validate_servers_map, wrap_servers, ) @@ -49,6 +50,10 @@ _OAUTH_REFRESH_SKEW_SEC = 120 +class ConnectorNameTakenError(ValueError): + """Raised when a connector display name is already owned by the user.""" + + def list_user_connector_instances( repo: ConnectorRepo, user_id: int, @@ -166,6 +171,14 @@ def _save_custom_servers(self, user_id: int, servers: dict[str, Any]) -> dict[st servers, reserved_names=self.reserved_builtin_mcp_names(user_id), ) + display_names: set[str] = set() + for name, spec in normalized.items(): + display_name = ( + str(spec.get("display_name") or "").strip() if isinstance(spec, dict) else "" + ) or name + if display_name in display_names or self._repo.name_exists(user_id, display_name): + raise ConnectorNameTakenError(display_name) + display_names.add(display_name) row = self._repo.get_by_user_kind(user_id, CUSTOM_MCP_KIND) if not normalized: if row is not None: @@ -267,6 +280,7 @@ def patch_custom_server( *, enabled: bool | None = None, default_open: bool | None = None, + shared: bool | None = None, ) -> dict[str, Any]: servers = dict(self.get_custom_servers(user_id)) if server_name not in servers: @@ -281,6 +295,11 @@ def patch_custom_server( spec["default_open"] = True else: spec.pop("default_open", None) + if shared is not None: + if shared: + spec["shared"] = True + else: + spec.pop("shared", None) servers[server_name] = spec return self.put_custom_servers(user_id, servers) @@ -311,18 +330,22 @@ def list_instances_for_api(self, user_id: int) -> list[dict[str, Any]]: """Built-in rows + expanded custom servers (hide parent custom-mcp row).""" out: list[dict[str, Any]] = [] custom_row = self._repo.get_by_user_kind(user_id, CUSTOM_MCP_KIND) - for inst in self._repo.list_by_user(user_id): + for inst in self._repo.list_visible(user_id): if is_custom_mcp_kind(inst.kind): continue + config = ConnectorRepo.parse_config_json(inst) out.append( { "instance_id": inst.instance_id, "kind": inst.kind, "display_name": inst.display_name, + "description": config.get("description"), "status": inst.status, "mcp_server_name": inst.mcp_server_name, "has_credentials": inst.has_credentials, - "default_open": read_default_open(ConnectorRepo.parse_config_json(inst)), + "default_open": read_default_open(config), + "shared": inst.shared, + "owner_user_id": inst.user_id, "created_at": inst.created_at, "updated_at": inst.updated_at, } @@ -334,11 +357,24 @@ def list_instances_for_api(self, user_id: int) -> list[dict[str, Any]]: servers=extract_servers(self.decrypt(custom_row.instance_id)), ) ) + for parent in self._repo.list_by_kind(CUSTOM_MCP_KIND): + if parent.user_id == user_id or not parent.has_credentials: + continue + out.extend( + expand_custom_instances( + parent=parent, + servers=extract_servers(self.decrypt(parent.instance_id)), + shared_view=True, + ) + ) + for item in out: + item.setdefault("owner_user_id", user_id) + item.setdefault("shared", False) return out def list_active_mcp_server_names(self, user_id: int) -> list[str]: names: list[str] = [] - for inst in self._repo.list_by_user(user_id): + for inst in self._repo.list_visible(user_id): if is_custom_mcp_kind(inst.kind): continue if inst.status != "active" or not inst.has_credentials: @@ -347,6 +383,12 @@ def list_active_mcp_server_names(self, user_id: int) -> list[str]: for name, spec in self.get_custom_servers(user_id).items(): if isinstance(spec, dict) and server_enabled(spec): names.append(name) + for parent in self._repo.list_by_kind(CUSTOM_MCP_KIND): + if parent.user_id == user_id or not parent.has_credentials: + continue + for name, spec in extract_servers(self.decrypt(parent.instance_id)).items(): + if isinstance(spec, dict) and spec.get("shared") is True and server_enabled(spec): + names.append(shared_mcp_server_name(parent.instance_id, name)) return sorted(names) def list_default_open_mcp_server_names(self, user_id: int) -> list[str]: @@ -393,11 +435,26 @@ def validate_mcp_servers_for_user(self, user_id: int, names: list[str]) -> list[ return list(names) def custom_harness_configs(self, user_id: int) -> dict[str, Any]: - return enabled_harness_configs(self.get_custom_servers(user_id)) + configs = enabled_harness_configs(self.get_custom_servers(user_id)) + for parent in self._repo.list_by_kind(CUSTOM_MCP_KIND): + if parent.user_id == user_id or not parent.has_credentials: + continue + servers = extract_servers(self.decrypt(parent.instance_id)) + for name, spec in servers.items(): + if ( + not isinstance(spec, dict) + or spec.get("shared") is not True + or not server_enabled(spec) + ): + continue + built = enabled_harness_configs({name: spec}).get(name) + if built is not None: + configs[shared_mcp_server_name(parent.instance_id, name)] = built + return configs async def mcp_configs_for_user(self, user_id: int) -> dict[str, Any]: configs: dict[str, Any] = {} - for inst in self._repo.list_by_user(user_id): + for inst in self._repo.list_visible(user_id): if inst.status != "active": continue if is_custom_mcp_kind(inst.kind): @@ -415,6 +472,14 @@ async def mcp_configs_for_user(self, user_id: int) -> dict[str, Any]: config=self._config, ) await self.ensure_fresh_custom_servers(user_id) + for parent in self._repo.list_by_kind(CUSTOM_MCP_KIND): + if parent.user_id == user_id or not parent.has_credentials: + continue + servers = extract_servers(self.decrypt(parent.instance_id)) + if any( + isinstance(spec, dict) and spec.get("shared") is True for spec in servers.values() + ): + await self.ensure_fresh_custom_servers(parent.user_id) configs.update(self.custom_harness_configs(user_id)) return configs diff --git a/src/octop/infra/db/migrate.py b/src/octop/infra/db/migrate.py index af06f9e8..5870a22a 100644 --- a/src/octop/infra/db/migrate.py +++ b/src/octop/infra/db/migrate.py @@ -1195,6 +1195,7 @@ def _apply_sqlite_migration(db: DatabasePool, version: int, path: Path) -> None: database actually contains conversation tables. Version 11 adds cron job display names. Version 12 adds the append-only chat trajectory event ledger. + Version 13 adds multi-instance and shared connectors. """ if version == 2: if _table_exists(db, "cron_jobs"): @@ -1283,6 +1284,12 @@ def _apply_sqlite_migration(db: DatabasePool, version: int, path: Path) -> None: with db.connect() as conn: conn.execute("UPDATE _schema_version SET version = ?", (version,)) return + if version == 13 and not _table_exists(db, "connectors"): + # Very old/partial installs may contain only ``users``. There are no + # connector rows to rebuild, so only advance the migration watermark. + with db.connect() as conn: + conn.execute("UPDATE _schema_version SET version = ?", (version,)) + return sql = path.read_text(encoding="utf-8") with db.connect() as conn: conn.executescript(sql) diff --git a/src/octop/infra/db/migrations/013_connector_instances.pg.sql b/src/octop/infra/db/migrations/013_connector_instances.pg.sql new file mode 100644 index 00000000..9167d8a8 --- /dev/null +++ b/src/octop/infra/db/migrations/013_connector_instances.pg.sql @@ -0,0 +1,23 @@ +-- Schema v13: multi-instance and shared connectors. + +ALTER TABLE connectors DROP CONSTRAINT connectors_user_id_kind_key; +ALTER TABLE connectors ADD COLUMN shared INTEGER NOT NULL DEFAULT 0; + +WITH ranked AS ( + SELECT id, display_name, instance_id, + ROW_NUMBER() OVER ( + PARTITION BY user_id, display_name ORDER BY id + ) AS duplicate_number + FROM connectors + WHERE kind <> 'custom-mcp' +) +UPDATE connectors AS c +SET display_name = ranked.display_name || ' (' || right(ranked.instance_id, 6) || ')' +FROM ranked +WHERE c.id = ranked.id AND ranked.duplicate_number > 1; + +CREATE INDEX idx_connectors_shared ON connectors(shared) WHERE shared = 1; +CREATE UNIQUE INDEX idx_connectors_user_display_name + ON connectors(user_id, display_name) WHERE kind <> 'custom-mcp'; + +UPDATE _schema_version SET version = 13; diff --git a/src/octop/infra/db/migrations/013_connector_instances.sql b/src/octop/infra/db/migrations/013_connector_instances.sql new file mode 100644 index 00000000..82ecb45a --- /dev/null +++ b/src/octop/infra/db/migrations/013_connector_instances.sql @@ -0,0 +1,52 @@ +-- Schema v13: multi-instance and shared connectors. + +PRAGMA foreign_keys = OFF; + +ALTER TABLE connectors RENAME TO connectors_legacy; + +CREATE TABLE connectors ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + instance_id TEXT NOT NULL UNIQUE, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + kind TEXT NOT NULL, + display_name TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'active', + shared INTEGER NOT NULL DEFAULT 0, + mcp_server_name TEXT NOT NULL UNIQUE, + credential_blob BLOB, + credential_expires_at INTEGER, + credential_rotated_at INTEGER, + config_json TEXT, + created_at INTEGER NOT NULL, + updated_at INTEGER NOT NULL +); + +INSERT INTO connectors( + id, instance_id, user_id, kind, display_name, status, shared, + mcp_server_name, credential_blob, credential_expires_at, + credential_rotated_at, config_json, created_at, updated_at +) +SELECT + id, instance_id, user_id, kind, + CASE + WHEN kind = 'custom-mcp' THEN display_name + WHEN ROW_NUMBER() OVER ( + PARTITION BY user_id, display_name ORDER BY id + ) = 1 THEN display_name + ELSE display_name || ' (' || substr(instance_id, -6) || ')' + END, + status, 0, + mcp_server_name, credential_blob, credential_expires_at, + credential_rotated_at, config_json, created_at, updated_at +FROM connectors_legacy; + +DROP TABLE connectors_legacy; + +CREATE INDEX idx_connectors_user ON connectors(user_id); +CREATE INDEX idx_connectors_shared ON connectors(shared) WHERE shared = 1; +CREATE UNIQUE INDEX idx_connectors_user_display_name + ON connectors(user_id, display_name) WHERE kind <> 'custom-mcp'; + +PRAGMA foreign_keys = ON; + +UPDATE _schema_version SET version = 13; diff --git a/src/octop/infra/db/repos/connectors.py b/src/octop/infra/db/repos/connectors.py index a892661a..5091e778 100644 --- a/src/octop/infra/db/repos/connectors.py +++ b/src/octop/infra/db/repos/connectors.py @@ -1,4 +1,4 @@ -"""Connector database access — one row per (user, kind).""" +"""Connector database access.""" from __future__ import annotations @@ -6,7 +6,7 @@ from dataclasses import dataclass from octop.infra.db.pool import DatabasePool -from octop.infra.db.repos._base import DbRow, map_rows, now_ts +from octop.infra.db.repos._base import DbRow, bool_int, map_rows, now_ts @dataclass(frozen=True) @@ -17,6 +17,7 @@ class ConnectorRow: kind: str display_name: str status: str + shared: bool mcp_server_name: str credential_blob: bytes | None credential_expires_at: int | None @@ -35,6 +36,7 @@ def from_row(cls, r: DbRow) -> ConnectorRow: kind=r["kind"], display_name=r["display_name"], status=r["status"], + shared=bool(r["shared"]), mcp_server_name=r["mcp_server_name"], credential_blob=bytes(blob) if blob is not None else None, credential_expires_at=r["credential_expires_at"], @@ -87,19 +89,21 @@ def create( display_name: str, mcp_server_name: str, config_json: str | None = None, + shared: bool = False, ) -> str: ts = now_ts() with self._db.transaction() as conn: conn.execute( "INSERT INTO connectors(" - "instance_id, user_id, kind, display_name, status, mcp_server_name, " + "instance_id, user_id, kind, display_name, status, shared, mcp_server_name, " "config_json, created_at, updated_at" - ") VALUES (?, ?, ?, ?, 'active', ?, ?, ?, ?)", + ") VALUES (?, ?, ?, ?, 'active', ?, ?, ?, ?, ?)", ( instance_id, user_id, kind, display_name, + bool_int(shared), mcp_server_name, config_json, ts, @@ -131,6 +135,42 @@ def list_by_user(self, user_id: int) -> list[ConnectorRow]: ).fetchall() return map_rows(rows, ConnectorRow) + def list_visible(self, user_id: int) -> list[ConnectorRow]: + with self._db.connect() as conn: + rows = conn.execute( + "SELECT * FROM connectors " + "WHERE user_id = ? OR shared = 1 " + "ORDER BY display_name, instance_id", + (user_id,), + ).fetchall() + return map_rows(rows, ConnectorRow) + + def list_by_kind(self, kind: str) -> list[ConnectorRow]: + with self._db.connect() as conn: + rows = conn.execute( + "SELECT * FROM connectors WHERE kind = ? ORDER BY id", + (kind,), + ).fetchall() + return map_rows(rows, ConnectorRow) + + def name_exists( + self, + user_id: int, + display_name: str, + *, + exclude_instance_id: str | None = None, + ) -> bool: + sql = ( + "SELECT 1 FROM connectors " + "WHERE user_id = ? AND display_name = ? AND kind <> 'custom-mcp'" + ) + params: list[object] = [user_id, display_name] + if exclude_instance_id is not None: + sql += " AND instance_id <> ?" + params.append(exclude_instance_id) + with self._db.connect() as conn: + return conn.execute(sql, tuple(params)).fetchone() is not None + def update_status(self, instance_id: str, status: str) -> None: with self._db.transaction() as conn: conn.execute( @@ -145,6 +185,31 @@ def update_config_json(self, instance_id: str, config_json: str | None) -> None: (config_json, now_ts(), instance_id), ) + def update_metadata( + self, + instance_id: str, + *, + display_name: str | None = None, + shared: bool | None = None, + ) -> None: + updates: list[str] = [] + params: list[object] = [] + if display_name is not None: + updates.append("display_name = ?") + params.append(display_name) + if shared is not None: + updates.append("shared = ?") + params.append(bool_int(shared)) + if not updates: + return + updates.append("updated_at = ?") + params.extend((now_ts(), instance_id)) + with self._db.transaction() as conn: + conn.execute( + f"UPDATE connectors SET {', '.join(updates)} WHERE instance_id = ?", + tuple(params), + ) + def upsert_credentials( self, *, diff --git a/src/octop/infra/errors.py b/src/octop/infra/errors.py index 95e3d05f..b0b827b5 100644 --- a/src/octop/infra/errors.py +++ b/src/octop/infra/errors.py @@ -42,10 +42,12 @@ class ErrorCode(StrEnum): PROVIDER_LOCAL_PROTECTED = "PROVIDER_LOCAL_PROTECTED" STORAGE_BACKEND_NAME_TAKEN = "STORAGE_BACKEND_NAME_TAKEN" STORAGE_BACKEND_REFERENCED = "STORAGE_BACKEND_REFERENCED" + STORAGE_BACKEND_DEPS_FAILED = "STORAGE_BACKEND_DEPS_FAILED" CHANNEL_KIND_UNSUPPORTED = "CHANNEL_KIND_UNSUPPORTED" CHANNEL_INVALID_CREDENTIALS = "CHANNEL_INVALID_CREDENTIALS" CHANNEL_NAME_TAKEN = "CHANNEL_NAME_TAKEN" CONNECTOR_NOT_FOUND = "CONNECTOR_NOT_FOUND" + CONNECTOR_NAME_TAKEN = "CONNECTOR_NAME_TAKEN" CONNECTOR_INVALID_CREDENTIALS = "CONNECTOR_INVALID_CREDENTIALS" CONNECTOR_OAUTH_HTTPS_REQUIRED = "CONNECTOR_OAUTH_HTTPS_REQUIRED" CONNECTOR_KIND_UNSUPPORTED = "CONNECTOR_KIND_UNSUPPORTED" @@ -133,10 +135,12 @@ class ErrorCode(StrEnum): ErrorCode.PROVIDER_LOCAL_PROTECTED: 409, ErrorCode.STORAGE_BACKEND_NAME_TAKEN: 409, ErrorCode.STORAGE_BACKEND_REFERENCED: 409, + ErrorCode.STORAGE_BACKEND_DEPS_FAILED: 503, ErrorCode.CHANNEL_KIND_UNSUPPORTED: 400, ErrorCode.CHANNEL_INVALID_CREDENTIALS: 400, ErrorCode.CHANNEL_NAME_TAKEN: 409, ErrorCode.CONNECTOR_NOT_FOUND: 404, + ErrorCode.CONNECTOR_NAME_TAKEN: 409, ErrorCode.CONNECTOR_INVALID_CREDENTIALS: 400, ErrorCode.CONNECTOR_OAUTH_HTTPS_REQUIRED: 400, ErrorCode.CONNECTOR_KIND_UNSUPPORTED: 400, diff --git a/tests/integration/test_connectors_api.py b/tests/integration/test_connectors_api.py index aaf56936..044513b7 100644 --- a/tests/integration/test_connectors_api.py +++ b/tests/integration/test_connectors_api.py @@ -72,6 +72,7 @@ async def test_create_tencent_instance(env): assert r.status_code == 201 inst = r.json() assert inst["kind"] == "tencent-docs" + assert inst["description"] assert inst["mcp_server_name"].startswith("tencent-docs__") assert inst.get("default_open") is False @@ -103,6 +104,135 @@ async def test_create_instance_default_open(env): assert detail.json()["default_open"] is True +async def test_same_connector_kind_supports_multiple_named_instances(env): + c, _, auth, _ = env + first = await c.post( + "/api/connector-instances", + headers=auth, + json={ + "kind": "tencent-docs", + "display_name": "文档一", + "credentials": {"token": "token-1"}, + }, + ) + second = await c.post( + "/api/connector-instances", + headers=auth, + json={ + "kind": "tencent-docs", + "display_name": "文档二", + "credentials": {"token": "token-2"}, + }, + ) + assert first.status_code == 201 + assert second.status_code == 201 + assert first.json()["instance_id"] != second.json()["instance_id"] + + duplicate = await c.post( + "/api/connector-instances", + headers=auth, + json={ + "kind": "qq-mail", + "display_name": "文档一", + "credentials": {"email": "a@qq.com", "password": "code"}, + }, + ) + assert duplicate.status_code == 409 + assert duplicate.json()["error"]["code"] == "CONNECTOR_NAME_TAKEN" + + +async def test_connector_names_are_unique_across_builtin_and_custom(env): + c, _, auth, _ = env + custom = await c.put( + "/api/connectors/custom-mcp", + headers=auth, + json={ + "servers": { + "custom-server": { + "display_name": "重复名称", + "transport": "streamable_http", + "url": "https://mcp.example.com/mcp", + } + } + }, + ) + assert custom.status_code == 200 + + builtin = await c.post( + "/api/connector-instances", + headers=auth, + json={ + "kind": "tencent-docs", + "display_name": "重复名称", + "credentials": {"token": "test-token"}, + }, + ) + assert builtin.status_code == 409 + assert builtin.json()["error"]["code"] == "CONNECTOR_NAME_TAKEN" + + +async def test_custom_name_cannot_duplicate_builtin_connector(env): + c, _, auth, _ = env + builtin = await c.post( + "/api/connector-instances", + headers=auth, + json={ + "kind": "tencent-docs", + "display_name": "内置名称", + "credentials": {"token": "test-token"}, + }, + ) + assert builtin.status_code == 201 + + custom = await c.put( + "/api/connectors/custom-mcp", + headers=auth, + json={ + "servers": { + "custom-server": { + "display_name": "内置名称", + "transport": "streamable_http", + "url": "https://mcp.example.com/mcp", + } + } + }, + ) + assert custom.status_code == 409 + assert custom.json()["error"]["code"] == "CONNECTOR_NAME_TAKEN" + + +async def test_shared_connector_is_visible_but_not_manageable_by_other_user(env): + c, _, admin_auth, _ = env + created = await c.post( + "/api/connector-instances", + headers=admin_auth, + json={ + "kind": "tencent-docs", + "display_name": "共享文档", + "credentials": {"token": "shared-token"}, + "shared": True, + "default_open": True, + }, + ) + assert created.status_code == 201 + instance_id = created.json()["instance_id"] + + user_auth = await create_user(c, admin_auth, username="connector_reader") + listed = await c.get("/api/connector-instances", headers=user_auth) + assert listed.status_code == 200 + shared = next(row for row in listed.json() if row["instance_id"] == instance_id) + assert shared["shared"] is True + assert shared["default_open"] is True + assert shared["can_manage"] is False + + patched = await c.patch( + f"/api/connector-instances/{instance_id}", + headers=user_auth, + json={"display_name": "不能修改"}, + ) + assert patched.status_code == 403 + + async def test_chat_accepts_user_instance_mcp(env): c, _, auth, agent_id = env r = await c.post( @@ -147,6 +277,40 @@ async def test_get_instance_detail(env): assert detail["credentials_preview"]["password_configured"] is True +async def test_create_and_edit_instance_description(env): + c, _, auth, _ = env + created = await c.post( + "/api/connector-instances", + headers=auth, + json={ + "kind": "tencent-docs", + "display_name": "文档", + "description": "团队文档连接", + "credentials": {"token": "test-token"}, + }, + ) + assert created.status_code == 201, created.text + instance_id = created.json()["instance_id"] + assert created.json()["description"] == "团队文档连接" + + listed = await c.get("/api/connector-instances", headers=auth) + row = next(item for item in listed.json() if item["instance_id"] == instance_id) + assert row["description"] == "团队文档连接" + + patched = await c.patch( + f"/api/connector-instances/{instance_id}", + headers=auth, + json={"description": "更新后的说明"}, + ) + assert patched.status_code == 200, patched.text + assert patched.json()["description"] == "更新后的说明" + + detail = await c.get(f"/api/connector-instances/{instance_id}", headers=auth) + assert detail.status_code == 200, detail.text + assert detail.json()["description"] == "更新后的说明" + assert detail.json()["config"]["description"] == "更新后的说明" + + async def test_probe_returns_tools(env, monkeypatch: pytest.MonkeyPatch): monkeypatch.setattr( "octop.infra.connectors.gateway.adapters.qq_mail.probe_credentials", @@ -348,6 +512,37 @@ async def test_patch_custom_mcp_server_default_open_only(env): assert "default_open" not in patch_off.json()["servers"]["linear"] +async def test_shared_custom_mcp_is_visible_with_collision_safe_name(env): + c, _, admin_auth, _ = env + put = await c.put( + "/api/connectors/custom-mcp", + headers=admin_auth, + json={ + "servers": { + "linear": { + "transport": "streamable_http", + "url": "https://mcp.linear.app/mcp", + "shared": True, + } + } + }, + ) + assert put.status_code == 200 + + user_auth = await create_user(c, admin_auth, username="custom_reader") + listed = await c.get("/api/connector-instances", headers=user_auth) + assert listed.status_code == 200 + shared = next( + row + for row in listed.json() + if row["kind"] == CUSTOM_MCP_KIND and row["display_name"] == "linear" + ) + assert shared["shared"] is True + assert shared["can_manage"] is False + assert shared["mcp_server_name"].startswith("custom__") + assert shared["mcp_server_name"].endswith("__linear") + + async def test_custom_mcp_oauth_callback_applies_tokens(env): c, srv, auth, _ = env user_id = await resolve_user_id(c, auth, "admin") diff --git a/tests/unit/connectors/test_custom_mcp.py b/tests/unit/connectors/test_custom_mcp.py index 531db4cf..855744f9 100644 --- a/tests/unit/connectors/test_custom_mcp.py +++ b/tests/unit/connectors/test_custom_mcp.py @@ -53,6 +53,17 @@ def _ensure_user(db: SqlitePool) -> int: return int(row["id"]) +def _ensure_second_user(db: SqlitePool) -> int: + with db.transaction() as conn: + conn.execute( + "INSERT INTO users(username, password_hash, role, created_at) " + "VALUES ('u2', 'x', 'user', 1)" + ) + row = conn.execute("SELECT id FROM users WHERE username = 'u2'").fetchone() + assert row is not None + return int(row["id"]) + + def test_normalize_streamable_http_and_stdio(): http = normalize_server_spec( "deepwiki", @@ -82,6 +93,37 @@ def test_normalize_streamable_http_and_stdio(): assert stdio["enabled"] is False +def test_shared_custom_server_uses_collision_safe_name_for_viewer( + svc: ConnectorService, + db: SqlitePool, +) -> None: + owner_id = _ensure_user(db) + viewer_id = _ensure_second_user(db) + svc.put_custom_servers( + owner_id, + { + "linear": { + "transport": "streamable_http", + "url": "https://mcp.linear.app/mcp", + "shared": True, + }, + "private": { + "transport": "streamable_http", + "url": "https://private.example.com/mcp", + }, + }, + ) + + visible = svc.list_instances_for_api(viewer_id) + assert [row["display_name"] for row in visible] == ["linear"] + shared_name = str(visible[0]["mcp_server_name"]) + assert shared_name.startswith("custom__") + assert shared_name.endswith("__linear") + assert svc.list_active_mcp_server_names(viewer_id) == [shared_name] + assert list(svc.custom_harness_configs(viewer_id)) == [shared_name] + assert svc.list_default_open_mcp_server_names(viewer_id) == [] + + def test_rejects_http_scheme_and_private_host(): with pytest.raises(ValueError, match="https"): normalize_server_spec( diff --git a/tests/unit/connectors/test_default_open.py b/tests/unit/connectors/test_default_open.py index 4fe8b8e9..ac30f731 100644 --- a/tests/unit/connectors/test_default_open.py +++ b/tests/unit/connectors/test_default_open.py @@ -44,6 +44,14 @@ def test_build_instance_config_json_includes_when_true(): assert '"email": "a@qq.com"' in raw_mail +def test_build_instance_config_json_includes_description(): + raw = build_instance_config_json( + kind="tencent-docs", + description="团队文档连接", + ) + assert raw == '{"description": "团队文档连接"}' + + def test_merge_mcp_servers_with_defaults_unions_and_dedupes(): # Default: apply defaults only when explicit is None (IM-style). assert merge_mcp_servers_with_defaults(None, ["a", "b"]) == ["a", "b"] diff --git a/tests/unit/db/test_agent_profile_columns.py b/tests/unit/db/test_agent_profile_columns.py index cbe5e651..94e9b348 100644 --- a/tests/unit/db/test_agent_profile_columns.py +++ b/tests/unit/db/test_agent_profile_columns.py @@ -110,7 +110,7 @@ def test_migration_007_backfills_profile_columns(tmp_path: Path) -> None: with pool.connect() as conn: version = conn.execute("SELECT version FROM _schema_version").fetchone()[0] row = conn.execute("SELECT * FROM agents WHERE agent_id = ?", ("ag1",)).fetchone() - assert version == 12 + assert version == 13 assert row["template_name"] == "general-assistant" assert row["icon_name"] == "zap" assert row["icon_url"] == "https://cdn.example.com/a.png" diff --git a/tests/unit/db/test_clip_thread_title.py b/tests/unit/db/test_clip_thread_title.py index 3057c188..282276df 100644 --- a/tests/unit/db/test_clip_thread_title.py +++ b/tests/unit/db/test_clip_thread_title.py @@ -82,7 +82,7 @@ def test_migration_003_repairs_stored_hard_cuts(tmp_path: Path) -> None: with pool.connect() as conn: v = conn.execute("SELECT version FROM _schema_version").fetchone()[0] title = conn.execute("SELECT title FROM threads WHERE thread_id = ?", ("t1",)).fetchone()[0] - assert v == 12 + assert v == 13 assert title == "x" * 39 + "…" # Idempotent repair assert repair_all_legacy_thread_titles(pool) == 0 diff --git a/tests/unit/db/test_db_pool.py b/tests/unit/db/test_db_pool.py index 79e722c7..0cc116b7 100644 --- a/tests/unit/db/test_db_pool.py +++ b/tests/unit/db/test_db_pool.py @@ -86,7 +86,13 @@ def test_run_migrations_idempotent(db: SqlitePool): doc_cols = { r["name"] for r in conn.execute("PRAGMA table_info(knowledge_documents)").fetchall() } - assert v == 12 + connector_cols = { + r["name"] for r in conn.execute("PRAGMA table_info(connectors)").fetchall() + } + connector_indexes = { + r["name"] for r in conn.execute("PRAGMA index_list(connectors)").fetchall() + } + assert v == 13 assert "login_failed_count" in cols assert "login_locked_until" in cols assert "preferences_json" in cols @@ -99,6 +105,8 @@ def test_run_migrations_idempotent(db: SqlitePool): assert "task_type" in cron_cols assert "mcp_servers" in cron_cols assert "name" in cron_cols + assert "shared" in connector_cols + assert "idx_connectors_user_display_name" in connector_indexes assert {"model_ref", "reasoning_mode", "reasoning_effort", "artifacts"}.issubset(thread_cols) assert { "color", @@ -149,7 +157,7 @@ def test_migration_002_idempotent_when_column_already_present(tmp_path: Path) -> with pool.connect() as conn: v = conn.execute("SELECT version FROM _schema_version").fetchone()[0] cron_cols = {r["name"] for r in conn.execute("PRAGMA table_info(cron_jobs)").fetchall()} - assert v == 12 + assert v == 13 assert "mcp_servers" in cron_cols assert "skill_packages" in { r["name"] @@ -286,7 +294,7 @@ def test_stuck_version_6_without_permissions_column_is_repaired(tmp_path: Path) with pool.connect() as conn: cols = {r["name"] for r in conn.execute("PRAGMA table_info(users)").fetchall()} version = conn.execute("SELECT version FROM _schema_version").fetchone()[0] - assert version == 12 + assert version == 13 assert "permissions" in cols @@ -311,7 +319,7 @@ def test_schema_v10_without_projection_tables_is_repaired(tmp_path: Path) -> Non } kb_cols = {r["name"] for r in conn.execute("PRAGMA table_info(knowledge_bases)").fetchall()} cron_cols = {r["name"] for r in conn.execute("PRAGMA table_info(cron_jobs)").fetchall()} - assert version == 12 + assert version == 13 assert {"thread_messages", "thread_history_projection", "trajectory_events"}.issubset( table_names ) @@ -346,7 +354,7 @@ def test_ahead_of_max_schema_version_clamps_to_max(tmp_path: Path) -> None: r["name"] for r in conn.execute("SELECT name FROM sqlite_master WHERE type='table'").fetchall() } - assert version == 12 + assert version == 13 assert "skill_package_id" in pkg_cols assert "published_expert_id" in pub_cols assert "user_invites" in invite_tables @@ -385,7 +393,7 @@ def test_pre_squash_schema_version_clamped_and_knowledge_tables_filled( for row in conn.execute("SELECT name FROM sqlite_master WHERE type='table'").fetchall() } user_cols = {r["name"] for r in conn.execute("PRAGMA table_info(users)").fetchall()} - assert version == 12 + assert version == 13 assert "permissions" in user_cols assert { "published_experts", diff --git a/tests/unit/db/test_published_experts_repo.py b/tests/unit/db/test_published_experts_repo.py index 0975951a..23b732cc 100644 --- a/tests/unit/db/test_published_experts_repo.py +++ b/tests/unit/db/test_published_experts_repo.py @@ -27,7 +27,7 @@ def test_published_experts_table_exists(db: SqlitePool) -> None: v = conn.execute("SELECT version FROM _schema_version").fetchone()[0] cols = {r["name"] for r in conn.execute("PRAGMA table_info(published_experts)").fetchall()} assert "published_experts" in names - assert v == 12 + assert v == 13 assert "published_expert_id" in cols diff --git a/tests/unit/db/test_repo_knowledge.py b/tests/unit/db/test_repo_knowledge.py index bc48eaf5..c20853a5 100644 --- a/tests/unit/db/test_repo_knowledge.py +++ b/tests/unit/db/test_repo_knowledge.py @@ -50,7 +50,7 @@ def test_knowledge_tables_migrated(db: SqlitePool) -> None: "knowledge_bases", "knowledge_documents", }.issubset(names) - assert v == 12 + assert v == 13 assert "knowledge_base_members" not in names cols = {r["name"] for r in conn.execute("PRAGMA table_info(knowledge_bases)").fetchall()} assert "knowledge_base_id" in cols diff --git a/tests/unit/db/test_skill_package_icons.py b/tests/unit/db/test_skill_package_icons.py index b726997a..e2cd6c8a 100644 --- a/tests/unit/db/test_skill_package_icons.py +++ b/tests/unit/db/test_skill_package_icons.py @@ -91,7 +91,7 @@ def test_migration_002_idempotent_when_icon_columns_already_present(tmp_path: Pa "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='skill_packages'" ) } - assert v == 12 + assert v == 13 assert "icon_name" in cols assert "icon_url" in cols assert "skill_package_id" in cols @@ -110,7 +110,7 @@ def test_repair_legacy_schema_adds_icon_columns_at_version_2(tmp_path: Path) -> with pool.connect() as conn: v = conn.execute("SELECT version FROM _schema_version").fetchone()[0] cols = {r["name"] for r in conn.execute("PRAGMA table_info(skill_packages)").fetchall()} - assert v == 12 + assert v == 13 assert "icon_name" in cols assert "icon_url" in cols assert "skill_package_id" in cols diff --git a/tests/unit/db/test_skill_packages_repo.py b/tests/unit/db/test_skill_packages_repo.py index daa6c27c..15c594d6 100644 --- a/tests/unit/db/test_skill_packages_repo.py +++ b/tests/unit/db/test_skill_packages_repo.py @@ -28,7 +28,7 @@ def test_skill_packages_table_exists(db: SqlitePool) -> None: v = conn.execute("SELECT version FROM _schema_version").fetchone()[0] cols = {r["name"] for r in conn.execute("PRAGMA table_info(skill_packages)").fetchall()} assert "skill_packages" in names - assert v == 12 + assert v == 13 assert "skill_package_id" in cols diff --git a/tests/unit/test_connectors.py b/tests/unit/test_connectors.py index ce9c26fa..2880ef80 100644 --- a/tests/unit/test_connectors.py +++ b/tests/unit/test_connectors.py @@ -4,6 +4,7 @@ import asyncio import json +import sqlite3 from pathlib import Path import pytest @@ -1255,7 +1256,7 @@ def test_tencent_lexiang_credentials(): assert payload == {"api_key": "lx-tok", "company_from": "csig"} -def test_connector_repo_user_kind_unique(db: SqlitePool): +def test_connector_repo_supports_multiple_kinds_and_unique_names(db: SqlitePool): repo = ConnectorRepo(db) with db.transaction() as conn: conn.execute( @@ -1277,6 +1278,27 @@ def test_connector_repo_user_kind_unique(db: SqlitePool): with pytest.raises(ValueError): repo.validate_mcp_servers_for_user(uid, ["other"]) + second = new_ulid() + repo.create( + instance_id=second, + user_id=uid, + kind="tencent-docs", + display_name="doc 2", + mcp_server_name=mcp_server_name("tencent-docs", second), + shared=True, + ) + assert [row.instance_id for row in repo.list_visible(uid)] == [iid, second] + + duplicate_name = new_ulid() + with pytest.raises(sqlite3.IntegrityError): + repo.create( + instance_id=duplicate_name, + user_id=uid, + kind="qq-mail", + display_name="doc", + mcp_server_name=mcp_server_name("qq-mail", duplicate_name), + ) + def test_validate_mcp_servers_for_user(db: SqlitePool): repo = ConnectorRepo(db) From 1a12948c21331843b921a9a62a318b4e37595a00 Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Sun, 6 Sep 2026 01:24:57 +0000 Subject: [PATCH 53/58] feat(storage): add OpenSandbox remote sandbox storage backend --- .../catalogTypeCard.module.less | 10 +++ .../src/components/CatalogTypeCard/index.tsx | 8 ++- .../Admin/Storage/StorageBackendCard.tsx | 32 +++++++-- .../Admin/Storage/StorageBackendModal.tsx | 21 +++++- .../pages/Admin/Storage/StorageTypeCard.tsx | 17 ++++- dashboard/src/pages/Admin/Storage/index.tsx | 44 ++++++++---- .../pages/Admin/Storage/storage.module.less | 41 ++++++++++- .../Admin/Storage/useStorageBackends.tsx | 69 +++++++++++++++++++ src/octop/api/routers/storage_backends.py | 20 +++++- src/octop/infra/backend/adapter.py | 48 ++++++++++++- src/octop/infra/backend/opensandbox_deps.py | 37 ++++++++++ src/octop/infra/backend/probe.py | 21 ++++++ src/octop/infra/backend/resolver.py | 6 +- tests/unit/backend/test_opensandbox_deps.py | 25 +++++++ tests/unit/test_storage_probe.py | 37 ++++++++++ tests/unit/test_storage_spec.py | 33 +++++++++ 16 files changed, 434 insertions(+), 35 deletions(-) create mode 100644 src/octop/infra/backend/opensandbox_deps.py create mode 100644 tests/unit/backend/test_opensandbox_deps.py diff --git a/dashboard/src/components/CatalogTypeCard/catalogTypeCard.module.less b/dashboard/src/components/CatalogTypeCard/catalogTypeCard.module.less index 747400ba..2198cf3c 100644 --- a/dashboard/src/components/CatalogTypeCard/catalogTypeCard.module.less +++ b/dashboard/src/components/CatalogTypeCard/catalogTypeCard.module.less @@ -74,6 +74,14 @@ flex-shrink: 0; } +.titleCol { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 4px; + min-width: 0; +} + .title { font-size: 15px; font-weight: 600; @@ -88,6 +96,8 @@ -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; + /* Always reserve two lines so `hint` sits at the same offset on every card. */ + min-height: 3.1em; } .hint { diff --git a/dashboard/src/components/CatalogTypeCard/index.tsx b/dashboard/src/components/CatalogTypeCard/index.tsx index 76b0d0dd..cb5c10d1 100644 --- a/dashboard/src/components/CatalogTypeCard/index.tsx +++ b/dashboard/src/components/CatalogTypeCard/index.tsx @@ -7,6 +7,8 @@ export interface CatalogTypeCardProps { description: string; icon: ReactNode; hint?: string; + /** Optional chip shown under the title (e.g. a category label). */ + tag?: ReactNode; configuredBadge?: ReactNode; disabled?: boolean; onClick: () => void; @@ -18,6 +20,7 @@ export const CatalogTypeCard = memo(function CatalogTypeCard({ description, icon, hint, + tag, configuredBadge, disabled = false, onClick, @@ -42,7 +45,10 @@ export const CatalogTypeCard = memo(function CatalogTypeCard({ > {icon}
    -
    {title}
    +
    +
    {title}
    + {tag} +
    {description}
    diff --git a/dashboard/src/pages/Admin/Storage/StorageBackendCard.tsx b/dashboard/src/pages/Admin/Storage/StorageBackendCard.tsx index 6cb79b40..d907a7fc 100644 --- a/dashboard/src/pages/Admin/Storage/StorageBackendCard.tsx +++ b/dashboard/src/pages/Admin/Storage/StorageBackendCard.tsx @@ -20,6 +20,7 @@ import { request } from "../../../api/request"; import { apiErrorMessage, parseApiError } from "../../../utils/apiError"; import { STORAGE_TYPE_DEFS, + storageKindGroup, type StorageBackendRow, } from "./useStorageBackends"; import { StorageBackendDrawer } from "./StorageBackendModal"; @@ -48,6 +49,7 @@ export function StorageBackendCard({ const typeDef = STORAGE_TYPE_DEFS.find((d) => d.kind === backend.kind); const accent = typeDef?.color ?? "#8c8c8c"; const icon = typeDef?.icon ?? null; + const group = storageKindGroup(backend.kind); const handleToggle = async (next: boolean) => { setToggling(true); @@ -58,9 +60,19 @@ export function StorageBackendCard({ }); await onSaved(); // Enabling a Docker sandbox should kick off image pull immediately. - if (next && backend.kind === "docker") { + if ( + next && + (backend.kind === "docker" || backend.kind === "opensandbox") + ) { setTesting(true); - const hide = message.loading(t("storage.dockerPulling"), 0); + const hide = message.loading( + t( + backend.kind === "opensandbox" + ? "storage.opensandboxInstalling" + : "storage.dockerPulling", + ), + 0, + ); try { const result = await request<{ ok: boolean; @@ -137,7 +149,9 @@ export function StorageBackendCard({ }); }; - const isConfigured = !!backend.access_key || !!backend.bucket; + const bucketField = typeDef?.fields.find((f) => f.key === "bucket"); + const isConfigured = + !!backend.access_key || !!backend.bucket || !!backend.endpoint; const primaryInfo = backend.bucket ?? backend.endpoint ?? "—"; const handleTest = async () => { @@ -187,7 +201,15 @@ export function StorageBackendCard({
    {backend.name}
    - {typeDef ? t(typeDef.nameKey) : backend.kind} + {typeDef ? t(typeDef.nameKey) : backend.kind} + {group ? ( + + {t(group.titleKey)} + + ) : null}
    - {t("storage.bucketLabel")}: + {t(bucketField?.labelKey ?? "storage.bucketLabel")}: {primaryInfo !== "—" ? ( diff --git a/dashboard/src/pages/Admin/Storage/StorageBackendModal.tsx b/dashboard/src/pages/Admin/Storage/StorageBackendModal.tsx index 3f9bd9b8..65a3a04f 100644 --- a/dashboard/src/pages/Admin/Storage/StorageBackendModal.tsx +++ b/dashboard/src/pages/Admin/Storage/StorageBackendModal.tsx @@ -120,6 +120,10 @@ export function StorageBackendDrawer({ form.setFieldValue("sandbox_scope", "agent"); form.setFieldValue("sandbox_prefix", "octop_sandbox"); } + if (kind === "opensandbox") { + form.setFieldValue("bucket", "python:3.12"); + form.setFieldValue("region", "http"); + } } const draft = loadFormDraft>(draftScope); if (draft) { @@ -199,9 +203,20 @@ export function StorageBackendDrawer({ message.success(t("storage.createSuccess", { name: backendName })); } - // New docker backends are enabled by default — start image pull right away. - if (values.kind === "docker" && backendId != null) { - const hide = message.loading(t("storage.dockerPulling"), 0); + // New docker / OpenSandbox backends are enabled by default — probe (and + // install optional SDK) immediately. + if ( + (values.kind === "docker" || values.kind === "opensandbox") && + backendId != null + ) { + const hide = message.loading( + t( + values.kind === "opensandbox" + ? "storage.opensandboxInstalling" + : "storage.dockerPulling", + ), + 0, + ); try { const result = await request<{ ok: boolean; diff --git a/dashboard/src/pages/Admin/Storage/StorageTypeCard.tsx b/dashboard/src/pages/Admin/Storage/StorageTypeCard.tsx index 34d0a7a8..0749a1d5 100644 --- a/dashboard/src/pages/Admin/Storage/StorageTypeCard.tsx +++ b/dashboard/src/pages/Admin/Storage/StorageTypeCard.tsx @@ -5,8 +5,9 @@ import { memo } from "react"; import { CheckCircle } from "lucide-react"; import { useTranslation } from "react-i18next"; import { CatalogTypeCard } from "../../../components/CatalogTypeCard"; -import type { StorageTypeDef } from "./useStorageBackends"; +import { storageKindGroup, type StorageTypeDef } from "./useStorageBackends"; import cardStyles from "../../../components/CatalogTypeCard/catalogTypeCard.module.less"; +import styles from "./storage.module.less"; interface StorageTypeCardProps { typeDef: StorageTypeDef; @@ -20,6 +21,7 @@ export const StorageTypeCard = memo(function StorageTypeCard({ onClick, }: StorageTypeCardProps) { const { t } = useTranslation(); + const group = storageKindGroup(typeDef.kind); return ( + {t(group.titleKey)} + + ) : undefined + } onClick={() => onClick(typeDef)} configuredBadge={ isConfigured ? ( diff --git a/dashboard/src/pages/Admin/Storage/index.tsx b/dashboard/src/pages/Admin/Storage/index.tsx index cb447daa..a566a127 100644 --- a/dashboard/src/pages/Admin/Storage/index.tsx +++ b/dashboard/src/pages/Admin/Storage/index.tsx @@ -8,9 +8,11 @@ */ import { useMemo, useState } from "react"; import { Spin, Tabs } from "antd"; -import { HardDrive } from "lucide-react"; +import { HardDrive, LayoutGrid } from "lucide-react"; import { useTranslation } from "react-i18next"; import PageShell from "../../../layouts/PageShell"; +import { OctopEmptyMascot } from "../../../components/EmptyState"; +import StreamSetupGuide from "../../../components/StreamSetupGuide/StreamSetupGuide"; import { useStorageBackends, STORAGE_TYPE_DEFS, @@ -80,19 +82,33 @@ export default function AdminStoragePage() { } if (backends.length === 0) { return ( -
    - -
    {t("storage.emptyMyStorage")}
    -
    - {t("storage.emptyMyStorageHint")} -
    - -
    + + } + title={t("storage.emptyGuideTitle")} + description={t("storage.emptyGuideDesc")} + steps={[ + { + label: t("storage.emptyGuideStepWhat"), + detail: t("storage.emptyGuideStepWhatDetail"), + }, + { + label: t("storage.emptyGuideStepHow"), + detail: t("storage.emptyGuideStepHowDetail"), + }, + { + label: t("storage.emptyGuideStepUse"), + detail: t("storage.emptyGuideStepUseDetail"), + }, + ]} + primaryAction={{ + label: t("storage.goToTypes"), + onClick: () => setActiveTab("types"), + icon: , + }} + /> ); } return ( diff --git a/dashboard/src/pages/Admin/Storage/storage.module.less b/dashboard/src/pages/Admin/Storage/storage.module.less index 23ae5606..e694b6bb 100644 --- a/dashboard/src/pages/Admin/Storage/storage.module.less +++ b/dashboard/src/pages/Admin/Storage/storage.module.less @@ -8,16 +8,41 @@ .cardGrid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); - gap: 16px; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 20px; padding: 20px 0 40px; - @media (max-width: 640px) { + @media (max-width: 767px) { grid-template-columns: 1fr; gap: 12px; } } +.emptyGuideMascot { + display: block; + width: 120px; + height: 120px; + object-fit: contain; + user-select: none; + -webkit-user-drag: none; +} + +/* ── Group chip (local / object storage / sandbox / database) ───── */ + +.groupChip { + display: inline-flex; + align-items: center; + flex-shrink: 0; + padding: 0 7px; + border-radius: 9px; + font-size: 10px; + font-weight: 500; + line-height: 18px; + letter-spacing: 0; + text-transform: none; + white-space: nowrap; +} + /* ── Toolbar row above grid ─────────────────────────────────────── */ .gridToolbar { @@ -104,12 +129,22 @@ } .backendCardKind { + display: flex; + align-items: center; + gap: 6px; + min-width: 0; font-size: 11px; color: var(--fn-text-tertiary); margin-top: 2px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.04em; + + > span:first-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } } .backendCardInfo { diff --git a/dashboard/src/pages/Admin/Storage/useStorageBackends.tsx b/dashboard/src/pages/Admin/Storage/useStorageBackends.tsx index c390a7fa..14e2eef3 100644 --- a/dashboard/src/pages/Admin/Storage/useStorageBackends.tsx +++ b/dashboard/src/pages/Admin/Storage/useStorageBackends.tsx @@ -13,6 +13,7 @@ import { Archive, Package, Container, + Box, } from "lucide-react"; import { request } from "../../../api/request"; @@ -58,6 +59,7 @@ export const AGENT_RESOLVABLE_STORAGE_KINDS = new Set([ "shell", "postgres", "docker", + "opensandbox", ]); export function isAgentResolvableStorageKind(kind: string): boolean { @@ -286,6 +288,38 @@ export const STORAGE_TYPE_DEFS: StorageTypeDef[] = [ }, ], }, + { + kind: "opensandbox", + nameKey: "storage.kindOpensandbox", + descKey: "storage.descOpensandbox", + color: "#0f766e", + icon: , + fields: [ + { + key: "bucket", + labelKey: "storage.dockerImageLabel", + requiredMessageKey: "storage.pleaseEnterDockerImage", + required: true, + placeholder: "python:3.12", + }, + { + key: "endpoint", + labelKey: "storage.opensandboxDomainLabel", + placeholder: "localhost:8080", + }, + { + key: "secret_key", + labelKey: "storage.opensandboxApiKeyLabel", + secret: true, + placeholder: "sk-…", + }, + { + key: "region", + labelKey: "storage.opensandboxProtocolLabel", + placeholder: "http", + }, + ], + }, { kind: "postgres", nameKey: "storage.kindPostgres", @@ -371,6 +405,41 @@ export const STORAGE_KINDS = STORAGE_TYPE_DEFS.map((t) => ({ labelKey: t.nameKey, })); +export interface StorageTypeGroup { + id: string; + titleKey: string; + kinds: readonly string[]; +} + +export const STORAGE_TYPE_GROUPS: StorageTypeGroup[] = [ + { + id: "local", + titleKey: "storage.groupLocal", + kinds: ["filesystem", "shell"], + }, + { + id: "object", + titleKey: "storage.groupObject", + kinds: ["cos", "s3", "oss", "obs", "custom"], + }, + { + id: "sandbox", + titleKey: "storage.groupSandbox", + kinds: ["docker", "opensandbox"], + }, + { + id: "database", + titleKey: "storage.groupDatabase", + kinds: ["postgres"], + }, +]; + +/** Group a backend kind belongs to (local / object / sandbox / database). */ +export function storageKindGroup(kind: string): StorageTypeGroup | undefined { + const normalized = kind.toLowerCase(); + return STORAGE_TYPE_GROUPS.find((g) => g.kinds.includes(normalized)); +} + export interface UseStorageBackendsResult { backends: StorageBackendRow[]; loading: boolean; diff --git a/src/octop/api/routers/storage_backends.py b/src/octop/api/routers/storage_backends.py index 119573d3..41b303e1 100644 --- a/src/octop/api/routers/storage_backends.py +++ b/src/octop/api/routers/storage_backends.py @@ -8,13 +8,23 @@ from pydantic import BaseModel from octop.api.deps import current_user, get_server, require_permission -from octop.infra.backend.adapter import row_to_backend_spec -from octop.infra.backend.docker_spec import docker_spec_previewable +from octop.infra.backend.adapter import row_to_backend_spec, storage_spec_previewable from octop.infra.errors import ErrorCode, OctopError admin_router = APIRouter() +def _ensure_opensandbox_sdk(kind: str) -> None: + if kind != "opensandbox": + return + from octop.infra.backend.opensandbox_deps import ensure_opensandbox_deps + + try: + ensure_opensandbox_deps(allow_install=True) + except RuntimeError as exc: + raise OctopError(ErrorCode.STORAGE_BACKEND_DEPS_FAILED, str(exc)) from exc + + class StorageBackendCreateBody(BaseModel): name: str kind: str @@ -71,7 +81,7 @@ def _row_to_dict(r: Any) -> dict[str, Any]: "config_json": r.config_json, "note": r.note, "enabled": bool(r.enabled), - "previewable": docker_spec_previewable(spec) if spec is not None else False, + "previewable": storage_spec_previewable(spec) if spec is not None else False, "created_at": r.created_at, "updated_at": r.updated_at, } @@ -93,6 +103,7 @@ async def create_storage_backend( ) -> dict[str, Any]: if server.services.storage_backend_repo.get_by_name(body.name) is not None: raise OctopError(ErrorCode.STORAGE_BACKEND_NAME_TAKEN, f"name {body.name!r} already exists") + _ensure_opensandbox_sdk((body.kind or "").lower()) bid = server.services.storage_backend_repo.create( name=body.name, kind=body.kind, @@ -117,6 +128,9 @@ async def patch_storage_backend( row = server.services.storage_backend_repo.get(backend_id) if row is None: raise OctopError(ErrorCode.NOT_FOUND, "storage backend not found") + next_kind = (body.kind or row.kind or "").lower() + if body.enabled is True: + _ensure_opensandbox_sdk(next_kind) server.services.storage_backend_repo.update( backend_id, kind=body.kind, diff --git a/src/octop/infra/backend/adapter.py b/src/octop/infra/backend/adapter.py index 12e45327..1b19d6b8 100644 --- a/src/octop/infra/backend/adapter.py +++ b/src/octop/infra/backend/adapter.py @@ -9,8 +9,21 @@ _OBJECT_KINDS = frozenset({"cos", "s3", "oss", "obs", "custom"}) _AGENT_RESOLVABLE_KINDS = frozenset( - {"cos", "s3", "oss", "obs", "custom", "filesystem", "shell", "postgres", "docker"} + { + "cos", + "s3", + "oss", + "obs", + "custom", + "filesystem", + "shell", + "postgres", + "docker", + "opensandbox", + } ) +_OPENSANDBOX_PROTOCOLS = frozenset({"http", "https"}) +_DEFAULT_OPENSANDBOX_IMAGE = "python:3.12" def storage_backend_kind_agent_resolvable(kind: str) -> bool: @@ -136,4 +149,37 @@ def row_to_backend_spec(row: BackendRow) -> dict[str, Any] | None: apply_docker_cfg_keys(spec, cfg) return spec + if kind == "opensandbox": + image = cfg.get("image") or row.bucket or _DEFAULT_OPENSANDBOX_IMAGE + spec = {"type": "opensandbox", "image": str(image)} + api_key = row.secret_key or cfg.get("api_key") + if api_key: + spec["api_key"] = api_key + domain = row.endpoint or cfg.get("domain") + if domain: + spec["domain"] = str(domain) + protocol = str(row.region or cfg.get("protocol") or "http").strip().lower() + spec["protocol"] = protocol if protocol in _OPENSANDBOX_PROTOCOLS else "http" + for key in ("timeout", "command_timeout", "use_server_proxy"): + if key in cfg: + spec[key] = cfg[key] + return spec + return None + + +def storage_spec_previewable(spec: Any) -> bool: + """Whether Admin storage UI may browse this backend's files. + + OpenSandbox is an agent-lifecycle remote sandbox (create on start, destroy + on stop), so it is not browseable unless ``previewable`` is set. + """ + if not isinstance(spec, dict): + return True + if str(spec.get("type") or "").lower() == "opensandbox": + if "previewable" in spec: + return bool(spec["previewable"]) + return False + from octop.infra.backend.docker_spec import docker_spec_previewable + + return docker_spec_previewable(spec) diff --git a/src/octop/infra/backend/opensandbox_deps.py b/src/octop/infra/backend/opensandbox_deps.py new file mode 100644 index 00000000..ab3e6242 --- /dev/null +++ b/src/octop/infra/backend/opensandbox_deps.py @@ -0,0 +1,37 @@ +"""On-demand install of the official ``opensandbox`` SDK.""" + +from __future__ import annotations + +import importlib.util + +from octop.infra.utils.runtime_packages import PackageInstallSpec, install_packages + +_OPENSANDBOX_SPEC = PackageInstallSpec(packages=("opensandbox>=0.1.16,<0.2",)) + + +def opensandbox_sdk_available() -> bool: + return importlib.util.find_spec("opensandbox") is not None + + +def ensure_opensandbox_deps(*, allow_install: bool = True) -> str: + """Ensure the OpenSandbox SDK can be imported. + + Admin enable / probe / agent start pass ``allow_install=True``. Returns + ``\"ready\"`` or ``\"installed\"``. + """ + if opensandbox_sdk_available(): + return "ready" + if not allow_install: + raise RuntimeError( + "OpenSandbox SDK is not installed. Enable this backend to install it automatically." + ) + outcome = install_packages( + _OPENSANDBOX_SPEC, + is_satisfied=opensandbox_sdk_available, + import_modules=("opensandbox",), + ) + if not opensandbox_sdk_available(): + raise RuntimeError( + "OpenSandbox SDK was installed but could not be loaded. Restart the server and try again." + ) + return outcome diff --git a/src/octop/infra/backend/probe.py b/src/octop/infra/backend/probe.py index bc72ea03..7442864e 100644 --- a/src/octop/infra/backend/probe.py +++ b/src/octop/infra/backend/probe.py @@ -77,6 +77,9 @@ def probe_storage_backend(row: BackendRow) -> dict[str, Any]: if kind == "docker": return _probe_docker(row) + if kind == "opensandbox": + return _probe_opensandbox(row) + spec = row_to_backend_spec(row) if spec is None: return {"ok": False, "message": "configuration incomplete"} @@ -212,3 +215,21 @@ def _probe_docker(row: BackendRow) -> dict[str, Any]: with contextlib.suppress(Exception): close() shutil.rmtree(workspace, ignore_errors=True) + + +def _probe_opensandbox(row: BackendRow) -> dict[str, Any]: + """Install the SDK if needed, then run harness write→read and destroy the sandbox.""" + from octop.infra.backend.opensandbox_deps import ensure_opensandbox_deps + + try: + ensure_opensandbox_deps(allow_install=True) + except RuntimeError as exc: + return {"ok": False, "message": str(exc)} + + spec = row_to_backend_spec(row) + if spec is None: + return {"ok": False, "message": "configuration incomplete"} + result = probe_backend(spec) + if result.get("ok"): + result["message_key"] = "opensandbox_probe_ok" + return result diff --git a/src/octop/infra/backend/resolver.py b/src/octop/infra/backend/resolver.py index a34c6ab3..75494713 100644 --- a/src/octop/infra/backend/resolver.py +++ b/src/octop/infra/backend/resolver.py @@ -173,13 +173,11 @@ def backend_spec_supports_execution(spec: Any) -> bool: if spec is None: return True if isinstance(spec, str): - return spec in {"local_shell", "docker"} + return spec in {"local_shell", "docker", "opensandbox"} if not isinstance(spec, dict): return False kind = spec.get("type") - if kind == "local_shell": - return True - if kind == "docker": + if kind in {"local_shell", "docker", "opensandbox"}: return True if kind == "composite": if backend_spec_supports_execution(spec.get("default")): diff --git a/tests/unit/backend/test_opensandbox_deps.py b/tests/unit/backend/test_opensandbox_deps.py new file mode 100644 index 00000000..c0266a86 --- /dev/null +++ b/tests/unit/backend/test_opensandbox_deps.py @@ -0,0 +1,25 @@ +"""Tests for on-demand OpenSandbox SDK install.""" + +from __future__ import annotations + +from octop.infra.backend import opensandbox_deps + + +def test_ensure_opensandbox_deps_ready_when_importable(monkeypatch) -> None: + monkeypatch.setattr(opensandbox_deps, "opensandbox_sdk_available", lambda: True) + assert opensandbox_deps.ensure_opensandbox_deps() == "ready" + + +def test_ensure_opensandbox_deps_installs(monkeypatch) -> None: + state = {"ok": False} + + def _available() -> bool: + return state["ok"] + + def _install(*_a, **_k) -> str: + state["ok"] = True + return "installed" + + monkeypatch.setattr(opensandbox_deps, "opensandbox_sdk_available", _available) + monkeypatch.setattr(opensandbox_deps, "install_packages", _install) + assert opensandbox_deps.ensure_opensandbox_deps(allow_install=True) == "installed" diff --git a/tests/unit/test_storage_probe.py b/tests/unit/test_storage_probe.py index 69d0ef2a..1a3dff3f 100644 --- a/tests/unit/test_storage_probe.py +++ b/tests/unit/test_storage_probe.py @@ -161,3 +161,40 @@ def _resolve(spec: dict[str, Any], workspace_dir: Any = None) -> Any: assert result["ok"] is True assert captured["spec"]["username"] == "test" assert captured["spec"]["sandbox_scope"] == "user" + + +def test_opensandbox_probe_installs_and_closes(monkeypatch: pytest.MonkeyPatch) -> None: + from octop.infra.backend import opensandbox_deps + from octop.infra.backend import probe as probe_mod + + monkeypatch.setattr( + opensandbox_deps, "ensure_opensandbox_deps", lambda allow_install=True: "ready" + ) + monkeypatch.setattr( + probe_mod, + "probe_backend", + lambda spec: {"ok": True, "message": "ok"}, + ) + + result = probe_storage_backend( + _row( + kind="opensandbox", + bucket="python:3.12", + endpoint="localhost:8080", + secret_key="sk", + ) + ) + assert result["ok"] is True + assert result.get("message_key") == "opensandbox_probe_ok" + + +def test_opensandbox_probe_reports_install_failure(monkeypatch: pytest.MonkeyPatch) -> None: + from octop.infra.backend import opensandbox_deps + + def _boom(*, allow_install: bool = True) -> str: + raise RuntimeError("Could not install optional Python components automatically.") + + monkeypatch.setattr(opensandbox_deps, "ensure_opensandbox_deps", _boom) + result = probe_storage_backend(_row(kind="opensandbox", bucket="python:3.12")) + assert result["ok"] is False + assert "install" in result["message"].lower() diff --git a/tests/unit/test_storage_spec.py b/tests/unit/test_storage_spec.py index 4e87245f..eacecf8d 100644 --- a/tests/unit/test_storage_spec.py +++ b/tests/unit/test_storage_spec.py @@ -69,6 +69,8 @@ def test_backend_spec_supports_execution() -> None: assert backend_spec_supports_execution({"type": "local_shell", "virtual_mode": True}) assert backend_spec_supports_execution({"type": "docker", "image": "python:3.12-slim"}) assert backend_spec_supports_execution("docker") + assert backend_spec_supports_execution({"type": "opensandbox", "image": "python:3.12"}) + assert backend_spec_supports_execution("opensandbox") assert not backend_spec_supports_execution({"type": "filesystem", "virtual_mode": True}) assert not backend_spec_supports_execution({"type": "state"}) assert backend_spec_supports_execution( @@ -84,6 +86,37 @@ def test_storage_backend_kind_agent_resolvable() -> None: assert storage_backend_kind_agent_resolvable("cos") assert storage_backend_kind_agent_resolvable("filesystem") assert storage_backend_kind_agent_resolvable("docker") + assert storage_backend_kind_agent_resolvable("opensandbox") + + +def test_row_to_backend_spec_opensandbox() -> None: + from octop.infra.backend.adapter import storage_spec_previewable + + row = BackendRow( + id=1, + name="osb", + kind="opensandbox", + endpoint="127.0.0.1:8080", + access_key=None, + secret_key="sk-test", + bucket="python:3.12", + region="https", + config_json='{"timeout": 120, "use_server_proxy": true}', + note=None, + enabled=1, + created_at=0, + updated_at=0, + ) + assert row_to_backend_spec(row) == { + "type": "opensandbox", + "image": "python:3.12", + "api_key": "sk-test", + "domain": "127.0.0.1:8080", + "protocol": "https", + "timeout": 120, + "use_server_proxy": True, + } + assert storage_spec_previewable(row_to_backend_spec(row)) is False def test_row_to_backend_spec_docker() -> None: From c62ec8e945684b26487cb3d0c18bddd16f6f74aa Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Sun, 6 Sep 2026 01:25:12 +0000 Subject: [PATCH 54/58] feat(plugins): add per-agent plugin toggle, move plugin config to Personalization --- dashboard/src/api/modules/plugins.ts | 30 ++ .../Admin/Plugins/InstalledPluginsPanel.tsx | 260 +----------- .../components/AgentPluginsPanel.module.less | 46 +++ .../components/AgentPluginsPanel.tsx | 369 ++++++++++++++++++ .../src/pages/Agent/Personalization/index.tsx | 17 + .../src/pages/Agent/Tools/ToolsPanel.tsx | 12 +- dashboard/src/routes/index.tsx | 1 + src/octop/api/routers/agent_tools.py | 61 +-- src/octop/api/routers/plugins.py | 141 ++++++- src/octop/infra/agents/manager.py | 99 ++++- .../infra/agents/plugin_tool_defaults.py | 26 ++ src/octop/infra/agents/plugins/manager.py | 38 +- src/octop/infra/agents/tool_catalog.py | 18 +- tests/integration/test_plugin_tool_disable.py | 104 +++-- tests/integration/test_plugin_upload.py | 6 + tests/unit/agents/test_mcp_tool_cache.py | 2 +- .../unit/agents/test_plugin_tool_defaults.py | 26 ++ 17 files changed, 881 insertions(+), 375 deletions(-) create mode 100644 dashboard/src/pages/Agent/Personalization/components/AgentPluginsPanel.module.less create mode 100644 dashboard/src/pages/Agent/Personalization/components/AgentPluginsPanel.tsx diff --git a/dashboard/src/api/modules/plugins.ts b/dashboard/src/api/modules/plugins.ts index 636acfad..ec799a93 100644 --- a/dashboard/src/api/modules/plugins.ts +++ b/dashboard/src/api/modules/plugins.ts @@ -43,6 +43,7 @@ export interface AgentPluginTool { export type AgentPluginsConfig = Record< string, { + enabled?: boolean; tools?: Record< string, { @@ -53,6 +54,21 @@ export type AgentPluginsConfig = Record< } >; +export interface AgentPlugin { + id: string; + version?: string | null; + name?: string | null; + kind?: string | null; + description?: string | null; + icon?: string | null; + loaded: boolean; + global_enabled: boolean; + agent_enabled: boolean; + /** Effective state: global and Agent switches must both be enabled. */ + enabled: boolean; + tools: InstalledPlugin["tools"]; +} + export const pluginsApi = { list(): Promise { return request("/plugins"); @@ -110,4 +126,18 @@ export const pluginsApi = { body: JSON.stringify({ plugins }), }); }, + + listAgentPlugins(agentId: string): Promise<{ plugins: AgentPlugin[] }> { + return request(`/plugins/agents/${encodeURIComponent(agentId)}`); + }, + + patchAgentPlugins( + agentId: string, + plugins: Record, + ): Promise<{ plugins: AgentPlugin[] }> { + return request(`/plugins/agents/${encodeURIComponent(agentId)}`, { + method: "PATCH", + body: JSON.stringify({ plugins }), + }); + }, }; diff --git a/dashboard/src/pages/Admin/Plugins/InstalledPluginsPanel.tsx b/dashboard/src/pages/Admin/Plugins/InstalledPluginsPanel.tsx index 883f54b7..4aa302da 100644 --- a/dashboard/src/pages/Admin/Plugins/InstalledPluginsPanel.tsx +++ b/dashboard/src/pages/Admin/Plugins/InstalledPluginsPanel.tsx @@ -12,9 +12,7 @@ import { Collapse, Drawer, Empty, - Form, Input, - InputNumber, Modal, Popconfirm, Segmented, @@ -31,22 +29,13 @@ import { List, Package, Plus, - Settings2, Trash2, Upload, - Wrench, } from "lucide-react"; import { useTranslation } from "react-i18next"; -import { - pluginsApi, - type AgentPluginTool, - type AgentPluginsConfig, - type InstalledPlugin, - type PluginConfigField, -} from "../../../api/modules/plugins"; +import { pluginsApi, type InstalledPlugin } from "../../../api/modules/plugins"; import { ResizableTable } from "../../../components/ResizableTable"; import { CardSkeleton } from "../../../components/Skeleton"; -import { useAgent } from "../../../context/AgentContext"; import { useCardTableView } from "../../../hooks/useCardTableView"; import { ensureBuiltinToolRenderers, @@ -76,57 +65,10 @@ function statusTag(row: InstalledPlugin, t: (key: string) => string) { ); } -function buildPluginsConfig(tools: AgentPluginTool[]): AgentPluginsConfig { - const out: AgentPluginsConfig = {}; - for (const tool of tools) { - if (!out[tool.plugin_id]) out[tool.plugin_id] = { tools: {} }; - out[tool.plugin_id].tools![tool.name] = { - enabled: tool.enabled, - config: { ...tool.config }, - }; - } - return out; -} - -function renderConfigField(field: PluginConfigField) { - const common = { - label: field.label || field.name, - name: field.name, - rules: field.required - ? [{ required: true, message: field.label || field.name }] - : undefined, - extra: field.help, - }; - if (field.type === "password") { - return ( - - - - ); - } - if (field.type === "number") { - return ( - - - - ); - } - return ( - - - - ); -} - -/** Server-wide plugin install / uninstall list (+ per-agent tools in detail). */ +/** Server-wide plugin install, reload, enable, detail, and uninstall surface. */ export function InstalledPluginsPanel() { const { t } = useTranslation(); - const { activeAgentId } = useAgent(); const [plugins, setPlugins] = useState([]); - const [agentTools, setAgentTools] = useState([]); const [loading, setLoading] = useState(true); const [installOpen, setInstallOpen] = useState(false); const [installUrl, setInstallUrl] = useState(""); @@ -136,17 +78,9 @@ export function InstalledPluginsPanel() { const [overwrite, setOverwrite] = useState(false); const [reloading, setReloading] = useState(false); const [togglingId, setTogglingId] = useState(null); - const [toolSavingKey, setToolSavingKey] = useState(null); const [detail, setDetail] = useState(null); - const [configTool, setConfigTool] = useState(null); - const [form] = Form.useForm(); - const agentRef = useRef(activeAgentId); const { viewMode, setViewMode, showCardView } = useCardTableView("card"); - useEffect(() => { - agentRef.current = activeAgentId; - }, [activeAgentId]); - const fetchPlugins = useCallback(async () => { setLoading(true); try { @@ -163,30 +97,10 @@ export function InstalledPluginsPanel() { } }, [t]); - const fetchAgentTools = useCallback(async () => { - if (!activeAgentId) { - setAgentTools([]); - return; - } - const agentId = activeAgentId; - try { - const data = await pluginsApi.listAgentTools(agentId); - if (agentRef.current === agentId) { - setAgentTools(data.tools || []); - } - } catch (err) { - console.error(err); - } - }, [activeAgentId]); - useEffect(() => { void fetchPlugins(); }, [fetchPlugins]); - useEffect(() => { - void fetchAgentTools(); - }, [fetchAgentTools]); - const handleInstall = async () => { const url = installUrl.trim(); if (!url) return; @@ -197,7 +111,6 @@ export function InstalledPluginsPanel() { setInstallOpen(false); setInstallUrl(""); await fetchPlugins(); - await fetchAgentTools(); } catch (err) { message.error(apiErrorMessage(err, t("plugins.installFailed"), t)); } finally { @@ -218,7 +131,6 @@ export function InstalledPluginsPanel() { await pluginsApi.upload(next, overwrite); message.success(t("plugins.installSuccess")); await fetchPlugins(); - await fetchAgentTools(); } catch (err) { message.error(apiErrorMessage(err, t("plugins.installFailed"), t)); } finally { @@ -232,7 +144,6 @@ export function InstalledPluginsPanel() { await pluginsApi.reload(); message.success(t("plugins.reloadSuccess")); await fetchPlugins(); - await fetchAgentTools(); } catch (err) { message.error(apiErrorMessage(err, t("plugins.reloadFailed"), t)); } finally { @@ -246,7 +157,6 @@ export function InstalledPluginsPanel() { message.success(t("plugins.uninstallSuccess")); if (detail?.id === pluginId) setDetail(null); await fetchPlugins(); - await fetchAgentTools(); } catch (err) { message.error(apiErrorMessage(err, t("plugins.uninstallFailed"), t)); } @@ -271,7 +181,6 @@ export function InstalledPluginsPanel() { enabled ? t("plugins.enabledSuccess") : t("plugins.disabledSuccess"), ); await fetchPlugins(); - await fetchAgentTools(); } catch (err) { message.error(apiErrorMessage(err, t("plugins.enableFailed"), t)); } finally { @@ -279,63 +188,6 @@ export function InstalledPluginsPanel() { } }; - const toolKey = (tool: AgentPluginTool) => `${tool.plugin_id}:${tool.name}`; - - const persistTools = useCallback(async (nextTools: AgentPluginTool[]) => { - const agentId = agentRef.current; - if (!agentId) return; - await pluginsApi.patchAgentTools(agentId, buildPluginsConfig(nextTools)); - if (agentRef.current === agentId) setAgentTools(nextTools); - }, []); - - const handleToggleTool = async (tool: AgentPluginTool, enabled: boolean) => { - const key = toolKey(tool); - setToolSavingKey(key); - const next = agentTools.map((row) => - row.plugin_id === tool.plugin_id && row.name === tool.name - ? { ...row, enabled } - : row, - ); - try { - await persistTools(next); - message.success(t("plugins.saved")); - } catch (err) { - message.error(apiErrorMessage(err, t("plugins.saveFailed"), t)); - } finally { - setToolSavingKey(null); - } - }; - - const openConfig = (tool: AgentPluginTool) => { - setConfigTool(tool); - form.setFieldsValue(tool.config || {}); - }; - - const saveConfig = async () => { - if (!configTool) return; - const values = await form.validateFields(); - const next = agentTools.map((row) => - row.plugin_id === configTool.plugin_id && row.name === configTool.name - ? { ...row, config: values, enabled: true } - : row, - ); - setToolSavingKey(toolKey(configTool)); - try { - await persistTools(next); - message.success(t("plugins.saved")); - setConfigTool(null); - } catch (err) { - message.error(apiErrorMessage(err, t("plugins.saveFailed"), t)); - } finally { - setToolSavingKey(null); - } - }; - - const detailTools = - detail == null - ? [] - : agentTools.filter((tool) => tool.plugin_id === detail.id); - const columns = [ { title: t("plugins.colName"), @@ -735,118 +587,10 @@ export function InstalledPluginsPanel() {
    - -
    -
    -

    - {t("plugins.colTools")} -

    - {detailTools.length > 0 ? ( - - {detailTools.length} - - ) : null} -
    - {!activeAgentId ? ( -
    {t("plugins.noAgent")}
    - ) : detail.enabled === false ? ( -
    - {t("plugins.enablePluginFirst")} -
    - ) : detailTools.length === 0 ? ( -
    - {t("plugins.noToolsListed")} -
    - ) : ( - <> -

    - {t("plugins.detailToolsHint")} -

    -
    - {detailTools.map((tool) => { - const key = toolKey(tool); - const busy = toolSavingKey === key; - const hasConfig = (tool.config_fields?.length ?? 0) > 0; - return ( -
    - - - -
    -
    - - {tool.name} - - {hasConfig ? ( - - {t("plugins.hasConfig")} - - ) : null} -
    - {tool.description ? ( -
    - {tool.description} -
    - ) : null} -
    -
    - {hasConfig ? ( -
    -
    - ); - })} -
    - - )} -
    ) : null} - setConfigTool(null)} - width={420} - destroyOnHidden - extra={ - - } - > - - {configTool?.config_fields?.map(renderConfigField)} - - - + + + ); + } + if (field.type === "number") { + return ( + + + + ); + } + return ( + + + + ); +} + +export default function AgentPluginsPanel({ agentId }: AgentPluginsPanelProps) { + const { t } = useTranslation(); + const [plugins, setPlugins] = useState([]); + const [tools, setTools] = useState([]); + const [loading, setLoading] = useState(false); + const [saving, setSaving] = useState(null); + const [detailId, setDetailId] = useState(null); + const [configTool, setConfigTool] = useState(null); + const [form] = Form.useForm(); + + const load = useCallback(async () => { + if (!agentId) { + setPlugins([]); + setTools([]); + return; + } + setLoading(true); + try { + const [pluginResult, toolResult] = await Promise.all([ + pluginsApi.listAgentPlugins(agentId), + pluginsApi.listAgentTools(agentId), + ]); + setPlugins(pluginResult.plugins); + setTools(toolResult.tools); + } catch (error) { + message.error(apiErrorMessage(error, t("plugins.loadError"), t)); + } finally { + setLoading(false); + } + }, [agentId, t]); + + useEffect(() => { + // Defer to a microtask so the initial setLoading(true) inside `load` + // doesn't run synchronously within the effect body. + queueMicrotask(() => { + void load(); + }); + }, [load]); + + const detail = plugins.find((plugin) => plugin.id === detailId) ?? null; + const detailTools = useMemo( + () => tools.filter((tool) => tool.plugin_id === detailId), + [detailId, tools], + ); + + const togglePlugin = async (plugin: AgentPlugin, enabled: boolean) => { + if (!agentId || !plugin.global_enabled) return; + setSaving(`plugin:${plugin.id}`); + try { + const result = await pluginsApi.patchAgentPlugins(agentId, { + [plugin.id]: { enabled }, + }); + setPlugins(result.plugins); + message.success(t("plugins.saved")); + } catch (error) { + message.error(apiErrorMessage(error, t("plugins.saveFailed"), t)); + } finally { + setSaving(null); + } + }; + + const persistTools = async (next: AgentPluginTool[]) => { + if (!agentId) return; + await pluginsApi.patchAgentTools(agentId, toolsConfig(next)); + setTools(next); + }; + + const toggleTool = async (tool: AgentPluginTool, enabled: boolean) => { + const key = `tool:${tool.plugin_id}:${tool.name}`; + setSaving(key); + const next = tools.map((item) => + item.plugin_id === tool.plugin_id && item.name === tool.name + ? { ...item, enabled } + : item, + ); + try { + await persistTools(next); + message.success(t("plugins.saved")); + } catch (error) { + message.error(apiErrorMessage(error, t("plugins.saveFailed"), t)); + } finally { + setSaving(null); + } + }; + + const openConfig = (tool: AgentPluginTool) => { + setConfigTool(tool); + form.setFieldsValue(tool.config); + }; + + const saveConfig = async () => { + if (!configTool) return; + const values = await form.validateFields(); + const key = `tool:${configTool.plugin_id}:${configTool.name}`; + setSaving(key); + try { + await persistTools( + tools.map((item) => + item.plugin_id === configTool.plugin_id && + item.name === configTool.name + ? { ...item, config: values } + : item, + ), + ); + setConfigTool(null); + message.success(t("plugins.saved")); + } catch (error) { + message.error(apiErrorMessage(error, t("plugins.saveFailed"), t)); + } finally { + setSaving(null); + } + }; + + if (!agentId) { + return ( + + ); + } + if (loading) { + return ( +
    + +
    + ); + } + if (plugins.length === 0) { + return ; + } + + return ( +
    +
    + + {t("plugins.agentPluginHint")} +
    +
    + {plugins.map((plugin) => ( +
    +
    +
    + +
    +

    + {plugin.name || plugin.id} +

    +
    + {plugin.kind ? {plugin.kind} : null} + {!plugin.global_enabled ? ( + {t("plugins.globallyDisabled")} + ) : null} +
    +
    +
    +

    + {plugin.description || t("plugins.noDescription")} +

    +
    +
    + + + void togglePlugin(plugin, checked)} + /> +
    +
    + ))} +
    + + setDetailId(null)} + width={500} + destroyOnHidden + > + {detail ? ( + <> + {!detail.global_enabled ? ( + + ) : null} +

    + {detail.description || t("plugins.noDescription")} +

    +
    + {t("plugins.agentEnabled")} + void togglePlugin(detail, checked)} + /> +
    +

    {t("plugins.colTools")}

    + {detailTools.length === 0 ? ( + + ) : ( +
    + {detailTools.map((tool) => { + const key = `tool:${tool.plugin_id}:${tool.name}`; + const configurable = (tool.config_fields?.length ?? 0) > 0; + return ( +
    + + + +
    +
    + {tool.name} +
    + {tool.description ? ( +
    + {tool.description} +
    + ) : null} +
    +
    + {configurable ? ( +
    +
    + ); + })} +
    + )} + + ) : null} +
    + + setConfigTool(null)} + width={420} + destroyOnHidden + extra={ + + } + > +
    + {configTool?.config_fields.map(configField)} +
    +
    +
    + ); +} diff --git a/dashboard/src/pages/Agent/Personalization/index.tsx b/dashboard/src/pages/Agent/Personalization/index.tsx index 7db33599..d9f93890 100644 --- a/dashboard/src/pages/Agent/Personalization/index.tsx +++ b/dashboard/src/pages/Agent/Personalization/index.tsx @@ -5,6 +5,7 @@ import { Bot, Brain, Notebook, + Puzzle, Sparkles, Waypoints, Wrench, @@ -19,6 +20,7 @@ import SkillsTabs from "../Skills/components/SkillsTabs"; import ToolsPanel from "../Tools/ToolsPanel"; import SubagentManager from "../../Experts/components/SubagentManager"; import MBTISelector from "./components/MBTISelector"; +import AgentPluginsPanel from "./components/AgentPluginsPanel"; import MemoryPanel from "../Memory/MemoryPanel"; import ChannelsPanel from "../Channels/ChannelsPanel"; import styles from "./index.module.less"; @@ -27,6 +29,7 @@ export type PersonalizationTab = | "skills" | "subagents" | "tools" + | "plugins" | "mbti" | "memory" | "channels"; @@ -35,6 +38,7 @@ const PERSONALIZATION_TABS = [ "skills", "subagents", "tools", + "plugins", "mbti", "memory", "channels", @@ -44,6 +48,7 @@ const TAB_ICONS = { skills: Sparkles, subagents: Bot, tools: Wrench, + plugins: Puzzle, mbti: Brain, memory: Notebook, channels: Waypoints, @@ -124,6 +129,18 @@ export default function PersonalizationPage() {
    )} + {isMounted("plugins") && ( +
    +
    + +
    +
    + )} + {isMounted("subagents") && (
    = { mobile: "#0EA5E9", teams: "#F97316", misc: "#64748B", - plugin: "#A855F7", }; const TOOL_ICONS: Record = { @@ -142,8 +140,7 @@ interface ToolsPanelProps { } /** - * Full tools surface (builtin + plugin), shared by Personalization tab and - * Experts ToolCatalogDrawer — mirrors SkillsTabs. + * Built-in tools surface shared by Personalization and Experts. */ export default function ToolsPanel({ agentId }: ToolsPanelProps) { const { t } = useTranslation(); @@ -161,9 +158,12 @@ export default function ToolsPanel({ agentId }: ToolsPanelProps) { setLoading(true); try { const res = await agentToolsApi.get(agentId); - setTools(res.tools); + const builtinTools = res.tools.filter( + (tool) => tool.source === "builtin", + ); + setTools(builtinTools); const next: Record = {}; - for (const tool of res.tools) { + for (const tool of builtinTools) { next[toolKey(tool)] = tool.enabled; } setEnabledMap(next); diff --git a/dashboard/src/routes/index.tsx b/dashboard/src/routes/index.tsx index 3b656f3d..9c18d72a 100644 --- a/dashboard/src/routes/index.tsx +++ b/dashboard/src/routes/index.tsx @@ -57,6 +57,7 @@ export const pathToKey: Record = { "/personalization": "personalization", "/personalization/skills": "personalization", "/personalization/tools": "personalization", + "/personalization/plugins": "personalization", "/personalization/subagents": "personalization", "/personalization/channels": "channels", "/personalization/mbti": "personalization", diff --git a/src/octop/api/routers/agent_tools.py b/src/octop/api/routers/agent_tools.py index af48e827..904c8b49 100644 --- a/src/octop/api/routers/agent_tools.py +++ b/src/octop/api/routers/agent_tools.py @@ -60,67 +60,9 @@ class ToolSettingPatchBody(BaseModel): plugin_id: str | None = None -def _plugin_manager(server: OctopServer) -> Any: - mgr = server.plugin_manager - if mgr is None: - raise OctopError(ErrorCode.INTERNAL_ERROR, "plugin manager not initialized") - return mgr - - -def _plugin_tool_label(name: str, locale: str) -> str: - """Use i18n label when present; otherwise keep the raw tool name.""" - labeled = tool_display_name(name, locale) - return labeled if labeled != name else name - - -def _list_plugin_tool_items( - server: OctopServer, - agent_cfg: dict[str, Any], - *, - locale: str, -) -> list[ToolSettingsItem]: - mgr = _plugin_manager(server) - raw_plugins = agent_cfg.get("plugins") - plugins_cfg: dict[str, Any] = raw_plugins if isinstance(raw_plugins, dict) else {} - items: list[ToolSettingsItem] = [] - for plugin in mgr.list_installed(): - if plugin.get("error"): - continue - plugin_id = str(plugin["id"]) - globally_on = plugin.get("enabled", True) is not False - for tool in plugin.get("tools") or []: - name = str(tool["name"]) - tool_cfg: dict[str, Any] = {} - plugin_entry = plugins_cfg.get(plugin_id) - if isinstance(plugin_entry, dict): - tools_map = plugin_entry.get("tools") - if isinstance(tools_map, dict): - raw_tool = tools_map.get(name) - if isinstance(raw_tool, dict): - tool_cfg = raw_tool - desc = tool.get("description") - enabled = bool(tool_cfg.get("enabled")) if tool_cfg and "enabled" in tool_cfg else True - items.append( - ToolSettingsItem( - name=name, - source="plugin", - category="plugin", - label=_plugin_tool_label(name, locale), - description=( - str(desc).strip() if isinstance(desc, str) and desc.strip() else None - ), - enabled=enabled, - disableable=True, - available=globally_on, - plugin_id=plugin_id, - ) - ) - return items - - @router.get( "/{agent_id}/tool-settings", - summary="List built-in and plugin tools with enable state", + summary="List built-in tools with enable state", response_model=ToolSettingsResponse, ) async def get_tool_settings( @@ -160,7 +102,6 @@ async def get_tool_settings( plugin_id=None, ) ) - tools.extend(_list_plugin_tool_items(server, agent_cfg, locale=locale)) return ToolSettingsResponse(tools=tools) diff --git a/src/octop/api/routers/plugins.py b/src/octop/api/routers/plugins.py index 18344aad..bece8f85 100644 --- a/src/octop/api/routers/plugins.py +++ b/src/octop/api/routers/plugins.py @@ -13,7 +13,11 @@ from octop.api.common.agent import assert_agent_owner as _assert_agent_owner from octop.api.deps import current_user, get_server, require_permission -from octop.infra.agents.plugin_tool_defaults import merge_plugins_tool_settings +from octop.infra.agents.plugin_tool_defaults import ( + agent_plugin_enabled, + merge_plugins_enabled_settings, + merge_plugins_tool_settings, +) from octop.infra.agents.plugins.manager import PluginManager from octop.infra.errors import ErrorCode, OctopError from octop.infra.server import OctopServer @@ -51,6 +55,38 @@ class AgentPluginToolsPatch(BaseModel): plugins: dict[str, dict[str, Any]] +class PluginToolMeta(BaseModel): + name: str + description: str | None = None + config_fields: list[dict[str, Any]] = Field(default_factory=list) + + +class AgentPluginItem(BaseModel): + id: str + version: str | None = None + name: str | None = None + kind: str | None = None + description: str | None = None + icon: str | None = None + loaded: bool = False + global_enabled: bool = True + agent_enabled: bool = True + enabled: bool = True + tools: list[PluginToolMeta] = Field(default_factory=list) + + +class AgentPluginsResponse(BaseModel): + plugins: list[AgentPluginItem] + + +class AgentPluginEnabledPatch(BaseModel): + enabled: bool + + +class AgentPluginsPatch(BaseModel): + plugins: dict[str, AgentPluginEnabledPatch] + + def _plugin_manager(server: OctopServer) -> PluginManager: mgr = server.plugin_manager if mgr is None: @@ -63,13 +99,7 @@ async def list_plugins( server: OctopServer = Depends(get_server), _user: Any = Depends(current_user), ) -> list[dict[str, Any]]: - mgr = _plugin_manager(server) - # CLI installs only write to disk; pick them up when the admin list is opened. - newly = mgr.load_missing(install_deps=False) - if newly and server.app_runtime is not None: - await server.app_runtime.agent_registry.reload_all() - items: list[dict[str, Any]] = mgr.list_installed() - return items + return _plugin_manager(server).list_installed() @router.post("/reload", summary="Reload plugins from disk (admin)") @@ -230,6 +260,101 @@ async def get_plugin_ui_asset( ) +def _agent_row_and_config( + server: OctopServer, + agent_id: str, + user: Any, +) -> tuple[Any, dict[str, Any]]: + runtime = server.app_runtime + assert runtime is not None + registry = runtime.agent_registry + row = registry.get_row(agent_id) + if row is None: + raise OctopError(ErrorCode.AGENT_NOT_FOUND, f"agent {agent_id!r} not found") + _assert_agent_owner(row, user) + return row, registry.get_config(agent_id) + + +def _agent_plugins_response( + server: OctopServer, + agent_cfg: dict[str, Any], +) -> AgentPluginsResponse: + raw_plugins = agent_cfg.get("plugins") + plugins_cfg = raw_plugins if isinstance(raw_plugins, dict) else {} + items: list[AgentPluginItem] = [] + for plugin in _plugin_manager(server).list_installed(): + if plugin.get("error"): + continue + plugin_id = str(plugin["id"]) + global_enabled = plugin.get("enabled", True) is not False + per_agent_enabled = agent_plugin_enabled(plugins_cfg, plugin_id) + items.append( + AgentPluginItem( + id=plugin_id, + version=plugin.get("version"), + name=plugin.get("name"), + kind=plugin.get("kind"), + description=plugin.get("description"), + icon=plugin.get("icon"), + loaded=bool(plugin.get("loaded")), + global_enabled=global_enabled, + agent_enabled=per_agent_enabled, + enabled=global_enabled and per_agent_enabled, + tools=[PluginToolMeta.model_validate(tool) for tool in plugin.get("tools") or []], + ) + ) + return AgentPluginsResponse(plugins=items) + + +@router.get( + "/agents/{agent_id}", + summary="List installed plugins for an agent", + response_model=AgentPluginsResponse, +) +async def list_agent_plugins( + agent_id: str, + server: OctopServer = Depends(get_server), + user: Any = Depends(current_user), +) -> AgentPluginsResponse: + """List global and per-agent plugin state. Missing agent switches default on.""" + _, cfg = _agent_row_and_config(server, agent_id, user) + return _agent_plugins_response(server, cfg) + + +@router.patch( + "/agents/{agent_id}", + summary="Update agent plugin enablement", + response_model=AgentPluginsResponse, +) +async def patch_agent_plugins( + agent_id: str, + body: AgentPluginsPatch, + server: OctopServer = Depends(get_server), + user: Any = Depends(current_user), +) -> AgentPluginsResponse: + """Merge plugin switches, preserve tool settings, and reload only this agent.""" + _, cfg = _agent_row_and_config(server, agent_id, user) + installed = { + str(item["id"]) + for item in _plugin_manager(server).list_installed() + if not item.get("error") + } + unknown = sorted(set(body.plugins) - installed) + if unknown: + raise OctopError(ErrorCode.NOT_FOUND, f"plugin {unknown[0]!r} not found") + + runtime = server.app_runtime + assert runtime is not None + registry = runtime.agent_registry + merged = merge_plugins_enabled_settings( + cfg.get("plugins"), + {plugin_id: patch.enabled for plugin_id, patch in body.plugins.items()}, + ) + await registry.persist_plugin_tools_config(agent_id, merged) + await registry.reload(agent_id) + return _agent_plugins_response(server, registry.get_config(agent_id)) + + @router.get("/agents/{agent_id}/tools", summary="List plugin tools for an agent") async def list_agent_plugin_tools( agent_id: str, diff --git a/src/octop/infra/agents/manager.py b/src/octop/infra/agents/manager.py index d4db6b45..b1d0766f 100644 --- a/src/octop/infra/agents/manager.py +++ b/src/octop/infra/agents/manager.py @@ -580,6 +580,8 @@ async def create( else: agent = await self._start_agent(row, init_workspace=True) if agent is not None and spec.template_name: + if self._spec_is_opensandbox(self._backend_spec_for_row(row)): + await self._seed_expert_template(row, spec.template_name) reload = getattr(agent, "reload_subagents", None) if callable(reload): await asyncio.to_thread(reload) @@ -1145,7 +1147,7 @@ async def reload_connectors( self._connector_user_override[agent_id] = uid try: svc = self._connector_svc - for inst in self._repos.connector_repo.list_by_user(uid): + for inst in self._repos.connector_repo.list_visible(uid): if inst.status != "active": continue await svc.ensure_fresh_credentials(inst.instance_id, inst.kind) @@ -1178,11 +1180,10 @@ def invalidate_mcp_tool_cache(self, user_id: int | None = None) -> None: def mcp_server_labels_for_user(self, user_id: int) -> dict[str, str]: labels: dict[str, str] = {} - for inst in self._repos.connector_repo.list_by_user(user_id): - name = inst.mcp_server_name - labels[name] = (inst.display_name or name).strip() or name - for name in self._connector_svc.custom_harness_configs(user_id): - labels.setdefault(name, name) + for inst in self._connector_svc.list_instances_for_api(user_id): + name = str(inst["mcp_server_name"]) + display_name = str(inst.get("display_name") or name) + labels[name] = display_name.strip() or name return labels def resolve_tool_display_name_for_chat( @@ -1477,7 +1478,7 @@ async def _attach_gateway_tools( in-process injection at the end of ``_post_start_agent``. """ repo = self._repos.connector_repo - for inst in repo.list_by_user(user_id): + for inst in repo.list_visible(user_id): if inst.status != "active" or inst.mcp_server_name not in server_names: continue try: @@ -2083,7 +2084,12 @@ async def _post_start_agent( exc_info=True, ) if self._plugin_manager is not None: - await asyncio.to_thread(self._plugin_manager.sync_skills_to_workspace, ws) + agent_plugins = self.get_config(row.agent_id).get("plugins") + await asyncio.to_thread( + self._plugin_manager.sync_skills_to_workspace, + ws, + agent_plugins=agent_plugins, + ) # Patch config when bootstrap finishes, but defer graph recompile until # the in-flight turn has fully drained (sync _init_graph mid-stream segfaults). @@ -2168,6 +2174,10 @@ def _owner_username(self, row: AgentRow) -> str | None: return None return owner.username or None + @staticmethod + def _spec_is_opensandbox(spec: Any) -> bool: + return isinstance(spec, dict) and str(spec.get("type") or "").lower() == "opensandbox" + def _prepare_docker_backend(self, backend: Any, row: AgentRow) -> Any: """Inject Octop docker defaults (prefix / agent_id / username) without overwrite.""" if not isinstance(backend, dict) or backend.get("type") != "docker": @@ -2187,12 +2197,14 @@ def _backend_workspace_for_row( *, cfg: dict[str, Any] | None = None, workspace_dir: Path | None = None, + allow_ephemeral_remote: bool = False, ) -> Any: """Resolve :class:`BackendWorkspace` for *row* without a running harness agent.""" from harness_agent.backends import resolve_backend # noqa: PLC0415 from harness_agent.backends.workspace import BackendWorkspace # noqa: PLC0415 from octop.infra.agents.workspace_dir import system_files_path_from_config # noqa: PLC0415 + from octop.infra.backend.opensandbox_deps import ensure_opensandbox_deps # noqa: PLC0415 if cfg is None: cfg = self._agent_config_dict(row) @@ -2202,6 +2214,15 @@ def _backend_workspace_for_row( self._backend_spec_for_row(row, cfg=cfg, workspace_dir=workspace_dir), row, ) + if self._spec_is_opensandbox(backend) and not allow_ephemeral_remote: + # Stopped-agent / seed fallback: do not create a throwaway remote sandbox. + backend = { + "type": "filesystem", + "root_dir": str(workspace_dir), + "virtual_mode": True, + } + elif self._spec_is_opensandbox(backend): + ensure_opensandbox_deps(allow_install=True) return BackendWorkspace( resolve_backend(backend, workspace_dir=workspace_dir), workspace_dir, @@ -2236,7 +2257,23 @@ async def _seed_expert_template(self, row: AgentRow, template_name: str) -> None if not expert.files and not (expert_dir / MANIFEST_FILENAME).is_file(): return - workspace = self._backend_workspace_for_row(row) + if self._spec_is_opensandbox(self._backend_spec_for_row(row)): + if self._harness_manager is None: + logger.info( + "Agent %s: skip expert template seed until runtime (ephemeral OpenSandbox)", + row.agent_id, + ) + return + try: + workspace = self._harness_manager.get_agent(row.agent_id).agent.workspace + except KeyError: + logger.info( + "Agent %s: skip expert template seed until runtime (ephemeral OpenSandbox)", + row.agent_id, + ) + return + else: + workspace = self._backend_workspace_for_row(row) try: count = await seed_expert_directory( expert_dir=expert_dir, @@ -2403,7 +2440,12 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: cfg = self._agent_config_dict(row) backend = self._backend_spec_for_row(row, cfg=cfg, workspace_dir=workspace_dir) - ws = self._backend_workspace_for_row(row, cfg=cfg, workspace_dir=workspace_dir) + ws = self._backend_workspace_for_row( + row, + cfg=cfg, + workspace_dir=workspace_dir, + allow_ephemeral_remote=self._spec_is_opensandbox(backend), + ) cron_tools: list[Any] | None = None if self._cron_manager is not None: @@ -2436,6 +2478,7 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: from harness_agent.plugins import PluginRegistry, build_plugin_tools # noqa: PLC0415 from octop.infra.agents.plugin_tool_defaults import ( # noqa: PLC0415 + agent_plugin_enabled, expand_plugin_tools_default_on, ) @@ -2443,16 +2486,20 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: self._plugin_manager.global_enabled_map() if self._plugin_manager is not None else {} ) registered = [(reg.plugin_id, reg.name) for reg in PluginRegistry().all_tools()] - # Mount every globally-enabled plugin tool; per-agent ``enabled: false`` - # is enforced via ``tools_disabled`` so toggles can hot-sync without reload. + agent_plugins = cfg.get("plugins") + agent_plugins_map = agent_plugins if isinstance(agent_plugins, dict) else {} + effective_plugins = dict(global_plugins) + for plugin in PluginRegistry().list_plugins(): + if not agent_plugin_enabled(agent_plugins_map, plugin.manifest.id): + effective_plugins[plugin.manifest.id] = False mount_plugins = expand_plugin_tools_default_on( - None, + agent_plugins_map, registered_tools=registered, - global_plugins=global_plugins, + global_plugins=effective_plugins, ) plugin_tools = build_plugin_tools( agent_plugins=mount_plugins, - global_plugins=global_plugins, + global_plugins=effective_plugins, ) # Plugin authors may register tools with non-ASCII (e.g. Chinese) names, # which strict LLM tool-name APIs reject. Rewrite them to legal names @@ -2475,7 +2522,9 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: for tool in plugin_tools if (label := extract_original_plugin_label(str(getattr(tool, "description", "") or ""))) } - plugin_middleware = PluginRegistry().build_middleware_chain(global_enabled=global_plugins) + plugin_middleware = PluginRegistry().build_middleware_chain( + global_enabled=effective_plugins + ) global_policy = self._security.harness_policy() agent_override = cfg.get("security") if isinstance(cfg.get("security"), dict) else None policy = SecurityPolicy.merge(global_policy, agent_override) @@ -2572,6 +2621,17 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: else [] ) skill_dirs = configured_skill_dirs + package_skill_dirs + plugin_skills_disabled: set[str] = set() + if self._plugin_manager is not None: + for plugin_item in self._plugin_manager.list_installed(): + plugin_id = str(plugin_item.get("id") or "") + if plugin_id and ( + plugin_item.get("enabled", True) is False + or not agent_plugin_enabled(agent_plugins_map, plugin_id) + ): + plugin_skills_disabled.update( + self._plugin_manager.plugin_skill_names(plugin_id) + ) from octop.infra.agents.execute_env import inject_agent_execute_env # noqa: PLC0415 @@ -2582,6 +2642,9 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: workspace_dir=workspace_dir, cfg=cfg, ) + # OpenSandbox.create is not idempotent — reuse the instance already + # wrapped by ``ws`` so start does not spawn a second remote sandbox. + harness_backend: Any = ws.backend if self._spec_is_opensandbox(backend) else backend harness_cfg = HarnessAgentConfig( name=_memory_namespace(row.agent_id), @@ -2598,14 +2661,14 @@ def _build_harness_config(self, row: AgentRow) -> HarnessAgentConfig: ), system_prompt=system_prompt, memory=memory, - backend=backend, # resolved spec; harness re-resolves to a runtime instance + backend=harness_backend, # spec, or live OpenSandbox instance mcp_server_configs=mcp_server_configs, tools=merged_tools or None, middleware=agent_middleware or None, bootstrap_enabled=True, acp_runners=acp_config.runners, acp_delegate_enabled=bool(acp_raw.get("tool_enabled", False)), - skills_disabled=frozenset(skills_disabled_set(cfg)), + skills_disabled=frozenset(skills_disabled_set(cfg) | plugin_skills_disabled), skills_dir=skill_dirs or None, default_timezone=self._config.default_timezone, log_dir=str(self.paths.logs_dir), diff --git a/src/octop/infra/agents/plugin_tool_defaults.py b/src/octop/infra/agents/plugin_tool_defaults.py index f6736805..ff483d02 100644 --- a/src/octop/infra/agents/plugin_tool_defaults.py +++ b/src/octop/infra/agents/plugin_tool_defaults.py @@ -14,6 +14,30 @@ from typing import Any +def agent_plugin_enabled(agent_plugins: object, plugin_id: str) -> bool: + """Return the per-agent plugin switch; missing values remain default-on.""" + if not isinstance(agent_plugins, dict): + return True + entry = agent_plugins.get(plugin_id) + if not isinstance(entry, dict) or "enabled" not in entry: + return True + return bool(entry.get("enabled")) + + +def merge_plugins_enabled_settings( + existing: object, + incoming: dict[str, bool], +) -> dict[str, Any]: + """Merge plugin-level switches without dropping per-tool configuration.""" + out: dict[str, Any] = dict(existing) if isinstance(existing, dict) else {} + for plugin_id, enabled in incoming.items(): + entry = out.get(plugin_id) + plugin_out = dict(entry) if isinstance(entry, dict) else {} + plugin_out["enabled"] = bool(enabled) + out[str(plugin_id)] = plugin_out + return out + + def merge_plugins_tool_settings( existing: object, incoming: dict[str, dict[str, Any]], @@ -74,6 +98,8 @@ def expand_plugin_tools_default_on( for plugin_id, tool_name in registered_tools: if global_plugins.get(plugin_id) is False: continue + if not agent_plugin_enabled(out, plugin_id): + continue plugin_entry = out.get(plugin_id) if not isinstance(plugin_entry, dict): plugin_entry = {"tools": {}} diff --git a/src/octop/infra/agents/plugins/manager.py b/src/octop/infra/agents/plugins/manager.py index a14501a2..56596498 100644 --- a/src/octop/infra/agents/plugins/manager.py +++ b/src/octop/infra/agents/plugins/manager.py @@ -184,6 +184,7 @@ def __init__(self, *, plugins_dir: Path, config_path: Path) -> None: # Last-known tool metadata so Admin / Experts can still list tools after # a global disable unloads the plugin from the process registry. self._tool_catalog: dict[str, list[dict[str, Any]]] = {} + self._skill_catalog: dict[str, set[str]] = {} @property def plugins_dir(self) -> Path: @@ -292,6 +293,12 @@ def list_installed(self) -> list[dict[str, Any]]: for t in loaded.tools ] self._tool_catalog[manifest.id] = tools_meta + if loaded.skills_dir is not None: + self._skill_catalog[manifest.id] = { + path.name + for path in loaded.skills_dir.iterdir() + if path.is_dir() and (path / "SKILL.md").is_file() + } else: tools_meta = list(self._tool_catalog.get(manifest.id) or []) out.append( @@ -347,6 +354,12 @@ def set_enabled(self, plugin_id: str, enabled: bool) -> dict[str, Any]: } for t in loaded.tools ] + if loaded.skills_dir is not None: + self._skill_catalog[plugin_id] = { + path.name + for path in loaded.skills_dir.iterdir() + if path.is_dir() and (path / "SKILL.md").is_file() + } unload_plugin(plugin_id) for item in self.list_installed(): @@ -509,13 +522,34 @@ def install_url(self, url: str, *, force: bool = False) -> LoadedPlugin: def uninstall(self, plugin_id: str) -> None: unload_plugin(plugin_id) self._tool_catalog.pop(plugin_id, None) + self._skill_catalog.pop(plugin_id, None) dest = self._plugins_dir / plugin_id if dest.is_dir(): shutil.rmtree(dest) - def sync_skills_to_workspace(self, workspace: Any) -> None: + def plugin_skill_names(self, plugin_id: str) -> set[str]: + """Return skill directory names registered by one loaded plugin.""" + plugin = PluginRegistry().get(plugin_id) + if plugin is None or plugin.skills_dir is None: + return set(self._skill_catalog.get(plugin_id) or ()) + names = { + path.name + for path in plugin.skills_dir.iterdir() + if path.is_dir() and (path / "SKILL.md").is_file() + } + self._skill_catalog[plugin_id] = names + return set(names) + + def sync_skills_to_workspace( + self, + workspace: Any, + *, + agent_plugins: object = None, + ) -> None: from harness_agent.backends.workspace import BackendWorkspace + from octop.infra.agents.plugin_tool_defaults import agent_plugin_enabled + if not isinstance(workspace, BackendWorkspace): return enabled = self.global_enabled_map() @@ -523,6 +557,8 @@ def sync_skills_to_workspace(self, workspace: Any) -> None: for plugin in PluginRegistry().list_plugins(): if enabled.get(plugin.manifest.id) is False: continue + if not agent_plugin_enabled(agent_plugins, plugin.manifest.id): + continue if plugin.skills_dir is None: continue for skill_dir in plugin.skills_dir.iterdir(): diff --git a/src/octop/infra/agents/tool_catalog.py b/src/octop/infra/agents/tool_catalog.py index 9a9bd7ab..d6b46826 100644 --- a/src/octop/infra/agents/tool_catalog.py +++ b/src/octop/infra/agents/tool_catalog.py @@ -133,6 +133,17 @@ def plugin_tool_explicitly_disabled( return not bool(tool_cfg.get("enabled")) +def agent_plugin_enabled(cfg: Mapping[str, Any], plugin_id: str) -> bool: + """Whether a plugin is enabled for this agent (missing switch defaults on).""" + raw_plugins = cfg.get("plugins") + if not isinstance(raw_plugins, dict): + return True + plugin_entry = raw_plugins.get(plugin_id) + if not isinstance(plugin_entry, dict) or "enabled" not in plugin_entry: + return True + return bool(plugin_entry.get("enabled")) + + def plugin_tools_disabled_names( cfg: Mapping[str, Any], *, @@ -145,7 +156,11 @@ def plugin_tools_disabled_names( for plugin_id, tool_name in registered_tools: if global_plugins.get(plugin_id) is False: continue - if plugin_tool_explicitly_disabled(cfg, plugin_id=plugin_id, tool_name=tool_name): + if not agent_plugin_enabled(cfg, plugin_id) or plugin_tool_explicitly_disabled( + cfg, + plugin_id=plugin_id, + tool_name=tool_name, + ): out.add(tool_name) return out @@ -200,6 +215,7 @@ def builtin_tool_available( "BUILTIN_TOOL_CATALOG", "BuiltinToolEntry", "CRITICAL_TOOLS", + "agent_plugin_enabled", "builtin_tool_available", "effective_tools_disabled", "normalize_tools_disabled", diff --git a/tests/integration/test_plugin_tool_disable.py b/tests/integration/test_plugin_tool_disable.py index cf611565..f7a0ae92 100644 --- a/tests/integration/test_plugin_tool_disable.py +++ b/tests/integration/test_plugin_tool_disable.py @@ -7,6 +7,8 @@ from pathlib import Path from typing import Any +from tests.support.auth import create_user + _FIXTURE = Path(__file__).resolve().parents[1] / "fixtures" / "plugins" / "echo-tool" @@ -74,13 +76,7 @@ async def test_disable_plugin_tool_via_admin_plugins_api(env_with_provider: Any) settings = await client.get(f"/api/agents/{aid}/tool-settings", headers=auth) assert settings.status_code == 200, settings.text - by_name = { - t["name"]: t - for t in settings.json()["tools"] - if t["source"] == "plugin" and t["plugin_id"] == "echo-tool" - } - assert by_name["echo_message"]["enabled"] is False - assert by_name["echo_message"]["available"] is True + assert all(t["source"] == "builtin" for t in settings.json()["tools"]) async def test_disable_plugin_tool_via_expert_tool_settings(env_with_provider: Any) -> None: @@ -94,13 +90,6 @@ async def test_disable_plugin_tool_via_expert_tool_settings(env_with_provider: A json={"enabled": False, "source": "plugin", "plugin_id": "echo-tool"}, ) assert r.status_code == 200, r.text - by_name = { - t["name"]: t - for t in r.json()["tools"] - if t["source"] == "plugin" and t["plugin_id"] == "echo-tool" - } - assert by_name["echo_message"]["enabled"] is False - cfg = srv.app_runtime.agent_registry.get_config(aid) assert cfg["plugins"]["echo-tool"]["tools"]["echo_message"]["enabled"] is False _assert_echo_disabled_on_harness(srv, aid, disabled=True) @@ -149,7 +138,63 @@ async def test_admin_and_expert_share_plugin_tool_config(env_with_provider: Any) assert tool_cfg.get("config", {}).get("prefix") == "x" -async def test_global_plugin_disable_marks_tools_unavailable(env_with_provider: Any) -> None: +async def test_agent_plugin_switch_defaults_on_and_preserves_tools( + env_with_provider: Any, +) -> None: + client, srv, auth = env_with_provider + await _install_echo(client, auth) + aid = await _create_agent(client, auth, "agent-plugin-switch") + + listed = await client.get(f"/api/plugins/agents/{aid}", headers=auth) + assert listed.status_code == 200, listed.text + plugin = next(p for p in listed.json()["plugins"] if p["id"] == "echo-tool") + assert plugin["agent_enabled"] is True + assert plugin["enabled"] is True + + configured = await client.patch( + f"/api/plugins/agents/{aid}/tools", + headers=auth, + json={ + "plugins": { + "echo-tool": { + "tools": { + "echo_message": { + "enabled": True, + "config": {"prefix": "kept"}, + } + } + } + } + }, + ) + assert configured.status_code == 200, configured.text + + off = await client.patch( + f"/api/plugins/agents/{aid}", + headers=auth, + json={"plugins": {"echo-tool": {"enabled": False}}}, + ) + assert off.status_code == 200, off.text + plugin = next(p for p in off.json()["plugins"] if p["id"] == "echo-tool") + assert plugin["agent_enabled"] is False + assert plugin["enabled"] is False + _assert_echo_disabled_on_harness(srv, aid, disabled=True) + + cfg = srv.app_runtime.agent_registry.get_config(aid) + tool_cfg = cfg["plugins"]["echo-tool"]["tools"]["echo_message"] + assert tool_cfg == {"enabled": True, "config": {"prefix": "kept"}} + + on = await client.patch( + f"/api/plugins/agents/{aid}", + headers=auth, + json={"plugins": {"echo-tool": {"enabled": True}}}, + ) + assert on.status_code == 200, on.text + cfg = srv.app_runtime.agent_registry.get_config(aid) + assert cfg["plugins"]["echo-tool"]["tools"]["echo_message"] == tool_cfg + + +async def test_global_plugin_disable_takes_priority(env_with_provider: Any) -> None: client, _srv, auth = env_with_provider await _install_echo(client, auth) aid = await _create_agent(client, auth, "global-plugin-off") @@ -161,11 +206,26 @@ async def test_global_plugin_disable_marks_tools_unavailable(env_with_provider: ) assert off.status_code == 200, off.text - settings = await client.get(f"/api/agents/{aid}/tool-settings", headers=auth) - assert settings.status_code == 200, settings.text - echo = next( - t - for t in settings.json()["tools"] - if t["source"] == "plugin" and t["name"] == "echo_message" + listed = await client.get(f"/api/plugins/agents/{aid}", headers=auth) + assert listed.status_code == 200, listed.text + plugin = next(p for p in listed.json()["plugins"] if p["id"] == "echo-tool") + assert plugin["global_enabled"] is False + assert plugin["agent_enabled"] is True + assert plugin["enabled"] is False + + +async def test_agent_plugin_endpoints_enforce_owner(env_with_provider: Any) -> None: + client, _srv, admin_auth = env_with_provider + await _install_echo(client, admin_auth) + owner_auth = await create_user(client, admin_auth, username="plugin_owner") + other_auth = await create_user(client, admin_auth, username="plugin_other") + aid = await _create_agent(client, owner_auth, "owned-plugin-agent") + + listed = await client.get(f"/api/plugins/agents/{aid}", headers=other_auth) + assert listed.status_code == 403, listed.text + patched = await client.patch( + f"/api/plugins/agents/{aid}", + headers=other_auth, + json={"plugins": {"echo-tool": {"enabled": False}}}, ) - assert echo["available"] is False + assert patched.status_code == 403, patched.text diff --git a/tests/integration/test_plugin_upload.py b/tests/integration/test_plugin_upload.py index a2ff35da..76d14d25 100644 --- a/tests/integration/test_plugin_upload.py +++ b/tests/integration/test_plugin_upload.py @@ -71,3 +71,9 @@ async def test_upload_plugin_requires_admin(env_admin_alice: Any) -> None: client, _srv, _admin_auth, alice_auth = env_admin_alice r = await client.post("/api/plugins/upload", files=_zip_files(), headers=alice_auth) assert r.status_code == 403, r.text + + +async def test_list_plugins_is_available_to_authenticated_users(env_admin_alice: Any) -> None: + client, _srv, _admin_auth, alice_auth = env_admin_alice + response = await client.get("/api/plugins", headers=alice_auth) + assert response.status_code == 200, response.text diff --git a/tests/unit/agents/test_mcp_tool_cache.py b/tests/unit/agents/test_mcp_tool_cache.py index 52bc8f51..540620a1 100644 --- a/tests/unit/agents/test_mcp_tool_cache.py +++ b/tests/unit/agents/test_mcp_tool_cache.py @@ -228,7 +228,7 @@ def _inject(tools: list[Any]) -> None: mgr = object.__new__(AgentManager) mgr._repos = MagicMock() - mgr._repos.connector_repo.list_by_user.return_value = [inst] + mgr._repos.connector_repo.list_visible.return_value = [inst] mgr._connector_svc = MagicMock() mgr._connector_svc.custom_harness_configs.return_value = {} mgr._connector_svc.decrypt.return_value = {"email": "a@qq.com", "password": "code"} diff --git a/tests/unit/agents/test_plugin_tool_defaults.py b/tests/unit/agents/test_plugin_tool_defaults.py index af863ee8..3d682c42 100644 --- a/tests/unit/agents/test_plugin_tool_defaults.py +++ b/tests/unit/agents/test_plugin_tool_defaults.py @@ -3,7 +3,9 @@ from __future__ import annotations from octop.infra.agents.plugin_tool_defaults import ( + agent_plugin_enabled, expand_plugin_tools_default_on, + merge_plugins_enabled_settings, merge_plugins_tool_settings, ) @@ -32,3 +34,27 @@ def test_expand_default_on_fills_missing_tools() -> None: global_plugins={"echo-tool": True}, ) assert out["echo-tool"]["tools"]["echo_message"]["enabled"] is True + + +def test_agent_plugin_enabled_defaults_true_when_missing() -> None: + assert agent_plugin_enabled({}, "echo-tool") is True + assert agent_plugin_enabled({"echo-tool": {"tools": {}}}, "echo-tool") is True + assert agent_plugin_enabled({"echo-tool": {"enabled": False}}, "echo-tool") is False + + +def test_plugin_level_toggle_preserves_tool_config() -> None: + existing = { + "echo-tool": { + "tools": { + "echo_message": { + "enabled": False, + "config": {"prefix": "kept"}, + } + } + } + } + disabled = merge_plugins_enabled_settings(existing, {"echo-tool": False}) + assert disabled["echo-tool"]["enabled"] is False + assert disabled["echo-tool"]["tools"] == existing["echo-tool"]["tools"] + enabled = merge_plugins_enabled_settings(disabled, {"echo-tool": True}) + assert enabled["echo-tool"]["tools"] == existing["echo-tool"]["tools"] From a90388d5737d74194aba11c7a59ce79d938f764a Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Sun, 6 Sep 2026 01:25:27 +0000 Subject: [PATCH 55/58] feat(experts): add catalog display metadata to bundled skills --- .../ai-coding-coach/skills/cheatsheet/SKILL.md | 9 +++++++++ .../skills/security-guide/SKILL.md | 9 +++++++++ .../skills/clinical-q-and-a/SKILL.md | 9 +++++++++ .../skills/doctor-registration/SKILL.md | 9 +++++++++ .../skills/exam-material-recommendation/SKILL.md | 9 +++++++++ .../skills/guideline-learning-diagnosis/SKILL.md | 9 +++++++++ .../skills/guideline-learning/SKILL.md | 9 +++++++++ .../skills/guideline-section-expansion/SKILL.md | 9 +++++++++ .../skills/guideline-update-reminder/SKILL.md | 9 +++++++++ .../skills/insurance-policy-learning/SKILL.md | 9 +++++++++ .../skills/intent-routing/SKILL.md | 9 +++++++++ .../skills/medical-source-failover/SKILL.md | 9 +++++++++ .../skills/output-format/SKILL.md | 9 +++++++++ .../skills/source-verify/SKILL.md | 9 +++++++++ .../skills/subscription-setup/SKILL.md | 9 +++++++++ .../cvm-ai-doctor/skills/cvm-ai-doctor/SKILL.md | 14 +++++++++++++- .../skills/tencentcloud-infra/SKILL.md | 8 ++++++++ .../skills/llm-wiki/SKILL.md | 9 +++++++++ .../skills/meituan-deals/SKILL.md | 6 ++++++ .../news-trend/skills/daily-hot-news/SKILL.md | 9 +++++++++ .../library/office-automation/skills/docx/SKILL.md | 8 ++++++++ .../office-automation/skills/file_reader/SKILL.md | 8 ++++++++ .../library/office-automation/skills/news/SKILL.md | 8 ++++++++ .../library/office-automation/skills/pdf/SKILL.md | 8 ++++++++ .../library/office-automation/skills/pptx/SKILL.md | 8 ++++++++ .../library/office-automation/skills/xlsx/SKILL.md | 8 ++++++++ .../stock-assistant/skills/stock-info/SKILL.md | 9 +++++++++ .../skills/engineering-workflow/SKILL.md | 9 +++++++++ .../library/tencentcloud-api/skills/tcapi/SKILL.md | 9 +++++++++ .../skills/publisher-multi-platform/SKILL.md | 10 ++++++++++ 30 files changed, 265 insertions(+), 1 deletion(-) diff --git a/src/octop/infra/agents/experts/library/ai-coding-coach/skills/cheatsheet/SKILL.md b/src/octop/infra/agents/experts/library/ai-coding-coach/skills/cheatsheet/SKILL.md index 21f75c7c..407ee87e 100644 --- a/src/octop/infra/agents/experts/library/ai-coding-coach/skills/cheatsheet/SKILL.md +++ b/src/octop/infra/agents/experts/library/ai-coding-coach/skills/cheatsheet/SKILL.md @@ -1,6 +1,15 @@ --- name: cheatsheet description: AI 编程工具速查与 60+ 技巧清单——覆盖 Claude Code / Cursor / Codex / Copilot / Aider 等的能力矩阵、核心命令与高频技巧分类。供编程导师在选型与排障时引用。 +metadata: + octop: + emoji: "📋" + label: + zh: "AI 编程速查" + en: "AI Coding Cheatsheet" + summary: + zh: "对照主流 AI 编程工具的能力矩阵、命令与高频技巧。" + en: "Compare AI coding tools, commands, and high-frequency techniques." --- # AI 编程工具速查与技巧清单 diff --git a/src/octop/infra/agents/experts/library/ai-safety-guardian/skills/security-guide/SKILL.md b/src/octop/infra/agents/experts/library/ai-safety-guardian/skills/security-guide/SKILL.md index 3c9979f0..917b0761 100644 --- a/src/octop/infra/agents/experts/library/ai-safety-guardian/skills/security-guide/SKILL.md +++ b/src/octop/infra/agents/experts/library/ai-safety-guardian/skills/security-guide/SKILL.md @@ -1,6 +1,15 @@ --- name: security-guide description: AI 工具安全部署与合规体检的 6 步清单,覆盖 shellward 8 层防御与中文合规(PIPL/等保2.0/数据出境/生成式AI标识)。 +metadata: + octop: + emoji: "🛡️" + label: + zh: "安全合规体检" + en: "Security Guide" + summary: + zh: "按 6 步检查 AI 工具部署、命令拦截与中文合规。" + en: "Run a 6-step AI deployment, command-block, and compliance checkup." --- # AI 安全部署与合规体检清单 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/clinical-q-and-a/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/clinical-q-and-a/SKILL.md index a8e5fa04..304612ea 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/clinical-q-and-a/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/clinical-q-and-a/SKILL.md @@ -1,6 +1,15 @@ --- name: clinical-q-and-a description: 快速回答普通教育性医学问题与常见误区。默认用一份国内现行权威指南/共识完成轻量核验并立即作答;不用于个体诊疗、处方剂量、精确推荐定位、药品高风险事实、医保监管或跨版本比较。 +metadata: + octop: + emoji: "💬" + label: + zh: "医学问答" + en: "Clinical Q&A" + summary: + zh: "用一份权威正文快速澄清教育性医学问题与常见误区。" + en: "Answer educational medical questions from one authoritative source." --- # 普通医学问答快路径 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/doctor-registration/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/doctor-registration/SKILL.md index 89f0e04f..9f7093f2 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/doctor-registration/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/doctor-registration/SKILL.md @@ -1,6 +1,15 @@ --- name: doctor-registration description: 当医生提供或更新称谓、地区、医院、科室、职称这5项登记信息,变更科室/地区/职称,或要求停用、删除订阅数据时使用。本技能只管登记的写入/更新/清除;登记完成后的订阅任务创建由 subscription-setup skill 负责。不启用诊断、治疗、疾病SOP、急诊行动卡、个体患者建议、药物剂量、HIS决策支持或医保报销结论能力。 +metadata: + octop: + emoji: "🪪" + label: + zh: "医生登记" + en: "Doctor Registration" + summary: + zh: "登记或更新称谓、地区、医院、科室与职称五项信息。" + en: "Register or update title, region, hospital, department, and rank." --- # 医生登记、更新与停用 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/exam-material-recommendation/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/exam-material-recommendation/SKILL.md index b8b3806f..95a1c96c 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/exam-material-recommendation/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/exam-material-recommendation/SKILL.md @@ -1,6 +1,15 @@ --- name: exam-material-recommendation description: 根据医生自述的考试或岗位目标(副高、中级、规培、执业医师等)推荐学习材料、教材与学习顺序,并按目标动态调整学习内容。必须以官方考试大纲为准,不得断言考试范围或承诺通过结果,也不得输出个体诊疗内容。 +metadata: + octop: + emoji: "📚" + label: + zh: "备考材料推荐" + en: "Exam Material Recommendation" + summary: + zh: "按考试或岗位目标推荐教材与学习顺序,以官方大纲为准。" + en: "Recommend study materials and order from official exam outlines." --- # 备考与岗位导向的学习材料推荐 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-learning-diagnosis/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-learning-diagnosis/SKILL.md index 059921ef..dc033704 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-learning-diagnosis/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-learning-diagnosis/SKILL.md @@ -5,6 +5,15 @@ description: >- 做教育性小测,或学习指南中的诊断标准、鉴别框架和流程关系时使用。 本技能只做学习诊断与诊断标准教学,不对具体患者作疾病诊断、治疗、处方、剂量、 急诊处置或医保报销判断。 +metadata: + octop: + emoji: "🧩" + label: + zh: "学习诊断" + en: "Learning Diagnosis" + summary: + zh: "评估指南掌握情况,讲解诊断标准,不做个体诊疗。" + en: "Assess guideline mastery and teach diagnostic criteria, not cases." --- # 指南学习诊断与诊断标准学习 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-learning/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-learning/SKILL.md index 8d8b894d..07d1fbf8 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-learning/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-learning/SKILL.md @@ -1,6 +1,15 @@ --- name: guideline-learning description: 指南学习流程约束。判断请求类型→读取状态→按流程创建轨道/预览/投递/排查迁移;操作命令与细则见 references/learning-operations.md。选题用权威信源,输出前经 output-format 校验。不生成诊疗/处方/急诊SOP/个体患者建议。 +metadata: + octop: + emoji: "📘" + label: + zh: "指南学习" + en: "Guideline Learning" + summary: + zh: "按轨道创建、预览与投递权威指南学习内容。" + en: "Create, preview, and deliver guideline learning tracks." --- # 指南学习流程 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-section-expansion/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-section-expansion/SKILL.md index 01c05ccc..b02a4c1d 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-section-expansion/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-section-expansion/SKILL.md @@ -1,6 +1,15 @@ --- name: guideline-section-expansion description: 把已核验的权威指南按原文结构逐节展开讲解,并给出原文定位,帮医生读懂原文;也可把指南整理为学习路径图(学习顺序)。不得生成诊疗方案、床旁处置步骤、疾病 SOP、急诊行动卡、个体患者建议或药物剂量说明。 +metadata: + octop: + emoji: "📑" + label: + zh: "章节展开" + en: "Section Expansion" + summary: + zh: "按原文结构展开指南章节,或整理学习路径图。" + en: "Expand verified guideline sections or build a learning pathway." --- # 指南章节展开与学习路径图 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-update-reminder/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-update-reminder/SKILL.md index e82dd029..5c9f79cc 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-update-reminder/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/guideline-update-reminder/SKILL.md @@ -1,6 +1,15 @@ --- name: guideline-update-reminder description: 为基层医生学习小助手生成专业指南更新提醒。适用于每3天一次或按需输出与医生科室、亚专业、职称深度和基层场景相关的指南、共识、规范、临床路径或质控标准更新。只提供学习提醒和权威信源,不输出临床行动、疾病SOP、个体患者建议、药物剂量或院内流程变更。 +metadata: + octop: + emoji: "🔔" + label: + zh: "指南更新提醒" + en: "Guideline Update Reminder" + summary: + zh: "按科室与基层场景提醒相关指南、共识与规范更新。" + en: "Remind doctors of relevant guideline and consensus updates." --- # 专业指南更新提醒 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/insurance-policy-learning/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/insurance-policy-learning/SKILL.md index b3dc6d0b..63696364 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/insurance-policy-learning/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/insurance-policy-learning/SKILL.md @@ -1,6 +1,15 @@ --- name: insurance-policy-learning description: 为基层医生学习小助手生成地区医保政策学习内容。支持每周二、周五或按需的最新变化摘要,也支持近一年/指定区间的重点政策回顾学习。只输出政策原文摘要、待本地确认事项和权威信源,不输出报销结论、支付比例、HIS提醒、病历要求或医院执行承诺。 +metadata: + octop: + emoji: "🏥" + label: + zh: "医保政策学习" + en: "Insurance Policy Learning" + summary: + zh: "摘要地区医保正式文件变化,并标明待本地确认事项。" + en: "Summarize local insurance policy changes for learning, not claims." --- # 地区医保政策学习 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/intent-routing/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/intent-routing/SKILL.md index fbbe41e0..43b6885e 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/intent-routing/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/intent-routing/SKILL.md @@ -1,6 +1,15 @@ --- name: intent-routing description: 请求入口的意图识别与技能路由。按渐进式判断意图:先通用任务(直接做)、再高风险临床(拒绝)、再区分纯信源核验与医学学习、最后登记/订阅。纯信源核验先走 source-verify;原始路径受限时再进入 medical-source-failover。医学学习才调对应 skill + output-format 校验。 +metadata: + octop: + emoji: "🧭" + label: + zh: "意图路由" + en: "Intent Routing" + summary: + zh: "识别通用任务、高风险临床、信源核验与医学学习并分发。" + en: "Route general, clinical, source-verify, and learning requests." --- # 意图识别与路由 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/medical-source-failover/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/medical-source-failover/SKILL.md index e1a9b626..b25d1e51 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/medical-source-failover/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/medical-source-failover/SKILL.md @@ -1,6 +1,15 @@ --- name: medical-source-failover description: Route retrieval of Chinese medical guidelines, consensus statements, regulatory documents, drug information, safety notices, standards, and public-health materials through authoritative originals and verified fallback copies. Use when a canonical medical source is blocked, slow, unavailable, moved, paywalled, or difficult to parse, or when designing and auditing domestic medical-source fallback rules. Do not treat secondary summaries or reposts as independent clinical evidence. +metadata: + octop: + emoji: "🛟" + label: + zh: "信源熔断降级" + en: "Medical Source Failover" + summary: + zh: "原文受阻时按可信路径降级访问,不降低证据标准。" + en: "Failover blocked originals without lowering evidence standards." --- # Medical Source Failover diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/output-format/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/output-format/SKILL.md index c4af3b7d..08be101d 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/output-format/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/output-format/SKILL.md @@ -1,6 +1,15 @@ --- name: output-format description: 结构化医学学习产物的统一格式校验。四条硬格式与 validate_output.py 单次标准输入流程。指南章节、路径图、诊断、备考、医保、更新和每日单元使用;普通医学问答走 clinical-q-and-a 的轻量自检,通用任务不套用。 +metadata: + octop: + emoji: "✅" + label: + zh: "输出格式校验" + en: "Output Format Check" + summary: + zh: "校验结构化医学学习产物的硬格式后再发出。" + en: "Validate structured medical learning output before sending." --- # 医学安全域输出格式校验 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/source-verify/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/source-verify/SKILL.md index 019d18ba..5c0165e2 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/source-verify/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/source-verify/SKILL.md @@ -1,6 +1,15 @@ --- name: source-verify description: 医学信源快速或完整核验。普通教育性医学问答用单一权威正文快速核验;最新版本、精确推荐、高风险药品、医保监管或跨版本请求升级为完整核验。只整理学习依据,不生成诊疗、处方、急诊处置、医保报销结论或HIS执行建议。 +metadata: + octop: + emoji: "🔍" + label: + zh: "信源核验" + en: "Source Verify" + summary: + zh: "核验医学权威原文、版本时效与修订替代关系。" + en: "Verify authoritative medical sources, versions, and replacements." --- # 统一信源核验 diff --git a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/subscription-setup/SKILL.md b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/subscription-setup/SKILL.md index 7ee3e32c..f4b984fb 100644 --- a/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/subscription-setup/SKILL.md +++ b/src/octop/infra/agents/experts/library/clinical-learning-subscription/skills/subscription-setup/SKILL.md @@ -1,6 +1,15 @@ --- name: subscription-setup description: 学习订阅任务创建与启用。医生完成 5 项登记后,按用户选择创建订阅任务(每日指南连续学习/专业指南更新提醒/地区医保政策变化学习)。平台 cronjob_create 自动绑定当前会话通道投递,无需微信绑定门禁。先查重再创建,回执如实写已启用。 +metadata: + octop: + emoji: "📅" + label: + zh: "学习订阅" + en: "Learning Subscription" + summary: + zh: "登记完成后创建每日指南、更新提醒与医保政策订阅。" + en: "Create guideline, update, and insurance learning subscriptions." --- # 学习订阅任务创建 diff --git a/src/octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/SKILL.md b/src/octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/SKILL.md index e88b2918..951ff59c 100644 --- a/src/octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/SKILL.md +++ b/src/octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/SKILL.md @@ -1,7 +1,19 @@ --- name: cvm-ai-doctor description: CVM 实例健康诊断,采用智能快速/深度检查模式。涵盖性能和使用问题专业检查、诊断、和修复。支持服务器、PC、虚拟机、容器场景,支持 Linux/macOS/Windows。 -metadata: {"openclaw": {"requires": {"bins": ["bash", "ps"]}, "os": ["linux", "darwin", "windows"]}} +metadata: + openclaw: + requires: + bins: ["bash", "ps"] + os: ["linux", "darwin", "windows"] + octop: + emoji: "🩺" + label: + zh: "CVM AI 诊断" + en: "CVM AI Doctor" + summary: + zh: "快速分诊后再深度检查 CPU、内存、磁盘与网络问题。" + en: "Triage then deeply diagnose CPU, memory, disk, and network issues." --- # CVM AI Doctor 技能 diff --git a/src/octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/SKILL.md b/src/octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/SKILL.md index 3318daf7..93625999 100644 --- a/src/octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/SKILL.md +++ b/src/octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/SKILL.md @@ -24,6 +24,14 @@ metadata: "lighthouse-openclaw-setup", "lighthouse-app-deploy" ] + }, + "octop": { + "emoji": "☁️", + "label": { "zh": "腾讯云基础设施", "en": "Tencent Cloud Infra" }, + "summary": { + "zh": "用 tccli 管理轻量服务器、CVM、网络、证书与监控。", + "en": "Manage Lighthouse, CVM, networking, certificates, and monitoring with tccli." + } } } --- diff --git a/src/octop/infra/agents/experts/library/karpathy-knowledge-base/skills/llm-wiki/SKILL.md b/src/octop/infra/agents/experts/library/karpathy-knowledge-base/skills/llm-wiki/SKILL.md index 49762dc7..d9cbf4e2 100644 --- a/src/octop/infra/agents/experts/library/karpathy-knowledge-base/skills/llm-wiki/SKILL.md +++ b/src/octop/infra/agents/experts/library/karpathy-knowledge-base/skills/llm-wiki/SKILL.md @@ -1,6 +1,15 @@ --- name: llm-wiki description: Build, ingest, query, and lint a persistent Markdown knowledge base using the Karpathy LLM Wiki pattern. Use for adding sources, maintaining interlinked wiki pages, answering from the knowledge base, filing durable research, or checking contradictions and index health. Do not use it to persist ordinary chat or unverified personal data. +metadata: + octop: + emoji: "🗂️" + label: + zh: "LLM Wiki" + en: "LLM Wiki" + summary: + zh: "摄取来源、维护互链 Wiki,并据此回答与核验知识库。" + en: "Ingest sources, maintain a linked wiki, and answer from the knowledge base." --- # LLM Wiki diff --git a/src/octop/infra/agents/experts/library/meituan-living-assistant/skills/meituan-deals/SKILL.md b/src/octop/infra/agents/experts/library/meituan-living-assistant/skills/meituan-deals/SKILL.md index 7cde9f46..aaed470c 100644 --- a/src/octop/infra/agents/experts/library/meituan-living-assistant/skills/meituan-deals/SKILL.md +++ b/src/octop/infra/agents/experts/library/meituan-living-assistant/skills/meituan-deals/SKILL.md @@ -10,6 +10,12 @@ metadata: octop: emoji: "🍜" requires: {} + label: + zh: "美团优惠" + en: "Meituan Deals" + summary: + zh: "领取美团优惠券,搜索附近团购并协助下单。" + en: "Claim Meituan coupons, search nearby deals, and help place orders." --- # 美团生活助手 — 领券下单找我 diff --git a/src/octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/SKILL.md b/src/octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/SKILL.md index 2f07e44a..c61d7588 100644 --- a/src/octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/SKILL.md +++ b/src/octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/SKILL.md @@ -1,6 +1,15 @@ --- name: daily-hot-news description: 获取热点新闻、热搜、早报、金价、汇率,以及论坛帖子、科技资讯等内容。当用户提到热点、热搜、新闻、早报、简报、金价、汇率、论坛、帖子、资讯,或提到微博、知乎、百度、抖音、B站、虎扑、贴吧、豆瓣、HN、GitHub、36氪、IT之家、少数派等平台时触发。即使用户只是随口问"今天有什么新鲜事"或"最近怎么样",也应使用此 skill。 +metadata: + octop: + emoji: "🔥" + label: + zh: "每日热点" + en: "Daily Hot News" + summary: + zh: "汇总热搜、早报、金价汇率与科技资讯,生成个性化简报。" + en: "Collect hot searches, briefings, and tech news into a personalized digest." --- # 每日热点新闻播报 diff --git a/src/octop/infra/agents/experts/library/office-automation/skills/docx/SKILL.md b/src/octop/infra/agents/experts/library/office-automation/skills/docx/SKILL.md index 56c7ffd3..33ef6f74 100644 --- a/src/octop/infra/agents/experts/library/office-automation/skills/docx/SKILL.md +++ b/src/octop/infra/agents/experts/library/office-automation/skills/docx/SKILL.md @@ -4,6 +4,14 @@ description: "当用户需要创建、读取、编辑或处理 Word 文档(.do license: Proprietary. LICENSE.txt has complete terms metadata: builtin_skill_version: "1.1" + octop: + emoji: "📝" + label: + zh: "Word 文档" + en: "Word Documents" + summary: + zh: "创建、读取、编辑或整理专业 .docx 文档。" + en: "Create, read, edit, or format professional .docx documents." --- > **重要:** 所有 `scripts/` 路径均相对于本技能目录。 diff --git a/src/octop/infra/agents/experts/library/office-automation/skills/file_reader/SKILL.md b/src/octop/infra/agents/experts/library/office-automation/skills/file_reader/SKILL.md index 25aed92c..e9f4c287 100644 --- a/src/octop/infra/agents/experts/library/office-automation/skills/file_reader/SKILL.md +++ b/src/octop/infra/agents/experts/library/office-automation/skills/file_reader/SKILL.md @@ -6,6 +6,14 @@ metadata: qwenpaw: emoji: "📄" requires: {} + octop: + emoji: "📖" + label: + zh: "文件读取" + en: "File Reader" + summary: + zh: "读取并总结本地文本文件,不处理 PDF 与 Office。" + en: "Read and summarize local text files, not PDF or Office." --- # 文件读取工具箱 diff --git a/src/octop/infra/agents/experts/library/office-automation/skills/news/SKILL.md b/src/octop/infra/agents/experts/library/office-automation/skills/news/SKILL.md index 8bdcab4c..f5ab1680 100644 --- a/src/octop/infra/agents/experts/library/office-automation/skills/news/SKILL.md +++ b/src/octop/infra/agents/experts/library/office-automation/skills/news/SKILL.md @@ -6,6 +6,14 @@ metadata: qwenpaw: emoji: "📰" requires: {} + octop: + emoji: "📰" + label: + zh: "新闻速览" + en: "News Digest" + summary: + zh: "按政治、财经、科技等分类抓取并总结最新新闻。" + en: "Fetch and summarize latest news by category." --- # 新闻参考 diff --git a/src/octop/infra/agents/experts/library/office-automation/skills/pdf/SKILL.md b/src/octop/infra/agents/experts/library/office-automation/skills/pdf/SKILL.md index 06cf2348..2cfd222c 100644 --- a/src/octop/infra/agents/experts/library/office-automation/skills/pdf/SKILL.md +++ b/src/octop/infra/agents/experts/library/office-automation/skills/pdf/SKILL.md @@ -4,6 +4,14 @@ description: 当用户需要对PDF文件进行任何操作时,请使用此技 license: Proprietary. LICENSE.txt has complete terms metadata: builtin_skill_version: "1.1" + octop: + emoji: "📄" + label: + zh: "PDF 处理" + en: "PDF Tools" + summary: + zh: "读取、合并、拆分、填写表单或 OCR 处理 PDF。" + en: "Read, merge, split, fill forms, or OCR PDFs." --- > **重要:** 所有 `scripts/` 路径均相对于此技能目录。 diff --git a/src/octop/infra/agents/experts/library/office-automation/skills/pptx/SKILL.md b/src/octop/infra/agents/experts/library/office-automation/skills/pptx/SKILL.md index 0c8af7ac..e495172d 100644 --- a/src/octop/infra/agents/experts/library/office-automation/skills/pptx/SKILL.md +++ b/src/octop/infra/agents/experts/library/office-automation/skills/pptx/SKILL.md @@ -4,6 +4,14 @@ description: "当涉及到 .pptx 文件的任何操作时使用此技能—— license: Proprietary. LICENSE.txt has complete terms metadata: builtin_skill_version: "1.1" + octop: + emoji: "📽️" + label: + zh: "PPT 演示" + en: "Presentations" + summary: + zh: "创建、读取、编辑或拆分 .pptx 演示文稿。" + en: "Create, read, edit, or split .pptx presentations." --- > **重要:** 所有 `scripts/` 路径都相对于此技能目录。 diff --git a/src/octop/infra/agents/experts/library/office-automation/skills/xlsx/SKILL.md b/src/octop/infra/agents/experts/library/office-automation/skills/xlsx/SKILL.md index f59cf26f..24c4fa6c 100644 --- a/src/octop/infra/agents/experts/library/office-automation/skills/xlsx/SKILL.md +++ b/src/octop/infra/agents/experts/library/office-automation/skills/xlsx/SKILL.md @@ -4,6 +4,14 @@ description: "当电子表格文件是主要输入或输出时使用此技能。 license: Proprietary. LICENSE.txt has complete terms metadata: builtin_skill_version: "1.1" + octop: + emoji: "📊" + label: + zh: "Excel 表格" + en: "Spreadsheets" + summary: + zh: "创建、读取、编辑或清理 .xlsx、.csv 等电子表格。" + en: "Create, read, edit, or clean .xlsx, .csv, and related spreadsheets." --- > **重要说明:** 所有 `scripts/` 路径均相对于此技能目录。 diff --git a/src/octop/infra/agents/experts/library/stock-assistant/skills/stock-info/SKILL.md b/src/octop/infra/agents/experts/library/stock-assistant/skills/stock-info/SKILL.md index ecd31a65..31ed01ee 100644 --- a/src/octop/infra/agents/experts/library/stock-assistant/skills/stock-info/SKILL.md +++ b/src/octop/infra/agents/experts/library/stock-assistant/skills/stock-info/SKILL.md @@ -1,6 +1,15 @@ --- name: akshare-data description: 使用 akshare-cli 获取中国及全球金融市场数据(1090+ 个函数)。覆盖股票、基金、期货、债券、外汇、宏观经济、指数、期权、新闻等全领域。当用户需要以下任何一种数据时触发此 skill:股票行情、历史K线、实时报价、涨停跌停池、龙虎榜、板块资金流向、基金/ETF净值、期货行情、债券/可转债、外汇汇率、宏观经济指标(GDP/CPI/PMI)、指数数据、期权数据、财经新闻。关键词触发:akshare、股票、行情、K线、基金、期货、外汇、宏观、国债、可转债、涨停、龙虎榜、板块、资金流向、stock data、market data、financial data、A股、港股、美股。即使用户只是随口提到"看看某个股票"或"最近市场怎么样",也应触发。 +metadata: + octop: + emoji: "📈" + label: + zh: "金融行情" + en: "Market Data" + summary: + zh: "用 akshare-cli 查询股票、基金、期货、宏观与财经新闻。" + en: "Fetch stocks, funds, futures, macro, and financial news via akshare-cli." --- # AKShare 金融数据获取 diff --git a/src/octop/infra/agents/experts/library/superpowers-methodology/skills/engineering-workflow/SKILL.md b/src/octop/infra/agents/experts/library/superpowers-methodology/skills/engineering-workflow/SKILL.md index ae9e2b96..0a7ac67b 100644 --- a/src/octop/infra/agents/experts/library/superpowers-methodology/skills/engineering-workflow/SKILL.md +++ b/src/octop/infra/agents/experts/library/superpowers-methodology/skills/engineering-workflow/SKILL.md @@ -1,6 +1,15 @@ --- name: engineering-workflow description: 可靠工程工作流的执行细则——探索→计划→TDD→系统化调试→代码审查→完成前验证。供方法论教练在开发任务中逐步引导。 +metadata: + octop: + emoji: "🛠️" + label: + zh: "工程工作流" + en: "Engineering Workflow" + summary: + zh: "按探索、计划、TDD、调试、审查与验证逐步推进开发。" + en: "Guide development through explore, plan, TDD, debug, review, and verify." --- # 可靠工程工作流(执行细则) diff --git a/src/octop/infra/agents/experts/library/tencentcloud-api/skills/tcapi/SKILL.md b/src/octop/infra/agents/experts/library/tencentcloud-api/skills/tcapi/SKILL.md index 48fd53de..11fd6c3d 100644 --- a/src/octop/infra/agents/experts/library/tencentcloud-api/skills/tcapi/SKILL.md +++ b/src/octop/infra/agents/experts/library/tencentcloud-api/skills/tcapi/SKILL.md @@ -2,6 +2,15 @@ name: tcapi display_name: 腾讯云 API 助手 description: Skill to call Cloud API for Tencent Cloud (腾讯云). Used for cloud automation or resource management. 当用户需要查询、创建、管理腾讯云资源,或执行云 API 自动化操作时触发。优先使用 Octop 自带 venv 中的 tccli,凭证支持全自动 OAuth 登录。 +metadata: + octop: + emoji: "☁️" + label: + zh: "腾讯云 API" + en: "Tencent Cloud API" + summary: + zh: "用 tccli 查询与管理腾讯云资源,支持 OAuth 登录。" + en: "Query and manage Tencent Cloud resources with tccli and OAuth." version: 1.0.0 tags: [tccli, cloud-api, tencent-cloud, automation] keywords: [腾讯云, tccli, cloud api, 云资源, 云管理, 自动化运维] diff --git a/src/octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/SKILL.md b/src/octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/SKILL.md index d6e4e13b..c2dcd476 100644 --- a/src/octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/SKILL.md +++ b/src/octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/SKILL.md @@ -9,6 +9,16 @@ metadata: "requires": { "bins": ["node", "npx", "python3"] }, "primaryEnv": "WECHAT_APP_ID", }, + "octop": + { + "emoji": "✍️", + "label": { "zh": "一文多发", "en": "Multi-Platform Publisher" }, + "summary": + { + "zh": "把一篇 Markdown 同步发布到内容运营平台与社交平台。", + "en": "Publish one Markdown article to content and social platforms.", + }, + }, } --- From d9a0e5fad3a06b64f42952b1a4e93adba14f20da Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Sun, 6 Sep 2026 01:25:42 +0000 Subject: [PATCH 56/58] chore: misc unrelated fixes --- README.md | 18 +++++++++++------- README_CN.md | 11 +++++++++++ .../Control/RemoteBrowser/index.module.less | 9 +++++++++ .../src/pages/Control/RemoteBrowser/index.tsx | 8 +++++++- dashboard/vite.config.ts | 3 +++ 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0fcde91d..d870d209 100644 --- a/README.md +++ b/README.md @@ -135,13 +135,6 @@ Here are our mid-to-long term plans: This roadmap may shift as the community grows; treat it as indicative only. - -## 🖥️ FnOS (飞牛 NAS) Installation - -Octop can be installed on FnOS (飞牛 NAS) devices via the App Center as a `.fpk` package, either as a Docker-backed app or as a native (non-Docker) app. See [`fnos/README.md`](fnos/README.md) for the full packaging guide, the FPK build helper (`scripts/build-fpk.sh`), and the CI pipeline template (`.github/workflows/fnos-build-fpk.yml`). - -Initial admin credentials: `admin` / `Octop123` (change after first login). For non-root FnOS installs, the WeCom/Feishu connector CLIs require the fix in [PR #406](https://github.com/TencentCloud/Octop/pull/406) (user-level npm fallback). - ## 🚀 Quick Start ### Prerequisites @@ -190,6 +183,17 @@ curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install See [scripts/README.md](scripts/README.md) for all install options (`--version`, `--from-source`, `--mirror`, Windows flags). +**Desktop app** (GUI, no terminal) — grab the artifact for your platform from [GitHub Releases](https://github.com/TencentCloud/Octop/releases/latest): + +| Platform | Artifact | +|----------|----------| +| Windows | `Octop-desktop-windows-amd64-.exe` (64-bit) / `Octop-desktop-windows-arm64-.exe` (ARM64) — NSIS installer | +| macOS | `Octop-desktop-darwin-arm64-.dmg` (Apple Silicon) / `Octop-desktop-darwin-amd64-.dmg` (Intel) | +| Linux | `Octop-desktop-linux-amd64-.tar.gz` / `Octop-desktop-linux-arm64-.tar.gz` | +| FnOS NAS | `Octop-fnos-docker-.fpk` (Docker-backed) / `Octop-fnos-native-.fpk` (no Docker) — install via App Center | + +See [desktop/README.md](desktop/README.md) for the desktop shell and [fnos/README.md](fnos/README.md) for the FnOS packaging guide. + **Alternative — PyPI** (if you already manage Python yourself): ```bash diff --git a/README_CN.md b/README_CN.md index 666f5f9f..5437e481 100644 --- a/README_CN.md +++ b/README_CN.md @@ -194,6 +194,17 @@ curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install 完整安装选项见 [scripts/README.md](scripts/README.md)(`--version`、`--from-source`、`--mirror` 及 Windows 参数)。 +**桌面客户端**(图形界面,无需终端)— 从 [GitHub Releases](https://github.com/TencentCloud/Octop/releases/latest) 下载对应平台的安装包: + +| 平台 | 制品 | +|------|------| +| Windows | `Octop-desktop-windows-amd64-.exe`(64 位)/ `Octop-desktop-windows-arm64-.exe`(ARM64)— NSIS 安装程序 | +| macOS | `Octop-desktop-darwin-arm64-.dmg`(Apple 芯片)/ `Octop-desktop-darwin-amd64-.dmg`(Intel) | +| Linux | `Octop-desktop-linux-amd64-.tar.gz` / `Octop-desktop-linux-arm64-.tar.gz` | +| 飞牛 NAS(FnOS) | `Octop-fnos-docker-.fpk`(依赖 Docker)/ `Octop-fnos-native-.fpk`(无需 Docker)— 通过应用中心安装 | + +桌面客户端说明见 [desktop/README.md](desktop/README.md),飞牛打包指南见 [fnos/README.md](fnos/README.md)。 + **备选 — PyPI**(若你已自行管理 Python 环境): ```bash diff --git a/dashboard/src/pages/Control/RemoteBrowser/index.module.less b/dashboard/src/pages/Control/RemoteBrowser/index.module.less index 424f5cbf..8fa2f04c 100644 --- a/dashboard/src/pages/Control/RemoteBrowser/index.module.less +++ b/dashboard/src/pages/Control/RemoteBrowser/index.module.less @@ -46,6 +46,15 @@ justify-content: center; } +.setupMascot { + display: block; + width: 120px; + height: 120px; + object-fit: contain; + user-select: none; + -webkit-user-drag: none; +} + .installProgress { display: flex; flex-direction: column; diff --git a/dashboard/src/pages/Control/RemoteBrowser/index.tsx b/dashboard/src/pages/Control/RemoteBrowser/index.tsx index 8bb7bbff..524f66b8 100644 --- a/dashboard/src/pages/Control/RemoteBrowser/index.tsx +++ b/dashboard/src/pages/Control/RemoteBrowser/index.tsx @@ -41,6 +41,7 @@ import { useTranslation } from "react-i18next"; import StreamEdgeControls from "../../../components/StreamEdgeControls/StreamEdgeControls"; import StreamSetupGuide from "../../../components/StreamSetupGuide/StreamSetupGuide"; +import { OctopEmptyMascot } from "../../../components/EmptyState"; import PageShell from "../../../layouts/PageShell"; import BrowserAiPanel from "../../../components/BrowserAiPanel"; import SkillRecordGuideModal from "../../../components/SkillRecordGuideModal"; @@ -1465,7 +1466,12 @@ export default function RemoteBrowserPage({ renderViewportUninstallProgress() ) : ( } + icon={ + + } title={ envReady ? t("remoteBrowser.startBrowserTitle", "启动远程浏览器") diff --git a/dashboard/vite.config.ts b/dashboard/vite.config.ts index 55349a5b..c34d8fc5 100644 --- a/dashboard/vite.config.ts +++ b/dashboard/vite.config.ts @@ -315,6 +315,9 @@ export default defineConfig(({ mode }) => { "/api": { target: `http://127.0.0.1:${apiPort}`, changeOrigin: true, + // Preserve the browser-facing origin so OAuth callbacks do not point + // at the proxy target (127.0.0.1:8088). + xfwd: true, // Only proxy API websockets — do not steal Vite's HMR upgrade on `/`. ws: true, }, From 3358d01542e1fdbf75b6ec5cf2f7e75ad597e889 Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Sun, 6 Sep 2026 03:00:48 +0000 Subject: [PATCH 57/58] fix(backup): restore old archives after schema changes without 500s Migrate immediately after overlay and repair folded v13 connectors schema so existing backups stay usable. Refuse newer schema versions with BACKUP_SCHEMA_INCOMPATIBLE. Also drop the knowledge-bases Beta nav badge. Co-authored-by: Cursor --- dashboard/src/layouts/sidebarNav.tsx | 1 - dashboard/src/locales/en.json | 1 + dashboard/src/locales/zh.json | 1 + src/octop/i18n/en.json | 1 + src/octop/i18n/zh.json | 1 + src/octop/infra/backup/system_archive.py | 36 ++++++- src/octop/infra/db/migrate.py | 122 ++++++++++++++++++++++- src/octop/infra/errors.py | 2 + tests/unit/backup/test_system_archive.py | 116 +++++++++++++++++++++ tests/unit/db/test_db_pool.py | 44 ++++++++ 10 files changed, 318 insertions(+), 7 deletions(-) diff --git a/dashboard/src/layouts/sidebarNav.tsx b/dashboard/src/layouts/sidebarNav.tsx index 445f6aa3..838de714 100644 --- a/dashboard/src/layouts/sidebarNav.tsx +++ b/dashboard/src/layouts/sidebarNav.tsx @@ -144,7 +144,6 @@ export function buildNavSections( path: "/knowledge-bases", icon: , labelKey: "nav.knowledgeBases", - badge: "BETA", }); } if (settingsItems.length > 0) { diff --git a/dashboard/src/locales/en.json b/dashboard/src/locales/en.json index 46f3c865..3aafe548 100644 --- a/dashboard/src/locales/en.json +++ b/dashboard/src/locales/en.json @@ -77,6 +77,7 @@ "SETUP_REQUIRED": "Initial setup is required.", "DATABASE_NOT_EMPTY": "The target database already has users. Use an empty database, or log in with the existing admin.", "BACKUP_DRIVER_MISMATCH": "This backup was made with a different database engine (SQLite vs PostgreSQL). Switch the runtime to match the backup, or create a new backup on the current engine. Cross-engine restore is not supported.", + "BACKUP_SCHEMA_INCOMPATIBLE": "This backup uses database schema version {{archive_schema_version}}, which cannot be restored by this Octop version (maximum supported: {{runtime_schema_version}}).", "BACKUP_IN_PROGRESS": "A backup or restore is already in progress. Try again shortly.", "FORBIDDEN": "Permission denied.", "NOT_FOUND": "Not found.", diff --git a/dashboard/src/locales/zh.json b/dashboard/src/locales/zh.json index 259b7644..6f0cebf9 100644 --- a/dashboard/src/locales/zh.json +++ b/dashboard/src/locales/zh.json @@ -77,6 +77,7 @@ "SETUP_REQUIRED": "需要完成初始设置。", "DATABASE_NOT_EMPTY": "目标数据库已有用户。请改用空库,或直接登录现有管理员账户。", "BACKUP_DRIVER_MISMATCH": "该备份与当前数据库引擎不一致(SQLite 与 PostgreSQL 不能互恢)。请将运行时切回备份所用引擎后再恢复,或在当前引擎上重新备份。暂不支持跨引擎恢复。", + "BACKUP_SCHEMA_INCOMPATIBLE": "该备份使用数据库结构版本 {{archive_schema_version}},当前 Octop 版本无法恢复(最高支持版本:{{runtime_schema_version}})。", "BACKUP_IN_PROGRESS": "已有备份或恢复任务正在进行,请稍后再试。", "FORBIDDEN": "没有权限。", "NOT_FOUND": "未找到。", diff --git a/src/octop/i18n/en.json b/src/octop/i18n/en.json index 23be7618..bfc59a0a 100644 --- a/src/octop/i18n/en.json +++ b/src/octop/i18n/en.json @@ -312,6 +312,7 @@ "SETUP_REQUIRED": "Initial setup is required.", "DATABASE_NOT_EMPTY": "The target database already has users. Use an empty database, or log in with the existing admin.", "BACKUP_DRIVER_MISMATCH": "This backup was made with a different database engine (SQLite vs PostgreSQL). Switch the runtime to match the backup, or create a new backup on the current engine. Cross-engine restore is not supported.", + "BACKUP_SCHEMA_INCOMPATIBLE": "This backup uses database schema version {archive_schema_version}, which cannot be restored by this Octop version (maximum supported: {runtime_schema_version}).", "BACKUP_IN_PROGRESS": "A backup or restore is already in progress. Try again shortly.", "FORBIDDEN": "Permission denied.", "NOT_FOUND": "Not found.", diff --git a/src/octop/i18n/zh.json b/src/octop/i18n/zh.json index b1c3952b..4fbaf172 100644 --- a/src/octop/i18n/zh.json +++ b/src/octop/i18n/zh.json @@ -312,6 +312,7 @@ "SETUP_REQUIRED": "需要完成初始设置。", "DATABASE_NOT_EMPTY": "目标数据库已有用户。请改用空库,或直接登录现有管理员账户。", "BACKUP_DRIVER_MISMATCH": "该备份与当前数据库引擎不一致(SQLite 与 PostgreSQL 不能互恢)。请将运行时切回备份所用引擎后再恢复,或在当前引擎上重新备份。暂不支持跨引擎恢复。", + "BACKUP_SCHEMA_INCOMPATIBLE": "该备份使用数据库结构版本 {archive_schema_version},当前 Octop 版本无法恢复(最高支持版本:{runtime_schema_version})。", "BACKUP_IN_PROGRESS": "已有备份或恢复任务正在进行,请稍后再试。", "FORBIDDEN": "没有权限。", "NOT_FOUND": "未找到。", diff --git a/src/octop/infra/backup/system_archive.py b/src/octop/infra/backup/system_archive.py index 783e1a44..7b4d3a2a 100644 --- a/src/octop/infra/backup/system_archive.py +++ b/src/octop/infra/backup/system_archive.py @@ -38,7 +38,7 @@ snapshot_sqlite_file, upsert_users_into_pool, ) -from octop.infra.db.migrate import _current_version, run_migrations +from octop.infra.db.migrate import _current_version, _max_discovered_version, run_migrations from octop.infra.db.pool import DatabasePool, SqlitePool from octop.infra.db.repos.agents import AgentRepo from octop.infra.db.repos.secrets import SecretRepo @@ -439,6 +439,19 @@ def restore_system_backup( details={"archive_driver": archive_driver, "runtime_driver": pool.dialect}, ) + runtime_schema_version = _max_discovered_version(pool.dialect) + if manifest.schema_version > runtime_schema_version: + details = { + "archive_schema_version": manifest.schema_version, + "runtime_schema_version": runtime_schema_version, + } + raise OctopError( + ErrorCode.BACKUP_SCHEMA_INCOMPATIBLE, + f"backup schema version {manifest.schema_version} is newer than " + f"the maximum supported version {runtime_schema_version}", + details=details, + ) + db_path = extracted / manifest.db_file if not db_path.is_file(): raise OctopError(ErrorCode.SLASH_BAD_ARGS, "backup archive missing database file") @@ -479,6 +492,23 @@ def restore_system_backup( else: raise OctopError(ErrorCode.INTERNAL_ERROR, "sqlite restore requires SqlitePool") + # Upgrade the restored database before any current-version repository or + # preservation helper queries it. This keeps old backups usable after + # tables gain required columns or are rebuilt by later migrations. + try: + run_migrations(pool) + except Exception as exc: + details = { + "archive_schema_version": manifest.schema_version, + "runtime_schema_version": runtime_schema_version, + } + raise OctopError( + ErrorCode.BACKUP_SCHEMA_INCOMPATIBLE, + f"failed to upgrade backup schema version {manifest.schema_version} " + f"to {runtime_schema_version}: {exc}", + details=details, + ) from exc + if restore_config: cfg_path = extracted / _CONFIG_DIR / "config.json" if cfg_path.is_file(): @@ -565,10 +595,6 @@ def restore_system_backup( _KNOWLEDGE_DIR, ) - # LightClaw migration exports (and older Octop backups) may ship schema v1 - # without columns added in later migrations (e.g. cron_jobs.mcp_servers). - # API restore keeps the process alive, so re-apply migrations on the live pool. - run_migrations(pool) preserved_chat_rows, skipped_chat_rows = ( restore_preserved_chats(pool, saved_chats) if saved_chats is not None else (0, 0) ) diff --git a/src/octop/infra/db/migrate.py b/src/octop/infra/db/migrate.py index 5870a22a..7af3e8b2 100644 --- a/src/octop/infra/db/migrate.py +++ b/src/octop/infra/db/migrate.py @@ -1028,7 +1028,7 @@ def _ensure_trajectory_events_postgresql(db: DatabasePool) -> None: ) conn.execute( "CREATE INDEX IF NOT EXISTS idx_trajectory_events_thread_seq " - "ON trajectory_events (thread_id, seq)" + "ON trajectory_events(thread_id, seq)" ) conn.execute( """ @@ -1048,6 +1048,121 @@ def _ensure_trajectory_events_postgresql(db: DatabasePool) -> None: ) +def _ensure_connectors_v13_schema(db: DatabasePool) -> None: + """Ensure connectors supports multiple named instances and sharing.""" + if not _table_exists(db, "connectors"): + return + if db.dialect == "postgresql": + with db.connect() as conn, conn.transaction(): + conn.execute( + "ALTER TABLE connectors DROP CONSTRAINT IF EXISTS connectors_user_id_kind_key" + ) + conn.execute( + "ALTER TABLE connectors ADD COLUMN IF NOT EXISTS shared INTEGER NOT NULL DEFAULT 0" + ) + conn.execute( + """ + WITH ranked AS ( + SELECT id, display_name, instance_id, + ROW_NUMBER() OVER ( + PARTITION BY user_id, display_name ORDER BY id + ) AS duplicate_number + FROM connectors + WHERE kind <> 'custom-mcp' + ) + UPDATE connectors AS c + SET display_name = ranked.display_name || ' (' || + right(ranked.instance_id, 6) || ')' + FROM ranked + WHERE c.id = ranked.id AND ranked.duplicate_number > 1 + """ + ) + conn.execute( + "CREATE INDEX IF NOT EXISTS idx_connectors_shared " + "ON connectors(shared) WHERE shared = 1" + ) + conn.execute( + "CREATE UNIQUE INDEX IF NOT EXISTS idx_connectors_user_display_name " + "ON connectors(user_id, display_name) WHERE kind <> 'custom-mcp'" + ) + return + + if "shared" in _table_columns(db, "connectors"): + with db.connect() as conn: + conn.execute( + "CREATE INDEX IF NOT EXISTS idx_connectors_shared " + "ON connectors(shared) WHERE shared = 1" + ) + conn.execute( + "CREATE UNIQUE INDEX IF NOT EXISTS idx_connectors_user_display_name " + "ON connectors(user_id, display_name) WHERE kind <> 'custom-mcp'" + ) + return + + with db.connect() as conn: + conn.execute("PRAGMA foreign_keys = OFF") + try: + conn.execute("BEGIN") + conn.execute("ALTER TABLE connectors RENAME TO connectors_legacy") + conn.execute( + """ + CREATE TABLE connectors ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + instance_id TEXT NOT NULL UNIQUE, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + kind TEXT NOT NULL, + display_name TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'active', + shared INTEGER NOT NULL DEFAULT 0, + mcp_server_name TEXT NOT NULL UNIQUE, + credential_blob BLOB, + credential_expires_at INTEGER, + credential_rotated_at INTEGER, + config_json TEXT, + created_at INTEGER NOT NULL, + updated_at INTEGER NOT NULL + ) + """ + ) + conn.execute( + """ + INSERT INTO connectors( + id, instance_id, user_id, kind, display_name, status, shared, + mcp_server_name, credential_blob, credential_expires_at, + credential_rotated_at, config_json, created_at, updated_at + ) + SELECT + id, instance_id, user_id, kind, + CASE + WHEN kind = 'custom-mcp' THEN display_name + WHEN ROW_NUMBER() OVER ( + PARTITION BY user_id, display_name ORDER BY id + ) = 1 THEN display_name + ELSE display_name || ' (' || substr(instance_id, -6) || ')' + END, + status, 0, mcp_server_name, credential_blob, credential_expires_at, + credential_rotated_at, config_json, created_at, updated_at + FROM connectors_legacy + """ + ) + conn.execute("DROP TABLE connectors_legacy") + conn.execute("CREATE INDEX idx_connectors_user ON connectors(user_id)") + conn.execute( + "CREATE INDEX idx_connectors_shared ON connectors(shared) WHERE shared = 1" + ) + conn.execute( + "CREATE UNIQUE INDEX idx_connectors_user_display_name " + "ON connectors(user_id, display_name) WHERE kind <> 'custom-mcp'" + ) + conn.execute("COMMIT") + except Exception: + if conn.in_transaction: + conn.execute("ROLLBACK") + raise + finally: + conn.execute("PRAGMA foreign_keys = ON") + + def _sqlite_references_threads(db: DatabasePool, table: str) -> bool: with db.connect() as conn: rows = conn.execute(f"PRAGMA foreign_key_list({table})").fetchall() @@ -1129,6 +1244,8 @@ def _reconcile_pre_squash_schema_version(db: DatabasePool) -> None: _ensure_cron_jobs_schema(db) if max_version >= 12: _ensure_trajectory_events_schema(db) + if max_version >= 13: + _ensure_connectors_v13_schema(db) with db.connect() as conn: conn.execute("UPDATE _schema_version SET version = %s", (max_version,)) return @@ -1162,6 +1279,8 @@ def _reconcile_pre_squash_schema_version(db: DatabasePool) -> None: _ensure_cron_jobs_schema(db) if max_version >= 12: _ensure_trajectory_events_schema(db) + if max_version >= 13: + _ensure_connectors_v13_schema(db) with db.connect() as conn: conn.execute("UPDATE _schema_version SET version = ?", (max_version,)) @@ -1326,3 +1445,4 @@ def run_migrations(db: DatabasePool) -> None: _ensure_thread_message_projection_schema(db) _ensure_cron_jobs_schema(db) _ensure_trajectory_events_schema(db) + _ensure_connectors_v13_schema(db) diff --git a/src/octop/infra/errors.py b/src/octop/infra/errors.py index b0b827b5..94b16e58 100644 --- a/src/octop/infra/errors.py +++ b/src/octop/infra/errors.py @@ -16,6 +16,7 @@ class ErrorCode(StrEnum): SETUP_REQUIRED = "SETUP_REQUIRED" DATABASE_NOT_EMPTY = "DATABASE_NOT_EMPTY" BACKUP_DRIVER_MISMATCH = "BACKUP_DRIVER_MISMATCH" + BACKUP_SCHEMA_INCOMPATIBLE = "BACKUP_SCHEMA_INCOMPATIBLE" BACKUP_IN_PROGRESS = "BACKUP_IN_PROGRESS" FORBIDDEN = "FORBIDDEN" NOT_FOUND = "NOT_FOUND" @@ -109,6 +110,7 @@ class ErrorCode(StrEnum): ErrorCode.SETUP_REQUIRED: 409, ErrorCode.DATABASE_NOT_EMPTY: 409, ErrorCode.BACKUP_DRIVER_MISMATCH: 400, + ErrorCode.BACKUP_SCHEMA_INCOMPATIBLE: 400, ErrorCode.BACKUP_IN_PROGRESS: 409, ErrorCode.FORBIDDEN: 403, ErrorCode.NOT_FOUND: 404, diff --git a/tests/unit/backup/test_system_archive.py b/tests/unit/backup/test_system_archive.py index c3371ba6..89d5bff2 100644 --- a/tests/unit/backup/test_system_archive.py +++ b/tests/unit/backup/test_system_archive.py @@ -1088,6 +1088,122 @@ def test_migration_restore_via_none_autodetect(tmp_path: Path) -> None: tgt_pool.close() +def test_restore_repairs_old_physical_schema_with_current_watermark(tmp_path: Path) -> None: + """Restore runs idempotent repairs when a folded migration number is unchanged.""" + source_layout = PathLayout(tmp_path / "source") + source_pool = SqlitePool(source_layout.db) + with source_pool.connect() as conn: + conn.executescript( + ( + Path(__file__).resolve().parents[3] + / "src/octop/infra/db/migrations/001_initial.sql" + ).read_text() + ) + conn.execute("UPDATE _schema_version SET version = 13") + conn.execute( + "INSERT INTO users(username, password_hash, role, created_at) " + "VALUES ('owner', 'hash', 'admin', 1)" + ) + user_id = conn.execute("SELECT id FROM users WHERE username = 'owner'").fetchone()[0] + conn.execute( + "INSERT INTO connectors(" + "instance_id, user_id, kind, display_name, mcp_server_name, created_at, updated_at" + ") VALUES ('instance-1', ?, 'github', 'GitHub', 'connector_github_1', 1, 1)", + (user_id,), + ) + + archive = tmp_path / "old-physical-schema.tar.gz" + create_system_backup( + paths=source_layout, + agent_rows=[], + pool=source_pool, + db_config=DatabaseConfig(), + dest=archive, + include_config=False, + include_workspaces=False, + ) + source_pool.close() + + target_layout = PathLayout(tmp_path / "target") + target_pool = SqlitePool(target_layout.db) + run_migrations(target_pool) + result = restore_system_backup( + archive, + paths=target_layout, + pool=target_pool, + db_config=DatabaseConfig(), + restore_config=False, + ) + + with target_pool.connect() as conn: + columns = {row["name"] for row in conn.execute("PRAGMA table_info(connectors)").fetchall()} + connector = conn.execute( + "SELECT instance_id, shared FROM connectors WHERE instance_id = 'instance-1'" + ).fetchone() + + assert result["schema_version"] == 13 + assert "shared" in columns + assert connector is not None + assert connector["shared"] == 0 + target_pool.close() + + +def test_refuse_newer_schema_backup_before_database_replace( + layout: PathLayout, tmp_path: Path +) -> None: + pool = SqlitePool(layout.db) + run_migrations(pool) + archive = tmp_path / "newer-schema.tar.gz" + create_system_backup( + paths=layout, + agent_rows=[], + pool=pool, + db_config=DatabaseConfig(), + dest=archive, + ) + + members: dict[str, bytes] = {} + with tarfile.open(archive, mode="r:gz") as tf: + for member in tf.getmembers(): + if member.isfile(): + extracted = tf.extractfile(member) + assert extracted is not None + members[member.name] = extracted.read() + manifest = json.loads(members["manifest.json"]) + manifest["schema_version"] = 999 + members["manifest.json"] = json.dumps(manifest).encode() + with tarfile.open(archive, mode="w:gz") as tf: + for name, blob in members.items(): + info = tarfile.TarInfo(name=name) + info.size = len(blob) + tf.addfile(info, BytesIO(blob)) + + with pool.connect() as conn: + conn.execute( + "INSERT INTO users(username, password_hash, role, created_at) " + "VALUES ('still-here', 'hash', 'admin', 1)" + ) + + with pytest.raises(OctopError) as excinfo: + restore_system_backup( + archive, + paths=layout, + pool=pool, + db_config=DatabaseConfig(), + ) + + assert excinfo.value.code == ErrorCode.BACKUP_SCHEMA_INCOMPATIBLE + assert excinfo.value.details == { + "archive_schema_version": 999, + "runtime_schema_version": 13, + } + with pool.connect() as conn: + assert ( + conn.execute("SELECT 1 FROM users WHERE username = 'still-here'").fetchone() is not None + ) + pool.close() + + def test_refuse_cross_engine_restore(layout: PathLayout, tmp_path: Path) -> None: pool = SqlitePool(layout.db) run_migrations(pool) diff --git a/tests/unit/db/test_db_pool.py b/tests/unit/db/test_db_pool.py index 0cc116b7..9e63da79 100644 --- a/tests/unit/db/test_db_pool.py +++ b/tests/unit/db/test_db_pool.py @@ -360,6 +360,50 @@ def test_ahead_of_max_schema_version_clamps_to_max(tmp_path: Path) -> None: assert "user_invites" in invite_tables +def test_current_watermark_repairs_pre_v13_connectors_schema(tmp_path: Path) -> None: + """A folded v13 schema change is repaired even when migration 013 is skipped.""" + pool = SqlitePool(tmp_path / "octop.db") + with pool.connect() as conn: + conn.executescript( + ( + Path(__file__).resolve().parents[3] + / "src/octop/infra/db/migrations/001_initial.sql" + ).read_text() + ) + conn.execute("UPDATE _schema_version SET version = 13") + conn.execute( + "INSERT INTO users(username, password_hash, role, created_at) " + "VALUES ('owner', 'hash', 'admin', 1)" + ) + user_id = conn.execute("SELECT id FROM users WHERE username = 'owner'").fetchone()[0] + conn.execute( + "INSERT INTO connectors(" + "instance_id, user_id, kind, display_name, mcp_server_name, created_at, updated_at" + ") VALUES ('instance-1', ?, 'github', 'GitHub', 'connector_github_1', 1, 1)", + (user_id,), + ) + + run_migrations(pool) + + with pool.connect() as conn: + columns = {row["name"] for row in conn.execute("PRAGMA table_info(connectors)").fetchall()} + user_id = conn.execute("SELECT id FROM users WHERE username = 'owner'").fetchone()[0] + conn.execute( + "INSERT INTO connectors(" + "instance_id, user_id, kind, display_name, mcp_server_name, created_at, updated_at" + ") VALUES ('instance-2', ?, 'github', 'GitHub Work', 'connector_github_2', 1, 1)", + (user_id,), + ) + count = conn.execute( + "SELECT COUNT(*) FROM connectors WHERE user_id = ? AND kind = 'github'", + (user_id,), + ).fetchone()[0] + + assert "shared" in columns + assert count == 2 + pool.close() + + def test_foreign_keys_enabled(db: SqlitePool): with db.connect() as conn: fk = conn.execute("PRAGMA foreign_keys").fetchone()[0] From 1c23cc86ec5ae128be5f0b27b316639ae563dbda Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Sun, 6 Sep 2026 03:53:30 +0000 Subject: [PATCH 58/58] chore: release 0.9.32 Co-authored-by: Cursor --- CHANGELOG.md | 39 ++++++++++++++++----------------------- README.md | 2 +- pyproject.toml | 2 +- src/octop/__init__.py | 2 +- uv.lock | 2 +- 5 files changed, 20 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c8a35e7..8a8dcb2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,35 +6,28 @@ ## [Unreleased] -### 变更 - -- 聊天**运行轨迹**改为宽抽屉打开(与工作台一致),采用 DeepSeek 风格时间线交互、检查器与工具栏 +## [0.9.32] - 2026-09-06 ### 新增 -- 聊天运行轨迹宽抽屉:时间线泳道、检索与折叠、会话指标与导出;点击事件可查看完整载荷 -- 运行轨迹从 harness 实况汇聚回合上下文(记忆 / 技能等),并为工具突发合成 ASSISTANT 父节点 -- 知识库支持更多文本与表格格式(csv / tsv / html / json / yaml / xls / xlsx / xlsm 等) -- 知识库可选 OCR:本地 RapidOCR(ONNX)或在线视觉模型;支持 png / jpg / webp,扫描 PDF 无文字时自动回退 -- 知识库上传显示逐文件进度 -- 聊天消息列表左侧回合时间轴:按用户回合显示刻度,悬停预览、点击跳转、滚动联动;宽屏且至少两轮对话时显示 -- 飞书频道改为官方 `lark-oapi` 扫码创建应用,凭据自动回填(不再走浏览器 CDP) -- 远程手机:主机缺少 Docker 时自动安装——纯测速选择安装源(官方 download.docker.com 与境内镜像竞速,官方最快则不设 DOWNLOAD_URL),通过**内置的官方 get.docker.com 脚本**(`scripts/linux/v1.0/install-docker.sh`,含 TencentOS/OpenCloudOS releasever 映射等增强)安装;安装后按腾讯云镜像加速可达性决定是否写入 `registry-mirrors`(不检测地区,连不上则跳过)。自动安装失败时回退为提示用户手动安装。 -- Docker 自动安装报错兼容:脚本输出尾部按已知失败模式(不支持的发行版、无 root 权限、网络/curl 失败、包管理器锁死、GPG 密钥、磁盘满、已有 Docker)追加本地化修复提示;脚本启动失败、长时间无输出(卡死看门狗)、脚本缺失均有独立提示;重启失败提示手动启动命令。 +- 聊天运行轨迹抽屉与回合时间轴;人机确认以可读审批卡片展示 +- 知识库支持更多文档格式与可选 OCR,上传显示进度 +- 定时任务支持名称,计划回合持久化 +- 备份可选择归档内容;连接器支持多实例与共享;插件可按智能体开关 +- OpenSandbox 远程沙箱;工作台浏览器按用户隔离 profile +- 飞书扫码创建应用;远程手机可自动安装 Docker +- 桌面端 Windows NSIS 安装包与 macOS DMG;未知路由 404 页 ### 修复 -- 桌面客户端打包把 `pyproject.toml` 版本写入 macOS Info.plist、Windows 文件版本和 NSIS 安装器,不再沿用写死的旧号 -- 用户发布专家卡片展示快照内自定义头像(`icon_url` + `/api/experts/published/{id}/avatar`),不再只显示默认 Lucide 图标 -- 用户管理表格(桌面端)横向滚动时固定用户名与操作列(与专家列表一致;移动端不固定) -- 运行轨迹流式事件在内存聚合、回合边界持久化,避免逐 token 写库和重复存储上下文全文 -- 运行轨迹 Turns / Calls 折叠与耗时投影:历史缺 `turn_id` / 时长时回退为 USER 边界与内容体量估算,避免开关无效 -- 知识库表格模式宽屏仍出现多余水平滚动条(列宽拖拽手柄越出最后一列) -- 聊天右侧停靠/弹窗工具栏避开无边框窗口按钮,避免与红绿灯重叠 -- 桌面启动页改为白底卡片和底部进度条;Windows 设置窗加高,避免底边距被裁掉 -- 桌面壳内隐藏「安装为桌面应用」,避免在已原生窗口里再提示 PWA 安装 -- 日志按大小+按日轮转,并采用 logrotate 风格的 `compress` + `delaycompress`(最新一份轮转文件暂不 gzip,下一轮再压;用 Python 标准库,Windows 可用) -- 远程手机自动安装 Docker 后,非 root 时用 `sudo -n` 写 `daemon.json` 并重启 dockerd +- 旧备份在 schema 变更后可恢复;桌面打包版本与应用元数据对齐 +- 主动关怀时区、专家卡片头像、用户表固定列 +- 运行轨迹写库开销、日志轮转、通道二维码轮询与远程 Docker 安装权限 + +### 变更 + +- 语音与搜索设置迁到模型页;控制台改用 OctopSpinner +- 默认管理员凭据改为首次运行写入 `~/octop-login.txt` ## [0.9.31] - 2026-09-01 diff --git a/README.md b/README.md index d870d209..5fa76ec2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@

    Python 3.12+ License: MIT - Version + Version PyPI Code Style: Ruff GitHub stars diff --git a/pyproject.toml b/pyproject.toml index c95ad49f..b6d02b21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "octop" -version = "0.9.31" +version = "0.9.32" description = "Smarter self-hosted AI assistant for multiple users and agents, built on harness-agent" readme = "README.md" license = { text = "MIT" } diff --git a/src/octop/__init__.py b/src/octop/__init__.py index b6ecd974..e579980e 100644 --- a/src/octop/__init__.py +++ b/src/octop/__init__.py @@ -2,4 +2,4 @@ from __future__ import annotations -__version__ = "0.9.31" +__version__ = "0.9.32" diff --git a/uv.lock b/uv.lock index bcc49f4a..07472c1b 100644 --- a/uv.lock +++ b/uv.lock @@ -2502,7 +2502,7 @@ wheels = [ [[package]] name = "octop" -version = "0.9.31" +version = "0.9.32" source = { editable = "." } dependencies = [ { name = "acme" },