From 8cc4e08df761823a3bf4d7df8bb15b96490d4232 Mon Sep 17 00:00:00 2001 From: Developer Date: Sun, 1 Nov 2026 23:37:19 +0800 Subject: [PATCH 1/7] feat(agent-team): add Agent Teams plugin with shared task board panel --- assets/agent-team/icon.png | Bin 0 -> 5715 bytes external_plugins/agent-team/.mcp.json | 24 + .../agent-team/.zcode-plugin/plugin.json | 70 + external_plugins/agent-team/CHANGELOG.md | 145 + external_plugins/agent-team/LICENSE | 21 + external_plugins/agent-team/README.md | 282 + external_plugins/agent-team/README_CN.md | 282 + .../agent-team/THIRD-PARTY-NOTICES.md | 312 + external_plugins/agent-team/commands/team.md | 50 + .../docs/assets/manual/card-dark.png | Bin 0 -> 123269 bytes .../docs/assets/manual/card-light.png | Bin 0 -> 122703 bytes .../docs/assets/manual/cli-text-summary.png | Bin 0 -> 33071 bytes .../docs/assets/manual/cli-version.png | Bin 0 -> 23303 bytes .../docs/assets/manual/market-personal.png | Bin 0 -> 317692 bytes .../docs/assets/manual/market-sources.png | Bin 0 -> 155395 bytes .../docs/assets/manual/panel-final.png | Bin 0 -> 556198 bytes .../docs/assets/manual/panel-running.png | Bin 0 -> 193083 bytes .../docs/assets/manual/settings-enabled.png | Bin 0 -> 77063 bytes .../docs/assets/manual/tool-permission.png | Bin 0 -> 192147 bytes .../docs/assets/manual/uninstall-confirm.png | Bin 0 -> 35979 bytes .../docs/assets/manual/update-available.png | Bin 0 -> 317513 bytes ...77\347\224\250\346\211\213\345\206\214.md" | 166 + external_plugins/agent-team/hooks/hooks.json | 41 + .../agent-team/runtime/app-server-bridge.mjs | 76 + .../agent-team/runtime/detach-helper.mjs | 61 + .../agent-team/runtime/team-ctl.mjs | 7093 ++++ .../agent-team/runtime/team-daemon.mjs | 27219 ++++++++++++++++ .../agent-team/runtime/team-hooks.mjs | 5447 ++++ .../agent-team/runtime/ui/companion.js | 1092 + .../agent-team/runtime/ui/panel.js | 16048 +++++++++ .../agent-team/runtime/ui/team-companion.html | 1105 + .../agent-team/runtime/ui/team-panel.html | 16061 +++++++++ .../skills/team-coordination/SKILL.md | 43 + marketplace.json | 29 + 34 files changed, 75667 insertions(+) create mode 100644 assets/agent-team/icon.png create mode 100644 external_plugins/agent-team/.mcp.json create mode 100644 external_plugins/agent-team/.zcode-plugin/plugin.json create mode 100644 external_plugins/agent-team/CHANGELOG.md create mode 100644 external_plugins/agent-team/LICENSE create mode 100644 external_plugins/agent-team/README.md create mode 100644 external_plugins/agent-team/README_CN.md create mode 100644 external_plugins/agent-team/THIRD-PARTY-NOTICES.md create mode 100644 external_plugins/agent-team/commands/team.md create mode 100644 external_plugins/agent-team/docs/assets/manual/card-dark.png create mode 100644 external_plugins/agent-team/docs/assets/manual/card-light.png create mode 100644 external_plugins/agent-team/docs/assets/manual/cli-text-summary.png create mode 100644 external_plugins/agent-team/docs/assets/manual/cli-version.png create mode 100644 external_plugins/agent-team/docs/assets/manual/market-personal.png create mode 100644 external_plugins/agent-team/docs/assets/manual/market-sources.png create mode 100644 external_plugins/agent-team/docs/assets/manual/panel-final.png create mode 100644 external_plugins/agent-team/docs/assets/manual/panel-running.png create mode 100644 external_plugins/agent-team/docs/assets/manual/settings-enabled.png create mode 100644 external_plugins/agent-team/docs/assets/manual/tool-permission.png create mode 100644 external_plugins/agent-team/docs/assets/manual/uninstall-confirm.png create mode 100644 external_plugins/agent-team/docs/assets/manual/update-available.png create mode 100644 "external_plugins/agent-team/docs/\344\275\277\347\224\250\346\211\213\345\206\214.md" create mode 100644 external_plugins/agent-team/hooks/hooks.json create mode 100644 external_plugins/agent-team/runtime/app-server-bridge.mjs create mode 100644 external_plugins/agent-team/runtime/detach-helper.mjs create mode 100644 external_plugins/agent-team/runtime/team-ctl.mjs create mode 100644 external_plugins/agent-team/runtime/team-daemon.mjs create mode 100644 external_plugins/agent-team/runtime/team-hooks.mjs create mode 100644 external_plugins/agent-team/runtime/ui/companion.js create mode 100644 external_plugins/agent-team/runtime/ui/panel.js create mode 100644 external_plugins/agent-team/runtime/ui/team-companion.html create mode 100644 external_plugins/agent-team/runtime/ui/team-panel.html create mode 100644 external_plugins/agent-team/skills/team-coordination/SKILL.md diff --git a/assets/agent-team/icon.png b/assets/agent-team/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2a545184afd34fa9ae32319b9f2e5bf6bee3bba4 GIT binary patch literal 5715 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 S*MVm#Ff-Y)CCkVq^8Wykx<3v8 literal 0 HcmV?d00001 diff --git a/external_plugins/agent-team/.mcp.json b/external_plugins/agent-team/.mcp.json new file mode 100644 index 00000000..db48285c --- /dev/null +++ b/external_plugins/agent-team/.mcp.json @@ -0,0 +1,24 @@ +{ + "mcpServers": { + "team-daemon": { + "type": "stdio", + "command": "node", + "args": [ + "${ZCODE_PLUGIN_ROOT}/runtime/team-daemon.mjs" + ], + "cwd": "${ZCODE_PROJECT_DIR}", + "env": { + "TEAM_PLUGIN_DATA": "${ZCODE_PLUGIN_DATA}", + "TEAM_PROJECT_DIR": "${ZCODE_PROJECT_DIR}", + "TEAM_PLUGIN_ROOT": "${ZCODE_PLUGIN_ROOT}", + "TEAM_MAX_MEMBERS": "${user_config.maxMembers}", + "TEAM_MAX_TASKS": "${user_config.maxTasks}", + "TEAM_MAX_MESSAGE_BYTES": "${user_config.maxMessageBytes}", + "TEAM_DISPOSAL_TIMEOUT_MS": "${user_config.disposalTimeoutMs}", + "TEAM_INTERRUPT": "${user_config.interrupt}", + "TEAM_LEAD_MODE": "${user_config.leadMode}" + }, + "timeoutMs": 3600000 + } + } +} \ No newline at end of file diff --git a/external_plugins/agent-team/.zcode-plugin/plugin.json b/external_plugins/agent-team/.zcode-plugin/plugin.json new file mode 100644 index 00000000..c4b3c605 --- /dev/null +++ b/external_plugins/agent-team/.zcode-plugin/plugin.json @@ -0,0 +1,70 @@ +{ + "name": "agent-team", + "version": "0.4.3", + "description": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。", + "description_i18n": { + "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", + "zh-CN": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。" + }, + "author": { + "name": "Vincent Zuo", + "url": "https://github.com/Vincent-chk" + }, + "license": "MIT", + "userConfig": { + "maxMembers": { + "title": "最大成员数", + "description": "团队内 teammate 数量上限(不含 Lead;含 failed)。", + "type": "number", + "default": 8 + }, + "maxTasks": { + "title": "最大任务数", + "description": "任务板任务数量上限。", + "type": "number", + "default": 256 + }, + "maxMessageBytes": { + "title": "单条消息字节上限", + "description": "成员间单条消息的最大字节数。", + "type": "number", + "default": 65536 + }, + "disposalTimeoutMs": { + "title": "处置超时(毫秒)", + "description": "团队处置(teammate 结算与回收)的超时时间。", + "type": "number", + "default": 5000 + }, + "interrupt": { + "title": "启用 interrupt_agent 工具", + "description": "关闭后团队成员只拿到 8 个工具(interrupt_agent 不注册);域 API 仍可用。", + "type": "boolean", + "default": true + }, + "leadMode": { + "title": "Lead 模式", + "description": "orchestrator(默认):Lead 自主组队/分配/独立验收,专注编排不亲自实现;collaborator:保持原口径,由用户指示建队。取值:orchestrator 或 collaborator。", + "type": "string", + "default": "orchestrator" + } + }, + "skills": "skills", + "commands": "commands", + "hooks": "hooks/hooks.json", + "ui": { + "surfaces": [ + { + "id": "agent-team-panel", + "title": { + "zh-CN": "智能体团队", + "en": "Agent Team" + }, + "icon": "users", + "server": "team-daemon", + "resourceUri": "ui://agent-team/team-panel.html", + "availability": "session" + } + ] + } +} diff --git a/external_plugins/agent-team/CHANGELOG.md b/external_plugins/agent-team/CHANGELOG.md new file mode 100644 index 00000000..eb8a2248 --- /dev/null +++ b/external_plugins/agent-team/CHANGELOG.md @@ -0,0 +1,145 @@ +# Changelog + +## 0.4.3 — 2026-11-01 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- 产物目录 `dist/` 全局更名为 `runtime/`(ZCode 官方插件市场仓库不收录 `external_plugins/*/dist/` 构建产物目录名):`.mcp.json`、`hooks/hooks.json`、`/team` 命令文档与全部构建/测试/演练脚本同步改引用,行为无变化。 +- 面向插件市场发布适配:`README.md` 重写为英文用户文档,新增等价中文 `README_CN.md`(随包分发),两份均新增「网络访问、依赖与副作用」申报章节;manifest author 补充主页 URL。 +- 面板入口文档落到具体路径(issue #8):README 给出官方宿主通用路径(「+」→「查看所有插件」→「个人」→「智能体团队」→「打开」)与宿主含「新标签页」入口时的快捷路径;`/team` 桌面指引同步具体化。 +- 本地验收:**849 用例 / 72 文件**全部通过;`npm run check`(typecheck + ZCode 清单校验 + daemon 冒烟 12 项)通过;覆盖率与既有门槛不变。真机验收记录见 PR 材料。 + +## 0.4.2 — 2026-10-26 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- 修正成员实际选模判断:宿主选模条目缺失或损坏时重新应用 Lead 选择,历史调用记录不能证明下一轮 `--resume` 的模型。 +- 首轮启动前仍复核 Lead 最新选择,处理培育期间换模;刚应用的选择未变时免重复 RPC。 +- 真实子进程非零退出按临时故障退避;失败前已排队的消息合并进失败记录,避免被误当成新消息触发额外重试。 +- 创建预检保留原有重名、名额错误顺序;单次继承判定复用同一目录快照,删除未使用的重试返回值与后台重复抑制日志。 +- 校正既有 v6 验收材料的证据范围:真实模型调用通过不代表真实输入框与 `/model` 切模交互已经验收。 +- 本地验收:**849 用例 / 72 文件**全部通过;覆盖率 statements **91.61%**、branches **85.15%**、functions **92.55%**、lines **93.4%**,原门槛不变。构建、类型检查、ZCode 清单校验、daemon 冒烟、四方版本校验通过;视觉 76 页零漂移、伴生交互 17 项、文本审计 23 项通过。尚未更新本机安装副本或进行本版本真实 ZCode 界面切模验收。 + +## 0.4.1 — 2026-10-26 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **成员模型自动跟随修复轮**(0.4.0 验收发现的 5 个问题全部关闭;无契约/工具面变更,模型可见工具仍 9 个): + - **一致性判断改以宿主实际状态为准**:每轮同步前比对的是成员会话在宿主库中的实际选择(`session_entry` 选模条目 → `main_turn` 实际调用),`origin.modelSelection` 降为辅助记录——setModel 成功后、origin 更新前崩溃的恢复盘面不再凭 origin 相同就放行;实际状态无法确认时重新应用 Lead 选择;仅思考强度变化同样识别并同步;首轮已由 createChild 定模的不重复应用(零冗余 setModel)。 + - **失败可见性与重试控制**:解析失败与宿主应用失败统一落 `model-failed.json`(新增 `kind`/`attempts`/`nextAttemptAt`/`leadSignature`/`messageIds` 字段;不重建 pending 队列)。确定性拒绝(官方套餐/目录外/宿主明确不支持)暂停相同选择的自动重试;临时故障(超时/进程/app-server 未就绪)按 5s/15s/30s 退避、最多自动重试 3 次;Lead 换模或用户再次明确发送新消息即解锁。后台补投失败经宿主装配的通知钩子立即刷新成员展示(不等下一次轮次边界);消息持久保留、不误标 delivered。修复前同一条消息 6 秒内会重复 4 次 setModel 尝试,现在只尝试 1 次。 + - **创建前校验移到成员登记之前**:新增 provider `preflightMemberModel()`,roster 在写入 provisioning 事件前调用——Lead 用官方套餐/无可确认模型/已删除 Provider 时,spawn 请求明确失败且**不增加成员数量、不占用成员名、不创建隐藏子会话**;修正 Lead 模型后原名可重用。供给阶段复检保留(处理预检后配置漂移);真实供给失败仍是原 failed 成员语义。 + - **旧失败提示按验证成功清除**:宿主实际状态确认「成员与 Lead 已一致」时(无需额外 setModel)即清除旧失败记录与成员行诊断;仅 Lead 改了配置而未恢复成功时提示保留。 + - 既有 [v6 脚本](../zcode-agent-team-plan/stage-8-model-config/e2e-real-model-041.mjs)与[结果报告](../zcode-agent-team-plan/stage-8-model-config/e2e-real-model-041-evidence.json)记录六场景 ALL_PASS(创建继承 / 提交快照注入后跟随 / 选模条目注入后跟随 / daemon 重启恢复团队 / 套餐阻止+抑制 / 切回恢复交付恰一次)。这是**真实模型调用集成验收,切模事件由测试脚本注入,不包含真实输入框或 `/model` UI 交互**;宿主实际调用、会话选择和成员落库记录用于核验运行结果,不代表桌面切模交互已通过验收。两份材料位于本仓库之外。 +- 测试 787 → **840**(72 文件;两轮稳定);覆盖率 branches 83.25% → **85.12%**(达 85% 门槛;0.4.0 时点为既有技术债),statements/functions/lines ≥90% 保持;视觉基线 76 页零漂移;伴生面板交互 17 项全过。 + +## 0.4.0 — 2026-10-25 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **破坏性变更:成员模型全部收敛为「自动跟随 Lead」一条路线**。没有单独的成员模型配置——以下通道整体注销: + - 面板成员卡右上角**齿轮 + 模型设置弹窗**(含 `team_panel_call` 的 `modelOptions`/`setMemberModel` 两个动作)删除;面板恢复**零变更只读通道**口径(任务板/成员/详情不变)。 + - 对话工具 **`member_set_model` 删除**(模型可见工具 10 → 9;`interrupt:false` 时 8)。 + - `spawn_teammate` 的 **`model` / `thoughtLevel` 参数删除**;MCP 资源 **`team://models` 下线**(模型目录仅 provider 层内部分类使用,白名单脱敏纪律不变)。 +- **继承机制重做(三源判定 + 每轮执行前同步)**: + - Lead「最新已确认模型」= 三路按时间戳取最新:① 真实用户**提交消息时**宿主写入的模型快照(输入框切换在提交瞬间生效——修正对宿主 issue #7「条目不随输入框切换刷新」的依赖);② 会话选模记录(`/model` 命令刷新);③ 主轮实际模型调用(`query_source='main_turn'` 严格过滤,compact/标题生成/subagent/workflow 等辅助行绝不会被当成 Lead 模型)。旧「条目优先、usage 兜底」固定优先级删除。 + - 同步点 = 成员**每次开始执行前**(`launchTurn` 统一入口,首轮/消息唤醒/恢复团队三路共用):与成员实际生效选择比对,**有变化才应用**(零变化零开销);运行中的成员本轮跑完后在下一轮开始时同步(不打断已有工作);急需切换用现有中断能力结束当前轮次再续跑。 + - **失败绝不静默**:官方 coding plan 套餐(`account:*`/`builtin:*`)、Provider 已删/禁用、解析不出、setModel 被拒——一律**显式报错**(创建失败不落成员;续跑则阻止该轮启动),不再回退宿主缺省冒充继承成功,也不会把旧第三方模型显示为「同步成功」。成员卡保留一行继承失败诊断兜底。 + - 无后台监听、无新配置文件、无模型配置表;`model-pending.json` 队列机器删除。 + - 保留:空目录守卫(目录不可读 = 无法分类 → 照旧尝试、宿主终审)、档位缺省链(defaultVariant → max)、origin 只记实际生效者(`modelSource` 恒 `inherited`;`explicit` 仅历史数据兼容读取)。 +- **README/使用手册新增硬性边界声明**:不支持直接继承 GLM 等官方 coding plan 模型配置——成员模型必须来自你在 ZCode 设置中自配的第三方 Provider;Lead 使用套餐模型时团队创建/续跑会报错并指引切换。 +- 测试 878 → **787**(成员独立配置通道的 ~90 例随功能注销;继承/同步按新语义重写:三源各路取胜/陈旧条目跟提交/`/model` 跟条目/辅助行过滤/三种不可继承抛错/空目录守卫/每轮同步成功与阻止/套餐切换阻止/legacy 不应用;视觉基线 80 → 76 页,settings 4 张随弹窗下线,全页面反向断言「无齿轮/无弹窗/零凭据输入」)。 +- 文档回写:traceability §18 历史台账保留并标注注销关系,新增 §19(F39 收敛登记);架构说明数据流/降级表/模块地图同步 0.4.0 口径。 + +## 0.3.2 — 2026-10-25 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **第三方模型继承精化(分类优先绕过官方套餐)**: + - spawn 默认继承只覆盖**模型目录(Provider 注册表)内**的自配第三方模型;Lead 使用官方 coding plan 套餐(`account:*` / `builtin:*` Provider)时**零 setModel 尝试**直接回退宿主缺省,不再产生必败 RPC 与失败日志噪音。 + - 继承链按目录过滤 `session_entry` → `model_usage`(空目录守卫:目录不可读时不过滤,照旧由宿主终审);新导出 `catalogSupports(catalog, selection)` 作为唯一分类判据。 + - 跳过仍写 `model-failed.json`(防可见性回归),诊断区分两态:官方套餐 →「Lead 当前使用官方套餐模型(provider/model),成员无法继承,已回退宿主缺省;可在 spawn 时指定自配模型或改用第三方模型」;其他目录外模型 →「Lead 模型 provider/model 不在可用目录,已回退宿主缺省」。 + - 显式指定通道与「尝试后失败」路径一字未动(无契约/工具面变更,backend/面板零改动);origin 仍只记实际生效者。 + - README §2.1 与使用手册补继承边界声明。 +- **取消「简洁/详细」双模式**:成员会话查看视图固定为按轮摘要一种形态。 + - 每轮显示**用户指令 + 动作组 + 每轮结论**:动作组(`toolGroup`)一行汇总本轮全部工具,点击就地展开逐条工具(名称/状态/载荷);本轮最后一条非空 assistant 文本作为该轮结论。 + - **全量转录不进视图**:需要原始记录时走 `team-ctl`/事件日志/宿主会话库。 + - 计数显示「n 条 · 共 sourceTotal 条转录」(`sourceTotal` = 投影前原始条数)。 + - **mode 参数与切换按钮全部移除**:`team_panel_call` 的 detail 请求/响应均无 `mode`,面板与伴生页无模式切换按钮;CLI 删 `--mode`(`team-ctl transcript ` 即摘要形态)。 + - 契约写实保留:`items.kind` 为 `"text"|"toolCall"|"toolGroup"`;`kind:"toolResult"` 从未独立实现,工具结果并入 `toolCall` 载荷。 + - README / 使用手册 / 架构说明 / 运维手册 / 测试手册 / 命令文档 / 追溯矩阵同步改写为单一摘要口径。 +- 测试 875 → **878**(本机 env 净化实测两轮稳定,75 文件;分类五态 + `catalogSupports` 新增)。 +- 视觉基线 **80 页不变**(无 UI 变更)。 +- 模型可见工具面与成员/任务行为不变(仍 10 工具,`interrupt:false` 时 9)。 + +## 0.3.1 — 2026-10-25 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **修复 GitHub #6:模型/思考强度设置失败全程无提示**(单次尝试语义,全链路可见): + - `member_set_model` 失败不再包装成"下一轮生效":空闲成员立即应用失败直接返回 `applied:"failed"` 与宿主原因原文(如"Provider Registry 中不存在 Model"),不落 pending——消灭"每轮静默重试每轮失败"的无限循环。 + - 失败落 `model-failed.json` 并在三个面立即可见:`list_agents` 成员行 diagnostics(对话通道)、面板成员卡诊断行、模型弹窗"上次设置未生效:…(原因)"错误色提示;成员列表模型名保持真实值,不再维持"快成功"观感。 + - 运行中成员的"下一轮生效"若应用失败 = 终态(删 pending + 记失败 + 继续旧模型跑轮)。 + - spawn 继承降级(Lead 模型不可用于成员,如订阅套餐型)同样落诊断——#5 的可见性半边(能力仍待宿主开放)。 + - 任一次成功应用清除失败记录;`02 规格 §9.13` 描述补失败语义(F01 双源同步)。 +- 测试 864 → 875;真模型 E2E 十一步 ALL_PASS(含失败路径三面可见性)。 + +## 0.3.0 — 2026-10-25 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **成员会话查看视图新增「简洁/详细」双模式**(detail 契约〔视图修订 2026-10-25〕): + - 默认**简洁**(`mode:"summary"`):按轮投影为「用户指令 + 每轮动作组 + 每轮最终结论」;动作组(`toolGroup`)一行汇总,点击就地展开逐条工具(名称/状态/载荷)。 + - **详细**(`mode:"full"`):修订前的全量转录流,供审计与排障;行为逐字不变。 + - `team_panel_call` 的 detail 请求新增 `mode`(缺省 `summary`);响应回显 `mode` 并新增 `sourceTotal`(投影前原始条数);`items.kind` 增 `toolGroup`(`count` + `tools[]`)。 + - **契约写实**:`kind:"toolResult"` 从未独立实现——工具结果并入 `toolCall` 载荷;本次只改文档口径,不新增类型、不改数据源。 + - **跨模式 `seq`/`cursor` 不通用**:切换模式重置到末页(面板/伴生页);CLI 每次调用独立。 + - CLI 对等:`team-ctl transcript --mode summary|full`(缺省 summary,与面板共用同一合成函数)。 + - 面板与伴生页新增模式切换按钮;README / 使用手册 / 架构说明 / 运维手册 / 命令文档 / 追溯矩阵同步更新。 +- 测试 836 → **864 passed**(`test/panel/detail.test.ts` 16 → 26;`test/ui-core/detail-render.test.ts` 17 → 28)。 +- 视觉基线 76 → **80 页**(新增 detail-summary × light/dark × zh/en 共 4 页)。 +- 模型可见工具面与成员/任务行为不变(仍 10 工具,`interrupt:false` 时 9)。 +- 遗留登记(GitHub issue 跟踪):详情文本 markdown/代码块排版未实现(当前纯文本);`toolResult` 契约偏差已写实;U03 盲测仍未执行;模式选择不跨面板重开保持。 + +## 0.2.0 — 2026-10-25 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **teammate 模型可配置化**(F33–F36,02 规格 §9.13/§10 修订): + - spawn 默认**继承 Lead 的模型与思考强度**(Lead 会话 `runtime/model_selection` 权威条目 → `model_usage` 兜底;条目不可用时兜底重试一次,origin 只记实际生效者)。 + - `spawn_teammate` 新增可选参数 `model`(`"providerId$modelId"` 或裸 modelId,经 `team://models` 目录消歧)与 `thoughtLevel`。 + - 新增第 10 个工具 **`member_set_model`**:mid-life 修改成员模型/思考强度;空闲成员立即生效,运行中成员下一轮生效(pending 标记 + 下轮兜底)。 + - 新增只读资源 **`team://models`**:模型目录(运行时注册表 `provider_config.json` 白名单投影,含 config.json 回退;**绝不输出 apiKey/baseURL**)。 + - 面板成员卡右上角**齿轮 → 模型设置弹窗**:provider/模型/思考强度三级联动、当前生效值与来源标识(继承自 Lead / spawn 指定 / 手动修改 / CLI 缺省)、高级模式引导(ZCode 设置加 provider 后刷新;弹窗零凭据输入)。`team_panel_call` 新增 `modelOptions`/`setMemberModel` 两动作——面板通道首个(且唯一)受控变更动作,任务板仍零变更。 + - 生效机制:会话库 `session_entry(runtime/model_selection)`(`session/setModel`,`persistAsWorkspaceLastUsed:false`),headless `--resume` 每轮自动恢复;一次设置全轮次生效。 +- 测试 697 → 836;视觉基线 72 → 76(重录 28 + 新增 settings 弹窗 4)。 + +## 0.1.3 — 2026-10-24 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- 写域重叠警告仅挂双方 `in_progress` 的任务对(成对对称):主体为 `completed`/`pending` 时不再产生警告。 +- 面板 advisory 警告色由错误红降为警告黄(新增语义令牌 `--at-warning-text`);红色仅保留给真报错。 +- **无 MCP 契约/schema 变化**:工具清单、入参/出参与 TASK_VIEW 字段不变,仅派生口径与颜色变化。 + +## 0.1.2 — 2026-10-24 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- 文档定稿版:README 补齐安装/启用/快速上手/工具速查/配置/Node 自检/卸载数据处置/故障排查/宿主基线/限制与偏差(D1–D27)。 +- 新增《使用手册》(含桌面 MCP Apps 面板、::visualize 卡片、CLI 文本摘要与静态卡片实拍截图),并随包分发(`docs/使用手册.md` 与 `docs/assets/manual/`)。 +- 仓库新增内部移交文档:架构说明(as-built)、运维手册、测试手册(不随包分发)。 +- **无运行时行为变更**:与 0.1.1 相比仅文档与包内文档资源变化;阶段二的 0.1.0→0.1.1 升级演练证据继续有效。 + +## 0.1.1 — 2026-10-24 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- 升级演练版本:功能与 0.1.0 相同,仅版本号与发布元数据变化,用于验证 0.1.0 → 0.1.1 的升级路径。 + +## 0.1.0 — 2026-10-24 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- 首个发布包:stage-1–6 交付内容(域核心、工具面、队友运行时、MCP Apps 面板、成员会话隔离)打包为可安装插件。 +- 随包提供 `LICENSE`(MIT)与 `THIRD-PARTY-NOTICES.md`(bundle 内联依赖的许可声明)。 +- 构建基线:Node ≥ 22;宿主实测基线 Desktop 3.16.2 / CLI 0.17.0。 diff --git a/external_plugins/agent-team/LICENSE b/external_plugins/agent-team/LICENSE new file mode 100644 index 00000000..e69e55dd --- /dev/null +++ b/external_plugins/agent-team/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 agent-team-poc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/external_plugins/agent-team/README.md b/external_plugins/agent-team/README.md new file mode 100644 index 00000000..a6c4f040 --- /dev/null +++ b/external_plugins/agent-team/README.md @@ -0,0 +1,282 @@ +# Agent Teams + +[中文](./README_CN.md) + +Bring "Lead + multiple teammates" collaboration into ZCode: the Lead spawns teammates inside a conversation, shares a task board, exchanges messages, and watches live team status in an MCP Apps panel. + +- Best for: parallel work you want to split up, handing implementation/review/testing to different members, or delegating a multi-step job to a reusable crew. +- Roles: Lead = the current conversation (the agent you are talking to); teammates = independent child sessions created by the plugin, sharing the Lead's working directory. +- Surfaces: Desktop = the "Agent Team" MCP Apps panel (live); CLI = the `/team` text summary + the `team-ctl` tool (can also render static cards). + +> Host baseline: finalized on **ZCode Desktop 3.16.2 / CLI 0.17.0** (measured, not guessed); the release drill was re-verified on Desktop 3.16.3 / CLI 0.17.0, and the desktop entry paths on Desktop 3.17.1. Lower versions are unverified and unsupported. + +## Install + +### Desktop (Plugin Marketplace UI) + +1. Open **Plugin Marketplace** and find **Agent Teams** (category: developer tools). +2. Click **Install**. Afterwards you can confirm and toggle it under **Settings → Plugins**. + +### CLI + +```bash +zcode plugins install agent-team@zcode-plugins-official +zcode plugins enable agent-team@zcode-plugins-official +``` + +## Enable + +- Enabled by default after install; the switch and its configuration live in **Settings → Plugins**. +- The declared SessionStart / Stop / UserPromptSubmit hooks take effect **as soon as the plugin is enabled** — no trust grant or hooks toggle is needed (verified in a clean environment). +- In the desktop default permission mode, the first agent-team MCP tool call prompts for permission; choose "Allow once" or "Always allow for this project". This is the host's tool permission and unrelated to hooks. + +## Using it in a conversation + +**Panel entry:** click **"+"** on the right of an existing conversation: +- Universal path (verified on official ZCode 3.17.1): **"All plugins" → "Personal" → "Agent Team" → "Open"**. +- When the host provides an "Agent Team" item in "New tab" (official 3.17.1 does not yet include it; requires a host build with this entry): **"New tab" → "Agent Team" → "Open"** — no need to enter the plugin list. + +After install and enable you need **no special command**: the teamwork policy is injected into the conversation context automatically by the SessionStart hook (D10). Just start a new task and describe your goal. There are three invocation surfaces: + +| Surface | How to trigger | What it does | +|---|---|---| +| Natural language (main channel) | Just state a goal / give orders | Everything: spawning teammates, assigning tasks, messaging; the policy is auto-injected and the model knows which team tools to use | +| `/team` | Type `/team` | Prints a text summary of team status + panel/command entries (**read-only**, creates/modifies nothing) | +| `/team-coordination` | Type `/team-coordination` (full name `agent-team:team-coordination`) | Manually (re)load the teamwork policy skill; use when a very long session has lost it | + +### 1. Just state the goal (default orchestrator mode) + +Start a **new task** (old tasks do not refresh plugin capabilities) and describe the goal. With the default `leadMode: orchestrator`, the Lead decomposes the work, forms a team, assigns tasks and independently accepts them — no step-by-step steering needed: + +```text +Push two things in parallel: one teammate adds unit tests for src/utils, another reviews the wording of README and CHANGELOG, then summarize. +``` + +The Lead's chain: spawn teammates → create tasks on the shared board with owners → wait for completion → independently verify (read diffs, run tests) → report back to you once accepted (D26/D27). + +### 2. Direct orders (collaborator mode / when you want precise control) + +Set `leadMode` to `collaborator` and the Lead waits for your instruction before forming a team; at any time you can also just give explicit orders: + +```text +Create a teammate named reviewer, have it check the first three paragraphs of README for typos, then summarize its findings. +``` + +```text +Send reviewer a message: focus on mixed Chinese/English punctuation. +``` + +```text +List the current members and task statuses. +``` + +The model maps these phrasings to the right tools (`spawn_teammate` / `send_message` / `list_agents` / `team_task_list` …); you never need to remember tool names. + +### 2.1 Model and reasoning effort (auto-follows the Lead, nothing to configure) + +**Since 0.4.0 there is exactly one path for member models: automatically follow the Lead's latest confirmed model and reasoning effort.** There is no per-member model configuration — no gear popup in the panel, no `model` parameter on `spawn_teammate`, and no "switch this member's model" instruction. You only manage the Lead's model; members sync before every turn. + +```text +Create a teammate named reviewer to check the first three paragraphs of README for typos. +``` + +- **When it syncs**: before each execution (first turn, wake-up by a new message, team resume) the member compares against the Lead's latest confirmed choice (resolved from the host's actual session state, 0.4.1); applied only on change, zero overhead otherwise. A running member syncs at its next turn start (never interrupted mid-turn); interrupt it first if you need an immediate switch. +- **What "confirmed" means**: the model **at the moment you actually submit a message** (the host snapshots it when saving), cross-checked against the `/model` selection record and the main-turn call history — newest of the three wins. Merely toggling the dropdown without submitting is not guaranteed to sync. +- **Failures are never silent; retries are bounded (0.4.1)**: when the Lead's model cannot be inherited (official coding plan, deleted/disabled Provider, unparseable state), spawning/resuming fails loudly with the reason — it never silently runs a different model. The failure shows in the member's diagnostics and pending messages are preserved. Deterministic rejections (plan/out-of-catalog) suspend auto-retry; transient faults (timeouts) back off 5s/15s/30s, at most 3 auto-retries. Switching the Lead back to a usable model — or sending a new message — resumes delivery and clears the stale error. +- **Pre-spawn validation (0.4.1)**: when the Lead's model is not inheritable, `spawn_teammate` fails **before** registering the member — no failed member, no name consumed; after fixing the Lead's model the same name is reusable. +- **Official coding plans cannot be inherited (hard boundary)**: members are independent CLI processes and the host does not hand subscription-plan credentials (`account:*` / `builtin:*` providers, e.g. GLM official coding plans) to them, so **inheriting an official coding-plan model is not supported**. Spawning/resuming while the Lead uses a plan model fails; switch the Lead to your own third-party model first (ZCode Settings → Model Services, add your own Provider + API key). + +### 3. `/team` for status + +Type `/team` any time: the first line reads "Members N · Shared tasks T", followed by one line per member and task (same wording as the panel dictionary), plus panel/command entries depending on the runtime. Refresh semantics: the desktop MCP Apps panel is live (subscription push, no manual refresh); on CLI every `/team` run is fresh. + +### 4. `/team-coordination` to reload the policy + +The main channel is the automatic hook injection, so manual loading is rarely needed. Two cases: + +- In very long sessions the injected policy may be compacted away (D24): type `/team-coordination` (or ask the model to "reload the teamwork policy skill") to restore it; +- Or load it on demand when you want the session to follow team discipline. + +### What a successful run looks like + +Using "create reviewer to check README typos" as the example: + +1. The "Agent Team" panel appears in the conversation (the `spawn_teammate` result carries a panel-open hint and the desktop opens it), showing `lead` (current session) and `reviewer`; +2. `reviewer` starts working; tasks and statuses change on the panel/board; +3. `reviewer` reports back; the Lead (in orchestrator mode, after independent verification) summarizes for you; +4. `reviewer`'s session is a hidden child session — it never appears next to the Lead in the left task list. + +## Tool reference (9 model-visible tools; 8 with `interrupt:false`) + +| Tool | Who uses it | Purpose | +|---|---|---| +| `spawn_teammate` | Lead | Create a named persistent teammate (`context: fresh\|fork`; model auto-follows the Lead, no separate parameter; in orchestrator mode the Lead proactively staffs up) | +| `send_message` | Everyone | Message another member: delivered at the nearest turn boundary while running; wakes/resumes an idle member | +| `list_agents` | Everyone | List Lead + all teammates with targets and availability (`inactive` = no turn running, not a failure) | +| `interrupt_agent` | Lead | Interrupt a teammate's current turn, preserving its pending inbox (**not registered when disabled → 8 tools**) | +| `wait_agent` | Lead | Wait for the next member/message/task change (never wakes idle members; returns noProgress on timeout) | +| `team_task_create` | Everyone | Create an unassigned task on the shared board (optional `blocked_by` / `write_scopes`) | +| `team_task_list` | Everyone | List tasks: status, owner, revision, blocking, write-scope warnings (paginated/filterable) | +| `team_task_get` | Everyone | Read one task's latest full content (must-read before editing) | +| `team_task_update` | Everyone | CAS task actions via `expected_revision`: claim / release / edit / set_dependencies / complete / reopen / reassign / delete | + +There is also an app-only loopback tool `team_panel_call` (panel heartbeat/refresh/detail with **per-turn summaries**; **read-only channel, zero mutation capability**, not model-visible); the diagnostic probe `team_ping` is exposed only with `TEAM_DEBUG_TOOLS=1`. + +## Configuration (userConfig) + +Edit under **Settings → Plugins → Agent Team**; changes apply to new tasks (running sessions keep the config they started with). + +| Option | Default | Description | +|---|---|---| +| `maxMembers` | 8 | Max teammates per team (Lead excluded, failed included) | +| `maxTasks` | 256 | Max tasks on the board | +| `maxMessageBytes` | 65536 | Max bytes per member-to-member message | +| `disposalTimeoutMs` | 5000 | Timeout for team disposal (settlement and reclaim) | +| `interrupt` | true | When off, the model gets 8 tools (`interrupt_agent` is not registered) | +| `leadMode` | orchestrator | `orchestrator`: the Lead staffs, assigns and accepts work independently; `collaborator`: waits for your instruction | + +## Network access, dependencies and side effects + +| Item | Declaration | +|---|---| +| Network access | **No outbound requests.** The daemon talks to the host over stdio; the teammate ↔ host app-server bridge uses local inter-process channels; the optional companion page (`TEAM_COMPANION=1`) listens on loopback `127.0.0.1` only. Model requests are made by the host using the Providers you configure — unrelated to this plugin | +| Model/API dependencies | Members are driven by the host-bundled `zcode` CLI and follow the Lead's current model every turn (see 2.1); **official coding plans cannot be inherited** (plan credentials are not forwarded); the plugin itself needs no API key | +| File writes | Only the plugin data directory `$ZCODE_PLUGIN_DATA` (`teams/`, `logs/`, `meta/`, checkpoints) plus two whitelisted points in the host task index (member-session hiding anchor, `sidebar-audit --apply`, see D25); the host `db.sqlite` is strictly read-only | +| Command execution | Hooks, the daemon and `team-ctl` are the plugin's own Node scripts (`runtime/*.mjs`) run by the host's Node; teammates are host CLI child processes; the plugin never runs arbitrary shell commands | +| Hooks | SessionStart / Stop / UserPromptSubmit (`hooks/hooks.json`, effective on enable) | +| MCP servers | `team-daemon` (stdio) | +| Third-party code | Inlined MCP SDK and other third-party software with licenses: [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md) | + +## CLI usage + +```bash +# /team command: prints the team status text summary (desktop & CLI) +/team + +# Direct disk replay (same source as /team) +node /runtime/team-ctl.mjs state # text summary +node /runtime/team-ctl.mjs state --json # machine-readable +node /runtime/team-ctl.mjs transcript # per-turn member summary +node /runtime/team-ctl.mjs widget --standalone --out /tmp/team.html --theme dark --lang en +node /runtime/team-ctl.mjs tail # follow the event log +``` + +`` = `$ZCODE_PLUGIN_DATA/teams/` (on CLI usually `~/.zcode/cli/plugins/data/agent-team@/teams/…`). + +## Node requirement + +The daemon, hooks and `team-ctl` all run on Node and require **Node ≥ 22**. Check before installing: + +```bash +node -v +``` + +Expect `v22.x` or higher. Below v22 the daemon startup self-check warns and the panel/tools may be unavailable; the actual version is written to `$ZCODE_PLUGIN_DATA/logs/daemon-lifecycle.jsonl` (fields `node`, `nodeWarn`). + +## Uninstalling and your data + +**Back up first, then uninstall.** The default uninstall deletes team data irreversibly. + +```bash +# 1) Locate the plugin data dir (dataPath at install time; also visible in plugins list --json) +DATA="$HOME/.zcode/cli/plugins/data/agent-team@" +# 2) Back up (keeps the task board, members, messages, event log) +tar -czf ~/agent-team-backup-$(date +%Y%m%d).tar.gz -C "$(dirname "$DATA")" "$(basename "$DATA")" +``` + +Measured behavior (2026-10-24 clean-environment drill): + +| Entry | Default uninstall | Can data be kept? | +|---|---|---| +| CLI | `zcode plugins uninstall agent-team@` **deletes the entire plugin data directory** (board, members, messages); the current version cache is removed, older version caches and the marketplace registration stay | Yes: `--keep-data` keeps the data directory (event-log hash unchanged) and only removes code + enablement; non-interactive shells need `--force` | +| Desktop | Settings → Plugins → more actions → Uninstall; the confirm dialog states cache, data and config deletion; measured: **deletes the data directory contents** (empty dir remains), current version cache removed | **No** UI equivalent | + +Note: task windows still open at uninstall time may later **recreate an empty data skeleton** at the old path (0-byte `events.jsonl`); the original team data does not come back — do not mistake the reappearing directory for "data is still there". Close the related task windows after uninstalling. + +## Troubleshooting + +### 1. First check whether the plugin exists and is enabled + +```bash +zcode plugins list | grep agent-team +zcode plugins list --json # version / rootPath / dataPath / diagnostics +``` + +Desktop: confirm the "Agent Team" toggle in **Settings → Plugins**; its three hooks show under **Settings → Hooks**. + +### 2. Log locations (all under the plugin data directory) + +| File | Contents | +|---|---| +| `logs/hooks.jsonl` | Full env overlay and input digest per SessionStart / Stop / UserPromptSubmit — **check here to see whether hooks ran** | +| `logs/daemon-lifecycle.jsonl` | Daemon start/reclaim: pid, node version, data dir, `nodeWarn`, SIGINT handling | +| `logs/provider.jsonl` | Teammate turns and delivery details (debugging) | +| `logs/requests.jsonl`, `logs/meta-log.jsonl` | Tool calls and panel loopback records | +| `meta/runtime-config.json` | Effective config persisted by the daemon (hooks read the same file) | +| `teams//events.jsonl` | Team event log (append-only; `team-ctl tail` follows it) | +| `teams//coordinator.audit.jsonl` | Coordinator lock acquire/release/takeover audit | + +### 3. How to investigate hooks not taking effect + +1. Confirm the plugin is enabled (hooks do not run while disabled); +2. Open a **new conversation**, then check whether `logs/hooks.jsonl` gained a `sessionstart` record; +3. No record → check **Settings → Hooks** lists the three agent-team hooks (SessionStart / Stop / UserPromptSubmit) and whether the plugin carries `diagnostics` (version/manifest issues); +4. Record exists but the model ignores team policy → check the record's `env_overlay.ZCODE_PLUGIN_ROOT` points at the current install; after upgrades old sessions keep the old version — start a new conversation. + +### 4. Common symptoms + +| Symptom | Cause and handling | +|---|---| +| `Duplicate plugin hooks file ignored: hooks/hooks.json` in `plugins list` after install | Known warning: the manifest hooks declaration duplicates the host's auto-discovery of the same path; the host ignores it explicitly. All three hooks still run. Cleanup planned for a later version | +| Teammate stuck `provisioning` / cannot be created | Check `logs/provider.jsonl` and `logs/daemon-lifecycle.jsonl`; confirm the `zcode` executable is discoverable (`TEAM_ZCODE_BIN` overrides) and member quota `maxMembers` is not exceeded | +| "Member cannot inherit the Lead model" on spawn/resume | Expected (0.4.0): the only path is following the Lead; when the Lead is on an **official coding plan** (`account:*`/`builtin:*`) or the Provider is deleted/disabled it fails loudly, never silently switching models. Fix: switch the Lead to your own third-party model (ZCode Settings → Model Services) and retry. 0.4.1: spawn pre-checks before registering (no name consumed); the same failure does not retry forever (deterministic rejections suspend; transient faults back off 5s/15s/30s ×3); switching the Lead back or sending a new message resumes delivery and clears the error | +| Desktop tool calls hang or `Client closed` | Known host limitation (D11): desktop callTool does not rebuild the connection after the daemon is idle-reclaimed. Start a new task and call immediately to hit a live daemon; the panel heartbeat keeps it alive as long as possible | +| Panel numbers frozen | The panel refreshes via subscription + heartbeat; cross-check with `/team` or `team-ctl state`. Static cards/views do not probe liveness and are conservative | +| No change after upgrading | The host pins a plugin runtime per conversation: start a new task after upgrading; the CLI's "Restart zcode to apply" hint is the same | +| Old team sessions appear in the left task list | Leftover data: `node runtime/team-ctl.mjs sidebar-audit --apply` archives them (dry-run by default, reviewable) | +| Persisted team record corrupt | Reports `persisted Agent Teams … payload is invalid`. Back up `teams//` first, then re-check with `team-ctl state`; never hand-edit `events.jsonl` (breaks seq continuity) | + +### 5. Safely wiping the data directory + +Once you no longer need historical teams you may delete `$ZCODE_PLUGIN_DATA` entirely (same data disposal as the default uninstall). **Back up first**; the board and messages cannot be recovered afterwards. + +## Limitations and deviations (user-readable, D1–D27) + +This plugin is a re-implementation of DSH Agent Teams on ZCode. The deviations below are **registered and acceptance-tested** adaptations from the gap analysis ledger D1–D27 (numbering per that ledger). + +| ID | What you will observe | +|---|---| +| D1 | Team events live in the plugin's own data directory (JSONL), not the Lead's session log; session export/rollback excludes team events | +| D2 | "Interrupting a running member" is delivered at the next turn boundary (the host has no steer primitive); messages queue while the target runs — never dropped or duplicated | +| D3 | `context:"fork"` falls back to "fresh + Lead's completed-turn transcript (truncated)" when a true fork is impossible; not KV-prefix sharing | +| D4 | The main UI is the in-conversation MCP Apps panel; no upstream hover button/popover/pin; the `::visualize` snapshot card is desktop-only | +| D5 | Member sessions stay out of the left task list by default; the panel offers a read-only member conversation view. Legacy visible rows can be archived with `sidebar-audit` | +| D6 | The Lead still sees the host's built-in Task tools (cannot be disabled); teammates have Task disabled and team tools are policy-preferred | +| D7 | One sentence about "file version conflicts" in the policy text is replaced with ZCode file-tool semantics; everything else is verbatim | +| D8 | The coordinator is ephemeral: the daemon is reclaimed by the host when idle and any instance can take over; a momentary `TEAM_DISPOSED` error may appear during handover — just retry (measured takeover ≤5s) | +| D9 | No SessionEnd hook: disposal is best-effort at daemon exit plus reconciliation on next start; under very short grace only a reconcilable state may remain | +| D10 | The policy is injected into message context by the SessionStart hook, not the system prompt; injected text does not land in the transcript; disabling hooks triggers a fail-loud warning | +| D11 | Desktop callTool may hang / `Client closed` after daemon reclaim without recovering in that session; a new task recovers. Teammates use separate processes and are unaffected | +| D13 | Tool entries declare no `outputSchema` (host limitation); output contracts are pinned by tests | +| D14 | With missing identity, error messages use an `` placeholder | +| D15 | Argument type errors return `TEAM_INVALID_ARGUMENT` with `param "" must be …`; these are tool-face messages within the existing 27-code set | +| D16 | When two daemons serve one team (proxy mode): `list_agents` may conservatively show active members as `inactive`; `wait_agent` waits conservatively and never falsely reports noProgress | +| D17 | Idle reclaim does **not** terminate teammate turns by default (keep-asleep); set `TEAM_DRAIN_ON_DISPOSE=kill` to drain fully | +| D18 | "Delivered" to the Lead means the hook injection receipt (the host has no direct injection primitive; injection is not in the transcript); externally it is still `{sent:true}` | +| D19 | Hooks read the config persisted by the daemon; before the first daemon start they use defaults (e.g. `interrupt=true`) | +| D20 | Waking an idle Lead is a gray feature: by default no new turn is started and messages stay pending; `TEAM_WAKE_LEAD=1` enables it | +| D21 | Static cards do not probe liveness: member status maps conservatively from phase (active→inactive, lead always inactive); only the live panel/companion shows running | +| D22 | The diagnostic tool `team_ping` is not in the model tool list by default (9 model-facing tools, 8 with `interrupt:false`); `TEAM_DEBUG_TOOLS=1` exposes it | +| D23 | Historical event names/old checkpoints auto-upgrade: legacy `team/message` normalizes to `team/message/queued`, old delivered structures to string arrays; historical teams stay readable | +| D24 | Policy text injects on SessionStart (startup/resume); in very long Lead sessions it may be lost to context compaction — reload the skill or start a new task | +| D25 | The plugin writes only two whitelisted points in the host task index (session-hiding anchor tombstone, `sidebar-audit --apply`); `db.sqlite` is strictly read-only | +| D26 | The Lead defaults to `orchestrator`: proactively staffs/assigns/accepts and does not implement itself (except one-line fixes or when nobody can take it); `collaborator` restores "waits for your instruction" | +| D27 | Task `complete` means "submitted": the Lead must independently verify before acceptance; failures are `reopen`ed with concrete findings, passes append an acceptance note to the task | + +## Documentation + +- [User manual with screenshots (Chinese)](docs/使用手册.md) +- [Repo wiki: architecture, flows and source navigation (source repo only, not shipped)](docs/repo-wiki.md) +- Internal handover docs (source repo `docs/`, not shipped): `架构说明-as-built.md`, `运维手册.md`, `测试手册.md` +- [Changelog](CHANGELOG.md), [License](LICENSE), [Third-party notices](THIRD-PARTY-NOTICES.md) +- Source repository: diff --git a/external_plugins/agent-team/README_CN.md b/external_plugins/agent-team/README_CN.md new file mode 100644 index 00000000..2bc1f3fc --- /dev/null +++ b/external_plugins/agent-team/README_CN.md @@ -0,0 +1,282 @@ +# 智能体团队(Agent Teams) + +[English](./README.md) + +把「Lead + 多个 teammate」的协作方式带进 ZCode:Lead 在会话里创建队友、共享任务板、收发消息,并用 MCP Apps 面板实时看到团队状态。 + +- 适用:需要并行拆活、希望把实现/审查/测试分给不同成员,或想把一段多步工作交给可复用的成员协作。 +- 角色:Lead = 当前会话(你正在对话的 agent);teammate = 插件创建的独立子会话,与 Lead 共享同一工作目录。 +- 载体:桌面 = 「智能体团队」MCP Apps 面板(实时);CLI = `/team` 文本摘要 + `team-ctl` 工具(可生成静态卡片)。 + +> 宿主基线:本插件在 **ZCode Desktop 3.16.2 / CLI 0.17.0** 上完成终验(实测基线,非推测);发布演练另在 Desktop 3.16.3 / CLI 0.17.0 复测通过,桌面入口路径在 Desktop 3.17.1 复测通过。更低版本未验证,不在支持范围内。 + +## 安装 + +### 桌面(插件市场 UI) + +1. 打开 **插件市场 / Plugin Marketplace**,在市场中找到 **「智能体团队 / Agent Teams」**(分类:开发者工具)。 +2. 点 **安装 / Install**;安装后可在 **设置 → 插件 / Settings → Plugins** 中确认与启用。 + +### CLI + +```bash +zcode plugins install agent-team@zcode-plugins-official +zcode plugins enable agent-team@zcode-plugins-official +``` + +## 启用 + +- 安装后默认启用;在 **设置 → 插件** 里可查看开关与配置。 +- 插件声明的 SessionStart / Stop / UserPromptSubmit hooks **随启用直接生效**,不需要信任授予或 hooks 开关(已在干净环境实测)。 +- 桌面默认权限模式下,agent-team 的 MCP 工具首次调用会弹「需要权限」确认;选择「允许(仅本次)」或「始终允许本项目」即可。这是宿主的工具权限,与 hook 无关。 + +## 在会话中使用(怎么调用) + +**面板入口:** 在已有会话右侧点 **「+」**: +- 通用路径(官方 ZCode 3.17.1 实测):**「查看所有插件」→「个人」→「智能体团队」→「打开」**。 +- 宿主在「新标签页」中提供「智能体团队」入口时(官方 3.17.1 尚未提供,需含该入口的宿主版本):**「新标签页」→「智能体团队」→「打开」**,无需进入插件列表。 + +装好、启用后**不需要任何专门命令**:团队协作策略已由 SessionStart hook 自动注入会话上下文(D10),在新任务里直接对话即可。共有三个调用面,按需取用: + +| 调用面 | 怎么触发 | 干什么 | +|---|---|---| +| 自然语言对话(主通道) | 直接说目标 / 下指令 | 创建队友、分派任务、收发消息等全部操作;策略已自动注入,模型自己知道该用哪些团队工具 | +| `/team` | 会话里输入 `/team` | 输出团队状态文本摘要 + 面板/命令入口(**只读**,不创建/修改任何数据) | +| `/team-coordination` | 输入 `/team-coordination`(全名 `agent-team:team-coordination`) | 手动(重新)加载团队协作策略 skill;长会话策略丢失后恢复用 | + +### 1. 直接说目标(默认 orchestrator 模式) + +新建一个任务(**必须是新任务**——旧任务不会刷新插件能力),直接描述目标即可。默认 `leadMode: orchestrator` 下 Lead 会自主拆活、组队、分派并独立验收,不需要逐条指挥: + +```text +帮我并行推进两件事:一边给 src/utils 补单元测试,一边审查 README 与 CHANGELOG 的措辞,完成后汇总。 +``` + +Lead 的动作链:创建队友 → 在共享任务板建任务并指定 owner → 等待各成员完成 → 独立复核(读 diff、跑测试)→ 验收通过后汇总给你(D26/D27)。 + +### 2. 点名指挥(collaborator 模式 / 想精确控制时) + +把 `leadMode` 配置为 `collaborator` 后 Lead 等你指示再建队;任何时候想精确控制,也直接下指令: + +```text +创建一个叫 reviewer 的队友,让它检查 README 前三段的错别字,然后汇总它的结论。 +``` + +```text +给 reviewer 发个消息:重点看中英文标点混用。 +``` + +```text +列一下现在的成员和任务状态。 +``` + +模型会把这些话术映射到对应工具(`spawn_teammate` / `send_message` / `list_agents` / `team_task_list` …),你不需要记工具名。 + +### 2.1 模型与思考强度(自动跟随 Lead,无需设置) + +**0.4.0 起,成员模型只有一条路线:自动跟随 Lead 的最新已确认模型与思考强度。** 没有单独的成员模型配置——面板没有齿轮弹窗,`spawn_teammate` 没有 `model` 参数,对话也不能「让某个成员换模型」。你只需要管好 Lead 自己用什么模型,成员每轮开始执行前会自动同步。 + +```text +创建一个叫 reviewer 的队友,检查 README 前三段的错别字。 +``` + +- **同步时机**:成员每次开始执行前(首轮、后续消息唤醒、恢复团队)都先比对 Lead 最新选择(以宿主会话中的实际选择为准,0.4.1),有变化才应用,无变化零开销;运行中的成员等本轮跑完在下一轮开始时同步(不打断已有工作)。急需切换可先中断该成员,再发消息续跑。 +- **「已确认」的含义**:以你**实际提交消息时**的模型为准(宿主在保存消息时写入快照),并用会话选模记录(`/model` 命令)与主轮实际调用记录核对——三路取最新。仅在输入框里切了下拉但还没提交,不承诺同步。 +- **失败绝不静默、重试有节制(0.4.1)**:Lead 的模型无法被成员继承时(官方 coding plan、Provider 被删除/禁用、解析不出),创建/续跑会直接报错并说明原因,不会悄悄用别的模型开跑;失败原因在成员行诊断可见,待处理消息保留不丢。同一失败不会无限重试:确定性拒绝(套餐/目录外)暂停自动重试,临时故障(超时等)按 5s/15s/30s 退避最多自动重试 3 次;Lead 换回可用模型或你再发一条新消息即自动恢复交付,恢复成功后旧错误提示自动消失。 +- **创建前校验(0.4.1)**:Lead 模型不可继承时,`spawn_teammate` 在登记成员**之前**就报错——不产生 failed 成员、不占用成员名;修正 Lead 模型后原名可直接重用。 +- **不支持继承官方 coding plan(硬性边界)**:成员是独立 CLI 进程,宿主不向它下发订阅套餐(`account:*` / `builtin:*` Provider,如智谱 GLM 官方 coding plan)的凭据,因此**不支持直接继承官方 coding plan 模型配置**。Lead 正在用套餐模型时创建/续跑成员会报错;请先在 ZCode 中把 Lead 切换到自配的第三方模型(ZCode 设置 → 模型服务,添加你自己的 Provider + API Key)。 + +### 3. `/team` 看状态 + +会话里随时输入 `/team`:首行输出「成员 N · 共享任务 T」,随后逐行列出成员与任务(与面板词典同源同文案),并按运行环境附上面板/命令入口。刷新语义:桌面 MCP Apps 面板自动实时(订阅推送,无需手动刷新);CLI 每次重跑 `/team` 即最新。 + +### 4. `/team-coordination` 重载策略 + +策略的主通道是 hook 自动注入,通常无需手动加载。两种情况会用到这个 skill: + +- 超长会话中注入的策略可能被上下文压缩掉(D24):输入 `/team-coordination`(或让模型「重新加载团队策略 skill」)即可恢复; +- 想确认当前会话按团队纪律工作时,也可以点名加载。 + +### 一次成功的样子 + +以「创建 reviewer 检查 README 错别字」为例: + +1. 会话里出现「智能体团队」面板(`spawn_teammate` 的结果携带面板打开提示,桌面上会定向打开),成员区显示 `lead`(当前会话)与 `reviewer`; +2. `reviewer` 创建并开始工作,面板/任务板出现任务与状态变化; +3. `reviewer` 完成后向 Lead 汇报,Lead(orchestrator 下先独立复核)汇总给你; +4. `reviewer` 的会话是隐藏子会话,不会和 Lead 平级出现在左侧任务栏。 + +## 工具速查(模型可见 9 个;`interrupt:false` 时 8 个) + +| 工具 | 谁用 | 作用 | +|---|---|---| +| `spawn_teammate` | Lead | 创建一个有名字的持久队友(`context: fresh\|fork`;模型自动跟随 Lead,无独立参数;orchestrator 模式下 Lead 会主动组队) | +| `send_message` | 全体 | 给另一个成员发消息:运行中在最近回合边界送达;空闲则拉起/恢复一轮 | +| `list_agents` | 全体 | 列出 Lead 与全部队友的 target 与可用状态(`inactive` = 当前无回合,不代表任务失败) | +| `interrupt_agent` | Lead | 中断一个队友当前回合,保留其待处理收件箱(**配置关闭时此工具不注册 → 8 个**) | +| `wait_agent` | Lead | 等待下一次成员/消息/任务变化(不会唤醒空闲成员;超时返回 noProgress) | +| `team_task_create` | 全体 | 在共享任务板创建一条未分配任务(可带 `blocked_by` / `write_scopes`) | +| `team_task_list` | 全体 | 列出任务:状态、owner、revision、阻塞、写作用域告警(可分页/过滤) | +| `team_task_get` | 全体 | 读取单条任务的最新完整内容(改动前必读) | +| `team_task_update` | 全体 | 用 `expected_revision` 做 CAS 的任务动作:claim / release / edit / set_dependencies / complete / reopen / reassign / delete | + +另有一个 app 专用回环工具 `team_panel_call`(面板心跳/刷新/详情(**按轮摘要**);**只读通道,零变更能力**,模型不可见);诊断探针 `team_ping` 仅在 `TEAM_DEBUG_TOOLS=1` 时暴露。 + +## 配置(userConfig) + +在 **设置 → 插件 → 智能体团队** 中修改,改完对新任务生效(进行中的会话沿用启动时配置)。 + +| 配置 | 默认 | 说明 | +|---|---|---| +| `maxMembers` | 8 | 团队内 teammate 数量上限(不含 Lead,含 failed) | +| `maxTasks` | 256 | 任务板任务数量上限 | +| `maxMessageBytes` | 65536 | 成员间单条消息的最大字节数 | +| `disposalTimeoutMs` | 5000 | 团队处置(结算与回收)的超时时间 | +| `interrupt` | true | 关闭后模型只拿到 8 个工具(`interrupt_agent` 不注册) | +| `leadMode` | orchestrator | `orchestrator`:Lead 自主组队、分配、独立验收;`collaborator`:等你指示再建队 | + +## 网络访问、依赖与副作用 + +| 项 | 申报 | +|---|---| +| 网络访问 | **无外网请求**。daemon 经 stdio 与宿主通信;teammate 与宿主 app-server 的桥接走本机进程间通道;可选伴生页(`TEAM_COMPANION=1`)仅监听本机回环 `127.0.0.1`。模型请求由宿主按你配置的 Provider 发出,与本插件无关 | +| 模型/API 依赖 | 成员由宿主自带 `zcode` CLI 驱动,逐轮自动跟随 Lead 当前模型(见 2.1);**不支持继承官方 coding plan**(套餐凭据不下发);插件自身不需要任何 API Key | +| 文件写入 | 仅写插件数据目录 `$ZCODE_PLUGIN_DATA`(`teams/`、`logs/`、`meta/`、checkpoint)与宿主任务索引的两个白名单点(成员会话隐藏 anchor、`sidebar-audit --apply`,见 D25);宿主 `db.sqlite` 一律只读 | +| 命令执行 | hooks、daemon、`team-ctl` 全部为插件自带的 Node 脚本(`runtime/*.mjs`),由宿主 Node 运行;`teammate` 为宿主 CLI 子进程;插件不执行任意 shell 命令 | +| Hooks | SessionStart / Stop / UserPromptSubmit(`hooks/hooks.json`,随启用直接生效) | +| MCP servers | `team-daemon`(stdio) | +| 第三方组件 | 内联 MCP SDK 等第三方软件及许可证见 [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md) | + +## CLI 用法 + +```bash +# /team 命令:输出团队状态文本摘要(桌面/CLI 均可用) +/team + +# 直接读盘重放(与 /team 同源) +node <插件目录>/runtime/team-ctl.mjs state # 文本摘要 +node <插件目录>/runtime/team-ctl.mjs state --json # 机器可读 +node <插件目录>/runtime/team-ctl.mjs transcript # 成员会话摘要(按轮) +node <插件目录>/runtime/team-ctl.mjs widget --standalone --out /tmp/team.html --theme dark --lang zh +node <插件目录>/runtime/team-ctl.mjs tail # 跟随事件日志 +``` + +`` = `$ZCODE_PLUGIN_DATA/teams/`(CLI 下通常是 `~/.zcode/cli/plugins/data/agent-team@/teams/…`)。 + +## Node 版本要求 + +daemon、hooks 与 `team-ctl` 都由 Node 运行,要求 **Node ≥ 22**。安装前自检: + +```bash +node -v +``` + +输出应为 `v22.x` 或更高。低于 v22 时 daemon 启动自检会给出警告,面板与工具可能不可用;插件会把实际版本写进 `$ZCODE_PLUGIN_DATA/logs/daemon-lifecycle.jsonl`(字段 `node`、`nodeWarn`)。 + +## 卸载后数据怎么处理 + +**先备份,再卸载**。默认卸载会删除团队数据且不可撤销。 + +```bash +# 1) 找到插件数据目录(安装时的 dataPath;也可从 plugins list --json 读取) +DATA="$HOME/.zcode/cli/plugins/data/agent-team@" +# 2) 备份(保留任务板、成员、消息、事件日志) +tar -czf ~/agent-team-backup-$(date +%Y%m%d).tar.gz -C "$(dirname "$DATA")" "$(basename "$DATA")" +``` + +实测行为(2026-10-24 干净环境演练): + +| 入口 | 默认卸载 | 可否保留数据 | +|---|---|---| +| CLI | `zcode plugins uninstall agent-team@` **删除整个插件数据目录**(任务板、成员、消息全部消失);当前版本缓存删除,更早版本缓存与市场注册保留 | 可:`--keep-data` 保留数据目录(事件日志哈希不变),仅移除插件代码与启用项。非交互 shell 需 `--force` | +| 桌面 | 设置 → 插件 → 更多操作 → 卸载,确认框明确提示删除缓存、数据目录与配置;实测**删除数据目录内容**(空目录保留),当前版本缓存删除 | **无** UI 等价选项 | + +注意:卸载时仍打开的相关任务窗口,后续活动会在原路径**重建一个空的数据骨架**(`events.jsonl` 为 0 字节),原团队数据不会恢复;不要因为目录又出现而误判为“数据还在”。卸载后建议关闭相关任务窗口。 + +## 故障排查 + +### 1. 先确认插件在不在、启没启 + +```bash +zcode plugins list | grep agent-team +zcode plugins list --json # 看 version / rootPath / dataPath / diagnostics +``` + +桌面:**设置 → 插件** 中确认「智能体团队」开关为启用;**设置 → 钩子** 可看到它声明的三条 hook。 + +### 2. 日志位置(都在插件数据目录下) + +| 文件 | 内容 | +|---|---| +| `logs/hooks.jsonl` | 每次 SessionStart / Stop / UserPromptSubmit 的完整 env overlay 与输入摘要——**判断 hook 有没有跑就看这里** | +| `logs/daemon-lifecycle.jsonl` | daemon 启动/回收:pid、node 版本、数据目录、`nodeWarn`、SIGINT 处置 | +| `logs/provider.jsonl` | teammate 轮次与投递细节(排障用) | +| `logs/requests.jsonl`、`logs/meta-log.jsonl` | 工具调用与面板回环记录 | +| `meta/runtime-config.json` | daemon 落盘的有效配置(hook 读取同一份) | +| `teams//events.jsonl` | 团队事件日志(append-only;`team-ctl tail` 可跟随) | +| `teams//coordinator.audit.jsonl` | 协调者锁获取/释放/接任审计 | + +### 3. hook 没生效怎么查 + +1. 确认插件已启用(禁用状态下 hook 不会运行); +2. 打开一个**新会话**,然后看 `logs/hooks.jsonl` 是否新增 `sessionstart` 记录; +3. 没有记录 → 看 **设置 → 钩子** 是否列出三条 agent-team hook(SessionStart / Stop / UserPromptSubmit),以及插件是否因版本/清单问题带 `diagnostics`; +4. 有记录但模型没按团队策略行动 → 看该条记录的 `env_overlay.ZCODE_PLUGIN_ROOT` 是否指向当前安装目录;升级后旧会话仍用旧版本,需新开会话。 + +### 4. 常见现象 + +| 现象 | 原因与处理 | +|---|---| +| 安装后 `plugins list` 出现 `Duplicate plugin hooks file ignored: hooks/hooks.json` | 已知告警:manifest 的 hooks 声明与宿主自动发现同路径文件重复,宿主显式忽略;三条 hook 仍正常执行,不影响使用。计划在后续版本清理清单 | +| 队友一直 `provisioning` / 无法创建 | 看 `logs/provider.jsonl` 与 `logs/daemon-lifecycle.jsonl`;确认 `zcode` 可执行文件可被发现(`TEAM_ZCODE_BIN` 可覆盖),以及成员名额未超 `maxMembers` | +| 创建/续跑成员时报「成员无法继承 Lead 模型」 | 预期行为(0.4.0):成员模型唯一路线 = 跟随 Lead,Lead 正在用**官方 coding plan 套餐**(`account:*`/`builtin:*`)或 Provider 已删除/禁用时直接报错,绝不静默换模型。处理:把 Lead 切到自配第三方模型(ZCode 设置 → 模型服务)后重试。0.4.1:spawn 在登记成员前即预检报错(不占成员名);续跑失败后同一失败不会无限重试(确定性拒绝暂停 / 临时故障 5s/15s/30s 退避×3),Lead 换回可用模型或发新消息即自动恢复交付,旧错误提示随之清除 | +| 桌面工具调用挂起或 `Client closed` | 已知宿主限制(D11):桌面 callTool 在 daemon 空闲回收后不重建连接。新开一个任务、立刻发起调用可命中存活 daemon;面板心跳已尽量保活 | +| 面板数字不动 | 面板靠订阅+心跳刷新;`/team` 或 `team-ctl state` 可交叉验证真实状态。桌面卡片/静态视图不探测活性,成员状态偏保守 | +| 升级后行为没变 | 宿主按会话固定插件运行时:升级后请新开任务;CLI 更新提示 “Restart zcode to apply” 同理 | +| 旧团队会话出现在左侧任务栏 | 旧数据遗留:`node runtime/team-ctl.mjs sidebar-audit --apply` 归档(默认 dry-run,可复核) | +| 团队持久记录损坏 | 报 `persisted Agent Teams … payload is invalid`。先备份 `teams//`,再用 `team-ctl state` 复核;不要手工改 `events.jsonl`(会破坏 seq 连续性) | + +### 5. 安全清理数据目录 + +确认不再需要历史团队后,可整体删除 `$ZCODE_PLUGIN_DATA`(等价于默认卸载的数据处置)。**删除前先备份**;删除后无法恢复任务板与消息。 + +## 限制与偏差(用户可读版,D1–D27) + +本插件是 ZCode 上对 DSH Agent Teams 的复刻。以下差异均为**已登记、已验收**的适配项,来自《04-能力映射与差距分析》D1–D27(编号以该台账为准)。 + +| 编号 | 你会看到什么 | +|---|---| +| D1 | 团队事件写在插件自己的数据目录(JSONL),不写进 Lead 会话日志;会话导出/回滚不包含团队事件 | +| D2 | “运行中插话”只能在下一次回合边界送达(宿主没有 steer 原语);目标运行中时消息排队,不会被丢弃或重复 | +| D3 | `context:"fork"` 在无法真正 fork 时用“fresh + Lead 已完成回合转录(截断)”实现;不是 KV 前缀共享 | +| D4 | 主 UI 是会话内 MCP Apps 面板;没有原版的头部 hover 按钮/弹层/pin;`::visualize` 快照卡片仅桌面可用 | +| D5 | 成员会话默认不进左侧任务栏;面板内提供成员会话查看视图(只读)。旧版遗留的可见行可用 `sidebar-audit` 归档 | +| D6 | Lead 仍能看见宿主内置 Task 工具(无法禁用);teammate 侧已禁用 Task,团队工具优先由策略引导 | +| D7 | 策略文本中“文件版本冲突”一句替换为 ZCode 文件工具的等价语义;其余逐字 | +| D8 | 协调者是“瞬时”的:daemon 空闲会被宿主回收,任一实例可接任;协调者交替的瞬间可能出现 `TEAM_DISPOSED` 临时错误,重试即可(实测接任 ≤5s) | +| D9 | 没有 SessionEnd hook:处置靠 daemon 退出时尽力执行 + 下次启动对账;极短宽限下可能只留下可对账的状态 | +| D10 | 策略通过 SessionStart hook 注入到消息上下文,而非系统提示;注入文本不落 transcript;被禁用 hook 时会有 fail-loud 警告 | +| D11 | 桌面 callTool 在 daemon 被回收后可能挂起/`Client closed` 且本会话不恢复;新任务可恢复。teammate 走独立进程不受影响 | +| D13 | 工具条目不声明 `outputSchema`(宿主限制);输出契约由测试锚定 | +| D14 | 身份缺失时错误消息里用 `` 占位 | +| D15 | 参数类型错误返回 `TEAM_INVALID_ARGUMENT`,消息为 `param "" must be …`;这些是工具面消息,错误码仍属既有 27 码 | +| D16 | 同一团队由两个 daemon 服务时(代理模式):`list_agents` 的 active 成员可能保守显示 `inactive`;`wait_agent` 保守等待、绝不误报 noProgress | +| D17 | daemon 空闲回收默认**不终止**队友轮次(keep 休眠态);如需要彻底回收可设 `TEAM_DRAIN_ON_DISPOSE=kill` | +| D18 | 给 Lead 的“已送达”以 hook 注入回执为准(宿主无直达注入原语,注入不落 transcript);对外仍是 `{sent:true}` | +| D19 | hook 读取 daemon 落盘的配置;首次 daemon 启动前 hook 使用默认值(如 `interrupt=true`) | +| D20 | 空闲 Lead 的唤醒是灰度功能:默认不拉起新回合,消息持久待命;`TEAM_WAKE_LEAD=1` 才启用 | +| D21 | 静态卡片无活性探测:成员状态按 phase 保守映射(active→inactive、lead 恒 inactive);实时面板/伴生面板才显示 running | +| D22 | 诊断工具 `team_ping` 默认不在模型工具列表(模型面 9 个,`interrupt:false` 时 8 个);`TEAM_DEBUG_TOOLS=1` 才暴露 | +| D23 | 历史事件名/旧 checkpoint 自动兼容:旧 `team/message` 归一为 `team/message/queued`,旧 delivered 结构归一为字符串数组;历史团队数据可读 | +| D24 | 策略文本在 SessionStart(startup/resume)注入;Lead 极长会话中途可能因上下文压缩丢失,可重新加载 skill 或开新任务 | +| D25 | 插件只写宿主任务索引的两个白名单点(会话隔离 anchor 墓碑、`sidebar-audit --apply`);`db.sqlite` 一律只读 | +| D26 | Lead 默认 `orchestrator` 模式:主动组队/分配/独立验收,不亲自实现(除一行级修复或无人可派);`collaborator` 恢复“等你指示” | +| D27 | 任务 `complete` 是“提交”,Lead 需独立复核后才算验收完成;失败会 `reopen` 并附具体问题,通过则在任务描述里追加验收记录 | + +## 文档 + +- [使用手册(截图版)](docs/使用手册.md) +- [Repo Wiki:架构、流程与源码导航(仅源码仓库,不随插件包分发)](docs/repo-wiki.md) +- 内部移交(源码仓库 `docs/`,不随包分发):`架构说明-as-built.md`、`运维手册.md`、`测试手册.md` +- [变更记录](CHANGELOG.md)、[许可证](LICENSE)、[第三方声明](THIRD-PARTY-NOTICES.md) +- 源码仓库: diff --git a/external_plugins/agent-team/THIRD-PARTY-NOTICES.md b/external_plugins/agent-team/THIRD-PARTY-NOTICES.md new file mode 100644 index 00000000..ebb84529 --- /dev/null +++ b/external_plugins/agent-team/THIRD-PARTY-NOTICES.md @@ -0,0 +1,312 @@ +# Third-Party Notices + +agent-team 的构建产物内联了下列第三方软件(esbuild bundle 进 `runtime/team-daemon.mjs`、 +`runtime/team-hooks.mjs`、`runtime/team-ctl.mjs`、`runtime/ui/team-panel.html` 与 +`runtime/ui/team-companion.html`)。各组件保留其原始许可证;本文件随发布包分发。 + +| Package | Version | License | Copyright | +|---|---|---|---| +| `@modelcontextprotocol/ext-apps` | 1.7.5 | Apache-2.0(见下,上游 package.json 标为 MIT) | MCP project contributors | +| `@modelcontextprotocol/sdk` | 1.32.1 | MIT | Copyright (c) 2024 Anthropic, PBC | +| `zod` | 3.25.76 | MIT | Copyright (c) 2025 Colin McDonnell | +| `zod-to-json-schema` | 3.25.2 | ISC | Copyright (c) 2020, Stefan Terdell | +| `ajv` | 8.20.0 | MIT | Copyright (c) 2015-2021 Evgeny Poberezkin | +| `ajv-formats` | 3.0.1 | MIT | Copyright (c) 2020 Evgeny Poberezkin | +| `fast-deep-equal` | 3.1.3 | MIT | Copyright (c) 2017 Evgeny Poberezkin | +| `json-schema-traverse` | 1.0.0 | MIT | Copyright (c) 2017 Evgeny Poberezkin | +| `fast-uri` | 3.1.8 | BSD-3-Clause | Copyright (c) 2011-2021, Gary Court; 2021-present The Fastify team | + +版本由 `package-lock.json` 锁定,构建使用 `npm ci`。 + +## MIT License + +Applies to `@modelcontextprotocol/sdk`, `zod`, `ajv`, `ajv-formats`, `fast-deep-equal`, +`json-schema-traverse` (copyright holders listed in the table above). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +## ISC License — `zod-to-json-schema` + +Copyright (c) 2020, Stefan Terdell + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +## BSD-3-Clause License — `fast-uri` + +Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae +Copyright (c) 2021-present The Fastify team +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## Apache-2.0 — `@modelcontextprotocol/ext-apps` 1.7.5 + +The upstream `LICENSE` file of `@modelcontextprotocol/ext-apps@1.7.5` is reproduced +verbatim below. Its `package.json` declares `"license": "MIT"`, while the distributed +`LICENSE` is the MCP project's MIT-to-Apache-2.0 transition text followed by the +Apache License 2.0. Both are reproduced here as shipped upstream. + +``` +The MCP project is undergoing a licensing transition from the MIT License to the Apache License, Version 2.0 ("Apache-2.0"). All new code and specification contributions to the project are licensed under Apache-2.0. Documentation contributions (excluding specifications) are licensed under CC-BY-4.0. + +Contributions for which relicensing consent has been obtained are licensed under Apache-2.0. Contributions made by authors who originally licensed their work under the MIT License and who have not yet granted explicit permission to relicense remain licensed under the MIT License. + +No rights beyond those granted by the applicable original license are conveyed for such contributions. + +--- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to the Licensor for inclusion in the Work by the copyright + owner or by an individual or Legal Entity authorized to submit on behalf + of the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + +--- + +MIT License + +Copyright (c) 2024-2025 Model Context Protocol a Series of LF Projects, LLC. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +Creative Commons Attribution 4.0 International (CC-BY-4.0) + +Documentation in this project (excluding specifications) is licensed under +CC-BY-4.0. See https://creativecommons.org/licenses/by/4.0/legalcode for +the full license text. +``` diff --git a/external_plugins/agent-team/commands/team.md b/external_plugins/agent-team/commands/team.md new file mode 100644 index 00000000..65964f37 --- /dev/null +++ b/external_plugins/agent-team/commands/team.md @@ -0,0 +1,50 @@ +--- +description: 智能体团队 · 状态摘要与面板入口 +allowed-tools: Bash +--- + +/team 命令(stage-5 T5.4):输出团队状态文本摘要,并按运行环境给出对应载体的入口。 +(`team_panel_call` 为 app 专用回环工具(visibility:["app"]),模型不可调;数据面走 +`team-ctl state --json` 读盘重放,只读。) + +## 执行步骤 + +1. **取会话 id**:用 Bash 执行 `printf '%s' "${ZCODE_SESSION_ID:-}"`。为空时(hook env 缺失) + → 列出 `$HOME/.zcode/cli/plugins/data/agent-team*/teams/` 下最近修改的目录名作为 teamId; + 仍无法确定 → 直接输出 `Team 暂不可用`(en: `Team is unavailable`)并提示稍后重试。 +2. **读团队视图**:用 Bash 执行(teamDir 中会话 id 无需转义——`sess_` 字符集安全): + `node state --json` + - `` = agent-team 插件安装目录下 `runtime/team-ctl.mjs`(plugins.dirs 直载 = 仓库根; + 市场安装 = `~/.zcode/cli/plugins/cache/**/agent-team*/runtime/team-ctl.mjs`,用 ls/glob 定位); + - `` = `$HOME/.zcode/cli/plugins/data/agent-team*/teams/`(多副本时取 + 与当前安装通道一致者;dev 兜底 = `$HOME/.zcode/agent-team-dev-data/teams/`); + - state 失败/目录不存在 → 视为「尚无团队事件」:输出摘要 `成员 1(Lead)· 共享任务 0`。 +3. **输出文本摘要**(所有场景都输出;文案与面板词典逐字一致): + - JSON 的 `failure` 非空 → 首行 `团队持久记录无效:`(en: `Invalid persisted Team record: `),随后照常列最后有效状态; + - 正常 → 首行 `成员 N · 共享任务 T`;成员逐行 `- — `(lead/active/provisioning/failed); + 任务逐行 `- — <待处理|进行中|已完成>(Owner: )`; + 空任务板 → `暂无共享任务,可以通过对话创建`。 + - en 环境用英文词典值(Members/Shared tasks/Pending/In progress/Completed/Owner/Unowned)。 +4. **按运行环境追加载体指引**(三档刷新语义,D4 口径): + - **桌面(ZCode Desktop 会话)**:提示「打开面板:会话右侧『+』→『查看所有插件』→『个人』→『智能体团队』→『打开』;宿主『新标签页』里含『智能体团队』入口时可直接从『新标签页』打开 + (自动实时:订阅推送 ≤1s,无需刷新)」;spawn_teammate 工具已携带 `_meta.ui.surface` 定向打开提示; + - **桌面内容引用(用户要求可视化卡片时)**:用 Bash 执行 + `node widget --out <会话可视化目录>/team-widget.html --theme --lang `, + 然后在回复中单独一行输出内容引用(手动刷新 = 重跑 /team): + ::visualize{"path":"<--out 的绝对路径>","title":"智能体团队"} + - **CLI 细节指引(恒附——桌面与 CLI 都输出)**:headless/TUI 会话可能不暴露运行环境, + 误判会漏掉终端用户必需的入口,因此摘要后一律附: + `细节:node state `; + `成员会话:node transcript (按轮摘要:用户指令 + 动作组 + 每轮结论)`; + `高保真(可选):TEAM_COMPANION=1 的 daemon 在场时 node open-panel;或 + node widget --standalone --out /tmp/team-panel.html 后浏览器打开`。 + - **`` 直接执行**:`runtime/team-ctl.mjs` 自带自执行入口(`node /team-ctl.mjs …` + 可用);`scripts/team-ctl.mjs` 薄启动器等价。两者任选,不要只导出不执行。 +5. **刷新语义**(用户问「怎么刷新」时回答):MCP Apps 面板 = 自动实时(订阅推送 ≤1s); + ::visualize 卡片 = 手动(重跑 /team 重渲染);CLI 摘要 = 随轮次(每次 /team 即最新)。 + +## 纪律 + +- 本命令**只读**:不创建/修改/删除任务或成员(变更走对话中的团队工具面)。 +- `` 不存在 = 尚无团队事件(隐式 Lead),按空团队摘要输出,不报错。 +- 路径定位失败 → 降级为输出「团队状态不可读」+ `team-ctl state` 重试指引(不阻塞、不猜测路径)。 diff --git a/external_plugins/agent-team/docs/assets/manual/card-dark.png b/external_plugins/agent-team/docs/assets/manual/card-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e9337eddad439cd2a2472f30cba0cf39a3ead2bb GIT binary patch literal 123269 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 z zKO&(Pr;%3Kd{K?Gn-#rof>6|E?xb>O$=mVk(r3yRNJvkI6iqBhLe_c9oi;z8)-doQ zkVGtEXG!B_3rHcPiv;#xoWzkX9_`+vURjtK?ts3H`*1qu@vhm(nfG|b0lK)-stL?r=djR|NWmQ;c4uV+%7*hlNUKpPn zLN03#mzj{RV5xu|H(=$|2b86ITF1qPNm4JzfRMxmDKpAw)lCa`7wG_q$fOVc+TT|m z)DJA>4>j$^V;TAIssE!`=;*jgt}K?Z%1B6yMR{d>QW6&{r@G1ylzRet>c_(T{KV|8 zyy9YYFG(#?Q6EgHMOyd4!9kE4v^x0JFDaEEVlqOi#=&81+;EtA`0K-mS5#-TJY>S) z3zi4JfUgB2BGL?tDzfH<1qBuM7N9B%9}6cXYwSPM<-yq4dac+O@22`Wh=iXGb`n>& zTSi57Bcm^M!R>~k+EUG*rOe%gd28pY^#$=raQ4=>r}96;CkvnaJRJH;H#8)A%>e>t z2$qLSpIb}6_C2jl&T)J|VAwM_Ib-c;Y2juaJ1QKN_}@sb&!BJVy~Ly>lB)yryeN?X z0scey2c?~twUj-t$q-rp=oc0hM-ntNsSb^e#YCcn3(1xzPZ0nF2>ATngU|3V2nf*1 z#RJy3I72=ri<@r(;|A)Ul9G0PNh2pZXte;?)--X4&Mt0cI#pqTfeDe3^fEzkd34mr zVQVWH8WNw$i@0r_Fko)60Mpw4#e9&M=x__{f9b}`-)L!R2j8)3cD%kS0k7aDZ<&sI zvOP9dPu%0lf|`D~+;kbO@pUgQF?f-MDBwRl9}Lf*2elIq{;nJ!D$$|QL4#S;^*8EV z=-c+NNzwnoGynb8{{iaqKi4PwKO9o`L=t&oadLM4Yo9)wsNo_>__qvTBnE|~?Ch#5 zU(fmc%_e|gri7$A6BkXYXnZ%C%Xz$iEKsiz5LDj&=T--WA}cFVfRptkTN{OR_B|mb zC7Xsq>~EA7^vV>9K(WO%e}{1PBhb-iJBK1;Kt)+O|9Oi8pY0rR5t;OXEv4sQL&1YT zPEV*V{Q$g$zr%YL2ldTCQj#~6%%23H82-H4+p`3Y@ZYf7^D8nQ9HJ{MDKZSV-L8Rw zMcdY=6yT81l*oDx+kj8JKZ+^NY-6JdcvMMXCqGGebX0aM+wj1`{18 z>Kj-f;m=Zoz%9fjCMO4^|Cfdx?~jDeotU^u2XiY2k|(!PkUP8-0=hC1DgRyq!W8H8 zXmlg6y1`YHpRb}jHLZN+7DZU(3pavToL;AF)X;%9BMiiK|UHO z$oulYj~Ybg|E94mAqlj;5hfqhM@1qY>{if{RVJk>i1tCM5WMfm&RMS;Z09fV!Ja;z~k0-1t&SiA;#Wtl)d*B0BE?+nq`<^8op!gDM zEe<=C6IfdE@GSf@lF5n|mSUPXHj9OY+@ti74}8xt=i455GIAzKJtZYIHCxz+w6uNPQ0du4Q>Ne38G%x9*F zV7=2BNF~&>)}IJSk4pbNLcl#1X7<2r|4P&Ga>JD-sy}lg)N1o=<%vLaY;ENMCDMO0 z5vm~F@+k~BAFOZKDEKm@{=3elJ*feon2}0JK}1AFii?4Qf`dv%QZfwe86c&&d|_n^KQS{(dhSWtfc$0jszXAsXzoY!h!%hOX;lJ`pHKT|{GNtAVZ z`izzU1UtYAb9-K4mh6o#pisv{li;5T{7`hl%C@~@%E4Yo0v0leH=G^k=a(}vFpO-O zD*t!5&oq)i6HXeMiu`g(^1(G^u*QTUGc$t{>t(60-u`nrRMx3!;0*6rP)TXe8}i>@gVGs2Tre~KGq6IkxNpStL?ZtEwFK-AfT#Yu z=gFU)B_}g~r#-_9GA5(=LtO7v4}!D*4rS8z&!0oXga7Wyz<5l}i27f9GHAt1!4M8c z81H$%{7%jgCD8EC$PlteBy?j|&i!{Jp6}=X^QB4GV86CHSs)2eX$a%294ssKmeaS+ z=5eF~uZD^N?UH%Uxj8MZPbLHsu%Tk`Xs@+eawVd0{~bT*K`;@dcwJ^3O!p5hy;>)!@T>U)V-(O^%Iu2^q$A^b8+tSKEeJU!VdTU`} zr9AlZ#qxy>xW5nAiwX79Ukr7gdgHt9sT@gfY;o9l#|_{YCo$NXE#@N_Iru_VDN^ zlb9rLVtM(YJ!dWO@g5}VVsp4#eed0V$l6_@U7f%$4rKAU|9j{!J(mO&%KUkH9PG-{a4WRcf+4ls1ZaGMF zyEcop+3Z6JsTvS5(9}&fiU!1J~@*n1` zv8~UROH6!x8Hp$JXJ?p6nEsD0lC}m%J zyB*iNJCIGQP%C;~KMAO9I%5yJC@KmF2>hfxqgMPhiiDd8F&m)k_ZWtn>pwIy@`8x> z;-Me8aAI}5O9Z;DI5aFwug!;mnw}Yo039D&`tRNIB7L$no_t#s&s+ zUTL8;PAbra``(_}ZWW_~WMg@G`Tg~g?PNU;mD=04(S}>1<|3`1%0HErS+2AJntNxH z(T=Rl+$MC_L{O-1n+vFSGPs^{5`TMgT9X;yE zS2-9*RfP52>UH}S$Y*eV*B3NLc6M@p_3D+deg=;$Mr(dX%jnKu7> zU{QWBdA4z;MC9c=t!C*>ybk87&?{=xs}`4%a>Nsp#cS@8*t&KRz^p6JovwXe-Y=F<0BY2 zO76!f;^Y)EdNkR|cWn-m{vk-jqSs$&cw02wL4o3M6LKWHX(3x_cOMCa z9vfe1Hn;ciIN~*g{wEgj{!d`=#l_{&>)%zB78Vwunt%-9EG{7~{LvUQanOJ{5Tqs}^4@82U{n&uW>rJ^TRD zn`}V^dHG^=m;}&M2gJal@mZn^H4si-KLb#1e+zmI4UaA#u6Ew5mTjC5na`xLEMwl(U+phA zZx3Sh36S!cRp$1Px2WggXW#>b%agj1jg6rpdGR%>`x}SQs>;f8)oOm58)gz)+el02 zI-k9%Iom}fU4VqI)A&vbDzPznH6$d8)W<#nK)GYA&*4JDQjsVuD+wv7pvkY=a)8Vz zeYep!lq9iVBs%dP*4YGb}Ef8juND6QfS^2k{QHLw{coe@#@vz zJ(TW+MTRP?^Fd*?c|ox`ypW19w6YPjzi(SI`cne^EA%98FNfw3WDUm}(7VvMOVm{! z)zdRn=bbD}*E$am4|Y;?a7||81rUjC;i3`nh$tv{L^{q3KJeLGh}R<e=`jE&?`aQ&V0*nUV&iTgP`!hKT-G2YjP146*ZQmijrIHjrv6O8H4O=ieFz_J=QTBV} z?KuXu;f|qrB);e*i;t5veuzGsC1{)9k>F&;rsj^u~CgN19?H*j;xEsx&tyYDpFD&Y-+l@-DCv52?%rmC_r>K@Bsb9m0as;_j-)L zla()9t9rTEq5JQKeOeqCpy8P#G0-;1D*NlxCK#{0;>55#O6LUc?ly2bIM=$|y`*rF zos|^@rHYa(jv1*op4slU!?4lqbjVSn(T1)29$K#xa`2rO5@{UskeD}#$}YkHcsC^8 zfC>tjAumDpD{N?KKQ+ZqVvecNa&(1d5_dNs*<#SC4KYj)2@U;dyH2WZv5_MRQjH)< zu#C%rIsb6REKf^Q^AXtEJl}nHyWA7-e!3e=U-DZ)Mwpvw_Soap-MGSI%j9QJ&@Tx_ zB}Vs!lIx$EBBP*)qs0p+;3C7|vR)Y)9Ha6dV=vN;q~!tUkm;8Wemu$sm&(-~XcTR} z74wtXfSYdz6J7qaUhSUGiuv~Oh&YTD+6^e)z^D}_p`cghcxEc#bYUpT3CTH8G--g2 zj=tLFv(_T7OQ5*~$ifOgSA@;+_4G`^Jyz%46BH28d$~6jBUH~7RvZeSe0F*HpJHu$ zT&!oJTI#Xx(0xv5ubXS8;sy z+wp=8pO~6zcfAoYghufTBJKNkXVcJ>l$c}DsZvby{Q2{D;ln4Lo3I@^zCu~>P|(nX z%7+Np?`K71WHhHV`*r)s>mCE3@NC)rCgsXUB^A+lq?^G&_S+BsyKgsl*@MRZ$8w9rVzQWw6a>iN<{&YO>2yp? zJSgF<%1nWs$)=B>Lj=$Angl1t}_Pf7TbE$mU>+qEhsv2_8qwbNh$*~&ce2+%gn^|^C&qUt zyY9NZGu!IskYsD`2z|@X${NG#auy|M*uAurid01#mjf&?2Tu_ z`ufw7S*TW)Xf`k=znu(dJ9xY~J)Nn}&B!2LcH!03baq4Q1J0wDhieNk)DKf|`1R}8 z|LjWrCppV4H65ZTq`UPu)+!Q{e{WoFcqxmxn%YL?*CFd_AZLG|qr3NhPK!dr!2==d zV)pjGSVW6U_m+q`j@Uu|l!~gV+hen-m&Q9VCjgING$br4vAv`1-R_ZvvH4u78tMm# zX#KqkZOmM$Dh0bBst!3}}Vg09e5CHjdb8KuG#Ta)|yM?j2R{Ji!(M_d|@%jM*gGxjol{Xy^UsAeA=p(u|y%S^G7$xhgg$PbA4 zZ$oj#%q;f3A7Dh^`%e<{xd-eU`NN`yhDA^XhK64CDX0#OH`||Y<~tqDp%Q-zc|t;s z1R$i#&AuP)o-ZTV=zr?Xpdf>rn(+FNSfu}zp97iU$riA9gBs=C`UxuT-tBDxvc&^ZHhD(o6N~*P=4eO80 z{6cB4-uXhI3Eg;`Sh-Ez)M~$T7&oZ&SQ@%TUS$mM0ygt z9i(XCeNkmmR%d;^o_H`a0tyNu(=~quD1!Za^kR)Dn7{l)5X*;G=Vzksz%$oZL|2b7 zx>;^YWYk$`aajZRXIUA2D!Vz-JcbCnkAOgt&E@W7lSYf<0i?a6r;rfHTZ)cW@PB)K zeRVaH^jXQ%^V5IDs}CoBkX#H?S%HNx);ly53Ns(U$(3+XP7ivw%y)czUMKP@Dm*T( z%FruwJ)IM{FHW}h(Xp{V!hTAO{~OyxBmFDD%*(Xv!t%yl?=NO^#pPvWWZzyLbvVqA z0f*hmYF+I10WPO!?|h|hDyP+-1U#pmp5REeN*#;kJoxLvoa}6!Iw=)yqAv9;9I$2x z(O_A>t+rXJA0;u`?Ri9PYP#oyxZ5V-Zw1W&k4%H*VhJu}aEeB|Z}&V@;G6F0q{-a% zf&tLX5OV8{uX>H(nJJfR1kzV|+%ldoF-?6$FnVe{&r^t0mXMb}ovI_y`e{&`ugUoSJy>VRhg@iB)m3cV?7tn_MOwgEgYP{rZ$e zP~L9|lnRpyzWhUuAz6iIAb|_RI5AHWHcc6SCTKW#2w(Q9~$yjig8St0qQyO(s3;mw{G2!O zj;j}n(cRvjRYesf@_Kl9a9K)FuRGe)3fX++2MXCzl~UTl7|>1Z8V`Ml>-&Kd9s2jL zWwy5R2Mq-&=wp8gTJj*&>Dfuj(GPm@!oes?`QuFvdmASJ>>x<%KiTejev!0l2X}pS zu=1l;_@l>-B^4X9)TQz0z}Kp-_wWB+fNxEs!<#7C`)>XH|C}D5Bo*4<*2f?cwkw;l z+Abu8oaus2JZIncGDbm7l94$BM8x-SikSaB3TNkAuv3U{(k?Tzvu{cGKe=6C^6CfH z#Kw}v{@{&2E&cl4x7{~4c5Av&zVC02)e$F~v7F81FBNr^%lqA9O)^_F-vU?1qq+F& zW3_S}2G@5pGcyAqj?pD4gD--ZPfYSNn2!+=T?DV}+*H0ZJgP5maXtxvmzExmCcj*Y z0Y`$iP@AMsPEIb!j?ELXwLJsV7qM_c$(eAj%C)Fo$}jy7R|T+(zK4Q}tLW|b-caS? z^iP0{_dgGdtG73gjdpHFTAEO{^abm*w>N#?O%fP*f@fNFu3iWj)Q`Z1(Ad}r-ANd; zU^l^zMF9_nNU=6qj?vEUwXT@r*b|6m2jpQyDOu0|+Ic^?Sr9yaqGbZAG#~_J{_i`g zvRQip9m{HyLn2X3&qA;3?$3kk!`UM)z0ds-M3UL#h4MmbE=~^G&4zZy#=CigO8nlK ztmt10<%mj@3oi9JZT|dy7$s0vf2T2l{aGQ~mRuNf1(D}3IBay<>02XzXZb=&9{Dq- z^Zvl${tRvB;FS8&fu{&7kAjcE>-nu6f?wpg$rn5%WF#6n-E0QUdc_?KaG&b5okfQg z{O>HlJ=%=Tp~iZp8O(l+9_y_{`nVl#=o=W05@b^sCpC9Rl8>J^VG8@1{>^NkLi759 z9|RV6XG|5dr62efQxeYnX*t;0_n}wu@Va5uZT|SlU0l<#i#&;e;bv(?c9Ti}TODj7 zbrue`V4p1m1M^v{qKb;_l7fPq5`=U3oS4Q&Rr8rV81>0=`|GSXJn3$MVb;JwGS8HW zibDIT<)h!z)_-r`dP^qBlfuu}Ij71X$nFb4dzala||b1dk9#Jy3HSquTvYWbsJr~W@h4^THTLRiYUL$ zO}xJ{JtKAK%m?{-Sj#_V1g{$nBA` zk63E3DI7whL;M%B&1wvMsps307>nxOFW#U-)AK4RRPUkuxeKUQ8Of zO8xh^xv`#H`~0Ed1g0IO-Z)HcToo5;{0mGbSU!`{?FaDxPlf&o*yosaoYX0{m^vtJ%Lxg^~63 z&J7j!>D-&#G{xYBU93l~+5|Abu}lH^_>bcmd=^Xf$TD9w)xol&DpZsL!Ve4Fjg-^g zFE9FYf$CLn28$I6RjpW-Mn*<{{s@0Ozoae_#bMIUq458SbF?uTp)VHf^>oLwrd3ZO zuJ9fr8J&!Y$;QScF)A)8EvYOww>-O;#&`n(i`MaErr0i4%)G?hvxc65!Nqb78z28+ z1E|K1`6M>LhgPf5z``UH`JEW}&@LA zQ+sC?zQ-+O>1Hxg1^Cd9abE7rVAtP7pva8@@;WWh@bHuDv-~wOG}Np+)-yApW)eqa z1TG{3HAX;k-DM<1Cxm;&$4~u~ogK65oM6ro6zR5ZG2Ma}l9njbTivkc$tazXdjBTXzI>nv3Hechv z;ca#~!f)V%TL-SdKB@R=#p$ukk1452wY#)|Ipr2;@35ufk=*cfv;=X86*kCNzEMb$ z$@E1CVTJx@Q2mE9kA{@b;8#&rY_&b#Tmlo5Zh#3R;dlM4s(Q0nW0Em#Vw-q-e*d&H zj04wK!=x1DI+n3xlVx|Z+{EK_6hXvWA#qF~J;aC(SW8fE@$lTkYsJLG*eti& zy@H6cJs8Yt(1C-3Z?ik_hyGh6>xC-sw&v@=-9NZ|=F0X`zXA--|C1SAH25+69|S#Q z{~8nmA-ZD1|88Rao_w=9|A%a^{@<_se`E%EY5yX+yjBu{3!F=)*3W1xdN6mI#cNsbmesS@(m`a_>9SWAh%k*a z{JyyL(I6r`oJhs7a|{A;bhZv%h5+!u-LU>FR$leobgy8X=w`r0!?Q;3r%+o zb;%}$+=6ANwzf=TBO`n1KQ8-aWo3W2w@0?l@0{b((l7}Ktn~C|svYJ*;NKTA)7cWM zqk3ZIY_LTpMkPVG0I9f&9?8I6iNKi{opHV;4tJfXSn8~Oce~?YQ{t%zTKD@O_c%JF zA-GkLPvy#$>e8k?Dsa``DWNd31%zne-@sdL<`n}Sivg9)RoW*(ZDFXtgy*H6_ZRm^ zI3%pcijz(NkoTqQcLXs)0xDrlN(xV$|9|0oxxYuLA_(9GtSl{oElUMPUmA!JApR+e z*o(CbD`H}P1t6LL&@2KWlg=lbxnH38knNY#2IB|RziY^We2-TS&J~>v6rQ}WNW?=7 z=a-krh>v{?#hM)uPmdctEq^UDa&i=xoR4Yn@SGVx(CcAyf8=pFoJwz*1D-2?fB%6i zfbg@Jt3Z4}xOJ6^FBsMA?qJg0RD)^k{`W7ay$47~KtMbJH z#0^970N(&aX{XEWl30ky$fGFf&7I+&+_ywn z+_^>k)15RHTp2RKM=CBZm!V!3wxEnK{a4>oCYu3Hecs5V?97acVA30E1bX6=W?)cV z&eU5dE}ixb#OROc?5KBkKIR1@-Q2WRPmmMXNC}MRWu0BaV?n16KK;3c4c6fUyTp|J z6B81;Yj3C+b-Bf*KIfWERIxD8N&oDeY*#V?ECvIEE&KPjVEh5|a{YLc8XGH&MPy-- zdQbzxZQtIgOM>l@b{ple8Xeu{HL^Gh)az~%>T7Fh=m|(GD+9AznWB;%*k@qe*0Z3ZqEa?fY!fR7*6=d*dsruK z;HXYvU&L@^uZPw_jF7|n({S2qdEm){pSBL39HcAc4aL&p;%Z8zf-zDXvoDGKtv=%M z7@)RU7XkjOA|G@GT{M=`fZ)K><>~{FX1!gQ+~n5tTei3x4gmoZlN+BifVvnf+52K! zA?G_DsrS};jzFW&-u8K}keV+}`)v(15V^&fYSf!g15#GfcP1)2+uG~>ucoI8L_{mU zaJUDKox@_*&xgFHhhhk?IX%mP+fR=Ypdt*oE0SGlTL@bpyVTnLf_rRHtb&LO?r4$D0NJw1lauE<5<;SrZmXu3X4Mt0hCMOj)>2w61GiJY# zH!7?^3-|Wb&%D*F=Wy{7+t+mSL`OIdomv9Ow_4Fag|ON#Ol>kRlS z%`UeI6AW?NxnJxlJdv>D9PO$m z=NQP5NIX!$!WJew?DjBZu$qC4BZ-559nTZZzUk3tt@O<+er~tFaCey?iHWLw5yb32 zJwIRI5(uqzeij$UX&*hevpcKNyw%Zr_%14^3eqUSfDOGY91Qw8UD`x{%wZC#z&$_o z!RA~Yf8yzuXO5AOV*6@2J46W%k~uDBLT*=Fvr9=9>$AIaB|~lqol4kSo%XYn)m*OL zf<|#h^2E$W$Jvx{&-&q;a)L!i;=rkTqV)aYz3JeX)K*)sw@8GC`}-pLym}W@6up_e z4hRvMElCOWH~TCY;C79RKUjT1vxG-LSZ?w{DU>6cl!c(=J)LHL*E4=tYMNw>g^i8;1L=CFFP|S#Og6D_%oBWDw z7UyLVL}|K^!Y-`G>!bcYhi>7xz}0bCtuu*aVOzhs)nS$dbLSi6TU^ zRU5gXW$=~Jnhh07fhwqa+eOvRHxXy~fM|EJTGNnR{IRJ6tQY~W9>=n0=TM{AB2ou9 z0TEybz-(`^#zOqdmp5xM>zZ@r^JqF$>m=PPGLo`w-q%wryieX9AksdC-6FfZ97-JS zF+4Q1&3(r&NkqEu(GR5A`gLYkFe*^Nu_#w6V7y#kKVzeU1O&mrWOUv4M ze^{=HX%0NcfPXBaBKS|IkItuu$Cx8tOgvR6$n{AfCR}a4*7A_Co;f*LgAz3J)bUYBM6xv0a>X zwV{c{yg|(q5>-1n7ZD5aKe9HlsVuByy25n4zPgi|p_IFYqe@S1`Y5XDN-2Bt=42Y+ zvYW`~yKCFqA+)fob}Mz7BoOFS9SH>7@Ld)@o)yul6*qfNtJ)4q%&~BAINATgpptW_ zSQou>Ef#ny`NoZYqTe$h;dG zGVb0s^RxRTY3-;GZF^c^Z2ZLs5UF+Z~Aa}g_3WFX8 z0inMB<`RcNyV~*nonA!5*mBUCCu$vqQ_LG3(+1);$vv7z-7`kWTkn!R`VgIN&L%u) z%BFWL4x(akGmTaknl65texYKyaR_hXV1HiP!-JDs4ccP7T$h+L#W ze-IF|c5G;@6iIn(^dW#Fm zjVtDd=APk1pJl(7LT|!oL3BlXxw8OgdcR4gypVV}4QC#HCueGdrK}VnVxS++<*I48 zYmDO8eQkj`!EbHe&~7t(PKhL0ixmRY%_6Av*Vs&3u^_-3kPyqxbF(!vET)px{E}vh zjMFZoq9=0vr#etJkH_l4k{gjZpx#oW!|Bo5{4u>x?X ze#05j87S|IIF7i47v7)*wW5xWUM?;8Wy8Gw{{0(BEaTw8_+=ooyHZ!+eZ5%w5bzf4 zK0b+y1Vm>|T&Z8Kw!2aG-@CdT&&BG`z;br*^p1AA_ub=nQBE;WT%DJdyghyLXM z*aJV^MDTnir`EnQkn+9 z>YunA^%HHj4R4kzzeICFcX{vduEWRj4Hm3J^1E$g;ou;iOvDwlb@F97_-HIitRje^ zhm6C2TL5v$j;E_XoSr(pMoQs;ebe=|(Z%?0ga)1%Jc5M#u{ zq+8q#ROc(0J=m=*H<~$ws0eM;;yHZH#QrIoW8LZ0=(=GkB-9$~5Ez~N+m{-N zR(<*RQ6H5`H59>_^C-~PEf0yybV^qdqQ$@?V`hT;O>Fm@$>iu-fcj=ustJA z-{0^c{Y9k z)sY&Lv*oZnn}X@JUc+ZcJnm@F-57y1hf8j2NKbL)hZ~Z+ondOY@3B9Y+tf(HBvBm! z%1;fTL{0MiGdPT&C|qUSZ%=L)jv$KFdc-5B4&UBw0PL}(oK%@Yi*;%}v2BVioU>tzS01Qx}aKq^-C`_OKs3bHFd;jk&00i^dvcMwa zp`3=l?-BnMdAV$meYqxnU4rkTK+Tp@N<~Y=m$%ng-Hss z`y(c`_D2#?O@mNNV;Gb(;>1dg$E)+)L5$y@m)~glNyV4GwL|ab<>3KowT_m97x_Pc zkFV1ehOJs1(I9D|C0MTE{4l>EHC0o?ohJkb^Z*KzSz%z{^!#*Bj+r9^Vq;6^EWe*} z1zdHNL3_j@C-p$oKn6#Si{EV#e@xO6S#Ja^_iCm0GZjiCFJ2VPkXkIvhB=ga_`iUh zr)F|;a{ZHkANv-KA?gSYS_~=K?dCn3b1E~A-^g

P%fecQ2wE7MGq!S=q42zOwuL~G{!vQF$Rtl9Ac1I10F^RX2AR{~B? z%sAn}wB%`hgMB#&+m+4}*mM*vS=)q8H~$6uQ4OaM8qe#CK+q=sTFT^i>OOQz72Mhv z&|?OHRV<_wUA=%Cx8PaC43Vn+%M$C>HOxJiQt+a!Ca)lG>@1DKJ4Bo&C$CIIKSt;F zGzLW}>x)*KJAA7}}JSS{-h@%d(Ayd9Ux@;e2S8-=wN1f!NRE zb+OD~cjNhsh{@ub|6KxthqSMV093IQKe{|Fu7`0n>raE`rMJMFy#9UYb45=g6F6OXz$B= zh^Pv*gU9SgdYm3+&aGDhO*T!}s%s|fHfahRb_Tvd6?cEF)2A_8fxotzF1W5qs!$;f z71E|;kZsN6W8vhy0fU^Atkzb@R)lpjjBJF}r7})fl#aa_cmPE**6ft@1CgdnUqhA6 z9-p zJUDb0HN_4msm57!5dcA=r6p1Ez`4+wGh$DKld z{GWG|aG|4gWCr<7hD)RAx*wnZSyhfa$KFj}B;%yPL%&<8Mz_eVe~2OnfHFpqYv} zX}V?mP^n$W_>TLK%T#3S2cdJ1n5-lsf6PnrFbMAEvR;Ki?w*maX?$7Si>!QukA(QYAlcSnok>zaXOjEwL_VvOEbtnr#2?Ib!ID z-?Ay_2bZ0z+RJ@_X&(pr z$tR~9@#1AA)k>2STQVj1jQ^I}6Y>KH6|leW*cJikIU;_0qdJkS&1#zm zR1B;Z-ojn+mbl5drgDvQI`ArgetNU(jkEtXfK-C!KWA9%>6+(Yq73?G(o3k3SU2K$-4c9tZuI1oP}jzI-@?JwsX^R|0EA8z&E zo}6%yI+74z2t%WIh>M>wb`tuURk0So!V)DtUHU>mP)a@w*k29!9E(8o> zGIBCtNWETv(VmM99v0FU*GNeb4vyT^)K13pRT1B7@FdfL^z8z^N0<|$b6bF9=;1>A z`937PM;8W1Eo1`3$eNp*4h{lo(O@SueO6JK2v$&expv?hMk8EIOp26y_ulT#I}dFA zFP^elHaZ=1bGdEx5h%I=Uq;RyAcQla`#;0J4@IK+-9o;x32LJYkS94^cJPXdATo9?>c(GXy`=ZyZxsr>pM`iTdYqu%p`{7K-@dGc zH8q`$C{h+kxZFUCnZILKA@I4Vq#Ib9y7&MlI zl8XA9*QJSBX-MnHGZmUR0FW&~x``+$11FTUJ`um(2=F7mwT3qyOP`tEA!B#8Xg0Y+ z9T33e)awa}50-);&w#8;R8(#_LR&@B+|FuWc@!J;#^Ey~J4eSkt_d}z`Kb8l==fo^ zf`RCyl*ur8kg0OJBGl-Rjc|0jq zHThtqdhPs@M*v#>ytS@rbTd*ssi2Tk|NB|J6x)l$Cm_f+7K88Bo5ys(76v8|?5eRP z*Gcd3laPZhMj^G=k5lKtrmaF_G@WQ4!Q1Zw5u;F!5UXa9E|E#6-Bm7T`kj;~{VT)p z;8=o+^3U++WAti+HFV?<$0R9P*&S(KQI^?X5|FTi_0k2iv+RwbnV=1Aa6hJUT>_No zk6uHrWc9QIuXBSq8EbvgYGAdB6DGl?Z0BpzI|NdF>FLV^oqfxTOG>)6NgcW>mYS^C zo)FiHfqw3_+J$6YR>h03-{!WUw)P8W{@?JB0kI&`rScF0U24snsJ28+Xoy?m543O} zJ_y(UZM!u;SUrA}N9kpkovxK#%JUSEC&{n{vRdmCzCD*QK5>o0=4;n4I*g2*LBxcg zec!LYu^jwDm?%bIRyE|QczbbGqEM9&J`R%uTnD8CEWZLfg>r6oyzb! zit7P6?y?P2Yb=eQZ|@lO>H63eSP&AvlS}A&hlP&HD#?3C1&KJtkIK`HV0I{8@sX#| zV~Z;*{AS(_WG4(K{&If(P=;LSYjhwJP$v*>A=`NYjRu^RXYfe7iYc>+!!e}hQc*L=0xu=tVuLwb}vj$4X z&YJhLy17>5?I8n!ptt_FZz?;dp*r%J+}=;mE_)(ITp1l4k9pZt&ZEm(6u%RD_cn1% zgis2}gFEhTJV+$JOqJf&7>FaYEgNmT(SL4FEGImEkHeIfsH|bG#GtuG4IvI-g&ZrC z1dsVaaTZQfYXgAKZto8NzN0hQJ**W-zLxyOi+aS7{^8_^DUb2E1aXc;t6gS(TDA{*gUi~my@DASy<11} z(-Vw&oT3-I_+=6XUrG*|pOOw*3&d=yS3|+KVKBizS?Ut}NOE^7Iz3GtLBeNn!~5$I z8INDXYm(N3!;tIZc;HmwrA7Zf(q(N$BwWhCH*mycBDF`EyeJK&kq;hL@ly+lnM{M9=7m+o ze!7=R&6)?jdY?`DX!GS88ce-qwH$a;93bTpS1V=q5Tv9+9>eAEa0Qgf>?^oYzA5dE zWsAX&yiN&ZLY|(ji_!*TN1D}I*E`qS^aa7nvi+Duopy zp9BTFgvEaXrSVL$rjeIh-?X~pS;W}FyqZ%2%eQ-#pB)ck4|ve8UmrbosiTE%iW;Z} z3S&H zSHxv=s2>=&O|htNY~oCRqPuLn6cumyC>p#5C*ZMLn?MwQ`t|@0M1vYW?I zg0w;7xlm0%rD%KExPUeVeA$z2P&h81qpeTu!KboiKF_N*C>h+{HHG&cu^y?#AJr+^ z7k?d`_5`D9w|gpB7g80)xL6V4hGvVbl z;cjm3gLv#527RlGeWKTo9O{g+D3TBL`jJbN5|YprI!#Zvx{9?r1`@DC3A6FR*2|3r zJ7MgVl14vNbV%{#5 zR~lp4Ont@3nAZ}b!zcj}?xY+oB}`oM^eZY#0WPKeRk+Pb|}3L(4wBkFsu z+{%M@364%La?dqBSSAC1R|GVI`FF7`lh|XLSsI2GUnrz)rAQK9#fT|%jHlE1`TQ=o zD@}|bRJ^>C(aDoS4>t5STa;sni-o7~ z?=~N@+pJ!kQ)ec)T7P++A4?aYV@aT3N_N3oWM#N=$P!!q$xdJE`L|f$qvqWX z#ii$I`p0A@t8^Z-R?PDq!?nuSbxUbwMcQ;8hm#vC&DZ%o^(_G!cGCw|*;g(d7M&OS zOcRy)&3plGYAasyU{vq?$O@+0l-UkR7DoEAus93ko|Weolf*@wV=lcju&SLEACS?w zr;FOP8q1xX=r$+>l;zRK*9PXseM4#r&Cb);U-;a&tC|h}h{T&W zpL_%rFBQk2YWXQ!`^Z9&_nnT~Oae79y44M8%U{oh=Q9yp-T}5+V8U7lF01Fy=7fz> zCVsXhS&eIZn~Z}UA*n=0&33=InOQ78SQNsEtJI2;_P(X0l*lh7R_1B-82wH)a0kvA zok(>|_eLC+GYhVg#2uzJWj@#4KxZer_;GDtV1UlR=CMq;vknCS8vUD zo9WZq^P^+i6(#)fLUGL?#_D{#zbDS%VDrBD>uQ@huj9NtlI7po`NyFOGM^w8(wY^B zU-@z=FE0=pV|WFT_fIvVEzZ{CPlXjYu~w$b$ZT{R=5y{!0ucpygCsszf~uuNAML+t z%U&*Ew9WLA5xl-g*ATfi5UV0R86rzgus?HUxV`*6am%3MthrrF=C$}eBcJG*vvM+@ zoRE^Urz0=)VT+>p}vr_;T?`7Z(;S%NJ$M6)o*=sqJ} zr@3?GOUB+=?D$Wu`pNjka(}vr_ouAJT5rW8@YagX`K(SX3JaW;6Z^2TjfN7+HOk#t z9Qcm&LpUwBam|9_n|+PR`G{xY?HRRO4eg(6e63C0pGD%E5j~AZIJ9mm4+`ONIh;L{ z+Ci{LRtTInvXs<9$-?u1fjqvAj+dIw%2K<#N`pE!!=1#mP0vQ|@8(tF@G@nIfr)py z$}oS$bDfh$$~>`T*I>mt&W%)FRG+JV+&>b)>L^0EQW>mt1_3)=UP(v{K5md0hP=RK ztNEw6aI*o{UtX{O7hzu=)%5rOucBfQZ;K9*l9n6|ib#h@r*wDMP!SO6hJl2P93?P1 zRHVC`NsP_`gN^!KKj(b^{_U@w!wv_|?(5#?ePoQ(uvp1gC*6MVK=aymKu$N6=3j?v zbWuyXMdm;`O7msHwpM>Dt14>vFQ1?SlR$?jO3Y_Uei{E$iKkUtD=4aYj7+n3r@ZxC z+0%pyz+&4Jc7lOy?#12Dulb&T@2|WZzu!9%YG2fG5Z9a zs$QTf(PlTXmk=SDR$lx^!+`FEi_IAcZJvgxYfmIusebwqPZcIYUO_>-sAoPZT^xU! zpjyjOS-JXIVRS70$`c(Fs8%WQLAQPnO(=L+27BwXB~^=$>EhXfK|Pe8Tq_;XiA{XO z8jaX4acm^%c<^CGkyNUf`cej3Q{0its6@u4ZrW)SMO9RQgr2AyLyw~rlbmGfFi}Jl z0_!^;^j>f<SOTRv+qS95VAce#N zF4)>|PD+f1%ckdVa7~ zE`{)lCOmG-wqltziT1=a6Hy8&UXIz6NO76iE#BjsAHDoe{Z#yU9o&ITB%P<~`~CPN zQLk5UR-O4kyz+GrB3-${3_(Dh+lC$L!O`HQ6c_aL2%!S zuEjcT$=zT4Ef@V5BFMfoStH|dnN=UO@wIwv6TX`5QKSwvUqB+PMaQZ2T;F8YIEmor z4eqzs9r9m=C=w8Eg|`?MwR6LbR-u{ANC zbk3rj$t{>wSh&t-sn{zPx2HtaOrVrFg!$DZ!jFQzkgZwlEyo6~)=OeM&(6qolH4!g z-dBQj`p~P9A@869gWzUCJCBpj`%;2>i!(?>?i-@GuTj;zisw2={U}mNX}LJluZocm3l()%u+lNxV{Nn_6+AG)sN@?neHT-k?Og zc%}~;b&1;eKY!qV=3XbqT*_KoT_DJl;qX6EL5{JBFCQXs_ob4&nVy2hAK*!hhp5m=d9Clqxs_|aC-S72W)bst zf;iQHAuLrS5R*|)@8jp|<(F;WNb>DFBO^1}Ti%cP$BUOpA1 zSr)JQWz5RQ>t*g7gokc+0NaXa~MOfv^a)ODggK`NXJ>uX?E6@B})QhW%2&~hZ$m~7Mwzs zrF{e9+A4@vRMAez{a6C3fD70UH+TBe1n2iZPh`C0oJE>9Ztq}Nw#G`W1Lg}e>^a3Z zH^S3@r`s&;=(!b7f zw>_a*+4?uaxH*)4UqNrJbhu43E6CO$op;MI$tgp^UEk~h&fvurfu5Y*<*0SP|7qNn zp9d(S*8f_i0b|o?X-Z^(fea~c#fvk8D=RV{zxYcakZWnQ z{k~v1w;mbV_#cfl|n9>;C1LPYd@U3DU=&zNwx zEmLCG;@G`6`0~bwUQ}6cga!(7zt%sLT}wv0aTFf*rdDh$+t@-xUS5a}a% zX@5a)*BbxK2Y2s@=CPLB_lQ z4+}WU>wxb6yd0D?5-^*3kCdY%^|M2hGkE^y%?+g!D{drHz>-Zj6;rX~MM?Z_D-Sxo6vJGOL(8Bs213rT{Rx{k z(JU_9Yexl~6;Re2=9n?#h-t+9ET+;g#&;csfxgYpV&w~@jnTukDa(XcM5bt7n$AgF z_yDbx5=yk`zxdl13ESo>W(hdz%3%mT>zt#zJ_Dnbc8nb>F~HP1;0-R`kIQPXv1uEP z{ax7}%R}sHs7#kb&n)vo1cS!I<{P@QjR>pMxXZZ}VsF0Ly3(D!iqcWWDzwQ&(j%_! zIqis}EX2Q9p80YaTy=^HZl{>aZ%`p>S4;Z~3%)kT!Rb7Ax%=H*T=1rL(C>V_vTIXPTnnC!oz+C-5xq zyfm~>^V6r`g24>d{z(8LCWRu`OioPzj6>ze;V@n8y7=j;A*`;hj>ylwuHiqOp8wvl z#56*8U@#w9#eLv{jmPwSBsc>XAfcnIl!njMDO8y`<^=;I`h^>6BX-rQcU6poKy22! z+r6v(<#x;~jjviM?&<2y6f2wnnznU-+gCj;K7Omnmhd|e%Bhpe>hF>3Zg zPsK5Y9^m?lHQA~ILcU&Jw&yK)E}r{pL3))JWPne9Wtm>WO_)5mK;I{6XsBY?StYjl zJ8Fx^VAqW^BvT)`*(E08x>R>C5Q~CO8C6;BDCXo~8Z;Pq@2-{vT}^P9w3q=0uqC~i zD<(C>b&^RNVbI!AT}>}uhjL@Rk82()57Gg$^#R&hl~5~zxK19?m~!LihDP(hfB&|) zN+jq?>P-O?T;Os8QclVq+uf7Y_DLzZ;Q@5{^zCRICzDmFcJnIu%o~!R(G_lv);ky3 z)LJY3pmm;3%uV<(HCN<+)9Ew;&Qu#=%*a{N1H8{MG?J+fMx|l}oO^Wd^84diY!qPm zDrtoqtw=oauBhkcpSZTLzRVu9_;c&;OYH<+dkb+pOxYNMa-&+~B8|L(OfmPRse=*{ zp50wKFyh3)76FXAa?LWnbZv>~lS8)-V;Eohp4-BL9Wc{!pklw1c}%>`g5HqLZLc&VJed9dn$L)&8fW>ySb_BC?Kc z{O(;gG9LX3U-QuG-4mro|BU`@c$6Y!=~2toF30i{IOo|#t%;Hr69~%phV#l9Ew(yr zoJ>e5&g^>a&9DVclmy_9ibk~!KRmsa-K6Qw)ucEW<}qoMCFajE>ml7@za^DI+zn;M zrJScVPvTFUC8i@vrsLo&RgPOyuqPH$CbeEjLHpH%h=FAU`Msh-8WFcCpANGvy(+Z@ zRFTrMKdg(vY%2C+ho|{nIrc5W&U!zz-Kv}(P8Otm0Ov0RF`e(``ae{FaPvbJO3yml zE5@M}2~bL|G(6lw7W!8#GT*OXQA1;CcV4VNT0Fjy|4wC+T8d|v!XNy6+Y}h$IkfLd zxUIyR0=*TA2Xd0f%EUrZ78XxqI*Oup^Z3d0_L+QtJ)+Ch@tA$IMdV>s@(^heHFUXS zRVC=65@S6s0{+c(bh#x$=%HgGhtB10hl+M79)0F~$)Q-PcVXb6shM@v45MFsaP862 z-{+$1zfAMa*MBi=j+K%>)DT7Z3RG!SY17*Nt`tAc6?jnVH1CA&v1H%tQXDTH2UB+J zI|pqJdA*_e`3sK$Ihw9y0fLsPwIH|UWgNY3D?Of^XQ8=M#;wPsWt*_{i(Q~eBZ$UO zhvSEfw_yxoH+7d&*{s`n6%&Q4vuW)>|x9 zA!UtJf|7xo@a{tE4*2V_>_sE1!^X{VdwGo6VTJ_H`meY9U=>UMeCzR_i!NK%4U%hh z1kFbn`x7C@GAC9R7GbeQiv0NLip!Y6qjy5TA58oHy#93Wj_|!pE%j@4uWwzuwleYw zN1q`XSnR&$1a1FXbh!uwf53B)71Ure*xD#4T+*Au<9l{$+>=Ej3_kwI&*d@g(cg-P zVD@_|b&AL5=jF}1{2{w0eVIcj_p9~Zy=&kn*FF$asPWvpc1?XhL-5-FUW9T#umA52 z4c&FZ|GjbXxk>ZCH$N8v82-Ok*#GB4ByIg#b+*zA!XhHRK7L)haE7c~k4cAOrQBS_ ztD9QDao*o@>lUF-$zygYV|#7x#6wwtbOJ1NoF=NaHs65b~ZgnBQt zz*PGEPugP0p!heakJ@D>z_(wsBU(7?j=GelLws%LGCfnsj}BPFh^W!q0jzXOq8Yy9jCizq)C#e6)+FI=rZDl&#~rufBi z(u-SsPD!clHqtOiE)}p}@YgEVt~y_dk;KBA-0yRA@#sJcFb)&jgJ7cu5>v;Sl8|JM zXt%kpjRW;GVPBZT8xdiP7A1{VJ$F=+{}#l?W|8uq>sjKxyJ?c{3sbHMUvW6=Mz@>{ z9>trtVkjZDONo>iZ9#*CwSe>R1#rX<+VXMGzlOpw*4U3KyN)$32jqtfIBBnITx(VX zfpV&%gU$Q#$&jkG7S>rTj{LF!tz8xqHcb~)Vw%+%1;8^7)LF%YT%>ryGVa4i8GosZ zjEIN`eLm>--S^L|4TwKn;zmebYC?e3jB0ju@oc}(6bT{&Ip5c{!0HphU=b~nAY>V=~;_q=TcdIE{i zc|$~r5jXrJ^gYJdC(0h(j zb#YPX7k#j}2mmAJ$_n4ZWHs?=1E-s}Ze3Id6zS{cyviFI>IwB^*P58e9_>5KH`znDTSj z-29wMviH_yc0qwPFg}7_C6(Q;(a{aA%la-ZMRcT+;{F|DCB{F@J3+aCcM|pWj~_$# zdOxQl%6N^dRDlH(p^c!^&fClk^6qSJ_u815A06%ejR&0VY{g>CERTgrC-HqZ4{=S4 zEH*twode0bprBR%JQfyuMQkA;Ec6F1!|cj4w|oucL9Pn2VB4&{ba!<9F%ei=|c8YW7|MbI&Oa6g><*;2I8rR;Ff*rvi-o3u~tD$gKdi>YKHGS0N#I{jU5gV+9 ziTC~fQ2K)hR+H2FYxD)G-(sn|+1Lzf9h_#GLKI#eMnQvD5;@nL*&Mrq@}>$mmI=68 zMMM;)do9xJqE#nH%a`CYAo6%bd9rEV$}A6@o%L1uC)B6;nmpEhe%5oT4=P{xLUx_# z>TNDKR-N-Hu?zYA;^N|hTTCo079_$oP8S997qlGOL`m1azkWZoBun4>yVL(T`FCD7 z%xQObQ2grqK|ILXH*E6xwQb)`NOQir4?}KsITnckAE-iFi*JNBv*OKu7%%f-iv33> z;bj)pBsXg}jrg%QD~HkP!j7wB;jF4OwHV5kej*xi%}W&p6$xKVs{Zr6bCA6oUoU=f zbm$yKnK^Dg4?>KO{ByhgwHvb-&Qc}qGiy^){@4M*IoX0j6&V*ACE@Q?0B34!^#5lZ z=AU`Q^f6wd!VgI$LGL$q`u1vf#ub0W=6M$5*@|*^=I_pmY%MpmpDB@z(r*ymAw@yC zHbUoo_7^)j_cAbC6gNox#hj)#eF~2@FRB|3h8SadvrOwh54&5dfkZuM{kLS8sK*pV z!rFA}9?DY5Q_q6IDNBQaA>N=ns=Vd2uVRQ~kQ{>zjiKUj)>^0-^F$i@uE%vYc;~#NA)W0Va8dHg3NWWaD@Eb4R z^xB#6tlZ($uXVa8*=>Lx7w1S{;npH{ZQY!cipQIrYEg>8sfp%r$;0kXF=O%Z%u2R+ zx1^G^Mc*KC@}BU)75;dnl)~n?SVTfE z{$GyV`1zOr!vc67STSe&xN61pE8ERHTAgd>IJdgI z#bsdp30`GAKp`cBaFWyT46;9m$BtME7=85VPrABgMa)dDyR$r4-j- zh{I?MqAGoJL#$H;ppgt_>SMdsr_S%+-(@3g)a6{)Db+W+^~@v)SAT9G!dYSvL&#sw zqBc_MueQwWwCfbAlhW|(&%qm%PWZzrYt?Z#+2X{(%~=O@01 zS1>*9+7{Z`2Cgky!zN8EE6Wt+EMhqh4SeVxdpu9?ig8?7UeN~`j;5X5250#sEe-j$ zS7PEOU9<0wH=8_`rm7Fh0nM&t{2w_vE2WLJ^m_;8?et(g?1(2}^$39Y9ZDrMm*!Jn zcr%Ujk99>@lmyJ1EYNDbV<*PUC3YZ}f>X+R_2%^7qoPM0*TWo4dG?5Oss-z7)6O{# zqAq>R@`LmO3=IQb1!xaur7WASE)N1&S?B`!vdRWKyO(zJx|io%*F=LLq7{$fPYB^( zYk5SW{z_FjZ8E6%q>7y^uB{8?mW;h}zWCMZ+pDcroK}D5pm$ITnP2eaL%^$_*QYe5 zE78hM7D`l&MAyTfSw@@7k=l#AMd}kT-;ZqjUHn;_M9gPh`cD+K+YPS?$f9DP!{oq@ zTW)`#fL2~#AI>OqL$_$4g~*!`v`*CE~k6{ zI|xq*K4$2iCm8EGot_k) z))`O>t@^b_->boEYZ}=ZY`6DMSVb&ot&soh*>8H^qq{{EO^26qQqZe;0ONB>X@N1b zO)e&(Kv7;k_Eezy!8<4R2f!skFbC@`t5;y zarztwq$p0f5qg+_Ba0mM-Bai(c5AG9?92W>(3*{*s9OUzP8K93M_^nrGf4NfxHiI- zjstVK@x#Xx*f?0uX3LMGusuGMz4O|A--IiFw5M+yrlx$gxZcPI2g9qYTmSxz-&Twr9+2kG+grfIaxD*f$?;nZIHdtQRM&~MOLT}G|_w~ zX0gS4DC!A&k>T%J>3uq#O-DWU$JBF4zLp9hRs+7B+lSk;Rn`l0lvaC{-3LRbr;G-i zv&%6GF%sa65C^ig@P{wmay@K~cuRD7gS4*c;tucKj{!l*o}1kP4^u|b&HXUMY?^sV zeBP_E5N8&}n-^g1K7RIZ^VQ_29YaBl>VNly(MXv21v+?Gz(XRi{V?gXeE4L6c8xcyEea0x7RGu z_<=eOGaDln@aPF`z57{B*}VT4B4x4IoSxpO)=rIQ&-D@Cw$&N-@@$zDMRmzBi=SRI z(YS~O;U1EiSHFNtGHUW_CnXD1R%Hb(GTZiVji04)8#VIaEiNwuSH;Ywj*r|=kd8d# z^0wZz5Uc=u`3K9454#cGJgB6%#ds+!e zx3eVNi^B>!r)pVl-AbXsTU~XPh^=;=JRzrV4BA^Tgj2`gZ8;s`sMLd(0R}#?u5N11 z=;`~gPU3#DPMIQS1f|A8CjZvd55{zeW5&qKhJylv!z)j9mosU*9%_~80*|07a+!3xV)Y!2Rdl>>UY_MtrjyexkH1D$c!&yWUIs13 zveGD|mzfxVNHocJs0Sdm_4-~Qwr^tu0DpP1mwZw&)t^n8-Si~$AL|m5(6QWV!O^$a zizkOw?>ANF{_R?U=1pykzWDEd-ibfzm zP~45$?)#uz!2vUtRw=dBF_JDJ6UA%#3cDtIe@!Vwd(-({!Qen^nc3PPC)zturyTnXUHyyOGry37j&PpD+aU zQeGB5r%?d9eG^TYm6|H-i4n$$mISdkN;uj0g59^nIUuG?=^S8MN(~I@O4w$pD_xFp z=WYmc_TU#At9ldh}bQ{E$-+#Ai++~^g7lLjX~93 zJ)Nc}p%)c)$6NH<#XFNw3XOm~W2ozlkqfI=|EA+O^DXA6&W~AVo7p95reX z!~m{0eV1B+I~Z~~-xxkLt&(|di|yPVe~e)qvr3) zNgY+}eW^?7uiBLZ3C&r6NQ*ex+e7%Ene4YHjFt6-tOE)L3!zdm#u(G z@7}2O0CA6SUKh9k_hwZmbsO~0nd5RpvJ{^_3!zSUxoW(Ahyks5eL~PoVP8W*30g5f z<=%9sd4CuYGP?-?Yx*DWJg3V>tW!m0WBXIGl#U%XNKr|nF+5MBMml5Yl_pbO2Y(7C zxN(EoNW&CdSR@&u-WDH*fW7aZqNFP^-mvd#U&8h!&Besc`&Inh=ckP1I^;O`!?z#- z2Rc#>G2UYQ5wfj`NhTV->2zj&_$fvz5!RY0hNez*ZqhqUHh~^&tVRWON3&{$)a>l0 zfF_fi0i#Bw&Gcq2>B8Hy;`}{(exLO_wkZi0hd>IipGq#>V#D@L>cGO8ZB$7RI05gb z*?RzJhkv@)T_CrjnlPEmm`rblt9NB-VTV@8#dW@pb`!JneN55AIna zH%3`hGsI=QR;{!44mXxUHWe(yPIkn)x^1q_69<*e)_C^j#z+*guiRGUu6=X&o1}YY z_uygh$?7)|cYWifo}}J?7Xzt#)2jrxiARrDZA7Bc(K^5t>DqVaBjfV#;h7sz8+r1we#{z7%vzJIkQ8DD&d%gtCBIf6eF3oCFi&Ne2cqt1TONP6}P}j0qA0jfA9=- zrVeTEo{E!MA+~RLp!*K(sC46b?RXa_OVr`;+u_R9DC*kVr^11&i7Tt*PSzo$l1K6> zP7-KVmR7O5URpmH&f?D@FS7pt7|m;EPV%blgjq4RS>6oKPbqe5>h(fQ7(nGN@YceY zCHNg{WQ-#UtF}?OD#ssQXPWO|?%WyW+=_cOzdi#7%ouU9Cr@na5{v97cRTDeMSWjI z_W|1<0@F}#*&(5+Zo_> z;NN`Lzwj2QeZyP)3e#vE2T#)HMD9S`NS+3MOa9T)vcMTj`-38mhK2?U!M65bQYkAM zm!<{pA#jHkbRORPF7P3fpUXxOeRcYF{ub7spUlPmHrJdjKtPPYDiowOmM5|YL|x1wK();(FF8rXL5v!t?^^x z{zQp!-r3W;;f>xqg?fkq@+>axV`H|SlfARAAt}*O;c;Q4{_fJC*)nte_-H}mswbff zBIvj(KCY$PQUv%wM~YtQiS4N$Rgb|5En%{K=ypOUAxA{ZIk?~1fC6Oh8M1}IZoG^! z#BEw9jA)ab4%+788==Xt@C_n1%VXcaiGrV=uP--)h$vQ-G#rqrfiIKXQ|D_-Xu|k< z&W5daQjH1pm{=t%{D^u#-*ge27i&8^hZCQ>%kVGXn0+_LpYI74!EWEYd3uU3c5c$z zI-9tvR~2;d^YcqHjDVss%y)%<1A_9wV+*Wj6c2}bz{R;mBc+<->E_mjMQ1_?fIET! z;5p_gkertfFXYj$s#*>$jSj2)Wod7Nx67G%+FFk9cX9pbfZ%afyC?*C2nPDgAV|Fx zd!ofsuC+faN3}V=+u(nqn$Wn74ft__GK$Cc%nr{CNOgx6kM^V@MeeWK8N1Lt8&Gptl;v-WlhP5+GmDFQnE-y^9Lh0QVP<0UnM+O{x z#j8F?5}yalavuAJekzNO+0ayr85g?cZ)wT9$w3sb{oRH z(bOF44a^*sQ%Ow+e3&r6I9ztd3B8RRCKmIr8oCkQyDr=?nd07_SYQ9tq^%Z4& z_M7-g5)Oa4lZI?<9c9FekZ2KLPEY}P8=YkkW9$9c2goDK6s~kg5yyAI3v}Ji-riL1 zT3ZXWW!_KRLbu+sR|pk!0zfGy(Y26anmCPt>a<#J`;-oDoQ}Tk?jC&0e;bX?C8N?- zmwooAo!~}Opa<d1oG&=dD;;&YmT6$h3AJOJKRPi{BI9|%CRt{DvDM&dZyd0Z z)Nvx9prRl+#}S9xPJ72}?0bxaLKqpD=J)rHY}`%6rsFZ6Q9)-~=n8g>b$@!=)nX&h zk*{ox%tY;=ps=mIds{tTZ7@Dtpc-L)QejC0w-~)X%xI( zcQk}NlT?Eb)|Yr&qvdt>Ls3U8u1uc7Un>l!qX{bYv`h^Z7m=H|B?NFjzf9Aw#jHr;FpOeF4e zz&F$9h=F$&VmVUxAh%P2*>PkgjWLW^qdD5rpQ?D9RPubP0cmdxMV2c<;FJ?SF2ZM% zb*_&*-zsP;ZYhPa0Cxp3m$Ns@y`16iJ{FtC7nlquA~&MWs04brmY0^9`C_x; ztIL!O&>(|tFiVUB8TatzFEI5bJq2bBzmcb$?Itohna}Zzjed?t@xQxLUXNlPmXHH}6HQ1h zfQPvBs(=2@WU+pZvus}QmJSY$di6@Namw!xvjHtBv*P8FS7%;D@woC05|K8mOu09T zkn*M@!&U2=!{yL)#94273xlI-XuTUiD)RED9tSsM+P>-SwemxrzK||G9O*4@?`$u{`OAEQ ze)1Mvs@<(g81375Cz;VI&#t3USM;v7g;OdJ4^Nf?ozFfiE}=zgAewohNtT0+Zve)N zwwiD>)Q}a>d-h~iVOcK5*Iwg&_``qf1YhCf*FY0nChDeiSTgp+deC1jX-ZkiC^}nZ z77N>{wwr(Bm9F}&5!l@v21+)luk`nJmPY}u6#4|;e4sd*-(Ne|BL6E}A4!$hn@VC( z$UfEn6&IFzUr$^@Jn{-b^%X=99c&*43Lx4${t(ffhVDMY&Ca{Svr9r-#XQ!tYoYfj zWbaL2#(N=jlxe13@%Nr^*y4YYYrK0`piE<}%gvSbE6=Ij+VYtHPEQ+s;P({Mkiv9` z%Bq8q5^))W$}h*+Euq}%uZY?P$1O5k0@|nnTL;}Krn1#_BMkp~X;_N|3`p;S5C5}g zh;S>+_rWV;dq02fHu;F-fPxaGc`u*2il6x9oP7EXYYia?%g{HU~txj8gBNl!CWDQ+1Y>RENR$T$31kCH#8!FK$cUxBvro* zZ$KHtQRLQ9Ha5~TG@r!iJQydf^4qd4Nu9-Rtk9OP zsPx#uQ@n2iG>mA(dm7BPkGI1Yf2GdTK|UP?w~&+GQ8)5jsWW<}KAEc`6jv1yk(HGd zFig%pM@8Bgf2pBzT$7}8b@J)!q5%N4rpk>rFv$Tl@hfV@783xUjr;Eh!+NSTSwbvfXB z>q%rYVAF(b!N-)V175ft`AlDKUaaL!4=qGfPgJb>P*CWa0m(s!!72u=)D}wAWp@Fh zl0CK-`1$zUdf>Iyvr>;rV{6pvpoL2FhB*TRWcWRcJoN!`ZhW^2v9qLirthw7cMg!N z1O^1IG|DS~NeOQ15iaqqd;KJyOUTA0#dL*g+Ry)T9%*s#%9Dlag^$gA!|}g5K(lq} zHksAFQO|ZNA&b~7QutvLy1`w?o!YF2;3UZl`{@(&ibP}ny;)Lqj51) z<2-NXQ`|?8M&R=JCXFwoJV>FaJ?NbR{f1~|Ict7%tF;>~tr#msj@k{@~F259V2m&$eH%Ssc+kN@Aj=*Y8iaX+iBZtrlopS zHR9n1@gFZt_&;w0!J%7Z5_K>1e4^sj8Ma{~_WLu&e${&Y8bgt)`3X({{{3F%+!YNt zRi`Tm7mSNo&MBQ5cg@xPVMe+^_-)w9o3X)brzbT|Mn!uTsQYRDgS$Knii0?NZ7s;$ z`qJpN({-K!AiB^t`7qDeKy4!^?{UM%zjm~{;e`9Gz$dE z7nSLcYWzs-~cjCS*Ie zKfJ8zpQ6dtc!wM2V|(3F|~}-m_m60n;({>FNtM2Oy-Lc9E#ar}y;S?5nQ~Z#fU>rmyV`>z(-W z)>*4azkeSE1WXon^Wf%$v2Lm~-Bq6LsWI{1I-4o-SZ;J~sjeJV8C`AQ;ET4VQsq-e z-4$s!bk93b=iCc|r~j4qVi>>4PMM~eA+RMsY7!jU@Ipy(aP#+nxJuP5Nw!v&dZVT~ zCzrXxbezT-L`mq=`3gv}Fb$|z;RaurOx65>`YU4GC#%5>JeWPTe&)!-^Pp6f^JDAj z$xnK)cUz%G^LG#$<4k`mW)EePW(jBvTQk#x6@XpI57;fY>num#$S^&ir$51Fqyc6< zIwA_Ws^H~-!fNhWN7IN@UdABZgp-)V53Xp#vV1CQo!HTErsZ8OE`!>MBX{f6z~3s= zS3PqKvNPGx&TUc=efEXryW>q>QG`iXRY{E#)JJpB*iyd<6O}Tg)G$@IZyGJu3%Ih`u z0%@qCUdd=4gKiZ%AI`HUt^eUS&Z93G`>^=Hg10hfwfQVgfJ33NXP+ThSv&I#OW1yX zK}tJS9{=?I3T0?C#k(2@5!>$pD)q6!fw z{BGvcq$oY#5c$JZu5l(Yjv!-Gx0FrkxC|S%ryNfnE^QPcj(4VhXmPnt%BgB&QTr~f zTIPuwC5hozz{!C3v?pSoskHR$Z_@ZZ;g)C7t?@9es9vg6AkYr0@@t|3u^ejExV#AP zU7-?_l=>xbrVnVfmTn(OPpW=v$dK}%cyZfQ`<~@l7xc-aM~q>OZ@eKm)@5lCFaH*h zH1;DOuxjL!W8iEe2JSr)bqM3LWKLsHF6G{4gdv6=Oq=0et4XC_{JjHOJOWK7kA)BU zCb8=5uOSVwH~aSj>s)Xnd(4`F-*ud&TFu<54Qr0Xs?>bY7<8Zem%2v(!VhiuKO#~q z2R=3>0l2TBEFVF3>KpAb%TeP6NisS!=T71_bsM8&p2Q?I@<0qgn2>hk8w-aFf@I}r zrLW1C`#X7@_a5E`;-~EE6$Jm5*m<>CQ98oE1|j=q!LE~pJ%^gY#PhR|*ZN=RebS)w z@B(;=*KQxBeesgpZ>M36Njl^PcAEk?5!GPt;Hvg~y@8{vTw_sT^uA^X-(&hE4F<#L znh}de8?e#VMsH37d~hMY=l1M1%KlYG;17YZglVj zbW$eWILeqF1!j1=%2%LW6MomcGxFQY23iEVR1FAE=e3;(w#bX-MYZwIjhBN`)rN1c zhkbrf|GX#t7;p(=Sl@q+af5_>5UFZDF$-WB{4u>aaM<>azqhUbXB!{nNG|G)BxX_h z21=qSZ7rzhuA)vOo0a$wI;|h69=EkKm#;+>YaygC>yO-)<2vb3rza*-m-|tlX$K`w z%n(A3f)_3ozyVmX>dQpnr$PTk{+;P+d5f~1kh1Ty*MduqD6Pl|>W5|C6Rt0;-aKFJzTO9M_U44TRc_JSqdX1^j%tk&5G z_?=2$OzqdX0`)1#J-R#}mDP8e-t;*gXwuW0KL(<3oni|8Tn)~+5zEsg_iq#|>La#|%Y=qX)-IR?mWXeo5R!=Zid3J}gn;>E>{ zVdtN*RDyOrJ1cN_?OK1bS=h8--ma*F{FUpY0>#k@`#?g6g`*SJ`;vTm)}#5YT8CCO z$LA&TT&kDN9tTZU_klfJBSl;uE#m%GYm^WYZx511bbd#?HD@LAuWFt4tHg})4=UXr zt5`JJnz-~Hmiy<_=B&aHxuee3w}9^D#qYv=dc^M)yxk)}6=TY%7CdW{=PP_6&TnWW zeL(-CK4xTR1{Gv7i`B^2l(}|U=@ybC^~|^aZbE*M_B8YAr;4w5HiBo*Dx03?`yEsL zvrtgmN0x;g9FHHvR27=X@0%~1Y)LdXEid=&f$MLkb`?S4iF;7N0IjG8hR66kY>&B8 zA-2PMngk@q@}B7yIm_3#rUo7KnPgZvmg=KeNlDp^^f{PnM4jZt&i~!~waS5S1*9%2 z^$*fvdBSms5+nDuPjuQXAcrMQ zg$8bn-?YCNyGFJ)_$^)1^E(<#jB5fayBBubr(d7Q`~%2J{i0mW-@uf+;+bF$iX_{Mn$gPl?Ai* zufX%wTI+XIi0hq9vY#v)$l#Tw%BKrFSHNuo<)&uC13K4b>#Y&uA|arzQ}K)gm{(;2 ztD1#zf!#P2W)F0)^+^VA>zAL58&NP%e|3d_pAjKuYz=5wdDQ=`s2%Avs%`ddBu@#^ zTg5!~B`SOaNJ(aPx*zmwq}2ZDu#$(26}D~4u^aeLRI}+b`~YJdwhU1Btdt;aB&lE! z2C-Usk%0Pk5sT`Y(;GF}6Wgz9&$4K&EUi(CcDS&1-z&&E#vbg9pVgnBzU86`sG(&A zM^YaFVliiQ#QG0jx7SXPp7Xf}H@tHnF#^ur6(K9WE99mWyEBSlIoeH@BHnbzJ+6D%*61dh;T0{f;4t*p zlzo2aC{PIyUWc|*iB??tMZK>qgZN2=SHykneGgZGx(>8l^%C3_{$Tj@@3niHfWXdE zWD|U53+pP5f^cZSen2hRfb>pB6~;AA^bPnZFyA#kQA)Ya0ECx}$56dd^_v|1q+rlD z$v_}yr=JTtNCi`wTVYLvejE!wKY8(`xc)j^4P%qEcs^8?LGkWs(`0y}c zN+bylYhy8w)(X3NPQa6m7g?(RVsX-g~uqt=UhC@t?&vQ;1IN-ROyW zY(s2*d6^moMDe&TnT%n&82p0CH{T@O{V;!AHEt!*zJ`tUB$q$c8qxyL(=sU~tU_~Z zdbOW=d?g>#-tT)B3|}D%_INETt8g$jI|<2Xtpj+Zn~rn$79JQv)VNa1t%vu-zTPo*7Od=@Hob$U36WR#0~ zm!i^qH6WhA%7(~l&a)~NwR4IP&fTSsuh%4L9G9~i?Pw+A>VsHFObc3c~L zJq4%|1&P@VrbAN)334RV7PHtX8d_2=G1sNj?Ca&!mj;y<$?pVbT|j3^WuBDe@lh2q zl~7{fcn@3FJ#+wrSk)#Sv$Jlmbp!q|glKm3RLAzO$sEceJfIBdiJV8O(@Z&;e6N7` zP^G*eE6&d|N*}q_7pOL(*7n5xp#-FEi@Tp@a@JhUYY!Kj919)0xBe_82>yrP+^Rr}8Cd0G56SDTK2glCU444P7I z3?tOcXWXmM>>j~bEv!q~%uaCqzxKW}DvIY#cMt_c0YwlcN)D2LAUOykISn}s1Bxgh zIcG3{aMD;df$4( z^8j#_mI=oA5Aec<<~xUVa6jT<`0Yk3m%wOwkfD{UTNu4c%mY5ue*9WpMX{8)gE=zS9%g}e%18uV!idi`e^va)tq(O!EDM&wu z*qhHt7w&g$tb$f#Vxrp$_cXxQUE0~!S6JGFi8Q@k{KUi>MVqQUmB& zRt4AZ3?g@>*gYwqoB`l=3hw&R6`9`3$-0YwR{Q6HROVG*B_sN&<~|+ zE|`&0Rj$v<06}TsTrJExa7=leVtTCf1XdeXz1cGvJ6AqG?KYTV)3RjWJroVy(;zXf z@*J(3UH$Ezi&J~mnq|3WxsG}e95o_IclU031K&Sv!tSWJ&sL0nE#}diGcm)>BF;JI zPjoyChY$5lN^HArS;~`Q@=^@6!)I9e66P1YU%!UMvE0}L*&~X#-R4?bqENY`v3(d2 z`hcnz`;movwlP);FN7`u012073E8N<2WK~fZ*mOA46T3+5$lso*jdDu*i=Rw6Hf|* zW^#h1w?Y3{7tvC8bo(%idK6mC_v`|{MZ|7Eh06|`1r|fCh)!ZG%<#4!W%6D7CbvkA zd3mP40}Sp`$3yLy&vafT;{e5Dz^X<@3NDWMbq^zs8RmVcAS?w$b*s7Wta^gC9EFlV*k}nBHq3{txvYQw7*%}_wOG7gk4Ez;D3oS&|y zq@ev-2Hmd^OU|KPBH)V>IAr%d@n|rYCH+A}cc|NdS=zBgReOdTf*BFn>nstGn&U`Q zxIJ5U6fZewh%`1t{@}(pWxhuIh;D1LPCi-ecDOjSRY^sm-f<}=^|CaTxvhP=%BqGk z@QQ_%`PJl(5DSZ;;iDxq7g1lM>$d(^?=_+eV;|I}lh4poL=Y_I{;?E+eD&k}pTR`i*7lZlIn3 z+EQ4?3_4ARs`5WFqC45g9BP-3@9e2Y&+t zBO99nZ0C!DtcLDCF~6IbnVvjZM)xd|;+!9+omjg8uPNtjb28gr23LypNJ(iz-}qh^ zqNWp;nY*Se_}vHLK7V;JF&LixBTdi-gv9sYF3kg3&qVgv&+rcxK1U!QoBGQiYiBSP z?O35mRjFP2S}kL$wCg=oI&qnE(Lft*G_XdIriJ;aL@tN=&~kyNR0>TNtuoZ&c$<8Q zp;nZ>U4=4kvVS_d5Y{8=WTDn~ep`sqmW7$6XJ-#YNEHUQIjsyRdDX|p=94)w+RYdv zebdbBnj99B9hzlyd1?JX@VQiIa5x_=9uNOQ-bg08hl0n@lphL$&#iMx^*JDQsPN+t zJIFp>#zOIvqgh{{gKjhHccoL&_w{rvg}SHiP1bf1;WoJSu+kwxh&D*Di>3MTEsAff z8yK^cW+Z2dh+Q{6yG&R5@|)0S)J7g^vqmg)8Tp-b7{B^c?mkWoqX--sA&a+VVr9(`c0CxB8dtQLs&4?f{-dO4 z#NJLxOffSiEk*6gOzbt*qoa-+)eZK5Uwt1~y@VQrtYRd`{|N1)JfvtTyUQ-8>)<_l zbhdoAVsSqqcArfk?IJ@CZ7v%NV2x$o4UWRor|R4*(ebg#d-a-~vKs6{b~ACycY10; zpsOX@-(NzJFhLH0P3W%g{}zMShsb_e6brxn1j@6s2hG5Q4FtVpJ-$+yqxP z^8F8{%P1BGmopH|ERt+I%<@)n#tUR|0B3GFtV&cqvdExV4dmc+4st%)sc_kF1xER* zDX&~Cu4h|SCE|gGc;-%P+gHA?RaGhd` zV&raxJDI)w2<#XjpY!nW(!qhxW2fll+=`w`L^zbOzk{tbAb^?4f6SRtgZiJau>;_Z z+ni}&oTP35+2BFMG~JO6;^}4JE-ScJTJ5uErlZuN0a3vY4{s5M_IbssiO;I zU^sE9F-4@7wWtp$Z9Je>JFX!{KWTPDV`FwH!AE&SyY|@-2zTI|7G>jTm`fZADi%8kqMY>`i-i+kG2|A zA`MOdV>&iO+U)o75#FNWbI2pN|EHJ$|1X7Bim-{{(m#PNh?*;FbUKJqrrfI(PwyGTJnds0k zad2^n_5(D-s!F_89=%&Esnyj2MAGwE7;s?lJ1za~D(tYinye#b>H4FqYo~DKik0=H zh%6lG+A-WWIg6|>FNY7xdvaY|_5m`-H?Gs!0|PC-9Uy_! zdfY~%MP@Z5clMdQoK-hnM5WL*NYpGeCiZA+0=yUMAVy?Pzu{c0eM>&wJ2Eb{2(x}!M*LwFkSHtru&|HV|{&24pX`D-eSl8Ya%xt;^MLS09)XL$XLBN zXWgGwRL+fOgbVl15J04TosM=lhYGE0i*MlJSwpDlaPaN%_b>(iqeDNVr$I@Nz zUc=XwSsK;|nx7^2jEmy(kPi+qxwjLu6>di-B(T^3z)GC)GLxT}On2$b_4$VR$Wefe z;0oh0Dr*93zNaVR`g5Tnn^!bqx*=Z*X0z z?7_5>wylTY6`ERmXl1=9$W!Kf!P)e6TC8?@I_G0?sB$6d)s%#|dFaXg#~_}1%H^mT zDn~*<$WIKY%&nl6+6vj*-}G2(qF+to;U_}BczAf6eb6a1DU-?VphLbUh+GG>EtM`} zE=DhCf}_wp0-P#@qKQ1PxQ|PZb>s4522J>Lstr|JIO(LM8h#ck4~Ar!K_R~z`k@ow z%9F0zBac8r%g+ONMoMw0pM#snPk<_NvAeZmMPo-tcasvGD_BD%EYdTXAa#>Rm-9kY zL@|-(dK_EUB=KqDll#=941KXNvB3Mf{NCsn)zb5>0SWWj;RD&s+}vC|yc>NPA3&tv zncO?cgJ>@wp9`jCHoca2o}?$`_w*Ve5bA_fYNBu-Qwrgy9Go|&DM|sEvjCzsx;*)fjQvmQ;z9hjjzY^i2MMt zUPEI;pAf@cmBjQ&?$cEoS(01vwh9Rjr|6r=7aiQGQY#A!U_BBv_%&D7nSdL?EkPUY zENd8)aIvd%e7J$>*DW^4mn*Ktq!Mi-R%T%cNy?ab1w0UkT6S%)A}j;fuB|^Tdsz!i~YcODcI)6j9In zC${=-i>EFP<2hQl!MuD*sfmV*O!Rp)=uV#|bLR}n{c&u3z9ni!QESK^}@)YlO2hu$=FJrRIq7>0tzObBU-DNeN<+Q#f6DQsiD8(5+#55kYZwHVM zM{HufbP)6%fgq0A05?jux(~-AJ}K%B4f*G|%;M`x3G{VK>T1eRO+cLyLxsFN_+oWG zYBC4_hGfz?S9zZ(Vag-R%hyHs2A7Gfc0;?nQ;=oGEaVmqTT4qe7{h+UTAj7dTE8dD z0@K|}L2A>=*EjIS3@?g_ET*DHWG=%AkY*k=0Ayro76jJq?r!WkAdJ5}FEx@2?=?ek zWZL25=v1Jq!hMAPp3 z0JQxqDd|lx$U3kwJ@>_~B(+>rfaw+Ff=2^1{*jS55M!&TD2JiAm60uz+Z%8?c(#?O z%rrgZ{3`iFbE6v;IPqxtFrz@Ffsj7eWtz?R_|z%hmcS!EBhimXh-nvUsTQGsJZG>K zPC79)T%F4)?r4ux68hf%X_pRpA;S=fA?HvOiO9FNwv>!7PcV*~lHCDt(gc~U3=H_O=w&J|_5wnt=!BPud z;s|60ynD6ho!s!I-C>lSR!l7OVwCQk#YRy#KmA0oBiy)!>680+TYzWE?>Dw$a}hEm z#E+0ntjs(nyXieLtgQK8f{2xTP+eVm!*0n@T4gCIXN&3*NUtubAmZ)N(C~P|Kdf}k zu_rfkJImBQZ;Y2p*84>!yau}(2|8bB@}8j2H^(K69M@o~0E|R!ah~-DH26KCTLi6$ zHgbMir)X@d#;5pPPw>rojc=(y;0N787R?A(u{B{gmiF&&&n~BJ&S$|MQKwjQa^;T> zEwj=pG)1DZE~V*U9`|h97FD7YZxtB&0&Uc79DcR6^2*RvroHIR>5CBY_j?$r@pIiq z6Q5CfW&nBojC7)wbm>94)84tkO?b%3nI0h#2;~k+xR)SRZ@{b^?>d^;>T15ZNl8WJ zbn$x>WF_YazjCLNkE9L@ju?YL?9F{o9m<*Ne$_77oebN;(O&LXCZp||jXr`KZOx5B zmxn<;?Rw|OrTK}8^T@PD38tllQDj+E^>_CgprUb41Xaf|&1~-`#l&R4S^;c_Qe0=X zXYV8R%Al(J5jsfD@q@L%I6~*O&PthJ*^Aza`-T;r_yf6_NMSP z=-@lIptS63V?spb9)UPI-kw3Q8cN84XWYUGw?XL?C7rVZE`K8WgqQDkEVF+g6 z)G?)OjC7T|7D4)yxrVxOx2=j)8#7iceu}PQaVu=82?%%^$V?Gt@#hAl_36p!+BM?W z{SDd*4{LJjTaM=!SFH83Pc@Yo1I!eiopY?R0Z&rQe4)3u^AaI@hB-G+A^q2Zbcy(+ zubJ^&u+FdNjb#$F@nK(HCei{46l2Q--hEjrWk-z(ZZIMAg~(w|#ki2rpp&{#U@T2hJ}JFs|m972bTw(#zMj$Z6WGQWGzS-z~N zGCnFEibYz7ueS1xUD z7ux3JfBwU)s2a~hPe1X-@J>}#v;GkWBGfCEl#57nemiU9r72 z)Jnb))Ff$UGt$k-;0Cv9tk+Vh*x8a5Q2KjgVt424~eY=J!u=f$ORY(A8T z>xq<9ueD+-{lg&7L!&i3y*!AAbSn;;!je>Pt#hp3kBa0SEY~XhOw3Klz<~0)c8Y&B z)6`^1JetO3T}a$*d!+DQU0`a|`UUuc<3d*NHN&Is2je3o4*EjqMqnUD6Sg})nJ^pX zaHCQADCluuU{5$>5OK-b1x0_}K-#Ek#rlR(34nX5%2)pk%Ln=;b465d?L3+9=5AY{ zn^3ec<9VR%F0o5n_g6;zSBj%ng1~YqI89K>m%aex9{F7f8Iio-YKw_M`Y18$==`_I8_tvJP-FwM$6Uv{?ZF} zx!><6j|-V2o?9%oR&4;Wi~aV~{!2jpjbF}wDNo#Iqs}u3R`Z_l*se&WzMwoYx5oJL z2cGNbuOR>7m2Xkyl5=b*4C$&%aJ}MKtp~V?{@C-(1)NDZ$+lct%eXt~iS7+;nOn6aEQS`-QU{T2k7EKpP{RFM6fPBn{F@lTR-KXl>3Cmek{@3?so>cA zy7F>|s&ffdBZZICyR)F%5s3OY0%BduPYk2K7fzMcva=cfK@RPG2_jit^at$Olv2Hv zh&9VYElY*{k7l1#fsi|bGsAcH_I#E*#sT~%e~a?W?l4cw`tmaO$FP1sJ6_Jnh!7wb zVpQjM;KmH}F67ppo&cOlFGp>AYb!Q2)ja9lccrWCA=RIrN6r1=@`-@pE8(plkf=5( zLWaKXlV@VcgWvwAL_4(=11-~H%6@vvG2~ga|NIZ|$}^`Izv~ z-eFr=;G!CTZBo?+3kUlIbeP{d+JVcjz+g}S;?W7vIc*fS?cHK6a%FnOuTUF`Jw3BN zHOJrgzNjYG#3XN3@iaL?-EtK@JBD~gp7sXo7VWKT0%MLIH#|<>W&4i?x<5s)+?bGn z^R9mO2W{)69Iwq!Cl5u1&iA|&6byppfazjRFN3T4GEBea#VbLm<(v2-sMlcAx4}M} zAtC-JPb^MI;BIRtpGMBnmq|3%c6Aw1y0v$7 z)C9I{$ba!lHb`1vVi&R8SVkt-G?lAe1jbAow|LVF3qOOoGeozI^&@a5m%NM{t#ZA! zUiHQMZRZMsjlkmif+6Cq2T;n`IUZUd)z#D_oz~4ehI+vUzS!i8>$Br<)T`e6z-qxV z@zarQe7gJxIA}MQ}Vb&nA>TJJqXN1$P^E~84*+I<~Fl~zLH$ygwu!!IUBuL+d zUv~>DJw478XiyUqa=&qa&rwhg`ONA!*d^HmK#K~yLCg*k<@}O+D*4St{;Sz^5f>R! zqQVD2=ro!a-ciKK@jRdGeFgSUw+Ay4lC91i`+Sd;-r*`fruE!p@3+FB*8{b!bAP9v z3{Lbs>G}X-$Grda;6q=6aOs3(Z~LC8)=bkAV@x^;-PF+pE8X-DVfirOiX*toV)s05 z;K#rTqodcWJXV&(hV6mmaPQN-uZ%&jCP6OzSF1zH7~5`&>Wd83tG9qIMBy6+`|2BA z=jRu0<9~D>C-!x5F7LogJ-NVsOyS@{DC1!Z|A{a1>a?o9Uf%=POs7bBfO+znBlpex zupmYF*_o0{Lx{I(C98sf(;Gl)a5IKC07aI_BPvj0^)V!? zk_te-b*H_S21=_o$(C3(Uz~{|k{!`+6`*4-YXU9TI zOHww4_UH*0Z|`%Zz&ItvF=oz_16}4m!kg?H+w%@vy-RGO->*SJQipnVXjlJ42}p4s zo2GM^*KQ3pJTJZ7?x?8To~SIDKn0#A=HfHNOP>}u=6kW$Wvy4PU20M+n_pJ>EE(*G zmaCFh-&BF|D4dXh_1Uk z$1Sl4LF@(tE0pgGPPH#jOngYR__QzZ{&XFD@G0L@R)(E$MN zwFmv7GGw%U{=skmgmn~TfcWVx&dothOlCMP67$$E>Z!WM$_y=C(_K31@tOT)30K`TuIW}vf;Cy^~nsM^;qJ+2v?lq-?$Ik^XTIcs}IvC!SBZ+wD z2b$yg7h9DLSbk$wFRd%Tmwf+lT^2zfVvoQf)49zLKw81?e*((-w}Sr)x%EF4N-xHn zGDD%DSa8@m;^)y1Wzqv#RK(BMW;H;EnFvJb9~d)NyEx4GSS{H3vPgHE7;Pe zgMp^hK;N;Si-=9Sv$L&+MWgi>iz5rXN4g-G*-by!n#Lw6IRJ>({@%jN&20-f;EgN7 z8G`+B-Lj8=0YFDGX2ucYw#70ZCJ zQ=+NqUwtySwgg@@F(J8#oD6!KjQ1MxRKvpJ3)CC zOI8>@nj%JD$mbwa3%*3{hW?HJeLE&n>JkuPvoS-Jzpdit-V9@C{c)&V_gg zJX29gWp|%vdu<`@4n<;eayHh76QM|9W~0h8UI zKZl3=>S{_#Wm}B|5D3W(Hb+23Z3MIlg&H0fehjK;^%W6m6c!T`0e>33>KhuBLt*CV zZ~$>ZR3CfCzSX3APgp_%_V_KkqN1kayryA&P<~=cN>F2dVpVKtRcI=2eflj>&mRRt z^xx=_B#bSm&RD(+S$`qoTS90J3M}r@A<%6w`N5N%|*z45g??z%LDGz zKx=Nww*fux?~gdrANS;4(|vH@Z=iiYN*#Elus{Fymr7@DX)REu4;r^ zQ0H-omrQHGc}!y}gM>tyJGOX*liF!^V}g^wYlbV({+893b5qo8*xn|~boR7wow;M5 zX>U$GwH^_(_OJ723F)s|pVASL-M>csD={vPjDo^d8I*4=Yp54yW@WYZm&jrXp6W(w zJOPOc6YPnJ``GH(AW&mBSEWIu|9ixv5t3sc6aC{*{q>Sd5~W-sXK z>Pl%Af^QH=*AfUvAsv0(LqbF2KmDEErb5Q4!?~GdON2c)Fu+%}sVyV(u1d>O$uS1I zDzp+S%ulgP=n$?`nkEtmYjks>>oqksx62HztU|B_GBp&x8WXMnr;0(TG(HiTC}??l zd{Bik-5MAj5QT1Bt!<%=?IA)?wXXOY-xC?KdhPIb_o8J9| zryvwUn%~+gO(Z90c7u8hX^K$;?bSGH9%NBBE0^%IZS+Hma>57Nb}7&lPx5ptqw z0N(2GUe^5n^~Z9zapX0%^dAPyj_tG zhhU-LHIhnpGBr)_2u~SGmg$ z>aiwnaMe@_Bl!D~P=JJKlqUL?mzbv`gr;4h|B z=5*acCg458oV0Hb3{MmCf13C>$>60^UCZ-F@6LfNKa25ObW8FnK|Doan;@TfH0S?V zb#4_bIgyTul4yp-A`0Kd$wB>-)%t{To>6>C$Gj76&mAL=D z4mp= z;Xd)OME#XZWRxif-`M<<+A+%5y5;;O!W0P6cX99uV@t~f%%(KJ$ww4#Q{+MS+26I# zjGAy22$$I$!gieSos^)vIaF-Upbs)=)N)>YTQ0m#gKY(*YSXDV{+jfqBP*D*&D}e} zngrOPvVYw>j*w`>*~G``qG`Jnb6`6;mHa!1_A6{jQ*D|kB50D>b)2rWZvp(oTvxaR zvAEP8*te#J;f&AIu<<{du6F{`mzI22KkGAz$G?X6^+$b6Rv!Op1~7OW-%VI2XloRu z!A((qn@^rSn)a7qob!iOOF4UJgl#*s?mB_9kQ;qJhjCEhVnjIj)M4|F z-s;fhuv)Cm4=`20xhQ!#{_#g84Y;7wKJiNW-gU*6OwhcN|0&z*z{>F=O_=|S5w@i1 z7)^}zo!P0+1j5@Ia*~T0DiPLb?3!FZJQbkh10H@K2Y>s~-&1Uuf|zpyXWEyYC9(3#g5d)I#IXSc9p_#zATS$1r>v-7Ef zQxn41!6Ah0TETCBf9%ME;S|3{9OaDtErhh_xcjA9rHz5%%uPAx*xg zSd~M9m>GMS@U9N2{(C-QQ}RGG_E=;0(-Tt(Py0vs!u8l=HePM%C`KU22ZrLY)l2&_ z{+8w*dXL-CHjjrrmdru~OaV>NF}MsXc_D8@-{5)x87ofzcX~&;J)`Ot1F{|R_v7%N z0&iCezB`LgBG}UUk#BHo<-mIS4|UGpX$vubUKRjAm;=sbf{3vtIzK&$D#xlwtAD4; z)O@#~1}~Va(tnHlixD>95k3I3EP2l?q5}JdY)S-z8lOOkq`xx-A}?QnBL*~NFEdAd zrX6gRoA-k8HtzwwitO)6exjSIJe(-}9stBmTA&^OiKL15932>|IcbU(yXDVev z0`z=|<`9kY1=rcjrPvq&pTJ(%s!9jdXM7a=-iR z?>q71T-Ux1{9!%MTr?jwUI;X1}J z2;>n&QskZTr{tYER1e$@vW`ELR$C0wuiED3=DuOal{B}{&c*BsxEK)6#J_DvBYx;Y z$UZxl#fdMa6M5~u8}mp}dZwK9_((T)!eKxs)9TaV>{+V2oDFjV-eU1N1O<$9nm)1# zJ{)7(vVJ83p9S9+@0j5_H!VG~ZDM+44xT{T0*XJNJu zQI2VEMoI?0J^2|g5PMAv-as>G*MIwDqL4pALYIn7zZE?6K?j{~z8__}$Am70hm0MK zC;I38>IxQUtWFas@i`ua{2mgz_1ju+PJj4F%W-@Y66Ar69~a0EXWaPOT$0{tch zuk`1<>-8b_1&^UR{7%Wk2r)%ZD#`hCDO}&@RG7uQh@dT5x(}Wz*hha2{~V0c77Rsc z%YI8%8Tlv(JceLzp^4%DBB5fxM?!_&MrMWAik{@n171*JwuRrv+aU*CwLG>>>%`X* z`dEa+az};e>~M;fnX2gs&zm24@-q}gH1C;xAhP$jivuv*#dW1cl9!D*bd`qpiXS7P z2THvcCvJ=V@^`cXiKqwq*wG|lv?ro*{CH;fBN?w}z-k2FQw`tTy~1P+{CJEWPKk^? zsrNXG_;fB`0tVhfsLXu_?pu1GU0JIx?)vaPwrxrcd^Jrqto>y`0KB%Q5aqtfrcZk8 zu!#0*5jr<{v-+5)oeXuddNLKEOvU;gb6&NuDE+heFTp6MLQP0l#WsTq=UAAwieoeu|^J!rvGY%u#F&NM?}C2VJq1S~A=U}uo6V!u4CjnE<7F6{sa zSiLREde&b_(-GD41?c31yoU3w)o$X`R%%K^5-Kjxg6dR?0~6N@?>vG2_hA_mXr!R1 z{uSBP#mGVa5hkt*-eJOnV)Af&By`MvhD|Y_j1ZyxF=}^1!hfVvyl|o?>uU93qr#W) z_j@Qk5-kwji(2h^w(JVgx3jOkzoXqTAbO2l6JUJ1cIJxt)M3(y3Y`!g^BWWeRrwr) z5i{I+_2?zLFA>KU403l28e6M!nBUE=JIKgX3RFTcB$imPk+Ja}f;pszZ+@#!4@tJi za_{Z_2op!h-dC;oxfk(gG_5G?t9BBwu2=U+I;-^MI4nci9eopWSoM++&B%RpC@MSI zH#^mO-?jTZ0cvrfgtsa7Sd`dTAb=t)#LNb?Qozf1OSzaDV6?SW5Mctd48%o3KU`}6 zL9Ahp8ELU|bZnottd2j%5SI};PUSub{P zf7gUG1Jp;=m$2cZuyKT^=ibn_=qM#c#YiQ^kzs8e@T)yMV{Q^NuPN;ytAsc^h99L& zWK6=xn6n5%$$Jb{* z!~v3$7#IPh!+SOEh{Fasjf#(t4-a2lTiaaPvo55YRKRA&#$!RoUfuongLuMI1Pe`A zMkYV0HYqzh8==bztZ!B%q~x#kIlEx~9&o>2sfugv+S`;M3WcO%|b!U0%=UMl68Ou)y z2)0*OSDkJkTi5L*zHnse26jQ}jZA2AOt|A~CZ_i^5*(mgsQ&uyt^q4ymaw%(!jR5{ zPUBB|&GHg4{N>S4g2GKcpJ~523U~j(z(C9B>gkb2%!JB$UYFkt%|Ph#UB@=}mTxa- zspwaqmKTeHp@Bc`y0Uho(p54NA|uUNi6s9HLEJerGxOoC#KvrHt@TvJ0Lx0TV(}c- zlSivS|4@~Smx$rn#IYwr(}Q0#MQm)yP{AOJ-y*Hyj{R%D4PqJUjkvtkD5)j`Xawbe zfax@pKS3+VtopEM zSeX1<#;0^E#Vs$e5iJ8n3LUIg=kB++QGN=yMzkUii;FYy5cf${h!>B zT{XEr*pR7=q}-q50|i7osb@Gi1FNfeTG$`gTVi$4>>sTXAfe~4RXy*TIDJZN;yq+Z zO_`lp4QIJR1I-nL;P4s>a>@-}G2yt1(hromlXmXWXy90*YY{!3k&_!r=+WSikd<_D za(e%_|2G6`YMbSGByLxPzI802$UE8)`0GW%@00TqQ}NdRqvfmw1ZsbmFJkZHBr7R9 z*3AXeN$)ZGVyX7nBrW_tr|t6@Ef}(Z*4{u=WaL)M0m9p*89GD-za}5cWgc))+^LX{ z*r17)1NMz`X5(pv(H2%gcx3Ey_diXg1*F@;`(A`z%e6NHc>&K-NS!|Z>oiJ9Mv*nq zk()mj^e7lWk>Z@uO!fSe6_Z|+9YpjipXB5l3wLGcDqEQ2>x>VqgefVG2$vv;0a|X> z(9UpQs2nGJ02{*FHJFQoVq$^aSBA;ZbZp9urA zBQ#Fja_L-WUrwmVMzA&^&&LIh{xmg_Ov!)dJq!dK0Xf}Ih=bt zz`eV6?q5)AY&!(J?NzdgrxVioE9%vHx47ad_3^N_ob_D;C29bLGGG;iA0I-HY+LLT8Q` z26OlWZ~!An{Pb6c-)uf>LNwsS*72#i37!#q{BjXmU`fbj+;f~BTV}J$v4;?ug8k}v z-he$9evY9& z8;P>c7ucXhlTSR)!FqpPx5XnrRGriT?c%d9!yu><_0MZU=t>r$`#mb4#94_t({YxC z$Vnq3TcsKngnzh2+$n7iHwoH%c7reky7jfSuY-!}%I+2)BW4!O40l{FK(jNv5;U4& zCAshvpsH~6K$c>ekq<1(@1pjt*X;c0F+G;|al^|?O8Izga8N;|RHbM_b#Hqjk8dT6 zOgzNXwxhpZS2tC_>&PxIR@T9-b08}F=3;`*DCzr`%Q^3X=LpTBYVL;#kUd*08p$$w zX3tpfS&&b!TdOvutVtrWGvJ`LfshfJjH|bRwM4xA!U(|SGHlEz(YW>vfQYMW5HNC}ppB_ckctK*r z(RvUU-&U3h8Lb}wm4hvVZeX!{Q;FU7yl_WLUr>qN9|A^EGEV#4k8@kHM5BL?y3X1Y z#ntleSnV%6D3vc3p`J#m;wC*8)Dx;P#gbxSu!jO(htXDAsogc|CHin}(#Xif#N^1x z-Q4m~RwFg{Q?jvPEP44eO_kOJi&gjnOr`a4r-qx@PRxn~V7LMseoU$fco zADOtv2D+Xh6$6D|mER*2X()uH7m~HBB9G;$%#Dq)S=8ICR9{x6 zG)ENUvd8m;I4%wJ2Tixr;caFmp#q01OO5FsmaAM-#E2(`+7FpDRsX<-d{h!1mwg_O z)lZG{b9}s|usVl>f_e+(ymU*Y3UhK5Q?=zM+B!PdH+4GN`F9DmHSo@Q+yxTQGu1r@ z^!Y8im{*D4T2Ea>MHJ0JAQyVbfh3M0AV5y=@}*I^kn-r-*4XfaDDOLq@nlh(`m4=g z0k5AL8HsD{)YLh5R+DtTP>6t0Qcs-0c)`MGrPG6Kx{b!kLbET4vJUZL$LC#T_GC{; z5DS6ScIQM5fQ10ZSZsX9gvX`*qS91vlvMZm-S@n0r#mq;oSm5hhb!jhgx8!5Vj|t1 zLPF`8#G0~MQuqa_Z`j%QQqf`WFRHB9k_StTqHmsswD&OC@tl%``Ugg|O|$L3mAeOq z>GaeV^J09e)kz>~Cf4M`t1gCvn*5Q~kG@Qdl$?HDy;8qIMYiXu>{^5VMelYd37?zL zo?79pycP+UWtx_AROGzv9}G#BjXMinM<=Jvp&TOxXc58`VKy@x75|}&*-3p#Hc$jj z25B6W#I$g*<>2rz`s)0=_kvSLXV|3Zr&jj2%4(Opm+-sI34!vqW|XVdLuDPFD(`cj zT4h~|+jFh)4_V=>NrFW#?1Zvt8Sjmf*>Jtqk&zG*I0WQz48CE>O!hW{@W) zc{Z3YiE^~O$zsx&{Fa)E^QUajj})Ftwuv|_4As;1%_ZlV#Z;ObI{cAa;g0FTO<;`w z0}H6y;xj!P-uvKK1lT^8K9=Ufl2?<)|lyihEkcE@lQ zfCM26zs9-7y0B7y00MS`!EdQm@@{6MVHE5D zO43iqs7F~Uyu5Q2EtR{qq~4cf?_TfmyPSIL6)`(a%UIEjP=stJeR*<~tCSbm9k1fJ z6o>`v_4?(FpZwmeiwNdBqz3CkhQEIAC-F=IA{9rTHu1RpOy*hFOF>JH>xVXrhDi4bj7I!IUn0<0Za-4{V>k*Wj!Pai4Qia2p8+8gOAqT1H9l zR!L>lbzfH+wiBvWTF+Ei40y#bnVGhtIa%*6Y=dCJJa20v@1{SAafiqDJZ55Hr1Cvs zL`NxpUe>{26l34{il2%FhZGkpYo@lT{{`30wTH2sbQlZrwP!`#r}eg~@*%Q!?~s6B zC*<8q?d<$b-lLimjP$(f`1j#T6`7w(dFw9{Cv#ywRr ziDz~*DL6J$H6w?T?V+Tn?Rf+0<05*YT($?Ddwf?W13He2gYO+~Rweb6i&UM48NGW` zt0Z^~+VUMbDl^2fw}x|4bZz{ey<*^hxn-aKi{#de-{+QJPA)kKM1If~ZijW5575R~ ze#80+WbAFXk&_v1tt>hM`UmjnGKO`3dntD`g)PYz#aa)%>5cYP^rr9b4~`IBegb(XpE+~iU|glJTS zFuTy>aP4f`$*|z-w{IR7f9?`FEHdedLfUoQPZ@O@+{R}`H;Vf0bL*pu_+4wA@{Io~ z@kcor|8u-&AF`ps*}HEZ*`~ea3=c|QRlo`=?{D>c7~XQ@vasZKvyRG11L8q{elxzMGZZF)>HJ#!Ac z$2aV~{rwG#itZ0@J&vcUP%cmN^@^M;!$N|C`MsC)>uW0LP*!mG6KwZd+HzxBX`&g` z@{B9ooXn>`b$9j8T~XZKPNX5#^HkdWHLj83#LeHC#bgY5LWP~tOLNpj`9BLY`Dc{B zTBOR7l4$w}_msTP38n{`qyjrrh{FRgw_Z-sEY?!@T$N7BH%5pMheT6yd$=sm zZigrh0@^B@MuMjh^^Y7#q5uL$HR-4fFh*nswhB80XzuYFrA(u7o7 zl4Unk=!OLzE&ec(-hh2Yb_Q@3F~tDaUwn-dv*xUN3FJl@EtRsUM0xMNAV4Qh&}!}h zM`qFuDgw(ubO_<(MMew+`T^kM2i&XBdj{Hs;G-?B!5I<NRCwEc7s5iNlwEu<6OsFbQ#zA;Z~^JJeYrOHC`jEQhZKkeUdP-a@KNka@@f0>}+iZ< z<1ZxJvJOGQgNSEDP{=_~;nZyO^h``#XzEs`r?%LyJ;YLEp zp?IP!86%F3{8{|u*LYex{&`aC!oqGZ({!Y?rofs2G^rN=m^TlQq{ax4w3is{8xuu> zV2WH0-ZtnChl}ZivH_9oS$C5nzHkuu6MTW9F#Yo|EfX~t7gv^Lv4D;Vgo+o(Ma}Fz zKo_GTm6X2^iJ(BAPgQ}Ybf9m=oE)=ZcWms#F$eBfkja4ZpUplEU@+>OoZLsC*QULl zF(5WVz#6>%GGt56@RD;-eqUyS5V9jVJ+=sGoU9i4(wv6*m4XNoD6y1en)Ve0J7#zU zu+`nQy{#4!R>%kM!a_GQgB9FJWuHM26u}{CLtLzATd>7WiX(5z*w5YEX&{0_;q0o@ znr1dC{9uBD?`ds88xKUACsC0%9(C2TFCci&%?z@#Vop`paAjE`cooP%s9iv(hT9C8 zvwr+=b*-TV2!3R&>a>=bla=>wZQg)qGU6-nY(e+sqlT$YNPz3G5PsdH) zPB-xV*ZVYL1ZV(`D(SzRhrdt$?d<%wH%iq-q9P)Aoi3l+V0){dDYx1E?Vc*e1A5%m zq8)mAdaM0gVa0>P<9rZ6)YxH@awkS7)A@2&SX9GnXg~rVm>tmYvhY{CtGg>Vm))ZW z5QVKrwvf}f_~<(Oxzl>|&?JjfGJfhatZmip*}?$7+N4rgpOyUnpqy+h zgylLE{q^gNtYW*9*+BemY6w+CU|9fz7h}Weyp57c^aHGfgA1MlEp`=@lf!@fb z!0Bi%1M#|JurRSO9EZ6?#X6Gj3pBdlm6UC~-Xoopp9v{Q(FYE5=lVpDMFsbp*&dtuv9nErbk++2#9~>VmKo;*y3E|RP<;P`b2T8MI+3V{^ z&bohEox5JwUoA$m@9`v_X~e^P4R($H<zZIp4Z;R zRv~RHHX>q3DSIIC_H5RGQqGKRO-PuCBlqlD31_TOWzO7S^RxHuNtngB)im54MptP$ z|7ozGe!s?`8W|c{aGvyg;YYuEon;K(9x=!Chqraix2;M`CWe2$U$xg=F5^zKXAdM_ z?c|YFSuZ%9OI+4vkL45R34J#3)%=O7l7^S+Zl%A4x*#`Zs)i6N_@i@zbw2k{}yk7->Rf41UTBT`M zqn^k0dU5l_k69jv)9X1L{#uiLB!|BB0-iPJ!`02qOhZ%%xjJwr;$bP;@U6z+xYOh+ z+XT4oOcg09>EYwpXuQJI@9r zT&IPhq&#*5!UJZKA!5jm7c>zwu~xOZ-kXv~gE3f1m1arxH_dTn>vY33^xiliVT3pU zgMbHs418=-t^}vu24Tu_p($phTq*zvk~oN~UZxE2+BK5UM`wJd$tap~8JsNJV2I~v zxbiXS-4r`3d~UdsI>((j(Qw_4{{B5+2^=H#>&_${YK9u+!!}agY z6T5#uFi|c~1}innkM)30ivb=pwopAIhWrtn#G&oFTsqb$wDKA2 z;#0W1lvHH3b`X7C9dAbn;md``>psn_htB_r1rQ6|TyD&ec|@GlCyaoI3p4C736u}8 z9iurKn@vkf(rQ*1m@e_Qa!C0hvE#{8;^2Sy>8Yh`&JTQ z-j_?+x}TJ`rMv_-&;Atg)BEo7ob3pF5}8@t*caFxtB+C*^$#|mrKwk=x!GjfX2MFw7(S*`rAsyg0z0B;r;0@ z#+VkG-bDT!ONrvj(_44zeGX2~_7O7g+ZA9AzQxiToM5l{&buC6n5)pj%I+^9L8u^N zwh-s>dIJXzj<|Bx*67B#{7ajT?-@(zVc(?RJ(X{~q9UeBfKJ2&x(Wn=xRw{cr* z!!c1?Q&Y!s>soN#I-pdMVT*Ko3-dZ?r)A{5y}i?A&L)1vNo6az&@1fPA^*+7cj3ov z0siXS46eCH6&5Pqn{aV_Nc1O;;(*l4Bei;Wr-<@&^O(10>@NFUX(`gL<~@&49co^- zhY$_{$cS3vN1gSJF?Db!r<$k?jEj+;UY3?oyHt@@LQo;YEhbra;*=4Ukx~8#8U!}U z%(vps=&7Mq<;nAzDh6Btn5g^@0f)TQ+ez$bNwB4O6|f+IpB*MF}6!YxJHd zw?h%og8>H&2w6-Ypi(K4cb{w*$@35)Y3KhI#{NGBxIF464RXzZ(gcx6I%8k-sxt zsPw&u1l+_EmHdVB0)txBQuEWhB6I^DGXC=FrPnoZp_CMsu%Ek?@hy@^;4GUB zVSs7?fJsd1sb7TKRh?*6y7jdA|E{jSmo)-nk*~2B(I{U;`Radi+MduovC^$dX6Nx- zuRAu%3Xe|aHQMUk_qvuP)=ZB2`t?_5o}{?x&l89N*C7R;a=#*y!r@#vMU8bzqAHts zm{C8ZaPKA>cb~TU;6?TyI;}p4cYyxqBUrr%bcoTso>DmMIh` zXI0TAtL6MlJAjSo;WV2@jg$5M{yr^|U)>Bi32}^Se;^{-a>hRBgT z^?rfe9G$X6WJr@7rzmQ1qjW?Zht-S;E0NA|KQ|?1iX5dc>z9u!iCvePvy21sz$R%1q6SFE|03UqRvpZ5K$C=GsGpzv|oaoR(5)5z=PBguv zn@EwBtK95XqGSe`)9Mx-F^dVKjI68{uz6N?f(xWbw_b2w;f4l0Ufx+h?5(^p%gJh| zn;%x1aN*k6-I>bKZV)O=IXiVqPW100qui*tsix}pA!&rlEL6Lvh{P_Vrh024#O|fp?L!lZC3PXqswBuI9(> z(>Z&(e)|}bddFiXm$1UAdqCe)nPMzSUo03wa zsE&FxLdxYV#Dh9)+2@_~ltJ^QZ>|dM9EWu|G9=9u5zgCP?vNL3lRVj3sByjFW~0%m zs&QNYUV!2!Z#7wSrntK1Dt&u&^oNFwD1WEGp@V%|`4pURovVd)>|M=7HP4H_Oq&K+ zKJ(?TqQ=8$yigLp?*)f{PD?$WaCyWzG1T08x|t$%{36Rf-kz)XfR}1|T3XJc!#pw| zX_+)!vgH~#H5I)_-@L9`SF_0)7wXLWYC;$rZyQue**wzVUV<>vqPjmmQUa21SfHdl zZlUngd?>cl$d%pGi7fOizwhOY{m(go`eZ_R5?qw zxH(yvvFUkTjr2}E7)a)06i0=*{_zeIIC2{|X;`Uj9)2G8`Pj`Jr%o9At@U*2%D(qH z4ykJq`-A6@XhHJa0QRHP)60eJ0kbvvhI3ubIr1L00iEKVoQ;l!BL!p6j?)5SwtNdO z|MDi_uSz^30f+LlZgpGw9n0dSv{8k{h!8ES&G=yH?Refsw&}dbE@45j^-Zjn-yEO& z-ZK7Oq5IVh<0Td;z~v5a{d7_mQ2>$FbRWA3dpv(3Avt+#E1ir#%_0?j1TYfcuznxT z=t+b8e8PHmtVmqT$Ywy`CVUmoow=~xWUn#tWPfC3>8itg&CWpFbVIY}{jZKxuRi;- z!jzc;?Gu<$2+8=>UeDQH&7Ik1ZujXrN-$AjI&zvJjhSruRKbngZS7?v0ONCl?Hn{M zELExVTdMTx3{Ju$gwf*}^%Sd|LoU^Xw`Qkqv(n5K3bWvnHshH-uEXRQ?|NHVMb7dz z`b}xna?k&`7x7;yUK$yapY*%Y$G|APh#oB#fu!hfVzzita;&j8!&+4I{H#YQtT1<#YzD5dqrn;#*>GB;}$Jr3ETeMBmam&e}g ze});JI<$4!)fpY#nNHP}jE&rKxe6tz_TfRIdC3a`*he-UVV<0~wMFw2XdN1Er(Ni3 zbjh)7*uMcDEP|tXar*v?gR6ZHRR@R?LXz_GTpx*tSwE*&bJ`u&r9IvoYa5uj9DZ9B z@~qr&eiY=F>SH+1M_rDlFZz<$L6V6_o&s`SDkJ;L46QLO24k%T&CY8)jrnW><@IH! znWX5k*md`UM}+v#pFaH&C?ldQ(`N6?pRMWERQB`-S-;!w!guq!r0o1O>8cPmMZj#i!mR*%bD4+eBP!F>QOAt5pA zeINn22=0npwR}LH3p&feg6?A6J^-Z&F8&W~LZZ+JLf`fyDw5DT!)wp-G>T|SnW1rWIw>0}s z&VE?nlvAxL_SeLl@LB68rz7Ky!yiQ0>v7SIo)(r#!A3_|@`WVM6M_y8(zp3|czD!u zwBK99ZPvH86oHq3QzuE<#2DB?q#7b;MYL#$pU`or{Ia}Oq~g^h+Xqw}2(bb|@sff% z)|N5|uFSOs$Tp!r43gRbX`ZK68wgM$EP(7mqySKxRt%s3cNdF-!y+M5Ti?M~0=np+ z0s{a%kSz45U<9WEL4cqC?EudIGhWmryKOI{EuswO6wM3JFUaI`By`)6%a7f&usike z4P%gfG@dW*R}i~UyPvPXjPzs^AA7B*BSTh$0l){T9ifF}&46GlI(qa(>r^*D`u9wI zh$G;QxAzED1m%Px-_a2zRe8~YpdK}sfc_0ijZx;pjq~n-Vk{J>1vz>< z$#LtEF~+cPa1i7Xx$Z=Ib4Y(zi;Lx-PgV2}kq`HRcZWz)yA43BjS)-3BmRFs63tud zrJiR?MtN1M+bUz@`B@O$%Xbf*y> zo`K}Xt=)h^;`?t=Q?~Itz-0r?diOVO) zd``*>QtkAW%P!qLLxI=}0XQ5{s0bal-puU-5~(PSiW+I+f1agfnYz%QDI+OK4YGO5 zlcvSA<0y6=9UU>8&G+B638^XHP|&M4yu*Ax!^-V?*^-FGbL4TdK?;{eg4hd!UZJ~S zK^>KDH~p_Wrj7zY>m4P-GN)#6pUetuy|nb(mne1EVeqC4Kt`!X3H zzsK)*duV)XD)Wxd^)kKsT!gv@NemuW=rBHi6j(7+xyKthQQ`ETSb%z?^O&3!F&K2} zzXoNu6pR~H{$eC6Wxi$OO&|NY`GYc{aAHbI${xv(7G`V`yxQaDxBXtdU zu?6#%^AzN4yKw>p-O`_`Yt3$KAkc5%{6m)kkuP92buj9|_&M%aj>$)<%-aX#8)!p0<0^{~}a#OZK2DeQWH9EERW*+pKTDuRA zAod~%U5a?sgKkYayf9|mM#fcKySK$@Og+n9-I1Adw85ygzqy%ulDTb37~D>Hq$>H{ z=8PR9pey1%6Tz$Wf#h1pCBJ=}PtEGW z@yD(?9(G18iY9xN4^W#%Qmd@9>xtx;Do3lapSmZ!Fsp98Al#_Ptb>8iY^r(M+Q&eo z?${(8XQ`XqD1v){4uK%baG z0ji$mS5TIm%dqk(jlH>nGBUo9i z9}Hf7chFVCMhj?+{=b8P`w&nA9&aY|=^cDfIHYJjQTpym70Y3|6i9d2Ko^|a(>XsJ zG9EslP|WXcr*qH0{?f~)50saPJltoAMF=sC|2fdBeB%?2D7C4Q4coLvP?q!8oI{s? zy~%*0uq4PR-Ri#5G1+{2wmDA`S6C(%N`k#NBgr27+GpAclTFElA*!$}E?az;DCQwr z2JgnSZ0+leqE4n(OBiLoM<-Nwx98qPj>oXu1w?`9uk!UiYewRHyNM2<@{Pfvg9wz` ztIJQ*hv7sjw6h$>O|UzK2wWE39uJbEOJpLL}yv!Z(0yXYU&F`=%hZ_Vb02at0c#UX`IRkSl9%L z0eT_<-|XC~muX`^1L5=8^$?4R91XLM)YrgR8R)O9EaR?1zjsAXnXu((uv(&>(4?n{-iL(NDN;h6=Xm3Cig8=ncIB>GsFQtYf=o zcZXFI{ynq`c3h!}eW02pYY@h5gOf{#Cpq5u?Jsa5 zjO1NF!8QSE+9;1{?k^GZED$_&Gn=fj3Qu-Va-GfngCIJ_@_k7Y;||@aZ-46qA@6scbArw z4U&~OK0HuBML1B=>~PQwajA*b-hTMvlbeW0`?Fv%R7f$5^~=jwH0={TN}8G~FA(F3 zU@m}hNx-<&_48A$t+L#M6j72$key~zR>|6}%_Rn_e42X*qM65?4G_(ses8!3aNB)- zC$qjkqeod$Aymn$tD{E*8Gu;IbW-sZ12b?o1k@%~Nj2vqDK@j^l$2zKEWashFMi$N zaTF+Wc*bX@l0N|fUHts13~sef^#4LJi`k}?JJ=1OpI+^{ zB}GL=$#L=U0N}d1`ge*WHz;9NKn9af0Jnmk-~vKoWOh!wo_7wQf^vkvYfzvGU2opm z){L?W3+dZiYJWB)NhP&raC5^0WfEu^Jjg$ft=)ta6Pp*eS2QR(<;63R5VZ<%KdQfG(w1PjnV1X&n*!1kGW!BB-Miot(%SvZsyK0foFO#GY8Y!0zb@%~>K;=G z29w&dM;#x?{z18OQwTVyiu6p>hq&I+7793cWpneydnC>88r=Gyp+k5gp0aTca=Zj1 zu&IFA;W2`W1u?XYB`Iwo+cemGf+Nbmmmz>|0>PCGsf_CLH#UqeY6RIjP@DJkjTvXWj5Q6R~z2bWKj5Q_pu zGyh9r0fK`5r#IGT+SQ*hA$SkWY~bp20Fhwd+5GOvlql0Lx9aw{8@9LTpqz$^;cxwc zSX3Dcs1QIH%n-B;kXBMX-P!z)r1JlFcA2dP32X;>U{p3^a^tfcrJB;0J^&m5VE`>y zHAL|73&4mnGEuv()$D>4j$>j+z(aA5c)Va7u7iu?!r_|-s?(0$h+ZLD`?h(Ze((lS zMo?hGD_?t~FG9k|DUNaxLrjz{1N-ydJ3ANtwc=+=3g)2hH7dKG)8%$~L5ULV7!Uyo zNFw`hZ*2TxtsVa_WPXfwr1e80*CISkcE;UCuwS6uyctA3DOU3hdV5;z1r`a`{!NgD zz2`~NAA3T-cX{%LMLHS!|k_sb@K?9XCR)=+ydjiY=!X95M$R z<YrNF?tn&F~1MngVyZg9Ed`XJ6sAe2|Ki~@_N+~NW-@zvGZ78P`QqyIap zj}Wt<8MwhZ85L`h`ESH{q_sqI1A$^d1If{-!%AGCx`76D?d8JlLDKBgfrR0-+lr+( z7I!n(2T_dTVq!@anRH$LvtnT+$Lo0mpWNI`PtdVRG~inT)Q;P;{WOc5p6kh#xq!0K z>>DzmtN_?lw9|G~d{y)(p~z@ZsC%(~Eo$z(JKtzLC)R^ij;;zY_&oR%; zn}NPg)!vy-;nhlywds9I4+RR&&Mi?;l0lAD;^F>x9n`JVG*CX@d+4UVU&Q5%b!ztq zF$xqaWuT=n@l=ntWNU!Xtp$khnE{gAb@#Vjn51D^Oc?Aw8Q1zt`Z-YOP6DuK1Dp_x zvGjmS=dE&$m4yps{LonIP6vLEJ9Sr<^~;IdGdn=*;L$|m6li3a0}AJeMk87)L+qry zEl$^aA=&z2O~sjmJm05{-PYB)?sP-)su0g#rmULvKaFY-Rv^t${~r1Wc~EHVWUk6> zdpqV*a18q~=!7lEQ{`-{W^#h-e$xofUZeap@J(BNikdS2)GCRL%D7n1=>&ueks z6QZ!H=4;bR`b6uwZ@;#(nww_(aeW4ycTTy3vN`&v*7W35JC$M=&UX&1X*udCKB2;7DjsocA1?<3O zqqA%HYd} zi)Ec2IM-gC=cNDln~KA;s2@Ltz-5drupumr&U=&X9&SCGBPK^4=Pm-q4VS`aAtiO6 zEo~JR0T(sVjZ1MGdE%qweJiDi<1Mg|tI}dVky{Al{ZD0&%&XvLPo6%Fa`u-@u1f9X z2K1_Mteuf&P^&jJ&~W2yp=$S^Sb$%7%fZW=0#&}V)h}luwe%}aBiUn|9;?-=3zbes znrwL*R=lUDA4g1jqgv)Y{ghuG@62~iUDR}mZ%q_rg)o8A9K}?eg?h>(j`h90O2Z5D z9+d!$0L_n}WJN4vsB2S`f95RKI`$|SF+D0@5Y}8hpe1A8tMuwowShl-{G1>z&5_%N zF>H|8XO4%hYX3MrAV6}XUvIP9CtM*0;Ut2JCJ&lrG<$C)DY`R0wPRj!hH8lq= za&ncq`_ws=4SRr|rYE@Bb?ehXtS8j}-+09W$|OM7Xjm&w)~yJh(BMy3nVZHv$TknCVBI8yfCfCj{G?SV zB`I4r%}Fzz$`q2Y7IrkTzrbddyrP|5=*-uLC}?exg+ft^lRW+8di82_Y296G{9=)}a@L_~mbhR27;J0AZcgrDq>6xEV!B$gAakvP zA3_nbWk!%VSFs^j%T7qbNYib*Yu7*O&DQfGdrW9l$nor_54WiHW$>(j9NKa&uSDdRZu*#p`g|@_>L5 zi)>gRQ|4fNx3yEWPmu(hBuVg@!?oPs8mX>28TTF47^lqOb zHli0CIv({hFB5zF+`J&Kb7&zvlbDD@E$$;q&GqR-u`K` zg)~Y;Fw!4k<;}lHE_hj{DrEpB6_9CzelRcEHQ>!mDZj*z<-b2E!|6z3Yy>JC1HAg} z#e^mGzQCu|O@et=o2fLf6h3zxVA}9h=da&55YR=r3kZ;5aIRLJU5KxU&;C)66X>6@ z;iXLa8{Jfs0*!IDJ)bm#+W^=PRwUcXgnZ+v#a3Y9_2Fd&sNw4?O_*c(W~RP1*>I9R zrDRxOw1yit%VKevnW#~S=YBU=#h7@bHAeF>HYSn+gdXKavI+`K(Xa**P$OkEL@yBK zshO(wim6+E!E?4z9w#qHQ2DYm;_|K_nJvu*C+`wCk=~R)J=GFfszi(9<>Jvuva}-$Dg~k>#W_QN~ecCitxeJjMkPG<%j_Pz#Mf3^{JSzcx6uu zBU*%AuntcTi~qbYvBOxnN#y6$|A)gm1!W%|$CF(L2W3Xx_f#-xZTPX?TyZ=ic3B)8 z0_B$Gszo%!N$A#wmCEfBt!wZGzO$DKtlP^`%Kq}@ORg&RgNMgz5R$%4 zhsVu6UYHPD7EBx*984Jj^{k$>!u~R2*CNLW3ccFOgc?kI**iZlbsU(_>zy+=b z;bZkT*0(gP5QG&%LY?4#{=ZOC3s*}3NuMvfQ?H*^K^R>~nk|6kTQDCU>;mSZyAkty zvppgWfk1@}A`wZ}e-!Qi{p0^vvipC`t*gy+LIZ;Q1OLuR0TX1n90g=QdT%bmP{Gw$ zPp;D-vRmC+ySP$6fm@B!u}s1x69yW@w5i10P}3Z1pFK_iS4zEl=4tIPJZr0lXfo1^ zWD>ar;>5wN7QTETf0eaDPjPuzedfp}xWj2=w-uZfXa8L2aFS0rCHe2wdkAI-6vg(F zSOya}1w(d4#E@F4DhMfD0p7hf%|;V)Xba;vS(``c0BE5f&hJ+kzWtIL+bdc2>+9?K zDzC$I4)=|zkGF=0J7$zHOa5RyN%=V&9}Ox&!OsVD?x?Ozh3?g3@v7V^?cPd{itr2S z(mHv@pS^8BFR1hA`_439GShI=(aGQ^`2UO#T>CuMXLPmK3LJIUgfJ1vlxnpsdJ=#B zrWLq@E0jj&=UF}ma+%l+0vTuv&DUU}Q5__~ZzCJ8KBL^=K^BeiNJ&ZYp1nZTK`Z#+ z#E4$T{2(?d$AWEQA*qmWFg;wFYg<3{q&k4pNf2YI2_F;l-EWQ9O7=1D}-7egK*)cC(mE~qjE-|-+8L=y4likZ`LIoc%y?M znNd>sB4mbx9i(r}PV3Cn(KuM7TtAcMr(D;sRZRNDAO0R|kW&AN;6b7K;6I-#pI@_K&1)p z>E^XDfr8}kLs7tn$RU=@67?;c4lCKWhWZPN+P{KSixb&C{SK&Hler<6qCpKA93mNL zuax;0GX4T&CE(fQ2g|)I%{Vl7Z7xMTA;49DB2)AG z=VlS@WwL!`_~@d0hudcc#xXlJPNP@fNmhw4^9OD{Qhdi=vo3F5ohpBCfXA%CA!54L zMOV|v(_^UG-qh?27}k=m3GrzM7}VLtJHX*y_4Wkqis3*_b<>{sz+Z=kM_G~g$n5AZOW1>E;l)zTt-24|>u^)0J= zIv%0Y(rT95++l6^|D4z6LV?=IYHFDF;^0Gdr$!diBZAutxY3Ya>HgK|$L8gr7SbUg zWfJ)|>FmPh5u(2Jm zuHZQ!2DLUoR|G$I=#DYW{pdG~Op}B^QdKQVoT_&E-lEf<0j&CUHLq`A#+_zbh+97` z3&PI-*5d9mGh#x;9MWW7?XF?hb-p0gYo7GGRnl9A&wZ86m-s~e>lZ3c$$E357H*0MA;@MP8d{N5(T|$~J zU)}=cvVDJBq{!^UO?pz`pEdIbz+TP$kgatdA~-yM!3E_gWB7JKT-d*^v77uoDAPn# z^zFYXAb~d`X)~D_!+u{<@|GE-fpBOF$dm7{guo^8ucyHoTMQ>w1VG6^~CVxms z(B@BKboXeG{KeI0{x(YOdruY+(_Mtl{PWTM$oQd~d5fkkJxJ{R%Q6#zUlA=tw+9L0 zkeieGbB_P979=*fz;_)NpZ|w(21HX_3~L^;+<<3_S$O#wM$Jyhw8g+cdIqSig51~t zj2^oGjcT}NS@6)qf?*)SyT2a=SMLbD2%=RPo*Jh@0Fx#>tEzTr6)f~%ov5YHi%6*K zH@`gxgxQ<_MQI(BlPk#22iF)(IM6kuVQ8M-1(`^iW)325SLm{T-{HQahNcbAa6p5h z)q;Y#fPfrs3YZ-Nw2;*wMb!%=HNXG|C91^SJZlhPZ;;MD&;^6_3bQ{uZ&VZbv&->X!{^S>nY;3Rv@bvX&Xk=UXc^hp{-esn zw$WGlpIX5Gs^UZYFp=QHsIKhyv$MOzyQe(i21Ox;oWa{0MFnAvRpqoR`hqL&dHBG* zU@!$APX0R*z(H|_M@D9!)WHi%iuN>l{-5&sBWK>xT;|R71y4S*Z%#TYhMB(TST-HV zO+Il7u&}6zi7AN4Dg`fDCvxrc%c1^`M;vp@miMj=m_&w0sVzh@(S6FSN*(f0CE7n0 zJ0cQjJg8unx6yyaLY50_lfxPtjR0(d^|hxDY=6%U2EG^T?;=I?bfxis|48AK=!=a_ z0nYMYs~_;Y`%B><-TG(F6IH=Yk9T71Xra9hp4->Kqok4=sifpd7o7UArD5;49<2mY zw@R-N`0nK~P_6-c24iLaRiJGBYd1^R`8oK{5d9NDrHxfU5CW6wpP&DYgZ2N{BGA9x z7ytPL|0Q7i=QsbSKHc7#fBM-2SDETvfsu=hpMFv8urt!CnJLTlM$atZ!QybketI-J z)a%#7Lja8co>#L)Y%7`yT3~#drB%+Y@)N!>>1} z^L;a|{K%yLhTC1kCXe|g=c0d(b*|S(*!CLU1hE$HfecBNg5kxrpO>6LMl1xFKXgls zS7NX&e3w}hH*5ghhk=np!EJ79Gmv2*OMyy$9YZ1q!2J6O5lM*sK24BT++l^({h_7N zg#qpP3KA%cf~E(qHE0V9i|Q|cPs8E6;KyNx%gD0oYJ&hjdqt6PgGF^Niu!Gi?W+SA~S_8j<}A&&hYT;0l59rHYzY^VVKO%7t=}Ktc45HM z56XKlj|Bm18VvR?C|ay0*c?CG#^V$2{=*cVo{rY(t6_tCuTP^zMI&088-Z15>57}D z6ShIOZ&kuk*ZFCgMyBCtrNTw-TcWEI%vi%pmz;`JS~@cfn66xZH0X&kJBvsPQNH9A z0+)A{i*A`s^}RnIjX--4ZGlk?J?8SMNd9`z(XepqfZ<1`yL#2mGsZ54etTV?JrW)` zI84S_@_@W-g+X-@QbB&Y(qw;k0b2Ei9v|%v;4s))+eKBTX_Fb_nb+tAHbvzb0Y`=l zb&JD{-eaidD7<(e|94LMTu?c6_PY=<+Qd?y z0l>#MwJT^-Hk*ZBf|qpn~wg0FQ(2XbXU2| z3-S5-*Ud~eCPYAXAKW{?s!N3ThmVN29|<-x?5$?g-d~#y?N~)CYt0Wd z{?|Z!s(zr~0mQkTvF-VSEWd4aqzFUj)*yZcHg3nKd1PJWN9^RNUj{)_{(y$}Ljw`@ z85!~XZ)yZt(uU8!_wg>(L$CG+Dua;jpR!yRFsshVTDovZ`kK4$S}bQNF1D!5AA!(e z(rA*VJh4HN`CCz*STAyRw*Jk9`ESt;!6_Ykd;5W=t$aWJr<$6K zI?^D!6!a?&4w4hZBa9{-4wrDzFEbcEHPEuxS~4}%sjIKV5+59J^wZb*NtnsQhn;qB zcC156bp8DEQ7M+$(5Z1Jc0kWX7wJ;!!X%JL8&nmgJ>6+uEVn*<@R*p} zdY>axa&$oKt}zz8W5$kHU@y68{{_^mbW03q`6aK)*w}0Z;)N3@4#AwEG7+-C3=*z@ z6eRY^^zCCR8C28%uo~$WXc9^Qcsx0!kcdV+>mg~4Bhe&N4zc}X`!bkbNsYk zKKtH;`iSLTh1Zmjv%WI;8bHRaM7LSBn*Rk-K<6&A;n>84!J--1>MbVGIGZa!-c@S- zb!JPC_Kn7JfTuEUcLxagcM#e({w9c1;j?#kQ4Sz9qgQHJfJ`ni-fh=xHBz_-GP|&i za0#wX`IP(xVv;h;d zpww)Y&3yn8st5yy+zzUZX-SPU<_K&M=;(F;K$F)Hd_ZZBy}H~}1pg6$u4!(P4+%M5 z-2p7xVWFYojze>)JnZ5OtRS~#RI}N;a{YE|mv_ma)!xCujUUvckHZuZy`F?xyRkw= z;+R4s?X9hTcg~h?LSWg!sA)zLLDQ98rRSL1vy)|sGmM6MqZP90BSaRmVg&Q*Ky1T!=(Y!8H+n&5~E3#nX-_`v%dKuOEVY zQ{N@O;?!ggNJd(uk$Y* z>Fw=zu;kKV4Ykt(W;NPV+!`9jGPIfepJTKcF<`sf2v~J>ks#4k?{ViKDa)i}HHHmZ zZ@D~MY{@%4Q+AdcSo1(4j9(76EJ(25K{Xz%k6-PKW|wq&Og-9nKwCUZS^Ly*RW?9H zRU@_8x8$>VtOsyIRyG&@8H7K8r=u?4VNq3AVs}Y6aG5NeJ2$`KHDHp{w;vY63g6At zyv3D6n?E*_5`Kde@XPDh2%*dD$5fg!4jI$L}}oZ`$&cJugY=NIQ< z68v*#|45{)>ZBJtVW>bfvS1(uPIOl6lRH54Wt5p{T6I_G7}es^wk8?{jl|0XoSckF z>9~L*Cm4nFNKm(H?E7bO_^mlN_rdWZgT4xz<;}pQT6gMiENcgtT6Nvw~_~}hD3Q_El zcc!d$A6SjYVIx1nviyF%4BKq2ytf>IgyFXxG(R&(~f1QzLJzF1hL<&5&;j4?gLN zU95^a!Tm@ipnWLX1l~$HSVrmzr)X7s~3`lrqr>*9$}tlWM+6^Me$P8XlkL8USC$D??kvnk^~6D9g^Cm`Xb!jx2dJ3P_IcS zC^(Dh9c;{OG}oGr4YB%#z1u#$nFX{)my2<60(xcRK~IE*2Rs%PbvXBak368=q+k=; z6VY_IDhDVA;=(P&F*UBx3ti-5nh=j`@u$Ag!={2F_FYx|tsmNDPY8rHC#l(bIM&fM z=-Rb8+~P{TCEm28!n@=~QTCHlA(HC$HO0Ce9pBP1JCe62KN+*=mVbe1LPtP-b_wP4 zE0+&T1wgw3Hu>z@Kf>rGU~j8i+SnezvxzHtyc`ou58Udu#&BoBe70A@4MbKQ8^G&naU5*hHH z{`!}+Dj<7;zoB~r$VTzph|WUVS4)Ef{y&ICe}40S>Ol3sKIFwg_ecLz3;6FI_`osk zDtCe^ll?bw#k6ia@oQ09^x$J9{v(^|;q5U5%Iuk$z#%A9DkOU{Q3*(vUbjadtEi}{ zYIytj>~6Wiyggvv-m26u-?t^e9SV-`vJ&k+CKEz(6~A+v+w7g18%!5h4m$CILMS>)O&yksY9WPUg)s?62r{8fW@bR`K z14ADjoz!_Bsqr~FGcaIgOim^qr&$s&T}qe+IL^Rk+BE7myp7-WhPkUedGZXnz=6fi z&^X`&*dA;wz6bvtoSqm{8&(;i9Uwn1?Un%iyer6*#Nu%|6&P^zf`3jcOAhOw;1fx8 zXRS*GN=l-t*tLakskF)f@15i1reS#7sgUC?THuBAzzYX7$=P9?{P&x`a7Nzm42auWkM^N*II z9|7`FkGYw44^^*&y71TA{aT;<-hmIH;Q#@@1KtVhMxGX!@^z6;>PhrS?-+A6RCELv^SUN z85*UOaNI?fCT^Wm%Bcjjd)lk>t(;?tjGX(|m7=?IJ^#gp{)g{Q=8Mbp(r#kEq$R=s z1NZyivb_HFZ2fnkMgAw-g8DNQsF=jo-0x_k&LqJ!{gSBY7I^@NV7S13`pmh*g^+Qi ziJ(D?|0XF<%l9{>930G^^Tr8v8c#IaQo+d*>|q)9HsZWOK*_xIiQ7{uWX5r{INv1} zz-a^xn<})!#?G&f(`t*sAz;I~zB2bdhi0QVvxq_V-EccR^c~2mU3h+Yoez4jHKW6? z_xu31@cUhAC9~>_A9F$B!8y6I2+FU*@))~C$&#yTNiXWXXTMkjoU759)+ebg?xV(x zj6OQXVDEzGkgu>Dp9Ks970&s-yC}JNTU*;@kaOMm(xGO+v2(yOfNi@%1Dk!K=@A^w zrqsjs`K-VdXFe)ne4QB;c)LIl&nBHQT;u^t2`3H(r1Jsc0aVlX7@?ZTopCIA2iV?H z^Z>H42|!Q`3G;YU%$*tE`3+4;r^(VYRwMyUaQL3CSOSdBDA& ztfFCenre$RnUYQJfT0jIXx9L2Ky$eHrPU8-Ks3WGq5FBG(j7jtx+{X2kdrr|v~6d# z+jh^e?LaE?<;w|GUo;a6PM$Qu=jjya?niGJIWA_AT`()Bp}xdLITw}>>pz#V`P4lO zYN9kA4??=H)}yeJ7Jy-hii)YI@ZH2^WwGlbm2%v{hGrnMk=Gi5z#0tm0EtgvYBs%c zw%%sH2=F%0&q`G1mG;rPr!hxu;Ql!SinNv+43;T3pDfRCziIb#azqjdjYJSv)SUIz zIT1=~z~V4f?^tH7?&OrAd$_#}1u}Afe=3ZVP1^Ih+I0YDk#e3DlENq}5Pmn$&YBwf zjc=0S2kcKzUSeT()u}Y!K7;81Sz1rrP>XZ=l3yU$z8~k*VK!^+< z<1u?Oa*AXWr}%3gOBt!K0YQIYI`Perfo%e>9k^9T0EJZ)Nv3K-d;>>589DnUGIfhq z=(ooVov3PLj*#ACWik+Pn^2-#`NEFI?%oIuQdBD@6VC|U--Cw09L zu}ikvwJO6ZHcBjQPrU^?=M+0p!T;@>+ z!e3s`j~8PO+yQtD(EDJ}8dSu%slOJ{Uo4`9m1}_SBovC3!V>N}+Ij4Z*q3az;vv+7 zu$usP^3JTa%xQjc(V*tZCqEGpz7?=@Sn9Af^+khm1H#X}K1G zw}IAwa{=&VW=L-^L5E8@PGKHzaX}fP9zRNk^tx8MsU*jm9-YrYN^1VgO);c}^Ty*I}f)UO}W53;#5Xis6 z2#jMBb?$&Ld*T*2L)EUEv|4M9MO6!>%P$P$@~w$ZY=#mJqs65aE9&`J%+CY|BnAtq zS{_No9I(j_maB7dxN4qkqXo*?SY-o@S#aju$6iib;e9E+W*|`6sn~B+*A&>8bS$W4 z$=Raxt9mA6t#m5Pp69qey9{D$R<7980_498+b-U?)C9-9+-Ip>+A@9ae-Jm55@$TE z;GH}A`sPkwg9~}7APb?bCJQ;V`m)D|T_hCBn?%>|jQ9E_Nq|x0M~qsgrzbo6xn4SY z_)sZR`XZ$RScE}Dzvu7;3QpK)EzsyaCBXgpPP2R z%*Q~)H5O5%Ps_r&)E$tZYHn&O*0@q3=U0*^Fs45y?l^sum)Cp)kzU=Q%7ige_!^r8 zqCLDf`0Q5;7DMeFqm&}JAdMPn3zDu8?#~$t;QrEUyRg6Sm-z&lua`)=01qKWXU#`n z$Mjv4)U_dH7aIld52MC-Q!%?v^sln4_r-*r&erPXZdEjuL~O0%8DXc)<90zZxZM~-2QcP9TjbB>qgl5wSyj=^*#z6~HWNW%;ExJX3MVJwB; z^2VF6EMGoR(aGU`?8v~(+$>4xSSP3fc+d+> z`{Mb;(--2WfN?6L)edNjO*fJ8`(3+Ma!3C>IU>Yl9FOk6=rXk%Uy3*F-T%pJc@M zzLQztnk@5?BIHaD<%nIz9;aLX-Q_oY2p#^yRbeI|@?}KgTU403Fe9w=Vp?lIt@huq zqL;FbWHXdam zkXn@$Cq3U7#T=x2`My3*et07(5BSFxCQ&NT?)CBHB-X2o};xsVn!K}gyCwBQN*Nl zn$qqXjbyrRN6@g;SP7jN+~uAqRZpiiVuoP zWe|Oai0dEgf`TFFqVWbLqKWdGwYU%g*d31hKvNUPv7S10grM#-D7rS9SwHa@%ytpn zxWx29H7^`+_N+R!y!){M_+4rTxgH=7ULe-2T=kAxVuakdf!%H3PWH7{`z7bY{BjVSNO||*ZbpBR^C0d0LZ0jM0qUq{qN8>GTasTAU2=TkOj~fH#_%nGQX_>R8QhW~Dh5AaZf{ zFXl=(j=h8_=+Muh7pae~23Id-+H7nvsM#TkEtP`Dy5NGdIChqu+QcvND&)9Pjh%%T zagnGAY_j^It`5zz5`t1dUKDXm8knxMp4jYLsWrU5{Nfm$Ideqql)qA_lO#Mx{n=X+ zacBMAq|y>_ACh8IoG^lb)_Om)Xj0KB;Iy;opnx8IG;oOu5`1>^H;7m0rtZC>|HL>k zUfpoxcM3d9UmV_(jtk1~ix&AkHVZ#sD>BRj1rnQ2U=xIWlXPAr#^Ug33f1SQoH;2G zM4=43;|pTseE0ie7G4?#f`?;)(lI_eY>IXmRXus_Fn081h_X$;shw$}@WQZdzgizK z+45Vqbrk-bc+#`q_tk7MX&4r?b%61imi*e3l9)jvRw1f(zP}8t`ZD)2Fo;Zc#W1oq&Ctj#3-o$%DQ8N?bNVxtt*wIRRlb$z@ z^&yTH2Qt`4t5iZr6tKPSn)wMMq`3WB$O{TDI{$d&W_~dInkw$qvS?8o-G_et<_MHuMD&J~p91Xl<)6!9rlq0B%~`_THxrihextcWc`h^xwZnJO1ikP+&zFyfkQp&6j7Rd2w( zaC>0lYrzkW_xy6mH<7JD68Vv0wuyDipKX%`4~Mb8dhVXA^z68S7O+e4a>_8=lK)RF z0DBarmlfakh^c=E=~$gzU~Knz*Cwi}=PE$WoI&3d2`@GTDWSGwwS@uvWs z0@jqf%)k@5*kU|!6X|XfK8=&}{9+{vOoVeQ&k9rLUuuC~L7zeZ$gxS5qKI^N|9c`K z8I=B}A>fF&B#<6Jnne$^Btpb~hwH3W1-Hu^b%Ii}P-i#TtNKjj0|_)qlh{S?!!GYR z5?~w%m}KAtvBFpn-vdmquCpq+JHODlAp9t?sEekGfB$LeRe4tWcAEVNZ|63bE)>Ht zEGCvVr3@Yet7z@e`OYM*8L{P?Q@ zC@VG(zXf>u^=FgLvsBb5j|U7`Sbs#I*xN(*#Dq;-SSxL2@*k;Dk>ki@UqBEwl5|Ym z-`HOpCU@9!lrIthsH)7wMbUcUEaC~u+7#)#-?J5em?7;qDIeUSbg9MeP0@tH)1a4( zv+zzaVTxuCmMX4uR(e4ypA4C*b$%vQ7ROgZjjV~)>?#2%Z)W_uTpdV7=-dRT>$5iM zx(8ewgFfG&wg%dH9{OS4f@TOp_qP)Nk9$@Qp8{@F>kKrL4o2)(5D(!dWk9#6ys_w+ z9`i$1NKsO^V-XbHo+XzpP~G|YWI9;gZd>gIfVM5uGXU|a{VkGf((a1w1=t+LiIg%|Yk7>`zu4I*rpSVw&>ie%ldpt{gSLu+_L0!Uykbq%le}gnHE3 zt{kmNA>+WY$WG=h>+|taa|ei|i#1RKmU0$B#bCVEl~EA$*SS3^0MS;d$Yuro>^o2G zfA;1k?mb9WB}stdMe_K@AWqWx>t}4`)dkT&#jM`TriGC!day~SrS+5XXZX?|Ju;C* zUA=NOiEJJYv|2wh0@XE85i~#6Ok^A_GjjYj`jZ7e>y^%L3Z#&V4E;S2rx0>$d*K7b zwNbQAw;>1X6<$Jezy$<#7qyHEdVE#NdEz~Qc)i~M6Yoi&ZjbhAwmqx7Mjw5VzR|F+ zZyP_2DEs=2k>Mh?G?weovS2uO4E|!lP@XKhSQcQCyb$5aZGW=+9VsBNVn!*5I{(dzas^73b#Bjh235U5 z_Ms9rxK7gt;ZCRNrkMb_pr+fVHWETYLEzMX=|$7t5i$AJtvs8(uKSZkdb5Z3WbQ1c zGS3cORgSs#JlGGc(Oo93SNr{K(`)wJ)Uo}2X#Mxo>1B}JZ&Rqk$om|V^tfxt`4dqf8yzE`>ZcUE{s9GnxvYds zfU0c8l+5;8uZq;HKY5}N$2!qqt*s+|W2`KPsXs%e;EV(LoAZ+U)yjO$9k<#nUVwe~ z`~DW5dlNd-uy5ofzjpsaI5-F^3bgJ`=hQpN*z7%Z{?Ua(^g+Byxw?K-g<9rE{E3Yq zHFEB{7m8nGNzmAv@0O~7>vTmkF1uVgI`dP8nPQL^NW{o`+09fMDH9I64{QfAq29L? zlH*8gpNZdq$$7oRBDSHiaTl+4&d3tq=K}nrO{3(Ihm&F2=Z;5Z zKK+7LGG0dyQq2)Csxp|g_wTv>oxa_-29r3UqS7t@W4Jm{ti)~M@Oq|(PFXxIwKZ4^ z$ef=-c-Wh3wK{hET)f9qej>Dt`4lm~G^TdA3i!@}@ckb%)N^MBw? zsXm(tIHVGilKq{XMm>Pby$G;pk5hY1LuxdQ?hRA=`O!Lfp4-e7zc4#Wy+l zTd(vhdhg=(3A3+OpLfoCnBBQ6j^~N%1002{Iz*i$M#=Y^c;4ri6!bVQ@dzMYa&xc1 zR4ZV(L2Ihi0CG-$5 zwXLv52OA}l3FKZ8ygZl^el-eXVLmYQQ^?+iR2Ff4jl)(Qm7B-XakFZ@dd+41M|CZL z&n7tnR;$O>Dl2N@hHRl`n0HC#tUw=~20v3HSK%_rk~I6vopy}t6D0{WB&D?6M_2am z)TZgJWy2g1wVt23+FWwdGczWQTaO`j*iWbRc%%o0DeWutPEr6{J?}hSm_p(UpcaKtaqIppn>P!5Y&R97U1hAT#3eTj(= zClMvZ4^i!%8p1}+5)jU3S3zQ7ebLWZycG8BVlv1}jAz}xB`YD(Cx4o}dVa->EP>YX z^zmW)(Fh1S$SQHgH{a)e)V)Sg^#8t&q_pLqcRct#V$m0x3GDgl)o$wPOZ&er$1hxO zl2^DA+ytslj~t2p3W&ZGJi6m6tY$kzv+Z&$yO5}Tu>RkNfm%!li_<{RY7hnCv&fhYt->dE)`Q#1SrB(WF3|_X4 zQp!<<8qSI5n%SavwTpE4%5>4-kPb=P3QNkeOAap47iy*^#i!*r+b!3uuw4THhmu)& zH$|h-A_EgXPtY&n7o#5#Bw6R59d9wfunD>~It}JV8+kLxj5+|!sL|KzWhxLJg?FFXyZTY;;JUK&4g+XesqQ=Zt+%Q-rro( z!M8k#U7tY_0?6F>D3+Ogou$`5cHa2lGjsg$t4HKq?46?6G(g)|1*qU2B)^NP9JX&% z0?$*XSD-tls-p8)O0_OKn+~&Ued+*b-IAp?AL>;iSqfkUKxpcXXg{^@JXjpZUo|%; z-#=fXRd4Y))m(6nm-)s{TeDAOz4P0H!T5pY;+2GalE^$+vt>}J1ppj0j?vBC>`6M! zYm{H#(+WbefQuCxx^TcYS*~tbZ{4VhTMrm7gaGR+KZfYHp7nlnbHbA}SyL!1b+XMS za*j9Z+UIAU;M-!C6M=aj9Xk-poOIAT=eN{BMG7;E0#w17MOcOvQS0GCnKlJ1W+=ag z^G094eG4RYJlwUI5dEys=o3$V@g{!xrLx%*4GqvhZfsW*nk%a0us#8Ao0zBvb8%ED zqXY%i4G1Y(AxB-j3RH5wal<9Ujv`i_6#WVwzGv3h?H_17rwhDx5;?Dvs z<^)63pJ+ie2s+g9U38<>;~y~t9T7N%LH5Z-^$~mna74jRu*E;1!W-haVfmk00PVN` z-TLak>$>#+ty25nzEX52tq)Hg@bl}~0p*is{1JUDtai*zADAKEReCMA1Tw@dReb(w z$gVX)DktG{Z%NjbGssS8O`P$u$Y;W_1h3m5m2_`+HP(Y{Dln?r54j>*iIdt%=-jh- zGH9Ut_l-*#!|kBsNH-rJKMGXiKuqNL(>);Lz>nYu7E=tuBSofn9NV6um5>)h{54V4 zzu!nf{eHfK6Zb(QQ_wzuWW5U2HB$B1-l}vp80)13J_v3ttC-k&S^Kz6#AmRFp)(5b z3ws*wgP!dg3?jE#%bUgGgwH0GCJ|o-Hrhwn4wy}s6N8(Yqn*>2_x?WZuaODSD^bqN!tZOa0zdB~h^uWWTCyQR$dmT`I9{Ogtn(23V z)OtGNme&%9IcKPph{S+PEg6UDrez3fRDn)8W*iNK6vLsmBQFQL2&J5ryjqCFwR6G{ zKU9rtjYr=%f|{;`s}{B9J^48wS8J3POD*WuyVqME(XXKa`a3!geR6@ZKsdIpMZk| zCM>io?i9w~-h^t>C^B&QieatYl`C_uI`*Qey2Z1x8Syu+{06Y}oZ^_CgKle0BgpIv zrXCf}Wm@Vh^J(fNpn+f2s;%a0NE#=hk8FcYeZoKEc9WRVN_Ss}55nef>v{Q6?)2p5#a zjW?040(264jTjR^Qe-eA74Eq1ldxBUKhXLmU}tI>PuH~!SlyA8T`IuZ+BEh|Ob`Z% zE@jV3b{bI{iLT$@7XFq~J|FLjjSC?f!+m?1WK4hJmf@IvV(q3&DZk#?CY%YeHmV-MI9?)zby$NS+f)AhQQJxeO$=cW6-hA(vva#`(;j$LQ z+?G402R!QJK4y-M$#O3t#=8qdVFwVit%xab`FqMNaH=#=6Ud3WYpKee=hqWj#B4;b zkGsyk9}3g7WoJ1Dg_&lldnY}AChM_2vbt}SJF0ajl+}QY?Zg^JJtgkP81&s3h41Dm z!@B1xByUPKuwE8ub+CWlC(%llF>=g9ke8Z^kOKS+AbzbB6kB(ALWh5G?|eK)ap7LO zg3mb#sz5|!18LS4x3!HSNXmo8m)o{*LhRChFF zvA!PHU`;fwACP<|3gYkk--qWxs$xU{2Z#HoFbi8}OjNnAmA<#+sGTl$9q7kLUN1tL z>>Y^`I5-yUxB2P9uYkiLLZP7wLw@^prIOj>jI?-jqfcyzOj$E=@km_`qynDlXQUZoSX*)L#;vg*7f!GOAF41FSDC}}Wzi(+x=6Oo zKEJ(v=tkp#N;Kcc?~SM+>g<}PoXko^U@;p@?64kHXj#bEBRe=J5wk*n6P5Rw?5{ue z_>$+IZ(TrYzYz%sTt}^x-x7MsYZW2yYY*aG+cHdfr+z%k>M>60ZFU{d0FCWQ3)~4S zq>i_iJYO_JQOG5HA0v0MN$dW{FdXO=SmXcL!eXeWng!$=T5cf zu`XG~nH5j(6hC>=P{SK`^^8owB|y@hqf;&H-!KX~*i@@V>&4};PI+%u8#8&y1X2&a zeiSnckeaAyvCr|(oUDGjVtJQpT(JX%k&C?27rEc?U52jDH0N9a05V{n5#$hPR*(@| zO>}=UJ1vnI@~E9*)?)u#)z55TRO%k2ARQ%()&oR;G9w3T^+`UnVPEd{8Kgk!6@|zT zlxy8FLMxKhc9S>FLhRo>e6HC-${JgY|4|sL-L4ANA385{YJU+f>}adlWpqO#cVNq1 zvs-bDLwA9rZhaI$n=dr)U-g>5c3w&63rPYVC%KCSt#Gs<;t$av(PWUHNZ_F(Iq-M z3|&)|6v;(sVsz$}82i&i7an{G+*nVsiCR^;B;`n{FouK~po}L+RkUp$ht~$|hbE4U z_?QNYuH{fN%5NqI&yTFYCR5%z?QcvNP%iQ@-0pmK7a;^Qkh@fAO=K^rkA3~v#ek#q zBrCX2!YPu^m|nrXdHz1en+m*D@oI8E18^_7#FlKtE{3vxt1a?@!G@1V8%h*$7vvU2 zma}_2eSBcKW}UIjF((|zFB~%Hi?b|KJ=!`D(6lSy5H_l&lrXklmvfkFwhT3B?)hSk z1{)C@KRPja%VOo!xweMtqU%v(aAi3>YogRxwu`z<+hW|ng_o>PlCr|rWiaid>Z)>I z3)D;EFU#Z?3>$D{M~6qpv3~+)?{@q&H=^3sjQEu4xr5;(^m@)cQv~HA#_w>U-F><6 zC6+Aj+>sVF0P*&zvCaOmL)qY+GJB+}l*3n`c+`95Ywe=pV1mbubu z)zJWUiiRgy!4am9yFNMQcZBAQl*P36r8L&QpCM_21f`@??^W7m!85)qu~xe|fskI) zi>(m=S9oG?^zrO^C`PZZ4<$o%raGcg6!s7?{|19KUDQ@W{GX4-eLp z$1xjW!jytXoI`SP-yeEcnwS_XonJ}cFYtXq;_(Pxq{t~RjGV@Fe92o$kUO_Ip0j0Q zDw87VNZDaROWAdL=VAn)X-z-D(9(ASRc7&hoZpbOe876{T}k_=%CiSsFPr-W zqHzU}e=gdx>(~3w4ibzXWMXWq}7`R3~G^Gmjbr?S3_rw<*9+xXs)I$8w!l

z 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 literal 0 HcmV?d00001 diff --git a/external_plugins/agent-team/docs/assets/manual/market-personal.png b/external_plugins/agent-team/docs/assets/manual/market-personal.png new file mode 100644 index 0000000000000000000000000000000000000000..dfac67d02b12ce3359846a0412bbf23bf87f1fd1 GIT binary patch literal 317692 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�QvC$XAsXdD|eBeER;Gb$MIIP17v7(j&uS_Wh_g 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 z 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 <1r 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 ZDfuq2x=LPJ;oX9ls*;xCBYCT!{|`zF#H0WK literal 0 HcmV?d00001 diff --git a/external_plugins/agent-team/docs/assets/manual/market-sources.png b/external_plugins/agent-team/docs/assets/manual/market-sources.png new file mode 100644 index 0000000000000000000000000000000000000000..fca861d754bd6f847d62369f9653d3221fa410a2 GIT binary patch literal 155395 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

Y96KIWuJg!-s}{4xm+p@f4d!ypqdE_u6i^ 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%0Ajp$GeP3N_Rt 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%0AJ=*agkCq^P!An3ChK;!^TFnz*z6P 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 }gAt2i)5yJs^gk+uO)j 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

BN~2 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 DHkE#kc=y@>R~0u$MqfYy9`Dj`<_LzQ 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 z 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πA@|;fHwz+da zv6qO$Th6JFvo8g(VmZ~*)hC#8SH2;500IYd728wxmzhy9=ff9V?CG4%dH}t5y6J0V zG4A?}8&F)*=F&>s+1j-?gevZy%<0Qlu5`%>80E8qFEF`ge)K*y?M`mll1%oFB4(~B8CYwcDTK)_ML&!@tDv%y~zD^ zYHHqvK2J%Su&GuE6(aa7UzXvY^?b6}TqK}u{8@2ei^cV2M_|2qSO1jnYGARgzCHY_ zXj-*l^T5fyD(-bg22_34#kTWx*r72K9r6T~Z34*Fy|VtXT04-K?&X)s;_a>9YiEpI zij@$y$iB=$lY5DJwkz(_IO6A?E7pd7T6axYn7>hIGjZVDeFv_&{7ZY-yiv6;(VDCz zp9z>vE!y8v0DUTHBpaj<{!WL?l0sq2KKzj*e-Y#w?$Y#m`s~q;W7VxD$XQJ&MP%ZHs?upi?u%} ziAnG>k>|GQr@}f0#8qI;pEvdMZ;97i^V12`u-y7cdYJU3(}K*;Ph~$a)~<9*iZrqC zoiw_MM%^pl%~KXtOGIDI>#$Nzn#btTE_+;p zz(;=DIB&o!ZjSpN#zxN%NL%MssA+8hH^=bJCv<~hakqPVO&8-djcQc>lUFx+bHR|w+ezw8gaZ=O7I#CU?CTZ5ReTpQl^+tf<#|LIQ20U`$!Bd zv`>jJc{o@KHFudFanSw8 zXEzeuXPvFV7gj-%!okf=u-ARSeze$mV--hrx9jS0+He#O4*@gXhRd!SN5?e3`+%iB zC&wK|aglUJaspo3!$cx0wc~u0-9;o8#8p6X4}MuyQBhUjRP63{|1xgLX&P#+hUv9% zqSyXtm|S}PIfkm{lE(dC_5@gh+pLgO_tnU86BEtU z_Y@R%)s{7sXW9mzU|2LG!#){GdSa{eJFg&&_kVDPEjK{^E$+ypVJ3tM>6qSZywUPC zmpoYpOzL}}Ib6HuBvcX`wnaxX;MqChUQJD(-9@keJ%!jkpWMrFw+<p?HGTAF^c*g_$Eh-W}-|7A0r__ zv)|#rSYHmFN5Ja$o54@L;zK8iu4_=7U{bty7{*V9i=eQM)rjfU@Lm)#VaqN%U0fX9 zT)~MQo1%qs@s*vFT4-$J&&cfoZTgY9!vhq$feV5?x8?e&v+ zxV`VN#Z!@*+JEU`kyiZ{z(l8)b#*y=u6@NI$Q7JBMb&7C5mfPS|H%lh-xe2SOmBDve9#s@kMWt zo{lah&v#&41^6WSJ3jhWt1CQ=6G|3iJh5$@(p8g@BPl|dh9HJJIkRiNX%m!*AedqF zkO&o=ol%0`qYu!8La{=>DUOa8ujXT;HUOQUaU2e(LT>1`%5`snk5zYho89D<;3if# zcz>wN?U&L{HIrTo0(sLFVq;u$4~hNcf{KFI-xNyx%fD)FQg7!lF=DTrYg*V?G2LyD;%85|)ZaGv zMg@-zF;SnPv15vGW>I19F(I)h^{kb+fFXhz3_E`zNnYxjCnRsCP(SCjj=dcwalQ`PUSv*2&JgZ6~;PTiZHhd<`@gr z8QAD<_MnY^6L0tz$~y&l>jZ0VmS(isl=LOxVM=gu7vDZl&6;NIN<>h(%c)*RUP=M; zzqNua8Fy(*-T)O!$uV5`6O?}4&a3H~p(K=^=?GWlV%LBzpiK;szxjKALGA48t2$zu z*e4=*ZK$N0hwiWe8EVhB2Z!$a-Ag*Z%{6h3#N;TeqWamfp~9QnxdNrpy4T0`=_Yet z!OQ%Tt9zE0-EccS{h=|%<4V1(KH}C%&u*f=&6L4py;irHA=g#i|E-T^#OP&G@UeT8 z#KW1AQ^EXZ|Kpd9|ntb8R8LU9^ zKA<^cgmm=@#Edczb!}}FP~t(fv5_A`RcT&z)iw&~IC4;p8lstq3SMWIs5?JnEW@I(15naaK! z7Cn^vIL$>Sxi~%}&%8%P7jFHUF>*`g3XFo|m+t$jcFyl_fsx^mket14gDPFmw2jjt z5m7Z;Mc>IL8ua{v8~6*h1k-F~HMd+5Oi`AT=2J6uo)Z&KY%H1FXJCF;FO6STI(+r8G_w!*myxENvI13{A-m2+l%O3m_Z!__W%$J&vL?IscOs_*S{0E(6G zp;CifY(hj)VnbbOC@L!44fvDQoj>j9TcKi_f|XM8IwiUMP3 zxX|E%Y^7q5CJ+e*^wt_imzx_`F3tNus`*Q?2K(L!m@wS=F`YrD8`lmAK5BI~4FEQX zkH9qr*6Y-(op)Las;e&{;v8?NycX%v?w+bwJptsSjO;*5fQ%v9ty^mx0XxyY$(DnK z4tgcbJkV;Rx<@Z`Tgs4sU8BpeYyg}VRACJqueU?Xg~5HadM=n%kPbr_NKCE36T_mc zC5tb{H32gPr4xK{6T?lRK*mMVLjJPdgCFn_%&XSd{^BWPxni)5Jd{>@z&U`zF@Oo3 zWH>{ySY0gM2T37(CK8EbkQee14zS%T>N?PJY|rY4(XDR@9|sgD+$6-F$5C z=jLO%=}$Mi+{V5Z_Mp{or6>0)In3Y6y7VdfzoAO7_Y;9Lc633Wra@u|dLj?+QHh8- zy^~5YUK@IEnSs)xqEz_t>i2_OJ-N`!JL`*YYu~9~b zyNqDDxj67n!2OV3*52J0$eR+-w3T8^ZmKrpJ?PGDE49FLC)0b;=p=c5*+B}2?HkTQ zi~SQ5>|NJ+`10Zc7k5niCcBv_FKT8D+|r6}rhwU4&2^QhB3**RFCtgsA&kW#s9RvD z8pGR-}*ZbMupFUY%YZW3w;SYoUE5{363mr}9p+kq* zG*AeEP*d1{P)dp^t{o7Bp(0xN4{p`nUqaZnxn*tNzJ0O=b-mH`BSvh`=@7ru8$tH; zx^|)?y^-ze@INn2eK_|F%z9t)_HJ&zac2tT~M?^t~W{gRwkpH;8;2vlzfCav3innS|6b&$s}S z^b0hiU4}h=FQ!8zb_A8!h8mTHbnS&celxWmWa%mWQ|e#1zMV6qMBm?+1VUuY9+?TW z$P)|TfBa)b`W-g(T)33s2XnQyjk`7WbRDbi`d5F`w6Ras_FU{+J$1eB`Oq!L7i$gD zT!DFFcUDeQ8kn`m9y=DJF?iicNh^z5%{i{^eBOwd(sKd%jxU<$qq)WcHimi@qtEZv z`g!@o%e=U64VC`FTJEi9uJ3=D^=HAo#P)1Z*$$;=d)nWU1qRG(JUnc#ZCic^-M(TF zNk@(n28tgT`oz8ZkOo$v8J3Q~=&KIo{jy{{T0=B7!r5Q88rq;OFr(z+8>XXW4K%lK zeh33b6wbFvXVNq;N+{BiG4>S)@p=q2nh}%@eu(zq-|r{K^&zwS3w(k~jDZ@K6dGBJ zaa`-$r-E6?Q){osU>CW+412O)Q8`S0eYuBN6d#YQs3ej~n48`;S5uz+h0gLScrh>!_~I!j9Wg8G_1Z^f%nBZ1syX0o z12Bx$VTo$_rL>vYFp_~E8fCRNHl8@Kajn;J`k6EKZJcM?@DZ4!{}fddUF0x!ggt8u z$NFsW7yin!zPj)G|GX5h(ll-wsLPv|Gzm7#>i+ez`lww{)Y%skJU%uy3sD|VS-y+4 zr7mA8@!*?YQXaZov7bMA9OcxMHrZdNdsXa;ky!epk=`6HKtQpTcpGE4cPX~n*?A25( zO62;O>Ca6Me@CM$e}b$_+9_%>n2PdfA}OIkK!+tms@FYk%DVBNW57kL7k5|vod^4b zdK#X6udfQe)WlxL59deCBNtK?_nRsVJj^&+ctP{Cex5N;;1wywckFYUpElh$;9}n4 z_k%r)e|sK#pSgzB)1qR#Z{}9hg_Q3rSWX`h^$42oAPcx!_|!V>oOtD{inirzy3Z^A zBh@2(D_(SkoM}g{vtvqR!Y(=ah9jgzce&?GQ8N1b47YuGFn3z@=zp`U-bdsHXdE){ zoJkQ)+7as>++y3%QuP&x;ztjl>stI?rjF6JfDTPWp$&KLiU{EHF@KiLaOfb0RM;1n zI3Mc*NkgAfUN&q3dqKZ^U`C?RYB}++Z|QV&Ryy1-rwXuEpSV*}qk8_1U+t zN`*DTmAck}1>enoToO*$>uVZ#)po^`b;p4*_T4P@Y~OZhl3tkaV9pypWV}z2yVWlE z(u@A(#j(>gE;8Thzs?7KT1Xu^Gnw!^DY7CmqQZW0iOFGnT{CW>khkYz*0W##tRu(d zaiWt|j_A<$GC)$mb+-ea4A0_q z$@mdJfaHo+dqG-N;iM5CG8^&~x{z$G{m1L&-L0PodProuB&5TfPoQ9Tv}&Bb%wCG> z&ENQ5Y~99a198bSt+joWt<)6cT`?Bhw-b%*?j~_^tupbb9)7YhqaJZP<$XyD4FV~L zg9?<}$gd~6ez@B>x@pIAorclowzh&63#%XAy-v&DY!|)E zVtUMIUMBV>imgjnhN=<40I`y$Jp58+K~#1 z5=u`Pq+nRZAOnu-FnH0tG`G4Df}~r3*bzWy!74#j;+wbcj(#=$%c-(9H+K|xhzQ;k z3BWiX4D=CVN=hPT$1h(R@H!#`LsS${1JLlte29fLVv`?4a4$OCxX72^KyN~3(Ivw3 zudpAE5?q_Vc|F!9VMrGwLL1T;jIdH|(r_cvJ^^e(CUxvS4!hWQ!H1|Q$j8C-*Ujq# zt`{PJdIOe{*IEgVJ*4peOjE%3SG{nBSCCOnI0-M*+(G3jHT!Y6gO2FQaAWlQ4?Aqm zQWfXOvqm!IzIIsQ0D@STfdfLR=@m%v{_S%RE|5|jaGRt9`^gUyvH-H|RueiMxgwaC z^qmQj0aQx(UWn#%d5D{63&RcFosZf^+-={|CUe~9_9~P+1>4bE-B1+h_b&n`vSo>4 zW`z;d={%X;Nu3yDfHLD*3xW#9)?m5knHJkc2OH4O$$(9Az0>hM1P}EraqV#4dNyJX zd>%fE1j7*^WwI`~vp77AA@@O`83>PXBiAqj*B8YsOtRsBBk`Z_iKBGKdn9S^(PWdN5)$>`A4Brx1-!{bbpOR~uhCO2 zdBE7Bt4kO3rT%^gprfjGP)wuL`VIpa_s?LW`Mi5@iZCvbn#kz`_X+}PmMHClS1=UW z$rm@qCGg;h-!if?8PpiyXaTORi739(1&}e1rb>SysA8bA5*fM3&j!WvjSGw+A3~+h zzp?bsG_LOQ1;l-TR)eQO7>eZVcMxDAlg11bo&|(-2VPa+rlX#gO^1ySP*Io_7JzUN zt#k{qk3~gikWLTVi1Ti4Z5IT%W8tueCe2;09zXI`)f}|)5GkUi!}^4O`@-_e%tPIS zZ><)VuSNh|hyD``n+gxSeO|`G>S{A6Lrm^r`l!t?LQOf^;#Pgh%L|$iL@Rzag)v>9 zGar~tiKMK+^~;9)*)+gt@TtMmKz#6~=0fF*@3{Xt`u?|zC55v~g1L|(vihG-geG-t z|J35&HMF;iUXx7U)UnX(z5~XA@Z0yP^T^e8>>dtLK{@sO{xfjKp`~if#Uc3TFUV1# z2R*QD3IW{}LxE05z>t*zYb&s(8kino8u5~ch7B5DO2t@Bhw34t-_19QO^zSOP(=;R z5CjEU{ZG)PAp7xO82gTd4y+Kg%zvTZy{+Vrm~MD1g2tzSAqNOGAl^{>LhXS8=h_gM zMk4gIZz0GthjA??PB6cqr4q>n12krqscSn>T=75p!u_DJ35;U=h-9bkF9=c@aZkxb zof66j^9vxNd9J&78J`(brl%=fy8q4gfWe;=Q~=m;cx-X%La4NJ5FiI$gX2!TuNF-3&mt2ITr~gzn}|sb5cs>0xnPkja!X*!RHU@<-NP+ec z9N7(mLFv#2^WIX1!mhl4Q! zSSv_fFb{*vj7YSoBtpKvp!4L~3??ox4ZPSLyo^Xv%2W>gz0!c^3*%)xs9Cw7ea=~MQC&uU<~r@2N4wC;Rss+1ikXF z4sWWthT#^t<;!2wcSon zkp!P!z}@QXJUWRWgCts(X6|)>xfPoR$i+C$5=o%Yx^7k#N`T%DlXjqUy$?q?UZ&}PrXiF&_fYz`2Iaq+!yf;-*Jj~`n1CewPVF`JBQ50-MM z7{nTf65b#>mo|ipiwmR19K#NmhxboZ8x)xcy`k_l7h!{J0s!4K+y~e+USuh6z+M41 znxe_~a&ns7syDtKXlPo+6t~aW3t%CT9<`Mjn)hY@T;%_+pY|BdCT+ozF-$Ptxqb(s z4~KqSJ7HG|oy^Z=KP=S9x8J|J&80e9wF}7GYO`f#zYcF7gJCcew+i|I=m2o_0@kvznsCoOR`eR)loD1oWO4rSjY0`v#A@T#*hdjTU#?#KvQVvKMP@x_7qE5e34sm>=sfHto$g-~TceS_r< zKnRcgc_s4n;IkGSG-8C&4%u_iiVw4e4pU!aNaUA@306@NVM78SKDO;kJz;e8s{s%W z0gVM45Qi6LScUz#C@~>H{*V;c@HBbV5AP=Zj*1mb4dN z9i^jgM}0KIt%Or6@xejnA>28_&!x)qi>Dtieb;2oRX>^sDFAHFKEqzpDA^m$7#szl( z_zbW%UtrxpUWr*0e!YH;y9Wmv4quEE47PAqXJ=1Al1AYdue4%feD;*$*^@e{eqR)ZS+`ZYvHc|ric;XVlh9Owkd zwNp!k=~D0DAXJQGSFtiPZ6WXf>H8FnQDDXR%U?Xvm0&K&%bL%d{o#DaLMnlX{*T4} z0lDmzP#2`=s^|5g_&WcgCZT-{Hc4mjBN1W)9ELW&Q#&i)`QafF&YZ`Jyg*-ux(%hu zS9dumsA{I}q&q!NLGBu=lE0u(|6W`aH!rvS(v{4nfmev2JFEh@Zs5mP)AtAO6%<+~ zs>4RFaV#C~g6S2$&uQ>rxnsW)26FX(iF{#LV(;F48Ki4q(wO)YhH8_&g5r67p&%1} z#1De+On4iCL!cEiEQUy*#|ZRWT3ff3;)+rS_gRXoq@<({#UhdGl&ss6rQCor3Tk7h zw@a*Q;mV4m9}ar1pve*^l4vrndzCm?rdT38Oq}BhJ{ECZ-Jk_!dl^PX06ri^25}o0 zFA}XkKw5)uj$cqM4b=aB2=N~<;b#$B&%dwgob`r_f{zSFlr_p^XSc<+L1X}!5qDpd zI;41nO#rUbf7-vBAVPi~n~x`5{ySTZk;xN)!QcVobceVFCo`TSmLVSHjT;byz#xop ze3Fszf>Afji|0n3m4~Su-BfF3ZESquv;QB9(zj5(fpLYvH<>EQJ$w8iUxOk=Hl2{V zgM&zoFa->eED6CCIAVky%BQDKva`wL%Hd?%JbNIzchp_yYrk+r=Mo&r0qZMUNT0CziT{LE{^zgq%H$5)K37=;so}G(25b&TDtiTVPZ+G|7rzlg+NlBC12pb~eiA1hmDJa-gRA`o;!3E+z(g=DUW4V)u~->+)2Xhgen>jF9#K|ccm}u7H?!ViY_Ji_!RQTA$~+{#?PtK1 zn%5_=n{0T?t(zEJVKpP%$__sSnCw`q7=&fON)^4+&t=8lpVMUxp9Tj-&}0q`eTJtQ z`Xm?^;bA(1BV3~eCu046`-&QzS6JUzE`j^U2!vhG21G5J> z2NM-I07WK>eCNg6-~?I|j0-gIxq;5jJpWgH_ydJHb$E z7Bv*5wW>bgQp!%#W5-^B$C;pwmxmf0IUz`hQt*t=%3kmab+%&cj%VlI_;I%!$ZXkNfDX+&`{Qig{ffrL*PR_`DJ3oSqp)DaS zrQD!QCTO8}r7+F1y-m2{;l{wuJ|UWnCm_Q{PtaxUbnoQc(F`R2Hw?jl4s+3Dj95Ue zTM4`bTlk%;H%3Yn!NV{}+AS%$(RQG|5BKhe4~lLdYOu`j+cd1>)W(pKm{~&trKG5+ z2-{A0I$(?8a7CGoTOUn8-bo6PGHjVc^DV5X4M2H^lNM@k*r|{yti3iq3ULYHyK($D z45@r^rQo~cBg6FKWMJS1p1!bN${fsIA2u`~GaQQ*4KNloPQCrIvH{a4KI4vq9)ci| zLr)KXs6xF|PaJGW45bTfupvf<^p+q8qrrpeGCx3zna$tauj}JV|;A4Ty6MjGWp7*{EBWU@usz}# z=F~ujp-wL^cgIVIcjrG+A0P(oSN^q0Evmy@v2Ez5ao~cjk*fDksCnh{-%nVEi{J;W zV4nOr5XNm7J%Wma&=AzHh5bl)M&1RbfBmtdIy@fJ`&J+&BJKMy6Lc@20Qx{izLj5T z6#^vaSbY=?634Lt2426ef}Ae<58*b3^%KG313fedP61z%&0ytpALg0sRw@cuOqK;j5HAo;*)kt-$SMDQ*W+$8`D+FKJY@G_8H-bdaE`iv z-yp{jD2|CE;0d|R>%aU$1yb*vF-d`1|2^!Hpm1RE4-o)f<@jyxQ1}eRZCTw5VE)T+ zXY4=w7G#JMCr{3LKY`+fu?X$)MJRN@Fx_i^H|#oJ);pTj=p}J7pAwFv2fi&(9o8l# zPOo+Sif&d84V^yiUiJ9X1^(g}1BF!gl8W--h-Y*`~dJ*+!8o$2rUD8R+yq4 zf*S@9B-r&pA&H`c)7mGes%jDH({$WE_-bfU3<{r&T~~l|7$}%>0BSY8zlYc^gfOh( z*Z^D$2J`rf$*bUM;U4gS{W;V$s(z5Hsm~!g=p4QyJObd(VqbwCfXFG)QeI(R^?`D# ztbYm=8jIt{f59WOu(oy?#nAb>`8HGsjC_i;)rFAdZf0cUJLHR#J(~hbmvf)%4<&WN zcMNW1>3Vm36d7HvTOgI?JpNZ&HS!H~?#8rp5Zo>_gD(KB6?(SUkER z17CFod_u&$QccAW8g_Br35HQoAoUBVI>2W9FJce=M z2K?8(aHmJ-3i!4^B;#lBWUq#oj#K4jXJ--aSeP)QmV%K5VHR=cj%Hy$(6;m!(AzR{ z<;)INP_8;6_WXMqG@Gyxtse64-ct>cV1l+6$_A+7!T;xpZG#gEIHfRc$N-?H!M~}- z9jz7QJa9Eea){)KM==7l4=oQ}`u+jd`o!nQMO0ByQCg}mz{K`X$AtAD5rtBZ+=5l`zf ziY?{k&Z7{%<4`;Zge+FG61X4q5%l3W#X$)XO~!doc(THd#%nTOH3yI?B#T5Z0#-S- z^1jd}DIi!_jVM%iW%>{U2^9mRoK)95X{Wf2Rr%Y=um;4-88p<{D>>uv&l3^1LBUbu zF&3k_ql+HYQ9)|>=fEZeeKszN8iaKKTmY3Y-f4 zb%3V(f5ozW7;dy=`Zxm>jDA1Nzt#qazXGt1h=}N0duc00SahnL6V1;Aj|QRA#cwj@ zFLq7;vZoUxz-wzMt~#%&L`17-<`Fx+qy!weCR=x$Lik`X8+CPdPQms@g8-5)%=mGa z%BK6n&=MYE)@2b#=aSZH8M|kq-yKpQdyqHiN2?Q(uLy51kc+fcREl z+u&k+vk&5vDX-=OcTxQ27}{DOb3OP5?BF&#C3b&-#Zhj24Z^+Qa*2BjcLEl2Nr`x} z?$oap2zR&ba{{Jjas`rzJ3O&3oIoZQPAY03e(`_F05nRp*SHaUQPx7Th~y`of>-E= zd=%IDH|F`BDv`6p;<$OdKf7yd8x?;t?L3d0z1=7s ze3N{^Y(k_cnUzHqu65c%p;D?rv2<;N!$IWx25ESP2KgE@FEzG3OL1lm?-ZgFj5mB) z`{v^}Ua^UL_rK|GY;6e4C_LSkIq>t^uD8pLJMzEZy8_(gHZX-N=X4Um&oL;3XIG)H zMP6TveFYAtIxs51MDKz~HvWYZR&x8;J18!JK;#$#m6Ok4ys#e}v&wgv9pk#4dC(20 zr4OtkU^M6hfC~{Vi*?z7TiyEqS(siKjoKxPn+1avV(QrY9`EtN`274lE{Xd2Hl7_j zcF1QCX#rq$*2DAy!B8S>cd_SsP^*3ISeTPp1;+75w{LzuS!Zv($cC?!m;iUCBxx>=>E!V z8qn&5s~VY_0^vZ%ewZ4@0I>goeokNut~3m_z^R4J5&%xr-2O1WAj~k((*OtXcT6RG zR^GX4rhHpiz5|vm1g>ykTI@dxJ3QRlFmM6<`l}D?5f(-Z$fuYl4A8Z-BAm5Db>0jP z4gx5T<2z)D;mE)MBr}8$m1+*C@hJMOBc9E}O)Ek*2N6zhZKcSjJR)FR1LSY|7p$G~ z`pivDHJfrsI-nWitjIAWmK>6UTpkkd3MW4VN-)U%2+A>C!6$#QM3S^z_^s@SObO?DUR#2}{qjZpHA%@2F*Ecb`wj~{13 zHLkC}Ym0|en~+h7k8Ll*t);0+(g6npqg&WYB4O7hwLmb9;iM zco}~{bO}?RA8;7Kd?JyAi+!<`)8 z-s9&mvmdr9>^EYC=?;K=xWJ!!v64WdYdE|4COkI2l>O89!H@y@Ne6iu3yu*r0j_ea zYjlhKQ()r4MFBgCNCiUQH4A%5fGkKdL!X8_$TBweHejLg#3RJ2S6&_2O4PCNeJ(K( zJ=3eP^MZxNJ4~y`FjGF&%>mig54Noz$L8T~`TN(egkm6^2vCCcBw@Kd_RAOEj_T=R zUE93mKZ2UD1`|l&(VroIh4c#2LE;vGP#I zUEWU+sM2TS=FD&#=HXADgkT(G92L~PDpb6TmhzweR zC$*BiJY3R@_8*XyO{B(Z2=olh+rslfiJSiMQKL&L_ar#3!HGw!#_s9QE-}ke0^>jd zjmP|Kqzr>?EdN6RtB_aM42Li%q5TJ46wgj!5wQBF89D7EiGUN8%hn%c@gz#bz7qL= zzqinM9Q2QI{tQ=WFcmPB*mnB12S5l|1Oas5JaSqm5d{>M6;3i(iebQY_4;;&-)PQ& z(xO{)cFgOmfmj9&$FX(f$-ubwsKRU&vGste?m1_G8B3(m1<_=rLOEW(TnioV+K<5V z(y4gkdWF!qr=beqQzUG5P##_chhRw&_T9t~1x^TrQ4q3JBy@0%z|4HoQZTsU6l{}d zLUUmH!X5icufwexcK*Nc`L`qdYCSf5zqXI7t2kfWiBi+AyV&UaJR-6_l-q@3xLepy zfR3nFh`6Y8?`1GWffgO96<-03ufW3TAyd`-}g6NKp~4yfC0? zG^+|Dp8@iC(c7ClwhcdmoQ`1=yP1^{xEiozLRbG8R|YmE@;`9Lpv~xZszl#u2Y?4@ zRYfy9YqtJNpy+eH(WaV6g8Zob#qvZ}1JJ%yJ=uS*0gq9sKedKi5aIjV%$EfpFupjX zju39;_<|T}p?t&046#k8vr!r1^1(?13cYhR1kftiPkOYn<4442g>4mFO&f70f+n$? zwK~2legVhy^snZ7PjQU`t06*IMA!h*gIiQKK)9~sC_%N3=L0l}fhH7=?`Ua_&`=XA z46o34;S&`6I7&dmz=Z1dg_k+Bmx1r&m({ZVfsc!T=q>~6fdxnpT6-i7%;ud@g%9$G zPydvRpC@eMczvW(^W)f}Xv&}d8wTPZZx6dXOdDNDOH1pPcrpVctQwpTu&K=KnE-Gh z&XKOhMGfeLvy0gwqeoO~7C)YwNDEXRC+K^zOV}P%aNf zfM{~G&;{N^_|1kkVc;t;+tRTG_L8IoZNnd3)0oC$s0rtixQU{|OxVZbKnwK2`oW;% zeBj@qIzto+;6TG>i>Uv$9QZH?5(-S&s~$Zxbo^3GJbr( zkOZp1tvP6%;ADRhtpFB#p2I9$TW~PWS3+VxkDg@Sng~KbThB{N1>?N?bw9iCBMa_V zggG|xFyX!f(*>a4#8E2)GC*ZddviA1lK;Hf8Q4@S9?^U^TtZ07Tqio;`dJHtutFMkoZs+34K35`jN18kKIUPCD z@-TMz=g$s?`a{c)0|S5leuh6S++2fGc} zE;tQ;(HJ1&x2*PS8b-~p?JIZ>`FdgeETgaSO~>ICVr}=MnTG}fDoz&{+a7{E#rI|Z zfYk!<>0}Ax;iqW&33u<9eJ?R@2_@-FdHMc>^6Sy0V1)k9vJI<7Pq=?zAmXfLjvjnMM6mN_efnfqMCueyo50;Z`@VnXF5s1)`lqA_KATui31Q;)34N*7$k_w-&C5 z{(9&?QIc~v{YC;PS_cTDNji`T5fNX6NpaQ&{94fefPnXT?c?V|Ff1m(RNTgvmX^f5 zoAyWO6!ta(1(E#M02BDorfe$-463f=7zQ!mB`)fKtAt|?TmfE2;tT{5)qcag;24yG zOLj#0)`=E1-rVaq_-8)JYao*#^%FsOOg~*75^Y|?$W%(wPhw^dF_dr;(q7QtpT-G?>jq%;N@dpC3~o>*?-@As z1DO$-#jF?Bug>~<2cMlO%+M?(&?d|e;QiW-$BSDQ2>GT%IF*KboY z+y8>nrPHwO#$UvJ+|!a5P1)IT4Q-0JFTj37`XvYYENE=2$ifWwm7EbtB39her|_|3PXY=&cVsVR)8(WcG!Y^?TR z#Tkkyf`&oZJC>Gi=i|FhxU!?lfnEowa}rL6(EX602H+iFPpnt%^0|eB9L0at+2BU~fLz99t?@wbC9u06>TvRL`HJW+AEb-M* zJbXE$n@EgY0I8}7NGU0;ckGCBUjt!+0E@xKg*TM%qR4G?aSqtG6QGqc&J>*E>OvmC zK`;>lpY_wHfQgJtncnZuVAAO9Jc$w=!^3lKZdjefT>>H?qBO-h@R)3*xIl*@9Fg(B znOBIH<{2t2}_(p>xAS*9Mx33u$B+}!4| zdDKvp!0^nkDbIp4)ewXKI_a2w;ZqqW^(+q+OwZ1OiHKn! zswSk0#eZ}=TG&tf6&;4=elP;$kA%1ydH-H$(jn)Wsi3ZbVofs1A9=#0vHveA~BYU?5Edp(1Zn z>pt$imZwskuUVkQ`}WH>uTKuw7y7m86)m>hIdnqa**>pHs z!{=)X4K84$7`gB@s@>AHWWHV-o&M;CF&^|$tjAFQ2(D6)LI@SGf2Q_nSKJ(cw3cbm{Z9 zot%>meye2{gC(>J{WvKp*UaxS7%RM+FxEBXE-)f~Z>U{;;S~Dq1_|DKDBSUnqM_aX zjQ$=`lB`iw99nWM;I`s+l2inx_4;g zBZ?A2%hWD{@BZMOc&RS9BS6U&Pbg)zpVtw6#7=(q*;&lp-R1N=?m*@I{rjB=7l~VW zwIV@ye_uUoK`!+=$VTr`ek_kRz5UF!r&9ZaZ!Dy~aC+Uh`Z!4C^#?e#M{9#LD#MMm zV593(-!H68PVNHNP4IoWYgE0IqQ4DL;Ls< z$)(^O#_xSL`QG)BHi?4OK+ZrBcHJ18Z?Xa16QYVyzzCYm9(}}{u zeH9JA2^*YX!c{@fg39IDNcNT(-2zB3QZ|F_(r=(Ji*jxm_z@A!#(NdPw#SdN`_6!v z{wYQJhq@dti6&LJ>NaPJoKUT??`oI;5o~A55%p zBnlej@Q=+e;eLcc9^iO*Nd3#lMgRcO*Af$>7k>M*Tr14WZ9qqa@b+}ZMGlrAjOWzY zh{GxU1wr*eO9fEg~f z;g{-aH61NhztNrDf1d)U}erE8WiRYr~3ME`=XN+%)*s_>!deQqx``Y zK-sV(0bW2r#W3rH9~?$#zyGeGf5O?1-V5Jd_~?d&WVqBkhXK7xQK z4<-dLVYu9>3pI@e`GQ{pP!l8%%mcIzVR5{1!7~9?i<9G^v~;4LFwV>;_N~!=N*hS) z24CCM)byuOpyy}GY_KrU)#1<>htFT;Tck^56vS^_ijSxFZ+kc=0_x z<1Pipc!me)C&~uG3LVbLro{`(iX6QgN*vu23uxKxE6T}#UW44EdT_+Od>;tWEM!XI zMih-31)Bd4WNn*JQj#Rw?772@gKd+ga}Y=PIjJL9`RW*D!5tzb;_!~3+pe<3ea>~( zKL}(Iq19+0!NbrKekPf_9?q9T{e5sS#kx$3bVe4A5kf!jJofSOsxm|>Q_2e`qXI-5 zyB4GVypEB~-eld~$z4_wo04}awYybgXURXwy+(5wyj~c1Jtg}TIa6z~_!NnlglC_C1em~li?mIJF(DZnl-4pxEmo}B4nhg`WOh5O7G&Tu?11b#;iTv6X(v>-n`^yK z#f0nq<2mv8Um=vnMQp>yD!RP>D)(#yT)5{Kbqo7@EgH!XIhumFA0QYo*7=x!au$mk zoP9}2c=Z79L~8H8m`u~MfrZy39aTLy8E(u5tg46B(9PiH2IQtq>R==z*^a9Z6{4Fr z7jOHP`-%Omh%Fiakv?IKKB;lE*^eK;|MBO-Ss)0wJM;3Mp*-}G2Xh#t#}zn?;R$^e zOzH%_nca$~*yqf4{RJM=t!}Un^S59?c(BT#a7VGKOVB1@uk*bjHm5qFfPek7E(oD+ z*sYQtNu98@fi4|PG~cIpTP)5)LhV+a)QqQA=O&N^S>p;=VUBj-yk%{Te)g&)H#a2L z>-l4hH(*aP02p6nlKnhfibv~Hw!r0Q(bmt8H&SCtdMl&xACxb$vYPZkx>EqmVej2P zHRF9nhI=~?&wnWinw1D6v#6NMt+is@A+g$KLAk1r{+XY7GYzV`o$r?YG7o~y1Ah41 zj4Atsq(-F1Rho;NybSe#ZUPkh0IZmI;K_`;%Prw!BRo-uXRXsePLX#1EAthj{iOrb zFft$C_w#%geQzp!W=c(YVl`210Igp3lTMAf!ErSD=8+lEjhFXNU}^s$*7rxP|KIu+ zcRuc#71b6gK2mZwnB*9t2Kive)!+x}Pn&FeohowTEe)g*0ZN|tzsc@H0SXKSIb*MrH93py^`Q=2hgpiQWdOeCBf!3{H>8} zUM~Lt`2n`-4vL@^=mS77SGbPMaPsK>ZTY*j&0s?X9?VENxZ>Nlw?0Vu8)A-AXRwWf zp8CT*%3v~m(_p5xJVQjn4WUC?t_x_xh$)u<@%hv_FlHjdHIqq-!=zUb;Lo6b3Q3NS&!Ag1rGM%LX<_H7jf|6jBsVn{a1Z}4L^-zS zGLpq}y$wOIgdPCrP$DT(xN)m#g?bWhfw!FbqASyl6By9{i^!aOsHRe4DAG&jFy&hL z4xu}5TngUp{%8YbyuhZAguxp%@#d-7$gQM6B`){2y~Bdsz_t$djH-_A;jpc1wNE7F z)C(_C#o@lBi)r6VxrD2oB<1!B!(7;IKD7L1Id!t-l)%BZ!x$vyh}`USH2*ky7>>Fi z#jgr_9nh1mD$Oo~JfzirB(ZTM*Pr3f%VdEk8lijGro0|}xd0Qi@@=AEgCMR5aS1U1 z&0zQ9W1u3QzqcBMG-w}0v=d1p&P$(s6t64G+G5fHVaG#D{einCqSV?>PUU@VZ_}HH zK__;Xa~9g;799>p;JHH~TgRD$o{uaWedQ$lK*=9o_X0l!^Wa|2(onK2F!-Ez9aEjG zW(cPkt}H2mD_xF`Q=3XY(^!dok@oI{Lfhj4N}C=<{iROK>34c35I)=wC)_`b2{^>g zScQG|f#NSAc+fhpkJjLXAshp5j5B0!9|fOKdZR;Vu4%O3tIO21nm>6iohPiXPpMq` zP!5j)Pn#+_)&)kdaco7Dd?=58{4w?yFoj;F`2PKyBrwAPu6rK0B9oMk=X=i|eLRtr z=Gi33z-^ObDD})r)`x|pBN5e&sgK;1h2Ex4C{=n$L(OI#jt@|_D4S7k{v@2&bYVQB zz(0+o1HHiWOlVrXXUqW$uF!J3#l^&6{0Vv(3N^IF$BIf!i{rnm*#t`by%0r?>)JkO z<47zErPco}s^rkwiWuF`sOPn&LFY_pl5BKe9DqV(xX~WUMF5qu^ zd9fAqsK+(BW?zShRT)DkFemVRLyk-B6X5V^+husDcwm}3_^J?_0s9^irk&|8fQ0wL z&}aL$Z8>v^D=0${o;%~MK(<+!RZwKq<$iqqep;)(1CKwtnS7Y{fz*Lg0V`|NTIga4 z*jYQDYNnnJD_Uh;O5K5x40a;hYpa7{T)v(n&Saa7clGA^NF%J5sMUEW?pMG~3py&!)VP{laMhM?)E1WTfuJ%xgH@ zKPm7so)G8o6@Z~BmSw4mL=vhK zA7yP%5vV}v@3S_OOY7RIIvp2ILel&(jptm7f{#7C$Zx!+KOvst$W$-TXg9MKplsZg z2KzN<2?5KIPNNgq0sQ>@)#l=kLis}8jTRZEDq$<5*9Pg!f2o=@-vbI@A{5VIB*HdB z(qj&<&rL~Pq?$zJUz2R*#W|VQf$xLbnV-48Hy0$yCB75e6+n?Iy?%g~5w4Fh+rT(~=jyZ&A|x=Y zd%Hc{W5>9KQLO+y^etfws4rqlmaIJntkMnV6E>k_PKnIr6smCys9|t)ebtcA$UJte z6{RYSJ;+7klFzahQk-#>Q3Nn^`bDV2ai)tpi7i=lj6PjdN5N&E3>l6j>7b_A@kak6 z+wP-``y{OMUv*A-zEHGyxi284wqP~pE?aBbWJ?FL_QUi(=a%TJPndSM01U6 zHPa_u-D;8R}n^TKa4UiXdNV+$0Gh4O<3hF|oqR}4mS z!?G`03ou@va~Ln%``CAyW}R2MLe&n-dk9uI30y}5-BYJ)_?B0!E)&~ulVP;VOZ@u{ zuU(1AeRW>?=Uit`6!uq$TaYMDL?7RB=S$nE)~24wyx0X!*+ln)##KxXsTGN>Q=P}@ z-W|NJY_++ewVi%M!ku~a(&&?|mtP+Jd35;LVeX@=nkZhr<<|0fRF10U)6M4(r?#Hh zQNOleX?B}-MpcpXHI-G$lF;5+#Y^rX<_@e6TWrndotJo|_b%`U#H~<5Jk3blt5iXRNlS zQ=5ki1pQ=Z<&KjtsGx_qEEqyDs`>F9^&oOIi7SV^=?IgA?YqM)8%(5}2|1102oi-p8> zYmeik_fa#g{K5gPEh(YfhVwZCzq-^~xO2{9Ykc16=lEyS4bR)5^oH~v#~;vzN}dWJ z>99OdW9BV4W(e!CXPs5+j5@}zkrC5qdHX?FVmTEle_2n^jV&@GLM({4H-UfnO5a}5 z=ve-i&h{J)(w<{mM~5_0IM^BIZsGUdGEcWcF3KgAer&biwi@kP@CXd6-B*~E@%sKv{zVEeD zQp|!3d52s`hxmpmFg%P#r@5^=xdjyIbRaM;VS~Mic=uP|t zvN{!B{xN8IJo@o;dpCzZxZxuv8+%l81JeJbHMINc@(S6{EsXA76$|=vxm4^GhiUO~ z=Qsup!Ri{Dw_D>7#az)4b;8yoIz|0w~f8XsL123gRJ1%s_o^mE z2fr)2-oQ(C%Y_(d8rX4dz6x70UcH@gbU1q1EFiP~`eH!i z!Ug-k^zmC)PyZ|BsYa{#1#Z}hF_R~mC{n7|ka48ZdR?gHZM9_GiaGO#g-`v5k#qnL$)R9GnQQe73)7*FNS;>J$nx1R!@s}}};2rUK zbvOFBdtgY%PHD- zIg$Q&0L824yuWN5RC5jwiqr!i0o+e>dKfkRHuq$DAQY>4Pa~1^_K`CO3w<~$Vg)jL zli&kXt1!e85&w6$I+%@ctJBBaS1wU|e!d0G%o*$B>tcp?Rq99*79;^Xd*?0zkH_#j zKrii9%`m)2Uprg7^-!4niJx(*rbu$465Gct6CI9F5L{5kx>t>cU7Cz5_E(hYCX&h} zZ1hD_*;r0cb+MiD(1zVNNoOWZec9E@bw=n}cS__$k#(le^@(Vfn4VK7=e>ZGNSkCT z4D3#Hb{(@iCeGntRB^kCsOZ-n^sFglUQ}?lS<_OqpO4rW z-j_@D-#%ipMr*v8jw*a77yDfvCh4l47Gow9zsd;B*oJa! ziUVGRg_oD$0Hqu(T^l}^^*OsBsI!<*LO-Q~Hm0GQyiBDG&&lk=O?3@a28*U<68Sz z(`EL04ac1atH}mOpSLNq&Qa3sR^_$jqK%J0%cnlFO;G%^P*UfTIhsP_CRp$$Jp1vJ z5|U=;J9TxpS5!DiAD6*J-@ECS{v-rJ+ZnZ>@ZsiWvEpDReb$!RqQ@eB*Rm8Lr3DPs zTPb$XyBRx|2j5b(F})7il^m~6G_A`0H!cUc!MKr=rY=;MitXPWM>(vYM%GIU{(^~9 zrNwJ%=ArpA0l%DlrUT*M(j%>ClhN{m;(e59shweG{3CN^A(asa1fc<2`lduH5|*Lj zM$Vv7qv?OEM5ObkaPRJW_TlVIoXzwRJnq_ZynNfX*;zb@chqo7KQbyotK~Bt9=Tmb zjDnMSgwA5ew1r_tOI|A79mx+hsyU76Y;hdvFK+fs6gi(V@JSO2N{{sER7vjrVIzI_ zb7(Qid_2}R3QK>E$Hg%rzr(4rW}DG73lX-KuRWR(BOFnCRH!G|cALDq+%m1o)S{4^ zW~-;4_;O;Qq78S$D0A@}OA$6$F>!H;nv2LmuZWB|+X!_xhBd`q6yX`F5{qT=LFS4j z)qtGVPyZS7&#Gx`X{Jp6a;-(2g~v5MpYFXwk+x%wC5w(@(?=sRam&_7N0A}wOQP&H zdLH!M*W?8pKe4h?J)k@2Tx9P5Z0ogcDNAV^%8b8vUg!Cl4p>;`0!=$dbmB?E5?ro3 zW=q)4;NSWrx$MscLSHAIwEQv_BPV^$3zOFyf3i)8In?#AD<{dZ^Ieo*F4;{*!|xI& z#DjJP|2?1jJ1}srD{}L7lMfG_U3Pk26Y?-z+BdGabJ3A0^60om#ZcDjMF zxSILu*GB24X{*~-v@NurRDNH6jr20lP)D8obk>tUEKv2maP--HI(k25xwX>NITkVy z|K!4(IN+lWb#Xjv<&Z&Gn)+kbqY56w3**|~bbv!hS!9KVx zCwSR*J{V(qK-+-ZUr<l6_1qC~^dXmQANJ&2Ql z`~in^hm{4HGo{&C$v|xajRyJSp;?Xz`u21m`q3MwBAwN4PXkzpR$!JqRusaR+79z` z0Eln^Jbpo(j#ro5A>@kVt@d%qm3uFPL>uxzB}XU$uJ;R@pQLM(mIm}HD9IPVBI-~W zR@HIAgbe_Kfoc5K*5@$)*{n9x%?ydH^GT6c{3dt1qAkBTO4Es5d&@bkZ6GYj%Cwa9 z?8FigqlLlI1xF1;jW>J2C+4C6$-6`zE=Ai$7nXf$$2HFFDo!|qv#7*em!(F#@?A^| zBW=@3T7PmTqs4*__Fv4HOhr)4jmfoVNb|)ZptvjgmG38RQ|;r&lfl5FqR`vk5V;=f z$mAL1XQW1+OQVhZNSZPC+X?F%erPQto;6JiBy~EcI#<3!77SbvV3AsTAv4=V{1t1W ziM^LapMXirTh-X++qBB;AqVTMB-1wDS70Od4#y) z{7qtCDghghyu})p;)(I}g9opE{3(vM)GZUfzWiMpj6*3F*yB}lhJEv zAbjOZ@T+Y#h9XD?`cR%-tNzkCH<)_=>dbh_xSx@4n&iz+y}CTtiWw`%GZ$J}1Q9;F zusnI!vBDg5mU3E__~R=7s3jrg(#P1h2QBF(lqcyk9XX;=-sPwI?3kjs)V)U8+io?= zk&9dYvoa;96svc6pk8~pwqSW!Jl;di|c+mzR_7(*i;`9eoIWACt;`KH|_ay zGm&c#^IRX{*sB%kPLq39qN(C=-<ao@*%+|_~0^}b%O=Qz*Di6saOYQ;=@ zm9DY{e_n3qIH1jT-t4Eo-RoTH^)PbE#^ e?ulnZ%P+x@u^NBIXhx&j2&z%P)LHo zhKd4W=U%&0Ib)dsM0-Z0{#NTLMEo{4Yncu}YLTno`~gx?Y~8Uogub99?ZCskuDhwp zuO=p9AbLeq%qUC!qUs>iM9bgAGjT4g&j`9Dd`ukWh zSL%qA&~MI7hl(}R?DblcLP|>=Rt0Xlj5A7GvUF~H13kQR=L6e&NguG=;)zfG1HnC1 z?4-+LMiXt+YzSz`GzMl3q+9qnNk&e8ApC)J6EI<`Qj*c_Iyc1^_pmf~p^LB=VhH1j zag*cwSLb!|ewaDS2(rmND@{?|M0>PH4LXzqkMjE%%|PSh7}7-zn>ENgB`8Z0kENf)==8d5x?99VSlcY zq)_81>lwofTR40u@+xLAuXyn8)uaw1a3rwSfxiJ!lYV~QbUt2eChfbtuZ?B9r4vF! zg&%Qmcszv~``O$IgT|?fZH(NMNB*VOx(!Nl_j2vq9lL8vBiA&hiX~TqTqJd_`7i?9 zFfN@UK^xoY%JEmuA5Er$cSQ31!yr?hnp^ijzdM#{Q7COv>1;b35Pr(6p*#-a}7y zvyNH)cs+fxKve4b;fgWQea7aj&&)Mnv^19aa=m@%w1=@>;br$?+IY)YwPXc{coxNn zjyMJd5&Lm{r+GY%RqSR%dz05-<|-2fXi+@N-q!4E!=?AsecLmQ@cOLHI zaC$bC+9~1C`oUzkreWP{Au-0kieD!hcEv|lsjT&0h;K7!u>QWdgVx&QZ9(6@wb8Q& z#dqXMzb{^BVK}pZ*^JD!T?5g}GT;enEyrAAvxV98nPZ&PUVI{VKxw3q-wQO1VV+s{ z5i3v8{b$!{hX)-g!#HExB>%4G9N*lmFE_mP{wQ3*#_O}(KR-WntgKn*PMorww?F%3 z&*-#mSMkOH^>ZG3XnwCtj;=Z;H?R4f;12z{vnn)T%i0I#rDoUSaG!;^YqlaCT>N%& ze2o%IeP3KIX-)72X>izJeU4~y_#lF!bl9|fdJj2V)8!H8s*3CW>@6X5zr38*8rBLP z5u-!@@ONl8LfxxBpq>o*iz7p2cX(Y`8{YDkJzTcZf-Df!1GH$e=jwU8Z8S7AZX~?5 zF|&FpLnj{qD%n;FrCB87*OHsgk#0VdN;eX`uHUABO;$mHqKCpU`J9u~OloJH#gQZU zsJLCi_t`JRnsm%3O^y2Pr>MNiWMQgR%HZr75mb>eZ#vwtp3dnWgcRkU&~&H)Zzde- zf`V8^Le2i;=olp;lH~ZLWo2RLY*SFp>DC#C<|+N9-nj#J{6iXZ9E4e-FFiLyw7QK= zu|$w`ly>g@`!YqA_pDAU3gCeSjxS{r0)R{Tib((1m;D+z^rbmz!@80CmQwiIAR0oq zasU3OVGsn!-YnAzM`FXa%LunN6flbyo9j;d_$1}{*VtjO+Zh@7`L5|5Yx9`nICo(OuB579aHdcLtBi|IY3G+ zM{f8jCmTK)`EDlzX%zm2ky3IcqWJ)UsG(PSkAsMfuE&6M%>O12Sq5L$ivSlp{K&m- zH%)d>r{WBOMG;NxxX;`Ee)({CZe3kTpv(5Z9bbNNdqeodRdSeH5n7F69B-{m`p%s0 zKfw)%ZGm=eSQt_t9 zjUS_rnXKYVvzP)%gmXyiAH=Xjd4X^pOD1oH z_Pdn+YT_R-t3L^wwSoc%OSG157=Lc}=c(x)sz@JmC{CfzPflh}x?z1>dKJI>N^9{$ zS#Ob^8sCm;wk{|jB9tod^3i>KOul@bakr>lQ=_!@7i!E)`$=rvqSULHp33cckR*i- zoM6nRQjbA9bH(Qm?S&U*=Hm8xy1Rn`gkVuP zF>KFF$<8E@h$0>Y293Z4VP8ioQ|#M-PW1G=G8tP|&~sblOb2&qj7^@o8MDl7*_wk2 zDuFd8;#vAp1RING9Ag*G_6U@fW_l54AAtL?-HQ}tEhJi)y1DyAEldJ6T53Y+aglP` zw={rWaWPugEw;@q+KYlGa4Xb7BVOKT&M;F^;29E4RC4h5)e3J>7yjsYq}POLbGM5V zf}pBDK=%yx1x=ga%U%%z`^Z(oJon@e;)KPMLt(|*rV(TZBDY|HtY>DS7+>F1+ zMhW>4E`KC~JbR|^Q5sf^^8GUNwS7zJUu6Y_B$7=VVp(OmUM2t-_b=NJUE*U}8Ek21 z@aVmJ_fFEt+|Tbpy9=NIFhDXy<<-|;3=R$k2?Rce7{Ny+qw~mqfOXkb;U5@MTQ zY^&0HrKOyY9H88|j`Qna3QTEG)Jx1mX}aDAjc3^mt%O~1&35fP$cxw3f{s*@r=UTv z8-YG`+$V`uyifK{yQY;<%8#InqRBJgzbnB&K-mz=_Od3=s1-Sr4DIIkha*#V)AZkS z`;Sf(Ct9zwjg5_k1?LW)caeb80P<&MM!slxmD84qBDIdJe*XO;vs8g*js*N4!p@VC#vHdcu!)FWFGnL6K?u z3OBuyOrxzaGaUalhumGPLprElldUR*pp*?64Pn|-1b8&e&L^BKSQ!6mR*f=<_Yy+9V z>2&k;OqUNLEyIQ+R9g@|jE&uXK1t3GfmQh+Je&A*CTx;EdPBi3kU;Q61M0HB??D|n zu?cN48cm3#jZ&O0_8t=cc5APnxZnl+R+^n4@0Bpopqj>K#i9IY3JGQPtLLtHN<04M zT9rP3_6%r`%mW255F;`WS<>LX)@*&V4KDb*cQ1EdX?MZZW%-t~e(~g@$CWEr!s7n? z`2!H9y?r(kx_=`ix(G)ia{}LM1TLIA2i@YV>)psDy{BHAX2(`SUjmQ_uc^rimzAp;59UoTa-MD?%zi-7*KZ+784Zd5bgo1 zfXo#zJn->{1`mGu;?mM%bpgA=q6Z)2iHA%XBrS=g@jjSG8W$71VeCBt!UiGg%5}57 zWm1T7PVLK{AOgYh9z`OJG5n~zyo=vaFy3cy-7@c#W8 zAzGh_h2Q`1;lsemLMU9g3{NhAHX#GZtcIb4P#hCvM8f(Z%kw5*^7bG3*_WEaJ`if> zz-1j&zkwGBqa_MiI1--$*(yOM7tiw;(Mxvzy?RF-FRs8x@(1pKmQ+foA;SU}?){=y zfqmI}6|GS6!wEm^F<^Q{el@NNgtA?@Z~^Ey7{%}1J7JOVeDdj-=i`5Z7QWIQ4fjh* zJn-R%gXnQbb=)ST>hN#)_Mm9+NGEHmudmN}S&KXj*v{MIxPenFFE5A998WiuR7BUa zSV~%ElK`G0Sd`+4Id<$r>S1*pGB%Em-I>}cr=6Uf5R>yiX)%3tD_+!;xK9~iFk9d( z0D})nbMVQPq(Zi*kcmnNhO*Xi5F`R%mSau#m0CEZnvH3jJF{W`FdkGT=~v7UCjCU$p3AaVd01aN! z!{N#K;dieoE0t~td{a>he-W*cA3BSs$f1Idm^GS5Hs9=S?pm)W=Sa2^%4=UGh0e)}5UU*bpy}UDW zDJri|veRi|(qHvZA;Tx;J;|^e)Q!Lbpee1mmr7rlGw(bybyQRg$*5)^v4A4l=Ib%T zG_!vyFHCh=3$v~zMidEd+h#CG`|WnW$GA`@7v!o}5)#0Y!T8%_i0Ccxo2?@m;iDQX z9PkdncfxP?Aa%*fGJYm<)`hhN*9!g=ev+JSxa{#}!eQ>C0vI9s(^uz3lW)Jd?BP0o z_|x)ld?1@W!sQA%p4_{41|Rf1g#-jdGtlS-)a`ft;f34_{Dj?5 zj3Ar2prGAJuIcEdH_#8;e8kCLTPv`uy4?lIGH@qn8dK02eOo?dNne$xXN7pn8(mKi zNw8zxAnIpR8IU}NtaeR0P7dc*3yGjj(7C79rW9_UaURJwDV&*Ttq!xt1vU|bn%7#| z3I{}&AA~kor0+X0y_m3*tE=;T-+!w1(mW_e)I!!*p<7u`vp6NV%OHMO!{H`L(8 zTMU%ro5LkMw~x1cN#m{e3*5i?nK@U)pjp21ikwj5gN&%2bl1KJuqS2g+$ybEwy8h$ z`)q>F18!na!>&6VJBHCBqBNxFJv7lXLz}Ls#EHm4ODX(hczsAx0T&JJ8t!_+dk^yq zB+s}60DQs-3{C@31ERl*Fg~fOTH5$CPir{}w=JZ8FcM)c0cRS`B@uxHAyB)+X@wA= z1fWnooQ)_bI~&f8UR35{*s2~3eLkL-c-e*wCdpZCB;ZEL2Ipe_%0>r>5J7YGDfyfe z+Tc)L{o&iSDPu5b;jP7_1xGCiNkWN$y1|t(61?06dO{_( z;^XHZzXK}tO^wiv>V}nF0i=h!Q6>_cr=lfXFB|u&KiXoj#R2Lv;i&~9`vSO~1TqRX zT_VQqt#V2K7sB+9LIvm!u7laZ7IJ(<)UpNSb#UKfxCj7-mA(DN_wI#Y?s z6fwQv*gd^`nMMYW^H$=8f~|8+(gKr?@#rC6w9J5C1vTt0}e3=6ktF0_@9X_uGJwiDZ^{R=LY&}e6KUZ zPZr_85~JyvTk$;Il7Vr)&JNeO$DiN&IG;G+k+CNE!wU!v7;G9rW*h2;K`FEQGhq_O zM;B{DjA>Vbinm`H_~d%WLco0hbBI@xz{QsT1sY6P4tgn9*S1-I?Ig5__&yh5qixpM znAE`cQTR%jKk>99ojc-S=F^#@9!fXbX(A%6iJ}U6wY>sQ99=Y02HobtuQ#HNyJ&c} z3bzmqrfNeTkj%qoB%X>4Md;F4q9wP(!3Z<;Qy7MT`AFJn5$5-d{}dZ19t6Uw2)EU) zojdD*gaM@kFypS1Hxy31NZxJ$`Bk%%b*(>v$bd;~Zf*`nUf&yCXdxc^&zfU1Wh{RzT-RLFo44k9=ft{l`#qxW(VeA9!4C3gY!ljZFEE!U(~J; zl*^b76Q3{t{NP;*2Owp}4T32DEeOdkL zhVneD`_0ASe|9J9MZEwj_PID&5B7%P{9( zT$?RKyMeZ-7Obi7IK>(_|1@qB5U{Os#rzs^Bq0w#Wro3eC3t)`A5Dos39aUhmE02ep24 ztgx(~4-N)6$C<53AfJr!;P=c8Y?1uL+Q=+V- zzSN8dfv~d{jlv#9fY^wi3np9F=g1WQKNy;s+-PjJlh5Ei0#=~>(W4`UefFV$K_2iz zc>rXGE&QuUE;Y<0*l=j0{sJY3h!KG1pavyK7noPp*o7dp52T)c4+8u;Qg@EPkfCb< zq|gud&+)|lN^)|VflXel707+0%Qk@H{5W5#{xePULHKXlc*N})#&Ij zJai}lE0MYp)CSO-Px}I}f-@ZsH~iY68HfEBu$A(`4``|oCab-roWUceXAct-Q&C)( zxY--_i}(>ND@F3)fRjJ|?0>i^$mWYBDlj0$BZiI0tp7w4e3iHv49(fpd>SkqbYI)& znkp(O!IBKb>S}O9R+hl)tH=#ODI2Lr>gCe=qhDZ-E^hS02ZH_p9G|1({9<5FzS)5R zQ1q%b6cm<-Cl1#Ie90fh((SZe@@i|>&{)B^G4-Bjm#r?-J5UxuwN(_5beUKer8lHu z_&nG+`^k=?34YK*C0%-kM>`*`V{jAavV|mNB*Cl~s8(4LttPg21Y0?VDC|X0o9>lD zv9UnYL{9CSI8VXPa44%{xPy1gy72u^H}Qb_T!uFfPtufE*U8@Nz%Yew72=HTL`63w@hT>UW-9+DRAt7>~EBWew z{&(^&+Z_4YX(HyTB6#^gij;Y2fi0xdUW=n1A?SSCmoBTRdbl1sP zn(v~U1)__i?RI;FQe;lsehTF>L@evVibMV%m)>XAw&TO;ip`I1tdQ~S;`*R+b`bHT zfq_pN8gBLPltbbaUOM;VV=7w?rnDvB%`~3erqI0i`EhEU zIJ+m!PGHhv>H$tP?zg83C3%a|@ABZ}a*~S)umv=+rpp7o_%T8|kBP8&D*dsO*U6O+ z21SUK^t!?R-xVk3*1>Dv1?8|l1LuntOweH3`5jDZ&op`*L-gRtEjH?g8ockw|SoOE}g%wcYjNy z*Ul1`KC?I*q;~=Vg_F7#u{W2ReLBU`(H`svGA1D4)AIRj6J^lGQE??5wSVFxvTzbc zrLw&Kb~)UPaPm4 zBw;sQS-WaTn((a&bOy0%WEA)T0#4enlva+DVSUCx1M&#W!=7E?#{lek`e`7QI$}Wl zII#(yH!cW@Ijf^b0e=hx>Lk+`M7kR|u`HFrfKW$b6Gl)3D!QqusXOH71Aodo)d<3gwV5^8pO|yW@qL|}BUn#%KFuK7kc=W8o%Z%dn_WyBf4xW4flv-8i1T!Ax0+Iqx{D0@pJ@|GfepgiI z4lJSMjwlM~bw&+vq;2==q)GxVzzX7E?_7i@7%jkJ9KIBNy zM^m4mpFiT&xb~$qmjS#vT%Q2B)B!g2<<3X6cj)O*?*M;xI}@8FmS}`E1!4-Oc6WET z+HOG>Zy4h7_3RI9-Vh4%Bd41q9xMD+buWK6KES)G< zE|rnmxdhG*EOm@GOCA4u;P-o@Yvv+>ZvZh8!C;uJr*`@iX&NHmksqXR3Ck>CiR5iQ&skkTegY*EI+cvQ0w4Yqx#u$saxdKA6MBm3|z{M3@tHiv9hNB>*kt zN8lTA3yUUaD0@4oW^Vv=*67?yQ$C3K=%4!ei{5w;VL{s5_)BmpU{(f-1pvtN_;8pt zY_xG6Cb)(uiHN%&R1Bk}pTvs?28n9|ps>ilcsK!R0M+W8dQRg^UOW~|;2U7-3eXF% zj2#)b#p@7vf%%VxgTu!+Z*bcUmf7U@&0;PNo+!wxxSoHX3;lHtYdy!mUyfquCUoIz zB_QY^XaR?^PynPQW9OpF>4%N8t2yVt06DpyK;wSFJf$ahh@~KYzx~*7jJJfcsNyx= z`Xx4gh82Y=VmJxUrXxc_Ub9n^mR1VsF{N24a04As=ktpBTRg}t6 zqF(GN%*+$}@7S>|@!?mDqQvr)uju!fI_$0G=35cB8)l}=~>(pOU-XJ7FjpWFN- z!sUnaN=XYs=yaI0ugv+^qVdPSS&MuDCFGs%arum3FGQYV-2^wK16A7>-O?!o*hNA7 z^#Umb1E=vlS0V@Jz|E3MBGcF_=Le^v@QcsOb|scyJv#oxbYMgC(JMtZWArNTAGPEu z2$NMTb8QearFjzbkwb>yp=6sN(rP<>mUgc^_q4_h`V$Fnqc6$nuj*y8oX8C(OLHj?E-K(i-( zC(gsc!NUk005u6~I~-Jcy`b+5d;P){W3XolG(D(@L1~f#wG?y{-6u|HqaLs>JfTkq zYd|3|R}lLfcu}o2ZYSggEn|y;9gI(n9hNxA!~%H-T63b<22Ih64%dUEtn^3?UIpfX zK-_?00<_yB9K9F;*<;{_-#)>O$EAYQFFC$DZqtBW<*5GmMdNRuMmBPMz?R2u27zN} zyU4RnnO}!zV!2}XDFuF5#{=pBFaZ~pm^@*+7>bjRmR0B}N`B1gUgP`+2nPRcRq??E zXadNOlbkVLJBaXi=eDE`A$?-J3(t{UEu9Zo2iVwPN!W-P7r;p%Qx#TLE>^vi*-ojB zISTNyRje2-e|))=H@Tl;8{K{@-h5ws^N3sui6CVd9DGK)*WD&5YvlOWvHjQ|fY z@e)c(@2dv=C_jg3op1oNx@UbBr#f_Y{^XS0f;Q#VFrjCuS5rpvnKAfpOs|d*$KzBsHha80$ zJ92_4k~K49flbadMtddRea*V`(W4bKm?4d!=;;YaKjark(~$w$i&6He5BNq{vf|Hi zcaMOYkEa6N7}11c6H2spf7e!U8U3Te0q5|<4w#|ZQiKwrO)M=guEEUhXt@Jc7C;&M z57?YK15h09CS`PnSi*$><+Jnt6OcT(v6U+uoU8wobsD!ynn@uoEiL`H(+R(tVeI0- zng?d{2yR5I$S$)xi$D3uu91QT4H|ZYRN#39P=~z=cLg`I^G&F4g6c7l+6}riyzEU~ zRi_ri(aM5Vad<1@>XdH4;=i!qBf$kNe$SoXF3Z;6sprJK683%j`jzWyvNmh#fr6HC zIVZ9f1|zx3qv|;TGxHf}?MbqIc8`2Dh7nz{Y$lE4`KJ1T0UR3Lm{&a`%El) z6z6{Zkvt>zf_!K)2f>YOkx=#eNOnR*$;eOlRX2g3Axg7?OLm--@#6EZ&~o<3>Wam( z-jA!w12afz3lCQsA~P?^7TgmRGahbu=SicM$}(m)!K)`i_U!Si-DVV5AAwwldeW=< z2KA+H{3*7!`lvPK=!YzJroBKfBOac!gDv*?B$^wn1)K~sT)%5StZ%oyS%`=+>)&cD zHkEyRTG;)M*RV1(Ytd@WhCQrzD7Pv-1BA@|`}*#zV>^~o?Yp$5?FgMSY!W>YOKX4rhCG~$ayjPt{Thk= zP)85{i?~lmZol(a-HKe*%Da{so)-ZC`bhgqX@cFev$vC1{6~-(*NsOTaRA>9#G*4R zU;1(2K<;()B(S6at6e70WJZ7DW;=eWR+*Bbf%Hnn*q3Y-tSL#PfqmAygj7 za(sBF-DUA#LLP2%j5jc*Q2`zDT*LBKgxp~G_H=XOk8jQTzR}+%DEg5^5W!FWJ;?H} zlcJ{9zO;uCr>Cu-VzEmNXg7h7=eVC|2_F7hUbN>aU zcT{;4Qb*q@Vf@&eZvcHVBpwf5IP3^M*I9@y7dGQqR}8u;><0r4TDi5K)r|@A8|c09 zQ=!68slq)1PMPkRQvmoP8QRaYQ{_x?y1M_2DSC9&9iiAot|NYu&X(JgOQHZZ9{6dI zG&jK)#<=ewlQf)0mOHGh@u#jA-<(*0s^ImsZwGB;FXi-e(PPREo{o?!qfs*wgt``~ zMc1z*-*O!Tq@F!^iGY9pfye+uNC=IAy2G8}jU8&qJc2?Ju3Q1N8tio}t#OMZ?MTDJ z-TfU31#tXMp(&8IK~Pt9QU4c6K^oCnfa;fp#sqY3N>(*|B5?YnaZrUA1FacGZDy5f zD2y;Sw8vA5hUy_F(M@9<83s)ZY6-Odd8z#R)2i98=T_7K#v_fQ zogiX;@ECw6>9-wCPM`#r=uAtf7n&A4jR-T7Ebj&&3*%4(QQ-X#LhFMi;Q~H2Iglpz z&9=RoApVty$K&n5Gb1P*MVxP$>7>pBqdOj$1tNn*CVd-7>ge9J6;TrOyjnhv29=m) zMsEuV1piQ9G#RKu0+xri3|$#(3mAVF=I&J!_dkj-5JQMm0cIM6-?l>xfg8XlbQd}P2ymIpo7uxna z$rXjWrDi=e>1w@_4>kRXyU?tje#&5W`;^GtI!Latw`2GFgG%bwGxN#|D7&mroG8%G zCl_9{$GP0*!6(g&dq5aNZ09|_yDeTKa#(HwhU6ieWK*(HsJKtkkR{&U`oL=Aw9<_l zlKw(voj)l%aSkj5aylw5sh1SEMN)=w?f; zQ?k0jATR|J5fR~X0U3TG^30Y{OneLI5qNOG<2Xo6l|0V(i%wmx zp9;Y)=|uZ?Mmec<>jrD)*W0%Xgq2giTl!XH9eZw393)0~0L5sLJgt=4iK%Ydfp$;) zpSJCCdy6eSQ2A%N98c2~4X;tP6nSgoti2sdH0YPI3`r7QE!Q*Cv-A`YQnk%6`8F$U zoKxVlTKs%u+yfb9Gkve)yDjuJy3JW>F2%UFzrOTscaK2cEu-V~i=Cc{8TP45tJ|c* zuajb>%|(-kumZ*){K?fTAf5-rb+A!>LoIjDz78(df&TuBe?E-jRKOfZ`xM3wIFzwM z@tNt#H5T{7@SQS2P7wIV=dxS<6Fz_>lq>iPOzvKQtQ&q5$f8*|4QUb9G8d3aW@LsB zN$Gts#7mC&Z@FJog!T&q_ZG=|EQ$$YJs|1VJH0M9y+MkjolJi3>d^5-GtmzN1JCM= z2U7GRF6_O_-RX+IO>+G@GXvlmNe3b&0w+rJN&weG9?%v2f{|_OjVAmA4uIq1p2MD* z2rPkg49f`oBaGX?V>^Y`S3L)tms&9E=j-OxA;azOr~YFQx*e{kT}p}iGl@eqVn%sa zz+MGeh%a8&e-;`5D0A>RB{;1#XScUl<_5- zeo_050ZaoxCEkNT2zxhSwhZ-)K`0N7V4euwpqUit%g%3)S===y@^3>IE^UJVTvxRB z?OXr#)w5CB@@i_s$l>r;#rPSjIGf5-Q`r3AL{`OI4O3rf$A)z@fj~>Q?%w>YvAH+t z#txQ4NblIhNGeW-{(k|S5^qq&LrDtR3yNHU1k{x;Tnr>ya*6p?6tBbB9?0o2m2FHc zH^6-fH2%3}YTn!Yh-evq*2{`<2(U9%Bz!T{Flcn0j&dnuwvQNQG!}Slp;E^gWL3)D zT0wB(@#`cS7tHn`I{bkq3=+{%A3OuYK14ViktYG9dpUB<_NYHU5xp(+Rj3E> zEg@zoER0@AO!dMCAJxU6V`#nYJulRf=x*>x8SOx#SF5K|4)E~!^%vYP!CF=zfkJ%8PI8BR?xCGQTm8?f_ZPi$Lh7DjGP?UW>37!td#I1>@M zjr#by*x6l@Q+6^2BAK4rM|W(HeZ0<{Z4V@-PlVTgCrfKDL>lz zk+oQw@k#66p?gjK5T|(REw>bn=7R_@@cu#be^Zk!MP+^ zjMLRrhjCNVh~rg8>$v7*bpG}nquK2)mOj#n8Fc@7dK#Plis_koBfT_?_RG_=tgh}@ z3h74IWmiSy+qmx_>D_q25z(getW83sKe=Qm3({ctoJ9*BvR#2(#D(0 z)Ol_Ox*`o>%x?5Q8yS_jG12i$M7F8vmJEm)q5Cen+8NQRBz#vm6{E^=4{SGoD~cZU zvBX?U{dx1OZ;jituww3=na`so(%-SM_?gQ$Q-$aRH)k^(mbThApQRbb=Ux?GKN@j_Qk!zTt@Qa^ z)7wSgzs%>pZ9XN>rn|$>&)iN+%ge7gUJKVwf``rGfKh8ZlXONbtuF1Yssc&t?!9- zCzU__C`Ou-MyUGF|De}?eTpPZGD4!wb{*Zz$$xgq%8p{xGBZ;Ibd~h=0!Vuy^=Ws( zGUX;C&XEr1u@5yVXi={~*pRez{eQVpuc606RZV68d~y+^CWsu4Nnb}l5A6cau5#i> zLi<+lFpv5NWg%wl?-;N&PZZo+g;5+{Sv)l37gtb=^LZH&St^O!G>DN0B6!h9U~JNk z)W6>2jxFkxPB4VIc>+PIuBgZr-|j{iJ@Lw`8rHoYmM|$1DN`^eyFa&Xzlf+4e}1|s zZCrT75)20zkeYhky*~J|(LzBnd&`Q7@YliYyLRjs>PDN^b<$5J9Rp>YjdL?IL*T-y z31K@Hie)D>w}RK7V;Z_KzHKACU%Qsa@fBKx{kUr&zsFd$wEsI^6DC}<{%c4(iF-at zB!fU}LhOJB2L_hD`^kW&Ybx;;d+jr&(pPctffS8x7Bzs&6Bzu3fOH@Ft8P^9oX)eP z;GH%o?X-@mYi|v5!KDltF!8=i(__hecm)vmQbJ$|4I?o_!VTWpLeR?zusqQ7gmP^B zYVXL%p&K*`jKF&a<-Cu>Gloj&(c{O6JYp5uV&EW^1_9;LpTB54e>~8X+Jk^Aqm)38 z)dEz#xPh@l-&jGf13Ak)k~8gH$$tdx-w^|{?b=^&wz=>pSUa4HErvh5lq|0r?njJJ28S9FPX*+sCsn`KO-s`47s4H=RsF^s_{f{&@? z{n<<5nqjQXT@+5z-wnr@J<_yJi28qee|u-{`m>cvDun7o?Z0sYQHWGb=rF?*ekg9Y=(#-_IiVq4+s`RZ|RH5-N)%pLqA z(nyj*iCD2Aee&LA}7zQe2|f@o16Jn&Av}c zJn;y#E$riGiDuoZ3hQ;)G*v)bo%G{ib?-;Ei{HkI&+Mr&6iC_3gS0@Z))vZ4gHE;6I^q2=L6ZyE7Pv| zR74jQHUVQy#47TJ0SEryoYesbSRKB=wg$B&xhi8K+2d?WDZTrB)4sVZ!ZFuK?pT*# zaDxXEr6O{CYazT<-M25f?-bPdeTBsM7AN!&l1{&!A|#l^v5E15p@vuOtT>hhDCfZ8 z@T358y4TIFK4=B4_B~SxVi61VPm!s_!$*(6*=N=%BeLKib8Ks8limL!3 zDFZ!XpeltWCcw|C7*F&-;l$SyPB4-{*Uf_x14*o(qjq_ z3xHajaP?{)&v?DlB*vep5$#BQ9iIR#V9Q8){qfOh-i`DO4WJBee#Q~p`3gvJ%w@1% z#h6`IkOfqEs5FDrgrc+;L5N0RNDvW=UG4SvbLhq?r6C;ec*~G3!izCl$a0tRUKezy zgLC^Quk6N3MM+gP=-Z<~^P$d4V!#iXl8G_gEGQlgQywBm*k5(z{d-jfg%*~uL4x3o z>57sV9uf^?iASCS?%N8TD{$K=lC7~Et{eSpQrb^M z=VC9lP9#I%{=hB(Wb+zSzz7S&)`oawpgkvAE_8Tb@I^NvMjkA8932=4KzZOj`~;-V z96T2&`*Q=Er+xngntc0q5i)ah9u5C)6>yIM78UIHcyQ&wKi9;Tty?iAMfEL}R?^rQ ziZ>Vpe63shw31cTg22wQ_nOvfCoBRPxy;E#0}Q_C+DR;^`_aG#eJL)46AxCGy-;L4 zvL*7_&m)%+M{_x5tYqCC%DNF8(Tvp}x^#wX|2wTF)Cfr)R%v)+@LtQ$f)Iiu9_lry z;zpsVmcb1HkqEJ$Lgh|KdSh?ml)^cGciZ|HEqse^ZZW^2VzM~3q?C9*v9Z4!YV7@g zi|QNK6q{dNb`q$GUzKmZX}DQsRK7~y0~%sP|5Ue}RFg>f_1~16e~;>D8nichX6V1# zkD$gektuFUCgG5%k<{(9Efy&xL4kJrct+t8p6b@L`0nvjDqqO-GUolFz-{j4qAqpu zZ41r4V(6n#z?B_ARMUWB{uN{TGm z?}dV3it5XLOv}>ZHxEvCM)cFiiy7hWrmHCsWo+iv>PtS?!F?k%X3kkW%AH|YI*ef; zU6Pu9d8eIDgY}6n>g7%~D;AArX5VaV0i;x&mPPokSCQQjy{28We^I8*TqK_KabI|J z`!ct8PSVx*8z9nt{{yOngDh*F(YO>;^G=ozKT}gLjl6_L2R&*s&k1sp3o` zojey9LtC?4`CrD5gw@bgepo*Y<*#;DMPQ_d_|YHU-Mq*AcIWlZKQl*YfMCubu5-(Zo_eI$C~zp7Gy@n5NH_JwQ2$l~P^MibsO}G7c*X zl7jmiQpvovJ4-a;09T)3r2F&x$OViW;WEPV=!56u8{Q3jbGp%}PCjLU&F0Y~q$M_B zP{H@XBu9O#k9Oj)rf>!99p!^{p6{x5zgC$fVvTW@Kzk~S7*nV((1?1yt13YF>$ETC zF8DXCPI6;EE}cHBCIltOd+fy;5MsEbfa1|tsNNxQ#{x=jNHS5)!IXx7Vd>z|;M7d9 z1XCK36q8>gzfc8S2DWH0*YmaI~VUU?RDshm!Q<`-~Yr|L+sr9Z3i|Lrvd@C|7!(N$Q&svzx z&E0(#O~RX4FGbQ3B6QqgRRxMETr6qd$+&)$SeC$b%|roy^WDUSNJ7_&4>mEWs>g5x z8@`P;?d{- zMJLm`*>X&@v<77=!mQ!eSX-GRV#Jteh>II_{J-M1>?|$`EJNX9hqHF>SL5biY@gea z6rzg~dZg|bHXzA{Qz!rcGC~_9EB`zM!yc^W5$J>x9+$ux?iRJ5L&q_R=_l?^4A=ms zWx5WXiMGas%*Q#{-aSo;V;fI7Tym+6G#?(UFRW@_z%vYKQm&PHpjJ42)trH$pk79w}WQ*97INt6TVZ7ii$ zFv9xv>leuGF^kyp;-bVKW94qqA_sdQ96NYqb@F>}{x@KQI}eK+pb1oPUHw^u={*O; z+Ae^YF)Fb~9{?a4*3R8fo~NpyPAUb6Res=PcA6_rl0rTHFHGc$P=m6_$=glnp9 zgwR7FAq5M)krBeb1J?JgTS5!RFjK^}_0H1)uM;05$Q!U(MXUUOvhnbO@_{_D{e)rX z@Pku_amQjnT4xHkD_znb}A`$MX0@S!j&JZz7LHEkw}MEc6FP^>+M(<@|nAu^%1GN78N?r zIAsJzRuCPGyX(IL$JK;HTBF@^N| z?*`7$H^D5EMgaR8e#UI$B78>@v@nJVZryt3-|m1=uH!AzK(q*W3NQwJn!ypVA7j~r z2jfi&f#3Uah9bWKZ6<;oLEA@crBLDyK^BW`fAHCZ#|S`y!JcM@);j*gfaeMB^1`p2L6oU#@#G1NF&gCap!R32X0#Ld-2JYw*6 z-#%a|qE4i~f1T;gzorOL5!C7Uy_6Od=%w6&T3W;qMqN07f44BoV#dA}zG%B22~u#G zo_w(K^Cv?*4}*i-k0LZ-hjTt+-T-$$6V2KD82xu96n zJuBjfLRKfxKHtB8N26)@4!cZ+69=FiR>NlI25Kgx$-VVhfw}3ops&PcT+Q#{XwUK4 zQ|pHsHM5e6HeN<+7q4Q0+bGznyL2tYA>hl#`zVWZ6>9w#Hjk=(bX0H+jo@8xyb}EV zZCU@)Z;OV-*tRi872T|5*}rjLCAYEG*YBTMZ0k$^TfSRt*Z=u|hkBb{mLjQL>!vSg z9rZGGDmO3Yk+vQSsDnzh<}xzzZgd48cE&k&TY^4vUI11nlr7NGWEkJY93Pi3{!NWt z1EfQWZy*=;`a*Nb8M{Kh15n?+FL6G>nrV0JSUji7e@hvx$o9a21(Rnm`9Ej?6BPyQ zC~&r*K*k0T24Ao0?(BWPAc0|X#A$}PZ%ZiMpCGqWg?$*ZA>IHodW`-Cnp>1yFk;5B zhAl%FZL49&(_^e^o4w@r%V0*VjucT2u#mSM?m$ z!|DeX_=4yTYpZXKX~WXr5~r4Uvo%WX{oFXCuIv^|myNoMrr9B zp0XG-_a#h|i#%d=MR5!>U}KH)7>m;$)J6DjWhEgo5vM<7YltU;A)AWD51Ek_!}!%? zgmk(pfG5@OaW+-|(AM~N;;b}!gBmC~$1sH|U50xXhpu}{Pm9wYgU588X>`j)ubYaw z9x+ixRu)gYVc~I9B6;a}j(KEc(kJ>b+y-d-m(tHbh>K z>s}oj%MiY4cYth_3!y)o)A|3*=|p7dWaH#&H${_a9qMJOp4B(Nnyu|H`w7S1dWgnH zW^2{ncXg%`usI1A7sPJWzhr5G6$~>Ai}^Fw`h4@^g`w>N&*CeQQT~=cu9k0&byEMT z!?jx0YwOle%&0K(ue1e17NIni&Q%qIR1yWGk##S<+R8=TtGkkU+zqgz7w-2*+-}EO{_5y+iz_^EcaDW>CxBM(ag zvdA`~G%fBC_nSxtF4bQY9qwX={q$|Z)X(5XnEy3NO?Ge_9Tf;FdQY!SEmXJ(#?W1l zW}JtWw&&pFR=U#Iv~)LB!_5|d)m_8-Zmc4(Plq=bwfKjfqZ%jkE3zsj&%7=DiVHK! zn>fF#$TCu#=3SI-zz@*#@L;=1s<~Oz)o*!W!zrZR+Qb3fGUjj&D9On}mRuO=g9T^A zVvp0&(>WZ$oOLnKPKI~=F;rI-bjG)g#Se*Fs0f}k$=Dw>@*q5{RI5W#QaF+FGZYo> ze(-0*sQxRalkrSk+qq=s@zlk8Y%$mNTrmlcYBtYt^NUgD8-0Dm**feqzYve&*Rez6 znG_oZE@@qk)uY$R7B(+}eJ;5k{QpvOHm@#%s~w)jC*Hci#(RJ>nEBcB=f!-oTo<3R zFEX4~jqF=zC=*}YDSn<}nB&Z{JHp$31s3h@6=J265_P}Aq&eGCooD(`gNyq2>K7z_ zj4@N$s|ey+z(g$vlb4|SkMqC!_HX&SOP=g5O&(*DZXbD0cl7k0XFL%K?KQN|RIq|+ z9S6enzFelUHCarMt@E*k^0Jq|W$q_rewK;Mq0o%j#>R6_STIJtY)s^Z+!+^JvRc(_ z7OD=5>m>RC_Cd_9$9{!T8Gm(Tzq`>%F73Po$Iok5E{)?8VqukX-O&-Px7ZTt>qb~^ z=@u~EnlcgLM!(Qr`$WSu@5;6~x?7nZ4b-Mm+6t8dx%`>5=4wONl2*g)4V0L^bMSCv zEYsh(9J@RA6jdTqP59tkyJN!PF;SaMin$l@UHc4U$ch#&lYMH=_BB!qy0ym}?iC77 zwwS@YGoRbuhkcC-n?9FmerJ_)mv)9`IG;QNBFG*_6f$MdPigr%PnB5zcCt)vajGPr zJs;B&8+Yte<8A+2Ty6Vy(&no_eeuNUWUOS1T3WIG{^kcx%?}JSbOOB*U1K49hWrbU zzEGj!hA)|23Hkp&{CxGWkRd~JNSw?3xe2GhT@!(M$0`tM74_mJ&#~s*xT$V{be!an z;Zo**c4fOD>HXz_)}b60SM%PWgrTkJfxXj={=2gBIOngYrS<+XkV)5>*KE>e%DW|I zb(fcSZbITrDiEci=gwBtrS;HIlqaV?ch99x_a;yohd_{kduC=XuvN_NS~5#-DR!P8^dyM zPZ6cx@$;3G6y_h0G;@2+Zh+g*+QH%KdnJz8CLM+fTAqmppURW3!$T>)2=}D@^W;3G zNwO~OPZ7~}XUe}Sve%844IrHgKhBepO>*LK^HHue)rNXpao#+q!}=Lj42)h|`Yj3{ z=1>$qycqo3Na6%^;+58s>35n=uIesbU5M+9lZjOe+TeX^Free$|MOYh!I*;cX;jwK zKcGzu^24o%&*!0J#tk;BJN(UO{Fo{ z=D~sEE~n|&_qAIHPl_AAwEj579_T<8QhC%+ZxnhCekPhu*Rx&zd?KuHxab+|e=I5C z=FCrbScoNBqnsm5LwRF6S;dIgzJABvYdKZF|2w(K+cQB%ze|*moF`BDDGL4>`$oO#6E9hTj!s zB#Y#<4-h`d*d8*1z(Kbg*4y;_CAg}rrB&oCw2gNhIeB?Qv&cEqVaVPnCBx(4qX;G4 zuU$vO1dA5#zq@rTskd)5|HE%k>Z$ zL9BZ1F~u80#hAzOcXns+6nAXNAJ*@c8m`GWMS4C=y>{lh*bq%kxTR+}`Loox>>{5J zqJHF-I)aP_3AWZnS;aR_^isTS&P#gL5}p%3e)NvZB>kA8{)Cfv^N}U#K%Zc)h~O7v z;kWY)!itpjT5j~fi=#f?9pcvzLX9Y_}noH#6d)|k(wVJp4`eU7qfps)vN<~bXIy9+q4w2QUK zLkUikvy~dqkKH(B?VS5njO}P?zZ;$87_jki1|m?v@MQUdV1(EDf{9 zj*)GlI131{l8&cz636Q!88fCPl0_O>Phb$R;5;ZRI1$Jot#tr%L?Jn+cFg?j&Oopw zs1PXh(#|M_%t>zQAKinaOD9#-`)*Kb$XCFHXZ?MTkX?9D5^m(SU1SZ5l1(ZOwk7Z4 zA!9miA$=}GGC!7^I&w^IRJy$-%&ru}D2zHTH}B~A!{(B7e8#djzlAD={P$B*&uzN` zb1Z$%yOK%0?{3-cC$^dtUkq{TL+X>S%}QF8Q}$>|m|SwZElJ(|JNTo=qn25-k~nw% zoX%Z{B&;2r*izOvi$$yLJqSJSxC6G`66kD6qeLk#UpZyaae6`3u>F?bn@F$E(i-0n z22&I#0LBWL^~RK$@AfIj)dyn-ZRpoiD-L`*1Fspjel`2#Kng}GYzrnM`zg*!7mC9^ zoojqI#T8XB50b_ro*o)1gI?gQDhuLk} zWR?=*frd#tw7~JAqoS}r^8ZowCg4=ITllzP(>BCT=A<1v;|@tB$&_SDNRnhqB}tMb zN#=PTLXkNXAr+ErQz&JsC=?+SMX4z1f4|@P{im*TUFZ8w9kJi%UC&zgx`*ySfuG!K z)-R)zk{xb-dr(gB1ZTaNO}JCba;N{!ZeP64)RyK`YOo4TO+EK~FjM9)n^ex2?p6)~ zy}tc6u?%|_RwlXfRT9fjw2WT9Zj55tflPpaYMJp6Qx*nbzMEQd$5%SFm`sryH>XFp zJ4Nc{F|isNv^-Bd47sB zWom3pn2gMdI>xwWSnuC`X%BD|OOXZ3M}>jrQU){^yM`wpG9{!NuX7d0932*c zHdm?3`bF7EpJI5er}4>jj<*C*uuTOZ(xBP*fCNH{w*O%>?FW~tQq3ger z^oHt?QN%dfri|SJ&q{XI*UyW#<@6#|S4u1Q@jy@|BXp6Tr)6=Y$EPVWeZtn#lKmo=6*dX# zAy#xfLzYC!m9JKG?8@M{vjtL2)TZRy5WV^Os`Ewohv2n;HVzUv#9PX)XhH=<=rSRb z^pk_vt1n-b|IOm^B3+?;(;?Oyu(N6#W^PwM<#TA$X8J*8Nm?|8jJwRK%J`b|AMW9a zPW?65#$4){_^xg z)I~u^!CTnko?jkOiQWDa(@v#aFl%yn(vEBuA?J-x`veNzG7pO)+3Ww;-erV=XmOk4 z;Vw#}mTrEHKa$OQ2M4(qXezB-qS=Sd%o2>H*c!+>U|D$8u1$>5%HXukX@ub>Lx8b{ zn~(h&bysN)83zf(TazOM=@1oV%5T@uN>(%_+qa7%3LVMa&U3;c-AI zYwPvBfcUt%fsDZE;4L}tgo#v=#XHU#dP!=Loxq((SlU?y7N>b9FVUjq=@k%^_|)O; zNTqs^CJ&z68uTe`5AwF%l+(Q@KTJ`1HD3MDt3h^sh&{ub+HVnM3*D{x?>LpvH~jei{397m&zuD7s$IhNia zD8VbG*z|Pbt3%F=*QNi$WkC}srx@&ue*mGPieO`|ja1SB3ky7PzD?BAW3L%U%*Elz z|0MBOf(?f(pHou_$)?xpsQR&NS%cM1Jf5E%E!!#Uf6YuyfuC1lMK79PrT+cok|DMg zF8(Cu159lTT)P#WrQ&(VBrg83%0N{T?)c{sm(>~iquw={$^HMW+{sTS)OF+5IqNNX zl=J5@3G7?joZ%h{>nu-N;4)hThI9$0ClsO2y6(Q zI+Fj~%_Ae!1sJl?u?{ok1;JA~J=|qntJ&NGe|!)MV1DYj>qzLMep|MXndZ0F`8lRm zO2P9VnO89r(V*Y8_A1U?qgK=$b9P7Oq5+S_`n60qb7O7|%)FlR#3llA93WLN)pUK5 z%t@1+zLGQPP~UK;I)P)uMirPuHHdNP2U*=KDdE;U?M8B={62VSdVJRp$=S5KhqVLD zd)hm)2gcjbA?-&tHI!;lR#5ysRyQ7BPJMkJvRVXVUf9i} zWl+;J!nC31tI!;a$T~GmgWV$afP~VGy>CQF8JED=P8>aTiqdZHy#OWNaRuDDNK(s; zO(w~%@5-K4Z&Ky7;oKxIaO5O2BhvATb#e#7y9)nf6*W4mz!f5U3pHs4XO(f-X|o>V z7i{awz(RR_SSkrtlPKqqZ0e-_0_nRV)J&?-T=q-ghr_~0zwKAwKWEZ1dUiRnFL;C8 zL$Sa0ZU_F!?>YJU|LMH(4;m8*L@2D%kReta7Q8)nfeX$ma*wiIw;sNHxehHt7%;x3 z1pQ!M<}MRbkLvFaMPNjBC75j1iUlEm9`7B<1S9VGy;I;QL*LxBi>(8H!rGDc_?|!u z@74r;hQp!f?&q!l+`KiqI!Dkb*)ms&fxavnW^gGLA0x*oLX8!ChVWr=pwxK z?(D_T&B1{|J_q=BOp@iZ5pnS_^Z;QvzmPu0#$F>lo7>2C1kT2^2Ak5R5&vsEAv(GI zB8_&5G{Y+n|CTvdlt7up&7Rcm1ScG9%o^>bu10k_DPzkAxHI|0s2UR0vD3qc71o3c z;kZB)Ju>U;md{gD+D@@To8p8MuE4$+dyqG-Z7ZCsf_|w!d1k*`aMzwaD}EWhX63vL zO~?DcUoH@gFEC#?nfe^9e^}E6uNF9e5Qu;#H|~{7%YC@ZRbG|ysup=7{eK#r0&HJy$)$$+Lo{0bd^q#T8 z0{a{cnOG{yY?V!GUV=Y4r7Q1Y{*(K;xh%FO{mMtZcAvBOaK7Kn>_;S<%7!QvQaur-4#``ts$5%E=xqu_57M{!2g&q=&GByo-Q2vqy_ev0=>VPyhE7PMO^YocvW9>khPAORjxgc| zu!}^Uvc7sy*Hy2^#l^KcZmJzpFf7|(5U2}f7u;c>y>-SK@cmcVI}!o&K6TKck36Pu z+fVh=`aciD=zNJf!nV}+`Zv@{fpebGxT(IDjsY7dl+EcK@6=eW_fYUDEx5U5K?el;a6rcWwZQ@Z9wL65Xfyxs|73m7UP!V9Ctx}d&J!TS zP>KzAXE}s5q1tV8?Vkmq2(f5jU&5)7`=GePDemh?ZXa^{1yx8nmU1w4CTv+p+{Yqk zTsRtvy$3;_!8RM9DM+#b>*Osb@fd+K$` z8@P8sUp(dkKeeHaRfFF^aO2_Sl}|D3o`&N(T<8WNKtqLw;VtY1@w(lt~gTR>K4S2sW$%4hv zC%fi;th^h*+l4?48(y?m>)FdvJq4&-)oy7VO4sdX-a@~5A z2GbZgNzFr;GBo1;2;N_v@Y#i*29DZ0ljD_(gvwJ%*mtTR6^9b|0T&I68I&49MO$A8i|}d`_SSfeKgA=3_z#vgkm3`pS`eK3Y|ib4UkBDi_=REz ztP;L5h>||x2|Zrbd%xPMstf<40se)F&nc{F^p4_hViU4~K{bxzV`r7OpoI1H6!UiHk^(?IHVb}ycj`JtDXsJT?EE?5(axr7H-bY{?f@b4xKf9GS~*Z zrwc|k*u${qMvEi#cjzS)Qa^)11xqWS-^VKn6%-ii;p%YqmP%@83Gi=sazPPoaRkW_ zZsCzM1I`dfSO)|J1%cpj82kwk3Bbo9^av2kH+bwaZMqEyQG%>P&>277x}9tY*Iuk| zAtmE958ofuQ0_hVp};5=Qd0PEp-+P~#STOmpoK-R{6>ine$X2XdO*JsQnY>K&=l&d z;sZ~F^PZlrZ|_aP<1k(Q;x~de*40HgRxvr(*`84nZoY8KR0is>I$PetAsD#L4mUtV zR05L(Y*bab^WrrRoRb7GdgTr%U_mXxju_oX1>ibpzOYLqJke3BL3TK)Bn)?*O=IuduG>LT z`=5&T$az>-;ypzBjlzUmpWrxR3t8XD;rnJ`#C z2O1|{)0Jzs(vsTOEzgD#x+nbD@J)h{&&tyBf$!osnB}260sYB7AoS7pq;@e)zoiw> zVxKI`d;k|#*R7YJ2^QPoMW>MORaFJ)<5G7Q>Yeh0>N@YNO5MfLIn|FR2va0zgx#NS z>4S2OZ~#lt$DhXC3jdVqA-9LiaEAcP%kazk0H_jhcu{XKkuLhqdHW*d!&wD;s`Sk# zmZ3=oSfvTycZHgq9e#3p4ml&~zyah9Zt2!f#^7`vy)wG@xLa@W@u8 z?mo}bw9D@RpTHC;3lX|-5eqoc56R)OTK&DA`2R8dli4{HwrWo=>`qc?-kjSi`p)0g zT;dJHY+2krVfqo__Rf_rj*)-yTpNlIT$LN;Kf7b(ZSY;53W^Y;a4x`@MUQ78 z+_1$`aFBXMaZqTHwLW}nbd&!>x<*!@LU%LYQ31a+@%c0v!?S)Z#*-=)Oj;4pjCqI&&fo$8jnJ;`ky;c<-|tCNh?3+_Er`RcPki6(f7i@~Yr-CVISr81aaF%WhIW*qbk5Yr(HsOL! z<`-A@j(;Fe1OR;g0lEO98oZ$`aWF{KavpJqQTRqUL;w6qNVmcACJY1CU7qhgJ@5eJ za=&qTy9C-)PMA0-dB8?^KY=Z|2;&*lO+twTPOb`^;BY<$y#`Jnue=CKw0;fhO7*dVzE_!?_j{FqeMqmFk5E1yYwANJ{`g?{jhCjoi8D&IyA42_p7+ zRP8gDKOgq0{rlPO-*0qe?M|RH{(iFUaRnN2Q2IyUR8tFmAmOKs>m1I)5H8g_{S(@G z6h2N%epis}gU?Nd|JvpgCJL!&C~6_zLQ*2kM7`CKQ}Xo}f^G8l#CdsoVje{6mW^71 zQuXI;-{a6SbG*C|MjcBxegJBsyXy3u_XF2Aj>_pOqI>aU!bJ`m+7+@p)zn~40jE-L zb=>075CY)4?|b}nOGY{jFk!7<$bk9UC|GbP)t_D#qug4T+cVdB!AlbaCqLZdut_Te(;f^hLXrh>BisOxQ3DUcSp-Qa zfx`HG5ufKW9IZcr0s7_3&qZGtAP_=bf~k%gvxNJ&>Cnt6yFYJYi4#i;8K_442&!>@T};K2;2 z^%*-ZD6Fj{IHIoaAJ>7x1#>!h934^@hmB4jymn9~^?uy7ybY=r&Vp^(FYxBY@fC%I zy-|IY=6>VvxCfeXS>GjC4kE({HFXHzBVki$=QCA6FynxY)YkriApvoIU`Iz-?mV>~uAZ^(@ie=eZ)F*j+2pk&%MmKohq4TaE}V^WL#5qs$}<9y5M^R7(o zN8=h~7o@Yw!bfxuYa)5lRi?9dEFmFf`1s<%vvv{&>jf^cD+j+Xw%|VHeT{#Age7OL zCTCjK2~PdxgNK;9w&<=%xBnpLtG(cRgB+LE?j$8`z4t2mt|t>3z#Mv~RIWd7cQW_n z20I2V2qJ6fR{@eDoS}YyM-txMJJ5%t1G2M2s*D{>9-tk;wJ0$52Fy`hHRYS=XF;Ks z5d&T%Q-EaHzRyQM)CAYC&V58jtn&4pBY$8DoRnSvKhu4Jqef_ektK5Z&D~=dV4x~w z4;q1du%xsU06RcM;^bmHf#w^>0yzNmq;|$}Z0kV(wmYzYKi*$}jQ5{nvxAgI!yCBj7moy1Le`n=fD?~!i&@rMuS zt9N}DJflL5Q9MF@V$w&d6FEay?fqG-^vPYJyVDt3%@B4p$VT}d*EyBj8 z)Ux(yD^Ew!3m7Zv$a?i{dRr#@7}A_SJ&t)q)@MJ6n?@M)Yuv?;7ifXJvnCM4@%&BM1B zt)AzTcA67Vwtyzzrb-~9{V zG^H6Rbv1AZ;Q)8Q(o%{q0<2hI7vZ{$s^xgXm9k$<2k;`2E-%m@J28)tn+T(5OaVWyEO-8c7ET7?vpj1X*F=Yzix#T= z--^rOl`34t(4wa_gtI8wi#FV5`84dB{%l++m$7o4?nY}C!^Gg)Y@M9!W9vT3B+^Dc z@=l0FwV(+*q9C-2bwI_5S~9w@pqdbgJkVurVU~ENhuO;U>bI1-Pr13eaW$ zlSh8UvR@$U#8$Q#V{T@ljlaE?2DE?aXh||9UL37m5E=0>2)(gm{NfxdN#6TX zXZ#~6oiS#b`1s;`Ko(u^#EUl*8FjyWUi-YRJUxJSO82s8EJlKb)M3t&XAk#Sy5BM;l$73nP@SDa;LFRES<4As~RcF_cx9F9@9Uirz+zzyG48PlC-uomsZdt}$!j40 zA_gJjHen5EVqzk`)5jC$H<+97q?|qT&5IGb0|V#H-(rxUGvZN$JDEtz$uzO6c6Wez zcu5JUP((^e0P6~L&THjT)V6P*@~VYxq2|IctNS;=(Ey{r{(_9?M|LqR0UT9C2{Uge zWuUe8m2a}IgbMuZQ!D#hs4L1;D7p6FDoji?=~-@V3PW05oHs*>o=rp`j(QME06W;`BDZh!kFt%K(a6 zG_bmFY*`%D>DnJaLZ}_3PNwVVe!Ae%rR`!oo-Iy)I1?Y$_55uK;|OF_4JVZ|Z6LFl zJ4w9hiSIZSKd5+DT-bend-MiYr4;>dGYe|w+jv@3{j?s79AdH|3m=JAYXAH}wVa_{ z&pB^K{jNxpjd>{PD=Dt-d6`Lnne+Ws&-~GUUiNYfl|VyHjVye2eS}vF6u>mTooIs7 z?BU|JQ7{TRSTot6i}#C)CUKE()uwFUz8yz1^vLGLrzcLFz)yHjDAZ`c}T_;INI3Q*zBy5 z+I9ya3~?NRTH2g9-R@@aDR01O^Qb{E&E3-jTLY=^4kmCOv}DK$+FNRQ^yW98I!rIv zWMa<4RT*zsfL;(&V*KHw$KjiU3WB2neGe){prEx}irf3gnbdILKpZ>Imsp;1a2O%l z5)7xBf2a20uEf$p#%FdARvJK@E^60pxVfZhXVh9h398)PNDah!N zpgS<5S2+j|aoQ=k9R7ss&?0ovUvO2`V>)yUcYg)#!?V|@ZvdDvtL@G)1(<$B0fn|w znEMIvwKWK=K3)mt7>xI~q_>WWtXVVat|}UXUJ*hZxQxR@f+5;Io3KwYLrTch?8<83>Pd!PEJn3qGHka@zT=LfLrZGz6iQi zIaO2hA9irK3iu*OjeksKkT;7%kNh&6TQtM)H_Eq=!vrE~%RNNI zB>#EkavmWjUeot%(VS6NWSfF#y!>_;rh%u=8!-doAX9H@uV$H9h(m=>hSkPpx)nw<656R ze-2}q!+j`8cy$o6^vWe+bBkxIlQK3l82M0L`k)_!69M1_INJ0&--9fa0QB%{m>YPB zg_V`}{G=IY2xe6f&dnSk=ftLV*aW8wYidj56hqKb&Mz&@0eJ7|=m1J1DxWg{@xwmM01iW+b>G^^$Y?E3 zE2PNy*G=elfQn;0$IIcEsdH|vuwC9aHY2&$EImam>4xAg?WMqvZ$k6?MM(ING#3_n z5k_{n`B5r?8si_(#uAnsm|X}NnL;WtruWWxA#sLT8t^!}6xiyZUu$ecx`0>qAoQ~Q z0s;YZdZUhNnO{6=;xqmZef7IA(#V!$iqCTcp8@>JAYX=;20j_o-W0=e6c2203CkL! zWcrgE*KID`E6WpyP!cM(nj)ID6dUSV%wbv<4ycR5(N6lS1zYrU6Bfm3&egDz+BI} zcaR;_*(yHv@$l#w_n3K831K#jJBy2DVZw@S%&x30YHHU~Q>!o%;z7gF`5ACstNSho zBoeeHTwJ%Ky~TQscsklUkhi{pmog6|ccnBiMQFkw0BeW2c8+P==-jl|9}MN{v`YD>2wm`* zTUFj)Xk}jDzU}D1cmz&v%1L*TmgzH3SPUJM;G~XDvBk;PBXejtW{67g!BqvkO2Bb4fAQ8B~ zCqdAzNU1p;X3#ksPigCyj->br*yTPvS zAmEk}j4G@BqGs~~c+#n=0T3UyLq|=c;NC!!Gv$d<4f~8K!KTCVC7uh(CVF@<(?1zQc?8 z6&J@>--#Unl+mA7J;v4?TpTD}w_d-f4gs)m@F3n0^pR+^a2M=TpKAsN12OOaa!g>{ zBSA5d&Ue#T%Y!W{~WVdRG(_Atk^e{e7(Gc)Gti3NXQ?$E$M7MrR4`*xynL1b+)y##eG4r7&E8d zSUO(>Mgo%9KlmPO_nf3~mWc6$=}Is!X6Vy^Pyu($`S{-=5rhOVLym!O5hb|sEk2!n z`{GPxnnfU7B$h$w>D&Ra74I)puzj=uAPWm~!Xfhh{giem5Ze;;Elf>`ome0h1141A zSVG5_5UTvtX8==yzJR3jIiq(u>BDCxhELtdsfDYaOJ{h&S2>Wik8-eY{jd=Sw%9jg zi=qQ7D9Ig&ajsLKriM(foEEcG4W!1u1vmjbP`|>c0G9UKkrSJ?9V0e~XQ+$;TBiH= z=e=^N@W>Omfz)!vNOhG-T}mis>)c!kP0e-3wn742Shzx*W5b3Gi;Ii>tK)Nz-929m z`;6Wx;&m zzOYN*Wppztt#Yq%XmJgqd|$=w89kerg0# z*ra_@Y~es46@TRe#p*t|`|f@Qa6gON^`-yMx!tq(CAi{p0(b3I6uiXmvx=l$V2;R} z&;%-Z{toEb`L{Q#xO#hIK52IfyeRy@(6mH5{bskbX(35DEI(E8mtGPs(O}C zlYI#FTY z5D54e7>jQxm0ay~?D%n(0sl=9U=S{UQ&T{TDZRP*lNGJv1NB$H+qJIoI0pRq;za`I ziFcGb9S;r?a|=cVbcYy9-P~Y`KKJME>eZ`}4Z+WOvCg*G0yw+0v@|Z8-l<^oCsUp{ z6le+YgWNfC*w%I#)(|&zau9^E0PqDI)5*peuM@|Q!;XFiBOVTo`q>Z7h`(rdJd4l< zaL?+|AY=XivKQv^IpeN)>2xJ324-;gfL&7UImH*$P>tppf9J^S1o-)4Rd!ZYOy%v) zi{HjTb3ku%`*x7EoM04YMx69w3m>d$?kcmrGMIg)Rm+Tj2U>7S*4Wjb5@nJ z%G2YOQIV0hSN@(a*`J=C?p*4N9(<$iBjL+&K*k7i1qcTqW8^HF(gpX+rJ$r@TE~)6 zU0hLGx^>)REr20BC@gQVsqC-2v@OLD?5OlDr!0{YPwa~#bpIo!s0ef0D4;p|Q@=w^ z4X7=??6g;Hi=(WJ4D$Hqyv5`Z!F8na_{tkHRRcH;Fp zsA+g#3FF?1f9OKiAr2DsC9)v2V4(YOl31!w>eCWoaxVGR&c+6mI`EAwQl%7q1v?;m?d6Tfn=+P)3Cq;K_J9Pk2Etd24Tj9hwktZZotwB`u`EV zV1$AnV364QBAlx>Uf>Zta{x1oBO-Lp8wk7gWh@5<&vjz*ufvuTr5B7KtailXPQbVb zcTZVgVc(ph*hzNPwNurR{?Q`C%=e4+>yiYnleF#s1$0WDHWocLasmPqC1H2Q3fR2DTvCNR5KNAc7i>cMU z9o;8SB7op0t-`9qu>!66ed~=0`rPbI01J;FziC*2SUZ{P4Yr0L>N(&0@ZkeK6jXo2 zx zgic+o5-STpR{^YNtwdui&CC!nQ7$IOAKBAm?%dS%MwvoZ%{0L?Kum}f2#c(nd096X zJ=NUopI&(LCgQqP&!OEhl|h?x@ksm{Fo@7EshR}kg^oz~a5mU?fuS+vh79(k_Hqm8 z?^OQo`XMSNb#^;MpqM6%r7T1oj)v`(7V9=OcyYWE>p3h;B0Y6)zG zN8wZG_pf4X8DrC5+;*eW;zZeh_0b2E%C36cGmjoUDld<}*8m#r?8_hC>L4o=TflM_ z?1<1NhXj4k*0mS14LV@7gNj803D3#V5y4aLsu`$S@RMsBamOFctrIc7lqQYUs^#sL zl1n%}HW-<({JMx_%x+Pty!l#-OINX=iZ(zONK8`8Y zLp%=tNejNq7{`5qHK9I#fL%--)_;aZxP?#Z={*@6bMo`^J8?p~d5e-WsdOita51qG z>oyAuyttj%k;3WbH|k=nfpE4s8tDHC>>RKL3=3 zqw(!w6a|;8tPiH+_!4UHF+vNK_WUD^`YYdLpm1UJke=Q?@g2&~mv6B)XnXz~eFjkI zj`sHL7rxkNYX`KBreC|p$sPpa!zdP+ZuhNm(vVwfdR~X3i{Hm>EW?jmAHA+JIwEuA z(T;myZOo8?VRpZ$Hjh@0DYiIqt@0>;GBQNtQ#Sv|toS7e%R4Zwit#8OdFY9)0t%tO zAj4S&5%hq~@4+`o{W}KQ3a@Mzj`U-yHo4)V0*&t%UtEAX25>mBS!t|UUG#2r?h$Z_ z$%dq?EEJ$epnQTy`VRaSgy@|~IE$$WxG5@SdMus?GCJVw1e@{`U|`>U<4S(oI5JDn zm0Me}OUIlXHx3p&H;agy7<>mH0A+D5U^$ew61YG zQJuoZ#s-Efe!_?dFx66$lR=ZqKKBhgWR5`iqao!^BkK&hQmi(xLeo+eTPA#ZE#$yX z*fRfi$y%!NA48wl1|ywFz(Y%kllw_@-M2G*q=3M~^xUrJiCc2>pRH07_g_(@PIm&0QdU-0TDn$P7_FyAjW6bRn0R@@kLLvx5aGc{8z(yjQnM3+3OA)b zV|zp+OYn0($7_S7t-Ro^C=dl$!yjMy=hv2w{2I8cO;5w7&3(1D*Q3hH{ZvY}G2DGb zABWr1AeAha@2CR9Lu>!hIC7APk1{z>>u2(k$ZkiOkJ>Yv4ByJ|V;c}5y~Zx*#NFO0 zd>vp#(8pzPKQzwC^q^9-tV!RH#f=Ni^gU8Bhz@BQ@$zy^u>X0WQN0#`4}_iX*nplC%O2nAohs)zt|Y8P3A7aH)dymP-mD0s4&-EjY6{T-2I>l{jHIOAo}NIyaqQyu z85E00BTKyyX`N zUW@QOD>?zjp{Yfp;yYlEh-9coXMitw5PFG7KNvI(%!KZ-P!YwMS;n&altL<6Lfh(- z?lprjN)V6x)g~DSliO9Kh7tG3s3_Q8Tb5c53=R%9^D53LvZju zVtht4c;tS@>^fCuM|l1ZGBOP6*ypUX7))e5HA!rUmL?w>$QPpo*MuxUEI z^UAXN>*oYwfIkcTH3PUI%zu$+`SfO&P-N2xir{0!U#Z(V1bLjoJoxFxV5T zURi$h#uX5?Jr9lRzuXnw@=P>;MNUOh1SQ}$;2Ydp&#*pb}Uw<`qvRy|bDu~JsudEzXgcri84$vwT zQ`o#?&yKJM91tO%u=8p|_%7mjvEo9OQ7z_Ptb$-_1s+`HdxC?H&)lna==Q-fVnK|^ z*6qnMLAR^jM*@4N&+9my?wvM@b)S4*=e!t+_cH$rp4Tvrvg+)3X@V) z3l_)V_}|y+x}I}aMKCJB(8G|d`Ecb zQU#__1VlRHZyX2fl32w}zd>h17-@#hOyNr2bQ`aqwWB|RJbs&2}%jso} zI}R9#_GK=9qI}@L0G_S|kRB+Tt3=3k!&cF9HzRF~suvXNQD@ zU_`{7`wN#dXgPvWErV`V|Fhpiga}{{Aa`98{>c{)ms+|qv$1HKn7qIr?;9G5`K{o8 zt|YHZ>57`^6)t&wDmI7LQc}j@U8g7M-De?pIIkP|P&l<7HSY2`rGYyodp4K~fXLNg zz-N309SB6xqkHd#V^uM`k+ms~Pm*CD-nm&>8N|l7;)&x8CWWiV(Zcq-+{bB~wkZFH zKk0HGl^pbzUpy5lEatrS60^Q}E3ptdwV9$%w!t zUyLYdr@`DOm!ug>y{20QZW88>YSEzt56s|n_^67Bi-`pbD2bBOjc;Ov@pi;^EXD8@ zGGI=M7+=B}M838#ciWl9gjG9ZAd-3ibwwRVE2fZuNCU@h)9hZiDq*s;95_39IJ zUx>RW2#1Du>Wf(Se7*@)oxPH?ayp46Kre4&Mod9QjD#Up18>3C5sqHEU*M76*Hg&K}G7I+Yv>=?Zu7x%EH^{LOkfBy~`0P8_P zDU402&ng~(dlDVZjbuPv{}lBMSm>7Axr3YVf4=GjF6rQasn=6gtlxxsI_8^vzpqYK z%fxpSRRnHnh^9|YPs4-&X6E=`Ol1I1!Z^!WC08okb6!`Fs;C%84M$62b5TvtNowxtYzf0Z;}1lA+1 z|6W&1F_rYix2)D+iB zR%h1sbH^<$Ut=l)mjT|0_@>Q^!KH%26W2W2Bmzl5kNV1Gi#7#SC_lguci7!}83C*e ztgz|x@_Jxf7UsrTn~n6aXn=1B%3394VLMLaD=s78j{43CY#IT# z!w)&vym)x0Rtv%*(T0Lk%3_i?ELhOj@8Ey5Rk7ku{N+#pG&Tx*zCA84Hwwz z>KNbRs2vb}cOMq!u|5>B9LGS<`GgBgB1VayRdAFpciJ z;E;_q(MSa;61Zfe63c}D$8Bl%<3AeF_?X1?wRN7b6kAX!7`6a$o<3rKApEQ(nMErB zJQ+c2G}OCU650A+K%fuSgtUIoGA9pLxfvtWipJ-lWnUA`XS%Q>aMkWRf{QjzB3;H< zg*)7Ax!hcUnuW}@Ko?JUe*uYW{7gd3I}$9Dh4;O@#2T6-#y-lym!_8od&PMQPgqmh zY;2&`{+2D<5+AGry@4+OCW~WSzo-eXo=y&BKwy4p zbj}+9u$LWm20}O`VO@bc&&JX0%{%qd>CZ{p!;kHYa`KxbW3HWm0NG<6o)jv7wD0pg zW+^0bRXD4B@~TbH(5qFnu~rqsdzZg^^HmG)1gzw?amhxwt3uIcb|LgS+d4}BwcOh} zpo%{dAF7cx5=eQErhIsbBK zL52m6%&dUqB9*>>0f${PHWV+Pdy{Ct;R^ zp@O-rHf4B%Bar%4$g4p2?oP@1$TnRHiTOFvNu}?fa94Hzs4KTtklL1JKLSEZ2YaT8 z5G+wt+BzA2sM)ZEAJu@#>``O?&LkeSqED?hD>!+wPAI2?4BWfwuD8r` z>q}-bv*vE$#yozuo###OaZGYOTEXR$5e;93C~=F8-0ZB`Z2C=~e>C3Xt&|Av^7qAO zx#tO|Op4)Ujdkz~7L5TBylI5`J?iHrD@W7K+!xpxe(;I-9uP+z7QChD|L*LOSt<#e z1Tpk!V2u$kw`fj$V~&!hq(P*e<7u7WtW`JYHGv~aoZ-sK%6IbZ z1M_Ihy2Tcb?|J`lB-?c-x(!e(61=Lc=w0g?0{CpUh4S2{DP5%TX{R2?S3Jw4+d7vM z5NO45%oIr4jvZ_I6R~3079<&RSro1(f?WLq={#gX@N^(7XZnKLiq^=Re)KR)i!NPo zS0`JAmGSR5+-~#|Ckc+?OWoo2E6!BG{67hU(qxt% zzG;ca4-KX@ReSQT#(LW9wqMP}2qNXY|BB8EWT5RomX>_ct>K%ITK!OzF-5A;>!An_ z$3PU#&rczNb^@;e+zK;y0LxdquUFgF_#kz4#ZWtxo7-8=xU0t!v z^Q&LibrvW$KDFbOyYsrCb#>TszIF(swMpUr0(0y+qFT)D?BarV{#*$XFCk$DbcNj6 z5FN~<+!;p0$1C7>jMl2mY`OrGHE4pso7k&_?YF0$)ZPp!I!k~S7S56Hv(ks!h@FPx3jRSkxdTaI<9iYDIznezG>jr%pqR2ZqUkRE8#KZZOUNyAGr< z2aG@>Vq&@{^c7OM#<*+w6;cUl{wvA_QteJH8};L}3}YG}63pz?%TEI#mq-YwFEvd- z)6_buJwQu+7P5z2!^fZIuqNR0z{Em8fh5{>A=YD8wQNi?X^ATtb3A+oixU14?$lWz zTu+)|46xp_SYXiczOlkROme@wBQwq7=Rn%m-xwl+@E`L-Nh?s_klyg9;5PtG_|sin=)N}DxVQE&))i7j7-wn>OagD zxI2e3yOnR-f`Y%T(m(8K3^}9KXTgWn|2=xYF_if*+o0p1jf5;W$&1au_5P^Au7{*M zN!})1@}xMD`Oir)X4RNIJS&<=a{}{Ie8T+fQ|P$A3VNZ=vi4<(FKciutbPn22Bq2EUKkH z)qe@xQ54E{SKn0YQe6MQpshA59Rr~fZc?TR)HUd@l#CRt%Cq5xUTO&+0xOkDs}gKC zv61167)}gaxmraNgEWdq%tcco>RyPO9ZJii75%sfO$zf&WiYE@8U`UwM|(0HP~lb= zFeU8mnJ)3P-NCX7%`N!c3k%h)qu4ltP=bv$I6)RVfcbJDc0yqqmDe+8|HWF{BOy8LhLG7-p?>92szb`4#dU#(T zm8svff$YI8Xv1VZ`(9@+spG1BU+|E6ai-o%o}Met&%sYWdlH4}-sW$iX=VEN;?`<@ z3esPvo4q!h#dCvu?a*W#r|4CTtP9NdF4fs8RSXwxl4luVVnNtAg(T%-vqdgcNs2MD zV8_rg9buW${E<5#xYLV-4owLz|22{M(oc`I-xsjw9TxN!erQKKz|58K zRco2$A&r!vdx&X<@qMx}eAPn7#LAi@47mkUBq9vE2U1O4*>0^?2l2~ZHDQ(1)FH6B z46_3kD>8D@MABC|ooF+(@YD*97k(-UW<^rN{$O<;+0sC2#v_U^(>};CnxAmUGO2f} zGOHgq-8*{5z(9!QVC3{>erA2K_;(prz1VgYN4NAub1`p%6aAb~{6pIL0Ljsnjn4L! zq)ZmbCu)Z%Z1!3HlGHq1+5vHW0qyj-3jx7Ty)U;Vv~JU>Xfgh|-Y8SBJb`Ix*+cry zKgp)TvVBa_B6SW~ z1lcn)eAp!oiQ8i%2K#hl$VO(*<3j*L8%-TRN^Eg_>co>I)7R_W%mB2fevwbj3TDt( zfANIvg1bfW>V*t8oK1U3nhIuVszh*yeQr}wUVbZ%^70u%9A zBSNiJL}3RAFbOGMzP?Ma6Tn| zz${4#-k+G@FM>Q8d4=aTe_txwZjln&avv<&POHTHkIAxBvs(S05_uyxZ9O}u74 zPiMQzuFll2by4$UlDD#cx9m*~ExQg2{dW#M)XhN*Vbxvs=k0m<_6KZ5zsk2pc}19` ziG3WZBQ?N+F1)cLi)np)T%tbj6{Dv?4NrBx1V_LkBT;w#RG|Y&s^-ITGEY=-XNrnOYpYbCREI)H}`Z&Tqn94?Dv;HetY5nU%OBuI>8&75n*wGL1 z#vT7rl>OwaJ5;q;B{U0?CD~VzidRd0&ZuY$)mfk1*QmJiv+~x>{qgpUvsdOA*%G33 zg|sV=RE0?y8}I6%0Vc1W63$SsdHdnZ@Q?M09FqC<+TQWXmmbA=m(EIiA98PHPHdlu zEEx;?4T43Ku0(%I(7Gp4(S>9+-$6P>&in5sH#8PA;_F?g@3r$QsLcyh2_<^qf!l%lDJ%z3 z+;Ql!QwP?Nn;S?agWF|k`NT;XizmRYz*<&E1ouvXBng}yUp<&9;`wnbdWpPWjmvK* zzF$U8l#HBQuBi-gS|BDTl!S@!`0LMKw6#GW|D@6XiD1Z9^^yUsf=5 zlKBE{5(Z6JHTn4XWa~>0$$}geA!lICJ{tWZ9$be~%h9B+Ls;&iqL|bdH3G@A;>TL* zRvIp^g(LtpkT%=|vx~gpFns5z6a*72_-d3qmf_tc%CbXF@9tlLYZjm^I{*97&Xbj| zCn^sgw*4~v=q_qigfAaG+oIPzyFiem2Q{=?oi@(|oaA9~toxRLsG(E6^4T*0m?R=vv4h}z!Xyh5Ds+cJwt zplpj>PNLxbaqpK2KSDRkY~}N+g)<6lPh=SDLlFdD#Lp_vb4XcKB=xB#6}4vk@NCBL8lCq{szNJA zho#R2z4)9U&XdKcRV2|lZJI>A&ujRCpru27_$K`o40@8h?5NH7A~mMxp`HQtz}T2- zWW8T>-Pb*@BL?TtK808%-r!AJ+m-0i8LnI}(b_FV)w#1fj0YAMDDHUdL?H^P-LIx`eE!w@cm z!YdxjpmF;sinOW$4F!doRh<|l<*4%BICcH_qnrrTA8>6@8F90sU5Ng!y?$uRwopn6 zmzOQW22o!gw-6rv^*6d5w)-9=QN@S81T;t1`mo<|nw;+aVK;A;LbP;D&EGLut zgb{{h^1BhLo79-m{`B@s^Nyceezb79Un8;}DUMR3dl`SbPEMNas`zIY^xuUrvf>C& zw&#p@Wgu!@)H~!`c{+{b9i}1zRNz=FRa~3VK?Gr`o%2 z$cQ#r?mHhP5-PJs=sLc0gJUsIt0hEiG0C=*4|>PrD@^_@5Wt|t*I6bWr!Skp*b$UZ zc#oqPhd?&>@7bXlO>c15I*0Lril;Vs?qCg&Nwx|stfkH|?PA(?i~L;GzAv;ls#|XG zqsV}m+9zD+IS3cV%Y>|?=_87MQ%43SonP(@^Uy0{#!Zzk5>8-rb91XY9w(Lh{e2a1DMZ7e8Y%NUXk~?G#oa zDRnZop|Lg0ygcK3f9m?WT?`z@CAXff%(5u{Fg_@vuwT1M=b?Pjd;75cm)7u9yO$=K zFWc#&MbJBdcBg_PiOwMEh^Nc7sj;|8TC$8YbA{a4@5smw3NxL?rg z6Zh`n8Tn@FmJmC(mhChpW*U4#%$V>~7F8xExfmE@dI(_Wh!IJ0YzS!9^aju(!8bAIsInO`{=C zHkiu?^0Ds4_i5>xdyjkxHZ_U!f&RpsfBY&XUWJMZ4MdI;jCrhrbsq$Ihw6Kwm30f~ z`=GmFrxbU5?RNa2;U!Ucb&!Qfu-b>NNp6YCCOW5tmIlWiHKdTeFI(wL8F}}rIE#*@ z2EBLt$(_|4>^Ufi>bHTbk0APtM9&ry!!m8cO?b*pYp85)3}4^8yryaP^V65qTZ7zA z>k0IS)%$l%S*mO$>SM06iGh3FuZ@~}o+qSz-+amiB=ZHu*7aigvh81(?(@)VdvkB_ z)C=+3qCTWkyk2GYq{Kn-^OD@>);E7=lu)lGq#A5m;B9Z|br6vY(F%!>eC`UChe7Ak zn$isc!S)0~gEHHrxYw@@zc3MRVvuqqkMF(i&zdGbPPO}VZRi3hE#e}0he@r7+)vjW zC%{J;3^c2it7_6Y8#+Hq?|FnFnbvcQVLO+bs^7>iHRch^E=4hm*NlFg{!G;TbP8Ac zH}Yn-tNnqlF-$t2HXdMoxVE^R^(OJ*1|D%ODpEdfD8xDpL=WJu|5GaUM%`j)1$x7` zRXg@`&n9LS?$48X=uv!l-Q;ekfa`SB&~!^uaYSLNW-FCYX~k4@P1EAaTc$|3U#l0n z80fbVW66aS2hYGc`De!uV_u*c=-9C?c80k0y85#o={#HZ&%Lq5f2n&c4Ig|-$^5;x zO!W27-jvwd?P@%}PM+#k!gMaN(=X*694AN1&VMmpqgOXFJom+eva(74skgkcHy96A5$RtA+`C@vD|3#ddA0e zn;1kG*Hhni47$ZCF%!YuhSrG4nsh;COl*I8w^Ll$-E;+>t<5(+Gtj>r9L6+sauff? zxNs(aDwzb+%r1g}ghMKnPaW_Xf#8MzYD|IJY87y1zwfo`k3kz)27`3eZslr3>pp;r zL~;ym(p5!k(6Q!IHI+Dsd)@3Vgz_Z57P1=(n-@H_Uhq&%)BH@=4N)tZheQszqfUFR zWi)26I*36(UM9?d5{>1onG!cMYjcjcZzCKL0ZA z8*h{zZ+^GV?-MNan+<1+nRftg79?HJm2O6?IetZdlw95lwZ;wWCpSL9Xa z%+#WN=G_5H`od5y$q0S zeyB6$xNBW!7Gs>sEl1bR4xD{6uA)6_;c0bz7=z^A1C_HpSz9i>?F6OD1Fx5IZNC{ZkQF1Z?)Q?xSQf)xUiaZ5e#__FIK1hx2Pl(}$`iQX(iZ3506R?{U~rAdp2+u^$j=-0>=o| zg>RftQCGU66%6n;H90mG)jmq5sQ?t!9WKx-qx&Z#&C{-#ry?EGmQ~AiS-i!)Ih150f16hr50D8BE2RG=<^1mz*BM~lOf3>8D#F#v=b*vo52 z?BiMdRJ8GeG^-toV!n_F&w;@jo{BmA$E9QTGZoW z;X>=49wPrmTqCZee9FTYQS`zSZY6`B4R7$kL^%6h?X*FgG#Jd*<*tX65=QXT>|@$2svG}Y z!Wi$ebZ=D+Ka@2N)%LZBD(Z;mblEb;)b^}#xTcMk$+gy9qL?kP%hvJvLW0=#p#Nk8 zJl|Y87dB;u$gpgcK6^DF_bUS{sVhAD_xm3+ATNofdk5PM9TL9 zisfIE$++}q64{Ac&GJ&_)h;tPT^B#fpnV~G$?%xu+7N4YIJA4u zzlb0sPJ?S4(cSa05rI0z9ZaZk*2&!C_UpWUmu!E%`N!6P`76TLe@AP-YE#>qWFngJ zOksQ9tfbHwSAZF>J0g`<1Ax)^8OV331T5-vaT zd(k&W+&bsZDJ8yfKXqzf-xnC~APyZIB<}2EIwG48XLKrPL%hKW(O8gP${KvilVM(5 z@W<`M%Dtp7ziQbpysiVVr-B2dxIZ)LW>ddMT6PPzg63Nf8?VnER?n>5qE}{SN4DAB zBz_57jJLKyiw^3qD}4klaz-aOyk)ydHAfLe19Ya$q88mPrI4aKfR@68?E-vnzm_v31UDle=TG&iNYTDnu z3%kS>#;}|)--!)Z!3T0MDEm-ycMqBxpzB?gnduBaQiZgi-|;N__-j&!i|d#^F%aKs z5(9PEtOyW33@I3Ij^HuR89Ih*Ug6N|rY3ZbarJ_)QUyA7K;xSh;UMK^rBRXCR(%X#c-*QApt=@gZf4M37i?4Jzhxp|kj>am=+vvYGmzmUuE z-!MapBdW*vw9csnS$L3bEwZ`|-PcceBDYH+;nwQtS3mt-JvBz=kj()LI|uu~tlLQs zBff}U+DaF8MKG4~=t`CLCt0OCMp7weyR3A)_R)o|Ev{%_G~x%jRX)~S$Sf{Y z!Aj`hIS%^m1j}B-L6-KGz!3>z&=|wszM~8a2PxNC6t7<3doRTm9^$UAvfkC;gpz*9 zaq~^hy6Z@fNGHfvItP!0W#8hhI!MibH02n@xBHRh^Q!Da6rF3XzYI3(d2QCacj5au zIW+gCcik0d!s-?emdsaenV^0-v(z&m#gKP!eLAK={g?9{SFouw?Klrd$%@eLC&UQlx1WK zlc|mYdtl4R*DqhL-?%}Yk=c8)c4e%3R#7;5bYx^5!Cs!f=>$`WLb^#c8{YUY6?aw3 zDHMZLGZV?nCngwk9UO{OgrhH3enPM+{2WkC!OQ1Ujt+Wc0|;?IjEIRnc={B9budQ2 z0Vo-7pqLb*I0JVS5W|R5b|{*^b<{m594RswnS;T&7iK584g*ETnuXP%eg`uNfTUT! zN=WW=kG6ZCN$Go!18DS%2so!O7F2w z7$8=iq36#tva=I{;iG`RJ)z~yBZ8KUb(uV0WU|@?K%H=32E5{JpPhVlE`Q`dfWE<9 zfgKx7c}(n@9pA(AgQ*c3aHs!Gr>s=u=L1gCoE?uQ=xsOaZrE$MBjP& zp_*_3RDRIfsZ$7A-sjJQoD63R&Aph0=Uro0_~HePl8bD)JPQp#1#!}R6!g1z5%iE{ zu0Xy(PX$J5PS@D=#^J2%TWfk#mS-{{szTqe^g|`wdw3ebE4jrmG=uRZ1|aQM(hA(g3=AH4bc{_E&uc-afSPum7M5+mPXjRfSRW-4}xQC;G$ zY)xtUcKnmbNcoJTb8TB+DBV$N{f^k1PpMLeMJ2y&E#eeRmp@2}JN;R|BI>k`;>pDW zkD{BZM5$`ZC&jd=8QqSNTs(KRk6+I>Zd(7~$cAmrP9+Gzy2C)EUZLx|!O*x(+MoQ4 zYpec2hx^yJRhm#X9dPYji7;f2bKCBk^I1Q8_p^?AoApw}>%y0#uMaxk(C`|+YCeDW zm1VlaF&_Q^QN87edcreCaeC!g@8#-=;bvVutF=w<@99uQACe**IOLia<23J@>xfZS zBE02pq>#M^i_)QmnCgbqWo%w_icOoE^td@doWi@+Hjw!lkKN0E2pYs72W(UrXhgay zEf6*2<>dwZ?hBNRb45972m@r&a@Ju?br2h8qZ!b^7yNBDCJ6!G>s@R;@EJBcJr5vIKqAZKW&-3GTo_W^z~&08eG z?h8MElJO|0i9mI8rle!Dfu?NZS`Lq$EoI0mp(^q`{wxaJ*{+8mg`au{DkN!)|P7(^#p{ zBuYq2gF^#b5SqK#5@9G&LwW^7uEv?0g@w^Qm6esXfp8`94a96f$YJrnw#Pz4u06<% zVY2+#J0Uv;xFMP5wYg(xVPtYqF{UBYCtnLQNbU#xRnS;{c83erDbyah7SdkpfpXj5p<-PIarn7&Pgc=0-^4>Dwr@`c zDG5wGBssrz#a9bKG)i=sEiy9DCV^=ej{Y@auhE{fNdp6z$vGx5u^fZ=9@_w+4bOnp zqwyV_oW5f32EYgs^-thi{^vK)ii`HU0!smGNLjiR>fu~tH1hOuf57o{w!s1hB(HYWZ`@qF( z7o&Su)1dHdb;QsWs8QUxxsAK1H@b-7&5t%D`HP;c*-sjhl{nlf5Oi-wr2ZERi+;w@ zGeIgr-La$su11z?4@uHaPd*BO1A1f8d(-{A^M7n&cZZ_yQPxVq*rN7Cl7gn7LfLzDM$Jd*VX6i)^V zncOXnUHh`9nib-km4uMjl-Mefx6(SV9JO7~7g*e^Dbqe+rNU-EXKiX4xSOTYa3#KF zVTF@YL{-he6$K8cxMrurJaUa3R28eZH&e_p1_17HS=Rm}NQ$;$1Y)PNBrR6Rxc2fyO=T<@J z`nbX&u73Uo9#$Fxzqjc4MAeEqoxh48La%_RXH03UqPc{xUBfnoWDR*(=V^zIr>8tO zYwABV3Q!8lCIHx((gqMq^$7IPC4K(D=@bUY@cjs4fn%CM4#*oEoUzx#ST^{5$GHe% z7qH$m2Qv6L7}uSDW{s)Du8-bkBpzTupfLfHXAOa2VDalN*jp;F55k(8TL?uNCvQjk zwzq4ZXJ(GV;dvRg{fBWH<`%d`J4FFG+ZWcW#m*lf5!C^zGnYDtt%^qOz@r3BCUUvC zNj&vn9IlLel?1~?lxP1fS*6n`JFt6UU%c50nJ^YHF#IM1Is_{nH)hiiAyxv8{vA7a z=2@IFGKxZFb;l5EI)j3?ZK!s~`}c4{!ao7jOu*vs7N9Rc2mynN-yl5;mzR+p; zt0Sxi-A?4B!3Tl_;Rjo^@-OTMp3HEsjCi5gE|%SxN#7I|!4R-Hx-sp6_>X4v-jNgn^H~W*HMmoO zU52MW`t>U_LlCff{-KoY{;Gh0vu8^v*;mYVIfZzt_+yzn=s_Ef%pBl{&;MOo#&%GN z9b3gi2B3JLKn6)x2+!d*F@h^19P?ZuggZ>qCrM18RJ=HWo6kT zk6}&)_XcifTp5`|ics9*+yzq)o-B;c?iebAgp7f^V32lNlKQ3RrKKCK*}oDn5c)w> zPOQAV^cU^H>Vv#no`3uW^&_mE5e=U~4MTv%4RFugp5je`lVo&sbmC+A9Lhg}7HVQR zqG1I^S%6x&^y$<0Zpx_BdwW$t%Q5vqA$P0K4N1LFfx*X&cNAwoOoi)N30QsLVPH*R zY2eEO#{%3_c+=gK#WczF;rUf--(_LqZD; zKMfrwJgPVZ@kSs6Q_2<$X^a!M^R?hGGi6y5yyj`Cyk@Y6h2qJ>hScip&h5cOXi);@ z$_MbmB*e$VDTz{g-Gw0!uq=u=AD;%h`gPePI?C?Sv0fL~C(#YJuAdbk$$h63pukOXg9hc{CmuUwu z!`T_OAa9aQpxmnUqFzFya)KMKb3g(?_WQBG*1z1oe&5o-#!IcNT%!FPod56^!* zTPU_8J<)X!I?8B}fE){v3s*Ltg$fw2Pr&kY3UH0yppoE~Hi6^M%L}0y4xNxcgDGC7 zBYFWP>rWrxesLLgeIl@745pk{4Ct_kok@S3)%? z+voNag2zvY(ZbEIpg;~>KR{FZetP&1Z^j)Du>>&I!NJ*soD7(c@ZQ4b_BWyWp^Jk< zFxeoRUc7Fo5SKN8;t}aoUw_3)1{7@&7vO|?kBS#`Pc(x(kZn;m%muz4o;RrHe)!RT zmCJxWNYpOU$idh?fM^)UcZ+3ozW)qMvhe`$Gia8%0}5VKQv(MA%;m|+d0k_;D9|vf za4^E`iAM$e4Zd1C^xSAP7x?PHhCwofIxP7#!|yfhW@oyLcERsE4#-IinFMw4Uqb+# zM!f8wq0}fn+4T^IH`orq`a^9Us-1>c9gM*ar;)Mar_cZHh5SQ?U;EE+zrJOHSjW@VC#(nX3e6yT^XzzQg=c-7Vh^VX_JNhjy6=!jNk7l>2%%)Vf3 zKyDk^z!Tkg@GdPM!sdlPQ2S6tWZv_0ZKiJ3eK6IA_Y7h_T*`3kz{`#1;`901G(Q}Q z8Vk)PpZurafM58`S{){=XVzd+2HEgn8#X->^e=QL>zE^)|3h;$U#cmELOFEk9I6EL zI^-bLeeptAG7$B?^$UM+!zkI^pjfOdq^#5|>`88gM8@v;WJ;5c-A#Y>0bI85BHP#q zzcPc9elcdhC`bohg!s zfiD8rEWF)VJb0H73YCs4pR6n-G8Q@b`tCQxcDTH5ZM}zZHDn@zZn-Kgfw~?svVTe^ z>F@~gEmTzvxIRIeHl|z=I!IpOw1=xU#3Cp8_H8V{Mlgm}vlaaS$w##3b6J*<8hk2z zFZ{(9@+`{Xc86hGdzo(?4dN!#dY1`^(JZnPUGr3;zeUD-4NdU{@uG- zz&r7+EWk5^ur4@pW7uJbP1}P?bQj4N<^;eD{}j;>-Tn}XLEckc;rdnz*}7ou;l8e* zprESy7iBmmovYxln7B9`584kpXbT7kZ}6^=P}_P}DW|lw^x3mJ{`|C~0|+l2Q7B4K zHPhX=tNQ>E(Kxfg?l{?YZ!dhbS?myDxBK}U?VQliU7d;j-xlJ3iM}3EIeZHAanKf$ zS5iVYC(3Lx=~Z*{*!cKTi|sN)Smxu$yyq%#Ze!Y(r-yq%`!zn&HrGR@{7|Xk?X+F~ zy%8JLlQd0YR$d-Z68QTZcL08Z<^oQ5*ksQ>>&L=FjR)Nw;)UJsSWdJ!_eFgcfMU+tiOL z65k>s0$ttRaXhyBzaRIJO*nwFZI2>AYRn;12~~@s1{qF{w14V{r<$9aQFqf4dd{CO zef$_wxG3Ga(P@a%LH7=U=LkiHYyq8Rs^A~LOExx$)eD}ELnEtdi}{QxRqGQk+5}x= zD10m2KR(Az9ZEUabAe(&t{AG@7n8L#G&$}Zv}Pc71|3m&LP)Il3kp0?_u!n@OZ$U0 z3RVjwv8CW|BC{j23(PBhtV`UOKuH7CA+zi7v14zBJd=zwjWa{aDbO^A)MRC4ffGg6 z)eVEIyk!K)IM8#T8Al(yWdsc0wz((ehAVS)8V2R-izbL0A%qYXF9> z29t^4W4v`8+H(nO9Cl$VKBPP+zIlq=G|VN?8a|r$Zp+d)J^USz8K;@5A!!2ca@1+4 z==hq>vSuST;io@aFkPc;Tr=F(-YnqZ(+E~Lim-~%C`DIA0rlnpa+%;@udzgSs^eCC z-`CRY?gFG??;6Fm&LRhh7>~C<{*Yb!(ZCgtlZ+)}m+L&RHCAyxFyr0mO*#;g@+=Y) z62imLAH-u#OOCga`Gt2AkZBb(J@6$56T!+iGwbT^HeXdP`pVQ?2GOT>cnaZ|xu|kS z>V3*90hvut*TE8OG2g$x0W%mpJU~i7h(bQprN562G8jApaG~^V#8vXk#+ZOJ&#b>$ zqoS`L`j++w;2N|Zd@DbpenD{TXEcZcaDg#SRy~KTG++zewy-6|@*@81K; z$R(&koJ=?V$%kVzS4nmnZU|J@3Vv|#5?l}>2s zcn$U&awbp}i%|a^GL|-GP_V! z#FCM%glYm8zI#ux%n;$~5*97VaO)HV>9QirZp$cQ+6nkCO>nUq(i1 zSgzi3JGY*LIqgSSCKoym?4f7}5wy^T#ywUl9yxzFoB&mMj+Ouon(*w|1uRI!3A#SH zKOF`4`-+2_aHD zXz?jDROG-!0CF|aFvEoL%$YMp?s?ku03GyI_$xXZ$gleLEvs!5i4m*SSq93U^z{0P zxt@3L&;v6zGz1FM(aEVbaTiDgmnLgiXzdZfS}Pd~5Kv7n|Bk~Mn?XU$>`R9ttSz(v zb_?FX>;u3mkl|+WHfk(<5=<_6%XhnX6uL5@WZqWqBl ztff_h)An@f2U;QxuH|E$TZ1&^(W&Xa3+Fv;DuBHPGaVVeD(q+9Vh=n&S?k78kHE(h zC4E?Qt7#4QKNR9>M++c!Tv=WM52e5I;(7dJ8WRo`@RO%cVU7aD1Zd*u>(^7uP@@@v z?bXuK0#Eq9QhV}QG)vJv1W3=X5`TaoaD4SjcML(6$5VnNX(?!kn>k4F3S-K`W!Pu?hxd<9dR9xx%3fX=NkDikfk8`4E2wLXu(PkX zx6H1FA+FgR5UMl7FP-mQ_zE^E4Y*x`9UMm`hzJ!7DCLJd=fR`Np=2XXR$d?qifJj# zZ^6976)-RhmpNp|($CP>9)%kV6`=mxBAWsPC(f5vEuH2!0tD*M>@4sOn8Z{9>W5c> zn*)+UiEBga5X6RDCk%5gp!JMu;KTSVJOk?p%M)lGqdN|GF+fV_aG992A!rSgWx+I9 z-G9CK=N_T+*{2+hPHeF=tQ^e4v@I4!40y=6JwRf?TV*XffIL-Pchf0jC;-oTE!RX& zql%EReUW64@d9}z=xO8DOgkL#2CqzpYrx0teM|h!nSAf{Rbi`Id<+u)yH^xQVxM-q zXe4e13^ih9$Rxx$W99?aHYAfHUO_KmG(!8;O__xu$hTMs6nv2nS@t0G*MAgr+&&fA2Z6!bN2iw5zGU`6A@JgErK)@Y$97ZiiWk@$-6fDUy|BeX*ZE%&o z7W({rpa8_<7Lc5W%pH`07f^M(DgToTSZHaHt8y!)r5OX9fl?BsnU)qksOrs*0JK!k zx(NT6`-id+#xz{=b<<2S?*bwQU$a&q`rn|($HzZGIf@Y8jR*-vlMH}Q)B`FPXJz6I zPP@4Dq8LIIj5oe+h&KD6C6p*9=25au+W;DZ&;fx?v@ayNu;<5{mX;3)LwR7*#ARlyMN`a+$caY>PL*K=!4htE&`G1SAcBIorvD zGp@OA4IvoU<^tT=TwJcUjRJ+rMhHe5Dzj@7dnf?p2jnWdp~o0xKMKSd$ap6e1vI9Y z09nL>1^NgGrfU5C_y?s_*!_MqzG9jOj}Kk;!gUeFGX9}mj8TT-Nu!$s=~ zkElxS+`e6gVd%lEg03;pj@m}gst5{lWg_B%c9lZ9vHnUd`qld4ak#}$sZ`u3Y4zmR zqzr8KxOzm&y&;iiZw=!p{$a4RapQ;qF<3VYQN1WdiwKOBm1iF|Np%Ka&@(f zX+$I;!1mHsT^*=Nbn)=m!p{%wAug@>n0ubLVt#I=iaeUzbnuI$+DgSAv9Y0{sO{wO z4)6cDBW+w~OEP-k=8w^{!D;^swH5N?3$T8_eFKQ`igBj2oZQO9%JKvtXXsj?NsfBG zw(=|1v9OR3Vyxby`-2HIW?HmHGUje5nRDJ66nCLa&^_%5>e^e^C1g5ap#B$dK&*#k zwExi`e%dyAaVT`-O@k9Ef+!-#Cnh{xT&zl*jKEE48_mhfqfMyMPDJCZ<{Q>q{$Wfh z?<)C}gZ?;1&}w&4%(J*id$rcCjnui1!XmSajl;~;6uPu(lUfg$2XI0Whaw^(&=9qf zK}m)Xph8p}7?|4HuHdqpcH^#hu#OkzCqnA}Wr+XIpy1+~=FZouk1G}s&XCnJSAa^3 zZagl(=v<(Cd)nRoQ`wnev=Q*T(FW)aMPN4~n7~uTTlEs4ldi5%W`Y<5KxWR{_gJKS zxI()k%?n)x+D!}pCa!4-w2~e_|N1vt4#4U6GiW2s&dhlG_+a$;Qa3 z#0Wq_++jEgNjylV;fn;0cu+gH!-bidxk;FBHIeqTr)SI?r*Q2wh?qjP&j8Gw>JB@* z8l>Db8ZMe2v_1!3nCD=%E^7!;ve5~s!gbl(?;jwS2OHR*0rA}0+>D%2K!wno#(j;} zr-lKfpa7qb1`WlP6Bh%-PyJg$nkl*~_^Z))geU=55X4ZV+`jGN>KZ(@(Gvts*aYy3 zVvyzaZ1E4~8Q_vTW1xmqiJsx9RK5i7o%`>;oS1`-+_wi{|Ehs4kqwy6quaF;lXko- z=-8ub5K{3ZZre5r=@dqpP{5$h)6V$<1DA^;Dp%yy_MiqOlW34T+^}e34crHOJUj|M zx)tf{=|chEHVjHP`=0$cx_=H^~cO4ZD|>oC7kQ~MLWcz)v$FTr*&($Fy?lX zz7^OqWfNK)ifDO~XvJX;dl9NP0ApC(eHSA}(;s>7X0zhu$e}qlaZ~VFOIw zefFiBGGm`{iuztiP7H>9)o7te1wBX6tf6F=S-acXZn-K4sQHK&>cpY9z>Mek*o+|x)eUhjR{{1_TVDfL&8q6u+v zXa8d)olC>>L7IaPqSYCCST?wzqlZDZI_T#B)`B{S%QrN28FM(CFtQq|3kOXV ziQGqy9Kkn_o!3eRmqq9Wu^M$>*)<(BJ6&XjY99mtx}n=>>EMF*^kcTsBfIFTi*xS0 z&cVkQaUf?>vM)mvgVh>L#MQIGP97*d6d_2IG|8ksIqJ2V$GOklVszJFKs`DvxA%Y38;TR7 zBa0LdEM^%Y3Gh;~%r%Wp3vq>mnDP2G+WL@#05my_bHG#rsi$zv;NCz>qyq^OiU)Kc zagdn`31QYbG>K^rf+oT5t$BY5Y4yl9#;J+eTMT~Cy#fuH|2m`|Wd)#!X%Z)K%8nrX z2>Z~34r}y)Xq8=LKBpX+u*pnAWQ4NaD+(5tzo)M7P@VuqalxzU@LEC^k z!FKd^kL1y4S{N;$9rKAcVM5LV)}^`Blj35G?(X5V!{K*nFo*^5#^QXD`X9C{K6~BP zwo9FWhIg2hj`3KAVJvX`N;iBH8A+D^nQE57BNOUUnRu{7&R~4g(1+EqvoX6QABV?m%%P z7?02|)c;X?iy9n)I(vsaD^5V~@bgM`O@{vikY zz=MwKx({HYz~7Mk3&mXcwmh`{B5n*!3_#+B9&hzDoi@5>w00U6JsPC=u)@)Lc@}eX zG+ix-;&2c{y@%^JjL>|M8C_$zx2K?)6il47wc3l06vNwlh1O`K(1L-n4Ycbwjr;7& zTlyR+hnsTw$IA#%o8b(8388LX*_vOkloQ8cVZ?+9wP3dE$AK)S3 ziGV0iTkkLWEg+GqYzsP%I5)Ib)KPok%A8RZu(FJ@pNAH(fTa-ZJ`2bpKL@B+P4|+G zGe3;Kq+uFVNW&bcuig&~XsDj;i$qYvqc^xO z0|z3_rEuHgN6z=}=564+q6=&duC_zb^7332dh&R~@UB3B>Y}KMlOXZUyRI&@uW&E= z_D$j!zTij(K5khU?BUh_mbO<#E`Y@*~TIPZ_fur0K>U zsY~&zQ_ZpY&VAx>$U7>IEWqGMMKG(p{L!#!wmE8@Wo+eLi&H+)+ZMWX8LW$R95cMcf7#( z{zt^C?_?5YMs{Zd9}UC4?-aNSlrvQPR!+7q|D*n2y*1?_oMI*3v|Z^t-PA=Y9XXhM6SOqtJTuw?&S^2Um{c2cg-_o}$uyOi^6iJT&sw(qA4~ z&*yz!dH41qbZQRikCdA3+{hI(_}})=82j9cyZO?#dA?T~%=#?Ha;EErh0NR9+qrWC z3+g3oB=g^@-hR|45c}8ga%^U7N4* zbZwTW4Q{eGMFe~<3Ua1E#iwD9xs;v!3+A+MZ>1Q>RyfNm9;VTYd`vTAOfh+*H@J%= zY`nym#CEvMn2V?$kfHa>VD!S1;ed?cMUUwJ63tX8nT&?IJ+8yl|Glbn*I`(tljo*p z|FheXzafBC9AOG9AzIze+F5L$XYd{}1!}x`EJp6tbe~yg$>3{waoMyXE?qD?u`(>; zdfVbseEtsuwi^Z0yA2!cELFFtrQrF>_G2;fy|T4f)7MSnjnzJBeOi{W_6T*XK|!NZ z!|+h>U^!*WV0YX?{e(u^8}XFNfRPKvLMzgh6D!#SlmGeN9EWsVzb*^N`u?vl4``cz ztWWUCx4WipwAm)dhnRJDU%6$H{Nl+1pJU|~n@74g?B1|HCQ#~+tbYW@_K1rbX_8CD zHv*nanb-*I=Iyyvq?hjX)lxv!`#FQ!14{Pf1_q90ueNRH=rqC)FC`79f30ZRC|G@a zzA-oep+>C#>e*r>X4bF8PclnUP`ha9XR>nVN|VOUr1e4IfD{ z|4-F0JRq&kDW9LdyW**Vs3{B}LLUuao`<|Gvcd9)onIc^+ss|Rz6dNu*iyUuoP|dX zMguao-cwvJdPg;y{3X>T<+X)zb|>Z37@KHx&3m z6Ib>GCshqfMcB;t{7wI#24m%6?2$7GQc8=86W)2sse{RbvXQ@bcor-Thz9BU3$UdN ztQ%Unte!W=5OeH{DWP#2E6E;7h4zN%+oBuPYgKB_CQ+y zM!~E~_AzbBe)<&QQInkHhyd@nh1UZCelM%nG{QVH9$hF)P`QPqVrARsZQ0H1C zAxd{&Tbr+1>*zEF@$WBFD7o&CK_i#2$O^J2{y-G9eQt{!9MvOUIGG5qIhe(GK>18E z3AksR35iiK5tGO0Mj(|uvm2)LCFPKi7oh{;QzQHp^B$tHgI>?H(@;!(E+lB7!L4{5 zXk`GVb;La%hHluY#XZkn`T;%V!!nRxJCyXPIFqwH@2G(9jG)bf(-Ei7Lzd7rW-W^} zrP$xnRPMSOaHp+gnB}YgfN?~Ah0;x)O*YOT0|y#>;>FI^T=@#T?2u{tQ=uj*=P=%| zYYhh}R2#uMSo}-J6u1n1IFTgANcad_wlPa-$2UlKPO*amk3T|Neia?})>fL~Z~MDQQN*5upy+R6XKSWkjiHQAWsGLp3SIdL2(a?`my{xFUo zJIc+$JXQah4d=9qOh^q5n$;;G%)B^Ro%oqM%4~Rx>Z&+D$X{2BZme^`{DLoXzp&ui z@0n)Xbc%g;@kK)Pqe;}vpgRm(BxQr|ei1R$HRnJfHE ztJgC%ehx6)E0h3L9QSE-P^e(ix#ppk_y+CE-n00V#{vLaf{Ic%WOoZc17-4g5q^%p z{_6gg-%D;@dyJ6@;Jo2=skt3S?3Pz7tDzH5z%{TG*}tE&Arisz@UPIHpnF{S+gA;{ z@cJVXyrMhhI$UlxIH1<=zX4C^J$tZAOeF?q>xSe*Y6hpkG|RbUo3AXfbMxI7-zTv4 zUR)z{TQ2z-8eWf+v|kMKijUa-S_VkwW=917z-WY<7(@WbtwNRtUVe06QrcJoYN6>< zx|t1X7;XK&sK=WKtX+kHXe|1PaOjs$%8ksUs`XrxNUjerz^US(!|cog3b3|P=Da|<^v%|`C}augKA*3T@A0SW~SQ^Oa9`T0!pPwEZGz7 z>^Bp0n5UuV;!{pvSvw>zRjR+wZg2~FO{qV8$`Q?igybpTRr@7c*{drlhP}ofhH^NF zbVRF_v1<4taZLoGb#%SeK@tzTxOl-cC=pc*MDz&|82T|nei@4xNzo1pc3x4s!``as zO96R}s{P**+HgPqFtju{D2T_6d8_VA<8GE1#QVp9`w_4);^JuRATQ~|c!vw(R{Ye2 z;Zxb~ji?bR!W>iI7V}g0d(PmUN^$PjNj2j581MQKD(kjUF;?_0^)oujB(&xx>4ppF z+#$ITjg0}lG?FO`?mK+$icHPh{DLG~WQNQ0gHXlqY|VtuYQnIce3q#MbRw(OA_lX< z(JhX}aA-<0Y~ua`F*y4RMAt)=t9I>M%=NKgQU+e#Phz+k_>^OY+~)?>4CX2rM~qIV zZBp5>r^$cFZ)$N*vhf|mmqVWI5$w~9su@!YuyLXfctP!+CK0dXt!p`Gl@3f~c8zIr;l1Ex$3}*YQavY?QWOvEz`WYYKj@-VSJ89PucY7F5quXv z0zq#hUI-=`oi1wJ%Bn4!0KI0_0B%M=c_Cs(o}V7 z{bYFZdDKoGnWFklMwB0AR@a5Ik1AqnfBt?HK7b35hqf?yz! zXA1o^ISDOkbr}0D1)d1Hsv-B!D!#0-8{qE3aW?LQ(s=R~Zsp|7ChO*5vS;O(y)(Q8 z8~ie|#)qe>uObw9a2L|}1i6N9gYWO@iFJU@q@Oj=pDP?>d8|F~4xzp*IV_v7o)8P7 zypmF=Od?WM{3RN4_pPJJ%O*U z_WVG%vpP-%1aYh=9QT0abpdz87^Detr=kGq}<0X?Yx279{7U%ZX7+yxM zl}AVSX8vbD2r{%m>J<_9b$gZXsQBb+B-G{-P?g7=kXkIOXxkCm)g{VKc<*Ip7 z?X^;P^f!@iZ>5Z|8mxD)OIpj#)GlYIR!w@r)h{IJK=7@5iI`T09~`~AckBRXAHe~j z)uY{)&8xU^x&Fr=W(N9i`8C_{uJV*?KQqvOdL@W?gSSGVsAmG2-7&;N1*T38@-ITC!bVm{1^TK-!^%h>_>U;=HcD1^fqAFTdqDGAp z*7l;6-RB1OBw9;o3L%x?il3T5)bf0zhB_Lp=tv>)6}0w2sFjYoKSMzEPc*sx)dSE{ zM3)L$Zs6H9A*gSF{Gg{t?r`y!FU@h7Gs3^ie8M2j6i%F$5dlF#D)oU(hFtlT&5b9E@fk&Q9g*cPFlB%Z$V^Ky<1ZpwQ!G*X%! zMfK>|^dYqkuiGRbpz1kDXLAda4U-i0B~0*#Jyj3{*fv^lw6xWs2zG&(8at@Bd@F6F z;@@|7Uor22Ru2tRfTj7^L-Fx|!3-=#SCNtpESsd9oSd{Y&}itF<5z9s0v29N#Dpuj z&rRG++1C`>;(8{`lOYll6B~x=8(J>$IH*2h0Y9UXgsw3Bqg2A4@H$jHP~*e-hw&l! z?wFpTdxcpirqWQ9_Wwb999AL>Rp9D}$_6X^s|5blG=ksxN)IpYyg#~=?7?)zS01IrM ziSqyTO*YopA-)DN)MOGuPB(5pQa|KLBtLveh`mxC_-ZgY@LJHj$s#fd8drShHU)Y` zTUkvsZGWa~-4FhDV8bSd31insC}+5?PM}ya)j=SIrwV3<=*mM+a(?F9L5zlf(v#Sf zB(LgGZX9qmf^;EfJ4&xOW}#wC78m@9N%RfS>RIH3=5O|M6CLYdN;R&%=)b0u(EdbQ zEJ`|go^|#cN3n%sY4PJd1H6o+$dR z;LFp?8?R+5`eF)?81&hAVBNaG{EZ#?-*-2^dgX_4gJ&XiaUaIv??6)o^<{KDrWm?< zddM2F%(cP+hg?g9fb2_)0oj$EamMMuffmd}F$;nj7FV!@77WS{%kyIhgt)o(ZTR#x zHCj1uADK&G^oa@?J~V7>=X#D=T3Pje`qVn&^>KB;f@*5tzB+v67{vh^gZc+sbDf#B zwVJXrlrJ{~cYDoG4na-}JrU<-W!TkJ;J?6xA2kXVF;pMoP%J0C8%@Q^$@A8k(nqU>-gA%mRsq5|>K3r@i105O;pcs<^_&f0HV{2S^2sbBl2r~Xc zzJI0-u+aF1OaT4i`clL{K#BM|c@G3*7KaXD1|Qvc7DEkmd}Cva+&`+K^utdi6N$fNOz`pAFPU1QZj9Q;@LMbvSEz_~+vvk&OW47f8$rHJmxPo2XC~)9gQd)o5;%15!fm`K~AVw5zqu6cXsLU{xzyp`?V%}=3|NLXE zJlhLl_>R!r$jjqQ7j>~O%(W>fEi5dAnQY8k^gQyv^d}TNI|2tLRlkpoZQ|#bfX_i% zdJiJn1}30Iz%{h=emS)Q3zbDgavjk{2XmM?5=8yN4gtyTGJY&Cp&HAe08R|ZOa+)Un0J0r6R18Rov(vwS(@YIeU|?WU+noLA5vW*p2M|sO zLH1bi>lcu*r}GbjmJ47|jg7e@uFs+9YQyJM<+TW6mb%7ptm6X%cZ5kiL}E}AVAW>(_Rz;3<= z_exk}4j)Esi$l&z2I{KqIQpff#hlj)N5h_IB;NJbIL~s!Njemv*88y_^DH7c1`sva z84jvQGxR$hI7B>E;5IH)w*4_}^j|xF@git17@MT-fx86DPplo9%}w><11RN`EZ7e$o5mCovJkP;EcG56@-aJ9b{3M97P`Rxm zOu<7;w{N*8U}+<79xVvb)%CNd3b^Nx0U|)1_)7CqopYoiA$2B!{4}aYLqB}G?;1-W z>G=45eJEWkdbCLeMA%?w1UW)DY-BL0U)G3y(ob$@*WWu21~X*n}<% zNZQbM>8W=~zG=51g;|7t0ZH zFKcl%2fbZddX3>AB(He-_x!#~P7Yz?%Fbrn0t*@@yclmonD^qvGA8vfZZ7@(0~<1$ z4}x65MEo1*OCqPd{Jh7>lW?G4_@14K90a%fKv$=CptQ!wwP}YYx4oi3TC23ABvwCe z8_-!nuZD3o3Qo^k!G{GL>reut(SjK`Drl&)`R zw^RCo^I#Z28gg>sK}a=HhmZkpJ7%c3Bu6&m4%H}^9=*=t)Ni{yKXS?rol*F>8D4OY?`tRvaF|1mFJId zKU`ez`UC=6NJD8RTonJhu5?o8T?7&T<$4MFiEh_Fkn2G#@EivDSFa3$iLe6T8Bnc3 zN%=NDjt_%%Us#Bfa@B^=3iXAXTkf-GeJ+Z%Y1=h4s)~xH7DiK`KSvpZoeW0{q${Y# z@!hAVUm;$_hVXwb=!^{7jsix>lT#b1W|yl5#(f|-!&rH9Va}x!`BJMAt+H#lT0wM* z8wGt&+GX#*n8jm{l12Et+g%+ zCD+>c)&EYw=Rs&%g;CkTc-^mML!bhpRAr?%#B#ik zwr}6wi{+CDDd4Fa`z%hcDn)z@FjY}`yYWa@ik5&Gu>pilo(+eDPk4`t3H`#IVuRnq ztvT!b+(3&#8;AbkGHC3)Y)F^KKqe-nO%f9PAZZ?W_GvZs&aiQm zC7sfCW=3GvQkyE}k>s7ffU5-*>t1|-!p;y+t#Cjis633$o?W|p2<%$)=PMFg{2t4O zhhT`VP?@m?0eY1(i?{5Um*O&V9ryTbmUlgcf14BB*FRk*4b+4)#gwyI@6F9m7F2vA zrwY02w;fQ){^@@UAeazu?S;@Agl_+8Y#l|#hI*HfmVnBX*ogIqkUJ{xN`deQf?Gn% z3Cjl`A0Kf}g0DI|I}7=bgtW9Y^j1*H4JP~a*h+xA{_z1W6_|ABPC-}$zTGfzxu?7& zFAu&@NJH1}feww_2n2=YhB*W+_)s4});nUKq?c0x<_wlHnv!Ltq@&=1_eXV zq=WZ{y?pqD5PJkBird`6)8=|6-+G|GByUlw%KY5&L1!B@4EZ8$LS=|W&u|)esyyMnd&udf*aH;*jW*k$MU4? zG8iF{F|!^}M!y{O3(*W&61*;GN9O(vz~m;d*X88NdK{oHxrX4iLv+46`zYrf?xRi? zIGtDu3$+j~Ac&dzd1iI+^qKPT;$^#jV!NEoPl+b8Jd7%tTq}&0@7Q~qgD^_4NWmJC z)>a2rT~sniZE7}v-woBVJLO`**Oc{f!wF_6``}1;FY{ z@>!a@v;7G2%S-#nx7brt2+|cuY;fq%c@E_eexYpcrvmuDJVdY+j~>m^63FfUuxP3D zKSN;Q*b!9s;JJ~R-&u$iY`eYz`hB3}07I~^;P=m;@)1jytSqrpi$GLojY;F{{RFm7 z-*`}QC|tX2!&l59@G6%(@&oJ40KAML+ylcE&Ijk{i5>`FD24C~n?a zw6u4W;g|FobQ93^2!#&DPx$k_uDLqfG3EtcFArnqZGyN0-JB@S14h?*eSA$aEK zbO24N|PXtmQb;U@wAZX;l$@@iD|xEgQ)S%5yxK!7A6F8=w;m;7^&U%yrc zemgmbEG-xS+Goetuft9ys;a6;Snyy#5p})AWSnYjT!r2Mt84^b&d<*SD4@VB?C{|| zu?psIRD|vff}#%FN{2qWZ;#aY&qE_a zp@i4dI!dm9*a{Dxs=48urwV5PIbv>fFSn-80gVQdIKDj{ludei%A9rZ?3}%T+85qF z*b-_gPtu&i7ma)1QK{%1_sz#)cFN8VX`%J^beom~L=;fJt->!3moU(kXA2 znm;~z@nWWO{`ZLD6NemMF22RRz9YkhFsyil3BHW%3*) zHd(hGu3ZaQ*v27j(B9V8_WAP^+^jMlJfLrq9ZiA$49i#{$T2k~$hn9o`@>IxmWl_v zPJ&xgCSU*<@jTYJ2cH$<4ny2S1M=>dD`tW?Zz=4Oa6D?+Vnc%tAKQ0k#(H}{e};tJ z$bDc-iGdMpy`ZjvEMZ^tJM2rxmQle0f*X!6{))GECA@dn2Z9yW`0kwo$0)uFc$uu7 zsDy~Y-g`0;Te6&;rvOO;#^+-n`0>Nf4^Fy6Z>I({%9C&Y$8p&O*ROf^UpjgK9Ku%jMRk3c>?dRsi7 zHQXL=+@xhBB(ThYkNqtugj|=A@!?X6X)_!LIq#fn!#e3`)e3xHsJJk8!l36s%G=0# zS(t3=^w)Hez0ZOG${I*))P|TY{$i4~o!xQBInYf3fWp`#u`x*fpyD@ZV4k-5ClXSL z#>NWIIm9@h(Y$)_n4uM3%g6{0>O+(!dy_q#EG+urC2{?Tz=fbip>vigUYRW&ZEa9X z!M7F5a%~cj8e#PI)O&jW%{ulpV<(0}rblTlE) zP*CR!Hkx81CW@x!%|k7a#OVsQ*0RbH86B_q>6fc4)agjOfcXBW*jz%r4z#Qvb{sy4 zcnA^D4cfxmm~f;6eUi|@b#)Sl|&;$b(ylHj?kGsn&b7x2%PwX6ZDoKg(PcKw`NObXl74V=@=Ord2z#{h_ z@Y%#hU`(s&Hg`J$Ohe7)Irj&id4LzjN=IN?5vnFH&I#oaigHXT0F5y8ji=DvV9q(} z$NPr=CFVC${Y_jx>jOV^cP}Ev{DUFc$nW1W9#cbv2MMgV@ETYMFe5qC3A_}@1$N4{ zJvo1aUC-GZ+zq_>jv~AB5U}D^Ve8|H-S#Nn@+V=wu}0!UnDif}A%l1|0xCy61u=w` zcqyp)OqqSFf4G(_cYO>Bes2oDV_4OPn%B;h<(?&6)Vt0n3Ez+7QAIu^A9u-j<5uw+=8SSy7q9!(zdY;CHekqSpf;y z!#SZe7XuAieHg|;$WhJ!dEsBHpKtN@Y~`P5BqW*IjbX?9^{V5frhTP z-2Kq|QpkIMJ4-F%8f%e|$y>X+2ulf=mNC%_1S@1*uJ&W_<0Y<+4%}KlXW1nD*rGJ^ z_wNz}yapg%Ln=$8tNFzxm>5jXSx}WDMc?Ovlkj!lzF@!6dbNGxJI{~;*W1{?6jP!+ zV)B0?{_l}to08JRPb^1Y2wR>FL$)4-k1o*T^1h($4thvXb8tTz+08Te2I8DpjZ8RP zK`eR9`qKkI&Ry`5jNGfKe4~h$34i0{(m%))+5n~Re_C!v{Q^xMK&C%)3xptAy(PE! z`}$BCx951Zb{15+xUlt(=;KQaenV?(CX_>PDOB?B=?qkAG%)E?`SlqgYX zUU5M+?@Jv{Zpz6ng%yTViD#?sS-3O+Zt;S8y~CDc&qSdTJe|5`E&E8(5QvR%=i!LZ@`1%n2Vk@T} z0?fY%JeKI)vzcTkZfU+$98QN!5BD8<(PSKmEiH+J^;MJC?<<%EC<~KD{CSzc%_h5J za7ZMjG0(wcMAZrQJ}(mv#hi%u#D-VYcLQQU`qipC4sLzp5=s-@z^Qqf5=E25HfLhH zI-18_;X|0-7`}M&q*1(aX=y1YCPs0We9Kg(%yiaF#h4eNJG8b2p3sKLPXa8?5)=2R zd=e)#38J#*R9A>Raz`p>zuyLm&&A?1a=sUA`emF6kMVEvWDiHK8FYm9UBwfT$qW5} zri`xrIxK$q>RFoths$Z;N-_EWK=#2$Y-`W%$qRA!@P8N)m1=b_}bK?-2Q$=eWnzoABM_4+Um*!Qf&;@0O5p zaD80HPcU+TJ);#{fMdu!W^34#3WT;+6y8~Tl(TE91>)6;3JQ=pU<$z%s)fOq{u2-W z(o=&qKaX&Sna8k~hF8eHGQZL`d!pDPm3_-mwHQla>PAoW&;>h|%DETnFG6s&h`t5o z^D)wTd5z~n(5$m^NshlN$vHH6CvLD18}d>FhNJP)6Lnk7^T<*C@DHOzE4NG$ zl4>Zs5Hp?zDy%lw$Mu9#dZpygDthr^Qo0J)_ZUVSkVG9Itw*dt1SgQ%%a_63#eV`Y zfDo30e)X*~q(&o`R$b!JC42qtz?Zne54Z`u9pdpOQmI~;LTObI!3A&*hPzWlIe$-b z(^)VXF@Ap)Wv;8+{A74${&~k}q^8U^mK%MMA&!L(3|F}_v9k}i3WjNCdD)=#0E+-= zLfS4Q#mp&2&k{Do=>T~OY|Chp)gEiX|NYfdHing%tu2C*qkK|EE6Co;I=}L4vQmprHQ7c(Wbv+y-%&b;-s1M)=e&8(0~4E+s4|LtqjJ_q~!Ek zcfc9I1qUQA16$h6uXYalk*k%H_hCY?fa6hx?xYf(8A`dAKR{MbXI%X$Dovn8ydvJ> zV_JrFu0e?y7YjbgHg~7uiPTQn$hR-=5}FY-^8Eb=8}c!q?1qYz5ZI^I9>q%gPuEa( zY~HIuXz@dL91{rsSF^QpoRDvWgSWi2Nch;?)>ukj9KDE91Q*K@3>Xs*pJoeikPP`W z0jAm;QjN+*`{v^eE0w`@ORDoIMlkpuqgD5iCJ8LhK)5#J)AOnb%Q=Hs2O=o+-Dfbk z4-R06pFtbUaK6CE!Ng-BM$oFw1t=n5MZoedM93!l(n^0L7aX+bc$f;G;=wunCqGJs z^|^qoKh%b#29dPLj({BrjXsQYV3nju`3&TSUoFl7M(6nMx*zd&<2Udc2oVV)o_!lI zScbg62QfeU}%T~D(yV<5eCgf*NQ>hXmj)FbuA(ytw`>uMqHeV z5PmRNh%_Z*8cJS2jemjLNq5yk{6x)p@-=5t@ECF&9ysy|p&Pn(?O1jeC^3*>Euk!g z8$wKjb|Vh)YV>J-Krd##wKS&Fyc@a{T>@L zhENqJW)UccH(C(5Z zXzu{$9feaH{7e$~*}q||659aZlq-bF9l}E#0Rr4X6(AVwglY(@+4290_1zHs0_sLi z1q%ak51>|JR0W_%7B4hDX^vWt!gJ94b%;tN|4vekBiE*v^fgNK^@ko>_>R|3EM27wB84=F~&lX&3{I*hzG!*^q;(*TmV?;|NS+v2N+jGs{%$uupnmRQc@5)SSMs>a|Y$1 znnXZrMC5-`0(_%q^%-+<(S)6O``X0etB2G~^bZ)L!S&DvCh*q(5bqWA!%X9d>JG9$ z{FL@$EE7h!ymlEg&B4jISN^@2-Bo|htf)Z0g8)p-oeTAU5pJ(7_U7ih%N=xe7YQ|X zr|T2F)BKS`b&GW(-pw5ySpw^WI&P-LH4Rpw&_m%Me&h(~wMf4z5ukreO|@u-g@%H! zKYIrQD$_$R9l6+_KWYXI0$G>{TsQ&1V1}nXB)ML%i{-P%{g-Y!QMco$(}T>+`uxY| zge0V-Jl>5clIqa;!ru*FRGcGnL>RE5V zfN2v}i6FQESU{F-0}^_m0$i-FPR>a;yG$|$G9X6fo3Z!UqP@DC%z9ox3SXxQh^ULPm4PqKgB?0&Q> z3Beo{H>{Zc{^~s0GBq@01!pyhL|xJzGINdHEQ-i@xL;y8!21#uSqPH&BXL<_qf*>X zfXt9g3LBNXSy&L0Q!W-bs-xuHi{u-J-U>gsZ_5j(0afNqMU@2z*DXi)o@ug8M=!4P4&` zDv?B`f=PI-Xyt632nI-$mI9nghzVY8)&%rIgw9Z!=l9LYv%jxa&380;7inh!*8By7 z?Zq!IDho}j{V?Yl14s;uZ_HMUdLsC?tPfmX>|MTp#GYHdg;jRJ0o*Ul-^Tk`eTo5? z5{aFtsIL0VT!npuH!w0}{h(kkQf~Tg&brs_DJTX}pW*{R&6?8+6?qcU&(TnHXDocg zkPkOsszrQ_@5?P`4SX+jt3EU%E5q#>1WtH0OrmK>XFL|KX5{pC4+?MUi_3;j^yZ1k z3I8t))~5Py@PyXWfN?GopU1L+qrm$zigR4P;n58PN!28ywT5|K` z&g+1gUeE8%oP2d{`|It3l54IVG&n({+x^_f=L7FIN5+#3oo{=S;YT}BNiX!HzRs;l zSN&L_{i~x4wcB^p%Uf*ajy5tEP0N&SO7B^hv~h5m7goo<4hQ|&sZn)A4}`Z<=iGSa z!gY-C&I!j_QiF8lcx)j8KotzE{GeH;UXDDwDD#?M>tE~~O@y%d;2?i&L#h+|Pnmj0 z_*<+$#^p>IE)8|9#H`@#tI;lJsVCW3^n_w3#?thpjI=bcoeQC~KXc`=%C*(I2R1kx z)~C>icsOxg1Rgc*v4hd@R96Ki90UzXV7(res*t%UZ@zz5`7rR8;>|-hg>o&alFXz)v)|zY!RVR@G-A{0`V5w}aFQd2RHVCvm2AuaG9MuL zsqOqvH=4*Vg#|gfMfeP_z$`KfHhC)D)22L&N9zYEs(6@w!81qN^mN=d{6UnF2 zYNN{*;4D=E`#05xY1W)gllek~-8Oe>db&TYn6QL{;(x1>BLEzf&bp)lWC3u>G!acl zMlcmRl%3z47~E1u_{V|AW6IJWaJw$8Y0y6mL<9_a;>4}l#bR!-@?5sD@fg5+gkOO? z8?g$YtBVV~^$E8tR}MAg2d7QV%+NTYn}ZvX5ADtoV%;&R9u{Pnc(H7^G;sSDToi|FjlAm<27RW!PTp1YBI4e z3{UWw>nOO{n#ZR} zudwy6_{ZBEBFEdF%F~aJv2J=)Zw3WBNZL~2b2L4_ zIPO*;lwVb45VNG{ZfQ;8s^2*;W%-UI9-HR6 z$^8tx=xd?X5+EyDl*o!=d+GdMvZg%>>(fGwL` zXA1ZBiu_q;9o@R^@}IXWf3%Xw5WsA+u%MuS(mgm$v|)Wk?D%@DKf)LsZIhL`Ot*{Q z6~FiHl3bWE${%@bN_M+Cq#U$k>*FF9!;4f7z1ENKQ7)YLc74!YEefR@&mNfso5J9i z^4M^@X*E4$*|lXb#;(>4i1cTZy;qCeDs>;m3>ntg41s72U>MXd<|8PB$JY{lmE;J6aZooA4;g6*k0ccA}|)?%qxb zQR1EfW=+pnFw+mX14W7{IUxi549n+K18<07HZ7Mw3G(Z=n%Ms9La~y8RpFZIXR`68qu3Cr05Q|y^Khk%dJ)1YZX^5FO{EX z5G647p6+{>RxkW@lX)-7;eD|&vYvbEHht#RL2*a-YqFdWy2l~CH=>=^{psF;k6pK= zu8iIHxKq7Vwz$S8_Dc6P_uQj~Bk?0iof~@tJq&BkdHbwZ^SDkVM*_VUHJW&~mY=ce z4E>e@p6k5QW#@f9b6?90l!~`|?a(&K`ZXk+@2aLouE*L5jgnlZfGev}>971#rmf_u zpOn3aMV&tMi1co9V>vh5+j~EF>c*=3>sF5*|HUAE)coS%D%xie7mw8o8lEEbHEuiU z;_#vbIzUH@p02DrJ*U9aCh2y2is9n^mYd-UpY4-lHjsJ8r3zBX^$8|byCu6*D_a=G z1OGAg$nzZc-SvO|z2B8k_RPVJnzt+K>i*dtmzA1f;~h5&FHQ0LbyYU&s+Pp;eW!c$ zH6_;pViF&eDPTj$MH%O6mu{Y#_Nl|(SBli0d0&+yc^7N#eRs{+==aS1=rx`m7qkO@ z)O2+}0sO3d@AoXv#T43Iv$A^Qcn`!A=z}RymQ?t<8$I10jEOnIk#MXz^^4;@9R4n^&BM%f(*&f+>sztII5$^e`^68rD>8Jj0Lo` ziQJ%uno~ak53T3SUG|m65?}E1FvQ_jo4bY3 zp25+Pz;p@AblCQigM=F3yc;j=o==lRwjKsYtyUC#MRm()0spRoU zDW3{@QcQ9I;-GvERZh>a1}@X)LLeCEz>uVS!3INmMk|PB{hp|)0>on#Mk1v354HDk zu@HZXu1t2Jj}_XdMQzJ4FX1eD;y2BAyaw1Z^1#oGup zW6=MBvl>=!3H@9{b~g7hR{#WHEOr*5a&^N51FK{-lBDA;sY!$Tg0*!EpFfW@jYGy> z3+5L(nqu&k5TQs)S+EaxIM-5uI!@DT_zZyBSaRN&DA^~I+y0cklTL@~XYpjsPOf-#3am|NDnJSXQ8I9(`m zf%5GAX-wxk&K>Z7F647&^%hv@49;PKgl-KcdLZU{EzkFY0Xv4`?!RAfA&|QN#ias` z3eZ##u!;v_&Z8QD=P#JuXp1)1eiZ+OKU!fH4>%n)Y=dt;W(p`H9Wjee8U(ZgiX$+} zHLTKiRUd+TQVird#*!MN{!knCjrs7NTSjs9Qe3^WXk_{y%z@JcM8A}N9K40Y{Nc#| zb<2P-3pHSa26$tO@L+Eoa00|JIEmwd2hQj(uSEG~;DW&w*06z6)JULM=3&Rt+M!*P zNrLDAyRO0a_raqjDWMV~6&`!~+^6;D*e9(tB7>o03c zbu|c+^-p!Z=%6#W^ZSO~?;I&l+v=y?+IIBPR`QLcy@?u2y(4pNac*aK_pj35fa1D) zdH^TzGNEEg6X?PG5+iZIqePpSVGXy_{KuGj;RJ)%B^leW*pa*#pPen;gsCn(q6kHG zT^ab|Ivs)q=plIaYMvvel`u?ky7&S8|@`D$@cn?`*K6-bPudO%7^b0G5TWAkt;5v z(&yS-806)=M3g83t1_&=UVAyW_9|PO3%*f*Y^oECCb$eR_vv>!8k`0%L*NS-(;O5N zgC=f#p0N02uGJ#x=Cld~+aQoyh%wiGQ(x!D+wkWN-D{E82SS=kKGL3jmp7ExoS19EAS5dY_v z{r=a#S9Tv$4F+8sYuS{-(*#Hd-~>!~N4s*J)NKWsjY5Kdy0>8)MwV6Mfg;5A0L(ZvF-NNLd&%^I7LKT|my>r+E#d(Z4P4)(rSF~M11Bp@KwSN7j;`58btHf~w$*C9 z_vjKbc3$74m}$*c9m^j3)W9G{agoB4GO+yH0U+9yo{J+MASOEyZygfD1Zd#0*Fu zsWB^{FCapMI*@C5z}>?X9DN(aOpSct6gou~eJ_*NRbR94sOXhr zpOg;!AZ)wo6eCefeP9LP!Ix?Dbhr2|RdeSTm3y?08u{FP&eV|4RWGk%mSzt=QJop0 zDePr1Sr%8vcq1D;+&ij0B+Ev5Wrs;kE{&n2k=Iiocr{%V5AiP1fbdia7{Lr8`cR% zu)?l)gz`sRoftGAuC{}-0ohKH>O(*suO`c3u&_A-^-md*83WFIlVnkEx%siP=vS$5 zt*CTULw?AU_vfZh-w(gGji{79ta|+7+>JddX&Q|C8wT?2Iy0>GV;DBRcjN+2V`qGq zrnqg>WgZ88$m1wch@KUNg}S6V(4laQMsmw8o0xnH+-gK*Qa%+i<~6M!#(l6(i9k7{ z)c9dpT@Dprn@grzycjIv5;DLvVjPghC&c7)HwJGV`2)v#=Rz~ApLKgcH-TjdmkPfE z3@&w>Fbkyta)o>nWH~&7F7UjUFpN*gI9k=n&~y(aR82_`vQi((q(SWOMfx9>)YnBX z57qyX)({?=fY7Ms8UwumCG1eq+V-)T&Z0Yd=PmrRHgMh#aF0IXnu-ArUI%vX++;G& z2F`r+0VY3FGR|U}Ktcv&VH_$Est+TuB~%?I(-vYNeStC6`Q{DN2RYyd$FAn)jsRSM z>^1>Dca~KA!wl=R#~wI@78ZQ>HCn{)H(mgOj$e|YAeF&vt{rC^I~j&cFN0i*3%y50 zl|K?c;}z6qS|LxehZ)q8h|hI2(5S%eXNmWn$rfdW*Sw2MAy=8f{h)c>I%KjiXw#MO zJoClcU%IEZYLS$Ze|UyXvshB~*yt%F_oR~&LmopD?zOhE{iQZvG4qQ>MEBETp5_Up>Gh}%)W1j<+t(N^bc zdMHim*fGO4Xzw2>WfP@>@~&_TF{o;-6W~$+kb{GIYDc<-imtBol?o%!D_86)AdE>G zL{)mwdLR3(q0*jDpWqRLNh_Wh;hJIisMHZ}PLlP%sQOuAw`Z=v`dZP1jOx-zsgjOA z+^+IrQF6QnLcA6~)U&4FIg1o=tmE3QL@~M{7*tVlM!ackz5WAtN|yzhkuC}|cM`+8 zVA+Xs=F~eC(FNZ>BFUOz{eA753&3cy9*mUcj$pQQY*p7clF~u-&4(i2cpPv)KEzm0J>>X2{l+A9MZRMG9$Ou$X#_BUitxaM2whU%BE(an;yAvv~ue%X0AMUHLe1qPM2T+V6i4lo7^nPKdc) zA8r?;O>mASUy}A3>iAl9>2u27AErKmxwholYdgN4`_y~bFPW%QR+`a15|iJmv+TBP z6?U6D4sBuzcwuV$EX0yJ%Vc0{{^{etOPxj52|=bQCbNcGJ#^c~T+BL)Hu`w0wd_b7 z^1k}Wi}*PAwyo3*FGrRFSG|@yRqy!v*kk0K@~hXMO?fMCXHazz8TGAT;Cj%;XiE;V z>$I9G{&?f>+SRqcaGUNs^!s9psXP|?3xyRC-C`yk&jO7lk0sxeuZ}yS^KGV|S>aDY z#+?~W3o3UTt;t0H^){|nw}Z?ygDQF@3avHfLrGWdxU^=A_+M>vL%W-+@PjhVZC%4N ztSzpGdza(Y&c|iEO$wk%ihCH?K2P|t>S@9J0aflpo%Mf@Zr(@~c4L-39eqZ0eXOrK z87nO9v7y~HfUDlr|J>8IUVh=)e9RAVz>havI&?xe)shONesi>_)r4Kr4H{(HH`?A^ zcn&Ly>_khd&dkwJb1H{^lwIfRdtqqAtvMq!q?`U5`^ksTcFOUlWM>mi_W{Tj@)2Ih zLDj!uJ+i@%H+Yv6nexJ#igo~KlOvZr+cWE+`^?_{YvguXRv4WuUVHS)f*gg!9dukcB;;ini_+^G6OE`Kk~LZ0UUqfA~%g?&;=hBc-YF#|6& zMQCNUq9J@LJx4Za`mL#T3H7Pbew>|cN%iA(YyE+LFcNg6?86n|S9NOl)tG4I6&vVf zSL&CL+d0Cw<=k$hWefg|ZFg2k8<&Qs!87-|7?x|swW1oaDqqA8urXoKYeMUU%{5sW zL!LUbb_0bjvrcfpw-Bv8+R3pQ_^hY{UapnM(-LstT3hlk8(mXy8k3(KMTb8!&+ZuK z9jVYrP$#x;M;?2q?P$35BxEploifQyj`uLK)Do~r0CoTUh3B^vYlxBqb{9$%^hxc7 zi5W-5#j#*Xr~$Zi6~GPn5hd!kh;LECzO+|AQOs&RaPxN~HguI<7UDRhzWJE-=r{MI zBkG$k%EdrI(Ukuf8yoa;+8d#CEAKtUM<@SgvOL53HB`aTF+#?yS|6>Xxh3nKcS_<%E+D1@=!o@byv!_a%#9&ABQkJ~d z{+MP6i@>ogm|5VE>H40iDTKGvVf7PMFr1iM^d7_5mKCR1C4!_RKeOA91yw^kMK~6T zG{ZVO`#T@4AD-{v@-*ZF*?yuI$+zy$n!RjeUtPMP9E6MB?K)>eS=Z6HG=aOJ7;@l; z!miG!H1~7_XkppeSURAc^(J44iLPl9dvYiwYRp7{+g0;=hQ7zU{$RGsYr>|OqVYrL zXJpGI$DIuR^5rLi!c~28!DgHCO;!p5*v1!d=wnL@ZE}uJ1>hNK^msK!@3BFar@{30 zulCp1xx=~-6S)n08k_{9YkvB9yK=2P%fQ_<=_wZfs?&E#k@R-Mms1h&GZSjSVgW>| za8h#9*(@D;c_fpI6JGKGC;C88W->I$1yc>Ucdcn~nz;HQ<~1kX-VOR1%%p7*;H;0` zdT^70NwjL9B~@1!jVB2-Ud0TyEAW`xdOl;N``x<248OSAzMXN3-8mz71bOtjPMgaR zkBFsX>7aZ*-PaRr0Zt{%2eYyT#hl)B7U%9)Vb``pFQJ`vDk4Cdy(qObH!*{nrNhfP zF?{!Yl4h7da0H)x-nXOms)wt3v5Eu`ctbu=DU2_`f;12wDTP0jUv-Kp88&-9ZyXIU zm@U)~WPv5fcS#Kj3Fda&);Xd8bHEC4rVqdXk1)ek0C*y{Pt=M+H|kn|PN>eEdS6Qb zH|mwB8Yt6P+G0uuDg_IKAU~8)bDlkCqET3ghB%c7sc4@#vF7upo^(@kaGDz@>(3NV z8IcAjiA1H+^DW}GWfSjXEc1l+H#iB9oVYU4ZwsvY1wNpz?n8}?I9O-dthS(P@JFJX zb!DXURY>IxPU{^z$+Skr+=6LakP07rb~Z4q*+uXEo=stoT5W>UJ`#1eT_>Dg+%y{U zZ96p{YRe?sgB^$_^3-KoNZ}=pF5Fx=67-ZqJs6>E~T@d_2>6qd4eW3=t zr|?hWhJw-h`ugDOAy3+M;^SfKW*|9eJf3zgI=|!M@2{bQSt~Q{i}xoSi{a7{+xCym&A#P(1mpJw zEAVer*kC4!Q5Tjj^7(l*z}yQv^S(3Jf@Yf`VB_XSrsJ+6kSr6nby8M8z?SR?+j%&k z9zduB0`~1X@O+`q!5-lGdGKZM*hR?!9*Td-bAvF7BL~qWB~1j5KbXIJ;|B9}i>?%j8= z+XHqbxg&TjT=qAtWx1EA9ID6R9Rev@s||h+N0*D`bOZ;c@IU0gz4vOW;r=voy%z@UIc zxntGdoM$D>Aog|r{(U*XiK{+KFDLV}0#k2$5nxbi3=n8>_1Ff>n+~VspPt_$;ljiW znz=PNix}mDYkDKY8dHqhQrm)>KYhx_+9dcl5M0llAs{}-s6GT?AWe$KbzprOh$MLd9;Kg5|XuCBxiQVbutSav_n8Ij7}Mw-|aswEstjj4dh!z!UC-|}{Lwo!86 zNGX&q-E6b$KvZyffX054!h{2f5UE(5{^Ec-Ccj`ug1Z%*hHajCSaFT1BXD;^u#Rwh z-Q0jwD(*oc|4{p=VPT0~r+~oqG2UP+q=p-{_*yXa$1d=l>MeMfRo{d66RQewZ2L$% zKQL7L7UDZi_a21&rr$yeLj~yy3?JScvmemfWu9D85eoVSYO*V^H zVDBQ-CQg_h0LDG$IXe!}VCOYtwiTvKtf6ZMXr735^mM^#a)D+i!EwVZ3nZM=4?h9) z+j&6${Q0M)!`aX!-chE+;*SyWak0WPmCo$9Xaa_a8Ny$}rp3ht#`fS_)bgBofC%n%rH zRIv8c7NE=YaO;E{*Vv}vSj!IF^;PmR$tQ;+EIV*}fK`Dfh6)V|v`&eH?T6J9F=xWX z;kd2UjrkN;{b6W>M_g>UYiCVC zG14R&g7v-yrf|iCjPmA5C{UZ z21iCF*$3-OGSuQDG%|P8&tc0SzV2O6Loduu;H`qF_Ozm6$JzzZUE#LZS#;d)YXOMc zu}eDyg7IjH(Hm$bjw-xoZ>gHtsP&4i7v@t@_`bts9)chh= z0qZAoAqmHW06*=3apeNIE}*=Inv$UvC5Yb$LZujDT&a+eoAHaCO+I7zI#?mklBUOq41hjJun|N>2wn zKn#+IRg90b1^Z`+9f2U=?ACDB>)EQh#exdgiYiQpgc>{`RKqWzg?>wP;vy!NZi(mC zXnz;b?{k*{%L6e1SuDfa)x~9QaS1L^okd`sVlN9AT%gB5BMl19tv!BH9kc4HDa4dy zd|r-T)YpLn<@`G~%WH3{ewNCJiTOPccKOt~@au+Mb~a%R7-OiDi?p1forP$R9L7Ws zDhkRZp@xUrKLJ}qQ*hYmCaoC!3@DQkc`!`?9IeKG2q5*;P&25_!sm-dVGQAnDdT|C zoAlvQZ)~8KPb8in_~4> z#DY2~$-X=_hK{HIsC}O(l!C+t``|RfAw-L`<&HA2NUH?pvMfFofbFL0v`(_`p zo@BTHy&#w`1QsT6aY);?GF)V1paS#^aM?T3i%eiG` zo#Kt~f?#GucC?`O6xjj3f;jt-j8$^e3%D*3Q)^O!4u!Pw1h0kj3WKN4Yyy~hCBz~= zppC<#XXnAt(+~A>9=2c{o!)FElMHSe5-1kDWoGWhPAWs-LM`HWfp-H=sakQ;?oLwo zCDb?1d6M2^DG|N~X=ycz&O_}vpw3tXEUpeGmJ>?C^^VE2ul8oZ!9s|`9_zj^Zf;DL zHI5mOU2KtsJ{eywplj$NNJ{u9EDQzlYCi~_Aap*wOf?vK848fFdkDiifSX;-&3U-u zV2g!>hOYO6oe&C*XVs!aic)wTm$B`ZB9h{x-l8hH>}(LS5p~l1UglK(H7Ml0PH_bo z3d0J!ZwDP5&zrd*ahArelsImuxS!g0%B(p+)iA7 z>oH#UyZG>kfU2SOgLiuaNwn5=NN>SD3P$4?zvEzZHHJxJ_@DmtfqJK z5tc_|8whg~5ZX_D?FHu=@v^x5P<)6`1G=M2pF5p>+%|riwSXXkKN6#ni{uMPSNTF9 zuz|8H91F3TY3E-sYM&wOAi<<}yqe^c-ftgFKx<zrEPeTvL;ks|ZI(k_)%=R0BNPb^2YMolz0tk)*D5!^m5@ zX?gUbEO>FSQytkG@D}DtiP#YZ)lrW1SMc=1xQ}z*QiQq!GF#LL*hU`8eLVPTsdWp# zt}YZue{eY{Bp1jXu)35&iOR_>RgJM!Z@JKv^u+orG-V^u037j|Jc9J-r>{IB#8oHM zfOHNw!g~kJ0r?TkgSMx}y=`q*G5rF|`W#yT-dzO>3Dim`q=-rSXnuntg^QcpsLI<5 z3#G9$&)OQ}SI9CGGKiDxQV!_>_4yC%??YK4P<$WkV8HHeBlsKnLYVgAn<#woVz;#? zmU$1AE@4mLSa;bBobh;c2o*PiDzVNSIuL9V#N-+Z7ub+^;L!`LRx-MbF*!7qw`r0% z2{>te?n{efJ_N&?FoD5<8KTT>Jpb?p5SB4S2RD9LQbU~cJ}Bil+^7@2eZxWutWq=2 zJEvGT4LSe@x)bP4GFzONq#TS5i3MNB3r3mx^D4*R>X`)$DE28s#NxTlUtWd4s zL8Bjl2ohyFJ~p=U63S|4XJ!@_V$qjNH&mYZK7RF9EoWe@DW2L=AJ5XxXjQL){l;_Y zvj5UCsOR~jF0PL12O0-Utl$F;6AF}bU}3{cW_Vb?(zC=mftcK2E({H$#(f*o9hxKt zzQr0ygbA-AJ0iCQm~R{QJuYHpp+)#o;=w=^!hPHWrp|aPkQ&v}=e~H+=F$y{ zK~v%pk$5!_8pbcm&c~0GA|CrUBgxj|GE3ODW7$B{&ws0qT@p#Z?M8*`5hT|56MFgo zsI*m}juUbcjNMi*U2)^P?$!hH?ym52Wv&Of8XV{tiN_1Y!a8dW|21VXs@8*2nNiz42uTu{@py*mo8l~oPh`e6_ z9PyYCb~YaA1)>VghwbIdOOT>aggA6{p{9;QqXogt^Nz7=tfS_UFV^0qZ<*__< zoFMt@KjFBIzdvys;dHs)XQ7^91Bd6&)5h@3Y1S!j@2`-C zYSwSioQ7Dca^X)yz7R&!)(#HiXRH3T63dM}WtMTnpwNbFV$%;zxM^~7bLZ*^qG>^4 zTZI+g;WofoWUt`5jG+uxNlprcW6qEMic~+J+ z9wowNo$*2))J0%+=fnODPiAU+@9b;v>IvQ06f~}exKo!djSzC{o}L~MIuLk3sQHHu zsT<8d5`+U7^~;UD3ym1D@(;bV;^a0w^|&N=-j~%g1qcAVOyqUxq3o zp7ULUGB41o*<({Uo;#o<()vaCUp==@08(Zk3{z^pzu_E$MZP>> zyfi?N$nk2!gA>G*`5JW52qgJJI5zk$t~;nn-Otd_W2mYd#-4C94OZJuR8=q_9Um7J z@~Kd;YG-*aG>@{c0E8*99u5(OX&;V7W`kf5VipCV+dBcr1s@QpwFG{|M! ziZwux>D1H|6kVYsS4t(nErd;%{cx8dGZWt)94^WrE(4!~=i2B&dA5}IeRe-KYQxit zsQNL4mO;8FoN#f<gu1uSR=7NN9C*!18uX+qsa_&-5vUmy@+`{*&q zubMJ*{Qx^e%0}~{y&;71tjDLcpw&yUj*^9?cDrZ@8v0NgA+y6BKz-`@oui5rkj=>kP|Vl{?n6n#mPxhx+lGP2vr%7c2f;k z_!hwxrKXmPzx`u8le^rM+4UG+CRE~QzKF(MHK-30y8)p&_j&_HAo3+(ucBoA2jAX) zrxIeND&8Mq5rnc#xkY?*z%fl!XVmU-k!csh*mdo!{yi@V672LEo>_og9eA3^VdZFh zaOq6tuWzSI;_>U)Ao9H`sj;}t;`hNX*Y2%U@rVDb;;sHciS_#oMlN+tZx(G5g2a>x zmMhc~6k;r+GHnw6qDTE%>iu?4Y)ZI2ZXU|Vk4?DYD7c1x{)D&F8L@t|U4uEkx{!*O!x20VZw77c@~#CZV{F#OPs8eh5Uy@2t=AG-<|L!{o3 z=mH>-jl^=T3CWDLAh{(s&7Ad_J`3p-dMG6AymPkbkYX&mf#zU#bmR#5cjpdm^?_EDW6DY7| zBN)o8_yM8jFwQemlIE_z*!Jm@7=(CW-9CsV973Q^bd&DE-spxuAS}Y`=@cc3Pvz8< z7itr5FR|SvRci=ZvW2-OA52)_8ckSd0oAtcD&DmDI$E#Or#H~C;V%Irv%%WtRvV~T zlVrU9A($rPYbnPU28$;^C6jZCyCx9A(E+tP-h)is5(h@WX5)=oXvtu5bQ5cLz^THs+gqH+3-njhg2z+1f91>nqJpNk4Uw>uwW8Dn`^y|c3_EES}*+0>Y<*l3yK*6@UVXH5vVQRhwDv;t+I5@q?XNF$Wtzgu9 zEX@r%zNC40E3Pf~;Lv=W7WKNw?v>fcJ)xAIn~El1H!m=J_~y03jjUL=f=j<_U@{%& z4_Zf!2^`&6Wa;3fU_JG7LBHJhg}6F)`kJA}L13wVlzL962$lpuR>3DmgNPFKrQ+J- z4_6$zpvEuDz1CqFTasJm(5Ijh0o1d^fSZ$3%Bi2JR1Rx#%K?=Jry&)!_xAR7cY|1l z)w^`oeUcw=cdh_aWAz^Q2UjvXduf7a*-@0d03ohD!v#44DHwi|UlDZL+lyh(g-@v#rUv_1NKH#+`3U_LWP4N0fuZ-Lyxx67wkGVYg93Duu;d)rzkJfCiMN*wO-g z6W1LM(}5rz+MeT+wN7|#xnlVRksHSIfQc~<*e+o^F33NA%0}&Ifh85*^B(XJA$;;6 zOu#)L_NLdq7i`FfEfWlB-#K<6VxdpwWulYe3{JywNDKeU9oaEE?XifK z{pRPFl=q3U(mm6wjjYBC{gMxTiYDs^Wh&hlt(51g*A?6nwVzhz&pnF+j1mQ$WDG&j zyF{7Bp;u@x*_qeX);7~_9tN}*1!5&Mo2Z!s&i+Nn+0=N{V@kkp15L_XQR=SCR;4^N z0azA+h6-=D;lgurYnjjT5*%&Qq`buHHB35v?@sPtt3)Yw zyGhU>F-+C`FO9y@Fxd?{QfYU}qUc+WvKPx&dT+5q>SEroK)58gBorW5Dz>@VX_Z2J-LYoBH6S@ zs0mUF3#Sn)0hbfi^AV8I@qH4e5li5F1et!Hn1w;qr9#e9Kj=Vxzo61GH3NN0I5rV| zEcVpEFFlK}Z2;PKzQ8KnIsw-fhwy|KigHl*JHKrQmkE5cyzRO6ut0-$V zFLV|iR^Pzr@5gK6on=Xl;DgezA57}@*|hO34~xhXP=$ik3?Vh)Fb6OSq8@yBC|2Nk zg2dJ2`QuP2IVdJ) z(|!0B{}*3>9!=%H#{c8UY$vphNv3Kigm&6Wg%FBtAqts?B6FEi=6S3niBKxaSV&~1 zQYb_z88Ss7Db3&K?fp5Q-}-(3_@1@SIcrsF5BGh)uIqU{ugBBX4SWU+-4NTBINEjY zU0yn`z!~8U0dJ&%0lE){(GzC2fO$h=4Fq=x5ZF#n_n+j2Slm>zH8h{_qaF3)&Kbie5 zB@|Wsp(=4*nsGYgDb$`8Agzyi{lHiUBag{Fdr)?QJnEX^xNjeuYEv7F-lN(`4;_np zYIe`uZySf673xU;ZtWK~?DV_W?-;Qr$3Cn6-+hX;!h`Yts_=R##KZJ}$Uh23gX*W( ziG`J_-3$^dj#}Amks_Px5&&T-Vf!GEjQw8+D$c-n0aw=AosL4SAR&!Hr9`8Jp@6tR z+~VS*8-!7GjQK98C8XGP;u1nS2r!)RPF@#C{0*^&7}W0p<9qw|?I5B66YUP34q8)p zH@8|?@~Qf(wdM&$mVhgP(@AVK@-*MfcR{xrMeyBV+s2oZ`xFz$KT|~I^$(q=9k%T* z>cMAn`M|fYUsVC!={t7z3_jbtri22Hmm3T!o78=Tr)tqF+&0IC9w$Zz`_sli8h)%m zI$)yCEqCQPx+qYCu)(Q{2N7ECIs^m}Pb1{Z;_y>Y@Bq!10DwWwe-By8$MRT-HKP{2 z)QlwT*Kz@-z0aE{x+2*Gui`?q0y{0T}Sb^w{eKABi0#)I(5oTn8%d-n=;h zP0QWc*>BvxuteVKgzU=8?F8_)#IgVx9em=)TSQ)?9@%JxWj@b%X6Bw_C!1bN}Sgf?7*6LL2|m>4Dw15<p{%MgucXWXLcu{Z9~kfI0_IHwqF6}OC1!#Q$rzCe&w%-UxHx-TP`&kgfAgL*-W_MoFTOS{$v2TnB z+@X*$@B)q*1I}TX08XN-Dq+H$YG!tJkIy7#4g{4*QdsX?BZZ;weOBO z#`)JNPci1(e)4Vq>(_8rg0dS7nF<95L7FF~BH+9Cym=GwAJDAGyqwjk%vdHT`qB;+ zvq_vO{nfskwdjihS4U|;O+@P7?8c*Qn3O4O-$-19D7o=qfVs>zc$F3%bEPH7hQe_z zC=d=Ve*KE(HMh3*ohMWkbPs;$JyFD2;E_dO!uGD()zja zFhJ}|-g0?^rbW1aH)@~AgIiV{p!a}7inq2*>UxT-0qY0hJ?k$hKRT4&z6k9-0N$E1 zSzHym=am?%0u!gyN3pDj+$iU%Ij@+@yp`-3Bm* zLyZD?pqTO$WwCH1v{tU5cDksI5UYMSrYbesPq7y@zOHwMs*j;CNM(8OwYZDwS0MDs zSOz7ZJ$!N=;h~B|sv04m;L#7$>8cu7pZKt{`{oTC*NQU%s6!x7=2G-bdLam~h)s#M z5pz+(T{1n51*@g1w&{RRzKT^vSMbE0_xle?jU+~#xH&+sAYcrvG%U(QoUk}(aMg80 zD`Jn)AKCU?8|ECIo-k{6kE2J|R7>+TmdkS87#%%BhvXz)U23Yp@k1)D#WfQU$7b3l>NO-ai>(AOn?kM>%&coCRGMLt5k8sRRYG4M#EEJPz z+&MAOB7Jg^g|vu;`ST7BFhRkokYnf!s2u7i09m&*DZr6~6ch^p_Rv}qWxnSqwmi=+ z79LB8kH^FlJ~doN1mljF?_f5WxNgsK^!p5OMWO+RmOVLGp#D2u_m}IN)?*S1&MlB> zFm@&+fwgT9@C1RNOZZOmGKkcje*{%8zd3049`MC*&vGxMbtV0LER_WBg%1rw&Y4@N#n_HpUw5E>Y>ieS1&82)t4V$wI^M+~RyYcI-XDB-@uqSLeY%>HTb_ z>@+$u0;{=0g%Ca7zhCA32L1!0e4sv0OB2Xkz-iO;(H}@hynSMk-gAUG_6dtRV!UpG z@HEgBb?cHTnMJOu#WrP!@M`tD`LgZ#F2^$nM+&6MG`;l~PUxj-c2hZDV80we1DIc}iLw5g$dm&c{-Mj|T|r02G6G1T8R3J&2o%Hu`Ab^~qw}>8fiL`9y}Bk(3=s4) z3__VV+L+0s&8LusB18ON;<&6k_322Y4LW=r6W9y(_Fe!09Xozdgx~}sM z9X=YCt@s%+We8nrxM4xKvy+OG1PvM=Xw5$mXUE4))WGOg!A>Wby=W+qOi+Cw~Pc+~~p=R`I-3YumXq`*HRC zg~klkVHz8nw~f);qt1jP?gFYedcmD|=wqQzOZZiS=h{6_%ZDF-`u+>6pplusq1O`A zs^bf`rIc7(SgdmlX<^bTjq8>!2uETw1Ey^P;7k*RpM&zNZR;pkB0KkQGS4BuEAw8& zpjkZrf6J2d1{T*kZne&kTsOA;;&U1*^%QG-iT(M}GqV$I7WOp*m#VjZcAG?5n5_Bp zZ1GstP0=g3C`#-06%O~G-Sw`)ZkqM^=<~Vo=Eil6tq{uWj~)D>nmB5`E?z=@%*&jt zb#R}$3dCCbdR4A$tQw5lEWK{EEd|9-Zf%UFu}Q@KZVVIK%dmuzHl~qdEyQ}~3?|-( zK)p}UlthQrqys7tbIyYY@YIYg_`8n0h(@EITH7U*?;^P`+^QKcyug>&brG2f^c-=V z)CO+HUc7lY7KHC%3L>>8gaX(2itH z*hGb$ZFCxb9)k}M(r1K5!>_Is^G3FCjrTB(y~4EwYf6F4pomuo&VS{1OXE| zchMo%)=G`Mx6)Le2{~h6mU;qiBlL0OJ->ib)|j9 zah)e;PIDdyuES@?JCs@NG5IbRWQO*K^YA^=q}U!Nvm7%r=Dc=>Y!~cdV&}v2G)XFj zU8Yd6jcZFnRxkeUNE_V0xKY|h(;OPsLJAnl*r&?H%N$hpxagmJ^1M|hSA_?S!hHKXah|EO%0C2!a^=Vp^h~(kKi||#w}~vw>pOTzz|Q(Tv1`=orxtqB!tV3 zn}xs6=U*=n2jS*-;dC{8s+f?zThsSz*?Ih<*;7vj3aOv~KRym4Q5?wWi6;~l_dzVaSN6gy$5 zIoeR{`847={N z%;wD|YCWtb(@U!@J`P?#5nd`33G&&U%s&u%836ZP>kSD^LH<|``9&li-FRNu{KPfySJ6bG{IJ}SsRdHWIC z3c4aTcrZv&72D%Eq6wbE4WmhK^@f^Db$=|A&uJAXBLeXrc0z<0SRYI;{5a5UY=XR) zt3_VS0sIT4{8~AbrwSzZ2H~SyBMkiLWW_^k_1T;cz#4|Hu2bOCwWRY;u!!Q3*L-Y}2b^Gk0~K5)!!9xo+El z$A!m^<)PxyxzUl{OT21_iS>CcmjCn0cTrPWd(zK*Yq`w$a496QvD2=6`a_Ua<~1I& znwHD@bWJ(YjJ$}Ey1>Vg8NT6_qph^vG5dZzV%Q!yc_o3aZ-ZJ7>k}23d6iKk9 zh!|CQoI?@wyjEyyqRpFShv<o2^`!zQnv4F+m&IT`Jo4UhtJk-nVJg!ImJBj;MKEPpPWE~ zxMydVS2SHv@I`fYc@OSVJJ1ABKJgVZlB-TN{P}#Lb49jCe0roYf~p}W{Q5nyr?}wb zzD`fX_w?K4v6>eBd5q=#^Y=1Ih53Ha-<7b&HN>)XK z8AP|w`&pzpm>pmXQ>WdLiABsUsyBdT@I3;UrJZsWO&HAjR>d37>-HPk)dp0uD&eBq zN$jE%51I1@wKg~B#9Ov(`I=KJ)nK;i_yIZU(-Ti3zl<=Ct#VFp7G$h@(ABnRDlY!+ zePr&f?lT7u-c0CR^z|!Ul+Ko0rlh2I5|nMEkb*sI_nAs4YD8S*w&!#p{*d!_| z1^KWB0SXxSpu#wkjVniKcmONJW6UwHx<^TgX??u#%*2T3@}15^jQ%#A+r%zv%X6+x z*0f2X<{pQV>QcztQ7k&!4b-YW|7P&M#7eE^(1csW77cYR1~ayrAEknB)1yaU75?+? z`4MsC{b1|8n4fOuiP>88uR&}>6FxR_RRB`ND0MC4$?J8+RUK(CKIGc@m~A{f zN?^0tZ3KKlH`TIlwr0UVi>@HLJgJ@*_58v_>&GKCDK=`4JC*G?b6qb#N-ewnH71;63)U>dGn@yf|KeYB3U?YqYLF1xIC4J^RT zk(qj?7xivv(8=Tco}$<~7LHVZ)#LjPoR{j8H;jg925Amt{-%oKGvwS#h9rkb8;rVO zAaNSND0O*Z0x~3kQZ>-{mZ>p*Kfg{*`GBT#^)ro^rl7xi^+o3lY)zW<+Ll6Cl-4CR zVH^sSZWYK#*cu0FQ47gt1)yr4*NwD+W9orLzKh7e7DL;9&Fnk^*)%wnDX#`jW=X14 z%*e$}HVx~3Mai}&9{yvrOf6_SVZVsWaI2d_%O>~^VH1; z-#K`Vf3|GfP=2N%X>~1W?qQ?CU`Pm~W#8T$!`;~v1YfdL7Tx)at&;2-JFcFxtb`Qc zl6+`408voPil$-Nf)wFsZH>%fEO&{~JWxslewUGtItxwAE-Do^GtaPTvY`(tK~V=cE}-TN)Nz@k@Nd}Lr8&S-r{CR7yW#B@ zi?4a-=O`IQ8K%uj`Cqw9nIteQ5(_chCppV`}s4%7^vv#ijjpV?@^7?9O+=W@7i+ zjpNcbmtwL8kKfnprm~7)b^1dT-RN_5k+g0>0Sdo9Uw*A+{1)z%rp4G?_yJhiXqk*7 zjOyY%25nQ!9{YaX_fO03&p^uQY zwCKrWYRdc?c!Bq{3L_h-*uoJ6;+dULyecR{a=7M%P3cQ$7gxl zcqr@Kq|IGZ2rU@+wx?8nNm}$26|^^zyoxfJA!4r<>!1rH(zUTUy z-KWHciis7QOD#W>=T1qhcK-Sk>|=v(J!@ju0Do+*Xj{l9&Ib)drQ>hs`uOb3s>j9P zc(p6lT8h+{WYR2vA47d(ymINO7E&-7ngwYDwfJ-=6h!dVQRh_yAJ>Pk!*M{(tr z%7PEMwhi>(Cj-atb2{}HQlxeHIu~BMe)G9(rW(`N2WYN-cY0}f)0(4MD{neaOH-7J z`=*l{{4|0j=T6)h{9#v!m-1lLr*WGQDR*2r=YTqoLO3`bXqA2Z{pRn-QCE=KqdYxX zx9uPGmDmyX=-O6_;=1B3uZ8`zG8=C09^CE~oOrzE>_}$&6Va;Id1D+MolB4W*G=~C z+%-kOPQn)=Fa15!K5L$~O@DRM$F7xer!I1N#*?+^#PE&uY*((!n>CW>F35_Us8xS2 z+J?_cH&v5PVrH7l>hfKCzx!rTu<9zuZ<35B%}ufBFRZ2~z{ZoH4JiB6$+A%K$!aXW zlM07@@Kh%quH|4~s_mROWWrym(Oy=gT&09}>W4f)-mWmxND((r#cZQU&%8bsl{uX`PNGsm$&=HKwWv>+K1AJt+<@YUf zuCg9p$vSQB*Ph*0yn@)`+ln!^Sdn*C{kAgTpO0g$KYEmNf4SY==4~UYi#GCcMB2QZ zq6R3EnrLBa11xKJ4vJemtLI`C5pt9nRFEe07K?Dd6;U9u%#r$hUop z*NfQI=4kKv#8nl4iYC}!@!T_0S{J>e@d7C;+;tK#vSl971!<1*vo_@hskKCZq!{*! z|6boK1bd)6;jL?^%blB$(B~8Hw^4zh33S5aRjE|F%82E`_%by)0vcM7NP zL#@O#{Ezvre5kni_qc6mYYu7<+l8D%Nlf4On;kP6JuQOCCv)Qu=F4X6bm?%#AvP0L zJKtIJzIsZnw%ol-Zp+{vb7n8WT^mYXwW(Ij?*_gbrI(sH%Ol6ZPA5|bJh5@PpPMj^ zo)=p3zq2*%65H;F`H_CO?`erm%;N6M^2Gb-kc@WE)mYsNj{+aT>|0y2v@4YrCm2z2 zt5v1XJ1$_K)#r|%zxBt{GTEKBtbTVGw96IC8l0wopiT*45I<*gd~)#$fqWgFVc2tU zprS3UR6-)Y+8NhX*^XzUt*1CwTIaif_C5R#`i~-2KTz&?`kiPC#=nBP9DbEUV`#&t zMZR!Uxb2M!90_v0yY{cZKdzgHe&6kDjn|hDlhRGaN}7%JiN|HK!LNL;=2AfENouYO z=uVms#>7oj=XasofP(b7P3sJJt=^O$!4({)xcOqNgE<1-%Vb@7Jo_u$0_`>`p5yFn z^%OPQLEEG72~yH#2ut9>h|GrC>h;@6WiL_^M%oEbC;ZcIk%BU_ft+BEqNU1jy+gWwNkSS z4#E-9G{;%i@a*~D(cD8~fPa2IXSYvs)F5iK`KEbcuXD!VJ^O^w-F;`zx`BNcGc}C8 zDvC!#cM7uY6R$ankx65GF2%CXQ)=I8rX~e!WSW=|1g#gos9L`eU>gNtK0B46j?goF zC+8AJ)p(4^V+jl2zOBnDizsTUsK3$~uG>OWo;gB^Z5+1g4lCFrnnj5<9AB!X#3pB; z)J}8wy}5H?@Yw-S9DH*ON-qLQvOI^;B_J%6Sf1Z$4(g|DU6oF`^4y|*!Rt$E)9*&? z4NZe`mg;34_+gU`fG8mB%r~x%&7EBMQS(VQTrsUiQxY=Xscfq?V!mFN{27b*h^N3V zyaOI)^E6(1%TEw^QKp0!9`^pAg@x~snLB;cW*W5=>5sLg{a%EV4%kcW*MXd?88y*> z@ZjvPa62r+Z=NP`GAGvaO4C)Q_OjDQb6i9Q-0Cru10}0mVT=O~9*lym9dpF}IYkh`gxI310-x#;XRo9#Sj(8= z=2A?F9g2zXza-9~E3aV9ec>qz!VE`K)$J1*xYWewGy!M^Hn*Tarrk?c0AULzy@0$5 zvGSFtIp80#R?zA8d0^3cin+S)gs}iYfdhcPCu*pKMZMnV>46PlmFMi{lnTparBdX0<0ICI1Xh{?T4?dx}nfMM77Bpn;ahdE%O1*_7-c+?iKU06>wkj1I4q zcD&hw`GGgY?Ls5!)KP|zQ=RL$=3VIIQmL30TS|B1c>V162``n5{N)0886}0SHo7sg zP{^_~`M#F$1A;`e-`#cvFy67dX3ncIR)eEsq;&bf&2Fpb<%cbvF9b=Z%o#OD+JL>E zI0_MmX>O2}T`4u+rSAPY&IljN3ID-~1&M!Z-9DHP27fzVHy>P@)DXO%+~TJy#u?!e z+-mB%CNhLcxk&*({j$9a8$>%3&tq%mP=XqRv?majU=zCyK=lS^b{QJL{A+H`16c`C zO;%}$TnBI5_$z27bn?qhPL9i)u@fTKwdp%>xyiOCN1NT}aRgY0)C5kx@gua7&eW$1 zaMb3zRF{^%pgt#pWM@)zm}_Mw6Bj;<0JcKaO9klUPjH=$keLjkO*lok+!63&a&eS~ zcSVpyF;9UT6w~R8`l4-MvU)v;XAyOXqBuZt0l}kyQ=NM_wm|aZhXd*e5eQiE;;78U zYvHA)TS;LLrB5E6_sh(mvMr7NvaUFqV@v}l%3Rc5oQ4YA*L)?;)s}sL3d9-F^(8!u za)FBeY+xYng6s}~0D%(rANo}{CUPpJ+o1SAM`9=dO?U50Gx`OL5q7aXy@-!({Plq2F#kNTQuzh~ z?{b(8$XXwQ=O^H&J#yEG9C20DfLG~RMm{l;GP(_7Hg^>7zH0^IjF#Fh4+ui^6 z?c1&{>j7n>S1+86(;U8j0n2ZN8Uxcm&IC7N4d2v+f2?cbA16^IRI;sHi(a*>kliO& zC1T=7X$5arJ#McM`UeC0z|7)E!1HS8FFA*>b>APr29yTB>Wc;tPcfO>y1Ed!!3g^dbdbT zC9<0VLurg|c-^0nh;ds1RnaH`S@NjL{-zv(z zGcoLFusF|sVh9BI;sfV$5G$tFY2 zmp*qUV)I=hZH881RId*aJLNm9Pj;;r#?#69J0NS62~Q3(fd@-K)L6`!zl7J^+{ zY+=f_YY1R0gk@g5rw^r=UjK(2+Oam9{6vT-&v@>Q=gJA_*YMoPvdK9ubuLHH)Vgzw z#j8(&bm!loQrsi+w+=NN-<(|S+!Jz0TmBM2AXPRTq4f)@ zCnq*5+LN1|t-GnvC*StxBtSxV0Bun?ttFQNbJ@~WzlW>0c*osr zc@O42RWoO*5<4~v{y0+joMUracev-2i5%3(77d7TJMWT#Lgk_Gb=}g4#uE+YPw~h( zhK+X5%%zQf$0UBJUH$rYZ(f-b=O>deZ&ATz<@kkryteHv&lyKUk((|@r1?VLb9C@u zSMoKwllw{d`AZBOpB#rVM@Jeu?(XdGzy1)}En@iSz1oTl$Spvp;Ke*1hhjvD?Gph2 znq82;pg@3=#cwz4RCtvZg@XClDV!Idnb|?jhO#Wpr#^zTCoMY9%4U7WwJl~vxDHNI z&Ft{t$IR~@*?^NWoMXUgy$qwSJ$V($Eg5TTcr>s*;Dia)V%3zmN!%}yHqReHRwgFk zjcs8)_*&94L4E``x7P{ks-pz|RWc>oZ2*We6{jWzh_jf{Kd`_p_$c1&8GWlSW3dPc5&xEZu8qF#mgD; z$=m^=Nzdji(Xz~3N}DG%VkwOa8BtQeO!k00y6iR9{vP0!b^ z$`|$g$8#TV-P^g>Wz;a`6#S-X4r_M>;J#(|ojD9V<7A?}((8eNoo9af^!avA`QYPC zW6;I*l;h`_TwR2|UwXTbCHBhziE?-ih#q{)w8Yg3+UPiyUfxoU+7g#b!DYiL*GwZo zvYFN)7^s#c)W^oQ2%i>U-aB81QB(zsu%)#7$|f~$&K}q0u+?Seeoiafw{WxMl}+cu ze4r0eyS?M;cc_4lvPaX~9nL*F0WCV_kMNypNSLQBJ1QU~W`cDhaGc$R-A|oI^-vRn zcnHYqIobBu-1-3~NtEqAEOw#qU|Z3ohfiIS)LngTuBD@v1w!Zlc8E`bu_k-mWjrN7h2s)J?_lCC;u>8Ia&H%&uQdc=W@Po=b!cm4D9SU??7JB9( zB?X0{@4rfq>PhnxkMIYZ?cT!GK88QSURmvmMOMg1I6>rFG~1 z-Y#fDF~CdAcYzfOL6jrS9F~1J3y+5(VHM^YB=w4kAxi^xsK!sMateu~7+s1$G#!jN)Mh=gFNtWZ z;z}GN|6mR>MmnBu}IYN^UY)~W>8{J0sD;#M(s-yhtbz`;jFy-?IJ$HDI z?R^9fXLm|1#knec41gV+S>pVY$7OHdyou%CdH%_@LY9AVWm28<&>(Ri{#RLRpwkJj z2B@{)itGtyM9}V}5vyA}DQ48}#&qOHfUTz^-Srk=!{Ho$5-W0Yq;>m?uf?zI^@KL? z+JmA0l`*y$k2Z)2pASi99;X#Ocp%K$5q%#IkE{uVfyfG!%Mz|vdwb@jwiU=S)}l}D z`W8vDJB^*uH}MFlp~T{R_Ml*AFW&`ki?j|dqQ@G5c}Omnr^!&mBEAx`arK$UdWx`IvKH>o^{QdD>V?|aPx7nU{l0=Wa$vY1y26HZ8B07K)k^x_ z*47N)I02UkU}rRCRzr>8z?vWvttIIgyVDxmsaGFw-W~cLq|J={8{Mdh(E?IMu>6jT z-{U?^|48jKF%eP(xE?ze&v*d-e`5dAGZUIWjB7az1BF7N+L~Tv+-bQKp9oC; z(Eqi0!lngW$|)6GrF=2Xwxu34(!4NdgjpIkF4DdM16_^U9xlmrvs|pq!ismps8p6~T0)Bs>3~d>f>`0fj^A~+0p#z{FSsfr#0mao zSuPPFVaqD{yy(^|I{|wBQflT``&q2dcRtrlgFX&SuV2si`S&LvOu?mmbH%D~lUOE-=FS$@%TVCG0bgJ7sXts<0P}NB9FUZDV%{mZxQf z08{kkh2GKn=%2WxoOqX?b_~ZhyUJS6GCqi7a&*-buU6=&EG|BnHUj}(M=>g%69?S z6g}y)o(Pl-EG+{%Wb}y##?`nbvOAkbIgctnW5WpV{&PHUvOD+wZi?97=X*gH!5Q_B zpHlUoRetanE0V)2u5g1d5RPIb;ZCDI1$L88UZ0|a4I5R}nFJPXJ2N0!smf*3sJOoQ zVNKa}tQ@JLpFa7DZWJP+JyR1`SOx}^wn!6YIA_)baBqedFwWpA-6sC(Kt}$H%S3EDPY=iYh+20mOS&Uv&FivTA`0!P2T z(Mbgw+3*6hI@ca{-PEBWzzF~@b#_j6@JGmOaj`q5oh9|CBXF(6HdXGq)UK`yz6pm( zH|&8inj<()@OT%9vzbw-j>3EyR}xOLjB_4`*GF_gvvpNp?o4@h!h*5Q?y*s01K)WG z9@940RyFaVAEDRgIiBbaRNxt%&m+MR|7@ccUB}Xv8sYRe`WnlM^wZ9z$ytv zzIgvW$r#n~-`=X^Z+AXfS9|l8nU(1M zW~qssy+i$#!jTfOxf9|EJAk-VC=&|Y*ME=DvRYP{7AyyPzU-*Wq|LsY9lys`&O1SV2_*BXkn#tP!h|t1% zM7qw01kAA>78kEtyKA{Y$5avU&bs$|XtZcONi&t9t9X83k?U(69xb@WIdmu2XskAr z=0h^fWU+b)f2GV@UEZhRaUUZ74B;g{WL>^X&Na(&hPe%B&z_&IR_!b-I3jbg)qq&S zLK+(;n>RuexZ2Co8DesHE8MWxL?`25IAW%_Atisx=(gt7%=_)0qDalTQ1ZC(nbmL7 zlh_JHV~dAHYm(ZqDWApjOQJ@!Rbylo9(;P^nsiNm>b=cOzrlLeQRrr$I^n($e#$~~ za{rCg&WYvNNPbQh6O-Y65ueD8yo#i)s;cpcwvZiPw+LBK@ka0Rlecvw5#d0u%I-iL zab_}*HGs7^`&{B0dr>6ep4_pL4T_tBunN@Z;l&P*T&1w z^IKDVi;yiJ3)x|<^y#R+jbH>78<9d=fbkab9Nxwm#h*2?UKar5xl`Kv(;du9t~a_2 z`->gAN+mWwQ>ASR!#(xMT9~0OCR#HpF`%5#!nE@0{nL>z1Xs3L$qLZ_MtMgV2i-7| zFd=ScTja(x?cm+7I6j%H!1hN9leIK4+h}KL^~b$yK5+GM+*!aqo6f%escicf)m59- z--a0~CD^*S*QajJV?V!OEi-)ghgqS`yLjK;xF4_wuroues=0%W0W7AhT?@!s)w+iF z?K@T9vXq>Z3QO3@EqW8CfvUiRAM&1ZtPt$VjOP~bq@!P3iV8>#1{H3jaqfQEC?lr+$i$AN5jZBuFEUpl!%X#;{ zn(yuTdleNwq3r$6oe>ydu`SRfI`NHz6rJCKE_?fYVYIKc+7s~gmY~$$U7x1Dz-9Vu z_Iuut07pNPS~yNuUy3}Zx!(=NP|K`}|9L`+6Jw2#h!(===A(xD{AtmBsnQ4dwSI6M zVH!S1=#u2AYWdgCiK!aS4m?GehIjq{q9}=9^gFn0TU`D<;*SijCI)WApIrWd@bAn- zo$~+j;~u-m82}WV|Eqh~bj@sb{OQjf!UvA*2n*R8X%qkbU~9XuD1TeRtoNR<;lK$S z3&VH9--V?A_i94stj2?u2U++hao#W=SNw&3tW;`*m|V@t6RAJTuVYrlFl#)=G0au(w*36Z3)$ec-3=RVGicU53r`^Pb~~tEsxx| zxCv!^`Mr88kVZ3^|Lvy|nO8M}#IS&P>y3el0kyj;W?p-WX5{N~P>J81{$H$RV<7ie zhH}~IMTVV;gbe!s|9iY?4*ppaw8UJ>K!sd;nVXVL7V)8u{qI8^-W5fOEt5qUm6$c1 zyiFf}k;Xbf;>C2xHO~H=%YO`sa45n@z2Axw~2ZtF1Gq z{|mRwT-Tbm3)uYPzLa+trKc_=Z4rpWXwyq@4~!s1E3Wp4Dl{#I0v&h1n@Shyez-_2;&Xa zTqr*LPgQwiP~!i-k4Ba-`vAf)_AZ1HOQ3WSu-t@3e(3DM%8rLcaT~yEp>IJVl{ov& zcA;!J;%k?;viL}zX3wL+}rNF>D ze!pUo{tIrgrfP026>>|DOTNMAc4d7!_wz1!twYLMbnf*uYD*PaU*+C@I(h6RNsE4O zTH%8Jp`!hVd}IH;3sd!1Ab(OKpLu$AM=K+aDrEPY^g`-`fOcPGCa-hRb9u78we7%Dc!4f z^Q1mkB1dexMBZB}+QiwLAs;7cQt5oNqx^!MITXKGqh8rq8<)r&my8_Yr?;zI z;+y3M!T_Eq@N}d)=|ryv#k@%&+Vs`5@AWLhaD<|`!2(@kS{Re-oZ$%3OH&eKpQ6p| z8oRSENpr}_=NRhr`C9f#5t?bF4JJfwo(M4^F+|!Z2&wTfH}CY%I&E2LNCD`en~IK( zDl$ex59%qpkv%luMYL^rJ8kH6vI@`JEw|3s?xK06@5Ri-`>`iL`xS0Ul^-~o_|4K< zZf?-!>v;JfYn|T?gbS@*dr=xlyn+Hq1C&@uAZcUWe>m=_gZaOEny^O2x((b6DsdZ# z&8;fJ8~Q6S|E2P^875binQp2=TZZ|whK<^GGM29z|7S2%nqsFzLOQ=orvQ1sSZKpO}$v3++uHR1oy?dbI zM70dNS(H#a)l=u*eiiPqYWcP~(YF3XlkWREG*j6$;mACSjL6EH-Fc*GN^Iwik2ivH zBwpW{&bR9>n%0v%A+%v{Y0;tW`iFR!byHmjPytQ>Iysm%^vzdOK%)mpXZl_M^TDSc)m;jKy^`EF`qyt z@DxO%AEqya*;>8Lv!EBBEm^B~+E<;&LwD5u-@ikry=vJa)M?c$ z_p!4B6`j_>vZku4{3qA@8L0Aq)?ZpO>?)iNP!&UR&8;unNK!&1$tQR)pAxyK*J7F{ zlE=Uhv{F}7-5BHMphu|XM=NEy_Gc1_SkZ(t?a{2=uI!TM3mZ7_B3qJ2X{sv*-}UdX zfzv@zd@AOUe6#-Q=-1 z#K&D^St-|6V)=Ysyjhw{-*MH^pMUtC!|-WR$Zu*W8&x#mo00FIHvd^Hf6S2lyqwxz zmA3bxyh)}0`GP17#xR=$QKzPr4^9=`-6=ZZCA(LV+;l`f&vfPBwjk2_m&WfrH9|^8 zX$RirysNe|mv7oBYS-hE;%N50(tw3pxAzbdEI+Rk=>bZeUAwvnnM0iuaoU77%MT#O zPKIu3X-`Ie%vDAhI~-ZIt8`OgqH)O}EDyW;d|?KVZ4VX4lIAUoHc#;YAd_7(;F&zT z|LO%!KyV68TqivX>$$a4ucMjk!}zyLHgf`Zees`aBk4sJgp9T&aA?;LY<_);~{w!tIT>i(^O~sa#79A#%v@7{BZVj8(A#F@@ z3y*3+fo+mk^~CodLCE$YYayY?C1aFUMLsAf`&~J)s^6o?!)@=e;rf!^SH70?3!pR1 zhRU`tS&*8}1@DftUU-_>JWwm~Z50cWF|XC56TzmK;OfAgv%0M^v8NgPAKQA)RkS$G zze5PeE0xNV;)xCOvif-P$4Yj3h8{gl)$f%}5VTOYrzLJVe4x$YKvS+cT&wM+Uyon5 zfoonUcAS=&2P?s*sDh)8wFc$C|E=>L_D`|R>#KX?N>e^mfxLr7YnZlp-r1|@svzWO_Da#mq}#b~%-?E=rOne~ zz(FW7cT=lF=6PM~@AeKa{F|*gXexm|7-A<+!Y^n z*qu2u*Ne@D8711QPp{51^04x(h+f2sX4l4W&PPlTi`wy5r&Cu%3{{_$zqGf%$JbJn z_0h4c<}aLwI$!zv7R?)Q4;G(pRV^IG$9f+)zPH=k7Jr*r&Hc6_Yj@xCpjpTYltx0- z+a>h51%e&q0w%`h4Wey`Um;=#A^UEMg+V596w*PP=Um|1rIPxQPxj^JcUq&p{oPmA zHGf?BNuQ1+w|=1^nOuY5eLU0#yP9+^U!$wBxzTlyat9j?u37|o3f7N>uci%lwmgiV zm-pC<^s7wZOhE3qHdkw-Q+4oi{_W` zx8)!sO?r>-pYMNdcaooXk#F>3s6o~xvvgF%d)=OV?{fxJ_H|X@t zF0cfx47jiHpkgmww*4tzXNjs-IrsAmCa5-#DNMeJv=J(@>n3gFu(;vKS$2@z98i1m zV}{B0Gm_KaH(f5+P(s>|hkg|aD{E~(DSa)Q#7r*Itr<_r$1xzoT>0wSW}#XN4h~gS@LeZ^^>$3 z3x9_bF6KpF0`>%2Zk|o+!>-4P+Hc3*dOOqhe|f2=tQ(W6s~By&L7jm)rJEsLHEb%Y zV}5+$&-}Hd3~>fe@pI(nU*r?C^atKR3wn26$@=bp@kkRn=B{DGDdvM0)~eW>#dF4| zoNi{l%QBdq-5cq)RyWGF)Hx%6!XGlN5b0@IyrmG_tiq!&xo)i(-K+tUlJ=3_>CG-s*?G70m{+3u3ACr_yJT||QZ40uw=J+tM-OP53nT50GzG~-Q zF}#6X!NU76$0Pb4;aQ(86zRf47YmTE}cN=ie?Q zrcick&%Y5}CAdaqnn|vb8{E&$ynZg?_MsnV9|BiN!S$z1w zt_|t=n|RbsOl)_i7JRJ!=$}=u+A1_3T_3%V-7ag|%=m@9j6&Z<<^r8mEtWPana(HV z?Rte%S}cyHJa5sbye2%^Lz-ShWtQ1=#999QC4NPb{l;swX*{m!6%&f|e0iINh}?Xa zMZIl8J!{+eRMk`cBhu)4{X30rTqxmMU2%2;kBYUN#L4i3Ns=;pr_8bujd}^5>`vC3kt-J0IK{bQ&ttJ^!nz?Gv1YTtk9ulmn-_;c2*ViZ>?b zOVR;0KH>hee%wsKEP8h;+@dscaCRi+zi<}UX3@WvmuD9oEEYowuX?=C+E=18`j*fZ zxC0BC&E%>8g_sLYd8!$HfIY;U=@f~y*^g74{Twaq-O;{9*aaLI3`7s+&;9(SF?)3L z*68vHV-tdZjwO2peSBQpu~D|ZtFR!}O_Z(}9Q{4wSG+C54eC{cFrx-RxgS3cbUqwr ztKS`Dp;iAPYVF9wbEC9N9?nOu(w=r~n_=D7i>!Dh&4boih4fsl&=($*?8{d~b{?wC ztVsOa5*JwZKqL6CD|}g#Whd1A>b){bqc-b2<7H2|EgA64t*7vUk)>daxDMagHer*L z=ux9qi^8JVGL4vLssrm2CpegV+4)&MDvbAAiQjpWTmR8N#xJ$r*jz!b^S+$DJo4B$qndz*7D-qY%e1n)4}G+DXnroX-hc1nCNigGZjj|& z(-cMZAD7D4Z!uNb*UDBZdD`xYY}|%Ylh=RX5B{5b!Kg%zM{Hs9gK>)=TuetfvzQ=b%6-$jdiKTKNYHIFN_sYEHlFj@2c4eO)l-;7GP49^3E6`EmRn=hbJH@QQENLj?pD1Ny&ZDKCY;V~1w~4^ux&)wq|m>pMJVq=RhHA0G`JOHE5~;q35eWe zeyvnI+}bilpkNO};=$#OlvL^41+iM}8LK95D?sIE(O#!WvL!XQn)P0P5TEkA`B2i# z#>eUQty_l;Mpp6mZkc>Ee|Y$7u$~J732OWRaKbn{i}dlCpQvACw6boW zYI~A+orV0qycftm!Eh4h3Dto{E8-Gvu0i!QPXc-ZZ@Gty-9S6 zDbjjdE!|Zjddgz9hSl1uh;51KbKFKl_7k<=ue|T=MMbycYK83P6rF2Z*`~ZT*fsK( zBj`rwY0rfI@|Z^LB^VG4tD}whTOT&DHCAxH+%Vg#zH4k15P$$gg`kdSv`J;QkXP7U^xc2IZ^uNkp=Nx}k(Jk>+X zAf%GRv!b7kg|W1LGY>6Gn~a7`kk zGGo!|Psgnp8Xeer52ZO+_RaGh4m(-D!g|Jlko%vbdpx?H@h?qWzrI*_)!NS2^NsKL z>pH#*Q(}e^0Cg>z(CRDh*=H#8%6OONrssm~0cv1YB}W^}n&#&_IndFq9TB&`Y<2qx zogayJ`+w+(tKoPLW7J^xJYjqR162i~3(SqGou#fJ{^9;bV@HanIgKxn8z~Z2cTFKr zgsO=|-o7;rZm;(j?VMgG~xcS{vUVB$a>PLti>3 zqS(3DAF#i*lp{vFyeD8M8eGN3oYaf(;%k8)&mxJx=BcBo5(dmE?+%TRhi;?(ydwzo zJjfgbpOe$yxL+UQ&h8mgiN8K7_QAm^c`7@2nTBiR1l4@=ukD@D|SEj>F7L&e1ro;te#ek@+Mo^@Enq19W z?L&+jYg)~9mCh=2`fSy{mt#CQ+}pP_xIdufAq$CU+7gW@WB25(k3K9kmNhe(G|V5u zu;T7M5|zF~`=#@FZgj@l*QSeiC*itf7BlXTC=6SC&$?pBVYQcxvUF^dP*v0kfJv}V zYYD6G;0jhz@q_sA)!$sx8q2qhlcr~8$Yao16s>yN>|@i}^)>hIC480bhYV9k7)!s; zM(kzMOx%l-9Yr5H7_s6r=I2*|X8g!o3=G&Pfsow3oLm{Q$2t*-$r1khD=nz^Y05w> zV22%62A@SI46Frw0kLxL`a3sIZ=G#Zs+neqL@SR zvJCO^dg1lAy#U>bKLD zTRS$IbP$bh?UPN5*)QQVbsrmC>h+8DLD!CCAWYz%I3Rr){i3!{CgF}W1I5VE!t(N$ z9lRI#`f=}4KC)=2qn2B`AKx8Nwq#8XwZh!j*!AV0k4hxIOKihGVznM=?E|1n%|tSs z>X)9e@-xqiH>T=!7-+by`AT?>U`f%uIGKKvUz^SbQ*q(qO=9TJ(onE#0qzEp(GK*Z zAy3;LlEu=LnbMT!0LRf2BMz7}7@?AjWSJwRG}b?QDkG5JXggzH@RdF^?6CtWx-K(Y zABqo#&@b5TYk3b8wi$PLkpw7hbY<2eE$Fe_r zn+NLLWn=dhhFxOBzAMTy%v17`?H?Y?H1=Yv#NX< zSN4SpA)|KoZm+ zN8msvjOG0JYpi-I^k zh_VNQ3-avW*>D-UUNeFM2KbzhAU^>T2f%6c^R|uZ#1UK}k~Hy8Kd!B=Dm-`2hhxYF_pl>*gGeWJrs3tcK!z$2-E>kAwwyTgM z2T6r&Db@)^<+r74&F?eW=)@?s-+hQImC)ehGhWg77aTzsb8}B*{%~(j2Q7Fv6h0^+ zReO`Zs4Js%!~tPftXhT-QlpfK7}?EUgxY!LT1m#qjXTVZf1WE5Y|^kiNsl3S-|?p( zn;V}Ub6O}9JF{gX!2J1pqO|9Mip62f6dec>`$h@b^U}ERhoBCqHpH+6-L?85Rj1C26o`NOFSJ}5uxCz?AX`%64HUuOfIN9S>?_`C zJyxPr@bB_q@W5Rj&G<{PDIXUX@Ki0D9_CPgM zWBFn;Q4aaT2=*=`TxmdeN8~%hv5yGao}G>9gH{gG*g?ySt~9Ci1ahi9gpEQT4}vi? z2v}%{ZX*pv))F95{o{B0aC!rI^~}nbPl14z4bp?C;-I4U6pcljf}A;NRAa-8uuU@~ zBO}OT051q}6!^uU*Vprgkgj1o1r4dK+=>cLQtT`t7j!Xt$Oct62i^}nieTY;_Mq;; zL!7(1FyVvD&oBZgai@bnXwl#~Qhd~51B7O@AnoA5fD}g*pG^;(flK?~GLluN5sXp0 zFSWY7%+NEV^NOVb5O1$vLHcpnuhFVcu!2Oa@BTs;wMX4Vu*+t#xb1Pr^Di00DDIC1 z-Vaz*L)6f(3z>YJ-LpTBkv}UbKB+ota`5**MgELSt&I;f4hT-p&dLfEj8J)rtXi>f zhbp%tNwZUcJobe{ocu(&zQE)}=D-Id@9VNO*IF$HE1pbJk!mx~p$2}NF!bAo0WO2C zOsZ)3Fc^9B%x*~5&%mJ9tXWHmk)SVy!=1wNYh&3Q*O>7mqw-9OOg5svPFr;vLkIbp z$WGLUB)IM$rnNXXe4ZcNC4ZCg(pzqf(OL4@v&ua&>ZyIdG?nau73&QF_F8N8IB=c+ z79B%zuCy1Hqs<;~K($H1b`7r?kva?2v%kxn*ty-bRuA=R1+}O@lgFbBR{7hau0@d->@2)d_)FwopEDv0g> zjHyukqYB)g`9my^)az#5XMoOfhn8js7IYwtrf>b z2A{aNxS-(4@Dt7lkqDf#J_k(9fn2-`U?9j*9pQ?GRD1+66%lYwt7DhG3UQ21%aBwG z5D4dg%Ze%^o?{-qzP}B=>Mq^BwU?B@2{y4QTX$z?9y|y0;2XIyHw2kiyF)8 zXDw=|;5Q=51v|I4_5|>X^0&@=dU|f(Ln4&MtA|u=1ZxEl*W&({r;K<1Zf>4K_%*nS zAwd16MXPi+;N}W)LT4dGvNIOWxx!aW1QEXC4l~EVNuMY;xPWlXBLwn9v_+o-I3>Uj z%9lhdOryboz&8!nwzMY&&me}oD-lZQ#zsB$w`XT(a`}PMHkCTQ5VsldbHxs?R=R%anxb?B1(vXh2$d(Aar?qpGTs73%MgW z_m!Pgh0nTxx#gyP#8M7MVw<_mK67)Pvq!$jI;Sl|!K0fiG! zTB}UA1~{9p#CXzROu4*lGJgSXE%>$r;`<3lDt!o>K?58J5V0?-IR-ID_o6x>f%3m# z&;rQvg!DQ@_%DE{&NJuFG7*W_fMnCJGE-zq0_uQ*a3(BNK-@H>%)%iGF|50gTgjkE zcK?1Lt$vMNK}9AKLPPjh_@O39DT?n z0zZ?&Vc-p14=7{E5_J)HEJ#&;b9t-kAczK{(*ddhL9WU#J0?J=QD$-hSnQXW-`-ng zG*pDrlKn8l{*R~LSPs{X&*iDp=MYB;PI{!(;oLGbx2HkhE@ZEov`Ta7&%Xtt0s_XM z(xekILSgGBR|{S#g9-N3z6|T1w{E7!2-_O4gVl@Qk{pv^os606cSzqXn^06oEnX@5 zU71Xqz6wkm>T|3$s5K56kj@rsZ*m-33YN7=K&x-iV0D8}ttRqWUf(-YH{18cR4SYCZ8rX`!y!}-rn zJ3YB|EoV2)0!<&TmVk;eoK;J5LgBqH!!$f+@Z)C-k9&yLnn1bkSW3aSSCt#cW^%S$ZIAN?ZS!i^4xB6*)SM|0g*+I-yIS+%}r@Fs_E zJSeBR(~;kQpdaQH%b*xZ=M|f8ty`n(mWCHA(^uo2Z;v?Z-k$f#%e=l{{C_ z)^4;L0u&)%H%~Td!M%Ew>rR)BkIzMF%V7ar)5A^>7}YIty>E1uY?Q$8%H91KV#No{ zc#K~m0CT3IQ~`T!x7`eO!36(t_uU|$>B-wH8Xqh z6i__ARG);TF|5^K*RHNkFnjQQA!LU0^6~};q5C?8|AA5GulF!jN9?m<{LHhPfmGWh zhF6}R@3?_)8|i&(ZVBS^8b*c;LiN$DFi4G}>rGhvUgtVS>nCTVy<2gUu*me)?^HXCd zx8Jv#u({G%0#kcOI(! z`#iyC&80xU_;U4n$(n)x%Lm@nflo7|XPZwrsl>hM(!$Gh>U}Q;MA)PRZ3hK1Wlp|z zQ(yAu8%D{s*ZX?g+plh{Wj$q>5wvRwe2`!#^4EXo$WOxmXke$#*6%2$ZaQgytS_bc z-=9)TIc6gE(}cL+{IDg!nrx<-q*-S1s7-BqTtqxksiT2#8ajdQfW0eb=lV0NN6W%s zcS|qSVAYfzl6gUZ7Kl0OmbTQ8CrKpB6C-Sj&4$hJn&YLfS1`8KO}#z`fH$i=;OJu} ztl>A906aK=;dD*+qK#9-J59JaT2FjhZ|ebH&(d;@(&INWu?|P7572|)@D4o)0Guss z4Zt_Zh&35%gQcaVthF)-Z69s}(9!wq{M9TX7rc5()o=4TFitEi(2?(D{Q&flX^@7h z>L8FAjsZdjPz%RLO_0tFZ6CB)P~?n{9|NUf4c;^EKXe>F_M$d&TF57*X_a4hx55v{ zn*Vo5eSLjzZ*N;$8@paDfZaf50=CetOlr#8k$G%T`<(dip1``{^&ajG7aj(iVbiH8 z^@R?6(tw-Yn^~@C;HyIV8Dxt)M}kuVvdlntgD-lz*~f#6w1dza@}w*D>;FL+zr_Az z-;-hsQ|26cGAL9^^H?DF9ni_9CMH3xZNS0=sH}T?D9#PybMf*XEI?R1;5p#M5%v1V zpi~U@GBp;@EZDbqdid)%IX1dWJ;kUpm)$bF?sCFZ8P;FE@sZ(7xcvu4M==|wvBUW* zhKck!Ytlf7_AaBxaK>n79m#K;a=t(u%wrS+lbp|Ogr}(iXCzX1Ag6VAbwSYSQmhEg zgWE?u>o2~RW6|GT!^D}~E%0*8-Ft`_*C886Bb%`Q63CH@s!#t_5-3qtVhuw{zWAT0 zgc$V-e~`$;Ja=BE zvui6q*AsRvwHYWoO4o@Y?uFr{$KG}9_ zXQL!V2`>L3t1o;KB(a^|-WQZ{LbZ&ZRcjocyRatWs1pAVR_1%Cv4V0~ev}(D!VVXl z?$Fyo0ox2PqZcXMZ5S)_k~EI67X$4f5Hc=+uuDls<_!!FW@cu9uKa}(`wt_`<$2OB zq1J^Jdmt;G0)Y{t3nKE~4Xz==^duy1fMp5!Rj$Hz=@vk{LD8zwHGr^IKs78ZEWlF) z9B`+@b@i@Ehs!R+AB0ExHnr~_0>~xvtD8EY>AxIjb)rQBgNH5R6ym37W%YX9POEEc zi@mx1u?u#&YaibNSk)i4n&5PU|2Fg}U|fp+1z6L+!0dw(1e9om0!u|sejw^_v^fSK z-rc>uJ;-E$0QYP7l0lKVxq#OKp4WP4C+6nnpiw?uiu)fQW!4D@4Rc*(k2*tV|Xxo_PF9k6W=(>o~6$iTY9#^Iv zR!dwfdT8_xs0ffTnFcL=t;*vXM5c7@ttv=6`@Oy%LX3egrE$;vtco%DS*=bFc-H0| zf--MR?n!erKS|FwF&5#%O~L!l93K-G2b9;D)|-n~IP$UEJwbA6Yf3f;ULS~iD}AXX zQJui1bp>4x&>t5F!iDdCC*qgDyqJVWf{*OhA}>M2Yo(n>Ka*6&@5gmRhx@Ux@W;wO z;5R^j$^!|M0~Yw$dMQB2VEuonCfrk?F~bkPy1Kf2%l~{NyUV&B-oh;Z^9?H)q01py z2ohv5K^k!)5b#+@~vhDEL6ZA77`Ov!I*-G zTxiyZ)KM&|*!q%^lHkpQRtsJLz$^n|5E_R-DhAJIAeQ!oo*W$kQ=$oY5D3N(rg|t` zSsJWIfEa;o?3|ffC&(Sh!y59XTBTNf&@Pb?+;S8KdRB?~Tp-2qciy)H~c%PY`{>M6g z7eBgEl54c60cXTrKknHkj}$}DhjmH=vHE@po&)0&7w+b9%1%T13T7S|#={QS_5|7R zLBI0vmRFi;xiIdmwM+eFThGlSz%TA?!SsB6<1hC5X6}{G4E_1|mY|(J_XmYh*JhJ? zC>1f2BiXu=_O0d}*Kll76y1+D0xn*bza98k+V#gh-L`ZB=XrbtZHBOoKsbGbi5gSG z#%#5hlaHQW8$pd)htoFP%YZihHActJ{ig&!e;gx3CXKZ~ZmcMUahO|lawb`+31GtM zg=M<6AF4~&)_b4Fnioa>5w4XC@u*WYLQ$~$$6ZZ29Q7N`Bp5_ncM}uHbXQhZ2KOB1 zooP5l;mw9`Cb-L>y#&A&5bJON6oP}}2XuO9sTaIMA^YUaSb1}6W1}80VG!F7OgMP5 z8yXuSdV(Vr(ejR{O3cFYD?lO&hM`D!BqD-kus-rpmD8w2G+Alj=g+^Oy#nB6%-RjQ z%^;dfK-NveIS9GW(1I*180V@@*4U7+Oid`=dWZXdPJzn5V;1=ZHoxWm;rKm|-@j(4yB?vjN% z0f-8+@Btb>;^N{$NJt1_1fZ%<0tyE-8Ni((SYH3_y6*jYj0+W4GcbV>^azkEIa0|< zN#SsB;Sv#P1QrxrkK%woLX?jr7--k)ao12N0z$)KC{MQaYNi#OEl}>n_pQLLIIuhe z&Q)*j+`EQVxTsEeonZqT0h)BPwuV56h=>Td79oy^5kE$b+Iu}0#8~)1{11RPvVU_* zebeqX8%FK#X>E;QLpCA~sKWwISXo{E39w>Fx`7)$(_=2J*UWu)F2;gaVHBKJkD_Q4 zll#my-a&2#TOYiu#@HsY2<~9Q?rjnx|AWg*UqIHKcz!;{dkT^$X{gg`|NX8>s9=Ud zJ#f?y1BMp73_UyqEu?~DQ+vBznPquQ>UU7Ku7mwsx_=_1p^VXF4A2AFbS zFlJrwYb-(3`}Fe;Ufi#de7I{=_`wt$UsWB>9%?J6^BF=|2gqjoiRe2RU&8s!3h7=-RpY$IHSi32`DzgtSDGbYx zq)N-k^f8^tiVa^+yZ1xXbFYN;Md1#CB}bB8z-%aG=|pWE_58v3Ozl#c5&XuMK=bjx zgAYQlamJi~+O^Q=-s|+zqc@~ER>1wD@O@TB7@U^&36Bv^~fE8qPK=lAB=8ZFC{9>Ge z8CYbu$;H=Klpq3#+aSsJRRPbv1@S~RZxp`&`*kT69&QM=?lP$am{mYC;J={8f(AUi za2_5SXiH<{z(Gy5^RUWfo_f#ASfMwNS_&h<{Qf_*LoYRZmzbAuR(D=7UHcF|paHDcJZHm5_iKK|tFu zC=MSULJVAwq0|WZu(`Ag!7ew2s zL9Or9W|I01gMLmVbe`u2+93U?OQuV|wRACqPsnsRvuDt^kjmn;;tg1f*L?A&Mu6@8 z9gX3jh9Z7jPNV+R@M5l{@q>!ibDo;5@~vmG+K0w1))r6rg@`!$Z71kKDvU|*iVkOG z2>Ov(xBJNXpDR-~NXTK`tIj5k@+;0d9IDyp>+FKH-O>)t{B>5Z83-c^`m}td6=g+) zqw1%qTTh3F_F+P-nXAPmDLg~CQEeG;`n&Xfot;s=vw5=;=o)q-(gh`vh!mc}T#P(O zE%LqsCTpoShf$5StOdvHT!K=e@L*nU=K&w%TP9Lfr&?)MoPAdoCDrYJE=;laQN!g2VpaoR~KDM2s_qG5wmpDgC* zzyK7to6snT!VYTTE5Km;o~@)pC(cExUt@i*$kow~y$@z;-}SXVWxz8Gml4F)AesZH z1=?Q{vG13H*FZr_U-@vI1kcwPl|pGa!w0RZbRr{touAo}0|Q9#Z-)^KS%g*z#dhmy zCud&%D|o_&tPXE3vu_X(NPoD<8Uf}96R>FJbp!|=!HNT%qu+j%(Qkl`5j_Gp$~gkH z4p#%Bi2$x=6Vzxjeh5|`_&)YGODn*M0p1OT!mCcB%T8!9pvAqufN~MGM>;YhZjM^7 zCxG+_A2(Y8R~7KO!v%xjvov|}Dj^3PTLz@`nt>1nK&)?HAwU8Uc7OiIe?oB6D8+qG zVeX40;tjIfLy)#%WCn~W#9QBb8r2HZRJ`Y2`<*1M$2ApV2mQP-T7I9N4i_jh?efOQ z?CZIcmO2pRB+il~fSo*DZHfEJSq{QHE-o(G7Ui{I(AJ_`)@8!oj|4wC_>iH=>^1wA z5c*vRM4oGZQ4wjEQwC`aQI*I%xDY!`xDVHX9J;abN&>0H_LD)QJCLD(xO_|RAF#*Z zK7_ju)`h!fv@%edQM=VEg-U8MoD_-#l9G-tseX)acvoyXal-+LT{g zyb<>rJop37J!DsVZbH%;u!q36-EJo9-MeqW!Ojm^jaeokoClIa6c|u8=*_t45_*3B zrg)nIv^QQZu3uJsz-lZ2#_z%#62osvdKC!P7x7QjY~I@D}f0b(eh985+w$Mqb5Hdyd%10hOvDN24st;2V@FFN=> zEp3Qz2l$*&CaD6h1V(MRl)@ou6mr!2&@*SJrwe-@uER5|1&FX-GtkZ40r?dGFB^Pu zoUND6+S;jwul`FjgFZaqtj|bJq;~>pz6_b97~B}6G&Dd+=cp2nw9 z`Jd4weaSf;tThAz_8#SG#qUe{MN7gv>~^8k6mSpL#TLOgN!Ev00NN^&KdM?6AF>?thti!wfiY{lN6)fBo{@b)ua z7lu5B&=gVupQW;^L2A;tI_BN!1|9`6RwvCDc_{oCX%FfhGT-^`gpj|`pwQv4ks^o* zO(Rga#aQx$nDAgFQYJ))4+35*^+kOTJ##gt8|)fi>fMf`lJMR}OVALb5KxK3_$O_y z5+Cs9E$o-W6tm#1937&Lz(B)%6ZDewvvsA;HevQ@2cTjRKlm4IIR+qd!=nsdjDKyn zsX^IaL0pnR%7eDxZ{d6UXPW%~1z$nC%xTy}TJf&eOwIFmi=RjrWX691yfxG>_S0Vw zvjw<@APr5cl-;N$1J4=$3HWy*u42FfL6mct{sJ|R{dt#Q3!-!fV;0n*2x?e@JXIi> z8RVC~g@Wk~4~964;}dtP8gM=ZR>SiI+4=YcPd9^pN&qkze4Exa4e&_;GV>JTcb4`+ z|EaANP}%^hd?zP7kU5ubuC5A+qhn)7fIHm66*~kI)b8e{w9N?|@Ib(>(Y+;6h9F<` zLgXQ$WjX%?e|HbA2bh`-O58M+Z^5a!v#}v1RtrdyBRbdi>o)33WEp!H%5<7Qt`^J% zXB*sNmwe&zhf^QEF9@(P+*Dx+qkt*>N6R!_dZ-{vFKs%yO=z)V6 zbTsi}1h>zxM*gJA`=huS)6Q9nw8mdY&p-DoW~NFyS8Ekf8kKp7U8vsrH-4ZP}tH zNzXt2#FL%@qkCe+n!0qf?rhao9?Sg{OJS259Tu~-;cDLJNrZ`?c%}GMp3`wuv%kQD zg|Z*^K9(n;F|i-&j%D~|WG&R0iyEU}qXV*Jib=?X8WW32d#05-y? z1d$@KW3RcM)$7CX-W!n2q1{X%$x-zkA|w`9?>TN84P%yf2Ss=AM{hZh?0%B7ilKm2 zazsK^K^v*NjFhn=On_l5Y&YL>1*3dGntngOOTo`IAW{hHP*zA|wbVUzf$Ie%1r&{2&@$ob1YnJ%w(Yi}VtZ@p)V4 zK-LEF^JWKFu`nJ*)csK9Urji)Ue(fIfVsc=>X&SsfX3j#zq2Nm$cA#GhdAFpJlLn_ z3$&)?aXO{C;QDlI&O+nt2g5T=WXE3=ECs!0|3F1FE7q89^r$F&1sEi!42X%_b`C#e zO-AU$*X;qPxDhfY(5pZgQsey9Ul?4-VQg$~{{~gaz+?8mNX;Gqz#<@?EqmXwpn0Ex z>Vogl%^H+f9>1NsfkF8>Q~G`fS9I%nX)6!*lA!;Rp!iAsAcVnzXM=E;vh;3xLQz;) z`yxy>U}^#o+wXN9iKvuFOKIMy}*?~I$m7D zMEXrIyp5gq{ynOxN{V^UUlnELoX4oV#@}YV;*3K|0&~7msE?B7t|-NDNsXcMx8p<1 z^N?_Z_m2bKu@Zh!ie&SeIj-P@qKCzW8}E+NOFd1Ov>18sIod>tJSNxTc&})=h0~sl z@;vSLwP`-To})~G$)h2&?yB5t5&P-U8De1(@87hC2e<*RobAiCiem@v{roHZGu%vw zgZ6_~DMT9L;4)*khchJJewrcVYVu{!5v!mD%pcYRg^9NB+?bSDNQ~FSnU(E zo0m(L@VD25G`xKDLFVY|hc~j{l~W^RMh}f=tDa_3#dXd+8Qbhl7~vmLtZ_>hct|b> z;fZ8Nw+7s7K`;9U`_2j(yj`vaVJU31Xu2Ran1Tt$I5hw9q!UHaBT$zS>UQmny=gQp zCzc)$H#hQ2*68Z6ulOD6P|eiY&$42C2g4auE1(nwb8#m1ZqK&{!1MrQj|n$1f(Vd{ zz^0%FL&Jn0Im)QrfUY25!_b5 zYKMt{@q^&G=t!Ij#8V{>yi`P44LDpx;S7F`6)2^Za@BshUF~;MBXCboGXYixwp!3N zLEVHC9I~)OnG<@=y1Kg`6hP|;YwtJv64%|J%Rum^7##D^I0oOSmyQA5BIBP79YQNH z`vK-Rml?adE5u7c?RPi?*MlwGYf$w^<}DwbNu1|P=mIjgtZuFWqWVC=A+34vA_cOF z7c3>e5jS^yD2}`3M-+bpA(Ybl0E~A0Op6=!=?4%-p@CSuBTJV6c@`BDi??d6RcKWM zMWFG9CmotvyY*MOg{~{B$R1rwBDS~~a+q6Omj{}1$zAO!rJs?i`$cj#-#_#^~gbk|Zukf>O zJ+^6e2g@WFV2Q3^*#=HOGoJXb!S$e0Q_S7m+_<~IchF!zD;(kuQgQE!Go(HS zhsvL7+p!xd{$i4RE!~W4?k~QeNUw{t|26VvTg$Ef?e1p=egMb!n!U+x5hj>-MEhI7^ zi1v}|4Y9S0-~_*G_oeqYc-TPc5%%1pG2L#xOuhM6=HO=oJ!D18c}e-!+h?AXP}r4~ z;RvEd;`Z3U#-|RQK0GM^`h*!n6L+6CI5E=;10%!PDGTqjYJt#{+NbjLDFjn;bGKRE zanpWOsw}?T^TwhuE{ye zo*|P?4D?_E#u%kum;U%dbX2KT;fm(^Zu+1PR(6yIR0$<=G3rx{SheFU`*0s=uqH#N zvi-ZBQ1SV49K6b1c++k;MpOpW!xPOxrrOpL^*e0zpU_86Co+%2*}i= zY!CwL9vS%q3Tz39RxcnXz83`SdLMMyl$#82t$_Iu?sBlQ!&i?`-GK9r&=Wdjp!Z*K zM!@L7dj!x+@Ci_ALjn!4A1eI?=_I(K(T=254B3L0QSKteSQUlUc{`xf2+=a3lyL+H_Ehh zTLBSq@wu_FTerhYoBp}We{y7Ng2Ou8nmDTS?98iY%;Z6y7`B^1cmkbP_iC5V>o(t| zHzd+MfDr^C^@|lg0S=3e(OKu=B9cOIPxLp&&b6^=kFWy30r{^UeD4!sK}uCBDCm<; zP}4~XH=V-C&kC14IFpvI^2@2?OdSB*czRw#zb3;QZY_>}ERFnfAzr7|6@!b|%t!f~ z>Y5`@I!)w#{>(M*YRD2`-R9fWR9flpmzm1!P1$M>ZXb?)A3j1V^dZo(Cm3`iP2;j%a2`=y9$T%E?28DG4YWK$Q!A(o-FK zz12|l=`IdV!7IO|hGd79eOT3h`Eu3EP;CM`zZ`Hn50Z81GoR`SRNK`JS@l%0+(9v2 z3lf{NbBd@E!mK`}idzF)0Jv&la5DwA>uuC@^0vQHPG7Z3;WeO1M4q~5(h1!O=~^Rn zYtXZSISj&`?<)Xxv9uJjouDp)p*t%nHlkMvFHp@CKKc{I33PM#kczs#xoW-nxOEPb z|G%@1U=D+NC0&8Rq>@zF2R~*h9VXseTQEHeS4Brh7eDJ&#SDrcumDad_`<#IU@?6C zleR^#p`S5MV>wpLJ%(aMm#E-jo^`NG8LgisU`RS_g5AIe@r;XlI{NxH<>xOUv_i4L z;2xBBCJ(hfA>m6R@@1no{mQg_mSO}!%?Z>kJBBCf2KH%Tcz4hQ3!RK*(z(B8XK~bv z=FiLKb>XWFxNx|!b9QzHiv!4&E2&0IApi{A0krd&^$`|03WoCKZ~pFH|E&5%ZvRzE za}4}NkL^OXtX>bth4_Q-b?pH3H<&3zSAwSUtQhT~8t}JSkT$N3xr$y*FE1~{+xG2G zpnS+LlE=|vgOCFmg6CRGU-tTv-|OS+o6f(?ssc`8Ldtr;fz)8@m&XWeC!G$7wP`}D zIQUN|pTOQ*H^~r8ZSEXJKIQZLo{RbQGpP>En36%VEYpxlF>%DGR@qbR9_LDv4{OzO z;`H2)8RpK%wnQ4jjwwW+eHt&2B(F4hk*JXn9=nqs^NxwrsMhwZLFH`wa@n`p<1_oT zkeURKMg3e=@VvD#>88TuWtw{vZle?q6vTH~WI zA?U2RHR8@HC!5RVmp~GI7Z@pYTKr+FVW$3y12226u zotMzOWP(cyeyS-9uXd(uvab(6#!-r(v#TKTUTMxlpo9Qr1*o^enSZyoP#NzeHo=xN z=pt}2Be?guYF0KjSm?n;%;g|1?MyLzx(r}7W( z^#bk!SEiWHG4!1Baa1rL|Ig$MlP3}4s5?Q9fSX)iB4O7(e8cG*$c?W4*THW~532ro zP^Y0kAE0I!cGz5R8BSYeg*voqNVi%#|;=W z-xr=Cz8YB71{KfP*x1$e5aH;*SysJ9>!gUzmkfv5CCyVXE{g~YgQ{`~{UYQCd+{n48|a#}QlACY;l&9Jfw?qd$yZZd^@>x7># zXgJZ8ppR@Qmdd$`b z+_VJWK9SE`-0v-xq2uO*eVkt&hm(uX3MNycCyA@YV7aZ$F;CsYc4l0|tEeLNSwv*y z*5|p{S{c#AaP+vhPwLOkvSMpBN}gk(lPgo>bsX2eRhCuJ)~Ya|j|j38#O~YPqK5A* ziO&VeyvIDOZtMlmHXhG8&t&fOu5YI)%9_O}?GI=h{>;dHTXeD?=f^jeq63a~zM&N5 zF0$H_p1Rh|EK0pr@2UH_RY#!%OZm*z2h}NdJOE6t(JFlhDTm}kYLkRk1^Sq1?X#IX zohF8FN$I2c+-~E^7)Z-f*BHGePB4NUMVJJ@G6*(0><`mNzW_%!*q7kvZuUa1u?>Xo zNL}D;>B67$TurkC?I4U}K!JfrNa$=iNfp+~5JP!zP=dV@m?Iaed}OlEdie&xdOyB( zBW=fA8ij`{wNQ^faB{26XDP4noyW;JU;GDna~*IA!Gb$MOk)`O)PVRZWJvNHo!R7fbW`<;XVijO>1X|Y5%4E5SbJH&(R zNb0+8HPeOQJzB!>vhrlu6@S;9G&|!R(t{?A!I-t?)nQucX*Txn-osSvOwWs&!+uXL zBE9C9!5>2Bggp;WH|~U~X~)Z`6BT!pX=dtfrE)a*x0f6r*XDm@HuUoYY-|7K*uy&8 zdRj6Zy_EKMK2W!{-#+0qYB1|AtNR*L@@iC=kUNe`RRc6_njd)tk3@N{e~>rY6!>~* zukF^Py~T&Y4}jLRbO znoK$)!LT7qSLt^fcgK6{n{7GE?Io&V$Dpu{(Xx}A2dBzjOpa2QmeLsF{GV^{zv3`z z@m=bQ0d<2WG*jGbXL>HtG?iJJq7FqGScECzXDJ0v(g)WP@fs&h+Y zC~>cQ@L;1((K)}!BZ;mAdk@&NUg2w^8BE$zP2#=-(k z=(GNxKeL40tliyH@P=n+n<04zx@stcj%OSmzi6na7<9^jKa8ykMZ49=n@V{Oq=F?- zIoOCHKUq~(HCOEsIC7w)NM(BwL|0Z)0^N^Ve`ww|Nb%rLyEEs{LX@7F3BB>V>09X! zsf}RE1^smVT_F&hIU-Gf-_ZpX5|~=E;fok4R4LZjJX^~SV|`Gf13x%erGeF2@F2m5 zwzZ;h@SE+7$&9P0%O0?k`X6ZrxIt?`%8p8V1vwU^SYho!G!(GWhFCj=k@Xo)$9QDN zZJUH=HjG2uUB5JhgoOc8CV4^=vZq9uZSVjC<|SYg1SYk?)Tzraj756GZNI?mZ7)N> zkMNPf7oD1LOEO6ybl;c*t1wv~f51@gLy7G4a|0+VXBUib(s)fBnroP;p!?sEd!cc> zJMZylS$%@{p5~WN4O>%@6nhjk`rP)@?gwJ6&J~g$T-^;5A-t7~uaTX2w%X&Q)&E2! zlX3@F+%v$#A-mIzDSU0cB-%4;jXR9n;zgH)|I*e`dcx+m_rkT&Y~$`u%iOhW`(w__ z}{6x0IU> zFI_mB51)x=YZBdBMM7^lqZ$P6$a5O17dgFOX?~^5Lr-cy3ww^^Xu)l;6%r9~r~e;R z!V7KxYGN)>BiSBNB8-#porj^JMf&QW&L}9y;{q<1G+5t6&&+zv<21Yi15!#6gCaP! zRK<=)5$jNc{>RmNb@o?3Jz7Q})c`TTKWUtYC|<;-%|y#_4SYfnq$vZ=KL!Z%@>YY7 zDvZi|y#nlsCp$AFaoquH9{#{ty`0Lvy8jL$yi`t++8)zu)I!V%U(BG1WclstguPR? z(YKQ3WHGjYB815+vYyR;gGZ7}fwA$IA8PEEKwK*2$n*6v&>oB2rmJ+>%q%UA?#`esRH%-bo&wXhH8obw%cSc!$rR9}a^Q7@%2S1CPfK(+|#tr;zQm-!#R$h$? z1i3dKm^d(!hffVZEi!6q;45PgS1|tYF6}m8=RWf5_tCF_~Z-T(^lka{t1uF7D_pY*6$yB~!Wf z$kn5Zj@BT7Pd1&DJd;8q)B4HXyLU%f87FF`k;@D#o-0;DyxF~y_4;Q=+xpY4ijT+= ziu8-$qI(OYHVE*$H?WiGw%8V%i!gUtx~!DE5KLt=%2V3xNyDG{Z15-aFn&e1xOQ}5 zFNcoRG|AM3*99kTDrgf^J0UDc_zppQH23H4#9$OTtY7oma6Jb>q$m9Vd%ZF6g%=F( zjH=A;(4r|ZgHHqu4OCQAp)Dq`c>%K6wHIVEX~fA|m*@_vAhIu6Ypq5%FjY+cW`UUv-264hUydKP&;_Z0EuY%0ant$4%+R^@vr^lyxDhsa2+Jk{~e z0Ie{w6+Q-`Zuvv6zgxn3wu6H_a+;w2-m2V}KqoKOQ8%Zn98#J|Xd@kYhBv;j^+A@+ z%QNt00n6qOFta@;pppt-gcckM?1~<5ymS;+7OcHQroX-r-vgc`A0H7>hDXXxnKeUJ z8PIgVI1T##Hsg5a=L@tiSM;}#xjseDQ0Vq0mlIoiaA3$45l3p`=p`pFc0LjKq&Gj8 zz6 z1{4C@4V_Kxhdv9ZSx3lAQm|jkRq8BP8-BLmCw2b!am@=hI9gk&@ip>? zzAb--OB4p&a63EKH^C%~kooC?-(s!;QxbRtK}myL4A?Y>JyG;0wbj)wFmwU;8$uH- zt!Rl9$N))zJd_(2{=oGQWxs#3i&Z?$!ML>--0m7A+BNQp_>QD+bwT zyC8ccO3F5NqU+MqzGHs&-48;$$xY~SIZ=FeDZE~L;%ayqN_GA~eo?4fW}PmFA=NG< z?cLA)-KXu2`s%Hi`@Jx=L9geG=KOvr^Ld8Lm@cUo8m_iBDTbG{f#?rbp%{m911f3Q zMi^Y9Eqrs*qBen|$17s-E@G9Z3ZAFc4_ zb>Ul9e(h0n0}ne@tfD-cv|8FIrP-nfiPqDhGUl>L1~a9jKRO6UjejM5xixTPz!E>z z85&hV>JDzG`0BL}j}EhQ=nqk-aZIf~1x?%%))LPKyTNxw2xt639UJHt-DzSh21Tr` zKwnsucUBm-6H}6u`rUuJIi25IzMn$cg@Qbuv>IFU^xWLNZm;pXD@NC!oJ!sABXbcD za+Pvrixx`XCvpS$usYqUX|W$c*&AnD7U02e*M_^_@I2I|MHSlkqNJk?ELM)@>f4UFYQp z^ezYnTq}KZ5f!^c8X71eGtb|o`1x>=BS#ibdfiuYWe}IDVM%z=^Ugpn*`D))0KRlQ z)`B6C7M91ykiyS|yX?#p{z%H{^ifT#IrOj_-BtV(m7dS2+$Ipuyu-QKiY3EJRTsy_ z!d{CZh}knzhCzksPPKlN=iS^yNw@sP5NUjMc;XUSFdL{oO_YYd#Q!5p$1R(nJQBL9 zTdXlWN`o(>o)dzJLQnM)%x2%wl#bY}m-l3Yy38qJdsp0%JZcW2)$a4IFxE@P0>k9wVJ{e$GE?_ukIxI2zx2h(vs z9_fZQ)HGZ`K+AX8a9=bjNr@*sX`jZdCoA?Q={~p7kW{Kc8N zT?~pS)Uf0a2|-qy*7JF#m@N*D<#^xZPxszqv+>0*u~Y5c_WTf|Bwj0n)-~B)N#0)Q zNDUy5?ShP~m<$njXT06YkYB+uW8`;|H*JUk=S*9554jjP%~n_o}QjC6A(p~NmoVF;WlZm^NRTP>2 ziG^pMqS`P&iy>@Ue@4LW`H*Q4n|E}vb2zsgV?=$>E7Is6ksk;H(^JZNFg4$#cPe+| zf8oLx9buHY)2sW-Rg6h3Fd|4EJFF+Vx2?#uQ6ot-Zq#ZCI9s63z9`hG3Ed5>~V;cxSTc$=7wB_ti97lab{Wh2Tr{TiPwtY!q0w`x69@E><^ z;$AR)6C!8BP0VP7)_!`&2J_p$j4vf60BVBT0jA-`lX;7^&x(z`Em?>lB3t^oBnAgo zSKb#xfmgcbQh4!f!M`ZK&i{wnf|$AZP>Ie{3eX36PQss_VRbG!dEQgN+&jXHk>hT` zu=96zaU{|&8h0f(1mUHIN#(0UShhFMI$rOHGAzHjVr93vpD%Oa% zFJd<)(P_(BFl3BlZF&=F@cRC*r|%A@`u+b$2gitGA6e%dBjezRgigh=_lQKsv9imk zI3*d!Oh_`zPC7CYl8l3py)t^sj$>5ziuAkre6Qd6>s;3vuls)9>v`YzWB8||2_#Yx zqptvxJ^tLnw`%WnI<6v0ZE~!@n>4Env?!BMIUEEBM-tB^$o1Xjddg@g%$+Qd|Km*L ziqg{@Nr*_(rt?#=IbS^@?sA{a$Z)!!_o#4|lX8lasUDZrO_}#z&wiD>H8wIi^ZuPvg(?W5v zaG@{WyE*12a(y5I*>%pj2%;7e$$^d^<9{1ruGFkN$T>3Gp>g;^(G`Wa0C%Ht7t}R+ z2;j~(r1O$7S>g_+OPWaKGT$m9O;CIyk-!@*7Vev?tSrjS+I04d$onn zl}GZ(W(a0|)2n${EOnUg(abXrGwD>mLJ5W>K}Jc`T}`#ZJi$TF=Zu?aD>W&@h%DhZ zNoccFIa3kE_m`q{*eyhEW^%QY_RUD5RBXN3oeN@OFNm(3^ItNhR#?+sa2v`ieL)$42_F>by7Chbkw~JlVQX$8vZrsQ}!e znm=6c*yyc(hh^7xM<3@R88wA zpY?En$SE`2UowHWo)4cU|9kOTo@_o#t-N|~hCX{YS9VK9mhJ=wCOI3{efU^efr5=> zqMr2etnKyXPv{@CF}lWObB^hs=>J`N+DgDTZlFlMkOKRmO_>^6*|7B(vC?4Ip+KkON);S}OFzK&>^FJ)$D z1Z2MEG;CorH9|aZk1hZbr=e8i6SqgjuA8K)_hW@own>)GHcV%b$?&&~`?B;(ElWGk zuvg{JuqWMpr>?*s(YW%odbfdDENo0{Cu-z?9PT{gMNRIxt#Br1Zx;Xi9yogM72nA~ z+YG)XZp(Z?&_k_r3yDwUG^ew=F|<^ z1?BF0(K@0i0{dNq;%gE*$!1!;a_JDgXl-%P&;DpBgu8)ryeXTe)wAfO3Tuf~(*a=v zc1_$HZ(f5nh?c0Hf+n(17$atig7x{M^)zfPbDyeb5MJ#5QU@N?Lkd{gu{Gb*Iw|X2 z(?Yz)-^f-JS_2IUSete@7mYb5)l<(FfBMWY`J7vE&NA`s;?n>c^wI$?z|UIEWXHl= zY9F?^i`{IRLR8m`P{FS+Hcum^0&heQCAv1X_4>;sPUG}wCJgWzE!+tI&_wvBA`(fw zc__tw`TN@z!S!l^>q7m6y{x|c5g;8IN_VRuPy#+0nHxSP-Desk8nYtob0bb7An10x z4CCgzej~F%^x?(}GRaYm^|~!Xj5jQBm<85X$O5*e_1x zb~%uu{l9@S!TWZ^e4bYA#-Cv2-tF)hn%uC0FL~nUMmKE|bQn2YEMW|y8EE}HJns{a zDgY5rqhO3VHPRWv^Z_rbx`niT#$i%9I}MsA@;I-kDE1rX5}--3=_+2*a<)xTNH8;v z{FAZ>3uVKJMlgJ>OcIx>aI=p81(aCL4L9KHHVJG^+iBvl*8VN? z9k@_nZ^p5@Y?i}DS^I%P)3cge|K+L~;MwGgZAG=QZWz8WZdJ8pReAx$VOqi`_$?gw z6e^Wlsn_9WFCrJzRKpqs#=!xfdKYYOSSJSuVfv*oswc2FQCxriNO^UshIzA%9{Qo; zrQs0Re67Jvq^V^E6ye*v|9!nUQ{NN>k=b)v!}ec@z^WW_;i6Y+q1~`6KpM;}?EDjX z@pqLVq{Vp;yVvx~Ms_gBk>zziMvo2pzdkM-9HqQpmxb$9yY zHQq)ORvlor=I^4@%7#z-3$@5*EV6HRCA_7&*!WpFU( zykp^u9)D+`mTWWnPGHpcmz#*!r+D=@b06cqJ1RsxN#5f`xjrW%G>%ZhAR`G|_=plM zbZ`gW1o1jCD<92sO6S~a3*G#xY>G#VYtKNn!@5N)bi9Y$zZ%Rk2>OajW;TDsvUo2& z5Fv&%`po|xq@`L{z9mo|itue4eczw_(n-36M43N=eNgX&PQ<{}Q9aGVp4|V~wl?7K z1Z*{0M=10$v7eS8)hnynema;owtcwaiX~sAieyT%nt+EaS3R z$agyf1%TWvT1;A)zV$;ahqvj5#|?QlZ2vq{j2t%<0)Xxt5@wGjFK->n4aT@SiRyX` z8y8BOMY~C8=cZBC2WpHmBJ5$JfmsvY0~SXFMc$Dg{xgR;_TaL77C@2?0BjBOD!s9v za76X{%FYfh7Xy&Tz=~a7-pPvlj*5=H_rK0t8^On#6WY z(N6oN)a3Ks4~xUbFs6Jf;ybU&J?@AEIoJ3Oy3JXOAwS7LG{S@wP0aI{9Wzf>u<*70 zVEtyXwl|vU-x!A3^r?%fyMhO!Xa)K~>3F%9q+Tqy53k(vb|99eO;#!FGQz8b>1IX!az!_c?zv)$~jP_Z>=&?{zElJqpoN8b&c_< z-PEBr*fZb@|4w-z8NeNZ83Z|WuF5{kk?hf)-J-89!SIdO=!dXj6;1B9v9^xMy&H#X z6#7!qd2-8zk2diiv}d0=8fH+jPOwSmC}~+cvsw2MN?N?1uHH1fd*`R3<&VP@2X-7M z@XYP-{TWmZSTQI;#na<=(YR<;O)+TJ3S(G~l*g-U0Bm8N8$Smm`Weq8-PsSKCWtQA zMmj)gp1XXjveiw7*Q?&fI;TUC8aWkt<{K6|+g}a!EjZh&JoXu#(BDS1pt^lMq4c>$ z>`3-HkMU~0C$)w2``k~`APFtQENjg(7-O#)Bo5vAdZ~gNC7valRX;07m!fb7W;jHY zp&GsRS%o5y1vGZmnBu{5YQm>A7l(kl9c*FCtV@y>RL}Ti4Xhw_%`k8P-y2P=50uU6 zaoE7B&R=A>Aj4$K>NYfgL#q0|Q3<8sj@RCo+OX~j>6cQ6>RZ&~m$Rjbofssfm2eay zJgJ_~vHN?iykKa_N9pZ~%73mtPqFWHtv{a+>}R?{eW3V5N5`K}n<|btS=qT73Zl9Cnf%cva;}9yh8$~*(Ui~mOh@{=t^eV8dMEG z*P=&NCAsl>dFm&R;pK=Uh6=Y;0eEp0Le=Idm5NkJHrkD7{Or`$%9 zVceo+V~Jwh3>l5Jl@&~|Z?db&7K$?g%TF%KpLRB;yXgYWCKPFqqeSKs2@=K_i&U%D zjr86)sy|zKl$i5a-`Qvdm}FXY`N5$1-NH;leJjU0sFwVRtS)iuX!b#&H|8Dy#APDh zUuXjh^A;%&4(4+EpnMo92UJp=-hqY3{!!4K}tG(EoH_rbiI|# zD`)d(Wy5*x@OYofLv4l+d?rw12)7R=2@@NsO6=#j7w<*h&l`L3p`v`nW>IKw zZQX%NYdE}5EAy(#WYp-Z)&2C(!_d#_TaO>f;V!Ao{*%M8)y!hlM{Ehw!e$A;d-}E|LZPmXk2b- zuOeQHQQEp`4=eGGA-`%>>z6p)$B(;{%0qQI`>dt zqO~ABpy-N?Df>AHzW*Fp`zluuj-!8YC4(kHoNy$>0V90nba=!F9-dpM3T693bH{hB zbP-o)a!Pn9D8c{8l}4G*7T;w7{xEYV4m(t9PQZAaL`pM_ zoKdjUd$Ji;(@hf3*FXq*G-@D-m{7(zvTY8LZPsLV2BS5ZuFX@oX;=AtCQg_)*FZ_O zdK;oO)zowJCZPhew`>KN(=}$(6OBX|RGR|`e5w>o-=Hwqe-q!TlcdkKXsMbf+?_r3 zB-q_wpE6JuAoIKRHtm1tO2#-7RA4~_Hy?ork#RUGH#2DPmf z#yo9tVN`-8?d-Wg=I-1u3R`FNkBu`>2O>f^z_cu^n9wL(Ci~*wDZA@8ncmPa5eEX6 zy!O{-TH0Ms4P{~kAkUQbU$NsH?S#anzt>68l1Xu#YY85od=*jG*Vl8Qaa1 zjms~M-}V12yVRIt&=Ij!+P~Um?AOGgOKF51xNkiOWdg;IN?@fa;ZTz^8^*)|vFIk! zDi?FeKqwuHVBxLVyEn80Hari=qB(ufuQDLx%(NJCli8ZxuI|S^EyRDGr;_iKDLCYxN;e)&oc#cS>=FM-Qau1T~U5a>4?0+wj>E&zD@)qIcyR|FnT#=gG9{oBwIdLHwc` z*`8CgbO~gjYEU*vu0<++yHflqiQq9{al|Ig7ugh1pvA5?=N8mzLfz^lJtE3KRpdo?o0@v3M;WNQ%Up>w{>u_nRX`b2m zYKhrturaxHS?2J$(7kks&>z8u>NDs5WHtN&Gp%|!xcjKFOmV6CR$?*rI8-iDxv-$) zF+diC%CSt(yPfPgX~c-E4(Ly;LQJ%hr4+dp zh#Js8SiAvvAt^4%1&xZ0a2hQXuxPU#J#QE;v7bZZ2MWJea}CB4CGiSxqY@9SCc#29 zx>A9*pDi=VKWE61drsuf4GTCFsZ?^p0jD0Tell2!?((r(KECb-_Q0l`00d$7~GUc)iOaamaf_xptyFu!zKtOoUM0lnc2$G`lEL>O(ALk zIW6>M8~g^$)HIr=<^CCk3}@auz~kp^P*jnos?2dYsd99vEds~%Uq+xH&O>+BXziXo z=L65Gj6890iw}bqkvcP>mwjwGj%%~G7IIMq|H%rtI~xIEwrsc)GgiQq^RDfqM_Wu& zKvJ=Z(549vPz}m~4#)q0av0#wE%JDilL0>-)?+tYHeKI%V*@tbD%nT_wk;94B(U$R z_I66i7mr;FxOypDwNXBYAjwYCp&AUMq!pMWMU?H$Rev*w?bx_tY-Nb7ZY^ zBu5YUtRA=LcW=Cr(h0CL@Tb2wQ+J)`%I%lqVS0d)^1tWc;gKS`i~Rol^bQ!Tw9zZ_(3g+A zLR+FBZ)j> z7!bBlH^Yw z5AY9p&~;X5Zk{`JK2{uetjDP|OhtGIFZ#cCZI2Lw4sK1gvOauxoPGS&km~rjO+oOf z2U@`(oWZgJe`k%o##3B)<1Q-Hk-bqp4*IDt=QY?)O&#Qx9S6BiyDqcud+o~xzLJaH zD?)ic0Pg!)hX`wosP4wY03jh%xtPqz+3AzWUKVi!b^{SKgKx2GErF})|7)abGM_Oy zCsL&nNXt?EoNJ+-Y&d9&%|Gs@V7lfm0qKxyM9M$nO4%M*^^O}z8POOc#yKdm4XAQp zl&&LbjDMUY7@$igh7V;DXwzUQ#isENywah=>hUP??V)~oE{%ffI#-cC;P#cLX=5E3 zmM30v3d!q~I;!*YqZ26NM$&+nt{G%5zRf^GQ2DAGf z4BS!}bgi}O9FM;__4rLM>hHp~qfG=cLq-5N0ok;8$p7jVNwooF3yS{U&pNAX_UKU~ z7}wy}LzN>`V+o-r5m#rLWN-Tyv!7_g$RwY_sW|}5uD4k?tdBozX>V?VKXXy$XOW5x zs|O6$x7JmitRWABqI1LNMgyQhf9#%=qQFmq-IA-`x@5%TeAhWzP2yn(AzWq;0ur_3f7NFg z^5g%&5-HC`Yc&8=P-vcWbyV2mAXWqXsmi6&dV1n-0}YBsflnGRkFR8WmVMq8WZAo? zdGuEfeyv;%wi;L_KPWvtDsU>aY3iwn1SccVZKG@wG)Cnx91YEQX75RWDlU{28AD;H*C33=zia@ru4B6coHl3<+7gk zDEd{qUm24Aa*vdDD$t%8BLf3+;PeoKfjw>oy8Xcb4GM@-^+edC(Vg`f8h!!8A+kR( zoSy!Oq*{NB91?#O?M_If%Ij}Eg2=tk6Hjpoy#)-*y~kIFxc)aU@Rd;e6es5D zJW}aoK^s}6`1$~IYwpK@f^*Ed>3wFciFodj0Hxy70(E_!d~luB35M5;+#diZAx zKwE*jcEak|yKsd}BDmmdk7A+_lUbPrXnuEn zdVh3y7L0q<)P<8FILS&@Z_erqAJb0`WBa?YCGI-4fAv(*A!^$3>%;7Ug}GFQl7n&t z)R807R9liG(M1`s+~(HDfdIj=zA(Ua5h&}YKwHVYa7C^e|8Do$BW3+x)GMQMW4kUq zN+!q#VrBm&E%f8ZSf=du_B2CIN|W$a#+d literal 0 HcmV?d00001 diff --git a/external_plugins/agent-team/docs/assets/manual/panel-running.png b/external_plugins/agent-team/docs/assets/manual/panel-running.png new file mode 100644 index 0000000000000000000000000000000000000000..eca84b26834aa7b20b05ac6825a73c7bf95415f4 GIT binary patch literal 193083 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¥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 L7-{EeQA7R@8`)Q> literal 0 HcmV?d00001 diff --git a/external_plugins/agent-team/docs/assets/manual/settings-enabled.png b/external_plugins/agent-team/docs/assets/manual/settings-enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..dc6241cd3c4d12d9e3f17e5988e72aa1b2efc57c GIT binary patch literal 77063 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¥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 literal 0 HcmV?d00001 diff --git a/external_plugins/agent-team/docs/assets/manual/uninstall-confirm.png b/external_plugins/agent-team/docs/assets/manual/uninstall-confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..581a9effa3b77f0254205342f4f0e2f58f35436b GIT binary patch literal 35979 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 literal 0 HcmV?d00001 diff --git a/external_plugins/agent-team/docs/assets/manual/update-available.png b/external_plugins/agent-team/docs/assets/manual/update-available.png new file mode 100644 index 0000000000000000000000000000000000000000..3ebe2adf2e63802ebea31c220207eecb99f26e06 GIT binary patch literal 317513 zcmbq*`6HD5_x@BWNhJ+ULMmy<9-3rHS+X}6WeXuYk+CnOB1;q@dqxH$WDi-&!=%YF z))0!ALAGq!zh`>h@6Y=W_|6Z{V(z);zF+rwopYV*y3T}M*HJsb!o`9>AP%TsQ`SQu zcEf+}vSZ!}|6-eO&qwS)Ak>wW47^i*4SJ=Rdf_i@%}(2_%{Ylo7UM*k<9`nETitC$ zKHS$W#`oy=&2dh$~}|gfA$FFeUUBv0h3j|%sY$GkZKX5c&9watZBSwcH8vW z3R&rbRUi8;o2ZVGJ*e@hwMDVPXa6Yf zsaIlC4l{op1WSfM=m>I?yZ2W8np3YPkzQ1@Gd&o^gg@J@WD(htuDD$@8!)>{OV{1j zj8=nF5Z2f(uwETr2^h{sU?d}w_x`<>rOAgwYo+lvMrkxR?z8IbZ3}5MEbEtrjnQaD z7b8Q_1iyvk;gn`;rvXFc?j7P^RIsa$u;+vM<^s|s>mw!7Xcwav0)omb4*xyd7MeNu zbPR4ulglS98}U*?Ks|`+(ZelOO%-G=1Toc%)Be=X`lQi(YG)HP zALndU)-tWd zHVI~i`G$uP4d39_X+A{zB;rI>!PHl(V)xz}k0s{6*Q9f}u>ZYGqE^RkRiRMg!iIb0 zH!4*EgTc5Cy>E;-Iy+dsvOM5wUgL|`)ZD+*;-$$)@kP0|a_0tdr-2^n$2GU**sUU2 z`2U{kd)MJJ4=zS!Wm6lHvQJ#@Fyefm+x8Na_!IXed{{^lI>&Ly8a_yYk# zaT-BEK|*l^8EWn9u-|M=)F|IB)_YGzG3Czs56>BkwxMpDF+O_#LJ}Xd(?Ee?UJSoP z(?@aP1WM>Zo-6RA*@XO-1JX4F-nRey9S6c_K4dqcxbRVo0mdxXz;n9)F#<8pMkzM! z&7vpNyr1G=oDlKe^14XrD2BSh--};gUx#(&)~i!U>)C8w=KT9u>h~!{JjmTA+QK4= zWMRH>CaR|=bS8VpHS8h2 zwuS3E5Bz&*cBw;|khpYD_d^Ig~ZV;6lWI3X?~#FDy8|bQ{5P|M`x8FY~^B645@5wlDYvMIG zjm^!?dbux}t%LbK(H2@-T7rHXVJ`@$(T-U$-~aolAu?5$+JgCGjav4O8l5~}|IPA$N5(f>Yh+EX%CG)AK#_ST#Qp!RSyfR{k(10+m5Utj_K!nBe@<-ApGg1n&)I_7 zwaKlmt)8A9hcXgcLo`7%yOWGM_yu+Ki15ERj>!rmK-#fHMU4uZzMIQ4-z3>5rEhQ0 zOpJ|dm-1burKO)nM~mHjTkn>lm;0JTnq4nkll{Nd5EMz(Idtfd7alLsBuweRZ&KAx z)QrWO$hds_6Q=8bDuL2?TcYWuB`S$%6pt_MRr=q8M~zxbCPGB`+{(Dl9LyKn{LObN zKTB^SHhtr@Fhz0W$DxH)e=n~J=K&=)?rA*Re;Bm=oz~wu*y3RuOox$j2=~3~Uc9i@7TP7(il1wJUogr0@9Y3xq5F05mP%c90 zFSel!Z%q#ejvPtH%)Va;2?>d5{wX0@|G#I%8BG?UBqb$<3ml)9Yg>5F$L#Fve93F( z8+ z@-o#RuX{qlrpmNep6dE<#E3_j_Kx}7!oJ{RmeS7ab_i3xg6k#{iFNDMb&mG-6B84a zo67_6I(zo)aW1Z?p50uI{}*gfX)eji3J3@&W2LkgewDOseX&(2xkqa)3|z{~(zCa- zqq}Y|yYi5q+Zc70T3L(!Z%s-eZq@_U)YQz)&1F-!7PA$nt7Z~y(<<-&_&DHFt&M%* zBy*hUfiNZ4U=n5Z?0=7;rTERz(9licWqM}xR;S`-XMV-dTCQ$@!`-`c;pYn8ZEvmP zaPqL6BlGXj;f=SkY>zT)4r;vm?*<`G`Ch&H(8g$i);2pa(O2W=CCuqJ_hIkwQi0dL zU_R!L_4Sw8n1cCUXk9#lb|Zkt`v2}&Mp~L9qES^%O}@?1+4(7XG>Iq=F(CGS z?&D;4UWLn`teo5%H010)r)AWc_WuQ}Hc~}Brhi~y@7}$g6H;WiZilkGyeTNI4o*%| ztPg2E!z(;wdj|)2*bvS*^S#F`{<~A8FI+ew>+uOcxV-GC9+NYL)790zcWI{$tuyYzO^*Kgl``S5NQ(tNrdq*Ha0iGAO`IT^(ZQ!G)k zQ4I^^&%aOo_wai=cmC(=ULN_srB1nz_)nS|XJV@V_q^g~`4Iofa~F5)_*)$ih%fud z=l8xdm`v;$eaMH2^14WM@++_S_X7x>Q~zB(3!Te||6Jbx@Av(8hy4GZQYmHnKl$G~ z^9M#$?#)(Un%Y5k86I84x1JuEd@^}-exg?8)Uo6leJ4t4&nQ$_sAm8Ts&o@el;$Czqack1TJRZ*P#M9{l+Eze9rgls{Mp+`*SuOkJy;y~j;vWRKFd z1c@fMZ-O^T^4b6U&NTr&tVOd7?G+My07k4PlM+J+C%Dk~Z_&&`Ci<~gut#ln1H;N&< z(bN5hSLC8;J~*6NZ`LmUJQKcu4i+|NJha)2vx+=}KzLih>d2zoSAy7>7RPke&fsv; z+L`vU$PDTC+8D7t0!V^t+Bevmd9i=X z&Flsa*Yt7}!%fEJbx#jeD6ao1IV8XMY!m~vJWfNUQ)-RlcJ?GH`vUJT8^GaX?naEx zg@jLm{F_T74;>*2o%JuPvCOY8u5i zqDC>IiCRfS^`Zh{N>zbAN-KLmwedSzE=q@)-t|aA)zx~y6BU9C?bSW}+L?h%g`!3Y zwaUNlzE`_p%%PHT_0aBgB#u{vFY=)5ue%S;KhIKk8x54pw?&A)?buvYU9?D}No(ul z;-aFL`Y2Xnwm9S&mb3|sU6Me}AhkSJLLmH9O#;!r)OXo#$FlIAdIDM_#u~N9Ou{xa zh{>b>GTDyo#tntRXXw4ptUv7%Bmd&@coQ`oiv)D=aO7>RBcs( zUz%D1VS*qgpEh!s-p9t6e@?tC_`q#y#_9Y9KfAR8>K>b#qLc|M>Z%W*%5Sze`qM#97UH1$X)X z+P`D_US~_nK)H4{_lwX3{xI5Ve0;oa;P2Qm_f@DUgcIDGHz%?$o*vjo4uKSYCvtYZ z%=jsxQ=C7&}hmjBM;Ht3zgTJyQ8ws3UPjEv>h9A@0YXai~AOyWZmq;iE+p>Wuq@ zL}5|U-AxBB6)fT5VV=eu?xe|d!6HF*_A^#z)WgGHM&+0&^!xdwsqMIn#OvcZoMmc0 z9bR=_^9UzgheoO_n$w~!o~}_LObI7oqON8QzBopVR@KY{a8yZ4^J|gr%^_)2CyiJO z5fr*5>($;YWohh?-CnKVtME2xd+XB7yVINzRE}8XQ*JD`lD)59VT6bP>s9p_y9_a& zykNdpt_yT_jFoWG-pir>#wTNSvIXZgLw6X($2Rkm-3-2|6kZlIH^yppUq`O#iF4;4 zAZA9O!-@8KPml2&m2W$uB9W?7(vU6f5r0IaQ?`42?@mO0WS;JJhqHPNdl=It(=S?~ z$)|&xPj^NC2%CA$ae;t#NK(bWFMRWY=r0_1s?%m<%`5EoM5c|T;EWCa`Fj!xmfccf zO__Q)K8mu4lD)4gu}ZzQZFgz9?AO5dzHsl{vc36%q~U%#l8~7>T1*k`#HV@+^|8L_({k zTwA8&q(^<`j8TZ?y8_LM2_X#6HCW5>Q&FSsP3_0_)g0srzZQ@ko5_ROf%yLPBuhXh z+w+4=U8TVXwUBN+Ry*bn6I9uM%^4dS#S6BE@v_zMSVay+b?5JY`a7LE8qLY9LJ7-k zK=T~QluQ( z3+bR$Xaq$^5Q*r-uiEYAv?1LnyfxU}-QC%FB*ao6c4Brmnl$p`(Z7+v9DF6C-py1d zIgUS9FV{ebLp|pAs@x@icRqD?jsPmVIS%JM;K`j`R74ezyj^rH|22?D1az6P2p8UB zz*9DrSlf=g(aY#1jg5^lQRm_`Ud(2lK4pfIVSV^<5dAZ%%Cg&QFtYdqy_Oj<7jm?g zurHpE89V$>j=&Sq7+x#q>2t2V+2=BMV>}kaIQOX)9xDq`AZ&8ftV=|xsadBrRPAnB zI^MwJQq3`Ffyb^<6?&a)?q^0EUfQfDSYvR0RO`KFy?C?e@cPUr2~}4+cdy(?%Ejq) z4jw9fzVx`=pj`W*5aZ6`+|4dLzlI8V(0A?Zf!1Y&MbotyYonfzkM|c=&r|`1ULW2L zoE@r}@JOoNJfq$rB@(9rjZ-f^uY2-do4ne-0bt55)UCDgfiS};`r6|S3v zv$C=>sc_-pVahVeS+9~LR5|*w3Q(l{kz<1tCsx@MElRhDH>TibXDF4>auRBVkQgb z^VeR7vYW!Hbr!*V{On;F85u;PfYhkm#lJ9TKES-Q^v91MKs}j5vt0M5QEX_Dcp+e8 z^hBXyo`{GDEWzkI=ofs`vhDjfSBAGoBE&*0?FN?L`z<7H&BVlsgYpxNiS*R$+c) zq3sYWtN&u=iGa01wcyEmUvV%zw6R`IaP^Miq_ z{Lik&6 zx*eLWV@8gVyt3{lBq{0rR1df>Sgkqz2B{Jj9#>UWwP(+sq~v5Vc+Shq%g>)bZ)#HQ zl$v0M_&5|58To{OiY5c&U~NRqYfd7@QEVJeHls3s-}!t}|F!nOkskaD>qx14y!lH<+xqB8h8hyI@!ol4VIYss#f z#He22cdgKp*&Q}4E`qPJcyubSCo!uy#@Rmt#93-$_YlBfs#YFRFobog-}AchOCFt& z1d2@+Sv=B1R{O>YI+t20Z*sggPKcvH9JVpaYRo-RCM-O5V&##9p)e=j?5N6fg=$OG zBEoo%BmeR^CMpTryPc#`hsWmoHC2_ z&83x4l(hs(9J)#3tY-xTIE8Oo3@rcrX)VVaG*d}y#f-vLY%Zj4`>!ug&wKmRT2qzS z(BU2J?RV!JkFM7StqgjJ8JE%rX9HL0bhNe-ii^vg`|R^;kgYnUF1QYDOy~yr0&;4+ z{e1jPdxqE2WViX|qO=y7;)aTN=nV{HKL zyS%)7-2LLDnx1Gv=ILY5!U--px=cAnGC=gb)!$>bX+C!(6JMk3-QC^c68oIuCCY8v z(%dWGOjQX};%&6O4mbctAde!?@M7-1f|_JD>w5!;=RZF}OZtAnHSdm}o}TVC^BQ!n z7?hEfom>w*_5784wq5^655>Y!jJCG6SnZz?pq%`GeA=SaZR~GbFyH!}fWuAC&K_kt z8QYABIxi!$+@-IJ%fl(L#fzHxHgeq9V6^-{fAX7Q?sA864s(TMpf!X!Gb8%B$#6>b z7-dUdm1Iklp%6!ZC>0NB(mrrjOGJsC>4Q{DVZgNGiLJR%U}9V<$Ksu2O!5tZh5-to z=;p?P;`YLRvG>nttGA2(w73S|n;&Tev{7JVL_h}uJguB>I^LUaay0dj-1f$T`ReBz zqHz5{ID9M?R*$J&%o58tt^B`R~4X^luJUl$w(&Ult9r31~ zeKxK^>jM*emGx1&A8?=Vu>r9tZWZ1*0<`$@g`kBCmM9r1DgVtW^B{Ug=+=_?HZJCM z6ytTUZ6PEybYXRaPPdaxbaHVSs&E~y!cPI`^>ui-4xWy7vP>AkyWc+Bro;$`OAs^H zSseh*aDBE;F@XXNhpU}kj$xirJV!Jc`gEX3K8kZ6JC?C?0@(GhUon!BSL79QB*RB& z5BDBgURoLq+TJX>`HK;QBwU{7udiOdv& z8&9<5CQE4F>m+JFzGCU*6uE~>S4%60E6yVD1@MWR-Suk^~|Vq{cQ$K!E6 zW&mhpw`Oa}^tOTW)RsFU6rlu4pOdG9gGTRCP9}#elk=e5Xu?KcfbUtjKWOAFrSluc@AVzc#<2g|wCTG|)4)8^r=G zlg8JFR%&k-y#p)@A6|(9Ks!mwQ&m-Usafiwh}ETVy-*IIa+5!}5BEK0;Cn5hICho! z_Kd52PCZgB4<0<|&bv`J$}{`Srt&&kOI!O4dl-kTna%L49d$)oELx zqr0h8C6VIg*#q@Rn1+ zV6JiGm%d%b4BdzyGtLLmXm;JPx4;Y-H^?uBLUEFbTDb=7D$hT^SX*BYntOO+V>Nwy z6=>3Or@kxa4+BuG>KpZ*@{moXjBy=54qIo7A+JVS#BgY5+dasjCQz z-cjM3?d|Q)TJE&TEqpoOCKpRv^{QJREHie7tqd)xi<1+Q=|P$|E!9g;HK{l^jRuv3 zWfg=$6(Gf*(^kFZbT~%42E!$@q{x3T%R}cN+^67@(t%lq9qs{H@0QP4+^$`_U}IJ| z`$4+N&(GJ_*OzMpw6wj^wk7r-!OG+ z{QmvbD5m0@djtV}Vc7qkiOE32A;pcyV*Wqgl(ep`*KMyK3ZP%LO%L#dhYp|&%U}(D zlNGn-Pi)fFi1sdD-~O1$PFDaf0=TVozZn1nAkR$@5YGIQDYiVo3%-SYJDi~#^vT}8=;-3!?*T$ z(x$MUabQ5 zKAEUhyHYdDp;82F0lZ8_+m=O{5ciF)D_(sf!C7{i$UX7(>rJ6J2YdUBxrxP2-JlGWq7T_9_&0optw{Kg}>I6u%xw#2^HWWr6l;g*sdIAR#60%3T6VOmj zkF4=G3MzujQF~>fV-0E*ff$!y>fUUtxNa0Ric~SG3*4+8S}M4bahKknF*J0`L0{{L zFMz1(swz93AF#(}YS(8D1Ghd5Fp|&l=!@DknRlqQSOjBE13!9o06wjZVpD)7NaB22^iC!-2p+kym z^h|EDJcLF-KtQGGOuUK9#N?!gK&)nhXp6NZ#44l|NVMBfrKF{#x;i@-p#B9pI5;$f z94OU1W>xwzCB!0?PP~2B2^d?8ChHQTq|BFE0@|IXP#!z7H2wVi3TxLKl-O7sUZ$jI zWp_f(@U^w2K@5X@t+3jx+ws71unHf;50n|?!O@kv?HZa-uX#{FP|)_nLkj3{!YC$* z2&KQQwAA$Ohuxr$z?K3%P*H2LSqXm|t`I6f{0;^pnw*`j`!f<@RrJ*=S{|5vMz3Nm zc~M$AuGtz=?h4hixqN#2PxLl@dOCG_6G~i3X5icFT|30aGThg%^n0$qK)pNBgf-4~uX{Fm@^EJw5;k zp=qF3Z9!)H{`p*?Da4d+&{}77z%MHg`nS3u#j;g9C}RBVU1_qc4Gv{V8d*8o2C$Z6 z3Fcc+m3{sFH{f%>W@dPgA3q08ea+?gu^ig6hvLUPW6;qda}=0Ww?ZPQ00FM50B|`U zGcqmt7#t0lH0|*orG1Y6xXLw`$g4cBaQqcD7_NL-CZTpQ;NyyIM z5LAGkW}v)xOF2V@hGd=9d>G=0aTXBT7c$|_C;<2v%~JL7rVCsi$Ul8$j=f9pcpDB} zF!dV5r*HnU1)Uxq{J|zv*1O!FeyR!r8;5|KzJIL2?HeE=KfmhPbr4(brLUVhIy&YX z?hm$rx{#=)%Jv9aPE+XCfQ&uD^n>Bf0Li4x*sRvy2l6QNV^Are4)8`a`VSX&J9K#z z>E*WLM<8)eUlurf7P9^94CH1iK_z|t8_hdyJ2dD|Xj)pDwd5+~S4&9PU8mfkuk%~} zb&-~G4-S}*4wAcg@uHmEdy5Y{t9A~;Ru@fxbQ^NuIOsahwss?4mY~xjNv}>bs>;`| zs7CiPBV6}~4%`HQiW)s!eZ5%UOEqq zx%ZVjf7Z++O|C289|c05WKzNa0v4+%`nZd+0eJ+tdkDCOm-3 zfE8d;n)~O7ZVKQB^Rd$p5GahAy1H%fc=Q1sgeh-2*|LP#{#^Jtuk@D`Om7QX z$}_K_6C%*Ie&6dKK~joROFph8ZMC%ZzwIlMXJWnyAd2SA8g-w?Dx4w8ck z2>6>pdHxvuIn4zw& zu1}w?Wn6!CWM_l8Rwoe33vvuPr_ewM@)+1b7%+&jYR1?X;44yRW9r2-3bTjoG)6~` zS1eAWq-OsPgazmI%kIjo+)N+7f42ZKCH@o99(uZ7*vTfjM{qL9gC(}Q&`-O#M3F~3 z^Mi;h(yW<Q#FWDkTGO72SMOQu6niKr4w8iYus^6iTB(OAYTz{OMkKC1Wm2EWjRM9+cl6NE5t1Kc54F-)uDBP`P?_SJ}}FLtBFqB1uT& zmF>~L_(*CXHNKxj^6k{V0LF#Kmfp*Kw%MKb!z=qAe}ugcq=}vX2qY_obn{Ag8#bmS zBHqiZ(7Z0NF`Ofb2>UDPj%;e}+{gVuH1exMUG@6rwm1J0;iXKR1~u-EFEEYtQ&K$9 zA{2rqsux43*f}yvF_S?@Socflw!M!qBgfPkCk-ZHj1bDKz9TH0U)Pwt^XnIX#VC^+-z5gRfxM}> zUZTjL5^6W6U1{zY+ZLFV{!|351KKVRnAA_#1EEq|$j#NkVRCXZ2_z+cbw&<`(5AJe z7f$(ld3k|GLLLQZ!*k*UMD-=B$STY1&IwJ?%GUts%OA8#L7NQMFDWkm9docH19j{e zpz=DRecp{i;)kcDk4dBsIsP?sV=Gkr4V1h;R4Au?QFXL@2e-)uG`vX z&#sp{1H@mN>J>97k0ef-xixYC{kp2Ruj-3yAzuZ*GxumtI1+Bjx4Y9mI~ANkJ-xkNeKrZZmEKyBqa4cm`}>ow@oRN1 z2GkknM@2^iSC>Y!UyYfniW6J@8CN@S2kjRVs-dLg@UwNQWCaql!?Sg3KPj;ht08^{ez`^LJuXTNn zJ2#;R{5W)Vw{KtRECs;8qy%XYE(WfsW@RY(8b1RVf)#1lbHKR{LMuIBxep9P*Z9Hp z0u4h-ij;OqMMXtf86@$w4_Gd~!By1qtE&Sh6ee8+ruIs_V=Fa@?B!zThy zM1kxEq(+P81_Li`Fc^iAqjm4V`BJwvRp;X1u(q{Qm#&jNp&?V&avg`auy|Ehr^p!* z_t%o*kOa^b*ci)!WjZ|v9S(%ig$vnwxyq+9NJ6Q$*Q1}oE@e>gzbRtoa8f|YH**b~ z25yzyX)zi49dAR4hwQ^>vvn0W7oizAuH9MO=LE6BfMQTV-$N2zlq{h`HL^W0627{OT*o4m^FDd>BDTB&&yvP5JPrq@tlZ~#RLF$K z8jvSYd!=rZuA@H{Yl+D4kOdPcAaLXx<{{lX1LOGxIU{T&6UWEzB;9#~{tP8NP2Laa zxMNn`4tQ_xch%MF=hIiefCnh|Q)NYk7f^nHZDzg6mztWIM&`Y<^yUN79mXe&=Dkxm zgH>+qC0uwMivR=77nJdGCduK{^Be;qxwdoRF_bYo9_mPAM0IsF@Vs(RPoO_(qX83M z2D&`8SeWbv^-h>mAE^=pme1UYC&Cn9T0wva(RxC7=QTTIEvbG3_SLKTT_DoHUhW4> zy#U$v)9Gkrgo+B*<^8-W*Vsz^u0!0IyWau5bxTe2z@PGW1dx(@(R#qAaF^=wf6nyYzS4UV6Lan)`_X&$# zF1^2e8eCd%?;f)9a&q9M@r3R9lGryq+~)QTh?UmVOH)>_>C0|R^uB$^3d@F& z&GnU)rKM?LegI0GSpP}})a*YzTw)ttFa`cx9e#EOk)f~O8O3vn;cbi%tpe+Ae+S6>5qo03;h6&@(@c?{eI zne>G4stM~5PcC2ObScchuKUNp!F9pu>)Z@r9^j;gVM~cH#n`Np;8Or7i~D~4{Q2|g zg`rOi{sOU(X5%3{0?r$q2dj+7X7x?sj+}i-cm8oR1-xV+1U)(Q6+l2T*w}(8pl{-B zj)hnn0hs^_A8=6HKEnYk4C^G}DrLH2cnfwt>%oIFLp9Zfg{}~|P&b3B12@-9Tx;-7 zPQP}Y_;dNjjT^wr!gB+mhT)nOPv|~-L-3#90YT78csP3jUW!)S0#%(iTEB~*Ik;d- zigcM_-ibcVmNjyEpnRhH^VsjqXaz2&9gQ8xU%QpqI5_mxve3%em!b=ql6;Nifo?Ep z+E_^6mP>8{W_1Njor6G*013(viO6KY@Q#jCA{F0?p{N7dJqS4&%#dHk+!?(Z*e8KT z2c{bEO}-W<(+9VdoaZ-7&t^i|=%RmQl27pbBq5mvIj9ckRKR4dirX6;=L}8#=Nkb8 zWMA*W4<0r5m*9->Njn-%X5cI32c-lwAc9Q*h&A5xw+G6>8H2(h8yPJ!{N1d^w~T;} zw}CCXw6yfEVfDVDYjZK!?Cg{B4D;94dh2-2_7(|8=m>$?T$d_l)0G)G3I^U{t!?G9 zcJh{;_`|#9dqI=;4SlVb3lYRvg-TOKgOi<2E2y5CoSudNY`jff*<`4K0ZZKm8b~Ik zjO(y>5oY1b0p@IvARRD$fH;PPlq(bFYic8TtQRkM#l_C<6^B~sP>8XIVIHoZoojOi z9&|h2lwng)&Nr-v4xQJ3?gPVj%frLN_!nq50V{(mK-*e^c@vZLgyH_aihS9fa9O_( zEV>3yxg#25nypbGtNyoexTFu79Cc|lqj(hxCVQ#2^tK@z6AqUt9__1!HPhRC_5%zC zr#&Yx#PHnM^A!(G4rDc;Y#oyBn3yC_RY87I1dfMaov^ED6a%9frlP>$!|MfQjIq<5 zoV4P{pg7dlDzN+jQ>vZ(Tl*wrE7o2j--Uze!SBgm-n+h|yR!YzhI0L*z}_*)ipjTG zQ)|$E***3Y=7d%e#A?tAi>EckYD%}lfa(W-R%8)9)GmowFtz`vD2P?3<5&P zIk^C9uduz^29{(1b{bh%ZoC7y*SzX1?CvOX?QF zCnHrP7(#^hnVwRI3S*#M)`8!71qcY#3L#;K=#vz8Xv&=jN}B}0O3oezNtK}=L9LQ& zo9!#10gGbSRrx6G(%|Y-1b7Xw=G)x6>tVx#!oeAVjb(P|0>#dGplkjn7U}TaX<)f1 z@1A)azxoT9mnbw9y~mvm^B49~U!p_!iyE$Sg0t1W{7UHuk5LRkz^oUF86X=e?SXQ< zS%OXC6&EG8oPQE}q_A3FdwQDOOo4qNprQXupisGA-7Z3hpUMhq5P!WKi*1b^irV>S z!o`|jqt!2shKaHfPSp>F9bYhM+nvu`=gUV-VO-B{xMlS{c6bhuwGMWS0oAIpv}{*KX!;SaZheG*P+ zC!H{ghZZ|ut%bI*$cc2p@)M_I$4=V*L#NZBWrSo#XU-uBnZ4#@deB4GlkWxb*wOLa z(mSv;dtBo=e%y*NE|fkl28!@nmnBLgw5UNzK&27O{s*J1c+_F{6^>CgzqXh6X;8rp?2(Z&*$nvL_zU!%$V8%gY&u<91^Y(#YlqIOG}~~(6N24H^q?b~_i2f-!?ZqrYG)Fu&^eS=7eY##s)(y~XGQ8H4~gnJP>-5PH0S z{(OYwGyx5xVAhggOzYmqtGfpyQ1&Qx}{6y8+_hD~Nz(s~@_lsMc#^e5- zow8cS3P+yK`DCH#^0)6lbshlP;$E~j%j3&k-@^%xSY&Sba#_OO6WG_qB_`GNxyR33^J~J|9r023Y=(`W`f?1%Gq_8 zE74dsaC~i=-jIFg&f+L|vKYPUu0wM5DA+5DRP=cIw07E&{|v9(11CqO6c0yPM=BZp zE$f#H@`-BhcW5v~4iVKj|(+I4P(-&1s zL!PjdXIF;mz%Yq?TZwZuLnT(ZB(71SwkzJ+NQQM3O0l!6D?qL(AXkq|&%V<2B8g;X zJxK_p%e9e5-Ks#W++?uV41FE_R98OB7H>sk``0!uo{cp>6aEgEy^(G!>-(8ysV}ad zfo}Uw6>rhp(i2Q#aWVA$6TLIl;g~`H00FJ~ zz}MV-7(k_K?do{GNyS?2iHOFWAWTc+WmYhK{q;HDzu1BwM2lu6;Xcc5HM5Fe;zo3S z{*mLkf=j=Gm5^>>APyKVLnET@)Yrx%Ff5h!JMNYumvLAuv_eSnbK$2bzo|Rd`>tGi z)^A;0HSvMUWubzlf8MzpjDrjjn9*zjI5B*4Q>muf4zu7C^dcd{=i1`wQ4CCjG1Pg$ zQIO&0y#f8`4ekh7)^{EquK(AKU!S77!#d!1{EVWp>T@Co_u;Zy$>HNIZ}Vs4RGvN; z{8{3B$v3r^9notWHW8FrKv6q#U@)Vv&ZEICWwcNGtlnY1w z7{QV}<$7Y&2%Ao`lfN5q=UuHOZgUeGkKsD}&#fWmB%YeZDh0{2FXR+9O%;8S$#PlQa}NS-jw7iKc(|cAgIi)1Irc6_j6&DkJ(N_{Py?QUH?u% ze6e5BemSMa#N&Kmjylqfmd)Qj%R)n!T18^{zo7iOJ;u_V9wOzxmoaHBrB)Gy=Oub% z+Tz!ya}R|`Yl9SnHFrs)X?MQHwfwsKLst3&k(}a?=sfvH`?yx!jnV~sX3ot#66x2R zSo1HJ>2D8s{xh=h|2stS^55wXF@42`@~tg>=Ro25++R<^+JA98%(OIoA{FLm41iMi zA7YAiIN{5(K>hZU>6;}r`ye5@YQY@9)6=bk(WCDVTeOCYqIlePSX=@k|HgI-A9L+27}jSa_IDueU1y9T-Q}kF@a98{u8r%4 zQlA=;OjO^VT(1?TlvLFq3eS3=v#;1GvB9tt(O!uS%pNMa7BFp$_3v(whtvJNE3*|C zptwlTwDw?1?GsWSUV+ksxEaIWj}V^Q^-}+%I8x=g1dx3UV!CnE4Tn>~zWxUpreOdC z*R=K?@4=k5MV4Sb^%xR~VNSrobOzg(h4<+2#n2Gex#kD(&@7g*H~s$EZ6RwN9@_Fp z5{lkL|M{!{wzZvKlstAsae_{ZifHsOgTZ0LyzZc*)EjI&E$&Yc8f48>eg~vSjV5X} ziATZ&1Lk03y@7y;dWVzi?B4+-i+GhC&Rx6@ub4wg!oC0n%qBe0wp>922QT?H7;Gtb zmMv@?v%PZ*&9$zT|1%VvN_qL;%l>!+u1eipO{2XfJYU9$2XUwm3GdLQ%Gdsy{FG~Xc)|ZzyOA;a~ zbuW_RY%YGTxgPQ9h}&|r8#lfTW=1~m+Evf3)cal;+a;wPZ!^3y;gO=Jhec_fL-l=; z{;})j{>ffWYC8K;HL2SHn)xc10Z%C*d(Mh`1&m7n&|POw8)J|>7@ssR zZd>9|!Yv~~qFp1nfGj9}QibrFez`@3XCH zEKyi{sd!Wh_g4zy?#IWLX!RINRJrrnSamG&K*JLuKYR8=gGA{&kR7q22Zq}5X7M%y z<jGl^OP2)3*KM#=gq5cUVK1Co<~=mm^G5_}H^@UUUxTYwwNVS1*_fu|!jfX+HDb-^!gKq>qQxw$m#OzKpB~E~d7jG7F2> zSkDKTNH)=JCiXw|?J8-|CS_heHTg+p_>Pp0fUn%9Sb$}Rm$ZCDEdhj?LKm_ddOTaY z4RJmy(7umymPfMbcF{}wq!3Hsi*vS)QD@ap3x!J#(u7R{*A~;*bkU`YmUUMxuXPN3PZul1M~* zZgL{{rv#kUQ6VsKu_=DwumtPFon7dND->E(&v39#EB#B1&ILgW;>y#VU35er(BT6E zl!f<}s2Kh*0=Q2wL0cQ9qCm;@6qHYc25m&AF-Z;B?> z?#cUn+49o{;)?{<+}E&oZ^Tx@6^*ry<$z&vR!T82g!JPbD*-?c<%QL9Ohlad{E(WU z1*YFwbs_tVh_pp%RKQ-zrW`e>=^&C6j8Jn>TW{%-Ctzyi@$C8wlT6ITwHcNM@z`c0 z%kKU=O)p8L7=E9$(47YND|ek~hd|yJ46c1SUXb`hEMMyhHlZ4y*3Kpq6LqrX+Zds% z!5@BVDfAVsBUe33FQf7W(H?^90RbKE!G8XCL9NejZ4V^%>%d4n>uoetwZ~Pf=1HGlSBx3;f!Gj%Do#K&pth-bOmnhMhGo3Gx zguTk!Qu^!15IO$+V%yL>`z5PeVgjzr?I7Ln}HD=(f$2^pegh);pnq*fSq8JI&AsN;$z z+kYsb`II|%_AdRJc0yosp^Db;JIj0}-|)OPnBf2!Z4batGC(ANJMvgak##cwHZaGZ zku6I~NpW&^o}Qc}e2*7;3R6wpd(Jn3Uc&NtXDX`Y*SGh;q=H2eTw}LEea+I#Eh>^= z4wiQ8d1U!@V8BF}Q&0eGDrt&AF!J{Lpq{~d9*$X~cp%wuU`$(-5DHf?j^jzqnwJw( zXV;bsC+*GLcgEm$3kpzhoCefdAobpZ{qbw%JsJ!LPhxbyX2h6=fcL;;*1k$0pp#{s z9UL9kSKETXp&^LOc2{0=~ce49zJwYrJP@i-drqv3?F zLqlm=0>FUo*}GS;da6p)OgBq zQRXX^rcsTzVOkZO7@**TaY-NfIK=Zym#U|yC%8X-fg3|c!Hm3ULV~c7-d}@44!bU{ z`;2D%n_D%;y-QRo7zRuF-q3uIdcWluMjiP11U)9ot)cPBIC?rdLwmx!357%Tq<5%n z+WQZ?IyzQ^Q5tBz^NErC>WXXB=$t>|Br?&k0IbB3=Ud^o6<)j}YDu1vopju3WX72^ z6cyjp?RviT;EwU6H9VWgMctU!@by53nu_)U+?SBRGOQc_5L6=Kg^glb?oh_uq2Dds zZ%o$oF*E+4dC^3>Q!+7<<^zG0k?}#Cl~kQ^JrOI(vCnS{%$@i$R+}wtTm3Z5J}e2 z-0Za90d=OLAcpv)0bg1L^L@bl<>m@fiV2NQrF_$Tl?xO>0uM!d<-z~Ki0n#x{`xy4AobwaxycP8E#_(8N z>*;9vS3q$V2g5~w>{hy*&jc%73`!E%cKgc*zkLIDxLwlt-@$kTt`c|yst+*nv*UNDwFSvw5k5~OiT3fG@8_lsDhRT2EM4s*jZF3#(D`7l05cnLW}Q-_|!Q)c!m z!V5VZuW^PePiIV|OD0$r!_U62|E)&WZJ5WLKa7ChwD%z5tSM3|oB%dWkb!y%&CP{5 z)4{uhMe65v_2iqxHva^-E?8#J|`kVyY@k zIoS7fXJTihlWnd+(#w}H0}9<7_^)I61!J3~E?jU->gnn#z1_&twg4n3Wc#)SqP;t} z7ue~2(qOUyMxwy52tyPr(*tUbZ8>M`J*qq-1#V*X^<`BuAMIAh6a< zJG(-(4R0-104)J?04w0L9tZm!Ot;icmk%(EKvjHa1~^pgot$9OxJl%C9ADfk{R?7- z2|vTOj^h(D2B`gt!n^jo)F(vTF8vf=iv##qX=;dz^F7mU94*co8WI8;MoxKR!Mkp+ z-U#16)ZI#JE{B;;az?1ki;TIRPt*eQ50LnD`YQ@!>KS~Jr(x_(n9~tt0kJ$gYu{2G z{>k^3j~E`aTGYOk*PT;ws%;^h03|Z%qsEB?qr-@CBoH`vKVrR(2w{Oq2jUdelOSNL zOnVv92hAs1?)N7!2tkyCv-M=v#_-UPPBRdreXx|^$$$|mGuXoepp*dRpKl0Eja*xs z!6F6a=;AUnH3dtQs3nlzwq6Tv#x)q9;$(TOe2NO{`@k~rt}qiYaTROq4Gz2;W_TQA zFB~3zp2gbw5zmaB#u@U9MT}|$b?w+bgYRndXHyfYR?1iyXc_?WpP^*}>%IZPjZI|0 z*g10_u$(d6LG-G?E%2*Du4Mew2dMc*pAnrFF$Dz$07aZ+E=fy|`S6~(iZ;2@aD{NI z5X;Jqb5TqFXHxGUg!oZq&GVCWr|foe<4?U-DTk>v;_;9SP$V)Pl9~?oZlOXB2Rv;b z84_n5o%gOZEie%3vV8#g&Hg3PDBlo%_91{Q8+A3eA4c=?x?v7a>S@(X0&uArKr?rB zy?_&KcC6S!ic0h;Wq-tSOG=w^r-Wg~n1=CUpoSRDrnY%kNmbpB?>|47UqYnZ1>1RE z_xSku?IH#y1B0KZhsWY`HD04)>t=>A252jI7yhXpW;`9#pS1-V|l?Oiz_&mo4ONI<#d;^kHFpo4VV9;>TR={DK~ za}j6Lyic(LzyZeA#+GXRK_wEp=6#igv?5)5SgbC zGCiiunMF~l&_hU~BvU0*qOgx!YwiDjv)}CP#aey(l^*wSUDtV>$MHQo6<@f^7-Nke zO3?fAHW@URx#bh*KBVWK)}bY1rR(a_DbTYPN|~%itHFesG2|KI{Xw5#v*&Mv-9c=| zsApb>&ph$#^XD`^2PUeG`59SE;jI$mye^!@ySdJnJ1QYD@w22LM6J&zJ+4?S&Y=x8 z?Y`FGhm71b&T^k;+fM_<*&F%;_o-RU&g@=$$xwJ#3$;U|8%?{#zMGlZ(dgRB-$i+P zI7Vo3>`!_vyZ9warX49obmp-c5dEw zgde%u#KDgrK42e4x`%E*U9%eZ38sNDC99?F^y@8 zJ+Z^XV)O=YR_FCW?33`Ho{hW;aU3VIbl$>?4fQ&F-v{C1xoLI%3*EZ{q^SoN5D*;a zaVQ;=H3z;s7RXQtx5JCp15+T@O>fx-7!J_`gu&sqaD{2>RwVx~>|kd< zs>pNul-DG(M4cYloHRPy)ent~NsQdGW@YG()qe8n=TD($&1epW4R_g;BU*uv?Mhfs z38x1F67|@Y`WyWGWK-q7myxYf$ii+)J~jDE0#w(f_U+Euv;4iLP&MNwtd)E;O)$9d zUO|&EGt(R~D%MumGLrPZYo#{rueY2KeX;2Mu_Pa#AMhEz7&WpQ*AA3tjLhWY^JXHs z*1N^s@UrS?KSQTL?R) zK{?;CN{6KwTDUyI>YGRK3cK#9T@MPP}tA{7zm8$fl=et}7oLKuS z4({S-KdJ3~a9n=!2d~0A*W?m(L$ACq8&9+?gsHP1TbQ8oTOxWz*g^~ggJy!9&i*gIZ7oH8#`+&OaqMT4;$A$&d9hK9F-fl z%QRHauR~#1u$Q%(bl?LRew<55Bp}UNopS8EJ38pqub1M20@=mdnpSb%WmAa`UniqM zY~ciWu`{em zDp&_(JbQbBiiZun8Y?ehs7J;EipjzJ7qTiA|^bt97D;--8meIN60NkXx^ci_1g95D!<7mDG?Je&~PalC($|&65#wP6a z6ufEp^%CvdYsuD$F5TfPFBW`As_CCbMO|6fUDxJ-A}slduK9t#ST*}#Z*MPZuL8ZD zcb;PX1S)ORBi4Mpx*n0LftqXB1qd4)*8ejy(~1rbkpG|^xddVF8aE3eHlk$T*IjN{ zTnq|YW@XCH=_6l<_Hpu_@`?&1_*=wY6ZH#hbgZqgwV^H5sb!+1iLDfQ6o@*~$v7Zo zL)Fs72}ASI?vQ6;6?Bp|E8ir;c!PCB)E7DuF6*Q*C7;^t|6o#DTvk0(tJ@~VxFI*! z`gNi>k@|((Vh+jCBdP6{A}luRXaD6R_c+vQMm_||WfCM50SZ`H-<``4*w}bqcaSxt zyZojE9n7F?NQq#p)y$|j6oj2ZjcizIp>AuNXTnU#Hp-JK=Lg)cDrrI*L+P7#76;r8 z*JBB4TDc+oZ8%P{hr|A>q=_t|_aNArwr+sCh@mcrv-`3pu_%tkIw}hmnmrzn@r<(D(LpRFR zu|Wg`NYP}CIF$pMGEf-F$dqlJt zG{4~I8)p>^KApR~E4f-fb{-*|Ep&7+hB#M!`{P?>SizqMyZnuf?7tBZm&S3*uCD~D z5VWC+3W=6pA~ED#rM5r9ibT%4LYJAZKfv6c@V=Sir?i6n;Vs1>^&3%ZiKzpvl!~K< zc;dNJ)UV)Mg~drs3^FEa-9Ul4@-u_!Ww&ptBrbgGBfp37-3A8y-MdBTGH^7hs!9<4 zT789{N^Jd|B{}l^W1I`xMv$k0#%=bCv%Rt?)uDdP40~hQ zfly&m7&?NT(L?)XIVoyCIWb);HM|aNXs`3+8@9@cdR>Ng zhx)=n$IlEQi{r8*Luog=gn6akI6b#ZX3$BzK!ie}LEzwwM4#@X{}_z$fpPs&P(ywk z!FBFZ6r(#~bKJaNLSV$k-X4)F$ae=UMN5)Nr1up@dEKx|w4c8AwlHJ9 z9qJQ-WIEVJH~<|a2)N4HHmojgu4?tg0t?$y+AZ83-QSV)c`%^ipmHcGcYjalH%kgh z*N*N=LPV<6DOU5Fj~2B&eb4+)+Aj)z0l;F~yTK@7lE_yCg_*NdEcK+MdCce8g?;w5~4h13sKk zQV>^n`@?mTQaP#S{ESE4e_mQ{5{#F3*>r~C8TMa1gl$|jlvIu6>lDAE{VA9=5;LfS zPuV7l3`9iEX9wx*0|WwVA%94Ba=X*5*E&zusFEF*FB$Nug^cCYF;cvuj^ttqN+a2* zszSQJW|k<>v*5>le&;$NBbVvhq-`?oA+bz%(ur5dkA>apD(@|i&nh(PI%l!r)S>l_2L+`U zv8s8#At%qPs!lXty8i%u7MJH?8(80_ZY$tC%W#0k-= zgj>YaLrR{^UElw8@9Q^ul(n**hrmIIK)|^i% z*MT}*ypf`HZ*_~}a!c+{q&4~~jQAO?C&b|}*;86qx7LZiE@!eqw9aqFb%HiUoypDX zVps~NoOacT%v)xyu!yY}^=wT@^kVJSIpv`4VWEbj=+X2Ui$tc&iCKi-2VQ&fk@W=z zp_hqUt46CX4aabgYs-14k9v853Qrc6&-1r9-8W&bE<6-`nK>w(_kS+XCq*8mi+$Zv z(kypZu4Vau+~2j0B}*V7myt~Ivw8@9r(H~2_yOQ>cRx>LfW-*D8c7VTIyF_Deo#7L z>V>>*@Y;!0KNbKxx%m{uIWH073W4Aj=VTPu5{Z++PM39Chqe^eKMJu)%bjZZcI7{K z!Rv8p(M9(CovSAcW-P8XQy5=NS2{Vzq&VrjeSN#&Kda79k*JU>JUF6FS{hh*zk zC)7|N!{We(=A3mR(0!3lXKP12WZDshA&68^^6RH+3fmx|L8Ut%3(U{crvZhN>AWH> ztgYLrZU}$`q=|ii>W5m*u`=*zjXKw&^5NphDVNUfy631+%OX?gSJm>IJj|A-XlX3jidj4A)p9 zA5?gJ%{v?8MxL0 z9lpe@13Na6#jwp~YH4me#IU)9|0?UL>C!A~cpb75URzvr|3s}qnMc}9VA)Be-9hqB zpw+;aTYtFCnVt%zQi2+4uJ_E!k-Q17oD8E`LG9LRtq;E_L44jL{?;4u3$l{QLu=fC z;Pm+RQMT4JNeQ|WnhdxVR8NFL4GIuM#?_#Hg`*#gSjO~Jgpt&vC7wVppQV!#6MHyW zZJh|^4_$GBgJVjxcF~^L6q1hgd|o$9d%@|b@Li;h3iJTfu(Nx3%A&LnbROQ#rlATh zYrJ@avEj!Lh>J*(&ABFN?AlDN$so|Sn}Z|Ua8ilMXwDMZ93UIE{is_oHtK<%j))@U zVLLm7uyA55FBhjfp-yHt1;{G#tK?Ro@%n48j%tv_%=NF>+t;Db1997TWj2*($EF_F zW9=XtBa4eOAZpFjc89(ah+Tm20od1D;e*P(tg;gJZoA$`X^1O=c!0aWFtu}goRB>W^Al55q-;m1Ri21|#O-=gW#ldnHpc&!e9Npo3LV8jP9E~3?h<}$`PJjDni}b4%aL{BasbSS^fhn>Oxh!Phoj^jQ@9cnU5VEL)Aah zPTb;)d5QlWQy=_QQMqN?Hng>`zL6S*KlnS0xCG<}de&Fexrl=x4E+y+*y^i?kJRhDuRXla7l?Rq~vc^%ga}EaMy+DTvawsx5=;YWRP1cZujEB&a5JFe^ zNHblyQiYv^|6=`LbO$~F=L3L{S4(dnN?@ep@VK?~F3nG#%Rm3b=>t9vy1hiK*iNFx zefl%XwqvMG8&;R65Qv562eDK8{wp8@Ju*3AYB~&xLM@>HO}=A8CU&+KcLo<}Eb$%R z(XgFV>!=&cmjA72ADP#>yFDL1um-V>b`oac`LBzEMZyD4ZeUlVO{_y$}2<+=K%*}vcp z_yU?1Xfo!(?i!V~DiVF1c)V*h*940~t=!&!=QV1l&r?cLuhEPw&bVca#BU;YV;N;*DP^S+-60)-sh$?K_7Eo(o zI0m8(a_5n980>lZg8elci6_W`ZcXmOs|Um@%3lO#2YbsjP?oEL;?hClc-icf^)k$*v?5s_B_%&gA>;+bK661geVROb*J85$ZQ zAfeE|Aa1plc#p)KLsFZ-#L+b)X$O3_@zvMjQ=UCFO+q@l^N0_g;f^{o;6lbfUDNLS zs}vV-Ia%UMtg_g z79gw)y|#q^nwuN&VldrD>=q9X4Lu)=gxgvy3GE#y)rjr4q06us4j4yhF(O;b2y13X zzQCGVI7uwZpSB$N;D|(-RU$|fwW#M1c?2E?SQwKRkq02(0ZjPg+c!G@MpvW$3aFnQ zga0TKYl#wKP{1#+AdpG_cus6xyv6F<(tn4STH$}sk`5p8?2kYgAkaAOKZjOV23NhH zwj4Wl46UvwXfPokqK|&0?-JsS=4j=hZpl$(46?{X_XXY4#>VSh%7{fH>)lFRT_RMUW$lZ}9e>A8$-VFEV+n7a!rg&3<~_8Y z<5DP2uz2HrW};Fdfg@Sz&sj_8xnGA-nc%-zVRn#pM+V>H&E|4BrzqT$N zL01392m)|erV$HA`_2#XH6MieA3Xm>Yygdojj#vsw*gIq+y|ccl^17xi3T=e&wk%+ zFA`KbKP(;8@{aS}=g4!H!iKNF3w{d8e&7Sr&Gn%Xh^@CqpRs<5X>%a4rlIMDs}VNL z9E2PhZ!nZ5EOCUel}RFTDdXvD#=i(v_u{wr<*J$t?XxqBz_=1%e<|2ZKZ?EX`{=j! zBZ&U)`-m-K7{+~AHk^%mghJ6dOS)2Rjeh+C(w79~0FBaSA$H)gh(uw!gbx1XdtkyK zAb;%XflQhsbrr}G{P=Lu;ADqYlQ-<{-T8%uKlKhoiE&5qGf)*Py{)o9VPWMW_8<@= zEX~XmV@I&yA%YM~#SWu2gAftNkY8VO}w zYTR5qiKMm>Gks%(udx@Q;3o!@%*Y_ot)0sto{U)DBl`;sN~q|sXBl_MgsT9+h@&IT z+FObsq0j1{!9kdppaBnD8#LlWTQi5sLFMat_&lM0 z7&Cd0Smd3kmX(lbVa{M_SVJ3bu29mXBQW;=%2Wq}cr_G2+k9_FMY(}`kubS%(UHwjzVTFGO8e!jJS|4~?bQIifUe+!RoH3_mk(;=Bxk%_@zA2elVH zZTzq}zR#)&BwAlahO&eoLVDeULova;!6-RY;c}M@(`Io6X~`2OJP_8kW@6wf5Dbry`Mn!OH8laOL^;uM)m}4fyLZny3XzOTr8hK_oc$ zx)U@gQ4aFX6DO743OvhJY7sDwBZrq5d-d!tG3qjg&sr1ljJpsbdbt6$*!bn$qo_bf zJwk=ySuo00Zb;{Sk7+5O+?Up+5>MdJ(+hmdqQOi5v?{Xuk=a9>de|u^2SmIIFLB(xvc2XHV_$LQgBuxDYE#~D| z&%>g!Li`o{rASN?5qh}#_SpRV9mn*&&=5s8h|3WFsg;|iY5T(2<~RC%@lrIXx?eHB z>Ldn8NJ<2|HcNl|dAqgmW0}-C%RJ;vjXjih5`Sp|b#-99JiSoMSc4;>TwP~5q0UD9 zmmw=Fwf%V)j-K2*oqwf^6=E!46O+~davBubVg@2^icdq9Mx%%V|5dzI;o9G--tM%%uBTY+QVblBk{vICo{}~=` zxwrMPV|9<(&FcQuWkbP-=e+v<5I@>|Vt`WPrq*tgP^3?&ZcP38B-Y&k;3W~W7_Amu z-r4Hp&E{EjE|XUU4jtD4!nzM!L%9K*`ZSd9pJNr_e87bLg-}b-!}d#ON^4EZ$|aE| z;l*#cEKHz+p;}iLXq^}~jJZlQ z{wU=~8Pv;-S{Hl}M`_u_T6DUkaoU90Gi8+8w~={g;MpOcuuVIrJlz_- zY*e4woqvuxWtxBJeB&t-3Ddo|E)jtqjSXw(fRM{QOG20r*EUmT%(Gc`T>Rj@FyqzR zG>goj8tjXJuuAY>h^k(6O{c2Euq&DNn!*c$apZ9%>9NxAPgGxl*xx$rk3lg}r@0`* zq@6`4CCEe)BWb*4*w5*fmzI_q3VNkjCR*To`pB_|Zz8=FfC)Ovk*4uiqOu(d_&b!1qEcu4^CSJjgQKMkq^+ztr&Yozw-#G0f zXO_kke82H8r^|W_XMtyZNYS{2l`Qh%_>j9M{ehIxfP2HXLEEW}GYzzK%C!z|3O-+K zQ~P{l{ix@<)>)`&CRPTq-zDp(4h3r!>cH~wTF6X)Ytthg!9Qs{wkkt^OqiGC8*hac zU*AT3!%5ckukErv@q)a12tM?on3rYjtMA)Y_DAzbrG-VXNhdBvP3@c$Y%MMd8$L+E zqaU4S?&@I>HoP*rPH0*t+~36WID-Yp_oDsm;a6FY2n%n=p{AIbI+LNCFL+;YIswPQ zgan5~V$`1->nZvGFe!Un&GoU}5<3f+kPzp1{gMdI?HX1M@-W(gIHthJ3b#{7$EAJ= zYCOqrTaVB+&(d)C zkJe#2GyPbuJDY0LbJd2hv3n1?8tH1f8!gz~qD|lpeznb?lU`Dj$(4Jv##l}L=u&;7 z)4tZo7gViUC(C0svUz5;BL&Z?od|gr$c&VeDLlNw(Fc_^;x^?g?Cpy#3}de4Zn=!; zrSh@w)nTKL(-sDq4jTU=-+$N6j%#{}n;3V*W5^uT`HXXO0SqTiQq_t^Aob> zi7m{f{HkQJ6pRK$x$4i^Wh1VSvxhTxRN8N$h|{q1@iQ9rpy`dIE+?Kj^E*C+9J_bJ zQ4Vh<5X(5fz&YP0(te!-x+tv*iPbg`vv|`FM3zVLpw7yugbY5Da=wxL^kIcyj-90_6%)|`IZyp~}STdUy zPTC}95iTjb+|eXRTmGETWHCVV%QL2n0FDr+c_4%lb3Gy=5~-1G)YFY8p_`K?mVo3v zfmH|NsbD#R!2tXv>qIm=Bg|ouAq8r1M`1nC8pL!3LRc;T$GHv)f|>zLuRxnhHhH+} zjzIx|Mx>toS_d~=*hqj0NCN^&E5kd+gf4|{@&^SeUnP=rLKqOHR@a2a3t?V_rdRPnt{-eZ66H@2Dzx0ScWT6=`$^9AQfhgl|xtH-Y2YqsNvm{j5$vzH^m zI|DpQ^AD0p6YLz1U&RG>%n4*@ZIO)aFijU+*t%dl9e<%Xq0zQPE06hZ?uLkAYK=?2 z^uOzyw4t6 z+Rx04x6J9=wu`V`9i=^bLN?l6S?6hHNNfqG_jKQ=hcd&>d$jsvi)b&TK+yDhc7}s3 z4R>JZ%W*=GHDp-U8WE)~E=p`$jw))Nut}P1BZcR9X9bUC)XBEb!u<^sNIEabWPy+i zk-z@u=>Yf12$mDzZg6c>l_Q}B-zON9FcTjG6ps)JAq(p8&4W{@-Q(KhN>KH-($NK& zJjRqxh--U-oFJ~j>48N5%Mx!GZ{dh1i$R!!pHu@uaCA~|a|2AQ^xwhthwMcO97`|- z0)mN{OD1_79&!vxKym=wUaaYDVsO)Abzu&|4It&KlOYp+`&nW`Xis4x6JevhVFJ%1 zxg2F_KUcpOFS5OC_hF07;W?#nZrYXKZp}Eb-MD3Ckqg%$ciau57x=`9&&%$=#U7d+;g-clEVp3u=zFrHP=4NTDIK zR@h=tjo#|X&cgx`$v-9)i(0nEoj7&l%AAd6`fsbEjL9WH@(#5*%cdei0<2mYKOsm# zT3RK*vPQt(#9j3D5J~t@W=+O(?4bV+l`E5gK^F{$FU(NnfR2FaKfVSLw#+Ait%O!C z8HWB2<_p-vc!qLvO@RWAd2=8%XrxH{e-VN*)U@YB<^y1~%Cd?I*?;sMa2dO7rPusv zASGjN3E}qymfS!tpTrjv#&Q&IzTfpwIqBhZko!oV z-I3M2&%cr1W&Pmvu{(<+iPIl`jb7}nX)`t9{h7{R6{ee~GwAX9g1NHyTyE>O`T4Lo z+VOW5^4qEOBVEd)_oUvxe^1B!QNwEAXsYV7ok^x~a!X%KPh{+8y6tTZ*AW2kQtE@S{Euc$YtP6 z2*xRCq7uzcb~C`>-7PcdM~BNU@pjwcp(euy4HB75JE&~Lj0BFQj$4Q{;i-4S+fWaK zAOSWdfU5+-fArXtevMlJCk+G(Ik0okcngF-*K>ZtxvCaVJ$SEv_O`aA{Md2;um{6T zcCO>Z+;%H=q8Wra!eFpL$TI8yg>g32^4O;v}oM=rWmT@h()W>Ol|yJK)D|-UoE2>-1OEbIIj}mx;g; z)R!|?s?1684mMWa)(eI2DlFtb_aE(d`#w17e&s|(@!6LPTYecib_VX>f8vggH_{Q> zfiK>@V+@}?A=@>am~%TMPH^JK55v->(6?vng{1ZQqA_ceO8ASEJUyl6-{GmoNr@5F z(nODx@XcGsKGQB+DQY76s>z_Mo16Q1>JOsgNz+y~I5^AGpN>?_D9HJhvcfyDsx~H& zbKU=>@>NzmpjHKv;-(oldSyTnG7^llj#48(46~gR6zhDyusl2|cSOLS^LPE3J!*b! zM28dRqcV#d6?-R;R78<1CfH95)kT>tYcDo-A(G3J+2{Vw>SdsWT8PnM8k@Sh?_4<) ztZ?(T)l;|;Goq~ZnD%JrLnWy)O!={C8kjEY4Gw@>7EThRxjL@}$g~Jwka2fDeuO|m zY)82|g`oJtJc^UrzyJXJKLG3_wiXC%Ab#Sp83e;v5TG;S0Kp!P+qf0OU0qxrlE)1N zfoQIWrI<8VC$o6c9DMVWQZmh z-0-r{I=cve4Z~Mk@pMl=9lW~DaCHDXLcPzjt!FM zqf7GbH`c>k4kK8~q|_CtLabz$WHs)cL7(vCm068PqL%{cR!O@%9$LDMlwPrxg-mv< zsgowCyRaK&7U+V}x4_zZQ1@l1u>20f-VOSHOME^bL~w$2ZeB9ioV3#X>%;Xxej4w+ zUzBbzQGcx#U9P!Wf>Co9o9LG(ptZD>V5Inqptmy++8pxH*GKnIOg%#=rtq@jY@YiAV!c}twy%9>@QMX;*Uv8h zvl>8a+i&kkPgTZ&IgFF2b~_$TI#<17MlW}czxucCs{QdIYyEe3Rxp?Q=Z3Xsq9Vs7 z;m!NLPo%HBds#;U4t8Xg?MgnRT^M?$qu02IY`u!J#4RQn@)c0!JhkG?J$z4C$Q&t# zP`vBVIpUxYYkmw%9sX%(@R9IbYK6dnDOPC)*;0+1&F#Ff`t?Wmo_7uN@AD4GyRa2$ znHoNVs1a%Bf2F8S`s1FIA5EcH`UkPmz&fE?19hmtlBjXK>vkx)x2ek%zQ|Af|7ctwa(4c$*`Bis- zd95lHZLjxzV!kshnKCS{K5JBDr*Bzg04QvQOr@)f9abNVZ^4V6p+|J*O!!utX8X(E z6q<>Q$7>XyeWX5_f3M@|L}kbp~9q4zuXgt*I-^iFACnf7g4x4s=5`ac(xp#2Jl zZju`c<*LGeWa|K#P$m+q5jP%+Lt0yjqUOW09ZHmBfg5la^fauLPgeU)Gx-4!RN*j) zAQzUcZ~8Eil1M<_v16Q=5}z+Xp+P3S6?N!3A1bPy!J1JxiSs%1XI=&!T`cVDy0;w- zgXe&+Z3Ycaf#A=;6)zBv2Oc*?e@$@VB-SYO=cEz; zaWTS)3Cqhgc00CfAEq(2;R|L^yCcs_8%SyXQ!uD(`HjFfuQr1WF4xu zJvy9Wx{g-8&3EQS_F=EKq?)58hhgU%7ZsQcEm;6zW*1> z-KS5fzAFzdU>-OJhRkeacW)F5efLfe1VSy85JSJ$D(W9GX@`%>G~Ei`n`^JTyq-50 z%M>jmKUP3OkAp#TSQ4$g934J%zaAfwI@prcczyUWtlou%f?%_4V~nxYy0urGEE#s8 z%!&v=266xZPxRjb!Rmegz8Z*6b@CX$T+|CXIyyvK_v5L@+hdc>;rDkM>|diEd_W~l zf;3OeV$#Z;BQkEV8TtI3ZskDxR*if3kFTj|25&Iha|lf?p(86HB~=9%J}SC_zjaf` zR(=m-QTp>Vb@kcNkJDiUN88V?R;My!YZ0}1jKP5jmD~Q8_I$;m7Kfd(_$yLy2pT?r zl?eY28lfTybl!5Qsa+4_hpW%Xt^_Q74*N7+td+^HtTpCU!W$@SYk$Smdn{n(X>Wk} z`S14jhT5}VRgb8TI3ND;L0=&5bz-quXZpNlinx?;L@3Y64IA2}rfMxyJo$clt4H2d zi5c~~Jm5H2daHP3t{)m@%Zf5GjCI~S$~{V?;4C{6JD zI=bcf0woav zQ}>0LGj4o!Ax^g>5)mY+Dg1-E^`y+qOnh5V2~8y7Wr0VFupQwPoBF$p=Ng8tfufES z%qcux>9c~5adh6wF7q3l=1u;Mnin!SZ%b2LU8kB&R=b3`e{s9am;3g3q;TwJxngbo z$paxod~ck0k<@Lf$fq8dRckpaeomJm<8tVkk+zfKDZ#{?Ne2(|2<7mPy2;AL4`vrE zTg%TGb$0bhi^%@ED7SbDURQu7EiGvf4%*mSu92UmG-u8B#_k-XqQ1gR`qc0 z^T0HFgX#0%!lmAJj54n^c^fxzrC9EzW${{Wc~Z7HIb9N67cz- ze{CXyBjBzmO9I-W#zla;GjLcE&+A9rZIJ{S=$woK1`kPmrfAb+1zD^=6Zn9v(01n_`4CN0 zMzegQ>$5;O(*-4; z*xK6^#E>eNM-NlUJIX+JJiA=bIGxUGLB1PW{Nhe-JY$bor;}mNEJ&hz;0ZGJ{1MoB z;wC>0Ub#5+BYHC}_le03X26B^)ORPKTjjHfaJ{)KTQ={{iO-n-IJrU2+L8!x50?5(-S_*?S$sst5#f zH(}o)RwYa?+|qoH>yFJM{ekCK2sbl4Ujz{oXO?*YjF)QgsEVn+DB%wqPI3Q?z}8>9 z{S(aqW@6&WBDU}U)ZH!iz3y*ZQbh+=cJibRO-QnyV)^KFUrcSmD9rR?a$?N_7foN8 zA1iDZ484D^UFedkp4F(ZlBUi3b2pPWU55|i3ZMcAy+Ja8iwl*sw#g{Y!}m^eVMZe{ z%uc96 zD~YIx6-E+qWIbHCu#6#J5ETnjB#wco=Z3#Ul0 znTIERN7oNph6aXGA6`vgGL7D`GQHC5Fx~pKIr`nhuLG3rS7oNW*v(xgSKF9(CX9Kp zyK-&)ASZF+>&4dG!PS%IXc}6U>Z_A;L`x^DyEqelcUcz;8rj3Us%qHd17}#qpYfNc z#YjZl9>a*x3(D!XF=2){C_&?oZAjbWFAx`KgTP(+XK-}|E~UBo`Gdi*$Ic;s2RExE zd-%eyUm6-3vcGyw(LyTIy8bbcv|f#TA1t4h^E{vK?Nvsb6O$7Lxn~q?w*yd-|0y@n2b-U6w^h%J^UC`BrZndC9#5O1Goln19~a|K!s0| z%^@pEbaq+ZW=lD~zikF5k?0Q=p_(gqDOYlYcjVdn4fOY`9+Cq_t{s!`mNsx)aM^z9 zQoa_iXiE5Q?&9WkKRXKz*!PRBk{15>bHvP-G{*_0XFfVL#B$YpGMu*d=Jmk6*M9GB z_^5h*QZ;$rp+W_moT|Zu445VGE1lUXe9Tvj_$~MF_ z#=S|)t9@QmLPy`s{8&wJ`+8rh?pw-tqr7UqLwV==og?nr+ZjF*-oVtj=_mKSxPU=b zWt#5el$)qdUzTo(p9s3kr5bxcKks8^Oj*s_Uv8esqRR`damoA@neKsRdnOkR4Gm9C zN|7z!%=-M8@)?XU6y#CXf&e8Lhl2pbFU*wzx(EF*GyPw%jbctXN;FiXNrO{n7q zo_WiLFKImv@qfZ8LTy}^8YjJ_Mu!ikGrX)wnu`cuqjR-!*qu#F+kny&N7HzLCd$Vd z-@?@69i%B_G^!#nm zTX0gvTfo7_rsTyOP(i<<)T^!;om+24B`-vmah`vN!r5y~hp8B50&kB(JwC2IOyRpikWA=Cof)=J1qXVd-PSp&budH zJY{Z75pNWEED$k^@eXcf4ct2y*nRD%uQykmppmEjK|~M6UH0kO9j*SJ|Lw@o80K3A z&ctoKOQFphePm1MMUzeMfOQ-(6x?V6(@6h!j1wcYB&F@XZwv)tXuKq*bVBD=^Nkf@ z?e~H~J%6bjpL6~S`OS55!c8`t&GKZ!fq(~{Bh(5^+D5;FO_&AaX!kT#KH4R+z0@<1 zrr6ZbOlv5F-hXqqwzS|kxdb!TW2-Zx21AB^x8Ay!Q^@wrd<$Sm<@fryfzRBT!rR$w z7av2E$n#5aT-IM-B>mn+JDK)>iKuKb2>WcnP7)$PZS4M3cn!Wb~-wW8J#mTGkv9&9J1bs z#y?N-z9IbSZaBrT#Ytz`%@=nneB)m)GA?m^{TFwcutn}y%Ilt+W|KGFqF#}bl@(Nu zZ2km1ll#wz&|`~xGtc6Zj{H5lPA%>1M=_z3r(_uKnqk=SU0Gp7xxMQF3J!Tj-;4Y) zDJSQ+6aR(eeRthR{YurG^)!ojW!0E7b}HP<4S8IcTqC(S89;wjeYfAW_aUf>@ z`ac;;a^?Hx^|AiQn~Z9nCHLhQlx|7pUiN06x7S1;)j(P+x>8Q(-(z=L(TYL=7e@Yc z>*V~tiIB5=T7f7fI`P&_R`*OkyUuLVPunY4p+FmnL^{=Tew zXFAq$=zja?CZ<(tllF^46a8e?oJ#&SFtl(8iZ#diwkSLMlx8%+!oaXb{ND*s!;n+~ zE6wd2^Ik>WZaaxQ-r)Z4Td61!w!%W$stwW|CbZhvfC2z^%;>Cd!$oo#^qA_BlDFe7 zDv@&#_`bbL5dEgeafyruX*`>x(m5`#AoCetEPAh6rCm+# zJa;fhE~R<)M~qR%*!PDwF7D;GF9N?%fmx23&a>_#K2uu>I{OV^i6A&g7HfO?@_g)F z#eJog?GT4}nm;)zDN*k=!vql&p}0PfNHDso(u5hS-Xp51!G=}*<|Cfkxwoot%i~lG zVgi1rHJqbi`B#6`i-)jcRvF^7w?|txHI8eO*UZFnZP)Q-Fas?_SQ-Yyo%?=yG;jQ{ zfxpdDCIyXgjE7rS()Y%olH-_&@XcWtX}q40^I`V9Bz{ZVw50Cy7D;LBQ)z!QPf!bC zzar!HzEZj8lXk;;S3uQN>C%*Lyg_h@a@8J_y?88db)q!E&4PjlPty{^wrk1STy)8E$ziI4I| z<2X6{5FhbXT~o8{D<^p5$32wgaHeQ7KqQb1BRU9ZE8XT_KyOA9ctkrK`jnIc`C*H} z(Bd5mYGhV6wq#+`AfKX>8J&>Kc|Y}hXjk>|z4zE_Z36H|uuY2n-p}{Q-n#c#Bl{`< zJLvnPZgV`-OKbXhQ*tKFUc5P?7O&hfW<*CfS!RLiaL_STCA{VgFBj9)XYqe~*2%O~ zOm%K8PM?579MR+9=?4cR*t)0xEMtKhHhRpvJv)%irKG&Ku;>K0ZvC;IH^(1bX3^D6 zJO03TyB`iH9nI(E#JCu!e{GB~uI%5^chghm^oR0m>*wp-Q?5xT=k#GdrC{7m{--KG zfx$vw2=;sawkwtWCHWw_aPy5cDF!d!NMfjd&)6SNdA*T4AU^Akk&^D-->OcWl8#E6 zj*oJh?yA(HP84CWqpb-hU$)H#58{Pc(X6EGVdw=wvsIC z-$y0BJ4zy3(le>lp8aB-P0ds^i4@N$@8NiXyYEHn*ug;QMl&sT@wSpc1$lDWan9>~ zn`wB|$sLx@f855$oLQ8qa5ssG`qtlD!arB9pevyqNhOaZgswS0zy?p7oZXo zgn+dCfemm0E}MEh{*Zlrb$k`ZF^UF% zcmFUu>Xk|abE8*x?OvC4me*moaS@Y3*;!r?K&-?zJ6HTr>BurYhSgY2p#$QVueCl_(xU?>zHG`F6XVLP;+wMcHU9ENeZWhn7drr=5GNpnzpQ{ z$+~9`980XNcSA#Q6iFl!A!#{aBjRHaRw=w~xD*LnU$I5U#qF=esJ<*(N8bgjV31B)N9Di@;H%igr)4;{-lCSrN=Go^$J}bR zKLUpovhZVN{CsO;rRtU@@;2>7*OO>}qt-SzAHneCD_Dh(bKYwk3FD9>Kt`DSsH3N+ zktFdQ!6!NAFV7*Qzezck$EzY3w}+j5>xP>p{LS%0ZZ&%)i*Nn@+d}mT^@tF2XzMVN zQHS{s9U8>MK~EWWwPU?Jj?N;F$m8C~mlTmEFpDdZ$YVrtZTdBZ(?WPF+tyY>i@*uR z2h*o92lMdZ!+z_-{E0`-;am;{p13&H$ul84`g2IZ`_2$6a1 z-zI;Z_2_yo)y{1kVd9liT#wf4$OslQJgILD$YsI7o5!M%L&-Q54tk!hZn^j3j2idV zzrUSg&6_{{guSQM`0&FS@T@M!kh9P9xcb=Hy_%fI&kutj_l`{pr}stN zW%$)4BrJ}wAajSV4+K_1+Q*6OWCqWf6o9=i;G*IT)qYgj5}nDzE^;AnR?E;^F*nsh*kft9s&q*O}bIo?@_&hWDI!)2E| z<=y%{lJ8{(nlo@K!FvFSm6-1FYFrd@+5;^dSy;EWBEE%KQQBnng-DTH7Z}U(9jt7u zzKu@^exC} zJ=(Zo1FrPhT^{etta0ki&fXaLcEs64!wlz7C|>woTn^A2MbydP-3|qdKuQh{4&Hw% zj8)eAac=H7(#4pO`vGeSR<#$o`T6%T1GR7xJGH=}L)g`tz9{XBprw19`}Y&m z?l@cg^_Bb9ic1aR;k$Qy!6hEE7N;|C%Z_t`Gi894Sx@ilyyqu%xQuzj11=Q}PBAHg z#hhbKWjb)>NcHh28^ez64Zw4&r&nRsx$gvdf5d4V@L-wuth>EKlui_rS0PCQJDl2n z#Iz+80^`SzA7P@aLJ|)-FG-J?FS**;wZ;y`=ViQqJNo!66QsAfF-@x()Y~vP;tj>i zq8~dwuec8{$-VGuyFQWl9NIty?kFi(Q(?}ju+s;8j8i(j)5_f397jnUODsyU=WVgW zky2Y<|IXIqlG}V6I4phb?C2t8cib6r!I-?BZsJRrPFqh8$*X-4jRB|E=32uEboJ}2 zgNF~dkIup|f_4mkA~?}|Tr2yHFrc)ni{XyqRu0*3vy1mNu-D}k6rl8vA3_fW54h`;T9G*TMNtIO1r7Xnsc;HI3A0DwQm0p)F5i{6s=hY1Sn3%Ac z>zkOIyjgW!?Tb6k#(tP%=-VL2uo)k7|6ObiupvDt+Tpg1e1N{!k@n`1T~PBURK@u7 zzKEn^jRt=hYn05Y*Y&k6efB?(<9*e{bQ{5DA)Jrm+Q6`UFP_60D(rU4NP>0ie!;oK zNx#?aqm(o2w_CVhPOIL=F7v#^?&{Ujwvo-ZnsH#{44|T1cUvsh9H5SrV_qMw9HFw| zWk{6stMC7g6%v_vc+{^K7({Y$)z~CTNJ`R(`};~@iDqs67o2;-xg!PA;oI@Ku`ymT zQJcl4{!mjUC8sy{rJ#153THp&`}c9{u)JGgmUYyLFxF{_6FdHpr>b%%3{crO}@i_F|I9;8NLC!W-}BD61Lgprdkf;L~; z9O(SQLy0P0P3N~cdm1;>-=}lb@ugrdtbZF8s7JLpXa{s-_+-)62D+IoGkjT zt<4m3MFo#M(E#K091sv_T=_;~dtY`t=bIh9fXL8+fiEzjICA8O1eMw02-{Zp`Zb=< zPEFO&xs4Z@o^~sh5V*@tR$ZiBBds2mP@Rm!-$nkdU(C+}n|bpDTMbmoMZRNiUzUbvAPyIjWs293cw5<9waY)kNEkf37H4YCY+ z+qzS>EzfP%RE=SBr2tkDNNDiWki<@d^8G`sV$q{VU0`ioJMe%wlZXzB6J_?b2q5-2%ApNs1Y<|qDK1{gVV~dfvM~AK zQYT1r5PR@?{?45{;3lBT!oKDpcOP$XU6suqa`1ipN4MX>8RC%N0*o0|8|p#r!=6Q6 zm`$dnaB*>|cne8gAGUao2xC1YiucXUHZJWeq^#v&5EW-icfmMGiKesK?IJ0!$K+XA$d`(ggmJrzsc9UnK`?_xWd%JlwoX*QE0T(2ER-YLA6C6ru4O!`lD5+*8$Z-8J@D{@PV1R`9s2=Ahq~b z#=)Zpg<6u+jA+q}kXUxPIk9L63qA7Y&3Xk*`>*VfnN8KpsEg3lRlReP+r zr@ge{1ejxI&DF!C6%-WYiB zO0@T3|MZ(T*S-#|VrPr|u2d((du8b&dsBlr%^KClOUZi~;j+OimR-#?`Y`B>aa<2N zw~vSG`zLV!7APFXjCd?yi;?QoezhE8YAe;Ymo%4oR*O=I|)#;Dn<1ZE=#EdhS z)!@bPzv^0x%!bB#I&0cpp{$d|VxckO;e2zdqRhK_(3wGNJYOe4Ru3ZycDt@6ogq59OArMNpKZ-h4q3_mjV3)f+i`S z8XINdR7tHsP%$ua_iBup8lPUX0)re~un{qCH&_Yk=Yb1eP@F&?L{ zHtm{~p=h$Zf+DbqiT?T(G?SaqssD`5lhf2;D8Fp?+rXJskpG~gIDWsklIiz>M&+Wf z8L8Fn?Ext%Mj|y0U*IGV{^888p_aSvfy0dd)A$UA;ZpZwcApEc?0%A*EIq5>?eCW9iN~r5dD(UCc6L5?*-8Fun0s3%(!8cBWH=p0e$V`# zS7aVQY61F(0oR*&W+0>vFc*s$b9;rIF7yzF{kr!sbj5C{d@(~<9eRnUuvKzTch{k}}W8*bq0w zBlRfB@wdROy6hpXd7-imBJ0|8{WUi(4=gin?$zFYhtdvyt=;ax1OrhXyB3Tfz6`x= zbcxx-&tE}SfmM2HYNu;qQPHNQdAl{QUIj%$cl**cqn(v2Pr5l&^&Rm~w8&XbBw(=5L7>pkY-d!!Q?&%dl zev+VeE|a3e!y)))rhL)5#~CC&1RKeIw+M;Z8ZtDkP3URQ|WiNfl zqC__p_e|9N4Gu+|W~B`qqn?OXt|c$SxCBR}nOqA_JUZ`_)KoG%TebD=ZWu6>pup_h z;a6(*Tnc+nl%&N0$Rw}~w3@OBgV<*Qc9Jwka#c{V&p zw)h|aOctVW23K|iQ2f0^!?Wp7(X0zvQMf(P}_&(^4iX9!eg^cGPu&ytWws2)jBWX0H84zwD!XN=dRlIqt&Eit7`l-LCUG4pLF7 z9^2UUIRp4EO-a78xw6l$40cVE!Yft`SI2AfxUTADHXF3dQ} z&C#h)$q7PY_i}zp^7(oH^A?p6;iUqL`TYF5W|81++%j0Q|LU6^T)rwEOXg1RYe8)J zZu+HvU6#>-KoU6D`y&k-Ltp}x%O52wD&U>xj|#75S`i`(^n)sI5Ihe>LFwq1k&a5# z%gAAeO&koc@mQdkLhFx*On9|AVw|tw^F)`aFtc%V@!dejgJQhFH5e%7DzdcXWQND|IQ(Kf1r`YEcq>Cx zvOpE^_Y%{O-D9A+K>i${-EK#fJa9gkLOA=Yym@rq83u zq?e8bi`VV)bvEMWi_)SuX~Nwerf9xjSEE14x~G+-kt9-uqlha zS3$uO&#Owj1WHZx83+L=(%lXra;g6+7*iL09U5^#Zv{RHT5pkC+-jNG*>yv|(A%PK zOR6yxF+gG;q+*1gX@EB93|11DOB5yqIdRt|1%+e5 ze&e9!!w!4R!N1-|*TUUQLc_{xOW#QVLBjn|nyVjU&?>|X!@~Yn-(awnmxhm`VO(Y| z`8oebZ?Ee>51G@X8TKms%j>vrXw&6brFvmG1GkdR4p?N z);A?t@bbZ*qOnM{L1_*v8@*a^#B5GVP{-X~p>Ot9TC_a)r9Flp!mGWXW8WBYamQ=` zM{91bD>S88uxPqb{2NH~P0Y;U+v87e?JZGi7q}PfR_(lxXsQ4?JxRe}$R#FL#uj0K ze3;d}w0}_Ff4aa$GH>N+`|`Ezc9ZBkKv{d5mKFn%%z~&I$2eXMO}U!w_SmZK2{#Tw z=MllrM-K#uH1V}l1dIf=SC%T7x&!SGJ;XGlYS!S_a?HyEjwflwbFMpl06B2Pm>NT) zL>nZ6oz%IFVHWz<(;i5uBFY6721{-%PI&U_nUb)f3Wm7EVlK;~#bm zAn10nst;gegjC6yIdlnGbUYgZO&}b2ek;3<>A$}IR`pNC#ft=)-BTFxDKF%^TH9Mj ziv(Ddd<$&Nz@76m!zxV>`q0oorI%zHXz1`fJ5ZO;8j zt1Rgb`kRZ>`hoRL(Evm;OrF3J0Y0<5129I>S1)W5pr$Jc*ul2V@vCy~8D$DO&G5sI zR$pgY8De3fu|_X;;WCX2>QPiX1zqdCsC#SvWFul)9jG@7mr)=TL5e7nv={_CmACmnZb5so9I+88?P7*F}oFBA)<5;(p@h~RC5U7Xs0f`AxZE#JYH zcAgL+O>>`MTxxD#ONkUUOH$0C9e;hgAYyi zb_Nz5{TUte*SKx{1HWLE9em7rG<~HK7?|nly$q~=yG#d@CLKLJ-_CZG_(k1MpOy*i zMyo6=8eK#6TRg{cbT`|xp0>jzVE$Qjq3il#!s+#aQm=2;U}L**c|lvCw zF=DDU`m_~N=TYVK_}=@_*TZe_l0L{9fPas6zy6H%I_C#XoEfKN!i^63P9e z!u#On(AHLC^{|Yshc@_;58R~9F*A-FYQ!)=J6CjTu;DVt9~=4jFiWw{Tk_i(vx+1` z9Ue6urochNtQBeD@{KXWea)lCuFSmmq$K~2BKm;aV@m&al?5t`nl)-iO=YA!)G}Dv z`-;r>cb{Cv+^n$wd!qxN&hh4+6_5P)?0I8V{#{zr!Vu*ff>w*Z+SY&bv0Wdq!qZkt za`E-V^ae^(UNTAn7`{!oy#foN)ikI1hKiwt1QH>DX4)~xrB}F+hlUo|_wnF~qYUS3 z2Ion?Ij+C=EQ-~z)O=9HGra-r_3dXq^QeEp?s}1*5zAl?w*m&)XCb*}<3;T@IVu_B z(|G;&ofnm8m4YYEFK2RdVi^MlS)QD-T`OzQw41>-jVMCEh8UndzFpbj-FEP(ko9?u z9ZZ#YcLm#Mk<c(C$SNr2knzjI&fo>ENr@yEB#s3@ZR2Y$^+Zd4*=o;#j& zY+JaM_z9Nb*+F7c=Ina9t?E`^z&-Hs9 z-43&kPKf@WFW@^W7f%!r|9gx7pFjTpx7Tjg*WEw1DaY}2Y#$QaBm4AQuV~uQWNOn< zk!{-vh*(!9l+~3u4Vw0U7bKVb|Hk!+pb^m-e;I~T;E{z%-b)QtAabfd+YiVgH!bGP}WT!_ba;vZ_ zQ`ACi%!Jeb6%xJx<(pP_)-a=(>$CI z|76jfLEuymqxuOlEuZ0uy(R62Jrc?l#H4lr#$)JqfaK zLQOB(SLNC=n4Kb}#yOuuaGgLW7&2Y(-v}|I8iu!Agll_1!o72@dn;DFC)WlnqN}{P zmY79f@!mCU9>LSf@@Qu8bs;e^!~n0Gvtm@<){wUjDek51#g13348w$Bwa%W2Xw_1Q zNFGyaMVAAd9FhnQDL7_{Hk2xoWS(Kh=&ueo`^$9hPq5^_$yn3$i^+7rFZ$?vCoKSy_H& z2H^;WsI1a_sck^O!@5o5tqY{KIQ&|gx)Y5Nfl~vUDd3iko~`{Rg>i5 z6coF`kPsp9s7Y$BImN-w7Ld?6Hf1Vt?HXW2%qg={$A)(P_c#!n;kzwcBUqVq(2fM8 zw!oUgZ1<#0 zN(u~=x~Fi8PCm)J1sLG&`^^@zcMi8FC%Jw4v$Kiq|3ltTrnDX9U%wu4LobjO_8ygJ zsRYUeLE-yadud$h^()lmYA5!Wy*9rPohU%U`sz01cg+?p>#}3eS%7v?I0H^Iprie* z>PGSZDeP)VTW;OeVR3c|L8etB2yx1k$V*pjqY|%M!?Y1t8HS?Xmksr5F|r4B(Ip-x zy!kDDW>6^@hJ$pTXoGiw#_RBw;10-0Q6s~VfRzQ@MqaJxzm56IvXxlD8(`t(X9jXH z2ogjmQg4yjfIk1&W1dn8K*tbr9#n|^T?KDeENX)L?!eU0F*zLGg*N;&tgY|L*eck6 zE6XkP`2@{8=sKbStgaMbgHNCO3LF)=1^ykNYwyNOPs_6C5iC5faW?&ZeQ9}pDWI1i z+(e%zL-0%dKNznxpuHzEg1D%hc3=U`+yQSLHJR7w_*vii5od z<_8lnCK!4XDx^3+5&}iJ?4CW&kTxC)8%H?V3vE%xwD!K-I+PKpI5FnvTA)Ma@C@?kP@<(|L&t6d;VDp&Lb6h|0 z0Q^$0-CrSVj91KPatMaC0B+;8txZh<&1+8_`BO6dH|&oq`%E|&L%4*o(k~*nxKv^X zXk0~}9x!8qNEgh(1>hepu0*g{6!2vX7kF-iT+uyNa*v#Ei%QHzK1!ov=vPNbuVYik z2$*qT99DJfm;eHTy+61I1hj7gA7)UI48sNKbDmz9N2I5F^~C#QV1%BP$Q5K|5f_Q@ z9`{yit3J4?R{BQw6y~zlMEe%OT6^OFcD8xoT^M`w22LIU<4+T2P(XY8KK7V04}Zv_ zKbYiYW&I7>;DT**A7}#E5SS5`^ocen^!2|w)@b7D5ZYm#ckqx7sVues0%LP{m3y@n zdpFw_y(%mum_0rMaQV7xTWCmO;voWPiBVtL>wtu~oLi7qF?j#%MhlgZkprx2G-X<( zF?|BF@o(b)Ag15f>PF*VH0&!*H+ne?w6kY$5W5|IwgcyAcU5c=@&vN7q++Xb@R5jU zTp%kL6%xMB5Z@rg!;A_J4o3bPsMH3CTC5Bq*nOX(_rxXUD^yDiTK3&V=c0LU9I%D4 zHn=9peE|0koLLppSxwBBlqq-!^iH3C1(h8Hb(WY}>23!l;2R-;gQ^9eG1h$)#6ZFu z2HwY`@`?<`OVE?>b*JYDdd-J>x!~^rDhIDXce@i-t+uGHzCL*EnfOB_%h^NThV2nn z=J52ORpz$*FwaaDJq!wo0L9dB4~2y6Us$K1!^W~fgruKYD=tpD;WH5)P6S9ob!+k! zVF`p5ytQ@y)sTnyox{Z71@|8hQTpS@)zX7wvA+w1)j^g1O_)>zWG$BBqU=t4Oi<&9 z^K0=RprLutxX|5Icy(irt;yei%k;^I1P6N}h8Vieb6^vY1XEJbO9ppfbT$`NWRvS3?h>kiu&}J^9F{DR?97{W0EobZi@yEM{C_Kw-i^y)Zu?ND}DV zSC_Bygx3W)H;QiK$@Tpn!zIgMQxj5`k8uayX%2?}wT+FrSROM&MP6XLWg3uA`yP4p z3A~74nyeInBhc_I;E15YnMr36M6EvkA`lgBw#!RM4Bv{K73K|mHPbRQj|hVtjCZHT zx=}Y^V1irzEhpHS-F)%LqhsQQlQ3$> z7TvSkH^|yuDRyi4qY17*RSqdvVzGSfc)^M``MDz>%5^vRYdN_}>5MoX*4RDluz0yv ze8B{0(Omu(j*icZiekHo1HJGC2I_cs$Y_zGivhC^Pfqjutn*%Q9P|1;gFSK2?%i`8 zknBOcPsE(SxgxLS;^}%lJvGns44PlZukceBZO)#ZCLHu}t>E@%?AmoFFYUqLFdjkZ zii$?>q+@+rOpSJJn(H}8*!klE;dQ{rL~#JJ1oOw>;7WEjVAeC$ILom4B-u1!6Ucyf zMRj#GL^8vt!2&IKjVpb4XtwvF7-0o+ zvoN&{5W`N)r1@dcoYCfu?S?_{s1NMU-IQ!%TLnpL7vgm!=w@H zOEB?5HAE1Dm*s=#RtDGFcns|^ZE5fk07rPW%AWHL!;rzEth1Doz0mX=+YK-`-0YQH zT!e%ZG)i;B6BH)gJcNwX>$}HXU$x>$ZxJHsb|xmM?N*lB$=&xe!xN9K4h*MamdDt8 znS&3i;TCsK_R<+x*WskjOZ#eHxsh;}2fgU;zkeZD0CQWTQVDzjxGkgH14KdOfM2Kx zT2B~?$FRC2LW(8GeclLvRXA!px>4!R30b$$*E+oQULA-jmr^ldXTC)pc?T&eAEI`3 ze zCTKMXa6Tk_Z2O(I`KM2wTt-+r*seI>1cgHn#Vrp@v|&=7*LJzKw%gq%=3|``ZdeGc ztn;p}vX)P+uIRS}c8em!;;@ca$H8>dy?iHLyvK`VS5;OvlO zMome?%&T}ynx#Z=G4H%5VWws^fCy)FJs$E5T0;^T1!W> zx~P7x7*Q{jg0Qax2;zc$YzmK}42^3Hy+|FA>~idJS=Im%5a4K+@~%ca(F2Rqhs|83UjL_&`_hX=tE(DxdO1+iPkf6d<4-yUu@|#|m8KP|d@3h`9G8?vwuJV4zHlt8;FK@>FX1?>_rJ0kl6XDy_DkOm;VoO%GH zT6VT9I(DK$ShC>M%*q<=iZJ;}umXB^#ZGC6+-hh1Xabf9wF9R8@Er-xEG*=|5eQl# zKsI{@%G)i>d;2c$xpR1G&a-pT{E6VzWIp?Na23~~^nGFvBR6#4$l(O3nT0_o|W-i=>Hb%FC1 zM<;aNo4|5RPX`1`lqrNk>zCY1`sv1lzh-u_fKF^$zaFmn*y2%gqwavFhgj&s>OKMj zDe^G8>VQ)K{3W)WoW$Kxd4u>2ByU{2?Fc9j!-BjtWKW^DB`@1WpiN(=>vD)t6|eRc zCX+BHx?Vh*q&U}0WW~fzmTmp{qh-a@i$oY{mn;8NvF*0Glyo1oP+@iBbdX%f5!U1eH9X$os8GWxL&K=U zk03gP>0Su7u+o(>MqYChut>%(9gv{9IW#6F27ms!zTOKKnw<=>yYE2{#Lh6{0<47y zMwzWOnX4_DYc87j`4eo(O!~~XK=IWo(wh4t1ax>nO`ao4zmnyfW}E5@odNpCbmI_1 zapVa%)fjo#FbZ4s%u`#BCkFJo&!2&fUqo;ijNh;_;BG;b)ySw~^SBs&#>(oE0I5o0 z1~k~Q! zkZ>MAouy?bo)vV6*j@>42jSj}X1Br33uQy8=PX1PFOjp5hcRKwy zgH~>iC}%uYU3l4*{-q1Hia5{G-MeiaP-^AW&i25|M* zV=R+d&!R*d(ikeL=>9*Apo3>*`H^tViM`h5uIjm0ZkBKOxXdPH-wm<09qT?W>&=>w zIcfQ>JEf=yvJgMBf&SMYzrD0YNQVP0DP?=YZR2!!y7QQ26WNNef0Q6^*MFQ6ts#OM z=d_rY(Eg>kPUKSH zQ_@F)GH7>*&S;P%HER}zMJo?*^q?g0H4N7y;y;xs1LoBPG^|%d2-5{f*JL;Nd4D@a zt9+X^;3!uu3Cn``@4NcWoBg#gE+d3zNa{j-Ug30YI*N~0tY_Sh!@{fOt2%<78o$a* zPapdFd+sZy34}EgOn__~GTJK@=k3vK^KfF9ez0jSIjx_dMDL2y5TLj$ar^vd4nL~~ znPgf&h>~-ju~q(=_iUnd7ad)^{mR#4+KXo+d=o@{1OR@svK(^ppTdOWn}JXg?4$2? z3_Qb9QOw}oAoh?9!u3RXFdgDN5nqC9CttOTe06za#|U&{1>YS{`xm2f4oFZcgC_tN zL{Av`&<#&D<{62pTuVv8QF!ZZT$VH|3nK-uaToc9zW_;Qt0M#_OgJ*Rva&M%3D!}r z(Z@Wkq+OU9GnP)02~v*y&Jc2H40*OGhR)f?s6AmlgQ+bKnB53|QiXH)osT->xc4hfjgH z`rD`Y2nCG9>r!!nL+H!fwhN zNUL;}=YQjbScM%sKnY@HA^9mN2ot7@!II$LAJMJ2$X}qCs@|yAeaojHjkS3v>uUK z39y}{TX0~B_o7k>Ox0A@aob4G!1tgX^}WuTbMEe7bl<*nhg-!Vm-bJCpIO{KgxG@~ z2`*`s0pOR0l(u^5tTV04cc@83l9}=^lip!5!cji9!>)_mY909{V9#O#e4l zpX@PC?!kVMm0H!k-x>4NYh_J&+}rtP{PYD^J3>nsXDaA{?^tP%;VR1EWouJeq;+@} z5^9(fe6n75g;mRU^J`#vt6H6|$7Y8i{wsea*dX1^*B+o%!ep7wi$5-H#|S(Po0l3kTd!g^idhx^o>kJkqR zSr{e`F8T9)iTi0QtzGaupmGCwFiQE~u4my-`I4!lXNJnVUi+$ENs?2uU+npPg=xy= zE$W|iW#EaYTO_5obx9aGsjRtz?Z%mm^i8Mr#j9hq#i(*#>i@pX=(M*%oKUjN>a*UM z(yUuKJ^g1`<2nZx!f~&!rVGQ?bu0T?|GclP;&W2n-4zR*zXbcmHf;ZcCP-9+HE}D* zFREXeEkJW(eE-8A?`=A@=)sOvtSsHR!q7keF$Ed!|AC{ec^{ek{!bw7|9xQe!cEM` zPc6SiasKw3Ly$RDljg!ZCNi+*&v>xw!jgqAqxF<@^~`=TF`G zvob0qNsc2T--<={mlplGWVaOqS8x}H?|xwyBtSae!u&cE+oumVn%m(rWQ&x$b`09_ zInJt@ZGQDE-Ju|_t$yca90M06$3Me&;1D1cYK z@CCYj;t4Fdz*QnoofPJ77})SzaU0k9=pY+Ok@+|4na<*W3hHQ`yiC+1C`-=EQPtfT31~03lZ<+VJ_s_seC!*0^#fHYpXd zZKBBWPw&`Ocixb9-r6>>Fx-l ztVO7&9b*_CZiDg%%{GDUi)@}#lY1-eCt=_fb9iRoZ1;oyyyn3()B`#^=UJY8Bm5Y+ z*GL!q($#xq(2Su(#42ev>?dNfHw|t^PzP~ZbC+gaOMF}=5L7-&ui7Qg;tYSwxQ}S| zl+^WQ8H~U#stWy9ByER8r0nxIYIMEoZbM-i1LZX$|^C<(B1y(`zW)oN0Zs0o zfb4;ogB=vPRWf;uM@=`kvPoDyPqY$8?y{^YcSOP+5;mtUW6Fuubv~((AX^qB+9dZ? zjp4|+@|OCN)jGZe6u5_3{O9c!-20td@T!C@M6rgO7E6teX z>l|e7@ban|HQb8fC&V09r5JeUupjx0e$_y(^b(hUoAk~jLV0F<^eP8=P{stkRx_hg zlLz0=rFZD;rE!+1lkDa0hY4FrtuOP;RJnE_2tl*zQS2DmwG$X=pnYrZXK_K*8fo@V zuZ(S7U0o3c)jc-ZaZb#3Rp=ke8yadI9we7w;S{S+N(OOvR|oo z=+|B3xQiHjxX?aWO&5<{n`l1CS0#|mk_ej9-bKEYIjx{l+TpE6p&pg|zPY`zWW%v~ zC-tznVQh3=6aU(z2xZiYn`h$z4qrnndn+eGz!%52AEbS(?ZZq39u;~JPOu1hlq#j39ghXIzJ4J2e zTOOxoO&NEibI;p))(IZV*ACZ9CCNe&toD1bqv>(3kv22gy5`yTbdEx>Gb(z@&9VKM zN*p2qqPxjXtveNtp_+B6^E*r9r#ALpz_RYHiDIMpTW&4`_S~F(cG#`;WV$J$kh`&i zt*l|<8Mwb#COfUaf%1tqun#<`;S&NyZSqyzb$+*RzBSw$c_=F>e1J6UnkA9Q6d>UZ z0jF>#F3kiQx3u3stsl@RLAJNo5qswhz`kqATrIZt2wF4W^4`E%Nk1W4rQN+^L!U>d z5-aQy+g2NCz1_$aep%i)r*k(QV_&25bp1Cw+`KQHl(Wzbwl#J46D{c^zZ!$pji85X z%&#eTJArf2%j{uiEVv@mvnTC{s~ah7WMFbx@az7Gm~;6lDTl*47ko+BcXm$a)`jec zOLq6zwg44kFRmx|s>zBC+@Z6soxeo$A3vj~XL2c5G4y-l`+_?tB((r>V?)y5X1l{A@4E8)A-xh0n_e4?MEB<`VO^W%^f4`3FA>P} z=W#ygBAw_)O6PE1yKO^*W4yKi6AwO(%i)S-|G@dIkItp0 z-3?MPC>4}-H}i5WUb8(!w`a@o2&b5JED!$J9bs>+ZlRg_WXL)uQfWpK%xD#Kus(RT zYL(;djW5vD!cXXxv0=F6^Vh>%+|`%1L>sGqx%fBcB8T}!R>1NJVPf@};P1RYBgv1M zSHQ;Wh3UE2DN9Tx?rW94!{+6KFa)7rks9P5zwd>~r!N~_z4v?)H?+t~0;Wd|H17b!qw@ z;f`I$Dz`=y%!o_wpX6Z+1jFImriM8C;)?2%ZA;?}m015Ps1CpW3BRD@r zN{0T;ZDNQ`K+1c57$$N@;J5BOUOpLO#yFmHt%Ot6PMtqihDTk>W%Z@4KR2F8{X3S8^xGf8QJs*BbP^{4vz9%hjuhviL-jW0%vRD@nrLJuos zNMtjh59^;W{xr5kw$F}{)p#Bjc@RZHdm$ku<&frR1cxSR=}zbT{qY}rdaUt9+1Wl; zrRTas7!6d6h=*B#!+mw=AB-8a1JM^ZhboQiY)+W%zWPlMU_YXE6`lG%LyotTh2qz8 z^ZieC#o3bl2QKowgg1#0Q((5=IUk#6O)nzZfFpokW5n}0NG({pY7GC{<*?HrBMuWV zj3@b^2>R#UPZg8fS05F;&v?a={l%l)=xyio;B8M`9X>i_EwxDD{tUehFdgVGkcWP% zsn_wfC7^AH#K;j z!Mr+e<>F^oW=ak0c07@x`nLDRBrCz2Gri}pl_lC5Pfg|6bw=}?Sh`kvyB))=?j_`8 zI=E#qqAkNPf7qp4VNQY-QU*OxVi{|7jWBtv=-?6_HGC%2XnM5(DBwB1FW2bDW59g9 zk0Mlc&fD1Jj#O-@e|oBNY!)CQz`{JJ7mhf8AQ1wOyNTDOQh@Lg19yv%eHb9m4H&Ti zhyV#k_7_BFu83Rj1iTU=#p*se9}Qna{5e2*=mz0bkqSQ8%#ux$#YjGf#|gk&!s=S{ z?j8^-Ov*ZZnsdQ4A^tnOX%JeE2{wczh-}Q(4>8mk3g~uyDF#1?v9!NmK_IPJ@1$GC zttN@c2AFw38v#;Lw|*};5n$xSD!ekFU;J8#=_df7iwJZ8==7vn>(qsj*D71CW! z<~clBz9UPS7v8FJ@6F%(rHm=COK))jqJsd+AU}qP7@_g=`&}#>r?^XI$U#Aip(CIV zXih+&033s#`y0{>a3l~zH|QL@qkEGdH*iNakicP==0bo8=H;BIb??bOGb{B2V(w{b zdZmMb14YM82jE|WXuxWM6&NZo%b9eCeXI+UTWv~=veROy1@rHUpU6~;nrkC zqnc-hzonRSo1aWA&)`Mv&tb9JJd4H}p&w-r9uDdikh4fJy0Xg8qpPc(Glx|gm1-z) z-HMc2ymup$a=QL-bV|S6j$t2xNbDWqrNe zhdfTF&8UG^jh9}?!M)2`0MeRqM3jwz?g1(qTm^IJPcUG{$o>3<3v+4X3P>Xz{H1o`BZdpaI`$Aq6CAHoN^YQ zefu31iN-Dm7*$dI2s*wzQmO%!ykoI4^^r3z{4wR(q7s=i33`$DZ`sDi>Z@v3JzD$p z`h1#mu1h|P>s`jtH2w24ed4|LjoGd$*Y3|x7xBM2m$rQUyyfOALG#VG>Mfc#Ni6ld zd^xL{FP8(0^J<9!ec7#N!s=Mk2B4#Czte<|I6N#dK+eL999#fQQJh{SBy5gg5iv^O zk;P7bPQr(RXl@dSfh&A`%G>Rw?9D;cgKwn89jzpsZ*c!*(0JM7v$KC5kDUhj4iGm3 z##CS#%ulEP&I7K!;p-$Y#>&8@<(cGCIBHnuTI&15mLfXQx75rK+H#m-gZGCCJFd)I zOTw?L)J#vWI{LDU3pHK&c7aOMYakXZkTCdV9oUzSRljSFIebMIl7r!A5W+=A^I38o z31bflYB9QTGEw|!r1}LRkt*YMt-EAF_L?2wh4RtbPMf7KfBW;NaQ%}UE!SuN@}s0B zj4kMxY0!CpXOqliUn4GwyY%@rWp=;6IWN9#e@x!vLR%bCv(v7?%2322gK0$)>Ryp& z<>pa%v;H{!t)C5F+4fE_jWZ0CEg!}mamX;vx%W2wliJSovsqSsObe3o4z8Lkvfqn; zE(P6!)hy^TzA7>;jxY!;2diy?SPSG9e;Lpf;KmKli82WBh1Cgz)vE3eS9lwkAt(hH z7xqOU^e~mPpnkXg{nHk-S@3q**;*gzpxef*JiwWPA>9*dzdIA3W$N`aM$w(8xn!lTjtGC6pZadPCS_vGn1#7JKg0lw?1iAQ6h34DGgcgN5T9?(9wbou1v(sp zpNZrp+$xj<&rqX)hL>Ky7d}d;6(DpauuZ-jFd9_=F$|nmlgZcX^78XN6uu%h0jgO7 zFvm|KssTqgPPY4C*&ywWKLqw`HSpGh;}Wc1YPdGa@hpfCJzJdWK{`Qw19Kfevq<8g z0oUt1bgMsp7-w0kLzqO|vjwAnvwsvCG(X3Mi#P60DsXajI-w{C9&qO^q3fm&;dQ!S zcTL({8G0-B_PP(xKe2nX9(?-sbkV{@b@M1+x>LnwTIm?MYPGk8tGE4OADPZ=V@KL= z?$}NV-4c`*6@JkWGIf#tk=lk})CliV53}IW?Apkc)VW&K-zqcQ#*o~;G|9w~A-qnX z!icJ3rD|EWNMX?E*X??|UbFOL)Fss`z<(<3^-VlL4Scd{lfswA#wk=(E8>gr_*5?V zEdjFCLIstU#+4ZeRVjhKU$}UYpGt++%IKBb1i=mja1ZJ)C;w~w7Ocl`5r^bGXD6XO z%xWCK#Y1+5Bj~57m{z&BErAUL3NWxr;G}kprwhjBh4a(>#A9fl$$-TeC>K~qo5!qa@A#8CUdyicOr!lyg5Y1UNy2uwIh6E3s9e4m(1XFN@ z3(7l=J+S64g|R5}Oc(I&h$k2Jd7EY$Dmi^$6Q=#(8lu?T&BHl2ruh4kG~XQY3}BPM zP6J9JjL~470v^|bGvd>yb6B_TP=%h~vsX&$)5ni?unKjctqZB-5X5oiJnn=$0PY~% zl|ToY?oWqpnBv*6c&loht#TZ|cRpVNa|QGu!bWlBL_WBDuwzj`pb#E5p-oe84#n@n z35eJ-2~Xsa5qqAv6M8Rj(c#XP@+6IqpFjA(10;5!3>)b0hq@3_c{CnS(ZW@Jrstp{ z7*J3#;660h)%_&0O0YvEhx(b_*!bw-O~t{#FlZ7WWxQ_kI42^0;KR-3IqUbo=3yzzOS|o3(f)_gwy6i=A8w9KBE}HGLs33<_jv;0Z zl5nHTgD;3<9y>9500pqvtMHXzqlOD&GW%^Ek&uLW@%uB_<~QpSP1cF0D9&KvM$q#0 z^lEYTf$#=%OJ`*Yv27Ck4dVh>{SOLHW1DZ+c1W^QgIC4Eg*CEpnWYZxuvq(FKvj+}cx%>0P^1xYyRRPZW zZ+H|;5`14f#+T-1!YmenbuoaQ5iX+xa{m5R`<{cwqo)V{%6xAu{s)RA0dQXq)d@P) z!zQ++Yp|sAV}IvzTGv{gEnK%W*A2gUQ2#1H)cUJ$UdXVBM(biJGlzJ^Ew&iDU8&M@ z88b2}zTmjHmM1aq&X{zA{JM2Fw>qcIk9L1!i&?HQu66yfamnu&S`|;=xo~{$o$jt{ zmQl;hS`%g^7e`9AE1lUH{+COgC1l+Jo*}z>)?Qt_?VG)C)A3#F!&u#y%I}Hhsh&VSnxvk2pMD`L$MO)9zyFPOZ6ghEis za6O4kizncw!0EJgEan%6(hz?#7}nH^HP|m;w*tB%wzygpk$Ev%N!8ZNor17?Am#x% zD(RqD68kmS(EK4dHDps#z_j@~(9>g(>(KRH=4()l1{N8l40pfIp7}SuXAbp($^2*p zYRz^#10vM^<=NU4G=W%DiYUMc2Mo}@!Iy=7tui%*NPDW}zl>CKq;4P=z3)lU&ll-t zljo?*HWzy&!OB9|l0(-!N4Ys)ad$KHwL}1}!gO^A zK?*K6w?_ybL9F*0zPd^20uTX}H*IaE@!G{z@~J@xkuZw{-xr+*`kt>FXfz{KHDCpb z+`>*+#jZ?b01?j^E}t_hD42u6GT{sM`+sd@z{Cz?b+uiFH9geL`&rp znTgJATaW%z1Tl$7sl!K@#1;d(+Nxz&p>G)4gy#U8_~w5U;N(}nR-Y#8&|#SMGcqXDN2^ zR%em*Km+}Ch<1_0T+EKhspx)J-@a#oM;dp!3v9e_qvU?(h0b zYjfyFr#Ym5%zo)sAdE&KauB}t)_uArmRD_rXotY8Qi$EOVZ$jDkR2h4^F)Lh%FC~l z6*4db$wtA84~*;CPXthb!%5`Hfl+?3={d)78|<=R68?pK3lyLcli$ZJxdPt}=oNG?5Ks!>tG znEj#jS-*?No$G+PQ;C%9!xd}3hiLAl)=AONm3;fzZ~HPWWl!>Yrd{W7=!Rm$=bOSkw(+9Edst?EU#9uj#G99gv6MGyo?u--^Yn zS+hBm6mW#Yr|s8F)b+Y;3$_hEkU?o@_Yv0BAt87#98Pu&cbG85#PA1qIRE(42yqXc z_baX;{AmX8!;X%+VGnWdDv^IL@&DDx$i(zGf>)5GLOdEWy4IbNca*Z&+^T4^kJR$mx-hmRknC?rtU&_z^LNJQkb=(!_{C)hZ z*ovH&wLIzi0UpS^DXnE*2VKpAJ1h+=3O;r6S4RZvGt&j{i3vDdQ#Dt8YUb(pe$?pF zyPugw-&%YZi4+DWcH#TEa6+#IdhX3*r;LpWYez@9R~D6A!5x17{=_DAGQ8{8%m^J+ zPhAH%pu1FWWZ1P4EJ$l>rJQ&a{didL>)`Mc)21-t+WLA(9-!&PjsbBP^O>dLfuAt2 z20<3)$53LCM4(vpFO3&H{8$%iNL+ni6*Ft=L*WRh6Vp#%3U` zIR@q?o_y>&@>N8t4#CsM zon4O2nB4&$*mNrSTTJG@Q$FL?mj2syM@dm%w$d&o zPRf?b4O+GxabVtl{4cYeVZhY5T{yL7D`GO_OV`wN(v?>iT&xy12s1X9|6?y}M`LE>`XgHtt3>m^`}Oik#<-2<4!B(J7B&{338nZYM5R35 zz?;b^d7H@=4g3*l>=#%3`9aF>qfDJp@j``!jf!wBr$Af=UbUodp+_;}vR!LFYii zO&tZuV_ncP;Uo>=A&m3j82^JI}E2=@YEdT;9A9?L6wzT z(|d3CIo@Nzr^V`tmbkGIdg+^6R%H59Pi_viK6`dE6P!=sMbJjWt{3MbaW6rNEpWSn}{K_J?)mKMB9gCQN{0$U)f{%@T3*m9cF(e|&mx+24_`rq{tYdh=FM>EH&LLAJ=mRLw`7O!4 zzVm?plCraT9a^-yR5D1Odw3YK`p>#p6nX9pm4=;(yEX69+V7>xeAqp(SKpbI@Qxyp z%%&#tIzFP)W!_P7P-oP#x%0LXlNPmg1m`Bh)7K6 zKxG0J0V*}@KsaAv*NdNlbs4NX3A?Ft=lU_gB=opA@LiA$4)XFScIuIbIIj~TH=S7< zAAp_3?QZ)qsOyqyYz%qdnZ)Ow7G6C?lqg1G%k!O(jiU0>`ewygL1o8d1S7b}<53>^ z1w{f<;+hMte&doTXyf+dzOUhU_il=K$mq|~XzSZItarBR|Loi-SjPM0_{p6jt~yDJ zR!MojvD=iuWX>JV?OCoCwS9pk6uA8AoNfHb<18IA8U4}u{Q;SnaZL1!q)mU7g46{0-I4ZL#GT*N5`%dvkl{_^9G}hf9 zb*d#ifZg<8ztR1sT)?hRI}Rp2cSGeD4y9vqPidQg|F^0FtG9&a%0E#RXVr9ss{S#-NHNySCFubw@*~>6SXt#Tl^`)WV zC8mV2^W#ZGZK>ll1%%?M&>2|TD&GDbW^s8LEv+Nqp0-R&5MgDDyWhcoCZ!7Yi1 zC?dpv7}1aPJP7$YK2GwvQt^gX>E!I(ijZc4?o12}(R%{Id?1-FtWKn?!6FV1A3C+U zB6wlVVFZt4Qe=jM55jHjYb1zV64~4nmjozE=Wb!AUX@+bi{OZ62*0p;Aa_i+X@Zkb z#gF7zj%`bi=TvrJP({s0s2`y``1^0gnSo~*&*~jNehVrkUV0>YKOmY!XW9a%&>`2V z%X}L)T)uo6BwZAFVAOtq&HgQ`T;1);PlPtCiTMOyK8(_E{dW_3X?cDV_&DN>CUi0V za(*pT;do0KC*>uCs7qyFos=KNr)RmVUcoP;LTeS0QO&J2V~b`>4P+~Vty|nVR`nkJ zJ5nQHkx6mn+ITJM`eD1bgd1I`!tmLF;h`PlKRcyWN+lAidk`XwoKgM4(K{$|{LF|4 zXYWwKB@~&~m8rCx+Sk za-bzHnq?KiR}L>$(=qZUs{jBU^vP2QEV)r`4(n;uwITAO*XS&~5VTC!Rllu?oy05% zvq-copl~7UK|)oBPLKo_cio5i#yvWd@;Q;Px5Q@l8|pkGC~xtrm~|sZIl6fe&7ap? zI)G1lo7H=D65oFvNA$u$tKE`+Hqi#p&~TzhC1xo=1YY zP@9Z_vEP9Lk4m;KNg??kkIx@Xa&4et|{oGTx!h z!KC2z#j1W#+Wz2w0?CR`lQ`lcy!^HOv$+|Ad~8dIy(X3bFm!e}u7VK`HTVq|4z~6a zyeFvM;P6Bc=!)IHA9lDmu>v2wxR>vZmqNU-_@DiXTnvDoz;eskVTlwoa2=2zgMq6T zVww3JsZa5A`eqd%N2mEU_B^7!hq3TMRcTZyIz6?6WXBF|HD!|$r|H(~=)6K2v5Q62 z230E%pT{;TlWMA~W##08&|dBMAQS})Iy{}k z!7ymF78XUqG^8+@P?D0IK8<@}rf{J0!Ab4m>Sk;t;D75^TI)kWj`tQ9cs)jh*l{qa zNb>CZNcITojmvj;t5@dbk-l0&m#1p?XDHoB$8zk41U3@I#qWuI30xfbNZBN8uVRsc zxP*e?&*&GdFOHtZe%&nub}twOWR`z!UcL+DFgRw4oyeLpzDexeP-v4XBx^0cf4Ya` zkyaDz0jifdNuE?{-k@s}jtzT5lHU8nBTho&%6#mkfoXH9I&WByB!j)b_Sg?IwTut! z;^ztvpMNVGKttDN#G;<|v8APDEvnqkR~52yJ4VXa|KktBn1q@fX_*9{FCzzfAERL* zB4$x6L~#e6!O5PH@hd&#cY1(Q+1EgkTYr9a9e*X+2UZtYe#Ei~mZtZ(IZ)K&s(p+k z%ikZB$q({f)&*$J{ip6;tAg| zl%b^9LW1z&>`L?a*}8^?!(1$n5AOdUDg5aWvM7JPyF~Qip|YoIQ~EJ-ida{D`xXp0 z>&|<+XU`storcv=kNn(+XHOd%{_I^2(7bYG6Ro&G_TlRcz7YgjbJWB5iXc<@bXB@2 zv1cxD_GT~r6%XnvO9+GZcZ-jDN<{v<_eG7mxF%n3?q>lJqf~LtLJk&u(ILwsgz6 zW{NhDduu8@)--VSftb~$bIf=0B&M2|o?Lq8HxcF*d}+b$__kb00K2N7=)*I`9nx7v zyGNV4mT%UScD(q!Xmt39V@gxOJnKIFXm$2&ISMd^&iu6$Wt$cRTrR6%?_ocx--Y-f zypAxdAg`?9;z4O2Y;=y{14ZJZYX%+;7|gN_kVwe&=s^D90tR4ci19ggJTA=>M!ALN z8mw9jL(x^a|MyFZF2AG%Yg@d_)wQ)Sk6-flM`^r2Q!kHy3`Yg}#G~B(xKHCcX7K+* zmRVek#tA0^$d#DhVEaqgh65k1KJ1l8|I4oaZ(p`<_;2p#Cg8+~PlR{`ImKz>Hk>rq z@jhRHee7mk#0@J<_h6KBgRxsn5GCW#;2>m9lb%0u>*Jc=!^w$2yxI#N-oJa7pu>j^ zRg}OgeC3#~12c^+Brct2GqDE=7C?2N%R(KGs|6M`09gPyk&|<1B03{$C!XTPzzqVF zI&lGo;Ue}Ljfi^x?}~u|SpD9f(4w7IYgmB7<}JjXq?;m(^9t*J+&Dl(f;GFcGTo-s zF9Ffgqet`%Ys8!aMPCi$n^-TRK8_+tOG--0%Mhu0(!+r8ojH*7UKv?@Mvyl;9^ql>3k;OV$9XC&;b zc}Dj^3UWRkoIG}~9C!>zy$CCUYYA= zRJw~$rzL4Rgj*%Q2qtL`Jk^@DVCihZrb9OM%2}vpwK|*O%m!$vRDAvto^6tX+QgE) z$mGlC&k*xKL113#h~oydgZTrL5U}gG=`#>o$}VKN<{Dx5iIHuxR{P^pG<&;gDBxon zJQEaj)S4ANG*YsCg;`YG|G-a+2Lz*8Y$37zA;ux$n}9CoKgTBi70kid9D)1{GT_a1 zeEC)wP~aK3V=#|;jF>gv`_U^mUDV<+2C?YgFj0Gom_s;;O<5iQ$BOMWo(4RBco^X| z!fG9HA~*$!JEo;2^{xW&s0Ro6VrOv0QSo8l@r%f^So@6(=Kgm$@v&k+xe4Mb_AroB z9eN*-FWQUZ2h17bS+%r8oCJd7fo-!Dk^>SnrgIq8S5f=G_wWy!@~>;Z;j2%=YxiZO z2tRPxYVRmr_CYqz-Xw>?hsm|Q9D0I$_h1~4RN)&xJ+;N8&glD6iw!mjJi>S%HekRs zyrW=jVWBPb-m>s0{FOb#gcVs?;(3Vx2ap6XFTIL28)l{fO0jw9Wp5fs{N$#lI&&$h zdANS$5M`gsic-?|o&FPUBB2kl!YtbeYm4+n6@eP$JYk&Ki8kN-2LRPubQvg z)O~DgaFG zVWw+nc9o!llnuW7kh0)_NChqZ#oE=w*@!p!n z2p(aqJQcmFaeXqZo-^d0Qh5@cSG<#;wlp0SW9WeW8(Gzr=_?R*FfQTYSyF6iYa5K{ zZ(`?wF%s@!OslP$0#=C&Qu;me7;Ol%&z)<7SDH|xPk>fsY`uW&!Cs#>$& z3=t=ZXEG|BN!&~$gw2IC)})*t)Ldg#+5}1XsDlL?_tBh(G{_s^4e(;P# z#^x#bz71f$K9Eh27?dZB3`~k~sZ%j~pCNz&{}ueM0Gb1p9}JZMaWVTBngtkSc-Whn3Vl!L?$neY z{;}AwE2cVM2}jY`mA(BmEPvEkgA@Fo=WG8K+E?NO3eEi){ZVW zyKQVmI)<@}u3it~`L~%QW+AOP+|6uw?k{?yBl2u#OK*Et8aOKG#Z@{ZHKN@fj+3Gc zH;c%Oc4>}YNA_OFXzl19T@iC*q~~ptriIhr1osfAa=ot4&)x4(s`H1G1SH_uHG znmToj(CXbXUPR3QO%tS+J1!ZhVRNS2;AUY<`(=#EJV9;2uZ^ESiH$h+{;J-ht|wWo ztrqf5GB_qZQF3MPoL}SnnnVcu7Uw^}UCdo}q0ic0dLox&@MQ8l}JdoXY90*X6Jin&QkAW}GCi6UU*^Ak3LiW?A#%vFJ^q!@i&B zy1dc%L!%Cgw#%Dq*RG*eAd)k%l}Abtbd?yLWKv)!3Aj4WU!tHQWUDJg?^|a~!dt7W zzJ{#_2V@@=6;ao6QND<{f$K}@NTdTuxdD2z`i(n&c&5W3deuLL&m-JH$6#1i-58%s z8;`(+vw5$?N`+(d?CCQW+s?MgzSI-K86l++kx?u3oP~*xT;r@V;l_@nOo1lu{qt7@ zK7(rp6kzwokyy9*^!5wS=^qU{YSq(d2dK1CFkuT=mKcnxT@z_1$V1{(~Q zDRC|>du|hoiYA9P$}|_0RakCHXSQE~xyW%}M%C>_>$;4wyWi6(3;dSY&VuKjv5$NR zcO_b&CLD2FoLKxKZyhZAE5w$2VIjI}mZ(;9cSq9c8xkIlKAlJhKR-V@Iy!<1>9rjN zk1CBf-MX^^uZz7<{~u%1+abDxNrlR3dzDOz`kIKGeq;t+<;wBb>worzT>rT;9scz~ zL-4ytYw}7}wK;PiE>GNAu5$@GrTY=U5C{hCe%|@U767LH;afWF(p^lu=Lr;p9UN(; zEJqpK`TrccZlku|#^48=v*sykKBG&i0wU4ED)2q=vj;`qcp^eY+OSjE zjlVN`pp58qbNCf)%&Vii6VYm3@e@>h3jq<{d!AtB$~y;&d?bQL`DA13bf8|qE{_tb zHcCoK9e8QH1o;Ca?Ms8yz~oNVZg=f~pnH|fy8{oo3JIfF*R;9P(7$4(&e>Fw{w zIfzGo_wsD3rgP&gzMSvC8ZUxvA#^*ECBVD9UHu)PKKc)8vp=lmi&XSFcR zk!dBTtR1zoDt}PHVJHh~K_CuE)Lv7g%@{Wz6AzS>w}XSZ!Y=?I5TI&BO^?Eb8-zC` z+F(`v@LsUx>C-oD_otrxeolAGYH15>AO0&(%FFv7m*Pl9S%T6HIXhsh8yhoHk@F`< z_s=8BcK3h|XR>XEW_QFXx_Od&OA(jP<{7ZNeq9;(Z%&U!y?-r$`ngk{dzOpE0*TYE z7fXdKY;A(Ot?h-cB`O|qmYZ10=3>}6hoY*hgz}%C0vC!%T)tMy`bQKzq4**8_o`*H zC>>$+5EomN;X_T36J?QW1RXTADQIhmt854kTGp;Aa2*TYQfQ~sS)Mr`Ge7dp&gF`s z(MyI?!RQ<}(<#a&8t*E(223vj$&YP37PobR+7RaaOBT>X*ALF?KJ5lbqR{S24gVZ> zO0t1cruKc{S*YXi7x49d$H!NN4JL6UfHJ)G501lrifW!Jo>a46M}#l1{Wmt&rF7!w zJ|`tqsTbGsZ=0Q5o;~j4qr1<_O3G~3rrMUj9lo{oF}1mF=I{v{ZU{oW#SCB_GHZc+Rt75MP#D^%4*&jI$(7hx5 zDYp^jz)t>@nr}s${}V_ElI+!|GP>KR_LOP;5~=(b#yft6fm%%aB;@AP!Xvl#F*|v3 zW!d~zWT)ddvKF}|w2O98i)DSkc*Oa`>UGr0VxsYkl9^}9N%va8!*{^jLf!a3_{`gV zaaj6b;R#jtEggW&<0C(ve)4k33MEULm1d8-6tddfDP-p`)+We=aS;h9OzWz&y^i+FQFkIX$QQi+i(zxQM7B42xb zp0Gc)tdc~4SWbvJOr%yU7qo=^{Z=}8yzd803#Mw9axKfAYhC^c78E?4ftJEof$ktI zU$>yVwNX(5{=ySCs|!=3YS+75;+BGIQ_rsa(n^Wok!VULES?84&D|YJqKswSzV7o2 z5C1|>#`4(!0j|Zx9?-f${tr10#*p8>e!T**a3c3nkH$P(skG;Yl23Pi@cTat3{fYb z-)i}9&GV30B&_A^!-54J8A483AttS^BKOv#j{bcAkK01#-;$Nxai7JhtcxYl+EkjB zu4#W?ezuRbAdWt9D76t zT^r$R%@LCPgFOc+SG8KQ&wWw#3ZMUt0!>CHSUQ<6o_jx)(0B}pPg-`RBwxFxYEXO$ zx=-w0{hjn#SSjiF+v!soOt~uOo7qg`_;~YjR=D2kOBe_3{Mzzw7abjWxblLVnv0Zh zgifZYolF<{ks7{+0@!zYhJjZeq(5hLe-~c%33Wkp(Hy zw4!qHVvX2J1^fES&DRpW(tPC0*Lnsm8+Yz`b^JY@XRXz}9S<3_lb|vGyAAK0uBk$7 zrLI4B`O<|bl6Hok8AeqOHznnO4QjsVzI^|qS=lO-Zqghqq80r+T)DkjGB_fRa9(0K z*)FHwHnHnyg0Uk#bt*>AX)fyd#!c6Z5AiX@Kv#@EIZNn8J#83hD~gHXpcw@-bv35x1b2XsD??4?CT?q|{khg;uh6=J+2IiKtc_WE${iWqpR-y2oH~Ng?rN2Qq|5|i8@XLJ)iC$ zlTvtZB65ANs^E*V#_&o7euF1D*GIaZzY`x-6`Dz7Kb_ycoBX(Rt<-iWbyO(aKO3ba zy^pC@`Bs7}@1@ipuH%2QUCnynn_k4JDG7KhkW>nQ=J8J;%-Xkv;kbo%Yxr>~k!H)% z0Rap@!1k9N~xjRoij=-zVx^6CN zYGtJhqQXJ8xF0`%=0{G>^^}gq*bKf1?&m$o9#ZS}a?zbP;(VpMULJB~le%OiB}1+D zs*HImru8_lyszT9ykNe?JT{i7(zegx$UQVWnPp$u|K`*1ia&5*uX`OJpX^K`qa}YE zSrg9u%{!Jg8VNgWPp#Y?Up5rX$l>41CkTJ0k7D}`puyf3N_s-B(Bte?;XHJZ;?iy; zpzPo1Pn9eBsPN4>BNwW5+#baxCA-Be?+d@cLInd(jN#$Qz$6rNzXS_*h(SzE{U^@X zIt12&V~Lc^S#OqWvkIQrfupB@CFW(x>V(H_x$Y7rxtoV5{tMph2+Lmox1*+PWp^YY z(Ok)?GQNWe#zR7{c|(BwbociMXFVH&5-fQcB(xJaH!tzL$2Pd>$>n=nQT+`88)k-! zlhv#0isgu&_WALp>gnH1>lPj_OD-u3-CEgjIri6T9#VXwl>sUNuOIh~iIC`1DL*Hv zv{s?|{*e%UB6>&omH2waMBKSgJOv}h)vbARrA}h5T0xa(BofxgUfU8!wKHGNc$_+1 z(tM{_Z>v2EKS#LITt!QMoWld*SgKFs?!oK|GtpiOR6aA3#u1%m`^Z?`ewyx!IN^)s z{e;~My^*>sYdW^5c&bM>XLt5uE)(InIO_O3!De5CeY!nm+cnj50usABQVBgR&(~R1 znYWIsbg?(3#Beq#^srxd+DZuRpR+!@$j)Djg+PsSC0U)GfBxRO0mjAF9h{p^X7TMW zj5ij2_S7};|A`fT;VjT_^l{((8qsZdIT)&B2%3oeI|i;34@zL?x-ePCxN2xKmM&%m z9mfOV7x5f2fIXb7!2+pm+6!X=gpgu}z4&Kt&hQFFbLRX^4T$tAs!YoWNtp4?SFQ#&Q5 zcA2cgEn0}yxG#M@S>twc;@%{WSR?cUxXK5Ck5kZ*Lm?br>0X6{r!|p_d-!43Nu~l zi{_52?My%T)q3I@_dLA-&&aS>+0*f1a!&OrM9bfuBSfDj!w%t!nnR? zBz^2Fx`%M}EwjdViN(d3JT@?T?#2m}qf5dr zkWr=?%!HA=J zQ|yFU7UdKCx@?=Fvnr2eU)|2uh|AcOa%1V4D0_5{CV!y%3CPkY1P?i?8okAI37(rc zbuNmlgI@OdBjv*CDIx2O7S9y+5BuBR&FvIa%B-^6jK?lY^7%ekvHoLrloE~>=I~6d zYtZEF-PPr;7JvihKF7pgSHj)L*&7)rm9O5;6qaGQcbS(E8XxtxU6f2TyY2yBl$V<_Zm$#xfclKDz97Q#~cwX16A_%wGnh<%K<_k0lQ}Y$KK^0x5?-$^3^`X4SU?re|776CU>1 z){6z!$Gq2C*|VmU^v!O=Bur4d(EIv4>FzO4h4}Ib4R(NW%;*!}$(!0U2dIyCx+ZlA z#PVP56@C~+v7*sIcN1Z>_16B+-z@)}_+~VIR8rR^>e;F%EO+?n8wx-1G!#Z;(imMs z5uX|J*%K1`CVqu$vOBV0P`|?yoR=W;O=>f_dcW+FDlhZCa-<)e<(W#79GQC4b+*O- zwm`3+&jFGn&l7u{9~#a&bPc!bRda{BQ~ccV?Cfsq=T;2=+T-GW4|{s~nSoga972%c1$ObpSGk=!iXX_4m~RcgO9wcON}r zrV*bydZNB=fEK)Bac(v@Y4S&jLjN+IF297NT#3BAKVLTnc$g*pIYuYxAMFP82j+$Vr5JXF}t5Z<`_nU_#fB*7xb5Qrj?K6q7 zm5im`XP(mTqkMY)p%lc15s~mIbj>0-DY`JnkKX!4^wx=!l;O(ePzhkQ|3~fj8MW}i zgd^_U%$h`;VWDqvAx4SWjK?eb6D_^of3egp#b zitJMfiFsmh2y$HLKCc*RIdVzAx|J;%qjX|jx`Ul%)=b)1dCW7N#wON*L!%m#?VuE) z&7u8Cj7YQleYLnauVI(t2v-*ZR~F?PtXOF%=q7Vn+omfD+%ssQPlR(yPf*0^qyLgo znhW2q9UhOS)7lCd)49!drVHHb?|qDjImDGbIGJ&^^5};D6lY1+kkiX1k%N1R$%^;P zp6lMB0)s02bx=H_>?TSM;g^9v%oB3iL|h8M6#pLyR6VmA{|M7jpk@FUfI=wM<;{Me z{jtcb5VOBa5lcG8`0vipww=dHaK-$fS5ro1Yn#gzPpKHm(Z99Xd;Q5-`weo9D#Yl7 z4NBaz#=hzcr4lR)8xyU=Aymn3e;4gWLgsx%hvL~TXGZK{b0Wd4Yh_lZy4H@50?h!V zDcJ^shI#zFVN>yp(dSPPovMUOSRn)IaYEc#9Z9`I{+j z&b9vw*?6zimsoX}`MBNbcaR`oSiVv+Dpq9G=q&bR<(a*FSEpd4f|8VO3ZI~oj9}mM zl?c5wzUC9sZGsWhbZ6<>{i73FCI)N~s)U%u^Cn%DLV)yUOdTBFFmf(yx6Q zTex{*RsM#J)jfrac0^{{~?+=yMI3U-3k63>Q^GRqvzwllYW^7#^CnLFQYNi zzprx3g{b)exIe!J{8)sG*6C1V-psI5F<)b&E1D&DY1$|3sJ0fLjn~XKo>QJ##eT9& zF7l~;JY>(BcTevb@eXL&YB}V!9xY6uI*}YV&N7kYKBPq`U3{|r#yZ8=m(2K3Aj$K6 ztf7At@XJ{_L+?<|1eZa+fSK&C={*#}htIXbN*xt5j zEsAn!Fy`nCbCop;9Y1lAj?opV#t%-K^Au|QKF}-e5eT*7i>3cK`K{AlSFRlSBXA>A za&@BKO-doP#~kn4`N5)J|* z2+e6|X@TUrA(Q`0TTP>kypLm@eT%TxZ%;Tc+sZ2tS}f;jZX_)z;UzQEX8cSh0!W9@ zFX8h}4pJViO@~Q$++>n7EY&iRb8PRh_d7pzFo3n2gppBWUD+4O9$?w#2}|~4iEeUQ z(6}Z(Nu5lS`-84pcQuo7kx46Sm>hW?tMKR`%k0|k3WbBQOmQ6`N}aO5e3_%3o65H$ z*(>YBDCZZ!wqC+co_g2C1FvO`{PuKp($Han(Uhjb zds6M!i3-mKdp;c5=1WXE1m<(x7$RC)9L$--B7yO9EKKdN}H5E=A zs6VQGe;Cyu-1zoBK0erU6D{&G{Yt)2uJJ?a-+h4hNF;%L37$6$(&}?rd=aoJiMs&o)ADO;Vo%tZ22>>1R4D>-}qJi-$&-%Rg?mo@Se{rV1XTVG#aC2q}8PDbu8)hf}iUz;kt4r>Wh&AX_` z7N^Xzn<1*@rL)Bo%SV!3X)gFjd^EY7ZkGI(Rj&H=)_1eBJ38|hV|e?FjCJH>6usMx z?#({UU2P#pJlB%q$i#8HX?TJv~BR?VhF!ZX=D`SeVP-eGb!U+|Mw<9Ar z^@NQ7XsExNUvsIlIMXXt;{u}xc73SQqjM{>sb1y}7CIb@@UWF+M~ZcOJ?!R@n$S=m za#{pBqSWJFoDM0!%7`rn-WcEI3dxykg4MUM06ejbjErds>m<9S5!Dmpj$49A(|tbA zmKg^;R*V{NkLvx#rl!TU-w>*?v9S$(mc81XTyI|E0dFM-H+QFtMEN91^yvB{V|~X$ zoTOPMy40`}$!)+>8lRAW+9=>*_VJKyWU27yK?woF)qijZq5b=jX0yKTckCX~$30JE zgI85Cv-Ya-J1pFj+MulM`)V2S{)C>PArx;!)p~ik;px*+ZG%HYC&klO?VPRRPm^By z7<i;5z;Tcapt6D?9O<^PstLvmFLsULOom^doZt0**lO@Zy zO$ZcP=glE0i~&umrKKf6>DZAY2P3Git7w(y$nfK*NNe=Z_dfH z)BU;nj7W$#Fc60iGKk~u&@WlxpyxfwUL;oXH#to{W)3umMz~eIIU`FmL9t%#G-eb+ zSx*zy7GDWE+7m=fU$nX4?(Pr|Lld9JjGVv@y4`1WFYZtVwn~r*2D4i_$`AM>PV5r- zQYlOdG0EK8Wxv@yaZ1(HY7y>BS{Zr!DdL!jZt9WA87LN_g7U_!Sniy?c9E?V=1R1OFqQPPqgnLuOdCy8WD4rO4;vv zN4D=P=T5;+_T>Aig4DTRReT%6)b+*Y4i=YTB=YcGnfIO&LQIO_fv!aE4-Mzn_Fmec z{j9okgXd1Rl~>)O&C#IYQ*jUbZErfO&+ACp71BnDe3VUok=wa7b}UBzbk zq^25sUif3^Ie3wsMC}LT6dV)~QE2cdL$iR@KZd+n=PS+0lQsGxzMbNKZ21UOnB~RA zc#Zr3eFd&(OHU?Fq%iUkZNG>ITmJIpE!+~&4LVh_yHY4-zrsMH`e=!K0e`#kY1UJR zZr{EQ0R!%~>niwR!h_8Hs-X-;0K(-Xh*^zseEyY|k9aL1pVJj&f+I@m_4>N3inejK zqT1+l1`3Dn-An#gq%*O%fE;k``Sa)S$i5#LiD1XUz_B-e!EN>q5|d0sKCbu?dKNSE4o46(@dJa?V2}Jc1wS!2IdXNcjZ;-}i8qX!6C- zHZzm@y2_okn3x!x*TynowC=RGU%nn1@|n-R#Loy06;ZPaQVO_B$$}A+S_=fmxqMn$ z+W5+{GGq+^PgPr2r=_NG-izYWkCOF%lSgC%ex1S7mM9?ZZBEYHFT%%R>=s@yMU1`* zU?|g$YFqs^o3x)P22Qcn`iZ4u_y*C9$A95Jv*#7*I#u)mv+C6gq;LXZ!GUb{u34$* z!}mXF$)hqv;ze<4o2g~}P|34Xb&^}b|F9N;r~_W;2XEeBb1La^2Gj@ute#&ZD||ik zv@Q-|8S->=FPDFo+dk!7`dJu)M+ORgy!&>S5FBFv_OXku5;qSIPq~Q*_!e+`;7&rQ zF!Nwb59m8KHhUjmsAIZerIt?qjaSqt(pcu3L_QP4UK$O5Ts0S9%%AH?wKw{Y_>{v# zo@gPgn>RrJSLX1V!hwXsl>B=xcL}w7c%q%|Y6%hnd?=y#A3j&y$%C^OLf!_iX;Lnp z3hj?Rm*E$M7ebn2?huC)L})jGA8351QN(kUO6&R_Ar|K>`@f{m1)mG)Wz@NzAgc(t zMIhQFUG=E+Z_3#+rnG1Fxp3<~)Ny&2H?H(7hY%=|JyN*nH&L(l?8M*t+)7RE&B4F0 zac-UuI&x`)wb%KQv5@YEt=G?nRcH0m7EP_>?L^bQ>z!%$8%r0E%)s@}i>ckCXxSA_6uH}Y$0Dl5IAy~Fkz zxUCkkd=UEOF( zBXde^)#=Kb8rF|G`Bv=nEV=kMiipT7a4$0Pz?B8-B~GypdIWwSh!%buO5%})_>3FJ z&YVBr!NSb)6c8;KxMyba1hu_B!7PdpvlKzO|4VC%)1pXmeK<`0_dO0PC%S!g_)t)8 ztW#qE3F7AQ<4Ju-Hz?*rGWBd5{7?o>$>#oJ%VezBeNz)B1ybI?S%gBz?Z00D7huDL z3=6+rt(Dn?1zV6~ghxs(YebT@Mn*@Kr4u^s&-nu#Ff+sNXbRefqN0VJ-G|q&UHuyJ zVi_Jc0Ea=8sRQcd=osev%zL&IUKp3EH*gdw^S>V(i?TSMp}aHE-h|G=3%Mp?d|R3bJFCBrm;-Kcnd*f%s;pJ*wjHVtPy78`3|G1G`~W9SzQUQ5pkvrzgzbQ>U3H9Cn~CN=o~N%r9EC3lv!Gjm&Ku+| z7z`5=VIbzrW;}CnX<-5KjNKBp5qe~oWIa-NZ7RaUMjXAp2Vv3q8_bXWXj~kz(CBRP zM9#~pcaD{S3FTK+`MSEg1_p9QF|KoS+Dv9>(Y{^UFc*z9V6G_F5^PljY|*xSH=BN? zx!%|hV3)vlgD@19r$dK!$EcxJrQ3a2vJxjQGD{btEJpok^mlf?6*udmh4>cEyjQ=W zC7N0Ng&!&e?kPQUzkbybQ2Bv^pqOoNuOEedF6oK$UXG6Vhq;my|8dedql4CqZ6sew zA8x3O%}bTXo=`e-W5b_IPhn_xoO-DWTO4Y^yc9#VdTa4aJr!-tbx`#}beC0zE>t>G zP5gp`L+-O@?_I0-Qioo@raaH+QKi6;^HGcK`3r^vVk7c=@9`v=n>`w(9s)*j(QNDo zj-&jZH#a&@?1|SUSXodh!o_Gq6)mAlw|6+Ikn>WFus$g6S1pp`L9=2 zA5SddQ(ZW%k$ws?DIib0d`5_(?5ryZU!(%Z2Gb*y4mj?Z4DCENBPO&N)a$@x&n%>8 zebAau#6^YFY(`MTQqijKO{x2Jt4#f&ebZ}^H&YA*sWU}bZCI^MOW8^ergYameHGyN z`!i27dmPK=SQ&?T?JGM?85zI1_JNqxhrZX9cC*!*t^N`F=yUh0VqR0{nu>()khWI5 zv&Q#P>zvgUJ0g*d| z1^8tgQY%7=pyT3ZAiWkkxKiY9dG>4x!4ViER5ZD{Ei1q8WM?1sTevZ?1nk3~gb%;y zNA~2t>lTIFAm)q|@FGIoyXzCru1!@vei?cQ0TDRYNn36!^JA>@I9Z z)bG(zLYruCSE;_K$r|1h1qB80eSPYQ?73KCNtS2+a2S=|D=@KOhM1h392t?tdGuC2 zBqZc;_T4*oMoJ0_;C(;^j*?55igy6246@Ti#@K}mnh8<_D(v*I*oQ4yOHdjR;ct_Q z7HP=tYjPhJQe#DRjhhMsMx%alQPG@N=PJ!%-N6Rc4n>I?Ka9MI;Pn6o+SVH7`^}$- zpcP2&{)6n}Qj72}j`h~uoSZ1cR2W00*chTv%;43;RcLWj4hN&IZrpS@1>d18GkEoJ zT>C8;;jBbz<~j_ediwg9;SyaO_!>asgR|`0^0Hlx$0)vC!fk#{M6rFtEc;}UAHpVo z|Gq3s#+;ld3<4vPNbBeCl07v$eGvygp$3_I%airYA}u{VJ>bbAxD==;{7#~3{`YUF zzcMp9_``f_25Fy$?YZr1`h&InyggZxx_D1UeQY~@mOW$59{M?>`PPw_(Z6y%Iv+5^ z2#LBe8qN6S*fY2 zeC~V^>wiJlJ7Iju+nacA78e6^auC`%XU$V&f!@F_zVjrmYp|(>A)x?YAzon?84z?J zfKK2%V5wS3Sb9?hKv(=Pd>+UA7tIkZ_4#xC?@zare-B*@a&RCa4Je#Jd4B9sILzv53qND zs+8pClRdgWct$q0XMJPCQZx-8Asj&^#SOTDwzq@FrBIgBG2KEOXSbKhXl`|%xvdULx-dCu)fGG4~(4`7u6zZL)2YgPiZMULilIvPatB5unsi2 zhbFzqIQPBy_`S8Y6#!Z44mBWNXGInoMgU|cnnObBt)IcP z3*ZDM91}~JfV`G{^xy$Tl~|47SU`Lr!v$o=ft>Wl?OsRT&RhZ$33fD6l&Z_H@Rr#% zbKe@hdhEEOBEB<&&T+hikRc#-)}zg_6485TKQc2j@q%I_f3hfIE&7W$&LcxZ_+*~b zOul{FfEyhAYy5a*Wh2zYs^1(u{h0mt5mT8F&VTAOSXWKwAPrb)8IT;OzG*Ms-W_o| z&PwTN5D6jf6f6Xt2dKX6>=0p*{6KE#gI89>wnZ5Or}bwV`qwv)*KHVUtv3sW;4=l{R=e zCW4?MRM3X)ixn`Ph|V{X@CB%qr#R<9@jjmHeh9M5^C_Aezkj`g;8F za0_9Gc>tM@$F7dguHxZ6$U?(WcHe$4f=bxp0O9DvKt7oERp>7!Lu;)t#)D9YH-AW4 z_rA(s}S0CP5-`4E;3G&jWXu+AY|5uu+5F&iyS`bIa8LZN(WL z4>US(8*oMrJ!To7?LkB3_Y9|opHPX5u%s?5A3qUvt5=1cxiT=L6Uss>K zdS!sH21e;t0e)DPfJri9X@>I-N<-2+0aJ0b2U;MG!6SxqrRA;C5p}L;Ne*k!%dU_6rH2=oe%hrp zLrWp~*Q6yPx?X7GT9UctuhKz)X3_NWdw6aNF4RxIpc)Hk@JFo;R=e-LX_0QPCO`{!|ehPCj{y~c+Qn5~b`WB9)?pn;km zf{V!thc?*8P-Uai!8JNFBr01`khvt`YH+X*XAZspux#AaNJ3Ay?9wFTKx3KXZQ^zCA}Us z&+xEe@Pz01^Wq}1bn(KAvc=)1zq5wd4<96IAY#oG9L#+rdfp7_-2@EF;6nk2&=qhe z{K6}Sw{d~vJ;X|VeSJ9XapiUXZ<|fShs9E>qC;K$kU`r}VRJ%W$wZYaJ3kOQGA>)wlTaJBO+cT|g- zB>N(g4Od%?!qJ`bC%r2rOAxq}T2!vcHRsAbk0lqTY)|>+D{>{ms%}U86#^5p z)_0`d8nt zyIifhq5>m4B#Sp-oc8YBQ=B2V2N2bsQO=oqobjM!=fE|h3}*SmaVe>54jEYmcp9NV z-Tb?aiB;SzKq~aFPpQcsIdZ$l8JZ7R8fxdp$H(I&o<*%`2KfzW zxod$>F<1)MsI06U{OtFnwib~LMCb?W56s;#{qm`wgw^oav0&KBPy)BT{)in4CYHE3 zicE?D&4t#FRcv9>s6yrZhxxUqzh>gRqTa(0jnL=8vX}!#k>|Jzl)c2&t7Egi08fWj z#o-USGO1-6Cj-d`9D8$d+aTHjW=I5gWMEa}duw7Tk{KXcK$wUK*RNkyKT~hCB4ULz zq4g9C55+yGRmUbLw?Ifmnl(^~A;=cq!_H33;{=BT#}_gaoN6q=LgiH>H*A~a97&IN zJSTr!F5cNL;ou)vWr5iIs9lFRFB#Ko+}K(3$aZg*N5)@%9%VJ1iwg(ehxNyI%^Dq= zYP>-)P}0_8+yA1PX(X+&Wjet@vXrK2=uDLSVqFZ?rlYLk$(lRDW)DeD>5FB1e5X~& z&`5sq>tLR*)BOY#y#Y#S^nt^~r-g4tD;-hQY@Nh^)=o2wv9kQRiUAD55qgno@UW`3 zcFeODZYfAfGp`?qgJdVR34J4H;cL1it-bnU1WP=en$KT4mea!9`M z(sef*8@%i2_Y2&y8s*{SL>H8vH(1y;3&&`EC+6^B-MaCn1+;4&K4YZc4m|~uh zwY0O_)j5G51lC)?KUTlQSgYKokuAIb?CVksbMt_$)h-tc1EEx`#&zA?=384;aENzz zcjJL1!r%eoT^Um2#}X?nGQG1?XW-`8{x2ZG91A>%~DhKF-d06sg&N zgF}GZ0BjP@CUmShmn6A_z5eDrI&pdwQ`f1dF#X^o3vNEnnSjYB@iDgfOT@Uq&=u%L z#H#|^Eh9q=0ig~5X3zX?a8OD?A-bgXqmOb$(5F6*&T))Ei2of%D0n?#qqMH`%C!~` znIhwXhzVDo;lp9XYqQW46~}JxWnXN2LZezd@QCaMhU(xFE3?Gz-@hM~{xKODU*P7j z>Ovn&Tws`%$Z;nD9g9C0oh1?}(53<1*4N*!%2$J?-NX)+8aVO9rbbGNM1pt@*VfeN z>*-CIwjQN0W0-sxx%6-J>bBa;8xH)BO*9YXKPBB_Gni6|*11@CBuzj1)PS*}+%|7T z&vU!!w+W*=@>tFNTeiZAXVVK0JFHrkSqPajr0%#a=`fQuqmz2W&t@#6(>%u8;!J6t znTf5zeAO|#+v?sHqVn1)J*`^lel`nP19CAL*R}ZgBu|?s?-Tmkpw>|6W&3(P>=iAm zm`%}r6S4ih`#SwJ;(Zf*#p_fiRhae{*coT&t7Uuz^)i#_04QgZn{F z+8C+_W`6guphONb=gT2vHk*!0+Fk3Fij5ffs4`6TI(D4&2lK*9$WE_0C{{>z_;Hvc z?v(K+JqlGpZI25Vu%PIY53jZt^}ynpQYo$1JsUyX}yLcZ7`rRHCd99@iD@TXCWoP%#O4slYB1^u{SYS~wm(0VqB zudL*4;@K_xk;M2&z4q6Icgn458Ps;ik}Vitc>2SXKkWWT)a!s#U_2pdcIev-#)wz~ zDg%$xSm2KDqxM7a=GK-{U@yMRmVe%ta_*5DkZ8oxAEGtcqXtwy_8rzQVVH@b3aUry z&eI>St@xgAZ2l$6Y#Q+IlcPyahd*NpB4o(yOp?tQ!Uy)~@Oqu8SyI-1%6a@9=hp(YEoDF=XHc;fx(YG#t z{_KABGyL=DuE9DT{jv~HKGqogH*ny%=yvC4`EA;3tJ#;{$K2vMIDr<}VLR%Zqjt*k z%>ROVI-jveuEpkoeR2Qf0fY)SsoR~E6`r0cH&3n*b-KMudefX}d%k%!`8?1$0bD17@AQ6zX9K{MAe^%}#S+be zwxQ|=!5YJ7-3Lq>ml+vPUR<#6VkY0)RIX~PtY+SGouJ^@Nw#ot?rr?JoWa)fOz-T> z|Gx$;o_WpgN|B6OLLgFcCwaGZpr1E6p7t04%bd7VKwXNEAm*in@#x+d#Vygp4}G9Dqoy)= zg^m|U5u6JMgo3FMbufL_B;nxr(gwB>m_rCL#lYlNn@Et4yzU@r=nX)dqj9#mV{?SU+qH zU-tEJDR}W_8~ptFv+W(ro4+Wrg5se^|B7TW zfgGfoUAlA$R~K=8UWp0+Kvv!#`03CQJn?)-WA_b$E@2h`2}oHWiIm{rm)6k!JgS(A z$h?XIx$CvyIof8C-Rt*L&<2B28*>voQg>IkP=nOmk#(I_C&-qjBZygVu zR+Rj1RPIz#rs(Cu&slbU`pP@<@qjB!n%8RCx$2&%ooizM&8gsSA)1Ci6W;{}5%WH1 zuU;8njP%D8tH|VS?FBpW^eaU6I2F0VJXTvYYdQ}|>swIi0GfbS{Lqmjv@-WG@7#Yk z0D(cudGUK%KKeMkW?W1LpB=lU`ALM_Hzj2~8T)$uB9cqZp9acR%MgzjP@@bD4UxJq z7V_7ub|Q$lEpMZmS5&w+?bnvE_pC&nny+tF*KCWR*m_2&w8M=(G_x606jr4~D{WaB zk++V|y8hqxrbAP^VpKJ&W&n^m2lxVnuo%Z=}fUEY#(_KI+BFI)sEe_v$8xJm*ks2?79-7ZVXNwW_FkpVEGc;G1K0z23emI z-R5YWGZHB<$1scqVb07t-ziO?EYC60Yk!kmIw)*ywbIFdtQ zs6F5d)J=j4HdeOKFeh1|9svm0vUNbwy)oZ0>n;h9q?b=5}SQWdnaU zhnuPO$M*HKI;->1dW+YU?OQXxo%M(+J-l&=Eh(?g<&D_E*fO88qC2`ORD7QWO~hYV zA55NNm9s0l-+QZC+{bz@qg%IBG_{XnzF|Oi#+ofmir>IY=2`&=0vO&Fx`B>^DjbJ8 z92*S!#55Ru@DT(wvDmMwkxQiQ@vNK1Bd1LQp6!AyIBwLlgWElKthMV1ctT^kKY*su?p0-aKf-Rr1QdE_7h^2gers z-o5I(+z?VoEH4IQHS%#7u&a@zyJEp_PkU0_W(=7!5FFAB+Yi)VJr;r`1tEYRLo_Tn zln~{Gb^TK92S5N1of}6vMI_{#i0teAj>+!`2CP_R^wF!FZ_iNSpt(LZDjESb=iC2B z*n3A~{r~^t4arJYR+4d%9g@%x;e{wF zu3qo=d4K-+o%3_f>zrQ2<+`5F=i~9X-*5NZ02qTMC3?IB9i_1d9F2pnrMM?NB+!N7 z=E1`8I3P(B=vPP`i_v3Ay|XR5*+9Vw_bqrCBNuJT2d3F2`i>wz5}gfcD(QPM#1X5p zadDvuAjV>5T}5Al6CT(b%=pCH*p*qsGo)-ZcI>oMR&oTb6=GYtTa?Fy^w(Bb8JU<6 z$Nc#*ZigCg;QdDMFN2%LfmIwkrYFP*-%+@T03RP18p@en{qP|r+a3`r^hx^$3Qdk5 zIRfV@?r3EUt6nJp62Xp&(J0vq7OMm)%fUfMT>En-AQ_-Xf@2?su#H)0xr0^S0>f;k zx`R0acA1AJG?T6vC1I3|%mPN6M4&3bQn;*2OZUH!DSN9yIl)?KxNX&aN8hmFLY~p> zQTex$3#LZ$PHK|kojmHGF8@ZWNHyQH4~z@B0S>FOY~u=e0#+Kcos274x1d$U&AsXMk9Uw)47zU z4R95T?`Q~RH{C|`3iq8G@ZEEz_B6+~OM>_KT#tC4cmVDRGOn<3*IU3IinuyK(N8O! z1)|mJ|BGn-GE%#O(4#e!Cdd^T8Xet2+@3o|CLKj$^;ClFh96?v39njOYb#I*&KA}A zf-31Eu;Wrd38NL&pO$am97UOHF)6T^OIFRo9YfE2_pw!Ex=6U;ELINkC+~QjNMJjT zaE+0XQ&Lic@Txxd80!cb&IG!KiESg!sK`~>TARIg|eBnFz zd(c*zvv{Hx^gLY)EJOKl;jeQFN;$tJB@F3we@Ty3w{Ap)ki8lc{79g8-l6s{ACI&l zR9RH>LL~3IaM6YKsgg|srt2aduhIY zC09-^pUctMZeEG!PaG6e>6LlH+1xKz47yo*8N!`M4V>Jo5U7`}+~@ zN5mDI6(m?cf(QfI+`B@P{dZnsb-2vD;W4;>K2@gw&6`pTFWcKyxa22?_&)N5yTPUq zh#Kr2VNnP7Xo_Ibb()jyajLuaIa3XuZoc}tE!sl{{)rI4qFsC@$r_cL8_sU>nXKpN zbHA-k+*nu;Up)#(LrCCce~%54GqI^lKkTxdw!SF9;|a zg`BDH$|Nk;>~WF3$D_?#^B#Ci;bKS}8O_WzOy^+Z%22!tA`zAts_3&N`aZx`(xpxUa{v~O z*1$YP^27)?Lih>pbY&$Kha`rEz8V zo|T2VoaxPDH`Q)hIGF7BF}obE$Yn0^Cqn%w{m~?@z zX$S)YHZ-*hum+Ya!mX|HVL{q4q4ZNKCUyuok*+5u)B52z;6M5YUV8<897;v&jG0TvL1 zfcAhH>2=`;#7ag2-8xErsVSTbN!dUcQcvA5)alR3;hzsz&2odMWvH>#6w#yW>>Qlf zq}afgKFGo%mnzDB2al)aNd#eFEnt4~;>C0?D7g66zzHUbx+he?5;3kNPD|gt!{!?P zHPn-j-xM-q93fz01j<6~#nC5m;zYhZtC9tjp(J;9f`=Uv()&?VLW1GW%W<(=jt{|< zK(GzT4z#YVRjqbUarWZugD?iIrc?&f`#9q}?2{NHT5vMPv|A%M1#~-rdSX6nK=Q!S z>am}#e$Z)a=DT9^wj^BufdU;Ris zI$q!H4bRLf7Na(A$KC##;lTYa{BHM@-mldG*Vx+I2fXO#W#oh6zOT(z-n0;@N`9BS#zFO}Ab!@3dVYD6!pob4eg>$Hp01 zQTBF_{|}VS-){V%*Y;E+N-R4tV9sCURVkWHSk8i@LgVx3Zh*Kp2s(Lr$%%;uupd3a z&Lr=D$Z9wf;&aav52JBk`F22EX2(!AB=m}Rx}n2byvn!`#%pd)cfC9=>j><7I+k$@ z=#F`3K+G=fS72V!vK!t@*GW!GLmZObstl@cB6{u+nzYUEyjXgL24DTxuuxGhDfTGw&n}6#-W8R3JmlWsCTNaG2VB9i4T(}NC^UeEWw}P2o(hIWFS|lFLKZuSFK+ffI zLj;=pE3m)a?0H;2b?~SfUpT<7bdlDdrB9z~14!Qx)$MSU%(G`rSqBvM-3}lW#?Ek3 z+OFwTaXe9Ncr8R|k1Po&q zQ-b3{^W;U9Vw#!BRYLWuowN^#2&GtCMv`!MNpnwzH;vSbP#wsB@_U(6Kye3qG*`YZ z4Qcx1KG*&1Tk}p0X0*!bVPpr4$^3(8dTiisjN(9{^UWH2I{U5j`v~~I?QLKpQ z^KdrHmHLNbXF1^+xjgs;-kiEYZAsY{=MH~4AuJ*SsW#NV9Q*ipO8m5Ve0pu%JJ>3K znT%FI=Ir=yAOHj)Z0c;c-B)H789H=@jq)MtBrke>fYBGsEc38d1pvSxaE=viHUmzcQ(@NkJjJ+s}< zkm^0W5Scr|1Zjk8^nEqUVGgK$<+Nh#5qa=xeKyyE^HhoMit$mGzprF0zqfT2O7KLBJx2bT>a4_%0G7 zp+}Fzwu39oSspS;`8G-H-Qb`n>PhY?aY@NrwpX6MmA_<8HFQg58B-**s!n`8CXP+` zGthO00n?&mAWWn-+dbrqQ`Oj_;BAnQjERM{V9vPT=WzI+T@4s`-bCWxD&uBQhGz`CX z^Y}Vfc3M$va}!Z!2vFuW@SkN%-qR_nEBl!%nxObd{O3nF)T0J}VUr+oyD8wy=eUuu zqRl88c`uX2H<$Eexone>(~Hs^5c2=Nx?QfJs(cm=+-N(%qjs#xIV=Y z+8GTrg^cM-txMV>k8q`Wa31+6&}PbiR`O&xG1-gP1 zcKTlRhiDl&q;6fHREEOfb6zN7K`pt{`Umg3^$T{;sjkovoE>#ffONWG5 zFUSoy+&e8C8Om1I&^_p{ObAfre#IM_rxESs;1FP3g>JE**|RXfzrh%GNEToBYB!Jx zY9{i>smhZv_nY&QROVSw+48O4J#ac9)Ho2ez<`DqX_~||%~cwe?LLpXr*=;4+Ab+` zgf@;&6Ypa8zocr`oPGyL{s%>AG`pm=NSS|FP;GCV@_asmXvubK3~UN1;8R#8$aa~{ zg1J2)7%WoA(%VZT=NZgY6+&0wSPE{H!xG04;I~)bd5Q^HBhEv${2>YQ7vApBtdu)+ z*Jt}44z8!&H{X4dZ(-Sec42K}nxQ49_sYk+E1YJ5$1)V2y*b@Uwmjco{wIFn%p8If z7o+r8*_Nk%QPrhaMsC}`bu_c1&6MT(^EVT>mbMQhkHq_inpgmUU znq8c5+8rtk-l>~)7AC3$I(=UlD;M2{Trj63{1XdF5~Qq%wSzBv!@&X4*39uw&Ha}? zj4?*+3b$!xe)EveY@#|~<$jALIcXq>H@E(IZhF9t^Z-ra8@DQCw+hBl#57hi&--I6 zj@5$ZS#(-bOVl&l+{)$TSetp%-4R7qR||`V*(LaEKdK`IcCfGhdAik0U%9UVFH_Q; z^zHMVetl=1jdNWqns%ppo89VS^Wp{8mAd)=U00o=JKhQY6BN+f&1$2f&`d(Eq;{7h zj9f)jsga|w)=>XTq?A~J_bXpR)56Vov$;j}1W}7dm;>;tt>=zAkPJ#Rh+8x^A8oFa zlS-`odFk{e7FWv@TG|@bR&74n*wSVDu4ck>=w$x$Q=69)qBDp;{olV(OIVKcSMmSf z%M$;gxrk(hiu~#553?B~^P&o_{HJnE)I5Un2q2p=(j9(CIUBqW@CT*fjgDmhW9bXW z&Dsin3I3ng6kW)p`YSj5zrV_t$NVob{(rw(bU|?Y-?8$)pXl#Dgqe~5J9_#*?{QuA zU$M`BKRUkglim*A?UMhw6#sd}I=X)$;{WqT{=YxmU*zTg|E*0HjBF!b=E933T(|S@8*et+*%f+(OK$9G0PP_zCB4kb$c1CqX8-rz*LMf~y)O&z{Lj|%MVqho zo7R)iy3Rb7#T@>>7i{52z<5z}d$QEfNA-c>e~YTsH6T`27K{U6mqX0!ucL zp(J8*k;>jJJd~w&wGGyF|GPb#CZd8wDVFD@`cMKVL)Xl{YC$o%7!KY9!fEd+&7W~3 zu1eX|!~f?B?Edc+NQ@QIm<`^ndUZXRuyJqZg}lEscUWj&oN(#?u0w*S@V~cpgjJNY zJtZ@(>qJZfN8o}yqi}-ea-5W_g}2=QuE_GWe;*akCe9A=q5$~5#Ml^cDcM-6MJFmK zq_}gE(2BK6iODtFw6e?)Jm`#F8mdg9Ri;~sMjQC%%-N##(%SZeAlg{L_??j5m|qBSq`>-upxFx$RV2(dW> zV>U4aln4g*c~rztZBMSyiXhR^IjRmYSTb2%M~9Q-_s8Xwj%Ts%x81|ju9&=h@aY&H zwSVO2K2qd+q>3@_nb>)Az(W1!{jt)?lB?w6zD>+crA78h1e2i`Ya|F$KEz>g)k=fxz4E zNFOSZ{FZrkB&|Den#=OYsZ7b@ygfP)v1V!YUNMOwz;Y%?gP0g#RPavFchjbJ;mR3J z2Cm$!jYu)hppMBMdyhS1%fFH}iZnyHWWl&_8u^$^B(W0vBnTzEmU@)N&*Z<#-vG-OwBh9hq#^2L=Tbez9johgKzz*gUN+m z&sjw#`inNNT6OrHvQbNesd+Ih(TInxK~<766p#=dVp zd-8SjGWevPg=gIBut7?!?rfecqb#_?R%dA_@JNgI&c4Tf=)2vO#VqS<>Y5Cpr!{ve z!sU*!?(J;9v;SBTBrfgUMT>`Ci1pzMeG25e_cJf;Gx&2jg8Bnif8E>vtYa7dbe2yR zJp`5emHmw>F`*1fx||6j3?^i)`wT3N54A#VX-q>-7od_WL|Zm?WY3OByZqm?4#5qA z!{^9uX?Ex^?BY@H@~SeHlzdO-b;aab%}0&nmy&Mz?`;_EURm$(-KJZeO1idd|4T{t zE@4JWin>86$2d(-Gg_Kw89@;&AFtLt*Wfe$E$%3t*=s&#w{m8ynE$5a!a=Ia(Q-`)?c43l*Cg+y{@Mj}XQn@;Th8_sX4ok~!+S zrkwbnx||HW*1SQ5u3c9OZ4+$5mGfduAN`5U6|Nl1D0iD4kXx^3k0Oj7zKkFfL>5OS0sbF}(#LmehAI$a~wxj3Wv^uTHAVgbkLRwUG zxnG~E+L522)27-sIFIisIw9*O=Qc}AZLm-5Sg(Yyc3*@A@H-u8kDTJF-SS8U|@|3f@ z7LzBulD<}D45)70#naoHb?&lK!9KCHz8Ob*dsO`G)@~ToZFb+Hf4%Sa`8^K1`UQ{H z(H_k<8%z6}GJBluwl*YXSrR}?v$f!-o)xESiGhJkDtJ*Ea?XRr>6lw1$&#L){#UN4 zT@)11>MDMdZ`XE8Z9B?mTAkDV`x9TEnq9;cjSxLWaz6RHZd%W2hTvyS$}* z49Ov`RFwc=F|A>zop|UdrsOTr71Bi$W)${udT@E?{ZuT!=24K>*xv)UksNJAz0`iE z67d49DJyFp6;!Br&3cuJu; zl#=Ts7tgn!m2u2*Tq%0iim`KHi85d9Fgy%Uzyy>0A_x>u!S@L{rnt_DFM`=RRoxl;Rnu4~fmZ-6$Q38>ddu=0j3uhG*CUDaHXq3^C$Fo1RO z^x#b}wuli?X--gh&Fdj}nDSG2*A-rY7$NHjf?#;|c%Gk(&A=ct+d;OA$(?}FF(jT? zSjN!s)cW||?#|AQ3E536@kB7HktQf+TW;uH#iol4a8xfA6qvSSiNL(}{Tw1fNqs%D z;7?|1ib>nj`g(0{E-~30OkzZifj}1|D#Z#p%SOTIY5_(&4f}ownytJ-R>Js_Hxm;R z?sEnoX4>$m^ji+`^Muxd7&p3}2RnWc_c3*bTjJT6&kLSCS{CJoa2*k4UVnY@6g}Mg zB#n4ud#?~zB{8R&*=oV_1T1ehHnAqb6SKSg(4}Fa!2(7klWs$56^Wk0W3tDKM(&C- z&vx77qz#O7x(zu~y`<5c@RiqjPrWF;{I1dXC`u<+;RZC8TIC}PNBrc=={1F#B6w7^ z1iTZY-U^7BmzM=EYz@!7|9+ zJ_oeQ{`+DmM4-Llpg|^BY;5db#~)1W@P834W0Z3)QYYBY3o%~MDTlIK^c5EuX4HCm z;9Va%b&C4O^umHG=Ewv(j6G~X^q%pM0V7l}?$!D_axhviW)vo$dwgwfcxiO=z260$ zCFiZ*&d*JM9JuyjA?&;l7Y&)uV)E!c0+`&7wQ^Qhy;Wk66bdWxeg|R3h?GUV;DRTf zHi8Pwc|vyic7gtez>H-`zyACfJ>2mV5`-Ww!_IN zq{$WRuon{tet=C!2Fi&8ZXAJtu>pOIF#Cf@%h19Lcsj=v&TJ@(X zZGnBO1~*7_6dQk)MKW2;?pOCTEpV;x4p(otEd%!Z%1cD%Jx$?{@6^J)0tP1MT4R$q z>RwJQN`I3tZEu`%W5DJc%kU{+);lZ1!7%HgdrcqhSngfs3;9>oyAfEY@-Fpih~aqa zv52oO&RlPh4|Rsk^l_hoKpY6vppOw#H8Dt^O7ru@q!=K7d1MQoipg(LnRQkrO(i3Ph;d7_=H8JR91rmk3bB zBLJ_DbL#3JJtv~lpo>9mNlfhm&sTv9E{IUQLed@P0Zmunu~W}?lXAL^k__aT>3Jv%?np3dM(>DRZPD7zlV z{MO<*?4Fv?mC&WEZ%rq|-9VxeK(GuD>k2Isyz8QIfolO0XQCJp9?yL7aK2W}`UwHK&r+Tl20MKGl$@CP6FD=Z zI0JHX*-v^C83%oReJ~&zEW3D~EBZ-M5kgb8X8kq}W9;zY^YtIk2WC8cf0w0gEZp%k z&e2BF=2FR>8;)QnK_b}*WhlPNhQ8qsTa#v+Jd6<=T|d^(L4%u{i?zE~cHQMvnx4)Q zF;WgBrx5WjSTVt3gcwZ7A6^Q%3Ne<}4+KjHgFy4R4i*RGNCibjKgL52VkiFX{ruo+ zPY5hY@S(xRy)i%50DhD6=nI^jBlx(cMe$-_ORjDF@bj~`hwSP(a=7DcR$$h5OMY!n z)v{V`m1yR2Id^5`7x&*~=j=VM>@YTR3YOW)wd)LHgeUF7$57*^`*p`zWh~ zsU!LXJD$0fXuYk>{hAVM$y4#Zz#&UMM@Yp@_(#D<=12VT?$is4C=_rofp~*%+s|(c z6p+w1w1oYZ<%T6PDlxyB>CdBT0EKx3dF5anqC~@pUiRR3^v76Seef;4IPD`5as=cD-$inSwAAA;Z@Y*;!ej|p}gA4Y(Zfg^y;D6Y?6m38mx=H%c1oBJq7EG3d0nBWJ8s%dx z1Kv#P`P=?&ILdFDE9iNdzP(Mw`6!c{kQ%EP!=Szx{r3CMpnS9sFYQyr5(p)5d= zgdE215x=bsV%!^BloEu=-)k4UZro9Xo9d_M8EmrOWlx!i2692BY>*mUN8{HXgga{Xm%D={8d zHA_^o9rym>n`7EJlF86bgFrX@V9}6ueUV&Lr=#tz&TRE|4DtZOLm_54^2PY_CTFvPA6 z;X;BSbm9ETa_HW%0nOpLKjr$VnOH}z_TIrI!zTUi2e|)4mjS4fK}|ps^%HpPKz-;KNE!x?Ja#b?%NwDG6B0`R~1j(rjEJmgi;!nEgcA9jB) zEKG=e5ln>N;`rVRVBa;ulru^UPHw2`dN!rZ|r?0suJdAkCu_uUY8Qd93k zV~H+3PE{#HxuCd(L1;Z-tdpZ2Tyeo0XE|u}XN-Ki@~Z^75JC7$5Gau9sO6_}m<#7m zFU5s>$@t1Gd<{`57^kO~wRx2^#+dq{`mJ@vQ$w~>yg&1`VuGS(=vNe)U z%Z7qKz9Uu2^;3u0W@!fB-c!p&t{ei>;5`Ii8Dc~`ad)^5)!A#t+%Iv2n_!b6rvEy`fX16ZI18t zlY*Dm{g3kLV~Z=mL16D;Zx5Iw;e^D=lZg7H5dp!Bm^lq{hY3vCMmOh1Av3#yyPB4q z4FA1Tf9iMcB|c~}$gq4YyD<|T9gUX$4x-$NsRkD=^fA>fx8Ptw#VxzhC!6}$5D?5C z#t4w;evDlIae$fG6U@Sj%kN>E=lko?!Ciq3SjG??haB`J@@lc**S}*!L2F!KR<{X0 zEDIaLJ_50?>E))}`-yy^tc>O?Gh#^1g^3Gr1-|LkJQ&RIU%sP*1s)h%?WcoCd&~b3E*nT#u z!qL&8>F7JnPN3H*cl~e`O5~rgK|G5)^;OoN3p4svuxh!tZqFys&Oi zX1a*B(QIo$Cv%y;&|k6z^ponzlE8N$j`|MW8T6)b&jjxtyw306zOBE4UI7IZ*2ss^1`+kc64cP2KY!-FbK>V(-PRg0PY*u<&jY`oAQz+gCl6`*gI^506e5fO z_7xtibvUt{8E}LE-KLJGA7lpo&9CHk#)|7(#+?Cjyz zwEjqTmAh+&7_|EyYS}!qjjynw9>IQqTu_RcIy9nt_wKEe9taFGyJ}vNt6q_=JiFk@ zpa|RxAKIau_0#7#UAw5s4vsfK<74afI|oHw%-t0lji~?QBzh~aU^+gypvd#c5w6w* z!<>uv&n4H~ZhO@qkf|GF8*FN*Oh_tTi!{{sN0DC&TXxR$tSG&UK+5?FGcK4J~&DG1-uV04`MW^k4_-J^{ z#1zhAW5cnE&I82p@C>Rwd(e}p#K0oL6${>R^u-2Lns^!^&p-zkSwd7aqf*5e&@|Lj zMDs-O(}5Hs@%`t|QrP`G?wfQoAiLRxb?-IvChIf@l=LVzvEegY0sHU(N|dFA6%Hwn z>KeLp%{N8)zF3w1sCN8q7oHq_{W$uMe>8nS;Gy+UncK z(6K?KHC02{&^_YajH>^oGy28@O z!O^jHCOa9A3+&jwA-j3P-p;N*?AFFUx)E@$hv0Pq%TWMIcpI;Vdwk7i&vrK(ZPVty zESda%PU(78FZsH|?=^STgG$#@8df7ut*B;U009e<_>R^?b-iqZPpC_h(rscMs=g?F z0Z&{1N-w>QrT47Dl3^FMQs>m6N1i)*BdqDr)bCS&-tZiAuKlrEe)6j3ZSM^cU0Q|L zUy21Kw{G?CdB0nRJ50W9O3K61($cnT{1V0TEZva&3vKIgMX#2@O^TI(;pbmcU|fhV z_(sFi0-yExU&zA{Rz-}D`-oB>m(-~Omj{?3 zgxb(TkB?gr-ohy5+tuU4VuEon6|Z&hF{2J z=2HSM5}sj1~dj>JZvsMU%|wSO(w`X?5A#wpF7!IXcC;*E{s{j-M2AKzX2QyDCOAEI}(+ za!}TwMw+H<+$o-VP8J3Q2w=H})bt4mN4&&|$46lBaBi%k(x9G^#<{kG{B=oXvRd_1RM=bIOI zvW~HoLeqb|(Lui#^N3JqT7Ddy9c(e98q5c}ite80oD^S)x;D4G^rzsflW=@QU&oOM z`9;qgud+>Q8ZYxazDBe|(tcf~*xLf%oXq|&ec|3!&4T1DmSwLbjp}nN_ZQT;cJC=w z$oZA1CT-=u2Ds|}W1o_-a_J)FAH9Ox&mSk6%VRrazY`*Mbt39mqp%kqUr4Ml<^Kr> zoblJYzXNT@CBfjCHx|V^XzTK!7aw@pIyoV<<)K}g8gI#4FmUz%j8nHXlGPBE9YaGf z2t&#KVq?x3shqHf>-PC_1k!P0nzYci-eG@gm;9S3W*H+=Wv)1&?uFv`&%le{Fq+rb z(~EDnhEDwD1gaO9r%d#PPNQ8!(8jqeE%b;m$icx2+X?)$esi%4TvJ`a`^SesG&gME zitBvo3wP6RZP&P@!qXv6DlyjHl6$*zy2|rLnpw^2O>(PWJ0HCDBr*FEXY;AxUj~G0 zr%QQyP5iNKk53W>QEg{I*j#s1n(#h;oR3@hb~qPBq4b= zt@a@wcNT}K5Mu|J_YH<{K??mk3!{x}dpt8Yz9e1*6CQg>PVQH*ERn-Sn85>wP!%&% z(-#OQ#+m;(JDcVt`Z!pr$f6mCP1_j=DQ(M&$zDw@+U59<3DA&nco8)bNQ*dFi6464 z^(7Hl5lRM2teKljECq-sk7daq zatzc@fKuR}ZI3f?#b*Q^$;??ZHz~GbBc2neWC$vT5SCOK|84U@ULA$OPg-|;r|ol7 zXL!azG!cq28`NPg88~RtbVxr*-wX|Lul?lp-N5s?Xu z!p5at`u2X?C7vG46d!`1<`M$^4^1zzv_@a`&Z(kq?y~dsv75WiU3h|)$9BuYe`I>W zbL9843fHb9iNK-(#{=RbZgRvrrFw?9XaL^DpilS=vsj@bsF?fkfsI!fTg&UNE<+*4 z&m603YqCo@=ZW`zwe{EwF)+y&S2TXZ9t4Ovo*-gvk6#0aVnl{moCeb#SW(^PQW2bb zb|3T+r3*W;(2N4&35@tYMW5yX_;8Rq1m`5a*uAII(SOF9`67DJr~rPsOMsIwSOq={ z*FoVh1^Iy`sKAL@Kr=AU*_P@}LERA+B@>x{{cn6Jy;_)wPRU z#ljQD{3}zPwNV#OCq@b}V32!w6-*C|5LZMK}1oA@hnM6NN`xipzZ{WjnL&C zq9bQELpvPVqi}2tA{l@j^TYxlP-hL`nc3MI&xKDHPc5<_ePD5g*(y;jTVF{2#d6O1 z8((4VhxnhoyjcjgAoIfDhv*(p+(pqW^!DEDf~TmMnAif)l`TrM$_S&&MwGgvk zhrI)kqS51!@Uz(+RS*0i$VLr`lG3AI*|jp+HDVhx-$b;g1V}o%wJ|CSoB>WfADsrS zJl7UT+&5+>!rWOAzw#1I8k~L0hD4)CzZ$%rmY0(vN{nvJvXyy3VFbrPVy489L%9s( zBY8(!L1gW;wTis?$I^+BmOmWoJ}P0SDr2Rnh0YLp(Vth(8l*{h^Bx~@4@ zt-L#MuE@_*{O8t-7uS~8^P}1oKL7c0T>hm(MI72?=8`i_q^&Zx)|3@sqa!7xIZ@N@dn zoy~SM^FV226&`7}GQZ`Lio@&`MIr7M6A|9tApSf2L9l^V*VLfawLMDI`9gn&-wPuK zFRv9MUW#n)LqVQU`i^3b>xby5iXlg|FqqF?tvN{-mLltSiiQlr)!0MlZOeuREOf0u z=`kv&r8|S5YM~&h6aZ2x~wsZZ#3g}EyQ zxHeeR5y-m=O>gsNU;=?>5k+ERB1>LBD-|hb1wfN!|NQ>_00kDPq|C{X2E%9pjTUC0 zcE5H*S@!d%n~_m6oEVIaeO4ypS*(Z!9<*ib&KN_j_z)*m3eeN7w;c9$g*zoS3tX`e zRqp3ctyuFhXzA?pl|*wyoT>Z#{ER4q?FHpDmOeh~$=Dy@3xPQUl7{M5`-?!rwiZvs z`6)>kW?btDFSD=J>|`WhD;T=NT1i}5+6$YJiQmRj$|4N5eqq@X-MMN$!g_?+?G0`u z&OxFS&O9VgYYvqGKrbXWk*-*Z#2XnKKQ%0X+z#(8`X6>__>4gsE166baN;V!=rSoP z4QD${OVEDKTPyw{(1LJa$-il^*gorrKXjLvv11IT)vS! z%lgaN=f^)UySfG$_Rb95qM565df0n$ppUY&ThTkwn#)olM*SIGpNgPpdA)VJ#U7Fm z;iGfPpM$%YFTS=cS!ZLqk)KB6Z{G90xtYX!4KrLA=Mm31h}5i^x4r>2K@%?@+Ks6b z+7ArR?ChowZjK+keNguMpEawJ!R6&;tWmh`5hn`R3OGK_!)9Q_Ymz#xyauXv9%HlMNjn`c6(b8@|b>Jc-ZN2;#~KJkQZ1|$E%S?u(v zbC5s?Atr8x-v!LF5Y#tboZh+lRj&?}g6Mky1!tApVRDA}J=yj7CXCSVR+syL#Zv?a zd~`}nN?MJmTZT2aD}<%L0u#7()N2{vwsP97wxnY2f;7byAJF>w_nr9jAFsw6YrpX{ z$??!eDWL~LvJeIZ2z-GrHs*cDUM%d<(J89iT!pzRzyTPbH$Z&CM(soP;G6ynD*Cl! zeXqNl`|JNzRZ{ou8g9PSkUX~ImA4(O>2LP@O4u z_RW_h#y8O(n+h^V1<&rQsA=5QSCvY+zddC!#qbsR8y+o>m?DpG&|3MZJt{SIHiJI6 zz_zCoGM&@pRF9N@jioCDJ{1$F_I&2rMO*Y(i@#{#tO7c*=P#x|UbeIAktopM8|w|d z%JH_f*K)VFJ;QmaDF`8}s!-Luca#iif+@0zh#o8odDQRQI3|y8hiBiy3iis>bKGYO z_*7+5o$T%9t`+vpK+A`DHeCPu`;p#WS(~lJFKS_MAN-G`lnviHp$=@I4x-3d)CV`u(kU2MS7x}%1^s<5xMphQ?(iI&iOX}Hh5;v_eS| z9*xr+{-h>c0*n!rW59Z9Q0r>tWX^i?F;t_8!(c^5T6zdZA?F^WsU=!)W57dnq`@Ws zYeT$-!3qi^c;Vxa2hf)WKX6lG6orfTS>9OiP0qiDw(8fPFELn4P0gFhc~Hl>0jv=+DxNSOPH|V%M1j^ZDgQa-mJ<91 zrS>)osA&bK>fjRP<#BU)zNueikp%0FJcw=Lwt4hXS=qg^rd`r+27zL|`~C)#lnxv2 z-GDH$Ya&u4+rHRb@g}Q?@$_X_+=A*gyCh%d5ZWBthU^mp?n-^NW~2ZE#gmWx;o?$K zD0N$ixH>MY=Z?hgO*5sp&wjG%r7aCi}kX`RgOT?q^Jj?-@N^^T~X?m=$ihSIU@ESC@IF z_THFQgTvzt-FsOvjrkNabW;J9Jsu55!!iX&m`OQzR|I*9+j)WA;&}qWArY;Bn25zc z3>tFs@+bxFykx)b=&OYWT#A#ZA5DBlY&P z@TVSj?Oi{3=OyMI??S*)eGTLdmdLJMnmZak`Il1%KH{{!>B&y6px?)xy89njiDWWP zcnU+6`?ybgN&PfSXWJ97%AI%E+i>UEz&XZ*$86bP*D}yaJYM)&@Zep_I z);KA9>7%XVhPTN0} z|B4B$`@{DIa5`{WotnkrEyTBZMC?~AqIk=kL$KY^EZ+j=Q#8EOr zkB&CfMj%dpe}UKu(vNqB9N)QY+$=fbc?BgEjFqg#ld>B&DR%CwuTQ@sp_YJ20t^W> zLc(57C}`{H9a5p=jR5Eji>q{Am(6Xm4e<_1x0v3~{RR)vMe3pF)Aw_@;ZZ(h)Y>{N zwqvxWIoidPd;SC+9YJ(xfwGppF5_lGZ zb>voqClzp@7t?8H%^iwenXkq*xCPH^^1Lzm(Nn6(&*EIFb(YddcF=F*+2y?B!xTB0 z#*A0%bObMGR_F&^$Q{&Ibmea@cMSFji8`w`nL*G_?$HjT45Ot_adnNG3di)EXkn`oGx?;1_TskFreF2;#P&^S{{|gQvWrE z12MU|mSIhw0(Exy1w6xKYC~8-u4=27&lV!$H-E%$*7-NxnE0+9 z>6$GXA?xww!>^L5-&F}~&rZI-?p<3A&H5+Z_=q50&tP&BE-eBt;mxwnBa079cP|CF z1gu%ysBggMX|qOTMDv6zfm?|2tP~pt6#$>hdaMm@r80|KMwWPasp zTYM^XuLjJi^%WP|HC`n=t40YDxn1#AB;}T385G+sJcl}P9$$cC7ub&&I}qsj<2yWu zz}=G%IE)cd&(**2BR4RMLJt6+jcdr(sA%;Uv?q8IJ zJ|A&Cbo6+B^HHbhs{FJ2Qgd?Oe|7Tk`ua3H=CGKY{3jW))ad5WP=Z{FN#})IK{U*~ zB;yA&Tf#F4bmWmHawWUIF8KL-&>1D;t&_f{YPxJ6*Se7KH z@dDtYjblB*$aUs5ha3SZ3&`MmMjvBE_N;**CyDV8$qr~XoX*fZf&t_SOK49BJ-&5m zVi=QfoD^oDAWISpC1cwsS^R`wj+C_3=`{;4*Zf^O35wDvlUCZm-}^gn-hFIIxp3(9 z8HBQg`a=)?bBFWWmW!XF8f-|IWgkA={=h2okH2aa=Bnu-?6A)bQTqcLU|shVcLs1g z7pX5_zJTY8o^Kr-m@j|r_zDfmvN6%ebd|`ddjJ0Y6%$Y>cK&F2$#wZxxZj8oqZEau zg8)ljGv)YZ>*bB5&hMoU22Q4%3&ha(4o;Uml3ka}$t!zm@BWsXHD5PgsOBPLOvvre z##&A$X4y4@1m$-UQEy8*bRd#oj^^N0c2Qb);8#$I0j6NhA1Ou{X10RQK1}wZw{EhC zJc`eTn#@71=Hmm^Ec14V*fj*-T{+1ZadQ?83$|E_;D=svl*fL$>R+BeoBM9OSDK3c z1y0bg1||BCztOzRyCQv9P6dVDbw#FUmLcCiu#+Hciy@?wODA_)>I!HNDYwh5@8}b9 zj6}H-LBV*sEYj9eu|CF9%3rjV!vn>5+l3a{xmA=U0l;0SV0 zapmG_$fK;yq%7d#hfahe(L-=%d+S%>(ouP?Sng!UG68SRFUI^vb2$`7LibBcn+x8B z>xSFKkxdz>TosLoqixS@PkG`P|5PTKPM1(r_(fWS_$?F9BqrSayMpP_~ezg3J-me_WZOaVc3h?^yDLKu1Xarut90)(u!f2Pd zXXuFWL&QvA$cV7Nr?;yMVf`4KChlbC}TU{i6=jbg9US6+Hd@B7z1$+$j znq1NFLW>kr6N`dlyk64DdI;n^?X$GDx64VAh#bZ&0MZQL!AEEh$ol$NTNBu*oe@h7 z5*SFWruzEIys=LtkTU?s+w5#!7=pGVIVC>ZzVah%@8vQaE`N0>NFVWVdHnH9d51%9 zdOSr~OS{WXgSYzQZz5lsrWva_8Vs!5G~0i6U)yXsJYv+Dg0-uwPF3Ex{#GQv!C&k3 z;n|GorOFGzwV&TuXRBzbh?-1>XTPsBZzfc~nU<7L9peZ**%%3u5^FSyIl)XcQZN}~z$TMd>y6?P8WXce{g&Xv<7aOCXH_5a46+oLZ~azd+o4@vmG zR%YYXyT=&*A8+sdNM#@Yj|*`~I%da6c2+_Xl8i%0LI_EAvO+}5oxKhrLP-Bm)pO5Eb=*$LyBP5gru|ozo(X7D^ zB+S(*bMDBPAr-hMfIaa|g?BG^MDDfLl$h7rPXmEl^QT@5eyiXjNBql`oNI&v;gH4} z89Q&{mOT(M)20D{$;dNMCjdSJE(cdH6l0av%?pWp;DJAE@<W4Y|un{6Wr|D!%KSC!5>5XN;lwwPj}S41gpOgrf#u|PaoLN$_Tx_0XD z0fFB>l2yD-@5B+$W*NEXw_nMEo#Z_Wt0z3Qa^%pCs`7(Z4}3J1Zep;j>$7vTKhT-$ zcHn@J#Ph8cfwsNdEoA*f4)9;87r){(%x!ixu(jN{1~NnBWpHh23nFX~QBkotQ;`v- zCSGboy!6sv?by?VE+L`=_X*Pjt(#y?#IHBfN6gK0+~j>F_#O6I3#&C=cmBB-Yzd-$ zZP;7ZMB~aswdihiIXno?%C`u+*m2e2a+b*n6bf8h{(yV3>tKBMLd6eEhpkFRS5u=d z@JAjGKcBC~xXw_?$qcPhek=hjU zD;Nj8KwS7!^VadT*;8I` zJbI6IG#{2(3-jPQV?Wlvc*{hs*F05@M?_ZV%xX!5%kuU0A3LPG)-$|iA@d~_pr|9Q zLn+;JG=`w(Y!?Vn(7UC6ajq|X1JhTf3BC&ItWVn{pR@kQeHq&=o_(_yVKm-o`j7s8 zMf=O^hL>3pX*6_=lcOqPH4)?r)u%~k@+nMnQa)N!?nP>1%+N+AUFg`D=*h4!Pz$3F>HhsM=MLg+1T zZc#O=U-V0EKTjW22lE@NxdR)g_skrXPp`C{f47k3Y@_AIy1TUUn)Xnl38SF0Szy5K zt9I?dY_d$eTo(wMTZ8tBo2ef5U8kVbCiOw!+&Zbz*q-_#>%gHpzm6jHvj{0#KUXuK z{?t^_rL^&zs35P`CeGSevXj5R5@&2MB2136Z`!nw+ki}yt-ofO!EcK=dK6pBYnn&= z)7PLaj^8_92N&2W-*#H%@2l$dg0Zq~K}jJ|#%q81Xh>%8#s6Fi>fIdR3PAXt;i%tf zuxBw43FHZWL^?KDv~A%vag(DbDyexl=Nc9jrbF(j;YEEV z32`+rrTJS(y-fI$XDTI}!Sqj8XqYLNHd~&cOZUd3M~VdJ2E*TyRTCMUq!c)W`9p8a z-PR?Kf1Nni@()LCIM2cm-}jI=nh!Utn5T%>Ul7w*K9@0f$JvffUoK|(N{le`E|Q$i zS?O@P+Cd>0l`?zmfJA=--x-(zd}bc~L?g#=jc zr5rR+Iw9UWpyR^hB9fAk#K>`yY+UVsaIR6WC}l{zHP*1oD?L-xPo9M|#=IuZH$d(l_5g-gqycy{5|1`#b)zsDcHH;bIocaEI)!64V*F<-H) zSzuOI!Xa|hAHg_MvptnRg-@Ant5ZzDn$nQjkTdmzhbZ_JfHb@WS(K*8rLV?3?dHbC z+Z#4N{Rg<#21VsvXd>VLYJK*mB+T4Ilqnin)kkI+!I>7{>6$lP}nE08cU)8Hy0soy`;jM zHFZSZLa%i+>}iWi{*ID?S%_-?#?zUWAerineiFzT^t_B5N=t&H4ln)yD!IdcDb(B2Tm3looT?ag zr&0d+=8iKd;;k-(pYaClKFYOhhpFsml-zz9S&};SMZ;LOi`o{en-0G{6F$)5)a_Fj z{=xBZ@x+ce1_N@HTt3m!Yg?OZ(q3^%UshrtP!)@kitDN=Jsb`t6qcItizDL+tZbI2 znWZkzvhhm@=R3r6g>GFvASe;t?#QOzRo6mdyEq~BH*7qAxZj~Lrn7QgSI*`N_J~Uv z!jaXn>3nH?3-^kMNwOwiY?kQ7f&Te*ejSfl!F1>(coZww=Yh-&$z6ogRhrW z+Sq`cA|7+4w1<`DHsRQu9j7{rwz!L-Q&mTXo;lx&@#9Q!HSy`z2=bdgpDxu0WEVR& zi(QlX9v*Z~#Os4mZ_+AVI5@^PScxZzPGKKxZ&nV^oQ+za?!4>I1&0mwyC|P{HE&XP zUPm>zf~1nNz>M?Ii(9uR&-lZKwGQ5XB`qdaiPcO6ZPYU4CHgDmv;m-vQb*5i~7$ z3@UYny#E?<2MBjxB#j62Nb_eY+-Tpv{e9@~%07e%3H}@H*7B2evx?*%I_vG8=@+?9 z@%$eb>oueAM?^&wTMZ4w#SIO39rNSdw)v;_9vM4&0oc*tVQGb9oGwozEGn&ysw6}{ zEgH%9_ESg8cbW$#uyhG#>&Q1*^ZFfpW$~uU#n~=h?OCL_@}PwDL6ai}m6B>ZUNssu zk~vv2BPh&kJQrOl^@SEPp>zVLcNFtK3cVOwHW#~|J^V4Nfppc&ysqbAPo+vd!~*kG z>8^QL2%oLpxM@O9>}R4@2W;6)YWC}tu+3Fkd`{DT6Q8u6%x&I<__Kal>clb8yWxfG zMrR0`Y-=L)VqUjIZs>iBzqIMOlZ7-#N$8!h15aPxt-P%2{_PG?ROoX4Hoj<%N`AWw z6zf4LO)=d^CAOLo*+n}SxP%)zM0A!}%6m#`FD7|Vjna=dSa~`~4RG{|FoHEenh*P! zcxQ;3e_dO$HE`pZgp5h4BqxF3T0j1y>(?p79V170@RU%E{S^ExJa=ptrC)-LV%3QS z|IYOe+;PQ5-;xv8tvOI~HI2zWbxo#HrOWr-?wB8Z>Lz8XsY3_A0~{p?K}VlFVc4Jf zKYRsnE0Ltt4=FU{OtCb*i6+v(z*+2GXh2*JEn0SL42K7d;BDm7@t@Vmb%YZF(lY4H zs*=-M3^$+3TuCOUn9I49@yLtEoA~Q38lSMzH+D}MauMa^oI9?qbcK6bU&l>{xFoL1 z!6D{E&PwixkiR0&(M#zUmnF|HQM?x{8R)4W9F+}l-W0iPTwz@jjAK*SOH}DmE;@H( zcBZwvjb&2`R~Jc>H+5WiW>&mwJKNpZJ@nk%{LEHwg&iy<6yB{5CmkNNlcnXIqjg7* z9IACGMl{&~Y__X%Q>NrwQmm{E^)=wkDGsna%}$nsVN>(7VgM z6xONFOS;=WeCZRz^Y|^wWaav5Uu8<5P$|o6@e$Dse!3YH6qOaTTx^QfYt_jWhdr1+ zUiu=&VMrbiDaCY3>`E^LST0H|Hmq@Pr8WrM;5M+#c>sYpI~iHOgIM$FHTgR=RzYN(cQvO!K8Wpq=Mv+v29kD`@!nK$;(@rSSZJ`PSQ1><)3P@bV$$b(y`|}q$?<2Z%-qkggkgqSGPOOXz!PCXMo}`&2EQv!=In; zAN-}!W?%>oLJ1$GKjbS!!>`fUV6^Za6eOsYwhRzMXz_%fo*aTW&8plavgI=+uhH<_ zKYpujLXr3|6gj1*+wJNj2vX+bw}ZtKEaSprWWR`V>FM>Vzc45kEO2_JH*i})cCD(*Rj<~% z%5^f!gsb6$$DJp+s^a#Jjq=GvI|;e(KNb3FoqeqFX_f1G`xOmTIdWIZ?c|ZiVPrW9hDbiyd4#3XTk59M z8H}xw|JubQ+@%z!6T?PHS+By=rKT^<`Nv*(G^#;4Y+w5hW*(mQPJWkqxH1b}2XNaw zAsOwoD^WmIO*D`!Bc-J4MY++L^#W6-qPC@vn7amRBrbS;3gT-O4BL4xZsKtfN3j?a zc7FY_a4HK&Gn@E2A?I3N)0mqvn6!tz7PZxrCJ8`jhUKTPum5;O`NNi^zuM@pgF`T%!L-j~L-+WMv5o359?W2fKvDGfm;GvzW2?3su zM3*Trn&1v26x=*_-e#1*&k|D?M|WD^IEAMvzHiK3^z_WEiKEo<4Xa;9({)j73zEbkf*>v*|+v$LK?Eacvh`7I^z! zi3rreITxay?a^2wIoDo0YW2h`){|}Ph95@cT+^QSUlD6cirA>a+;e)4tlPDT;lelW zOAU_2%66~)emif0h7+k=jW+qltO;!8u;XRuLIAs8wb)0A{;H?1k^BVubd>*|WCQE6 zvDQ{?QN+&6F%nY5F`QC8&nGd2%u3u%aDw<`N$;d@m7B6{w(O^)s@&!m<+mGDRnrMhf>oPRs9Ly6 z*FF)$`wmiK$mx*0iUd&v4i7aTDjtDjFX>0JlK1Ogi6qh&+ZQzfP-h5j86VFu4=mLZ zZSknh3rnaI?sj~09ySLJcBb^`=0WB{&=k5Q{FwMof5ai^zV;dT!oa0cqhKAFoYCIi z|C*M;Nu{d8(f#$tr`u*?60du9hHm6&%C*=%CA)g-u5B5z1ps`2;I#j;&=x*EWD}xF z1M3P(aa!apryy!Lu#6u7t>=v;OCp_6QW7sDkhL$gpb!uxqMkAZu!3}x-tXwL*>YNH zrjeW-d&I$t<|pa5(Xr!Hii7dC*aMs_y`n6J$>R2R4{(2I&@hoCN0Em`_B6Oi#~RsK zo-XA))R_{SG1M!`c&F&rfjB3wtN_U+36-0&U1jDs^c*Rk*ZTOx^zD2l<>u52cNZV6 zH8*^$Jbq|{WG}1V+qk2>Bu|9OczDcbiTOhdfmsy1KfozO=an0kC*><&yj_i7R6Soc z_L{inT|0TPKMJ?bMIB1hUZt397u8{wv+aTV9K{^D!iZlDTpr3zPUavp#F)Ty>t8>9 z^m|D0yUtiA6Hy5HLVMK4Ok=kT7c^)l86l=S@-5M$Q|4Vx#0` z^RnSS*(1m5W6-NS-0{lR{eXT?m@%W%Meef{&dlxwMW>6YR&1S3W_Fz{dUG54%+vd8 zUHf?tJ^?+3^|uGuX7Atcp91rT<~ZaO5+byjr*F8cRoR>bo~naG%fcGyNY-+0QcMY5 z`>005^XJaN>>trt@@~sIXoBc}^W>`7?PTP}hxcAmU758-z95F?8n0$xcOD6LI(8N? z9}%(&2^Hc*s}wVhLqNJkR-^A2_G<)$fQEbL&#OCZnMJKfwHVk|I*jW6Udw?O?M3-~M#{rdanUQocXr9g>47wej5WX~~cbJL5j`(k2t?A=wK zNq>z@7dN&3H5a8TrG{B9Rw0H~oQ1&}u~#Y=3?=;pCl@-dx*A@!G>E&$B~A#V8=h=G zAAB$U=>6wgkJg7ugz@g;mOdJ^V|zLC^4z_n56*v4`}qboDg+Vqxe)L$$%#4A! zlTs#%!Z&BIha42=bZAR9=x|W*n!HZjkqqQ%$(lSr?-6BD+H3kug+S;Q3N-wu>Z z1_z{huTu(8eQEoWJDT069jZ%gGGW4{Aon2T52_<;xp$LwcTAirnLv%gWY5~_Y? zcl`LN>Sv&6!V<~Sauj;TfT`#?#NA`T06?gSAey6?Es3;Q!Fm5Q-~r6qFh&4^K@OrF9o z7K2{@Sv=zPt0ta!JfhiL@=EByPnxxlJx@1d`-VGq4bV&txP2TMu>fwNa-C+=fQVtjycX3k-utE=s6wOlxyrNyRyVlIWroGiPB56&_5K7qn`P z_la&J4`7dtykKVaGv+jr5j$)Q8}Z^R5!rhWF468acK7$YUiR@h6ATKjEW zJUg@Kj|eSY`Z|9w@E0^|AfF|1WR3>^R-S9zxjx{ zd&i(J;t!B$@#>XFzRrc;z+PY`7=Am>gPiR6mABWfud{-;u900g4ley8>9MX%N9C5a zoYU%?8$REsBgOl9Y!=ra&P-Y}UHSFdCK)=?U{xc^fUsHY3DyD`<~>?enJlufr&}t~ zL?X-RJL}@<)ZQ%HIm<{fnf-(#!gkrto^BG~wtl@5{^q&6@*hZ*P!XX)LPR!nTgaWP z=iAO34`!h8rkOA&?yDTxOK@<@lLCInAAt@yA-2^41(@l|&kLHj24)vwY?9Sh4 zbXTwPV#U3DX>wCD!9EteGx*Hx1x2^;qUP3D<-*YocJH2@xT*J&{nMr_E6@B()qB5f zt70h9=yp=P3~!|1wmDz?o@%ov9nrs2LS=2zCh85Hw7IHXww?C?IK^{8XV3ES zsdtgwIqyag=Y3U^I7crCCM|0}=CVnIh?<&-8rN{2Y!5%F7M^pjn><{cI_4~Tr=Cso$8vsLo*)d9 zU~~ip$Gv;^@Ch(nqO0sk+J{C?EEA%T?+A|^I@h2$FC-|GzRo0}alS25H+ltJZ~OlE z>9U`jnORG?L>Mi$O0(HrNqrowalfVpem_GdH;oDiA|UAa)PX>xXXfGQiJ6;m=j=K> zikzK~+^V5zRgCKFgD1;xSYdU1)bQ7`-nUlp>EJ~P^>>N^^rgDdiA@apmT5&13i_5h zsyd7V3zpK!u>+?q9O5Fk36=DExRhGY>e=?)-X6hee>WzzI`cYrlU|N~VUzH1o{VX= ztZi!fW--GwLyMU7kNrH?7Q8g}lN=+c^!v{i4D^qj2xts;b2QIhdbbvgPf>3~=+nT*Nv@B@N#S7*Cwl$Oe(Wyj)%f(cj4aM$jvVUZtrNe7>5d z?T;SaaMQ3ui`4K8Ibf%kOm05H!$WR4>$Rsqm!Cd8a`>baJNRbVp zx_fsJIN7R4MxQ=?KT#XMP!GQ`L^jz!2-$mmFf0^8Ph3WAUEPMTiu!t04GkEou!sz? z!8rmK^YSH97&RdYLFl3xH==bF{wnas|6YyWhd${%D6@lZ*E2FyAsd$C^*nhJ!DuJF zyg(jCF^wV*3lhq5eGa(Mb>gUg&U<`4^l0pAJbm;Q1JK8fLK|!(~ zQ=nJ&lH+S0_UKNYXlq~b7n^H@!-@3!vrzq0sWSP))`t)8+_!HZ(7b*79{JgU35mE^ zFtmWoA_xd1d1RrxoWc%^cmF@hEmlC7Fzx7_F3XcbwJEeOBx|7_+WS9$LLNN7+3SLO zaAIU+1R7uhBT5$J#8xB0=<81b0RiYIfDh3Q(HHv(*#_d^;X%%Wo`n`sV`K)45gJ0Q z(*tz|;?-CQZ~y(OutE;Wwd`!B*4wG`0$}YS?+D*9Fu>N>0gtw6pF8E{Q6B102kc1b z*jWB?PkrqXJulm-D0+VV$k2?F?e`RB^gR#gm#=&KkJR<{15C=K;!vc%vGqwtjEs%J z1m)z%owZ@PyxRB6KCj5PxO1M4Y|ivosgu2W=-xRW&@$gWYcB7yl&H*WkI()fx?7c&Im(y7F{=m**-##o) z5X)7d`dc0nx!es!$RX)KRY5#X1Y07v5FTCW;>GxID9biYO-_2MT*nfSkDG^v9Zb|u zpOgoBm4~Cd7glgjmX}x0-9uRcZ#z^g^(i>4t7u>j8gm#)U^m@gy}KabKPJxY+irM| zAk)G71FML`maaBYrK!X!$Mz`fSRfEhOwep=02kc9ubH?&lYkzvKkMq_!~UG!K6=Ym z63KzWm(Ydg7B+(k`V6633M5cnK|+mu?_+6cxqttDXJ>fB!hdxZ9+#dT9Z1wy>POf3c~5abDF2o(tzU6Br@8kuYrZozuZThdLPUHaIt_B_-%wYdxR-3i$^w zGhR8-Wbo`gR0Vk%9T7M@+k#WmIu&j)-3!kkI)d^?$%j2UA8#InolD=Lt2CC}iBn!l zNr!Oq)F~vRLWlszyz7JV^70P{20%@#ent^o#;@aZhMj{+;m6vi_B;6#@C>?~H*B38 z9UUDRiBNvh))w~6YX-O&9vBP`(`1j}4^i)2O_veQhJ0rCREKr^KSvmt-1S9b(9$VZsOlL9QhniiE`f{`mY_ zp>60~#oy<-rPe|+vRAknwYAFEHB1{7Kt~T(O=ySx1q~KkhOsziDZ0BOGz?JTq{V*u zY*aA+^(PL9v45(c!924@-Y+5ILGHSv-S?t>+ROes31SCim3Hi;5~)O65euv0HjZ8` zp8FORhH2{64G*2}rW)Ca$X3KTEXH5Z=5g)oEj2Hy%2cuVJ~9qp|S^{su1;)(TqaH+U$>_C|@0 z7Yl7Nd^hthBxoRcjS#jvAHTz25LvOXyM$(c;qpEc>Bz8=g|$mb@SE_Ss$YW#1J)ul zyCACi@VH>)Tq5xUn%%YmRbLTl; z9=w(y8B$W{ZPq@fx*}nQrcea89U?^7wTw3f-9g)M@+91bKs*xIvIW}!*2tEvTWP${ z7+JC(I&ipAW!=2_yzbOZ0P|-*N{*z#T>#@KyjsMb{|tUSwx4!LgWnQO<`TT-gp~$& zoR_T(hTG2F+HtH=Sxv3s;?FbM#QC-Q?uFq`Ga8Q&=F43REiZHwQ2K)wg;kCaI=DQ! zDbp?m9&V0U$7dIL%(!V`vVB!=K7L2P2%oR>=g)&O`)KJfw<{C`X-1t(A1^{HopJ5j zxs`(SUm@@Z-+Q;Y`OR7|Y{uX-4xhrrdbRZaIR?1Ub&wbuaN1)@v6?dxZV^OG3QwOo zqXKu9{9!;?zN$2#0^A4L(IK+4gR8R_1s426V7`H80S8r8{}%>uON7gU*{Nu$$~$*( zPSEPD82x;llc-z`lc2?IZicJ}+Y}K0S}PC1t#lTw@2ZN(Wr5XND_Z|dImVZgdS&8L zObQWaYa9;yoZAIYe-xQbKmPH<)Fk2|@6&y9LoKZc4Z6!*n~L6G^xZce=J!F|*XAv% z2h6zjh^mPSCbO0@ys^1XHIm%##%ss_{_0xU{P0m0>A?8yHJTdXnU6eqvQtTk^K!Q~P9~(j4uE-wUzQsaH5TCGBY(r> zIVAURUt$WM3*Y(+W;g#prjJxlxGj*)keL1s1j43i5U3Xx7V5<~VF9v4Taz5h~tzIfO_XH)HH)5%jIzUI0E>7zZu(vcd37q*+w1%1j_H0N;2lWIv zElQ)2Km=2py1jq%=7p*c=$N=R9T67?wM5jnjmQB*feN4;dymKt5ci~hqNc?@*Wsj? zy2j@W+Z7}{!W8&=;LMHLz8rG+)O?g?_Uf)@*0`rCo-~Baj(uyhL zbJ#!s6OiLZf_i~?z|H;>#Q*xiaIT$2Eg>$;JqF$dVSfHK>9D8eQN9`7V-r zC@y4Jz?h&N#*-&vV6pnEbN=e1B}HA*?@0xb_Ib8f8(eoC<)h0jeiHcQ{PWx+|3V!> zIp(6L5gB4i=(f;dOzhDxJDaxZI;wAYW%QZX8MOlgwn^I~>f)lj8pJttZ6vBnIrYg# zjFttIh0&@WRl^?Mv#loLT*;O;SJn8CY{yanHb5U6nrZat5d{!;+c zCN=O5cmy08vAX_(yA>5N$7N}n{`2C>q1#VZ(7+go)6dZ4cbMkq#`C<~O{p{x_y7GP zFlIZ1oEE;Q9dX1te8yVkIXT`4m4t66DnMbQQ8s+f3FDGRJc z1rkxn^2m`x#>P|4XSwbr;t7?PCldWJeWqD&L9+Ad6DlEiXhyWpVaq}#t0j!AdT8Q3 z@7%izVN8SI#KYVlxHcr6L-qUi3oIXCsdoH0dYw4x4Y_`ti8S4bheso(-Eh%$ATjhR zi!h2>do`ec5)c64f#mL0{R|T{mrq8eY?9|h*BV{9H8SGJG>csi&pX&V~ z3^`Z#AC_-UA37T9#Lb)KqGU(_E&$5$e;K^Y8z7&(o|Oe87EM}}91KH1)=;})f*mhG zA8#8Xr@>5L7VJr0>2a{XGid6F=D{G0|jG{a(FAe zF%_qux>eJTXXvkJGJI4M>NmRlv|fW$E5yf_d_+gAgo>LX#UvYr~rexeLZBIKsF804oI>FxX;(-HvZRf4|^<3RZ9k;@bx^ zRM=pmqy1N5ELFhH&YqZ%ARR~ZvhtqbW@Ea8eoR#r##>NuXqP1?HKKS&=DS#O4~F2d zcS(AHv}07318|!Q-=s&HBdLqbWjU`dWd3t(k-i)@P8)>Vw zF2(J$mctP2Ei#T<9ehy`@;`ym8IC1LVBM9`j)07VlPGZk&GF7Xdt?c1u-Zb;1RFa1 zTZP`cxYy<758r=9@rX)2KphQU>4z)5w;nC&F6b*|lG{q`6#hr#m_(ctRH7rs z3Tj|56aN5PH6)zN)xFy#2u%s7WJr)@^bM_?ly~A(p7m;4!@ykMMd# z^sZ0ZrftuMH$poyw0`49g(;h!zca&2IbQ|FIB|Y~3@Su?ci}@;;(5B?rI>Fmyt~AK z&6=24DB~!2$R*ET!!^t(!l}1UfL}1tDtt1t*Sae1%C+FcRVK5SLBxO^d^b-1-k>QFG_Bm8rmG8zh7epV+wFN zmb2vgu`r-&^T!|}R#M9Sk!Ug@?kaAq)C^Dyghg&`(NX<*Ka{<-q6K7P;9 z)$QUhJKnPuSTV-?0rJ|LyZr=JHic{_@MG?B_X7G6=sa7om12tpECR7D^E}~zj!y@gm~D8TW&oJ-ZyaGK`+X4 z=IxnnR}5WUO{Db$S|ZqZ+V-5h>no`*ffBiidX6r5=*6?KivI)3m{tM68pI<0LR% z&^#`AMO)w%`W)D7?aUlN1KrWsQ|fqCHI@5J6HVX`8}c-xML36Vq8_?$TJaym{5FuYN%Q>A!3{w|>x8GVGZdXXMjxIwb0^&1L zrH&mtNYLJ~S3PuC^3onxyeg}^dG+8+x$&j3RY`4SB}ZZuLM{Z^J%9gQ3ltf;~TcJ=Ts6cUm#kAl6pKKdjZW_S^b?FU_0M>3z+Ph7!qD6AsntlvG*8+eP{w zrlf7FZaW{v<|T6l>%_<$a5dbu)^*fp8xtTx!p&`zYXff8?)6Y<(=4>@KffXw-!tg3AV^D-|+D=9wbgE1pDDjNhwT(OR5m29x%=Wt_0WM6X(udTl!vdP{V(NrQ{Ls^(SmR{`o=u^l}qzqwPDZF}MVemv!DMzWdzYG8X0Ho8r7m8) z_w;on_r|gm&>#?}W5yw8jMfweV<<>qcjU1nDd3v19Up&Ew9UKkuy~5G)<1LD&md`+@`Myqh-~9@8x-3M3qUCFtW_+iO94_JW`arN`GjOVsK`gh!GOX zBc&)iIqhA-LWxGMi3*8|iAqKmZKQ=5|ifvNX>)lQ*jQenE!rz<0 z_eMq9$;NBL>Mzy$tKNM535P$5zOynvb{k41&D8ef$ymiPOyA{r75!LmY%xfNB`&PJ zVUQ;x$d1k3POXC6mPQx9g4`6)Mtm7C#^*$Q2eqs$av!fhm+yfO-!B+!3w@y7jwJaP zXPS_g^H+t$hAEi%#^m`>yRBd8vmQItqOw!q#n2v^BnBzUs;Y3G%!cg#RLIBczFzbP z_Mc5Cr+m~4k|1oqFpGdo0K%~ASY1_!cmiV=h8MHqg$?r@I;hhA7NV5CP~CVbPan$PPj*elD!7!i&*>4`zk-xrXkRCd-j12h7!StCV&Svp4fSiZSME zaOET27F$(}lHc%%3bY72^NWXo1X1*3j`#F+r>{eowT95{Ok)D$u;BV)ArZ#M9hk@E z508(I^2CzG4I%%;ZK-&2X`?>!)SFA$m>7g6O$v9W_roP4h6#)MGU!G7c%Tf2eg_bY zQ9%`45=%xWhK5Wrn~EiK>t$wT(SmL!B+<+z3aYh{FmlG`29(4BKG|>HWP!Q&ynidSwaoBrzwk}L zu4zbz=?TIZ&I~?!blvzi=4Vh6nM#Snn%L43)jz(3i2!L({!l8>k!wv`(Hg*4Ws1_A6SmWgS3O@WynP;nGutRjUFNFOOj*PNm}Te1pc|bjtC&0CScftt$snFxg-L7clq|FD(Nzd&_>Ro&16-myYl+cv~n)CUiO_vA>(S z_Y-DuHgOqGJUJh-YnMa` zYg^rgk8c}Fs+3B2E1RrVT}pBSyYA;Zln6dhrXMhKBa+0(B2`p>RxSdEYBuM?)H~co zeOzh9sm>!gO1d^L`4)mLXDyBRy0JMX9vPO*BT?-1-4EkikF`s4D=n>kI2Qzq z@Z-aP4ReCnPA8~l(~Qf!&x4V4_wEdy7R=tA}Vk^-CSf(VP~ngda_b8=r-9D zw4-a1Q)j4z?XQ|)iYB~Yy;16Uc(A$!SESv2=7k4_$wjH;#!E{I8A~AIs^6HYK5@B! zF|1hVkKOh25&bNmC#~h8^i6|zw1==P#4DUU2`cYuUiIW#?01nhJYV^5uK?2dX7YBt zl40Z92x72m?gRd?4JD(jhZ`|%dNbYh6)zNq>e^#k&PMe&hGq6)#%ELj54v;rirVv| z!-!$pR+z4U@}uyYDfzI~Z7D||-hi!hzV#&~p7?E;VjxxtOU3sVK3WogYXsnUWOm~A z+sOw3YsLjqUM(-XV=RW|9~yK(@|bV~s-=Z{$w5i863}J?c$+W#*Q!1i4`vv6FM<7M zl!5RzG&6G_`@$_f-(P0W&otPdF~Js6x@d_Vuuu)CU#O>OE=^}7eV-{$^TPHr*nT9bLS zQ&cJ|hf3+Aa7J<(3ZJyG%2duavL!1nD(o?~FuTQSHWg-OTBM`a7Tgxx$CYfJm`|U^ zBe|qjFi^r{DNmv_PZ#q>idu5p982o+$u+GYZOo#sMkK{)D|fJF=6bnlTu(Gi@tA!> z;VQ1w89AyyUvZH=QU|W*v~WVb_)Zk&sP=G!Fk%734s0UBq>yF+0?;LK0aRP(O49A8 zEo4SVD^)@Lf!%xeZtwR;Btlys67tm4dOvDR9Y%A5;xS7PV;r=g2rK{s!F*9}*%b84 zNSz4{q43sA!(P51o#JhU!(QgE_>+#6UV#<~0n zc@H%-Gyo9#7SRUv{U6ZY!Atq(pc}^(%%kAsgcJ|hEAAIf#&BO(C^n4JzlhBN^N4q^ zUtiD8rlGR1104pjJGA{Wg@R)Ok8lQ_j5i))(ZLo{w+zzWHAgqee4um`j8sVPd=LztK2o@r{r zZ>z@4IzuIO&<*TMCj}C^`F{nXzKw8#SPla5%3YY)QZF}X<>2RMR#H5l9+8Be2UJvT zBCLt3A8DRPFdPmuou2+34>Z)(CuU|eRaBU?cNOh1X9HayJPPzJm>MJWhMV7eg?Nf06Fe#R-aFI3Jdi7HnS0Kou zS2XO{au&NTD_p>M47(%D;o3TP;(VE&xI-a4XYv-U}yG5hYZF#Ukq zQa<}-#&6Rsje(PiKksearxz^HSF*?3vXS}tn#%pfY1KQFGVj$UUJ#?6D;R{o(!3C~ zi9+Dy(M#KTK|27MmW=w2F61c;ca4BvCFEL*YHp+$U|}Vr)^Q zMc5xZuv2d~EzUxmep`GL{m#V<5edKK3x<{a##K|MX5ku@nQD?UJSNE`j#x#rRJQ{K zMRF&kISB8|V)Wa1f+e578V-+APgTc8qC$G&R-LBp|E#i>%adw*#QQ^Q**14xcQaphEom~QP08p9sc3`l2<^6;YU08~8hPTIw5bxtWdvvHhBfON zS4#q4&HNcW#l$$t-^0pa=bc#lx;|}g@-NX`p2Pi00bM8p&pVJ9*&ZX??p=P(% z?-7mA@(H(G@4ZS<6g*TqH=z~yDM~BjhEc()%7}&HBG0i_=#u1H-7^uvtV$Rq8=z9PRqWnY5&-BO1;Ro_}ZGNU`$FiCe z_7vPLwn!b}FTr$kpDH-q`(@-syk<-h z%wEb>h}Mx2WZ&7PFtORnnkb#b6Xa?HYod3;!hNX$|OQWn|`D@3X}YpbU)9>re9A&{Mq*E`ZE;V5g^r8Slq zv!UXm;`cR@%B%JVO(;o(O*-P$9KS@I=sve~5p`BaqQ8O)qsJIksH7@1Q*3iOw?a5h z^i>`KF^U4}daY}-H)AL0J?LlK2`NK;8(x;K{HQn!TVbKg;f-kJFrQE&ow_50h>uxLyT=G}T zUV?2y$YmmHV;`1y_7eQy_Y<@OWp6%eZ(-vKa+rv2n8k$OXk z{5{p&;67AJ7#LVEpbt8nzlD9j`VD#Bcnn;o)5h7p6*yK;`v6-<&L4(MAGbRepW9#e zOCUz}*vivm2k7td?heu2RPiNrinYgxk9T*^4I{z#+@~a4Qq2=(Ze?+>iJk~B4L`Uz zNLfwwqcqK6>7D`(?-y*T1CR*iGM zo%c6J66DKvi_a=Ab{=KEZ+mQ)#Jl@aRsqfH)YsjY9b#E+qOJ0;q0SNcY;J|%dE}B` z#u%}PL>!6D;mj@;G-Gj;v1Acp7mzW@GOB<2h{-jTBe;N5hcsu=rf9^+VbR8+BXyY3 zCO2*%gG#iKG!~)s8cSFdWErvCZOy@SQRmb&0|@NwTY?B_hk3fp`dCsoOPzY5n#h@0 z7{QsQ>Z#}75*@2^{xY($wq3zxpU8w< z%Bt+TLY?O~&I-_eQfk;?DG7>cn(1v~1Kq{D&1dw^mGy1v_KPs>A~*{=8(Z@A&8V*% z!{9CPJj0EDf8+f*lLGCDpGSg(QiAL`i)o*xglFQ#_R@X(l1UHdP6uH2s{4PzzURJ$ z?_z9Ei5%lI_y1aFh;LT+i5xwB*{tH2_p{oupU)|~2iA{1Rm8eXj09 zd^HLd=~}dVnZ3?u)Wuch&db8!LYDg7caEHT|39B*GWE3}`mw_PBn zB4s^ZJrF^QdP}$p8DfX`i#2@g7YD^1nWl z`V7|)OU3{Gi-6_eLt5Kf{y+aPcVTbn`C;1nOZ=+Jt(Pm?a*E_!clN=TyS110J^eE( zM`!gno7m=eF7Xh4co4H-_dUnR@3FF@+e1GmEvWu#pi(IqUB4gcdtp)uign1Yf7iv$ zz5m_N_o`ZCju0~=KIghkg8w+>d|`4se2HT~7YaE_PKkOCo)y^5 z@rP__xqW+&pWvg9?`wu{hdjU=sLTA{gJ@o`F5x_1xQ=h;j+uLcS$|dY4{vNtJ8N|J ze_F`b?Vb$FlZqfF)ZX{jY-oI3B2oCR^;p9g)9Vdk{|{4V9*t$&et!u`6hcU*&}|-) zDVahMGLwXagiI-vA)+#8jFh+~b26nOQz27GLgpk%WlDw&-+lMIzqNk-@vQfGS3T8r zo!5CD=W*=)*?0!S&i_4&UzEcf*9^2rtQwByzZxvbd$C$>HAiMzYE4$ONcxYQz9n!* zAY`=RBva`iquVzM0~2Q93_W#{HF$jZzh~#ul(C(%yhW5d{Ilpt;9r$Hh2*DhY~TH0 zsIWdYCMLigpRAE%;_2C*p8U>zTk^R&7TE7r%O0uqJ`t8ldO^xR|NEm1dsOwO(ojiw zYhPy&BqyXg@+Zg!whjotThsYW*Q6TbefgWuUX|1*B4~h)T3-}>nb}cCPM{7Zge!Jr zCKt%NkiNHD(cbL;R&&$g=$*7lu=)QU`rsjbB55lx3&e(> z$Dtmmo|T{%)74ewNcw1fH9-SG1LpeVde%&i z{o!h1^$dxUnqfgx-R}Yw8LsD?*%f*j&xk2PgWl%(*)47Z&MF2>#&L%Zf2*v>s<`PI zoJD#}*E!j-B|)#kn0TJ1gGt+1Q!deyX2PT;HzeLZC9{o>#x%amMQT>DNJ>c3f+x6T zugNgMD0aI**XMLiXRQgQVS<6dXP=ZkcJ*lBNvcs8WN~CDPEe@%YRZM`hmAA8Z*NWrI z?}3yPx)tCGm}r8z6SVo$CUpgj5M^N}63$!wZ=en!InbnS4k*wx`7I5Ya5ZU_YVy#` zl#EB4l?5|4X?A`sUW|V#ULF_IGK5zGStuChanmpNH7VWPH|ARnF3hu+<>n$G^jdLn zv3^gtzO_@0+Ka>Sytyt>I_#Fr_dkEkFVbXPkS)`Ck$?K)44uJ;`%m24GmSE#;1f#p zd=W{9yT+%Qiov`Am+Z%WLG&;G;mwh&AbGZ6@3-BJ40r5LF=>2zGKYdn!vG-p4vd7~ z+ZNk6EB`5uA*sd8>j+ti+We{Q78um^2!#_zX22?%^7`aj0mkbF=|?~n?&=c@zNeBX zRV7k%IGT_MUWG^RPzp9K!WK0QTx14FG3M~!)&^Lcm;gqVCGfCgFD(^^q$)j=Mja2# zd?EBzBdETP{rYvP8_UJE{LNM*ucq#!P&Gd?xK}n;tn_NHTG78l`bp4!As%%eMV=6b zJjUq#Li`*}9*So%NRwzWPMj6u51}t@pmxd@3O7s=k~)b|g+Sswkuc9;uQMU9?VG`y zI6qa@d2cRyWU&moc_T3_2I+C4Hal3p`K{q|VWKp4B8(nD~%S5}ZY zieW;L|4(O#*)SVp41<9!z8NX)cr0Cx_a8ifFAQ}l+CmPc{EXWn=_~EWkQ;{023yrN zr*aGXQ%Uyyt`$&gsPP#L&<^vi`f9lqHNo{>WPU2()hhguERKpm`txh)95Y z+ugGC%X!X~aSB%e@izKP@j$NsoyXM6gjHrPNH|n^x7_-W7bAW9D$wqw; zDA&wIxk+H8Y<~3UYfRcCSeYoGoZkFYv<`2-AKIS?nLar)QnQKnAQYx(P`JpP8^Npy ziJb!RuuqhT?1|8*9E$b}+PRNxIZ~$KSSgEj`^91H%f<^TR!0UR>3Ox{J`yrQ)7~x* zF8ZIMyO>(cX3O(@ zo?qa%D9F$M+hD!cfXF#?{>()LT0ufaUkyQR#zKPOhJfm}PTbiT_pOEuYyru+@4LF@ z`VmY7*NAxaGO@unBLNS&v>%9C%=Dm)BrqYc_fY~AYEZMf%Ngb}*$v0>@sxv(T^El1 z+}rl@)g4Rw-j6uHf@^etR_I?!UnpUoS43CP{a5omplmY65X>-5Dmq7Kj9}nfPi>Uo z7cLPxDHl6VXtH~uLOtd?Y{wvIg5G0>J~sza2wC=9XWVZQ(y@<})ZUI=E+JQnCt;jI z6I(V0YxE{siL4nRX3d2W5|NUbUB{`XzI~JP`i8jyd|dS~whP2#6ofL8NdvwoW#uA* zHe{M2Ea)^r6>lsA2brG|{!iSU#O@+Y8=avP9b)WBlO9X416riKt7j0w!-<7=fYCkD z!2^K)JGuG$BqovS)c6BJp@&$UpMP9rV2!K0kNF4NIlKmp&*6G77Rs=|ql49w5Z-JT zXLzsOf$f}P2d>7d^k~5=JkTsb$R1j&NJvlu_z2_ql=Er$bD;yI3a}5_agZ&GoWU7V z<|1<%8z)`1xd@tLKgWEPQrodv!?k(v;P~RznST4s@u6LgG{ZU`<;gRmrp{)6doDaP zT=qUxS$+Pc|Ff2YGoI}m9L-tivvA!@krJX7%1m&t z()M}GZro^>V%W%V)p?PDuM?s%i0{CeVGMIY3h#emVO|EJfH>uW*h{0Lr64#Bk@Za#|)a@z!Q?TK~la~Y5&!$ zS0UL#2!Uugc7Qz(eLjcbF{=^R%mNq9Fwum0EH^tX*tKPRP7#^wnD~>z)uAbVL}3TFMX}HWH*+d;jQ@jA(#w9h**u zKI8{WzutGvb(5*mOP7SN^5xv?cWK;fdiRpsYa6rOHid&Ux=K70n!|W-dJ#Gv zjH+5o2K)P05HSmj${HHsdb+yIG?Wzs?W`w|YHIERF-xoUMhPJtGU(Mr>y0|b9u8TmcDCq zO_=LQ9Xz-&dSe$tYt2PI4h>;Of{Z=*0=8?#;k~8dU19(3&OT{f?Y9E!-|>MkB9yur zPF>rdMtdK;uXn(Ui}2;M9uvjcLViMgvrP~H;p1|a-|e#E)tV~lln>{3JotKZMwKfT zYx+=5z6&McY@|Lg928r{1+x+uT3C;PQ6bcH*CeArsxdhyoV+8~IQKYnmip^pX0k10 zWLoN~#+D2eM#a2yG?MJTk8>J`Zx*WBolK1zyWs9F!9??FbA1L(MKt|06O?dNBb)FG_F70*fNE3KFu)0OR%2)V40 zm5~Wp%(ot@a2r9c=oHvI1SV3_`qJNjrbgJr08tSEz+q`-1Z`C$3U97ndiZw`O2~lk zA98&Z12AhFSuGp^h!1B!JVp?Qf-@LS1j88WL%nRM@&kYN23*9kiVp`aNkl$wE{F%r zMFegx1#(eS0F?1B2MQ<5(pRKJ=92lDD^y!Fb4{mLtaZQ2Ui|d?lJe4}e8HE`jyY4dAiIF1*<@j1nMIe= zIF4USik0?eAM^R)~v>A7I>Wz;uK&=JnX9FXx#`OuUgQa}6vb6l?G(!eE!sF}ZJNllWS_ zxZ?cV{TMP%d0ic;_D7Oc$L3lG5NkLi(Pg%Va}ox<=dmTe`H}WX zCB0?(GT;}s#m@mM&TM7Y$Z&9yyho9*mB@Ur<1T-gM`YrA-U*-R%mju;xySPy6LKxN zQudMh`0pf`$rJN9#*$l%(*}8|67BnKi@m(P4?lQ^O%TU=2H!P^LXcOz5597kqXSp7 z199^ST<;C^$4QBq2+vpKs@@=FqM$_uPSjf6jcvy?HGR?$NJUy8fj|0+Nk8M{kwv68 z^&63k<%IPr4hcU|w>yflU1^mwBTHl!2RBH05SvXvCPAcUibO88;eoC8&xiHWU z{96%t4YV%^RX`kaiR|`=F)0fZ%JQ^)BgXfprN7y7h9X^{Cu0QgElZb@dwQ z{dxy3dE>JLr9=`cxv8T#WZ>DYUPfRkKD>*rt{V?VR`%75fP3^Ww9U}u5Xa7GL$Q7N zTP$urr~mm_Gt+>c!r0ZU^!b31DSboFnQ|2rHe%b?X478WE&5tfl*&}#!t>dp@b^V& zc8G|TP>t90&rP>0n!ZN${-68i7MBMr9o5$FZTG0x=n^k|NUtp(a$UMfx0gvn{>l$? zpd#S#gnJjUqfg=Rl9jzBM*CI)z{MsHhf;aWrEb(g4R_$7-}|3e_HQ!7bz}94rb*<{ z-r3;E6?I+=vR_>2evEcIY4K)=wATD_uK9z=TzV=C4731FOEbsUzmbX80ruS*snp(m zQqkb_Y3I^@)XN)9o6B6*$XA4p1=|nwL9h>pCedIn9!`80aJi}#K75IS)B=K$1o=f# zHRo~*11`)dzTNMATN>@n^FQnfRf6A$gzs%eUj1l8O~H(i=14QaCTg>`$PU64ZT8E!sH4nB(b}yO641U-aFm6Yb|)Z7k4zWDtdOlz5dhh z#>GX8SHYl3NjdzSE(`1zx|8^6=6jd@aajuTAc#0L4DdZ#pFS-dZmX*sRcA9QM{+xe znJPkI0d57v@s``6Ox%_q3^5alyGM0ni~nw_8>$O;W!R%YL%-Jb>64Jwd)VP1wxU#( zgM0)wW>}6Fd(3(ZPs2osJrtJ7tL3Y!i+cj+_QdidNxTLZ zpa*&f?m-uHFj+$9E9nA99&ksZwevT3II)0#=-4i0<8GT8I2O%C6gZ-qi@?Z9n_zwoT|f;~{U?Pvef?iC21Um5knjx4UhRm;8gpt#x|X1teHo8merh zKbD(2_FR2uvX5;qUsaorRZ@7C+x1mrX zg(~$w8({a%NX^WqaR!YpJ1L~PVb@02#^>QD7a6TMTwZ#oUx7s+)#9$%FuvOg7cHa* z`@R}B76SZ3Je=6$1Tz9^JjlCIs>ku2d3Dt!X#y%T119iifDW7RL=A}#2l2RY7GV?@ zs&*EeFe+^+3*U?`G_G_kYEs^1(4xbJBH1KL5qTKeukn=?d&VUjCKg@-EBtLmh=ZR~<^i$()U=EXB@C zv0eNc-{?~;?woRtKVGX%?dV+!WU76=dT>i)wex)r3S=T8HO!r330pp_EHO>pkhz^c zeHy`}6P^eH80ak32i2!za@)3Tut%Cg#V#Pw*x1OV5p?cg!QZzn?vGJAiLhuGK<0+= zy))ox0HJJ!pAoY~iH;b}%ompL#@rpp0{(Hof>>-kJ?C-U`GG6~5&9S$$v@CR>BY$i z1>g*PuRFI1w7nQ|^*_=z=SuYpH||$fZuk?SOwrY)OG~WqQx*%*Ij?VmfLM|s`ATKe z=_lib|MjJxr|Ji`d292lPb9an3MZa`=Siel=zzpK?t|6EnXN+~5)ZD}HR!X*HS6;@ z2se35dA=X`klb=!UBFY|gvi~4$MgC}N&>R8pJcpfJcsB$#U>QDvl9n%SHe8`r=`s0 zUcCK4!xM6Vqr*6l+vQBR_<6iY*romjrw?B0I92!&i)&=#=g6-gKNO*}h5x^3t)=Mt z)*6(;lX5$iIuhQy%dHi<`A10p>52)Erl&@9dh~eN{0HPGY0@AJ7<9T?1QP_cd|mLB z6NPFS#V_P&Q2U`E0^x;2$xkl!`0+T3k7tAu#VnuC;?@1cBb=Wg86?%dA^*JwH!sM4 zPmipA1o;?3{ta9J>rL;`Lt6olCJe)ipn@Rwc?0U+f{w|*6V@9O_-#-r8)fU^^7c>x z_!975UZReMmJi9}JKz)Fcl|$-80o4R_-iuY*Ak%V&`55~?%JIF(j1QiKX9AUYdm=E zmzV3W?RF33$@dXdIH!7j%pXFm`+c?DW#PO|k;wkKa^)lF|9m@w$;Jsqy?diH_wC&F zqg&DlT?-gG9AkXbWLaq~wo~>Ky)8^~!lLRX%SW93SjD08q8XLA+LNQ?%BC%7-0o$c zAp8BHKzuX8%oRC5bl8K>)Ji0%eJwmhM;v2&7&d5>Wr)rWuDuXBlO*w)nSpCffiM(r z=YgPh^X)OE5*)qf(|oD!?R@jA^BJN{A9gGuD-ADkqYyYgseEH0d#Mx^ZV6Z-1;cx% zVdm;`^nw9Q>7jUv4rbMe0rN*S)j&}Wox9W4TTzwEHt6zLSNwax`wyfyq!@Ygx>3{;%x2KhbwL8VU0p= zA`c0cH}u+i?B2;NLy0g&-}x^q3zIkmT-Olsv-w_p{XKvQ8>r_3934@bJ72x3Kw|Q4 zf3!&%`Jy-eq1Cr3*-j3v1VurbOt~2 zOpqK-7Bn+{$306vF4yIBE+m2Zv0;}%cjJH#-@|N<;>zHC_vJtT5s$PIVIEh{pi-lZ zzMY^IGKZ=58DX6#Po50d1O`g8AMyB1!52K{?gQ{84qDisSL^pw&rY2TTvgtj+^j;u zb?A^i;F6pjIHrKs{WvnRIW!ZnNAefUPb4HuQSWIZqZ{&wjE^!5Pxi4zqTC}=cLCqr z+t~fhb|r;{?c;NiQBkk{d~$|ItY&?nhK_jxE(!SP9i&olzCl7vkUxC*FXZWtFoWI zK6HuLk8yjjciTzXm-fRa7UTD2KZ=6DSRDa;tCl0MnVZ$D_K*ty7R2V9v{9DdpC(Pn(>ueM}?}3A`IJsT414 z3ueEDs|bg%Qhs+X$7XLSlalt9(R7sUpu74gp~Ftk9#g=|%MEek&*4MMfP(V%S<#ul zSX{4A*>lG9e)s@~HTD;Ei4Wm|I#RHFobgBvSu?A_unX z_f2qt%ge8X;)04!KRT-<9dF`}Jz{IaGwW6aCWXKaKbh2?jm`;AtvHa8K>|QjG1}!) zDQl#21>?)|va*EM3D`pL-9WaH@o4MT)N5XJQ$A*&>Edj__4Cb2)Z*7NWTHHnmD%+T zLlaE$V4i?HSKRXX^X!mKm;p+54a@cKE zqydVDYMy$+a|Jxh&85wa5$!A~Y3Y#9ir)z5Fh@e@2PvNTC2BvRfn>FiHzT-?Z`Jqi zqXQSjg9C6Je(L%!UmmqifbNLYtqQdCk7jh@FA#uR{wrf4l*FXVIi&K9nexBh>HB zdF8*S%E(kM<1Tck0}K^fM3#anV3$r-!CUEb!(yCz-8|VDfz4e2G z1u}+=H7_P2Irh2jO32|b+Rh_1VGNU9PJ+8mmilE2-N<6UQ!?g1G%LM%lD@XR`x)cc z*YhI3_B6kit-2(8lwt<1Y8--h5$u_3E+X~V=f2q6{gj!4)`T#J{6{q5+Cme=CZU%r zpVvB5#?E!H(J;i{FP+cRcFZttHlyAjlKDGH$dRNezVmtv(og`K9i>-E*8fwpjhlZ) zHcn%up!p4i>C%t>cpZVwdGXD8v4IWd6uV^rUI>z?#Zp)ICi13rolYRutHWZfTi6g8|)( z(UuNZ1lNiIM`>Fb#y_B^saz9mMS-l=?e-5j1kZ_L2Y#oT5oNRx$c{YhIJ$+CmI|Y5 zKWqFWZJngP@GEqW8WUos*s|a5Y`j1?FGVqGWVntXaDJeN^#og5TYEbU$TuP}-XxhR zro2eA0bun40+i5zsq%qt9~?B2LlcV$HwaGz)$=jJTVAf3faIBvRo#r=dYDm0TN0Q| zubIZ0w6}3I`F}n5aOM5o>PIP;;lW39`QPILp^{pn>VaftDm{7mL04&}=0n}$8V2b< zI!gkUYb>JnrIE++Ay?f;(N&s#j->MJL2DGxN>vpmZ}1 z!!Wpa8utF{o^ zlcq_#=NLb7{nHFZdvh=+&R22oZZwF^z2CC8UFPm139CZmYyNS3b|r%7QXT~JF>XRz zHSVHj4^Oyers%f?WJNqR%pve+5AZTn*RxS%9!V9>@r-3J_+?Yr|Lc+G&1T9(2_n(% z&75M#NB#b~PRi{T`8^oc%11-n0DOV5kUw_c<<475Wr3Rk8V2w1&e8V6-4R3uJ&l4i z@Ddd{eY8!4nAaG|^%5Fj%NJ=)f9@Fh`|mny_;m*hkvGSAgu_2ysT}KpDx!eU0I|zOX4+j2=LB!;?22Eqi#m0zJudC5>j7^@sMGPw z;&$lAtMQN~p3RR2ernpad2pyFg1oSCx{q@`Xg#gr`@Fc->p9BpuC!ZjQuWO&DWgV( zmxMD0j#Ai3K}>>mL?{tfcet@oAar(iVgQB98*KfOT8=0I(L=nPNGc_8aBZ$V+$>!k zsAE+vof$ANuiM+WkLM+C2s9z3{Z(kHA^Cj7CX%N=f|)S6LQ%e7stWAIs3nfyzS= z=5rW@g1K=?z*wJLuBzy%aqxw~8wazX7o^~9NxrE(i)43m{qO=CcE5(iF@l9N#$PT{ner@>2>Si?=q)p>b zf~D48o8Ajz8xu+lZ~rBoLK!xnVi_jeZ=vuq-)WjsuW(LYKKevv_o`P`&c}`Mn zlX7~o!q|-psZuq(k~K_BC^K{Q<4UC57AS>j!j2KOWm@KNg~^-Ud@Q|1H#5QdguwMJ z$v9C`+tKoXz$CqM%IjYHR~+`1)qe7;M#yo$ZS$8}S}Dz*os zw+y*$vc&slAC7v~tz%MaHlq};7pj`ZRhPIqiG;_P2&(gD&P>HLqKUB;f>Wwu9D)8}TG{!4dStJfUiav%-0G?vKHB zV2QxI>r@iP3lL^g-AH(^mH|pox@FIt)oZ7P15srAQ*TVOEjD|;&=EYu9tHm^ssEU) zokf~(pht-eMKoL59nb<>dePwzTLRWY&JtJPnn!B;A53|QKxD$c9HYFk46+P-&_^x* zSnx1iS769W{CiDh*k(JG1{Dv*qjxScq{Y)4SvmU*S9;tSqa!2lnEbd~u&g%JD8>Ge z?4$_&2Nmw?<>cQPwR3x%H01Zx)6bsfkj_zvjqI*wpQid&271+DUXr+Dv=ZYWUEOw+ zYnLz$WV(eNLMo*oH}{mNP0+UL23x!zT!QF>7wJm&ok}t>30+`e;VNliv^<$JHY{55sWyN}cz*;%oj31oZpC-#ztS9$WvHL4%3b7e$8cm+o=*84aA&VkXH z!~d^^tj+qEOjud$;<=FhRkaLi)Z+Of=4X0~&&KzUpA?StU=k}r&?J*@%kBO)yaf#d z9Zdt19v2y5>fjy+X2IrcTN%{^`~Gxo&4^^?6|XFqBkGf}hw=+`%yDFudA7E9bGOc8 ze(g|!FFd;&$LGIr_}gpxdsXFu2&$V|y2Np}-C=Acl8Q(DGJFiGFOtYKAK~Nhni!ta&?utWtosCL)5QPvPWhmV-n}mo46iUGT5ulUb!%j^Bx-N(#xQLL-bF^WA)Xvn&%ll4h zY++baGr~nn1vVvM&m_Ls*?i$qQ+KYd$2cgW$l|$rPdNW9zc*-R0Jx6`bSSD)&fGY#6yA}gRy1DVB(7b*1Qb>w0eidznm)Aj(##<_Rz(GyH7bG~jC zPmuo&Lk%{4Oj$S;ymDT>^7r*Uwe;cn%>NXo>=4_~hk7ReK7nFRpU6&;)}ry)J!Fzr z;MmhA&1M4}%_j5q{E4EI8YXd%;_e}(yx-;H_}rVM*C-fYzWiiEFV*aqWhgztpJf<* z?Dd9<$ul)t!w)valZ>s2mWE%Fc@votjYHq!@omnOxjv!1ksHTW-@}#?$dHI#gsd{S z{Ps?T(P;g1P@+*2dmIVF$76ldD*9c*iPv`>J-iRt;8@WWKhD+j@coBIP(1CO)_4O- zu09J~>5eTLN47cS%|0|X=^1mcb;vXq!L1t#oGX@9(e41& zMoSOY^4wfepg6Ij?LzVwZ!P_#cTdpQ?vFWKnia3L2p$^$*rdn<>K}n?1Dbat-6n-UNxbS$e zfy7~d!G=3=^21JS4XzG9CRJHZ&naqdEXd*XpZCnT*N37z26 zV7YQTPye0R$(XEjtpYD>>FH=d;w0+Gc$VZ5BIhFqc^lQHEns>jV^ugpVRyS@)($@E zKAFm)Cp{<2)S^sfNY?I!FxEXLd$i)vs3EuX=~Jn`JrrWhI6}N^;KY8s@S*-;5nM24 zdf7cxWw@U-?r1yk=4)NTZOJ6P?AX^g-!MqI{M0HU(9~Ny${FO>?Fo8m^OR0otKWqs zy5DiKJ5rK|voiApWeC?NH=We$p&f_MFnyNWdC*M5K>c}uS8@n3K22^+u|77+x8&iP z_gLlQbB<><0CIfV9|C2v{%4Fep=Sg9;|V&7s3m=TlIclIjS;8vfXTxnpcLYGVe zK(D<|Y?mZEa}Ya4{-Y#1~LqsTj{q`zlR+XIf)d%mA3Abqsm`r$t z4zkl`X{S6Pm!UFaa@ExJimFP+YC4eNkQ>@@Y>v&~uwun5yZR@ma>T@cJN9%?^?G69 zi9UPkyyEl=BKvw3HBU3BA@Pc-*Qd_I5;wSYwg%}B-A~m=b8OGlCly>?o1^-z=)90s z*8IMYv#lHQ3CwFmvwLLubo*M;9bA}AIW6CRim6!Ri0UYKGILh6XE4&eK>tgx!+z(2 z?Pm@+|CG`rq%rvfMc5VoRF$D<*7qUcm3$j3KT>ZxcI=DTp$EYNk87Pd_$?)t4X&lb zW3OQ_3z`gh%(I6_lG`10eo+o-M28g|Kj6N5%%IwWD%3@aeH85*jG~gf+D-2jJfC#B z5z276wt0TzM`1Mc|Gtae_%6mELDOF89q=&WHS;m~n!srCLOb_Pvt0{wzl(RyhuYoE zHecFhD)aLCEvxGZO)1Git*uUC_rChRvz4iQRi~X5C!FA$kLJaky2q)=ok4rT=lW*{ zKPa9iHk%(hb77+~fPgruRH5?;9(``BhC=#w7wT}wEf_Kjn@yV;Z;((?`XQafA0kSyX zUB(|BKa+1Bd-R0zbm6z5l}r!~xss8x241QVUNNhBgM=r`Jd$Y%Ko*EpngKc=P(nC#K^ z#iZ`r0f;nTfv}+P0OWi~kVlPUAYDO*6#BkOpl_0vI6}4QH%qyi{0~!vxKpXx3LOZ) z&u!ddUpk~Fr{J})+S;_sC>Bx!> zoWkD)Sn_P%+zh2;@jmk8;-H+f2U*%=7gcbjR%SH!txxO`{#ClB-;(}PIuH$%EMHZe zJYM+ZYvD##Qg-dF>n6Oy;gm+#9*@cul;`FbvXvE)#a2)J^>8Rxq?Fl}w|JU7a%af> zLZ7FFiw-WkOdUR~6>p4xf7x!m{+m2ztEHaYBShaY(O?=^Ce9O@k@d{uB!e1+I)DX1 z$}P>_(ER?Y^d0|N257O0%_Hecpn)~a1v;|7r{@qvv>jWjYyMXe?6l&#p>7{t>mPnT z#0WTsjveGi^3i)V)WR&q9uW;?#&SGGvUf*%NQr;xX8f#~_}(@ay^3&SLpFXL!O4UC zCSSLg&fgEU7jk;ncJSP(7Ez7Q5%CeSw?1dERi?Y^WQ0g+vobKXv>NjjEsUMMD3nFr z-<7vb;IZVxikY^6h#8CA}I0z`@e>+W$Zywga^X7bTrc>j=FHNt@2X2XY_2e*@ zceSL(@r`-a)^979Qh$=%p2K{t zoJLEL^FRnb;rNDWc~ALwOD0|SQvfG00#+=VU7 za$8Rq@6lA6kP)j}V*SKSe8nw%mtHRLA0qELkw9vCHYxpqT3HUQAzUvoCPL31;B+Bm5_C$+=0sD?O>TO6!Y;n7Ech zetCUD{N0oL{w8)y8J!3vH!v>czEko>>y1O%mvH_d+1rXSEUW5@depdY$XSw$zipYO zE9T&_`#JPp`%=De?QRaEmV;QLh)K+Et zpRN)vT%c6c|JEWQVd^sgn|CE|UPE4T#*y#>jy@by zkiMW5Z+_f1NUddihpuJwY_`kAi?4j@RDM6L+!tjnR9xGhfY?0qwqmB z6dS6>_L|fTJ}tsdGSA8sFC8^t%09q-ugyM`zw}g!`_5ab?l*07+l(}s8~65?e2980m*658*JH@$}gvQ6De z|2VwaLjA+a&H0h>xjcecEc4I%M8YT9n}7>)Ka@T;V8t zYI4c=>am!Pi`V6@U4BV%m^gRoj>(|5RnZdGA2d6Gt5exfVex6@J$bV6AzSG(1aN@1 zg4RqL*l{h_ZgWo;JM;24!1p$-NuubEkfb&Qrq#-tzm-rOd}uBYX7)6xU5^U}l5$32zKaMQ|AZ(gC-)!fg*abG`eE<6u< zka@*W?+wu!vm~ zJ+GnWkqfiS>K$+I?5qAL8u^%ccK4vtC~JNt>u{v3(c!h*be&(HWL9nwnjZL3@a$@L zVsW3_TTZ7%^QXrYt+^?i=t@i*cF}UNiQTvVF>kT=MwW^*jroJGJ`3-p8lTeH*>AC2 zfAyv5)R9xM4;}yJCmv}&dG+4f@8Bo5H=DI(1271}=>(*pmfG9zJGQ#Lz6dU5=e^$~ zwJ7*jx><&AGpbbc>pkvwOrpd_U&059O9<3g&RGtn?PtMfPkY}y1PLXo~E^;mzQ zyaeZ$PaJv@uPPW!j{XVT=yO zzJzj9Kkd`lCGn$^kY$>mI4<{_%K2i_w+EWl*3%SQcd17lx}r-@VJYe^_j>O~c45ji zmx_Tyabbd{OI^~AmlJlSZIzc@mEei9BgHnVaKo3@Jv=Q6fp zocgo=l7*%~JS1xJCA`62@D6ck#>sMo-6f~k{9;CER!VX1a$jWgufEd2?A~8rnevX8 zyj?J-Q8)NP-N5V#HN9ss$RR|bNQqOi8eL=>zeTG}4ctAP>Vaylvq3P3%GaG*!f!KT zxm9#xjBZG?xD30ktT^|ab35u|dTb>>Kl69f&p7U`f-&|xU*o0{L?LGs$T9d&$WxQea_0H{u40O zOx(g4+Qh_QL?C4FtIn2iqRpP!%NEC)EhcfE+7R|69ePCDS?1Tel)1&c`?nJnopL@! za)IJv*&FR*bGRASFm(Jo7Zb>_{_|iSU-pP+ zs^wP;1V~kNE3cfo_@&b$uud{jDlt>2Nj*A`A1yNOwA~LZg1eXqbo4Ye|E7?&wvRxa<+3t)vMnzj0Nxx z@9OEB3>08u$ZDoGKQmn$hHOWQhFt&MVX;3B=9&A7r3))sCcwrbR6`Si{ z$QE{OZm?xIFulP+-pHUTksLXp7Diw^?IVt52WQY~M&dG?-T zaKRTr7`GsD6No2q3Wc8O6VRsaFfje>Ei=B}Gcz4f)BC?PlU|iDZPu|IZL>1JJ1Y4hlNxC`G)=cpeW8wx zFiiTAU?&qR+Ty9eSQ4fwlv2nU-!F38@Nx2fU;a|LN{OqIQisnn=Y$z${Vp+S?xSp& zdTOLyI`zmnmT+h``1oz2RLiiZU7P6-Npuv@QH3}a7P;RtfA;K>aM!46T=IQ6N?;er4hku#!!K6s?-&(Zn=;lQdvk(4WX1gp)VU|cLG*C!>f&iz@B_mT z^DZE4+AIKkg+QD=N>jDe&1gs;uqlV?v5!idlavG)7|>T z3gib{&9Ca+*c0OULWEU4%vh+**7M%LwE=(Kpt&rq`2O!#u3mli`^?@dy%fhX3!is{ zd$~4`!$l0#eADoSBHFNk>6mXCra9wf)_@;S0NFe^#6?pAP!CwWvpESEWxZkUU(Hw?0O?%EYW?0f%SjarM3vDwaW`nC16=}UV`)*28=q1@_skx9`B zUb)^=P=4e)O<8-lVp%6!Q156lF6GCiQr_HzGIwn3Y{91UPz{j)K9skY7X}HD4FVyK zX*G>=@YwdEp0&~r6O7H^VN zyWLXQMW$n_%km$!5!ZAS>NQ3zpexbVnTlj$%YhjS&&tWoJkwI44nVJB94-badDfXutRgU{Cye)|&Z-s{g z+c7DP1Xy*r!rr~pyHN*YZ>W#rPK|FCm62V!?pi_dNe=ysdR)Ycow}4!>GU^_ptMkW zi0vAU+1<~O%-H1!enIk9+Ec3N3nuREep;3+MNdr~e0@a>%sBSTANsluHJLVkAG~|U z)TI1=Ys#xDPGzPE#CDfU+p2Oc74)ZLM4H~jH9MBx*33u{HL>G2dsk}PFzGc;s~u-2 z^Q!tUa^4?yTuL|>DLMa==Cz}AQcFeBn{MXaB5KqjRB(`CEQdQiEQqjw!oY@LO(=sP zKxK*0NDX*I2=AC2czPDJ#M4$*)ke7s7QNYxMbajvnj&s14(3IfTyN~83RxUR=1-(`G1^S>4C!XKfSia zqgTLYkaNyqEh^W#Qu!)B|Aaw;J^@3JL*BLJ!<$BQ7dshvC=M`9i*_tP3(C&MCXav` zK&=s0ftHfTd8jz_2_ddl<|F5*|B!5f*$)HQZMT`202qfU8_5>6*^($s*bh4zt1F~V zugLuZ|A)3cBvF6iNJT>KVEFcf9Sd>wk@stj9-C^1NbVPR*H%rsL{)$Ic6!eD`Q=0( z#}=C_bDDrsoYPJ*ZIQ{U?IOlDYif*{)U)oViqNL!K@LY4eV$aEoyqo$!IqGtk6GpF zZup{V4hsnm6eq%q8YN#TL7xZ2D1o3Sng`u}*V-YbMigMzIkz0>w2mH|42*hrvz#8-pdqV_2- z9Qy$_HtEJf5K@ui9E^p)hTcz4t*`B`Gy-+-=%@`?s@s7*b%w{Bk1^+3x?*r%bnkSO zIxm)PZf-MF4II%J;+mL{n3Z({FnW26YtsH*|5#B?d3JBGLB+r;7`C9MdMJOX5$45K z2=7S@-7{y}S^vH{pd_iN=m+Nzej0w=-PXldGyXF{+c>}d`XvwovodhvIAGORNXq7y zsFiUQHO%!|{N7VsEcsiEQB7aVO88E&j>@!x<{+)YcXzqkgD~TVoGg1;xF}yV@*!W_ ziF-Dug=nD9q|vsVk>DW3rf>VU=1`Bc(l(;y;7#_T>oe?E)0(w+tKvgpi5S)MN;GRf zQu|$sz1qSMg>lP*pN3$32_Fu;wzlDSTQ7}K#tgJK+uBMBBnn^Ya-mnh)%9*K8$ZSG z;j`ZKYBo1;JHsB?VqDq&grJ>aE-_nlURHXOPdBc`RKWNs<9+Qcs96D}$Ds;>v9mNg zzFIg-YY!lc3J$wyk+!kdw@_bU9bCJ1*x~7!DxX+-NP8~IoDK|B4nSyHx&{{~=P*#T zAEhxnkJ7Zh_Ol!?S&CoD6D-I)oEg4YZh_Pg+`~~QV+~6VW@Tik#yx^*0q=RY8p*-v zJ!2I;4i9AbI-<6)oszum5Xphdjo%$>s%>G76mo=f4kZLyRM4j?f~Wv`uV&^PHW#>3 z;b6fJbjL_7SmC0o;FPkQYN&~H1e`Bk9D-1mhmR!!N&qpAod{b5{T%*zO$ZWt3DyMrm3-@Ur(ENCA4RZ^ajS#0gw*$Yat0Xo4E?uL zUL;}n^ddX$&10ZK!%t!j2mzQ7{z?#9Ve6{&Taj|@KrqG6M(p^(b?E~?t3isu>Hi;X$52lC9)J54D_x(ge{p*3xRRU{;SfS zz7-b|gI&3N*)$9wl7PZ1de_u0o%s4xQZ%E-2*)837VIEZBBPp|4kuB4;p5g7q9}r-lI<76$;&5q8G&#;F{grDA{>kZXM`ngf?oR9BE)popoggsAf7>oFt} zRdI50nK4aZ_7A}hF5{4S+Sz>p)E{6SG@_tfp15oM)pw(~iSy_laZ<_f_OJcr1Gh^8mf&vzO8=w@+#IH$SF9rLhis| zA&qmQr)P0#30S13)z6;E%=Y2&Wp~RXmIs-k7eA>Bk{bM7j)N$kaKzwQT3e6cWWiR2 z5(c>r$X>)*3ZEuz!M;?F-*Lvqo{h z3y$3M2!#C}&oYD(9A_*B5b$Z{^iKPK4m&`9j>nvXl@+edK)mRtrY3`HF%7mb-9nMK zumV5WAbY1srj1F~sYMVrQ0eye`zg&VUS(((MO8WY;=)H#Rr$gsMq2&km1ebHo79`+DG<+S8IaCz=U|m_NBD{rTO~iOQxAa z4rP-@DN}RJ6Il~FLX~pLhfC#3Ikv-^hHU~rIt?8KtAGXlr}(5lQ+!N}$=aLAdMIS& z=FcEu@tYUmlmM5h-2ts5W#m8n9IEVfk%4Opf=*;qdtJUPDlX2Y9AFvu2ruNG4g%3L zkdO>p`P9^fLcQDaJ@gOJ1G(GU)7J-V0YZ>E3EBn_^snHyg@?%Q# zv50fPy@7Np0Ih?TP& zFTHh_M2T#-n~(*cJY1t+v3T;99m8UxSQ!kqy!?c7!?G(OCY^~B=x9`^f{vFKq(2WAyz%2QU)d$R7dF? zAT}p`-)~?p$7zNh2y6h83lOAX=7@P05^IKs(Z@#FMDnYn97Uwh+fXd$^XDf)99 zb}~ODw~B$-xNCc~3p~!MB#(W#=kDu9B$x~xnZ$bD>WhYv?2 zuAJc?=qhHvN=d?9dhfWemXc(e88WA1T6Zg@p0$bknBas@qhyLyqJ&8-e{?4AF*!B5 zkY@G7FC{HGIpHCK_k}JQv)on-6OniJNAHBz_DA)QYjy%uHg~nN;0{*aTwB0Z z({}_;uP}AgQ${53JHGhQ13*sEQy-5bQGc39O0?nL-di0H!OB2{G<+x6HC6I)2D3#p z;L||*DEK4rY=>U}!eh#d#M3^*(nFRYCzV1AIYKVJI|T78EiEC995Dy4Z!CeNh{gBR zGVQ^GGcbu(xSqk735N~Cr{OB!1rR6DecRkvFA+hs^RJN_<=EpG9(Z{YxlS4|!IF-9 zh~5F)Ot6Dl!Rbd)jw=ebX#5kq9Kr_z0;(TBb^uQTs(BdMCp=CiG1MZKXWI?c${{f= zjOx59hi-EtzZgCu+#^q(jOixjO@fMqge$mk90*LX>=!lIraXMuVJC%dFNsxzjtfF- za1nt)nNro!$*IJmFrY>`wH*#OL+!0W*ZW;GQ#`!9e&a6ydn|FfxmgR*gJx#%TTr?Q z>2^BGq+-351ykMNiEplLMg$g{w409)dVfoci*@fF=@WELp7g$anP(~H&xvm@J!nBJ zz!@G~<);*gY8`@iWJJ#Sr0?r1ckcZ^uHHMI>i+*9FG+{UF|)E0lB|%ZoTvzyp~#+< zy_3qy4ha#WkiC+XWLF3wm6aqSQ5ux-y&u=-^SS+Qzw3|d-F18CIOlbqRefoW{Wg(~aqK$6d&lrAB*#xWvE-TeH{E=Js7+Appc z+4`eXy8B*Yq^tIGqmbtD$esJMw5d;DZhH$<6Q?*v8eq-Wm|V1ZOaI(Om>EiT2+njP z0v|w1!zv~&j$RTSFf`YIQ4rLOrW}=fPL7Z=F_sm2cSxf13?AH(k7<5yAjXR5VMuae z`a}i+$rcuUsO5?OP@deQFgbS)mo2<+c0aU(C&p`o|1vnyTQB}wH7dNPtNiCWG{rS0 zirrR|8F%ggBE^s=qgzf!1}WS@l3uuy49%{voDWB724;As_CtvLzIed82FKwg05)v2 zSteSE-d-N^L3~co0Egy6|58=_fqD!wd{|Zu4B+XXxXGQikv$eE z96_FT;?MxjJvQI&j(!CRnbryS+}eF>^mYzi-ZI^JVDppOkKWa9{0izdrP-A&CohQ= zDSX@fKlJe}a1>=E>ART6_>jBq<56t^)a-?F&y#Z4&g@$HVe<{dZaf3nWMgNgG>~x9F(*roRX-V%T?C zF&!}zF%w8mQQ|(0-u+qX2900mw@N!RpCA(d#1iqS34yTmL-ok}6(tT1(tImWcHL^s zH%E*=dq|me46)|;?h`s}Agv`wEc#$7C)UA1Z;b11z%dPzmlv+~_RpajD|+Lhu#1)o zB?}Wg+u};!T_m>izeYtTn~HR`qs*%EXV=%i*4xFJ4Elb)`igF(${iMAT$^caiFQXR zDR`A7Z!xN>KeB$2c;@lo<41MB{Vo~4J8$T_KDt`^_(I3*S>p@7svXL2&Yn_DNl=L( zsPMaSn7e6>Fe$VT$*mqyOzsd0yDm?>wz+k2@0)&?o-6;_`lb%f|2w?j?{W*-BM;sn z7ucxE*|DCo?!}!9o~VX`9}OkIl?~d3?}mkwWET?rK-y)oG^%ft;rP2Rwd>TpK`NomRAClIdm z8V{DA@stQG2Ze{gFn_)f94R7{#2UF9NEWzGPPnyE{!iecmxN3}8oA)#W>bX3?HkRQ z@=v#L4p_Qnzs&!y%tM!~+2{_`#c{yv=4~Qu< zjj$9CJ3AVbI~!TP<1X?X(YP|vgWQJ)Qe7R{PCz0G9X6DE5KQg3fnpgYBCgNOEkJLu z8;>X|(iXrx5Z4~1`!3T#P7V&ZfvAT!PSZq+1e6&C(__BVHR%>F2p71PMnsMdINla? zs5JJqzZC6nOL;49{zmTSP+ke+nm7F(g{>7q6gpzI?6+sWCnkROj(wSOn(H3Qk$i1O z7plw@K6}N}Dm8*Tr*vEO1Dwp`6}Z|gW?KR=GH zVEGt8dYHLjU2MOK8qa99Q6N-aR>l{FF_J6Kgs5jT4u3_N7UwLbpn#z;`cj;H9;WU2 zbj(|IC(Halpzh|9zZUfu-!^X4gdXH1Wj?v9E2^f88EXg$+zKNvh-l$T=@%;Q{j_!3 zqRi;t_1$Wuzds>gMstTe_t}z$n7`I_BWoyWCK|63FbF#t0@)_?y*KE2pi?8yhDgX~J;B?!?6w7D2_c2w`6u zkbzB>K65Kt7OmVZIERTwXU~$Bf5KovJ_ZQT-1PJ_a%5tMwN#lA?Wux-6unU-Q7^NYUDmS z?+m{L6h>HB{0C8iW8Kx5d<)-`j*hqiGa8_AYWmkBvXB7>q3CA!36xYzlgYNC+D=Pr zkB!7~EQ6n%&h10q2&BEG$Zh%kZ3O07#M7~Yc~w0NK{xLZvugeen^r-@Si--frUHMhLtP~*t|!q`>_j07 zODeo13TTX~(0XB>?wnx5{$*oUG3ttlC7t&>sUtMHdqS63tFuVo1NJv2?dih1~H z2PU#|K(V@&z^bx!385PhMsYS z@m`DD@*?kvg?)myR<3^U!RUx5_c(*6@17BNP0sbGi>;mA zcQ%~nmPe7by}k&F5Y8VUk?2}cR9YCnod47OiQNm{qa#N0psMIIZ#^5M3q2O5h&b3| zJ2VN`KQU2m&f5);hHPuq?urDyBpY9IbKW#9czUVuZx*4bkGM>|*G92Bfm zHc>Aq_a5a%YKji20T;z0A0*($F)130Z&VL%;$NS1V`rgc+YH76xst0IS|z(9Fl8*Y z;E?Va{~9ef`b@z*PrvC0*Tqqa>zn-2ao63yDu1R&!td=xS<^w3%lK$@^+ieZMm_jBV2fdbJ9ohOVC8A`Z&^Vq%yc z0CjPZhtp{8OhHC=9-cowiong5 zz9IAXxow5Stp>T%fBxmVwML&YdOAYtOEF`$uCZf$E%$9eT>8vrrf0NN6R*sPTDe?& zT=`ey?iT9ZCdN#sXocl}37*maK+Pa*H?45s;X|h89{pzCmY#!_E-fE~2Rzdl)rCvg zDZ~2|GJ_dkRezf+G^{@78d}U5n&Xg?nU`POC=ltUI8N)g*m|~V2#Q^#d}G!S8M76X zkM}@8(Sreahnd_@*zjFI>pTCa8!PG6D|pU%d3j+hls-`n$P*kBbOWT5=1re|`IY&= zFdSGSf@O`r-HTNH32RoE!y;Q213Ofm8VWcDW1o?e&JQ0xtfW+rhm2bxTm?nSlVe!v zwRLs4o?~+nGcQ16aW9fK9=6 z12c<2iGc)KE~z_EcFU&H^_s^_^n8%xzFAdOH9uU#^rf*UK(QM=E7|d!a1{O~v~+ZQ zaq<9SVf}|IJqOi|_7gDQu zrV=$x6q&}jq0QA4Nz2H%;S-u65m*KvdKg@r_}bbYAN)nexx#Ll9}n|CE8jvMp}`YP z_1WXh%*~Tt&p!rTNa*`A{K!EMZy`TFkoRbWz%U%c;fI3M8ZbPNP++q@2LKAm7p5=xkIgxV*|eg zG+_uY_*e8eL)!N8XZBF3#{Rqd)`xFpus&%OrG50M#>TzPcV6<>o*gtFTk;(uau}N> z^s^ikvO{?n?pkMZnSEA?zkl{!51p!{N6|wz8U~f{nNa1?xNo1w4LOY66Z)cOd2X;O z-@Y8^{ax|qBWB|?5q2aUBT|wo`zkmPM5W=B%scHyD+|U`gmz9=c+&JeV z5A+-mqM#bc!SY$<)0DE3lCb+B=gB|lhoX9P^t@ol2mL*_UYtr2Cwqm#G!aaPef##| z<^u8zY7N}6zPIxnx%^v<^sc8s{)P*oprqu6@vgHe`^3dXBLaEzA+k#BLWKQ~EBES% zc5M*|!#=(Vg#gdLx9z9`{SS{}(hIx@zDPQvx6#-$lG$`E&z@ncOwY_<8fPSyj3iSB zVOHk&7oX52lS{C|*)B9>ot@9i?~*-^E&yF`(h*O>?3hdtSNyJmp$^^S!C6xyBMDk7 zSf|2nBRg9){sF2^_~hZyDkdD|)fQvb*%ZZ?jLnpJD8YgaAUj_$Y*Xdr=;|m1kS% z?|I^#Dd53;{k=nfO|L#S+!Fu0tI*b6<*dWqPl-df?_`?)yxT5fGwdv}xzk+Y z8ym+sEbAH9{2YoKIa9FO_51RiOy*Ng`NVKMQLc{HqR!-EIQWVv((N9c8!T|V#za;) zm&uV$|NavT7yByFSgFTRuPrCi{H#m|JyZt{X!g;mi#QYWi&kuA+-d;7D01&-rU@pR z4(?=Sg;Lhq0`wP!H28F*E<<&umAeSLTKG5R;sXB@--4= zhnyRb;Tn7FEilNBk3h>ZPK1&2c^r@j5BkE>`vDC-EiI8msT^ywJYZT6`P-k9Vc>4q@Xp3`{n}xFh1>rx#&TbD}cyrE~I#Aod;8z=`GupX?I~Zdf z9rX10t9d*bPu4&qYhLrl=HCye)@W;=1@uMWb2 zaZ_`0lJkdo33xu}mL{q($C$3gY(OL%J~J4tPRj4F@xkX}74gNF9jic)ywmDXJ@&yd zH2mKs8FwL;=;N9V!i14OkF9DvX=Hv#zi{jMRewT%Iq5P{h-A%~5xHm9FLk=ymW@g$ z+-Vvvxm4}!p=aI*rXDa8)*k8c3~_sM!YyIIU+A`g;s9ZHs720E&JG515@ELrvx-<2 zH5aI7Pyb$S9wB^FzHusE=E#w&|3{M0&m<2~VM7uEORKAW;I{$?(bO(%UY48fz4~8U!kIuDU=xnvR-(Bd3@C(o zbhZ}8TZlG?yak={*DWI1V5XsiKuN?Ji4a}*g*NtH(@p7~!WbUh9zjOsea+9GhlzC% z>a$kdJUo~ks&Em3`T>3n%(l3Acy82ioZ%AAeqsFsOALJm3mq8?_4_5N?|~^KMlgto z7EJ_*VQvjCaqLyBG4u?>Kfp!&5dkL149jafqAr?b2uIs~U>1xS6&!79+=B6fnLHD4hKD2pBS!#QU?!`rE4$umO#{AP+zZfTOA~d9X9f~fh0_& zxAA|vd_VKUNIp4GqQ1|m>b?`* zr2vF(S+h~;s{rKcrq<{?l@0$*(qT5!$Bghf!bN5z_OW7NAYDT!j$kMD=d#3JX>eh{ zw!3hFY#KJ5@4(Sd;HQG=Qnug8gWIWsk}Y9Ir6Lq}FzR)+wy>bu>szM}Q}2I?LJD(; z0GO2p?va@3vNldf8OKhYC5NC0B8A+}inFu_o2T^?G=wh6roQX#pZ$d|*Sh^qfNG;T zS~NOZTJylj*OvW$e54SjK$RBQY~5(So_^YeLm-%U4D$-W!53x8I|)E2hH#lPER)r? z@A%vf#Z`yRND0pK-RD%mkm;ioW>k-|RbTO4JQ-IUHEQ^<oHKA}WR zO5h9Yb(0wQ^@0&3knErIn@u}sf4!gcD%={}Y{ASw`t$HkO1|6bncZ(tP_-P4cd*E} z=BA(=b!;f@{B%_MS!8PC3V+@BW)qPntEa1>bSds#oNED9y)tyQgl>@?xzN<9s~H~9 z>0-Mp0z>Tou6^42K$S>}E$~;`n>yigQ#tyBnWPYrq}>=f;~{Ok^~eG$TN1%- zLdPTe=lh*z{;udf+mEbCmeXU$bFA=c!SESfvFTnKlel#X_8<;7F=@U(YzB32Z=s)i zVI7+r{m5ES|Nb@Bq6&u6*43aPMyk(nv7o2mrpxWCDJ{L$vW;y&6A9024Iy%&1h(fE zm$ox*|3<~;2+-i{#K(--l|W`2=^H$I=-R(6E;EKx#=rQUDgVq~hGs&}MCz_PZM=_w zKbK2B-+Rrik$O`u@(YuJf3nmm@{TP8X&Vg8V`iv>em*6oNAD<+@{{TP9_B;Wh`VVT zdIwNdj<@FL!$AryJNzKM>MU5UQ#l}w)=Ye<7J;2%WzFw0YikuaqCZBMS8lz@cekpC z>czMV+`uu+g2N+FUSLiSK7nm!E)n*ZH>$YW)AhmID&4$b>xawBzQfIb=x+-deddX_ znRxWaa);iMSznWRHX}=0{dL_4XBW(xyy{9yY-bdho_X&Sx;D?Pv1#mveyDX<=rbxl z#r+(inVbn?`y*)-vmwU5t3_=`tZ+*{bLRJ%VBhaj=>iGUw#fue71QBe@2+~ZfNiW4 zSdZHj`7FRRtG=5TQ-_T~f&&!`?s{cAE$|ELye<`a&t2K{3)W=<)zCt4K?cJT3yqP~? zBE|8y)BL*n(H~ob8WAjRItaoR{Jd5c-Z&c@8_3kicbX4j!4i3 zxhV7+1Wm|~e2^zS?}~OM)MQ4M91lCsz#ugt>g}R@LMH*>7#?Bzl&9&5inqts+*fXI9plf10fly`375HAFX{|CH!IxR#mu@CIe)9zmyJH*1LvQv*a zL|47{U8{_G&AJ*)c4hKCJU_~R3u5e)RC3OIJ3b#_IZ`=VnL*7(nE9)n9satG{;%tm zw?{R3eXGbiTet-r5osb#E7*zi8jHyd{u{qXVUZ^-B8|Rlq`EyyJ@g$Q;yy= ziFVH8h&^}PrE7dmUvE+Vs?#m~`Q}*rl>?>E-cr}Rn>Ksdd71oMB&!6jb#>O(oj9Cf zHg}FOyk+DqEa6?ZEwfMg&tD=2K4>|Vy<1RCDlv5}Zu0GpdYg%V|7gA*QM~ACOKd+s zyXx2Qp>wt)_Me8}urt0@@ijlm zn7{RF7cIv^r7Z21`|Z0-jI1TtqW(qGw-v@Tn)~0AJQp?EbK1FbsAh;sic(3#-LNn3 zSCAA#u%$}>poV4em-UTh&E)#1MTY(XeD``P?jhhA2dy=Crfg&@1>KW3b!|pl0OiY%0_I{Kah~JwxZ|RhYJ%|1Tl`piLORyD$L_1;Q6G#dG;!&w?N2=wIqnY`bRZ6Ip@_ZOD5pHWKu-+!4)9A@6w zQ~&z|QS@8?|36+)V<*AJ!|POQ+y4H=|NWMo8*7rDhD*{(=-QY=^NWQ4ebtFGrOftJ zL1mv^=Kt-v$8zLFmx1K}{=)CvMwA#`6!LNL1+#Hw&QIlP5%}~Q*6Nmb{_kg)SZyS~ zL8HB*x+!$uuB<*#;QM<>osAPNkpJ@mc{YA^WyspkB$IYtm8)YRPl;_}D(HYW{)W$u zA%5P{;LN~Gcv{Y*4ROf3m)@`=`^V(0$ z{(E~Ye?_wz2F*$u1d{h|zgDsy{Q_%p;}N$NnUiNPg?uxY>MwZK-ud6>zUjaBL~7W_ zY3En*^u+w?_JTDWS>BAsiK;rt{_~N`5+42S<*}L;_flfiTZuq^y#T7@P59jxI{sxW zD*r84w8LYgg60C7UyPNS55bR)l{2-)!pO}mcpo$3WN1){49Hq7kxAcC30loQr{>jQ z@;j*7_>QeE`Hn4jQk@7}&|3N<)N8e>)F53+#sz3Wq(Sd8?!p!dbcH4a{*`A6V4h`g z38)U7n+bufmgCj4Rtdrpw|h4}>9Ep&Z)~e~h4tri4e3`;^l{|4$r5Um=_`B%gBq)w zQO)69iYJL=hiwvYFxE*hxPqZMl#FnFBcRmL248ta@l;g}sUJ-u^!0<*yaH z>GKn{FIAl%cu(p`|LVZ|Q$$S%(}9b!I?ODplJ1!Xo}RV=@S%-G?pfcQ*WQRMVI--` z-EZ7@xq|;*ju0de8p5{XIEu~WNfP0slDrq@Y3VX}bu)obBHlz^4SSJ5c!S^qn1i+% z1SCc7lEJ$7bA&)x24QHC=Pl)#8CEVixKK@^vAF(I^;Lzs@QJXe zPYztyPGd_Te)H3nncdTb2PF)sg={=8xBhv||Em=b$Woye!VzwqZ@RGHAti^;*9yjE zWc4#-WOcx$YfQ9=Zxf=hO1^Csn+(OrP!`oqD5+W=DCsZ{+7oI&edd_^OoX1{aP3EJ zeXTurm6yuZS#Hm$^n09*?MNvu2+jXe>qykh%@=Y^G3dLPZ)w1+qw~;dAy_w!Eh0bB zK(#L~=X;9KOsMMMJ}L$}OUX0mKO9?(hqL11GJ!8#rRj@@V+s&>3$}7GWM!)7S+IdZ zTP}7gUSF7*w)tLyV+w3PUrv^jow9Y+561M#&=(O+3EWwnj6uEP(@s1|VjW&}X}Y2vJU%b zdq;zuaI(JIu>Oafm=w@(HG8B-M$^E6i-C%cL^z&`yw<@5#SF6fof`l==k?#tFqmJ- z02N(Fv(MTXd0uSR3#T%*iK+|-+CGO5$k62i^)&Asmlx0I-X0j+J#|2H!uN1ehg!Uf zNbA^l@x?-pP#rN=%zyLrb(wb~uM`9%^=uD?B4Mbon&sPExfE+@n=zqsS%2-h>-Qi` znad0FMYA92ixxd5rZiTcCaU&w*?}F@YpL+h*@CU`(fHGleR5JL2ez2X z=GAg9)pP&Y9eUE^Ivx_(163wTiyl5D!Kh&o-dh5D(86< zbYqD5)1m4F2FmU2uKBeqBB9D*>a;;U=epuWvd@>urFJ2M3jVUF!8L?}-g)Ke`yqX< z{`@@I%@UGeP{fe}U4Lzs${n0}+uGOyV<6gxN2iB#2iVO&N$u zjNy#Rntd?2&(yBIJeAs5-HsD342500Yx1E{(*5H8&)eco>+z*J8tX6btXjNJ`jl@vk%A#ism1IXu z2tYbX=#?o#tPB}uI7UEG_FwKLn9~r=1Bn17wZk!l1W+)tHSnN}7U9AEc2{|NjD04) zKQGr1@vIwxUOuQ1iUgUA?hJX?EVOJ~QyvPQru$jpum@ilSF+{gvCLRua_;7o?*?1w z`0?YzPJe(~psd8i%)=DZuiD}|lVZyF z@-~PJ)=Uy}%|~3g#^qmr=V;%1SNk*N9VYd=+6e;>^6dm$ys~nj$BFz|Z~M;S58AfvH7=*;>I+u%R06On`S?$%jbP`%QuW}6wfBIlooH2&2C728J+s$$D6oMhkQ)5p-{y%hV&d# zm;mI0?3@`?JW3)wc*;vq?4GTK!Ga_Q@7n!YzYXbgx!8n@Px^^+>cfO~Edp6PaP{x$ zbqC0^2vZSRSZ3c(W!JWG9*jBW;{_$a)ukI(mw47Eu7cwh);^J^pN|=O%~bmAw{O4y zVVZ&DCmr>z%D@s*a^@hh0M8EmBoI&gzF3w`!>(F{_6)?9SAU+kN;Y18vh};24l{_R zE96iJ&>KKha;k#o#of(n@wCm!$;o7@LUb5=kn53ab`?^qlvj-%o}3MTxvfF!fNjyu zo38E~HOH{4)8kJLm}G`2?`?G{OPErLnIiCISs<&%!*q}?O^(2KT$QRaFjOt;x!x<@ z;Aw?%`Sb}&Qzre^4-an>Ne|ET(yQ(6=cTIoB9$Si7RXy|QVeVdw&1)!B_$*<9lQ^dH^rNjB+7s;kq???4X;gzSLN1OIQfEk*Nm4>CqEdSJ7|-q zkBLYKNxAP4Mm%T-$%%&mEDbZYV+CQ&pYdr#@{%;KiQ44et}JT*U_mvkAQ%Wva9{pf zMoz-(?gnwc;&I@FJf$05^U;$u4REXWP{6QY?YY2BG?HoHodZdQcz`4N>Ce|>jfC)(Yq%^C(PoDf6i_pw$bml>RS-x77axPRYgn>9$W=~4Pt=L_RcAZEEGB*iNmuKR-f8ynr>*$Mi1;2dq!6-ignCR!WqQ*~=PS{Kc5ZIuy z_t;7tKAL6XRjO?O%i(+|gNIzPv6CYxFxecE_mff=K%v<}sT zlb*%qE2|COd^EBHJ#<}J7g!C(J)?K}>>bz_(PXys*`V~Dk|RZ`#tf9B5@9*t15aLx zzdaQuoEY9XV)XNZHp!5-3fwqIZa4mc_d_ja6>wX@j2p8TY+y*3Yr(^^w--+BYWik_ zQ9L{?7GWi`lZ-( zov%hPF_03`8(Wnzg;+uUVj9x!#gn>R#3OEXeY&(VqLI!_ndwHoY5(z;GPH}Otf4_t znh#i1k(T`yA^;54tc^n(4Q%d6^3TbuV)%r5HK1XgJbyw)I&@MP#2`aw1Re-a1r7`I}e0VMI^c8?&SCI{Q+Xni>$y*sK zf*j1wBee&J1ae3Te1D8?LzXh)ywc{(CGYY99*&q8+n661 z8Wo*^b9+PtDJJVUu7ZpopIWk2v zIWjw9`t*52pT>7x7mmo(wnywK#;Ega-{zr9z|07u8(&BTFv^TlIe(m-k_}A{4s^hYXu-f&0hx^(2i^s_Univp{QZLa`Y9riazu6neRtnPV@B7E>J#bj+Z5%>II^V@yAvaK`ZQVbUH!>HZ)!2og`4wqYQh zylB3{-%&o`*lK2N%&N*j;fA6SvD7a&Xa}VofwZ!-jNkhvzF!=AjEapL^tHUaFNOh= zhF~NGz!1ntOcouYq@<*r+#UiFMuy3}n5WC1Q}1ZlLd=I<4aNAsq^rw2V-g0(F3==@F=k$Oas+Nygt!f&+yw)Nx%8e&V5F{C{O~ubJ?E*z z*HI$e&&{2}JU-{&Po=u!v~6jiT!du_t1=jGaa2GqTyWfiZ(T3=57 zh-A{cBJCcO?WUV8I>~qY0Lg}BfSfMxs;86t{s0u$+XqIIVsv#NDtws@gOhv`0 zefMwbAYn7x0~h_A7ddn)GYqEXLqnPEkUdny;dA{5h6P$-FoL+n8%l8PiO{uGj8VMSlW;?D-eBt@!6dlRD(q^~5fJ)71 z^p_D>KR_M`JGl!fV>HrY3$dW*}Nm!z(Y@+F+4Gj%NlR;)SVaN(Yd5EAQEK$fS zq;0rz!9v2V=IeJKIM-L9q*ETdkIL1nZf~lu6dR8`F-q0vO<_=o8(dc~!<$-c{6y`` zbTSE5AR2*NFF+9mCAwo0Xkda^H57duGbXw+q&!1WkF!WN zH9Minc-4t#KUtgnQ4+xl)-{GqAIp5A@BEB>RoiR-6PuB|-{HOhLmNtEpUK;XILEpD z7aEbBXNwgGT0<~VUF4BRrZ(1}JqvW@y`eAxxspXI+H zl!lhC#j*?&_z7@l0dNKKLQ?iX?LtcE+`VIYLv!C|XK&dctoHYjl^g4&kW=EiCkMTO z?B{stQtP`=_sT5cp5G}s-|F*}rv-x{jZ4PQ zw1W;DDy%-pwF9>Qm1k9TTKt$;C$I@MMj+2d&Q_K%qyF&@u z=Y?cO`6wbuMd#7Gi-EjIQ^6I+e4*dloafEo1pkNsO%)C}4QvS~233T4#pQ-N>2y3P zrct!pxmC_?k~%X~`G7&3%>XY)jnj22dz+9c`2k|M#l%Ac;!CbQE`bjpZYA~GR25D7 zfn@Br7+#*AkGS*)t(MEP4QsQonV52`LGb30{%9|zGE;}wjd3I@og6F6uP_q;T56Ix#Q z64ZI8ut(Lsq!aJ5Wn+~-i6Jnh>7zza1H#f~YSHF$jN*`NmH-tY^QXjMFe#`Y3{|*7 zT5v32hR*GM-`Pakd+K}MUhw4ZbTcbA=`PH7Je zfwUpkI&I!Rx32CV+BftJ?eNC^ymHxVQmzR~gf(=TM?<(ClN2I4a^8#6{= zjsWivTzTD7$hiD7qlMR1kpsx7|%nc`AC$W?A!J+hrnRe;P) z2e(mCL2B-sZf0b}8w}H;(4o>}?G;fJ=3=TA9Y(ta3vTX{{zkO{LDxm!S@*xsCZ5Ei zS&`TQioP!Mi+eVvd+j5hEe2X>qm?|?ARch=x-LmX(!(-#_P9L2IX~l1m6JIqIv#f~ zG1q4OBeO_w6vG@M`&1IXc&r3`6YT8oz>r1N3`ahL0ZA*i|3bq`(t5mx5JN7>u+#a<>^ZZgrk!hl*4M@$6PW#l@P}z!ueO;2 zLEjrG^p01o$BJA-mp;LjaP8xc6F#UP)cX*g6PDDdPxTv!;e8WUCd~(fi5)g8K&Lh^ z6nN0Ywmc6D?L4kmR+)dGbsS1(YcHIj*zCKIxQODix3iP>hca?wr0>vXDV2VO!|da; zMIiYdguer-PI5_vQz$1lcU$x^&3_Lq%k1-KIfa>#WWjWbDqheN`aN%Nu$zDV{tY6q zdOR~N6#`$rL$HODH+>4=4N@ZO%=I23H4iNpUMqBJnf!6lS^2|T4{!-=5^toRzJBzY zF2~JwRH5Lb!}H50oowEUf~8C!0vBZCp1->Ki@ZmD$3u1!pRL0zzoEL?NSGNS9;GMD zv~Br~6XqOr=Dl<;x{X4QO-aX0l!o4ZVXgh)XyT1S$wBul*xFrzL=h3`)GJE+WuH@3 z9ob3T7@hFqa_Mgz0;TE2`J(SbEBvk>xIs;xv&k71ubGOhoFecA>sopfyl&WgFT@Xs zYU}8EY8rTI9vCvWyif}YwNM0&vyMl-a2Ut_=@jv#N~v*~m((rVW0EOP(|;G1SpSBr z@E1yf2+L!~g0h6oR%Z{=6{4nr;qW%NMi8?QYG>%>ecmPh{ z`@JOrzd)Xrk1h8Ez5lNmuw9xJKMQivBDy?=6CSA>H(&9*LN4s z^gV(X0vs~Zui*H*dZ&(oBWRyoU!&ZcYS_+wEvxo%!+^Afgn5|k3BX|EFZFKX1F))2n z)qyk~=Qu>*G8|}W?F%l?^rK+?({qfz(H|%3`5HH9{GZ}?;q=0?O4@IB-o)eyh<$$J z{AO`P{tir=z+n1g`wh~VHevH|H04BT;b*6hP%uhr7n#6%I=KU|K{Yij{5F_@vq z09F$qG7~5P8!RqA8Jr#P+~wzqCJgeEJ!IPG+qWkZ_nc(o5>(^ZwQDsR;c2kdy01dq z!f=+K&&SE@WD{wVf0MQGaR)>sJr4xuH+EL|qv|xZq;FD(Dp}6ybG>*Ls}M%@I}XO3 zyl2GF=-W9GR~xS4tx^?xyT}3b#$&f9)aObtc;Bp;$);OszgvxwTd5)tgjuV;9LLHwo7c@@9qyV2%I3hvUIMHw>=~Z=wwz}kBzAA#&w%X!~3gp>+V^-h`)?RIU zI3K-!D#^6eqlx8|TY%-vOlRi<-OoO+ibdfV*^5z1N{)z8`J`{$l*;*giu*WK9veCE zv+TRAm(}_~K4wa+HivjjP`~cmR?P#Xj$nH^gN9(D^nJ#dGZJlt8_g1_Aul1IjeQz+ zak>`jON&!hY@r)5g%HOh8n5q!pjXpalVuqa;Xe7l>F-BjXd>SJ*IMduwYg2ZiPD1v znn3d$@nhZ)ktq{F<0Tt?r%%DgNku34z5yT+c`jhqz(3Qp{`~$8@?;V0GAF)=Wsye> zuU~&$1QK~}Lw%o|mWK3d%set;o~X#%j%1zr?G$7+;WH;tEO38NHarm>M?FVtkF*{bqN=P9}poh^u))GoiiqTw%N zQu4v#9A>r@w#^deAGXm;za7F85TZa!(kv0X9xlIF|AY(opv2A}8r^nC?c!I}f!Y-w zs@Mrw+!i6=AR{yjeiqac!o5YoGr{&P!c6(ZvqJhp`T`19 z`_4Qg81a1%pYm;ylQ@CvBy1HPy?|_8sEYdoCDmN#GjEcI#CR;9G zLJsv$!*Z9iCHFg2XOLRz5`%#Y!24`BV>r%tXq(n}*2Z~$EU!S6=>?v+goMk|f`#z; zmVmM={VE@>n-*x$1Tzr$aG!t(zd{aKCQq25;n;}4CifX+IO+VAUjsZVAGU$-)@tdB zNFlBr0y#g!Py2t2JHZ`ivy5I1xt>?u5pL~PvqFxs)ouuTS**W_mN;l&z!K7@*bQt_ zM(vGfy|yrKIFy0l_Y8!(?6_rvOJt%SN=x)#;6`Q6{rQK?4AwP8ZhFN|57X{Rx1LA# zb4YMA5#LGCft5acg{(%U#b1ZB%jYisvr+%plM7OR8?sptxmC8y=`f$lehvE?@^e9K zG*Y0?Vb*g9)?jZM|3Ddq;ZC!Jweexk8Rm9Zp7kYi@4B{}v2M)Vit}6v*{T~;Vhy2V zBC3@OO-(SuV5t>t>ZD(`H0n545TZzBexC)*0zH@Dn5CxOs_a{|K!{QAD@9K!N^u5y%jT2+8s7*}jFxL45=IDSJ zYf)i>XOOmI&00<9$tWpFN|G~6YA_ClGX|UiU<-g_T3eVhNcn9(%n}d|wJ{$#4Am~6NJQ_wutrUb@h-5L6gN3p zSzKjXpSmh`r&6Szvn_hHCGcRpAfldJd>NtUC!s>I@yX1*!SUv8(jG z`pI++v4!1?)Cn>ZwEz;V`y_5|XS{ zcX08if(=dZn^GTvc+e*ZrP%AeMx12DVsP2Pn=<-eV#QXzrzkrbhtHIj*N|k zH#C2U)tvQI2`c+&B`ZnV9t*o~7x^dHmKb?%@O(HUTVVm)otXwjB^-f`q&c{_{C^D? z!f55&NS)lpw=ivkBO;8WAc3aaCSq^uFH=mh=0@*iTk%CQruK(8=`QPO1$7!oAv-2H zI5_^2gUR@Nso|Q(PyGoZ~oBiIlLMBl1~WSZuZ(5$+4wNwq^g{(*)N z{4XRD_?Fqdb5LZ;$;}<`+L^jLK zKl($l({<7HsNW98dDo0*nLD#5j1p8VcNlZibzY?KCx$YMmB(JTF>=={b$))gT|D#L z+g`L~Z<&54 z&qFglGYsK+iF8@BRuhuvKY;oEa?&lwXt>9Z_v<-YU(TJk4DEJ`C;WQST3q0F*zBZh zzjD}7+BkR}s6#)*t5WdxmiKjMKm9dc|LeAb&-bYqNVsLkzKC+zoFkOHi$q~@`1*PX zZJRA$sUgMwHmQZQXnTuGb+2=GZmzAQ5K?%^7##47yI7{T6U8jTi`?=&rPnfp8R$)?SVbc3boAW+aJV)Z0Vmy&zKY!Xo6yJxZ~W zw%-M-TYZluKJ_h~&U4SOCMKUyCMfSy+L1A}Y%S%BwhGF*)qj7g9zRAD(RZLEAg{dG zlL42j^_A}R!dX8>ZrJ(Zd_fW4EP8Edt~f96p!;X!b~34!RaMC`(?B$iX zzl0x(&b3#3f-L^T@#fg1L;-fQHK2La@p5Wq(TqYdv(_w z3Lp(lJ1f%8wPVrnB74M@A|Za;^jwiCr=s&N6q1W=Eoo0KGoBXJpWJuUFZJM_;=BGt zQfchjugKCidc--5lb*jUqTl^|6TF6ZY125NCNfm#`8 z8yPvvP4~-(oOaHOiR59LarZ9DUzBTq!i^~jJ8h(c#XDfD725F3@z1u#^U6dCBVg_o zYUMT011r2QY@r~y37#-7dfD0kP;qWaAbl%sde6Fi?YZF$7q+ICNyf!dQQr)9?Wb_f zxxgUEntn)6|LDv3h=ARnmoADI+_~U#+d=+<@X5{+M)%e(jf8rEq4vCMe|NJO(0-N( zTM-%_jV&o4^~s3w?2SNnx1h|$jBn4^#*{@XXgfKZC*3lQcv&N{?XY#oR*5)&)3o44 zNfy>4%WBqa{V#lJxHkm(@?7ARKqm?Jnd8aWzA!EE`8QVu_6jnE;icv5Tv9xX1e3>e zwz}ap#7@eElx8yVx%$wP!5x21P2{Wu^?&*nn8eInY|`#X>9aBDANK$1HnuSC<7Ffq zVJ9wBSEa~JeaSRAx#UJ1I%{yhTdQv|c`INgbx&RXffLVf2DXofWo3Wk!NR=)jbKJMNOuqo!db1quTP-k z2TYc6N;T6T0Z?{7-%(GGi6VE{?S{poTWVkXfrIpH>;yjGSUL&N>B3BWeyD05Fg}QW zMqZK?Z%oB^eiG-S%*#BGWD;&7v;A_)u7kzK6`4bW0em@V~)v7 z?UxA=SZKwR(Lw|Cc22+itD$!yQ=LYVE=)$_m&Sp} zaNae3vPKQzJF$&EkzKZRzY0Ml)Z5oHxiWRAS|cXBq|D^y*72VKq#SSRn2CD}nMtC@ z#^hT24ds_Vdu%qIwiT{)OR0N3#eY{dv77o;1v{Ty5DQoPh-H)A@w=kl)UH<2cB4;t zwCPTvR;Zq&`J}Go{4JH8sqV{E)(0lf^x=I4IrDUKl&@WH@`*31po{L!%=fnQ`&j@in` zo%egE$JSTJFehj<%yTo|Y!^T$a4IML(b*!h#{qmk6!2}mfA4bLCDBE*cTpOCkyiBH z0{0SfbVb6VF?47PaIYD5{5PFqNwr5bqr0R0;^$q-ce+1^oKw38Y+%vUmTqfyf9Il{ z-giyYOHW7po2!gkn{5}D6}uNDcsp$?xNq831~UEN7MZjaX2ZYywjSPI(lFjAIT27g zB74rU$X8_tU4ceXK)b-}&s1es^c*-lzVz50-cHd}u+jul^nak6_$|O#cL13wGsM!U%UN z0GtH20c=IcDSa{=@K65O*{Oj&fNW}{!{yIyq`{oZ#Wxvv&%BwASD9jp3(guQn>*MA%S-H?zZ zsgN=&D_NBlS%o4yDtlyQ&oasm5hW{$B6}+%TSmxAQf3k=A!Nqyc>7-W@BZh0JnpVP zuIqY~58mVTI$!5`9M2la}McQ}t(`)Iyq|HY7*Mputm|VXfz^@X+ zJtYa9aiAF={h>zo%iTiq4AwPHJ+)iE?x5ZgQ0|lfn=8_tGBBbZ-eBrfxxW1yu29< zNN*S#j;JTDd_Zaq&_gNcCV>X&j3*Lvcc|!op`h0TlBl9qgp$5D=2~vE0&~l$!HIo? z-QC9P1KNK@1P5vj-heXG!5OU2mN(~0BAjBFTNj-T*Cd=AshcBPEl6+Y}@vw*4?K-g)uyLFNZO zca!($)M{PPcX?3zJXl41(46PS`%zV&^-gXc^7*m)$y0ZE$JygsOghqBEt6jUiAZO> zvO@~3dAMV2UK{6+ejJ@sG@##hhCF%R+^syoih|qFY#u|>v$7vaD;G_51`BUo1`syY z0?vF4CG=N6_hQVC`Oh+Oa3l19XV3zIDvD9k3;8qRiR~MobN_ulShe&Py@}^&LgS3H zF@wyx&*O6yuoCb_|Afy!zz~N#2u{SszR#F?UC3H!UdpRuCE!I=KK%dAc01iFyjRZh zr{0)4+|XQ9DXPf7Z(_c+e|Y}uvPw`d<=I4aAVlBRjLY8=b@|;Y=Vi5e;a_Etx#p>g z7aRrOp84=Tit>5OdVPb|@^`hE*0t#!1tbEX8NgWr1NNl_+=3lah^#{ZlJZMOC#Mhd zl^DolxEc1=2)*TpwNQZA34>y|cfHokb~f8KUmItJ?nw>WqY?5@&8MY`ol>2cm}nZG zn{;9jshgqBXqBmK9JT@>9lz)O&`=PUZ?$|r?Z_(sc>H(Xlbhz|chp@4Vr3~-vfH(R z4D1R39B-8m6IV@5yzQ8nl5B%NWzs2b)gq@hm6Q8DP^c1#C#lKMT1DE@>o2=c+5F!B zJ*$Zp7@HacYPqD03;^XdxJ)0*3`x(Rg#h|`Ob~0(>sMYGXUGf+o`}UE;C#aBn83Ml z#1H62zIZ)&>nDIk=zJIOG#cdt-f?f!|==yzHjGCricxLfmkTuQ}i9<&F8v zIC|a!4;|suEn|u=yQ4Z=P@BBEFVi|scH4(u^0hU)Rlu}eKF*S&38&)^jfA6{4$a`m zF8xnM7Tq9XOK~~bnwG43LU|056B5N(5S|9;ma#zWb#3jm*4IMMYq(E5gDMv&rcHh_ z^IajOhwK)>_~Y4u0mk}HsL&PN-Xyy`AZOGcwvRV9G-!RkoV641K{-`OGldy#EG%Fx zO4qQ|Yz(11EG-YR=vyQDBS#t%Am>c#ncXGyMn^`O%kr{t7!G*Z**CqsBqHRQchzOZ z>2cR!5-93u$Cvxz@WJY$fe5P_^D0?(vNcxfc&`uo3aQ-L!k#r~bg=wx5RoDdM)7-;vdN zdRfJnj`1i><27NaPI>W&1ctiF zbp=gLIKI68-70FVzmy3`78o<9PNiqW$+LI->7`_=ioS5f{RPI2#84s@eNGJYFKwOH zFxk^ske4^?QoeUeHfs2A-_p%H3~x{Z0QqAga8F+B(TI}1e(aTd_sZMM=G?>~BgD`R zS(Sdt=YD-XK-!yDffEvDJm&eh*-#osuwB4LgyrYLg}_t`=(Rt7KNr)^V(Ird8*0w! zMORl>%*N5<-xa9gD686<0OKNlP<#PC1VUL03uFc4RaHqwDaMu-aFaj9PyoFyXuV#1 zW6`t!VqYjmrF+^50vB`25OcoNr~;mi9{qn&IX@>@Lmq-LgR~&5aY{Uk&!T?U*VpTB zEafKx;-FKEC`elrp-d7~c>F zw;v;cOuv8ps67-R6vnF`RGDLW1HiN*AdHl{A??X$EX3F!3ZQpt+ge-hZ;gp0Ca6^03p^SeT}vg&3+Pg<&*BO+XOZ#eS~TY^nfvk@7v!G z6x{FDg-YoJ=IS_Q?b0)gSy8@OrS`@6RQ;HPdxf5K6WEi?)St?nGuaiuUNrO0>aj`W zIe8f)UId9z_(KtbiY!6YPt3pcLEtRoE>SFI08tnA!8-^PKHd+pg!fRq+X)X(YQo^9 z{Bq-q_o{7;fl4o$K!?K{4^uS~iA6^FB}E8JEp^h}L$ZySw7JbNH`;qu>GwL%OUs;o z5G&wVXT)lpZP2m@yGNL@mm`RZespFP+>Ppvo%{H;Wv-AU2~~aaUhlG+yBN)W;XH5q zp<8_xuJjokd6NwE+#)p4AWzz6FDvX=k$o+k;IfNv;D>AIM#AL1h>o88QP?< zP+iQ6WC!a5&HPtIMN9v@NX`PRf*6%3w97HBVhMTgDvYz(fBsR z5X`zECjkALz&hdTF|kuogvBCT>nAXG1e;nqDG&DvlKoGUP6yE7ooE#hgv#)Q zL74v*HWNyo2=HcME%-785Cn@bd;ujTWRswLjM(_l+7||?MzTL0=O2|lRg6_fAKWJV z0o#)QHo$ox$U5pgiFFc%{-r~HyOt2&?pg+SV3|+H`zPj2@|oaMsxf}-APu1Q8O$iD zFW>i=doeXJN~@dIC7oY3Ltre~)E%|ZKI2i+%r*@N~}BczmlJi)A@wrt*AV-6z$ z>@DYw3V4h;-)YTbYV}^y+MZpKvtvMtT47OL!Pf83+-t%BD1r1Z}Ndl zIv_5D0|Rmsw+FLyW$>7_6eA7>!d8T1AwZK=*hfu84s3*42!GDZzYIQwD?`UKC^?SauDizX5u_(WM`4!t*VqkPy5fh2IlZe6N;lzpN3 zWRvA)VP{|Y{xJ~$&e(`40=p~x50{Q{rl3|~+iw{;LSo3X8fz%jp!#5}^}k^)VhdQ1 zxHcmm9DCgM$nlmBE9MH<9 z#?(`d9;z90z${%_9x;Ta*X6g%X7~db#Whbh@fr!tauKI?cW{`K}YA6xy~! zN^OM4+>G+yha-M;^%|ORYi_c8t4V7|XEEameL&~D_xOe9vWn@Aqjzf?`BT->JtT5} zmJLlK#p5wG>TN>F1810DpvL1dFwI)V?CRpz*%l4GmICju8i~LSzt%tdv`5L3I$7UV zOLn)klcG?(>^ns--qY;IdaS*akMEEcX+BS`8B}w!UqMC28Mvzpj`H5S+jmmd!8(Xd zBe!b(7Hb4VpViPs3MtLqssL9OqC}iCa2|e3ISGm;ZZP(63`Z~uw*zk#6hI8;F=+

=t<*NT4!DKqagD}YZ28ez6hTI8wfhrj+;{#3yVqg9%hG!hr2IJ>Ovt=2z4n= z)o(HNvg+lXU{st;k_m)_5XU<3vH7R8HgjhH^VG|Q$B2uL@;qw<6dSmAvIW4#fn12f ziKu=ygBC9xQ|FD&y$Udm&w$)HU(L#v9UnzgU2KaXTv8`M-JNA&s z(g9lpKP^;^P;H-HvIa0#vt9SKkEoF%Y7p|g0q|?{> zd+>MCNMqyj+0{6Qpiv3C;VraHc*k)A3i`6@M%>_5hW8dXiEkNG?7PT$IARj}b(`j` zFSV~p{o7)m)ma_9?$x5b}=$5f&zlJI_!^rj8R_{Zq@WGO=l zq`D%r1X=>j$^?6aF#3fmy81^0EXbEvSP~74i7+AMADblu+;zn?@%hMiZe}w{EPH-3kXT^+aX~C0yVVpXzp1LzA4q_InTP6 zqX?zxWLYKjL_3eTZLv5uQLB6HTDj+{OJ)yxWy(**0fCqNH+i{^n$Y3k;7VLym=7|3 z0;q>H=%Hyz?{#ry2ZZH78j906fTu|+pDJ#7&-F{MpMUyDr^2Uy zYnEm9Bl|+N87=)+7ul!v4*QB7)}gA3FQ4tcz}hh2C%5T)9ZManjJg%WyP@3j#^d zJ2Z&pT+z@U+kO5;@oQoIruK#UJVu$Njoh9~ zF}?TaO$!Tq(FC$rport8gctzo^NuMOBosmOjB*zSHyY_YFCK-iwY4{RgAg!qxz06Jn zR05K0Vi~t~VLioxL|^|hClY2Jn~FSa1~hW_o;@)A?>=;zTAJrT3m(-G7h@NSKIr6- zlK>;k#T0BM(Xgq&9a&)70%bj(YeZWS=4b3&EU%X9nATMun+AEbBA&1o>m_6}_}-fy z5m>wJn+{+;Z9Ieb8-e@JAfJv@NldEh#JD?fQiS) zmcqVYU%wiOCLkmj2PE{3uDwPukM#2Eq9OnsqFekE(2qbjXW}x5Xz)?<(XkUc5cxLg zq?xXZCr|M37~I&5!MwsuU4pn+WR+PKUxim0*Yf7g>^3vsI|wGkj2Tw>J(6pA&`{9P zA*v30+@w>PHV?jE4zf4Ayw=f5qY4}aR2Z#t)POBx=a`wvYT7WNSr4EGn}NA#==Xi_;SXm_N{L-U-Gfmf7Fx=_qMNd@fS z-spJe*pCvJa@yN>&NF>7Hz!fZ9 z@pf*1dbZ^GjDYNq86#N<#BF#VW@6I6e!brB2z{v;`}NET{re=V@Wf*>L+*o2G^5vF zJSFt84#^I`p;YZHGrHrJ*j=nw&w_jy(D58@w zG(9~vC0Fp8rv=2{%1U(SfOpibxaABrFVe`6L?q=ri?k*DQ9ZE+E-$#-k|4z65kN?X z_CS1MB0d04o55E%1C<9Z5jGSo1|K#<5>p@v)C=C* z>U0efThzkh?MxyL^?acia8=7E7Z!H&h2kqz6+v(5#H)`514q-03{i3MERJBH$MZQ- zXluT~MTS{mqL?d)0jM~Bz`tT?Z4JGEn9DB+U7~q)5x2>-+;jnffj9vIM1f081f4sS zzClX@pNh&0ak0`(sM5jwAW|{IMhD$S@8hN-K|HzzE7lprCZkJ+GR;F`&n%}x7Xf?* z0R)pHEbNHk%tp4d+UM@>eH8xq3~!`B0Z>ENKAu5JZ>dwc|TrlcFfE95sn<)O_=(I=Ca zC@Xwe>NBWEZDzBlz=67SZ8|ZI#Ym#`K{>bx$G5R1r5lu*>ep$iiZBmPR=)9%w&A&C|=phm2lAp4LjDDTsQHj&}SmCHue(szrHFG9ZP_of*xY~dm`=* zdqwh0==d_6W`T9H0Hq{~I#ax(zn7lOK}AJ%1S3p%K9`1lVOYhwg5?Qkl1Zn(3k#gV z1;&k3mkz_|T3d?#HgY7Ys;W>%(A=x0x58P#_RVYq9<66Ndn0t@Q$G0kRFAdwP{#-e$VcU|2l)h}aZIU^Nb zt$<>(@fu5d4Aj)%DYh zh#zo7>I+~&f3nasPEAFgkM>&ec4eon7EW8HPw zqE+5X)^bI0%ERXHlbWo(V~4@TGMnwYr`-Q0a$?^UYrwrR8ge*Kb_KB=4Io#RoF zZ%v~$nI0hR`eDl`mC&k#;h+0FDvrCBL<9uTW6!hRnqd7sjg2%c4Vzh3dU}l_bpW$& zZ$53LJp0VA|7aqjiHH=efiT+obVw`hw@19Zys#n}@HN@@MKD@_MQUpam3mfMQU`qoIP@1aE)JZhY#0ko1`% z?&ucqq|>sql~UC7au2p_O%uT~LIm~>Q)|Hi$>M2bB>i{{dY%;zFs=OUFGs$>qIT~d zIZqix7aYNn1cG25RA?MW5%7n}fcrN-w$JY9BqFJO^Y97CdjPsPfa6!b3=o|6$Za?JrgM0a$ zRoq7+mbf8~@e_MH6m3Zn8y}OZi!9GG?}x zDVNPq*HZ9tZ}mEfo*-0c=$msn9n+e4ee(-&6C$|hr+u4E9PrjUpzyFjK-%~mBt358 zyl{SMM(LCiE!acQ7oz2@y2?%_4X7Z=w!Fz;Symrr$ggW^YOuK?_Y#V4fbsbG4e0`q zkTyOSoa`|TzcIm_he-}?e3T3OceJA`Mosp~`W22X=0fl6uVY-xM<`g4$|8u8a> z?q%~Qk^Y^cqZj0LB`7+XDi7PNA(ODib6fCGWJVG<6~WRCsoj&%T?Ac02k;y-rtmnx zq1Fbe0qnz%iqyQmffV9bVEDpyP5rqtKQHu75%Am{Y{7?;iuv^6%H%lK>wI|9zl1kP zJyxf9Y%JhRs#)cI^4QpaAsONts)MZZkqB=?b{fuW#;7A zSXtGvGCWm(WPsz;$h`Cig~)GCqDdVOQqjwMP!`&giPIHC_!$2gf4eZ_jq+`@1TBPr zHB4(#Xx3qI?%;a`wjdL9D(Pg#`dlg?%$`u&RED!wH$y7pyumA8Ja{mN5aE zCgk0Bb5&8guO%JU(&fQ`ab2aYQ{VMK3o%)Vt{$~l}x0>LTP zIB?*g->SRubX?VurKO;55GNkSpdbmRz%yd;$-o7d=9lnwkwU4VU@2-Xo6 zl~aWXZQ`F z2W{r!m9N>H((jYo(|aYC&#Y=^Gf(KXO)hMSqlV(pp>*rk5bqxM8sx=s_6TV{Hk^H@ z`tA_v53k&+UuATsg>`uM8QDECn0R8SVgxtk(ONMo?Fqm6Ft+)&cX zI#Gd*5KDEJ13S&Vw?^34pb5J6%6jtW&$>V2EF`BTk$86Sq@HZw&COJdm=0LC<=G1? zx{qy=0-7DJeMV;{zU?CtRYXP6!oaZc8{Ey(q{|Ihp)g`kRd4{~3&(nnV7$dZ-+vc= z4}$)+1~iD6|K?ppTgxIRW1e2 zsO|doB-ZB$d8k(UZg54RWeKq#$^{gk=-(1v-&Y8rIv`ku#*;x`9yR)Q|`1twlSLOi^z|YH4%ioA&L?k;#TkeL2U}+r+ zm_>80sX$yn;HyI^S}MHPOR$3BJ??m*p!x_;80wNFrCm9PL%mU-kdAf0Egjytw=>Gr z-Q1k)RaZ>+!?9<{lly$HleX?1uvtXoR_7d9RkBe&nL6VopDUSn+m?Cxjz@FThvy0< zWvz+Ho=m+LBOF)ko~m5=g@G=XHo#Cm5(7AWnBFl;^#&v1l+DL)zXBw+EDh#LOQgz1 zcL?*+9%2(-`;nQ;nz&7?^+m09D9js1@&xIKs$?3hy(Z=j;k-m&QMNB0Ixq zFMFay1E!jK0uiMVu z;s63jU>$}lX^vo}00x626?#F~F47w5>FFcb(PD<@F6(d>M!RT!VR9|wxm$}7O5yaV zWDeL-xTAOpKHVw|fm!(e>FF@Fl1>ySj>xh=Td(Ob#o~U1$f*FsB z3oMz*PKmx3IdHJw<_yn2kRnLmDQ+tfkfe9r=ESLML+xMw!Nb8eKOw4Nx3!M`U*>uv zijQw>RL|6C@B5G3^EjT@a&SJJv0X>=Egxmp^Z{^`pE3kUQQn0)&qKxzQ+F;u6_<^L_vg>lH%s=v2VZy^Qh0Ba2 zdrU#lx$#^fOm7%uw2xn_^7;o?Wfj6O>pU*f%DwFF`|!cf#6V6JL*(seEX*kdh41-$ zqZcG1V$tA@Mg=x=5-H?tdqD7nZsEiP2QBCI^XlnDa2%&@FIwzMj1J;QaESN@f$Lw` z&M_&&oC?~v>m_zux5nbN$8O4IO0~~Qn2*I20#IWLBf9fkQ8Xl59nB{UTaWW8NzLrD z2M94d>*5>WNsRvnsNd(@VfmN&B&=1KLXb$A+u9Oc?XQVuW;`jh)0(uVh>*oJ1P=lo zJv}+eHZ*OJ<%B0HE)_cZ552u?^}QJ5F5JROl`r~0F$J6ANH&3H!PHmg1kf#zbg(pp z2`{5v_7~?O{LLob33@C&yciG*T>p(pjP@|dZp=r*LAV6716i1+m|4tEc4NbFhc5(I z4QP%RxfE*i zq#Z-TEaY{3$%rb&h6n{1S_e=FT3S-{k@!oq90)=07Jc%T0sx|*X@X%_Q#gk^*eCBu z!6WanD_%ztj~o_OJGCdtn&&7F4-bSZXst23$BesY=_QFDQLFj6AOX>x-96#~g@5+s z^^!Z6J|MB@%$XZ;b9gz>jioB>zyV*(^*7dqtC0R+Mtb`%@MG9q9j&am-|+(Wg_|+# z7WxxP4xnPB$f7V+A{Y~p_o#3Hch~e5izm$Jy}iAXaHL?wi*;Up8-PGiwc}XQJU)ka z5le)L$&1&oT~Ru%@2xS&gMy&vgC1hk*v+NnqoHiPL^;9E`bjBMq zN%GO!7E&_@MzzO$hIij8cVJ|5%~@m_ef6K=$%69t;g{UPs;U*qS&&HZRNc9vsXOc* zBBw!nU#-^B=Q=O>whNRax3uP*PjW}8C{xQy4LjfG2$oLcrC?==OKw60wI+EFSr3;- zo)(E#GO8AN_kye07{QsV@4bJXe{bxQC-v;pcolJA;mCN}H922fyRDX?t*s56JQUcN zWKL}NfF~SH2lQ+yeC$B|!|Y0E@Z7x*!^6xzq(P6dNhFFmB2W^kTH%e`$NGncB*nxs zEk1*?3@J1oWe$Se#Y9KfA+)M?^lLF&IbI~w}+Plq?0@(Bqb!M0tJOAq(8qHn!eD#r^egwS;To8(F7Xl zj@%u+WYsN%m4D>#X|-ozHcjnK@2_8uSgz#e*N z9x!`&2#6;gr36L>L5~LKoknz{j@QqRO6_H)A~_YD`n_=kF{Yjinfiwr7$QwYXekWc zcZv32|H^-SLjF84ZXVh}}&!3Otah%D=LZYLs zU9Ap=`_7#^J2@L|UMHer!{4F&#^p{M_JnB*3senGmgyO{kP2P&N;+M<%Lywp1dErw z{yfB%iR@ww%@BrF{ddp7_n18X{aY)(0Rj(pRv2ZQnC|ATS6AQ3$RI`vm_J+6HDCq^ ztQU0}yC2RxXjIKXS!r|gCR91LRsT+Z7=Sts_)9#AQEg`EET5u<(NBl&VpeAD}W z<_ul~UhEA#JTb3sq&~qk8xIHHYfMG4ss<$zpxz0~u(9_jP=N=4;|ghIN6y}Ia&s#I z+{VuCff}TpNX&zcrU>mBY#7IA?m>lUqK}a+GM2Fc;c+Hvl2bhdI1rhdC8$&2fkwX` zuv4sy@TM>MVN!>cQAiVw_t#*2x(!#~y>!eGEi73hauy8o6OB(L{mo}3cU%He zdXPoZnOe{^JO9@y0}73@U!HQ&AjsKV&YN zim?{-$3$z@8#^0mJM~Bh&DfNi{nj1%>Po@~XwB6Kshi(L)P2=_JI1PQO=o8UTPKd3 zQZ=LDiE9Hc1WzgUC@f*?xZ4v^XnZqI_L@jWNQRb8pj`q%&$BNbNPZImO_h(2I^^v$ zdU?5+h#Ku{RE)wi)9V9Oc$k?8ac-?xTj*G&H%H3MabGiGNC&P|t@L>R>-Dbi_uex~ zRnS%9T6JGgd;MIC4kB>MgKfQ6zht(3(B@Vt4)OY+{Q|;hbh8PH1I|f#2UIM6HhCn` zxo$UUCil6MMe-qJvh4k)UBbq$?o1zrs?NK8zN?&Dzr6EK`F^m|SHc&Sz%qV4XCi)60#f_PLc&OjB)M5oDB&)xP`v%c?4Gdwc#UMa@@_ zv@;V-_-uyZ1VG**_O?;3StNKq8pd0I5(sDWp20*YadLB~Kjj-wtS2a@VDgSe3Ts5k z#oO=GOpazd<4(vwl6!8g)Qz!@?ei;r3_fw%?0lo;=l~;7@rk8Vwv6G1($pAoBPcH3 z)!V_dW2Mq3<(&7-2<5+kweiG1w=8q|bf?{92NS4t4H^F>k(8Qn#K;~ebuvWb2HlA9 zIdUHe{tVu+Dn#l8xlJ#23uX9k@cpf4Tvl>aF1%%_^!H&+T0PXL0e49SA9W%68p9OV zugI8zV@`nn(@VBzfd>RKr^McsoR!etMtAgt-vgukw4WYGT5OJ( zz%8fa>9QBr1-v8-H_@r6#uRrDwX%aVcJv zbgkQ);gQDD#rWXp9|6kV8FO=iTLo*jvW54Z-9c47G3oQx&CN7>#4FkP#2XW(c>Qj_ zZjGue${72NVTV#$xx4pxjmS!j(KyU_WlUjEsCkm-rcy6*mU!BKcYL@%?vA90(-T*J z>fY98o})kfCSuq91)c7N!|f3wOM+WlOQJU?xZ2$FKV!jgd#S7yd{F(?z99>b`atr+ z{3MZ6$Nip>A7>%S*Q&oe5?-uTD*$=K-;09-+}k#8$%s8U)h9zbT7e;>Q!FSC;_VQt zIl1WE)Yabfy+pD{wU`RUGI( z%zc*zzj{^ZZA!v@YJ4*ZK~bePai$G^xpOQ^ZeAxR4h9$S7hJatDd0yq$KQKIo=1>K zBd~nHigF$nSZVzwff|8+^=*jGQnY;{Gnw>e$d6@l+*a=J#=@)mtoVmru8QgG3KJC2 z@Y>d?#MvM6P_ev|t;KD5(EaJj=$5jaT|Ndsnpc^g+#tD2&eF7!uCZX|ZCk{<@r>+t zL;Fsqn4JiHTkEeG=&y1&r4-iP>r2-l#@R95dQ~D+bx6^MBdB_Vbx*bi*Ir0`cImv* z(yRMH?wCK+&$PC_RY2I(gG|cEe_71y?o|Ix>z!w+N_V7sP17&Ncj%Ib1}>3@r|tPj zc5i$e*Fo=^CjI3%F@F$6)NnR{;49YlYGOqOr0lHUkbA3a(CZ zQ5Rg_zxMu18(*%nyqtXOnEe0!`rYx&h^9H^|6_V_T&bjw>~Bti;eS6DoDGNnm;IGC z>gg>>t`jyJxnH`mCApW`+Bux~(eWG1>V0C2K)lw8{?&DhKkEBl_BA#9??*2ow~lN2 z-~Yyc{eJ|N5f9VmH6Z?LNySd=m^L!EdN7dw<+5ryq{bDcwQwu!TJh2uO5Gy@>67gewsb=)H zp>wghO$Wvz{{3${;&1O*bg7CAukrZq z8NA48y2~9ui2cdUvso5>=KU>#8>jI^Xwe1O`_5OKU0BsC4cQysOyqQxocYgLC1!Ir zTWF(a&0mQTAru3t0>)!E$hTeL{WelzO=66n>Nff2o7PrRA)iYhXjph2-=RH?(S`5) z$YKx0@VmR20vWA}BDe*kgPU^zZ9%R0E)SWe=-5W$%g?7w9F?rw*1y~A>UWpTEid%; zrghx7ODKe+OTM?L}9%pIx=z97m&m2Dt3;X`?1G$ldMI$BP{UJYw`e(AopD2qY&^%Rf z@O+nM^wpdWIZ`dZv!LMfrLMhHh!^6pui86%#zwHF92s42OK4|g&`9(7pt!JSBogw7 zE9vfw-%Ghh)t8O*hDx%!?l^6NI;Ap;#`Az#i`Zm|1}C?fscULRvSXdk*VfP+6Nb!I zsoU)-Ol`Ds3Xw<)KsZaI{gO&}BV1?XEJ#2?8WrMb(A+R9w1_)K1{V#DoT_Gz^=ZgS zcKQ1dd2#^ytJ0e4053!g-$xuu$yj1cjNhLi+txlOEcCKFwqi%kSie2eAj1ii z=`Qk+fbNd6j+&&#ve+^%px4-Ty6!U^ z=xyasdh|6No9%bOu!H?yOKgI%q;mkeMMT_P-62&?U%lj5XEU5mD~C*Td^1JPrxIB! z=^4TQ(C8`P0sBDbF@N4LKY|Ckg%s17$>LIVcn*jc!jdrQWVFyhpgD7Yil)%6-icOK zLyztr)+H<~BvLB0052O&QAp7>m3rZQ;)SzVc3u6O9ka5do8culJ=+7*98}3rL!blOks+o4n*WH+=*G z?kJ35I8$OI;#QCxuBzxMkw{=fRH>0me=k>t3`SG;r-8CiFQaHP%7i6llU;bC_^4^soq_Lu9GY)v|`}+Y@Rvo&%gI zX!fsyt%0!#rpIQ5Hm}jNK7o(6eucg()EVK8`L;1iTIh?>$*KCy7i;t2K#DdM3*5n| zaFvjkj;D?GEfmddZTARQ7`zI|Q{bb+)E=6G$EF|@D0nvU z(INJ+yAjzF&2J=6wH0)_PxdT{fi(c`H}s@V)fKw!PG(&CNa-(q zPgXkeg#n*AUBJ-v%SW*EWkFjH$}^uj-X^?Vaj9VPSzP6y#cHHV3$=;!1l-fgFCiUf zrbZ)yI2XY0utVycFoXZc*h>xY1%}8;2c=qMWJo_)^^j0ZZy5uV{6L5)WU;{QdBe;! zK3A55zk`rWnFR}E5=f6 zwGIgI`sQQ_miW1n1x+h`Y1qnZ?gYZCW^ZW%Y6t5M; zQHWh=5nxYg9F^k08eAW|cm1tp9J>NuoQw=$X@Pa6B*kcyEnFP&_4MJ5`tUsk*9l9MEHS%g{MJ08giX&f=8{hnIvsK_=sb^+9S|&yL zZf~s=wjq(HSF;b)a8YM)#T_%xh-?#euSs`&BBgQvk5YEt_mp=*Gz8j&$eKd$ ziQrMgbdURkNJ`j9&_zUh7q%9o{BzW-ZF>s&mAd%`@FZ;7Br$k+F^0Y=+Au9+%vMNl z-;_^7j^*aI1i>;4m2t7Llhf13{c!e>bw)BdYcukRM(n7i`D74oAy36aOM#*HIYReJ z1Q>vH`|opaWx%=nIX@%WAq=ZGX3>Imm7S*9L;yKZk4*#XusLqpy~tLD6O?rx@2*1* z0ipn@|9lNO85SO1weay8VC~ek_SchCutTd1m*p6rV2+TtW4v8xp_Ox=@4S%cy}oQNv{EtcY3t_pX~YigyJ-x@F!jvMwRLfMj2ue=7FlYN z=$4}`0*_3@k3_SR%k9JBeD@q8Zud!J6-C0}t%?9c7^Y8Ld$sl($w3!SRyeIK&7Sm{ z4M7K!u&6;BpK3Ab^x3i)v&M7G26PSZpP)UTuU)V0*NKF_U^S2yFmERMJ7*cGP>}rR zzex~V{5S25o{DNW*qh&7%E2Di(A*tZ7jzY`^wV*)!3PDz#JCkA+ssyVlu!BEtJ~O_ z9&g#RFl9P$g-XS`=eyVDfyTaZBq(X$J5`x897&|7+`<^1Aj|Kvh_3nvnjXaiGP~`h z@3-uADG?rMdiU1fLA7&k(uYg9B2G&4X|!_~gCB!N2l)u4(FAGF!q3OC68_a4;YL`rtn5*-32h7!D6iQTYBS(}T24`DK!Lgac2D04vK9TgrzKJAiiCSyumf)!$U1 zMNG|px!A-+SJ4Fgg*FeyhHMLQqa|>7wvQ_{9&Q>%=NLEe4C~VH z9b-P%)JYz__QO#beGeCFUO~qnUC*3PSV^eEGT>>MU9-i8JcpK z5W3)@gAN4xIH=Lrkr7p?!G(bca|$%~0KjSUK#q*WFJ$rkI=IZEZ9giEOUTj|Gb#)Y zdOIG50w|!Uf@00@Klz3U9wjLlpw7H3FJ8Smz{ceeue#?FC)(R_semm2hGyjCG!Nwf zPzlglul~9r`Ezk~@ssBBAZOWbw`5PylLDR4#31-OgAIQLsui3(~m)wBhr0 z8@tI!xO`{X)J?6pgUs7Q?5j4Dqf3mRnH+rgaCM_^b(*g^XXO&3mj z9SSjVg#jo+9sz*_b7YfWg3kP%BWr7O?Qp5UPNM&wGyO~Z z54;Y<1c)&pqDcaDtX9svFgCZ0@W=LX%o;HM8pQnd^JgN-VP?2yv@sl3J_jg4hL+#E zA~(T)almy5rYQ)DKNa5CGZFUSgC+Ll%uK)+zqxzCn*@<9dXVr#z75{bv{Vh}ETA=h zUOfcw7jcEqiFyxjXWF7Z3kMLm^{~}0!}UqUnE)H0iNJEJU^~Jn_jpc#hh&c4Yt`(b zs#!RrkaysX0OV^Gw@zL9gx8Ky)G3JC$Io4e0Y)2deApf)37%jhtZ}fM{?zB)Wh=%k zv#T!u>MjZvx<3p|OP0-QE4LYyx`i~FM)jYNrC^766@2XHZ|Pz}4iL2d(ID736_ z54*a!40i48RKX?-po~3cNbzm2;3C1`=pcnZCNIby!#0V}1z5RdEN@=ww=N8bU>eIy>!$JQtB?g8Cf-aU`L6kGQYzLmB`ylZ3zm;yBRW>EoZdHGjWo+uo;@R5x9Ce5on6Qd1Ohbl6^==~XS4Yq>r6Yuw*z zRh-4I>TmDZ)iZB@ev-|7K0JPPXw~v=@ELNx=p6E1hL2@ohpNJw`ih^XXgtncpgmy2 zt8GM6%SUQR-dI4{2tolvYU(GQRL+U1?DW2_E{5+q;nngYwr^gPH+`MS?tx+907H=gQ?kr>SwXsgy9YU5@I&OO zuHL;oH~z5sTY~Fg-{;Sm8Dk3fZ*gd-ql54CY1khY``W!+&=huY!O5!l_3KrSN?02# z<6ID-Cm-nqM+ID2kjS`+S3-dj?)l3Y$TbIt0@x>}7oUGG6h*A^q)NsJe2|>`EIwl;Rmf{MWgv`jrxt;d%16r{ z-HgLOGE>6-S-pMjrLgX}z##W?Po}r;-hi)L)YOpfeZ;LNLleF=yb3^m>Qs6x4_4fU z2j%mpPi|O8+M&j6Z^!!b2dH=qWrdx8JYpt;+-72G3a$$`m}H5!XMUoSAmbJnW6P4k zZ{xiIA)`11DH$1-aersSz29KAdr^NS(jxA`t?$CT4EKRW(Cs~Q^Yc6rD;cGDKRkR0 zR|R&OO#OcuJS{{Zur^l|)|(@+jNyHdPP#+O&+-BT{C04O-ox--$48hCrfj{-0UE%f zHiT>*$%XXG1Gu-??2|dbpuIO*GM?y-c&uV>tt?^tuYNf{!@eO408c+3U2E0xyYvr_)-zMG z9J4COG87=asQoxEpk`m)@jo|5hBID$JYRm1>wAxEFkeQ?xV5vWJYT(ef4}UL8$FC8 z!N)QML*FxqvOHPn2(fu>-q5 z5ypt5q@mBKJP6<#@rbr>thHAyV(EhPm04}$Cqozn|r))5W8iFI3 zxC_16*IXM9yJjIA2+5gXjbM z`EU8QP*8bgSE$yR!z_Mu`-75$6mNePj(($OF?((I4>$eJ)S$s(XZ_30Z7fPjRey~? zY)w`2J*t3FAj6R(UPy=1%F@mUkwzZlE|&+vraGsU9AO3{HVJ~k>vZDB#6((Vrj@yQ zwIO`>_=9B+lkd~<@cdwquEb755MESapy}+CBD>pi^EL4=z-VNrA&w=)VDwK^?yrIJ z#X=D52@m^zZY?4ub$WVwBT9cc3J3N!vyF-Hb+Ww;n3RLOMn-~o((Xy@L*R(vY!`cp zHLAk8uK-WL6UZ7v^w*5Uk8J$F6nO+m@^G@P0{em9J6J{v2;<+4Cne|{y%$oM_aAej0A3elI<~! z-hG~>%w*rA>wOJ*=x09U4^jxa*Xq!xVJKl$mUM`+E`+Df>a*r9+m5Y-O~j=fR=ILm zT_2BOmi`MrzndG1U$_TD)l08SAT|Tw+5sEr_0hr1)XFx}`3nh%53@BiyNGak*bGPB zqc5Ic_a)-y%q@E$H$Er$i0-yK2g!oESgQ)l6DBzjYWI8@_s2vriX$0KOX z3-9Ao_wV#oLwo+6`0(o#u(*qhsFiU&>tMA;vE$lr-`H}p3T`z3%JaoD;5XwY{0zf0LKDKpPvhl6_2)T^>X!1FA6-W znXDwQT>Bm$L#_GM{Yaz*!V$mLxs)fE>J$we+aJB>(bmr=$lq0~NH^>hQt}-dLqdeh zZLX-~^WT)r&nmTqvz+q}r6#M+bygWE>H65Ww3}7SEX8W?yXlC-k*2Z1A{Bql>2|9{ ztg`ws7h@wj#t_G{W7}4{04yXnLi+|$l!5oZ{q7wL9B{jZl%STCl=Ox|#QY6FF(5!J zLeE=NgeSds#BToY-+;Oic>h9YksY(~t9>1QQ<JxU|HXKFIMEu*uW2W;Yfz^aGi z$hB)o3maN%8(Qm2{1=NDMO4``_0;4nh%$#bKjM(0NCyQ~R2}ufnPm^GPD4u#XH0Ye zP&3kjH5I_gHQWbtE31d>oDBE9HdcqKmMe03-n49?+My?xrr~o{jx0Sp8zDj|YWE@& z^Xrk*ETdA)(<}e?ZU?Ek2#cN!?P>N}{>ho^u~- z9qyda&a-=NKrLK#Y!}lf6Edp;QA4EwD4$PVQsWg9Irh~~R#;C%k?OJLevll)4qoa` z{l34`;82B4KA0{E;V&ZtRJrnB2^iCA=&IhkmY07l+T7}4ce_c|StUTK0LwInvSF&m6--bba_-fo3Ph&wg>DEa z{nn4-No1^rLjYV6#gu27bJ(SQ%S*7uL0$_Jo1HM_!IW38K91NSHqJ@(FeRy{#86jP zBu@)M(|KAD*Mxv>c!%XnX{2f8mWg->C^v{5Xz=#*08AuI|2mlnrT@eckN-o{cgIuR z|L>R3A?YO92}zQy4hhL#;ikx**(-^RB%7>^5Ry?Tl3m$_%1W70nV~|1B$V{K-hIBm z{<#zi zQs-=G?!mwYat>zI=nSBlcSR;{h4LVOzOwi1ulqlPN;lysElmy;a}f4 zS@Fl@w@%ia8t^t{Vz@Lw>B5Pt5CwI)J44G#U?XZxSYvu??Fk1m4Olu}Z6f>}*Q2sB zJ)u;n{R*Am0xzn94IEmr*nB@2vVmMkq!2>-GKVj9Y__)X{1?*|+U^i!?2sm$Gx5GK z(CVE2ghgharAgG~#q$Dt4*b%V zk(J(^^OCu<*kXLw!{pJKWe+D0;}JIcMUIo&iv>c_^@`dp6iMYlL&JmV?Dwav#GQy7+3Ti>J z=uioqIID|qMCRzxKe(;kU=?XDa?`a3edovXbvYM*z5$Vl00TcU7CDA@4^DOaPy z!?5g#_>Uu~n_(l7{Et@q2X@RnonE-1ktuus{vRkZBxPmmaM&zA{`-djQU2-6JzQLr zvd+rYq1!|MjRte~?-!2pmDSbN5R6l(k%WJv+OFB3Z9nAH+A0Ee^YRse53zH@N^U3c8$EJS9-9 zjmYK?g_En;@uoCnPtzzLeRh8r{gyLz8bv6wMro|IZ6(6RO`hAaD`}66(}d`26_-R_ zTrW`IX{J+?cO0s&x3M&jj(_puVbucFND(}gg9Rte}Bb) z3PKG0>M$~X8qtN|U%hL%aQKrUW?pY`K|$~k6&cyhvI5^4XlRDuLxXJ2OTP(ZhIq?l zrD8;oCG+=D^o7Y=F{1*85h!`0}53E|I@1 zj~odAzl7&vAJkA#A8^Bv9+_$KIcGr92K^dwQpaM8zvGaEhg{-XO<`$zMAjC&<4z$W zT^qK91}|U#`7I=ajXpxVkGh8kjy?i!Cl_+>r$hcQ7W)}t=TX;iEp9%|ay?XqZ{zoa z^|sQl1l=1R+*~lt&0%-y4JS_}fnA8y04JVqW@{6Kv?6N#y{Rf6*a(ook(<7p2UESa zre+n?M!@J0G!zx#GL%En%6ZrWY;)!Q;(`J-!vO?qjjHAgV&VV|Js9G$vJfmdIyeAB zhQu*D+rrp*2x%BZ8%4Y<2+VO=z}cKW0@w3bb*I0PFV%>!r6R+7>&S3-Mr_SLX$rS| zpdU^t0O+tfe|%V69Ol*+=g#H)9wvD3o_PJ{u+hoPchF;SLd%}bCRKgIZ^iO1-& z?&)y?Q1Pk}Obyfe0Ts}p$<4D2J;tXT*|G%vXcQ9{H$JF-P%|;QeuG6b@eup-FS|7zt)$QWd@*I< zetPk>r0XdaCEk;JW+FWM(5LP1trjRd~|S7?Fx;s8VrIC*GeS0GD* z+fQZXB8)w7fwx(~5dxYx&EzV_SKN^{Xd9r@CEWQ=?FN1Ym>4~T^U+x%_MS<~caS|v6TkXT%R*h^5BfVNKT zF`Ub=VH*J*9O2M@Z&8>6Hh6XHF9OdYYPyJoaQG47B)}mLb+sq(zufQsz!xx&sVzar zaNoS90;ON777*NT_@vxdup4P5by-I5Z#Z}5XAzD66?+qEz3~DBdrQ|k9dl)i6z;?` zbbVc1gF^~tSumjU1oOtn0-cp$4isu{;P9oF+C4UQCB1KQ0nO}6%Uu;Q1|)krO0cWy zkIwRo-QN(N7x&{Oryk3ZgibpNr=QBC34i%4g7yu(VY?FCX%v-kV)t33pk4f(*d7X(;*Xxw>+M@JhS zx-#(yfHz8!NwB=jAb)S(BAOesf)f#*QS#7p$#LT)5Lv~}nZ6@FgE*9M8Gdb8wlqnz z3S3YHsMOzIb?&1sSO)EOL;cVSwz^9S0iIN;VW-#+%Lza6Kh7ni}^g?yO z54f)Y8AlN1_*|@xOlWGw|04iV7xc}&v^PoHQQGgerX(PZXygxYpmAKWGKnMWv55xx``DnTC z-bo=>|p z_Dp#5N>__l@L26h^Hvl5gF7jujDgpXQS6?0+)E}!^01Vp&_^@X^&2HW-_6dsNUH8n z?Q9%hZ=cDr;$}b4R@}+CU z{swIa&soGODMtQ>sN;iM-H+(YQnPYIG|Iig`s$8LdKnr)Ph~^lNVPwb^QvV*iUDzt zJaXVYNa}2%4GZOg`I}I9tQ|*8h`tj)p&f1!eupN9Fn_TaB#KPTMj%L;MrO}i*5g%9 z!j?A55htUHzKWl0wr*HgTLr{`Lkyu!*7#_5`hp%GpehKKEQXa|0qtfYP8DZ_z}i?HrG-D<>a4~{E};_c3HC31~81>xGExjFVIK-}T>3!9b(lJ#bCuA;E(OWzH{LkF{lGV(8BgABKS< z=r4JC0E=={^X^F*cc0>3DVT6!EK?16Xx-EtuVSxXN-vfn{6alsLP`FT`{Ae6LmM`3 z*r2JRXu!j>-L|8mZSic4bb9-X1Ew#(?2mb`B*E)xdQro8+Wv)7h+yOx>u1;K5BBZC zt*uNZZ~FOrKAc@`W_&0)^|ff5Pk)pPl_dy@UE1lINS0r0ZtK}{v&JnX_4CuIuE9el z?2%vxlBRLYvN0^EbTur>)}iQb5w`gf!zpv++3y=Gltp z>9HzJiyIntS)AL>8|nVGyL&?hJ97=qe8f|qQDt2UiX2Dc@eb-R4jZvRb~Rb z)czWRrnqGTKPm4bvSeiFH?xz!*u7Fjfju@!nB@~b`JY>}`A^o8&eX@(?dC70Iv_cXko zRLz{fh) z{tX27xQ9{qt-)@5NW8oo4>2#xh%bqalM~(yC`sXSFyU!T4u@tDI#CV&eCM~YuX2Ah z@(@+aRnF*qTAP0gh{MdIPS;XUqg9(~NR zJr>wFtt_eB7*ATp>^NSMJK6^?!y; zc|}5g*a0$J^CICFgbW_A_<*xw60i){ zRuJPrdr`{k9v(J__;V0cB%JDal>}>mcJpQ;3T{QiK%S$Ky+sVJE`J*$h^D34AO2}~ zX&}t^9lLlqh7KE-pGh&4S;l5i@#0fC@J&FOlLB1}M$)~MuDKr}U6ihcVv;{B< z4Qu-66pYkiAz5+&pLaeD@;;8v#8jBHX=?LSQ72-+n~XhiX%}laShDlmN|5p}{Nx zJVXD91rOpEF$vJ=tA&9ORQuCrW4~Aef-bKLmZ`#418LA`0GpZiLwQ`Z(h%)dj0rh<##Vfd!){< zUUy+N&rk~R%=6UH8hvf~&StsH^tI)Q%JrVkcbtVUKF*w+aOLNr#KefA%}<5S{<+(^a}g|Zasi2# zp@krP7EmkZ>Wq)hOs?uiO>ZzOvz~Y!(nR|r?{|_WgOYX{n?nu1lhzQg)UQAfO^VOS z9pQYgmRfNlPDQhc)LBnBRR+QMe=l$@&}CHQvhJPA*E0_aX_R$0OAnm<#z>PXt*P;0 z(NwB^$PGWO!(R6IXW=tW71l*kuTMK(ZaXCRpLd#M$%z=o{~}{vH&;YWXb62}A3nWy z;Xdu$z=k`lYIJc*36pxNfjX^C59#-08F2a7o$+Y%XgCbg1lI-(Dih8$Kz$vexF^^Sk*RZ|bnXx|U=Rvl{yW0T2u90~A63qo;9#+FbDys< zM`>~is}HX5p!3)fA)dK2Uq>72kj$~K_I*T6`=h_RsjBQKp1_V_eQ0CTG~o&OG8b0= z_7KPFJ*b1d-}CR1yLO9C?9}JwaHA@UqOps2dHk%HH1yuaCb@Z|f@$%uwjaUK)IEJk zb4>p=Ep<;CY>p#`ZJLbih=i9&&1A~Zr%UjayVOxK&<_2f=W42Vw;QpdQLl;y^sCEJ9Bx$Jpo2!DxLU_U~#B%sV+CZFs0W>j87%7+*;Vfim!KB~= zRK1CVy*|4vwt?9zlU%U&21`kADE{PI*_d-I&iA?fC!>%tRnlAhK}=S4G~^HEneW*W*D&WJTd__j7EZ%86_wCk5n)8z7`Lj)} zMxIlRv!&Pd@DyseT<$G} z-=8WNJ~;%N;_;6B?Jr?GNaDqC_6;H{z;pru3<3}6>p|p$>E_8o0}OxzdWB+ofiMW? zn>g1Y5(ifaW;yq)l4o80%r@@N##0t!Na>sg&j6;eJS1>+R-iJ*s`^QI$n;HnS>%NM zcw5hBf70mp^9@U(cUv?i-Dbp29nZ9w`1C&5@9#{{C%J~#hOud9tfeMM8r%Eq%YLzp zMqXL*+4x?2$wB|m;Ox_HT{Snc9J)Vw`o#Rse(71r=x+3vdkR;oK<9S=bA2Fk17Pv` zpLq`uUQG11$*+vVT@htNuHEIYO_*OG@&p;gkh5RSy?1X8q)4aiYp9IAgpBXc*B!8V zI(JQ-#Y1@XLEQtO*d7vWDMJj|;&jTCHU+#do#rf+evSA}tB-WYBk!gjmlN$!$O2Yk1I-ke8uWd&DqZdi{HF z+#wn-36v$KhpzWe-Y%*XJ5}O<`1i#v0&bG?zg;$EnogauK4@s>{G)A(b=Tx<*znys z^*2J2J0^BM3Hf*+w?x#9buHM%Js`gO$#} zF3?WmpJ(9zVk&O=+ne0Lzyiwy#B~)uvf&A4j5i2k9p+o2r=l|Kg?|S6+;e&7J^2H;VLoyx~46Fb{54W zIHc7;sDSQ)Kr%Ao&ZY+Y2_EvNxw!+WS~yPhukP5V>o(SSl#L+>zN6r`hrKl~H!eP3 zb8pwU8HIsmeb={_BX2`#wjAEgATHfvO|rRcLvFD%Uh8#WyLDG>&yvr}V2f#HK3MD; z@JjAFUQl@?QZl=igUo*=`_b8ATeii*tK*9f$0K4dQx1zyd%rdJv5DeIKGFVdX-B-B zl;VJte|2PmV)HKVm$?X)sYN_>+=6CgP^R5*Y zi%Ry1%l~*hVDg^R>yH@yOwD*-Z%$#Cx{!NNE?GBh%ZkjciyC`r95V&{`p@VsuIX;h zCjD^a*putbr$~0{y5pP)u?AoGFrc_?a`VB0F~CNDeY~{pNEuNSg@lDS#uk}GC3Emf zy4pGYw#+812-5Y%@I-)f-GgzBUb&r(TQ{?_j{v>3Ef?(cDl|Ypfgubay`my`=@O-p0&3wX2_()`gLcPe#l8#Bkv7-9Hf`m#g-$u0DJF!B_A_%nND@ z&7!d{uoGQabd$OOV{SL8-?v3CLd7sQ!;~#Kxv%Jmef_BN5p|eo1kw zotX@0vAX-*;ZdsOOFKzb3s?+X%V5#Ie~{VjhfJ;O9-BMa_N#U#N5y5Nk`9nZGxp6+ z`-zCj%-NV+7~1h;RU)FkBL>|>N;}4)&r}NP_6&9R7A=O`n<$faEHwA8oerO|<{f+I!tPu}M3lWQw)Z+-B==;zG#KP8wa`T{HH^<>Y9AaD!OwMv;;a3YK%+ zaZ39OV(2t$p7vYhajtO=vwkn>A1^SXQgq9_ekc9nO$M##Kgg;2w0(0(^48|vw~}`& z>%zkOiTe}Bd4EI0ybaV79&OS#YhyFaP4_|^9`6?uus)F(^Gus$!-fGOxCBJ>*31m> zTsIW6P|7`gxIXyz7m+RaH_KkBF~50h5Ep2}FzU>4&LmjH;F#H) zs2%z;JIKJY+O<36Fd*_sn_MfApgkli=5G~m+z>(1A~sJ`5=LcVk*UbKm!o)N(LUy` zPbb1SkEO)izY-PE6nHQ%j7q&F%t5Gj`JXDtyl=^ByM*$3Mr6LH=9DCJm@l={)b^3G zh2sITKTaQ(O7xW+e)5OrnBHui4IAWSo8Ir*D#JSe{j?`4e2%#NF?=K?IC?+6^mk}z zh+tX6vQLTBS+RS4J_>|b7;~^-j{U3W3Yb>_l=Yc?zr6Lq@10(&!RY=fH7d&}>v{8-ohr6w(&wLF<)Rfo>9w$C zpk!+z+xcUV)=&3rE!X+@8Eiq;MJjfWt*h4=I(NLZs|oGs5=cqe(r*67`bbvL(pK8% zf@XW`s7}VkoMum5PobRiQl=%@=O^t7GP3FhEksA{e&i28l$NLPPCBTeNL6SHa!qm~ej!{)6@ zHVJwT(iheG8=ek_BpfxUwqEWN^3}^-IAwIJdWJIb5T8*mQhRv)P@h~UTRLG>mSTt#lN+>M!))oqEr9G@61?!XJh-5t9dRz z!^u~x6n=u(OfXi#XkcUDh$K`Ho-kAbBN==PaE@09`Z~To;7AvYZIDvD3D60Wj7$IA z`THXWvu46$wXo>z@bDUZ)PY}Y+RT{iBlh+(Z%~vV-M|&UN3_~w`~5C_;R9UYr{2PY z)y7|}X`I3vr^#mfy})vAIpVXFS&c#m;_O)CE5_{K4ULU(xm^AgdOdkNyH2Mg^NnS{ z(2eb1cU%`rV$cyi@HX(sC1>7U^L1aijfTYBxmxB-FIaS|QMM(SWpZSV1R3skDZVC} zQWMvhc+x)1M%uEE@>6J?=a)-#zJ{xlev*bssKzopNUIOS+V!wQAOm2$TndSgeV)H` zNg9%RbMONaH$Hs#1&)aVY=R&b#pLJO^VzrB>|v$e*pMrh98Ugm(SKwTp*CEbEy;!a zCr*`^Ym!2ILZ^ftTscGfmw+1j`)a%0cnVu&$dhB4a`%crcd;%61x$lK^g}yjb9Xna z9wm_Y3lxr}-+zz~0j95-#m9GBOS?KJYCd`$p{$4>2sH-h4-hOfJ$vK=5YlhY6d1^uh=a>NnpEz}jAxeY-plkOz^MyiYVgRb zW_zpk%bjh!n#0Nc(0fw8plub13LfoCxN>QJ{WSh0$Gy#ErBw9i!cXe>rSZr4f|z*Z zyxK@2OB zPBOnK^X44(7sg7Y-eAJ*n0n6&0c)C>np%4>DPa(RF}w0*7YEhcomS#PyPWi`PvJm( z25oA@b$H%5sS`Y28 zX(?ah_7B29^7ZRcRN7pv;46D?Ry|}a7>#Kaa4MXcd0Qoz)T>>GIbK{GzM3ysrMbUL zTZti(taPr&lR>-h^S5s>U&M%1qd(VizdX{%3GSyNx%=^UwO)`oFr-L)9VQuOAg0T4 zS>@lkT~&3hfbJ43=O;9q-r#rQ=r`aH;EdD<5Lg}hV+0K3g`9y=am z3&rFsSoMQt+&K-WaNB3}e&3zuVh%jL**ems9-0znYVYl$>aeZ;>tUW96RA9@y&E!1 zK1wq-QPpqI_>m3lK=ki-QAiB_a%EWl$l4p;RS4s-57%7qVOzcuesY6QF7T5u`RP;L{R1lXYfl`q0I_H#o{-$ zD%j-rsoa7#4n$)ROQCne9>B0%AO#boBn_}kvX5S1Q7`DKvSc-4rqS!pJU3;HArm1K zna2h7bLcdo#v};xlCH0L=HS&~XxQaY8Omcl;8iyQJq$)hFm%NP2NW1E%1|`zuFeNSf|-<-*u>HicTyR z5Q;>`Qz1O`JxOgyA=6({m<#FIyyY`Ik3ip;@fHrl05XLtcAw#VzSmd3RmG?#moRAo z7S9)qpAvbu#~X8on)o&99c)%nJ4oAEK^EIV4U6&Ee5@}-$zbEC=s$G|HUf19CVj>T zN;8W%p8T}JjW6lRjyKh3Zz9cb+6%gfLmc!}!kzh>4tnG;eK>xbNnn3xMRXonse3Eu z<%@AgTEx)zgSUrx0;Cc`qJkN4e$xJqL#<@&7ELBCOL6a*e8hza4_Z@A7Uo^~18zDe ziCT=~+6bdklFcDo#3 zxJGh#RP<5C>w75G&oylK1#AkSIk|Ts*Vz=tp-IO@(kqeOuwTaeQ+ImfkK2C<1|g;= zm}qR*L7X*CcW6m25#E@#p`h`@1(667UV|$A;ibRp?d_TjZ^5#E{O8M=V^9l&ha9&} zF4VR>S~Y8SzbWJV!B*KlFC1{(`BHmF?hW57aGYf0#J>HsV1TBiWa@x-gLPYxkVLY^ z_49ex+qUF~o%>E(zV8Sq&X(pc5`=FZrxn*pn{?;eBPeC0IUpcGe@M!Rb^d4Mux`kH z$CJ7i?h64vYS;ezI5P3UI7IuYRwetV zkW>N96S$|Ssl>GPb4&!8r4u;0xg&WoIS*^fb)HuKAXl;pM%sAN-*QKA zoXmf@ujoJD&=#0nT!p*{^COktmf-lwA?zodjGnscYQo1=z*>3kS0Iyis00rN#+@K5 zWoV!G^~J~*g(zxNeC$+_`5L2N8l=SzYM5*ux1b%k*3 z+(tS%tcw)b-@k#7X=n(P13>TKsODe5WD#tmyvn%RbJ2!0R3Tumt~e74VFn~wXH)gl zrP-e@zs9eLK_@mvOg=T$#uGD@uq`-}fKCz>WK#gi@Ce=~LKZ>Zf-Ndel#_RKE$aQY zi|pmlJM9k57UDAJmI$>XR{}6xlv8luL52916;V#jsPX;;McUL`iaxvrXhzKkX;mgF+4T4!8Y^T zCWCX_;c4OBm%3uEQluEQ{e@aB1ewbo8#wkHTwgr+|A#wI>`3A!VKzrnY_yx1Qh1A- z$nkp@Y(?y^?n%y#m5SfXahxIT06Bhvr20~LyHDZOoZ|xfk~7Mmt(j{b_-;9((#n`( zL(_bO$*Y8t?tNWaw0LgYgTwPN#R3)fX_Kl~p2QS?x_r_H}ilifT&=?uW$B!f58yF^N^pQ63n9k)Cu<8x>bxsItq#7NATx;SvO#Oo)P9BA zJwImqN>M1e#jxTET{eaVO}rZB1As<%2d&s>CWAu=Kld_%T7+38m{o*_dto7w+6;~y z43EKn2U(FX2Da0DkqK!k&7^VZmy-)TF7Uu;iWg4rghvP- zwf~L({<%(rw3Rs< zL~rbR=8RR{`GeKbn4bR!q9#y-uho-`isV4~G2{;7HK0VnOkFQSlVk$=CuV078C<(| zsS14np#(P&YA)~#U_`7{V-7{xNvKczX7E42cR={sBgAWQ+{zb3KMm9NR@-v0ES)F; zh}zZQ@9pagV<0%`;6*yE=a55R91NUv&HjE@n1<#mi-r-W{{Xea_ed%}2g7$KOik$? zlfF`)@Eiqj5Hu{89Pjml_a;bNQ+K0rL+VaPDOME5YrQeu~8SAt4sqEc{jR}7T zlo#*+1MQtv6<0`kLjzG{{)-7h)$Uazcl79&<=S$An~;JZ zN#W#R^rFN;}LCKK~U3g z%w4u|%duTnA;_4^zeO!-tNy1uv=}_fy{)qX^%nPOWWbGwYz9$b!uHSHaRi9vU~nMt2TL9K>{#kI zva^r+e&yn&=9omZI5_ir!$B3*Oh)~Hx&=Iaw#ZfJh2jAN{f08;LY~EPQ0uNo1(7tMW4ymX=}xy1TlX!B*nLRjDj@7nj+Ug-QJQVhm5C zh~cBG?@O_`cOG^3VXOT=LNmC?%YJfDUaDjJ{<95B=10#jdhp~%hJCn%2K!On!7C8h5Do~DxS5{VFPw*E$5WH6i zB`pdFIAtTI_bYsW@l?u<-H@#ai=_-_~2F8sMNJf7B`XQ##sHi)qi4O$?7^M!7#v@5WoA+%=)iK&*Vh~mJq>3;6 zZc)tpT`~*zSn~&uG9F#ud2*-gRg(dCwnfJNoejOASq3ib#r*U4BX)+AfljzJO#h82 zTZ)(f5KcO?4?|7QRwoPsZ+x;ZHCv{MKAcNRsLub7b9Tnf_FMncEiLIeoLnP^B>Z_Z z;&-S$JRA9h?RwrPRh^T@ic{3-%|oyL6XC8GJ0IktnM!3_)~N8b-Z>>y@?6I7eDnLE zK;eV%78+!KE=FSNDcxd6hhF7%u}P)-JE?0D7&{`T7(1xEe7j*RQExL8Tl_-TEEgZpA^ar7hgZ0uV)zq5_a1PJ8}Ep8*VJLQb~C_OK!Ylx~Ck}%x* z7tu#t<#)!)Y1?@QZ*ggM0E@Gqau6&$H1SNy8*~8Bvo4Mi4GF<6+grj#WmxMOe?Hmtml#jC+-w=JsWR&#gQK8C+#=u0rgq`NdF{_^^fJ_Hx^ z_fwGce)MSetBDQbL4)?#;yX3?(q3=STam&cb|K)V2Z zM4aIeqLXp{VK+c9N*|Hvk4iL|A3ANYJ2g*GI1CMau*hs|HZD753RIlS^~GT|*QSBn zk~#pC8JTRg8%3F+8V5C`t7Z-L4o0bMG~H7>qolez#+s4!o^~>{T{Pf>(WaedYDMHX zN@YyoP*`7{^!4{o zc}jODV`0CXTaw|zc z9H(;c)km1RN5j+P2Pu^JlE5x;Z6aD;kxUh$fLeko!Y>3lc*32qeTO>^BEKPf&d{b6 zXZ7@jdKP3qAYO+cTZfVWu#)=ji@-=V4F?GB_(<&%P&G7(aOA@1B=-R3)~J`>xIM(V zhujWaT+mPw%8LgNmLRLg329zqZV3S;VI+uq50Y{u+Yb*jd?1y$AQZ+x2*J-HWD=3* zk#(Ml>7hA4rrC5BZ5dLTMxa7nIz3 zf>X=C0X%~=e(jnb^Xzmh`d;aMTdeFgduY;aV2L>%)V zgn0;x!xGyn6M&ut^%!3g(#Szt!KDlB8t&cC$d*S{fp}SNZcI(@{Fej1I$TEPzJ0?J zhcX2fAw){j2qNinsQY;1LTD4u=w|O?Ql>fH4T1Em}nlwIwjg5OBp9Qn@`}gia0durP z49{oh_i%DOf9@At$jHwY7Z2%wR5Aw=6>{4#h9JGP?V{e75vf%OniYGT)>!G`O&w8) zfT+3}cIs(;lidBErwf_*ThCTiaW6ImSe?9QYGahHZ(JQwCh?DtXtUxwaUjK0K%7pT zbg$g}@<-9y zc00&SkFwGr>N1&$K7z!HE)m1$jXFu>UQo}qIHfMUy%sfDjbY=RJ`lE_Sfl3FH}pX{ zi_T!E-oH|~6Y*KFB1AKX#j63e58{Urmk!CBUfJwY0Gt|X%yIvthzf#ASpUB|WGH(2 z@?NfY=;FB3SAz-(fjHU%i+S5F-o+5XKxij@L{AT4rIUj)_J1w}VMpofs3SZLOg6Is z#)D5=rOB;4Six!csbrW)WFYIb(7?sdkL|@P1R)^R9PEnVw>l(6$^AD*ApQXc20IbL zTB>P-B*P>GlK3={20PjEaO!6kSX6uF0k*`HA4Z?^Bv-_PZEcap2%=l1>Oa{moNaVHZS4Ffidcs+9~a)olYI&OfPC`Ib%8#k%`l(1{9Vhn0bCcX?aS(}BA&3}adoi9X! zk^7W()ZDUNwdg9K+~a@KRpf94NXQ%AhF)3fOBe4Ayu7z~%&4>DRLk9Hv8+cBeetp-Z$4+^L2l*5eba@>vwc3J7S#$J~@#rZ;# zIYEM96V>AQ_&6X&gsk$qtL`|ZQ3^|t;6;4l4Od`Ell!(3kXs++X^)6SZTO0j7@JD} z6*86Mwlf7hB&@Z&?^OEf9tE$k@*#)rDFsAJI_Y;5r{wc@Ke;dv2azKu5+x$FX zyoSPjFJfC6Xv<&n2t-fuljI@u#EAquYpk7rQpqM8S>PJ54#4PaE$A;EB77DfLvw@J zCNX)$SRfFxz!_q2y!*SSU)f1SG44WSIsOoamhnU5&3L+bMW^~GflP{cg+91Mp?^eJ zy$w8~P(R1T30pPdTqcSW{0*6e`zx)}eqQp_ebb$>&rst}v_ug<5%q$w2k5Tpoq*MU zJ_&(CLU_vrCY!il;33F2g*}U3H~{~}M7QIEhHa}4Sek`ro8t|C0X7Dlk+9U-{D2K4 zbr`(9Lgj;=4-Al3i@8S;QHZrzRjFo=;5_x8Y+t7#`hYI7_4#u^>gakHBM+U=!5qnO7P^ELFYt@hqNjz{CKcoe-aP_|hK&tn8ta?LrfaM`WzK;dY`TLH1VD?*rXn8B6 z;l=B-yPZz3?m>KbSyk_i7av?rhs|)na{Y6WQeX=wzqC6NCeCi_S^Tn0$o0U&=ZM>O zHEyqEkIHAITnl{2j{|l_Nyv3JMp1jzeTX`3LbCZoXMu~0fHDlorzy&PKFX(=6Rt%* ze^+V0_}N=3`>|h;+=p|q_Ntm4t4YRk0_jY9mG>s=vMHaAcAh-aBxc`SpRg&eYNuDx zKdt*2WP;=SB)Y@z)hTAfZTtS0?G{0cqw1c*CBcds0gAFFYnj~ zw?hmBF#4Q>B-#pw5kR)$=&FYi7pAR!x9Ba($-{@!yBrX3h!6PmDYesRcp^?ysLPN{ zi)GN$6T+u5OD}{wL(i&{5F!PtF02(F zKel2f^3WNhY!34N8ejgMw-+0H(+8A&34|pmEC1^MBITu!^d};cpSykaC?bi;j9wLE z-w>9Hj@-_4YFdH)nIsA$?jGunu@ru~8udUL)t3kaO^xqX=EF?v#VN^4`7ySGd3*_t z-D1BJJ5?VXp}5`6)7<*>-rfvD!}~waOdQSExKfm@zwL{u=yw_GQyjg?MGW(t*E!r9 z;)QkMTUx3jLy1YG3oBTwm^(ao6R`hsw68;$15aWermfqK-1G%&!)pt8o71>Z0B9m%D*{ zEdzVb$bUBBzI7vQsyDB5emjzO^Pcn8Zg!oZvj>&PQt6#dCeLbr(dtWa?7P37Zs4PS zr#Nl!e17fw11uiA!kdQ(h9$#`$DQ(v*V|{qc?E8k*LQ61VZC;cCDl&KQjA~n^wqB9 zms38fmFH9vRYsl3StW0bBPAJBU)wb~_g!{lqitnMJG^zk&O6OMJg_~HI>(vqqiw{N z*d57jW!FumI_PiSjVoM~>N8+?CMKCAP914qDi9jMz^3#Vn*%E$Mj$-#L?N{egIkQ4 zEO}Ryzt)l;IMHyGKpK2hiw0dmpEENZOjb0^0G&fWZD8Jke*Q@>mxBXm$XsON3i%vx=0q3%OA zLxnD}lZG`$*|jy!E8F@ct4j}XSr^?rnLY2n$#SoM{3dP1JsclIUvIcMA;xQmyA0>6 zw(jg%{avSvrE+KZo>z5gnaau;XJJ<|d5Z#1Zh83vwg85lO2N4CDn{{_CZ}*ERH{fGm5RN0aJ!o-Im_Tkd4V&Z zDYaFm0loK|!z0IP0z#U%IGhUKP^~3eKD*SE{5T-%|3oEwnyd>QNjApK zgGn~iwL$~fJR%nb#bnh6UQf5Rwm0YtmL{=_uqc4-T?8mt=9Sp0EO5WEF$ilFDs^;Z zcZW}#oX3%b$7kTr^cX~?=n7VP8VvtppD|sguGp+0x#z1$%zNBCV8+q)?sqb+vQH{1 z!rnsRhVB!7`W6_&G&e&A{TW6@?v-x{Yw&f#7!tD?NdHaPDsW#t0*-*q3ycFV8O^9L z%V{=RO(mq3qqmcX6Aux>C@xTL%%J@&GLkl7^5u=AzsJM2;XXdZ5(}uDcIF4}!-Pr5 z);CHTP5JBXeuoW(mT+X`pl0%jN7M|%=4~_V+ zMTV0>Pkke%&y4o*T+J}nR@WEK$c;ZgzxV21nWbs=VqTz{v3I>PA zxS#xIxOp;9oX&JHx8Mym{KDS&^=#3IQbB$~q?AmZR_s|2#KGn6Kcxg8NYG zSpuRRgEaWClvL2f7AqpYarOViDWo^I`eyv(a2{d-4vvnN6uH33^i8GXL>+{;7|jDQ z*5IdduR)QHs|iR4#`oGbH$Emws-E0yk_OhmCpkbFu(D8gH6Lch`b z%V{R#Ga4DOn$F~gGH1~gN=FUZJH2_{U`AYx2dFoC z>F=MI{Hli!6XN0oV=6F|h46U;MEsuhfC8?q4s9LtQ?nAEd7{u%r|3A$sl9gZ4>z}{ z6l1}OudzJL_QM8)0rg)Mg@-Bsr;cD?ODTh+o)Z`EQyu|v_GV66N2a3(WsNVBrFc8} z4tVmlo-Jsft!*lbY|hN&t+?KPEv{(pDMkBc?i;q3&+Cj+$SGpsl63p;(TlU+a3t|Y zIty~(k5aK_f7#8T(?jX%_G#&-Yh{WQ3{M=KKDI;2+XBLL%!%P_qEVeK<3rDsiwCFi zkjMG_L^I9QC&;OInUqHI?RkkDrq3@Hv_=}=-K=B|qC+DU= zqVOrXiRnIlB;pG0mLa1hLdgbGK0I2Sp9RiHh9%sGaMDbBvHv+}eGNq*W85^x27Yok z00NW?*8z`cdj#1pmLMY|BcIDU-nVj|cVM77;av6>g9Qa1JtL#TVqysG_Fs6fs<%#N z1Q@<~8~4)%G#%rL=s(k~g4pd_2vI)5Kyb96<^Auv^v0k)L7-zK^8;=Ej4uNy27*68 zk?8$!t_YH}Z=XQaN-m{k5OCvyAD5a?zb(cJ{7gsAe`b5okVv(Qn;SB|HfcbSO@T-n z8}R-V>4nb#*R9xRmj2VJ*ew{+V9V#f#+(p9=l-m&e0D=$-(}dApjAekd1nQ(EmZfP zE;I;L`#LmaERX^Y7$%dOY~E425U5L*Ae_lq0Ab@Zk>9B4GVCvgw*S`;XC)2b8UWn7 z&p*%;l>7a;5~OZK4}iM>-nQI(A)sRry61 z^_6Wq_8SG}X6mlJeKkzolEhK^BY<3`^f@x^`-v_g2H`)yb_U5mxHHofU&PoFT^!P( zuM=OgF4tKxzZHGD#uAo}V5-VNOiAlNJUWul5?Bh1mf0Tj*F>ivpf`#;p4l1-r808M z5ko=T6K+y<7nVIt(y*DTg)q(PX4E?nZ|P%k%xj7y6NDN+nB&~~nm;M{bSBpkFY3T> zd?_p?9?KLBeu(>tGh%aC6Aq@6J4*m)1uMg{5#};=$e;(4`aW(n6nyA!!otFW9*>E| zv0D0t*j$56@9pyP9uVAKy$ZA9V4&@r`GI;*<(g&Cs=anNFk6gz_#)x1r$It4wzqec zu`mQZ5fL<+$$-^>k1YfO59Qqz$K?#R<8TZaEQXdvxTmr8v*SqVR{np?y?Hp*>;L~t zB$+~s79n#&LXxC1MCN(U95PjiLXw$Gg$$7~L*^nG8q7%&B~!{gCPl{P^IYxk`CZ?0 z{yu-4&vot3wXgQt+p^aEzVFxldOe?yXXIopG>i(2ceH1*BybC9_n0d=`I88F2L>W& zOx`(ul|3T>{uMOJw)50ke8J4V%}#(M%pTpAgzXpiHx(BW_jo`y35E(Nuh-;(PN6Kt*-igc&U%mzBq8N_1XI;1)noT1b?!$og9e$ zq#VdabDE07?bl3obUH9cjz8lbm#-a-lzHYW?=+RhJ=EsS7wobk{Ax(QpXSuUKy@pCnv(MSo?#y1;jH9gk0|YLqj78~o@*s4g4GpUILsNn^2~ zt;=~@!00IJy2g~1)A3LAaTJ{Uk{yaHX;W_45(jH_GxF7mKw3=@V%eD1A-{l%*xb}K zH9Z}SHq47;uKoE1;^B6lT%q6rb!r6#zVmxL56!t#d@5=gPrZE`8!xwAP#*$wK8SDD z)3tCn1veidX6q^;Cg-pgn$lF?PlwyuhBLHhQDSkJ=#RVG z@k_AZ>9luNOrG6 z@v(09qyXiK#Y;!u&M&!Z_U4_@rY3LN9ntmAT0z$WD9zLew0r~$NV9PLiMb@0SY%~& z&z{NRsv`9hT|c}LjVz|OA5#f(-FH(h67n!xFWwu8W0mJCO{Ii(&Vp>3o5J%C^IpLX zWKV_U{LGTy069Ptb)3f@7o;v!Q3Xr8X-z039dC_jj@&ufzYzRvuW7B**Pemj;<8_w z<$6Ril66JZN7*!OAHBUsJiy|2Iix@6mMDXhp_dcWOritZ0+)JEQ+T6iyn2440aWWk zCsY#PHh7roNTiyc7NRb!2~1avb|x@{D&`-|IQK2 zP~`{4WOxxuc&OSr7$$?`ozWd4vX=Vz=u`7%PqXAwL|)}q30yw4n~U*{Suzf!;^Mc< z_QKhn;I4!|HBBaIYv$%`%%tO0;cr3lu{iSdCr0z!S$C;+pXcfqBFMFLt^3H)wY=)? z-WH-D<#=v)Ehp$u^03laSdqU4uGFJxuFLW*0=Yt)F zZ~|j~%ogr}ZDLhdzK3$JqR53Op4?L7&&T!nd>JlL7&vR)sJhFKc_^-$eROhL+{1cy zfbpg9jo$3XVWH9LB`!*X`CCE8w*QmOAV*}WGn~|NlD49M_dyB`1*homE*iJ$ z>g^dgwB7F6>~D4n?N*`=x)Sqc>%IJww>kWkAMQf`5E?a9%!P$}xo%{ERPE(O$jyMP zUW{JY`@xu9)wb)q!l^$?yC*mg5jix7nBm*FM%V}%ZK5x!N;pGi>xX`MamjWqjSqZ0 zl+61K^_7zydZl>c6sdDOF01-B>EgRUbEytQFAO6;eE0y#MX1i0HnfORM!D>I_e4|z zwhMDJDg}FQ-J7f;@9vtHpx<&JehPRV@voq+T@>n+{M4@79!U>CAJV;a+nFdsJJE{2 z>Cn8`n4Ui&1daB~=;TEOA?m-u7ds(?T72HEySv%i}> zXMfuovg3}6>7e*#_WTwBB0xI#D2rBEo0Wn(XkA%8iALpeCsI`q=V5(~l$C`VmZrr* z3>jN`Um^>idvKK6+Pmo*(EpM9b&Z(DIzr|XzjQEP(l|nHgg-{T#-7af=-uL~4VG-q zbPs*G0|YDM4Kc+w%Ft5XT~XVE@9!#Lnc4cpnDSfW=fJ&GqcLIzHf!kx*NvF?#x6b1 z2?k>sr>61-7Fd)e(!1=$py34;1T3xwI2Gww z#)at)g_C$Jc3XGTtCo$;*)1(g+~s8+cbBVKO~-_hQyLg!`CQ-vhYeu*bLBEKj& z($#dY$W3$F_(n*wZV^~Y+|J`OM~WT`&ir)mnuiQWRPLDGd*O+thwoXB%Q+aFS?m+x z{N`?Sv$B0yfO^Xpp{(vRL+y^CwkJPOE;lXotW+&=g(i_dqcUY1t63!&Q*Bz(RTZBj zA?sFtv<=ylxDkjpZMO!kb7Tl%y}}{S&Q3*>5V`rH+^tbbS~l_o$GgOx3_n; zsc({N^FfGY#ejyepWG&EmwmI1vXyGG1HnvTlfb68nM{4BMGk|2`+*)}ggM@HEe#`Q zx#JnyEln+JjW?A~*wXR6B1|1)jBcARHc)x@Se~83%uoEehg3mvGBbs0vFtMUxj2P_ zZ#M39OXS6(VTlu4v(H2y%^eX`*}))wTy2lQ@xWJd-}q~H$(>@?3S`xTV7?^yioM7& z8+p4^F4UJp`LKau5idlTXm*{n|LFW9URFCV!RC}PP42XALEC0TF(?~^PypM&yCq3>Ss8_5M8MECRH_G-+h*#OunCb zg%EXJ_ff>Ue8vMl$| zBG=jeN9*#ZV1^b$qe1ig^0p5D7;T-6zj&Q*|JfzkaDnUAd&5PthGjPEU4xS3qH*Gk zJW5;7hA?hf+h@PBL=hw2Gt5{_LYcMM!E}=$jt}zF7hcKOr+3&Hm*Q>I#+=+mZTWeU zZzwf!XOA!?g#XAAoC zY>5vG#pq;O{l+$$y{KFXlWM&KZblWVQ;+AIn4`yQ3KOzX`5fwj+1SH zkRD9B_o~;KBN=<&i8MDay<$<$G5=Ca$9|QfE<`eFSxs&$;~S>>wto4Rq9w-%=7@ba zlG0ZzcKNtZjl4ZHlFW+Y#k(^>Z7*XqMW;o3)@YR9nD`V+-3i^cZG!Asu=kFJZQsKr zy_NzdV(o-^{RjOkoR6FPTxj;w5CsyjN-yKZ(`N?~g!d5R&;0tPC1@|-7{X~|Ofzc} z*2vYy$}qg;quIE2kBgAo3V;SJwlcTJxI${T_EPSmD%mQytBj|0e(B)UIexX^5P;~p z8RcniC2Q~qMD}Og%TQv>V5LNq!XSt0LwyrgR-UedEnC9bXoAFuvNF`qqGvRhp1B*{ zPf}3Ga~Al(F6ua_FV1L7!Lz<&;8xthryfMxyaeBDX<1GGDt!ie5k{}`pBkDvl~uQd z9~a}AI(&bR?UT26!u9rr<+FE=Ni>~qREpRiN88vG&y`~t=3afDkYf-wi-K5-vs}_j z{Aux({mh5NgFU1y=&th0YXdoiY;4HmG!`PJl~)-$5g?$}EPEq~^?>m6J(Jhl z7(@K4g%Y;Xngp6Pj6ZVy6Q?YGe@Qw}t=#uE(3SU*t|wx#V5i8}Q&D}=dSLBonyvcx zns<*HsczV_8{|CE_jL2tPl?(dbYrg?bMq%|7QX!yyCZ*CZXWn-=pvb*J`q`R%V|Qy zkRh*rFOP|HEbVT>F17qjK={~G``+uZI&)<=ehU0rTc}p z%@21LJ&{k#`n%K00u8^L_bJhbRQx!TXE!nVvS^%Pa=RFZgJJNBN|xx_?vk#{wFN#e z@5gHPwti^Oev>CgXPtH?=wnQGPmG7RON!tncgi1+fEzLH5#@Lt&1dqs;E{Tjz#YzR zh9pt(lyPm{w}(d9s^8iX2DU%u@I7dj+(g|bGf9!B|K4){V`YPL_l~qj#?zGCDQMqs zL9b~PP0+7?Z?PbIsjYbJ{irqh59W!a#@@nPj`oYHb&%p-D_dC zDc!dasMltY&&5};pZe{seId`D-P>1ooYvc0=sHzR$j0p=Mv;3}^bK)EcGHZCPV!N< zMA3avsE`nkVarWNZzPbb$G08T8DR5gT4NVWDM|aQQ#I|EPnJ|Z=opp~eV;Fxu=zCg zq*Ruh@%1R4lVNM*r))$xIMl!7t637(`I2o74U2Sp$g^0>`B+)mPqb|bK7IF(u-&D1 z``e!fr6k)D&671Juf98SSokxUg)r5fXIJ_jvpAgZy})A^DV}Rql$Y)MQ>0(SEScws zw(#)bwTEh9?2RVGKYiKx$29Z(GZGrr9IEa{R9dDyiVV9fl3Jphy?@(a^HG*$ieFrm zYo7Bvr9?hI6X6(hIl5LISfNNA#1@)WbXJu*=Mnb@o3w=xdKg(OIaUW^C7LubkK@SN8~|`WNpccQ+l) zPu}V8Q^xx&YDXhvSv&ThH+-yD!=}Pxdhwp-8IkShEOwvHF@F1tg(tMc(7HvRKS^`f zp~8DoguY6B5%UTe8BKrtVhM&@ajKn?bu?9+r^4$r=X*7ck{qiI=&jTInj>G21vpdP zC{ry};M-Qm$DW-tCGYZHvSDx{p}v3V*iDryw2q69x4nCi_xB%X=G>{?J>E9Os3VX0A6i^N%+$P$v}`t>)m)Y@poNCzX z*m?bBtdbX4BPypiNdP^Q3r_=VrkJu{%BJhfBS#_43x%We{@_)TB zY=iPYsmcF(D^K?RzuxZu_it^iV)E$unxARMD}-KFXXY9TTP~Q0J{hoKUNN@*-@iWV zh}wU`=l@@ROpT+TX#dX}^EusOAE{uPD1muSD|f36H8?P#jLoT``D|OC=UGc?g82}0 z?e9+b(z`z0MXcnib?-|x(znyB74#pabN{w(gj_qPg=eAtBojv>6_>B+I&KZOC5GFk z2?i7`)Z0Ry2;gLLo3+{c8ohe26pJzwWe`Hw5e*I~cCVCLf}s&&%4}0T>t1=>5sIoW zrwxY7&{8Z#w6nMv>KLtFVmNTTs4qo35rP1@X9Y35Nt~|TqxO^q@lP}pzU`0X;kI-B zc?~?F77}0Qtmk)_$PaiI(3o&6&a_Br`3acX6T>A;wQD>=XOHyutX9TKeCF+DR5CIO zuXd)gWlOiYm|9Sj#1c-F>z3r$=Ni@YAi;ibX|`~E(I-(`pYX%pS_9r6dm_u33>@e( zY>CYe>J^H=axSEHIl@?rT9t#razLxs-pqKwJ8qH~j#`_eT`d7r#&go?+|>2uB2m0i zxy8jY+7C$FY}0C_)QF`R5R?=6EeF6dhVO&~y}4KHLJTi1hHo5W4hyl8Vso*SbJDxR zgBd~C2cD>Ny4iZU3?G2eafkS*gt622}LOu`%`?VC|^Ki-E5h_K=b2m zOOdJ$E{T6%xIcMc+7Kr{*hTpz?u=%&Q1qn^!Rw{mm3NxlLj~B|hdy7b;dKpHCw?5G z<{LB}dA@y%wNOU_H)C?ISCye?aXruWgyDJpXc`_tok#_`SY-av#Yt!-9@0`IZVvYq zIucb9_<^;UFX6HROfo9hIn6Yl7#{C{n04sQ(bB3KO6UNU2F3}%P|nw!tr`O0PAy?z zp--yJRP<#fUCN+1ogQI34>%wL-l6M0neFPPLIm`Hx>q2jK`@(<(H(rtqOJpS^{6uc0ZJj+hSL};FGaMve6(9#N;`rb)l!TU6aGAip~JX&YLO4)S2=3m1G zH#&Psbj^@O<_KCOmIR_6a&+Ybh$UIMLij`(Df6yr+KFzElG#|w}(3hCbwBBSUxKVG2FG&c)0!E&-~VzzvARu&nC@&SLOd!((t1M zGw9LZUoLlN9EB4Z3PO_O4AMr7=#W@uZ+Me@M&|Xj=L1nhKLO|xgLi!W)`fp;JPdqU zqty~lYGmmBqSM)QIn;p_y>r<-WJlmdqjTzSqx!*-sGhaBI(0fsOO!h&8Yu~_T-T`cj=5ILet&UR`II(Qt^sC4HRLm;&f^W+_sG#77!bqI{q#GB=0g5 z8<0n5GLn#}o0B*8CU*S&34axUM9}>I0UqcK2B!}mc=-9HIhg4YV0NAp9&$^zO;zQ$ zBZd9QkwzBwmsh@H?fpWu*t4au1Ei5RN!3C^yn~;3z<-<;61^9~XF953G)brL{MhBM zf^{!sxb1wgR-~))8n5xwfd&>fN7@Ft(yg8U?JNpg-u)~ye(algZ^Wj!fz~yhdEeib zN!nmtQC4L=4kED@mOr$lK?#5kP+3p2uy^$5$i_cAJskc2vL)3LkSLCW1`GfKO)Xi) zfGbf&I0@U3gU@&WOvZ_2AG{sW&U}3}M#|c08w2avCA0fWk0@mr`sx@`uV%{`78)#3 z1pGC(P?*b>i>nFIQ9js6*PbL}us8IK=Fx5@mEM<8R<92h7~h=KP8sSIF0~w~u^o~R zX(+EX)xL4oU)$tV#+zGZoaU)qX6B|sjs{yT$G3m=5-Kf{EPXCs+LTV$&d#Ah7k9{1 zzd%WSTWE5uP10T7t)z5YASLU-r-5n=@rWT0=_C)b=0ljJs4B;m!hd~I2H`83f-K6A zKgxA$Bp8aN=xrdf0y-Rg6&MM3&mzqRj=!vKu-J@@cCoVJOeW9_x%GeD2pP$BW)Jq$ zo${M3-iheDN7)N+SxSbgpLO?HmpV3?u1qXmUl_8K|6YZ9HSF+qmy-zto$F70E%bh9 zkPp*}x~9Iq@Y%fOFyt6;$-bEO!~=)1|G2vkh%MNjq@@u)0*hjQzhKk^340E>jJWs` zSbUkX-k;zJha=az&eH)3I?UBc_A_{_pb3DDky#O-E=WXS_kw>R01{LEqA4#~kD;5* z_5G(G*^Hl~o!P~bEk7IFYTtTRtS%D(qLq> zc-jO@l)~c=Z=Kh@ze|_Te_34InL&S$cBXE;xyP-!y@1^!^M`8o>*=|b%~O*rDU!=? zJf(H$l9%eA&k1(UKXH67$=fYiU!G)|k$-p9TudNb)yPPJ5m*H@lz|yEGFtrnnT~Qx zTEV_3=IAyQZQ{7Z?(Ym$-GacS{A=yxFOK!FMw`d8$ML9Gb098f-B_5MVX z*tKtoS#Ss=gA$RROo|XmWA{6rbyYOI57q!cY~knFNl9MKe<3l# zp{cog%cnW&X~UIwor`m_&Gmb4T; z5wD(6?RF(&w&`)QH|Uq~bN-rtzIWf)BO~o?E0w6u+QRT)KchL*d8ZYs^mKC#$&A9S#mCXMpf#-L-2zG0d*N zEI^f2)Z*aShGMyX0>2*NL7e3&`upVzb2L=mvM`|B+ZbjwR!GAobi|W7m~2~;TW;@;SaVTq{rG%Wv z+Gl*LkrA}-J=FHLw)h2s7=j+8v+{{cpK#_Z(rCrODS;!9lwF%EL`u_HZU+kx*>Wc! z1^f8y>J{Gj9;rnLnMjF*8$~)-U7!krYZs?ufir8gvVM{NGqsj;z#Fu&T({7l*MXM7 zx#gT50n&ajCH%B$A|GD?fd}(0!f*Uq>~O$Y1RwJDg?fDBRmyaR;25Veyu1ep{3k{$K8%NgQwyu z2pGpV>bkFfxtIl2{DIEOFvTG0ZGV0YH2isUBVe^AV4()eA1H6hSFM8UE@1TYqzmn| zanBzIJ1bFi5@_K1$5q7ZlCIIAl+IT(ti$$%wEzb$ zNGt9!;5+iGk!%nwWTfO>^K8!(Uha)6mU&!0#34qRo5N-Q)IePQt^iD(0f1`kZ% zd4B}@^b2REaJvUo?Z+N6IR}>&E%?cB{6jZcF;d=Wzw2x+n*si4firMfh=wEHTDk*k zGVTzcK|KfE#fe|VvNfG9y~v?pVv+nU(|Y-57sw=Bf4^i+*X2l0lf4wMzBJz+2W zYjd&RclQqtE8Zoy<6;K{^%Fa8=@_z3e_PeJ^KBevqLaSzVLbC$-$?-8E=sVTzE!1W z_GsBE(f4X1_&zA_aR^*G`jF}e)QkV5(FI!R!1W*Tdj3pnvOrU|m!wGis;)c8Z?{qW%)AL{N>Y9JO+Eb&b~GIf;AT-5*M=kiPM)CTFXCWF#G;`HhlC4d+vVnrVg%jnTvluZ00Dn z@TDZ>atOIF-Dv2r>Ycf8p0?&;n5*LV?_pD)Pr6;IO-;>wrP)>JSZGj{A@MWHJ+EzX zaV^5-_c+&MSJl@Xci1f7RfR4;`%=^t9R9#chyd)s!onG1!PBRf1ZBie?jP%kLPRn)o?d=@(Z1X*_M*UNrSSpd6?s2Bw3tL@JVE2b1;ZR1@8#_ z%B{xSSqWi_IGw0ns_xw7*x$!8v|ZDXqYTIIKg~s@s6p`Vi9oq-ktnoPh~YT_k}K>i zISbgG{ZI{&Rw7VZZCQL7~t|??ZNHuiq9I>Um-$|KJkgV=i;)V&o14#se!kO7wlDT+z zxcknL6_{*DI9B9?<|x>?k-XF|t}C>#QXP|iS7S$qAhhk-Gwd;{uVfG}dA{c3`HIZ& zNTVj#u#MBAtY*pH@aqNr^FhBNF)z^;V2y5SfK=jzyCmHiWQR%faUcxvZNuh9a^S(C zKgnN?_LuLFN(<*ZA$4fArEtTlR^G87Qpks1kWhNAc)@~Y-gF=3Zkm{**3wV(QW^>b zb$6u_rxFaz^mGjcjy@K@p!sU4OKV(u#PxFZVHGKX%aXeewC((5WK3-Y<@ueX8-O{ag5)m!rDzZG3kAD8MdhIyzYiVM_4)S9N z{qbqZfg$Mefs_z`VZ^O!h?Ki6zwih0Ul`r4z$=9sA2cGKtJwUb+9puCd~Ns}U}Ti# zGqJs4^cp1LW}wDOexT5p8^IFk%cl=zRA6khlXur*q;zM)7ak|JItBP3($!b}{!t}i z+BRQ6f>=ZQj>sRjIZ7aaiShB!X=Iy!ZEP+J`|qM`yhS?EmN>SnN#mqBa_?@mS3w2t zb3>>A4?hZ1M6?W^u{mok^0>CT+8f73eL1AEcfjG3>hh60E+O#%C?ya!LrB4pn!R$c zsDji1v?VxvG*?MXEfkNW0CzZU&H{&kT@uHrIC0hQ>HT>~wQ_~-aVsj>yj*@{8q7LU zSIhfbgX9;6S1s08SExjYX0epw2Zb;JNo4h@hWtRQ;Vd9ISK^9dODjY>g`xuoPR%k@ z3ZWVUiYMX=LDhvNDjS*j35L^jk>wGNNOFttqB}FY!P_)xj-`_#b!5d zI}WoXDI*Yid|XAQvh-MdSN240r5)JzZe1gRpL$E0`CV>WfoFLW`%m3{11;Ml+k32- zgH3yam37krc!u}(l10TX03J>F!H@HbeA7AskQg4_Gu)rIgqHL-$5qb-_ef=8Sile`61S1E+SSz#|dg)HmResHRTQ8*Y|H!aE=|Yh-|pOu{x*urFr$mT;2F`XW;_7$z?CM>(bTQI$0Uk z#MiI2mfB95b`N;?nVhTL`);`JgTCOa+nToZc^XaO!6Mnq9?j3`59+8cR~M?p?D%E^ z7TfvrUl7Q^U=6I@ z`1m+>H^m%r&|`1U0SO4UCP-6owjylPRJ4C|baY@~1I{?bCuDgD7>M~MW}lwprWo*m zVW_z*_`iK6IVj4!Nf7ACU~c*K+x0HNdowJ1x$Zs3{N9bb=jrdecS<(nwcP_J4E{#m_?)9k{c%tCFlb#I?f8#^ zdtqaR&gu3|3xnk$*2&uB8bEo^?4HDdy70+LmaTkuS<R8P)dI@if=b~*&m`_!2hWFRtVAPJ(@hGMXjh=sl@N`Sd%EY|;)H z007X{pX)q+sp|Q#gyB96OD53o2%A9gM;OOr!0P##Ni=a}%qEg%3*-krE?)XN+OUW1 zC;S-X)51QN0D71Lueq~D{C=HMjt$&r*?N(=B*OB{jN^^=gU621 z?>KT>lj}r)9D8g4+^}hP?hq(*0KCz=1v4AEkEPZPRz`hwb#9*b5peoc~s1W2&!$HD}GO%ini%X$bQaYMjq;d z%vYps;(j7Tcxf-0E0imy?iv#aZ4IA;*4yWi<~PyeZhCbRo(hd-6ZpY5Y- zq2&FTCiDGe$Hf(cpEsWQ*|ezteZBa*#N-fySgeV!o@{;_{By=YV}5(bjE9i<-R@pi znuk7G)uNO*n-UsJ>elctKw6u!jXZ<1OnM$r*aIQ41ffRiok@$KI2(;Urv&aPmOshSa*#64g63S`p8cEoC<`Fu3c=$ zPTnlEi<{uNC(%+bU6Rh~-W@I>Cuady+0@q`0=R( zcUHKtkYpUMYVYa!7S2v-X;96~67onapRO*nq;-?-S+!O7_v>>4Kr6dBF5~2S{o4`0 zFzVjmJ~lckI4vM>6xVx(^xW|u%!=+3FE$iE?@j4c&_S;29n2MWxYys@P^#byx9zds zmZ+M*FH<7giDMh!sXc!;+tFhq`CDNv21^jD4ESspSJyq)etGcwfI@pyQxKOxCThw| zzfVPQ9A$NHkRnddCM4kkWH_kG*aevH{ZxKP>+zt5@G#z|dScfZcMG-q2e~W-3&gH} znJF#*dhFQcv3IL~s;-x%*IyWYa%rvL^-TZ!;Q?iBt~&9HE|1hM%-_4Pad<#jnon@H zU}Ey@&NF|nt&bdi8TU|b=U?HG(}xScT)8m&A;H{bS~OPbEoExc&KE?tmiwgxsg^%e zCqK4O4Yyl85gl~gv0nMP*{)gic2LlEO&9tEl_Mp6M+(z_%;?sA+GtlwNmt|Q;ByYp zJQl&{SO2wav+wi;pOINkjlD*~x_qrRPO)dAZw)Vg`*AhR_=VodfWAqv>0mQF7@_Or zKrFxxq7%xfN6_zNwdb7-S{>1B`Rli4#Ykl;d1mf?7y7pWhquAq)iCxM9t}}bMuCBg;`;1e@eN4pqJI%`{#MIDz*RwU` zch&0`Wm}I?J=Ab}Qg@%i2H@Ne(#X9iWUJ&cePGf(Rt zdX#2D*gFZ@V|#^YOqaD>z$M4OkG!{CKIb?4@$umeDbcn4ZR-1zSiuw9o)C^`h=hL58R0GAcR%CiFvC%@N471`&r#I+yJriiZF#_^Bq(9tC?122N9@1>^n6;M zBC&;C+=}P$3}Zw8Z`rdCebdqH z<#NaToc-(4c7{15mH66eTPv0EpKPZ0-v2=Nv^956=6;>sgq+AO#s{{Of)frioszDq zwING;Xu>dJBwegY=}bu3YK-GNN({fQa+fqe>-to0Rb&WI+nUBU&A|XREC$?#8!^c^C`WHlvw>6gB)$Ns1@HZlC)uK$`7f9?laP5013{vQ` z`%PTmi?%jt7+N=rSZhG8pCH4B6b0f0Y~Z$GhCA?3C7BX@h3zhu%c^sjH5d{(N$R^PJE$Aar}KKBsUZTj6cWCuF$ z?u!aur!h+gw_(UfE&yiQ!rt!yS6=Y-tt%^A#H1J$*k2tw0s3Mo<5yl(KDqYy4;an; z{fOoL$2p8T$-9YkcHoVHt@}mwo6kNhB$kY*_G|buz1!eSKR^-}j+yQ}G-k!OPlK9` zlhbn1zk=(f=b7PaY@hQ=>33IzuC>Oqj52NcTvAdw20(;^9--sq{ZZ7YM~<-3gdw$N z+7k#7LO6vIM|oA%K_VTlbFaP)q4a{s|LXBkeCu&s$9~{l-}v>THKmGl?SNOn!nZY6F+?^SZe%tPrK7X99#q@W1M0$?1d6}_> zV4_nMf>^*0aCg5Cr|rBKDc$1+wAqfRQnFVm4vLFpo9oRCfq>t691ThdDsaY>#kj<>&a(|xH0?*GqEOk0 z9yqX2|EK)&)96x7C51WK6N3R^czue`x58D#S~z%A8WfVh%>#t!Q_1{lqZP&M>k&-C9#KCRX%Sx6#Y6G?&U&hqU0A z2B8~~57Q@jyS#Vzmk%+yE?m0U^v&Pded2BFFP7e~U(bCOxFsfHlt>I6yz6ytu+}WF zhAc76w!z*(@P4k4?z7eJ{tOXkY;6%7a}5)Nz-09E-=Wjvn+acG0zUw-7^p|Iyy@#Z zbnF<3)eEj^vI7`SMTX6C%Fy_KFP=c z(v*y+tSV@oZ2cx{gG_$XbM&pfUO@dm@Hl#Rs^-O~1I2QlY!|zmpAxqN-#2`!nu0s8 zx57=yg#;d832o?RB95=-U~C9$J?=gDBe~TcrC@Gxx`Q$@K5z>g8KI^1>(54mb@KFu zs|%;GUjYz!GxgD<3-co%ljEzTBv{mP>CvPL-=RxLDGmQ!-rrv^^L*yfYo8nK)7ti|RC{l*6eJ&v)({ZbeffgBtdW6{ zra_HX0zH1)WHtpdx^&}z1v)pQu2D5cV9eJo#CAouVOlHx5vzQ8XVzvbhM~ZxxVkRD z5{zR_RnJgKsU@Z1*YsZSoGu5NSTgCl1Lc5ff%HAVd(ZZ&gq zqDWyK1E#)#fl;t-L7{$N3g|BGR~UrT;s!w?{6SETjzdP*xZs0KG$7fwb>u*>L$izSkVCKJT*V>|IB>FJ%w=W9g^jsTu6-j7gXl>k5l{KJ2J0Z5e+@KP`PH1&d@y={lQnRrb~6S>+338H*q4s{UOjsvkal z=TePSsfgQ}1^M~Y7^Dt1T>G1dGK?faIdYxICvU&4 zhqMlARbkItSnKcW1G)v9ckHjW(=XX~sP;Y-?Ib#Kt0nZ#f5rrCZf?x?87BOA@%sy9 z#w~izX{aU`2PX%qc~U8f(QRX2CiAJu#UomHqIkpUCl2kS-qO87`NJbik1>NtqQ zq+ZQ+3(1iJj&>f8K)%ozX=S|xep?lSSF^5cmGCT)BT6I6fBu3)C(7GgKr0)?sExI{{8MQ#UY z0oa|O;b41QhF!wu`L;t9RUX~FFN7_AP6gen5E33`B z7S;e2CLdsHh){7lp4HB1S!%?=qsmCv0swvZtgq`cvEovWb_G$+yB;}-F>iWniby#RsL_tj*s7ao^G7`GW0_A`P5i`Z-f7jiR*>ERkJbXN!7Nrrc^sqN6p7gRczFhr8yKnhm#N!DPDVN(cDxKU&P}Ebm?)A(l5$es7H=b zBvYnGi#Vl1V;X@{A=$w-m%Oubb7#Tfh5B+K^=k95V?oQUZ<}jus!KQcL<61Eg1N^m z!Ks8K)LgXFu8>3pj`OVhyzvt|Es-Y7rpwC`0^3Saq?KZG?vaY^ZCVUb4%^=>Wj?q^ ztGDOTOH!&MoW8k;Frz+p*K;M2oc<`*&c+L@Q(uouWipiE2VU{dEDuqb#-%tmIsfblvb$~Ox!h%YsUvR zX{^}L-!K#&KXD|EqB_);2wfAJ`6Yc^AQ+OAZJ2w=f>(lc)~BS=g-N-^xbJaBYKy0S z-gb7#M|l0})s$x)2)r|(zC$YgcWKAprNJ{dP<*3Gr!Xc65a}jj6T2KA#60+XL5H>b zx$xlOMiiHaIgQDdUXD(tkW{2~NXd$ubg543ok#RcfphS2!!l#nYW7y|kr&VYn0b^U zssb5`zAKKF17L#v3*)PY^yt+qx{+Y_Oh#eD5~E1jAHV!pTwTmYY?n7{Ljy zTVyB`2i`qLyOA(UvIFKuX4iicltH{e>_b*JxP>5{U>IQ`w(Y>dM4Y-H^Z`VbuODXb2gW5BNX9{k&7rIZi9$|T`{X|CQv47mVJSWg_h;&?Jf3wSAmACEZ}wPT^(kMj zU2u3WVFSyYW!l1|h#8h}l5k2VIH>L_OmQInqkl_O0s9fS+1V9pEDc;lKGt0Oj5ooYlj{cg9|T1@%3|XZ^o>P3XI6am2!M9^pA1deT=?_* zr;!n;EmZA3Yqbo&dIkmnG4n+5Ejpq%+DUgVAaejU)D$#8wVu!1?txZEz}|4Wj1$+m zOinXWikK}O*yevVa~2CN#iGpE+Y;dX-wk}0!5mT0+RJ8$b_O7h6z}>4Z&7i5ZS5u$ zpnPkS?lMwZ283yh711XlC^rqY{eCM&zej2Fwy` zaiQC(x18PU6{5|&>+hIa3BNuhVE#UrK6X6Z$-?|)L2|+wTBVNG7=6uN$F`0nGc9kT zoYHbkkz~Q^RKas^TkW^oZuea~9r9vlrmV#*F5qaIOdX=;!8}RCxc4EtC|G<)XS`&~ zJ`>&a_?ekVv5U09^3+9rF2UT$alybG$sKsq8rvdxz@RYJcDJ<+BGKM%L{jVIw~Wi% z02%V|2a@}E7=fU0b>MpsBEYGUK(GFz_{#GObv;Z>;^h*ky-4X_jZ40|&)nqRn%?VI$qA}CMk zU?GecU~@rB%GBH(5%o}cV0h%|DajrSlGInwA|Vk69i67lL&^4sOEtT)UhQ>bMaDg7 z`ATWw@?kl!%zV-qhyOX;MDb9gy|kN?6X=<7_gbib%*!0BhSt|F=@9^9s8p#h#~`G1 z(C&eZv~)j0DGDTbLLG+C-odor?)Laq2_%Ogy+yx>G~C7Po169yN%FnAwB#Dj~ZICN^OXIzotOPrn4!w+X`2%pIY|81jxr%pb5pSAQ8F1;w;$|{?a zI~8@$2A+*kY;rx9^~BD6egRzITs!yamn`q}3Cd>X=89KY{@fOdDlz!hWOFn3o_U#I z=Qrfs={70-rgu9Rx^SipYA5$W)CX-+qcZY_^KDc zZ!8ZYREu`{oW(v8HwjXrrI<;+{_XU1S0|^rxjFf}Oi`gZx@%0c=3_W%f!9)qV zmc>h*l`-Sx5bQ;6@Ww|LI8!I;o~*p3I`(Q`6co?6tzZ3t%#z|h7l=69<2VtvCPJVg z?!%>DHbYP(A056xrn74w*_5tNW`&{fvd#4tm1hu5_C^W>%^Z;Bwn5a?-AYX`f`lg42}Ar+W`|AQXvK0 z!T3V6MGb@q;=`BR+)53FF?O+g@WR6aQI4O;YQMtrg!+{s0?m8s;6ULI5J><`ES;{! z&n%>KTLk$jMTVa;zWSdWM9N0NrhZrc-ZJ2mRW^(&mNX12pylvL4ZTaZOR0_} zvCOF2Lb-fu*Gh*)frRPTZWhPavnl!czY=mIt-`%!oig5fS=!R?)sl#5(i1$z#^Jzh zCwZ$W_2GK)BiaqZ5L@0oWQk!g0=_%MqHN*w$c?VKu%~+k2|o$^*wp7m@yWxdGB9x0 zDk|xAhrLr8hN#3x81SM}M-JM}e06^2Y0ujZXn|#R*sJF=d!1L9;0`6wY_%`I_%lrL zMez90sY3~q$eMRdo0*!j7fVrEg5Hjs(T0c%d}AvHJb+puPm?89Sr2*&1d0HwMuvn0 z8&)ilyHlyyKBp=yAG3B8;4sTuVU$IFfv7O$I)+AYLrAh=x9r7&Lq84QV`9h6q(}`$ zO6sID<2<6LJdP%*H!=3P9J*Bs@?(oQexHA0!yJrI5x?T;>FMMIYB^+3=-tE+D=B1- zPVK|5VaM~%#+JC9=bzB+mKyXh=#b-rXIRol6Q;-;f4{gDhb)E%2f}>h;=K4Xr{BEM zBPL^m$CMN8T`$>lX3Z%4`Gw*+SAPCZ)hF%ABeDEyHlM!9SqmpQrJZ+n<_QIydZL4Ya3rzj3dpCKO3kSF$l9PsP(u41mFkq<)!I`!7b znDL|^<3pU9b}s;Q{U1Lfm^4S1jE`#d&VpZVQyy6t&8|IbrbID&DVtth^Y(SUisyYw z3{0=6-59@+7cbP-)tbRdyWK0?Ry{vKw3GYjn5tDfU!_Oq|8#ZdO*4L4a28B-1<^@K zR{GR1DK7nJ?WXQy9DDjF&iH6)#otThe^HaTI66|@(bwv29$y-HdIhaIWj!Pi$z1*d z%_L=ENnzos%;dr$apTCiWL;#3tb{0ZkxFG3QT9%VvPY@3?7bq9u1ZEEo5+alkOm=ALK0FTlvMm) zm+t%b+|O}5j^q2sw`6?A`99Cr`5Gla+TGn{aFD)vzz`rPARr(p*!pJxR9FMayLq31 z;vq{F`B|+FH+OnzpK(HIo#k{Pqq#)a$-cJSv0#HwDg>Z&80YbgDb{~?$Q_R0V`vZ> zBdwh8%&M%S3u9wp*>(E`2p-7Z1XO{bJM@O3w00YHuZHR>TaHe{BukBmYmTD^ed6d* zn3&_~!~~0d6?W($3~Xql%4BYKIO60$Sc)%J@Suz!ke+Fr-_6Zzg7=gL+LnoVkD;1m z;`fD~BVq{yc!xk=HOK;NLJ2*Ae>w0|yibS?tb-XM>h{Kj!i0vfEX;_+%N^;}I02{uqQmu84aE|n>A|7O&qW1=t^AGSS1as_uKr%WN0q9i zZzb;%m1&~xQm*5iWI(TfgHzu*<;;4OVqRVSLPwsbVJ803X^MyVHBJ|VoT;(gBJb=# zzV@O_pxfD@tc4WS!JZ_Nqjr-dve5a#gUM{OKs6P~%8h&$Avth&G|1|X=^h$lQ4d|? zOXikM<;9Q~p!SVN_GV866D5i;tiP&wSufEHLT1w(S3T`f<_%bE`k*9K8gp|F71z6E) zVQj|dgFOQj0%9I;&cNgY&dVABdQl|p2f)?n-AMc%?(V1`lQT06U+EhA!1heJz7~yx z93}&bWD+rEFXvGNF>~Ra!+?f&?qIga*qgQEU#jyvK2Rxl+=#7yb)^PNPc+#8+Yr5p zpB2^mdgqy+L+3inKsezGzmb~CDge}h|AgkmRdtq46sZZ` zXix=hi_d{Ug*F%M4JcETEL60cc(hT6cEa-Z#e7#6k=y#nk(Y>0!t$z-2|X5o>H={c z*v&?^I&jNQKamOCJQ6X{DaY&><4~HKm)GtSxJZ@MStet4-RZhrn2g9)5`SQI+{q2K zjM141Jb@V+`R!kmiYw;3-l_$)vliq444sxKaoSm-322j%3KVD`*$xYPn1)_J>n?N!X3w~P=%3RY zxxAiY^YQSZQv6u0?F@dgg7=4EB%-5ngXgdY;-r-Y(4nCdJAeKcW<(4pm`R%|DLaz1 z32<%22sC-SRbFZwI*yWnu&o4fze%p{})N=YZG?@!05qUuCXZseuTe7Of;Tj%*c3Sn1W$gH#`@A&YAq9*Z4>WWg+K}+){pi z9P65fy_1u@e9Lp5gF=_ z&dt0&bJ@-gQg|>=%n=KdVLOQ6#5ZqT*kke5fezh24Z_`zUzbppO*x%_qL*5HL2yyR z0(#ctYk~`Wk(IjP-*tE;;Li!d8;Z>A4h9AW{A|P>h*JZwjieOK3ug1Xbazt(!(Dv5 ztPxVt>g;bvy=$kB&KQ|4qIBReo$+hiV?b4n`@LC*eB;L4g*sd}n2Jc=$xPxtLvR!0RX9V4W} zOw7N|Sm^{RlY*}iE6tZ?c5Q@Ml_{W4XnaarN=)8x?V-W@h?z)z`@QL(VND0H@tr~b z$;IcpSNhvrI|KlH>F#iOlWrO!NM>VsigZm)`w7o)N}S|)AzYwikyJ9MDU3 zzH7xGAUV9w7LsOS!* z1NfP61RWGd9o=>v21$2aF2L;^ff^{8QJR^+IFWx$B%lF5Er29WV0c}*r_gzsNFx;v zgb|J_ZIzxw`~+GI4v^e~EP`?z9FVF=+%!u&+6RaS#CyE5?*<3g@A=}pd#@0s8iM(^ z@6Lgpv(#Q#S{5sofJw^w$U4mStNd(SGYU?PGL>nF)@G8 zDR=>qQ*#UG_26Z?f3X)2E5O5a3)gI+1WDLuV`q$yBiTl%CKLx=6dOF(Fi8FUS^e!H z4ULe#Bi~L{Bk7{e2a|xai+01CSFgUupQ|0iQV1vv3^6DY2&Vc{A*+};2gN>(cH!%t zL7{9hjy~VjZXSrw!Gq$e$h+M7Qe{xj&B=aLARm4b1eIrMfO5r^_1h z;f}k)1e|DyslqLZES~)g<8{ob-rsiIU}mL%ZkI5lF3ZU-s-wzKfOX5o1z~2y#Tw0vvZ#z!Zb(iq|3cxWL{EoP{Cj`6$n- z!huylrr>4``}`*k@}Q;-&G_ShWwnwz$dYakT4bi|dCdHH4!|Jf)M8;{gH1nj!4b$D z6hvJ=yxJ~y1Q79?z7%ZX%^BI`=luq<>R zPz8eqj-V8}5H&+iu(knQfW3L>P$#^?afUs>PDotAV5g9P0L(-tp|)fXowtxNyKh3w z3btn5E22*D%dn`!<2vQrbn=7pVa`_c(iEO*chjTyi$&;-aSma9i(l0juxy{SW_7g< zYpaoFzjt+sr|jNBKb6CVCRkW`DaYSTOVdup83TLf&T%NGtzkfWTVI8*$_piwc+Tb*=T=Wsqk{xNyg#9SJ{u=EX$ka zy^!YXCg~Fjjmy^6L}4hfurDYmX)M!#4?q0CheeZxeMmIe%(5+H$*0S7Y}_UMg)&5&-vUtvK; zxB|G4Bq!*K*0#1Qn1O_KUSR{>B~MAfgmMi$sq|l&_wG$RP2LKHGNv^VoRKJIEw1OE_^B9WMFi4~Efja{9pw|v`g74qUG9`t1 zv+|-QF8lk#7ROORr)L2nOhcYKtL|e|!_ag<1=Of?PdQK|@T?mIuuqG+g=j%lOAzVo z?8Hjf&u=$tO;p1ZsrNr&$hD&RYC6Qrfz^yAi>H zB5!KCWy=;2x9%JiN9@bn-ri7}B@DXg?hr6c;7p0^#|FFi)hi6j$9bRNG-&7o(1$Ot z0aC0e1l#PhC@H6^^$bm5 zDvo{&KNk+b=Ft*xW^HYOg(25=XOUH*=py5D!aLnaiKb7}H7L&A#w^z7>Z(f70D)7#r4GYRo^j}?BOTWlOi zob`whq{Bn8`WIyZ7 zEWe)`4!b$mi`Z#%@~jVQ8kM8Ta8zJ4^2Nov*8}RPmD=P(oRnoU2SnNHhY?m6(<-_U z!S0QJjV=+$k*pZMIcF;v!(=2fKx&Wt9ZiRHKd$xgX+pCBnkBAi`V!4^HgFoRU)RVW zE;kZaQOFSTS^GN#*;?TV-yzsfSP2eaZ)FQjj%|t)JQceBAjDR$$KBbPYW2;icOY;0 z9~u=Ty5g9SPJW7Vj4e{`Aha_?f~qRh%1>~Qe$EW9f^@p`h91-_2%0LNZOjO2ICAu; zAh|2yZUhYlcy zF-0Q;+uNA!j}g6sz&xt}^XuBZqrl z(0|}+#Oh!aYCvjLc5af-QDcAJrKsOaYVKu;%48nQo(&z}741WGm<;#itwAVfH_2Gu zxi8%`>6K(Ay94pNn?q239Is!A#R=T(nDv)y4V)q-pyUuHQe`7tsJMS4GyPnsbTr=2 zbiMbuUed{#-OflEXAVC}twgOE3q1jn!Vmc|#&9zPwh6R-q9~?bBIgNj4lv`uPp^>f zg%sG8#G#Nc+^=_VhzhhJ-xyz*H9|yEHd-|DIocI+TH1?=c?$|cX(0mu=2}I!NbrwS zc;X=Nyd2oi;LjJQ4WPNJbW=<#ltl9Ard|SC5I%stlQ1*=)bT?v1nIQf#neu1BAKi7 zMn(!7fLEbPU^vh4MaagZSq}ebE*7j=Z{^sR0xEvQCI;+MG3gEpb3Q;^cZrV;@mjhX zXR%p6Ff0rO81Nk}xl85C8GEJ>_XJlZVI!5BB9p$84`&$Un&mr(K8acPgZm}jHsK-;nTMv`TAPr8H2FwL|AARPE;$Sj>Wh>lUT?U( zweUuq`G4qwTkTdZu*p#!WpT8aqvrJQKD^G5yG%XtvMgOe|C@d{PzkZbFO#`Y3T=`c zFGwqbGkyn3Eue-d)a_z}5b=q=m z_(;L_`^#?S6rCqyz z{jOjA-DOM{!t>EXJyJ57vc|xJ2@WW+)M zwE!9n)D}Pyn}D)6B4LQBFcczJ8s?Vn_AmUfMc2r?C#mBjGBQv-VWv@nfw4{KqC1)v zoD}$<%ipRe;E>?&hK@5bafCWQk3UY^XSy-Z&zR~%xG8T?f25OL$E?*Aaoxz-+BtL1 z4jj9An8~ZssurQw*)N>=u*|Ab6%=S{d2`M$d?BAqBQ&_2`|K3s75vn9&^sA~=H{vM zM)T$z)*I>thvpV*iqmGpY~_@3DJ^qX(U z`!$Z0HI+x~FPz@ZdsEJG%9rf)20Kvo@fRQHR7n;o<3LIPrBgdR1brip!aBzRFyzxF z*uD+Ki}D$A4x{~DtR^T2B3^BBj@m&!!wr@$%MF95I@l^>4wzlEHbC5#0 zxw$Fbtl$K}044=kV`9xaj0~~|Z@z%?n0UHzM@4OI!8G{oZ1f@R@*=lx-nh~DaYy^7 z(K8|9*CnHc3)6=XrY1>|+I}}7(&}w_MFN`SR=?D`9VveNn}qA@tEzG(b(ID7`A!-r z+(3I1**{%}05RglF$d8j5z0zQ9l3eYyHs;rup;_M!tB)MBPb|{!3vlm43HSU4Iym+ zLwKgp?E_66bn$bpTVpE~UF2?LQq?K&*3J+4PLb=ujvzmWsBS#+>RU z`_&l>dcVyg))8KoJG)&?8;+^zsd5DUsmV<{x^j7I!$0D4Pmlq1`PQwg(MtREdlH^% zRXO+h$qw!iX?a!WC(FTZEA1z1dHzkm6wjDetIs>kYxA#C+;BCP$D4ipkZ6tNc&D$F% z*!kyV#hN0p2lm{40n!4#IlAUOGqv+C_RN%%;s6I?)miEO=EK=Xb+%pz^78pW!4GY1 z{m}!-V*_m|hU!hYk(-=BR(T096j%)qy%pY%WDq*n1*wwwVLF0F)86t2pn_hKhl2yn zouH5bOex6wLkcpo-vDU;1eYEf3ZX085gGlHEqlgW`4S#ntgxIqx&0>AqNiOTOyiEJ zo7g+E3+IOm8L%fXMaeH$u3Vw8axsVIxcpdLyq~uWi8Z8^%<}`~F2;zWzeVw}f|2s4 z_ZS9jwpD_SrB0}7#HEDELwK6U?%R~NHSYK1f&C!c5acbw?Qw^&>CXI%&&Ha^K++c^ zgv(AA`S!e{-UH*OKt03i2V)r!5Wxf@fD@E{Of+67`A@MCM6xdM1?9)MRrU6~fW?64 zcAfc~ecg5taHz7t3iJ)ZZYxht>*a51=nL9*Y1*9oB(X|Vk%~vaX>-BpGTm?S#NhJl zeFskdSyr8~9@%4Ma{7W3At}eDM*WhgZ2V^C=Xa$!5}gK{eN?tYi$3oOO%3G@6=iM= zJ#E@=O3u(TzUPR2vK+Grb2qcGVwC4WtLI;R&mXMVefgS#UW#-FZ2Pp-{j)beUiQ=L z(F|PQ#;@0pJi%c+B9kT*WcgkX?=19iBNf|aWbo_2XDK8%>JNcJQ7p;AnWHv%fP4Z# zOPLG+&k7i54L#~dj`-QL2$ctO7$O}whk*zs)~m_tj29gb8u-2?utJ-h#IpYqP7Hv= z->SwSQ7Dkq1%v?1M7t?)HJHfH$KqRrWwnVQbWDf@10+CMAxkF{yMep&zaATD4C!{J zY|dmlx5>(8JU;{C@KteeME66)kMRYlPs!&h&Gv&Bu2FO_t%CRRo}&`!gG5CGPA9nB zR95~3`T}2zH{~u^B6(I`1S|0CSuqQmU7N~1dR^GLt*QqtWFETol872POcg;v8=v zmBMdy`SMzDsC{V+#>b0Ai*ahjrdmhs-;)S?_IPshu$4Hk6^P9!!Mv8%@>+qXNmGKy^F zzx6sP@~+4ijxSvPSFU6Xt=r#VVR<&BV7BPkS>BHM z%_wD02etZW7!N`LyBx9RmOI4F^~tpYO?PLR`;jATp_G0qB&1vq`^oWbLuC15@I z{nLWHyvRNQ9+)bv(?haiQ7cDfKTc8kG$%CB8IzJaz-eH$7ytGhz9zJ40CIS+V5>ad z#@a&y27=Q9*|-%}bfpg-KNjlWaBaw{Fa`STzk{%^(zZdhoDfpU(-g&~RxqYjt{s_S zurn&Kt~`A8E+uBv2U6F{pKv@uLjZ(?KQ8z*Z=AM>7Ph7GN*&XSw&83Lj%QXMvs;r7}G4rJ)xrih%yt-dSAgOD-Xfeo7K7j*Lm5{MR9+5B?M zONlp0T;daNN4jL*)va=*?lXO)GvsXM zDoGu{^)MQ18Gfr@UD3@}z-~lQakCC+qnJ0a*F!cZ&o&#B%mqIcKUgT81IMkn7?deh zgOg;5-VnZU7cZ~kK3DL4v4@!dg|9UL2Lu35jg9ua^jC>^m0@leO4Ji>^P9CQR8myL zPtDvMIJX5oH5n|``&L9gMYrj z<-n~@uz`}CYP%|@R>{-EP#XJ{mZ%LBkCo4#5xorz5xc^Md^x!IwxM#S=w=h?-N@no zpT@_X)QENq!mqUqIUTplwQcmhiPwHkh3&^8yhd?&I5rg9)po?Cvx&Su|92*arc4)6{VlOS)iFohUJphGSgrx_s9jN|&Vn$5p z%CQ-9+e4o}o$;>o^89$Jh-qiKAkD*P8{1fxHtqB_>CYDquIxQSz4_5})1qxY*`n_K zQB)2Qk6%aPOwY1@OQG_D(|F33pH_EPPsXU^R|h+WN!9Fr;{R7xIK!=|{jJ5{pvHH`9w&v3qJu1X&}7XSQGOd=hPv zlj9;B0~fJp?Ci9oNb8+Azw&G14jvMce%8KlY1#`C@>{u>Kf5cT3gJfJ$;AYjyw#lY z9IoH^(NtU~T0864CEKgwx0*h`*h~9tl9#q0#IGI_Y>Qt`H1q0pP3UHGXh%IQi!F90 zzwYiX#RLi54;LH9nJh0eDAVHzqy_njqyoDnDH-Q|Su1RH31C`2BRzS>Z1W1YY9T(D z!Mf1Q(7laUd^$M2<}d+^sC1dkr*U852~miC8B)9Jog%Jv*mZpPAiB(ENYG+r;yFg7 z_2m-Pr8VR`ZP2xgd6;JuzyWYPSVF+nvE28j@UHMPG~X`B@rKe49z8d-Ir_tcm-~Kq zX|Un72>8<$Kx+tXx|-rwbek%tKRtuCAF~Q1G8A0^ehbQ`W@I!ba|u$nJNBs*DGKx! z;@YtsTAMd*km}Z~D=8WA-3@DqUT5!Mfi^5UNCBBs-Q*uZ-+TnlLy{5sx_{B8ekd@7 zMLlxyV5adxMd9<$PuV>FcAh?LYRWZk{#iN4<#WybY3b*w^()E8sQ*sLWu(`P#Nd_t zc<1>E`I7{XI|u2I9XPkk?-o!^wFd{12l(I7c|LH;^ihfA=+OP$0W3s}&;O-|^f$~mlrS;NgMx>`A|oQ6QF0)c+2Z@6 zq$2il1nrS`K7KHL>gOAzP4LC`oT5IeaIJ`@*{)YvG+lM|syIlC$-0}JA(e0<$$+m2 z{twWHW5t}QRoe-G#CMwEzR>ozOZ(VdR7sZuU1+Yd50YlpslPHk2!PgxEQrM? zV0)?P8t>62Bssk=@e{-*TVTHk?Q)`XY;dYpg;ncTt~RQ1>D;rR_BzklPYS0j)GruT z&TXW<>(x~;I{&LH6K>c4RDk*sT27kJT%_LFdTsmU^iE_ebNIW&IajNm;%Gq9s}T4~ zN|4U0hqaH*X^OIwZaXY*cCNwvt#2lmg>&1sxbpt}j6KbQ21>U{ncFV_Iu_6k z&Yw(t-G$6E$Q$`dX^WTOCP-f~0x*~;h*^C=fJD--@$CUoqmn{b zCQvzMm%yAQeh}pf9@*5Z-$I`t86uOAYC)WZU z%AspQjOkD)V3YJzZegN8Hv|?h8bQVyQe6BdejFL@GM!~FCp2fxs>%lB(9hPC9O~Pmq=2Fkc?Eog`=zt2Wpg%Dt|IAW!?^YFS8b#u-09s>B0S9#v-fYUZ)T;GAO%1s`_NoP@^$ zSRm?KPyA|d7_%MY7Ty(kT0C^5TVo2Q<}gdV<3iSE;X6mW-qCD}bedV{a8>wZ6$mN$ z4D-U&L2)1F&zqP{adA0AXZXxL$~=f|bF^py-#4bBbt!zQQWm=o=4RwleZ8PY1ZjO6 z)Mi1dR3dw6*vL75{R3d<0%&sX(6zk@!H^r-t5~wvHTMJ^b~&ikFd3v4c;2wRb;MG2 z@0$-IZ%gKuv5@blenj)?2w-D9SS>sqf zP^Ev2BJa3smZ2H8Tki0Bk!>nF2u_V&(6{qehbk2J6@};WzVS7&5usytkrbcGP>5dt z;0#^Y1hXvnHS5Bwtlz&GxZcM$>coTDG{fk&^Np>cB^w^PRKJ+L$v)BC8MMb!P|kBh z6EhS^)uRQn9=tO2?i=0)(QGjB0J`j2nByXvS9!O$WP7=;x;pbT!!`+N*{Y#j&(TK* zgN4mPH?jx`vo?_Q7p5BN?wZ}rFgSA{kv9HJwvpPz#!0fX7QjCw+18i%mYoHOWb7D#8gZ0u~lKskY~B*TR+)Att(or z4m6_W{r*19?Dx$7hD(G79(>j%AVS+YWA1uV;BOw6-631TSt@zvCh4W+92XqO?Ds8p zPFvo{snZ)9#B(aR>o{N!1aO@nf}Nw8$o1rzoRdoCx18>+%o&CYMumlzqY(|pQo z!=d66X=IV2H5p9ap{`6)vOfFd>doM|CR=Y_X!EM8&tJGOI5wyHhp+J$i2ULl@M*Vr z<@cH(!rVMk{V-Ln%Cd^z&&vK1y03UpS`5xVT=;5mu63x=#`u~k`cjzIQd5_C>LEYzQi}q}6SXwT_}q<9 zN~d?|Z@6&^JbRtkmkPPXg2VMA-!+fZIMW4;jsQQZR>R9_TwNn$(M z+OAU)%a5CGY>)mztj*TVb|@g&A>SU-(Fe^1hkb8-7^31cT?(r*p8Ys-9t(f9AZ{%! z@j^NG4YtBhS)EUY?TEYFQ5HMPby)V1!hUY^5ZfDvqaK@8DVND)y<*+fg}Zx)S+Cyc zerSHs=eSbQcfrfN0x~u_k!69-ab288PZGOm_;}+Uc{9lJEAdY>2({gYPlzE&w;(zb z#jE9)%1i6RJ6`ijj|vN9`U1QF$Q%0F#1zblyu8f)Fp?9ysBU^%UQzEH)D?KA`r*3=ou)zL&Vu!$(;o-* zHvITHPA%7T=;PfLsf~x~cdykF z$Bom}3k>Dvfj_QD(y&R0nzo3WT_s$#l05#}wZdH~<~{XRYsbA#1VW)ktMSyFpB+b` z+MX&JKOQ@e5U04*^)K?VF>&RT;I$l!EbYaLZ*d1o<+azfGIy0NngvX+;UpMuBq6^ZnoQ>S~DyaeC0s~=U!*b~l z_`VXo#MaSe5`#~FT%1)MH9fO#QFf!3#sJsIbl_2H|1ru_Z8qk_WfyqCgT0{tyVS9W z(LZIywf?a8f+>fPxIa`tl6RW+ zlz*0+Tjp@bJt5HAZ@tM(Jib=cCPMy_vjOx)m7CabLe( zaP6$x)fT$OGl5y$tPxPY^6wk<9$Qu|jwxu5vNkoVx?Ht1LKMAQ>8hCf=EHKxX4db! z94oQYx}Ye(xAm!50@rh+C3022#YSc0YnKzesef`+$fy%&>>NGXb;qNv3^laGV--X4 ze_Fk~&O&9$>z&%MUT}HwmqanGkfZ*Nf~J1m=-EC&s)4OCCt?=u7{x|iv>cu8GYa$3 zO0SpUO4(GEV^Ozsr0l9UEsyF|@r46+iVmHQ9buOGe99rhy*yW$DfQpuO| zXatWxOXw+Gsw~M&7ZT^>l34QPvQ33H+=X2?klKW}v@=6KUHf-Iq?m_HfuO$^ia^kkeOsy!P zg5%=bx--_r#GTu4_??B}^-xPC^A;u_+fbr_D_qNic&e>tL%M?PbxvDnuB$S8`m{u& zrCIKQvdS$&`+JLW3&R1aQ}IhRPCW&;TBny7mEMQ@6|SExBm^G2mpU);;X+8wMrV$y zpkkZi{XXknex;b6eBv1i8gjQ;t*H6t*tqblT##y*yVhTMS+_Q&yTt7Gbi^aGyML`N zhRQ?~O+!1oNL_nZZEMBB%LGCOPp~TcxV`|RsH5L5znCmGq_Pl9K z1(!Uu{!E$fU$xrqyY<`V&{PSnNHs%dk>aVUto0FLu3@gZQzA-%KRCz-p^V8eD9Lj* zQ{(Nk)7)-RYWH|VhWKh^sv)?NEHPU$A|G0+{vfUG5x45ob_r( zucY0Z%*K2kL^hgzkGH<@C3*{cim|Ebz*bGql656olD%0+`99ITW_D#ab6~IKZI-LG zE#}(&p_uS-HrCoL&}wRlDyiKnT6iqbmeoOym3jQ!$M%AUgj5?D#sPU7`)SP*OL51- zZEmS%F(f!*3tPkSXzo>uap0hGP4Hj;Rm`;dJ$4Vrt`C%P1r@(&85Nj&QL%KuY|DXktq4wHqyv*xvp=YReMmmb-GUL^I& zN%pz-lc~OIpFFoc^#A&q{hZF6+x+hG;-_Pewmx6`%5?uUy#KzkSyTL(wXgiJQK@n5 zkN*3+*pGQouQ|s3_otxzg%{KR{67Ew!q58O7WO|^aP7LirTL$W^6xL+b60UmcLC14 zP~YV9ZqXmwh3REjNYuVR8ky-=cMO17&A#I4<;8Cw=;J?M5b6B>{5_pWsC_CvYwq)L z@wFTB-ydbHk22N#_saddSO3rN`Oil1e?D>UVc`EtKl%;n0FVzmL@Klv39t6V=&6hz>@t?=U|V=ahF&8aXGC!J>YX zvv5PWfrLJ%I~Et zsA#x-9%o_qEj3<^or8Z4iNNvNXSCKvm+mV-6$8V z&6ue+Rqk05{WN!dRtzc8S@-0wqzT4WgPg-|{P}LdIyRxFoawXkik(J4Y0-?laIf4i|2O`!lbgLb5%rEB$_OPZpS(=(650O{9|IDp+ zSt}-`_x|aU(V70q=TR0&`eSE;7^1Dh-dApL(RY4kc*P z$3&*{Los~#T@`Jp;gE916fLkwXcy_ZkH8n9*qd*^zNSRm#gEDCaS;rs_^~vUjefSg z8O#{A%ZV4tZEQrNGilWVM?ai@FULIXXy3-E)lK@EQpkW=$HF7hZ2#qAuL|4FYnIj} zLZ9FIS}CpY4REb_VA7`6b03pu){@jf7UW$*24A?nbDBNx&KZ+4TJm~H8MNjcof{0(U3oHZf z<+vbg{9X@C%`sKWz*Y!ZSl2tVjqu6WJF%n~Y3L@g1h77?;M$m;W|Df$Pnqkk_C!-B;8(j-5R@2b7)8(i};+(5B|-7+%YiERzw7ej+u(JEA(=Yic+4 zmC=pef$qbx>7T_dTaVlQdB6ULCyy<6jOdoI^#0|a^i5|veH-@Me%)OBo?LNGW$IvD zVsZ=LLk+@Oa3*6g#$OZDxVEu1LxYC)Dw}QOoWx$_KDq3H3_IX<&XlTfx(ivRGjc!s zwGVnohbWqs>4blvA(ku)zyFrR9eg{dGIOe$QwvjeC=vWPxmaNGnHCR`Q-?uxi&$yo z0}a)fgTWnuFjXEvl`u|=Nz8HqOs#lQWso}Qbzg0vt7sv z%xUAwWMh3}v#1lPDql}|d+M9(W!`9!vj~x^Q8RZk+QBL2$XlR$|C&o#`HNGm;faJ| zj=sCTw{tjeE9u|vlE{z>>AI$Ndbho;EFt`X6FCRDf$BDXhTcmC2P&dVF|+0b6&rKn zTZ!ukv^6&4B{Ssg4JJxwsZvL9IaxQ$ftjRkQ}&^jLw#*I0r7G^UQvUIMv;y(5T}4h zW*fmhH79B~Jw@Hnq{2#;I|dT+1D*3KN`(59F=cg>FjzBO701-9P}V%!MS{~Xl=U|& zIo)eLN(Zml{B3sQ(kM7Jo*&*=$&{aUjH<#Q)X{7K{+f&2=V$FW)a@ikHd!wYn12)O zGiexHqcUx>4*B~1*QLBX?)7wO6NZA>F8n$q{hr`PWRF5bun$&G6zw;M!*RHtpMAtA z0xZR58v<9aw25^pG*OwFCWd3z3jM+phAp10H9}Wl3KQ5Itjgn4>_W!6jz8{SXzaYY z*^8N<(-im6HIF5^R!Tu5gqW>?#4cnYP1yIA$sDh*A`Gy9nOz*V-KgYG*ZIBn%dojs z;Lb9s>EXAYjqbJk{vFF++eVnI(gghF^pkQVlQQ_?A;ZfiXfXH45%itaox@MirXaPn zo8@U2b6jSmPGqA&xax**dEV$u-;mS-wYe7Ya93Wkp7WrNvC07#`fLs>vDg#DI0O0& z=I|4eP5k`w$69x4$wNYxPuU;dKD_0_z?%Ennh+k?xbHr7Lh41yt3>sYx2Wd5dd$tL zid>reQk-^C9F5itbzuFvc%ku7=+CLMj~XMjX$VQ=voR8gYTXFU+Vo=PtC;5Sp4k21bfWYvUYO(S^%%MQKA6sa>}&Y-UGb|0Vv(jE z?1Z4o;NQ--39R(xOj{Qe%@20=U(7X={%Xq9zJ0z{wv3c{Oq_|h3;u#Y0x7=Ypv?vg zr{;icy^bPsYENfZXKtq2OZ#N~Ydu5G0ScQ3K0}5r+-OEo&YbvM6jPiqPZT1sGgVj1 zFkuFFx~9lH-*l~Cefw33S;LTXtG~8o>csg}LEp&KoDLrwVIuNzV61ifut}7?ouWQG z@CXmUwB!gI(F)N$PS;?jxI$0EwNXi?;ILic;ku(UHCDHCt?DcvjZPLa{`1~_9;jya z>r9Py2J5raDldbm3N}iN`z|@@B$~#JO5RI4DVgcQRbj<0*|SAi<#1zHaxHFW?civV-0eXY&|-HmJ0{YoMG%oR_7=cH zjm?ud2j8YmY!S_oylZ@}2FN{orfi^L0|O13z&0O&Hp`E7t`&Kbx{{n6THSKY$m%_} zA@QD8AM&-_UKeze5XcH9ASTz*QG1=MzDEyu30<Tfrv#?c7{{oPsKo*&B)s zNl#9~^Cj^Gtc1#B_6WpBZ1VSmp}~aLS97-YWPVmSD%0FU-+6=Nq)>C1 zIVs1IEJw1}kLKO&#L<*W(w{2sqm3QF-Wfh0M*^06z-&VJm5M8CvhMh|M>C))&IkN0 zURC6dx%>x?mmsxW)syJHb0Yb&K^3TZ&OsW(35x-wwze))vRJy6iJeGD5 zRt+a#4*wk*7Tk48)6^8_AkwPA%(+1njdp-O%Gr6TD`KB7xXf6=Hp_vN0pd;Au|FSp z2H5p`(v3E#H`s<>k2*zqXV5H%YuZ@`9?y+)W zCPTTSAH;%maN!3Qrk>ZrKyRQ`gQ6Y21wSEbdHj25M)c=N@(GEgM5kSlp@f4Ep;=F9 zlm-yYfqgc`q7$?=t3ps}Mt_3^{LjV$r2qRSNWgZ&h8B7l5!!lq3V`@=F5u@m*pl78 zO}BXu9DjOTd~XYHjLgysc*-*5NI5R%xrBF`P}}~MJ+yyDf4|j6ul4^qE%+tp%~={k ziM6zP>KoL1IG=YhAKF36(9_tQqstzb86~r|R%6s6L^*}8hJP-J1-{VM);rG?D|Xfx zD#S)Z>B2Qlz8dw#F}t8wp)*$9QEQ9Dksg6&qWW~WJx6?wa`*{9<1Ly_q&Q+Sx&_<4 z^R5-|;RG@R78QgMFufXHeqD)kRJ{iXxhhD6^D0*+Ipg^&GA&^`098@5T&5&K4AUmo z1;MAV)gduc5-ulRLEkH@sw@i4wkALQ{{0kIRHduSfZxW(yvWA|nZI`@C-kWa3%$I)*z#VtwqQLiOKsm{na`zW zRsMC=cg=q+KUP@UX)YB}_&7FqyV|MqP&WMjIRmcfmAyX(CMPA8JC-hF8(G4oopN`f zwZjWxTjM+Rc6bF;bg;tR-QD3LcJ}N;6KT-Qb3d@F8^}M=M&o$B)4%=>CH5DF*pktR zm-(+RD~Ok{#>u3L3HHb^AZm3_%#S)N>O*g|LV1^FM;bw7q?pt~G&2aLunhO_SJxl= zetLGps*rxyI+(NT7E4Cw<#mbC3exkhzo93QtP9WE--uy4scCr4iSN1C$Fn`O?tkbT z9NY^f29l-&ie$6(4!wC%Zkj&aRK-Q@oncV*zPOg#@H4nG+9hz2p4ld|NZ!dxOz@QU z9LX)}&#zKc>6m_z^v0{MQblilWmKk1iaoqBC5;uC-^e+U4K2fegod7S$uKbzvoE`R z$nockMeEl;Nqt%xwX0te=O=7;7dz@4D5$KN8mW$1|-)-$AJAH^+{Ma`nQd3+g(XxO%NpWJ#lO`Pi(8Mdz{5JZpAgyx7R=4GQK~bJ7!14t+Bq+Z}}G#@>ipag{f?D;)C55 z(l{b`?j2&7CMF=eMU;G|Bqb#Z)f}0Eal(YvAHyqex0)Au3-GW;z#$76HGL4rNa})v z1jZ|rIso8cNunb35{qaG`&GXOE&vrE7Qx)8xc~Q+)uk)A6`PhC7?eEU7NX(c&DH^_$R zI&XAH@!3z;FXoxCI}4+&VA2(Xn-204v0PJ4CX$SUc2=WS&lN~RX%VM2U-mKGKRpix8Yuz$Jx3d9mC zFJ}I{Kyn*w2toU^BTGE-SJz)ok!9Xkf8Ii{%7}B^TN!~PRX@!tRl?t?_Ohstzy9*h zsxbW2rjM7{9j!E~yRSsQpy^eS4O+1Fb~T%qwN&K!nH-d|NS*&h!>lx?n;4U%J{$Xa z(sl3oGU;E_-pc7rCA({s^fz3%2-gCHg)VqP!Up*aIO}WyOU*?^MF?YF{c>{ux}Cf% ztf}YC3e6yvfXOmkWj`PLyEUSD4n9s03GH7B+0QE=fOrAaiGHZ3a4WpG2M#6_+41S}r`Z@BcE zAs%Pca>!S~=?1w7d4)Uce?5mK%B6jP8dg4RUvU5t7Bvjdcfi7d0Fz_KRR~EFiJeE7t^}NCA3i*+um8sA zhthlDE>+Lx2dG-9zN~}l;~`Iz-NK%9PG&)6@C)w(2q_juE-qzv3n3`@GdX81X};k9 zVc56zRkGceEEb`-gGzgre>9~?JOH?TbKTQ&=4ksO-m@X1p~UD+6RmqLgN>*2jI6Al zePS9nNN}G#yV}_H?f1)oWv`jR%IgYMQymLqM{X@|zw>v_c+2;DZ5;;j%-l;ojB^9- zpW0g%O5K{@=)HD(wUKQ74MO{o<;VJkaf<@SQ`X-#Gj&tcH-ohQHY@qKqPpv6H|=w| zZJxuA>uk2c4{-r1TyV5eTVO7lI!k?9n$SE+$&RErhv3=X|0`+#uMpf(nCb&Y&Zw^b z6}2S|D^HZCgctlcJNWr2W;|f#QLK*kBj{*&>B&xu6!@4;ocBL*BFCyw2fN+f3B{;PEiGB zV8>R*kNG3D7%rjso(93Y0#^P^Aj-J@PiOs~7v~;tAkgBVVG0Yzv0mGK=5ocQh37|! zO8!06bK<013=}JgkvTuVv^Hi}5U31c_2_>cc@d7@T+|qX}v9bt%MP38VHseBq69 zu?WuvceI#iW9X^3)(J-FzU1ZGUAZ29F!g)Mn*^sq*Oc!Y8S-v}b+q>nCCv{V>|7Fa_X`r0$!NQl|2C|Cw@=sr}KbI5u znG65Y6p+eZzcPTl?#Zkx+F9KYS0#;A!Jy1a@$^O|TgI3K2YD&paF|o`$7S9i+}~Ln zHoC4s5|Z14XHeQYb!kBu%O&kK_$JiZSEE$|g=u5cyQ#Jwf_ z2kK{&h@&6j3a?R%RFfo+DMy5eYp~@Lnjqd32r|rF8N_%*Y z?cT3&=e48J7IKiYvDfLNG55)DJ~lO-Iwi9Ot9Q4US2?ej<3IUH^1A01yT#L6^B6^4 zC8bE6RLmAP%n4C+iFmOj9`@?YZKo>p?5F0^T*%0PTiegy6eEXn&vWO_Npiw4%g?;g zI_yL4%ZcN>CqTnr%Q%Pda^}s0wwa$$a2>i@4w^9-mNBjIoAz((JSEAA6C#yNzUp)y zvmd;+l67H_;;pQrpl}M^fF1)MA0L!449#*^#WU*S#*|G>oh*TrtxX-3c} z=Xzk$u$Tx<0J9wiQB|$DaNs({xLvw*2@WG)rXlhvDGA)Q*^fo6yy5;(*%|w>og68L z7$VpNzY|soBElOS>^G=G>e4yxVEKB=mp>eV0c}2j=R19O-zIn(ikg{nZD=*Hh&%uH;4taPsrrU~CA3Hx<9G znV;B>z`ya%>Ys^GZ(fc5hKA6`bvZ7)nK3a@sUS3Co`F7CJxl0t0J0{z;foXl&z^vZ zJ;T2yaE5~D4cZb8BAabJq@nlkSs6p%dAHp)w4;?jZvWlxocf;dyzm zzrwV?wCQj6CIGItvihf!#Tl0aD%1O)J@KMSP${c9UC6iIuipAA^Fa<5GLFMUa&O*%4>zs!8Mmfll2 z)kq~qg{)|s9r_;A@ryH;+8!3g+np9qy>;VgDtZ6K(ZR5-Njn&`b^p}fyK=g+vci*P z=VJJ0e$vq&*;{rTI({QNQS(C0wa%E&uX>w|-gOqbMYW1$$a*A}J?Y)T)ZEdubgEj$ z1$(cWL-(B3rzOrW%52r|0o{G5%qga58oDRC9$4>DESF)j#G!k{nSo}DG)DHUu!-~D zOn~udX&?cINW*!}wZR)M!l|i&oDVW3;jeBW35$0>FJgSWb{6PY>*>UA(y1Yx!P>?~ z^H~DL7zM6qyAgi?PhjmV03SG|E37=A6#ohe^*5Vs6W+=V-MHm|fbnRIOXyt9>&p`+ zV5yL0NC~fS0A?x3l%bfjK`c~t;gp+sWZW>RR%W?ELB^SuZuosBt=I(3%a?gU!cA(q zvBe?x>?(#b9i#t0n!Y<8>%M)zgf1g4vPlRD$qGrv6+#rUlNCa;QnwYEAtOQ|JCsq` zBO@d-LRKOpRMIe#r13khp6|~e_v`iCw+Gkf^B(7UoX2QpCQXLaai3-FjQ%Mm?4GxW z{mB-Or@^CDS1`X3XB&7De|>OjD*m;CEL;@4pi4%L@vp)=QFw|-nfbnAOuU3vnl8c? zdUOqg>7U5{su^$mmowGxl76BPg+4iQ=49Z?O;`b=7q{~F--N2_v@PjZxKx=Nkd8$3_yClv9W=Dghe_Z0kVd}!?HU}x-B_*-TEFjeSTC* z9vQn)>u+itd?l&ZXtBSzoP)t{{qq~oAN`Z6H;(5Q9I#Z_82P<+-Ip;laay6>dT`kjo19;+*S`(9ZIji} zG5^R!|HP|L>%KI-3*zT%Bi~6MJiu>d*W?!mUx^Eo4Py)5f5<-Zf4hS=4*XqK`O|^m zyk-=csFWSet4)e?#<%Z}l+`Az%npOa#F*x}2^ynhhnQXKK zotmty?2#j9L|FX%{JwvAGd?_Ag$o&e{wfIjpRVgxHz&%@%fzBM6@+Bi#sbwpQY0*I=4e zgz?P3aL@h_Sdbo#D!Kb)nWDN;llw0zTaKd8W6jm2crN|lAg|0U$-$gRNz570e@`Ye z?frFpD2#@mqw@R(&iusTKvBC-XC45#vZxAOL+l#(PIv~BXtXb)l^bLmCk9CRp(9dXuo}v zO}f+k`?EVEJ-tt(l^StnL+N$Sp*U_H9*DSokd=c#Cd{PaP^kQ8IX-CRW>$=59y-}n z-FHhfZ4$SN^YUiVm0}c#<3s_a9LjNW$8RI~wwa42}c%5SVbD67S$m9(n#(3$Jr ziwIkAL2q>r_xHn6W_h~JDk0g~gGGbicgI0+{jlQ}N(DK~9lMTKRHSLac{X==zVyeYaMR z&(BABIi^J(s(SQE$fDuFgCio}s@od_ACk(7W(1q=^{@eGCEp13ru} zqEqT411T^D#LoDG&>6T7YY{j(IH0Ec`>jwVEkG?4eukr;EA+@Ia_aZ%7ecBr`hBJSGO=SGarat7r)$SOmXS) zn|ndX7<#mwhTrBelqzJ)qsXEnFv;*i0+jDr@e5YV<~|zAk=S;mbo|Q4X6i-S61EmQ z^J+M;!5Hi3<#1BVyw{lqA5Sl@6~7w5c^F=OEAu`Bxj!U=Dp)?SGekOq0uLUFeo?dc z0<++}ZzjZo8v%hZswJmX2jTOalja1$IqK}pWR7FL2(2HV)NlYUAlcr(OS}KH6)Lao z>tUmQf6>#^z<4-5U~Uh?wOOQ7KTkV&K5+fNp#LD=izK3KK;g!appw-`HW)j$`^q;w zHpai`Jq1#A1$zEi|6L5)1)urEyX0B|P;4hmjbP-3YXNZVT7dGu40U8u{wtP)83VQm z8mkcll&Ah{-h6{VCvu9*|75&qgnlf~BCp0}`dYe&>4jefwwK=Tr#N$WPCwb$c$k@w zFO08-VugxDG21%ZnakAx&b;9ye7`f`_1Rj(`*YrkY8GlG#f$Z@=Xw0*-`p<7vV5b@ zovNW~QUK-8kH3fR1*M(T;AHD~Dyx_IUg4QY@~wC83Ok zDk@OdS<^i9-@3qoy=Lb5uqI2_4bPVmKT0of`=R5!k?|3@^(5>$2E0az_q_tdmA}zf zz!EAeH8nwS0b4nHJe7^uSe&Bh#-4GOKA{#32CHHjZZWmK7CPmiS_NA@KUOf!0=Ej(~;nE0YJd zw`wh_cplUp#Q7R_BO!r_L=eu;pai3=)vZ1yhFMbprT4lEE)*D@>H$pi$IIiwg zfi(|#lmcP)(bKc!qWD@{!gG6s2|?nm%C8Lc%V--WKL7^F!z;uBGBPj(zLUu!y8;Q{ zOwG(h4hAeShFvbf-qv^+4!Q_NfJMR;42Y1A|M&Mbt%y+jl8v1f4&p=20O2;6-B zZEdZpx;m{O%6##k$Hecktlwj+eJVk)okY8U4dsoWI9Lhb`3mlhiRK`c?s7~|KpJv6 zm{tJo>(BNBfn~5l$9@FFS$HywclYjNl6i~u`-SaiceJ_;9V=sBa2}KeQJQ5_|Fw`< zNB}2)(>K@zX+4xZEP3;$3j+-}k z-pKh|IFJN|Y%ir=sw_Wsjx5QW#7V8;-OALe=yYv-ews61VDE09zfHZTErOO;-F4$X zGENRxUYw1HUG#UhI}y{Dp{(Nf?bF0?nT0{o?48~aV!@?kqZA$&;g1Ox6BFN4GBtxT zrq~lMU6xL5l*}-5Y?!S6Gnw%pn#k1OxwKM}tDw6g+6V4e2w%1; z@`$?UL!Q!EUWj3~<%lS7HegXBsM~h=rGoHkY)r06;jw}a^$5&U0h|7}Gm7#@Pd1Yw zOENUGGf0r+jo&V+Ea^s|Ry|L7leSF*ZVOM(5-s+ebfs~=S_OVc&O6a)fua96BCyT$ z+YoRkGOB7t#~}Yp%h(u6tim_9rXz@8@~S7Y2}$tvate;r)GwU(4V-GaqW=I+tiV7= z0eoT%2v$*1(Sr9+VA2=To3_H$L$ zU^55=+^JfVQX|5+PU1l2Q~345l7huypkQmVtM?zc7_M&`#8Ze-x*u7(IWWKVv)ivN zDLU{znD>g#4I|~aRMAcz3@gB)hHw z;bJwN)2sjzhm&|Z7V0IU?G$(r~05k(uI zGfYq0z}%hOw4nD3Z<{d_|2~-YC&~6U%6}e2O)q!s-p$2j$bzt4=;H$q@>6odC51TB z8YAofW|B)){f2{i^AsbMvUl*<)}>3Jw7QFa+VbP?SIK?4TZCh@IR+rICsxgiO+EnLk`Wkn;xQzuaPn1Q?>^@~- zXyaqRQe327CZ5OK)exoef?O$~mPF@C1_mo?YmvxRYO-x?;oaw@3+7a{0^{Fue^YTf3bU1VVM8X80bLwC`=mjzq2{eDh%y-_C~l z8jLNd!77)`001#>FTH`B%N@&m`6)HHNm@w%n)i}VKk`Fyt0YP9SBy3G1fdl=ZmRfd z=$T0T1}x~}%52-HH4NYxK%tibQ1slt!1mGCU(ZvKDQ!P)ZF8jD_X+lq%5>frRCRi1 zmjiyZ?Vd#X#L|)^zxwEd;<%_qXbFNZW!oLQm5tAhe8|#Ds-F z5HbE85<07pnlE_b#vQfP(qhiZ?d2Eoi%*|8BilK`mlee=DonLfQiR*$rv0Tlb1%%+_+hH`7^?$fE~lj;`dwjW(9e9Q&ZFR z9L6hz35%E=$c=oJSG73o^3r`*b^~%lJhc%)2=@_qi-v;MK+h`s>-2zl8jbtct&oXU zQ&rLa*wM+5Etk|i51cmuw>-S=vwjX0!s`R9kt|Xkx!7b>TG~>u*Rm;~PG96|-(TES z7*FF8KN;|L=M-iak`f8zz(mTRC$v|stF5_f*#8m0kslf(BNb)KkwzvKBU4PD?@pR_ zozsEYPn=zI&$4=yWW2xkH%&JF&Pd-p&Bb;2>%{3>CyVoQWzzE=itAiY?IKy|zIV{3 zP1gIbs!NoiW#+!TNa2Y)!nO!Evvm&5*9(=_>k8u;)w4gIR*l@S=zWA#`!1%S)Z@b${q z@djU+hzr$KRb(eQJnFKrJVXt0s&|?Qu?=&7S}$eW^4Ri$heD4eJ@qO_L~v>&jLxCN zgwg#y>C}QlcqO9A5B_5yO8_QWp4@$sXy&-%(80(vIm5VW$Q}8c`b#K>;ar^;PpO7h zvB5bFlkKm*eg1II@0d+ZOLK8|4?@+kW4H&lWRft3f$t(Nk$giMR>$KEuU~)t+(a)& zDBJdrB1~cPGOysgu>0HOewd?9%%*wtL^_lTtR|Wle)#f9-C5Lg;r_W7O`9(+ZOX5^ zy?#`kG#I}t>(F7jie2vZ2qSiWpO|QT{mApYt#5R(aa_w(o239Hg0OPVe}nzl1m^A$ zL65}AW38H|CPWn2l_BvLC9UvHlz*5RfN}>AbgI@fkB>mU_+Z?Rt$pkG=q2yUMAika zMXkw@1~q!#HYZE^?X7c#@Llm%jJ`&K72%|SgGnr!Y~$F%Y$uGYH%t%qgxQlL znHm*8T;a@l_U!Zjq#v^dp}8X3%m;H7dEDq{G1$|yJvnOuCuHv>or1KxB1ddKP6nu@ z93Ou8+va-@YhCgF(x|Q;`#@(k(c>X+z1cY)s#|V77rK|(#cFV1q}gPrCH3-c*0|f^ zQsyKxyYfogm%@5(e>SPMY49~g)7%+(l$+k<4#bMJ#8W+GFd~~J&BN(N=+XNkT}br7 zJft3mjZU(Pa&niE#R^AouofPP`y;>5t1bXhEkA$$#7x6RvU4>+0f7@OpD$Y@&;%aJ z%uz5U!JS(;Soivvtm#a(W!R`1ACW*w0R%Hq@IHEgnwkzfL`h5K0*yil0{DaXjSvMX z&ek>|O_s9gG>HD@D6Qk*rY`%2-ve7T{K!A>T}yPp{A=R~Rxc`?!ILVn31|NWMS>Wx zqm2tL;{pj+Uv7nNCya?isYcXbYIT1#>O$u@8ti`f|L4g`{$$ZpGt5PT0z12&(CDlE zC1Wp#hpIfCEp|1g9q)Ok3nyUeQw~3$4zGmgI2b3`M-kuJah#ZUR(|=;tHb|vjjVi) z@16&`LMn$;-mM*cdIT(1eio^Hq=7K~unEfzv1~XdrB&X3Kyz!oRPHXWOnEw!&lI1V z?rl42_A2dnMP=nvPqKw6l=g}l@VLP+Fgo|H;eCXR;xqCPKCtW zV@*8;s^gD5Pj4}$G^8>)?*>~8^&wP40tx!Y!;5POTmk-%h#2@8>52q^;D8&DMFU(i0d1DCMwyZ$GW#{Il|_!3vS-p z1yG7-6^3P5Aw1AC9tI>hHj}e9Ht8YG7B#%?wlrFGZ}8OhQ=`Hu@7eNl_)1;U3OFkt z9P-YvHOq=$*Wf<9xwz!ZP0h_J87Gh(b$4(9HhN;wFZ=tirdn}i6VmTHa|H$# zbC%WcBVs;a+u0j#HV&5V*1bFEMe2h`@)q^JO{%(WQva|S^%tmlckjWv*t65R+uNTl zsu~+_?_%79%j?BZOuZAXGo-TF2Ks!9V?j9}QzVRu*{>Oxkxv_V+WK8;6 z7-`0=p`s?ID&xQHM@W)KWc+7_QY}5pMA##{IXz@p3~2Iq>d5aKj1G2JE9BEK;P4CU zA6@YNSnqbMSuU_`NqW}R*dW_8+J&0uur3>aSOBJ|L4YGL@{a%X<}s2OKtcJH9<=HX z1W8y}7!I?bT1{=d_zwslLKo02lS!ZGX)*lV{j>kt%Y|<>O>6r#4D?S1a?){0EuD_F z56*ocsBQJolt@`gXQ$~_WdXs=*Y&)&aEW}dSpD^U+q2RR7mDkwTTZdC5-5S(jV`vk ze#DUjiUcg%1Au>^pN3BfChff#)s}Va4hjeiYyuh!6cOf)lqvvJ@84hSPDg6oKxJ&ND-F zeHnfq&z)kAf0cF(rI-Ox=h9h5diwhFx&D;AmZpv}S8PlJU*Ne_!J>y$CyOrh?IW`zWj;GE>##Qe) z%EY@RbxTcF{Te+MH4G?on07z;iuD*7ckiQCVi?1@Gouh?*>dEH*q#4CL1NEuZx9g6 zRVM7UH+M7#X{b$d>3HUQsObAJQzh%Gl*qy1JMySX4P<|$pb!$lOwppWph(ngjKC_n zp+CAt%9&o@gz{M8Rt3xXGZO4^_;+C5_=lZRb?#R5B=accC0ODt69orlg|rQgSp!v` z2JdIzy}}PCjqRKf2@YfPUTUs8O`)LDPJDC#GGDM^f|Cxts*bRozJmV(bX z-crvv!$2$yilPAJlY-{Yse=vkI)WSs1_iiBVrkC<(x!!Cq)>-UPMMB>(J?N-d;+dR z9{=GF(y`JCf1(Q?wl9n(k+vLx&DI7iJdk!l2Xa_Qj7m|B2zE9@X6`-M-drQwjCi1= zm?coDP5Z*E{}bH*BXcA7V&VbHL*{$WP@l|Of;5-oi6PuDm+z+I4&O`1HmUQ}W`1@| zed;iqps-Dg;zB(yJ+G!WRqo(;^I%T5-Mk_sLP zozj%|8m&x7@7tjzDN-lozlsJ}_zrB8YSRh~@?6wg3m3c!@B-(OjOS24Vp zn46o!6k-FuirYA8G)5m4SnalX9NE)zBIZS3{N9xVQS(9%bPm(^YA+=1;}&i+VAe1q z(chG&Cy7MgWa-FdPpA3earyJ#Tsli{sL9dg@!f*|bINuN+#ppXQ zr~~b!l~W^c0GB-C3&BtIR@@QoQ)fv%NN?*Q$$`_=Qlf1)kgR``#@Uk!YLuTb8~>MA zNF*UNdfpcfXHTE#k7)=z`MN&)iAeI`K|d#}7mBQ^^5k??d;g_rHN8Pd8mM^Ye*CB% z|2)}r<#ESsoyQDCfUp6}zGxs}gyhu?$eZE!`cKz5Cr(@ku!7t>B)jtQhpL(|Eq#Gg zGa{Z96}u!6wC4=QxRaB@#do?G5P$?I)2D<8@=Irq!Q)?qPkrFh85Rvn(b`>s&CT#l zqP-1r83-RYra?zI@9Ye%LR!Io#AV}4LLwx5S+Q?{`&xms+1V5c*{)XP{cZ&O!QchP zn&`it+rL~~%fyTcG=7b{!Se$kRO{qNx7*z}0{IQm>xm-K!0ypZVW9PX72UwFxy;ig zcQw`zm^l;=|Ad}sbMw-f_rB!RKwR$y&MDpV`XYke(l1Yk-59+^<1@cMTZGn^s74gj zHpC#e7ISAO+2|*#iFa`%!fI?#7O@GLW5}ne8Q&G9j>u);wC?T)(rzU5t4Zh*!?4hz z?PR%n$pS*y5m?Ml5M3hLW?*b-e2zo&?Abj6+JdD;!=m&S$deI-)m}&opR2I4W11rl zFG>n=AR*>zMA*n8eG}#H5Ov=HdU~&s@uu6AAQJ-+{92_EC6lB>0e&;*Czg z4&ho`81dBZPm;+*P!1oAEBdQtLNRuMF=V5f&N#Hvl^$2s>8A{xgU${cFpCZZ< z*@?62WQ94Q5}lZU3WQt1%iJ>;%c2;MxRC` zQE%VQA4+fBX(QiLHyp}EQ~wk( zb}zPleEsB^d5XrD+Tvomh)!e?d3z%@4YO_7k0PM+4sM}Lj5^Q&LP&nA`=FxY$MsD_ z<62s>Xm|z$G?*0Y>FWL>lOfS@Ar3X91H4Vt|+a>`9ja@McZOckfBiPYX1s{fFe3eqvWU8GooaHT**@CT4&rAr@& zT3abrMgp66CvS&#lm>c_mtv6l<7 z)RXs$XwOlw8YCros*z8v?b+Ezr6wrg@TEWw?gmH?&*%F_wCt2gUJzlOJGYAg`5j@I z(AJX~I|Vc$Tig$)_gW->1R`Q7F^YV3WGh{dnrd4JI}pA?$A8zN)b3cWNQ#aSlJq-cHK8StD&0P|^%KQ6Q|&~YAadzci>!lt4D2<3Q;J{3+5$qs z=caZLHj5?Z74JaIjcK>TutVW79)?4k=bfpqw*;f!`%;Q75ViIw77s9aGakt2Zg-;%@-77DE;M+htXszcCFmY$_rfw5tqI}cTg4|A2A`A2X%Lo z=Yq)NOQ=#?SXn4Ue$gP|#*JFCS^v_~ql2H=l@%$9;BP7VGu>+1r_%+#MU!_}FJtAJ5`5Vn&;L*8?p z2{;i3Wno-Q{h0PKbQ`0kr}q*lo;^qHJL$!t%i@T=)ZsbfVK!K4R~BjKUS|n$%Og3y zifMc2G&YR{BEkU@B*GG|UBQV&qjOu0MFp!wgykh!`RS*W3FpY2PeWmXg<-z}PsH;J z=g%M2r3`JW(HEau_O>Jocybsyqk zu;({OY66of%m2%vp;cB5*ldHqd@lNW&#ID@ZKqN0ps@kVpe)c4m``M7#j6Y8&VmL7 zOi!9yaJ!l2)TZ^g@Wj3KFvV%rOfjzCe_w5WRXF@&#dS-dBL?k*{^J$r{HKP$xTHH= zGKbdjsb)$UKL<(I=O~4?$UZ^Jpc~V3zqRsTN=>c{8RQLMz;-U{%6AZ-kG)KFFi-D|5JIYhJQiZbmj8^ct+S@SVmzIo z^>p5AW~(1)p{CYXl5IJ_G?e8sU=F9(QsV7kC~+-(IK3;3bd^;^-viXb+;8tPdj#5| zxf0K6G&#-nXy&EvP1P5zXG!Naqpfx6=3!k8P$Qh&K1gSK$)aE1<*~L#bftEZ2>$^Z zUyIHGy98mD1Sd6^Ofd;rFz?e5h!NCzSrq=HGX%s&M6)5xEjsrVQhWOQVYv(AZIpX& z+>V{m7rqI@ODzjTp0~GasE6S)E*l*hV(Bi2$aZ$wgXfsR5TICuH{qNDl7@VX#l@rG ztmXDPUMI`ypV>?E@BZXfhj4Xqwr;TAkgIHA0egUXFMdrz&loeeW?GJ?=QT` z2_ZHWV>W3TpFn>wF*KBxmNrCP>(HIzt+(o$9p&wn}NNPZX@G5OFJ zDQzoGc``KfdAa!Iqxps#zyAOy&FVWR$??taNQWnNC@jalknjGKQ9!V1pSP%4Gg96^ zeS&o^0!>Foa*bX(Rv_$bZUBW#4g-Q$0ro&@UO4!CwE=-~78bc8MJR7>K2J(X33;%S zgd*gsstcIQuC6h&wNO-bb?JcIr>TkH;Vv9l-Q6u`03i*`s8UmdcOL^n{+=6719yyY;R9#pdh&KRX504Z$;xfLSKEG zdwvsyw%l9_1_}cfNZ4*z^M#?@K!iiu`wi4`perK*0wT+WH9t~k@V4!6_{X zU5t?0SFgcxYuEWq^mO&mQ% z%GkmJ=nx1`v_5^>AL)i*f!^iY8KsW&7?jYCmU<^n*!>pYzkk?C7N6ehPf`IK;y3Kd zJ}moyh5wy%2Mk~E1l`;a9>8ShYHn^0h?a{hIu~2!K(|9IKIm^tj>2UAhDNu(hm_rsY z@0BBpESjF)UMzHMkn~mXvo1u(m6*+j|K1V`=U>ciH zvY=$U=5?}`*vRzhCKUrINEQhG)mao~lTc{mgCv=Q%v?by)3vu_5C3f`z2CX67w zqoY`&e9_yBjE%%Z<_~A!VNzeum2?mnd*dY1f?#{!c1?J5;_Y(n;6m8So#*z*3j(l# z-5jGi3$3WFBnOBhFdl|n=47UlxvA;s^7sNooQ>_FH6K$)eTNuB~-Pg{a7eytvN!#V(0 zOS~J*P3T>*cyRwAofjnNp&?n!#OH3F#IX&u_jd0)Z$&&}pkoR=CdI5Sp}mgVR1kxW zVd8%ZJpEgdG}B_ECCCi5&b$|hAm!!dkT8Au;ucBD4!{zRBnMWov9XCnw-U@hWO8U zNQ}(CrUz!=wyjBm&LDCEaAwg!G^KVTMB3gsC|bA~JzWvA08QjlvvZXNxD~Qo2yqF& zx9iyL*;*0*=7#tchLgH(D$IKWGhdN96(1hkbeAY6;bwlj{MID8?#*^)5=mbqH2XuAjXCrRYj54Y9-S})!pv-2YqQ};34^_GGP`6-aOrR9_2mbn2 zJvn1Ry`j;xqfanS#yn*cE%r+n46fzUFJOIvX~K3L0o#a~ZB2>!Gfw#C>FzdGPPNCX z2ypx6CdeQyo)f>3`}Ca3#AA*7|jNA&r*PzcIa!4ZF@Ow`>7L_x?fo*7z&FW^MVrT5yEVabH% zS(J_-EC8SyY}(Px0BFFvClMYX_wBrk3uKY>aZItAwxwjHmy*2v_GWFx3}u9<>Ex4> zovvK@-P#%=5-lVo1c`SqlYZhG1V0}-gfvnRxIm@L4Ep2SJcZ;D2p{mz;g>H%T5sYW z2R@8n1y=<8eW1LKkJBm6t@#bqSQZb5l>7`(E*x~0PR$(GN?AKB+|Y;O?DIH7_;o<-?*(0wY#KmRbi{P;JBV{nPInlCSxM*8KE zBNyb--J5@ZM;iq7DstFOt7bB(`Nx@$S~DY6akV~&aY-zlwWp&&hu=MdVynhWF9qsE|Aikf`7eE5?oq=A^n z;{w)7#b-m_Qg%H@d`$An!a)VKxti{7!Z+XA$Man7{YFj$FIRj7BW!OhJfWiLmhbTN zYvk=QNA%o0+jS~h8LzHHL6GEY=Nb2NYb)QIvvwB!X^e7?I-Q^T1o2O-xMec)lTdv_i`1$Nx2ZIFymR z16-==QQEr7fj!0c_B)2ZpuYYjsl`LYiY-6yh4#>ZMNfF=#1$Z##9Iuzm0ji1KVRMy zd)PoCXbUofU5VouJTg4=XKE2@?C%;8aA!n-Y_Sl>`qTq6@uqJtkLQX^25x@F0|n<+ zQ%Wx2^*>fNDrCr$CMM_|XfiL}{*3-c-2ebBF1m+JKR-@SldTlWfNz2ROG>8 zj?Z~Rejtpj#lRsBUHObhEe`bDTsu$Cfdy|(fdt@o`G)sF8%7!hJQWQ7L)M^+3z_q; zg``okYU%#43)l&eCVit6-M4Q8DBcuGE1Z9fG3XfV939_nSNWlaO@Hjzb_@QHVj4&Ydu13a)h?1feBs~a}u7Ns{X zFZ130moN-OhKGX#$wW}^v(qZtaDzXmS2ze=v17#sSow%K+?d|3VulnLdg__;3IRVn zl(VKD*>3B41kwR;Xfhrz&h|ehBEqYsZ-)_mmxC|dE?Br_3| z1m`7E-ea;Q1a;`l_i^`QGT|NyzmQS~HiP$n|H1Jd8hM=NMn*=UK2V0LeKX&p7yhNb z;4oL8g3`MsqgI!rgy8$z-}$msw!Q2raT?zzb8e#lrhdOJDhCk{G@1&=G z?#0-d{P|&$ve{P!7K#$p;1KS(t+S=Cnu@iP9Iy5z)RI zu7 z0?qr!`oXjbvuT}H6l@ASn$?q^FOPq|Tx#+d1~DW;<`kBW#H~e?&uEV4y^j3(F&p`} z{~>IXFqpNFP?@&EyTB5c}(B-c1ga`ZD^MEmC9AqjC{P0g*Or0h!|#c1r8=q}gHL#$G2?mcWwz>G#M zJ8)om!AT9;5?ov;o;a>TDWaLD#z!HvJHOp4ii`iLOVwLCSV+t?0wA%o3vn>#U;#0= z>!rE@P+w=@F zEp)sn;=vbOR+v0rW`?%ikB}pMv*b2)0IS%_rKjn|K@V5zmh`i)?IgK)`$z1h@MoYQ zq!v^?YkCz~naeKaw+m859STTT2hvSxB406fSf) zZq2?-v$-M6ELKKRQXf=Z6BBCbcgsF=lfmd(XFR|XLl($MN^W$&WUCI5f7wW&Hsg%Z z3P(bbnfQsq)%%5+AyhSwA9Ek4Ory^^nt7t|baP-Md{ikZJ`9CRn_BjT-MG$vfIQ&B zX%2(*Gv#I}Rc7LlHiHqy({TZ3B&S5&EbeFAqB=>}+Xa4J%IUK4@&bsJoSaM(A}J?V zV1hQR*j5lv9GYno)Kq@(D2NQ#Fl*EmM%%t83@sRZ5KggZ)Qs;R?L-p^XH3x1 zWGf*t#_z)!BCCf64nw`LfVU_~m3V)t>chmRR=cCjqOwT~Jz;zd38ybD6 z3~oNJM8%7>ilc0oqBr3MAItJPuS4GqKoG$N1bh+addvMo-XHoQ#$5WOTBl%gmel#K zHyxtri*-DHY&JQNk@3c#b9TND1F}=0d<5*=-?_ME9=#-~y!V}StXNxztC_WdfdSs0 zwRLsADrMsA_y@F3{dQkmd&9_5F|x* zo?;GBuF8Jv6TxI0rmrNVU#TA1$sVcCvd^NIc}MqsvlL;0=W~XMoyCVt3hk&8`{q_y zm^6al2^riFiQe0wdf#c}p5w4!PKsfSpdqu6cCI>8G>NW6Y}-uUm@9QGBqxvd=e&?( zj=DGO;w|sMfjH)tLzltWLQNRjf|2Km(3XCfL3q`n$V=nMQKr3cNDb7XG#r@R+()Tw z_=u{<#9%wd_B{3>jNU|cUfv?HFSO+@Z& ziranZWY`}2Lr$vOIGo&8I(OLmauG$7(7K^%wwFr>2#P^l$ddiw(ZRuh^#N;XF>F79<)U3}Qgpmx^9 zg;vN4mzJ`^l15(s1<_=R=60drPfvdQ@PQGinAlNnhmPE7E$Nka3<7p9rVgcxE62dqmFhd@w+UYjdcKqIl&(Kdoz zLyCp$*)}H(wU(142cE>x!~{HKIyyQY`dF7-YLc*U+2bpy&HNw?xyF^1l+O(^Ed<#+ za^sm4=Oak`BB>l0S)2n(XDg7%^i8_6>T;7W_tk1eN&2%N>8q5?x0B>8HgheB%wJe* zE^2JtA_~yW+Qew(J++g%-cE7ya9UfAnt=ij^(r_NFfAl0@gl4eqc5sCtlK>&0Y-!6 z`0JO_2QguKUnSnUJ8R%uz!Vu`5#}g9e~J{?1f4D8h*{)d0Hl(HC*3lQ1XqYyp{)i# z27txP?SovgT6=R0D+>y!jRu`$yC|W=z_ip~$wyg{U~`u!O+dX45>2z!!>o)9jUA$H zY_et%k(i}le{2&NXjKdt+^R(K^5b1KyswX;xAAS9#JWMg%!4y1lW_c?o`tLsa0|{M zz&%Ky_|7&r)USxU$2KEao*zanGdFSXjk!8jaGv3vV^YHp)1&na6VeU|r<7n8j{=g4 zp!0@?0Q?Xfp2&XHOfQDfj)wv!=GM6M#jWr8YQ|F!b+w)gi(mj&u&a7mZTgN=;qLg3 zve%&J%?aDj{rMAUA1tIz+Pos@TV~f*BE~H**-K#D0Z^F>CbGquZ0zjRXv6WcR!bBL)jo2uUY)YAG2=&DdKS z7IUV_uo&?sC-1xGtR_Y)s$*{+HK>0l^InxeFHNqFIPpH8{voyf#1n6wrS>lSlB7yB zMWS6!B+m?T7KwOTs<9kY@7MO^mYJ0jPc`Ua7BjT%dFyvRK@+Gw&$9+Gz}5 z)?vHT45ZgY)9BYn?|K|X$vT&CCIKYNzCph$J>uH6c%DPjz;0%!qS+M3T33+Aj?Qml zd>rw*<|%slhM+&&NUCmCr3|$i#MJ@hxT0e9%2)raVHX4lmz0)XaB_mM7B^hKul?(o zBpHk9R{hwA+Zeei`0@sP(1wR@XAB7u5J%Aj2N*QikdLDyZ(HS zcAs9AK?~}Io1?l~E>+h~d}rdA6Epsf8F%!FOCnscn%-FjBD4dAZ8NI$u@c7!2P-Wu zh_H~hmBLoR+#EYXEdn^1wg2ZT%*sAEcXDNGR)R3a(vEQ;+hruWLi`T)Yf5gdwp zJR5fybMXg*3w$g|w{GQ0voRHlM1#_UG6TZ~A0Hq5EjT?9FFEVkXcaG<C;!}Yd^E%l zL+yPZeA)*5)XGYhZCPj^DE2j4O#ySl;BU>(HzCY$UV1ir`fhab5>cz!Hj1WOBz!dYqfn%r6*F98D`G7v&M)KA8`1zV~ zAio@r=H_EdOG_=G+c9^1B;Hvyq13mRnP%xPhBMe>(?_Lf8KUIo6kCkosHm;2t)UUF znYT|&tj$%F6glh?Zs#tSUPghw1IQJ=pUek8HW-YT9AWz_@Gk_@NOjre)|$(8AE%qZl4jf zQ!7ptW0H1TOfO;N)8PpVP?bv`Syr4r+=F@2%m=AdU0lCr*9Ja_C1@eTwCfE212;x< zXa22UlT$WVpMR&NXMkuGuPY5{dIA>AKYyc2kFSoq{ruX&3($!H%0~`yMUp-<$$;gh zaqYQ;p_`k5ZBVLQL=8r(M$`@FzuDmq<#&VktHa@yAqE(RPG($T2TT-P&;=#(9Ax zpddQ8GqLk{l9o}W;DE+L*RDqde$iwXFR#SeTENrrCLzd3zFk&$#=nJQPtNEfDw#G$ z75ZiqaO#qR(d>dKBAd{Lljg9Qp7&Y+SAkn6Fq$|xKpcc=EXrNLmt+(I z^sV;zR8d-bvJFIzugK(Xw0ii)Eoix&{nY)WH*QEj#x1+-^DFK! zT>flB!9&!{Bc|b_SZE$Kgee%>S{&AJ+k=-R_dCIS!+imY@8)v_SeyfU*rVF*`osIF ztFbXkOJM{LlZtO6r`_KG&;BqE9tN0Fm8W`!p{xE3mrVTIdQVKm94f}(DgbM9Y$jC| z95xWPqW4~0v!h)8@WClZ|7zW?%}{;;r;Fj$!yW~;w>@OJu%DY&UmRxKtsGN#N-ljz z7jqAV)14GuVH}OPkYRPiPiS>Y3wIiKtl%Gld#8vD#>cjseLIhh4p6OR@EpEFvAdj4K z9{gC?oIifNS&;4)@;V~zq_<`0bA1!bnc?OybnOpSB*aFp^5~^p+$uKzL5#M#nMJx; zqq8Y(No*Sf!MBSc(aofI4VJILF9`zR6;i69)N9>eGx2h4%vqKT^JKJ#w23tQfXmQ_ zsWGZx-i`YgBM!{VVJQ`I@y<`XGBTo9RD{Vw`g4079i3@k;V>}Dp*+Jeg2Ui?yVu{} z>tEkIuF)5XiHj>R+*dI+0W9^P7Z?maJ{*IsxM=WwoSYaG`YyF>hv2EjW{a`v_!0(R zt`oHbHj?y=jD0U&xKzD%lC?N~}nJKrH7WF3qqBIw0a}6d^bZjr!{JypZ zM9OunJRco$1L5@nLA{b!D5lx2=XA>^#@v2=e?Zz^>hJIg#?Jn3 zKo*FAvK{m%Kp+7#MT=6lf-ByP5-hY>5bswnV4l@?3*<;_gU4^0oCgc0;Bpdi<}$QI zM9S;!<;Yei4_vDDqTVbs!>EtUsU?pKH4ISS5h>39C&}^j+rhihbC>A5_6rx|_ORvs z3a{3npyoT(H|I~?sARVeAUi+cl>^_W@P!l@OJ4qs_aG3vzB`8oM@PXxz+5JfarGK3 zafQzb(uKD^eHzyH{_*=ve zjQy!Aw@FY5QCz9t)lW);Ltc8A`rhV2}ufWP=YyA1uXo zUF|q1PO^Hy@Vt4zNaGtv-ys=_Ss9Mi&H>2m$6TxL-la4+E1C>C!;f=HyyT|zhn0!R zJA~6YQD)@FXzuyAW&8H+Frf^Ln{8Un_zE3`KpEB1I1Yiq;7hw1`(X}cMohUTi7ZwVS$(|l)S3B9!Q}DsK6Lb#v4FXv?t5qVX?G%if zWskO@0#97K9ak*1HsKWxE|zxqKVM z4cndwx9?&S41e9#Orqz4-sapNaJuJkgVk`!Vh@||9-qUJoV6`3?g`|zes^>cs*7I7 zqlz@_Fton*hU?6TWT79(S>E22cg(O%(Jvu6wLagX|s)tO=VH77B1L z&9mD%NAwjz%*&b|taZM9t9)+n;^cHSn5{8eNc-c54=^(FC;TU+H^|cw-ex=Wxtmj} zg!x7YRBc5?&^mC?L`WUNw1PU&{xLA;VVBaQaWt7A0#y@fUp84sqha*-~{A;HG{MzUn+9l7?U&Fm)lZo9s zyUamP-8^-GKmrbvqksF(oqs%%A;*fGH%ByUnMfY%Gn#EleBYX0x>P;7cs3l}Q9JQ9 z+{v&>2$X=w>oxNlaA(P;>gMVIguyGznQgQvl@JpPRTRDT8dR@P*S5sGVVAvo_tNlV z-I;ys&)hM>XsJS!Lp6%2`}7h9JjX5`9twrx>ftC7&~be{T>_0i@s5YW9i4pKAD9N1 z+y#g?FksNbjzo@QDkLx?4_yYq04fh=8hVyFU*2Kar9`vRk&ho;ViHB6a$viTiMT0) zqd7Qu-iqq^>j%}_X#+#IZc@MVN!JzbT*(y?rS#dMPgpvAjdXP?e9P8neF7SH9jMIi z68LlZqDmr;I~a16vZaVtJXdGGe~@XKq+C4gLZ=bTE|M|Qd0a4E%#eN$fdZIXA05d+ zZzt<E3P;r_hSs;}K@dxN2HyQ3{Cs>7HnTpK^JFtd@@TN}{ zeCJgg)zyS~;>$O~32a zjECy0uun0cK{%-VHRH?s@_|S+M|H4(Sduz339YBZtu`%Y^=D2QA)*eS4!xvZ@^3Sb z_N};Ascy?nx%>7LPdVETScvUqSXNZ#y5h~J)~R=RMxQDH0{IW&!Z!_vNNxWeBeaaQ z^sP8DX`gj3LnoNk>$v-CwFz)XAFma1mVRe}9RP|H?m8*Xol<9{Ib!SSA1+h`EG zozTt*v8`P9l|rc6!$$SH_qua7m_Dd!5a>TcuW3@kTf4}gH&d_CCifw=*3VPV?zft= zBF})9NA@6iKua3|pnE}!r>mT`?$-!B=s@!?Y1gG%-E4VCXhm~X(CjK;BU0+ z5BAjUCpi*0Iq4wGZ7eE()E-32GN=;^`erjD#VZ#mb>I)3<_?xesJ$@0DEl1Y?t)K^ zgNr7xioerLr`8^QIm}K+QO!w5;X9>AC=4hIvE3^5NIZ(R5CKxesEkMEMUaOO)Mn+K zpP6dvMxN<(ruI322VX7p4Vzc6{tnZ|tXBhZ$W&N6bh#OUkMQJZY{Ie~}FP1}jc zXY{)MGR*UJPrXvMu#s5e-kq=eFifk;&nR)gc;SKWUW;HwfOk*T!Vz@DTtyYX4~@HI z;zOc6HsYwYFv7FiA#~#F5&tFaUsmC|@@Yv#Pt}JcLR9>g?pn)RUuYkITgYShdiy5| z)dwN-wW+gve}@O3*;Vi`{&VV$d;YW0V+wpT`}x~n(URP6UQxCCcKbo&Zlir_{`P!V zwhYIbr8IBZ@$!`KR+C{*Km|vlI_LsJda6Fer}#EdZBppUZkwI&&Oijfx&Ef+ zm=mG#6K9itYgKF^vV?JTKv;wwE{rMW^v#ktc$5#;Iq{eJ&#-Y-@NNxM_Fpkzv6bS8 zs!+NhS^V_Gn=OeZe_y`a=y5gKneXU-KE9|}X1VWqja%#48ly?NYbLxUt5+Tvikh%v z3z<81#ZD%t`9$4~8xL4M9x(rz#_4id>FLz;^s!r?0qS`@tr7kuE{L(*sQnq&)D19J zsdzaVR6fPtA56alLZLuV+HvV$TV-D8Pe!=!>&=zWvlr`}RJ8 zYkfEC)Dh+r0EDDIShfDK*C4f-Cc|ilp_;~oWZNqyb^XIcu_TR#6Ch$nZBp~4P-Sp5 z_f0#isr;Uym#+Vwo1dr;U6NwDDD?%ZTw;n|ms`P>2TeE;=ff2dt-_%~P~Iw1vb&Zq zIFl_x9dp-&V-LAHy!PnS)CEONZ{lyHJ0ZR(oUp9u_S9Hq=Fpgkp0DKBL&Oqzcb4=X zF2g;=>t*n)_;HY_{>8h`LU(TWXa+niN<*UcXsxToj9zVe!#qj1<11}Q{24lyX5)xW zB8O_}Scv6LkwiWwQdBD2P#6nu5RbCis5f7zl!~fy8dXu``-4I056diUh|GL*KK>b} zqnj_xsfFoxl!UQS2ea-&PWvmpAdL(jf|Q_stN_z2q(?UCC!B)o=H=Ztxg2?A^9i;g zYbL7GUV?NHI7wq~dC9{d?;*=&Zy5EksgsM3_rqr|4V4ynYKn7(qd6_ucdh>=lYeZztCSP?d8h{i~&D+ z>LYJD{YdA0(emsPrcqaR_VK&x2Bmb(F`gPF5P040>NPhLwvFAO*&oYO&l9K=zjgI& zey|VKYdm@f+}ZrasScE=zHX+|UfPrpOuExaXR=dqWVcnStIuHhJwaNt_)IDLins%I zH0(lO&k3+7=^F-r>2f=_b9w2Dq>?$VY}@O*+354NF}Tcdh`ivvM^&Gbi!1s5eKTWY zrKv+K^gBq5179UK|EyCOIn+KibNq)2*d)?cTvRtB_g9PT`f|wFXT!4TevP>AW^O`z z>p*Br-^D_0Ti3Ob8lxl4URCAtC)C6~s54NrvFD5Q544Y^E%5q9&~%jx871kZ(F0_j z*(N_|Cz%MV)Y$FaTfQM;T{`eMuTCoQ~uj+S>K92?lN`wV4AOusgK z-Ac=peGhONi?13CUv+tdYK7_R5yK!cL2%mI&t#{|9iiS)xAmB@?t$j1y}tZCFZgX~ zbdSf&#n&nFg_lh1zx8sHJcowV*}v#^?MpNAkSb1nSe=G~le=V3Kl@{mz&h+->l8co z?kd0mk0rr4lZbR{@kG_#s<=rh6Q>_{JvL|aa`IuRTd6yvCHk<@TK`IW^AkxEU29Ts zqvkQLEuy;6)GY=S_J=bKvOZv=H&c&dsAixmbRFb9)UYeaA$p}TanMW9z+YxMve-)3 z%0!y`Zl~0xB4d0IUT6k#kIXfwP<<$|_BWg{Ok+GtO~+z>SRUB+C7fcMTi{TL%mo#(?$vH>gL?j!kVJYVHp=m0(>Da ziAZN`kAL`5QSns}UGFqWS;=UHcFGbE`Y{`5w1E+ZX{e1wfj zI`x$L!<&8b=e=Y3=zWD^Xl-v1JQ=?se*I=>0^EIc3?cB({gi zyRJ2xb0x|>^oIm)V2tjJiHk~w?eVN{Da^}9T*T8 z%os3y!dUviuALqfXYU&G@ib&O%V*nIb*MZOvGV4=`%-n}PUOL3=o$;Jeeq3TBQk3A zO4Bn0Gc!MRK5H1jgVjUDIq53-Z47^J+$3D!bdWRA-ALcFGyag2H_4Fn{Lzhi7gbsH#_V&2X*8IrnGJ9zL<_|FvLuY}Zs@+9XEhvm`SGXN z2YX`Q5ik?z*)GW-vLis|2^!*&SM86P?r!JYvTXf2(_UvWGr)82Aj4KEj?MyFhvZ*s zAAcoP2g{9e6l>YVu6%UemSyOy;_>m2&#c3YTS51|{RD^gkd7jzM#}3WJo>q_I(&1O z!~mR_(R}%VA&WQPx)1A+S@0w4NprE|owvjEw+6g=)J3l|KIa{;&vuhiEyOerDG1Hu zf|@oarNI23y1~257f?6PJWL1?d^4Wr%ri=Q%R*0+4lL|0bbi@k6;DyqrPGugqf#Nn zGCd5q#dG2=k&1$XPlH6z8c5?+O4wWwoVjyN7v_*|`?%9g7b{k_>I>EL{Mb}qj5W}+ z-pKX6LCxIKK3kV|W5*7%hjt-eL)$ZA7_opfZ5z`PBzeY1T$P*0zxX1nx}6D$VzS=y z5XU>MvOLj@uRn6*n@F`{VkfVfRFH164~FpUE@7NwB1!49K*1rK42r6Zp-l6mBSASF zHw)P3w-$WST1z$M?%>sACRup(8TH*@qH1M+;Ak3uG`?KgD+P#Egx}rdr10jX5G;b0#QjBsUAbL%|`o3E%g3xWQ+|B+R6Gbp@EuzAV3Qb5*Eky2W5SrNfU+Z+P@g zZY9T-sl;DQ;q>NzYTkN%WkY`OsSbtPqpG|6CxQASS0 z`4aRB$GPlxv+^+-;VENVWF{51``apuf?R;T8l)iH6rYxc9wnGLg$2iPYSUlYd?bSK zlO^HssMad?=nn4#0?+hRH?eINGdjX_UivVzgMYOVe<|;N!KqeUP@^N%2@1RQ_}mYBA7$8=X~bd zExB|bRh|aT^=*9}e*HC5t@3N;ApY&YbmG_K=Dh3j!gjJ#?Y>r>{a3%vS^AM@A&oI_ ztuxnu4ZuvnZlxQ7-`Va6>wXvKzL3Ni6>S%4>fm4!rN`&pV6*K~Vzz(}-+p~QL8j1p zhvwblF?P0n6_mI@uqaW&JTaH)tf15>{O7`})0gR-^$ew|O;7&KjZ5X(*duU3i%*Ja zUnry2!{*)D4$HRx{VlAjQG)5&|8qKCSJDjfRk@yJwCYCPTJ>Ny|1?E**4Xy?kE8GO znbY@?1WaEsXh^+q(GOeARr>cg@rBP)$4=;xH{RRQvYmU4eYdUKnEGZq=C9w}9yek8 zChuM!H3~!W>!T863JX!?tEp8q`V{RqR_w4+tkBthQ|&vOC4Yy_yF;)4 z&#UuoNGA&Xs}9rRk2^oM%-?L;`IWyzHGfaMotEhpwH>76L>eK*9^ZnZ*JLI8|GXQ{ zqAb+p|J$=eWWhLbbB)yrnj`Vv`$|8mpO$;EOw;}M0{+imWO*s_UvcrjZ$43P zCjZ7iOY8sjck3!CosY5EDKmat!TROd$Fdpun(Q77;!1s0i;T^u%pg=T9V#|7Z$K!s zgWNR6nR$DZI}gj3@r5|Zjr?C+y+ODfX@i*esb}n}H;>}p zL87}Eu=)(da5biybVL6VIzu_S+)LxapP?_XH6f#4ZA{`v%C&`5^kaDls4oXKAICVH-l&~c5R=Y%K)-^8YIfu5bCLw^}$Z6 z*O9enZ~js9N0`GHi+(dy_T7p7a7+t)w=Ty(5$=b_mB|PynpZ#ZZxi#A_yCw=gt?kW z6ZUf!j3n+}TMesSA1BWsH9AX(VNyDmIWI_Y;GZCdp%QRL>Y{M~oa`6~Q2AT2V+eVl zLk`)`MaD=50A#_6T{D_J7>wzRM?MN|67)^3m|Ku0Y>8!gcqV*x(un_hLf=R`Qa;aj zBoQ+OXV_^*tNJsN4$>cgOblb<-CVO%FGzy#W>2{47eTx_O7Sqh0)xkPh)>U;RYSfy zF^o|&x>>j=9^*~W5~+f0QS>oV>9ZJ(l;l!hG8(RRpw#K)dGsmOx~SRp0lsA_l*2Ih z-+(1NWxQZmCA=|%+@$-DdnaXkr(nNonip@|iw32ZZ8hHNUM}Yr)!MU^xEJ)rDZk=U za(&QkkGv1Sd9p9Ut=u+VP@ddeDi-U)Lt2ta>dy^aNdeJPse`|sR1FM!)?fv5tAEgbr)TWk7t$lJa^EDHxCXjIJ{8zn@Zi8ZB?M29p-4gujDD=b*6RyC=JJb6JOqsgvRf{MG5a z1XV_=^jbFL{PD1Qr?62)5t!9ZvgmZM><`N*m!-gpaM>p%1H*c1rr>N;cL-uySpMKZ zWh~Ye4bYEn4qjQ4tKKbDeNonMe0pq6T)Ik~ELjkStESJQ#xy5dg6|7vV`#v>e$9Z) z(N4-HaV-CN>e&v)45q#hQkTj;1MDpngOp$%8rTZC@16^E2*9|Rjwhj2Il=H#K|tBA z@+Y(8CzlEzvd)qYJD`MwL-aTUvg@vhi;#hAkZc-1_+XJyZK5z8+%lu8_$^IH>DsOH8v>j z6{Q+HB@C$>>l~qN_xK(F^i5Oy}$IKX=jg*ri~CPjA6KI=a2-rynGpe8y2~s*}rZ*pPp5 z-kI^NX*7XJFlDEjvS?Ta43a^lsD!x;0orH{{a96|C_WSuON&w*5dxZ%?y$NW<`yug z=CL;CXPSa7Kcs(em)cLL@Ag~>gZUfd_jUD@@$^N~1#G0E z1)xqLh42u(1ebo^M~J}8UOOEZ608e=tGaUDJ4hc7Hb_oq-t*MlHHCy$0D%96HlUG0 z{j16cFLvojK~NW+6BT5qI8W4IIsoOaa}r(vU=q(itMr^6#Q&i3!7?(vy8e-$+S4o7 zLDIo5q<}&R^Aq-^jpfu01f{4!Bq^>AUpNb0c?}Pt;Q4i+^^V%G)12PS7-7^JWi>)H ztJR@kVqAk^0BDAsB5j8VMM7FUgiBpIS#^Z;Q5T8*2O@>>W z&+j-Amo`y_dvR&O|37}j8CNy6gmh}q+(J*{*{)L0&AEv1;%Z{`g2L%oRl*w+>e+4M zQt$Mn8rxNK_EMjYe`C-{@_)&6NGpi1OPHRWBb*o(a!7g9@Qp%(-*1l4Ux$LOqJ3TP zci9^de~=v2j6KI6R@eO+Ka!;LyX`UeG|a^j1Gl`Hx{REnVwCS;*)TAM3~jVOY*evX`vYZcg!yqlb&ZP)fG@i9*qQ` zLNXDPf1})Ps0zrDk1=>xBN!>|Jumg4SihN`2{j+W!7v5hm=oV{gR3?KUyRin_l-3> z4a;KKXa7r7ng_rx)Mp|5v|kjr*uMK<^;uC?XjhlSia8u5*y(Q8V>1V~g?%aZ$m*Fe zQGxTN#Ivc%1D^!}=5*p4M`?Ix;FP)B6r(MqFPYal36+>#5>|UyKJ&E9-D#=xjGH@8 zF0#s@aUz#jPBOR-F7C`Ua5deQ)A6|bfq(%YlR)U+AjVK%71`?Veu5-{BqnM;Cccmi zRYDZwam@#YdoTA`^Bxlj&8Ai9$fbtOC5kaxE6XlPY~Maa;&4PjP}SZ4{O}7Jc5|jX z$Bg}U1tV?=iBmc{K!lr>J|4Sc?$GCpY5y#an|6Ps5+k|F!QmQ$k1Tv*=wd0F~C ze^iJ?fn|h?8)uUQebO%__c!C<8nIFbA<$-eQKj*wONk*h`=K_V2;g4DDdWb&2weqg z2HqERgSu&Brxj9<)s$%nSU>9pR$;|*W5E*AXzDWJ_Seb9Nnc->lD3`6B=9mG2SpL_ zDafMf09Fbz<<*^3$gBidr2Ego`|n_TkJUCfk0d{ckkR5;yrK>Bp!>%9X=|*d^;fyb;whR_8z_r12{fkgomC6Au zd)**=fz!Hme;Kd>5UUjX)Qn_?@==q${ym%iRdsb9n_q|>H?j}NGIWqK4Giu)K!1{j zN?#yDwIfz51C%@7ui|Us=zQ8)R6j-Lo4fiGyR8Fdv zOS%GuLk!Bz%c}zBzr^(Caq%j5AfCHJhU|?UI-hn&zB|vv2#Iy%4D8nAFaTiXlaYR4 zvEM8~zv^W+dFh93oNms(uosXi(ef%HqY6)jgToYJm^%PjXNXYw5Ca0y2{!4 zA16?3gOUdB2e>B|hy46BHEGrKLE|Q8#(-P~gGGe;h-s*UC@Vmu&?A9=3}Uoh_Ra`( zTk1(kVpK`M?x47LF(52JKZ&du*WW7NytzH{9^E^mlTt+&DIdLifQbaJD7W`$l;YoK ziZJu}$R?{FtgtR3EH>GHuK4-<^OaxyyBKbf(Yeq{X+;Yh4y)m7|G4$_Hi2gl&|fMW zK+Fo9`2lrlx;ZL3s-O@+7z0d)wFG;1P7a_P3)6lZf92bTKx>E9D0TgJ4ouGNJhE|G zFy$^I`4CL6Q)+6BWNzm%Zf_feVvsY>K(VX&oh5FP_YwMWu5#`F3UE(4=PeY$3C=oR zyFVV&P;#h0^oY^9fvqAKdvBH3a!X9A-o*89B!Lp15UI=$_P>R7`Dd)tjRlx>I)ycz zzH1NG`w41|dWU7$?NsTMNK1b{q+hb1YGak zlkSjcz<6gGu{1EjaTdkT%29Ggl{*}zb_jYq3U%9~&Y0W<9@)G@-&oZ;Y$PG@kWGG1 zPIZ7_9^fE0s$rz0LP!VXf~yQCAjWZ8y+8ltF6G)%>^f6P;Du?}Zzac%jH-fP5vrA+ zgH@kLW=H3j@o-HntaQK1?T$TwOvms>vKABnICPt;d{7dmSDcw$=xN`s?H^zn<|yqT z#eupeS_hvRfd9bi0FCF7kk?$xURZ>%PW&zpI%oeu!f91qS$`!MM1C51Z`jfrdvJX@uv5PyhYwk>!NRMIE=ulGC55%$l4I7NtBHQyo>R6D4RKi%X? z85Lx$j2uiW+H}FFkbpAaJwZql7DVCHMMczj$O)L=T$NWx49WgbdAjLQ%NW$)-nPZNkUb`G*i z_@$6G2jEl$_Y=-0E=Awf#0x19*!7mXo>Nf?gu51GI~dELBXR;e0PGIjNr82GmX>}% zN|BAsx!u{wZYn%mUnthFar=^?k8hnzd_u_YH|o614o7G-@naNiMdnFLH8ly5yoD$Qt+Be4ENu{1KfM2^P>z~4bC z2}hdaP&L;wWlraEyUKQany3Qnpk8|kPyuYcP~tV-(97v0C(ZTs_2KUzS`O=OC{y$P zqeFvn1kb*Yk9h%^I5Ko~D(_#7MUJS4n2JTMV!(;04-?}=M<$NQa0pY!B>J>kva60N z#fc_8YGA(|uOGyCXT&&OZNzmsnr1rMR;lahocvu%uXYJyDhls7tur4fwR}e+p1(Sm zamZ8_*0uiYivwgPEP>aK(N;1M@^P}J5O4jd*CazVErRs6!~pAi5*ld_q$$;2rT@L< zw*>bMjhD!upPxMe`G-sfA0AV4PC*vsFMYwHoCGSQqd@Wsu$ce&J zU+RMgHg6jp?b$&Z-4$j`bD)&s9Fxo5Z}Z;$H4~?9`RoeLt!g+nI zvdb>fQCdWcxj{lKH$3B>mt?lV<9&RZK|-SuO}ll_sHZL-gRs@W ze*wf4-V_)U@RnD;c!4pSSi=0W5BWhxU>ZjR9GkEX;X563TN~c9Zsp;zfM-(zo^KfF?Mh9+P>iwK~EABqe?fJz1**5yBCHGoRACwsWK=&>~7tF>MKMRvv? zfdwB)f{!5;1p((-uMessJloU0iF$P1LMwu6sBF|(Ky45w z=hons133%2aIZ0(8SuMcZU-$bIeZ(}8!iOA8vw3@y^1Uka5x=ktZz7VVfv?=P#m@-U1(YS!|%L_bZXoEci;YDJVF)ysTAP-2D=4m z=Jlha0x$SfuB$C?65a>F=SM2t6!5ql!{go4EV2owG?WM)Ur=Ked~;{}`{p`@=FJ#IhC@vukKnF%J{U$ciaCgmQS>|#*f7*b&)4@Oko+S^i)CuEDTqV{yHT* z;_`_v%2Yc2O_@RMpqcit%r8HEZ=bUu8=(&VWrRAv8dI|Fea#E$5&|RpZZ!yL zQu5NPF@-S(pYKRM9c^fhdfY8ZAaBXKFOia@%{5Gb*)oztrG%XoYUlf za;~U}`x@#ZxbtCNDDvA_FYsN+r3oA+XAYo>#a)c-I7`c+b9axz-du3n$Vi1+)@Mng zSp_Dx^Uu6&V3WTyQad#WTLsQvg_Vg+a<&3MM#%j0^G3EDyoxBxElf>UfEt$rC<_l% z0R+fUK(o-TA$*|`(T1qY1Tw6e23v% zKsj*DZ`?dz?a-57;4>yNwEFEZXrzk^1%B7@N}*~^Z3B_SZ}PY$2PY>=7{go-G~V|P z;by)H%qs-;kiBBq)iR1(>${7L!p3r&;{4l#Frust46U6(Yd1J(p|9@>=URc^+7w_f z1sf{`m6erbOQ3?nop`kguIrn{U8zMjUBO6Fulf!{17}m6mH!S5l1bXdPlx#ER0YDU zdI)s9pHt`z?i7t*rHL&g(*m z44)6G=Xa*6J5bFgO`QJ}mrBiWy8vSZe3M%|4=}Kd8ruD^si5SG(tsfbl?`I;kjsN( z33LTeqCf*W#7ID*4C?9=*T0_>ikWP+T$kh>b;iFBWTE9+w`GSEh6BG|Oy%RxlS5eX z0jh*)hJ0r2u{p$j7a|#mK_b-2*~9X4&HUt6XS07TdRjnl=3ebM0pDNqU-F$?hR!+$ zVab(4YfeBzWEo6^q8|pl8zKfO%Cpq+ZO)$x!SeT;G8-~AH-Cv@3<0*LdFxrfoUq-I zGkkufNin@2AHY)62qu~@kIIvWdz7Z#6Q$2ZP_{N+QA*c;6%=u9n<|qYV6}#X)+A!s zqY3@*o`bIczqOKcHW#0o0ExI$<$y2=`-xB%9fBG$NrSRM&y$LDTJwao`HFVN`5(y1vp^q4?bDR%$B=O36gM+=bbKq4jCg&A~6sdTca zbp-L{QoSW~;vhxC3{RoCSVFI3KG=>(Xg4(_iFAQw18fyK9l1EIckkarzN{GygE{7{ z$O}X>fzXzXiM#8BwOmowygWPwYi8_!OM3q`ubX1hETHsIDoh?K(*ww2mK$Rg< zzNTga#Uzx{7#Z0}lJkGPygu1Tk}FPf$BuC?strULUQn3dRbm&c)Ku(9&XIlZRE7q> za)3L$5!f!E%5cm)KAF>Hzwq_zS2+666XDTm8qt4z3Xdy{ldR$3>`l4L7XJ28aF*i0 zcc8fN_yp`MS@?bQlR1c;oK?-l%g2mm5rrklGjIUiYB(S(`-E(z#c+Xvijuxz!u>^P zXef>!IQFcB_sPzt$sJB|!#4oe0rc4OknGEO>SlJV{&C)rZgQRKDcC?P9S|Rwx1?u4 zM+${9+De97&NH_8U$$W#^x)XYWNboWQ> zHyMVp@j`6^`I~|BnV2ZcJ8L)Bn;>A$L zfCEHYxcHJ27h8i`e5Yt8tY-eTp&k+xPEbNm%|;OA6Ig3&M&8ra71+F(Ab2 z1T4K_*bbnPr%y3GhW*OMCWw(Q>?^pnWGb3ulm@m)D8XTApY;+u^Fm5OLaFmNE>f^7 zARTw1>oQxkQw zoW=VMZi>_105P$KkKu8@pP1;4yhgOF2x)nDzA{)rl#XRpSV>5i)r+?U-$8D-7D0KA zCHZHwq?!5}(~InLbeoGknkh5S3BJ|iY_js%Y@+K1wX3{0@FvUw#%~G_7P`GW*F^en zvO6Qa=>%6;MyR%?plOD{PL+rVdJtjY7%8IP7I*-SnaWoAR9zvgbHwgv5rtDUFLUM` zp2&#e(GjqS{ThmxNzqo#m$eeNiOiuH1f7o9ux$2Vi40=&Y4djMS#h8P`X;3Vd>Fsy zXY_&}K7iZ88mjuzq5yL2t5q1c;?#}PN_=-7Z|36P@W!twJdj6yBD-^Pr0MQC-4j^h z!lw;_AQ{JW^5i_i24|665c#~li|+0TZ4oB5j_JiMfy!7gb=ZlrZk44*>jZlA=hLXf z|E{&0fhI2$Q)kY~sclT0wU)mdb?S8rNbg?qzC+jXNiUnmzlJ9nvjcW5)c61w4^1Cy zzSE>wUHw!qU5KtpjMViZ40aq%?SDE#ORw| z(kx8Z_tIZcrMBtxwmp)shoi?#E6dVrcb9GIGRo{ARPyunU@g}?WVROj zt&jU5c}4%NxhU&c_OChp0FK*gO59T(yZ$!5gEd@F`t}R!Ra#2Pki!aD85#AC(x4n8 zpLIzUWqqEZ1Cga(GT=T3jV|YDjp6_vo;1sgZ||sQ%D3&N54MrS07L{%Qcy2fmu7KK zN2t$_pquG9w&&;Mq&KRds25jJj-C+Mgtk$i!(KI(TsNj%#qqnU|66 z^mq)BqiA=}=**e5ch0^$JWC`8wd+39-g^?6T$dCm=5&wqd2y`K`^xlEXl+dP%U6ub zTA0_0RPA?Dq57>FsaecJ0H$8<2J5CbjT?7VW<#+z|FWWT_2g|~eZrl6`q5OO(RN5c z0&O6rs>WmE+T!)OlYU)&&wqW*y1d(|`f={Hqv9-E8y#C;e7i60ZgPqBP*Vx8rZ0zyZL+*^So0(llVoh1{I#UdP+L40Ff1Wz(z9ty4_hjXc(jU2OG z^xC=zwb(O2eUi_kiCnn4HZeg|)5lGP&mVM3o`c?de~ZMlsOrZe8u2kg7Mq>Q_;)?+ zu)}O<_0=|-K)bUj)$v!+%Hpm>b-I@Tz~3VJd&H)V_5vOYP$1xyNSd69I>zmvS*b_# zL7j$q;Ytp!Q`9gh_j-Dcb-KgrHQ;oC{XA%Kc2am`aRH*;zw}u;LLHT_+f-f|5UyWa z-!Q!OlDDw1NNF2K(|i6A#*DBQUPrO<0zGuU)8PQxung9J2_~Ej$HWr;BJynk2_2|6 zh%d;VJq~6%+*7c=;VDJqhAtR$ueam#kNnYQZ@<;Ra0|b!lGFJURVsOdfN`*-y!?ZA z=P}({M;*F0Ww~(`h|3D|3}Vu|^S`@5T|4}}*l;HNi;Qk=_nUNHD%4S%AMf$r6%=>R zAe^?WYmV55IdBQXdCIz7&`}L@s~XSQ$wLG!%6N4 z+s3brMjb;Re*)BQcQK{AMZ2$a?<5-2_B-*U&ea1A9@TBjPIGCiaeU(dBArKlIqfbh z#ox3RwIz1f?M~+&cRNxN6?0MgI|H_NhRhFV22(t=>$=nblRXSa`ZDlovb^4*&$7_2 zQd8y7^es#2QJ0b1#^7It<;RNEe$&^I%s3QR<+krgUWsa3i_RZ420)VGkzfJnFTpx%B-t3|I!h z`a}mq&JQEk^{M|H)E2(WV+oeNn6LW$LZlQ@Q}>2tG>t&+fSSXpEERhya>gWiUV<&A zqCe(F6}k^(X7R}QqO<@y?p7-fo$okqVSt}d*?trRT5NwrSrMASLdQFC%)?SB=7{Gn zbHI2~u~Y^+2iqN~6x`OyNlCIUUuypYT1qo^k(*Q;BsraryT7aQ`DgQkhJ&g#zw%eT z04NX^1-FLiPbOjfMP8n)Ap^?~QUI}p-R$f)#Me}i@(0+D36TXZN;2;gFcko~f+XRI z+b8aG4LI%t24+qmC4g>%dA-ZtJ0tB4oW)N>mq}rxG7Qgb>UtfecXL?!ue`~s|0JYf zYn%LYTL2G%xYC%@db;u^iDK?)f9cl0e?m|A1dNo!O_m)31|}gP8Dw4QC0rBUW_JX$s{Z;f3DWqyx3^HCVQwDgL;3lj;j6J7)r`j3DxtA2p%udo#BXu;U8zjA zHL0kqes@0e;tFC)`ipH_QG_QV<+IjN8kKa-kn^+N^XJc}d0?GuUhZNAtfzSO(pNB% z+yao@;U&Oa_m*s^CUSd#M4-i!+yk$HN?CNcI+{x~ROJQr9Cp4^@23TlnJ!1S~xkc|VVl5jK&;1O}DytiD-&P(xwQy;P z&$+>(>S$tL>908Vn-<4ws5(1O5*wDhY2%Bj&KNZ}oy-VtzqP(t*vbi_U+*DnxPuk5e!9N_gMN3jL*-?W5CA}p>Aeoc3okpwzhU=#sz#* z@MB?-mzIzy#K;l9V4E5maxOB){t$C^oYk=3K7DFq0&x(~EGhEd205LF4j*3p{ab?m z^7pRCgM)*Zoy@%LvADLMli^y`AXbt#lHR{3^q0T7R}O$ep~SYWSrV5I`1D9>-L9|% zZ43QP5=uZUG71}p0V+Yy36K3(87FjoAon4=0!c5=p99OjjI?#U8E6Z)Z082G9I|>zoi zG&%8{!xTfW@P_sIejY~W*?3jH*<}PXI#~YYXpnGY*=Z#KaqqElx)A!DDUh##0z#8xRQi`pU%RV*3z z%-IAsx@@xUXb*-#NHh7D9)fhAR%~Z3CLuEJF9vAfe*7#OQczU9JMgL0A)#jqbbc)0 z<*)uGN}A76oJ#xh(;q=e`qXz%JscOCBJ95(BdFO2?Sf%07mU@gRy*bD5fP;EtXEzU zo0lmJJ_x)R3*yZ!DJelZ8}PkXuCRI^t%xSvMe7Ce6_%F$JBE8=CXsKtd^Ju>a8boO zb4C3>QFk>IC^ODfgEIS=)ppEXrhM9c{}RLAs7E%!O%kFFPXslsiP0fq1D6-MWRn?m zv@kOM4YKqMxw)ube&>wq3RR?D^uxNkx;<+X$H>k3N`&+3F#+baO3V+H>?To}tt^L+ zN4JzDb?%&dnbiG+9lE_F=8NhYdox>9V>77E$IVwJ&ABAX@SiIUj+m2)IqZDQ$ww#N zgu*7P+v09|fLk7a$}5SJ6mC`@-ux`^sWR^gTG}lhDDIGVs3`aPP~3t(=z@_)wwKCx zpRX9bZ>sZDWiVOPZ1ZTUkr|cVfu(QLBA-th`4UamR)x!@Ybgj~VWB)hjDdBV?u)2l zEQm)QU{!b70VG@W^@UaI;2vkVMGh@mH;ZYJl9!jqKDpEsKy}a~u>yj~VypN|WMJUO z>{Pw{4I@5$bns7ri`*e1bSdCoBcg9)R;3xwvb?y}Fbv9x&)?5Om`6444?S+g5ap`$ zx~U0c%mC6RM+y;I;Y8&>#ITh>#ic;90IaSpgII65M$VqZq@KOWbz<{j1%-9;G*{!T zRgmO!9zRY>casD0gH**UYn6T1{r9~}80ZnnnlAJ0&tJOcekdkEM)bA}0a{G*jNawC zwK)bJwIl4Tw7K13LgT;#zz(c(n>-V#tn4_}Ftq^91*YTRzF-vDhTRg*t5?kps8No9 z{fzeh$`x)I7a;k#t9Fk)Z?oz3jIeMgzCUI?#ihVE&G1zHM%?fFWSuyhDv6M;8rmKd z@^$x4Ru1s5cT@R*?aKN!ZM* zjJOGOEEkhNB^^0;aN|$u#!&T^KkJ`s*5=>#uaZlsjo*pm>~Udw&V|HKMm~K$US>gq zAdRlL%bd9pEfncj4;mgnn8zB@dYQ?FlKv^{y*I0d+*blz_W18JsoUQ&XYbqi)AEm& z{Ee~oqt0Bp*DZ}34YMN+B?k{rkBc8ok&KEgyVBUxDdN(*DCj)m^~rPpp!pLzrp@DQ z-tj)I5a(l7T~S-r5+)kG+F-xfVSi0qKD zlgclV_ob)ZS87^?E(|xCzduD_9ac=hnqyyzTM-*f2zYRFl65*Dp8zcVq_lMBv+Bc+ zpY-5$Gdd155Kc|p4d2GcX?Y(tBseV1R%i{5_fY*Oh1#}-gQUT{O&#(JleoS~_g}r2 zKi8~w8f{<+ipcWZjISG*M^GuVb8!tIYyrn0;tAl4+~d16jLI8N3}Sgy<^Pfo6SJY^ zg8PU6tol_i-Nd8v(r4y0v|=nFPd)scCZ@)CPOpz^4gU@+sNu^szZ58P#?0o3W0n!U zSEShwy`C=TbEVVQ)cAgXt6BdrVK}&MtG)ESY5CpI;yZCYyP1d^qV#W$S-j8Vap{_L zw+j=}WNw?sJoJS8tSXVEuhO%i(b^k<>)>vh#Dn>Smxra&ISF=o5Wz)RE1|8bvY5u6 zM-h1)o*o_`>$(E(kKt~VhU)v2r>o{AHrKZ7^sU&$T`7f!v=qHOS%8HWfG7B*NEmGa zn^@(Op_eaTswsHKRR)@JM`^`-*B=siZ}>T)JJ$XtjfmI%q7R{)#KHu)v^!dCz)YH* z8E&vdEE=>kib&pmIa9xty#@edoIgc4XU^-8^<#7}gBT#vJR=?jCdNkUDzg z$m5q00IsVb@af|cCcMU1Sp)>1=bJTskx?7*cN*io!oYLd- z-H3-dbO>1h+A&B^go1&d9(j6@a**LuNW>{{c69s!WC#HEkdit(18It-GJZMhmcM*P zg+;Yh^bXUH7-i$zS|9OSZSrfEiikQN#8~k}FFwT2qq!kfEVJ6}!S!B0qsqI6a!$^= z8c}17qc46aYVpQa8q~>!$1PXJQ5mBedZLkMc;T4|ma@1uKxc1n*CVpv3D%qaFD42) z+Saj^OvM%c*!`knVov?#v*<)mr#Jiexat!~IEwnlQ zEM>4JLcwt?L&~@I*RrqT@ALc8PNv4jUd!F*ASAWV%lETe>TWoOW#qTj@DA0v_NYt@ z%rQ$Arn9!S9YcdRn?7`1qtRe%`1*f}IgB}~%b%~A>@PI?*;4Ycr{>5NRmvsdpyhY< zA)=H8{jugFp1o5P-fzFyy3Q;VD-|phP9{^#-?jE0M>?Ych z<@Rbaf71n58>Lq7-fEB1d37b$EDXD_-!Q^H(%J9t=TBB|mjPRm(VCcd=l?VOPSt2d z%~Hzb@6}R{d^U=BPv@~+L6N>^o);+9CAlQ-KAzhR_P$gxgmid8smpIKXdOR(xdQp# zcLD6VTE(IURRl&pJ@Ol?^I(lbcTi$1ih&alX?Wstbdyojx-{`@hs~nbQGMT*<;J}U z)`nM`{I3-cS2{kZbOWdFDItj{JbP5IW| zFGPLUvW9=`%+h7NeK@AUp%C(dmBTx{j^y|@F6LkH8C?C_`Y^BCV&nMXe7&LF{;dWF zKZJd|VCQ;!DD4ZFg@3TcZD9Y7T^KZB{Sf~3m4@5)j;HzoZ}1-{w4=DihB@0>p9K!` z)?)DGV4tYyRiD+upRCmiMPlQNT^vIBg;E#V+XwC#VjM-+`h{)f9d{pC(dRr zOx$b!eZlj!xa054`uptvE}ws@J=)R}4VxE>SS0~NKzdR6HVh}+!B~Pq1AKS%*bh=t zfJX0!TnLT?s@XunPrTP35y%NTN6Et@zday2>bhj2tRL`t%+^1Ju zQX}-AT6&Oy5THcZEF?;{h`7Gs%v7m@Ca!qEX>ZWkpzS)H@PJG&o--6^kO0_GA6R-; zI&0w9!ZJm2$&qot%17?BJWe#SJgR-N=bgP*<4{32<^I4GHSyo4Ux=W*Ty1R?4NoxH z17A$*#INq1>D?}IpVo>w|Lkn&wS1A9aP+U=MPgy!6(wo0&v%$DEIpsfx6TPhC|8SI zV}T<|Ljc_;WdEp|5N?4s4DyRop#L?a5gq_B%%QI3zvP@>BLf3$^}d3Nq`Q|FNuB^UiY0*c2A2`JN}rrx2Kb*psu{YU1_?BAvDX7f*$N^( z^(bB+tHGU(8IeqOlI=5-C9jJ~uO)AW!5XF~;d4e|alfpd@8qTRpZL*>(eX#PzcOSF98m7W zLDx;DIez~97h?o>2sHzEaMeJ!Wxx`rn?tP}(rA5eA>zTneMO@>xvi$Aa?GJiN$Ux^ zf;}sW-F-zLoyGFGdR(6751$+iuCfj(&)z7aH<{X)C{?LaH*a98VJeFZD5JdU&0~?S zhe>)t53Ji<@?JCRfA=iaYz(3G-dOcLb6thV8M-%mSVJoAy(qOxqN5mRs8*1cz{y_o z6t-8!q6eg;MrXY+gvjWa05o<3LnNLmEq#_Q_S^mN>3w&gwBzk_EfPK6DHSB@-A|y5jH-aCJa9pczVHp=1t#}*Ps zLPJ=5q&O&XevT@;M9yAAMuAq=sK<@*Wf<^OAVg`KpC||)5#8<7@k{`G8G69eT$6yk z65Fgj1_Pap4*S|(vU&3LnE!t0J@i>XwHAuWAlgeMA$rOQlrf!7FMc(ByCll=O-GX8 zBPUA&l1=lV6wa;eT(T28yj{Jy$|S#wu=`=(SYG!WD4zorMFZiQ+O_s-YG@bUM_7)Y#qYEpQP zY7`@Nj813d#kV`Y+IGKfd|1MKYQ11*w1CxbsrPKGJC=)iTQ}DtmcgV>_z+o2nGi2` zE^~g{YoSaH_HcS3j~%2!gIRg;0(us;;q^w>*9JFA35PR@VRpoud@8uKb~EPOv&H;4 zyfRqSNOWZJL$QasLf}2tJ8GM^?7E!dddOO>-WFlTbT=t2=qW4zvu z<0V-hLcq)CGxE+7>@Me+NgpPq)?T}B(yZ=5+@HL{(bTqcf|$&G4P$jEzun;>8qx{j=yS2NbhpC8%p3k z353%N?p~kquaRFxzZllP?r^0u;#d#$pcS(wg}l_ZmE5(ue(ef{grMQtPu6 z%}eQ=YpG|eivkvPmArJoPwq13_`+2kp_Awfpceb-R)IVtg@2JH>tD97r{(4z&+L$g zTnj#i7hbbiYp+h#tUF|OEPXgGjw~#o_1xDRDC){;vjSqW1nh@giFE%tod#Vbm`U+_ zNSX?o9itG@{kXnZH4Y8@^ex5JVKmQV{wC&ZEOhD57y{13+hU=K?CeSUqf?dWPS1Lp zjI*5&Ru8@;{kgXG#?bWP`#%z{f9;;_NZ^V&+c8WMlk#yYO_D0q+X{h$n*lH{G!{k>5IYq2iyp3-kA6U3edw zt$FsRS%AM0B>Yd0rF!u3Dfj^Kr05lB3vGVGa<{45{*bCP{CPFFW5~)9TXfcNBoheeMGGYBHo0>8qzlL4 zEAjh+UJ4a(-Pv~gQkp>JJ0rK%fft230Yg=pmuYnJZK$2&ZJ8EflnU7}%`?pGIO~T$ z0}{&dZOS|OAU3)vnV2Rk6r*|S90z?cS!ieD0;(rFrDx;`&1kxtB)ELMP|29@@KQ1z_W zD+OkbVX|t8za`+_b`7-t?i^exc%s(H5FeATB0OSLaio4ta`}QgjgX1xi2M`qE|gGy zLNffHt5wZ9Uk=N+oqHvy>napeVR6!a>rF~ZI}@bq=3x{E6)=7*8@Il`ej&yC8)ofje3705Gwj7nm#$;?$&=!P&H5A+325u@V}-R?HO*TSII_Jj zaOv-*5U!}y`U@=-i>F1`X1#pu?X}Lge%YK>z@mn%Ie~|G_8mjvgSRy?uZ6;3pG4x@ z8{7HS*^E9Nn!WbJ7&pynI=Up?9MFu3VdWyTZBXl7v7X5dJk}wV+&Wgf|K}B?O9_yR zwWqry3lXcLre7{-`weqLyClR~qxql-1Te5!e#h|$9)eTZecN8d3H!{F(lHCUoH&Ax-g@v}AMc161QfkJ?3EE-(O;2`Ok^$%T!s%q6Jr!zhJ8F@hb z4V>V+O(?kR(sgstd-yAD(g`K-!kIdyEtatPZlg$)bUg!qPUyn6aQT$28h&4_{LkGq zW1l)`=mCeeNRxdj-(;{_!}({foLeq2I&ks6IxB&5PQv~H7a%I98FF1=9c1EZ-FApd z8T1=;UeOP=g%FumYP!E%s+l(wLmHgTW%LZ9 zDavV4X;X7Y>U%768%WZO!=_kz!_F@k=t$XG4D|q(oCx_~t6i+wSVO)m24Gl}T*uwC z1yX)Q17S@i2}PHF7ug_&oz^onr4R@K4sI^M3{CwSlt@eD&6c9Cd_rrBXYOkHoWWzp zFP@+vlF=Za>Ew-2-^+{9HP)ZIdwqJer4w6~p{i?(@6DXvjJ4F0aOEifq-ZVv{1Z7O zb~YFNU#_n-l69JUPjIz;yNqPWg_s;TwTWc!zxW@6YC7y@9tNTqM^avRBQt>tt%4HQ zzA*H%HWhYTw$C9vCMg@V+&$rqpa{0XpNCc`G#0d(8MIE{m>gwg7NFAcSh05c*l(2hWzjQghk&M--M|9<3M zLFxY`AI_a&m!*i?Z`}@$oDxQuA>$_Ox~VR;AHXNmMsi7(MNQc!Fby6srqYp>j;RIw z^Bt!p*dLOuy8LfYVyb5zh|;*RliyS@D2?%kZLgO+!$2@&eX%H2J}S=3TAl7>O=f;+ zY4^zN16hwZ@VzGfKV7|fJeBR*KHi{0hLt2qLMnuikRe%SAtaeY$UJ3?C^N}elp#YQ znUyiKq7o_!nG!;#WS00ItG(aP`~H6GkG-F#M{6zjeP7pgp2v9%3LLwdx3(WIpTdfu0i@MBsX;kdUkCOQLK zG}B#JH&41$0uw^4Ecy?O2>?)G9>#^eAw7Mamr!3zZN$Rto8;2N?Y!8qg4X`;=#`D5 zG^c$+i_-DsQ`)5R5%e|a+=`|NkWpv=qZLUs`B!X8cQ7w7*K(+``LQYrl30L z{5E%HnmxAjkWPME!oGH^8b-q#e`LB!4ePIcCH~ zOxg=HL3hv24Mk#{^GzolCxkET6o{2^r z@pnsBIS62Vmk+FUYJiU@O8moiCSw4vv*TR89ZwaI?ZV>dI_ly+KvR7-L z3YlUdl5ML#bb(;DPr4H+5~9qHl9D8R)>hcX!LjDZk_GBA=fUh!t^r&St%DO&{wafMW13w%8|H8&a@0ABbesPAy#HAQO znfU(UDXhD8iFp;=5Fj1ESP?Mayhlw{78xahC?7~8b$Uueu|eOpkx)za+>Yyd)ib#9 z$Bm>$o$o*G5n1`Euky@7@Bnf#5tQ299m4-2Jw3gsXb#F&awYSUtv8b4k9+>7t?=&0 zhS(`M=vdPOqI7uVc@rPPKj5tydrQq}4f>B93~8aPmgL9EEO|qVKo(L)@I_d52!qbw zzP_ZcNyONJmN(?cy2Ve3TK{x|c@^W(k z$=i|{?Xm+8TJe&xIEbhP3J-LQj3QPT1<#7HG;WFP+|n?EvV;(qIbkUjHWET=R_~@V ze>(*qnIih}t>q#kT<`$_oZs7f$Ba4xMlOLRTW28=2%u$7+7&ItL)$f46IZ~{6BnA) zB8ALpe_PggXlv0lbI@J+^R=r^rcer0UqDvhJy|Hh2;b?C88l(BQ8D4$H(2lB?m6(@ z92P&$_9pHm)vKP%q1qOr~rPno_{z-%cyx2%Z9g=riW-(`+j&1>MW|fjco< z4PFpZ34i@PhNp{7F44pfeSCcbxfK;~WtU|akdO%f{TkN!1ziVef{#R#%bpKzMB*R> z@38YM8b>RooI$ly2D%%7Y?!=5?9n_78ChaV$^{O(^15{&DNzY~Nzb^6g#{NYD=xYN znA!ms-A$j5Vc9KLx=U1`5~^eZ73#hTd4+X}9>N(=UOI&~6vecUIbFjR0-KJ~LWHyR zx8rbSj=&?Yx|I9fG$%W|r`Y^FwvRw!s(l9#O?2y!#AO^MNH- zD9PMjLRC);nKHsu#mO_AhPkOe(muy}qZ zrTsAS9V;A&)mX)BRqjM`0Bx&RV6Uwl7CGJBK zfWM20r{^PF-#4vCxMBA4h5@;sFpq&R2*c0iKL>)cpFKlFz&RIE-WVqActKdH4(}wO z6Bvg=?riAZ53orMJ{Ij`dj?s9qBycEDh{w&UAb~aI8lxxUga1J_FLY)gSrS|m8i7Y zqoI%hl+Hi~--zAhH!*(zs;Zag_z0oBn8#duj%=2P&~m^5QaJHI5S&i1%d_(SM`4Qk zF+ab}QV5h}^c+M*Oia?$3$eLAE-EX#Ob9@<7Ziqg1H5o{^E2XF{A0|371f>LA~x+P z3LzJC1HQgeOi{AzdmhB%%VFSxWPqzh52ie2avjQgO^OYXmin)ON3@8xc6t>(szDzu^6?XS!y{+>S;jb_tFD^y)>-Mx;CJ)ZBvR*a^n1F|!oCsMl zD>1RcT-Ya6S64sun^{PmIdj zV?(i~^Zt{%OI_B%$!DI0j6UxCS`-ifg9B;Fv2axu<{)ULxG-)^gO zE#}Jq<)N4?FGSlojcINTE z+QHdib?{Z~?4~iuTwkx^P(r_n9tF}}1fQTvW7Kw^`wovGP;gO2gM8FHj5zJ-$w{E$ zPzFH*!+%7b{V;v$sN{<7bmM-(AD2=GIAa=(3$2{TP_zy0BZ z2hq8}qYYmHk1gsC%=3pF8QbVf^!gz{5f}dh69v%fRTG7gtI^;PzNYVT)5g{o)(cfG z6LcX5Y>y}o++M+d`#S9wXO46oOuHHyFiesjh#eLUZrqxQUzInEUC^mKekfSMW(z_- z7jK}j!b;o;kG6uYJ8ewN%?OQW&1;(X#+T67KiIZ^h2@^xedS9?{5>1~uD8Bk`sv!Y z_Xu=iyev;*(#sX;FdshLHQ@perXSgkqA=LPGb75}nalss-cDw->98 z4x`$bZ(6J4xuE>A^zUWI>i?*7s}7}dhAEOMeGy4lQU+!e9!B(G@?~$y{;tJ+T3md$ z6dSV*$itk3k}y8#3{3ygDYG@2OS3nt~r>i?L=fQdiggo|kJ2=<=h5ER^;`(vr*Pv7^L5~x8 z_pbB~3`BJD(QCl=RGse=gjCchA&6iS{r*qQE@zIZVOyB~E+-W(=#?N&CYr9BnlH9pq!Xu6KE<8@lP|x{{U9+G7-yHvuBnGuE@!J9|7%-jq7CgcGXoBHH0P58!A+M?m1HoY= zkOMQZclgoHP`eK5tE54oR9 z#h;u6X$6rbK#sA*AAfubHg;Z~YlQ*n&q-o-AXa4Gu{40lAe@uXc)bEPe%mjj2(Y!W zLDhsrj(;mD-JQmi>(SV3v5K3$ zWD*ojcf1$fNTju6R@h?h<4j@7ec!K>!f4Gd<2Tn*he zxTE_2KslUtE}y&W+>yZ0)^88A8T{7|jP+E~R`?Cu#{lX3jFhloEqABj%2W1Cs zvy+gjh=>UGL<1iX7#z<*?l^G0T@vU*@EO=xktFUY3Q*Cizb9$5=37M+*b#t-h~&lh zr`q9~0z9dp3*yy7G{L>oNQ%-?GoMp0=z{ekYBVSSaNL76CQSf85XEn0VIi3O;9h$^ zx}v9-Znak0YcKO?cVIono_&?BIW42aR$uVNVD9{FdxS(qPKCaI0#o@Shn z$03V|$!ph+2TTHP!VB+?CkgC0K)PVfKg~4GqnE=hr_e@m4ZcRW$y7JVZWF%G zuL43r|0SJ+VS~%sf>oa&+{dQfz{f(XbT2|gSQttVK&ex`Wwdf#7)L=;2CFV{ng5fXfevRdIY`oSMJ;Y;H_E1qT|m_E`IC8)>6>TffmAJhM%hA*EPy|KtZ}4|sQsI;S1mq1y(Ju_W?{;cuML1;MAc7Hxgz z?3nZJIQd(0b?sj!app2;dvShm5x7|ao%-n`|-H2bAhm;BAbU9Z0d&`M~W|dFc`^gmA}mBP4c10&zBeYi88?Ua?qIrDG}>p>AwJqfTsg_ zJBH$*6tbNw$jt?kUr@dD727$$9$-MC%t1kQ#kQ!SU_vCsbaQPY3x+AiTJTOn2?53u z((X`#Aa%RZ2An1QlWCC-3IkRGY(Rk8!t)PJB>H?>iC^bXX~2R7b06yx>`fwr-t#av zAcZmCdHwq~t+%m-MJCGBg05Zu_1K_6+D6xmdK40E`~!vGujE~sSYQhY{se*Vn(I6v%19`7-)1`8=<=mSj_94d5pW(I4enC`+^DG$wL zVk>GBa?z)qB&`m1Qpl2Ua-lugk-Q4s@USR}Dguq5VY7N!6F(K%TLhJ9LM~xfA$~?6z8fkdBx_&pETq6`}g4`M)H6Gbq3ozYABGA&Y5lEWJSsv{k8Pu z803z*afGom(ZiVu0tvJbxLNuR)xi21^k}tV_5`9qq9VtK%RTmGc*8k~%{+&jyKkhv zHS-&w*)?(Loo*LdfYZ~OooRA=So4`-($RHU=AAIpUCu}Gq09@Mori8o%}dZO2f)4* zv$wBDyN*;z23}uq*7wk$NB4!vM`dMY{_l#yDLNuj{v=qA2b3G+1I35_Xf;JQ4p(oy ziA-FKZDbiiiQw~#)XY&odHap8Nl!#llKSw;@tJo`4xM50<2dyG<(Wm?y}P)uP$#@i z1m3IciZsp_Ad|DO*lFa_nN0^M^8}xj%MbJq=q@n&qYKpnaPZ{|4Gj$oI7~Q@f$Zs0 z5f#OfcMk4ML98sgDD1^B_rQ^jh6TIx%+!=DZy75&#t1NIfCs4T;va;IUb=K23{%+P zfEh?)9)b4iArWyV2kek?G(i~)Z{8@Pg!T2^#3bSrwnTXIwAiysoOUL07pp&8OZu#r z8x;(eI~`FGz}*5&XECu{H702(GVb=0D{NZ<3}R&95KvdQCH&RN>IKa-b$pCC^q+s$ z)_!?;2(Z4s$_on)TRS_%q+VfKilwZ=PAe@zp>tS;8YxrNn z2g8pMBPEpWSb5PGWeoYk$1Sr}$?NZ8S_ARRp~z+o)R6cFTRoHFR4b+klK&HS+k7~5 z04Yb9FOe-`7#sFN!|s#tq4frj#ZM7uh!;GqAQOYd01g(+{rPx!QkMdTK}BLhRkp#X;C}oM-~C$F`|sqOqn+uFUgElZ&m(k%Q;#R{Ndq-&sOuIgi`RIcFMoaZ zOR4Q*-|FM15>~WwR#SEBHy+9As+*6lKbmJ|6H=vA?XHZfBqVeOb}#P4Ch)f3-p&p} z2ap9G2cnG!IJmhzm~D+iID;?CN)Ocb(X}L?m zUoIMURfv-q*OmG0?d`KTy!SAvtN>cB%7)P1$~Z*T3*`5&!t{VOge(mYB46rSFuGL&yrfad@> zI*D9O%GIX2Q9VFRb3{`NQNNhjjfqc3AHh7N&|$C!4#>8`sQn2dNWTH=;aNd zMlvdZ2ov0?!j~__W8Z?4qM03VHcF3KCA1v#iroDC8n_Mc#UpzY$i|*xq+Z6p7ImLt z<}JWsh-C^D7UuH+;pDHy5NOPZAzIueMMd??ix5f-4`bg7sngG6_-(y~rAT}T^8Dns%UnaYaR_eF`nf`B@uq>^M}r zH8&Qm)6`QNF7R2PdxI7LCxFhYyxd#~c)Aqny z_o7E7>QPFHLx~=6N}e`i2u@~{tG2@8{QPx-y@P|ar`%um1BV2l(pmTLYQTL->ZCVq zz8mu?K;a?J!ViPvX<~k1?iZL6c$!w`B7LcH4D|HA8=r}LZF$(TnIs!Ttse7sWNqz6 zwpRL2G$@3#-N_Gs;(dE;<7N&9=T#W+O;KUoxV^Wuz^GbGSXfw0tP-Q>RtqQ5^I09J z1@S22CA3`%oeIz#Az|^g5m4<~M)|JPyyq4X5D*X+{xL3^8Xq#C)cBFXW#mnC?P_A} zko@!FVn60%%ruQ00_LpK`XG*Y)k1%P24^8Sc8R^`=HInNq<%|$#@Q;p$f6I}*j1`kdG zho}X$q8u!ct`~hfIQBwJeB#v0Qx5Md()Y12&~MdNS1)(?5J1SC*Cc0iVY5{wXXDAa zloz+X-afL+wj?nx^QcSXuy9_f{b@V4fV77}`uiK=$jUT3c66{BR^2T;eSUAk40l&q zK+E(b&1Gxe_+vL~_zW%M`UR;PKOm0hshu{{V&$>G-qAQW{g6YQk4Bw6v0z|Gla+P+ zzH(YMM=^%#a~?@&`82-~$&p*#TyWJ?S~+oOZ>vS@n9NTEv4S=iYOVL@>6D2hF_N!F zp*#-*E|@Tu4f?#);?|8TL8dKyK5@%?N-=9k1&sV+9)>?F!;wI_OKiG)=I&hKAI`!u zURn}t^}A62EucM6M{ont!29pWnf0!E4+yoA_}{6e40q+Na?q8>pS%JWeDF~)Jcd4= zL~h^hxqGKS=uXng>Q@H#p7;T3YRjH88<=1Sr{0u18|;i@eUIn26Y{P*5cJ|?FCv9Qv481@qRpSQjLs`#TN>w%TKgDZD)E*GT7 z+>%ch%Y0m5z_&NKgGW+S^g;WWOd8=yLw2iXL3hVugl9OxFXZr1sc6Yy|6%7~`&F80 zcD5sJ)tzRT&%E}W?AR_mOhMS5Kv2xI zLfQG`U=6GQV_FX|GJ@%#(}QjK8q5r!P8zv_naalBKWB7kVvlE_u=?xcTWvIE{hecd z4B|~}M%WKv=Cq$O5Kqj(^Hs+D<-pD0Ss@`obwQ>(^i^e#EtLGl77vPGzVq(N3oZ45 ztUGLsRGP1b>8`Rw+V#$&3WIU0ySoU_y^7)~K87+`b|);+BMK4Wk&)PRKopQUKF-jj zL~~K{i zo5m}qy({)TPP{=Zk7H8xd&lO%eDt0bCA{b865@@0s~$Lj-9IH|6Mg-+#_n@)Eq>wE@X7Uj*nC$9Xyrn4Wv*3l?bpA^qr<4H3((x+tgBCQ~i z=fS{%bFG3iIt9-K3f-OGLBCb}FSyjAyB=JzDn>GE1l9MVnuJE34m?%BMlN!~h2{K}JY>!XTmAPK?QGB^k?E?-CiQx_}-@nU)CmHTwqsC*@X%s*ZQh+)}k%R88 z{KNW5x0g63ZA$b2ZXhN7@kh}c3zmqD-MM%3y_w(y$P!su2W&!p9bjrVJ$)1I;RBvy z$*AcC&zhKn6P!LyE z{+n#uZ8+BCX=8b6wBj6xa&8KRXOYenx^~3^)eclY3z}l{4oPh)E=W~doP}3OLPlRxsA}8$t-CyGKo+>P?H1#?gI}3{+5Ng0whshBq zE0|vx4`Pj23a!E95?D3*DuY@d$!J9?RBGi;{!f~Wjt0I=)8alesvP_`=5Wv4YLc47 zb+1>Oh3qJA+mpBrIxtfAh2i%4#_Xm~wNaPQG%giM0zR{#z%QC*z;`hW-a{aZ+pt_ z+R~`X1DP2t5*`?9!c+)^!jD|iS6lO}n1nA!D~{lIdZ^O$)*RPtxNigBy)3)Qch!?lu~nb`(|$*Ul|qXiZ{G01Cr&0Cw$`ywv1?)X1Uwc64w! zNnM8ejYQT^Wc_}ve&A}HAUAF9^JsF?b1!+LbK31BADFYH3!iT=+{9OmSea3 zErswvOE!(Dsi;%|&yuw*|7ve?xlCoE04EXNgsNE4)zqoYK z*IGOu{5#`55ssM{yrN})k<=Kt(@xeUJT?{&nZg0Nc%}-@}Ta@=qO{rbS`z1ID z9SFL82uOZ|obIGb3xR0t)953=5;h@lvjTfKm|pKmHq~G>)EC;lG~ioaUiJmI8XB&I z%)b!jyBFyocA;|!o;)lPZyxD_h15Juvaf|kWFuk)_3V(3iuv$ek%2mEbfgn7t4>XV zPh1L6QyAK}5JS{CVZ%ADGaAtzeE*EO_t@&Pjn@*T*1qxm{I@ruN0@{o?-We*i6OC=RERqH z-FkHAbVe*2aVxv)NT}CX~V#4v=#qpxmBU4Xva_-o0 zC$@f%*XE0V`;p%woX=&d@6y-Uf-g&|3?C8FjS9e~*UXk3d^P)bVD?Ognn&tAI8=i7A0r!nl;nr7jLK4q z<=<2sXtz%5DW1EzgDWd5lLfUARM!B=ySc?}6CFva6iV05{9_^b5Ei={^kA@ISHOV> zRGKYKmoFZUZ;-kp^f|N;1r@5eUv&8f#nm^iSzH2^!^0r%`I|$jU5h&~>_O;vw`*Uk z2yg{{yqk42__65ZFQ5nzb>eVAYkeb5i~DGX>;(wP3ms&4gP6xJDR~p+08>>m-_1|S zaponx(}QsN%{aIYXD;1rEz?k8)p-~bpctv07q4wxb_C9` zbOe#Fw2>l+pK{M>VT*9z-DKOIlwtSB@E+tY;lu~$eMe7Rxh-N;<9+6#ir~UHTqUMN zs9yAxVrzsS6!fK-$wah4$6i!Z6Cs&M*p}U3l<_g?vVlz-?XpgRn~Y8GJ?HA}odRAr z4hNpx`8B)a+R|Eraz<6w*g>xg--C{PtgbODxCS|B{km&FMORYiz%b$b%$eDeuD8sK zO<#?pGl)FpqE?S?W zx_a}bA^Fgp2fX-lK6A5h2bmz60U|9tP1Y5Fp~0?ZpBn`IV{q_rWV5TG`&0r~C8!k0 zEgL_0&B6k-cVKyVu++9bd{>9lEUW-C7q|j8e22k)KsRup3{9+c0Q5OI0Ea0*y9hq4 zavGNBVR%dojBZCYiP5Qj z!Rz=(kUS*nxMg?J>(_FWJcv0Gt1{Oms~7sALC?O$yjbA5FX+lxjCcmD65to6!Rf^K ztW-M(%_DdPu=sfmISV1&RO61s1E(6`XIPgYfUdx2)M@nHz9bKf8p!`VUB`gb&-NbR z;Q7jYge1*r-_wSW7=u_Sa2OBE1(zZY&lP18W{i0RpU!;MII@BqqleCXMff~>4vheR8VpLQ=SE($nd!UN(GroJ^bXSGrx zKR|znNh^SQY#nH{kA11Sa{Ft4*KGA9n{1Q&OO=~jeJ;PWqh0fiQGai8W4fekW8uQ4 zi?ee~Zb1H|IK%sB`xx5F<*bo;&lpRC3g6$yeSc$9*B~4Is}apQnsLAL;Zam9jXgV} zQw8O>UL;wvvQY#QO#qmBcs!6D0ILi}lNGd-kKVHcZ=9jrZQ(D6{14$4bsL(1t8;hn zV|jL+k!u{{-{}S9AA5)B&X)%H$nOxH$GzLB2i`9|C0L3k)Nhy%87w$$Tu)dPFar}A zf~$p{aAgz9&%OF&pxcA(704hM=VG_PWDB%sAo_3z@qsHi$wSETw}-^coClJ&8XC4; zty}@84UY;yklDI=|6LC$n!n3)iPKXar3=M#*INqu&OgU(!N>Pw-r|@zeE2Yg&LI{p zqt0hjuoH6xb`1{JR#YhM7ErC_;De$Wwf3QpD38+AEnQtPfLQac0j)br01B*&<{9N* zahbq|HT;fmHm(3)WVK_l4fm2LGEjki*Acj?{!g|AXXzsR$ zw+{}}#~x$8Fkanne>HPdheGgM*RikYn zvk*j_KJD_V9OyZv*7N0U-?ZyrC!_CGv?m_1*U|3J9Wzj`H;y_+-&?wGs}Fq|c_IFk ze3`XQQ#reWs%&E3RbaPPmupT*aErQiL#67i)2hR{F9LZ33t?)lJ7{hD`RjCP{@aLa zP5FoXM;hji-Ck9vqY7>uPc0YecoTMp!|v(RAL`LcTvv;9Dh%9$*dUL+7t0Z;5jeCi z{diBZ2J#h-$Y-}Cep{;l6!1~tr?T@Bkv#lT_X-%-cU~v$G}e0q%1Ig40L<)R9sieP z0d{s{`CLUiyja}-sf8hPL+=Eg-N zH{EY}N+{6>j-Cg}$&eljw=K?#AG*+Qe$>(Q=z%&1)C7|>vjb<>f5~ufPrtbJF>6ya z9q~gzs3B$B`v{vds|0ZCZ|z()&(pr15S+ah)0KKL;pUw=x+~0w7SSh=o38s{Z(IG< zNQ+7_o0st8lgOJr(T8Z~F$fNojmj05-uGg)q|4|JdQnn3K)q0uIK~7Rig`%1ZPa^$ zu~h{Zz{MNM8cn5kB!M`(8d%?dH)CD>{^BV3gxA!$uNhvxyuU*^q*kdOI!5eYJPb8n74T;jXMjh{IMKCoORmA;|} z&zuq{`QBi1AuOWfv;AP%N6WgX)d+Y~&XA1ftKnYMx$0^dobOR>^ptfgb8OML>ywp} z8MwF5kT#rDA``0SxtK(2aNk26EB9>tv;DRVGs?A++&dNb^8`8s{Ad`SQ;%|4cuypE zscK_q4KUvEP4@Mx#K5*0mGXVbw&c?#-A-xG$0sIC%)d=)Q?? z>TpblNULiyBH*^~D8-B6-xrAFHy-h};ADC+E^hY}&d{H4vJ&c4c?smH9AhV*TNmAP zDljpZ>5B*t@+;B|N{gO>p+Y6`@i4-^W~<^pdUK zLaF$+usitxQBye+nV~fy4oa~ooup*@_1akH<5*(U$of>SgjWWInx8|n`$Z2O zb+Q#T&TUn@IJf2g>M1<3m4WyoqtL4FvnxuLxz$ibi63orkNf#9^z&!9{dw9`YFDNo zXHN0bu)wb5t7=Y9lxF2ZZ&}(Q8|Ah?vA?g~+mV0XzU*K-+xsvbcF(h~WqNK8&NhFL zBbPpTI82Zz|4~DV?!)i{xudteP8A(0^Ty^HlJJRoo8rB8pw3ZyGG(<7=CB#v`Gg$Y zJ+(kq_tbuccTxHZeQf+(P!SudeP~g@L@ySb%QGT!r0Ty2hQ_Z0__kr;_1@gv#kx1P0$J~h4iwuK20ounVTG}Rv)}A zU}I??fz9urb96s~kN(T5Hkpx8;GPT*WX5y2qso7y`K!j&Q;r!}Z+Y_d?W?DXNK&1$LfclS?_+|V)2+86~S2LQCwD|C1$U*$r5%q{yJ zJ#)fWztHP47N1c+*7+K6L#~6%YzI(nHdnbgLjIj!0TRhFUIB!t13cN5ib3x1A-E@) zp-EwKYV}C4^AXn{dF6cSpBlKGYGsZ$XtBJ@Qcs1Zw}6htc!Z$Z@hbdQ3)x<)B}ZhX z^-TbvWZz#q=nKObxF)h(r^9OVm+&ji8)L3{SI8bT^V>{NfhUOEOy>^kPo5nv6W0Zb zpGBP~*4Kaa`v8e1*k(loF>@xK&2^!Vf2;&t6_K0q58po9)!W0dKBU?K>n77b)kY^%-l*X*>l{(-fcrCSKp{&uW{8jV z?i852DfLF4-T3!rhP9FuhOV9edT= zvFM{P`o*))=IFy#hLo8NkC4d++x|aGZOhiU-XFAc&t1JPxD)l`DTaT}d~FnE(BE5W zaqgB~Pv*)e`!c(n&$hy+^_5L1*cLYTX(_Ardd|T~HdNM6ealH|vC9;*<$Maj)pw`gqRM;Sb)4z0raUVpys|mBAOu;9InlC4yumq1`0avCLQt|53hyt#Ld9|2$?jS5+==F9Dp>z*@DvPteaEbf~-lr zPmeP{YvfX%Ww+=Oy~_4GQkEV0b`9SGep~KJdTUf_xA%Yp$S4K9-w(;rj&*qrW|r7} zJ4rh!e7A6$3Hd13+Nrr+Gl(y{iGr{r3&gET-^~q6A>|`t`^9&4IXMr^{Y9k5`+qM0 zEncg?&3W!+S2BeuFE(ktYPgsM)3)uMbxYD1CBzcy%O# z0kp=%Bqkf0hexz2)U=fERYhK9em&1tMAIuGekzHR#d+g-Nkkbzt9fjG-yJ#c`>+wQ zO28XG`6>EYWAwxIAzPNqC$8M3kW9#g!HaS;cKVm+xsYxE7S3-6i(2uPBPI5quJi2R z*<-e=w7_ACT|w|_ukc^iT)L4zIt)B54HS_=>}3>7TmEpzw-m8DMifzrt?oV>D7*bn z)YTEKDZ5^aFve|!se8#&96bRLA?4;-Rbnh$&i&y=D{p9hsmo_mfgLY@ys9hc<)>oa ztCLVZDIGrdp)$E)<|#)~F4@$f<rl~zo|=YgHG9-RR;!L{x`QV~BJ@B;oqdW<4BR65>{@9uS; zG2!cKJHBrnvj2qS{hyZQk{!K%h23lU8BS~RfX#{SiQfta5g%>eKE1@wR=)R!M3!l| z9ZwOD%j<{N6pdvW9)73o*unLL5Ne$e2RTKkY>D1cx^!wDmdJv7tlS1_F zY=4dOT*Gr7Aoj0PC7;t#Ba`tU^SxCd$P$__r*K%!ST*2PP6&MdsNI8LX@8(AjrLj{bsYsxUVBZ<24q*0-zZsX9 z)0g`#=CUyXKd`0CoSZz{df+?1-AVsGqr+|#Du+Cu%*Rh}`*@Ni$tV1@GlFSSB73yP zPj~C_jmWYOjr-`TI5vI~x_jNKc{yIwsMaU>32kGr;w5$Z(Y_z=*ypxx&l--;`80Lw zvXhyvCzy=XJ75Nz!6_RUS!#FiA?GzYjP_*wKO~DCPaJyQl`6>jyTDQ|f0e-7+*uWcAP1IOQ!g!iyQ5e~i#GPk5j;C?@h3DQ6H9 zBEv)s_z2|uWN;!X)OP$h2R$RtS)NknJuVH35{faDY=xQExc8BHT}AXc<+di>`o+NV zt1lUXYJWMY4aCOwtuoM;_3$%Lb7wHq2*-FI?Tr2;;OaGFnj42)LU1pT46{V|os|o( z$?X-0X}R_O`AVv9Q)7|?YK`)K$77CdV8TUHKjE{3gwBHf$oBw~OKdmK`Dk|t(Rsf& z@q2qG!cNeu(F!S6GiO@-I`+*z&0dVCrGFWi@hI?S!I0!6OV->q-2%5pw}$uaZdqwo z7iJ$j`Z`HbIF{(GZAwjC?4FmL`ZaXK>n26~+BJn^u|1Otn9Wz$jBFm0c&Rfy6V(2( z-q^}Zm{CD~rKd=PXKL{X{nm}|Y*IH@2S@kVxd*Y_j8oXPj(DrrCC6SLn)fM5K5Hl~ zEj?5-d_DZU=Q;iKRJ;lgz1(AbdZ!Zp{Ek1L-R%duKT9np8%hIL!Xt^~PWrmWyV-2=`$ux{xb?v;Jrk5JLS^A;E*DkrCIz-vZs}ex zb9BTUD(0I{aQ@FrRGmzR^g%nrMyIKko=b$iG#dkm$=#KM)ZKUdT#Gee&pF@@9T_ zf!}{#4UcKKjy~=>t$N+(zOzF=mw&j1XB|gEsr?7e(45aUAUT&lQ zzdufSMX=6mRk}l{yTB^p|Nob=&*jCl^E*};utX}5ewF`y1)khDLlCz~$Ru5h|9v&Y z6C#%H&p(~4G+}I7>Fzcfv@vlqDM+d5iiApdVDdcuS#hT6ms!~Z?k|?s{Gdt58nf|| zDo|VxQQKRUX_YdpiihQYUK^2*`|T4mp<@Lx>198}X^5?xcFUnGY&b&J{5MH^CAj*` z|M_KT$<$uAl-jiv^R&chLUW0^HVfOiTMk`5|E{F^e_kswezyiko$XS#GgIxvfA9$S z=26eJ?cd`>dZbc+9R+z(0`cD+Lav7Knn6UiVH1Z3ehvF~!9He1+BT6Y^WV??=Z8oA z@5NB^n{}5?TM9knuA_`3Ad1K;fvREP>|PbDq5r;yTF7#Jq4zJj(pyU1$jHK?O{O!n z$FF@1;3~m5EsQj?`tR$CrXm+g)0r9k!epC}I>Recd0XBu@_HfF1=?rpIiwFRbni|e zXog&n`l`7%fj(Jbqjw|TE|OR~dB|ns66rICHi#WUk%SaUw8F>Qj z9(jF6;*fghpv6%x5JM5Ti`w?>%ub8`^y`+)I&me#^Oxjh@NTz> zdrPC@GL>XH>{Km3l|B)2VRKb|&a4026>O!Sn%xO`=lj2qwRdI|24?Oy*=-o#@Wt%q zN4En(X%$~Tl_v1&cl7f$I(kjE2GJ|WXZ<=;)O%Asw4c5vmsPOS)v!aT*Se$^)TWkE zI%0RJYKH^tJQ*3`%mI@c!EQh)k}Q#!>qRn@vq+GrAZGqazF&RjyYD{W>bp{?Hyt#s z5Rk(4ZSc=S(nX}*^2xeP)ezrJsHZg7?PX7)9T#uB^yw~!uUQP~P19Y{QZ5Kj4~VMF zKUivaKEB2AVP=<2Z#tqcu7zZls#@huUsZFKh1y2sf+l{vmL~;Z;^05W(y4x?< zfi8WuXCSD5K;h6y(vCx^O5QkJWcSism)M;-L8I_E&C&gGJO;n6-6w7C@dog1TvqB- z%2HM(HzWrw`_hRL=L$`SQbWG@A?L{;d&{^Ft|d`i-u6$i9v*K|etGNqqb)U>*_H_w z37Ngqnccnp{fDS_f@6vzWKrrZA(kH-f`3acL89Ns_+cu86cG2dAvlez6E$`f$Y zeMfg`>E^RRpL=T%arE*~41IleTI?|wwZ39+>1QHou{hG&9!!5qQOXWuz`PH2g zGT+9+`w1+JK;q!$#xg1B5hgt3WZ2L>=#eec3DT?BdKl%er8~+)(pN>kzbj%rz$V7r z4J4wsI%`=2tGWD2VFGVFELT%qdg<$x-hUjxrRjL;WL~?C`vCF2iT%-2YJ^waO3Cr>-78!Q| z6_|tePM4bZl-eq=Ye>)LFL8y29WzK-QziddSJGOUKgkz=zQaJ1k}EKO(muY6A+B@)Uduwr(&eA8jC@z^8w zKtggu!T5UYz~@6Rz7}I6(C4Kq2r?P3wA5b~+@YmjF5=eGpY!K&Lp;S3R;!T5emj0H zCR`nFoEn66M5t_Aiqs}X*N+PdW+Rq0u$g^qSQ00T|IqJu4VS~dk#c$ea*cra-JV +zcode plugins enable agent-team@ +zcode plugins list | grep -A2 agent-team # 确认版本与缓存路径 +``` + +![CLI:确认安装版本 0.1.2](assets/manual/cli-version.png) + +## 2. 快速上手 + +新建任务(旧任务不会刷新插件能力),发送: + +```text +创建一个叫 reviewer 的队友,让它检查 README 前三段的错别字,然后汇总它的结论。 +``` + +Lead 会创建 `reviewer`、分配任务,并在会话内渲染「智能体团队」面板;`reviewer` 完成后把结论发回,Lead 汇总给你。下图为首次运行时面板与 Lead 的进度: + +![会话内面板:成员 2(lead / reviewer)运行中](assets/manual/panel-running.png) + +桌面默认权限模式下,首次调用团队工具会弹出权限确认;选择「允许(仅本次)」或「始终允许本项目」即可。这是宿主的工具授权,与 hook 无关。 + +![工具权限确认](assets/manual/tool-permission.png) + +任务完成时,Lead 的最终答复与面板同屏可见: + +![任务完成:Lead 汇总与面板](assets/manual/panel-final.png) + +### 2.1 模型与思考强度(自动跟随 Lead,无需设置) + +**0.4.0 起,成员模型只有一条路线:自动跟随 Lead 的最新已确认模型与思考强度。** 没有单独的成员模型配置:面板没有齿轮弹窗,`spawn_teammate` 没有 `model` 参数,也不能在对话里「让某个成员换模型」。你只需要管好 Lead 的模型,成员每次开始执行前自动同步(运行中的成员等本轮跑完在下一轮开始时同步,不会被打断;急需切换可先中断该成员再发消息)。 + +> **硬性边界:不支持继承官方 coding plan 模型配置。** 成员是独立 CLI 进程,宿主不向它下发订阅套餐(`account:*` / `builtin:*` Provider,如智谱 GLM 官方 coding plan)的凭据。Lead 正在用套餐模型时创建/续跑成员会**直接报错并说明原因**(绝不悄悄换模型开跑);请先在 ZCode 设置 → 模型服务中把 Lead 切换到自配的第三方模型。 + +> 「已确认」= 三路取最新:你提交消息时宿主写入的模型快照、会话选模记录(`/model` 命令更新)、主轮实际调用记录。仅在输入框里切了下拉但还没提交消息,不承诺同步。 + +**0.4.1 修复轮补充**(跟随机制的可靠性,无新配置项): + +- 一致性判断以**宿主会话中的实际选择**为准(`origin` 记录只是辅助):崩溃恢复后不会凭旧记录误判「已一致」;仅思考强度变化同样会同步;首轮已定模的不重复应用。 +- 同步失败**可见且有节制**:失败原因在成员行诊断与 `model-failed.json` 可见,待处理消息保留不丢。确定性拒绝(套餐/目录外/宿主明确不支持)暂停相同选择的自动重试;临时故障(超时/进程异常)按 5s/15s/30s 退避、最多自动重试 3 次;**Lead 换回可用模型或你再发一条新消息即解锁**,恢复成功后旧错误提示自动消失。 +- **创建前校验**:Lead 模型不可继承时 `spawn_teammate` 在登记成员之前就报错——不产生 failed 成员、不占用成员名,修正 Lead 模型后原名可直接重用。 + +## 3. 面板说明 + +「智能体团队」面板是插件的主 UI(MCP Apps surface `agent-team-panel`),由宿主在会话内渲染,数据通过 `resources/subscribe` 实时推送。 + +| 区域 | 内容 | +|---|---| +| 成员 | Lead 与全部 teammate;名字、角色、状态点(运行中 / 未运行 / 创建中 / 失败)。Lead 行标「当前会话」;成员行显示实际生效模型(跟随 Lead),继承失败时显示一行诊断 | +| 共享任务 | 任务标题、状态(待处理 / 进行中 / 已完成)、Owner、展开查看描述与验收记录 | +| 通知条 | 新消息、任务变化等提示(有变化时出现) | +| 刷新 | 订阅推送 ≤1s 自动刷新;面板心跳每 25s 一次,兼作 Lead 侧连接保活 | + +成员卡片可打开成员会话查看视图(只读:按页载入成员转录,带 events/delivered 徽标)。视图按轮显示用户指令、动作组(可点开逐条工具)与每轮结论;不展示全量转录(需要原始记录时用 `team-ctl`/事件日志)。静态卡片按保守口径映射活性(active→未运行),实时面板才显示运行中。 + +> 面板是**只读通道**(0.4.0 起恢复零变更能力口径):不提供任何模型/配置修改入口;所有变更都通过对话由 Lead 执行。 + +## 4. CLI:文本摘要(形态一) + +CLI 会话没有图形面板,`/team` 命令输出文本摘要;其数据面与 `team-ctl state` 同源: + +```bash +/team +# 或直接读盘重放 +node <插件目录>/runtime/team-ctl.mjs state +``` + +输出包含团队/会话、成员表、任务表、消息投递统计: + +![CLI 文本摘要(team-ctl state;/team 同源)](assets/manual/cli-text-summary.png) + +常用子命令: + +```bash +node <插件目录>/runtime/team-ctl.mjs state --json # 机器可读 +node <插件目录>/runtime/team-ctl.mjs transcript # 成员会话摘要(按轮) +node <插件目录>/runtime/team-ctl.mjs tail # 跟随事件日志 +``` + +## 5. CLI:卡片(形态二) + +`team-ctl widget` 生成与面板同源的静态卡片,可作为独立 HTML 打开或嵌入内容引用: + +```bash +node <插件目录>/runtime/team-ctl.mjs widget --standalone \ + --theme dark --lang zh --out /tmp/team-card.html +open /tmp/team-card.html +``` + +深色: + +![静态卡片(dark / zh)](assets/manual/card-dark.png) + +浅色: + +![静态卡片(light / zh)](assets/manual/card-light.png) + +> 卡片为静态快照,不探测活性:成员状态显示为「未运行」属预期(限制 D21)。桌面里也可以让 Lead 生成 `::visualize` 内容引用卡片。 + +## 6. 升级 + +源码或市场目录更新后,**改源码不会热更新**,按以下步骤升级: + +1. 插件市场 → 右上 **市场源** → 找到你的市场 → **刷新该市场**; +2. 回到 **个人**,插件卡片出现「可更新」→ 点 **更新**; +3. 升级后**新开任务**才使用新版本(宿主按会话固定插件运行时)。 + +![市场源:刷新市场](assets/manual/market-sources.png) + +![个人页:可更新](assets/manual/update-available.png) + +## 7. 卸载与数据 + +卸载前先备份插件数据目录(默认卸载会删除团队数据): + +```bash +DATA="$HOME/.zcode/cli/plugins/data/agent-team@" +tar -czf ~/agent-team-backup-$(date +%Y%m%d).tar.gz -C "$(dirname "$DATA")" "$(basename "$DATA")" +``` + +桌面:**设置 → 插件 → 智能体团队 → 更多操作 → 卸载**。确认框会提示删除缓存、数据目录与配置: + +![卸载确认框](assets/manual/uninstall-confirm.png) + +- CLI 默认卸载删除整个数据目录;需要保留数据用 `--keep-data`(非交互 shell 加 `--force`)。 +- 桌面无「保留数据」选项;卸载后请关闭仍打开的相关任务窗口,否则旧会话可能重建一个**空**数据骨架(`events.jsonl` 0 字节,原数据不恢复)。 +- 完整结论与备份指引见 [README「卸载后数据怎么处理」](../README.md#卸载后数据怎么处理)。 + +## 8. 截图与版本 + +| 截图 | 采集对象 | 采集时间 | 说明 | +|---|---|---|---| +| `cli-version.png`、`cli-text-summary.png`、`card-dark.png`、`card-light.png` | 0.1.2 安装实例(隔离 HOME) | 2026-10-24 | CLI 文本摘要与卡片由 0.1.2 的 `team-ctl` 实际生成;卡片用 Chromium 打开真实 standalone HTML 截图 | +| `panel-running.png`、`panel-final.png`、`tool-permission.png` | 发布演练实例(0.1.0 运行时) | 2026-10-24 | 面板/权限 UI | +| `settings-enabled.png`、`market-personal.png`、`market-sources.png`、`update-available.png`、`uninstall-confirm.png` | 发布演练实例(0.1.0→0.1.1) | 2026-10-24 | 市场与设置 UI | + +版本一致性依据:0.1.2 与 0.1.1 的 `dist/` 逐字节相同(含 `dist/ui/team-panel.html`,sha256 `6c7a14a0e71dbea5cfb0014fa0e37ef0f794f047233d417f9df9d5fa4a743ad2`),0.1.2 仅改文档、清单版本与包内文档资源;上述 UI 截图中的布局与文案与当前版本一致,且截图中不显示会随版本变化的版本号字段。 + +> 采集限制:采集桌面截图时,演示机屏幕随后被锁定,无法再驱动桌面 UI 重拍;因此桌面截图为同一次发布演练的原始实拍(运行时 0.1.0/0.1.1),并以 `dist` 逐字节相同证明与 0.1.2 UI 一致。此事实同时登记在《最终验收汇总》V02 证据说明与 stage-7 勘误中。 diff --git a/external_plugins/agent-team/hooks/hooks.json b/external_plugins/agent-team/hooks/hooks.json new file mode 100644 index 00000000..b8adaa92 --- /dev/null +++ b/external_plugins/agent-team/hooks/hooks.json @@ -0,0 +1,41 @@ +{ + "hooks": { + "SessionStart": [ + { + "matcher": "startup|resume", + "hooks": [ + { + "type": "command", + "command": "node \"${ZCODE_PLUGIN_ROOT}/runtime/team-hooks.mjs\"", + "timeout": 15, + "statusMessage": "agent-team SessionStart(策略/收件箱注入)" + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "node \"${ZCODE_PLUGIN_ROOT}/runtime/team-hooks.mjs\"", + "timeout": 15, + "statusMessage": "agent-team Stop(回合边界交付)" + } + ] + } + ], + "UserPromptSubmit": [ + { + "hooks": [ + { + "type": "command", + "command": "node \"${ZCODE_PLUGIN_ROOT}/runtime/team-hooks.mjs\"", + "timeout": 15, + "statusMessage": "agent-team UserPromptSubmit(收件箱兜底注入)" + } + ] + } + ] + } +} diff --git a/external_plugins/agent-team/runtime/app-server-bridge.mjs b/external_plugins/agent-team/runtime/app-server-bridge.mjs new file mode 100644 index 00000000..06f7f0d6 --- /dev/null +++ b/external_plugins/agent-team/runtime/app-server-bridge.mjs @@ -0,0 +1,76 @@ +// app-server 桥接器(stage-6 会话隔离生产资产;纯 Node 脚本,无 TS/无依赖)。 +// 用途:让 TS 侧以「常量可执行文件 + 参数数组」的合规形态孵化 `zcode app-server`, +// 并把父进程的 stdin/stdout/stderr 直接接到 app-server(NDJSON 双向流)。 +// 契约:argv[2] = spec 文件路径(JSON):{ executable, argv, cwd }(env 经 bridge 进程环境传递, +// 不落盘;旧 spec 仍可带 env) +// executable 必须为绝对路径(TS 侧已校验;此处复核)。 +// 行为:spawn(stdio: inherit) → 转发 SIGTERM/SIGINT/SIGHUP → 以子进程退出码退出; +// spawn 失败 → 写单行可读错误到 stderr → exit 127(不静默)。 +import fs from "node:fs"; +import path from "node:path"; +import { spawn } from "node:child_process"; + +const specPath = process.argv[2]; +if (typeof specPath !== "string" || specPath.length === 0) { + process.stderr.write("app-server-bridge: spec path required\n"); + process.exit(2); +} + +let spec; +try { + spec = JSON.parse(fs.readFileSync(specPath, "utf8")); +} catch (err) { + process.stderr.write(`app-server-bridge: unreadable spec (${err instanceof Error ? err.message : String(err)})\n`); + process.exit(2); +} +// spec 仍可能含 env(旧格式):读入内存后立即删除,缩短明文落盘窗口。 +try { + fs.unlinkSync(specPath); +} catch { + /* best-effort */ +} + +if (typeof spec.executable !== "string" || !path.isAbsolute(spec.executable)) { + process.stderr.write("app-server-bridge: executable must be an absolute path\n"); + process.exit(2); +} +if (!Array.isArray(spec.argv) || spec.argv.some((a) => typeof a !== "string")) { + process.stderr.write("app-server-bridge: argv must be a string array\n"); + process.exit(2); +} + +let child; +try { + child = spawn(spec.executable, spec.argv, { + cwd: spec.cwd, + env: spec.env ?? process.env, + stdio: "inherit", + }); +} catch (err) { + process.stderr.write(`app-server-bridge: spawn failed (${err instanceof Error ? err.message : String(err)})\n`); + process.exit(127); +} + +const forward = (sig) => { + try { + child.kill(sig); + } catch { + /* 子进程已退出 */ + } +}; +process.on("SIGTERM", () => forward("SIGTERM")); +process.on("SIGINT", () => forward("SIGINT")); +process.on("SIGHUP", () => forward("SIGHUP")); +process.on("exit", () => forward("SIGKILL")); + +child.on("error", (err) => { + process.stderr.write(`app-server-bridge: child error (${err.message})\n`); + process.exit(127); +}); +child.on("exit", (code, signal) => { + if (signal !== null) { + process.kill(process.pid, signal); + return; + } + process.exit(code ?? 0); +}); diff --git a/external_plugins/agent-team/runtime/detach-helper.mjs b/external_plugins/agent-team/runtime/detach-helper.mjs new file mode 100644 index 00000000..b8d445da --- /dev/null +++ b/external_plugins/agent-team/runtime/detach-helper.mjs @@ -0,0 +1,61 @@ +// 轮次进程脱离孵化器(stage-4 生产资产;纯 Node 脚本,无 TS/无依赖)。 +// 用途:以「独立进程组 + stdout 落文件」孵化 teammate 轮次进程——孵化器自身立即退出, +// daemon 不持有轮次进程任何管道(daemon 被宿主回收不连带杀轮次、无 EPIPE 面)。 +// 契约:argv[2] = spec 文件路径(JSON): +// { command, argv, cwd, stdoutFile, resultFile }(env 默认经本 helper 的进程环境传递, +// 不落盘;persistEnv=true 的旧 spec 仍可带 env) +// 行为:spawn(detached) → unref → 把 { pid } 原子写入 resultFile → exit 0; +// spawn 抛错 → 写 { error } → exit 0(错误经 resultFile 显式上抛,不静默)。 +import fs from "node:fs"; +import path from "node:path"; +import { spawn } from "node:child_process"; + +const specPath = process.argv[2]; +if (typeof specPath !== "string" || specPath.length === 0) { + process.stderr.write("detach-helper: spec path required\n"); + process.exit(2); +} +const spec = JSON.parse(fs.readFileSync(specPath, "utf8")); +// spec 仍可能含 env(persistEnv 旧格式):读入内存后立即删除,缩短明文落盘窗口。 +try { + fs.unlinkSync(specPath); +} catch { + /* best-effort */ +} +// 默认使用 helper 自身的进程环境(由 spawnDetached 以 execFile env 注入,不落盘)。 +const childEnv = spec.env ?? process.env; + +let result; +try { + fs.mkdirSync(path.dirname(spec.stdoutFile), { recursive: true, mode: 0o700 }); + const fd = fs.openSync(spec.stdoutFile, "w", 0o600); + try { + const child = spawn(spec.command, spec.argv, { + detached: true, + stdio: ["ignore", fd, fd], + env: childEnv, + cwd: spec.cwd, + }); + child.unref(); + // spawn 失败(ENOENT 等)经 'error' 事件异步上报;成功经 'spawn' 确认——二者先到者定案 + result = await new Promise((resolve) => { + const timer = setTimeout(() => resolve({ error: "spawn confirmation timeout" }), 2_000); + child.once("error", (err) => { + clearTimeout(timer); + resolve({ error: err instanceof Error ? `${err.name}: ${err.message}` : String(err) }); + }); + child.once("spawn", () => { + clearTimeout(timer); + resolve({ pid: child.pid }); + }); + }); + } finally { + fs.closeSync(fd); + } +} catch (err) { + result = { error: err instanceof Error ? `${err.name}: ${err.message}` : String(err) }; +} +const tmp = `${spec.resultFile}.tmp-${process.pid}`; +fs.writeFileSync(tmp, JSON.stringify(result), { mode: 0o600 }); +fs.renameSync(tmp, spec.resultFile); +process.exit(0); diff --git a/external_plugins/agent-team/runtime/team-ctl.mjs b/external_plugins/agent-team/runtime/team-ctl.mjs new file mode 100644 index 00000000..88fec359 --- /dev/null +++ b/external_plugins/agent-team/runtime/team-ctl.mjs @@ -0,0 +1,7093 @@ +var __defProp = Object.defineProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; + +// src/cli/main.ts +import fs13 from "node:fs"; +import path14 from "node:path"; +import { pathToFileURL } from "node:url"; + +// src/coord/replay.ts +import fs from "node:fs"; +import path from "node:path"; + +// node_modules/zod/v3/external.js +var external_exports = {}; +__export(external_exports, { + BRAND: () => BRAND, + DIRTY: () => DIRTY, + EMPTY_PATH: () => EMPTY_PATH, + INVALID: () => INVALID, + NEVER: () => NEVER, + OK: () => OK, + ParseStatus: () => ParseStatus, + Schema: () => ZodType, + ZodAny: () => ZodAny, + ZodArray: () => ZodArray, + ZodBigInt: () => ZodBigInt, + ZodBoolean: () => ZodBoolean, + ZodBranded: () => ZodBranded, + ZodCatch: () => ZodCatch, + ZodDate: () => ZodDate, + ZodDefault: () => ZodDefault, + ZodDiscriminatedUnion: () => ZodDiscriminatedUnion, + ZodEffects: () => ZodEffects, + ZodEnum: () => ZodEnum, + ZodError: () => ZodError, + ZodFirstPartyTypeKind: () => ZodFirstPartyTypeKind, + ZodFunction: () => ZodFunction, + ZodIntersection: () => ZodIntersection, + ZodIssueCode: () => ZodIssueCode, + ZodLazy: () => ZodLazy, + ZodLiteral: () => ZodLiteral, + ZodMap: () => ZodMap, + ZodNaN: () => ZodNaN, + ZodNativeEnum: () => ZodNativeEnum, + ZodNever: () => ZodNever, + ZodNull: () => ZodNull, + ZodNullable: () => ZodNullable, + ZodNumber: () => ZodNumber, + ZodObject: () => ZodObject, + ZodOptional: () => ZodOptional, + ZodParsedType: () => ZodParsedType, + ZodPipeline: () => ZodPipeline, + ZodPromise: () => ZodPromise, + ZodReadonly: () => ZodReadonly, + ZodRecord: () => ZodRecord, + ZodSchema: () => ZodType, + ZodSet: () => ZodSet, + ZodString: () => ZodString, + ZodSymbol: () => ZodSymbol, + ZodTransformer: () => ZodEffects, + ZodTuple: () => ZodTuple, + ZodType: () => ZodType, + ZodUndefined: () => ZodUndefined, + ZodUnion: () => ZodUnion, + ZodUnknown: () => ZodUnknown, + ZodVoid: () => ZodVoid, + addIssueToContext: () => addIssueToContext, + any: () => anyType, + array: () => arrayType, + bigint: () => bigIntType, + boolean: () => booleanType, + coerce: () => coerce, + custom: () => custom, + date: () => dateType, + datetimeRegex: () => datetimeRegex, + defaultErrorMap: () => en_default, + discriminatedUnion: () => discriminatedUnionType, + effect: () => effectsType, + enum: () => enumType, + function: () => functionType, + getErrorMap: () => getErrorMap, + getParsedType: () => getParsedType, + instanceof: () => instanceOfType, + intersection: () => intersectionType, + isAborted: () => isAborted, + isAsync: () => isAsync, + isDirty: () => isDirty, + isValid: () => isValid, + late: () => late, + lazy: () => lazyType, + literal: () => literalType, + makeIssue: () => makeIssue, + map: () => mapType, + nan: () => nanType, + nativeEnum: () => nativeEnumType, + never: () => neverType, + null: () => nullType, + nullable: () => nullableType, + number: () => numberType, + object: () => objectType, + objectUtil: () => objectUtil, + oboolean: () => oboolean, + onumber: () => onumber, + optional: () => optionalType, + ostring: () => ostring, + pipeline: () => pipelineType, + preprocess: () => preprocessType, + promise: () => promiseType, + quotelessJson: () => quotelessJson, + record: () => recordType, + set: () => setType, + setErrorMap: () => setErrorMap, + strictObject: () => strictObjectType, + string: () => stringType, + symbol: () => symbolType, + transformer: () => effectsType, + tuple: () => tupleType, + undefined: () => undefinedType, + union: () => unionType, + unknown: () => unknownType, + util: () => util, + void: () => voidType +}); + +// node_modules/zod/v3/helpers/util.js +var util; +(function(util2) { + util2.assertEqual = (_) => { + }; + function assertIs(_arg) { + } + util2.assertIs = assertIs; + function assertNever(_x) { + throw new Error(); + } + util2.assertNever = assertNever; + util2.arrayToEnum = (items) => { + const obj = {}; + for (const item of items) { + obj[item] = item; + } + return obj; + }; + util2.getValidEnumValues = (obj) => { + const validKeys = util2.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); + const filtered = {}; + for (const k of validKeys) { + filtered[k] = obj[k]; + } + return util2.objectValues(filtered); + }; + util2.objectValues = (obj) => { + return util2.objectKeys(obj).map(function(e) { + return obj[e]; + }); + }; + util2.objectKeys = typeof Object.keys === "function" ? (obj) => Object.keys(obj) : (object) => { + const keys = []; + for (const key in object) { + if (Object.prototype.hasOwnProperty.call(object, key)) { + keys.push(key); + } + } + return keys; + }; + util2.find = (arr, checker) => { + for (const item of arr) { + if (checker(item)) + return item; + } + return void 0; + }; + util2.isInteger = typeof Number.isInteger === "function" ? (val) => Number.isInteger(val) : (val) => typeof val === "number" && Number.isFinite(val) && Math.floor(val) === val; + function joinValues(array, separator = " | ") { + return array.map((val) => typeof val === "string" ? `'${val}'` : val).join(separator); + } + util2.joinValues = joinValues; + util2.jsonStringifyReplacer = (_, value) => { + if (typeof value === "bigint") { + return value.toString(); + } + return value; + }; +})(util || (util = {})); +var objectUtil; +(function(objectUtil2) { + objectUtil2.mergeShapes = (first, second) => { + return { + ...first, + ...second + // second overwrites first + }; + }; +})(objectUtil || (objectUtil = {})); +var ZodParsedType = util.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set" +]); +var getParsedType = (data) => { + const t2 = typeof data; + switch (t2) { + case "undefined": + return ZodParsedType.undefined; + case "string": + return ZodParsedType.string; + case "number": + return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; + case "boolean": + return ZodParsedType.boolean; + case "function": + return ZodParsedType.function; + case "bigint": + return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; + case "object": + if (Array.isArray(data)) { + return ZodParsedType.array; + } + if (data === null) { + return ZodParsedType.null; + } + if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") { + return ZodParsedType.promise; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return ZodParsedType.map; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return ZodParsedType.set; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return ZodParsedType.date; + } + return ZodParsedType.object; + default: + return ZodParsedType.unknown; + } +}; + +// node_modules/zod/v3/ZodError.js +var ZodIssueCode = util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite" +]); +var quotelessJson = (obj) => { + const json = JSON.stringify(obj, null, 2); + return json.replace(/"([^"]+)":/g, "$1:"); +}; +var ZodError = class _ZodError extends Error { + get errors() { + return this.issues; + } + constructor(issues) { + super(); + this.issues = []; + this.addIssue = (sub) => { + this.issues = [...this.issues, sub]; + }; + this.addIssues = (subs = []) => { + this.issues = [...this.issues, ...subs]; + }; + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, actualProto); + } else { + this.__proto__ = actualProto; + } + this.name = "ZodError"; + this.issues = issues; + } + format(_mapper) { + const mapper = _mapper || function(issue) { + return issue.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error) => { + for (const issue of error.issues) { + if (issue.code === "invalid_union") { + issue.unionErrors.map(processError); + } else if (issue.code === "invalid_return_type") { + processError(issue.returnTypeError); + } else if (issue.code === "invalid_arguments") { + processError(issue.argumentsError); + } else if (issue.path.length === 0) { + fieldErrors._errors.push(mapper(issue)); + } else { + let curr = fieldErrors; + let i = 0; + while (i < issue.path.length) { + const el = issue.path[i]; + const terminal = i === issue.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + } else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue)); + } + curr = curr[el]; + i++; + } + } + } + }; + processError(this); + return fieldErrors; + } + static assert(value) { + if (!(value instanceof _ZodError)) { + throw new Error(`Not a ZodError: ${value}`); + } + } + toString() { + return this.message; + } + get message() { + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(mapper = (issue) => issue.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of this.issues) { + if (sub.path.length > 0) { + const firstEl = sub.path[0]; + fieldErrors[firstEl] = fieldErrors[firstEl] || []; + fieldErrors[firstEl].push(mapper(sub)); + } else { + formErrors.push(mapper(sub)); + } + } + return { formErrors, fieldErrors }; + } + get formErrors() { + return this.flatten(); + } +}; +ZodError.create = (issues) => { + const error = new ZodError(issues); + return error; +}; + +// node_modules/zod/v3/locales/en.js +var errorMap = (issue, _ctx) => { + let message; + switch (issue.code) { + case ZodIssueCode.invalid_type: + if (issue.received === ZodParsedType.undefined) { + message = "Required"; + } else { + message = `Expected ${issue.expected}, received ${issue.received}`; + } + break; + case ZodIssueCode.invalid_literal: + message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`; + break; + case ZodIssueCode.unrecognized_keys: + message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, ", ")}`; + break; + case ZodIssueCode.invalid_union: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_union_discriminator: + message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`; + break; + case ZodIssueCode.invalid_enum_value: + message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`; + break; + case ZodIssueCode.invalid_arguments: + message = `Invalid function arguments`; + break; + case ZodIssueCode.invalid_return_type: + message = `Invalid function return type`; + break; + case ZodIssueCode.invalid_date: + message = `Invalid date`; + break; + case ZodIssueCode.invalid_string: + if (typeof issue.validation === "object") { + if ("includes" in issue.validation) { + message = `Invalid input: must include "${issue.validation.includes}"`; + if (typeof issue.validation.position === "number") { + message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`; + } + } else if ("startsWith" in issue.validation) { + message = `Invalid input: must start with "${issue.validation.startsWith}"`; + } else if ("endsWith" in issue.validation) { + message = `Invalid input: must end with "${issue.validation.endsWith}"`; + } else { + util.assertNever(issue.validation); + } + } else if (issue.validation !== "regex") { + message = `Invalid ${issue.validation}`; + } else { + message = "Invalid"; + } + break; + case ZodIssueCode.too_small: + if (issue.type === "array") + message = `Array must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`; + else if (issue.type === "string") + message = `String must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`; + else if (issue.type === "number") + message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`; + else if (issue.type === "bigint") + message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`; + else if (issue.type === "date") + message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.too_big: + if (issue.type === "array") + message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`; + else if (issue.type === "string") + message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`; + else if (issue.type === "number") + message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`; + else if (issue.type === "bigint") + message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`; + else if (issue.type === "date") + message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.custom: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_intersection_types: + message = `Intersection results could not be merged`; + break; + case ZodIssueCode.not_multiple_of: + message = `Number must be a multiple of ${issue.multipleOf}`; + break; + case ZodIssueCode.not_finite: + message = "Number must be finite"; + break; + default: + message = _ctx.defaultError; + util.assertNever(issue); + } + return { message }; +}; +var en_default = errorMap; + +// node_modules/zod/v3/errors.js +var overrideErrorMap = en_default; +function setErrorMap(map) { + overrideErrorMap = map; +} +function getErrorMap() { + return overrideErrorMap; +} + +// node_modules/zod/v3/helpers/parseUtil.js +var makeIssue = (params) => { + const { data, path: path15, errorMaps, issueData } = params; + const fullPath = [...path15, ...issueData.path || []]; + const fullIssue = { + ...issueData, + path: fullPath + }; + if (issueData.message !== void 0) { + return { + ...issueData, + path: fullPath, + message: issueData.message + }; + } + let errorMessage = ""; + const maps = errorMaps.filter((m) => !!m).slice().reverse(); + for (const map of maps) { + errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message; + } + return { + ...issueData, + path: fullPath, + message: errorMessage + }; +}; +var EMPTY_PATH = []; +function addIssueToContext(ctx, issueData) { + const overrideMap = getErrorMap(); + const issue = makeIssue({ + issueData, + data: ctx.data, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + // contextual error map is first priority + ctx.schemaErrorMap, + // then schema-bound map if available + overrideMap, + // then global override map + overrideMap === en_default ? void 0 : en_default + // then global default map + ].filter((x) => !!x) + }); + ctx.common.issues.push(issue); +} +var ParseStatus = class _ParseStatus { + constructor() { + this.value = "valid"; + } + dirty() { + if (this.value === "valid") + this.value = "dirty"; + } + abort() { + if (this.value !== "aborted") + this.value = "aborted"; + } + static mergeArray(status, results) { + const arrayValue = []; + for (const s of results) { + if (s.status === "aborted") + return INVALID; + if (s.status === "dirty") + status.dirty(); + arrayValue.push(s.value); + } + return { status: status.value, value: arrayValue }; + } + static async mergeObjectAsync(status, pairs) { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value + }); + } + return _ParseStatus.mergeObjectSync(status, syncPairs); + } + static mergeObjectSync(status, pairs) { + const finalObject = {}; + for (const pair of pairs) { + const { key, value } = pair; + if (key.status === "aborted") + return INVALID; + if (value.status === "aborted") + return INVALID; + if (key.status === "dirty") + status.dirty(); + if (value.status === "dirty") + status.dirty(); + if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) { + finalObject[key.value] = value.value; + } + } + return { status: status.value, value: finalObject }; + } +}; +var INVALID = Object.freeze({ + status: "aborted" +}); +var DIRTY = (value) => ({ status: "dirty", value }); +var OK = (value) => ({ status: "valid", value }); +var isAborted = (x) => x.status === "aborted"; +var isDirty = (x) => x.status === "dirty"; +var isValid = (x) => x.status === "valid"; +var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; + +// node_modules/zod/v3/helpers/errorUtil.js +var errorUtil; +(function(errorUtil2) { + errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {}; + errorUtil2.toString = (message) => typeof message === "string" ? message : message?.message; +})(errorUtil || (errorUtil = {})); + +// node_modules/zod/v3/types.js +var ParseInputLazyPath = class { + constructor(parent, value, path15, key) { + this._cachedPath = []; + this.parent = parent; + this.data = value; + this._path = path15; + this._key = key; + } + get path() { + if (!this._cachedPath.length) { + if (Array.isArray(this._key)) { + this._cachedPath.push(...this._path, ...this._key); + } else { + this._cachedPath.push(...this._path, this._key); + } + } + return this._cachedPath; + } +}; +var handleResult = (ctx, result) => { + if (isValid(result)) { + return { success: true, data: result.value }; + } else { + if (!ctx.common.issues.length) { + throw new Error("Validation failed but no issues detected."); + } + return { + success: false, + get error() { + if (this._error) + return this._error; + const error = new ZodError(ctx.common.issues); + this._error = error; + return this._error; + } + }; + } +}; +function processCreateParams(params) { + if (!params) + return {}; + const { errorMap: errorMap2, invalid_type_error, required_error, description } = params; + if (errorMap2 && (invalid_type_error || required_error)) { + throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); + } + if (errorMap2) + return { errorMap: errorMap2, description }; + const customMap = (iss, ctx) => { + const { message } = params; + if (iss.code === "invalid_enum_value") { + return { message: message ?? ctx.defaultError }; + } + if (typeof ctx.data === "undefined") { + return { message: message ?? required_error ?? ctx.defaultError }; + } + if (iss.code !== "invalid_type") + return { message: ctx.defaultError }; + return { message: message ?? invalid_type_error ?? ctx.defaultError }; + }; + return { errorMap: customMap, description }; +} +var ZodType = class { + get description() { + return this._def.description; + } + _getType(input) { + return getParsedType(input.data); + } + _getOrReturnCtx(input, ctx) { + return ctx || { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent + }; + } + _processInputParams(input) { + return { + status: new ParseStatus(), + ctx: { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent + } + }; + } + _parseSync(input) { + const result = this._parse(input); + if (isAsync(result)) { + throw new Error("Synchronous parse encountered promise."); + } + return result; + } + _parseAsync(input) { + const result = this._parse(input); + return Promise.resolve(result); + } + parse(data, params) { + const result = this.safeParse(data, params); + if (result.success) + return result.data; + throw result.error; + } + safeParse(data, params) { + const ctx = { + common: { + issues: [], + async: params?.async ?? false, + contextualErrorMap: params?.errorMap + }, + path: params?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const result = this._parseSync({ data, path: ctx.path, parent: ctx }); + return handleResult(ctx, result); + } + "~validate"(data) { + const ctx = { + common: { + issues: [], + async: !!this["~standard"].async + }, + path: [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + if (!this["~standard"].async) { + try { + const result = this._parseSync({ data, path: [], parent: ctx }); + return isValid(result) ? { + value: result.value + } : { + issues: ctx.common.issues + }; + } catch (err) { + if (err?.message?.toLowerCase()?.includes("encountered")) { + this["~standard"].async = true; + } + ctx.common = { + issues: [], + async: true + }; + } + } + return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result) ? { + value: result.value + } : { + issues: ctx.common.issues + }); + } + async parseAsync(data, params) { + const result = await this.safeParseAsync(data, params); + if (result.success) + return result.data; + throw result.error; + } + async safeParseAsync(data, params) { + const ctx = { + common: { + issues: [], + contextualErrorMap: params?.errorMap, + async: true + }, + path: params?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); + const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult)); + return handleResult(ctx, result); + } + refine(check, message) { + const getIssueProperties = (val) => { + if (typeof message === "string" || typeof message === "undefined") { + return { message }; + } else if (typeof message === "function") { + return message(val); + } else { + return message; + } + }; + return this._refinement((val, ctx) => { + const result = check(val); + const setError = () => ctx.addIssue({ + code: ZodIssueCode.custom, + ...getIssueProperties(val) + }); + if (typeof Promise !== "undefined" && result instanceof Promise) { + return result.then((data) => { + if (!data) { + setError(); + return false; + } else { + return true; + } + }); + } + if (!result) { + setError(); + return false; + } else { + return true; + } + }); + } + refinement(check, refinementData) { + return this._refinement((val, ctx) => { + if (!check(val)) { + ctx.addIssue(typeof refinementData === "function" ? refinementData(val, ctx) : refinementData); + return false; + } else { + return true; + } + }); + } + _refinement(refinement) { + return new ZodEffects({ + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "refinement", refinement } + }); + } + superRefine(refinement) { + return this._refinement(refinement); + } + constructor(def) { + this.spa = this.safeParseAsync; + this._def = def; + this.parse = this.parse.bind(this); + this.safeParse = this.safeParse.bind(this); + this.parseAsync = this.parseAsync.bind(this); + this.safeParseAsync = this.safeParseAsync.bind(this); + this.spa = this.spa.bind(this); + this.refine = this.refine.bind(this); + this.refinement = this.refinement.bind(this); + this.superRefine = this.superRefine.bind(this); + this.optional = this.optional.bind(this); + this.nullable = this.nullable.bind(this); + this.nullish = this.nullish.bind(this); + this.array = this.array.bind(this); + this.promise = this.promise.bind(this); + this.or = this.or.bind(this); + this.and = this.and.bind(this); + this.transform = this.transform.bind(this); + this.brand = this.brand.bind(this); + this.default = this.default.bind(this); + this.catch = this.catch.bind(this); + this.describe = this.describe.bind(this); + this.pipe = this.pipe.bind(this); + this.readonly = this.readonly.bind(this); + this.isNullable = this.isNullable.bind(this); + this.isOptional = this.isOptional.bind(this); + this["~standard"] = { + version: 1, + vendor: "zod", + validate: (data) => this["~validate"](data) + }; + } + optional() { + return ZodOptional.create(this, this._def); + } + nullable() { + return ZodNullable.create(this, this._def); + } + nullish() { + return this.nullable().optional(); + } + array() { + return ZodArray.create(this); + } + promise() { + return ZodPromise.create(this, this._def); + } + or(option) { + return ZodUnion.create([this, option], this._def); + } + and(incoming) { + return ZodIntersection.create(this, incoming, this._def); + } + transform(transform) { + return new ZodEffects({ + ...processCreateParams(this._def), + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "transform", transform } + }); + } + default(def) { + const defaultValueFunc = typeof def === "function" ? def : () => def; + return new ZodDefault({ + ...processCreateParams(this._def), + innerType: this, + defaultValue: defaultValueFunc, + typeName: ZodFirstPartyTypeKind.ZodDefault + }); + } + brand() { + return new ZodBranded({ + typeName: ZodFirstPartyTypeKind.ZodBranded, + type: this, + ...processCreateParams(this._def) + }); + } + catch(def) { + const catchValueFunc = typeof def === "function" ? def : () => def; + return new ZodCatch({ + ...processCreateParams(this._def), + innerType: this, + catchValue: catchValueFunc, + typeName: ZodFirstPartyTypeKind.ZodCatch + }); + } + describe(description) { + const This = this.constructor; + return new This({ + ...this._def, + description + }); + } + pipe(target) { + return ZodPipeline.create(this, target); + } + readonly() { + return ZodReadonly.create(this); + } + isOptional() { + return this.safeParse(void 0).success; + } + isNullable() { + return this.safeParse(null).success; + } +}; +var cuidRegex = /^c[^\s-]{8,}$/i; +var cuid2Regex = /^[0-9a-z]+$/; +var ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i; +var uuidRegex = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i; +var nanoidRegex = /^[a-z0-9_-]{21}$/i; +var jwtRegex = /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/; +var durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/; +var emailRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i; +var _emojiRegex = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; +var emojiRegex; +var ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; +var ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/; +var ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; +var ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; +var base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; +var base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/; +var dateRegexSource = `((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))`; +var dateRegex = new RegExp(`^${dateRegexSource}$`); +function timeRegexSource(args) { + let secondsRegexSource = `[0-5]\\d`; + if (args.precision) { + secondsRegexSource = `${secondsRegexSource}\\.\\d{${args.precision}}`; + } else if (args.precision == null) { + secondsRegexSource = `${secondsRegexSource}(\\.\\d+)?`; + } + const secondsQuantifier = args.precision ? "+" : "?"; + return `([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`; +} +function timeRegex(args) { + return new RegExp(`^${timeRegexSource(args)}$`); +} +function datetimeRegex(args) { + let regex = `${dateRegexSource}T${timeRegexSource(args)}`; + const opts = []; + opts.push(args.local ? `Z?` : `Z`); + if (args.offset) + opts.push(`([+-]\\d{2}:?\\d{2})`); + regex = `${regex}(${opts.join("|")})`; + return new RegExp(`^${regex}$`); +} +function isValidIP(ip, version) { + if ((version === "v4" || !version) && ipv4Regex.test(ip)) { + return true; + } + if ((version === "v6" || !version) && ipv6Regex.test(ip)) { + return true; + } + return false; +} +function isValidJWT(jwt, alg) { + if (!jwtRegex.test(jwt)) + return false; + try { + const [header] = jwt.split("."); + if (!header) + return false; + const base64 = header.replace(/-/g, "+").replace(/_/g, "/").padEnd(header.length + (4 - header.length % 4) % 4, "="); + const decoded = JSON.parse(atob(base64)); + if (typeof decoded !== "object" || decoded === null) + return false; + if ("typ" in decoded && decoded?.typ !== "JWT") + return false; + if (!decoded.alg) + return false; + if (alg && decoded.alg !== alg) + return false; + return true; + } catch { + return false; + } +} +function isValidCidr(ip, version) { + if ((version === "v4" || !version) && ipv4CidrRegex.test(ip)) { + return true; + } + if ((version === "v6" || !version) && ipv6CidrRegex.test(ip)) { + return true; + } + return false; +} +var ZodString = class _ZodString extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = String(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.string) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.string, + received: ctx2.parsedType + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check of this._def.checks) { + if (check.kind === "min") { + if (input.data.length < check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + if (input.data.length > check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "length") { + const tooBig = input.data.length > check.value; + const tooSmall = input.data.length < check.value; + if (tooBig || tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + if (tooBig) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message + }); + } else if (tooSmall) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message + }); + } + status.dirty(); + } + } else if (check.kind === "email") { + if (!emailRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "email", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "emoji") { + if (!emojiRegex) { + emojiRegex = new RegExp(_emojiRegex, "u"); + } + if (!emojiRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "emoji", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "uuid") { + if (!uuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "uuid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "nanoid") { + if (!nanoidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "nanoid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "cuid") { + if (!cuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "cuid2") { + if (!cuid2Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid2", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "ulid") { + if (!ulidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ulid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "url") { + try { + new URL(input.data); + } catch { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "url", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "regex") { + check.regex.lastIndex = 0; + const testResult = check.regex.test(input.data); + if (!testResult) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "regex", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "trim") { + input.data = input.data.trim(); + } else if (check.kind === "includes") { + if (!input.data.includes(check.value, check.position)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { includes: check.value, position: check.position }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "toLowerCase") { + input.data = input.data.toLowerCase(); + } else if (check.kind === "toUpperCase") { + input.data = input.data.toUpperCase(); + } else if (check.kind === "startsWith") { + if (!input.data.startsWith(check.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { startsWith: check.value }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "endsWith") { + if (!input.data.endsWith(check.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { endsWith: check.value }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "datetime") { + const regex = datetimeRegex(check); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "datetime", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "date") { + const regex = dateRegex; + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "date", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "time") { + const regex = timeRegex(check); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "time", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "duration") { + if (!durationRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "duration", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "ip") { + if (!isValidIP(input.data, check.version)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ip", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "jwt") { + if (!isValidJWT(input.data, check.alg)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "jwt", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "cidr") { + if (!isValidCidr(input.data, check.version)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cidr", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "base64") { + if (!base64Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "base64", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "base64url") { + if (!base64urlRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "base64url", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + _regex(regex, validation, message) { + return this.refinement((data) => regex.test(data), { + validation, + code: ZodIssueCode.invalid_string, + ...errorUtil.errToObj(message) + }); + } + _addCheck(check) { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + email(message) { + return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); + } + url(message) { + return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); + } + emoji(message) { + return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); + } + uuid(message) { + return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); + } + nanoid(message) { + return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) }); + } + cuid(message) { + return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); + } + cuid2(message) { + return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); + } + ulid(message) { + return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); + } + base64(message) { + return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) }); + } + base64url(message) { + return this._addCheck({ + kind: "base64url", + ...errorUtil.errToObj(message) + }); + } + jwt(options) { + return this._addCheck({ kind: "jwt", ...errorUtil.errToObj(options) }); + } + ip(options) { + return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); + } + cidr(options) { + return this._addCheck({ kind: "cidr", ...errorUtil.errToObj(options) }); + } + datetime(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "datetime", + precision: null, + offset: false, + local: false, + message: options + }); + } + return this._addCheck({ + kind: "datetime", + precision: typeof options?.precision === "undefined" ? null : options?.precision, + offset: options?.offset ?? false, + local: options?.local ?? false, + ...errorUtil.errToObj(options?.message) + }); + } + date(message) { + return this._addCheck({ kind: "date", message }); + } + time(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "time", + precision: null, + message: options + }); + } + return this._addCheck({ + kind: "time", + precision: typeof options?.precision === "undefined" ? null : options?.precision, + ...errorUtil.errToObj(options?.message) + }); + } + duration(message) { + return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); + } + regex(regex, message) { + return this._addCheck({ + kind: "regex", + regex, + ...errorUtil.errToObj(message) + }); + } + includes(value, options) { + return this._addCheck({ + kind: "includes", + value, + position: options?.position, + ...errorUtil.errToObj(options?.message) + }); + } + startsWith(value, message) { + return this._addCheck({ + kind: "startsWith", + value, + ...errorUtil.errToObj(message) + }); + } + endsWith(value, message) { + return this._addCheck({ + kind: "endsWith", + value, + ...errorUtil.errToObj(message) + }); + } + min(minLength, message) { + return this._addCheck({ + kind: "min", + value: minLength, + ...errorUtil.errToObj(message) + }); + } + max(maxLength, message) { + return this._addCheck({ + kind: "max", + value: maxLength, + ...errorUtil.errToObj(message) + }); + } + length(len, message) { + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message) + }); + } + /** + * Equivalent to `.min(1)` + */ + nonempty(message) { + return this.min(1, errorUtil.errToObj(message)); + } + trim() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }] + }); + } + toLowerCase() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }] + }); + } + toUpperCase() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }] + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((ch) => ch.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((ch) => ch.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((ch) => ch.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((ch) => ch.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((ch) => ch.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((ch) => ch.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((ch) => ch.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((ch) => ch.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } + get isCIDR() { + return !!this._def.checks.find((ch) => ch.kind === "cidr"); + } + get isBase64() { + return !!this._def.checks.find((ch) => ch.kind === "base64"); + } + get isBase64url() { + return !!this._def.checks.find((ch) => ch.kind === "base64url"); + } + get minLength() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxLength() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +}; +ZodString.create = (params) => { + return new ZodString({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodString, + coerce: params?.coerce ?? false, + ...processCreateParams(params) + }); +}; +function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = Number.parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", "")); + return valInt % stepInt / 10 ** decCount; +} +var ZodNumber = class _ZodNumber extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(input) { + if (this._def.coerce) { + input.data = Number(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.number) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.number, + received: ctx2.parsedType + }); + return INVALID; + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "int") { + if (!util.isInteger(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: "integer", + received: "float", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "min") { + const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "multipleOf") { + if (floatSafeRemainder(input.data, check.value) !== 0) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "finite") { + if (!Number.isFinite(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_finite, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check) { + return new _ZodNumber({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + int(message) { + return this._addCheck({ + kind: "int", + message: errorUtil.toString(message) + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message) + }); + } + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message) + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || ch.kind === "multipleOf" && util.isInteger(ch.value)); + } + get isFinite() { + let max = null; + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || ch.kind === "int" || ch.kind === "multipleOf") { + return true; + } else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return Number.isFinite(min) && Number.isFinite(max); + } +}; +ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: params?.coerce || false, + ...processCreateParams(params) + }); +}; +var ZodBigInt = class _ZodBigInt extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(input) { + if (this._def.coerce) { + try { + input.data = BigInt(input.data); + } catch { + return this._getInvalidInput(input); + } + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.bigint) { + return this._getInvalidInput(input); + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "min") { + const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check.value, + inclusive: check.inclusive, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check.value, + inclusive: check.inclusive, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "multipleOf") { + if (input.data % check.value !== BigInt(0)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + _getInvalidInput(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.bigint, + received: ctx.parsedType + }); + return INVALID; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check) { + return new _ZodBigInt({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +}; +ZodBigInt.create = (params) => { + return new ZodBigInt({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodBigInt, + coerce: params?.coerce ?? false, + ...processCreateParams(params) + }); +}; +var ZodBoolean = class extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = Boolean(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: params?.coerce || false, + ...processCreateParams(params) + }); +}; +var ZodDate = class _ZodDate extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = new Date(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.date) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.date, + received: ctx2.parsedType + }); + return INVALID; + } + if (Number.isNaN(input.data.getTime())) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_date + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check of this._def.checks) { + if (check.kind === "min") { + if (input.data.getTime() < check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + message: check.message, + inclusive: true, + exact: false, + minimum: check.value, + type: "date" + }); + status.dirty(); + } + } else if (check.kind === "max") { + if (input.data.getTime() > check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + message: check.message, + inclusive: true, + exact: false, + maximum: check.value, + type: "date" + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { + status: status.value, + value: new Date(input.data.getTime()) + }; + } + _addCheck(check) { + return new _ZodDate({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message) + }); + } + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message) + }); + } + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min != null ? new Date(min) : null; + } + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max != null ? new Date(max) : null; + } +}; +ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: params?.coerce || false, + typeName: ZodFirstPartyTypeKind.ZodDate, + ...processCreateParams(params) + }); +}; +var ZodSymbol = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.symbol, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params) + }); +}; +var ZodUndefined = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, + ...processCreateParams(params) + }); +}; +var ZodNull = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.null, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params) + }); +}; +var ZodAny = class extends ZodType { + constructor() { + super(...arguments); + this._any = true; + } + _parse(input) { + return OK(input.data); + } +}; +ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params) + }); +}; +var ZodUnknown = class extends ZodType { + constructor() { + super(...arguments); + this._unknown = true; + } + _parse(input) { + return OK(input.data); + } +}; +ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params) + }); +}; +var ZodNever = class extends ZodType { + _parse(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType + }); + return INVALID; + } +}; +ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params) + }); +}; +var ZodVoid = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.void, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, + ...processCreateParams(params) + }); +}; +var ZodArray = class _ZodArray extends ZodType { + _parse(input) { + const { ctx, status } = this._processInputParams(input); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: tooSmall ? def.exactLength.value : void 0, + maximum: tooBig ? def.exactLength.value : void 0, + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.minLength.message + }); + status.dirty(); + } + } + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.maxLength.message + }); + status.dirty(); + } + } + if (ctx.common.async) { + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result2) => { + return ParseStatus.mergeArray(status, result2); + }); + } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + }); + return ParseStatus.mergeArray(status, result); + } + get element() { + return this._def.type; + } + min(minLength, message) { + return new _ZodArray({ + ...this._def, + minLength: { value: minLength, message: errorUtil.toString(message) } + }); + } + max(maxLength, message) { + return new _ZodArray({ + ...this._def, + maxLength: { value: maxLength, message: errorUtil.toString(message) } + }); + } + length(len, message) { + return new _ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) } + }); + } + nonempty(message) { + return this.min(1, message); + } +}; +ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, + ...processCreateParams(params) + }); +}; +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape + }); + } else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element) + }); + } else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); + } else { + return schema; + } +} +var ZodObject = class _ZodObject extends ZodType { + constructor() { + super(...arguments); + this._cached = null; + this.nonstrict = this.passthrough; + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + this._cached = { shape, keys }; + return this._cached; + } + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.object) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx2.parsedType + }); + return INVALID; + } + const { status, ctx } = this._processInputParams(input); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); + } + } + } + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] } + }); + } + } else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { + addIssueToContext(ctx, { + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys + }); + status.dirty(); + } + } else if (unknownKeys === "strip") { + } else { + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); + } + } else { + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse( + new ParseInputLazyPath(ctx, value, ctx.path, key) + //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data + }); + } + } + if (ctx.common.async) { + return Promise.resolve().then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + alwaysSet: pair.alwaysSet + }); + } + return syncPairs; + }).then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); + }); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get shape() { + return this._def.shape(); + } + strict(message) { + errorUtil.errToObj; + return new _ZodObject({ + ...this._def, + unknownKeys: "strict", + ...message !== void 0 ? { + errorMap: (issue, ctx) => { + const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError; + if (issue.code === "unrecognized_keys") + return { + message: errorUtil.errToObj(message).message ?? defaultError + }; + return { + message: defaultError + }; + } + } : {} + }); + } + strip() { + return new _ZodObject({ + ...this._def, + unknownKeys: "strip" + }); + } + passthrough() { + return new _ZodObject({ + ...this._def, + unknownKeys: "passthrough" + }); + } + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new _ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation + }) + }); + } + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new _ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape() + }), + typeName: ZodFirstPartyTypeKind.ZodObject + }); + return merged; + } + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); + } + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new _ZodObject({ + ...this._def, + catchall: index + }); + } + pick(mask) { + const shape = {}; + for (const key of util.objectKeys(mask)) { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } + } + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + omit(mask) { + const shape = {}; + for (const key of util.objectKeys(this.shape)) { + if (!mask[key]) { + shape[key] = this.shape[key]; + } + } + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); + } + partial(mask) { + const newShape = {}; + for (const key of util.objectKeys(this.shape)) { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; + } else { + newShape[key] = fieldSchema.optional(); + } + } + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + required(mask) { + const newShape = {}; + for (const key of util.objectKeys(this.shape)) { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; + } else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; + } + } + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + keyof() { + return createZodEnum(util.objectKeys(this.shape)); + } +}; +ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +var ZodUnion = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const options = this._def.options; + function handleResults(results) { + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } + } + for (const result of results) { + if (result.result.status === "dirty") { + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } + } + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }), + ctx: childCtx + }; + })).then(handleResults); + } else { + let dirty = void 0; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }); + if (result.status === "valid") { + return result; + } else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; + } + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); + } + } + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; + } + const unionErrors = issues.map((issues2) => new ZodError(issues2)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + } + get options() { + return this._def.options; + } +}; +ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, + ...processCreateParams(params) + }); +}; +var getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); + } else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); + } else if (type instanceof ZodLiteral) { + return [type.value]; + } else if (type instanceof ZodEnum) { + return type.options; + } else if (type instanceof ZodNativeEnum) { + return util.objectValues(type.enum); + } else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); + } else if (type instanceof ZodUndefined) { + return [void 0]; + } else if (type instanceof ZodNull) { + return [null]; + } else if (type instanceof ZodOptional) { + return [void 0, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodNullable) { + return [null, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodBranded) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodReadonly) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodCatch) { + return getDiscriminator(type._def.innerType); + } else { + return []; + } +}; +var ZodDiscriminatedUnion = class _ZodDiscriminatedUnion extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator] + }); + return INVALID; + } + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } else { + return option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + const optionsMap = /* @__PURE__ */ new Map(); + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues.length) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); + } + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); + } + optionsMap.set(value, type); + } + } + return new _ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params) + }); + } +}; +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; + } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; + } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; + } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) { + return { valid: true, data: a }; + } else { + return { valid: false }; + } +} +var ZodIntersection = class extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); + } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }) + ]).then(([left, right]) => handleParsed(left, right)); + } else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + })); + } + } +}; +ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left, + right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, + ...processCreateParams(params) + }); +}; +var ZodTuple = class _ZodTuple extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (ctx.data.length < this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + return INVALID; + } + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + status.dirty(); + } + const items = [...ctx.data].map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }).filter((x) => !!x); + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } else { + return ParseStatus.mergeArray(status, items); + } + } + get items() { + return this._def.items; + } + rest(rest) { + return new _ZodTuple({ + ...this._def, + rest + }); + } +}; +ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + } + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, + ...processCreateParams(params) + }); +}; +var ZodRecord = class _ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get element() { + return this._def.valueType; + } + static create(first, second, third) { + if (second instanceof ZodType) { + return new _ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third) + }); + } + return new _ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second) + }); + } +}; +var ZodMap = class extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.map) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.map, + received: ctx.parsedType + }); + return INVALID; + } + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])) + }; + }); + if (ctx.common.async) { + const finalMap = /* @__PURE__ */ new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + }); + } else { + const finalMap = /* @__PURE__ */ new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + } + } +}; +ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, + ...processCreateParams(params) + }); +}; +var ZodSet = class _ZodSet extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.set) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.set, + received: ctx.parsedType + }); + return INVALID; + } + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.minSize.message + }); + status.dirty(); + } + } + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.maxSize.message + }); + status.dirty(); + } + } + const valueType = this._def.valueType; + function finalizeSet(elements2) { + const parsedSet = /* @__PURE__ */ new Set(); + for (const element of elements2) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); + } + return { status: status.value, value: parsedSet }; + } + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); + if (ctx.common.async) { + return Promise.all(elements).then((elements2) => finalizeSet(elements2)); + } else { + return finalizeSet(elements); + } + } + min(minSize, message) { + return new _ZodSet({ + ...this._def, + minSize: { value: minSize, message: errorUtil.toString(message) } + }); + } + max(maxSize, message) { + return new _ZodSet({ + ...this._def, + maxSize: { value: maxSize, message: errorUtil.toString(message) } + }); + } + size(size, message) { + return this.min(size, message).max(size, message); + } + nonempty(message) { + return this.min(1, message); + } +}; +ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, + ...processCreateParams(params) + }); +}; +var ZodFunction = class _ZodFunction extends ZodType { + constructor() { + super(...arguments); + this.validate = this.implement; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.function) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.function, + received: ctx.parsedType + }); + return INVALID; + } + function makeArgsIssue(args, error) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), en_default].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error + } + }); + } + function makeReturnsIssue(returns, error) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), en_default].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error + } + }); + } + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + const me = this; + return OK(async function(...args) { + const error = new ZodError([]); + const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => { + error.addIssue(makeArgsIssue(args, e)); + throw error; + }); + const result = await Reflect.apply(fn, this, parsedArgs); + const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e) => { + error.addIssue(makeReturnsIssue(result, e)); + throw error; + }); + return parsedReturns; + }); + } else { + const me = this; + return OK(function(...args) { + const parsedArgs = me._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + } + const result = Reflect.apply(fn, this, parsedArgs.data); + const parsedReturns = me._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; + }); + } + } + parameters() { + return this._def.args; + } + returnType() { + return this._def.returns; + } + args(...items) { + return new _ZodFunction({ + ...this._def, + args: ZodTuple.create(items).rest(ZodUnknown.create()) + }); + } + returns(returnType) { + return new _ZodFunction({ + ...this._def, + returns: returnType + }); + } + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + static create(args, returns, params) { + return new _ZodFunction({ + args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params) + }); + } +}; +var ZodLazy = class extends ZodType { + get schema() { + return this._def.getter(); + } + _parse(input) { + const { ctx } = this._processInputParams(input); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); + } +}; +ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, + ...processCreateParams(params) + }); +}; +var ZodLiteral = class extends ZodType { + _parse(input) { + if (input.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } + get value() { + return this._def.value; + } +}; +ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, + ...processCreateParams(params) + }); +}; +function createZodEnum(values, params) { + return new ZodEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodEnum, + ...processCreateParams(params) + }); +} +var ZodEnum = class _ZodEnum extends ZodType { + _parse(input) { + if (typeof input.data !== "string") { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!this._cache) { + this._cache = new Set(this._def.values); + } + if (!this._cache.has(input.data)) { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input.data); + } + get options() { + return this._def.values; + } + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + extract(values, newDef = this._def) { + return _ZodEnum.create(values, { + ...this._def, + ...newDef + }); + } + exclude(values, newDef = this._def) { + return _ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { + ...this._def, + ...newDef + }); + } +}; +ZodEnum.create = createZodEnum; +var ZodNativeEnum = class extends ZodType { + _parse(input) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input); + if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!this._cache) { + this._cache = new Set(util.getValidEnumValues(this._def.values)); + } + if (!this._cache.has(input.data)) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input.data); + } + get enum() { + return this._def.values; + } +}; +ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, + ...processCreateParams(params) + }); +}; +var ZodPromise = class extends ZodType { + unwrap() { + return this._def.type; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.promise, + received: ctx.parsedType + }); + return INVALID; + } + const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { + path: ctx.path, + errorMap: ctx.common.contextualErrorMap + }); + })); + } +}; +ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params) + }); +}; +var ZodEffects = class extends ZodType { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const effect = this._def.effect || null; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } else { + status.dirty(); + } + }, + get path() { + return ctx.path; + } + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data, checkCtx); + if (ctx.common.async) { + return Promise.resolve(processed).then(async (processed2) => { + if (status.value === "aborted") + return INVALID; + const result = await this._def.schema._parseAsync({ + data: processed2, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + }); + } else { + if (status.value === "aborted") + return INVALID; + const result = this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + } + } + if (effect.type === "refinement") { + const executeRefinement = (acc) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } + } + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (!isValid(base)) + return INVALID; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { status: status.value, value: result }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => { + if (!isValid(base)) + return INVALID; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ + status: status.value, + value: result + })); + }); + } + } + util.assertNever(effect); + } +}; +ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, + ...processCreateParams(params) + }); +}; +ZodEffects.createWithPreprocess = (preprocess, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params) + }); +}; +var ZodOptional = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.undefined) { + return OK(void 0); + } + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +}; +ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params) + }); +}; +var ZodNullable = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.null) { + return OK(null); + } + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +}; +ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params) + }); +}; +var ZodDefault = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); + } + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + removeDefault() { + return this._def.innerType; + } +}; +ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" ? params.default : () => params.default, + ...processCreateParams(params) + }); +}; +var ZodCatch = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + } + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx + } + }); + if (isAsync(result)) { + return result.then((result2) => { + return { + status: "valid", + value: result2.status === "valid" ? result2.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + }); + } else { + return { + status: "valid", + value: result.status === "valid" ? result.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + } + } + removeCatch() { + return this._def.innerType; + } +}; +ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, + ...processCreateParams(params) + }); +}; +var ZodNaN = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.nan, + received: ctx.parsedType + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } +}; +ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params) + }); +}; +var BRAND = Symbol("zod_brand"); +var ZodBranded = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + unwrap() { + return this._def.type; + } +}; +var ZodPipeline = class _ZodPipeline extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.common.async) { + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + }; + return handleAsync(); + } else { + const inResult = this._def.in._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value + }; + } else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + } + } + static create(a, b) { + return new _ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline + }); + } +}; +var ZodReadonly = class extends ZodType { + _parse(input) { + const result = this._def.innerType._parse(input); + const freeze = (data) => { + if (isValid(data)) { + data.value = Object.freeze(data.value); + } + return data; + }; + return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result); + } + unwrap() { + return this._def.innerType; + } +}; +ZodReadonly.create = (type, params) => { + return new ZodReadonly({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodReadonly, + ...processCreateParams(params) + }); +}; +function cleanParams(params, data) { + const p = typeof params === "function" ? params(data) : typeof params === "string" ? { message: params } : params; + const p2 = typeof p === "string" ? { message: p } : p; + return p2; +} +function custom(check, _params = {}, fatal) { + if (check) + return ZodAny.create().superRefine((data, ctx) => { + const r = check(data); + if (r instanceof Promise) { + return r.then((r2) => { + if (!r2) { + const params = cleanParams(_params, data); + const _fatal = params.fatal ?? fatal ?? true; + ctx.addIssue({ code: "custom", ...params, fatal: _fatal }); + } + }); + } + if (!r) { + const params = cleanParams(_params, data); + const _fatal = params.fatal ?? fatal ?? true; + ctx.addIssue({ code: "custom", ...params, fatal: _fatal }); + } + return; + }); + return ZodAny.create(); +} +var late = { + object: ZodObject.lazycreate +}; +var ZodFirstPartyTypeKind; +(function(ZodFirstPartyTypeKind2) { + ZodFirstPartyTypeKind2["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind2["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind2["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind2["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind2["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind2["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind2["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind2["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind2["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind2["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind2["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind2["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind2["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind2["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind2["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind2["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind2["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind2["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind2["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind2["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind2["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind2["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind2["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind2["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind2["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind2["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind2["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind2["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind2["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind2["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind2["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind2["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind2["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind2["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind2["ZodPipeline"] = "ZodPipeline"; + ZodFirstPartyTypeKind2["ZodReadonly"] = "ZodReadonly"; +})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); +var instanceOfType = (cls, params = { + message: `Input not instance of ${cls.name}` +}) => custom((data) => data instanceof cls, params); +var stringType = ZodString.create; +var numberType = ZodNumber.create; +var nanType = ZodNaN.create; +var bigIntType = ZodBigInt.create; +var booleanType = ZodBoolean.create; +var dateType = ZodDate.create; +var symbolType = ZodSymbol.create; +var undefinedType = ZodUndefined.create; +var nullType = ZodNull.create; +var anyType = ZodAny.create; +var unknownType = ZodUnknown.create; +var neverType = ZodNever.create; +var voidType = ZodVoid.create; +var arrayType = ZodArray.create; +var objectType = ZodObject.create; +var strictObjectType = ZodObject.strictCreate; +var unionType = ZodUnion.create; +var discriminatedUnionType = ZodDiscriminatedUnion.create; +var intersectionType = ZodIntersection.create; +var tupleType = ZodTuple.create; +var recordType = ZodRecord.create; +var mapType = ZodMap.create; +var setType = ZodSet.create; +var functionType = ZodFunction.create; +var lazyType = ZodLazy.create; +var literalType = ZodLiteral.create; +var enumType = ZodEnum.create; +var nativeEnumType = ZodNativeEnum.create; +var promiseType = ZodPromise.create; +var effectsType = ZodEffects.create; +var optionalType = ZodOptional.create; +var nullableType = ZodNullable.create; +var preprocessType = ZodEffects.createWithPreprocess; +var pipelineType = ZodPipeline.create; +var ostring = () => stringType().optional(); +var onumber = () => numberType().optional(); +var oboolean = () => booleanType().optional(); +var coerce = { + string: (arg) => ZodString.create({ ...arg, coerce: true }), + number: (arg) => ZodNumber.create({ ...arg, coerce: true }), + boolean: (arg) => ZodBoolean.create({ + ...arg, + coerce: true + }), + bigint: (arg) => ZodBigInt.create({ ...arg, coerce: true }), + date: (arg) => ZodDate.create({ ...arg, coerce: true }) +}; +var NEVER = INVALID; + +// src/domain/errors.ts +var TeamError = class extends Error { + code; + constructor(code, message, options) { + super(message, options); + this.name = "TeamError"; + this.code = code; + } + toJSON() { + return serializeTeamError(this); + } +}; +function serializeTeamError(err) { + const out = { name: "TeamError", code: err.code, message: err.message }; + const seen = new WeakSet([err]); + const cause = err.cause; + if (cause !== void 0 && cause !== null) out.cause = serializeCause(cause, seen); + return out; +} +function serializeCause(cause, seen) { + if (!(cause instanceof Error)) return { message: String(cause) }; + if (seen.has(cause)) return { name: cause.name, message: "[circular cause]" }; + seen.add(cause); + if (cause instanceof TeamError) { + const serialized = { + name: "TeamError", + code: cause.code, + message: cause.message + }; + const inner2 = cause.cause; + if (inner2 !== void 0 && inner2 !== null) serialized.cause = serializeCause(inner2, seen); + return serialized; + } + const plain = { name: cause.name, message: cause.message }; + const inner = cause.cause; + if (inner !== void 0 && inner !== null) plain.cause = serializeCause(inner, seen); + return plain; +} + +// src/domain/events.ts +var IMAGE_MEDIA_TYPES = ["png", "jpeg", "webp", "gif"]; +function validateContentBlock(block) { + if (typeof block !== "object" || block === null || Array.isArray(block)) { + throw new Error("content block must be a JSON object"); + } + const b = block; + switch (b.type) { + case "text": + case "reasoning": + if (typeof b.text !== "string") throw new Error(`${String(b.type)} block requires string text`); + return block; + case "image": { + const a = b.attachment; + if (typeof a !== "object" || a === null || Array.isArray(a)) { + throw new Error("image block requires object attachment"); + } + const att = a; + if (typeof att.attachmentId !== "string") throw new Error("image attachment requires string attachmentId"); + if (typeof att.mediaType !== "string" || !IMAGE_MEDIA_TYPES.includes(att.mediaType)) { + throw new Error(`image attachment mediaType must be one of ${IMAGE_MEDIA_TYPES.join("/")}`); + } + if (typeof att.bytes !== "number") throw new Error("image attachment requires number bytes"); + if (typeof att.width !== "number") throw new Error("image attachment requires number width"); + if (typeof att.height !== "number") throw new Error("image attachment requires number height"); + if (att.name !== void 0 && typeof att.name !== "string") { + throw new Error("image attachment name must be a string when present"); + } + return block; + } + case "tool-call": { + if (typeof b.id !== "string") throw new Error("tool-call block requires string id"); + if (typeof b.name !== "string") throw new Error("tool-call block requires string name"); + if (!("arguments" in b)) throw new Error("tool-call block requires arguments"); + return block; + } + case "tool-result": + throw new Error("retired tool-result wrapper is not accepted as Team message content"); + default: + return block; + } +} +var contentBlocksSchema = external_exports.array(external_exports.unknown()).superRefine((blocks, ctx) => { + for (let i = 0; i < blocks.length; i++) { + try { + validateContentBlock(blocks[i]); + } catch (err) { + ctx.addIssue({ + code: external_exports.ZodIssueCode.custom, + path: [i], + message: err instanceof Error ? err.message : String(err) + }); + } + } +}); +var TASK_ID_PATTERN = /^task-(\d+)$/; +function isLooseIdValid(id) { + if (id.length === 0) return false; + const m = id.match(TASK_ID_PATTERN); + if (m && !Number.isSafeInteger(Number(m[1]))) return false; + return true; +} +function taskNumberFromId(id) { + const m = id.match(TASK_ID_PATTERN); + return m ? Number(m[1]) : void 0; +} +var looseIdSchema = external_exports.string().refine(isLooseIdValid, { message: "invalid loose id" }); +var memberSnapshotSchema = external_exports.strictObject({ + id: external_exports.string(), + name: external_exports.string(), + description: external_exports.string(), + provider: external_exports.string(), + context: external_exports.enum(["fresh", "fork"]), + phase: external_exports.enum(["provisioning", "active", "failed"]), + error: external_exports.string().optional() +}); +var taskSnapshotSchema = external_exports.strictObject({ + id: looseIdSchema, + revision: external_exports.number().refine((n) => Number.isSafeInteger(n) && n >= 1, { + message: "revision must be a positive safe integer" + }), + subject: external_exports.string(), + description: external_exports.string(), + status: external_exports.enum(["pending", "in_progress", "completed", "deleted"]), + ownerId: external_exports.string().optional(), + blockedBy: external_exports.array(external_exports.string()), + writeScopes: external_exports.array(external_exports.string()) +}); +var messageSnapshotSchema = external_exports.strictObject({ + id: looseIdSchema, + senderId: external_exports.string(), + senderName: external_exports.string(), + targetId: external_exports.string(), + content: contentBlocksSchema +}); +var TEAM_EVENT_VERSION = 2; +var TEAM_EVENT_TYPES = [ + "team/member", + "team/task", + "team/message/queued", + "team/message/delivered" +]; +var memberEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/member"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + member: memberSnapshotSchema +}); +var taskEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/task"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + task: taskSnapshotSchema +}); +var messageQueuedEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/message/queued"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + message: messageSnapshotSchema +}); +var messageDeliveredEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/message/delivered"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + messageId: external_exports.string(), + targetId: external_exports.string() +}); +var TEAM_EVENT_SCHEMAS = { + "team/member": memberEventSchema, + "team/task": taskEventSchema, + "team/message/queued": messageQueuedEventSchema, + "team/message/delivered": messageDeliveredEventSchema +}; +var LEGACY_EVENT_TYPE_ALIASES = { + "team/message": "team/message/queued" +}; +function selectTeamEvent(raw, teamId) { + if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return { kind: "ignored" }; + const candidate = raw; + const rawType = candidate.type; + if (typeof rawType !== "string") return { kind: "ignored" }; + const eventType = TEAM_EVENT_TYPES.includes(rawType) ? rawType : LEGACY_EVENT_TYPE_ALIASES[rawType]; + if (eventType === void 0) return { kind: "ignored" }; + if (typeof candidate.teamId !== "string" || candidate.teamId !== teamId) { + return { kind: "ignored" }; + } + if (candidate.version !== TEAM_EVENT_VERSION) { + return { kind: "unsupported-version", version: candidate.version }; + } + const normalized = rawType === eventType ? raw : { ...candidate, type: eventType }; + const parsed = TEAM_EVENT_SCHEMAS[eventType].safeParse(normalized); + if (!parsed.success) return { kind: "invalid-payload", type: eventType }; + return { kind: "event", event: parsed.data }; +} +var deliveredIdsSchema = external_exports.preprocess((value) => { + if (!Array.isArray(value)) return value; + return value.map((item) => { + if (typeof item === "string") return item; + if (typeof item === "object" && item !== null && typeof item.messageId === "string") { + return item.messageId; + } + return item; + }); +}, external_exports.array(external_exports.string())); +var teamStateSchema = external_exports.strictObject({ + id: external_exports.string(), + members: external_exports.array(memberSnapshotSchema), + tasks: external_exports.array(taskSnapshotSchema), + messages: external_exports.array(messageSnapshotSchema), + delivered: deliveredIdsSchema, + nextTaskNumber: external_exports.number().refine((n) => Number.isSafeInteger(n) && n >= 1, { + message: "nextTaskNumber must be a positive safe integer" + }), + failure: external_exports.string().optional() +}); + +// src/domain/task-graph.ts +function validateTaskGraph(tasks) { + const byId = new Map(tasks.map((t2) => [t2.id, t2])); + const live = tasks.filter((t2) => t2.status !== "deleted"); + for (const task of live) { + for (const bid of task.blockedBy) { + if (bid === task.id) { + throw new Error(`team task "${task.id}" cannot block itself`); + } + } + } + for (const task of live) { + const seen = /* @__PURE__ */ new Set(); + for (const bid of task.blockedBy) { + if (seen.has(bid)) { + throw new Error(`team task "${task.id}" repeats blocker "${bid}"`); + } + seen.add(bid); + } + } + for (const task of live) { + for (const bid of task.blockedBy) { + const blocker = byId.get(bid); + if (blocker === void 0 || blocker.status === "deleted") { + throw new Error(`blocker task "${bid}" for "${task.id}" is missing or deleted`); + } + } + } + detectCycle(live, byId); +} +function detectCycle(live, byId) { + const WHITE = 0; + const GRAY = 1; + const BLACK = 2; + const color = /* @__PURE__ */ new Map(); + const visit = (task) => { + color.set(task.id, GRAY); + for (const bid of task.blockedBy) { + const blocker = byId.get(bid); + if (blocker === void 0 || blocker.status === "deleted") continue; + const c = color.get(bid) ?? WHITE; + if (c === GRAY) { + throw new Error(`task dependency cycle includes "${bid}"`); + } + if (c === WHITE) visit(blocker); + } + color.set(task.id, BLACK); + }; + for (const task of live) { + if ((color.get(task.id) ?? WHITE) === WHITE) visit(task); + } +} + +// src/domain/task-view.ts +function taskReady(state, task) { + return task.blockedBy.every((bid) => { + const blocker = state.tasks.find((t2) => t2.id === bid); + return blocker !== void 0 && blocker.status === "completed"; + }); +} +function projectTaskView(state, task) { + const view = { + id: task.id, + revision: task.revision, + subject: task.subject, + description: task.description, + status: task.status, + blockedBy: [...task.blockedBy], + writeScopes: [...task.writeScopes], + ready: task.status === "pending" && taskReady(state, task), + writeScopeWarnings: writeScopeWarnings(state, task) + }; + if (task.ownerId !== void 0) { + const ownerName = task.ownerId === state.id ? "lead" : state.members.find((m) => m.id === task.ownerId)?.name; + if (ownerName !== void 0) view.ownerName = ownerName; + } + return view; +} +function writeScopeWarnings(state, task) { + if (task.status !== "in_progress") return []; + const warnings = /* @__PURE__ */ new Set(); + for (const other of state.tasks) { + if (other.id === task.id || other.status !== "in_progress") continue; + if (scopesOverlap(task.writeScopes, other.writeScopes)) { + warnings.add(`write scopes overlap with ${other.id}`); + } + } + return [...warnings]; +} +function scopesOverlap(left, right) { + for (const l of left) { + for (const r of right) { + if (l === r || l.startsWith(r + "/") || r.startsWith(l + "/")) return true; + } + } + return false; +} + +// src/domain/projection.ts +var TEAM_PROJECTION_STATE_VERSION = 4; +function emptyTeamState(rootId) { + return { + id: rootId, + members: [], + tasks: [], + messages: [], + delivered: [], + nextTaskNumber: 1 + }; +} +function failed(state, failure) { + return { ...state, failure }; +} +function applyProjectionEvent(state, raw) { + if (state.failure !== void 0) return state; + const selected = selectTeamEvent(raw, state.id); + switch (selected.kind) { + case "ignored": + return state; + case "unsupported-version": + return failed(state, `unsupported Agent Teams event version ${String(selected.version)}`); + case "invalid-payload": + return failed(state, `persisted Agent Teams ${selected.type} payload is invalid`); + case "event": + return applyCurrentTeamEvent(state, selected.event); + } +} +function applyCurrentTeamEvent(state, event) { + if (state.failure !== void 0) return state; + switch (event.type) { + case "team/member": + return applyMember(state, event.member); + case "team/task": + return applyTask(state, event.task); + case "team/message/queued": + return applyMessageQueued(state, event.message); + case "team/message/delivered": + return applyMessageDelivered(state, event.messageId, event.targetId); + } +} +function applyMember(state, member) { + const prior = state.members.find((m) => m.id === member.id); + if (prior === void 0) { + if (member.phase !== "provisioning") { + return failed(state, `teammate "${member.name}" must begin provisioning`); + } + if (state.members.some((m) => m.name === member.name)) { + return failed(state, `teammate name "${member.name}" is reused by another member`); + } + return { ...state, members: [...state.members, member] }; + } + if (prior.name !== member.name || prior.provider !== member.provider || prior.context !== member.context) { + return failed(state, `teammate "${prior.id}" changed immutable identity fields`); + } + if (prior.phase !== "provisioning" || member.phase !== "active" && member.phase !== "failed") { + return failed( + state, + `teammate "${member.name}" has an invalid ${prior.phase} -> ${member.phase} transition` + ); + } + return { ...state, members: state.members.map((m) => m.id === member.id ? member : m) }; +} +function applyTask(state, task) { + const prior = state.tasks.find((t2) => t2.id === task.id); + const expectedRevision = prior === void 0 ? 1 : prior.revision + 1; + if (task.revision !== expectedRevision) { + return failed( + state, + prior === void 0 ? `team task "${task.id}" must begin at revision 1` : `team task "${task.id}" revision is not contiguous` + ); + } + const tasks = prior === void 0 ? [...state.tasks, task] : state.tasks.map((t2) => t2.id === task.id ? task : t2); + try { + validateTaskGraph(tasks); + } catch (err) { + return failed(state, err instanceof Error ? err.message : String(err)); + } + let nextTaskNumber = state.nextTaskNumber; + const n = taskNumberFromId(task.id); + if (n !== void 0) { + nextTaskNumber = Math.max(state.nextTaskNumber, Math.min(n + 1, Number.MAX_SAFE_INTEGER)); + } + return { ...state, tasks, nextTaskNumber }; +} +function applyMessageQueued(state, message) { + if (state.messages.some((m) => m.id === message.id)) { + return failed(state, `team message "${message.id}" was queued twice`); + } + return { ...state, messages: [...state.messages, message] }; +} +function applyMessageDelivered(state, messageId, targetId) { + const queued = state.messages.find((m) => m.id === messageId); + if (queued === void 0) { + return failed(state, `team message "${messageId}" was delivered before queueing`); + } + if (queued.targetId !== targetId) { + return failed(state, `team message "${messageId}" target changed`); + } + if (state.delivered.includes(messageId)) { + return failed(state, `team message "${messageId}" was delivered twice`); + } + return { ...state, delivered: [...state.delivered, messageId] }; +} +var viewCache = /* @__PURE__ */ new WeakMap(); +function teamProjectionView(state) { + let byTasks = viewCache.get(state.members); + if (byTasks === void 0) { + byTasks = /* @__PURE__ */ new WeakMap(); + viewCache.set(state.members, byTasks); + } + let entry = byTasks.get(state.tasks); + if (entry === void 0) { + const members = [ + { id: state.id, name: "lead", role: "lead", phase: "active" }, + ...state.members.map((m) => ({ id: m.id, name: m.name, role: "teammate", phase: m.phase, ...m.error !== void 0 ? { error: m.error } : {} })) + ]; + const tasks = state.tasks.filter((t2) => t2.status !== "deleted").map((t2) => projectTaskView(state, t2)); + entry = { healthy: { members, tasks } }; + byTasks.set(state.tasks, entry); + } + if (state.failure === void 0) return entry.healthy; + if (entry.failed === void 0) { + entry.failed = { ...entry.healthy, failure: state.failure }; + } + return entry.failed; +} + +// src/coord/replay.ts +var checkpointDocSchema = external_exports.strictObject({ + kind: external_exports.literal("agent-team-checkpoint"), + stateVersion: external_exports.literal(TEAM_PROJECTION_STATE_VERSION), + lastSeq: external_exports.number().int().nonnegative(), + lastOffset: external_exports.number().int().nonnegative(), + savedAt: external_exports.string(), + state: teamStateSchema, + view: external_exports.unknown() +}); +function checkpointPath(teamDir) { + return path.join(teamDir, "checkpoint.json"); +} +async function load(teamDir, teamId) { + const startedAt = Date.now(); + const eventsFile = path.join(teamDir, "events.jsonl"); + const raw = readBufferOrEmpty(eventsFile); + let checkpointIgnored; + let doc; + try { + const rawDoc = fs.readFileSync(checkpointPath(teamDir), "utf8"); + const parsed = checkpointDocSchema.safeParse(JSON.parse(rawDoc)); + if (!parsed.success) { + checkpointIgnored = `checkpoint invalid: ${parsed.error.issues[0]?.message ?? "schema mismatch"}`; + } else if (parsed.data.state.id !== teamId) { + checkpointIgnored = `checkpoint teamId mismatch (${parsed.data.state.id} != ${teamId})`; + } else { + doc = parsed.data; + } + } catch { + } + const writers = []; + let state = emptyTeamState(teamId); + let seq = 0; + let fromCheckpoint = false; + let corrupt; + if (doc !== void 0) { + const tail = raw.subarray(doc.lastOffset); + const first = firstLineBytes(tail); + if (tail.length > 0 && first === void 0) { + checkpointIgnored = "checkpoint offset desync (tail not line-aligned) \u2014 full replay"; + } else if (first !== void 0 && JSON.parse(first.parsed).seq !== doc.lastSeq + 1) { + checkpointIgnored = "checkpoint offset desync (seq continuity broken) \u2014 full replay"; + } else { + state = doc.state; + seq = doc.lastSeq; + fromCheckpoint = true; + } + } + const startOffset = fromCheckpoint && doc !== void 0 ? doc.lastOffset : 0; + let offset = startOffset; + let consumeRest = true; + while (consumeRest && offset < raw.length) { + const nl = raw.indexOf(10, offset); + if (nl === -1) { + corrupt = { line: seq + 1, reason: "trailing partial line (no newline)" }; + state = withFailure(state, raw.subarray(offset).toString("utf8")); + seq += 1; + consumeRest = false; + break; + } + const lineText = raw.subarray(offset, nl).toString("utf8"); + const lineNo = seq + 1; + offset = nl + 1; + if (lineText.length === 0) { + corrupt = { line: lineNo, reason: "empty line" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + let parsed; + try { + parsed = JSON.parse(lineText); + } catch { + corrupt = { line: lineNo, reason: "invalid JSON" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + const line = parsed; + if (typeof line.writer === "string" && !writers.includes(line.writer)) writers.push(line.writer); + if (typeof parsed !== "object" || parsed === null || typeof parsed.seq !== "number" || !("event" in parsed) || parsed.seq !== lineNo) { + corrupt = { line: lineNo, reason: "line shape invalid or seq discontinuous" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + state = applyProjectionEvent(state, line.event); + seq = lineNo; + if (state.failure !== void 0) { + consumeRest = false; + } + } + return { + state, + view: teamProjectionView(state), + seq, + fromCheckpoint, + checkpointIgnored, + corrupt, + writers, + replayMs: Date.now() - startedAt + }; +} +function readBufferOrEmpty(file) { + try { + return fs.readFileSync(file); + } catch { + return Buffer.alloc(0); + } +} +function firstLineBytes(buf) { + const nl = buf.indexOf(10); + const first = (nl === -1 ? buf : buf.subarray(0, nl)).toString("utf8"); + if (first.length === 0) return void 0; + try { + JSON.parse(first); + return { parsed: first }; + } catch { + return void 0; + } +} +function withFailure(state, rawLine) { + const m = rawLine.match(/"type"\s*:\s*"(team\/[A-Za-z/-]+)"/); + const type = m?.[1] ?? "stream"; + return { ...state, failure: `persisted Agent Teams ${type} payload is invalid` }; +} + +// src/cli/state.ts +function renderState(input, paint) { + const { teamId, loaded, json } = input; + if (json) { + return JSON.stringify( + { + teamId, + seq: loaded.seq, + fromCheckpoint: loaded.fromCheckpoint, + checkpointIgnored: loaded.checkpointIgnored, + corrupt: loaded.corrupt, + writers: loaded.writers, + replayMs: loaded.replayMs, + failure: loaded.state.failure, + view: loaded.view, + mailbox: { + messages: loaded.state.messages, + delivered: loaded.state.delivered + } + }, + null, + 2 + ); + } + const lines = []; + const mode = loaded.fromCheckpoint ? "checkpoint+tail" : "full-replay"; + lines.push( + `${paint.bold(`Agent Team ${teamId}`)} seq ${loaded.seq} ${paint.dim(`${mode} \xB7 ${loaded.replayMs}ms \xB7 writers ${loaded.writers.length}`)}` + ); + if (loaded.corrupt !== void 0) { + lines.push(paint.red(`\u26A0 \u65E5\u5FD7\u635F\u574F fail-closed\uFF08\u884C ${loaded.corrupt.line}\uFF09\uFF1A${loaded.corrupt.reason}`)); + } + if (loaded.state.failure !== void 0) { + lines.push(paint.red(`\u26A0 FAILURE\uFF08\u7EC8\u6001\uFF0C\u540E\u7EED\u5408\u6CD5\u4E8B\u4EF6\u4E0D\u518D\u6539\u53D8\u89C6\u56FE\uFF09\uFF1A${loaded.state.failure}`)); + } + const members = loaded.view.members; + lines.push(""); + lines.push(paint.bold(`Roster (${members.length})`)); + if (members.length === 0) { + lines.push(paint.dim(" \uFF08\u7A7A\uFF09")); + } else { + lines.push(` ${pad("NAME", 16)}${pad("ROLE", 10)}PHASE`); + for (const m of members) { + const row = ` ${pad(m.name, 16)}${pad(m.role, 10)}${m.phase}`; + lines.push(m.error !== void 0 ? paint.red(`${row} \u26A0 ${m.error}`) : row); + } + } + const tasks = loaded.view.tasks; + lines.push(""); + lines.push(paint.bold(`Tasks (${tasks.length})`)); + if (tasks.length === 0) { + lines.push(paint.dim(" \uFF08\u6682\u65E0\u4EFB\u52A1\uFF09")); + } else { + lines.push(` ${pad("ID", 10)}${pad("STATUS", 12)}${pad("OWNER", 12)}${pad("REV", 5)}${pad("READY", 7)}SUBJECT`); + for (const t2 of tasks) { + const owner = t2.ownerName ?? "\u2014"; + const statusCell = pad(t2.status, 12); + const status = t2.status === "completed" ? paint.green(statusCell) : t2.status === "in_progress" ? paint.yellow(statusCell) : statusCell; + lines.push(` ${pad(t2.id, 10)}${status}${pad(owner, 12)}${pad(String(t2.revision), 5)}${pad(String(t2.ready), 7)}${t2.subject}`); + if (t2.blockedBy.length > 0) lines.push(paint.dim(` ${" ".repeat(34)}blockedBy: ${t2.blockedBy.join(", ")}`)); + } + } + const deliveredIds = new Set(loaded.state.delivered); + const pending = loaded.state.messages.filter((m) => !deliveredIds.has(m.id)); + lines.push(""); + lines.push(paint.bold(`Mailbox\uFF08pending ${pending.length} / delivered ${loaded.state.delivered.length}\uFF09`)); + if (loaded.state.messages.length === 0) { + lines.push(paint.dim(" \uFF08\u90AE\u7BB1\u7A7A\u95F2\uFF09")); + } else { + for (const m of loaded.state.messages) { + const state = deliveredIds.has(m.id) ? paint.green("delivered") : paint.yellow("queued"); + lines.push(` ${m.id} ${m.senderName} \u2192 ${targetLabel(loaded, m.targetId)} [${state}]`); + } + } + return lines.join("\n"); +} +function targetLabel(loaded, targetId) { + if (targetId === loaded.state.id) return "lead"; + return loaded.view.members.find((m) => m.id === targetId)?.name ?? targetId; +} +function pad(text, width) { + return text.length >= width ? text + " " : text + " ".repeat(width - text.length); +} + +// src/cli/tail.ts +import fs2 from "node:fs"; +import path2 from "node:path"; +function formatTailLine(input, paint) { + if (input.kind === "invalid") { + return paint.red(`!! \u65E0\u6CD5\u89E3\u6790\u7684\u884C\uFF1A${input.raw.slice(0, 160)}`); + } + const { line } = input; + const time = localTime(line.ts); + const summary = summarize(line); + const type = line.event.type; + const coloredType = type === "team/member" ? paint.cyan(type) : type === "team/task" ? paint.yellow(type) : type === "team/message/queued" || type === "team/message" ? paint.magenta(type) : type === "team/message/delivered" ? paint.green(type) : paint.dim(type); + return `${paint.dim(time)} ${paint.bold(String(line.seq).padStart(4))} ${coloredType} ${summary} ${paint.dim(line.writer)}`; +} +function summarize(line) { + const e = line.event; + if (e.type === "team/member" && e.member !== void 0) { + return `${e.member.name} (${e.member.id}) \u2192 ${e.member.phase}`; + } + if (e.type === "team/task" && e.task !== void 0) { + return `${e.task.id} ${e.task.subject ?? ""} [${e.task.status ?? "?"} r${e.task.revision ?? "?"}]`; + } + if ((e.type === "team/message/queued" || e.type === "team/message") && e.message !== void 0) { + return `${e.message.id} ${e.message.senderName} \u2192 ${e.message.targetId}`; + } + if (e.type === "team/message/delivered") { + return `${e.messageId} \u2192 ${e.targetId}`; + } + return JSON.stringify(e); +} +function localTime(iso) { + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return "invalid-ts"; + const hh = String(d.getHours()).padStart(2, "0"); + const mm = String(d.getMinutes()).padStart(2, "0"); + const ss = String(d.getSeconds()).padStart(2, "0"); + const ms = String(d.getMilliseconds()).padStart(3, "0"); + return `${hh}:${mm}:${ss}.${ms}`; +} +async function followEvents(eventsFile, opts) { + const paint = opts.paint; + const pollMs = opts.pollMs ?? 250; + let offset = 0; + let buffer = ""; + if (!fs2.existsSync(eventsFile)) { + throw new Error(`events file not found: ${eventsFile}`); + } + const history = fs2.readFileSync(eventsFile, "utf8"); + const lines = history.split("\n").filter((l) => l.length > 0); + const start = opts.fromLines !== void 0 ? Math.max(0, lines.length - opts.fromLines) : lines.length; + const emit = (raw) => { + try { + const parsed = JSON.parse(raw); + opts.onLine(formatTailLine({ kind: "line", line: parsed }, paint), { kind: "line", line: parsed }); + } catch { + opts.onLine(formatTailLine({ kind: "invalid", raw }, paint), { kind: "invalid", raw }); + } + }; + for (const raw of lines.slice(start)) { + emit(raw); + } + offset = Buffer.byteLength(history, "utf8"); + for (; ; ) { + if (opts.signal?.aborted) return; + await new Promise((resolve) => setTimeout(resolve, pollMs)); + const stat = fs2.statSync(eventsFile); + if (stat.size < offset) { + offset = 0; + buffer = ""; + } + if (stat.size > offset) { + const slack = 1 << 16; + const chunk = Buffer.alloc(slack); + const fd = fs2.openSync(eventsFile, "r"); + try { + const bytesRead = fs2.readSync(fd, chunk, 0, slack, offset); + if (bytesRead > 0) { + buffer += chunk.toString("utf8", 0, bytesRead); + let nl; + while ((nl = buffer.indexOf("\n")) !== -1) { + const raw = buffer.slice(0, nl); + buffer = buffer.slice(nl + 1); + if (raw.length > 0) emit(raw); + } + offset += bytesRead; + } + } finally { + fs2.closeSync(fd); + } + } + } +} +function eventsFileOf(teamDir) { + return path2.join(teamDir, "events.jsonl"); +} + +// src/cli/inject.ts +import fs3 from "node:fs"; +import path3 from "node:path"; +function injectEvent(teamDir, rawLine, opts = {}) { + const eventsFile = path3.join(teamDir, "events.jsonl"); + fs3.mkdirSync(teamDir, { recursive: true }); + const existing = fs3.existsSync(eventsFile) ? fs3.readFileSync(eventsFile, "utf8") : ""; + const lineCount = existing.length === 0 ? 0 : existing.split("\n").filter((l) => l.length > 0).length; + let parsed; + try { + parsed = JSON.parse(rawLine); + } catch { + throw new Error(`inject-event: \u53C2\u6570\u5FC5\u987B\u662F\u5408\u6CD5 JSON \u884C\uFF0C\u6536\u5230\uFF1A${rawLine.slice(0, 120)}`); + } + const line = JSON.stringify({ + seq: lineCount + 1, + ts: (/* @__PURE__ */ new Date()).toISOString(), + writer: opts.writer ?? "team-ctl:inject", + ...parsed + }); + fs3.appendFileSync(eventsFile, line + "\n", { mode: 384 }); + return { seq: lineCount + 1, line, file: eventsFile }; +} +function invalidMemberSample(teamId) { + return JSON.stringify({ + event: { + type: "team/member", + version: 2, + teamId, + member: { id: "sess-injected-ghost", name: "ghost", description: "injected", provider: "spawn", context: "fresh", phase: "active" } + } + }); +} + +// src/coord/rpc.ts +import net from "node:net"; +import fs5 from "node:fs"; +import path5 from "node:path"; + +// src/coord/paths.ts +import { createHash } from "node:crypto"; +import fs4 from "node:fs"; +import path4 from "node:path"; +import os from "node:os"; +var MAX_SOCKET_PATH = 96; +function resolveSocketPath(teamDir) { + const candidate = path4.join(teamDir, "coordinator.sock"); + if (candidate.length <= MAX_SOCKET_PATH) { + return { socketPath: candidate, fallback: false, registryFile: path4.join(teamDir, "socket.path") }; + } + const hash = createHash("sha256").update(candidate).digest("hex").slice(0, 16); + const tmpRoot = fs4.realpathSync(os.tmpdir()); + const fallbackDir = path4.join(tmpRoot, "agent-team-sockets"); + fs4.mkdirSync(fallbackDir, { recursive: true, mode: 448 }); + try { + fs4.chmodSync(fallbackDir, 448); + } catch { + } + const fallbackPath = path4.join(fallbackDir, `at-${hash}.sock`); + return { socketPath: fallbackPath, fallback: true, registryFile: path4.join(teamDir, "socket.path") }; +} +function discoverSocketPath(teamDir) { + const registryFile = path4.join(teamDir, "socket.path"); + try { + const registered = fs4.readFileSync(registryFile, "utf8").trim(); + if (registered.length > 0) return registered; + } catch { + } + return resolveSocketPath(teamDir).socketPath; +} + +// src/coord/rpc.ts +var COORDINATOR_UNAVAILABLE_MESSAGE = "Agent Teams coordinator is unavailable (between coordinators); retry the request shortly"; +var MAX_RPC_BUFFER_BYTES = 1 << 20; +var RpcClient = class _RpcClient { + constructor(socket, token = void 0, nextId = 1, pending = /* @__PURE__ */ new Map(), maxFrameBytes = MAX_RPC_BUFFER_BYTES) { + this.socket = socket; + this.token = token; + this.nextId = nextId; + this.pending = pending; + this.maxFrameBytes = maxFrameBytes; + } + maxFrameBytes; + static async connect(socketPath, opts = {}) { + const timeoutMs = opts.timeoutMs ?? 3e3; + const socket = await new Promise((resolve, reject) => { + const s = net.connect(socketPath, () => resolve(s)); + s.setEncoding("utf8"); + const timer = setTimeout(() => { + s.destroy(); + reject(new Error(`rpc connect timeout after ${timeoutMs}ms: ${socketPath}`)); + }, timeoutMs); + s.once("error", (err) => { + clearTimeout(timer); + reject(err); + }); + resolveSocketOnConnect(s, () => clearTimeout(timer)); + }); + const client = new _RpcClient(socket, opts.token, 1, /* @__PURE__ */ new Map(), opts.maxFrameBytes); + socket.on("data", (chunk) => client.onData(chunk)); + socket.on("close", () => client.failAll(new Error("rpc connection closed"))); + socket.on("error", (err) => client.failAll(err)); + return client; + } + async call(method, params, opts = {}) { + const id = this.nextId++; + const timeoutMs = opts.timeoutMs ?? 15e3; + if (opts.signal?.aborted) { + return Promise.reject( + new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal.reason)}`) + ); + } + const payload = JSON.stringify({ id, method, params, ...this.token !== void 0 ? { token: this.token } : {} }) + "\n"; + return new Promise((resolve, reject) => { + let settled = false; + let timer; + const finish = (fn) => { + if (settled) return; + settled = true; + clearTimeout(timer); + opts.signal?.removeEventListener("abort", onAbort); + this.pending.delete(id); + fn(); + }; + const onAbort = () => { + finish( + () => reject(new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal?.reason)}`)) + ); + this.socket.destroy(); + }; + timer = setTimeout(() => { + finish(() => reject(new Error(`rpc call ${method} timed out after ${timeoutMs}ms`))); + }, timeoutMs); + this.pending.set(id, { + resolve: (v) => finish(() => resolve(v)), + reject: (e) => finish(() => reject(e)) + }); + opts.signal?.addEventListener("abort", onAbort, { once: true }); + this.socket.write(payload, (err) => { + if (err) finish(() => reject(err)); + }); + }); + } + close() { + this.socket.destroy(); + } + onData(chunk) { + this.buffer += chunk; + if (Buffer.byteLength(this.buffer, "utf8") > this.maxFrameBytes) { + this.failAll(new Error(`rpc response frame exceeds ${this.maxFrameBytes} bytes`)); + this.socket.destroy(); + return; + } + let nl; + while ((nl = this.buffer.indexOf("\n")) !== -1) { + const line = this.buffer.slice(0, nl); + this.buffer = this.buffer.slice(nl + 1); + if (line.trim().length === 0) continue; + try { + this.onResponse(JSON.parse(line)); + } catch { + this.failAll(new Error("invalid rpc response frame")); + } + } + } + buffer = ""; + onResponse(res) { + const entry = this.pending.get(res.id); + if (entry === void 0) return; + this.pending.delete(res.id); + if (res.ok) { + entry.resolve(res.result); + } else if (res.error?.code !== void 0) { + entry.reject(new TeamError(res.error.code, res.error.message)); + } else { + const err = new Error(res.error?.message ?? "rpc error"); + if (res.error?.name) err.name = res.error.name; + entry.reject(err); + } + } + failAll(err) { + for (const [, entry] of this.pending) entry.reject(err); + this.pending.clear(); + } +}; +function resolveSocketOnConnect(socket, onConnected) { + socket.once("connect", onConnected); +} +function rpcTokenPath(teamDir) { + return path5.join(teamDir, "rpc.token"); +} +function readRpcToken(teamDir) { + try { + const token = fs5.readFileSync(rpcTokenPath(teamDir), "utf8").trim(); + return token.length > 0 ? token : void 0; + } catch { + return void 0; + } +} +function coordinatorUnavailableError(detail) { + return new TeamError("TEAM_DISPOSED", COORDINATOR_UNAVAILABLE_MESSAGE, { cause: detail }); +} +function abortReasonText(reason) { + if (reason instanceof Error) return reason.message; + if (reason === void 0 || reason === null) return "aborted"; + return String(reason); +} +async function callCoordinator(teamDir, teamId, method, params, opts = {}) { + const socketPath = discoverSocketPath(teamDir); + const token = readRpcToken(teamDir); + const client = await RpcClient.connect(socketPath, { + timeoutMs: opts.connectTimeoutMs ?? 1e3, + ...token !== void 0 ? { token } : {} + }).catch((err) => { + throw coordinatorUnavailableError(`socket ${socketPath}: ${err.code ?? err.message}`); + }); + try { + return await client.call(method, params, { + timeoutMs: opts.timeoutMs, + ...opts.signal !== void 0 ? { signal: opts.signal } : {} + }); + } finally { + client.close(); + } +} + +// src/cli/call.ts +async function callTeam(teamDir, method, paramsJson) { + let params = {}; + if (paramsJson !== void 0 && paramsJson.trim().length > 0) { + try { + params = JSON.parse(paramsJson); + } catch (err) { + return { + ok: false, + output: `call: params \u4E0D\u662F\u5408\u6CD5 JSON\uFF08${err instanceof Error ? err.message : String(err)}\uFF09`, + audit: JSON.stringify({ tool: "team-ctl", action: "call", teamDir, method, ok: false, reason: "bad-params" }) + }; + } + } + try { + const result = await callCoordinator(teamDir, "", method, params, { timeoutMs: 1e4 }); + return { + ok: true, + output: JSON.stringify(result, null, 2), + audit: JSON.stringify({ tool: "team-ctl", action: "call", teamDir, method, ok: true }) + }; + } catch (err) { + const summary = err instanceof TeamError ? `[${err.code}] ${err.message}` : err instanceof Error && err.message === COORDINATOR_UNAVAILABLE_MESSAGE ? COORDINATOR_UNAVAILABLE_MESSAGE : err instanceof Error ? err.message.split("\n")[0] : String(err); + return { + ok: false, + output: `call ${method} \u5931\u8D25\uFF1A${summary}`, + audit: JSON.stringify({ + tool: "team-ctl", + action: "call", + teamDir, + method, + ok: false, + code: err instanceof TeamError ? err.code : void 0 + }) + }; + } +} + +// src/cli/colors.ts +function paintFor(stream) { + const enabled = process.env.FORCE_COLOR === "1" || stream.isTTY === true && process.env.NO_COLOR === void 0; + const wrap = (code) => (text) => enabled ? `\x1B[${code}m${text}\x1B[0m` : text; + return { + enabled, + cyan: wrap("36"), + yellow: wrap("33"), + magenta: wrap("35"), + green: wrap("32"), + red: wrap("31"), + bold: wrap("1"), + dim: wrap("2") + }; +} +function paintForStream(stream) { + return paintFor({ isTTY: stream.isTTY }); +} + +// src/cli/ui.ts +import fs9 from "node:fs"; +import path10 from "node:path"; + +// src/provider/transcript.ts +import fs6 from "node:fs"; +import os2 from "node:os"; +import path6 from "node:path"; +import { DatabaseSync } from "node:sqlite"; + +// src/provider/model-selection.ts +function parseModelSelection(value) { + if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0; + const record = value; + const providerId = nonEmptyString(record.providerId); + const modelId = nonEmptyString(record.modelId); + if (providerId === void 0 || modelId === void 0) return void 0; + const options = record.options; + if (options !== void 0 && (typeof options !== "object" || options === null || Array.isArray(options))) { + return void 0; + } + let reasoningLevel; + const rawLevel = options !== void 0 ? options.reasoningLevel : record.reasoningLevel; + if (rawLevel !== void 0) { + reasoningLevel = nonEmptyString(rawLevel); + if (reasoningLevel === void 0) return void 0; + } + return { providerId, modelId, ...reasoningLevel !== void 0 ? { reasoningLevel } : {} }; +} +function nonEmptyString(value) { + if (typeof value !== "string") return void 0; + const trimmed = value.trim(); + return trimmed.length > 0 ? trimmed : void 0; +} + +// src/provider/transcript.ts +function defaultDbPath() { + return process.env.TEAM_DB_PATH ?? path6.join(os2.homedir(), ".zcode", "cli", "db", "db.sqlite"); +} +var TranscriptReader = class { + dbPath; + db = null; + dbMissing = false; + constructor(deps = {}) { + this.dbPath = deps.dbPath ?? defaultDbPath(); + } + get path() { + return this.dbPath; + } + /** 库不存在 = 空库语义(探针方法走缺省值,不建临时库)。 */ + missing() { + if (!this.dbMissing) this.dbMissing = !fs6.existsSync(this.dbPath); + else if (!fs6.existsSync(this.dbPath)) return true; + else this.dbMissing = false; + return this.dbMissing; + } + open() { + if (this.db !== null) return this.db; + if (!fs6.existsSync(this.dbPath)) { + throw new Error("transcript db missing"); + } + this.db = new DatabaseSync(this.dbPath, { readOnly: true }); + return this.db; + } + close() { + this.db?.close(); + this.db = null; + } + /** 会话行实查;不存在 → undefined;读失败 → 抛错。 */ + session(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + "SELECT id, parent_id, directory, task_type, title, time_created FROM session WHERE id = ?" + ).get(sessionId); + return row ?? void 0; + } + /** 找「目录 = cwd 且创建于 sinceMs 之后、首条真实用户文本 = firstPrompt」的会话(fresh spawn 探针)。 */ + findSessionByFirstPrompt(args) { + if (this.missing()) return void 0; + const rows = this.open().prepare( + "SELECT id, time_created FROM session WHERE directory = ? AND time_created >= ? ORDER BY time_created ASC" + ).all(args.cwd, args.sinceMs - 2e3); + for (const row of rows) { + if (args.excludeSessionIds?.has(row.id)) continue; + const first = this.firstRealUserText(row.id); + if (first === args.firstPrompt) return row.id; + } + return void 0; + } + /** 首条「真实用户」消息的文本部分(跳过 hook/系统注入的 model-only 消息)。 */ + firstRealUserText(sessionId) { + if (this.missing()) return null; + const rows = this.open().prepare( + `SELECT p.data pdata FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + ORDER BY m.sequence, p.sequence LIMIT 1` + ).all(sessionId); + if (rows.length === 0) return null; + return extractText(rows[0].pdata); + } + /** 会话中是否已存在该文本的「真实用户」消息(delivered/去重探针:prompt 逐字落库)。 */ + hasUserText(sessionId, text) { + if (this.missing()) return false; + const row = this.open().prepare( + `SELECT COUNT(*) n FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + AND json_extract(p.data,'$.text') = ? LIMIT 1` + ).get(sessionId, text); + return row.n > 0; + } + /** 会话全部「真实用户」文本消息(时间序;轮次 prompt 审计/恰一次检索用)。 */ + realUserTexts(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.id mid, m.time_created tc, p.data pdata, + json_extract(m.data,'$.semantics.origin') origin, + json_extract(m.data,'$.modelSelection.modelId') model + FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + return rows.map((r) => ({ + messageId: r.mid, + text: extractText(r.pdata) ?? "", + timeCreated: r.tc, + origin: r.origin, + modelId: r.model + })); + } + /** 会话最新使用的模型(成员行 model 字段实查;无消息 → undefined)。 */ + latestModel(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT json_extract(m.data,'$.modelSelection.modelId') model FROM message m + WHERE m.session_id = ? AND json_extract(m.data,'$.modelSelection.modelId') IS NOT NULL + ORDER BY m.sequence DESC LIMIT 1` + ).get(sessionId); + return row?.model; + } + /** + * 最近一条「真实用户提交」(semantics.origin=real_user)消息携带的模型快照 + 提交时间。 + * 0.4.0 三源判定的「提交证据」:宿主保存用户消息时写入该次提交的 modelSelection(本机源码核对), + * 输入框切换在提交瞬间即体现在这里——不依赖会话选模条目(issue #7 场景它可能滞后)。 + * hook/系统注入的 user 消息(origin≠real_user)不算提交。 + */ + latestSubmissionSelection(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT m.time_created tc, + json_extract(m.data,'$.modelSelection.providerId') p, + json_extract(m.data,'$.modelSelection.modelId') mo, + json_extract(m.data,'$.modelSelection.options.reasoningLevel') lvl + FROM message m + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(m.data,'$.modelSelection.providerId') IS NOT NULL + AND json_extract(m.data,'$.modelSelection.modelId') IS NOT NULL + ORDER BY m.time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.p.trim(); + const modelId = row.mo.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const lvl = typeof row.lvl === "string" ? row.lvl.trim() : ""; + return { + selection: { providerId, modelId, ...lvl.length > 0 ? { reasoningLevel: lvl } : {} }, + at: row.tc + }; + } + /** 会话选模条目 + 生效时间(UPSERT 单行;用于与提交快照比较「后来是否有 /model 修改」)。 */ + latestModelSelectionTimed(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT data, MAX(COALESCE(time_updated, time_created), time_created) at FROM session_entry + WHERE session_id = ? AND type = 'runtime/model_selection' + ORDER BY time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const selection = this.latestModelSelection(sessionId); + if (selection === void 0) return void 0; + return { selection, at: row.at }; + } + /** + * 最近一次**主轮**实际模型调用(+ 开始时间)。query_source='main_turn' 过滤是 0.4.0 关键口径: + * compact/标题生成/goal 摘要/subagent/workflow 子轮的行属于辅助模型,绝不能当作 Lead 当前模型 + * (实测本机取值域 = compact, goal_summary_title, main_turn, session_title, subagent, + * target_completion_verification, workflow_child)。 + */ + latestMainTurnUsage(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT provider_id, model_id, variant, started_at FROM model_usage + WHERE session_id = ? AND query_source = 'main_turn' + ORDER BY started_at DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.provider_id.trim(); + const modelId = row.model_id.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const variant = typeof row.variant === "string" ? row.variant.trim() : ""; + return { + selection: { providerId, modelId, ...variant.length > 0 ? { reasoningLevel: variant } : {} }, + at: row.started_at + }; + } + /** + * 会话库中最近一次 setModel 的选择(Round A 实证:条目为 UPSERT 单行,canonical id + * `:runtime-model-selection`,时间排序安全)。data 取嵌套 modelSelection 优先; + * 兼容旧行把 providerId/modelId/thoughtLevel 平铺在顶层的形态。 + */ + latestModelSelection(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT data FROM session_entry + WHERE session_id = ? AND type = 'runtime/model_selection' + ORDER BY time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const data = parseOrNull(row.data); + if (data === null) return void 0; + const nested = parseModelSelection(data.modelSelection); + if (nested !== void 0) return nested; + const providerId = typeof data.providerId === "string" ? data.providerId.trim() : ""; + const modelId = typeof data.modelId === "string" ? data.modelId.trim() : ""; + if (providerId.length === 0 || modelId.length === 0) return void 0; + const thoughtLevel = typeof data.thoughtLevel === "string" ? data.thoughtLevel.trim() : ""; + return { + providerId, + modelId, + ...thoughtLevel.length > 0 ? { reasoningLevel: thoughtLevel } : {} + }; + } + /** 最近一次真实模型调用(session_entry 缺失时的继承兜底;variant = 思考强度)。 */ + latestModelUsage(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT provider_id, model_id, variant FROM model_usage + WHERE session_id = ? ORDER BY started_at DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.provider_id.trim(); + const modelId = row.model_id.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const variant = typeof row.variant === "string" ? row.variant.trim() : ""; + return { + providerId, + modelId, + ...variant.length > 0 ? { reasoningLevel: variant } : {} + }; + } + /** 完成回合导出(D3 fork 转录):真实用户消息 + 助手文本;tool 部分记工具名。 */ + exportTurns(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.data mdata, p.data pdata FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + const turns = []; + for (const r of rows) { + const message = parseOrNull(r.mdata); + const part = parseOrNull(r.pdata); + if (message === null || part === null) continue; + const isUser = message.role === "user"; + const isAssistant = message.role === "assistant"; + const realUser = isUser && message.semantics?.origin === "real_user"; + if (part.type === "text" && typeof part.text === "string") { + if (realUser) turns.push({ role: "user", text: part.text, toolNames: [] }); + else if (isAssistant) turns.push({ role: "assistant", text: part.text, toolNames: [] }); + } else if (isAssistant && part.type === "tool" && typeof part.tool === "string") { + const last = turns[turns.length - 1]; + if (last !== void 0 && last.role === "assistant" && !last.toolNames.length) { + last.toolNames.push(part.tool); + } else { + turns.push({ role: "assistant", text: "", toolNames: [part.tool] }); + } + } + } + return turns; + } + /** + * T5.7 成员会话查看视图导出(detail 合成数据源;只读、走 session_id 索引): + * 时间序全量 part 行(text/tool 两型;其余 part 型跳过),损坏行跳过。 + * 与 exportTurns 的区别:保留每条 part 的时间戳/role/工具状态(面板折叠行渲染), + * 不做回合聚合;hook 注入文本不落 transcript part(H14),framed 徽标由 + * panel/detail.ts 以 events 回填(不改写原文)。 + */ + exportDetailParts(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.data mdata, m.time_created mtc, p.data pdata, p.time_created ptc + FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + const out = []; + for (const r of rows) { + const message = parseOrNull(r.mdata); + const part = parseOrNull(r.pdata); + if (message === null || part === null) continue; + const role = message.role === "user" ? "user" : message.role === "assistant" ? "assistant" : void 0; + if (role === void 0) continue; + if (role === "user" && message.semantics?.origin !== "real_user") continue; + const ts2 = typeof r.ptc === "number" ? r.ptc : r.mtc; + if (part.type === "text" && typeof part.text === "string") { + out.push({ ts: ts2, role, kind: "text", text: part.text }); + } else if (part.type === "tool" && typeof part.tool === "string") { + const status = typeof part.state?.status === "string" ? part.state.status : "unknown"; + out.push({ + ts: ts2, + role: "assistant", + kind: "toolCall", + toolName: part.tool, + toolStatus: status, + ...part.state?.input !== void 0 ? { toolInput: part.state.input } : {}, + ...part.state?.output !== void 0 ? { toolOutput: part.state.output } : {} + }); + } + } + return out; + } +}; +function parseOrNull(raw) { + try { + return JSON.parse(raw); + } catch { + return null; + } +} +function extractText(partData) { + try { + const part = JSON.parse(partData); + return typeof part.text === "string" ? part.text : null; + } catch { + return null; + } +} + +// src/panel/detail.ts +var DETAIL_DEFAULT_LIMIT = 100; +var DETAIL_MAX_LIMIT = 200; +var DETAIL_PAGE_BYTES = 256 * 1024; +var TOOL_PAYLOAD_CHARS = 2e3; +var SessionNotSettledError = class extends TeamError { + sessionNotSettled = true; +}; +function resolveMemberSessionId(deps, target, readOriginSession) { + if (target === deps.teamId || target === "lead") { + return { memberId: deps.teamId, sessionId: deps.teamId, name: "lead" }; + } + const member = deps.state.members.find((m) => m.id === target || m.name === target); + if (member === void 0) { + throw new TeamError("TEAM_MEMBER_NOT_FOUND", `active teammate "${target}" not found`); + } + const sessionId = readOriginSession(member.id); + if (sessionId === null || sessionId === void 0) { + throw new SessionNotSettledError( + "TEAM_MEMBER_NOT_FOUND", + `active teammate "${member.name}" not found` + ); + } + return { memberId: member.id, sessionId, name: member.name }; +} +function synthesizeDetailStream(deps, sessionId, memberId) { + const rows = deps.reader.exportDetailParts(sessionId); + const framedQueue = framedFor(deps.state, memberId); + const items = []; + const used = /* @__PURE__ */ new Set(); + for (const row of rows) { + const item = toItem(row); + if (item.role === "user" && item.kind === "text" && item.text !== void 0) { + const idx = framedQueue.findIndex((f, i) => !used.has(i) && textCarriesFrame(item.text, f)); + if (idx >= 0) { + used.add(idx); + item.framed = { messageId: framedQueue[idx].messageId, from: framedQueue[idx].from }; + } + } + items.push(item); + } + return { items }; +} +function framedFor(state, memberId) { + const delivered = new Set(state.delivered); + return state.messages.filter((m) => m.targetId === memberId && delivered.has(m.id)).map((m) => ({ + messageId: m.id, + from: m.senderName, + body: m.content.map((b) => b.type === "text" ? b.text : JSON.stringify(b)).join("\n") + })); +} +function textCarriesFrame(text, framed) { + if (text.includes(`Team message from ${framed.from}:`)) return true; + const anchor = framed.body.slice(0, 64); + return anchor.length >= 8 && text.includes(anchor); +} +function toItem(row) { + const base = { ts: new Date(row.ts).toISOString(), role: row.role }; + if (row.kind === "text") { + return { ...base, kind: "text", text: row.text ?? "" }; + } + const tool = { name: row.toolName ?? "unknown", status: row.toolStatus ?? "unknown" }; + const parts = []; + if (row.toolInput !== void 0) parts.push(`input: ${stringify(row.toolInput)}`); + if (row.toolOutput !== void 0) parts.push(`output: ${stringify(row.toolOutput)}`); + if (parts.length === 0) return { ...base, kind: "toolCall", tool }; + const payload = parts.join("\n"); + return { + ...base, + kind: "toolCall", + tool, + text: payload.length > TOOL_PAYLOAD_CHARS ? payload.slice(0, TOOL_PAYLOAD_CHARS) + "\n\u2026(truncated)" : payload + }; +} +function stringify(v) { + if (typeof v === "string") return v; + try { + return JSON.stringify(v); + } catch { + return String(v); + } +} +function projectSummary(items) { + const out = []; + let round = { tools: [] }; + for (const item of items) { + if (item.role === "user" && item.kind === "text") { + flushRound(out, round); + round = { user: item, tools: [] }; + continue; + } + if (item.kind === "toolCall") { + round.tools.push(item); + continue; + } + if (item.role === "assistant" && item.kind === "text" && (item.text ?? "").trim().length > 0) { + round.conclusion = item; + } + } + flushRound(out, round); + return out; +} +function flushRound(out, round) { + if (round.user !== void 0) out.push(round.user); + if (round.tools.length > 0) out.push(toolGroupItem(round.tools)); + if (round.conclusion !== void 0) out.push(round.conclusion); +} +function toolGroupItem(tools) { + const entries = tools.map((item) => ({ + ts: item.ts, + name: item.tool?.name ?? "unknown", + status: item.tool?.status ?? "unknown", + ...item.text !== void 0 ? { text: item.text } : {} + })); + const last = entries[entries.length - 1]; + return { ts: last.ts, role: "assistant", kind: "toolGroup", count: entries.length, tools: entries }; +} +function pageDetail(items, opts) { + const limit = normalizeLimit(opts.limit); + const total = items.length; + const upper = opts.cursor !== void 0 ? Math.min(opts.cursor - 1, total) : total; + const start = Math.max(0, upper - limit); + let slice = items.slice(start, upper); + let truncated = false; + const bytesOf = (value) => new TextEncoder().encode(JSON.stringify(value)).length; + let bytes = bytesOf(slice); + while (slice.length > 1 && bytes > DETAIL_PAGE_BYTES) { + slice = slice.slice(1); + truncated = true; + bytes = bytesOf(slice); + } + const firstSeq = start + (items.slice(start, upper).length - slice.length) + 1; + const numbered = slice.map((item, i) => ({ seq: firstSeq + i, ...item })); + const page = { items: numbered }; + if (start > 0) page.nextCursor = firstSeq; + return { page, total, truncated }; +} +function normalizeLimit(limit) { + if (limit === void 0) return DETAIL_DEFAULT_LIMIT; + if (typeof limit !== "number" || !Number.isSafeInteger(limit) || limit < 1) { + throw new TeamError("TEAM_INVALID_ARGUMENT", "limit must be a positive safe integer"); + } + return Math.min(limit, DETAIL_MAX_LIMIT); +} +function buildDetail(deps, args, readOriginSession) { + const { memberId, sessionId } = resolveMemberSessionId(deps, args.target, readOriginSession); + const stream = synthesizeDetailStream(deps, sessionId, memberId); + const sourceTotal = stream.items.length; + const projected = projectSummary(stream.items); + const { page, total, truncated } = pageDetail(projected, { + ...args.cursor !== void 0 ? { cursor: args.cursor } : {}, + ...args.limit !== void 0 ? { limit: args.limit } : {} + }); + return { + sessionId, + memberId, + page, + ...truncated ? { truncated: true } : {}, + total, + sourceTotal + }; +} +function renderDetailText(result, memberName) { + const lines = []; + lines.push( + `member ${memberName} (${result.memberId}) \xB7 session ${result.sessionId} \xB7 ${result.total} items (summary of ${result.sourceTotal})` + ); + for (const item of result.page.items) { + const time = item.ts.slice(11, 19); + if (item.kind === "toolCall") { + lines.push(`[${time}] ${item.role} tool ${item.tool?.name ?? "?"} (${item.tool?.status ?? "?"})`); + if (item.text !== void 0) { + for (const l of item.text.split("\n").slice(0, 6)) lines.push(` ${l.slice(0, 160)}`); + } + continue; + } + if (item.kind === "toolGroup") { + const counts = /* @__PURE__ */ new Map(); + for (const tool of item.tools ?? []) counts.set(tool.name, (counts.get(tool.name) ?? 0) + 1); + const list = [...counts.entries()].sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)).map(([name, n]) => `${name}\xD7${n}`).join(" \xB7 "); + lines.push(`[${time}] ${item.role} \xB7 ${item.count ?? item.tools?.length ?? 0} \u4E2A\u52A8\u4F5C\uFF08${list}\uFF09`); + continue; + } + const badge = item.framed !== void 0 ? ` [team \u2190 ${item.framed.from}]` : ""; + lines.push(`[${time}] ${item.role}${badge}:`); + for (const l of (item.text ?? "").split("\n")) lines.push(` ${l}`); + } + if (result.truncated === true) lines.push(`(page truncated to ${DETAIL_PAGE_BYTES / 1024}KiB budget)`); + if (result.page.nextCursor !== void 0) lines.push(`(earlier messages: cursor=${result.page.nextCursor})`); + return lines.join("\n"); +} + +// src/provider/member-files.ts +import fs7 from "node:fs"; +import path7 from "node:path"; +function memberPaths(teamDir, memberId) { + const memberDir = path7.join(teamDir, "members", memberId); + const runDir = path7.join(memberDir, "run"); + return { + memberDir, + originFile: path7.join(memberDir, "origin.json"), + receiptsFile: path7.join(memberDir, "receipts.jsonl"), + stopBudgetFile: path7.join(memberDir, "stop-budget.json"), + runDir, + currentFile: path7.join(runDir, "current.json"), + drainMarkerFile: path7.join(runDir, "drain-requested.json"), + modelFailedFile: path7.join(memberDir, "model-failed.json") + }; +} +function readJson(file) { + let raw; + try { + raw = fs7.readFileSync(file, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return void 0; + throw err; + } + return JSON.parse(raw); +} +function readOrigin(paths) { + return readJson(paths.originFile); +} + +// src/mcp/identity.ts +import fs8 from "node:fs"; +import path9 from "node:path"; + +// src/shared.ts +import path8 from "node:path"; +import os3 from "node:os"; +function dataDir() { + const candidates = [ + process.env.TEAM_PLUGIN_DATA, + process.env.ZCODE_PLUGIN_DATA, + process.env.CLAUDE_PLUGIN_DATA + ]; + for (const c of candidates) if (c && c.trim()) return c; + return path8.join(os3.homedir(), ".zcode", "agent-team-dev-data"); +} + +// src/mcp/identity.ts +function sessionMapPath(dataRoot) { + return path9.join(dataRoot, "session-map.json"); +} +function readSessionRegistry(dataRoot) { + try { + const parsed = JSON.parse(fs8.readFileSync(sessionMapPath(dataRoot), "utf8")); + if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {}; + return parsed; + } catch { + return {}; + } +} + +// src/ui-core/view.ts +var VIEW_STATE_VERSION = 4; + +// src/panel/view-service.ts +function resolveMemberSession(teamDir, dataRoot, memberId) { + const origin = readOrigin(memberPaths(teamDir, memberId))?.sessionId; + if (origin !== null && origin !== void 0) return origin; + for (const entry of Object.values(readSessionRegistry(dataRoot))) { + if (entry.memberId === memberId && typeof entry.session_id === "string") return entry.session_id; + } + return void 0; +} +function buildStaticFrame(loaded, teamId, generatedAt, sessionId, teamDir, dataRoot) { + const state = loaded.state; + const members = [ + { target: "lead", role: "lead", status: "inactive", diagnostics: [], id: teamId, sessionId: teamId } + ]; + for (const m of state.members) { + const memberSessionId = teamDir !== void 0 && dataRoot !== void 0 ? resolveMemberSession(teamDir, dataRoot, m.id) : void 0; + members.push({ + target: m.name, + role: "teammate", + status: m.phase === "failed" ? "failed" : m.phase === "provisioning" ? "provisioning" : "inactive", + description: m.description, + provider: m.provider, + context: m.context, + diagnostics: m.error !== void 0 ? [m.error] : [], + id: m.id, + ...memberSessionId !== void 0 ? { sessionId: memberSessionId } : {} + }); + } + return { + type: "view", + stateVersion: VIEW_STATE_VERSION, + team: { + teamId, + status: state.failure !== void 0 ? "failure" : "active", + ...state.failure !== void 0 ? { failure: state.failure } : {}, + seq: loaded.seq + }, + members, + tasks: loaded.view.tasks, + meta: { + generatedAt, + revision: loaded.seq, + ...sessionId !== void 0 ? { sessionId } : {} + } + }; +} + +// src/ui-core/tokens.ts +var TOKEN_CSS = ` +:root, [data-theme="light"] { + color-scheme: light; + /* \u6587\u5B57\u56DB\u6863\uFF08dsw label-primary/secondary/tertiary/caption\uFF1B + caption \u65E0\u72EC\u7ACB\u5BBF\u4E3B\u53D8\u91CF \u2192 tertiary \u540C\u6863 + \u5B57\u9762\u515C\u5E95\u533A\u5206\uFF09 */ + --at-label-primary: var(--color-text-primary, var(--foreground, #1a2233)); + --at-label-secondary: var(--color-text-secondary, var(--muted-foreground, #3d4a5c)); + --at-label-tertiary: var(--color-text-tertiary, var(--muted-foreground, #8a94a6)); + --at-label-caption: var(--color-text-tertiary, #9aa3b2); + /* \u80CC\u666F\u4E24\u6863\uFF08dsw specific-menu / bg-layer-2\uFF09 */ + --at-bg-menu: var(--color-background-secondary, var(--muted, #f7f8fa)); + --at-bg-layer-2: var(--color-background-primary, var(--card, #ffffff)); + /* \u63CF\u8FB9\u4E09\u6863\uFF08dsw border-l1/l2/l3\uFF1B\u5BBF\u4E3B\u5355\u6863 --border \u2192 \u4E09\u6863\u900F\u660E\u5EA6\u6D3E\u751F\uFF09 */ + --at-border-l1: var(--color-border-primary, var(--border, rgba(16, 24, 40, 0.08))); + --at-border-l2: var(--color-border-tertiary, var(--border, #e3e6eb)); + --at-border-l3: var(--color-border-secondary, var(--border, #c9cfd8)); + /* \u72B6\u6001\u70B9\u4E94\u7C7B\u8272\uFF08ongoing/idle/done/warning \u2192 --green/\u7070/--blue/--yellow \u6216\u81EA\u7ED8\uFF09 */ + --at-state-ongoing: var(--color-text-success, var(--green, #12a675)); + --at-state-error: var(--color-text-danger, var(--red, #e5484d)); + --at-state-idle: var(--color-text-disabled, #98a2b3); + --at-state-warning: var(--color-text-warning, var(--yellow, #f59e0b)); + --at-state-done: var(--color-text-info, var(--blue, #3e7bfa)); + /* \u4E1A\u52A1\u4E3B\u8272\uFF08dsw state-business-primary\uFF1A\u5F53\u524D\u4F1A\u8BDD\u9AD8\u4EAE/info Tag\uFF09 */ + --at-business: var(--color-text-info, var(--primary, #3e7bfa)); + /* \u9519\u8BEF\u6587\u672C\uFF08dsw state-error-primary\uFF09 */ + --at-error-text: var(--color-text-danger, var(--red, var(--destructive, #d93036))); + /* advisory \u8B66\u544A\u6587\u672C\u8272\uFF08\u6DF1\u7425\u73C0\u4FDD\u8BC1 11px \u5C0F\u5B57\u5BF9\u6BD4\u5EA6\uFF09 */ + --at-warning-text: var(--color-text-warning, var(--yellow, #b45309)); + /* \u9634\u5F71\u4E24\u6863\uFF08dsw elevation-prominent / elevation-panel\uFF09 */ + --at-shadow-prominent: var(--shadow-lg, 0 8px 28px rgba(16, 24, 40, 0.16)); + --at-shadow-panel: var(--shadow-md, 0 4px 16px rgba(16, 24, 40, 0.12)); + /* \u6EDA\u52A8\u6761\uFF08dsh scrollbar \u4EE4\u724C\u81EA\u7ED8\uFF09 */ + --at-scrollbar-thumb: color-mix(in srgb, var(--at-label-tertiary) 40%, transparent); + --at-scrollbar-thumb-hover: color-mix(in srgb, var(--at-label-tertiary) 60%, transparent); + /* \u5B57\u4F53\uFF08\u4E0D\u5F15\u5916\u90E8\u5B57\u4F53\uFF0C\u8DDF\u968F\u5BBF\u4E3B UI \u5B57\u4F53\u6808\uFF09 */ + --at-font: var(--font-sans, -apple-system, "PingFang SC", "Segoe UI", sans-serif); +} +[data-theme="dark"] { + color-scheme: dark; + --at-label-primary: var(--color-text-primary, var(--foreground, #e8eaf0)); + --at-label-secondary: var(--color-text-secondary, var(--muted-foreground, #c0c6d2)); + --at-label-tertiary: var(--color-text-tertiary, var(--muted-foreground, #8d95a3)); + --at-label-caption: var(--color-text-tertiary, #7d8593); + --at-bg-menu: var(--color-background-secondary, var(--muted, #1b1e24)); + --at-bg-layer-2: var(--color-background-primary, var(--card, #23262d)); + --at-border-l1: var(--color-border-primary, var(--border, rgba(255, 255, 255, 0.08))); + --at-border-l2: var(--color-border-tertiary, var(--border, #333842)); + --at-border-l3: var(--color-border-secondary, var(--border, #434a56)); + --at-state-ongoing: var(--color-text-success, var(--green, #2fbf8f)); + --at-state-error: var(--color-text-danger, var(--red, #ff6b6e)); + --at-state-idle: var(--color-text-disabled, #7d8593); + --at-state-warning: var(--color-text-warning, var(--yellow, #ffb454)); + --at-state-done: var(--color-text-info, var(--blue, #6c9cff)); + --at-business: var(--color-text-info, var(--primary, #6c9cff)); + --at-error-text: var(--color-text-danger, var(--red, var(--destructive, #ff8a8d))); + /* advisory \u8B66\u544A\u6587\u672C\u8272 */ + --at-warning-text: var(--color-text-warning, var(--yellow, #ffb454)); + --at-shadow-prominent: var(--shadow-lg, 0 8px 28px rgba(0, 0, 0, 0.5)); + --at-shadow-panel: var(--shadow-md, 0 4px 16px rgba(0, 0, 0, 0.4)); +} +`; + +// src/ui-core/css.ts +var COMPONENT_CSS = ` +${TOKEN_CSS} +* { box-sizing: border-box; } +.at-root { + font-family: var(--at-font); + font-size: 13px; + line-height: 1.5; + color: var(--at-label-primary); + width: 100%; +} +/* \xA710.3 \u9762\u677F\uFF1A\u5BBD min(500px, \u5BB9\u5668\u221232px)\uFF1B\u7D27\u51D1 min(320px,\u2026)\uFF1B\u6700\u5927\u9AD8 min(680px, \u89C6\u53E3\u221232px)\uFF1B + \u5706\u89D2 12\uFF1Bpadding 8px 2px 0\uFF1Bflex column\uFF1Boverflow hidden\uFF1Belevation-prominent \u9634\u5F71\uFF1B + border-l1 \u63CF\u8FB9\uFF08stroke \u7B49\u4EF7\uFF0C\u65E0 border\uFF09 */ +.team-panel { + width: min(500px, 100% - 32px); + max-height: min(680px, 100vh - 32px); + border-radius: 12px; + box-shadow: var(--at-shadow-prominent); + outline: 0.5px solid var(--at-border-l1); + background: var(--at-bg-menu); + padding: 8px 2px 0; + display: flex; + flex-direction: column; + overflow: hidden; + position: relative; +} +.team-panel.compact { width: min(320px, 100% - 32px); } +/* \xA710.3 body\uFF1Aoverflow-y auto\uFF1Bscrollbar-gutter stable\uFF1Bpadding 0 9px 16px 14px */ +.panel-body { + overflow-y: auto; + scrollbar-gutter: stable; + padding: 0 9px 16px 14px; + flex: auto; + min-height: 0; + scrollbar-color: var(--at-scrollbar-thumb) transparent; +} +.panel-body::-webkit-scrollbar { width: 8px; } +.panel-body::-webkit-scrollbar-thumb { + background: var(--at-scrollbar-thumb); + border-radius: 4px; +} +.panel-body::-webkit-scrollbar-thumb:hover { background: var(--at-scrollbar-thumb-hover); } +/* \xA710.5 \u8282\u6807\u9898\uFF1A13px/500\uFF0Cmargin 16px 0 8px 4px\uFF08\u9996\u8282 top 8px\uFF09\uFF0Cgap 8\uFF1B + count 12px/16px tabular-nums caption \u8272 */ +.panel-body h3 { + font-size: 13px; + font-weight: 500; + color: var(--at-label-primary); + margin: 16px 0 8px 4px; + display: flex; + align-items: center; + gap: 8px; +} +.panel-body section:first-of-type h3 { margin-top: 8px; } +h3 .count { + font-size: 12px; + line-height: 16px; + font-weight: 400; + color: var(--at-label-caption); + font-variant-numeric: tabular-nums; +} +/* \xA710.5 \u82B1\u540D\u518C\u7F51\u683C\uFF1A\u53CC\u5217 minmax(0,1fr) gap 8\uFF1B\u7D27\u51D1\u5355\u5217 */ +.roster { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } +.compact .roster { grid-template-columns: minmax(0, 1fr); } +/* \xA710.5 \u6210\u5458\u5361\uFF1A\u5706\u89D2 8\uFF1Bpadding 10px 12px\uFF1Bgap 8\uFF1Bbg-layer-2\uFF1B\u63CF\u8FB9 border-l2\uFF08stroke \u7B49\u4EF7\uFF09\uFF1B + \u6587\u5B57\u5DE6\u5BF9\u9F50\uFF1Bflex \u9876\u5BF9\u9F50\uFF1Bhover\uFF08\u975E\u7981\u7528\uFF09border-l3 + elevation-panel\uFF1Bdisabled cursor default */ +.member { + border-radius: 8px; + padding: 10px 12px; + gap: 8px; + background: var(--at-bg-layer-2); + box-shadow: 0 0 0 0.5px var(--at-border-l2); + border: none; + text-align: left; + display: flex; + align-items: flex-start; + font: inherit; + color: inherit; + min-width: 0; + cursor: pointer; +} +.member:disabled { cursor: default; } +.member:not(:disabled):hover, +.member:not(:disabled):focus-visible { + box-shadow: 0 0 0 0.5px var(--at-border-l3), var(--at-shadow-panel); +} +/* \u5F53\u524D\u4F1A\u8BDD\u9AD8\u4EAE\uFF08\u4EC5 members>1\uFF09\uFF1Abusiness 40% \u6DF7\u8272\u63CF\u8FB9 + inset 1px \u5185\u73AF */ +.member.current { + box-shadow: 0 0 0 0.5px color-mix(in srgb, var(--at-business) 40%, transparent), + inset 0 0 0 1px color-mix(in srgb, var(--at-business) 40%, transparent); +} +/* \u540D\u5B57/\u6B21\u884C\u6587\u672C\u5217\uFF08\xA710.5 memberText\uFF1Acolumn\uFF0Cmin-width 0 \u4F9B ellipsis\uFF09 */ +.member .member-text { display: flex; flex-direction: column; min-width: 0; gap: 2px; } +.member .row1 { display: inline-flex; align-items: center; gap: 5px; min-width: 0; max-width: 100%; } +/* \u72B6\u6001\u70B9\u5BB9\u5668\uFF1A1lh \u9AD8\u5782\u76F4\u5BF9\u9F50\uFF08\xA710.5 memberDot\uFF09 */ +.member-dot { flex: none; align-items: center; height: 1lh; display: inline-flex; } +.member .name { + font-weight: 500; + color: var(--at-label-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + min-width: 0; +} +.member .sub { + font-size: 11px; + color: var(--at-label-tertiary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} +/* hover/focus \u624D\u663E\u793A\u300C \xB7 \u6A21\u578B: model\u300D\uFF08\xA710.5/V06\uFF09 */ +.member .model { display: none; } +.member:hover .model, +.member:focus-visible .model { display: inline; } +.member .diagnostic { + font-size: 11px; + color: var(--at-error-text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} +/* \u5F53\u524D\u4F1A\u8BDD Tag\uFF0810px/15px\uFF0Cpadding 0 4px\uFF0Cinfo tone\uFF09 */ +.current-tag { + font-size: 10px; + line-height: 15px; + padding: 0 4px; + border-radius: 4px; + background: color-mix(in srgb, var(--at-business) 16%, transparent); + color: var(--at-business); + flex: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +/* 0.4.0 \u6CE8\u9500\u6210\u5458\u5361/\u9F7F\u8F6E\u4E0E\u8BBE\u7F6E\u5F39\u7A97\u6837\u5F0F\uFF08member-card\u3001member-gear\u3001settings \u7CFB\u5217\u3001 + source-badge\u3001modal-select\uFF09\uFF1A\u6210\u5458\u6A21\u578B\u552F\u4E00\u8DEF\u7EBF = \u6BCF\u8F6E\u8DDF\u968F Lead\uFF0C\u9762\u677F\u6062\u590D\u96F6\u53D8\u66F4\u901A\u9053\u3002 */ +/* \u72B6\u6001\u70B9\uFF1A\u76F4\u5F84\u4E00\u81F4 8px\uFF08V06\uFF09 */ +.dot { width: 8px; height: 8px; border-radius: 50%; flex: none; display: inline-block; } +.dot.ongoing { background: var(--at-state-ongoing); } +.dot.error { background: var(--at-state-error); } +.dot.idle { background: var(--at-state-idle); } +.dot.warning { background: var(--at-state-warning); } +.dot.done { background: var(--at-state-done); } +/* inactive \u4EBA\u5F62\u56FE\u6807\uFF1A14px tertiary\uFF08\xA710.5/V06\uFF09 */ +.icon-user { width: 14px; height: 14px; flex: none; color: var(--at-label-tertiary); display: inline-flex; } +/* \xA710.4 \u901A\u77E5\u6761\uFF1Aflex gap 6 padding 9 \u5B57\u53F7 12\uFF1Berror = \u9519\u8BEF\u8272\uFF1B\u6309\u5E8F\u6E32\u67D3 */ +.notice, .error-bar { + display: flex; + align-items: center; + gap: 6px; + padding: 9px; + font-size: 12px; +} +.error-bar { color: var(--at-error-text); } +.notice { color: var(--at-label-secondary); } +/* \xA710.6 \u4EFB\u52A1\u677F\uFF1A\u7A7A\u677F\u6BB5\u843D 12px tertiary margin 16px 0 0 4px\uFF1B\u5217\u8868 flex column gap 7 */ +.empty-notice { font-size: 12px; color: var(--at-label-tertiary); margin: 16px 0 0 4px; } +.tasks { display: flex; flex-direction: column; gap: 7px; } +/* \u4EFB\u52A1\u5361\uFF1Aborder 0.5px border-l2\uFF1B\u5706\u89D2 9\uFF1Bpadding 11px 13px\uFF1Bbg-layer-2 */ +article.task { + border: 0.5px solid var(--at-border-l2); + border-radius: 9px; + padding: 11px 13px; + background: var(--at-bg-layer-2); +} +.task .title-row { display: flex; align-items: center; gap: 8px; } +.task strong { font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--at-label-primary); } +/* \u72B6\u6001\u5FBD\u6807\u53F3\u5BF9\u9F50 11px gap 6 */ +.task .task-state { + margin-left: auto; + font-size: 11px; + color: var(--at-label-tertiary); + display: inline-flex; + align-items: center; + gap: 6px; + flex: none; +} +/* \u63CF\u8FF0 12px/18px pre-wrap margin 5px 0\uFF1B\u4E24\u884C\u622A\u65AD */ +.task p { + font-size: 12px; + line-height: 18px; + color: var(--at-label-secondary); + white-space: pre-wrap; + margin: 5px 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} +.task p.expanded { -webkit-line-clamp: unset; display: block; } +/* \u5C55\u5F00\u5F00\u5173\uFF1Afloat right\uFF1B11px/20px\uFF1Bchevron 12px \u65CB\u8F6C 180\xB0 transition .12s */ +.expand-toggle { + float: right; + font-size: 11px; + line-height: 20px; + color: var(--at-label-tertiary); + background: none; + border: none; + cursor: pointer; + padding: 0; + margin-left: 10px; + font-family: inherit; + display: inline-flex; + align-items: center; + gap: 2px; +} +.expand-toggle:hover, .expand-toggle:focus-visible { color: var(--at-label-primary); } +.expand-toggle svg { transition: transform 0.12s; } +.expand-toggle.open svg { transform: rotate(180deg); } +.expand-toggle[hidden] { display: none; } +/* meta \u884C\uFF1A11px/20px\uFF1B\u5B50\u9879\u95F4\u8DDD 10px\uFF1Bwarning \u63D0\u9192\u8272\uFF08advisory \u975E\u9519\u8BEF\uFF09 */ +.task .meta { font-size: 11px; line-height: 20px; color: var(--at-label-tertiary); } +.task .meta > span { margin-right: 10px; } +.task .meta .warning { color: var(--at-warning-text); } +/* T5.7 \u6210\u5458\u4F1A\u8BDD\u67E5\u770B\u89C6\u56FE\uFF08V16\uFF1A\u65E0 DSH \u53C2\u7167\uFF0C\u5BBF\u4E3B\u98CE\u683C\uFF1B\u5224\u636E=\u4E0D\u7834\u7248+\u51E0\u4F55\u4E00\u81F4\uFF09 */ +.detail-view { display: flex; flex-direction: column; min-height: 0; flex: auto; } +.detail-head { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 9px 8px 6px; + border-bottom: 0.5px solid var(--at-border-l2); + flex: none; +} +.detail-back { + display: inline-flex; + align-items: center; + gap: 4px; + background: none; + border: none; + color: var(--at-label-tertiary); + font: inherit; + font-size: 12px; + cursor: pointer; + padding: 2px 6px; + border-radius: 6px; +} +.detail-back:hover, .detail-back:focus-visible { color: var(--at-label-primary); background: color-mix(in srgb, var(--at-label-tertiary) 10%, transparent); } +.detail-title { font-size: 13px; font-weight: 500; color: var(--at-label-primary); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.detail-actions { margin-left: auto; display: inline-flex; gap: 6px; flex: none; } +.detail-action { + background: none; + border: 0.5px solid var(--at-border-l2); + border-radius: 6px; + color: var(--at-label-secondary); + font: inherit; + font-size: 11px; + line-height: 18px; + padding: 1px 8px; + cursor: pointer; +} +.detail-action:hover, .detail-action:focus-visible { color: var(--at-label-primary); border-color: var(--at-border-l3); } +.detail-list { overflow-y: auto; scrollbar-gutter: stable; padding: 8px 9px 16px 14px; flex: auto; min-height: 0; scrollbar-color: var(--at-scrollbar-thumb) transparent; } +.detail-state { font-size: 12px; color: var(--at-label-tertiary); padding: 16px 4px; display: flex; align-items: center; gap: 6px; } +.detail-state.error { color: var(--at-error-text); } +.msg { margin: 0 0 10px; min-width: 0; } +.msg-head { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--at-label-tertiary); margin-bottom: 2px; } +.msg-role { font-weight: 500; color: var(--at-label-secondary); } +.msg-time { font-variant-numeric: tabular-nums; } +.msg-text { + font-size: 12px; + line-height: 18px; + color: var(--at-label-primary); + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: anywhere; +} +.msg.user .msg-text { color: var(--at-label-secondary); } +.msg-badge { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 10px; + line-height: 15px; + padding: 0 4px; + border-radius: 4px; + background: color-mix(in srgb, var(--at-business) 16%, transparent); + color: var(--at-business); +} +.msg-badge.hook { background: color-mix(in srgb, var(--at-label-tertiary) 14%, transparent); color: var(--at-label-tertiary); } +.tool-row { display: block; width: 100%; text-align: left; background: none; border: none; border-top: 0.5px solid var(--at-border-l2); padding: 4px 0; margin-top: 4px; font: inherit; cursor: pointer; color: var(--at-label-tertiary); } +.tool-row:hover, .tool-row:focus-visible { color: var(--at-label-primary); } +.tool-static { display: block; border-top: 0.5px solid var(--at-border-l2); padding: 4px 0; margin-top: 4px; color: var(--at-label-tertiary); } +.tool-row .tool-summary, .tool-static .tool-summary { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; line-height: 20px; } +.tool-row .tool-name, .tool-static .tool-name { font-weight: 500; color: var(--at-label-secondary); } +.tool-row svg { transition: transform 0.12s; } +.tool-row.open svg { transform: rotate(180deg); } +.tool-detail { + display: none; + font-size: 11px; + line-height: 16px; + color: var(--at-label-tertiary); + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: anywhere; + max-height: 200px; + overflow-y: auto; + margin: 2px 0 0 18px; +} +.tool-row.open + .tool-detail { display: block; } +/* toolGroup\uFF1A\u6309\u8F6E\u52A8\u4F5C\u7EC4\uFF08\u5934\u90E8\u4E00\u884C\u6C47\u603B\uFF1B\u5C55\u5F00\u9010\u6761\u5DE5\u5177\u884C\uFF0C\u7F29\u8FDB\u5BF9\u9F50 tool-detail\uFF09 */ +.tool-group-head { + display: flex; + align-items: center; + gap: 6px; + width: 100%; + text-align: left; + background: none; + border: none; + border-top: 0.5px solid var(--at-border-l2); + padding: 4px 0; + margin-top: 4px; + font: inherit; + color: var(--at-label-tertiary); + cursor: pointer; +} +.tool-group-head:hover, .tool-group-head:focus-visible { color: var(--at-label-primary); } +.tool-group-head .tool-group-label { font-size: 11px; line-height: 20px; color: var(--at-label-secondary); } +.tool-group-head:hover .tool-group-label, +.tool-group-head:focus-visible .tool-group-label { color: var(--at-label-primary); } +.tool-group-head svg { flex: none; transition: transform 0.12s; } +.tool-group.open .tool-group-head svg { transform: rotate(180deg); } +.tool-group-items { display: none; margin-left: 18px; } +.tool-group.open .tool-group-items { display: block; } +.tool-group-items > :first-child { border-top: none; } +.detail-pager { display: flex; align-items: center; gap: 8px; padding: 4px 0 8px; } +.detail-pager .detail-action[disabled] { opacity: 0.45; cursor: default; } +`; +var CARD_CSS = ` +html, body { margin: 0; padding: 0; } +.at-root { display: flex; justify-content: center; padding: 16px 0; } +.team-panel { margin: 0 auto; } +`; + +// src/ui-core/dict.ts +var DICT = { + zh: { + trigger: "\u667A\u80FD\u4F53\u56E2\u961F", + loading: "\u6B63\u5728\u52A0\u8F7D\u56E2\u961F\u2026", + unavailable: "Team \u6682\u4E0D\u53EF\u7528", + failure: "\u56E2\u961F\u6301\u4E45\u8BB0\u5F55\u65E0\u6548\uFF1A{message}", + empty: "\u6682\u65E0\u5171\u4EAB\u4EFB\u52A1\uFF0C\u53EF\u4EE5\u901A\u8FC7\u5BF9\u8BDD\u521B\u5EFA", + roster: "\u6210\u5458", + tasks: "\u5171\u4EAB\u4EFB\u52A1", + model: "\u6A21\u578B", + open: "\u6253\u5F00\u6210\u5458\u4F1A\u8BDD", + current: "\u5F53\u524D\u4F1A\u8BDD", + owner: "Owner", + unowned: "\u672A\u5206\u914D", + blockedBy: "\u4F9D\u8D56", + writeScopes: "\u5199\u5165\u8303\u56F4", + ready: "\u53EF\u5F00\u59CB", + blocked: "\u88AB\u4F9D\u8D56\u963B\u585E", + "task.expand": "\u5C55\u5F00", + "task.collapse": "\u6536\u8D77", + "memberStatus.running": "\u8FD0\u884C\u4E2D", + "memberStatus.inactive": "\u672A\u8FD0\u884C", + "memberStatus.provisioning": "\u51C6\u5907\u4E2D", + "memberStatus.failed": "\u5931\u8D25", + "status.pending": "\u5F85\u5904\u7406", + "status.in_progress": "\u8FDB\u884C\u4E2D", + "status.completed": "\u5DF2\u5B8C\u6210" + }, + en: { + trigger: "Agent Team", + loading: "Loading Team\u2026", + unavailable: "Team is unavailable", + failure: "Invalid persisted Team record: {message}", + empty: "No shared tasks yet. Create them through the conversation.", + roster: "Members", + tasks: "Shared tasks", + model: "Model", + open: "Open member conversation", + current: "Current chat", + owner: "Owner", + unowned: "Unowned", + blockedBy: "Blocked by", + writeScopes: "Write scopes", + ready: "Ready", + blocked: "Blocked by dependencies", + "task.expand": "Show more", + "task.collapse": "Show less", + "memberStatus.running": "Running", + "memberStatus.inactive": "Inactive", + "memberStatus.provisioning": "Provisioning", + "memberStatus.failed": "Failed", + "status.pending": "Pending", + "status.in_progress": "In progress", + "status.completed": "Completed" + } +}; +function t(lang, key, vars) { + return interpolate(DICT[lang][key], vars); +} +function interpolate(template, vars) { + if (vars === void 0) return template; + return template.replace( + /\{(\w+)\}/g, + (m, k) => k in vars ? String(vars[k]) : m + ); +} +function statusKey(status) { + return status === "deleted" ? "status.completed" : `status.${status}`; +} +function memberStatusKey(status) { + return `memberStatus.${status}`; +} + +// src/ui-core/icons.ts +var svg = (inner, size) => ``; +function iconUser(size = 14) { + return svg('', size); +} +function iconChevron(size = 12) { + return svg('', size); +} + +// src/ui-core/escape.ts +function esc(s) { + return s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); +} + +// src/ui-core/render.ts +function isCompact(frame) { + return frame.members.length === 1 && frame.tasks.length === 0; +} +function currentMemberId(frame) { + const sid = frame.meta.sessionId; + if (sid === void 0) return void 0; + return frame.members.find((m) => m.sessionId === sid)?.id; +} +function isMemberDisabled(m, currentId) { + return m.id === currentId || m.status === "failed" || m.status === "provisioning"; +} +function memberDot(status) { + switch (status) { + case "running": + case "provisioning": + return "ongoing"; + case "failed": + return "error"; + case "inactive": + default: + return "icon"; + } +} +function taskDot(task) { + switch (task.status) { + case "in_progress": + return "ongoing"; + case "completed": + return "done"; + case "deleted": + return "idle"; + // 上游 deleted→idle(视图通常不含墓碑,防御口径) + case "pending": + default: + return task.ready ? "idle" : "warning"; + } +} +function dot(state) { + return ``; +} +function memberIndicator(m) { + const d = memberDot(m.status); + const inner = d === "icon" ? `${iconUser(14)}` : dot(d); + return `${inner}`; +} +function renderMember(m, opts) { + const { lang, isCurrent, disabled } = opts; + const highlight = opts.highlightCurrent ?? isCurrent; + const cls = ["member", highlight ? "current" : ""].filter(Boolean).join(" "); + const nameRow = `${esc(m.target)}` + (isCurrent ? `${esc(t(lang, "current"))}` : "") + ``; + const modelSuffix = m.model !== void 0 ? ` \xB7 ${esc(t(lang, "model"))}: ${esc(m.model)}` : ""; + const sub = `${esc(t(lang, memberStatusKey(m.status)))}${modelSuffix}`; + const diag = m.diagnostics.length > 0 ? `${esc(m.diagnostics[0])}` : ""; + const openAttr = disabled ? "" : ` title="${esc(t(lang, "open"))}"`; + return ``; +} +function renderRoster(frame, lang) { + const members = frame.members; + const currentId = currentMemberId(frame); + const countHtml = members.length > 1 ? `${members.length}` : ""; + const cards = members.map( + (m) => renderMember(m, { + lang, + // Tag 恒随当前会话;高亮/描边才受 members>1 限制(上游 TeamAction 同口径)。 + isCurrent: m.id === currentId, + highlightCurrent: m.id === currentId && members.length > 1, + disabled: isMemberDisabled(m, currentId) + }) + ).join(""); + return `

${esc(t(lang, "roster"))}${countHtml}

`; +} +function renderTaskMeta(task, lang, leadingHtml = "") { + const spans = []; + spans.push(`${esc(task.id)}`); + const owner = task.ownerName !== void 0 ? esc(task.ownerName) : esc(t(lang, "unowned")); + spans.push(`${esc(t(lang, "owner"))}: ${owner}`); + if (task.status === "pending") { + spans.push(`${esc(t(lang, task.ready ? "ready" : "blocked"))}`); + } + if (task.blockedBy.length > 0) { + spans.push(`${esc(t(lang, "blockedBy"))}: ${task.blockedBy.map(esc).join(", ")}`); + } + if (task.writeScopes.length > 0) { + spans.push(`${esc(t(lang, "writeScopes"))}: ${task.writeScopes.map(esc).join(", ")}`); + } + for (const w of task.writeScopeWarnings) { + spans.push(`${esc(w)}`); + } + return `
${leadingHtml}${spans.join("")}
`; +} +function renderTask(task, lang) { + const state = `${dot(taskDot(task))}${esc(t(lang, statusKey(task.status)))}`; + const titleRow = `
${esc(task.subject)}${state}
`; + const toggle = ``; + const desc = `

${esc(task.description)}

`; + return `
` + titleRow + desc + renderTaskMeta(task, lang, toggle) + `
`; +} +function renderTasks(frame, lang) { + if (frame.tasks.length === 0) { + return `

${esc(t(lang, "empty"))}

`; + } + const cards = frame.tasks.map((task) => renderTask(task, lang)).join(""); + return `

${esc(t(lang, "tasks"))}${frame.tasks.length}

${cards}
`; +} +function renderNotices(opts) { + const { lang } = opts; + const out = []; + if (opts.navError !== void 0) { + out.push(``); + } + if (opts.loading === true) { + out.push(`
${dot("ongoing")}${esc(t(lang, "loading"))}
`); + } else if (opts.noTeam === true) { + out.push(`
${dot("warning")}${esc(t(lang, "unavailable"))}
`); + } + if (opts.failure !== void 0) { + out.push(``); + } + return out.join(""); +} +function renderPanelBody(frame, lang, runtime) { + const noTeam = frame.team === null; + const notices = renderNotices({ + lang, + ...runtime?.navError !== void 0 ? { navError: runtime.navError } : {}, + ...runtime?.loading !== void 0 ? { loading: runtime.loading } : {}, + noTeam, + ...frame.team?.failure !== void 0 ? { failure: frame.team.failure } : {} + }); + if (noTeam && runtime?.loading !== true) { + return notices; + } + return notices + renderRoster(frame, lang) + renderTasks(frame, lang); +} + +// src/ui-core/widget.ts +function renderWidgetFragment(opts) { + const lang = opts.lang ?? "zh"; + const theme = opts.theme ?? "light"; + const rootId = opts.rootId ?? "agent-team-widget"; + const compact = isCompact(opts.frame); + const body = renderPanelBody(opts.frame, lang, { loading: false }); + const frameJson = esc(JSON.stringify(opts.frame)); + return `
`; +} +function renderStandalonePage(opts) { + const lang = opts.lang ?? "zh"; + const theme = opts.theme ?? "light"; + return ` + + + + +${esc(opts.title ?? t(lang, "trigger"))} + + + +${renderWidgetFragment(opts)} + + +`; +} +var WIDGET_SCRIPT = ` +var root = document.getElementById(__AT_ROOT_ID__); +if (!root) return; +var labels = { expand: '\u5C55\u5F00', collapse: '\u6536\u8D77' }; +try { labels = JSON.parse(root.getAttribute('data-labels') || '{}') || labels; } catch (e) {} +var store = { set: {} }; +try { + var ws = window.zcode && window.zcode.widgetState; + if (ws && Array.isArray(ws.expanded)) { for (var i=0;i desc.clientHeight + 1; + toggle.hidden = !(overflow || expanded); + var lbl = toggle.querySelector('.expand-label'); + if (lbl) lbl.textContent = expanded ? (labels.collapse||'\u6536\u8D77') : (labels.expand||'\u5C55\u5F00'); + toggle.setAttribute('aria-expanded', expanded ? 'true' : 'false'); + toggle.classList.toggle('open', expanded); + desc.classList.toggle('expanded', expanded); +} +var tasks = root.querySelectorAll('article.task'); +for (var j=0;j resolveMemberSession(input.teamDir, dataRootOf(input.teamDir), memberId) + ); + const member = input.loaded.state.members.find((m) => m.id === result.memberId || m.name === input.member); + if (member !== void 0) name = member.name; + if (input.member === "lead" || input.member === input.teamId) name = "lead"; + } finally { + reader.close(); + } + if (input.json) return JSON.stringify({ ...result, memberName: name }, null, 2); + return renderDetailText(result, name); +} +function renderWidget(input) { + const frame = buildStaticFrame( + input.loaded, + input.teamId, + (/* @__PURE__ */ new Date()).toISOString(), + input.sessionId, + input.teamDir, + dataRootOf(input.teamDir) + ); + const html = input.standalone ? renderStandalonePage({ frame, lang: input.lang, theme: input.theme }) : renderWidgetFragment({ frame, lang: input.lang, theme: input.theme }); + if (input.out !== void 0) { + const abs = safeOutPath(input.out); + fs9.mkdirSync(path10.dirname(abs), { recursive: true }); + fs9.writeFileSync(abs, html); + return { html, out: abs }; + } + return { html }; +} +function safeOutPath(out) { + if (out.split(/[\\/]/).includes("..")) { + throw new Error(`--out \u62D2\u7EDD\u8DEF\u5F84\u7A7F\u8D8A\u6BB5 ".."\uFF1A${out}`); + } + const abs = path10.resolve(out); + const base = path10.basename(abs); + if (!/^[A-Za-z0-9._-]+\.html$/.test(base)) { + throw new Error(`--out \u6587\u4EF6\u540D\u987B\u4E3A\u767D\u540D\u5355\u5B57\u7B26\u4E14 .html \u540E\u7F00\uFF08[A-Za-z0-9._-]\uFF09\uFF1A${base}`); + } + return abs; +} + +// src/cli/open-panel.ts +import fs10 from "node:fs"; +import net2 from "node:net"; +import { execFile } from "node:child_process"; + +// src/panel/companion-server.ts +import path11 from "node:path"; +var COMPANION_REGISTRY_RELPATH = "logs/panel-http.json"; +function companionRegistryFile(dataRoot) { + const root = path11.resolve(dataRoot); + const file = path11.join(root, COMPANION_REGISTRY_RELPATH); + if (file !== path11.join(root, "logs", "panel-http.json")) { + throw new Error("companion registry path escapes dataRoot"); + } + return file; +} + +// src/cli/open-panel.ts +var NOT_RUNNING = "\u4F34\u751F\u9762\u677F\u672A\u8FD0\u884C\uFF08\u65E0 logs/panel-http.json\uFF09\u3002\u4EE5 TEAM_COMPANION=1 \u542F\u52A8 team-daemon \u540E\u91CD\u8BD5\uFF08MCP Apps \u9762\u677F/::visualize \u5361\u7247\u4E3A\u4E3B\u8F7D\u4F53\uFF0C\u4F34\u751F\u9762\u677F\u4E3A\u53EF\u9009\u9AD8\u4FDD\u771F\u8DEF\u5F84\uFF09\u3002"; +async function openPanel(input = {}) { + const registryFile = companionRegistryFile(input.dataRoot ?? dataDir()); + let reg; + try { + reg = JSON.parse(fs10.readFileSync(registryFile, "utf8")); + } catch { + return { ok: false, message: NOT_RUNNING }; + } + if (typeof reg.port !== "number" || !Number.isInteger(reg.port) || reg.port < 1 || reg.port > 65535 || typeof reg.token !== "string" || !/^[0-9a-f]{32}$/.test(reg.token)) { + return { ok: false, message: "logs/panel-http.json \u5185\u5BB9\u975E\u6CD5\uFF08port/token \u6821\u9A8C\u5931\u8D25\uFF09\u3002" }; + } + const url = `http://127.0.0.1:${reg.port}/panel?token=${reg.token}`; + const alive = await probePort(reg.port); + if (!alive) { + return { + ok: false, + port: reg.port, + message: `\u4F34\u751F\u9762\u677F\u7AEF\u53E3 ${reg.port} \u672A\u76D1\u542C\uFF08daemon \u53EF\u80FD\u5DF2\u56DE\u6536\uFF09\u3002\u4EE5 TEAM_COMPANION=1 \u91CD\u542F daemon \u540E\u91CD\u8BD5\u3002` + }; + } + if (input.noOpen !== true) void launchBrowser(url); + return { ok: true, url, port: reg.port, message: url }; +} +function probePort(port) { + return new Promise((resolve) => { + const socket = net2.connect({ host: "127.0.0.1", port }, () => { + socket.destroy(); + resolve(true); + }); + socket.setTimeout(1500); + socket.once("timeout", () => { + socket.destroy(); + resolve(true); + }); + socket.once("error", () => { + socket.destroy(); + resolve(false); + }); + }); +} +function launchBrowser(url) { + const platform = process.platform; + const [cmd, args] = platform === "darwin" ? ["open", [url]] : platform === "win32" ? ["cmd", ["/c", "start", "", url]] : ["xdg-open", [url]]; + return new Promise((resolve) => { + execFile(cmd, [...args], { windowsHide: true }, () => resolve()); + }); +} + +// src/cli/sidebar-audit.ts +import fs12 from "node:fs"; +import path13 from "node:path"; + +// src/sidebar/tasks-index.ts +import fs11 from "node:fs"; +import os4 from "node:os"; +import path12 from "node:path"; +import { DatabaseSync as DatabaseSync2 } from "node:sqlite"; +var ANCHOR_TITLE = "Agent Team anchor"; +function defaultTasksIndexPath() { + return process.env.TEAM_TASKS_INDEX ?? path12.join(os4.homedir(), ".zcode", "v2", "tasks-index.sqlite"); +} +function withRetry(fn, attempts = 3) { + let last; + for (let i = 0; i < attempts; i += 1) { + try { + return fn(); + } catch (err) { + last = err; + const message = err instanceof Error ? err.message : String(err); + if (!/SQLITE_BUSY|database is locked/i.test(message)) throw err; + const until = Date.now() + 100 * (i + 1); + while (Date.now() < until) { + } + } + } + throw last; +} +function readTask(dbPath, taskId) { + if (!fs11.existsSync(dbPath)) return void 0; + const db = new DatabaseSync2(dbPath, { readOnly: true }); + try { + return db.prepare("select task_id, title, archived, deleted, workspace_path from tasks where task_id = ?").get(taskId); + } finally { + db.close(); + } +} +function tombstoneAnchor(input) { + const dbPath = input.dbPath ?? defaultTasksIndexPath(); + if (!fs11.existsSync(dbPath)) return { applied: false, reason: "tasks-index-missing" }; + const now = input.now ?? Date.now(); + return withRetry(() => { + const db = new DatabaseSync2(dbPath); + try { + db.exec("PRAGMA busy_timeout = 5000"); + db.exec("BEGIN IMMEDIATE"); + const existing = db.prepare("select task_id, title, workspace_path from tasks where task_id = ?").get(input.taskId); + if (existing !== void 0 && existing.workspace_path === input.workspacePath && existing.title !== "" && existing.title !== "Untitled session" && existing.title !== ANCHOR_TITLE) { + db.exec("ROLLBACK"); + return { applied: false, reason: "row-not-owned" }; + } + if (existing !== void 0 && existing.workspace_path !== input.workspacePath) { + db.exec("ROLLBACK"); + return { applied: false, reason: "row-not-owned" }; + } + const meta = JSON.stringify({ + taskId: input.taskId, + title: ANCHOR_TITLE, + workspacePath: input.workspacePath, + createdAt: now, + updatedAt: now, + mode: "default", + provider: "glm", + status: "completed", + titleOverridden: false + }); + db.prepare( + `INSERT INTO tasks ( + workspace_key, workspace_path, workspace_identity, task_id, title, task_status, + provider, mode, model, migration_source, forked_from_task_id, cron_automation_id, + off_peak_task_id, created_at, updated_at, unread_at, last_unread_at, pinned, + archived, deleted, title_overridden, searchable_text, meta_json + ) VALUES ( + @workspace_key, @workspace_path, NULL, @task_id, @title, 'completed', + 'glm', 'default', NULL, NULL, NULL, NULL, + NULL, @now, @now, NULL, 0, 0, + 0, 1, 0, @searchable, @meta + ) + ON CONFLICT(workspace_key, task_id) DO UPDATE SET + deleted = 1, + updated_at = excluded.updated_at + WHERE tasks.task_id = excluded.task_id + AND (tasks.title = '' OR tasks.title = 'Untitled session' OR tasks.title = @title)` + ).run({ + workspace_key: input.workspacePath, + workspace_path: input.workspacePath, + task_id: input.taskId, + title: ANCHOR_TITLE, + now, + searchable: ANCHOR_TITLE, + meta + }); + db.exec("COMMIT"); + return { applied: true }; + } catch (err) { + try { + db.exec("ROLLBACK"); + } catch { + } + throw err; + } finally { + db.close(); + } + }); +} +function archiveTask(input) { + const dbPath = input.dbPath ?? defaultTasksIndexPath(); + if (!fs11.existsSync(dbPath)) return { applied: false, reason: "tasks-index-missing" }; + const now = input.now ?? Date.now(); + return withRetry(() => { + const db = new DatabaseSync2(dbPath); + try { + db.exec("PRAGMA busy_timeout = 5000"); + db.exec("BEGIN IMMEDIATE"); + const existing = db.prepare("select task_id, workspace_path, archived from tasks where task_id = ?").get(input.taskId); + if (existing === void 0 || existing.workspace_path !== input.workspacePath) { + db.exec("ROLLBACK"); + return { applied: false, reason: "row-not-owned" }; + } + if (existing.archived === 1) { + db.exec("COMMIT"); + return { applied: false }; + } + db.prepare("update tasks set archived = 1, updated_at = ? where task_id = ?").run(now, input.taskId); + db.exec("COMMIT"); + return { applied: true }; + } catch (err) { + try { + db.exec("ROLLBACK"); + } catch { + } + throw err; + } finally { + db.close(); + } + }); +} + +// src/cli/sidebar-audit.ts +function listMemberIds(teamDir) { + try { + return fs12.readdirSync(path13.join(teamDir, "members")).filter((n) => !n.startsWith(".")).sort(); + } catch { + return []; + } +} +function auditSidebar(input) { + const teamDir = path13.resolve(input.teamDir); + const tasksIndexPath = input.tasksIndexPath ?? defaultTasksIndexPath(); + const dryRun = input.dryRun ?? true; + const entries = []; + const seenAnchors = /* @__PURE__ */ new Set(); + for (const memberId of listMemberIds(teamDir)) { + const origin = readOrigin(memberPaths(teamDir, memberId)); + if (origin === void 0 || origin.sessionId === null) continue; + const sessionId = origin.sessionId; + const isolation = origin.sessionIsolation ?? "unknown"; + const row = readTask(tasksIndexPath, sessionId); + const expectedWorkspace = path13.resolve(origin.cwd); + const owned = row !== void 0 && path13.resolve(row.workspace_path) === expectedWorkspace; + const needsArchive = owned && row.archived !== 1; + let action; + if (row === void 0) { + action = "absent"; + } else if (!owned) { + action = "mismatch"; + } else if (!needsArchive) { + action = "already-archived"; + } else { + action = dryRun ? "would-archive" : "archived"; + } + entries.push({ + memberId, + name: origin.name ?? null, + sessionId, + sessionIsolation: isolation, + action, + kind: "member", + ...row !== void 0 ? { title: row.title } : {} + }); + if (!dryRun && needsArchive) { + const result = archiveTask({ taskId: sessionId, workspacePath: row.workspace_path, dbPath: tasksIndexPath }); + entries[entries.length - 1].action = result.applied ? "archived" : result.reason === "row-not-owned" ? "mismatch" : "absent"; + } + const anchorId = origin.anchorSessionId; + if (typeof anchorId === "string" && anchorId.length > 0 && !seenAnchors.has(anchorId)) { + seenAnchors.add(anchorId); + const anchorRow = readTask(tasksIndexPath, anchorId); + const anchorOwned = anchorRow !== void 0 && path13.resolve(anchorRow.workspace_path) === expectedWorkspace; + let anchorAction; + if (anchorRow === void 0) { + anchorAction = "absent"; + } else if (!anchorOwned) { + anchorAction = "mismatch"; + } else if (anchorRow.deleted === 1) { + anchorAction = "already-tombstoned"; + } else { + anchorAction = dryRun ? "would-tombstone" : "tombstoned"; + } + entries.push({ + memberId, + name: origin.name ?? null, + sessionId: anchorId, + sessionIsolation: isolation, + action: anchorAction, + kind: "anchor", + ...anchorRow !== void 0 ? { title: anchorRow.title } : {} + }); + if (!dryRun && anchorOwned && anchorRow.deleted !== 1) { + const result = tombstoneAnchor({ + taskId: anchorId, + workspacePath: anchorRow.workspace_path, + dbPath: tasksIndexPath + }); + entries[entries.length - 1].action = result.applied ? "tombstoned" : result.reason === "row-not-owned" ? "mismatch" : "absent"; + } + } + } + const applied = entries.filter((e) => e.action === "archived" || e.action === "tombstoned").length; + const tombstoned = entries.filter((e) => e.action === "tombstoned").length; + let ledgerPath = null; + if (!dryRun) { + ledgerPath = path13.join(teamDir, "sidebar-migration.json"); + const now = input.now ?? Date.now; + const ledger = { + kind: "sidebar-audit", + version: 1, + at: new Date(now()).toISOString(), + tasksIndexPath, + entries + }; + writeAtomic(ledgerPath, ledger); + } + return { teamDir, tasksIndexPath, dryRun, entries, applied, tombstoned, ledgerPath }; +} +function writeAtomic(file, value) { + const tmp = `${file}.tmp-${process.pid}`; + fs12.writeFileSync(tmp, `${JSON.stringify(value, null, 2)} +`, { mode: 384 }); + fs12.renameSync(tmp, file); +} +function renderSidebarAudit(result) { + const lines = []; + lines.push(`sidebar-audit ${result.teamDir}`); + lines.push(`tasks-index: ${result.tasksIndexPath}`); + lines.push(`mode: ${result.dryRun ? "dry-run\uFF08\u52A0 --apply \u624D\u5199\u5E93\uFF09" : "apply"}`); + if (result.entries.length === 0) { + lines.push("\uFF08\u6CA1\u6709\u5DF2\u843D\u5B9A\u7684\u6210\u5458\u4F1A\u8BDD\uFF09"); + return lines.join("\n"); + } + for (const e of result.entries) { + const label = e.name !== null ? `${e.name} (${e.memberId})` : e.memberId; + const kind = e.kind === "anchor" ? "anchor" : "member"; + const title = e.title !== void 0 ? ` \xB7 ${e.title}` : ""; + lines.push(`- ${label} [${kind}/${e.sessionIsolation}] ${e.sessionId} \u2192 ${e.action}${title}`); + } + lines.push( + result.dryRun ? `\u8BA1\u5212\u5F52\u6863 ${result.entries.filter((e) => e.action === "would-archive").length} \u6761\u3001tombstone ${result.entries.filter((e) => e.action === "would-tombstone").length} \u4E2A anchor\uFF1B\u672A\u5199\u5E93\u3002` : `\u5DF2\u5F52\u6863 ${result.applied - result.tombstoned} \u6761\u3001tombstone ${result.tombstoned} \u4E2A anchor\uFF1B\u53F0\u8D26 ${result.ledgerPath}` + ); + return lines.join("\n"); +} + +// src/cli/main.ts +var USAGE = `team-ctl \u2014 Agent Teams \u8FD0\u7EF4/\u6392\u969C\u5DE5\u5177 + +\u7528\u6CD5\uFF1A + team-ctl state [--json] [--team ] \u8BFB\u76D8\u91CD\u653E\uFF1ARoster/Tasks/Mailbox \u5206\u533A\u89C6\u56FE + team-ctl tail [--n ] \u8DDF\u968F events.jsonl\uFF08\u56DB\u7C7B\u4E8B\u4EF6\u7740\u8272\uFF0C\u672C\u5730\u65F6\u533A\uFF09 + team-ctl inject-event \u76F4\u5199\u539F\u59CB\u4E8B\u4EF6\u884C\uFF08test-only\uFF0C\u7ED5\u8FC7 journal\uFF09 + team-ctl inject-event --sample invalid-member --team + \u6CE8\u5165\u975E\u6CD5 member \u4E8B\u4EF6\u6837\u4F8B\uFF08\u91CD\u653E \u2192 failure \u7EC8\u6001\uFF09 + team-ctl call [params-json] \u7ECF socket \u8C03\u534F\u8C03\u8005\uFF08\u65E0\u534F\u8C03\u8005 \u2192 \u53EF\u8BFB\u9519\u8BEF\uFF09 + team-ctl transcript [--json] [--cursor ] [--limit ] [--team ] + \u6210\u5458\u4F1A\u8BDD\u67E5\u770B\u6D41\uFF08T5.7 CLI \u5BF9\u7B49\uFF1B\u4E0E\u9762\u677F detail \u540C\u4E00\u5408\u6210\uFF09 + team-ctl widget [--out ] [--theme light|dark] [--lang zh|en] [--standalone] + ::visualize \u5FEB\u7167\u5361\u7247\u7247\u6BB5 / standalone \u9759\u6001\u9875\uFF08T5.3 CLI \u964D\u7EA7\u94FE\uFF09 + team-ctl open-panel [--no-open] \u6253\u5F00\u4F34\u751F\u9762\u677F\uFF08T5.5\uFF1Bdaemon \u9700\u4EE5 TEAM_COMPANION=1 \u8FD0\u884C\uFF09 + team-ctl sidebar-audit [--apply] [--json] \u628A\u5DF2\u6CC4\u6F0F\u5230\u5DE6\u4FA7\u4EFB\u52A1\u680F\u7684\u6210\u5458\u4F1A\u8BDD\u5F52\u6863\uFF08\u9ED8\u8BA4 dry-run\uFF09`; +async function main(argv) { + const [command, ...rest] = argv; + if (command === void 0 || command === "help" || command === "--help") { + process.stdout.write(USAGE + "\n"); + return command === void 0 ? 2 : 0; + } + try { + switch (command) { + case "state": + return await cmdState(rest); + case "tail": + return await cmdTail(rest); + case "inject-event": + return cmdInject(rest); + case "call": + return await cmdCall(rest); + case "transcript": + return await cmdTranscript(rest); + case "widget": + return await cmdWidget(rest); + case "open-panel": + return await cmdOpenPanel(rest); + case "sidebar-audit": + return cmdSidebarAudit(rest); + default: + process.stderr.write(`team-ctl: \u672A\u77E5\u5B50\u547D\u4EE4 ${JSON.stringify(command)} + +${USAGE} +`); + return 2; + } + } catch (err) { + const first = err instanceof Error ? err.message.split("\n")[0] : String(err); + process.stderr.write(`team-ctl ${command}: ${first} +`); + return 1; + } +} +var invokedPath = process.argv[1]; +if (invokedPath !== void 0 && import.meta.url === pathToFileURL(path14.resolve(invokedPath)).href) { + process.exitCode = await main(process.argv.slice(2)); +} +function takeFlag(rest, name) { + const i = rest.indexOf(name); + return i >= 0 ? rest[i + 1] : void 0; +} +function resolveTeamId(teamDir, explicit) { + if (explicit !== void 0) return explicit; + const eventsFile = path14.join(teamDir, "events.jsonl"); + if (fs13.existsSync(eventsFile)) { + const first = fs13.readFileSync(eventsFile, "utf8").split("\n", 1)[0]; + if (first !== void 0 && first.length > 0) { + try { + const parsed = JSON.parse(first); + if (typeof parsed.event?.teamId === "string") return parsed.event.teamId; + } catch { + } + } + } + const base = path14.basename(teamDir); + if (base.length === 0) throw new Error("\u65E0\u6CD5\u63A8\u65AD teamId\uFF1A\u7A7A\u76EE\u5F55\u540D\uFF1B\u8BF7\u4F20 --team "); + return base; +} +async function cmdState(rest) { + const teamDir = rest[0]; + if (teamDir === void 0 || teamDir.startsWith("--")) { + process.stderr.write("team-ctl state: \u9700\u8981 \n"); + return 2; + } + const json = rest.includes("--json"); + const teamId = resolveTeamId(teamDir, takeFlag(rest, "--team")); + const loaded = await load(teamDir, teamId); + process.stdout.write(renderState({ teamId, loaded, json }, paintForStream(process.stdout)) + "\n"); + return 0; +} +async function cmdTail(rest) { + const teamDir = rest[0]; + if (teamDir === void 0 || teamDir.startsWith("--")) { + process.stderr.write("team-ctl tail: \u9700\u8981 \n"); + return 2; + } + const nFlag = takeFlag(rest, "--n"); + const fromLines = nFlag !== void 0 ? Number(nFlag) : void 0; + if (fromLines !== void 0 && (!Number.isInteger(fromLines) || fromLines < 0)) { + process.stderr.write("team-ctl tail: --n \u5FC5\u987B\u662F\u975E\u8D1F\u6574\u6570\n"); + return 2; + } + const controller = new AbortController(); + process.once("SIGINT", () => controller.abort()); + process.once("SIGTERM", () => controller.abort()); + await followEvents(eventsFileOf(teamDir), { + fromLines, + paint: paintForStream(process.stdout), + signal: controller.signal, + onLine: (formatted) => process.stdout.write(formatted + "\n") + }); + return 0; +} +function cmdInject(rest) { + const teamDir = rest[0]; + if (teamDir === void 0 || teamDir.startsWith("--")) { + process.stderr.write("team-ctl inject-event: \u9700\u8981 \n"); + return 2; + } + const sample = takeFlag(rest, "--sample"); + let line = rest[1]; + if (sample === "invalid-member") { + const teamId = resolveTeamId(teamDir, takeFlag(rest, "--team")); + line = invalidMemberSample(teamId); + } else if (sample !== void 0) { + process.stderr.write(`team-ctl inject-event: \u672A\u77E5\u6837\u4F8B ${JSON.stringify(sample)}\uFF08\u53EF\u7528\uFF1Ainvalid-member\uFF09 +`); + return 2; + } + if (line === void 0 || line.startsWith("--")) { + process.stderr.write("team-ctl inject-event: \u9700\u8981 \uFF08\u6216 --sample invalid-member\uFF09\n"); + return 2; + } + const result = injectEvent(teamDir, line); + process.stdout.write( + [ + `test-only\uFF1A\u5DF2\u7ED5\u8FC7 journal \u76F4\u5199\uFF08\u65E0\u4E0D\u53D8\u91CF/\u65E0\u9501/\u65E0 fsync\uFF09`, + `seq=${result.seq} file=${result.file}`, + result.line, + JSON.stringify({ tool: "team-ctl", action: "inject-event", teamDir, seq: result.seq, ok: true }), + "" + ].join("\n") + ); + return 0; +} +async function cmdCall(rest) { + const [teamDir, method, paramsJson] = rest; + if (teamDir === void 0 || method === void 0 || teamDir.startsWith("--")) { + process.stderr.write("team-ctl call: \u9700\u8981 [params-json]\n"); + return 2; + } + const outcome = await callTeam(teamDir, method, paramsJson); + process.stdout.write(outcome.output + "\n"); + process.stderr.write(outcome.audit + "\n"); + return outcome.ok ? 0 : 1; +} +async function cmdTranscript(rest) { + const teamDir = rest[0]; + const member = rest[1]; + if (teamDir === void 0 || member === void 0 || teamDir.startsWith("--") || member.startsWith("--")) { + process.stderr.write("team-ctl transcript: \u9700\u8981 \n"); + return 2; + } + const teamId = resolveTeamId(teamDir, takeFlag(rest, "--team")); + const loaded = await load(teamDir, teamId); + const cursorFlag = takeFlag(rest, "--cursor"); + const limitFlag = takeFlag(rest, "--limit"); + const cursor = cursorFlag !== void 0 ? Number(cursorFlag) : void 0; + const limit = limitFlag !== void 0 ? Number(limitFlag) : void 0; + if (cursor !== void 0 && !Number.isSafeInteger(cursor)) { + process.stderr.write("team-ctl transcript: --cursor \u5FC5\u987B\u662F\u5B89\u5168\u6574\u6570\n"); + return 2; + } + if (limit !== void 0 && !Number.isSafeInteger(limit)) { + process.stderr.write("team-ctl transcript: --limit \u5FC5\u987B\u662F\u5B89\u5168\u6574\u6570\n"); + return 2; + } + const out = renderTranscript({ + teamDir, + teamId, + loaded, + member, + json: rest.includes("--json"), + ...cursor !== void 0 ? { cursor } : {}, + ...limit !== void 0 ? { limit } : {} + }); + process.stdout.write(out + "\n"); + return 0; +} +async function cmdWidget(rest) { + const teamDir = rest[0]; + if (teamDir === void 0 || teamDir.startsWith("--")) { + process.stderr.write("team-ctl widget: \u9700\u8981 \n"); + return 2; + } + const teamId = resolveTeamId(teamDir, takeFlag(rest, "--team")); + const loaded = await load(teamDir, teamId); + const theme = takeFlag(rest, "--theme"); + if (theme !== void 0 && theme !== "light" && theme !== "dark") { + process.stderr.write("team-ctl widget: --theme \u4EC5\u652F\u6301 light|dark\n"); + return 2; + } + const langFlag = takeFlag(rest, "--lang"); + if (langFlag !== void 0 && langFlag !== "zh" && langFlag !== "en") { + process.stderr.write("team-ctl widget: --lang \u4EC5\u652F\u6301 zh|en\n"); + return 2; + } + const result = renderWidget({ + teamDir, + teamId, + loaded, + theme: theme ?? "light", + lang: langFlag ?? "zh", + standalone: rest.includes("--standalone"), + ...takeFlag(rest, "--out") !== void 0 ? { out: takeFlag(rest, "--out") } : {} + }); + if (result.out !== void 0) { + process.stdout.write(`${result.out} +`); + } else { + process.stdout.write(result.html + "\n"); + } + return 0; +} +function cmdSidebarAudit(rest) { + const teamDir = rest[0]; + if (teamDir === void 0 || teamDir.startsWith("--")) { + process.stderr.write("team-ctl sidebar-audit: \u9700\u8981 \n"); + return 2; + } + const result = auditSidebar({ + teamDir, + dryRun: !rest.includes("--apply"), + ...takeFlag(rest, "--tasks-index") !== void 0 ? { tasksIndexPath: takeFlag(rest, "--tasks-index") } : {} + }); + process.stdout.write( + rest.includes("--json") ? `${JSON.stringify(result, null, 2)} +` : `${renderSidebarAudit(result)} +` + ); + return 0; +} +async function cmdOpenPanel(rest) { + const result = await openPanel({ noOpen: rest.includes("--no-open") }); + process.stdout.write(result.message + "\n"); + return result.ok ? 0 : 1; +} +export { + main +}; diff --git a/external_plugins/agent-team/runtime/team-daemon.mjs b/external_plugins/agent-team/runtime/team-daemon.mjs new file mode 100644 index 00000000..a6d126ba --- /dev/null +++ b/external_plugins/agent-team/runtime/team-daemon.mjs @@ -0,0 +1,27219 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/ajv/dist/compile/codegen/code.js +var require_code = __commonJS({ + "node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; + var _CodeOrName = class { + }; + exports._CodeOrName = _CodeOrName; + exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; + var Name = class extends _CodeOrName { + constructor(s) { + super(); + if (!exports.IDENTIFIER.test(s)) + throw new Error("CodeGen: name must be a valid identifier"); + this.str = s; + } + toString() { + return this.str; + } + emptyStr() { + return false; + } + get names() { + return { [this.str]: 1 }; + } + }; + exports.Name = Name; + var _Code = class extends _CodeOrName { + constructor(code) { + super(); + this._items = typeof code === "string" ? [code] : code; + } + toString() { + return this.str; + } + emptyStr() { + if (this._items.length > 1) + return false; + const item = this._items[0]; + return item === "" || item === '""'; + } + get str() { + var _a; + return (_a = this._str) !== null && _a !== void 0 ? _a : this._str = this._items.reduce((s, c) => `${s}${c}`, ""); + } + get names() { + var _a; + return (_a = this._names) !== null && _a !== void 0 ? _a : this._names = this._items.reduce((names, c) => { + if (c instanceof Name) + names[c.str] = (names[c.str] || 0) + 1; + return names; + }, {}); + } + }; + exports._Code = _Code; + exports.nil = new _Code(""); + function _(strs, ...args) { + const code = [strs[0]]; + let i = 0; + while (i < args.length) { + addCodeArg(code, args[i]); + code.push(strs[++i]); + } + return new _Code(code); + } + exports._ = _; + var plus = new _Code("+"); + function str(strs, ...args) { + const expr = [safeStringify(strs[0])]; + let i = 0; + while (i < args.length) { + expr.push(plus); + addCodeArg(expr, args[i]); + expr.push(plus, safeStringify(strs[++i])); + } + optimize(expr); + return new _Code(expr); + } + exports.str = str; + function addCodeArg(code, arg) { + if (arg instanceof _Code) + code.push(...arg._items); + else if (arg instanceof Name) + code.push(arg); + else + code.push(interpolate(arg)); + } + exports.addCodeArg = addCodeArg; + function optimize(expr) { + let i = 1; + while (i < expr.length - 1) { + if (expr[i] === plus) { + const res = mergeExprItems(expr[i - 1], expr[i + 1]); + if (res !== void 0) { + expr.splice(i - 1, 3, res); + continue; + } + expr[i++] = "+"; + } + i++; + } + } + function mergeExprItems(a, b) { + if (b === '""') + return a; + if (a === '""') + return b; + if (typeof a == "string") { + if (b instanceof Name || a[a.length - 1] !== '"') + return; + if (typeof b != "string") + return `${a.slice(0, -1)}${b}"`; + if (b[0] === '"') + return a.slice(0, -1) + b.slice(1); + return; + } + if (typeof b == "string" && b[0] === '"' && !(a instanceof Name)) + return `"${a}${b.slice(1)}`; + return; + } + function strConcat(c1, c2) { + return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`; + } + exports.strConcat = strConcat; + function interpolate(x) { + return typeof x == "number" || typeof x == "boolean" || x === null ? x : safeStringify(Array.isArray(x) ? x.join(",") : x); + } + function stringify2(x) { + return new _Code(safeStringify(x)); + } + exports.stringify = stringify2; + function safeStringify(x) { + return JSON.stringify(x).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); + } + exports.safeStringify = safeStringify; + function getProperty(key) { + return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _`[${key}]`; + } + exports.getProperty = getProperty; + function getEsmExportName(key) { + if (typeof key == "string" && exports.IDENTIFIER.test(key)) { + return new _Code(`${key}`); + } + throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); + } + exports.getEsmExportName = getEsmExportName; + function regexpCode(rx) { + return new _Code(rx.toString()); + } + exports.regexpCode = regexpCode; + } +}); + +// node_modules/ajv/dist/compile/codegen/scope.js +var require_scope = __commonJS({ + "node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; + var code_1 = require_code(); + var ValueError = class extends Error { + constructor(name) { + super(`CodeGen: "code" for ${name} not defined`); + this.value = name.value; + } + }; + var UsedValueState; + (function(UsedValueState2) { + UsedValueState2[UsedValueState2["Started"] = 0] = "Started"; + UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed"; + })(UsedValueState || (exports.UsedValueState = UsedValueState = {})); + exports.varKinds = { + const: new code_1.Name("const"), + let: new code_1.Name("let"), + var: new code_1.Name("var") + }; + var Scope = class { + constructor({ prefixes, parent } = {}) { + this._names = {}; + this._prefixes = prefixes; + this._parent = parent; + } + toName(nameOrPrefix) { + return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); + } + name(prefix) { + return new code_1.Name(this._newName(prefix)); + } + _newName(prefix) { + const ng = this._names[prefix] || this._nameGroup(prefix); + return `${prefix}${ng.index++}`; + } + _nameGroup(prefix) { + var _a, _b; + if (((_b = (_a = this._parent) === null || _a === void 0 ? void 0 : _a._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) { + throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); + } + return this._names[prefix] = { prefix, index: 0 }; + } + }; + exports.Scope = Scope; + var ValueScopeName = class extends code_1.Name { + constructor(prefix, nameStr) { + super(nameStr); + this.prefix = prefix; + } + setValue(value, { property, itemIndex }) { + this.value = value; + this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`; + } + }; + exports.ValueScopeName = ValueScopeName; + var line = (0, code_1._)`\n`; + var ValueScope = class extends Scope { + constructor(opts) { + super(opts); + this._values = {}; + this._scope = opts.scope; + this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; + } + get() { + return this._scope; + } + name(prefix) { + return new ValueScopeName(prefix, this._newName(prefix)); + } + value(nameOrPrefix, value) { + var _a; + if (value.ref === void 0) + throw new Error("CodeGen: ref must be passed in value"); + const name = this.toName(nameOrPrefix); + const { prefix } = name; + const valueKey = (_a = value.key) !== null && _a !== void 0 ? _a : value.ref; + let vs = this._values[prefix]; + if (vs) { + const _name = vs.get(valueKey); + if (_name) + return _name; + } else { + vs = this._values[prefix] = /* @__PURE__ */ new Map(); + } + vs.set(valueKey, name); + const s = this._scope[prefix] || (this._scope[prefix] = []); + const itemIndex = s.length; + s[itemIndex] = value.ref; + name.setValue(value, { property: prefix, itemIndex }); + return name; + } + getValue(prefix, keyOrRef) { + const vs = this._values[prefix]; + if (!vs) + return; + return vs.get(keyOrRef); + } + scopeRefs(scopeName, values = this._values) { + return this._reduceValues(values, (name) => { + if (name.scopePath === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return (0, code_1._)`${scopeName}${name.scopePath}`; + }); + } + scopeCode(values = this._values, usedValues, getCode) { + return this._reduceValues(values, (name) => { + if (name.value === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return name.value.code; + }, usedValues, getCode); + } + _reduceValues(values, valueCode, usedValues = {}, getCode) { + let code = code_1.nil; + for (const prefix in values) { + const vs = values[prefix]; + if (!vs) + continue; + const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map(); + vs.forEach((name) => { + if (nameSet.has(name)) + return; + nameSet.set(name, UsedValueState.Started); + let c = valueCode(name); + if (c) { + const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; + code = (0, code_1._)`${code}${def} ${name} = ${c};${this.opts._n}`; + } else if (c = getCode === null || getCode === void 0 ? void 0 : getCode(name)) { + code = (0, code_1._)`${code}${c}${this.opts._n}`; + } else { + throw new ValueError(name); + } + nameSet.set(name, UsedValueState.Completed); + }); + } + return code; + } + }; + exports.ValueScope = ValueScope; + } +}); + +// node_modules/ajv/dist/compile/codegen/index.js +var require_codegen = __commonJS({ + "node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; + var code_1 = require_code(); + var scope_1 = require_scope(); + var code_2 = require_code(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return code_2._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return code_2.str; + } }); + Object.defineProperty(exports, "strConcat", { enumerable: true, get: function() { + return code_2.strConcat; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return code_2.nil; + } }); + Object.defineProperty(exports, "getProperty", { enumerable: true, get: function() { + return code_2.getProperty; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return code_2.stringify; + } }); + Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function() { + return code_2.regexpCode; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return code_2.Name; + } }); + var scope_2 = require_scope(); + Object.defineProperty(exports, "Scope", { enumerable: true, get: function() { + return scope_2.Scope; + } }); + Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function() { + return scope_2.ValueScope; + } }); + Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function() { + return scope_2.ValueScopeName; + } }); + Object.defineProperty(exports, "varKinds", { enumerable: true, get: function() { + return scope_2.varKinds; + } }); + exports.operators = { + GT: new code_1._Code(">"), + GTE: new code_1._Code(">="), + LT: new code_1._Code("<"), + LTE: new code_1._Code("<="), + EQ: new code_1._Code("==="), + NEQ: new code_1._Code("!=="), + NOT: new code_1._Code("!"), + OR: new code_1._Code("||"), + AND: new code_1._Code("&&"), + ADD: new code_1._Code("+") + }; + var Node = class { + optimizeNodes() { + return this; + } + optimizeNames(_names, _constants) { + return this; + } + }; + var Def = class extends Node { + constructor(varKind, name, rhs) { + super(); + this.varKind = varKind; + this.name = name; + this.rhs = rhs; + } + render({ es5, _n }) { + const varKind = es5 ? scope_1.varKinds.var : this.varKind; + const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`; + return `${varKind} ${this.name}${rhs};` + _n; + } + optimizeNames(names, constants) { + if (!names[this.name.str]) + return; + if (this.rhs) + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; + } + }; + var Assign = class extends Node { + constructor(lhs, rhs, sideEffects) { + super(); + this.lhs = lhs; + this.rhs = rhs; + this.sideEffects = sideEffects; + } + render({ _n }) { + return `${this.lhs} = ${this.rhs};` + _n; + } + optimizeNames(names, constants) { + if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) + return; + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; + return addExprNames(names, this.rhs); + } + }; + var AssignOp = class extends Assign { + constructor(lhs, op, rhs, sideEffects) { + super(lhs, rhs, sideEffects); + this.op = op; + } + render({ _n }) { + return `${this.lhs} ${this.op}= ${this.rhs};` + _n; + } + }; + var Label = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + return `${this.label}:` + _n; + } + }; + var Break = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + const label = this.label ? ` ${this.label}` : ""; + return `break${label};` + _n; + } + }; + var Throw = class extends Node { + constructor(error2) { + super(); + this.error = error2; + } + render({ _n }) { + return `throw ${this.error};` + _n; + } + get names() { + return this.error.names; + } + }; + var AnyCode = class extends Node { + constructor(code) { + super(); + this.code = code; + } + render({ _n }) { + return `${this.code};` + _n; + } + optimizeNodes() { + return `${this.code}` ? this : void 0; + } + optimizeNames(names, constants) { + this.code = optimizeExpr(this.code, names, constants); + return this; + } + get names() { + return this.code instanceof code_1._CodeOrName ? this.code.names : {}; + } + }; + var ParentNode = class extends Node { + constructor(nodes = []) { + super(); + this.nodes = nodes; + } + render(opts) { + return this.nodes.reduce((code, n) => code + n.render(opts), ""); + } + optimizeNodes() { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i].optimizeNodes(); + if (Array.isArray(n)) + nodes.splice(i, 1, ...n); + else if (n) + nodes[i] = n; + else + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + optimizeNames(names, constants) { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i]; + if (n.optimizeNames(names, constants)) + continue; + subtractNames(names, n.names); + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + get names() { + return this.nodes.reduce((names, n) => addNames(names, n.names), {}); + } + }; + var BlockNode = class extends ParentNode { + render(opts) { + return "{" + opts._n + super.render(opts) + "}" + opts._n; + } + }; + var Root = class extends ParentNode { + }; + var Else = class extends BlockNode { + }; + Else.kind = "else"; + var If = class _If extends BlockNode { + constructor(condition, nodes) { + super(nodes); + this.condition = condition; + } + render(opts) { + let code = `if(${this.condition})` + super.render(opts); + if (this.else) + code += "else " + this.else.render(opts); + return code; + } + optimizeNodes() { + super.optimizeNodes(); + const cond = this.condition; + if (cond === true) + return this.nodes; + let e = this.else; + if (e) { + const ns = e.optimizeNodes(); + e = this.else = Array.isArray(ns) ? new Else(ns) : ns; + } + if (e) { + if (cond === false) + return e instanceof _If ? e : e.nodes; + if (this.nodes.length) + return this; + return new _If(not(cond), e instanceof _If ? [e] : e.nodes); + } + if (cond === false || !this.nodes.length) + return void 0; + return this; + } + optimizeNames(names, constants) { + var _a; + this.else = (_a = this.else) === null || _a === void 0 ? void 0 : _a.optimizeNames(names, constants); + if (!(super.optimizeNames(names, constants) || this.else)) + return; + this.condition = optimizeExpr(this.condition, names, constants); + return this; + } + get names() { + const names = super.names; + addExprNames(names, this.condition); + if (this.else) + addNames(names, this.else.names); + return names; + } + }; + If.kind = "if"; + var For = class extends BlockNode { + }; + For.kind = "for"; + var ForLoop = class extends For { + constructor(iteration) { + super(); + this.iteration = iteration; + } + render(opts) { + return `for(${this.iteration})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iteration = optimizeExpr(this.iteration, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iteration.names); + } + }; + var ForRange = class extends For { + constructor(varKind, name, from, to) { + super(); + this.varKind = varKind; + this.name = name; + this.from = from; + this.to = to; + } + render(opts) { + const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; + const { name, from, to } = this; + return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); + } + get names() { + const names = addExprNames(super.names, this.from); + return addExprNames(names, this.to); + } + }; + var ForIter = class extends For { + constructor(loop, varKind, name, iterable) { + super(); + this.loop = loop; + this.varKind = varKind; + this.name = name; + this.iterable = iterable; + } + render(opts) { + return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iterable = optimizeExpr(this.iterable, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iterable.names); + } + }; + var Func = class extends BlockNode { + constructor(name, args, async) { + super(); + this.name = name; + this.args = args; + this.async = async; + } + render(opts) { + const _async = this.async ? "async " : ""; + return `${_async}function ${this.name}(${this.args})` + super.render(opts); + } + }; + Func.kind = "func"; + var Return = class extends ParentNode { + render(opts) { + return "return " + super.render(opts); + } + }; + Return.kind = "return"; + var Try = class extends BlockNode { + render(opts) { + let code = "try" + super.render(opts); + if (this.catch) + code += this.catch.render(opts); + if (this.finally) + code += this.finally.render(opts); + return code; + } + optimizeNodes() { + var _a, _b; + super.optimizeNodes(); + (_a = this.catch) === null || _a === void 0 ? void 0 : _a.optimizeNodes(); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); + return this; + } + optimizeNames(names, constants) { + var _a, _b; + super.optimizeNames(names, constants); + (_a = this.catch) === null || _a === void 0 ? void 0 : _a.optimizeNames(names, constants); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); + return this; + } + get names() { + const names = super.names; + if (this.catch) + addNames(names, this.catch.names); + if (this.finally) + addNames(names, this.finally.names); + return names; + } + }; + var Catch = class extends BlockNode { + constructor(error2) { + super(); + this.error = error2; + } + render(opts) { + return `catch(${this.error})` + super.render(opts); + } + }; + Catch.kind = "catch"; + var Finally = class extends BlockNode { + render(opts) { + return "finally" + super.render(opts); + } + }; + Finally.kind = "finally"; + var CodeGen = class { + constructor(extScope, opts = {}) { + this._values = {}; + this._blockStarts = []; + this._constants = {}; + this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; + this._extScope = extScope; + this._scope = new scope_1.Scope({ parent: extScope }); + this._nodes = [new Root()]; + } + toString() { + return this._root.render(this.opts); + } + // returns unique name in the internal scope + name(prefix) { + return this._scope.name(prefix); + } + // reserves unique name in the external scope + scopeName(prefix) { + return this._extScope.name(prefix); + } + // reserves unique name in the external scope and assigns value to it + scopeValue(prefixOrName, value) { + const name = this._extScope.value(prefixOrName, value); + const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set()); + vs.add(name); + return name; + } + getScopeValue(prefix, keyOrRef) { + return this._extScope.getValue(prefix, keyOrRef); + } + // return code that assigns values in the external scope to the names that are used internally + // (same names that were returned by gen.scopeName or gen.scopeValue) + scopeRefs(scopeName) { + return this._extScope.scopeRefs(scopeName, this._values); + } + scopeCode() { + return this._extScope.scopeCode(this._values); + } + _def(varKind, nameOrPrefix, rhs, constant) { + const name = this._scope.toName(nameOrPrefix); + if (rhs !== void 0 && constant) + this._constants[name.str] = rhs; + this._leafNode(new Def(varKind, name, rhs)); + return name; + } + // `const` declaration (`var` in es5 mode) + const(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); + } + // `let` declaration with optional assignment (`var` in es5 mode) + let(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); + } + // `var` declaration with optional assignment + var(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); + } + // assignment code + assign(lhs, rhs, sideEffects) { + return this._leafNode(new Assign(lhs, rhs, sideEffects)); + } + // `+=` code + add(lhs, rhs) { + return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); + } + // appends passed SafeExpr to code or executes Block + code(c) { + if (typeof c == "function") + c(); + else if (c !== code_1.nil) + this._leafNode(new AnyCode(c)); + return this; + } + // returns code for object literal for the passed argument list of key-value pairs + object(...keyValues) { + const code = ["{"]; + for (const [key, value] of keyValues) { + if (code.length > 1) + code.push(","); + code.push(key); + if (key !== value || this.opts.es5) { + code.push(":"); + (0, code_1.addCodeArg)(code, value); + } + } + code.push("}"); + return new code_1._Code(code); + } + // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) + if(condition, thenBody, elseBody) { + this._blockNode(new If(condition)); + if (thenBody && elseBody) { + this.code(thenBody).else().code(elseBody).endIf(); + } else if (thenBody) { + this.code(thenBody).endIf(); + } else if (elseBody) { + throw new Error('CodeGen: "else" body without "then" body'); + } + return this; + } + // `else if` clause - invalid without `if` or after `else` clauses + elseIf(condition) { + return this._elseNode(new If(condition)); + } + // `else` clause - only valid after `if` or `else if` clauses + else() { + return this._elseNode(new Else()); + } + // end `if` statement (needed if gen.if was used only with condition) + endIf() { + return this._endBlockNode(If, Else); + } + _for(node, forBody) { + this._blockNode(node); + if (forBody) + this.code(forBody).endFor(); + return this; + } + // a generic `for` clause (or statement if `forBody` is passed) + for(iteration, forBody) { + return this._for(new ForLoop(iteration), forBody); + } + // `for` statement for a range of values + forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); + } + // `for-of` statement (in es5 mode replace with a normal for loop) + forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { + const name = this._scope.toName(nameOrPrefix); + if (this.opts.es5) { + const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); + return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => { + this.var(name, (0, code_1._)`${arr}[${i}]`); + forBody(name); + }); + } + return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); + } + // `for-in` statement. + // With option `ownProperties` replaced with a `for-of` loop for object keys + forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { + if (this.opts.ownProperties) { + return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody); + } + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); + } + // end `for` loop + endFor() { + return this._endBlockNode(For); + } + // `label` statement + label(label) { + return this._leafNode(new Label(label)); + } + // `break` statement + break(label) { + return this._leafNode(new Break(label)); + } + // `return` statement + return(value) { + const node = new Return(); + this._blockNode(node); + this.code(value); + if (node.nodes.length !== 1) + throw new Error('CodeGen: "return" should have one node'); + return this._endBlockNode(Return); + } + // `try` statement + try(tryBody, catchCode, finallyCode) { + if (!catchCode && !finallyCode) + throw new Error('CodeGen: "try" without "catch" and "finally"'); + const node = new Try(); + this._blockNode(node); + this.code(tryBody); + if (catchCode) { + const error2 = this.name("e"); + this._currNode = node.catch = new Catch(error2); + catchCode(error2); + } + if (finallyCode) { + this._currNode = node.finally = new Finally(); + this.code(finallyCode); + } + return this._endBlockNode(Catch, Finally); + } + // `throw` statement + throw(error2) { + return this._leafNode(new Throw(error2)); + } + // start self-balancing block + block(body, nodeCount) { + this._blockStarts.push(this._nodes.length); + if (body) + this.code(body).endBlock(nodeCount); + return this; + } + // end the current self-balancing block + endBlock(nodeCount) { + const len = this._blockStarts.pop(); + if (len === void 0) + throw new Error("CodeGen: not in self-balancing block"); + const toClose = this._nodes.length - len; + if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) { + throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); + } + this._nodes.length = len; + return this; + } + // `function` heading (or definition if funcBody is passed) + func(name, args = code_1.nil, async, funcBody) { + this._blockNode(new Func(name, args, async)); + if (funcBody) + this.code(funcBody).endFunc(); + return this; + } + // end function definition + endFunc() { + return this._endBlockNode(Func); + } + optimize(n = 1) { + while (n-- > 0) { + this._root.optimizeNodes(); + this._root.optimizeNames(this._root.names, this._constants); + } + } + _leafNode(node) { + this._currNode.nodes.push(node); + return this; + } + _blockNode(node) { + this._currNode.nodes.push(node); + this._nodes.push(node); + } + _endBlockNode(N1, N2) { + const n = this._currNode; + if (n instanceof N1 || N2 && n instanceof N2) { + this._nodes.pop(); + return this; + } + throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); + } + _elseNode(node) { + const n = this._currNode; + if (!(n instanceof If)) { + throw new Error('CodeGen: "else" without "if"'); + } + this._currNode = n.else = node; + return this; + } + get _root() { + return this._nodes[0]; + } + get _currNode() { + const ns = this._nodes; + return ns[ns.length - 1]; + } + set _currNode(node) { + const ns = this._nodes; + ns[ns.length - 1] = node; + } + }; + exports.CodeGen = CodeGen; + function addNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) + (from[n] || 0); + return names; + } + function addExprNames(names, from) { + return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; + } + function optimizeExpr(expr, names, constants) { + if (expr instanceof code_1.Name) + return replaceName(expr); + if (!canOptimize(expr)) + return expr; + return new code_1._Code(expr._items.reduce((items, c) => { + if (c instanceof code_1.Name) + c = replaceName(c); + if (c instanceof code_1._Code) + items.push(...c._items); + else + items.push(c); + return items; + }, [])); + function replaceName(n) { + const c = constants[n.str]; + if (c === void 0 || names[n.str] !== 1) + return n; + delete names[n.str]; + return c; + } + function canOptimize(e) { + return e instanceof code_1._Code && e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== void 0); + } + } + function subtractNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) - (from[n] || 0); + } + function not(x) { + return typeof x == "boolean" || typeof x == "number" || x === null ? !x : (0, code_1._)`!${par(x)}`; + } + exports.not = not; + var andCode = mappend(exports.operators.AND); + function and(...args) { + return args.reduce(andCode); + } + exports.and = and; + var orCode = mappend(exports.operators.OR); + function or(...args) { + return args.reduce(orCode); + } + exports.or = or; + function mappend(op) { + return (x, y) => x === code_1.nil ? y : y === code_1.nil ? x : (0, code_1._)`${par(x)} ${op} ${par(y)}`; + } + function par(x) { + return x instanceof code_1.Name ? x : (0, code_1._)`(${x})`; + } + } +}); + +// node_modules/ajv/dist/compile/util.js +var require_util = __commonJS({ + "node_modules/ajv/dist/compile/util.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; + var codegen_1 = require_codegen(); + var code_1 = require_code(); + function toHash(arr) { + const hash = {}; + for (const item of arr) + hash[item] = true; + return hash; + } + exports.toHash = toHash; + function alwaysValidSchema(it, schema) { + if (typeof schema == "boolean") + return schema; + if (Object.keys(schema).length === 0) + return true; + checkUnknownRules(it, schema); + return !schemaHasRules(schema, it.self.RULES.all); + } + exports.alwaysValidSchema = alwaysValidSchema; + function checkUnknownRules(it, schema = it.schema) { + const { opts, self } = it; + if (!opts.strictSchema) + return; + if (typeof schema === "boolean") + return; + const rules = self.RULES.keywords; + for (const key in schema) { + if (!rules[key]) + checkStrictMode(it, `unknown keyword: "${key}"`); + } + } + exports.checkUnknownRules = checkUnknownRules; + function schemaHasRules(schema, rules) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (rules[key]) + return true; + return false; + } + exports.schemaHasRules = schemaHasRules; + function schemaHasRulesButRef(schema, RULES) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (key !== "$ref" && RULES.all[key]) + return true; + return false; + } + exports.schemaHasRulesButRef = schemaHasRulesButRef; + function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { + if (!$data) { + if (typeof schema == "number" || typeof schema == "boolean") + return schema; + if (typeof schema == "string") + return (0, codegen_1._)`${schema}`; + } + return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`; + } + exports.schemaRefOrVal = schemaRefOrVal; + function unescapeFragment(str) { + return unescapeJsonPointer(decodeURIComponent(str)); + } + exports.unescapeFragment = unescapeFragment; + function escapeFragment(str) { + return encodeURIComponent(escapeJsonPointer(str)); + } + exports.escapeFragment = escapeFragment; + function escapeJsonPointer(str) { + if (typeof str == "number") + return `${str}`; + return str.replace(/~/g, "~0").replace(/\//g, "~1"); + } + exports.escapeJsonPointer = escapeJsonPointer; + function unescapeJsonPointer(str) { + return str.replace(/~1/g, "/").replace(/~0/g, "~"); + } + exports.unescapeJsonPointer = unescapeJsonPointer; + function eachItem(xs, f) { + if (Array.isArray(xs)) { + for (const x of xs) + f(x); + } else { + f(xs); + } + } + exports.eachItem = eachItem; + function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues: mergeValues3, resultToName }) { + return (gen, from, to, toName) => { + const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues3(from, to); + return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; + }; + } + exports.mergeEvaluated = { + props: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => { + gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`)); + }), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => { + if (from === true) { + gen.assign(to, true); + } else { + gen.assign(to, (0, codegen_1._)`${to} || {}`); + setEvaluated(gen, to, from); + } + }), + mergeValues: (from, to) => from === true ? true : { ...from, ...to }, + resultToName: evaluatedPropsToName + }), + items: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)), + mergeValues: (from, to) => from === true ? true : Math.max(from, to), + resultToName: (gen, items) => gen.var("items", items) + }) + }; + function evaluatedPropsToName(gen, ps) { + if (ps === true) + return gen.var("props", true); + const props = gen.var("props", (0, codegen_1._)`{}`); + if (ps !== void 0) + setEvaluated(gen, props, ps); + return props; + } + exports.evaluatedPropsToName = evaluatedPropsToName; + function setEvaluated(gen, props, ps) { + Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true)); + } + exports.setEvaluated = setEvaluated; + var snippets = {}; + function useFunc(gen, f) { + return gen.scopeValue("func", { + ref: f, + code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)) + }); + } + exports.useFunc = useFunc; + var Type; + (function(Type2) { + Type2[Type2["Num"] = 0] = "Num"; + Type2[Type2["Str"] = 1] = "Str"; + })(Type || (exports.Type = Type = {})); + function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { + if (dataProp instanceof codegen_1.Name) { + const isNumber = dataPropType === Type.Num; + return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; + } + return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp); + } + exports.getErrorPath = getErrorPath; + function checkStrictMode(it, msg, mode = it.opts.strictSchema) { + if (!mode) + return; + msg = `strict mode: ${msg}`; + if (mode === true) + throw new Error(msg); + it.self.logger.warn(msg); + } + exports.checkStrictMode = checkStrictMode; + } +}); + +// node_modules/ajv/dist/compile/names.js +var require_names = __commonJS({ + "node_modules/ajv/dist/compile/names.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var names = { + // validation function arguments + data: new codegen_1.Name("data"), + // data passed to validation function + // args passed from referencing schema + valCxt: new codegen_1.Name("valCxt"), + // validation/data context - should not be used directly, it is destructured to the names below + instancePath: new codegen_1.Name("instancePath"), + parentData: new codegen_1.Name("parentData"), + parentDataProperty: new codegen_1.Name("parentDataProperty"), + rootData: new codegen_1.Name("rootData"), + // root data - same as the data passed to the first/top validation function + dynamicAnchors: new codegen_1.Name("dynamicAnchors"), + // used to support recursiveRef and dynamicRef + // function scoped variables + vErrors: new codegen_1.Name("vErrors"), + // null or array of validation errors + errors: new codegen_1.Name("errors"), + // counter of validation errors + this: new codegen_1.Name("this"), + // "globals" + self: new codegen_1.Name("self"), + scope: new codegen_1.Name("scope"), + // JTD serialize/parse name for JSON string and position + json: new codegen_1.Name("json"), + jsonPos: new codegen_1.Name("jsonPos"), + jsonLen: new codegen_1.Name("jsonLen"), + jsonPart: new codegen_1.Name("jsonPart") + }; + exports.default = names; + } +}); + +// node_modules/ajv/dist/compile/errors.js +var require_errors = __commonJS({ + "node_modules/ajv/dist/compile/errors.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var names_1 = require_names(); + exports.keywordError = { + message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation` + }; + exports.keyword$DataError = { + message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)` + }; + function reportError(cxt, error2 = exports.keywordError, errorPaths, overrideAllErrors) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error2, errorPaths); + if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) { + addError(gen, errObj); + } else { + returnErrors(it, (0, codegen_1._)`[${errObj}]`); + } + } + exports.reportError = reportError; + function reportExtraError(cxt, error2 = exports.keywordError, errorPaths) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error2, errorPaths); + addError(gen, errObj); + if (!(compositeRule || allErrors)) { + returnErrors(it, names_1.default.vErrors); + } + } + exports.reportExtraError = reportExtraError; + function resetErrorsCount(gen, errsCount) { + gen.assign(names_1.default.errors, errsCount); + gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null))); + } + exports.resetErrorsCount = resetErrorsCount; + function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) { + if (errsCount === void 0) + throw new Error("ajv implementation error"); + const err = gen.name("err"); + gen.forRange("i", errsCount, names_1.default.errors, (i) => { + gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`); + gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath))); + gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`); + if (it.opts.verbose) { + gen.assign((0, codegen_1._)`${err}.schema`, schemaValue); + gen.assign((0, codegen_1._)`${err}.data`, data); + } + }); + } + exports.extendErrors = extendErrors; + function addError(gen, errObj) { + const err = gen.const("err", errObj); + gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`); + gen.code((0, codegen_1._)`${names_1.default.errors}++`); + } + function returnErrors(it, errs) { + const { gen, validateName, schemaEnv } = it; + if (schemaEnv.$async) { + gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, errs); + gen.return(false); + } + } + var E = { + keyword: new codegen_1.Name("keyword"), + schemaPath: new codegen_1.Name("schemaPath"), + // also used in JTD errors + params: new codegen_1.Name("params"), + propertyName: new codegen_1.Name("propertyName"), + message: new codegen_1.Name("message"), + schema: new codegen_1.Name("schema"), + parentSchema: new codegen_1.Name("parentSchema") + }; + function errorObjectCode(cxt, error2, errorPaths) { + const { createErrors } = cxt.it; + if (createErrors === false) + return (0, codegen_1._)`{}`; + return errorObject(cxt, error2, errorPaths); + } + function errorObject(cxt, error2, errorPaths = {}) { + const { gen, it } = cxt; + const keyValues = [ + errorInstancePath(it, errorPaths), + errorSchemaPath(cxt, errorPaths) + ]; + extraErrorProps(cxt, error2, keyValues); + return gen.object(...keyValues); + } + function errorInstancePath({ errorPath }, { instancePath }) { + const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath; + return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)]; + } + function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) { + let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`; + if (schemaPath) { + schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`; + } + return [E.schemaPath, schPath]; + } + function extraErrorProps(cxt, { params, message }, keyValues) { + const { keyword, data, schemaValue, it } = cxt; + const { opts, propertyName, topSchemaRef, schemaPath } = it; + keyValues.push([E.keyword, keyword], [E.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]); + if (opts.messages) { + keyValues.push([E.message, typeof message == "function" ? message(cxt) : message]); + } + if (opts.verbose) { + keyValues.push([E.schema, schemaValue], [E.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]); + } + if (propertyName) + keyValues.push([E.propertyName, propertyName]); + } + } +}); + +// node_modules/ajv/dist/compile/validate/boolSchema.js +var require_boolSchema = __commonJS({ + "node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; + var errors_1 = require_errors(); + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var boolError = { + message: "boolean schema is false" + }; + function topBoolOrEmptySchema(it) { + const { gen, schema, validateName } = it; + if (schema === false) { + falseSchemaError(it, false); + } else if (typeof schema == "object" && schema.$async === true) { + gen.return(names_1.default.data); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, null); + gen.return(true); + } + } + exports.topBoolOrEmptySchema = topBoolOrEmptySchema; + function boolOrEmptySchema(it, valid) { + const { gen, schema } = it; + if (schema === false) { + gen.var(valid, false); + falseSchemaError(it); + } else { + gen.var(valid, true); + } + } + exports.boolOrEmptySchema = boolOrEmptySchema; + function falseSchemaError(it, overrideAllErrors) { + const { gen, data } = it; + const cxt = { + gen, + keyword: "false schema", + data, + schema: false, + schemaCode: false, + schemaValue: false, + params: {}, + it + }; + (0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors); + } + } +}); + +// node_modules/ajv/dist/compile/rules.js +var require_rules = __commonJS({ + "node_modules/ajv/dist/compile/rules.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getRules = exports.isJSONType = void 0; + var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; + var jsonTypes = new Set(_jsonTypes); + function isJSONType(x) { + return typeof x == "string" && jsonTypes.has(x); + } + exports.isJSONType = isJSONType; + function getRules() { + const groups = { + number: { type: "number", rules: [] }, + string: { type: "string", rules: [] }, + array: { type: "array", rules: [] }, + object: { type: "object", rules: [] } + }; + return { + types: { ...groups, integer: true, boolean: true, null: true }, + rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], + post: { rules: [] }, + all: {}, + keywords: {} + }; + } + exports.getRules = getRules; + } +}); + +// node_modules/ajv/dist/compile/validate/applicability.js +var require_applicability = __commonJS({ + "node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; + function schemaHasRulesForType({ schema, self }, type) { + const group = self.RULES.types[type]; + return group && group !== true && shouldUseGroup(schema, group); + } + exports.schemaHasRulesForType = schemaHasRulesForType; + function shouldUseGroup(schema, group) { + return group.rules.some((rule) => shouldUseRule(schema, rule)); + } + exports.shouldUseGroup = shouldUseGroup; + function shouldUseRule(schema, rule) { + var _a; + return schema[rule.keyword] !== void 0 || ((_a = rule.definition.implements) === null || _a === void 0 ? void 0 : _a.some((kwd) => schema[kwd] !== void 0)); + } + exports.shouldUseRule = shouldUseRule; + } +}); + +// node_modules/ajv/dist/compile/validate/dataType.js +var require_dataType = __commonJS({ + "node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; + var rules_1 = require_rules(); + var applicability_1 = require_applicability(); + var errors_1 = require_errors(); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var DataType; + (function(DataType2) { + DataType2[DataType2["Correct"] = 0] = "Correct"; + DataType2[DataType2["Wrong"] = 1] = "Wrong"; + })(DataType || (exports.DataType = DataType = {})); + function getSchemaTypes(schema) { + const types = getJSONTypes(schema.type); + const hasNull = types.includes("null"); + if (hasNull) { + if (schema.nullable === false) + throw new Error("type: null contradicts nullable: false"); + } else { + if (!types.length && schema.nullable !== void 0) { + throw new Error('"nullable" cannot be used without "type"'); + } + if (schema.nullable === true) + types.push("null"); + } + return types; + } + exports.getSchemaTypes = getSchemaTypes; + function getJSONTypes(ts2) { + const types = Array.isArray(ts2) ? ts2 : ts2 ? [ts2] : []; + if (types.every(rules_1.isJSONType)) + return types; + throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); + } + exports.getJSONTypes = getJSONTypes; + function coerceAndCheckDataType(it, types) { + const { gen, data, opts } = it; + const coerceTo = coerceToTypes(types, opts.coerceTypes); + const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0])); + if (checkTypes) { + const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); + gen.if(wrongType, () => { + if (coerceTo.length) + coerceData(it, types, coerceTo); + else + reportTypeError(it); + }); + } + return checkTypes; + } + exports.coerceAndCheckDataType = coerceAndCheckDataType; + var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); + function coerceToTypes(types, coerceTypes) { + return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : []; + } + function coerceData(it, types, coerceTo) { + const { gen, data, opts } = it; + const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`); + const coerced = gen.let("coerced", (0, codegen_1._)`undefined`); + if (opts.coerceTypes === "array") { + gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); + } + gen.if((0, codegen_1._)`${coerced} !== undefined`); + for (const t of coerceTo) { + if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") { + coerceSpecificType(t); + } + } + gen.else(); + reportTypeError(it); + gen.endIf(); + gen.if((0, codegen_1._)`${coerced} !== undefined`, () => { + gen.assign(data, coerced); + assignParentData(it, coerced); + }); + function coerceSpecificType(t) { + switch (t) { + case "string": + gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`); + return; + case "number": + gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null + || (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "integer": + gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null + || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "boolean": + gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true); + return; + case "null": + gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`); + gen.assign(coerced, null); + return; + case "array": + gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number" + || ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`); + } + } + } + function assignParentData({ gen, parentData, parentDataProperty }, expr) { + gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr)); + } + function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { + const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; + let cond; + switch (dataType) { + case "null": + return (0, codegen_1._)`${data} ${EQ} null`; + case "array": + cond = (0, codegen_1._)`Array.isArray(${data})`; + break; + case "object": + cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`; + break; + case "integer": + cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`); + break; + case "number": + cond = numCond(); + break; + default: + return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`; + } + return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond); + function numCond(_cond = codegen_1.nil) { + return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil); + } + } + exports.checkDataType = checkDataType; + function checkDataTypes(dataTypes, data, strictNums, correct) { + if (dataTypes.length === 1) { + return checkDataType(dataTypes[0], data, strictNums, correct); + } + let cond; + const types = (0, util_1.toHash)(dataTypes); + if (types.array && types.object) { + const notObj = (0, codegen_1._)`typeof ${data} != "object"`; + cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`; + delete types.null; + delete types.array; + delete types.object; + } else { + cond = codegen_1.nil; + } + if (types.number) + delete types.integer; + for (const t in types) + cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct)); + return cond; + } + exports.checkDataTypes = checkDataTypes; + var typeError = { + message: ({ schema }) => `must be ${schema}`, + params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}` + }; + function reportTypeError(it) { + const cxt = getTypeErrorContext(it); + (0, errors_1.reportError)(cxt, typeError); + } + exports.reportTypeError = reportTypeError; + function getTypeErrorContext(it) { + const { gen, data, schema } = it; + const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type"); + return { + gen, + keyword: "type", + data, + schema: schema.type, + schemaCode, + schemaValue: schemaCode, + parentSchema: schema, + params: {}, + it + }; + } + } +}); + +// node_modules/ajv/dist/compile/validate/defaults.js +var require_defaults = __commonJS({ + "node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.assignDefaults = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + function assignDefaults(it, ty) { + const { properties, items } = it.schema; + if (ty === "object" && properties) { + for (const key in properties) { + assignDefault(it, key, properties[key].default); + } + } else if (ty === "array" && Array.isArray(items)) { + items.forEach((sch, i) => assignDefault(it, i, sch.default)); + } + } + exports.assignDefaults = assignDefaults; + function assignDefault(it, prop, defaultValue) { + const { gen, compositeRule, data, opts } = it; + if (defaultValue === void 0) + return; + const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`; + if (compositeRule) { + (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`); + return; + } + let condition = (0, codegen_1._)`${childData} === undefined`; + if (opts.useDefaults === "empty") { + condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`; + } + gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`); + } + } +}); + +// node_modules/ajv/dist/vocabularies/code.js +var require_code2 = __commonJS({ + "node_modules/ajv/dist/vocabularies/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var names_1 = require_names(); + var util_2 = require_util(); + function checkReportMissingProp(cxt, prop) { + const { gen, data, it } = cxt; + gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { + cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true); + cxt.error(); + }); + } + exports.checkReportMissingProp = checkReportMissingProp; + function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { + return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`))); + } + exports.checkMissingProp = checkMissingProp; + function reportMissingProp(cxt, missing) { + cxt.setParams({ missingProperty: missing }, true); + cxt.error(); + } + exports.reportMissingProp = reportMissingProp; + function hasPropFunc(gen) { + return gen.scopeValue("func", { + // eslint-disable-next-line @typescript-eslint/unbound-method + ref: Object.prototype.hasOwnProperty, + code: (0, codegen_1._)`Object.prototype.hasOwnProperty` + }); + } + exports.hasPropFunc = hasPropFunc; + function isOwnProperty(gen, data, property) { + return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`; + } + exports.isOwnProperty = isOwnProperty; + function propertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`; + return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond; + } + exports.propertyInData = propertyInData; + function noPropertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`; + return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond; + } + exports.noPropertyInData = noPropertyInData; + function allSchemaProperties(schemaMap) { + return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; + } + exports.allSchemaProperties = allSchemaProperties; + function schemaProperties(it, schemaMap) { + return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p])); + } + exports.schemaProperties = schemaProperties; + function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { + const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; + const valCxt = [ + [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)], + [names_1.default.parentData, it.parentData], + [names_1.default.parentDataProperty, it.parentDataProperty], + [names_1.default.rootData, names_1.default.rootData] + ]; + if (it.opts.dynamicRef) + valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); + const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`; + return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`; + } + exports.callValidateCode = callValidateCode; + var newRegExp = (0, codegen_1._)`new RegExp`; + function usePattern({ gen, it: { opts } }, pattern) { + const u = opts.unicodeRegExp ? "u" : ""; + const { regExp } = opts.code; + const rx = regExp(pattern, u); + return gen.scopeValue("pattern", { + key: rx.toString(), + ref: rx, + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` + }); + } + exports.usePattern = usePattern; + function validateArray(cxt) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + if (it.allErrors) { + const validArr = gen.let("valid", true); + validateItems(() => gen.assign(validArr, false)); + return validArr; + } + gen.var(valid, true); + validateItems(() => gen.break()); + return valid; + function validateItems(notValid) { + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword, + dataProp: i, + dataPropType: util_1.Type.Num + }, valid); + gen.if((0, codegen_1.not)(valid), notValid); + }); + } + } + exports.validateArray = validateArray; + function validateUnion(cxt) { + const { gen, schema, keyword, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch)); + if (alwaysValid && !it.opts.unevaluated) + return; + const valid = gen.let("valid", false); + const schValid = gen.name("_valid"); + gen.block(() => schema.forEach((_sch, i) => { + const schCxt = cxt.subschema({ + keyword, + schemaProp: i, + compositeRule: true + }, schValid); + gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`); + const merged = cxt.mergeValidEvaluated(schCxt, schValid); + if (!merged) + gen.if((0, codegen_1.not)(valid)); + })); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + } + exports.validateUnion = validateUnion; + } +}); + +// node_modules/ajv/dist/compile/validate/keyword.js +var require_keyword = __commonJS({ + "node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var code_1 = require_code2(); + var errors_1 = require_errors(); + function macroKeywordCode(cxt, def) { + const { gen, keyword, schema, parentSchema, it } = cxt; + const macroSchema = def.macro.call(it.self, schema, parentSchema, it); + const schemaRef = useKeyword(gen, keyword, macroSchema); + if (it.opts.validateSchema !== false) + it.self.validateSchema(macroSchema, true); + const valid = gen.name("valid"); + cxt.subschema({ + schema: macroSchema, + schemaPath: codegen_1.nil, + errSchemaPath: `${it.errSchemaPath}/${keyword}`, + topSchemaRef: schemaRef, + compositeRule: true + }, valid); + cxt.pass(valid, () => cxt.error(true)); + } + exports.macroKeywordCode = macroKeywordCode; + function funcKeywordCode(cxt, def) { + var _a; + const { gen, keyword, schema, parentSchema, $data, it } = cxt; + checkAsyncKeyword(it, def); + const validate = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate; + const validateRef = useKeyword(gen, keyword, validate); + const valid = gen.let("valid"); + cxt.block$data(valid, validateKeyword); + cxt.ok((_a = def.valid) !== null && _a !== void 0 ? _a : valid); + function validateKeyword() { + if (def.errors === false) { + assignValid(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => cxt.error()); + } else { + const ruleErrs = def.async ? validateAsync() : validateSync(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => addErrs(cxt, ruleErrs)); + } + } + function validateAsync() { + const ruleErrs = gen.let("ruleErrs", null); + gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e))); + return ruleErrs; + } + function validateSync() { + const validateErrs = (0, codegen_1._)`${validateRef}.errors`; + gen.assign(validateErrs, null); + assignValid(codegen_1.nil); + return validateErrs; + } + function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) { + const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self; + const passSchema = !("compile" in def && !$data || def.schema === false); + gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying); + } + function reportErrs(errors) { + var _a2; + gen.if((0, codegen_1.not)((_a2 = def.valid) !== null && _a2 !== void 0 ? _a2 : valid), errors); + } + } + exports.funcKeywordCode = funcKeywordCode; + function modifyData(cxt) { + const { gen, data, it } = cxt; + gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`)); + } + function addErrs(cxt, errs) { + const { gen } = cxt; + gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => { + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + (0, errors_1.extendErrors)(cxt); + }, () => cxt.error()); + } + function checkAsyncKeyword({ schemaEnv }, def) { + if (def.async && !schemaEnv.$async) + throw new Error("async keyword in sync schema"); + } + function useKeyword(gen, keyword, result) { + if (result === void 0) + throw new Error(`keyword "${keyword}" failed to compile`); + return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) }); + } + function validSchemaType(schema, schemaType, allowUndefined = false) { + return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined"); + } + exports.validSchemaType = validSchemaType; + function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) { + if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) { + throw new Error("ajv implementation error"); + } + const deps = def.dependencies; + if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) { + throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`); + } + if (def.validateSchema) { + const valid = def.validateSchema(schema[keyword]); + if (!valid) { + const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors); + if (opts.validateSchema === "log") + self.logger.error(msg); + else + throw new Error(msg); + } + } + } + exports.validateKeywordUsage = validateKeywordUsage; + } +}); + +// node_modules/ajv/dist/compile/validate/subschema.js +var require_subschema = __commonJS({ + "node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) { + if (keyword !== void 0 && schema !== void 0) { + throw new Error('both "keyword" and "schema" passed, only one allowed'); + } + if (keyword !== void 0) { + const sch = it.schema[keyword]; + return schemaProp === void 0 ? { + schema: sch, + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}` + } : { + schema: sch[schemaProp], + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}` + }; + } + if (schema !== void 0) { + if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) { + throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); + } + return { + schema, + schemaPath, + topSchemaRef, + errSchemaPath + }; + } + throw new Error('either "keyword" or "schema" must be passed'); + } + exports.getSubschema = getSubschema; + function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) { + if (data !== void 0 && dataProp !== void 0) { + throw new Error('both "data" and "dataProp" passed, only one allowed'); + } + const { gen } = it; + if (dataProp !== void 0) { + const { errorPath, dataPathArr, opts } = it; + const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true); + dataContextProps(nextData); + subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`; + subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`; + subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]; + } + if (data !== void 0) { + const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); + dataContextProps(nextData); + if (propertyName !== void 0) + subschema.propertyName = propertyName; + } + if (dataTypes) + subschema.dataTypes = dataTypes; + function dataContextProps(_nextData) { + subschema.data = _nextData; + subschema.dataLevel = it.dataLevel + 1; + subschema.dataTypes = []; + it.definedProperties = /* @__PURE__ */ new Set(); + subschema.parentData = it.data; + subschema.dataNames = [...it.dataNames, _nextData]; + } + } + exports.extendSubschemaData = extendSubschemaData; + function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) { + if (compositeRule !== void 0) + subschema.compositeRule = compositeRule; + if (createErrors !== void 0) + subschema.createErrors = createErrors; + if (allErrors !== void 0) + subschema.allErrors = allErrors; + subschema.jtdDiscriminator = jtdDiscriminator; + subschema.jtdMetadata = jtdMetadata; + } + exports.extendSubschemaMode = extendSubschemaMode; + } +}); + +// node_modules/fast-deep-equal/index.js +var require_fast_deep_equal = __commonJS({ + "node_modules/fast-deep-equal/index.js"(exports, module) { + "use strict"; + module.exports = function equal(a, b) { + if (a === b) return true; + if (a && b && typeof a == "object" && typeof b == "object") { + if (a.constructor !== b.constructor) return false; + var length, i, keys; + if (Array.isArray(a)) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0; ) + if (!equal(a[i], b[i])) return false; + return true; + } + if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; + if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); + if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); + keys = Object.keys(a); + length = keys.length; + if (length !== Object.keys(b).length) return false; + for (i = length; i-- !== 0; ) + if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; + for (i = length; i-- !== 0; ) { + var key = keys[i]; + if (!equal(a[key], b[key])) return false; + } + return true; + } + return a !== a && b !== b; + }; + } +}); + +// node_modules/json-schema-traverse/index.js +var require_json_schema_traverse = __commonJS({ + "node_modules/json-schema-traverse/index.js"(exports, module) { + "use strict"; + var traverse = module.exports = function(schema, opts, cb) { + if (typeof opts == "function") { + cb = opts; + opts = {}; + } + cb = opts.cb || cb; + var pre = typeof cb == "function" ? cb : cb.pre || function() { + }; + var post = cb.post || function() { + }; + _traverse(opts, pre, post, schema, "", schema); + }; + traverse.keywords = { + additionalItems: true, + items: true, + contains: true, + additionalProperties: true, + propertyNames: true, + not: true, + if: true, + then: true, + else: true + }; + traverse.arrayKeywords = { + items: true, + allOf: true, + anyOf: true, + oneOf: true + }; + traverse.propsKeywords = { + $defs: true, + definitions: true, + properties: true, + patternProperties: true, + dependencies: true + }; + traverse.skipKeywords = { + default: true, + enum: true, + const: true, + required: true, + maximum: true, + minimum: true, + exclusiveMaximum: true, + exclusiveMinimum: true, + multipleOf: true, + maxLength: true, + minLength: true, + pattern: true, + format: true, + maxItems: true, + minItems: true, + uniqueItems: true, + maxProperties: true, + minProperties: true + }; + function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) { + if (schema && typeof schema == "object" && !Array.isArray(schema)) { + pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); + for (var key in schema) { + var sch = schema[key]; + if (Array.isArray(sch)) { + if (key in traverse.arrayKeywords) { + for (var i = 0; i < sch.length; i++) + _traverse(opts, pre, post, sch[i], jsonPtr + "/" + key + "/" + i, rootSchema, jsonPtr, key, schema, i); + } + } else if (key in traverse.propsKeywords) { + if (sch && typeof sch == "object") { + for (var prop in sch) + _traverse(opts, pre, post, sch[prop], jsonPtr + "/" + key + "/" + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop); + } + } else if (key in traverse.keywords || opts.allKeys && !(key in traverse.skipKeywords)) { + _traverse(opts, pre, post, sch, jsonPtr + "/" + key, rootSchema, jsonPtr, key, schema); + } + } + post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); + } + } + function escapeJsonPtr(str) { + return str.replace(/~/g, "~0").replace(/\//g, "~1"); + } + } +}); + +// node_modules/ajv/dist/compile/resolve.js +var require_resolve = __commonJS({ + "node_modules/ajv/dist/compile/resolve.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; + var util_1 = require_util(); + var equal = require_fast_deep_equal(); + var traverse = require_json_schema_traverse(); + var SIMPLE_INLINED = /* @__PURE__ */ new Set([ + "type", + "format", + "pattern", + "maxLength", + "minLength", + "maxProperties", + "minProperties", + "maxItems", + "minItems", + "maximum", + "minimum", + "uniqueItems", + "multipleOf", + "required", + "enum", + "const" + ]); + function inlineRef(schema, limit = true) { + if (typeof schema == "boolean") + return true; + if (limit === true) + return !hasRef(schema); + if (!limit) + return false; + return countKeys(schema) <= limit; + } + exports.inlineRef = inlineRef; + var REF_KEYWORDS = /* @__PURE__ */ new Set([ + "$ref", + "$recursiveRef", + "$recursiveAnchor", + "$dynamicRef", + "$dynamicAnchor" + ]); + function hasRef(schema) { + for (const key in schema) { + if (REF_KEYWORDS.has(key)) + return true; + const sch = schema[key]; + if (Array.isArray(sch) && sch.some(hasRef)) + return true; + if (typeof sch == "object" && hasRef(sch)) + return true; + } + return false; + } + function countKeys(schema) { + let count = 0; + for (const key in schema) { + if (key === "$ref") + return Infinity; + count++; + if (SIMPLE_INLINED.has(key)) + continue; + if (typeof schema[key] == "object") { + (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch)); + } + if (count === Infinity) + return Infinity; + } + return count; + } + function getFullPath(resolver, id = "", normalize) { + if (normalize !== false) + id = normalizeId(id); + const p = resolver.parse(id); + return _getFullPath(resolver, p); + } + exports.getFullPath = getFullPath; + function _getFullPath(resolver, p) { + const serialized = resolver.serialize(p); + return serialized.split("#")[0] + "#"; + } + exports._getFullPath = _getFullPath; + var TRAILING_SLASH_HASH = /#\/?$/; + function normalizeId(id) { + return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; + } + exports.normalizeId = normalizeId; + function resolveUrl(resolver, baseId, id) { + id = normalizeId(id); + return resolver.resolve(baseId, id); + } + exports.resolveUrl = resolveUrl; + var ANCHOR = /^[a-z_][-a-z0-9._]*$/i; + function getSchemaRefs(schema, baseId) { + if (typeof schema == "boolean") + return {}; + const { schemaId, uriResolver } = this.opts; + const schId = normalizeId(schema[schemaId] || baseId); + const baseIds = { "": schId }; + const pathPrefix = getFullPath(uriResolver, schId, false); + const localRefs = {}; + const schemaRefs = /* @__PURE__ */ new Set(); + traverse(schema, { allKeys: true }, (sch, jsonPtr, _, parentJsonPtr) => { + if (parentJsonPtr === void 0) + return; + const fullPath = pathPrefix + jsonPtr; + let innerBaseId = baseIds[parentJsonPtr]; + if (typeof sch[schemaId] == "string") + innerBaseId = addRef.call(this, sch[schemaId]); + addAnchor.call(this, sch.$anchor); + addAnchor.call(this, sch.$dynamicAnchor); + baseIds[jsonPtr] = innerBaseId; + function addRef(ref) { + const _resolve = this.opts.uriResolver.resolve; + ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref); + if (schemaRefs.has(ref)) + throw ambiguos(ref); + schemaRefs.add(ref); + let schOrRef = this.refs[ref]; + if (typeof schOrRef == "string") + schOrRef = this.refs[schOrRef]; + if (typeof schOrRef == "object") { + checkAmbiguosRef(sch, schOrRef.schema, ref); + } else if (ref !== normalizeId(fullPath)) { + if (ref[0] === "#") { + checkAmbiguosRef(sch, localRefs[ref], ref); + localRefs[ref] = sch; + } else { + this.refs[ref] = fullPath; + } + } + return ref; + } + function addAnchor(anchor) { + if (typeof anchor == "string") { + if (!ANCHOR.test(anchor)) + throw new Error(`invalid anchor "${anchor}"`); + addRef.call(this, `#${anchor}`); + } + } + }); + return localRefs; + function checkAmbiguosRef(sch1, sch2, ref) { + if (sch2 !== void 0 && !equal(sch1, sch2)) + throw ambiguos(ref); + } + function ambiguos(ref) { + return new Error(`reference "${ref}" resolves to more than one schema`); + } + } + exports.getSchemaRefs = getSchemaRefs; + } +}); + +// node_modules/ajv/dist/compile/validate/index.js +var require_validate = __commonJS({ + "node_modules/ajv/dist/compile/validate/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; + var boolSchema_1 = require_boolSchema(); + var dataType_1 = require_dataType(); + var applicability_1 = require_applicability(); + var dataType_2 = require_dataType(); + var defaults_1 = require_defaults(); + var keyword_1 = require_keyword(); + var subschema_1 = require_subschema(); + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var resolve_1 = require_resolve(); + var util_1 = require_util(); + var errors_1 = require_errors(); + function validateFunctionCode(it) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + topSchemaObjCode(it); + return; + } + } + validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it)); + } + exports.validateFunctionCode = validateFunctionCode; + function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) { + if (opts.code.es5) { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => { + gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`); + destructureValCxtES5(gen, opts); + gen.code(body); + }); + } else { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body)); + } + } + function destructureValCxt(opts) { + return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`; + } + function destructureValCxtES5(gen, opts) { + gen.if(names_1.default.valCxt, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`); + gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`); + gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`); + }, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`""`); + gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`); + gen.var(names_1.default.rootData, names_1.default.data); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`); + }); + } + function topSchemaObjCode(it) { + const { schema, opts, gen } = it; + validateFunction(it, () => { + if (opts.$comment && schema.$comment) + commentKeyword(it); + checkNoDefault(it); + gen.let(names_1.default.vErrors, null); + gen.let(names_1.default.errors, 0); + if (opts.unevaluated) + resetEvaluated(it); + typeAndKeywords(it); + returnResults(it); + }); + return; + } + function resetEvaluated(it) { + const { gen, validateName } = it; + it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`)); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`)); + } + function funcSourceUrl(schema, opts) { + const schId = typeof schema == "object" && schema[opts.schemaId]; + return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil; + } + function subschemaCode(it, valid) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + subSchemaObjCode(it, valid); + return; + } + } + (0, boolSchema_1.boolOrEmptySchema)(it, valid); + } + function schemaCxtHasRules({ schema, self }) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (self.RULES.all[key]) + return true; + return false; + } + function isSchemaObj(it) { + return typeof it.schema != "boolean"; + } + function subSchemaObjCode(it, valid) { + const { schema, gen, opts } = it; + if (opts.$comment && schema.$comment) + commentKeyword(it); + updateContext(it); + checkAsyncSchema(it); + const errsCount = gen.const("_errs", names_1.default.errors); + typeAndKeywords(it, errsCount); + gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + } + function checkKeywords(it) { + (0, util_1.checkUnknownRules)(it); + checkRefsAndKeywords(it); + } + function typeAndKeywords(it, errsCount) { + if (it.opts.jtd) + return schemaKeywords(it, [], false, errsCount); + const types = (0, dataType_1.getSchemaTypes)(it.schema); + const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types); + schemaKeywords(it, types, !checkedTypes, errsCount); + } + function checkRefsAndKeywords(it) { + const { schema, errSchemaPath, opts, self } = it; + if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) { + self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`); + } + } + function checkNoDefault(it) { + const { schema, opts } = it; + if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) { + (0, util_1.checkStrictMode)(it, "default is ignored in the schema root"); + } + } + function updateContext(it) { + const schId = it.schema[it.opts.schemaId]; + if (schId) + it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId); + } + function checkAsyncSchema(it) { + if (it.schema.$async && !it.schemaEnv.$async) + throw new Error("async schema in sync schema"); + } + function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) { + const msg = schema.$comment; + if (opts.$comment === true) { + gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`); + } else if (typeof opts.$comment == "function") { + const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`; + const rootName = gen.scopeValue("root", { ref: schemaEnv.root }); + gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`); + } + } + function returnResults(it) { + const { gen, schemaEnv, validateName, ValidationError, opts } = it; + if (schemaEnv.$async) { + gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`)); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors); + if (opts.unevaluated) + assignEvaluated(it); + gen.return((0, codegen_1._)`${names_1.default.errors} === 0`); + } + } + function assignEvaluated({ gen, evaluated, props, items }) { + if (props instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.props`, props); + if (items instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.items`, items); + } + function schemaKeywords(it, types, typeErrors, errsCount) { + const { gen, schema, data, allErrors, opts, self } = it; + const { RULES } = self; + if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) { + gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); + return; + } + if (!opts.jtd) + checkStrictTypes(it, types); + gen.block(() => { + for (const group of RULES.rules) + groupKeywords(group); + groupKeywords(RULES.post); + }); + function groupKeywords(group) { + if (!(0, applicability_1.shouldUseGroup)(schema, group)) + return; + if (group.type) { + gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers)); + iterateKeywords(it, group); + if (types.length === 1 && types[0] === group.type && typeErrors) { + gen.else(); + (0, dataType_2.reportTypeError)(it); + } + gen.endIf(); + } else { + iterateKeywords(it, group); + } + if (!allErrors) + gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`); + } + } + function iterateKeywords(it, group) { + const { gen, schema, opts: { useDefaults } } = it; + if (useDefaults) + (0, defaults_1.assignDefaults)(it, group.type); + gen.block(() => { + for (const rule of group.rules) { + if ((0, applicability_1.shouldUseRule)(schema, rule)) { + keywordCode(it, rule.keyword, rule.definition, group.type); + } + } + }); + } + function checkStrictTypes(it, types) { + if (it.schemaEnv.meta || !it.opts.strictTypes) + return; + checkContextTypes(it, types); + if (!it.opts.allowUnionTypes) + checkMultipleTypes(it, types); + checkKeywordTypes(it, it.dataTypes); + } + function checkContextTypes(it, types) { + if (!types.length) + return; + if (!it.dataTypes.length) { + it.dataTypes = types; + return; + } + types.forEach((t) => { + if (!includesType(it.dataTypes, t)) { + strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`); + } + }); + narrowSchemaTypes(it, types); + } + function checkMultipleTypes(it, ts2) { + if (ts2.length > 1 && !(ts2.length === 2 && ts2.includes("null"))) { + strictTypesError(it, "use allowUnionTypes to allow union type keyword"); + } + } + function checkKeywordTypes(it, ts2) { + const rules = it.self.RULES.all; + for (const keyword in rules) { + const rule = rules[keyword]; + if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) { + const { type } = rule.definition; + if (type.length && !type.some((t) => hasApplicableType(ts2, t))) { + strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`); + } + } + } + } + function hasApplicableType(schTs, kwdT) { + return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer"); + } + function includesType(ts2, t) { + return ts2.includes(t) || t === "integer" && ts2.includes("number"); + } + function narrowSchemaTypes(it, withTypes) { + const ts2 = []; + for (const t of it.dataTypes) { + if (includesType(withTypes, t)) + ts2.push(t); + else if (withTypes.includes("integer") && t === "number") + ts2.push("integer"); + } + it.dataTypes = ts2; + } + function strictTypesError(it, msg) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + msg += ` at "${schemaPath}" (strictTypes)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes); + } + var KeywordCxt = class { + constructor(it, def, keyword) { + (0, keyword_1.validateKeywordUsage)(it, def, keyword); + this.gen = it.gen; + this.allErrors = it.allErrors; + this.keyword = keyword; + this.data = it.data; + this.schema = it.schema[keyword]; + this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data; + this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data); + this.schemaType = def.schemaType; + this.parentSchema = it.schema; + this.params = {}; + this.it = it; + this.def = def; + if (this.$data) { + this.schemaCode = it.gen.const("vSchema", getData(this.$data, it)); + } else { + this.schemaCode = this.schemaValue; + if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) { + throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`); + } + } + if ("code" in def ? def.trackErrors : def.errors !== false) { + this.errsCount = it.gen.const("_errs", names_1.default.errors); + } + } + result(condition, successAction, failAction) { + this.failResult((0, codegen_1.not)(condition), successAction, failAction); + } + failResult(condition, successAction, failAction) { + this.gen.if(condition); + if (failAction) + failAction(); + else + this.error(); + if (successAction) { + this.gen.else(); + successAction(); + if (this.allErrors) + this.gen.endIf(); + } else { + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + } + pass(condition, failAction) { + this.failResult((0, codegen_1.not)(condition), void 0, failAction); + } + fail(condition) { + if (condition === void 0) { + this.error(); + if (!this.allErrors) + this.gen.if(false); + return; + } + this.gen.if(condition); + this.error(); + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + fail$data(condition) { + if (!this.$data) + return this.fail(condition); + const { schemaCode } = this; + this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`); + } + error(append, errorParams, errorPaths) { + if (errorParams) { + this.setParams(errorParams); + this._error(append, errorPaths); + this.setParams({}); + return; + } + this._error(append, errorPaths); + } + _error(append, errorPaths) { + ; + (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths); + } + $dataError() { + (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError); + } + reset() { + if (this.errsCount === void 0) + throw new Error('add "trackErrors" to keyword definition'); + (0, errors_1.resetErrorsCount)(this.gen, this.errsCount); + } + ok(cond) { + if (!this.allErrors) + this.gen.if(cond); + } + setParams(obj, assign) { + if (assign) + Object.assign(this.params, obj); + else + this.params = obj; + } + block$data(valid, codeBlock, $dataValid = codegen_1.nil) { + this.gen.block(() => { + this.check$data(valid, $dataValid); + codeBlock(); + }); + } + check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) { + if (!this.$data) + return; + const { gen, schemaCode, schemaType, def } = this; + gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid)); + if (valid !== codegen_1.nil) + gen.assign(valid, true); + if (schemaType.length || def.validateSchema) { + gen.elseIf(this.invalid$data()); + this.$dataError(); + if (valid !== codegen_1.nil) + gen.assign(valid, false); + } + gen.else(); + } + invalid$data() { + const { gen, schemaCode, schemaType, def, it } = this; + return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema()); + function wrong$DataType() { + if (schemaType.length) { + if (!(schemaCode instanceof codegen_1.Name)) + throw new Error("ajv implementation error"); + const st = Array.isArray(schemaType) ? schemaType : [schemaType]; + return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`; + } + return codegen_1.nil; + } + function invalid$DataSchema() { + if (def.validateSchema) { + const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); + return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`; + } + return codegen_1.nil; + } + } + subschema(appl, valid) { + const subschema = (0, subschema_1.getSubschema)(this.it, appl); + (0, subschema_1.extendSubschemaData)(subschema, this.it, appl); + (0, subschema_1.extendSubschemaMode)(subschema, appl); + const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 }; + subschemaCode(nextContext, valid); + return nextContext; + } + mergeEvaluated(schemaCxt, toName) { + const { it, gen } = this; + if (!it.opts.unevaluated) + return; + if (it.props !== true && schemaCxt.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName); + } + if (it.items !== true && schemaCxt.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName); + } + } + mergeValidEvaluated(schemaCxt, valid) { + const { it, gen } = this; + if (it.opts.unevaluated && (it.props !== true || it.items !== true)) { + gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name)); + return true; + } + } + }; + exports.KeywordCxt = KeywordCxt; + function keywordCode(it, keyword, def, ruleType) { + const cxt = new KeywordCxt(it, def, keyword); + if ("code" in def) { + def.code(cxt, ruleType); + } else if (cxt.$data && def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } else if ("macro" in def) { + (0, keyword_1.macroKeywordCode)(cxt, def); + } else if (def.compile || def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } + } + var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; + var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; + function getData($data, { dataLevel, dataNames, dataPathArr }) { + let jsonPointer; + let data; + if ($data === "") + return names_1.default.rootData; + if ($data[0] === "/") { + if (!JSON_POINTER.test($data)) + throw new Error(`Invalid JSON-pointer: ${$data}`); + jsonPointer = $data; + data = names_1.default.rootData; + } else { + const matches = RELATIVE_JSON_POINTER.exec($data); + if (!matches) + throw new Error(`Invalid JSON-pointer: ${$data}`); + const up = +matches[1]; + jsonPointer = matches[2]; + if (jsonPointer === "#") { + if (up >= dataLevel) + throw new Error(errorMsg("property/index", up)); + return dataPathArr[dataLevel - up]; + } + if (up > dataLevel) + throw new Error(errorMsg("data", up)); + data = dataNames[dataLevel - up]; + if (!jsonPointer) + return data; + } + let expr = data; + const segments = jsonPointer.split("/"); + for (const segment of segments) { + if (segment) { + data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`; + expr = (0, codegen_1._)`${expr} && ${data}`; + } + } + return expr; + function errorMsg(pointerType, up) { + return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`; + } + } + exports.getData = getData; + } +}); + +// node_modules/ajv/dist/runtime/validation_error.js +var require_validation_error = __commonJS({ + "node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var ValidationError = class extends Error { + constructor(errors) { + super("validation failed"); + this.errors = errors; + this.ajv = this.validation = true; + } + }; + exports.default = ValidationError; + } +}); + +// node_modules/ajv/dist/compile/ref_error.js +var require_ref_error = __commonJS({ + "node_modules/ajv/dist/compile/ref_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var resolve_1 = require_resolve(); + var MissingRefError = class extends Error { + constructor(resolver, baseId, ref, msg) { + super(msg || `can't resolve reference ${ref} from id ${baseId}`); + this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref); + this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef)); + } + }; + exports.default = MissingRefError; + } +}); + +// node_modules/ajv/dist/compile/index.js +var require_compile = __commonJS({ + "node_modules/ajv/dist/compile/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; + var codegen_1 = require_codegen(); + var validation_error_1 = require_validation_error(); + var names_1 = require_names(); + var resolve_1 = require_resolve(); + var util_1 = require_util(); + var validate_1 = require_validate(); + var SchemaEnv = class { + constructor(env) { + var _a; + this.refs = {}; + this.dynamicAnchors = {}; + let schema; + if (typeof env.schema == "object") + schema = env.schema; + this.schema = env.schema; + this.schemaId = env.schemaId; + this.root = env.root || this; + this.baseId = (_a = env.baseId) !== null && _a !== void 0 ? _a : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]); + this.schemaPath = env.schemaPath; + this.localRefs = env.localRefs; + this.meta = env.meta; + this.$async = schema === null || schema === void 0 ? void 0 : schema.$async; + this.refs = {}; + } + }; + exports.SchemaEnv = SchemaEnv; + function compileSchema(sch) { + const _sch = getCompilingSchema.call(this, sch); + if (_sch) + return _sch; + const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); + const { es5, lines } = this.opts.code; + const { ownProperties } = this.opts; + const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties }); + let _ValidationError; + if (sch.$async) { + _ValidationError = gen.scopeValue("Error", { + ref: validation_error_1.default, + code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default` + }); + } + const validateName = gen.scopeName("validate"); + sch.validateName = validateName; + const schemaCxt = { + gen, + allErrors: this.opts.allErrors, + data: names_1.default.data, + parentData: names_1.default.parentData, + parentDataProperty: names_1.default.parentDataProperty, + dataNames: [names_1.default.data], + dataPathArr: [codegen_1.nil], + // TODO can its length be used as dataLevel if nil is removed? + dataLevel: 0, + dataTypes: [], + definedProperties: /* @__PURE__ */ new Set(), + topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }), + validateName, + ValidationError: _ValidationError, + schema: sch.schema, + schemaEnv: sch, + rootId, + baseId: sch.baseId || rootId, + schemaPath: codegen_1.nil, + errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"), + errorPath: (0, codegen_1._)`""`, + opts: this.opts, + self: this + }; + let sourceCode; + try { + this._compilations.add(sch); + (0, validate_1.validateFunctionCode)(schemaCxt); + gen.optimize(this.opts.code.optimize); + const validateCode = gen.toString(); + sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`; + if (this.opts.code.process) + sourceCode = this.opts.code.process(sourceCode, sch); + const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); + const validate = makeValidate(this, this.scope.get()); + this.scope.value(validateName, { ref: validate }); + validate.errors = null; + validate.schema = sch.schema; + validate.schemaEnv = sch; + if (sch.$async) + validate.$async = true; + if (this.opts.code.source === true) { + validate.source = { validateName, validateCode, scopeValues: gen._values }; + } + if (this.opts.unevaluated) { + const { props, items } = schemaCxt; + validate.evaluated = { + props: props instanceof codegen_1.Name ? void 0 : props, + items: items instanceof codegen_1.Name ? void 0 : items, + dynamicProps: props instanceof codegen_1.Name, + dynamicItems: items instanceof codegen_1.Name + }; + if (validate.source) + validate.source.evaluated = (0, codegen_1.stringify)(validate.evaluated); + } + sch.validate = validate; + return sch; + } catch (e) { + delete sch.validate; + delete sch.validateName; + if (sourceCode) + this.logger.error("Error compiling schema, function code:", sourceCode); + throw e; + } finally { + this._compilations.delete(sch); + } + } + exports.compileSchema = compileSchema; + function resolveRef(root, baseId, ref) { + var _a; + ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref); + const schOrFunc = root.refs[ref]; + if (schOrFunc) + return schOrFunc; + let _sch = resolve.call(this, root, ref); + if (_sch === void 0) { + const schema = (_a = root.localRefs) === null || _a === void 0 ? void 0 : _a[ref]; + const { schemaId } = this.opts; + if (schema) + _sch = new SchemaEnv({ schema, schemaId, root, baseId }); + } + if (_sch === void 0) + return; + return root.refs[ref] = inlineOrCompile.call(this, _sch); + } + exports.resolveRef = resolveRef; + function inlineOrCompile(sch) { + if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs)) + return sch.schema; + return sch.validate ? sch : compileSchema.call(this, sch); + } + function getCompilingSchema(schEnv) { + for (const sch of this._compilations) { + if (sameSchemaEnv(sch, schEnv)) + return sch; + } + } + exports.getCompilingSchema = getCompilingSchema; + function sameSchemaEnv(s1, s2) { + return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId; + } + function resolve(root, ref) { + let sch; + while (typeof (sch = this.refs[ref]) == "string") + ref = sch; + return sch || this.schemas[ref] || resolveSchema.call(this, root, ref); + } + function resolveSchema(root, ref) { + const p = this.opts.uriResolver.parse(ref); + const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p); + let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0); + if (Object.keys(root.schema).length > 0 && refPath === baseId) { + return getJsonPointer.call(this, p, root); + } + const id = (0, resolve_1.normalizeId)(refPath); + const schOrRef = this.refs[id] || this.schemas[id]; + if (typeof schOrRef == "string") { + const sch = resolveSchema.call(this, root, schOrRef); + if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object") + return; + return getJsonPointer.call(this, p, sch); + } + if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object") + return; + if (!schOrRef.validate) + compileSchema.call(this, schOrRef); + if (id === (0, resolve_1.normalizeId)(ref)) { + const { schema } = schOrRef; + const { schemaId } = this.opts; + const schId = schema[schemaId]; + if (schId) + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + return new SchemaEnv({ schema, schemaId, root, baseId }); + } + return getJsonPointer.call(this, p, schOrRef); + } + exports.resolveSchema = resolveSchema; + var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([ + "properties", + "patternProperties", + "enum", + "dependencies", + "definitions" + ]); + function getJsonPointer(parsedRef, { baseId, schema, root }) { + var _a; + if (((_a = parsedRef.fragment) === null || _a === void 0 ? void 0 : _a[0]) !== "/") + return; + for (const part of parsedRef.fragment.slice(1).split("/")) { + if (typeof schema === "boolean") + return; + const partSchema = schema[(0, util_1.unescapeFragment)(part)]; + if (partSchema === void 0) + return; + schema = partSchema; + const schId = typeof schema === "object" && schema[this.opts.schemaId]; + if (!PREVENT_SCOPE_CHANGE.has(part) && schId) { + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + } + } + let env; + if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) { + const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref); + env = resolveSchema.call(this, root, $ref); + } + const { schemaId } = this.opts; + env = env || new SchemaEnv({ schema, schemaId, root, baseId }); + if (env.schema !== env.root.schema) + return env; + return void 0; + } + } +}); + +// node_modules/ajv/dist/refs/data.json +var require_data = __commonJS({ + "node_modules/ajv/dist/refs/data.json"(exports, module) { + module.exports = { + $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", + description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", + type: "object", + required: ["$data"], + properties: { + $data: { + type: "string", + anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }] + } + }, + additionalProperties: false + }; + } +}); + +// node_modules/fast-uri/lib/utils.js +var require_utils = __commonJS({ + "node_modules/fast-uri/lib/utils.js"(exports, module) { + "use strict"; + var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu); + var isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u); + var isPort = RegExp.prototype.test.bind(/^\d*$/u); + var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu); + var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu); + var isPathCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/]$/u); + var isQueryFragmentCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/?]$/u); + var isUserinfoCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:]$/u); + var BYTE_HEX = new Array(256); + { + const HEX_DIGITS = "0123456789ABCDEF"; + for (let i = 0; i < 256; i++) { + BYTE_HEX[i] = "%" + HEX_DIGITS[i >> 4] + HEX_DIGITS[i & 15]; + } + } + function percentEncodeNonAscii(cp) { + if (cp < 2048) { + return BYTE_HEX[192 | cp >> 6] + BYTE_HEX[128 | cp & 63]; + } + if (cp < 65536) { + return BYTE_HEX[224 | cp >> 12] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63]; + } + return BYTE_HEX[240 | cp >> 18] + BYTE_HEX[128 | cp >> 12 & 63] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63]; + } + function stringArrayToHexStripped(input) { + let acc = ""; + let code = 0; + let i = 0; + for (i = 0; i < input.length; i++) { + code = input[i].charCodeAt(0); + if (code === 48) { + continue; + } + if (!(code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102)) { + return ""; + } + acc += input[i]; + break; + } + for (i += 1; i < input.length; i++) { + code = input[i].charCodeAt(0); + if (!(code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102)) { + return ""; + } + acc += input[i]; + } + return acc; + } + var isHextet = RegExp.prototype.test.bind(/^[\dA-Fa-f]{1,4}$/); + var isIPvFuture = RegExp.prototype.test.bind(/^[vV][\dA-Fa-f]+\.[A-Za-z\d\-._~!$&'()*+,;=:]+$/); + var isZoneCharacter = RegExp.prototype.test.bind(/^[A-Za-z\d\-._~]$/); + var nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u); + function isZoneIdentifier(zone) { + if (zone.length === 0) return false; + for (let i = 0; i < zone.length; i++) { + if (isZoneCharacter(zone[i])) continue; + if (zone[i] === "%" && i + 2 < zone.length && isHexPair(zone.slice(i + 1, i + 3))) { + i += 2; + continue; + } + return false; + } + return true; + } + function compressIPv6ZeroRun(hextets) { + let bestStart = -1; + let bestLength = 0; + let runStart = -1; + let runLength = 0; + for (let i = 0; i < hextets.length; i++) { + if (hextets[i] === "0") { + if (runStart === -1) runStart = i; + runLength++; + if (runLength > bestLength) { + bestLength = runLength; + bestStart = runStart; + } + } else { + runStart = -1; + runLength = 0; + } + } + if (bestLength < 2) return hextets.join(":"); + const head = hextets.slice(0, bestStart).join(":"); + const tail = hextets.slice(bestStart + bestLength).join(":"); + return head + "::" + tail; + } + function normalizeIPv6Address(input) { + const compression = input.indexOf("::"); + if (compression !== -1 && input.indexOf("::", compression + 1) !== -1) return void 0; + const left = compression === -1 ? input.split(":") : input.slice(0, compression).split(":"); + const right = compression === -1 ? [] : input.slice(compression + 2).split(":"); + if (compression !== -1) { + if (left.length === 1 && left[0] === "") left.length = 0; + if (right.length === 1 && right[0] === "") right.length = 0; + } + const parts = left.concat(right); + let hextetCount = 0; + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + if (part === "") return void 0; + if (part.indexOf(".") !== -1) { + if (i !== parts.length - 1 || compression !== -1 && right.length === 0 || !isIPv4(part)) return void 0; + hextetCount += 2; + continue; + } + if (!isHextet(part)) return void 0; + parts[i] = parseInt(part, 16).toString(16); + hextetCount++; + } + if (compression === -1) { + if (hextetCount !== 8) return void 0; + return compressIPv6ZeroRun(parts); + } + if (hextetCount >= 8) return void 0; + const expanded = parts.slice(0, left.length); + for (let i = hextetCount; i < 8; i++) expanded.push("0"); + for (let i = left.length; i < parts.length; i++) expanded.push(parts[i]); + return compressIPv6ZeroRun(expanded); + } + function normalizeIPv6(host) { + const bracketed = host[0] === "[" && host[host.length - 1] === "]"; + const hasBracket = host[0] === "[" || host[host.length - 1] === "]"; + if (hasBracket && !bracketed) return { host, isIPV6: false, error: true }; + let input = bracketed ? host.slice(1, -1) : host; + if (bracketed && isIPvFuture(input)) { + input = input.toLowerCase(); + return { host: `[${input}]`, escapedHost: input, isIPV6: false, isIPVFuture: true }; + } + if (findToken(input, ":") < 2) { + return { host, isIPV6: false, error: bracketed }; + } + let zoneIdentifier = ""; + const zoneSeparator = input.indexOf("%"); + if (zoneSeparator !== -1) { + const separatorLength = input.slice(zoneSeparator, zoneSeparator + 3).toLowerCase() === "%25" ? 3 : 1; + zoneIdentifier = input.slice(zoneSeparator + separatorLength); + if (!isZoneIdentifier(zoneIdentifier)) return { host, isIPV6: false, error: true }; + input = input.slice(0, zoneSeparator); + } + const address = normalizeIPv6Address(input); + if (address === void 0) return { host, isIPV6: false, error: true }; + return { + host: address + (zoneIdentifier ? "%" + zoneIdentifier : ""), + escapedHost: address + (zoneIdentifier ? "%25" + zoneIdentifier : ""), + isIPV6: true + }; + } + function findToken(str, token) { + let ind = 0; + for (let i = 0; i < str.length; i++) { + if (str[i] === token) ind++; + } + return ind; + } + function removeDotSegments(path21) { + let input = path21; + const output = []; + let nextSlash = -1; + let len = 0; + while (len = input.length) { + if (len === 1) { + if (input === ".") { + break; + } else if (input === "/") { + output.push("/"); + break; + } else { + output.push(input); + break; + } + } else if (len === 2) { + if (input[0] === ".") { + if (input[1] === ".") { + break; + } else if (input[1] === "/") { + input = input.slice(2); + continue; + } + } else if (input[0] === "/") { + if (input[1] === "." || input[1] === "/") { + output.push("/"); + break; + } + } + } else if (len === 3) { + if (input === "/..") { + if (output.length !== 0) { + output.pop(); + } + output.push("/"); + break; + } + } + if (input[0] === ".") { + if (input[1] === ".") { + if (input[2] === "/") { + input = input.slice(3); + continue; + } + } else if (input[1] === "/") { + input = input.slice(2); + continue; + } + } else if (input[0] === "/") { + if (input[1] === ".") { + if (input[2] === "/") { + input = input.slice(2); + continue; + } else if (input[2] === ".") { + if (input[3] === "/") { + input = input.slice(3); + if (output.length !== 0) { + output.pop(); + } + continue; + } + } + } + } + if ((nextSlash = input.indexOf("/", 1)) === -1) { + output.push(input); + break; + } else { + output.push(input.slice(0, nextSlash)); + input = input.slice(nextSlash); + } + } + return output.join(""); + } + var HOST_DELIMS = { "@": "%40", "/": "%2F", "?": "%3F", "#": "%23", ":": "%3A" }; + var HOST_DELIM_RE = /[@/?#:]/g; + var HOST_DELIM_NO_COLON_RE = /[@/?#]/g; + function reescapeHostDelimiters(host, isIP) { + const re = isIP ? HOST_DELIM_NO_COLON_RE : HOST_DELIM_RE; + re.lastIndex = 0; + return host.replace(re, (ch) => HOST_DELIMS[ch]); + } + function normalizePercentEncoding(input, decodeUnreserved = false) { + if (input.indexOf("%") === -1) { + return input; + } + let output = ""; + for (let i = 0; i < input.length; i++) { + if (input[i] === "%" && i + 2 < input.length) { + const hex = input.slice(i + 1, i + 3); + if (isHexPair(hex)) { + const normalizedHex = hex.toUpperCase(); + const decoded = String.fromCharCode(parseInt(normalizedHex, 16)); + if (decodeUnreserved && isUnreserved(decoded)) { + output += decoded; + } else { + output += "%" + normalizedHex; + } + i += 2; + continue; + } + } + output += input[i]; + } + return output; + } + function normalizePathEncoding(input) { + let output = ""; + for (let i = 0; i < input.length; i++) { + const ch = input[i]; + if (ch === "%" && i + 2 < input.length) { + const hex = input.slice(i + 1, i + 3); + if (isHexPair(hex)) { + const normalizedHex = hex.toUpperCase(); + const decoded = String.fromCharCode(parseInt(normalizedHex, 16)); + if (decoded !== "." && isUnreserved(decoded)) { + output += decoded; + } else { + output += "%" + normalizedHex; + } + i += 2; + continue; + } + } + if (isPathCharacter(ch)) { + output += ch; + } else { + const code = input.charCodeAt(i); + if (code < 128) { + output += isEscapeSafe(code) ? ch : BYTE_HEX[code]; + } else if (code < 55296 || code > 57343) { + output += percentEncodeNonAscii(code); + } else if (code <= 56319 && i + 1 < input.length) { + const low = input.charCodeAt(i + 1); + if (low >= 56320 && low <= 57343) { + output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320)); + i++; + } else { + output += percentEncodeNonAscii(65533); + } + } else { + output += percentEncodeNonAscii(65533); + } + } + } + return output; + } + function serializePathEncoding(input, pathNoScheme = false) { + let output = ""; + let firstSegment = pathNoScheme && input[0] !== "/"; + for (let i = 0; i < input.length; i++) { + const ch = input[i]; + if (ch === "%" && i + 2 < input.length) { + const hex = input.slice(i + 1, i + 3); + if (isHexPair(hex)) { + output += "%" + hex.toUpperCase(); + i += 2; + continue; + } + } + if (ch === "/") { + firstSegment = false; + } + if (isPathCharacter(ch) && (ch !== ":" || !firstSegment)) { + output += ch; + } else { + const code = input.charCodeAt(i); + if (code < 128) { + output += BYTE_HEX[code]; + } else if (code < 55296 || code > 57343) { + output += percentEncodeNonAscii(code); + } else if (code <= 56319 && i + 1 < input.length) { + const low = input.charCodeAt(i + 1); + if (low >= 56320 && low <= 57343) { + output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320)); + i++; + } else { + output += percentEncodeNonAscii(65533); + } + } else { + output += percentEncodeNonAscii(65533); + } + } + } + return output; + } + function encodeComponent(input, isAllowed) { + let output = ""; + for (let i = 0; i < input.length; i++) { + const ch = input[i]; + if (ch === "%" && i + 2 < input.length) { + const hex = input.slice(i + 1, i + 3); + if (isHexPair(hex)) { + output += "%" + hex.toUpperCase(); + i += 2; + continue; + } + } + if (isAllowed(ch)) { + output += ch; + } else { + const code = input.charCodeAt(i); + if (code < 128) { + output += BYTE_HEX[code]; + } else if (code < 55296 || code > 57343) { + output += percentEncodeNonAscii(code); + } else if (code <= 56319 && i + 1 < input.length) { + const low = input.charCodeAt(i + 1); + if (low >= 56320 && low <= 57343) { + output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320)); + i++; + } else { + output += percentEncodeNonAscii(65533); + } + } else { + output += percentEncodeNonAscii(65533); + } + } + } + return output; + } + function encodeUserinfo(input) { + return encodeComponent(input, isUserinfoCharacter); + } + function encodeQuery(input) { + return encodeComponent(input, isQueryFragmentCharacter); + } + function encodeFragment(input) { + return encodeComponent(input, isQueryFragmentCharacter); + } + function isEscapeSafe(cp) { + return cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 42 || cp === 43 || cp === 45 || cp === 46 || cp === 47 || cp === 64 || cp === 95; + } + function normalizeQueryFragmentEncoding(input) { + let output = ""; + for (let i = 0; i < input.length; i++) { + const ch = input[i]; + if (ch === "%" && i + 2 < input.length) { + const hex = input.slice(i + 1, i + 3); + if (isHexPair(hex)) { + const normalizedHex = hex.toUpperCase(); + const decoded = String.fromCharCode(parseInt(normalizedHex, 16)); + if (isUnreserved(decoded)) { + output += decoded; + } else { + output += "%" + normalizedHex; + } + i += 2; + continue; + } + } + if (isQueryFragmentCharacter(ch)) { + output += ch; + } else { + const code = input.charCodeAt(i); + if (code < 128) { + output += isEscapeSafe(code) ? ch : BYTE_HEX[code]; + } else if (code < 55296 || code > 57343) { + output += percentEncodeNonAscii(code); + } else if (code <= 56319 && i + 1 < input.length) { + const low = input.charCodeAt(i + 1); + if (low >= 56320 && low <= 57343) { + output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320)); + i++; + } else { + output += percentEncodeNonAscii(65533); + } + } else { + output += percentEncodeNonAscii(65533); + } + } + } + return output; + } + function escapePreservingEscapes(input) { + let output = ""; + for (let i = 0; i < input.length; i++) { + if (input[i] === "%" && i + 2 < input.length) { + const hex = input.slice(i + 1, i + 3); + if (isHexPair(hex)) { + output += "%" + hex.toUpperCase(); + i += 2; + continue; + } + } + output += escape(input[i]); + } + return output; + } + function recomposeAuthority(component) { + const uriTokens = []; + if (component.userinfo !== void 0) { + uriTokens.push(encodeUserinfo(component.userinfo)); + uriTokens.push("@"); + } + if (component.host !== void 0) { + let host = component.host; + if (!isIPv4(host)) { + let ipV6res = normalizeIPv6(host); + if (ipV6res.isIPV6 !== true && ipV6res.isIPVFuture !== true) { + host = normalizePercentEncoding(host, true); + ipV6res = normalizeIPv6(host); + } + if (ipV6res.isIPV6 === true || ipV6res.isIPVFuture === true) { + host = `[${ipV6res.escapedHost}]`; + } else { + host = reescapeHostDelimiters(host, false); + } + } + uriTokens.push(host); + } + if (typeof component.port === "number" || typeof component.port === "string") { + const port = String(component.port); + if (!isPort(port)) { + throw new TypeError("URI port is malformed."); + } + uriTokens.push(":"); + uriTokens.push(port); + } + return uriTokens.length ? uriTokens.join("") : void 0; + } + module.exports = { + nonSimpleDomain, + recomposeAuthority, + reescapeHostDelimiters, + normalizePercentEncoding, + normalizePathEncoding, + serializePathEncoding, + normalizeQueryFragmentEncoding, + encodeUserinfo, + encodeQuery, + encodeFragment, + escapePreservingEscapes, + removeDotSegments, + isIPv4, + isUUID, + normalizeIPv6, + stringArrayToHexStripped + }; + } +}); + +// node_modules/fast-uri/lib/schemes.js +var require_schemes = __commonJS({ + "node_modules/fast-uri/lib/schemes.js"(exports, module) { + "use strict"; + var { isUUID } = require_utils(); + var URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu; + var supportedSchemeNames = ( + /** @type {const} */ + [ + "http", + "https", + "ws", + "wss", + "urn", + "urn:uuid" + ] + ); + function isValidSchemeName(name) { + return supportedSchemeNames.indexOf( + /** @type {*} */ + name + ) !== -1; + } + function wsIsSecure(wsComponent) { + if (wsComponent.secure === true) { + return true; + } else if (wsComponent.secure === false) { + return false; + } else if (wsComponent.scheme) { + return wsComponent.scheme.length === 3 && (wsComponent.scheme[0] === "w" || wsComponent.scheme[0] === "W") && (wsComponent.scheme[1] === "s" || wsComponent.scheme[1] === "S") && (wsComponent.scheme[2] === "s" || wsComponent.scheme[2] === "S"); + } else { + return false; + } + } + function httpParse(component) { + if (!component.host) { + component.error = component.error || "HTTP URIs must have a host."; + } + return component; + } + function httpSerialize(component) { + const secure = String(component.scheme).toLowerCase() === "https"; + if (component.port === (secure ? 443 : 80) || component.port === "") { + component.port = void 0; + } + if (!component.path) { + component.path = "/"; + } + return component; + } + function wsParse(wsComponent) { + wsComponent.secure = wsIsSecure(wsComponent); + wsComponent.resourceName = (wsComponent.path || "/") + (wsComponent.query ? "?" + wsComponent.query : ""); + wsComponent.path = void 0; + wsComponent.query = void 0; + return wsComponent; + } + function wsSerialize(wsComponent) { + if (wsComponent.port === (wsIsSecure(wsComponent) ? 443 : 80) || wsComponent.port === "") { + wsComponent.port = void 0; + } + if (typeof wsComponent.secure === "boolean") { + wsComponent.scheme = wsComponent.secure ? "wss" : "ws"; + wsComponent.secure = void 0; + } + if (wsComponent.resourceName) { + const queryIndex = wsComponent.resourceName.indexOf("?"); + const path21 = queryIndex === -1 ? wsComponent.resourceName : wsComponent.resourceName.slice(0, queryIndex); + wsComponent.path = path21 && path21 !== "/" ? path21 : void 0; + wsComponent.query = queryIndex === -1 ? void 0 : wsComponent.resourceName.slice(queryIndex + 1); + wsComponent.resourceName = void 0; + } + wsComponent.fragment = void 0; + return wsComponent; + } + function urnParse(urnComponent, options) { + if (!urnComponent.path) { + urnComponent.error = "URN can not be parsed"; + return urnComponent; + } + const matches = urnComponent.path.match(URN_REG); + if (matches && matches[0] === urnComponent.path) { + const scheme = options.scheme || urnComponent.scheme || "urn"; + urnComponent.nid = matches[1].toLowerCase(); + urnComponent.nss = matches[2]; + const urnScheme = `${scheme}:${options.nid || urnComponent.nid}`; + const schemeHandler = getSchemeHandler(urnScheme); + urnComponent.path = void 0; + if (schemeHandler) { + urnComponent = schemeHandler.parse(urnComponent, options); + } + } else { + urnComponent.error = urnComponent.error || "URN can not be parsed."; + } + return urnComponent; + } + function urnSerialize(urnComponent, options) { + if (urnComponent.nid === void 0) { + throw new Error("URN without nid cannot be serialized"); + } + const scheme = options.scheme || urnComponent.scheme || "urn"; + const nid = urnComponent.nid.toLowerCase(); + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = getSchemeHandler(urnScheme); + if (schemeHandler) { + urnComponent = schemeHandler.serialize(urnComponent, options); + } + const uriComponent = urnComponent; + const nss = urnComponent.nss; + uriComponent.path = `${nid || options.nid}:${nss}`; + options.skipEscape = true; + return uriComponent; + } + function urnuuidParse(urnComponent, options) { + const uuidComponent = urnComponent; + uuidComponent.uuid = uuidComponent.nss; + uuidComponent.nss = void 0; + if (!options.tolerant && (!uuidComponent.uuid || !isUUID(uuidComponent.uuid))) { + uuidComponent.error = uuidComponent.error || "UUID is not valid."; + } + return uuidComponent; + } + function urnuuidSerialize(uuidComponent) { + const urnComponent = uuidComponent; + urnComponent.nss = (uuidComponent.uuid || "").toLowerCase(); + return urnComponent; + } + var http2 = ( + /** @type {SchemeHandler} */ + { + scheme: "http", + domainHost: true, + parse: httpParse, + serialize: httpSerialize + } + ); + var https = ( + /** @type {SchemeHandler} */ + { + scheme: "https", + domainHost: http2.domainHost, + parse: httpParse, + serialize: httpSerialize + } + ); + var ws = ( + /** @type {SchemeHandler} */ + { + scheme: "ws", + domainHost: true, + parse: wsParse, + serialize: wsSerialize + } + ); + var wss = ( + /** @type {SchemeHandler} */ + { + scheme: "wss", + domainHost: ws.domainHost, + parse: ws.parse, + serialize: ws.serialize + } + ); + var urn = ( + /** @type {SchemeHandler} */ + { + scheme: "urn", + parse: urnParse, + serialize: urnSerialize, + skipNormalize: true + } + ); + var urnuuid = ( + /** @type {SchemeHandler} */ + { + scheme: "urn:uuid", + parse: urnuuidParse, + serialize: urnuuidSerialize, + skipNormalize: true + } + ); + var SCHEMES = ( + /** @type {Record} */ + { + http: http2, + https, + ws, + wss, + urn, + "urn:uuid": urnuuid + } + ); + Object.setPrototypeOf(SCHEMES, null); + function getSchemeHandler(scheme) { + return scheme && (SCHEMES[ + /** @type {SchemeName} */ + scheme + ] || SCHEMES[ + /** @type {SchemeName} */ + scheme.toLowerCase() + ]) || void 0; + } + module.exports = { + wsIsSecure, + SCHEMES, + isValidSchemeName, + getSchemeHandler + }; + } +}); + +// node_modules/fast-uri/index.js +var require_fast_uri = __commonJS({ + "node_modules/fast-uri/index.js"(exports, module) { + "use strict"; + var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils(); + var { SCHEMES, getSchemeHandler } = require_schemes(); + var VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u; + var MALFORMED_SCHEME_ERROR = "URI scheme is malformed."; + function decodeValidScheme(scheme) { + const decodedScheme = unescape(String(scheme)); + if (!VALID_SCHEME.test(decodedScheme)) { + throw new TypeError(MALFORMED_SCHEME_ERROR); + } + return decodedScheme; + } + function normalize(uri, options) { + if (typeof uri === "string") { + uri = /** @type {T} */ + normalizeString(uri, options); + } else if (typeof uri === "object") { + uri = /** @type {T} */ + parse3(serialize(uri, options), options); + } + return uri; + } + function resolve(baseURI, relativeURI, options) { + const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" }; + const { + parsed: baseParsed, + malformedAuthorityOrPort: baseMalformed, + malformedPercentEncoding: baseMalformedPercentEncoding, + malformedSchemeSpecific: baseMalformedSchemeSpecific, + malformedHost: baseMalformedHost, + malformedScheme: baseMalformedScheme + } = parseWithStatus(baseURI, schemelessOptions); + const { + parsed: relativeParsed, + malformedAuthorityOrPort: relativeMalformed, + malformedPercentEncoding: relativeMalformedPercentEncoding, + malformedSchemeSpecific: relativeMalformedSchemeSpecific, + malformedHost: relativeMalformedHost, + malformedScheme: relativeMalformedScheme + } = parseWithStatus(relativeURI, schemelessOptions); + if (baseMalformed || relativeMalformed || baseMalformedPercentEncoding || relativeMalformedPercentEncoding || baseMalformedSchemeSpecific || relativeMalformedSchemeSpecific || baseMalformedHost || relativeMalformedHost || baseMalformedScheme || relativeMalformedScheme) { + throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed."); + } + const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true); + const resolvedSchemeHandler = getSchemeHandler(options && options.scheme || resolved.scheme); + const resolvedHost = resolved.host; + const resolvedHostIsIP = resolvedHost !== void 0 && resolvedHost !== "" && (isIPv4(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6); + canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP); + const encodedASCIIHost = resolvedHost && resolvedHost.indexOf("%") !== -1 && !new RegExp("\\P{ASCII}", "u").test(resolvedHost); + if (resolved.error && !encodedASCIIHost) { + throw new Error(resolved.error); + } + schemelessOptions.skipEscape = true; + return serialize(resolved, schemelessOptions); + } + function resolveComponent(base, relative, options, skipNormalization) { + const target = {}; + if (!skipNormalization) { + base = parse3(serialize(base, options), options); + relative = parse3(serialize(relative, options), options); + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (relative.userinfo !== void 0 || relative.host !== void 0 || relative.port !== void 0) { + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== void 0) { + target.query = relative.query; + } else { + target.query = base.query; + } + } else { + if (relative.path[0] === "/") { + target.path = removeDotSegments(relative.path); + } else { + if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) { + target.path = "/" + relative.path; + } else if (!base.path) { + target.path = relative.path; + } else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; + } + function equal(uriA, uriB, options) { + const normalizedA = normalizeComparableURI(uriA, options); + const normalizedB = normalizeComparableURI(uriB, options); + return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA === normalizedB; + } + function serialize(cmpts, opts) { + const component = { + host: cmpts.host, + scheme: cmpts.scheme, + userinfo: cmpts.userinfo, + port: cmpts.port, + path: cmpts.path, + query: cmpts.query, + nid: cmpts.nid, + nss: cmpts.nss, + uuid: cmpts.uuid, + fragment: cmpts.fragment, + reference: cmpts.reference, + resourceName: cmpts.resourceName, + secure: cmpts.secure, + error: "" + }; + const options = Object.assign({}, opts); + const uriTokens = []; + if (component.scheme) { + component.scheme = decodeValidScheme(component.scheme); + } + const schemeHandler = getSchemeHandler(options.scheme || component.scheme); + if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options); + const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0; + const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority; + if (component.path !== void 0) { + if (!options.skipEscape) { + component.path = serializePathEncoding(component.path, pathNoScheme); + } else { + component.path = normalizePercentEncoding(component.path); + } + } + if (options.reference !== "suffix" && component.scheme) { + component.scheme = decodeValidScheme(component.scheme); + uriTokens.push(component.scheme, ":"); + } + const authority = recomposeAuthority(component); + if (authority !== void 0) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (component.path && component.path[0] !== "/") { + uriTokens.push("/"); + } + } + if (component.path !== void 0) { + let s = component.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (pathNoScheme) { + s = serializePathEncoding(s, true); + } + if (authority === void 0 && s[0] === "/" && s[1] === "/") { + s = "/%2F" + s.slice(2); + } + uriTokens.push(s); + } + if (component.query !== void 0) { + uriTokens.push("?", encodeQuery(component.query)); + } + if (component.fragment !== void 0) { + uriTokens.push("#", encodeFragment(component.fragment)); + } + return uriTokens.join(""); + } + var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u; + var AUTHORITY_PREFIX = /^(?:[^#/:?]+:)?\/\/([^/?#]*)/; + var AUTHORITY_INTRODUCER_REGION = /^(?:[^#/:?]+:)?([/\\\t\n\r]*)/; + function getParseError(parsed, matches) { + if (matches[2] !== void 0 && parsed.path && parsed.path[0] !== "/") { + return 'URI path must start with "/" when authority is present.'; + } + if (typeof parsed.port === "number" && (parsed.port < 0 || parsed.port > 65535)) { + return "URI port is malformed."; + } + return void 0; + } + function hasMalformedPercentEncoding(component) { + if (component === void 0) return false; + let percent = component.indexOf("%"); + while (percent !== -1) { + if (percent + 2 >= component.length || !/^[\da-f]{2}$/iu.test(component.slice(percent + 1, percent + 3))) { + return true; + } + percent = component.indexOf("%", percent + 3); + } + return false; + } + function isIPLiteral(host) { + return host[0] === "[" && host[host.length - 1] === "]"; + } + function hasMalformedComponentPercentEncoding(matches) { + const host = matches[4]; + return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]); + } + function canonicalizeHost(parsed, options, schemeHandler, isIP) { + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) { + try { + parsed.host = new URL("http://" + parsed.host).hostname; + } catch (e) { + parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e; + return true; + } + } + return false; + } + function parseWithStatus(uri, opts) { + const options = Object.assign({}, opts); + const parsed = { + scheme: void 0, + userinfo: void 0, + host: "", + port: void 0, + path: "", + query: void 0, + fragment: void 0 + }; + let malformedAuthorityOrPort = false; + let malformedPercentEncoding = false; + let malformedSchemeSpecific = false; + let malformedHost = false; + let malformedIPLiteral = false; + let malformedScheme = false; + let isIP = false; + if (options.reference === "suffix") { + if (options.scheme) { + uri = options.scheme + ":" + uri; + } else { + uri = "//" + uri; + } + } + const authorityMatch = uri.match(AUTHORITY_PREFIX); + if (authorityMatch !== null && authorityMatch[1].indexOf("\\") !== -1) { + parsed.error = "URI authority must not contain a literal backslash."; + malformedAuthorityOrPort = true; + } + const introducerMatch = uri.match(AUTHORITY_INTRODUCER_REGION); + if (introducerMatch !== null) { + const region = introducerMatch[1]; + const normalizedRegion = region.replace(/[\t\n\r]/g, ""); + if (normalizedRegion.length >= 2) { + if (normalizedRegion.slice(0, 2) !== "//") { + parsed.error = parsed.error || "URI authority must not contain a literal backslash."; + malformedAuthorityOrPort = true; + } else if (region.length !== normalizedRegion.length) { + parsed.error = parsed.error || "URI authority introducer must not contain whitespace."; + malformedAuthorityOrPort = true; + } + } + } + const matches = uri.match(URI_PARSE); + if (matches) { + parsed.scheme = matches[1]; + parsed.userinfo = matches[3]; + parsed.host = matches[4]; + parsed.port = parseInt(matches[5], 10); + parsed.path = matches[6] || ""; + parsed.query = matches[7]; + parsed.fragment = matches[8]; + if (parsed.scheme !== void 0) { + const decodedScheme = unescape(parsed.scheme); + if (VALID_SCHEME.test(decodedScheme)) { + parsed.scheme = decodedScheme.toLowerCase(); + } else { + parsed.error = parsed.error || MALFORMED_SCHEME_ERROR; + malformedScheme = true; + } + } + malformedPercentEncoding = hasMalformedComponentPercentEncoding(matches); + if (malformedPercentEncoding) { + parsed.error = parsed.error || "URI contains malformed percent-encoding."; + } + if (isNaN(parsed.port)) { + parsed.port = matches[5]; + } + const parseError = getParseError(parsed, matches); + if (parseError !== void 0) { + parsed.error = parsed.error || parseError; + malformedAuthorityOrPort = true; + } + if (parsed.host) { + const ipv4result = isIPv4(parsed.host); + if (ipv4result === false) { + const bracketedIPLiteral = isIPLiteral(parsed.host); + const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1; + const ipv6result = normalizeIPv6(parsed.host); + isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true; + malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true); + parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase(); + if (malformedIPLiteral) { + parsed.error = parsed.error || "URI host is malformed."; + malformedAuthorityOrPort = true; + } + } else { + isIP = true; + } + } + if (parsed.scheme === void 0 && parsed.userinfo === void 0 && parsed.host === void 0 && parsed.port === void 0 && parsed.query === void 0 && !parsed.path) { + parsed.reference = "same-document"; + } else if (parsed.scheme === void 0) { + parsed.reference = "relative"; + } else if (parsed.fragment === void 0) { + parsed.reference = "absolute"; + } else { + parsed.reference = "uri"; + } + if (options.reference && options.reference !== "suffix" && options.reference !== parsed.reference) { + parsed.error = parsed.error || "URI is not a " + options.reference + " reference."; + } + const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme); + if (!malformedIPLiteral) { + malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP); + } + if (uri.indexOf("%") !== -1 && parsed.host !== void 0 && !malformedIPLiteral) { + let host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true); + if (!isIP) { + host = normalizePercentEncoding(host.toLowerCase()); + } + parsed.host = reescapeHostDelimiters(host, isIP); + } + if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) { + if (parsed.path) { + parsed.path = normalizePathEncoding(parsed.path); + } + if (parsed.query) { + parsed.query = normalizeQueryFragmentEncoding(parsed.query); + } + if (parsed.fragment) { + parsed.fragment = normalizeQueryFragmentEncoding(parsed.fragment); + } + } + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(parsed, options); + if (schemeHandler === SCHEMES.urn && parsed.nid === void 0) { + malformedSchemeSpecific = true; + } + } + } else { + parsed.error = parsed.error || "URI can not be parsed."; + } + return { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme }; + } + function parse3(uri, opts) { + return parseWithStatus(uri, opts).parsed; + } + function normalizeString(uri, opts) { + return normalizeStringWithStatus(uri, opts).normalized; + } + function normalizeStringWithStatus(uri, opts) { + const { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = parseWithStatus(uri, opts); + return { + normalized: malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? uri : serialize(parsed, opts), + malformedAuthorityOrPort, + malformedPercentEncoding, + malformedSchemeSpecific, + malformedHost, + malformedScheme + }; + } + function normalizeComparableURI(uri, opts) { + if (typeof uri !== "string" && typeof uri !== "object") { + return void 0; + } + let value; + try { + value = typeof uri === "string" ? uri : serialize(uri, opts); + } catch { + return void 0; + } + const { normalized, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = normalizeStringWithStatus(value, opts); + return malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? void 0 : normalized; + } + var fastUri = { + SCHEMES, + normalize, + resolve, + resolveComponent, + equal, + serialize, + parse: parse3 + }; + module.exports = fastUri; + module.exports.default = fastUri; + module.exports.fastUri = fastUri; + } +}); + +// node_modules/ajv/dist/runtime/uri.js +var require_uri = __commonJS({ + "node_modules/ajv/dist/runtime/uri.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var uri = require_fast_uri(); + uri.code = 'require("ajv/dist/runtime/uri").default'; + exports.default = uri; + } +}); + +// node_modules/ajv/dist/core.js +var require_core = __commonJS({ + "node_modules/ajv/dist/core.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; + var validate_1 = require_validate(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error(); + var ref_error_1 = require_ref_error(); + var rules_1 = require_rules(); + var compile_1 = require_compile(); + var codegen_2 = require_codegen(); + var resolve_1 = require_resolve(); + var dataType_1 = require_dataType(); + var util_1 = require_util(); + var $dataRefSchema = require_data(); + var uri_1 = require_uri(); + var defaultRegExp = (str, flags) => new RegExp(str, flags); + defaultRegExp.code = "new RegExp"; + var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"]; + var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([ + "validate", + "serialize", + "parse", + "wrapper", + "root", + "schema", + "keyword", + "pattern", + "formats", + "validate$data", + "func", + "obj", + "Error" + ]); + var removedOptions = { + errorDataPath: "", + format: "`validateFormats: false` can be used instead.", + nullable: '"nullable" keyword is supported by default.', + jsonPointers: "Deprecated jsPropertySyntax can be used instead.", + extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", + missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", + processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", + sourceCode: "Use option `code: {source: true}`", + strictDefaults: "It is default now, see option `strict`.", + strictKeywords: "It is default now, see option `strict`.", + uniqueItems: '"uniqueItems" keyword is always validated.', + unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", + cache: "Map is used as cache, schema object as key.", + serialize: "Map is used as cache, schema object as key.", + ajvErrors: "It is default now." + }; + var deprecatedOptions = { + ignoreKeywordsWithRef: "", + jsPropertySyntax: "", + unicode: '"minLength"/"maxLength" account for unicode characters by default.' + }; + var MAX_EXPRESSION = 200; + function requiredOptions(o) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; + const s = o.strict; + const _optz = (_a = o.code) === null || _a === void 0 ? void 0 : _a.optimize; + const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0; + const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp; + const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default; + return { + strictSchema: (_f = (_e = o.strictSchema) !== null && _e !== void 0 ? _e : s) !== null && _f !== void 0 ? _f : true, + strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true, + strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log", + strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log", + strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false, + code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp }, + loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION, + loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION, + meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true, + messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true, + inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true, + schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id", + addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true, + validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true, + validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true, + unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true, + int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true, + uriResolver + }; + } + var Ajv2 = class { + constructor(opts = {}) { + this.schemas = {}; + this.refs = {}; + this.formats = /* @__PURE__ */ Object.create(null); + this._compilations = /* @__PURE__ */ new Set(); + this._loading = {}; + this._cache = /* @__PURE__ */ new Map(); + opts = this.opts = { ...opts, ...requiredOptions(opts) }; + const { es5, lines } = this.opts.code; + this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines }); + this.logger = getLogger(opts.logger); + const formatOpt = opts.validateFormats; + opts.validateFormats = false; + this.RULES = (0, rules_1.getRules)(); + checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED"); + checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn"); + this._metaOpts = getMetaSchemaOptions.call(this); + if (opts.formats) + addInitialFormats.call(this); + this._addVocabularies(); + this._addDefaultMetaSchema(); + if (opts.keywords) + addInitialKeywords.call(this, opts.keywords); + if (typeof opts.meta == "object") + this.addMetaSchema(opts.meta); + addInitialSchemas.call(this); + opts.validateFormats = formatOpt; + } + _addVocabularies() { + this.addKeyword("$async"); + } + _addDefaultMetaSchema() { + const { $data, meta, schemaId } = this.opts; + let _dataRefSchema = $dataRefSchema; + if (schemaId === "id") { + _dataRefSchema = { ...$dataRefSchema }; + _dataRefSchema.id = _dataRefSchema.$id; + delete _dataRefSchema.$id; + } + if (meta && $data) + this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false); + } + defaultMeta() { + const { meta, schemaId } = this.opts; + return this.opts.defaultMeta = typeof meta == "object" ? meta[schemaId] || meta : void 0; + } + validate(schemaKeyRef, data) { + let v; + if (typeof schemaKeyRef == "string") { + v = this.getSchema(schemaKeyRef); + if (!v) + throw new Error(`no schema with key or ref "${schemaKeyRef}"`); + } else { + v = this.compile(schemaKeyRef); + } + const valid = v(data); + if (!("$async" in v)) + this.errors = v.errors; + return valid; + } + compile(schema, _meta) { + const sch = this._addSchema(schema, _meta); + return sch.validate || this._compileSchemaEnv(sch); + } + compileAsync(schema, meta) { + if (typeof this.opts.loadSchema != "function") { + throw new Error("options.loadSchema should be a function"); + } + const { loadSchema } = this.opts; + return runCompileAsync.call(this, schema, meta); + async function runCompileAsync(_schema, _meta) { + await loadMetaSchema.call(this, _schema.$schema); + const sch = this._addSchema(_schema, _meta); + return sch.validate || _compileAsync.call(this, sch); + } + async function loadMetaSchema($ref) { + if ($ref && !this.getSchema($ref)) { + await runCompileAsync.call(this, { $ref }, true); + } + } + async function _compileAsync(sch) { + try { + return this._compileSchemaEnv(sch); + } catch (e) { + if (!(e instanceof ref_error_1.default)) + throw e; + checkLoaded.call(this, e); + await loadMissingSchema.call(this, e.missingSchema); + return _compileAsync.call(this, sch); + } + } + function checkLoaded({ missingSchema: ref, missingRef }) { + if (this.refs[ref]) { + throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`); + } + } + async function loadMissingSchema(ref) { + const _schema = await _loadSchema.call(this, ref); + if (!this.refs[ref]) + await loadMetaSchema.call(this, _schema.$schema); + if (!this.refs[ref]) + this.addSchema(_schema, ref, meta); + } + async function _loadSchema(ref) { + const p = this._loading[ref]; + if (p) + return p; + try { + return await (this._loading[ref] = loadSchema(ref)); + } finally { + delete this._loading[ref]; + } + } + } + // Adds schema to the instance + addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) { + if (Array.isArray(schema)) { + for (const sch of schema) + this.addSchema(sch, void 0, _meta, _validateSchema); + return this; + } + let id; + if (typeof schema === "object") { + const { schemaId } = this.opts; + id = schema[schemaId]; + if (id !== void 0 && typeof id != "string") { + throw new Error(`schema ${schemaId} must be string`); + } + } + key = (0, resolve_1.normalizeId)(key || id); + this._checkUnique(key); + this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true); + return this; + } + // Add schema that will be used to validate other schemas + // options in META_IGNORE_OPTIONS are alway set to false + addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) { + this.addSchema(schema, key, true, _validateSchema); + return this; + } + // Validate schema against its meta-schema + validateSchema(schema, throwOrLogError) { + if (typeof schema == "boolean") + return true; + let $schema; + $schema = schema.$schema; + if ($schema !== void 0 && typeof $schema != "string") { + throw new Error("$schema must be a string"); + } + $schema = $schema || this.opts.defaultMeta || this.defaultMeta(); + if (!$schema) { + this.logger.warn("meta-schema not available"); + this.errors = null; + return true; + } + const valid = this.validate($schema, schema); + if (!valid && throwOrLogError) { + const message = "schema is invalid: " + this.errorsText(); + if (this.opts.validateSchema === "log") + this.logger.error(message); + else + throw new Error(message); + } + return valid; + } + // Get compiled schema by `key` or `ref`. + // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) + getSchema(keyRef) { + let sch; + while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") + keyRef = sch; + if (sch === void 0) { + const { schemaId } = this.opts; + const root = new compile_1.SchemaEnv({ schema: {}, schemaId }); + sch = compile_1.resolveSchema.call(this, root, keyRef); + if (!sch) + return; + this.refs[keyRef] = sch; + } + return sch.validate || this._compileSchemaEnv(sch); + } + // Remove cached schema(s). + // If no parameter is passed all schemas but meta-schemas are removed. + // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + removeSchema(schemaKeyRef) { + if (schemaKeyRef instanceof RegExp) { + this._removeAllSchemas(this.schemas, schemaKeyRef); + this._removeAllSchemas(this.refs, schemaKeyRef); + return this; + } + switch (typeof schemaKeyRef) { + case "undefined": + this._removeAllSchemas(this.schemas); + this._removeAllSchemas(this.refs); + this._cache.clear(); + return this; + case "string": { + const sch = getSchEnv.call(this, schemaKeyRef); + if (typeof sch == "object") + this._cache.delete(sch.schema); + delete this.schemas[schemaKeyRef]; + delete this.refs[schemaKeyRef]; + return this; + } + case "object": { + const cacheKey = schemaKeyRef; + this._cache.delete(cacheKey); + let id = schemaKeyRef[this.opts.schemaId]; + if (id) { + id = (0, resolve_1.normalizeId)(id); + delete this.schemas[id]; + delete this.refs[id]; + } + return this; + } + default: + throw new Error("ajv.removeSchema: invalid parameter"); + } + } + // add "vocabulary" - a collection of keywords + addVocabulary(definitions) { + for (const def of definitions) + this.addKeyword(def); + return this; + } + addKeyword(kwdOrDef, def) { + let keyword; + if (typeof kwdOrDef == "string") { + keyword = kwdOrDef; + if (typeof def == "object") { + this.logger.warn("these parameters are deprecated, see docs for addKeyword"); + def.keyword = keyword; + } + } else if (typeof kwdOrDef == "object" && def === void 0) { + def = kwdOrDef; + keyword = def.keyword; + if (Array.isArray(keyword) && !keyword.length) { + throw new Error("addKeywords: keyword must be string or non-empty array"); + } + } else { + throw new Error("invalid addKeywords parameters"); + } + checkKeyword.call(this, keyword, def); + if (!def) { + (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd)); + return this; + } + keywordMetaschema.call(this, def); + const definition = { + ...def, + type: (0, dataType_1.getJSONTypes)(def.type), + schemaType: (0, dataType_1.getJSONTypes)(def.schemaType) + }; + (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k) => addRule.call(this, k, definition) : (k) => definition.type.forEach((t) => addRule.call(this, k, definition, t))); + return this; + } + getKeyword(keyword) { + const rule = this.RULES.all[keyword]; + return typeof rule == "object" ? rule.definition : !!rule; + } + // Remove keyword + removeKeyword(keyword) { + const { RULES } = this; + delete RULES.keywords[keyword]; + delete RULES.all[keyword]; + for (const group of RULES.rules) { + const i = group.rules.findIndex((rule) => rule.keyword === keyword); + if (i >= 0) + group.rules.splice(i, 1); + } + return this; + } + // Add format + addFormat(name, format) { + if (typeof format == "string") + format = new RegExp(format); + this.formats[name] = format; + return this; + } + errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) { + if (!errors || errors.length === 0) + return "No errors"; + return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg); + } + $dataMetaSchema(metaSchema, keywordsJsonPointers) { + const rules = this.RULES.all; + metaSchema = JSON.parse(JSON.stringify(metaSchema)); + for (const jsonPointer of keywordsJsonPointers) { + const segments = jsonPointer.split("/").slice(1); + let keywords = metaSchema; + for (const seg of segments) + keywords = keywords[seg]; + for (const key in rules) { + const rule = rules[key]; + if (typeof rule != "object") + continue; + const { $data } = rule.definition; + const schema = keywords[key]; + if ($data && schema) + keywords[key] = schemaOrData(schema); + } + } + return metaSchema; + } + _removeAllSchemas(schemas, regex) { + for (const keyRef in schemas) { + const sch = schemas[keyRef]; + if (!regex || regex.test(keyRef)) { + if (typeof sch == "string") { + delete schemas[keyRef]; + } else if (sch && !sch.meta) { + this._cache.delete(sch.schema); + delete schemas[keyRef]; + } + } + } + } + _addSchema(schema, meta, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) { + let id; + const { schemaId } = this.opts; + if (typeof schema == "object") { + id = schema[schemaId]; + } else { + if (this.opts.jtd) + throw new Error("schema must be object"); + else if (typeof schema != "boolean") + throw new Error("schema must be object or boolean"); + } + let sch = this._cache.get(schema); + if (sch !== void 0) + return sch; + baseId = (0, resolve_1.normalizeId)(id || baseId); + const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId); + sch = new compile_1.SchemaEnv({ schema, schemaId, meta, baseId, localRefs }); + this._cache.set(sch.schema, sch); + if (addSchema && !baseId.startsWith("#")) { + if (baseId) + this._checkUnique(baseId); + this.refs[baseId] = sch; + } + if (validateSchema) + this.validateSchema(schema, true); + return sch; + } + _checkUnique(id) { + if (this.schemas[id] || this.refs[id]) { + throw new Error(`schema with key or id "${id}" already exists`); + } + } + _compileSchemaEnv(sch) { + if (sch.meta) + this._compileMetaSchema(sch); + else + compile_1.compileSchema.call(this, sch); + if (!sch.validate) + throw new Error("ajv implementation error"); + return sch.validate; + } + _compileMetaSchema(sch) { + const currentOpts = this.opts; + this.opts = this._metaOpts; + try { + compile_1.compileSchema.call(this, sch); + } finally { + this.opts = currentOpts; + } + } + }; + Ajv2.ValidationError = validation_error_1.default; + Ajv2.MissingRefError = ref_error_1.default; + exports.default = Ajv2; + function checkOptions(checkOpts, options, msg, log = "error") { + for (const key in checkOpts) { + const opt = key; + if (opt in options) + this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`); + } + } + function getSchEnv(keyRef) { + keyRef = (0, resolve_1.normalizeId)(keyRef); + return this.schemas[keyRef] || this.refs[keyRef]; + } + function addInitialSchemas() { + const optsSchemas = this.opts.schemas; + if (!optsSchemas) + return; + if (Array.isArray(optsSchemas)) + this.addSchema(optsSchemas); + else + for (const key in optsSchemas) + this.addSchema(optsSchemas[key], key); + } + function addInitialFormats() { + for (const name in this.opts.formats) { + const format = this.opts.formats[name]; + if (format) + this.addFormat(name, format); + } + } + function addInitialKeywords(defs) { + if (Array.isArray(defs)) { + this.addVocabulary(defs); + return; + } + this.logger.warn("keywords option as map is deprecated, pass array"); + for (const keyword in defs) { + const def = defs[keyword]; + if (!def.keyword) + def.keyword = keyword; + this.addKeyword(def); + } + } + function getMetaSchemaOptions() { + const metaOpts = { ...this.opts }; + for (const opt of META_IGNORE_OPTIONS) + delete metaOpts[opt]; + return metaOpts; + } + var noLogs = { log() { + }, warn() { + }, error() { + } }; + function getLogger(logger) { + if (logger === false) + return noLogs; + if (logger === void 0) + return console; + if (logger.log && logger.warn && logger.error) + return logger; + throw new Error("logger must implement log, warn and error methods"); + } + var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i; + function checkKeyword(keyword, def) { + const { RULES } = this; + (0, util_1.eachItem)(keyword, (kwd) => { + if (RULES.keywords[kwd]) + throw new Error(`Keyword ${kwd} is already defined`); + if (!KEYWORD_NAME.test(kwd)) + throw new Error(`Keyword ${kwd} has invalid name`); + }); + if (!def) + return; + if (def.$data && !("code" in def || "validate" in def)) { + throw new Error('$data keyword must have "code" or "validate" function'); + } + } + function addRule(keyword, definition, dataType) { + var _a; + const post = definition === null || definition === void 0 ? void 0 : definition.post; + if (dataType && post) + throw new Error('keyword with "post" flag cannot have "type"'); + const { RULES } = this; + let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType); + if (!ruleGroup) { + ruleGroup = { type: dataType, rules: [] }; + RULES.rules.push(ruleGroup); + } + RULES.keywords[keyword] = true; + if (!definition) + return; + const rule = { + keyword, + definition: { + ...definition, + type: (0, dataType_1.getJSONTypes)(definition.type), + schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType) + } + }; + if (definition.before) + addBeforeRule.call(this, ruleGroup, rule, definition.before); + else + ruleGroup.rules.push(rule); + RULES.all[keyword] = rule; + (_a = definition.implements) === null || _a === void 0 ? void 0 : _a.forEach((kwd) => this.addKeyword(kwd)); + } + function addBeforeRule(ruleGroup, rule, before) { + const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before); + if (i >= 0) { + ruleGroup.rules.splice(i, 0, rule); + } else { + ruleGroup.rules.push(rule); + this.logger.warn(`rule ${before} is not defined`); + } + } + function keywordMetaschema(def) { + let { metaSchema } = def; + if (metaSchema === void 0) + return; + if (def.$data && this.opts.$data) + metaSchema = schemaOrData(metaSchema); + def.validateSchema = this.compile(metaSchema, true); + } + var $dataRef = { + $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" + }; + function schemaOrData(schema) { + return { anyOf: [schema, $dataRef] }; + } + } +}); + +// node_modules/ajv/dist/vocabularies/core/id.js +var require_id = __commonJS({ + "node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var def = { + keyword: "id", + code() { + throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/core/ref.js +var require_ref = __commonJS({ + "node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.callRef = exports.getValidate = void 0; + var ref_error_1 = require_ref_error(); + var code_1 = require_code2(); + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var compile_1 = require_compile(); + var util_1 = require_util(); + var def = { + keyword: "$ref", + schemaType: "string", + code(cxt) { + const { gen, schema: $ref, it } = cxt; + const { baseId, schemaEnv: env, validateName, opts, self } = it; + const { root } = env; + if (($ref === "#" || $ref === "#/") && baseId === root.baseId) + return callRootRef(); + const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); + if (schOrEnv === void 0) + throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref); + if (schOrEnv instanceof compile_1.SchemaEnv) + return callValidate(schOrEnv); + return inlineRefSchema(schOrEnv); + function callRootRef() { + if (env === root) + return callRef(cxt, validateName, env, env.$async); + const rootName = gen.scopeValue("root", { ref: root }); + return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async); + } + function callValidate(sch) { + const v = getValidate(cxt, sch); + callRef(cxt, v, sch, sch.$async); + } + function inlineRefSchema(sch) { + const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch }); + const valid = gen.name("valid"); + const schCxt = cxt.subschema({ + schema: sch, + dataTypes: [], + schemaPath: codegen_1.nil, + topSchemaRef: schName, + errSchemaPath: $ref + }, valid); + cxt.mergeEvaluated(schCxt); + cxt.ok(valid); + } + } + }; + function getValidate(cxt, sch) { + const { gen } = cxt; + return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`; + } + exports.getValidate = getValidate; + function callRef(cxt, v, sch, $async) { + const { gen, it } = cxt; + const { allErrors, schemaEnv: env, opts } = it; + const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; + if ($async) + callAsyncRef(); + else + callSyncRef(); + function callAsyncRef() { + if (!env.$async) + throw new Error("async schema referenced by sync schema"); + const valid = gen.let("valid"); + gen.try(() => { + gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v, passCxt)}`); + addEvaluatedFrom(v); + if (!allErrors) + gen.assign(valid, true); + }, (e) => { + gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); + addErrorsFrom(e); + if (!allErrors) + gen.assign(valid, false); + }); + cxt.ok(valid); + } + function callSyncRef() { + cxt.result((0, code_1.callValidateCode)(cxt, v, passCxt), () => addEvaluatedFrom(v), () => addErrorsFrom(v)); + } + function addErrorsFrom(source) { + const errs = (0, codegen_1._)`${source}.errors`; + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); + gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + } + function addEvaluatedFrom(source) { + var _a; + if (!it.opts.unevaluated) + return; + const schEvaluated = (_a = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a === void 0 ? void 0 : _a.evaluated; + if (it.props !== true) { + if (schEvaluated && !schEvaluated.dynamicProps) { + if (schEvaluated.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); + } + } else { + const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`); + it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); + } + } + if (it.items !== true) { + if (schEvaluated && !schEvaluated.dynamicItems) { + if (schEvaluated.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); + } + } else { + const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`); + it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); + } + } + } + } + exports.callRef = callRef; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/core/index.js +var require_core2 = __commonJS({ + "node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var id_1 = require_id(); + var ref_1 = require_ref(); + var core = [ + "$schema", + "$id", + "$defs", + "$vocabulary", + { keyword: "$comment" }, + "definitions", + id_1.default, + ref_1.default + ]; + exports.default = core; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitNumber.js +var require_limitNumber = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var ops = codegen_1.operators; + var KWDs = { + maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, + minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, + exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, + exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } + }; + var error2 = { + message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`, + params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` + }; + var def = { + keyword: Object.keys(KWDs), + type: "number", + schemaType: "number", + $data: true, + error: error2, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/multipleOf.js +var require_multipleOf = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var error2 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`, + params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}` + }; + var def = { + keyword: "multipleOf", + type: "number", + schemaType: "number", + $data: true, + error: error2, + code(cxt) { + const { gen, data, schemaCode, it } = cxt; + const prec = it.opts.multipleOfPrecision; + const res = gen.let("res"); + const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`; + cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/runtime/ucs2length.js +var require_ucs2length = __commonJS({ + "node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + function ucs2length(str) { + const len = str.length; + let length = 0; + let pos = 0; + let value; + while (pos < len) { + length++; + value = str.charCodeAt(pos++); + if (value >= 55296 && value <= 56319 && pos < len) { + value = str.charCodeAt(pos); + if ((value & 64512) === 56320) + pos++; + } + } + return length; + } + exports.default = ucs2length; + ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitLength.js +var require_limitLength = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var ucs2length_1 = require_ucs2length(); + var error2 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxLength" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxLength", "minLength"], + type: "string", + schemaType: "number", + $data: true, + error: error2, + code(cxt) { + const { keyword, data, schemaCode, it } = cxt; + const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT; + const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`; + cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/pattern.js +var require_pattern = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var util_1 = require_util(); + var codegen_1 = require_codegen(); + var error2 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}` + }; + var def = { + keyword: "pattern", + type: "string", + schemaType: "string", + $data: true, + error: error2, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const u = it.opts.unicodeRegExp ? "u" : ""; + if ($data) { + const { regExp } = it.opts.code; + const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); + const valid = gen.let("valid"); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); + cxt.fail$data((0, codegen_1._)`!${valid}`); + } else { + const regExp = (0, code_1.usePattern)(cxt, schema); + cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitProperties.js +var require_limitProperties = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var error2 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxProperties" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxProperties", "minProperties"], + type: "object", + schemaType: "number", + $data: true, + error: error2, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/required.js +var require_required = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error2 = { + message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`, + params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}` + }; + var def = { + keyword: "required", + type: "object", + schemaType: "array", + $data: true, + error: error2, + code(cxt) { + const { gen, schema, schemaCode, data, $data, it } = cxt; + const { opts } = it; + if (!$data && schema.length === 0) + return; + const useLoop = schema.length >= opts.loopRequired; + if (it.allErrors) + allErrorsMode(); + else + exitOnErrorMode(); + if (opts.strictRequired) { + const props = cxt.parentSchema.properties; + const { definedProperties } = cxt.it; + for (const requiredKey of schema) { + if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired); + } + } + } + function allErrorsMode() { + if (useLoop || $data) { + cxt.block$data(codegen_1.nil, loopAllRequired); + } else { + for (const prop of schema) { + (0, code_1.checkReportMissingProp)(cxt, prop); + } + } + } + function exitOnErrorMode() { + const missing = gen.let("missing"); + if (useLoop || $data) { + const valid = gen.let("valid", true); + cxt.block$data(valid, () => loopUntilMissing(missing, valid)); + cxt.ok(valid); + } else { + gen.if((0, code_1.checkMissingProp)(cxt, schema, missing)); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + function loopAllRequired() { + gen.forOf("prop", schemaCode, (prop) => { + cxt.setParams({ missingProperty: prop }); + gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error()); + }); + } + function loopUntilMissing(missing, valid) { + cxt.setParams({ missingProperty: missing }); + gen.forOf(missing, schemaCode, () => { + gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties)); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(); + gen.break(); + }); + }, codegen_1.nil); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitItems.js +var require_limitItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var error2 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxItems" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxItems", "minItems"], + type: "array", + schemaType: "number", + $data: true, + error: error2, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/runtime/equal.js +var require_equal = __commonJS({ + "node_modules/ajv/dist/runtime/equal.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var equal = require_fast_deep_equal(); + equal.code = 'require("ajv/dist/runtime/equal").default'; + exports.default = equal; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +var require_uniqueItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dataType_1 = require_dataType(); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var equal_1 = require_equal(); + var error2 = { + message: ({ params: { i, j } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j} and ${i} are identical)`, + params: ({ params: { i, j } }) => (0, codegen_1._)`{i: ${i}, j: ${j}}` + }; + var def = { + keyword: "uniqueItems", + type: "array", + schemaType: "boolean", + $data: true, + error: error2, + code(cxt) { + const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; + if (!$data && !schema) + return; + const valid = gen.let("valid"); + const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : []; + cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`); + cxt.ok(valid); + function validateUniqueItems() { + const i = gen.let("i", (0, codegen_1._)`${data}.length`); + const j = gen.let("j"); + cxt.setParams({ i, j }); + gen.assign(valid, true); + gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j)); + } + function canOptimize() { + return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); + } + function loopN(i, j) { + const item = gen.name("item"); + const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); + const indices = gen.const("indices", (0, codegen_1._)`{}`); + gen.for((0, codegen_1._)`;${i}--;`, () => { + gen.let(item, (0, codegen_1._)`${data}[${i}]`); + gen.if(wrongType, (0, codegen_1._)`continue`); + if (itemTypes.length > 1) + gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`); + gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => { + gen.assign(j, (0, codegen_1._)`${indices}[${item}]`); + cxt.error(); + gen.assign(valid, false).break(); + }).code((0, codegen_1._)`${indices}[${item}] = ${i}`); + }); + } + function loopN2(i, j) { + const eql = (0, util_1.useFunc)(gen, equal_1.default); + const outer = gen.name("outer"); + gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j} = ${i}; ${j}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j}])`, () => { + cxt.error(); + gen.assign(valid, false).break(outer); + }))); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/const.js +var require_const = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var equal_1 = require_equal(); + var error2 = { + message: "must be equal to constant", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}` + }; + var def = { + keyword: "const", + $data: true, + error: error2, + code(cxt) { + const { gen, data, $data, schemaCode, schema } = cxt; + if ($data || schema && typeof schema == "object") { + cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`); + } else { + cxt.fail((0, codegen_1._)`${schema} !== ${data}`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/enum.js +var require_enum = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var equal_1 = require_equal(); + var error2 = { + message: "must be equal to one of the allowed values", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}` + }; + var def = { + keyword: "enum", + schemaType: "array", + $data: true, + error: error2, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + if (!$data && schema.length === 0) + throw new Error("enum must have non-empty array"); + const useLoop = schema.length >= it.opts.loopEnum; + let eql; + const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default); + let valid; + if (useLoop || $data) { + valid = gen.let("valid"); + cxt.block$data(valid, loopEnum); + } else { + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const vSchema = gen.const("vSchema", schemaCode); + valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i))); + } + cxt.pass(valid); + function loopEnum() { + gen.assign(valid, false); + gen.forOf("v", schemaCode, (v) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v})`, () => gen.assign(valid, true).break())); + } + function equalCode(vSchema, i) { + const sch = schema[i]; + return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`; + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/index.js +var require_validation = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var limitNumber_1 = require_limitNumber(); + var multipleOf_1 = require_multipleOf(); + var limitLength_1 = require_limitLength(); + var pattern_1 = require_pattern(); + var limitProperties_1 = require_limitProperties(); + var required_1 = require_required(); + var limitItems_1 = require_limitItems(); + var uniqueItems_1 = require_uniqueItems(); + var const_1 = require_const(); + var enum_1 = require_enum(); + var validation = [ + // number + limitNumber_1.default, + multipleOf_1.default, + // string + limitLength_1.default, + pattern_1.default, + // object + limitProperties_1.default, + required_1.default, + // array + limitItems_1.default, + uniqueItems_1.default, + // any + { keyword: "type", schemaType: ["string", "array"] }, + { keyword: "nullable", schemaType: "boolean" }, + const_1.default, + enum_1.default + ]; + exports.default = validation; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +var require_additionalItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateAdditionalItems = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error2 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "additionalItems", + type: "array", + schemaType: ["boolean", "object"], + before: "uniqueItems", + error: error2, + code(cxt) { + const { parentSchema, it } = cxt; + const { items } = parentSchema; + if (!Array.isArray(items)) { + (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas'); + return; + } + validateAdditionalItems(cxt, items); + } + }; + function validateAdditionalItems(cxt, items) { + const { gen, schema, data, keyword, it } = cxt; + it.items = true; + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + if (schema === false) { + cxt.setParams({ len: items.length }); + cxt.pass((0, codegen_1._)`${len} <= ${items.length}`); + } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`); + gen.if((0, codegen_1.not)(valid), () => validateItems(valid)); + cxt.ok(valid); + } + function validateItems(valid) { + gen.forRange("i", items.length, len, (i) => { + cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid); + if (!it.allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + }); + } + } + exports.validateAdditionalItems = validateAdditionalItems; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/items.js +var require_items = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateTuple = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var code_1 = require_code2(); + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "array", "boolean"], + before: "uniqueItems", + code(cxt) { + const { schema, it } = cxt; + if (Array.isArray(schema)) + return validateTuple(cxt, "additionalItems", schema); + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + function validateTuple(cxt, extraItems, schArr = cxt.schema) { + const { gen, parentSchema, data, keyword, it } = cxt; + checkStrictTuple(parentSchema); + if (it.opts.unevaluated && schArr.length && it.items !== true) { + it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items); + } + const valid = gen.name("valid"); + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + schArr.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({ + keyword, + schemaProp: i, + dataProp: i + }, valid)); + cxt.ok(valid); + }); + function checkStrictTuple(sch) { + const { opts, errSchemaPath } = it; + const l = schArr.length; + const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false); + if (opts.strictTuples && !fullTuple) { + const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); + } + } + } + exports.validateTuple = validateTuple; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +var require_prefixItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var items_1 = require_items(); + var def = { + keyword: "prefixItems", + type: "array", + schemaType: ["array"], + before: "uniqueItems", + code: (cxt) => (0, items_1.validateTuple)(cxt, "items") + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/items2020.js +var require_items2020 = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var code_1 = require_code2(); + var additionalItems_1 = require_additionalItems(); + var error2 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + error: error2, + code(cxt) { + const { schema, parentSchema, it } = cxt; + const { prefixItems } = parentSchema; + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + if (prefixItems) + (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems); + else + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/contains.js +var require_contains = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error2 = { + message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`, + params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}` + }; + var def = { + keyword: "contains", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + trackErrors: true, + error: error2, + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + let min; + let max; + const { minContains, maxContains } = parentSchema; + if (it.opts.next) { + min = minContains === void 0 ? 1 : minContains; + max = maxContains; + } else { + min = 1; + } + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + cxt.setParams({ min, max }); + if (max === void 0 && min === 0) { + (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`); + return; + } + if (max !== void 0 && min > max) { + (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`); + cxt.fail(); + return; + } + if ((0, util_1.alwaysValidSchema)(it, schema)) { + let cond = (0, codegen_1._)`${len} >= ${min}`; + if (max !== void 0) + cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`; + cxt.pass(cond); + return; + } + it.items = true; + const valid = gen.name("valid"); + if (max === void 0 && min === 1) { + validateItems(valid, () => gen.if(valid, () => gen.break())); + } else if (min === 0) { + gen.let(valid, true); + if (max !== void 0) + gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount); + } else { + gen.let(valid, false); + validateItemsWithCount(); + } + cxt.result(valid, () => cxt.reset()); + function validateItemsWithCount() { + const schValid = gen.name("_valid"); + const count = gen.let("count", 0); + validateItems(schValid, () => gen.if(schValid, () => checkLimits(count))); + } + function validateItems(_valid, block) { + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword: "contains", + dataProp: i, + dataPropType: util_1.Type.Num, + compositeRule: true + }, _valid); + block(); + }); + } + function checkLimits(count) { + gen.code((0, codegen_1._)`${count}++`); + if (max === void 0) { + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break()); + } else { + gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break()); + if (min === 1) + gen.assign(valid, true); + else + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true)); + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/dependencies.js +var require_dependencies = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var code_1 = require_code2(); + exports.error = { + message: ({ params: { property, depsCount, deps } }) => { + const property_ies = depsCount === 1 ? "property" : "properties"; + return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`; + }, + params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property}, + missingProperty: ${missingProperty}, + depsCount: ${depsCount}, + deps: ${deps}}` + // TODO change to reference + }; + var def = { + keyword: "dependencies", + type: "object", + schemaType: "object", + error: exports.error, + code(cxt) { + const [propDeps, schDeps] = splitDependencies(cxt); + validatePropertyDeps(cxt, propDeps); + validateSchemaDeps(cxt, schDeps); + } + }; + function splitDependencies({ schema }) { + const propertyDeps = {}; + const schemaDeps = {}; + for (const key in schema) { + if (key === "__proto__") + continue; + const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps; + deps[key] = schema[key]; + } + return [propertyDeps, schemaDeps]; + } + function validatePropertyDeps(cxt, propertyDeps = cxt.schema) { + const { gen, data, it } = cxt; + if (Object.keys(propertyDeps).length === 0) + return; + const missing = gen.let("missing"); + for (const prop in propertyDeps) { + const deps = propertyDeps[prop]; + if (deps.length === 0) + continue; + const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties); + cxt.setParams({ + property: prop, + depsCount: deps.length, + deps: deps.join(", ") + }); + if (it.allErrors) { + gen.if(hasProperty, () => { + for (const depProp of deps) { + (0, code_1.checkReportMissingProp)(cxt, depProp); + } + }); + } else { + gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + } + exports.validatePropertyDeps = validatePropertyDeps; + function validateSchemaDeps(cxt, schemaDeps = cxt.schema) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + for (const prop in schemaDeps) { + if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop])) + continue; + gen.if( + (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), + () => { + const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid); + cxt.mergeValidEvaluated(schCxt, valid); + }, + () => gen.var(valid, true) + // TODO var + ); + cxt.ok(valid); + } + } + exports.validateSchemaDeps = validateSchemaDeps; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +var require_propertyNames = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error2 = { + message: "property name must be valid", + params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}` + }; + var def = { + keyword: "propertyNames", + type: "object", + schemaType: ["object", "boolean"], + error: error2, + code(cxt) { + const { gen, schema, data, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + const valid = gen.name("valid"); + gen.forIn("key", data, (key) => { + cxt.setParams({ propertyName: key }); + cxt.subschema({ + keyword: "propertyNames", + data: key, + dataTypes: ["string"], + propertyName: key, + compositeRule: true + }, valid); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(true); + if (!it.allErrors) + gen.break(); + }); + }); + cxt.ok(valid); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +var require_additionalProperties = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var util_1 = require_util(); + var error2 = { + message: "must NOT have additional properties", + params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}` + }; + var def = { + keyword: "additionalProperties", + type: ["object"], + schemaType: ["boolean", "object"], + allowUndefined: true, + trackErrors: true, + error: error2, + code(cxt) { + const { gen, schema, parentSchema, data, errsCount, it } = cxt; + if (!errsCount) + throw new Error("ajv implementation error"); + const { allErrors, opts } = it; + it.props = true; + if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema)) + return; + const props = (0, code_1.allSchemaProperties)(parentSchema.properties); + const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties); + checkAdditionalProperties(); + cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + function checkAdditionalProperties() { + gen.forIn("key", data, (key) => { + if (!props.length && !patProps.length) + additionalPropertyCode(key); + else + gen.if(isAdditional(key), () => additionalPropertyCode(key)); + }); + } + function isAdditional(key) { + let definedProp; + if (props.length > 8) { + const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties"); + definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key); + } else if (props.length) { + definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`)); + } else { + definedProp = codegen_1.nil; + } + if (patProps.length) { + definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`)); + } + return (0, codegen_1.not)(definedProp); + } + function deleteAdditional(key) { + gen.code((0, codegen_1._)`delete ${data}[${key}]`); + } + function additionalPropertyCode(key) { + if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) { + deleteAdditional(key); + return; + } + if (schema === false) { + cxt.setParams({ additionalProperty: key }); + cxt.error(); + if (!allErrors) + gen.break(); + return; + } + if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.name("valid"); + if (opts.removeAdditional === "failing") { + applyAdditionalSchema(key, valid, false); + gen.if((0, codegen_1.not)(valid), () => { + cxt.reset(); + deleteAdditional(key); + }); + } else { + applyAdditionalSchema(key, valid); + if (!allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + } + } + function applyAdditionalSchema(key, valid, errors) { + const subschema = { + keyword: "additionalProperties", + dataProp: key, + dataPropType: util_1.Type.Str + }; + if (errors === false) { + Object.assign(subschema, { + compositeRule: true, + createErrors: false, + allErrors: false + }); + } + cxt.subschema(subschema, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/properties.js +var require_properties = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var validate_1 = require_validate(); + var code_1 = require_code2(); + var util_1 = require_util(); + var additionalProperties_1 = require_additionalProperties(); + var def = { + keyword: "properties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) { + additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties")); + } + const allProps = (0, code_1.allSchemaProperties)(schema); + for (const prop of allProps) { + it.definedProperties.add(prop); + } + if (it.opts.unevaluated && allProps.length && it.props !== true) { + it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props); + } + const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p])); + if (properties.length === 0) + return; + const valid = gen.name("valid"); + for (const prop of properties) { + if (hasDefault(prop)) { + applyPropertySchema(prop); + } else { + gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties)); + applyPropertySchema(prop); + if (!it.allErrors) + gen.else().var(valid, true); + gen.endIf(); + } + cxt.it.definedProperties.add(prop); + cxt.ok(valid); + } + function hasDefault(prop) { + return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0; + } + function applyPropertySchema(prop) { + cxt.subschema({ + keyword: "properties", + schemaProp: prop, + dataProp: prop + }, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +var require_patternProperties = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var util_2 = require_util(); + var def = { + keyword: "patternProperties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, data, parentSchema, it } = cxt; + const { opts } = it; + const patterns = (0, code_1.allSchemaProperties)(schema); + const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); + if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) { + return; + } + const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; + const valid = gen.name("valid"); + if (it.props !== true && !(it.props instanceof codegen_1.Name)) { + it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); + } + const { props } = it; + validatePatternProperties(); + function validatePatternProperties() { + for (const pat of patterns) { + if (checkProperties) + checkMatchingProperties(pat); + if (it.allErrors) { + validateProperties(pat); + } else { + gen.var(valid, true); + validateProperties(pat); + gen.if(valid); + } + } + } + function checkMatchingProperties(pat) { + for (const prop in checkProperties) { + if (new RegExp(pat).test(prop)) { + (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); + } + } + } + function validateProperties(pat) { + gen.forIn("key", data, (key) => { + gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { + const alwaysValid = alwaysValidPatterns.includes(pat); + if (!alwaysValid) { + cxt.subschema({ + keyword: "patternProperties", + schemaProp: pat, + dataProp: key, + dataPropType: util_2.Type.Str + }, valid); + } + if (it.opts.unevaluated && props !== true) { + gen.assign((0, codegen_1._)`${props}[${key}]`, true); + } else if (!alwaysValid && !it.allErrors) { + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/not.js +var require_not = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util(); + var def = { + keyword: "not", + schemaType: ["object", "boolean"], + trackErrors: true, + code(cxt) { + const { gen, schema, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) { + cxt.fail(); + return; + } + const valid = gen.name("valid"); + cxt.subschema({ + keyword: "not", + compositeRule: true, + createErrors: false, + allErrors: false + }, valid); + cxt.failResult(valid, () => cxt.reset(), () => cxt.error()); + }, + error: { message: "must NOT be valid" } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/anyOf.js +var require_anyOf = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var def = { + keyword: "anyOf", + schemaType: "array", + trackErrors: true, + code: code_1.validateUnion, + error: { message: "must match a schema in anyOf" } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/oneOf.js +var require_oneOf = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error2 = { + message: "must match exactly one schema in oneOf", + params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}` + }; + var def = { + keyword: "oneOf", + schemaType: "array", + trackErrors: true, + error: error2, + code(cxt) { + const { gen, schema, parentSchema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + if (it.opts.discriminator && parentSchema.discriminator) + return; + const schArr = schema; + const valid = gen.let("valid", false); + const passing = gen.let("passing", null); + const schValid = gen.name("_valid"); + cxt.setParams({ passing }); + gen.block(validateOneOf); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + function validateOneOf() { + schArr.forEach((sch, i) => { + let schCxt; + if ((0, util_1.alwaysValidSchema)(it, sch)) { + gen.var(schValid, true); + } else { + schCxt = cxt.subschema({ + keyword: "oneOf", + schemaProp: i, + compositeRule: true + }, schValid); + } + if (i > 0) { + gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else(); + } + gen.if(schValid, () => { + gen.assign(valid, true); + gen.assign(passing, i); + if (schCxt) + cxt.mergeEvaluated(schCxt, codegen_1.Name); + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/allOf.js +var require_allOf = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util(); + var def = { + keyword: "allOf", + schemaType: "array", + code(cxt) { + const { gen, schema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const valid = gen.name("valid"); + schema.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); + cxt.ok(valid); + cxt.mergeEvaluated(schCxt); + }); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/if.js +var require_if = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error2 = { + message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, + params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` + }; + var def = { + keyword: "if", + schemaType: ["object", "boolean"], + trackErrors: true, + error: error2, + code(cxt) { + const { gen, parentSchema, it } = cxt; + if (parentSchema.then === void 0 && parentSchema.else === void 0) { + (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored'); + } + const hasThen = hasSchema(it, "then"); + const hasElse = hasSchema(it, "else"); + if (!hasThen && !hasElse) + return; + const valid = gen.let("valid", true); + const schValid = gen.name("_valid"); + validateIf(); + cxt.reset(); + if (hasThen && hasElse) { + const ifClause = gen.let("ifClause"); + cxt.setParams({ ifClause }); + gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); + } else if (hasThen) { + gen.if(schValid, validateClause("then")); + } else { + gen.if((0, codegen_1.not)(schValid), validateClause("else")); + } + cxt.pass(valid, () => cxt.error(true)); + function validateIf() { + const schCxt = cxt.subschema({ + keyword: "if", + compositeRule: true, + createErrors: false, + allErrors: false + }, schValid); + cxt.mergeEvaluated(schCxt); + } + function validateClause(keyword, ifClause) { + return () => { + const schCxt = cxt.subschema({ keyword }, schValid); + gen.assign(valid, schValid); + cxt.mergeValidEvaluated(schCxt, valid); + if (ifClause) + gen.assign(ifClause, (0, codegen_1._)`${keyword}`); + else + cxt.setParams({ ifClause: keyword }); + }; + } + } + }; + function hasSchema(it, keyword) { + const schema = it.schema[keyword]; + return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema); + } + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/thenElse.js +var require_thenElse = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util(); + var def = { + keyword: ["then", "else"], + schemaType: ["object", "boolean"], + code({ keyword, parentSchema, it }) { + if (parentSchema.if === void 0) + (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/index.js +var require_applicator = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var additionalItems_1 = require_additionalItems(); + var prefixItems_1 = require_prefixItems(); + var items_1 = require_items(); + var items2020_1 = require_items2020(); + var contains_1 = require_contains(); + var dependencies_1 = require_dependencies(); + var propertyNames_1 = require_propertyNames(); + var additionalProperties_1 = require_additionalProperties(); + var properties_1 = require_properties(); + var patternProperties_1 = require_patternProperties(); + var not_1 = require_not(); + var anyOf_1 = require_anyOf(); + var oneOf_1 = require_oneOf(); + var allOf_1 = require_allOf(); + var if_1 = require_if(); + var thenElse_1 = require_thenElse(); + function getApplicator(draft2020 = false) { + const applicator = [ + // any + not_1.default, + anyOf_1.default, + oneOf_1.default, + allOf_1.default, + if_1.default, + thenElse_1.default, + // object + propertyNames_1.default, + additionalProperties_1.default, + dependencies_1.default, + properties_1.default, + patternProperties_1.default + ]; + if (draft2020) + applicator.push(prefixItems_1.default, items2020_1.default); + else + applicator.push(additionalItems_1.default, items_1.default); + applicator.push(contains_1.default); + return applicator; + } + exports.default = getApplicator; + } +}); + +// node_modules/ajv/dist/vocabularies/format/format.js +var require_format = __commonJS({ + "node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var error2 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` + }; + var def = { + keyword: "format", + type: ["number", "string"], + schemaType: "string", + $data: true, + error: error2, + code(cxt, ruleType) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const { opts, errSchemaPath, schemaEnv, self } = it; + if (!opts.validateFormats) + return; + if ($data) + validate$DataFormat(); + else + validateFormat(); + function validate$DataFormat() { + const fmts = gen.scopeValue("formats", { + ref: self.formats, + code: opts.code.formats + }); + const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`); + const fType = gen.let("fType"); + const format = gen.let("format"); + gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef)); + cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt())); + function unknownFmt() { + if (opts.strictSchema === false) + return codegen_1.nil; + return (0, codegen_1._)`${schemaCode} && !${format}`; + } + function invalidFmt() { + const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`; + const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`; + return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`; + } + } + function validateFormat() { + const formatDef = self.formats[schema]; + if (!formatDef) { + unknownFormat(); + return; + } + if (formatDef === true) + return; + const [fmtType, format, fmtRef] = getFormat(formatDef); + if (fmtType === ruleType) + cxt.pass(validCondition()); + function unknownFormat() { + if (opts.strictSchema === false) { + self.logger.warn(unknownMsg()); + return; + } + throw new Error(unknownMsg()); + function unknownMsg() { + return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`; + } + } + function getFormat(fmtDef) { + const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0; + const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code }); + if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) { + return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`]; + } + return ["string", fmtDef, fmt]; + } + function validCondition() { + if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) { + if (!schemaEnv.$async) + throw new Error("async format in sync schema"); + return (0, codegen_1._)`await ${fmtRef}(${data})`; + } + return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/format/index.js +var require_format2 = __commonJS({ + "node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var format_1 = require_format(); + var format = [format_1.default]; + exports.default = format; + } +}); + +// node_modules/ajv/dist/vocabularies/metadata.js +var require_metadata = __commonJS({ + "node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.contentVocabulary = exports.metadataVocabulary = void 0; + exports.metadataVocabulary = [ + "title", + "description", + "default", + "deprecated", + "readOnly", + "writeOnly", + "examples" + ]; + exports.contentVocabulary = [ + "contentMediaType", + "contentEncoding", + "contentSchema" + ]; + } +}); + +// node_modules/ajv/dist/vocabularies/draft7.js +var require_draft7 = __commonJS({ + "node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var core_1 = require_core2(); + var validation_1 = require_validation(); + var applicator_1 = require_applicator(); + var format_1 = require_format2(); + var metadata_1 = require_metadata(); + var draft7Vocabularies = [ + core_1.default, + validation_1.default, + (0, applicator_1.default)(), + format_1.default, + metadata_1.metadataVocabulary, + metadata_1.contentVocabulary + ]; + exports.default = draft7Vocabularies; + } +}); + +// node_modules/ajv/dist/vocabularies/discriminator/types.js +var require_types = __commonJS({ + "node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.DiscrError = void 0; + var DiscrError; + (function(DiscrError2) { + DiscrError2["Tag"] = "tag"; + DiscrError2["Mapping"] = "mapping"; + })(DiscrError || (exports.DiscrError = DiscrError = {})); + } +}); + +// node_modules/ajv/dist/vocabularies/discriminator/index.js +var require_discriminator = __commonJS({ + "node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var types_1 = require_types(); + var compile_1 = require_compile(); + var ref_error_1 = require_ref_error(); + var util_1 = require_util(); + var error2 = { + message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, + params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` + }; + var def = { + keyword: "discriminator", + type: "object", + schemaType: "object", + error: error2, + code(cxt) { + const { gen, data, schema, parentSchema, it } = cxt; + const { oneOf } = parentSchema; + if (!it.opts.discriminator) { + throw new Error("discriminator: requires discriminator option"); + } + const tagName = schema.propertyName; + if (typeof tagName != "string") + throw new Error("discriminator: requires propertyName"); + if (schema.mapping) + throw new Error("discriminator: mapping is not supported"); + if (!oneOf) + throw new Error("discriminator: requires oneOf keyword"); + const valid = gen.let("valid", false); + const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`); + gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName })); + cxt.ok(valid); + function validateMapping() { + const mapping = getMapping(); + gen.if(false); + for (const tagValue in mapping) { + gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`); + gen.assign(valid, applyTagSchema(mapping[tagValue])); + } + gen.else(); + cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName }); + gen.endIf(); + } + function applyTagSchema(schemaProp) { + const _valid = gen.name("valid"); + const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid); + cxt.mergeEvaluated(schCxt, codegen_1.Name); + return _valid; + } + function getMapping() { + var _a; + const oneOfMapping = {}; + const topRequired = hasRequired(parentSchema); + let tagRequired = true; + for (let i = 0; i < oneOf.length; i++) { + let sch = oneOf[i]; + if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) { + const ref = sch.$ref; + sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref); + if (sch instanceof compile_1.SchemaEnv) + sch = sch.schema; + if (sch === void 0) + throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref); + } + const propSch = (_a = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a === void 0 ? void 0 : _a[tagName]; + if (typeof propSch != "object") { + throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`); + } + tagRequired = tagRequired && (topRequired || hasRequired(sch)); + addMappings(propSch, i); + } + if (!tagRequired) + throw new Error(`discriminator: "${tagName}" must be required`); + return oneOfMapping; + function hasRequired({ required: required2 }) { + return Array.isArray(required2) && required2.includes(tagName); + } + function addMappings(sch, i) { + if (sch.const) { + addMapping(sch.const, i); + } else if (sch.enum) { + for (const tagValue of sch.enum) { + addMapping(tagValue, i); + } + } else { + throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`); + } + } + function addMapping(tagValue, i) { + if (typeof tagValue != "string" || tagValue in oneOfMapping) { + throw new Error(`discriminator: "${tagName}" values must be unique strings`); + } + oneOfMapping[tagValue] = i; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/refs/json-schema-draft-07.json +var require_json_schema_draft_07 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + module.exports = { + $schema: "http://json-schema.org/draft-07/schema#", + $id: "http://json-schema.org/draft-07/schema#", + title: "Core schema meta-schema", + definitions: { + schemaArray: { + type: "array", + minItems: 1, + items: { $ref: "#" } + }, + nonNegativeInteger: { + type: "integer", + minimum: 0 + }, + nonNegativeIntegerDefault0: { + allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }] + }, + simpleTypes: { + enum: ["array", "boolean", "integer", "null", "number", "object", "string"] + }, + stringArray: { + type: "array", + items: { type: "string" }, + uniqueItems: true, + default: [] + } + }, + type: ["object", "boolean"], + properties: { + $id: { + type: "string", + format: "uri-reference" + }, + $schema: { + type: "string", + format: "uri" + }, + $ref: { + type: "string", + format: "uri-reference" + }, + $comment: { + type: "string" + }, + title: { + type: "string" + }, + description: { + type: "string" + }, + default: true, + readOnly: { + type: "boolean", + default: false + }, + examples: { + type: "array", + items: true + }, + multipleOf: { + type: "number", + exclusiveMinimum: 0 + }, + maximum: { + type: "number" + }, + exclusiveMaximum: { + type: "number" + }, + minimum: { + type: "number" + }, + exclusiveMinimum: { + type: "number" + }, + maxLength: { $ref: "#/definitions/nonNegativeInteger" }, + minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + pattern: { + type: "string", + format: "regex" + }, + additionalItems: { $ref: "#" }, + items: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }], + default: true + }, + maxItems: { $ref: "#/definitions/nonNegativeInteger" }, + minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + uniqueItems: { + type: "boolean", + default: false + }, + contains: { $ref: "#" }, + maxProperties: { $ref: "#/definitions/nonNegativeInteger" }, + minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + required: { $ref: "#/definitions/stringArray" }, + additionalProperties: { $ref: "#" }, + definitions: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + properties: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + patternProperties: { + type: "object", + additionalProperties: { $ref: "#" }, + propertyNames: { format: "regex" }, + default: {} + }, + dependencies: { + type: "object", + additionalProperties: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }] + } + }, + propertyNames: { $ref: "#" }, + const: true, + enum: { + type: "array", + items: true, + minItems: 1, + uniqueItems: true + }, + type: { + anyOf: [ + { $ref: "#/definitions/simpleTypes" }, + { + type: "array", + items: { $ref: "#/definitions/simpleTypes" }, + minItems: 1, + uniqueItems: true + } + ] + }, + format: { type: "string" }, + contentMediaType: { type: "string" }, + contentEncoding: { type: "string" }, + if: { $ref: "#" }, + then: { $ref: "#" }, + else: { $ref: "#" }, + allOf: { $ref: "#/definitions/schemaArray" }, + anyOf: { $ref: "#/definitions/schemaArray" }, + oneOf: { $ref: "#/definitions/schemaArray" }, + not: { $ref: "#" } + }, + default: true + }; + } +}); + +// node_modules/ajv/dist/ajv.js +var require_ajv = __commonJS({ + "node_modules/ajv/dist/ajv.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; + var core_1 = require_core(); + var draft7_1 = require_draft7(); + var discriminator_1 = require_discriminator(); + var draft7MetaSchema = require_json_schema_draft_07(); + var META_SUPPORT_DATA = ["/properties"]; + var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; + var Ajv2 = class extends core_1.default { + _addVocabularies() { + super._addVocabularies(); + draft7_1.default.forEach((v) => this.addVocabulary(v)); + if (this.opts.discriminator) + this.addKeyword(discriminator_1.default); + } + _addDefaultMetaSchema() { + super._addDefaultMetaSchema(); + if (!this.opts.meta) + return; + const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema; + this.addMetaSchema(metaSchema, META_SCHEMA_ID, false); + this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; + } + defaultMeta() { + return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); + } + }; + exports.Ajv = Ajv2; + module.exports = exports = Ajv2; + module.exports.Ajv = Ajv2; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = Ajv2; + var validate_1 = require_validate(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error(); + Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { + return validation_error_1.default; + } }); + var ref_error_1 = require_ref_error(); + Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { + return ref_error_1.default; + } }); + } +}); + +// node_modules/ajv-formats/dist/formats.js +var require_formats = __commonJS({ + "node_modules/ajv-formats/dist/formats.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; + function fmtDef(validate, compare) { + return { validate, compare }; + } + exports.fullFormats = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: fmtDef(date3, compareDate), + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: fmtDef(getTime(true), compareTime), + "date-time": fmtDef(getDateTime(true), compareDateTime), + "iso-time": fmtDef(getTime(), compareIsoTime), + "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), + // duration: https://tools.ietf.org/html/rfc3339#appendix-A + duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, + uri, + "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, + // uri-template: https://tools.ietf.org/html/rfc6570 + "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, + // For the source: https://gist.github.com/dperini/729294 + // For test cases: https://mathiasbynens.be/demo/url-regex + url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, + ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, + regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, + "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, + // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types + // byte: https://github.com/miguelmota/is-base64 + byte, + // signed 32 bit integer + int32: { type: "number", validate: validateInt32 }, + // signed 64 bit integer + int64: { type: "number", validate: validateInt64 }, + // C-type float + float: { type: "number", validate: validateNumber }, + // C-type double + double: { type: "number", validate: validateNumber }, + // hint to the UI to hide input strings + password: true, + // unchecked string payload + binary: true + }; + exports.fastFormats = { + ...exports.fullFormats, + date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), + time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), + "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), + "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), + "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i + }; + exports.formatNames = Object.keys(exports.fullFormats); + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; + var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function date3(str) { + const matches = DATE.exec(str); + if (!matches) + return false; + const year = +matches[1]; + const month = +matches[2]; + const day = +matches[3]; + return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]); + } + function compareDate(d1, d2) { + if (!(d1 && d2)) + return void 0; + if (d1 > d2) + return 1; + if (d1 < d2) + return -1; + return 0; + } + var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; + function getTime(strictTimeZone) { + return function time3(str) { + const matches = TIME.exec(str); + if (!matches) + return false; + const hr = +matches[1]; + const min = +matches[2]; + const sec = +matches[3]; + const tz = matches[4]; + const tzSign = matches[5] === "-" ? -1 : 1; + const tzH = +(matches[6] || 0); + const tzM = +(matches[7] || 0); + if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) + return false; + if (hr <= 23 && min <= 59 && sec < 60) + return true; + const utcMin = min - tzM * tzSign; + const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); + return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; + }; + } + function compareTime(s1, s2) { + if (!(s1 && s2)) + return void 0; + const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf(); + const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf(); + if (!(t1 && t2)) + return void 0; + return t1 - t2; + } + function compareIsoTime(t1, t2) { + if (!(t1 && t2)) + return void 0; + const a1 = TIME.exec(t1); + const a2 = TIME.exec(t2); + if (!(a1 && a2)) + return void 0; + t1 = a1[1] + a1[2] + a1[3]; + t2 = a2[1] + a2[2] + a2[3]; + if (t1 > t2) + return 1; + if (t1 < t2) + return -1; + return 0; + } + var DATE_TIME_SEPARATOR = /t|\s/i; + function getDateTime(strictTimeZone) { + const time3 = getTime(strictTimeZone); + return function date_time(str) { + const dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length === 2 && date3(dateTime[0]) && time3(dateTime[1]); + }; + } + function compareDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const d1 = new Date(dt1).valueOf(); + const d2 = new Date(dt2).valueOf(); + if (!(d1 && d2)) + return void 0; + return d1 - d2; + } + function compareIsoDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); + const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); + const res = compareDate(d1, d2); + if (res === void 0) + return void 0; + return res || compareTime(t1, t2); + } + var NOT_URI_FRAGMENT = /\/|:/; + var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; + function uri(str) { + return NOT_URI_FRAGMENT.test(str) && URI.test(str); + } + var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm; + function byte(str) { + BYTE.lastIndex = 0; + return BYTE.test(str); + } + var MIN_INT32 = -(2 ** 31); + var MAX_INT32 = 2 ** 31 - 1; + function validateInt32(value) { + return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; + } + function validateInt64(value) { + return Number.isInteger(value); + } + function validateNumber() { + return true; + } + var Z_ANCHOR = /[^\\]\\Z/; + function regex(str) { + if (Z_ANCHOR.test(str)) + return false; + try { + new RegExp(str); + return true; + } catch (e) { + return false; + } + } + } +}); + +// node_modules/ajv-formats/dist/limit.js +var require_limit = __commonJS({ + "node_modules/ajv-formats/dist/limit.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.formatLimitDefinition = void 0; + var ajv_1 = require_ajv(); + var codegen_1 = require_codegen(); + var ops = codegen_1.operators; + var KWDs = { + formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, + formatMinimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, + formatExclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, + formatExclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } + }; + var error2 = { + message: ({ keyword, schemaCode }) => (0, codegen_1.str)`should be ${KWDs[keyword].okStr} ${schemaCode}`, + params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` + }; + exports.formatLimitDefinition = { + keyword: Object.keys(KWDs), + type: "string", + schemaType: "string", + $data: true, + error: error2, + code(cxt) { + const { gen, data, schemaCode, keyword, it } = cxt; + const { opts, self } = it; + if (!opts.validateFormats) + return; + const fCxt = new ajv_1.KeywordCxt(it, self.RULES.all.format.definition, "format"); + if (fCxt.$data) + validate$DataFormat(); + else + validateFormat(); + function validate$DataFormat() { + const fmts = gen.scopeValue("formats", { + ref: self.formats, + code: opts.code.formats + }); + const fmt = gen.const("fmt", (0, codegen_1._)`${fmts}[${fCxt.schemaCode}]`); + cxt.fail$data((0, codegen_1.or)((0, codegen_1._)`typeof ${fmt} != "object"`, (0, codegen_1._)`${fmt} instanceof RegExp`, (0, codegen_1._)`typeof ${fmt}.compare != "function"`, compareCode(fmt))); + } + function validateFormat() { + const format = fCxt.schema; + const fmtDef = self.formats[format]; + if (!fmtDef || fmtDef === true) + return; + if (typeof fmtDef != "object" || fmtDef instanceof RegExp || typeof fmtDef.compare != "function") { + throw new Error(`"${keyword}": format "${format}" does not define "compare" function`); + } + const fmt = gen.scopeValue("formats", { + key: format, + ref: fmtDef, + code: opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(format)}` : void 0 + }); + cxt.fail$data(compareCode(fmt)); + } + function compareCode(fmt) { + return (0, codegen_1._)`${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword].fail} 0`; + } + }, + dependencies: ["format"] + }; + var formatLimitPlugin = (ajv) => { + ajv.addKeyword(exports.formatLimitDefinition); + return ajv; + }; + exports.default = formatLimitPlugin; + } +}); + +// node_modules/ajv-formats/dist/index.js +var require_dist = __commonJS({ + "node_modules/ajv-formats/dist/index.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var formats_1 = require_formats(); + var limit_1 = require_limit(); + var codegen_1 = require_codegen(); + var fullName = new codegen_1.Name("fullFormats"); + var fastName = new codegen_1.Name("fastFormats"); + var formatsPlugin = (ajv, opts = { keywords: true }) => { + if (Array.isArray(opts)) { + addFormats(ajv, opts, formats_1.fullFormats, fullName); + return ajv; + } + const [formats, exportName] = opts.mode === "fast" ? [formats_1.fastFormats, fastName] : [formats_1.fullFormats, fullName]; + const list = opts.formats || formats_1.formatNames; + addFormats(ajv, list, formats, exportName); + if (opts.keywords) + (0, limit_1.default)(ajv); + return ajv; + }; + formatsPlugin.get = (name, mode = "full") => { + const formats = mode === "fast" ? formats_1.fastFormats : formats_1.fullFormats; + const f = formats[name]; + if (!f) + throw new Error(`Unknown format "${name}"`); + return f; + }; + function addFormats(ajv, list, fs22, exportName) { + var _a; + var _b; + (_a = (_b = ajv.opts.code).formats) !== null && _a !== void 0 ? _a : _b.formats = (0, codegen_1._)`require("ajv-formats/dist/formats").${exportName}`; + for (const f of list) + ajv.addFormat(f, fs22[f]); + } + module.exports = exports = formatsPlugin; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = formatsPlugin; + } +}); + +// src/daemon.ts +import fs21 from "node:fs"; +import path20 from "node:path"; +import { fileURLToPath as fileURLToPath3 } from "node:url"; + +// node_modules/zod/v3/external.js +var external_exports = {}; +__export(external_exports, { + BRAND: () => BRAND, + DIRTY: () => DIRTY, + EMPTY_PATH: () => EMPTY_PATH, + INVALID: () => INVALID, + NEVER: () => NEVER, + OK: () => OK, + ParseStatus: () => ParseStatus, + Schema: () => ZodType, + ZodAny: () => ZodAny, + ZodArray: () => ZodArray, + ZodBigInt: () => ZodBigInt, + ZodBoolean: () => ZodBoolean, + ZodBranded: () => ZodBranded, + ZodCatch: () => ZodCatch, + ZodDate: () => ZodDate, + ZodDefault: () => ZodDefault, + ZodDiscriminatedUnion: () => ZodDiscriminatedUnion, + ZodEffects: () => ZodEffects, + ZodEnum: () => ZodEnum, + ZodError: () => ZodError, + ZodFirstPartyTypeKind: () => ZodFirstPartyTypeKind, + ZodFunction: () => ZodFunction, + ZodIntersection: () => ZodIntersection, + ZodIssueCode: () => ZodIssueCode, + ZodLazy: () => ZodLazy, + ZodLiteral: () => ZodLiteral, + ZodMap: () => ZodMap, + ZodNaN: () => ZodNaN, + ZodNativeEnum: () => ZodNativeEnum, + ZodNever: () => ZodNever, + ZodNull: () => ZodNull, + ZodNullable: () => ZodNullable, + ZodNumber: () => ZodNumber, + ZodObject: () => ZodObject, + ZodOptional: () => ZodOptional, + ZodParsedType: () => ZodParsedType, + ZodPipeline: () => ZodPipeline, + ZodPromise: () => ZodPromise, + ZodReadonly: () => ZodReadonly, + ZodRecord: () => ZodRecord, + ZodSchema: () => ZodType, + ZodSet: () => ZodSet, + ZodString: () => ZodString, + ZodSymbol: () => ZodSymbol, + ZodTransformer: () => ZodEffects, + ZodTuple: () => ZodTuple, + ZodType: () => ZodType, + ZodUndefined: () => ZodUndefined, + ZodUnion: () => ZodUnion, + ZodUnknown: () => ZodUnknown, + ZodVoid: () => ZodVoid, + addIssueToContext: () => addIssueToContext, + any: () => anyType, + array: () => arrayType, + bigint: () => bigIntType, + boolean: () => booleanType, + coerce: () => coerce, + custom: () => custom, + date: () => dateType, + datetimeRegex: () => datetimeRegex, + defaultErrorMap: () => en_default, + discriminatedUnion: () => discriminatedUnionType, + effect: () => effectsType, + enum: () => enumType, + function: () => functionType, + getErrorMap: () => getErrorMap, + getParsedType: () => getParsedType, + instanceof: () => instanceOfType, + intersection: () => intersectionType, + isAborted: () => isAborted, + isAsync: () => isAsync, + isDirty: () => isDirty, + isValid: () => isValid, + late: () => late, + lazy: () => lazyType, + literal: () => literalType, + makeIssue: () => makeIssue, + map: () => mapType, + nan: () => nanType, + nativeEnum: () => nativeEnumType, + never: () => neverType, + null: () => nullType, + nullable: () => nullableType, + number: () => numberType, + object: () => objectType, + objectUtil: () => objectUtil, + oboolean: () => oboolean, + onumber: () => onumber, + optional: () => optionalType, + ostring: () => ostring, + pipeline: () => pipelineType, + preprocess: () => preprocessType, + promise: () => promiseType, + quotelessJson: () => quotelessJson, + record: () => recordType, + set: () => setType, + setErrorMap: () => setErrorMap, + strictObject: () => strictObjectType, + string: () => stringType, + symbol: () => symbolType, + transformer: () => effectsType, + tuple: () => tupleType, + undefined: () => undefinedType, + union: () => unionType, + unknown: () => unknownType, + util: () => util, + void: () => voidType +}); + +// node_modules/zod/v3/helpers/util.js +var util; +(function(util2) { + util2.assertEqual = (_) => { + }; + function assertIs2(_arg) { + } + util2.assertIs = assertIs2; + function assertNever2(_x) { + throw new Error(); + } + util2.assertNever = assertNever2; + util2.arrayToEnum = (items) => { + const obj = {}; + for (const item of items) { + obj[item] = item; + } + return obj; + }; + util2.getValidEnumValues = (obj) => { + const validKeys = util2.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); + const filtered = {}; + for (const k of validKeys) { + filtered[k] = obj[k]; + } + return util2.objectValues(filtered); + }; + util2.objectValues = (obj) => { + return util2.objectKeys(obj).map(function(e) { + return obj[e]; + }); + }; + util2.objectKeys = typeof Object.keys === "function" ? (obj) => Object.keys(obj) : (object3) => { + const keys = []; + for (const key in object3) { + if (Object.prototype.hasOwnProperty.call(object3, key)) { + keys.push(key); + } + } + return keys; + }; + util2.find = (arr, checker) => { + for (const item of arr) { + if (checker(item)) + return item; + } + return void 0; + }; + util2.isInteger = typeof Number.isInteger === "function" ? (val) => Number.isInteger(val) : (val) => typeof val === "number" && Number.isFinite(val) && Math.floor(val) === val; + function joinValues2(array2, separator = " | ") { + return array2.map((val) => typeof val === "string" ? `'${val}'` : val).join(separator); + } + util2.joinValues = joinValues2; + util2.jsonStringifyReplacer = (_, value) => { + if (typeof value === "bigint") { + return value.toString(); + } + return value; + }; +})(util || (util = {})); +var objectUtil; +(function(objectUtil2) { + objectUtil2.mergeShapes = (first, second) => { + return { + ...first, + ...second + // second overwrites first + }; + }; +})(objectUtil || (objectUtil = {})); +var ZodParsedType = util.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set" +]); +var getParsedType = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return ZodParsedType.undefined; + case "string": + return ZodParsedType.string; + case "number": + return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; + case "boolean": + return ZodParsedType.boolean; + case "function": + return ZodParsedType.function; + case "bigint": + return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; + case "object": + if (Array.isArray(data)) { + return ZodParsedType.array; + } + if (data === null) { + return ZodParsedType.null; + } + if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") { + return ZodParsedType.promise; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return ZodParsedType.map; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return ZodParsedType.set; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return ZodParsedType.date; + } + return ZodParsedType.object; + default: + return ZodParsedType.unknown; + } +}; + +// node_modules/zod/v3/ZodError.js +var ZodIssueCode = util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite" +]); +var quotelessJson = (obj) => { + const json = JSON.stringify(obj, null, 2); + return json.replace(/"([^"]+)":/g, "$1:"); +}; +var ZodError = class _ZodError extends Error { + get errors() { + return this.issues; + } + constructor(issues) { + super(); + this.issues = []; + this.addIssue = (sub) => { + this.issues = [...this.issues, sub]; + }; + this.addIssues = (subs = []) => { + this.issues = [...this.issues, ...subs]; + }; + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, actualProto); + } else { + this.__proto__ = actualProto; + } + this.name = "ZodError"; + this.issues = issues; + } + format(_mapper) { + const mapper = _mapper || function(issue2) { + return issue2.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error2) => { + for (const issue2 of error2.issues) { + if (issue2.code === "invalid_union") { + issue2.unionErrors.map(processError); + } else if (issue2.code === "invalid_return_type") { + processError(issue2.returnTypeError); + } else if (issue2.code === "invalid_arguments") { + processError(issue2.argumentsError); + } else if (issue2.path.length === 0) { + fieldErrors._errors.push(mapper(issue2)); + } else { + let curr = fieldErrors; + let i = 0; + while (i < issue2.path.length) { + const el = issue2.path[i]; + const terminal = i === issue2.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + } else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue2)); + } + curr = curr[el]; + i++; + } + } + } + }; + processError(this); + return fieldErrors; + } + static assert(value) { + if (!(value instanceof _ZodError)) { + throw new Error(`Not a ZodError: ${value}`); + } + } + toString() { + return this.message; + } + get message() { + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(mapper = (issue2) => issue2.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of this.issues) { + if (sub.path.length > 0) { + const firstEl = sub.path[0]; + fieldErrors[firstEl] = fieldErrors[firstEl] || []; + fieldErrors[firstEl].push(mapper(sub)); + } else { + formErrors.push(mapper(sub)); + } + } + return { formErrors, fieldErrors }; + } + get formErrors() { + return this.flatten(); + } +}; +ZodError.create = (issues) => { + const error2 = new ZodError(issues); + return error2; +}; + +// node_modules/zod/v3/locales/en.js +var errorMap = (issue2, _ctx) => { + let message; + switch (issue2.code) { + case ZodIssueCode.invalid_type: + if (issue2.received === ZodParsedType.undefined) { + message = "Required"; + } else { + message = `Expected ${issue2.expected}, received ${issue2.received}`; + } + break; + case ZodIssueCode.invalid_literal: + message = `Invalid literal value, expected ${JSON.stringify(issue2.expected, util.jsonStringifyReplacer)}`; + break; + case ZodIssueCode.unrecognized_keys: + message = `Unrecognized key(s) in object: ${util.joinValues(issue2.keys, ", ")}`; + break; + case ZodIssueCode.invalid_union: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_union_discriminator: + message = `Invalid discriminator value. Expected ${util.joinValues(issue2.options)}`; + break; + case ZodIssueCode.invalid_enum_value: + message = `Invalid enum value. Expected ${util.joinValues(issue2.options)}, received '${issue2.received}'`; + break; + case ZodIssueCode.invalid_arguments: + message = `Invalid function arguments`; + break; + case ZodIssueCode.invalid_return_type: + message = `Invalid function return type`; + break; + case ZodIssueCode.invalid_date: + message = `Invalid date`; + break; + case ZodIssueCode.invalid_string: + if (typeof issue2.validation === "object") { + if ("includes" in issue2.validation) { + message = `Invalid input: must include "${issue2.validation.includes}"`; + if (typeof issue2.validation.position === "number") { + message = `${message} at one or more positions greater than or equal to ${issue2.validation.position}`; + } + } else if ("startsWith" in issue2.validation) { + message = `Invalid input: must start with "${issue2.validation.startsWith}"`; + } else if ("endsWith" in issue2.validation) { + message = `Invalid input: must end with "${issue2.validation.endsWith}"`; + } else { + util.assertNever(issue2.validation); + } + } else if (issue2.validation !== "regex") { + message = `Invalid ${issue2.validation}`; + } else { + message = "Invalid"; + } + break; + case ZodIssueCode.too_small: + if (issue2.type === "array") + message = `Array must contain ${issue2.exact ? "exactly" : issue2.inclusive ? `at least` : `more than`} ${issue2.minimum} element(s)`; + else if (issue2.type === "string") + message = `String must contain ${issue2.exact ? "exactly" : issue2.inclusive ? `at least` : `over`} ${issue2.minimum} character(s)`; + else if (issue2.type === "number") + message = `Number must be ${issue2.exact ? `exactly equal to ` : issue2.inclusive ? `greater than or equal to ` : `greater than `}${issue2.minimum}`; + else if (issue2.type === "bigint") + message = `Number must be ${issue2.exact ? `exactly equal to ` : issue2.inclusive ? `greater than or equal to ` : `greater than `}${issue2.minimum}`; + else if (issue2.type === "date") + message = `Date must be ${issue2.exact ? `exactly equal to ` : issue2.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue2.minimum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.too_big: + if (issue2.type === "array") + message = `Array must contain ${issue2.exact ? `exactly` : issue2.inclusive ? `at most` : `less than`} ${issue2.maximum} element(s)`; + else if (issue2.type === "string") + message = `String must contain ${issue2.exact ? `exactly` : issue2.inclusive ? `at most` : `under`} ${issue2.maximum} character(s)`; + else if (issue2.type === "number") + message = `Number must be ${issue2.exact ? `exactly` : issue2.inclusive ? `less than or equal to` : `less than`} ${issue2.maximum}`; + else if (issue2.type === "bigint") + message = `BigInt must be ${issue2.exact ? `exactly` : issue2.inclusive ? `less than or equal to` : `less than`} ${issue2.maximum}`; + else if (issue2.type === "date") + message = `Date must be ${issue2.exact ? `exactly` : issue2.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue2.maximum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.custom: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_intersection_types: + message = `Intersection results could not be merged`; + break; + case ZodIssueCode.not_multiple_of: + message = `Number must be a multiple of ${issue2.multipleOf}`; + break; + case ZodIssueCode.not_finite: + message = "Number must be finite"; + break; + default: + message = _ctx.defaultError; + util.assertNever(issue2); + } + return { message }; +}; +var en_default = errorMap; + +// node_modules/zod/v3/errors.js +var overrideErrorMap = en_default; +function setErrorMap(map) { + overrideErrorMap = map; +} +function getErrorMap() { + return overrideErrorMap; +} + +// node_modules/zod/v3/helpers/parseUtil.js +var makeIssue = (params) => { + const { data, path: path21, errorMaps, issueData } = params; + const fullPath = [...path21, ...issueData.path || []]; + const fullIssue = { + ...issueData, + path: fullPath + }; + if (issueData.message !== void 0) { + return { + ...issueData, + path: fullPath, + message: issueData.message + }; + } + let errorMessage2 = ""; + const maps = errorMaps.filter((m) => !!m).slice().reverse(); + for (const map of maps) { + errorMessage2 = map(fullIssue, { data, defaultError: errorMessage2 }).message; + } + return { + ...issueData, + path: fullPath, + message: errorMessage2 + }; +}; +var EMPTY_PATH = []; +function addIssueToContext(ctx, issueData) { + const overrideMap = getErrorMap(); + const issue2 = makeIssue({ + issueData, + data: ctx.data, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + // contextual error map is first priority + ctx.schemaErrorMap, + // then schema-bound map if available + overrideMap, + // then global override map + overrideMap === en_default ? void 0 : en_default + // then global default map + ].filter((x) => !!x) + }); + ctx.common.issues.push(issue2); +} +var ParseStatus = class _ParseStatus { + constructor() { + this.value = "valid"; + } + dirty() { + if (this.value === "valid") + this.value = "dirty"; + } + abort() { + if (this.value !== "aborted") + this.value = "aborted"; + } + static mergeArray(status, results) { + const arrayValue = []; + for (const s of results) { + if (s.status === "aborted") + return INVALID; + if (s.status === "dirty") + status.dirty(); + arrayValue.push(s.value); + } + return { status: status.value, value: arrayValue }; + } + static async mergeObjectAsync(status, pairs) { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value + }); + } + return _ParseStatus.mergeObjectSync(status, syncPairs); + } + static mergeObjectSync(status, pairs) { + const finalObject = {}; + for (const pair of pairs) { + const { key, value } = pair; + if (key.status === "aborted") + return INVALID; + if (value.status === "aborted") + return INVALID; + if (key.status === "dirty") + status.dirty(); + if (value.status === "dirty") + status.dirty(); + if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) { + finalObject[key.value] = value.value; + } + } + return { status: status.value, value: finalObject }; + } +}; +var INVALID = Object.freeze({ + status: "aborted" +}); +var DIRTY = (value) => ({ status: "dirty", value }); +var OK = (value) => ({ status: "valid", value }); +var isAborted = (x) => x.status === "aborted"; +var isDirty = (x) => x.status === "dirty"; +var isValid = (x) => x.status === "valid"; +var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; + +// node_modules/zod/v3/helpers/errorUtil.js +var errorUtil; +(function(errorUtil2) { + errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {}; + errorUtil2.toString = (message) => typeof message === "string" ? message : message?.message; +})(errorUtil || (errorUtil = {})); + +// node_modules/zod/v3/types.js +var ParseInputLazyPath = class { + constructor(parent, value, path21, key) { + this._cachedPath = []; + this.parent = parent; + this.data = value; + this._path = path21; + this._key = key; + } + get path() { + if (!this._cachedPath.length) { + if (Array.isArray(this._key)) { + this._cachedPath.push(...this._path, ...this._key); + } else { + this._cachedPath.push(...this._path, this._key); + } + } + return this._cachedPath; + } +}; +var handleResult = (ctx, result) => { + if (isValid(result)) { + return { success: true, data: result.value }; + } else { + if (!ctx.common.issues.length) { + throw new Error("Validation failed but no issues detected."); + } + return { + success: false, + get error() { + if (this._error) + return this._error; + const error2 = new ZodError(ctx.common.issues); + this._error = error2; + return this._error; + } + }; + } +}; +function processCreateParams(params) { + if (!params) + return {}; + const { errorMap: errorMap2, invalid_type_error, required_error, description } = params; + if (errorMap2 && (invalid_type_error || required_error)) { + throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); + } + if (errorMap2) + return { errorMap: errorMap2, description }; + const customMap = (iss, ctx) => { + const { message } = params; + if (iss.code === "invalid_enum_value") { + return { message: message ?? ctx.defaultError }; + } + if (typeof ctx.data === "undefined") { + return { message: message ?? required_error ?? ctx.defaultError }; + } + if (iss.code !== "invalid_type") + return { message: ctx.defaultError }; + return { message: message ?? invalid_type_error ?? ctx.defaultError }; + }; + return { errorMap: customMap, description }; +} +var ZodType = class { + get description() { + return this._def.description; + } + _getType(input) { + return getParsedType(input.data); + } + _getOrReturnCtx(input, ctx) { + return ctx || { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent + }; + } + _processInputParams(input) { + return { + status: new ParseStatus(), + ctx: { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent + } + }; + } + _parseSync(input) { + const result = this._parse(input); + if (isAsync(result)) { + throw new Error("Synchronous parse encountered promise."); + } + return result; + } + _parseAsync(input) { + const result = this._parse(input); + return Promise.resolve(result); + } + parse(data, params) { + const result = this.safeParse(data, params); + if (result.success) + return result.data; + throw result.error; + } + safeParse(data, params) { + const ctx = { + common: { + issues: [], + async: params?.async ?? false, + contextualErrorMap: params?.errorMap + }, + path: params?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const result = this._parseSync({ data, path: ctx.path, parent: ctx }); + return handleResult(ctx, result); + } + "~validate"(data) { + const ctx = { + common: { + issues: [], + async: !!this["~standard"].async + }, + path: [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + if (!this["~standard"].async) { + try { + const result = this._parseSync({ data, path: [], parent: ctx }); + return isValid(result) ? { + value: result.value + } : { + issues: ctx.common.issues + }; + } catch (err) { + if (err?.message?.toLowerCase()?.includes("encountered")) { + this["~standard"].async = true; + } + ctx.common = { + issues: [], + async: true + }; + } + } + return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result) ? { + value: result.value + } : { + issues: ctx.common.issues + }); + } + async parseAsync(data, params) { + const result = await this.safeParseAsync(data, params); + if (result.success) + return result.data; + throw result.error; + } + async safeParseAsync(data, params) { + const ctx = { + common: { + issues: [], + contextualErrorMap: params?.errorMap, + async: true + }, + path: params?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); + const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult)); + return handleResult(ctx, result); + } + refine(check2, message) { + const getIssueProperties = (val) => { + if (typeof message === "string" || typeof message === "undefined") { + return { message }; + } else if (typeof message === "function") { + return message(val); + } else { + return message; + } + }; + return this._refinement((val, ctx) => { + const result = check2(val); + const setError = () => ctx.addIssue({ + code: ZodIssueCode.custom, + ...getIssueProperties(val) + }); + if (typeof Promise !== "undefined" && result instanceof Promise) { + return result.then((data) => { + if (!data) { + setError(); + return false; + } else { + return true; + } + }); + } + if (!result) { + setError(); + return false; + } else { + return true; + } + }); + } + refinement(check2, refinementData) { + return this._refinement((val, ctx) => { + if (!check2(val)) { + ctx.addIssue(typeof refinementData === "function" ? refinementData(val, ctx) : refinementData); + return false; + } else { + return true; + } + }); + } + _refinement(refinement) { + return new ZodEffects({ + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "refinement", refinement } + }); + } + superRefine(refinement) { + return this._refinement(refinement); + } + constructor(def) { + this.spa = this.safeParseAsync; + this._def = def; + this.parse = this.parse.bind(this); + this.safeParse = this.safeParse.bind(this); + this.parseAsync = this.parseAsync.bind(this); + this.safeParseAsync = this.safeParseAsync.bind(this); + this.spa = this.spa.bind(this); + this.refine = this.refine.bind(this); + this.refinement = this.refinement.bind(this); + this.superRefine = this.superRefine.bind(this); + this.optional = this.optional.bind(this); + this.nullable = this.nullable.bind(this); + this.nullish = this.nullish.bind(this); + this.array = this.array.bind(this); + this.promise = this.promise.bind(this); + this.or = this.or.bind(this); + this.and = this.and.bind(this); + this.transform = this.transform.bind(this); + this.brand = this.brand.bind(this); + this.default = this.default.bind(this); + this.catch = this.catch.bind(this); + this.describe = this.describe.bind(this); + this.pipe = this.pipe.bind(this); + this.readonly = this.readonly.bind(this); + this.isNullable = this.isNullable.bind(this); + this.isOptional = this.isOptional.bind(this); + this["~standard"] = { + version: 1, + vendor: "zod", + validate: (data) => this["~validate"](data) + }; + } + optional() { + return ZodOptional.create(this, this._def); + } + nullable() { + return ZodNullable.create(this, this._def); + } + nullish() { + return this.nullable().optional(); + } + array() { + return ZodArray.create(this); + } + promise() { + return ZodPromise.create(this, this._def); + } + or(option) { + return ZodUnion.create([this, option], this._def); + } + and(incoming) { + return ZodIntersection.create(this, incoming, this._def); + } + transform(transform2) { + return new ZodEffects({ + ...processCreateParams(this._def), + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "transform", transform: transform2 } + }); + } + default(def) { + const defaultValueFunc = typeof def === "function" ? def : () => def; + return new ZodDefault({ + ...processCreateParams(this._def), + innerType: this, + defaultValue: defaultValueFunc, + typeName: ZodFirstPartyTypeKind.ZodDefault + }); + } + brand() { + return new ZodBranded({ + typeName: ZodFirstPartyTypeKind.ZodBranded, + type: this, + ...processCreateParams(this._def) + }); + } + catch(def) { + const catchValueFunc = typeof def === "function" ? def : () => def; + return new ZodCatch({ + ...processCreateParams(this._def), + innerType: this, + catchValue: catchValueFunc, + typeName: ZodFirstPartyTypeKind.ZodCatch + }); + } + describe(description) { + const This = this.constructor; + return new This({ + ...this._def, + description + }); + } + pipe(target) { + return ZodPipeline.create(this, target); + } + readonly() { + return ZodReadonly.create(this); + } + isOptional() { + return this.safeParse(void 0).success; + } + isNullable() { + return this.safeParse(null).success; + } +}; +var cuidRegex = /^c[^\s-]{8,}$/i; +var cuid2Regex = /^[0-9a-z]+$/; +var ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i; +var uuidRegex = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i; +var nanoidRegex = /^[a-z0-9_-]{21}$/i; +var jwtRegex = /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/; +var durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/; +var emailRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i; +var _emojiRegex = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; +var emojiRegex; +var ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; +var ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/; +var ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; +var ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; +var base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; +var base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/; +var dateRegexSource = `((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))`; +var dateRegex = new RegExp(`^${dateRegexSource}$`); +function timeRegexSource(args) { + let secondsRegexSource = `[0-5]\\d`; + if (args.precision) { + secondsRegexSource = `${secondsRegexSource}\\.\\d{${args.precision}}`; + } else if (args.precision == null) { + secondsRegexSource = `${secondsRegexSource}(\\.\\d+)?`; + } + const secondsQuantifier = args.precision ? "+" : "?"; + return `([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`; +} +function timeRegex(args) { + return new RegExp(`^${timeRegexSource(args)}$`); +} +function datetimeRegex(args) { + let regex = `${dateRegexSource}T${timeRegexSource(args)}`; + const opts = []; + opts.push(args.local ? `Z?` : `Z`); + if (args.offset) + opts.push(`([+-]\\d{2}:?\\d{2})`); + regex = `${regex}(${opts.join("|")})`; + return new RegExp(`^${regex}$`); +} +function isValidIP(ip, version2) { + if ((version2 === "v4" || !version2) && ipv4Regex.test(ip)) { + return true; + } + if ((version2 === "v6" || !version2) && ipv6Regex.test(ip)) { + return true; + } + return false; +} +function isValidJWT(jwt, alg) { + if (!jwtRegex.test(jwt)) + return false; + try { + const [header] = jwt.split("."); + if (!header) + return false; + const base642 = header.replace(/-/g, "+").replace(/_/g, "/").padEnd(header.length + (4 - header.length % 4) % 4, "="); + const decoded = JSON.parse(atob(base642)); + if (typeof decoded !== "object" || decoded === null) + return false; + if ("typ" in decoded && decoded?.typ !== "JWT") + return false; + if (!decoded.alg) + return false; + if (alg && decoded.alg !== alg) + return false; + return true; + } catch { + return false; + } +} +function isValidCidr(ip, version2) { + if ((version2 === "v4" || !version2) && ipv4CidrRegex.test(ip)) { + return true; + } + if ((version2 === "v6" || !version2) && ipv6CidrRegex.test(ip)) { + return true; + } + return false; +} +var ZodString = class _ZodString2 extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = String(input.data); + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.string) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.string, + received: ctx2.parsedType + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check2 of this._def.checks) { + if (check2.kind === "min") { + if (input.data.length < check2.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check2.value, + type: "string", + inclusive: true, + exact: false, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "max") { + if (input.data.length > check2.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check2.value, + type: "string", + inclusive: true, + exact: false, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "length") { + const tooBig = input.data.length > check2.value; + const tooSmall = input.data.length < check2.value; + if (tooBig || tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + if (tooBig) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check2.value, + type: "string", + inclusive: true, + exact: true, + message: check2.message + }); + } else if (tooSmall) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check2.value, + type: "string", + inclusive: true, + exact: true, + message: check2.message + }); + } + status.dirty(); + } + } else if (check2.kind === "email") { + if (!emailRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "email", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "emoji") { + if (!emojiRegex) { + emojiRegex = new RegExp(_emojiRegex, "u"); + } + if (!emojiRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "emoji", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "uuid") { + if (!uuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "uuid", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "nanoid") { + if (!nanoidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "nanoid", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "cuid") { + if (!cuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "cuid2") { + if (!cuid2Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid2", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "ulid") { + if (!ulidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ulid", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "url") { + try { + new URL(input.data); + } catch { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "url", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "regex") { + check2.regex.lastIndex = 0; + const testResult = check2.regex.test(input.data); + if (!testResult) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "regex", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "trim") { + input.data = input.data.trim(); + } else if (check2.kind === "includes") { + if (!input.data.includes(check2.value, check2.position)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { includes: check2.value, position: check2.position }, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "toLowerCase") { + input.data = input.data.toLowerCase(); + } else if (check2.kind === "toUpperCase") { + input.data = input.data.toUpperCase(); + } else if (check2.kind === "startsWith") { + if (!input.data.startsWith(check2.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { startsWith: check2.value }, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "endsWith") { + if (!input.data.endsWith(check2.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { endsWith: check2.value }, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "datetime") { + const regex = datetimeRegex(check2); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "datetime", + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "date") { + const regex = dateRegex; + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "date", + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "time") { + const regex = timeRegex(check2); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "time", + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "duration") { + if (!durationRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "duration", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "ip") { + if (!isValidIP(input.data, check2.version)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ip", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "jwt") { + if (!isValidJWT(input.data, check2.alg)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "jwt", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "cidr") { + if (!isValidCidr(input.data, check2.version)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cidr", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "base64") { + if (!base64Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "base64", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "base64url") { + if (!base64urlRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "base64url", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else { + util.assertNever(check2); + } + } + return { status: status.value, value: input.data }; + } + _regex(regex, validation, message) { + return this.refinement((data) => regex.test(data), { + validation, + code: ZodIssueCode.invalid_string, + ...errorUtil.errToObj(message) + }); + } + _addCheck(check2) { + return new _ZodString2({ + ...this._def, + checks: [...this._def.checks, check2] + }); + } + email(message) { + return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); + } + url(message) { + return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); + } + emoji(message) { + return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); + } + uuid(message) { + return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); + } + nanoid(message) { + return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) }); + } + cuid(message) { + return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); + } + cuid2(message) { + return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); + } + ulid(message) { + return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); + } + base64(message) { + return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) }); + } + base64url(message) { + return this._addCheck({ + kind: "base64url", + ...errorUtil.errToObj(message) + }); + } + jwt(options) { + return this._addCheck({ kind: "jwt", ...errorUtil.errToObj(options) }); + } + ip(options) { + return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); + } + cidr(options) { + return this._addCheck({ kind: "cidr", ...errorUtil.errToObj(options) }); + } + datetime(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "datetime", + precision: null, + offset: false, + local: false, + message: options + }); + } + return this._addCheck({ + kind: "datetime", + precision: typeof options?.precision === "undefined" ? null : options?.precision, + offset: options?.offset ?? false, + local: options?.local ?? false, + ...errorUtil.errToObj(options?.message) + }); + } + date(message) { + return this._addCheck({ kind: "date", message }); + } + time(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "time", + precision: null, + message: options + }); + } + return this._addCheck({ + kind: "time", + precision: typeof options?.precision === "undefined" ? null : options?.precision, + ...errorUtil.errToObj(options?.message) + }); + } + duration(message) { + return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); + } + regex(regex, message) { + return this._addCheck({ + kind: "regex", + regex, + ...errorUtil.errToObj(message) + }); + } + includes(value, options) { + return this._addCheck({ + kind: "includes", + value, + position: options?.position, + ...errorUtil.errToObj(options?.message) + }); + } + startsWith(value, message) { + return this._addCheck({ + kind: "startsWith", + value, + ...errorUtil.errToObj(message) + }); + } + endsWith(value, message) { + return this._addCheck({ + kind: "endsWith", + value, + ...errorUtil.errToObj(message) + }); + } + min(minLength, message) { + return this._addCheck({ + kind: "min", + value: minLength, + ...errorUtil.errToObj(message) + }); + } + max(maxLength, message) { + return this._addCheck({ + kind: "max", + value: maxLength, + ...errorUtil.errToObj(message) + }); + } + length(len, message) { + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message) + }); + } + /** + * Equivalent to `.min(1)` + */ + nonempty(message) { + return this.min(1, errorUtil.errToObj(message)); + } + trim() { + return new _ZodString2({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }] + }); + } + toLowerCase() { + return new _ZodString2({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }] + }); + } + toUpperCase() { + return new _ZodString2({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }] + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((ch) => ch.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((ch) => ch.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((ch) => ch.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((ch) => ch.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((ch) => ch.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((ch) => ch.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((ch) => ch.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((ch) => ch.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } + get isCIDR() { + return !!this._def.checks.find((ch) => ch.kind === "cidr"); + } + get isBase64() { + return !!this._def.checks.find((ch) => ch.kind === "base64"); + } + get isBase64url() { + return !!this._def.checks.find((ch) => ch.kind === "base64url"); + } + get minLength() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxLength() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +}; +ZodString.create = (params) => { + return new ZodString({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodString, + coerce: params?.coerce ?? false, + ...processCreateParams(params) + }); +}; +function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = Number.parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", "")); + return valInt % stepInt / 10 ** decCount; +} +var ZodNumber = class _ZodNumber extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(input) { + if (this._def.coerce) { + input.data = Number(input.data); + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.number) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.number, + received: ctx2.parsedType + }); + return INVALID; + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check2 of this._def.checks) { + if (check2.kind === "int") { + if (!util.isInteger(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: "integer", + received: "float", + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "min") { + const tooSmall = check2.inclusive ? input.data < check2.value : input.data <= check2.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check2.value, + type: "number", + inclusive: check2.inclusive, + exact: false, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "max") { + const tooBig = check2.inclusive ? input.data > check2.value : input.data >= check2.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check2.value, + type: "number", + inclusive: check2.inclusive, + exact: false, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "multipleOf") { + if (floatSafeRemainder(input.data, check2.value) !== 0) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check2.value, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "finite") { + if (!Number.isFinite(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_finite, + message: check2.message + }); + status.dirty(); + } + } else { + util.assertNever(check2); + } + } + return { status: status.value, value: input.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check2) { + return new _ZodNumber({ + ...this._def, + checks: [...this._def.checks, check2] + }); + } + int(message) { + return this._addCheck({ + kind: "int", + message: errorUtil.toString(message) + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message) + }); + } + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message) + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || ch.kind === "multipleOf" && util.isInteger(ch.value)); + } + get isFinite() { + let max = null; + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || ch.kind === "int" || ch.kind === "multipleOf") { + return true; + } else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return Number.isFinite(min) && Number.isFinite(max); + } +}; +ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: params?.coerce || false, + ...processCreateParams(params) + }); +}; +var ZodBigInt = class _ZodBigInt extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(input) { + if (this._def.coerce) { + try { + input.data = BigInt(input.data); + } catch { + return this._getInvalidInput(input); + } + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.bigint) { + return this._getInvalidInput(input); + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check2 of this._def.checks) { + if (check2.kind === "min") { + const tooSmall = check2.inclusive ? input.data < check2.value : input.data <= check2.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check2.value, + inclusive: check2.inclusive, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "max") { + const tooBig = check2.inclusive ? input.data > check2.value : input.data >= check2.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check2.value, + inclusive: check2.inclusive, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "multipleOf") { + if (input.data % check2.value !== BigInt(0)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check2.value, + message: check2.message + }); + status.dirty(); + } + } else { + util.assertNever(check2); + } + } + return { status: status.value, value: input.data }; + } + _getInvalidInput(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.bigint, + received: ctx.parsedType + }); + return INVALID; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check2) { + return new _ZodBigInt({ + ...this._def, + checks: [...this._def.checks, check2] + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +}; +ZodBigInt.create = (params) => { + return new ZodBigInt({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodBigInt, + coerce: params?.coerce ?? false, + ...processCreateParams(params) + }); +}; +var ZodBoolean = class extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = Boolean(input.data); + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: params?.coerce || false, + ...processCreateParams(params) + }); +}; +var ZodDate = class _ZodDate extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = new Date(input.data); + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.date) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.date, + received: ctx2.parsedType + }); + return INVALID; + } + if (Number.isNaN(input.data.getTime())) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_date + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check2 of this._def.checks) { + if (check2.kind === "min") { + if (input.data.getTime() < check2.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + message: check2.message, + inclusive: true, + exact: false, + minimum: check2.value, + type: "date" + }); + status.dirty(); + } + } else if (check2.kind === "max") { + if (input.data.getTime() > check2.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + message: check2.message, + inclusive: true, + exact: false, + maximum: check2.value, + type: "date" + }); + status.dirty(); + } + } else { + util.assertNever(check2); + } + } + return { + status: status.value, + value: new Date(input.data.getTime()) + }; + } + _addCheck(check2) { + return new _ZodDate({ + ...this._def, + checks: [...this._def.checks, check2] + }); + } + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message) + }); + } + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message) + }); + } + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min != null ? new Date(min) : null; + } + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max != null ? new Date(max) : null; + } +}; +ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: params?.coerce || false, + typeName: ZodFirstPartyTypeKind.ZodDate, + ...processCreateParams(params) + }); +}; +var ZodSymbol = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.symbol, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params) + }); +}; +var ZodUndefined = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, + ...processCreateParams(params) + }); +}; +var ZodNull = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.null, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params) + }); +}; +var ZodAny = class extends ZodType { + constructor() { + super(...arguments); + this._any = true; + } + _parse(input) { + return OK(input.data); + } +}; +ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params) + }); +}; +var ZodUnknown = class extends ZodType { + constructor() { + super(...arguments); + this._unknown = true; + } + _parse(input) { + return OK(input.data); + } +}; +ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params) + }); +}; +var ZodNever = class extends ZodType { + _parse(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType + }); + return INVALID; + } +}; +ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params) + }); +}; +var ZodVoid = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.void, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, + ...processCreateParams(params) + }); +}; +var ZodArray = class _ZodArray extends ZodType { + _parse(input) { + const { ctx, status } = this._processInputParams(input); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: tooSmall ? def.exactLength.value : void 0, + maximum: tooBig ? def.exactLength.value : void 0, + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.minLength.message + }); + status.dirty(); + } + } + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.maxLength.message + }); + status.dirty(); + } + } + if (ctx.common.async) { + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result2) => { + return ParseStatus.mergeArray(status, result2); + }); + } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + }); + return ParseStatus.mergeArray(status, result); + } + get element() { + return this._def.type; + } + min(minLength, message) { + return new _ZodArray({ + ...this._def, + minLength: { value: minLength, message: errorUtil.toString(message) } + }); + } + max(maxLength, message) { + return new _ZodArray({ + ...this._def, + maxLength: { value: maxLength, message: errorUtil.toString(message) } + }); + } + length(len, message) { + return new _ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) } + }); + } + nonempty(message) { + return this.min(1, message); + } +}; +ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, + ...processCreateParams(params) + }); +}; +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape + }); + } else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element) + }); + } else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); + } else { + return schema; + } +} +var ZodObject = class _ZodObject extends ZodType { + constructor() { + super(...arguments); + this._cached = null; + this.nonstrict = this.passthrough; + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + this._cached = { shape, keys }; + return this._cached; + } + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.object) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx2.parsedType + }); + return INVALID; + } + const { status, ctx } = this._processInputParams(input); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); + } + } + } + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] } + }); + } + } else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { + addIssueToContext(ctx, { + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys + }); + status.dirty(); + } + } else if (unknownKeys === "strip") { + } else { + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); + } + } else { + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse( + new ParseInputLazyPath(ctx, value, ctx.path, key) + //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data + }); + } + } + if (ctx.common.async) { + return Promise.resolve().then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + alwaysSet: pair.alwaysSet + }); + } + return syncPairs; + }).then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); + }); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get shape() { + return this._def.shape(); + } + strict(message) { + errorUtil.errToObj; + return new _ZodObject({ + ...this._def, + unknownKeys: "strict", + ...message !== void 0 ? { + errorMap: (issue2, ctx) => { + const defaultError = this._def.errorMap?.(issue2, ctx).message ?? ctx.defaultError; + if (issue2.code === "unrecognized_keys") + return { + message: errorUtil.errToObj(message).message ?? defaultError + }; + return { + message: defaultError + }; + } + } : {} + }); + } + strip() { + return new _ZodObject({ + ...this._def, + unknownKeys: "strip" + }); + } + passthrough() { + return new _ZodObject({ + ...this._def, + unknownKeys: "passthrough" + }); + } + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new _ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation + }) + }); + } + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new _ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape() + }), + typeName: ZodFirstPartyTypeKind.ZodObject + }); + return merged; + } + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); + } + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new _ZodObject({ + ...this._def, + catchall: index + }); + } + pick(mask) { + const shape = {}; + for (const key of util.objectKeys(mask)) { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } + } + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + omit(mask) { + const shape = {}; + for (const key of util.objectKeys(this.shape)) { + if (!mask[key]) { + shape[key] = this.shape[key]; + } + } + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); + } + partial(mask) { + const newShape = {}; + for (const key of util.objectKeys(this.shape)) { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; + } else { + newShape[key] = fieldSchema.optional(); + } + } + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + required(mask) { + const newShape = {}; + for (const key of util.objectKeys(this.shape)) { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; + } else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; + } + } + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + keyof() { + return createZodEnum(util.objectKeys(this.shape)); + } +}; +ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +var ZodUnion = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const options = this._def.options; + function handleResults(results) { + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } + } + for (const result of results) { + if (result.result.status === "dirty") { + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } + } + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }), + ctx: childCtx + }; + })).then(handleResults); + } else { + let dirty = void 0; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }); + if (result.status === "valid") { + return result; + } else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; + } + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); + } + } + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; + } + const unionErrors = issues.map((issues2) => new ZodError(issues2)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + } + get options() { + return this._def.options; + } +}; +ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, + ...processCreateParams(params) + }); +}; +var getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); + } else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); + } else if (type instanceof ZodLiteral) { + return [type.value]; + } else if (type instanceof ZodEnum) { + return type.options; + } else if (type instanceof ZodNativeEnum) { + return util.objectValues(type.enum); + } else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); + } else if (type instanceof ZodUndefined) { + return [void 0]; + } else if (type instanceof ZodNull) { + return [null]; + } else if (type instanceof ZodOptional) { + return [void 0, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodNullable) { + return [null, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodBranded) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodReadonly) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodCatch) { + return getDiscriminator(type._def.innerType); + } else { + return []; + } +}; +var ZodDiscriminatedUnion = class _ZodDiscriminatedUnion extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator] + }); + return INVALID; + } + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } else { + return option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + const optionsMap = /* @__PURE__ */ new Map(); + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues.length) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); + } + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); + } + optionsMap.set(value, type); + } + } + return new _ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params) + }); + } +}; +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; + } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; + } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; + } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) { + return { valid: true, data: a }; + } else { + return { valid: false }; + } +} +var ZodIntersection = class extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); + } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }) + ]).then(([left, right]) => handleParsed(left, right)); + } else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + })); + } + } +}; +ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left, + right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, + ...processCreateParams(params) + }); +}; +var ZodTuple = class _ZodTuple extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (ctx.data.length < this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + return INVALID; + } + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + status.dirty(); + } + const items = [...ctx.data].map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }).filter((x) => !!x); + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } else { + return ParseStatus.mergeArray(status, items); + } + } + get items() { + return this._def.items; + } + rest(rest) { + return new _ZodTuple({ + ...this._def, + rest + }); + } +}; +ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + } + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, + ...processCreateParams(params) + }); +}; +var ZodRecord = class _ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get element() { + return this._def.valueType; + } + static create(first, second, third) { + if (second instanceof ZodType) { + return new _ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third) + }); + } + return new _ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second) + }); + } +}; +var ZodMap = class extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.map) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.map, + received: ctx.parsedType + }); + return INVALID; + } + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])) + }; + }); + if (ctx.common.async) { + const finalMap = /* @__PURE__ */ new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + }); + } else { + const finalMap = /* @__PURE__ */ new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + } + } +}; +ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, + ...processCreateParams(params) + }); +}; +var ZodSet = class _ZodSet extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.set) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.set, + received: ctx.parsedType + }); + return INVALID; + } + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.minSize.message + }); + status.dirty(); + } + } + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.maxSize.message + }); + status.dirty(); + } + } + const valueType = this._def.valueType; + function finalizeSet(elements2) { + const parsedSet = /* @__PURE__ */ new Set(); + for (const element of elements2) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); + } + return { status: status.value, value: parsedSet }; + } + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); + if (ctx.common.async) { + return Promise.all(elements).then((elements2) => finalizeSet(elements2)); + } else { + return finalizeSet(elements); + } + } + min(minSize, message) { + return new _ZodSet({ + ...this._def, + minSize: { value: minSize, message: errorUtil.toString(message) } + }); + } + max(maxSize, message) { + return new _ZodSet({ + ...this._def, + maxSize: { value: maxSize, message: errorUtil.toString(message) } + }); + } + size(size, message) { + return this.min(size, message).max(size, message); + } + nonempty(message) { + return this.min(1, message); + } +}; +ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, + ...processCreateParams(params) + }); +}; +var ZodFunction = class _ZodFunction extends ZodType { + constructor() { + super(...arguments); + this.validate = this.implement; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.function) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.function, + received: ctx.parsedType + }); + return INVALID; + } + function makeArgsIssue(args, error2) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), en_default].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error2 + } + }); + } + function makeReturnsIssue(returns, error2) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), en_default].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error2 + } + }); + } + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + const me = this; + return OK(async function(...args) { + const error2 = new ZodError([]); + const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => { + error2.addIssue(makeArgsIssue(args, e)); + throw error2; + }); + const result = await Reflect.apply(fn, this, parsedArgs); + const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e) => { + error2.addIssue(makeReturnsIssue(result, e)); + throw error2; + }); + return parsedReturns; + }); + } else { + const me = this; + return OK(function(...args) { + const parsedArgs = me._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + } + const result = Reflect.apply(fn, this, parsedArgs.data); + const parsedReturns = me._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; + }); + } + } + parameters() { + return this._def.args; + } + returnType() { + return this._def.returns; + } + args(...items) { + return new _ZodFunction({ + ...this._def, + args: ZodTuple.create(items).rest(ZodUnknown.create()) + }); + } + returns(returnType) { + return new _ZodFunction({ + ...this._def, + returns: returnType + }); + } + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + static create(args, returns, params) { + return new _ZodFunction({ + args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params) + }); + } +}; +var ZodLazy = class extends ZodType { + get schema() { + return this._def.getter(); + } + _parse(input) { + const { ctx } = this._processInputParams(input); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); + } +}; +ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, + ...processCreateParams(params) + }); +}; +var ZodLiteral = class extends ZodType { + _parse(input) { + if (input.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } + get value() { + return this._def.value; + } +}; +ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, + ...processCreateParams(params) + }); +}; +function createZodEnum(values, params) { + return new ZodEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodEnum, + ...processCreateParams(params) + }); +} +var ZodEnum = class _ZodEnum extends ZodType { + _parse(input) { + if (typeof input.data !== "string") { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!this._cache) { + this._cache = new Set(this._def.values); + } + if (!this._cache.has(input.data)) { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input.data); + } + get options() { + return this._def.values; + } + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + extract(values, newDef = this._def) { + return _ZodEnum.create(values, { + ...this._def, + ...newDef + }); + } + exclude(values, newDef = this._def) { + return _ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { + ...this._def, + ...newDef + }); + } +}; +ZodEnum.create = createZodEnum; +var ZodNativeEnum = class extends ZodType { + _parse(input) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input); + if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!this._cache) { + this._cache = new Set(util.getValidEnumValues(this._def.values)); + } + if (!this._cache.has(input.data)) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input.data); + } + get enum() { + return this._def.values; + } +}; +ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, + ...processCreateParams(params) + }); +}; +var ZodPromise = class extends ZodType { + unwrap() { + return this._def.type; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.promise, + received: ctx.parsedType + }); + return INVALID; + } + const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { + path: ctx.path, + errorMap: ctx.common.contextualErrorMap + }); + })); + } +}; +ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params) + }); +}; +var ZodEffects = class extends ZodType { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const effect = this._def.effect || null; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } else { + status.dirty(); + } + }, + get path() { + return ctx.path; + } + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data, checkCtx); + if (ctx.common.async) { + return Promise.resolve(processed).then(async (processed2) => { + if (status.value === "aborted") + return INVALID; + const result = await this._def.schema._parseAsync({ + data: processed2, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + }); + } else { + if (status.value === "aborted") + return INVALID; + const result = this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + } + } + if (effect.type === "refinement") { + const executeRefinement = (acc) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } + } + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (!isValid(base)) + return INVALID; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { status: status.value, value: result }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => { + if (!isValid(base)) + return INVALID; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ + status: status.value, + value: result + })); + }); + } + } + util.assertNever(effect); + } +}; +ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, + ...processCreateParams(params) + }); +}; +ZodEffects.createWithPreprocess = (preprocess2, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess2 }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params) + }); +}; +var ZodOptional = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 === ZodParsedType.undefined) { + return OK(void 0); + } + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +}; +ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params) + }); +}; +var ZodNullable = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 === ZodParsedType.null) { + return OK(null); + } + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +}; +ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params) + }); +}; +var ZodDefault = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); + } + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + removeDefault() { + return this._def.innerType; + } +}; +ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" ? params.default : () => params.default, + ...processCreateParams(params) + }); +}; +var ZodCatch = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + } + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx + } + }); + if (isAsync(result)) { + return result.then((result2) => { + return { + status: "valid", + value: result2.status === "valid" ? result2.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + }); + } else { + return { + status: "valid", + value: result.status === "valid" ? result.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + } + } + removeCatch() { + return this._def.innerType; + } +}; +ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, + ...processCreateParams(params) + }); +}; +var ZodNaN = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.nan, + received: ctx.parsedType + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } +}; +ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params) + }); +}; +var BRAND = Symbol("zod_brand"); +var ZodBranded = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + unwrap() { + return this._def.type; + } +}; +var ZodPipeline = class _ZodPipeline extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.common.async) { + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + }; + return handleAsync(); + } else { + const inResult = this._def.in._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value + }; + } else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + } + } + static create(a, b) { + return new _ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline + }); + } +}; +var ZodReadonly = class extends ZodType { + _parse(input) { + const result = this._def.innerType._parse(input); + const freeze = (data) => { + if (isValid(data)) { + data.value = Object.freeze(data.value); + } + return data; + }; + return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result); + } + unwrap() { + return this._def.innerType; + } +}; +ZodReadonly.create = (type, params) => { + return new ZodReadonly({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodReadonly, + ...processCreateParams(params) + }); +}; +function cleanParams(params, data) { + const p = typeof params === "function" ? params(data) : typeof params === "string" ? { message: params } : params; + const p2 = typeof p === "string" ? { message: p } : p; + return p2; +} +function custom(check2, _params = {}, fatal) { + if (check2) + return ZodAny.create().superRefine((data, ctx) => { + const r = check2(data); + if (r instanceof Promise) { + return r.then((r2) => { + if (!r2) { + const params = cleanParams(_params, data); + const _fatal = params.fatal ?? fatal ?? true; + ctx.addIssue({ code: "custom", ...params, fatal: _fatal }); + } + }); + } + if (!r) { + const params = cleanParams(_params, data); + const _fatal = params.fatal ?? fatal ?? true; + ctx.addIssue({ code: "custom", ...params, fatal: _fatal }); + } + return; + }); + return ZodAny.create(); +} +var late = { + object: ZodObject.lazycreate +}; +var ZodFirstPartyTypeKind; +(function(ZodFirstPartyTypeKind2) { + ZodFirstPartyTypeKind2["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind2["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind2["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind2["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind2["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind2["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind2["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind2["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind2["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind2["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind2["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind2["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind2["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind2["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind2["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind2["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind2["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind2["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind2["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind2["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind2["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind2["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind2["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind2["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind2["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind2["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind2["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind2["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind2["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind2["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind2["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind2["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind2["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind2["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind2["ZodPipeline"] = "ZodPipeline"; + ZodFirstPartyTypeKind2["ZodReadonly"] = "ZodReadonly"; +})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); +var instanceOfType = (cls, params = { + message: `Input not instance of ${cls.name}` +}) => custom((data) => data instanceof cls, params); +var stringType = ZodString.create; +var numberType = ZodNumber.create; +var nanType = ZodNaN.create; +var bigIntType = ZodBigInt.create; +var booleanType = ZodBoolean.create; +var dateType = ZodDate.create; +var symbolType = ZodSymbol.create; +var undefinedType = ZodUndefined.create; +var nullType = ZodNull.create; +var anyType = ZodAny.create; +var unknownType = ZodUnknown.create; +var neverType = ZodNever.create; +var voidType = ZodVoid.create; +var arrayType = ZodArray.create; +var objectType = ZodObject.create; +var strictObjectType = ZodObject.strictCreate; +var unionType = ZodUnion.create; +var discriminatedUnionType = ZodDiscriminatedUnion.create; +var intersectionType = ZodIntersection.create; +var tupleType = ZodTuple.create; +var recordType = ZodRecord.create; +var mapType = ZodMap.create; +var setType = ZodSet.create; +var functionType = ZodFunction.create; +var lazyType = ZodLazy.create; +var literalType = ZodLiteral.create; +var enumType = ZodEnum.create; +var nativeEnumType = ZodNativeEnum.create; +var promiseType = ZodPromise.create; +var effectsType = ZodEffects.create; +var optionalType = ZodOptional.create; +var nullableType = ZodNullable.create; +var preprocessType = ZodEffects.createWithPreprocess; +var pipelineType = ZodPipeline.create; +var ostring = () => stringType().optional(); +var onumber = () => numberType().optional(); +var oboolean = () => booleanType().optional(); +var coerce = { + string: (arg) => ZodString.create({ ...arg, coerce: true }), + number: (arg) => ZodNumber.create({ ...arg, coerce: true }), + boolean: (arg) => ZodBoolean.create({ + ...arg, + coerce: true + }), + bigint: (arg) => ZodBigInt.create({ ...arg, coerce: true }), + date: (arg) => ZodDate.create({ ...arg, coerce: true }) +}; +var NEVER = INVALID; + +// node_modules/zod/v4/core/core.js +var NEVER2 = Object.freeze({ + status: "aborted" +}); +// @__NO_SIDE_EFFECTS__ +function $constructor(name, initializer3, params) { + function init(inst, def) { + var _a; + Object.defineProperty(inst, "_zod", { + value: inst._zod ?? {}, + enumerable: false + }); + (_a = inst._zod).traits ?? (_a.traits = /* @__PURE__ */ new Set()); + inst._zod.traits.add(name); + initializer3(inst, def); + for (const k in _.prototype) { + if (!(k in inst)) + Object.defineProperty(inst, k, { value: _.prototype[k].bind(inst) }); + } + inst._zod.constr = _; + inst._zod.def = def; + } + const Parent = params?.Parent ?? Object; + class Definition extends Parent { + } + Object.defineProperty(Definition, "name", { value: name }); + function _(def) { + var _a; + const inst = params?.Parent ? new Definition() : this; + init(inst, def); + (_a = inst._zod).deferred ?? (_a.deferred = []); + for (const fn of inst._zod.deferred) { + fn(); + } + return inst; + } + Object.defineProperty(_, "init", { value: init }); + Object.defineProperty(_, Symbol.hasInstance, { + value: (inst) => { + if (params?.Parent && inst instanceof params.Parent) + return true; + return inst?._zod?.traits?.has(name); + } + }); + Object.defineProperty(_, "name", { value: name }); + return _; +} +var $brand = Symbol("zod_brand"); +var $ZodAsyncError = class extends Error { + constructor() { + super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`); + } +}; +var globalConfig = {}; +function config(newConfig) { + if (newConfig) + Object.assign(globalConfig, newConfig); + return globalConfig; +} + +// node_modules/zod/v4/core/util.js +var util_exports = {}; +__export(util_exports, { + BIGINT_FORMAT_RANGES: () => BIGINT_FORMAT_RANGES, + Class: () => Class, + NUMBER_FORMAT_RANGES: () => NUMBER_FORMAT_RANGES, + aborted: () => aborted, + allowsEval: () => allowsEval, + assert: () => assert, + assertEqual: () => assertEqual, + assertIs: () => assertIs, + assertNever: () => assertNever, + assertNotEqual: () => assertNotEqual, + assignProp: () => assignProp, + cached: () => cached, + captureStackTrace: () => captureStackTrace, + cleanEnum: () => cleanEnum, + cleanRegex: () => cleanRegex, + clone: () => clone, + createTransparentProxy: () => createTransparentProxy, + defineLazy: () => defineLazy, + esc: () => esc, + escapeRegex: () => escapeRegex, + extend: () => extend, + finalizeIssue: () => finalizeIssue, + floatSafeRemainder: () => floatSafeRemainder2, + getElementAtPath: () => getElementAtPath, + getEnumValues: () => getEnumValues, + getLengthableOrigin: () => getLengthableOrigin, + getParsedType: () => getParsedType2, + getSizableOrigin: () => getSizableOrigin, + isObject: () => isObject, + isPlainObject: () => isPlainObject, + issue: () => issue, + joinValues: () => joinValues, + jsonStringifyReplacer: () => jsonStringifyReplacer, + merge: () => merge, + normalizeParams: () => normalizeParams, + nullish: () => nullish, + numKeys: () => numKeys, + omit: () => omit, + optionalKeys: () => optionalKeys, + partial: () => partial, + pick: () => pick, + prefixIssues: () => prefixIssues, + primitiveTypes: () => primitiveTypes, + promiseAllObject: () => promiseAllObject, + propertyKeyTypes: () => propertyKeyTypes, + randomString: () => randomString, + required: () => required, + stringifyPrimitive: () => stringifyPrimitive, + unwrapMessage: () => unwrapMessage +}); +function assertEqual(val) { + return val; +} +function assertNotEqual(val) { + return val; +} +function assertIs(_arg) { +} +function assertNever(_x) { + throw new Error(); +} +function assert(_) { +} +function getEnumValues(entries) { + const numericValues = Object.values(entries).filter((v) => typeof v === "number"); + const values = Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v); + return values; +} +function joinValues(array2, separator = "|") { + return array2.map((val) => stringifyPrimitive(val)).join(separator); +} +function jsonStringifyReplacer(_, value) { + if (typeof value === "bigint") + return value.toString(); + return value; +} +function cached(getter) { + const set = false; + return { + get value() { + if (!set) { + const value = getter(); + Object.defineProperty(this, "value", { value }); + return value; + } + throw new Error("cached value already set"); + } + }; +} +function nullish(input) { + return input === null || input === void 0; +} +function cleanRegex(source) { + const start = source.startsWith("^") ? 1 : 0; + const end = source.endsWith("$") ? source.length - 1 : source.length; + return source.slice(start, end); +} +function floatSafeRemainder2(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = Number.parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", "")); + return valInt % stepInt / 10 ** decCount; +} +function defineLazy(object3, key, getter) { + const set = false; + Object.defineProperty(object3, key, { + get() { + if (!set) { + const value = getter(); + object3[key] = value; + return value; + } + throw new Error("cached value already set"); + }, + set(v) { + Object.defineProperty(object3, key, { + value: v + // configurable: true, + }); + }, + configurable: true + }); +} +function assignProp(target, prop, value) { + Object.defineProperty(target, prop, { + value, + writable: true, + enumerable: true, + configurable: true + }); +} +function getElementAtPath(obj, path21) { + if (!path21) + return obj; + return path21.reduce((acc, key) => acc?.[key], obj); +} +function promiseAllObject(promisesObj) { + const keys = Object.keys(promisesObj); + const promises = keys.map((key) => promisesObj[key]); + return Promise.all(promises).then((results) => { + const resolvedObj = {}; + for (let i = 0; i < keys.length; i++) { + resolvedObj[keys[i]] = results[i]; + } + return resolvedObj; + }); +} +function randomString(length = 10) { + const chars = "abcdefghijklmnopqrstuvwxyz"; + let str = ""; + for (let i = 0; i < length; i++) { + str += chars[Math.floor(Math.random() * chars.length)]; + } + return str; +} +function esc(str) { + return JSON.stringify(str); +} +var captureStackTrace = Error.captureStackTrace ? Error.captureStackTrace : (..._args) => { +}; +function isObject(data) { + return typeof data === "object" && data !== null && !Array.isArray(data); +} +var allowsEval = cached(() => { + if (typeof navigator !== "undefined" && navigator?.userAgent?.includes("Cloudflare")) { + return false; + } + try { + const F = Function; + new F(""); + return true; + } catch (_) { + return false; + } +}); +function isPlainObject(o) { + if (isObject(o) === false) + return false; + const ctor = o.constructor; + if (ctor === void 0) + return true; + const prot = ctor.prototype; + if (isObject(prot) === false) + return false; + if (Object.prototype.hasOwnProperty.call(prot, "isPrototypeOf") === false) { + return false; + } + return true; +} +function numKeys(data) { + let keyCount = 0; + for (const key in data) { + if (Object.prototype.hasOwnProperty.call(data, key)) { + keyCount++; + } + } + return keyCount; +} +var getParsedType2 = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return "undefined"; + case "string": + return "string"; + case "number": + return Number.isNaN(data) ? "nan" : "number"; + case "boolean": + return "boolean"; + case "function": + return "function"; + case "bigint": + return "bigint"; + case "symbol": + return "symbol"; + case "object": + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") { + return "promise"; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return "map"; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return "set"; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return "date"; + } + if (typeof File !== "undefined" && data instanceof File) { + return "file"; + } + return "object"; + default: + throw new Error(`Unknown data type: ${t}`); + } +}; +var propertyKeyTypes = /* @__PURE__ */ new Set(["string", "number", "symbol"]); +var primitiveTypes = /* @__PURE__ */ new Set(["string", "number", "bigint", "boolean", "symbol", "undefined"]); +function escapeRegex(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} +function clone(inst, def, params) { + const cl = new inst._zod.constr(def ?? inst._zod.def); + if (!def || params?.parent) + cl._zod.parent = inst; + return cl; +} +function normalizeParams(_params) { + const params = _params; + if (!params) + return {}; + if (typeof params === "string") + return { error: () => params }; + if (params?.message !== void 0) { + if (params?.error !== void 0) + throw new Error("Cannot specify both `message` and `error` params"); + params.error = params.message; + } + delete params.message; + if (typeof params.error === "string") + return { ...params, error: () => params.error }; + return params; +} +function createTransparentProxy(getter) { + let target; + return new Proxy({}, { + get(_, prop, receiver) { + target ?? (target = getter()); + return Reflect.get(target, prop, receiver); + }, + set(_, prop, value, receiver) { + target ?? (target = getter()); + return Reflect.set(target, prop, value, receiver); + }, + has(_, prop) { + target ?? (target = getter()); + return Reflect.has(target, prop); + }, + deleteProperty(_, prop) { + target ?? (target = getter()); + return Reflect.deleteProperty(target, prop); + }, + ownKeys(_) { + target ?? (target = getter()); + return Reflect.ownKeys(target); + }, + getOwnPropertyDescriptor(_, prop) { + target ?? (target = getter()); + return Reflect.getOwnPropertyDescriptor(target, prop); + }, + defineProperty(_, prop, descriptor) { + target ?? (target = getter()); + return Reflect.defineProperty(target, prop, descriptor); + } + }); +} +function stringifyPrimitive(value) { + if (typeof value === "bigint") + return value.toString() + "n"; + if (typeof value === "string") + return `"${value}"`; + return `${value}`; +} +function optionalKeys(shape) { + return Object.keys(shape).filter((k) => { + return shape[k]._zod.optin === "optional" && shape[k]._zod.optout === "optional"; + }); +} +var NUMBER_FORMAT_RANGES = { + safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER], + int32: [-2147483648, 2147483647], + uint32: [0, 4294967295], + float32: [-34028234663852886e22, 34028234663852886e22], + float64: [-Number.MAX_VALUE, Number.MAX_VALUE] +}; +var BIGINT_FORMAT_RANGES = { + int64: [/* @__PURE__ */ BigInt("-9223372036854775808"), /* @__PURE__ */ BigInt("9223372036854775807")], + uint64: [/* @__PURE__ */ BigInt(0), /* @__PURE__ */ BigInt("18446744073709551615")] +}; +function pick(schema, mask) { + const newShape = {}; + const currDef = schema._zod.def; + for (const key in mask) { + if (!(key in currDef.shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + newShape[key] = currDef.shape[key]; + } + return clone(schema, { + ...schema._zod.def, + shape: newShape, + checks: [] + }); +} +function omit(schema, mask) { + const newShape = { ...schema._zod.def.shape }; + const currDef = schema._zod.def; + for (const key in mask) { + if (!(key in currDef.shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + delete newShape[key]; + } + return clone(schema, { + ...schema._zod.def, + shape: newShape, + checks: [] + }); +} +function extend(schema, shape) { + if (!isPlainObject(shape)) { + throw new Error("Invalid input to extend: expected a plain object"); + } + const def = { + ...schema._zod.def, + get shape() { + const _shape = { ...schema._zod.def.shape, ...shape }; + assignProp(this, "shape", _shape); + return _shape; + }, + checks: [] + // delete existing checks + }; + return clone(schema, def); +} +function merge(a, b) { + return clone(a, { + ...a._zod.def, + get shape() { + const _shape = { ...a._zod.def.shape, ...b._zod.def.shape }; + assignProp(this, "shape", _shape); + return _shape; + }, + catchall: b._zod.def.catchall, + checks: [] + // delete existing checks + }); +} +function partial(Class2, schema, mask) { + const oldShape = schema._zod.def.shape; + const shape = { ...oldShape }; + if (mask) { + for (const key in mask) { + if (!(key in oldShape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + shape[key] = Class2 ? new Class2({ + type: "optional", + innerType: oldShape[key] + }) : oldShape[key]; + } + } else { + for (const key in oldShape) { + shape[key] = Class2 ? new Class2({ + type: "optional", + innerType: oldShape[key] + }) : oldShape[key]; + } + } + return clone(schema, { + ...schema._zod.def, + shape, + checks: [] + }); +} +function required(Class2, schema, mask) { + const oldShape = schema._zod.def.shape; + const shape = { ...oldShape }; + if (mask) { + for (const key in mask) { + if (!(key in shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + shape[key] = new Class2({ + type: "nonoptional", + innerType: oldShape[key] + }); + } + } else { + for (const key in oldShape) { + shape[key] = new Class2({ + type: "nonoptional", + innerType: oldShape[key] + }); + } + } + return clone(schema, { + ...schema._zod.def, + shape, + // optional: [], + checks: [] + }); +} +function aborted(x, startIndex = 0) { + for (let i = startIndex; i < x.issues.length; i++) { + if (x.issues[i]?.continue !== true) + return true; + } + return false; +} +function prefixIssues(path21, issues) { + return issues.map((iss) => { + var _a; + (_a = iss).path ?? (_a.path = []); + iss.path.unshift(path21); + return iss; + }); +} +function unwrapMessage(message) { + return typeof message === "string" ? message : message?.message; +} +function finalizeIssue(iss, ctx, config3) { + const full = { ...iss, path: iss.path ?? [] }; + if (!iss.message) { + const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(config3.customError?.(iss)) ?? unwrapMessage(config3.localeError?.(iss)) ?? "Invalid input"; + full.message = message; + } + delete full.inst; + delete full.continue; + if (!ctx?.reportInput) { + delete full.input; + } + return full; +} +function getSizableOrigin(input) { + if (input instanceof Set) + return "set"; + if (input instanceof Map) + return "map"; + if (input instanceof File) + return "file"; + return "unknown"; +} +function getLengthableOrigin(input) { + if (Array.isArray(input)) + return "array"; + if (typeof input === "string") + return "string"; + return "unknown"; +} +function issue(...args) { + const [iss, input, inst] = args; + if (typeof iss === "string") { + return { + message: iss, + code: "custom", + input, + inst + }; + } + return { ...iss }; +} +function cleanEnum(obj) { + return Object.entries(obj).filter(([k, _]) => { + return Number.isNaN(Number.parseInt(k, 10)); + }).map((el) => el[1]); +} +var Class = class { + constructor(..._args) { + } +}; + +// node_modules/zod/v4/core/errors.js +var initializer = (inst, def) => { + inst.name = "$ZodError"; + Object.defineProperty(inst, "_zod", { + value: inst._zod, + enumerable: false + }); + Object.defineProperty(inst, "issues", { + value: def, + enumerable: false + }); + Object.defineProperty(inst, "message", { + get() { + return JSON.stringify(def, jsonStringifyReplacer, 2); + }, + enumerable: true + // configurable: false, + }); + Object.defineProperty(inst, "toString", { + value: () => inst.message, + enumerable: false + }); +}; +var $ZodError = $constructor("$ZodError", initializer); +var $ZodRealError = $constructor("$ZodError", initializer, { Parent: Error }); +function flattenError(error2, mapper = (issue2) => issue2.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of error2.issues) { + if (sub.path.length > 0) { + fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; + fieldErrors[sub.path[0]].push(mapper(sub)); + } else { + formErrors.push(mapper(sub)); + } + } + return { formErrors, fieldErrors }; +} +function formatError(error2, _mapper) { + const mapper = _mapper || function(issue2) { + return issue2.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error3) => { + for (const issue2 of error3.issues) { + if (issue2.code === "invalid_union" && issue2.errors.length) { + issue2.errors.map((issues) => processError({ issues })); + } else if (issue2.code === "invalid_key") { + processError({ issues: issue2.issues }); + } else if (issue2.code === "invalid_element") { + processError({ issues: issue2.issues }); + } else if (issue2.path.length === 0) { + fieldErrors._errors.push(mapper(issue2)); + } else { + let curr = fieldErrors; + let i = 0; + while (i < issue2.path.length) { + const el = issue2.path[i]; + const terminal = i === issue2.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + } else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue2)); + } + curr = curr[el]; + i++; + } + } + } + }; + processError(error2); + return fieldErrors; +} + +// node_modules/zod/v4/core/parse.js +var _parse = (_Err) => (schema, value, _ctx, _params) => { + const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false }; + const result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) { + throw new $ZodAsyncError(); + } + if (result.issues.length) { + const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); + captureStackTrace(e, _params?.callee); + throw e; + } + return result.value; +}; +var _parseAsync = (_Err) => async (schema, value, _ctx, params) => { + const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; + let result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) + result = await result; + if (result.issues.length) { + const e = new (params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); + captureStackTrace(e, params?.callee); + throw e; + } + return result.value; +}; +var _safeParse = (_Err) => (schema, value, _ctx) => { + const ctx = _ctx ? { ..._ctx, async: false } : { async: false }; + const result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) { + throw new $ZodAsyncError(); + } + return result.issues.length ? { + success: false, + error: new (_Err ?? $ZodError)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + } : { success: true, data: result.value }; +}; +var safeParse = /* @__PURE__ */ _safeParse($ZodRealError); +var _safeParseAsync = (_Err) => async (schema, value, _ctx) => { + const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; + let result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) + result = await result; + return result.issues.length ? { + success: false, + error: new _Err(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + } : { success: true, data: result.value }; +}; +var safeParseAsync = /* @__PURE__ */ _safeParseAsync($ZodRealError); + +// node_modules/zod/v4/core/regexes.js +var cuid = /^[cC][^\s-]{8,}$/; +var cuid2 = /^[0-9a-z]+$/; +var ulid = /^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/; +var xid = /^[0-9a-vA-V]{20}$/; +var ksuid = /^[A-Za-z0-9]{27}$/; +var nanoid = /^[a-zA-Z0-9_-]{21}$/; +var duration = /^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/; +var guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/; +var uuid = (version2) => { + if (!version2) + return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$/; + return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version2}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`); +}; +var email = /^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/; +var _emoji = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; +function emoji() { + return new RegExp(_emoji, "u"); +} +var ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; +var ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})$/; +var cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/; +var cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; +var base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/; +var base64url = /^[A-Za-z0-9_-]*$/; +var hostname = /^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+$/; +var e164 = /^\+(?:[0-9]){6,14}[0-9]$/; +var dateSource = `(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`; +var date = /* @__PURE__ */ new RegExp(`^${dateSource}$`); +function timeSource(args) { + const hhmm = `(?:[01]\\d|2[0-3]):[0-5]\\d`; + const regex = typeof args.precision === "number" ? args.precision === -1 ? `${hhmm}` : args.precision === 0 ? `${hhmm}:[0-5]\\d` : `${hhmm}:[0-5]\\d\\.\\d{${args.precision}}` : `${hhmm}(?::[0-5]\\d(?:\\.\\d+)?)?`; + return regex; +} +function time(args) { + return new RegExp(`^${timeSource(args)}$`); +} +function datetime(args) { + const time3 = timeSource({ precision: args.precision }); + const opts = ["Z"]; + if (args.local) + opts.push(""); + if (args.offset) + opts.push(`([+-]\\d{2}:\\d{2})`); + const timeRegex2 = `${time3}(?:${opts.join("|")})`; + return new RegExp(`^${dateSource}T(?:${timeRegex2})$`); +} +var string = (params) => { + const regex = params ? `[\\s\\S]{${params?.minimum ?? 0},${params?.maximum ?? ""}}` : `[\\s\\S]*`; + return new RegExp(`^${regex}$`); +}; +var integer = /^\d+$/; +var number = /^-?\d+(?:\.\d+)?/i; +var boolean = /true|false/i; +var _null = /null/i; +var lowercase = /^[^A-Z]*$/; +var uppercase = /^[^a-z]*$/; + +// node_modules/zod/v4/core/checks.js +var $ZodCheck = /* @__PURE__ */ $constructor("$ZodCheck", (inst, def) => { + var _a; + inst._zod ?? (inst._zod = {}); + inst._zod.def = def; + (_a = inst._zod).onattach ?? (_a.onattach = []); +}); +var numericOriginMap = { + number: "number", + bigint: "bigint", + object: "date" +}; +var $ZodCheckLessThan = /* @__PURE__ */ $constructor("$ZodCheckLessThan", (inst, def) => { + $ZodCheck.init(inst, def); + const origin = numericOriginMap[typeof def.value]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY; + if (def.value < curr) { + if (def.inclusive) + bag.maximum = def.value; + else + bag.exclusiveMaximum = def.value; + } + }); + inst._zod.check = (payload) => { + if (def.inclusive ? payload.value <= def.value : payload.value < def.value) { + return; + } + payload.issues.push({ + origin, + code: "too_big", + maximum: def.value, + input: payload.value, + inclusive: def.inclusive, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckGreaterThan = /* @__PURE__ */ $constructor("$ZodCheckGreaterThan", (inst, def) => { + $ZodCheck.init(inst, def); + const origin = numericOriginMap[typeof def.value]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY; + if (def.value > curr) { + if (def.inclusive) + bag.minimum = def.value; + else + bag.exclusiveMinimum = def.value; + } + }); + inst._zod.check = (payload) => { + if (def.inclusive ? payload.value >= def.value : payload.value > def.value) { + return; + } + payload.issues.push({ + origin, + code: "too_small", + minimum: def.value, + input: payload.value, + inclusive: def.inclusive, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckMultipleOf = /* @__PURE__ */ $constructor("$ZodCheckMultipleOf", (inst, def) => { + $ZodCheck.init(inst, def); + inst._zod.onattach.push((inst2) => { + var _a; + (_a = inst2._zod.bag).multipleOf ?? (_a.multipleOf = def.value); + }); + inst._zod.check = (payload) => { + if (typeof payload.value !== typeof def.value) + throw new Error("Cannot mix number and bigint in multiple_of check."); + const isMultiple = typeof payload.value === "bigint" ? payload.value % def.value === BigInt(0) : floatSafeRemainder2(payload.value, def.value) === 0; + if (isMultiple) + return; + payload.issues.push({ + origin: typeof payload.value, + code: "not_multiple_of", + divisor: def.value, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckNumberFormat = /* @__PURE__ */ $constructor("$ZodCheckNumberFormat", (inst, def) => { + $ZodCheck.init(inst, def); + def.format = def.format || "float64"; + const isInt = def.format?.includes("int"); + const origin = isInt ? "int" : "number"; + const [minimum, maximum] = NUMBER_FORMAT_RANGES[def.format]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = def.format; + bag.minimum = minimum; + bag.maximum = maximum; + if (isInt) + bag.pattern = integer; + }); + inst._zod.check = (payload) => { + const input = payload.value; + if (isInt) { + if (!Number.isInteger(input)) { + payload.issues.push({ + expected: origin, + format: def.format, + code: "invalid_type", + input, + inst + }); + return; + } + if (!Number.isSafeInteger(input)) { + if (input > 0) { + payload.issues.push({ + input, + code: "too_big", + maximum: Number.MAX_SAFE_INTEGER, + note: "Integers must be within the safe integer range.", + inst, + origin, + continue: !def.abort + }); + } else { + payload.issues.push({ + input, + code: "too_small", + minimum: Number.MIN_SAFE_INTEGER, + note: "Integers must be within the safe integer range.", + inst, + origin, + continue: !def.abort + }); + } + return; + } + } + if (input < minimum) { + payload.issues.push({ + origin: "number", + input, + code: "too_small", + minimum, + inclusive: true, + inst, + continue: !def.abort + }); + } + if (input > maximum) { + payload.issues.push({ + origin: "number", + input, + code: "too_big", + maximum, + inst + }); + } + }; +}); +var $ZodCheckMaxLength = /* @__PURE__ */ $constructor("$ZodCheckMaxLength", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.maximum ?? Number.POSITIVE_INFINITY; + if (def.maximum < curr) + inst2._zod.bag.maximum = def.maximum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length <= def.maximum) + return; + const origin = getLengthableOrigin(input); + payload.issues.push({ + origin, + code: "too_big", + maximum: def.maximum, + inclusive: true, + input, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckMinLength = /* @__PURE__ */ $constructor("$ZodCheckMinLength", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.minimum ?? Number.NEGATIVE_INFINITY; + if (def.minimum > curr) + inst2._zod.bag.minimum = def.minimum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length >= def.minimum) + return; + const origin = getLengthableOrigin(input); + payload.issues.push({ + origin, + code: "too_small", + minimum: def.minimum, + inclusive: true, + input, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckLengthEquals = /* @__PURE__ */ $constructor("$ZodCheckLengthEquals", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.minimum = def.length; + bag.maximum = def.length; + bag.length = def.length; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length === def.length) + return; + const origin = getLengthableOrigin(input); + const tooBig = length > def.length; + payload.issues.push({ + origin, + ...tooBig ? { code: "too_big", maximum: def.length } : { code: "too_small", minimum: def.length }, + inclusive: true, + exact: true, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckStringFormat = /* @__PURE__ */ $constructor("$ZodCheckStringFormat", (inst, def) => { + var _a, _b; + $ZodCheck.init(inst, def); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = def.format; + if (def.pattern) { + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(def.pattern); + } + }); + if (def.pattern) + (_a = inst._zod).check ?? (_a.check = (payload) => { + def.pattern.lastIndex = 0; + if (def.pattern.test(payload.value)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: def.format, + input: payload.value, + ...def.pattern ? { pattern: def.pattern.toString() } : {}, + inst, + continue: !def.abort + }); + }); + else + (_b = inst._zod).check ?? (_b.check = () => { + }); +}); +var $ZodCheckRegex = /* @__PURE__ */ $constructor("$ZodCheckRegex", (inst, def) => { + $ZodCheckStringFormat.init(inst, def); + inst._zod.check = (payload) => { + def.pattern.lastIndex = 0; + if (def.pattern.test(payload.value)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "regex", + input: payload.value, + pattern: def.pattern.toString(), + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckLowerCase = /* @__PURE__ */ $constructor("$ZodCheckLowerCase", (inst, def) => { + def.pattern ?? (def.pattern = lowercase); + $ZodCheckStringFormat.init(inst, def); +}); +var $ZodCheckUpperCase = /* @__PURE__ */ $constructor("$ZodCheckUpperCase", (inst, def) => { + def.pattern ?? (def.pattern = uppercase); + $ZodCheckStringFormat.init(inst, def); +}); +var $ZodCheckIncludes = /* @__PURE__ */ $constructor("$ZodCheckIncludes", (inst, def) => { + $ZodCheck.init(inst, def); + const escapedRegex = escapeRegex(def.includes); + const pattern = new RegExp(typeof def.position === "number" ? `^.{${def.position}}${escapedRegex}` : escapedRegex); + def.pattern = pattern; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.includes(def.includes, def.position)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "includes", + includes: def.includes, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckStartsWith = /* @__PURE__ */ $constructor("$ZodCheckStartsWith", (inst, def) => { + $ZodCheck.init(inst, def); + const pattern = new RegExp(`^${escapeRegex(def.prefix)}.*`); + def.pattern ?? (def.pattern = pattern); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.startsWith(def.prefix)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "starts_with", + prefix: def.prefix, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckEndsWith = /* @__PURE__ */ $constructor("$ZodCheckEndsWith", (inst, def) => { + $ZodCheck.init(inst, def); + const pattern = new RegExp(`.*${escapeRegex(def.suffix)}$`); + def.pattern ?? (def.pattern = pattern); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.endsWith(def.suffix)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "ends_with", + suffix: def.suffix, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckOverwrite = /* @__PURE__ */ $constructor("$ZodCheckOverwrite", (inst, def) => { + $ZodCheck.init(inst, def); + inst._zod.check = (payload) => { + payload.value = def.tx(payload.value); + }; +}); + +// node_modules/zod/v4/core/doc.js +var Doc = class { + constructor(args = []) { + this.content = []; + this.indent = 0; + if (this) + this.args = args; + } + indented(fn) { + this.indent += 1; + fn(this); + this.indent -= 1; + } + write(arg) { + if (typeof arg === "function") { + arg(this, { execution: "sync" }); + arg(this, { execution: "async" }); + return; + } + const content = arg; + const lines = content.split("\n").filter((x) => x); + const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length)); + const dedented = lines.map((x) => x.slice(minIndent)).map((x) => " ".repeat(this.indent * 2) + x); + for (const line of dedented) { + this.content.push(line); + } + } + compile() { + const F = Function; + const args = this?.args; + const content = this?.content ?? [``]; + const lines = [...content.map((x) => ` ${x}`)]; + return new F(...args, lines.join("\n")); + } +}; + +// node_modules/zod/v4/core/versions.js +var version = { + major: 4, + minor: 0, + patch: 0 +}; + +// node_modules/zod/v4/core/schemas.js +var $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => { + var _a; + inst ?? (inst = {}); + inst._zod.def = def; + inst._zod.bag = inst._zod.bag || {}; + inst._zod.version = version; + const checks = [...inst._zod.def.checks ?? []]; + if (inst._zod.traits.has("$ZodCheck")) { + checks.unshift(inst); + } + for (const ch of checks) { + for (const fn of ch._zod.onattach) { + fn(inst); + } + } + if (checks.length === 0) { + (_a = inst._zod).deferred ?? (_a.deferred = []); + inst._zod.deferred?.push(() => { + inst._zod.run = inst._zod.parse; + }); + } else { + const runChecks = (payload, checks2, ctx) => { + let isAborted2 = aborted(payload); + let asyncResult; + for (const ch of checks2) { + if (ch._zod.def.when) { + const shouldRun = ch._zod.def.when(payload); + if (!shouldRun) + continue; + } else if (isAborted2) { + continue; + } + const currLen = payload.issues.length; + const _ = ch._zod.check(payload); + if (_ instanceof Promise && ctx?.async === false) { + throw new $ZodAsyncError(); + } + if (asyncResult || _ instanceof Promise) { + asyncResult = (asyncResult ?? Promise.resolve()).then(async () => { + await _; + const nextLen = payload.issues.length; + if (nextLen === currLen) + return; + if (!isAborted2) + isAborted2 = aborted(payload, currLen); + }); + } else { + const nextLen = payload.issues.length; + if (nextLen === currLen) + continue; + if (!isAborted2) + isAborted2 = aborted(payload, currLen); + } + } + if (asyncResult) { + return asyncResult.then(() => { + return payload; + }); + } + return payload; + }; + inst._zod.run = (payload, ctx) => { + const result = inst._zod.parse(payload, ctx); + if (result instanceof Promise) { + if (ctx.async === false) + throw new $ZodAsyncError(); + return result.then((result2) => runChecks(result2, checks, ctx)); + } + return runChecks(result, checks, ctx); + }; + } + inst["~standard"] = { + validate: (value) => { + try { + const r = safeParse(inst, value); + return r.success ? { value: r.data } : { issues: r.error?.issues }; + } catch (_) { + return safeParseAsync(inst, value).then((r) => r.success ? { value: r.data } : { issues: r.error?.issues }); + } + }, + vendor: "zod", + version: 1 + }; +}); +var $ZodString = /* @__PURE__ */ $constructor("$ZodString", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = [...inst?._zod.bag?.patterns ?? []].pop() ?? string(inst._zod.bag); + inst._zod.parse = (payload, _) => { + if (def.coerce) + try { + payload.value = String(payload.value); + } catch (_2) { + } + if (typeof payload.value === "string") + return payload; + payload.issues.push({ + expected: "string", + code: "invalid_type", + input: payload.value, + inst + }); + return payload; + }; +}); +var $ZodStringFormat = /* @__PURE__ */ $constructor("$ZodStringFormat", (inst, def) => { + $ZodCheckStringFormat.init(inst, def); + $ZodString.init(inst, def); +}); +var $ZodGUID = /* @__PURE__ */ $constructor("$ZodGUID", (inst, def) => { + def.pattern ?? (def.pattern = guid); + $ZodStringFormat.init(inst, def); +}); +var $ZodUUID = /* @__PURE__ */ $constructor("$ZodUUID", (inst, def) => { + if (def.version) { + const versionMap = { + v1: 1, + v2: 2, + v3: 3, + v4: 4, + v5: 5, + v6: 6, + v7: 7, + v8: 8 + }; + const v = versionMap[def.version]; + if (v === void 0) + throw new Error(`Invalid UUID version: "${def.version}"`); + def.pattern ?? (def.pattern = uuid(v)); + } else + def.pattern ?? (def.pattern = uuid()); + $ZodStringFormat.init(inst, def); +}); +var $ZodEmail = /* @__PURE__ */ $constructor("$ZodEmail", (inst, def) => { + def.pattern ?? (def.pattern = email); + $ZodStringFormat.init(inst, def); +}); +var $ZodURL = /* @__PURE__ */ $constructor("$ZodURL", (inst, def) => { + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + try { + const orig = payload.value; + const url = new URL(orig); + const href = url.href; + if (def.hostname) { + def.hostname.lastIndex = 0; + if (!def.hostname.test(url.hostname)) { + payload.issues.push({ + code: "invalid_format", + format: "url", + note: "Invalid hostname", + pattern: hostname.source, + input: payload.value, + inst, + continue: !def.abort + }); + } + } + if (def.protocol) { + def.protocol.lastIndex = 0; + if (!def.protocol.test(url.protocol.endsWith(":") ? url.protocol.slice(0, -1) : url.protocol)) { + payload.issues.push({ + code: "invalid_format", + format: "url", + note: "Invalid protocol", + pattern: def.protocol.source, + input: payload.value, + inst, + continue: !def.abort + }); + } + } + if (!orig.endsWith("/") && href.endsWith("/")) { + payload.value = href.slice(0, -1); + } else { + payload.value = href; + } + return; + } catch (_) { + payload.issues.push({ + code: "invalid_format", + format: "url", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; +}); +var $ZodEmoji = /* @__PURE__ */ $constructor("$ZodEmoji", (inst, def) => { + def.pattern ?? (def.pattern = emoji()); + $ZodStringFormat.init(inst, def); +}); +var $ZodNanoID = /* @__PURE__ */ $constructor("$ZodNanoID", (inst, def) => { + def.pattern ?? (def.pattern = nanoid); + $ZodStringFormat.init(inst, def); +}); +var $ZodCUID = /* @__PURE__ */ $constructor("$ZodCUID", (inst, def) => { + def.pattern ?? (def.pattern = cuid); + $ZodStringFormat.init(inst, def); +}); +var $ZodCUID2 = /* @__PURE__ */ $constructor("$ZodCUID2", (inst, def) => { + def.pattern ?? (def.pattern = cuid2); + $ZodStringFormat.init(inst, def); +}); +var $ZodULID = /* @__PURE__ */ $constructor("$ZodULID", (inst, def) => { + def.pattern ?? (def.pattern = ulid); + $ZodStringFormat.init(inst, def); +}); +var $ZodXID = /* @__PURE__ */ $constructor("$ZodXID", (inst, def) => { + def.pattern ?? (def.pattern = xid); + $ZodStringFormat.init(inst, def); +}); +var $ZodKSUID = /* @__PURE__ */ $constructor("$ZodKSUID", (inst, def) => { + def.pattern ?? (def.pattern = ksuid); + $ZodStringFormat.init(inst, def); +}); +var $ZodISODateTime = /* @__PURE__ */ $constructor("$ZodISODateTime", (inst, def) => { + def.pattern ?? (def.pattern = datetime(def)); + $ZodStringFormat.init(inst, def); +}); +var $ZodISODate = /* @__PURE__ */ $constructor("$ZodISODate", (inst, def) => { + def.pattern ?? (def.pattern = date); + $ZodStringFormat.init(inst, def); +}); +var $ZodISOTime = /* @__PURE__ */ $constructor("$ZodISOTime", (inst, def) => { + def.pattern ?? (def.pattern = time(def)); + $ZodStringFormat.init(inst, def); +}); +var $ZodISODuration = /* @__PURE__ */ $constructor("$ZodISODuration", (inst, def) => { + def.pattern ?? (def.pattern = duration); + $ZodStringFormat.init(inst, def); +}); +var $ZodIPv4 = /* @__PURE__ */ $constructor("$ZodIPv4", (inst, def) => { + def.pattern ?? (def.pattern = ipv4); + $ZodStringFormat.init(inst, def); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = `ipv4`; + }); +}); +var $ZodIPv6 = /* @__PURE__ */ $constructor("$ZodIPv6", (inst, def) => { + def.pattern ?? (def.pattern = ipv6); + $ZodStringFormat.init(inst, def); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = `ipv6`; + }); + inst._zod.check = (payload) => { + try { + new URL(`http://[${payload.value}]`); + } catch { + payload.issues.push({ + code: "invalid_format", + format: "ipv6", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; +}); +var $ZodCIDRv4 = /* @__PURE__ */ $constructor("$ZodCIDRv4", (inst, def) => { + def.pattern ?? (def.pattern = cidrv4); + $ZodStringFormat.init(inst, def); +}); +var $ZodCIDRv6 = /* @__PURE__ */ $constructor("$ZodCIDRv6", (inst, def) => { + def.pattern ?? (def.pattern = cidrv6); + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + const [address, prefix] = payload.value.split("/"); + try { + if (!prefix) + throw new Error(); + const prefixNum = Number(prefix); + if (`${prefixNum}` !== prefix) + throw new Error(); + if (prefixNum < 0 || prefixNum > 128) + throw new Error(); + new URL(`http://[${address}]`); + } catch { + payload.issues.push({ + code: "invalid_format", + format: "cidrv6", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; +}); +function isValidBase64(data) { + if (data === "") + return true; + if (data.length % 4 !== 0) + return false; + try { + atob(data); + return true; + } catch { + return false; + } +} +var $ZodBase64 = /* @__PURE__ */ $constructor("$ZodBase64", (inst, def) => { + def.pattern ?? (def.pattern = base64); + $ZodStringFormat.init(inst, def); + inst._zod.onattach.push((inst2) => { + inst2._zod.bag.contentEncoding = "base64"; + }); + inst._zod.check = (payload) => { + if (isValidBase64(payload.value)) + return; + payload.issues.push({ + code: "invalid_format", + format: "base64", + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +function isValidBase64URL(data) { + if (!base64url.test(data)) + return false; + const base642 = data.replace(/[-_]/g, (c) => c === "-" ? "+" : "/"); + const padded = base642.padEnd(Math.ceil(base642.length / 4) * 4, "="); + return isValidBase64(padded); +} +var $ZodBase64URL = /* @__PURE__ */ $constructor("$ZodBase64URL", (inst, def) => { + def.pattern ?? (def.pattern = base64url); + $ZodStringFormat.init(inst, def); + inst._zod.onattach.push((inst2) => { + inst2._zod.bag.contentEncoding = "base64url"; + }); + inst._zod.check = (payload) => { + if (isValidBase64URL(payload.value)) + return; + payload.issues.push({ + code: "invalid_format", + format: "base64url", + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodE164 = /* @__PURE__ */ $constructor("$ZodE164", (inst, def) => { + def.pattern ?? (def.pattern = e164); + $ZodStringFormat.init(inst, def); +}); +function isValidJWT2(token, algorithm = null) { + try { + const tokensParts = token.split("."); + if (tokensParts.length !== 3) + return false; + const [header] = tokensParts; + if (!header) + return false; + const parsedHeader = JSON.parse(atob(header)); + if ("typ" in parsedHeader && parsedHeader?.typ !== "JWT") + return false; + if (!parsedHeader.alg) + return false; + if (algorithm && (!("alg" in parsedHeader) || parsedHeader.alg !== algorithm)) + return false; + return true; + } catch { + return false; + } +} +var $ZodJWT = /* @__PURE__ */ $constructor("$ZodJWT", (inst, def) => { + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + if (isValidJWT2(payload.value, def.alg)) + return; + payload.issues.push({ + code: "invalid_format", + format: "jwt", + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodNumber = /* @__PURE__ */ $constructor("$ZodNumber", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = inst._zod.bag.pattern ?? number; + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) + try { + payload.value = Number(payload.value); + } catch (_) { + } + const input = payload.value; + if (typeof input === "number" && !Number.isNaN(input) && Number.isFinite(input)) { + return payload; + } + const received = typeof input === "number" ? Number.isNaN(input) ? "NaN" : !Number.isFinite(input) ? "Infinity" : void 0 : void 0; + payload.issues.push({ + expected: "number", + code: "invalid_type", + input, + inst, + ...received ? { received } : {} + }); + return payload; + }; +}); +var $ZodNumberFormat = /* @__PURE__ */ $constructor("$ZodNumber", (inst, def) => { + $ZodCheckNumberFormat.init(inst, def); + $ZodNumber.init(inst, def); +}); +var $ZodBoolean = /* @__PURE__ */ $constructor("$ZodBoolean", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = boolean; + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) + try { + payload.value = Boolean(payload.value); + } catch (_) { + } + const input = payload.value; + if (typeof input === "boolean") + return payload; + payload.issues.push({ + expected: "boolean", + code: "invalid_type", + input, + inst + }); + return payload; + }; +}); +var $ZodNull = /* @__PURE__ */ $constructor("$ZodNull", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = _null; + inst._zod.values = /* @__PURE__ */ new Set([null]); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (input === null) + return payload; + payload.issues.push({ + expected: "null", + code: "invalid_type", + input, + inst + }); + return payload; + }; +}); +var $ZodUnknown = /* @__PURE__ */ $constructor("$ZodUnknown", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload) => payload; +}); +var $ZodNever = /* @__PURE__ */ $constructor("$ZodNever", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + payload.issues.push({ + expected: "never", + code: "invalid_type", + input: payload.value, + inst + }); + return payload; + }; +}); +function handleArrayResult(result, final, index) { + if (result.issues.length) { + final.issues.push(...prefixIssues(index, result.issues)); + } + final.value[index] = result.value; +} +var $ZodArray = /* @__PURE__ */ $constructor("$ZodArray", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!Array.isArray(input)) { + payload.issues.push({ + expected: "array", + code: "invalid_type", + input, + inst + }); + return payload; + } + payload.value = Array(input.length); + const proms = []; + for (let i = 0; i < input.length; i++) { + const item = input[i]; + const result = def.element._zod.run({ + value: item, + issues: [] + }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleArrayResult(result2, payload, i))); + } else { + handleArrayResult(result, payload, i); + } + } + if (proms.length) { + return Promise.all(proms).then(() => payload); + } + return payload; + }; +}); +function handleObjectResult(result, final, key) { + if (result.issues.length) { + final.issues.push(...prefixIssues(key, result.issues)); + } + final.value[key] = result.value; +} +function handleOptionalObjectResult(result, final, key, input) { + if (result.issues.length) { + if (input[key] === void 0) { + if (key in input) { + final.value[key] = void 0; + } else { + final.value[key] = result.value; + } + } else { + final.issues.push(...prefixIssues(key, result.issues)); + } + } else if (result.value === void 0) { + if (key in input) + final.value[key] = void 0; + } else { + final.value[key] = result.value; + } +} +var $ZodObject = /* @__PURE__ */ $constructor("$ZodObject", (inst, def) => { + $ZodType.init(inst, def); + const _normalized = cached(() => { + const keys = Object.keys(def.shape); + for (const k of keys) { + if (!(def.shape[k] instanceof $ZodType)) { + throw new Error(`Invalid element at key "${k}": expected a Zod schema`); + } + } + const okeys = optionalKeys(def.shape); + return { + shape: def.shape, + keys, + keySet: new Set(keys), + numKeys: keys.length, + optionalKeys: new Set(okeys) + }; + }); + defineLazy(inst._zod, "propValues", () => { + const shape = def.shape; + const propValues = {}; + for (const key in shape) { + const field = shape[key]._zod; + if (field.values) { + propValues[key] ?? (propValues[key] = /* @__PURE__ */ new Set()); + for (const v of field.values) + propValues[key].add(v); + } + } + return propValues; + }); + const generateFastpass = (shape) => { + const doc = new Doc(["shape", "payload", "ctx"]); + const normalized = _normalized.value; + const parseStr = (key) => { + const k = esc(key); + return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`; + }; + doc.write(`const input = payload.value;`); + const ids = /* @__PURE__ */ Object.create(null); + let counter = 0; + for (const key of normalized.keys) { + ids[key] = `key_${counter++}`; + } + doc.write(`const newResult = {}`); + for (const key of normalized.keys) { + if (normalized.optionalKeys.has(key)) { + const id = ids[key]; + doc.write(`const ${id} = ${parseStr(key)};`); + const k = esc(key); + doc.write(` + if (${id}.issues.length) { + if (input[${k}] === undefined) { + if (${k} in input) { + newResult[${k}] = undefined; + } + } else { + payload.issues = payload.issues.concat( + ${id}.issues.map((iss) => ({ + ...iss, + path: iss.path ? [${k}, ...iss.path] : [${k}], + })) + ); + } + } else if (${id}.value === undefined) { + if (${k} in input) newResult[${k}] = undefined; + } else { + newResult[${k}] = ${id}.value; + } + `); + } else { + const id = ids[key]; + doc.write(`const ${id} = ${parseStr(key)};`); + doc.write(` + if (${id}.issues.length) payload.issues = payload.issues.concat(${id}.issues.map(iss => ({ + ...iss, + path: iss.path ? [${esc(key)}, ...iss.path] : [${esc(key)}] + })));`); + doc.write(`newResult[${esc(key)}] = ${id}.value`); + } + } + doc.write(`payload.value = newResult;`); + doc.write(`return payload;`); + const fn = doc.compile(); + return (payload, ctx) => fn(shape, payload, ctx); + }; + let fastpass; + const isObject2 = isObject; + const jit = !globalConfig.jitless; + const allowsEval2 = allowsEval; + const fastEnabled = jit && allowsEval2.value; + const catchall = def.catchall; + let value; + inst._zod.parse = (payload, ctx) => { + value ?? (value = _normalized.value); + const input = payload.value; + if (!isObject2(input)) { + payload.issues.push({ + expected: "object", + code: "invalid_type", + input, + inst + }); + return payload; + } + const proms = []; + if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) { + if (!fastpass) + fastpass = generateFastpass(def.shape); + payload = fastpass(payload, ctx); + } else { + payload.value = {}; + const shape = value.shape; + for (const key of value.keys) { + const el = shape[key]; + const r = el._zod.run({ value: input[key], issues: [] }, ctx); + const isOptional = el._zod.optin === "optional" && el._zod.optout === "optional"; + if (r instanceof Promise) { + proms.push(r.then((r2) => isOptional ? handleOptionalObjectResult(r2, payload, key, input) : handleObjectResult(r2, payload, key))); + } else if (isOptional) { + handleOptionalObjectResult(r, payload, key, input); + } else { + handleObjectResult(r, payload, key); + } + } + } + if (!catchall) { + return proms.length ? Promise.all(proms).then(() => payload) : payload; + } + const unrecognized = []; + const keySet = value.keySet; + const _catchall = catchall._zod; + const t = _catchall.def.type; + for (const key of Object.keys(input)) { + if (keySet.has(key)) + continue; + if (t === "never") { + unrecognized.push(key); + continue; + } + const r = _catchall.run({ value: input[key], issues: [] }, ctx); + if (r instanceof Promise) { + proms.push(r.then((r2) => handleObjectResult(r2, payload, key))); + } else { + handleObjectResult(r, payload, key); + } + } + if (unrecognized.length) { + payload.issues.push({ + code: "unrecognized_keys", + keys: unrecognized, + input, + inst + }); + } + if (!proms.length) + return payload; + return Promise.all(proms).then(() => { + return payload; + }); + }; +}); +function handleUnionResults(results, final, inst, ctx) { + for (const result of results) { + if (result.issues.length === 0) { + final.value = result.value; + return final; + } + } + final.issues.push({ + code: "invalid_union", + input: final.value, + inst, + errors: results.map((result) => result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + }); + return final; +} +var $ZodUnion = /* @__PURE__ */ $constructor("$ZodUnion", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "optin", () => def.options.some((o) => o._zod.optin === "optional") ? "optional" : void 0); + defineLazy(inst._zod, "optout", () => def.options.some((o) => o._zod.optout === "optional") ? "optional" : void 0); + defineLazy(inst._zod, "values", () => { + if (def.options.every((o) => o._zod.values)) { + return new Set(def.options.flatMap((option) => Array.from(option._zod.values))); + } + return void 0; + }); + defineLazy(inst._zod, "pattern", () => { + if (def.options.every((o) => o._zod.pattern)) { + const patterns = def.options.map((o) => o._zod.pattern); + return new RegExp(`^(${patterns.map((p) => cleanRegex(p.source)).join("|")})$`); + } + return void 0; + }); + inst._zod.parse = (payload, ctx) => { + let async = false; + const results = []; + for (const option of def.options) { + const result = option._zod.run({ + value: payload.value, + issues: [] + }, ctx); + if (result instanceof Promise) { + results.push(result); + async = true; + } else { + if (result.issues.length === 0) + return result; + results.push(result); + } + } + if (!async) + return handleUnionResults(results, payload, inst, ctx); + return Promise.all(results).then((results2) => { + return handleUnionResults(results2, payload, inst, ctx); + }); + }; +}); +var $ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("$ZodDiscriminatedUnion", (inst, def) => { + $ZodUnion.init(inst, def); + const _super = inst._zod.parse; + defineLazy(inst._zod, "propValues", () => { + const propValues = {}; + for (const option of def.options) { + const pv = option._zod.propValues; + if (!pv || Object.keys(pv).length === 0) + throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(option)}"`); + for (const [k, v] of Object.entries(pv)) { + if (!propValues[k]) + propValues[k] = /* @__PURE__ */ new Set(); + for (const val of v) { + propValues[k].add(val); + } + } + } + return propValues; + }); + const disc = cached(() => { + const opts = def.options; + const map = /* @__PURE__ */ new Map(); + for (const o of opts) { + const values = o._zod.propValues[def.discriminator]; + if (!values || values.size === 0) + throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(o)}"`); + for (const v of values) { + if (map.has(v)) { + throw new Error(`Duplicate discriminator value "${String(v)}"`); + } + map.set(v, o); + } + } + return map; + }); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!isObject(input)) { + payload.issues.push({ + code: "invalid_type", + expected: "object", + input, + inst + }); + return payload; + } + const opt = disc.value.get(input?.[def.discriminator]); + if (opt) { + return opt._zod.run(payload, ctx); + } + if (def.unionFallback) { + return _super(payload, ctx); + } + payload.issues.push({ + code: "invalid_union", + errors: [], + note: "No matching discriminator", + input, + path: [def.discriminator], + inst + }); + return payload; + }; +}); +var $ZodIntersection = /* @__PURE__ */ $constructor("$ZodIntersection", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + const left = def.left._zod.run({ value: input, issues: [] }, ctx); + const right = def.right._zod.run({ value: input, issues: [] }, ctx); + const async = left instanceof Promise || right instanceof Promise; + if (async) { + return Promise.all([left, right]).then(([left2, right2]) => { + return handleIntersectionResults(payload, left2, right2); + }); + } + return handleIntersectionResults(payload, left, right); + }; +}); +function mergeValues2(a, b) { + if (a === b) { + return { valid: true, data: a }; + } + if (a instanceof Date && b instanceof Date && +a === +b) { + return { valid: true, data: a }; + } + if (isPlainObject(a) && isPlainObject(b)) { + const bKeys = Object.keys(b); + const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues2(a[key], b[key]); + if (!sharedValue.valid) { + return { + valid: false, + mergeErrorPath: [key, ...sharedValue.mergeErrorPath] + }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; + } + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) { + return { valid: false, mergeErrorPath: [] }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues2(itemA, itemB); + if (!sharedValue.valid) { + return { + valid: false, + mergeErrorPath: [index, ...sharedValue.mergeErrorPath] + }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; + } + return { valid: false, mergeErrorPath: [] }; +} +function handleIntersectionResults(result, left, right) { + if (left.issues.length) { + result.issues.push(...left.issues); + } + if (right.issues.length) { + result.issues.push(...right.issues); + } + if (aborted(result)) + return result; + const merged = mergeValues2(left.value, right.value); + if (!merged.valid) { + throw new Error(`Unmergable intersection. Error path: ${JSON.stringify(merged.mergeErrorPath)}`); + } + result.value = merged.data; + return result; +} +var $ZodRecord = /* @__PURE__ */ $constructor("$ZodRecord", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!isPlainObject(input)) { + payload.issues.push({ + expected: "record", + code: "invalid_type", + input, + inst + }); + return payload; + } + const proms = []; + if (def.keyType._zod.values) { + const values = def.keyType._zod.values; + payload.value = {}; + for (const key of values) { + if (typeof key === "string" || typeof key === "number" || typeof key === "symbol") { + const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => { + if (result2.issues.length) { + payload.issues.push(...prefixIssues(key, result2.issues)); + } + payload.value[key] = result2.value; + })); + } else { + if (result.issues.length) { + payload.issues.push(...prefixIssues(key, result.issues)); + } + payload.value[key] = result.value; + } + } + } + let unrecognized; + for (const key in input) { + if (!values.has(key)) { + unrecognized = unrecognized ?? []; + unrecognized.push(key); + } + } + if (unrecognized && unrecognized.length > 0) { + payload.issues.push({ + code: "unrecognized_keys", + input, + inst, + keys: unrecognized + }); + } + } else { + payload.value = {}; + for (const key of Reflect.ownKeys(input)) { + if (key === "__proto__") + continue; + const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx); + if (keyResult instanceof Promise) { + throw new Error("Async schemas not supported in object keys currently"); + } + if (keyResult.issues.length) { + payload.issues.push({ + origin: "record", + code: "invalid_key", + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())), + input: key, + path: [key], + inst + }); + payload.value[keyResult.value] = keyResult.value; + continue; + } + const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => { + if (result2.issues.length) { + payload.issues.push(...prefixIssues(key, result2.issues)); + } + payload.value[keyResult.value] = result2.value; + })); + } else { + if (result.issues.length) { + payload.issues.push(...prefixIssues(key, result.issues)); + } + payload.value[keyResult.value] = result.value; + } + } + } + if (proms.length) { + return Promise.all(proms).then(() => payload); + } + return payload; + }; +}); +var $ZodEnum = /* @__PURE__ */ $constructor("$ZodEnum", (inst, def) => { + $ZodType.init(inst, def); + const values = getEnumValues(def.entries); + inst._zod.values = new Set(values); + inst._zod.pattern = new RegExp(`^(${values.filter((k) => propertyKeyTypes.has(typeof k)).map((o) => typeof o === "string" ? escapeRegex(o) : o.toString()).join("|")})$`); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (inst._zod.values.has(input)) { + return payload; + } + payload.issues.push({ + code: "invalid_value", + values, + input, + inst + }); + return payload; + }; +}); +var $ZodLiteral = /* @__PURE__ */ $constructor("$ZodLiteral", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.values = new Set(def.values); + inst._zod.pattern = new RegExp(`^(${def.values.map((o) => typeof o === "string" ? escapeRegex(o) : o ? o.toString() : String(o)).join("|")})$`); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (inst._zod.values.has(input)) { + return payload; + } + payload.issues.push({ + code: "invalid_value", + values: def.values, + input, + inst + }); + return payload; + }; +}); +var $ZodTransform = /* @__PURE__ */ $constructor("$ZodTransform", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + const _out = def.transform(payload.value, payload); + if (_ctx.async) { + const output = _out instanceof Promise ? _out : Promise.resolve(_out); + return output.then((output2) => { + payload.value = output2; + return payload; + }); + } + if (_out instanceof Promise) { + throw new $ZodAsyncError(); + } + payload.value = _out; + return payload; + }; +}); +var $ZodOptional = /* @__PURE__ */ $constructor("$ZodOptional", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + inst._zod.optout = "optional"; + defineLazy(inst._zod, "values", () => { + return def.innerType._zod.values ? /* @__PURE__ */ new Set([...def.innerType._zod.values, void 0]) : void 0; + }); + defineLazy(inst._zod, "pattern", () => { + const pattern = def.innerType._zod.pattern; + return pattern ? new RegExp(`^(${cleanRegex(pattern.source)})?$`) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + if (def.innerType._zod.optin === "optional") { + return def.innerType._zod.run(payload, ctx); + } + if (payload.value === void 0) { + return payload; + } + return def.innerType._zod.run(payload, ctx); + }; +}); +var $ZodNullable = /* @__PURE__ */ $constructor("$ZodNullable", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "optin", () => def.innerType._zod.optin); + defineLazy(inst._zod, "optout", () => def.innerType._zod.optout); + defineLazy(inst._zod, "pattern", () => { + const pattern = def.innerType._zod.pattern; + return pattern ? new RegExp(`^(${cleanRegex(pattern.source)}|null)$`) : void 0; + }); + defineLazy(inst._zod, "values", () => { + return def.innerType._zod.values ? /* @__PURE__ */ new Set([...def.innerType._zod.values, null]) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + if (payload.value === null) + return payload; + return def.innerType._zod.run(payload, ctx); + }; +}); +var $ZodDefault = /* @__PURE__ */ $constructor("$ZodDefault", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + if (payload.value === void 0) { + payload.value = def.defaultValue; + return payload; + } + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => handleDefaultResult(result2, def)); + } + return handleDefaultResult(result, def); + }; +}); +function handleDefaultResult(payload, def) { + if (payload.value === void 0) { + payload.value = def.defaultValue; + } + return payload; +} +var $ZodPrefault = /* @__PURE__ */ $constructor("$ZodPrefault", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + if (payload.value === void 0) { + payload.value = def.defaultValue; + } + return def.innerType._zod.run(payload, ctx); + }; +}); +var $ZodNonOptional = /* @__PURE__ */ $constructor("$ZodNonOptional", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "values", () => { + const v = def.innerType._zod.values; + return v ? new Set([...v].filter((x) => x !== void 0)) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => handleNonOptionalResult(result2, inst)); + } + return handleNonOptionalResult(result, inst); + }; +}); +function handleNonOptionalResult(payload, inst) { + if (!payload.issues.length && payload.value === void 0) { + payload.issues.push({ + code: "invalid_type", + expected: "nonoptional", + input: payload.value, + inst + }); + } + return payload; +} +var $ZodCatch = /* @__PURE__ */ $constructor("$ZodCatch", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + defineLazy(inst._zod, "optout", () => def.innerType._zod.optout); + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => { + payload.value = result2.value; + if (result2.issues.length) { + payload.value = def.catchValue({ + ...payload, + error: { + issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }, + input: payload.value + }); + payload.issues = []; + } + return payload; + }); + } + payload.value = result.value; + if (result.issues.length) { + payload.value = def.catchValue({ + ...payload, + error: { + issues: result.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }, + input: payload.value + }); + payload.issues = []; + } + return payload; + }; +}); +var $ZodPipe = /* @__PURE__ */ $constructor("$ZodPipe", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "values", () => def.in._zod.values); + defineLazy(inst._zod, "optin", () => def.in._zod.optin); + defineLazy(inst._zod, "optout", () => def.out._zod.optout); + inst._zod.parse = (payload, ctx) => { + const left = def.in._zod.run(payload, ctx); + if (left instanceof Promise) { + return left.then((left2) => handlePipeResult(left2, def, ctx)); + } + return handlePipeResult(left, def, ctx); + }; +}); +function handlePipeResult(left, def, ctx) { + if (aborted(left)) { + return left; + } + return def.out._zod.run({ value: left.value, issues: left.issues }, ctx); +} +var $ZodReadonly = /* @__PURE__ */ $constructor("$ZodReadonly", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "propValues", () => def.innerType._zod.propValues); + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + defineLazy(inst._zod, "optin", () => def.innerType._zod.optin); + defineLazy(inst._zod, "optout", () => def.innerType._zod.optout); + inst._zod.parse = (payload, ctx) => { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then(handleReadonlyResult); + } + return handleReadonlyResult(result); + }; +}); +function handleReadonlyResult(payload) { + payload.value = Object.freeze(payload.value); + return payload; +} +var $ZodCustom = /* @__PURE__ */ $constructor("$ZodCustom", (inst, def) => { + $ZodCheck.init(inst, def); + $ZodType.init(inst, def); + inst._zod.parse = (payload, _) => { + return payload; + }; + inst._zod.check = (payload) => { + const input = payload.value; + const r = def.fn(input); + if (r instanceof Promise) { + return r.then((r2) => handleRefineResult(r2, payload, input, inst)); + } + handleRefineResult(r, payload, input, inst); + return; + }; +}); +function handleRefineResult(result, payload, input, inst) { + if (!result) { + const _iss = { + code: "custom", + input, + inst, + // incorporates params.error into issue reporting + path: [...inst._zod.def.path ?? []], + // incorporates params.error into issue reporting + continue: !inst._zod.def.abort + // params: inst._zod.def.params, + }; + if (inst._zod.def.params) + _iss.params = inst._zod.def.params; + payload.issues.push(issue(_iss)); + } +} + +// node_modules/zod/v4/locales/en.js +var parsedType = (data) => { + const t = typeof data; + switch (t) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t; +}; +var error = () => { + const Sizable = { + string: { unit: "characters", verb: "to have" }, + file: { unit: "bytes", verb: "to have" }, + array: { unit: "items", verb: "to have" }, + set: { unit: "items", verb: "to have" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const Nouns = { + regex: "input", + email: "email address", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datetime", + date: "ISO date", + time: "ISO time", + duration: "ISO duration", + ipv4: "IPv4 address", + ipv6: "IPv6 address", + cidrv4: "IPv4 range", + cidrv6: "IPv6 range", + base64: "base64-encoded string", + base64url: "base64url-encoded string", + json_string: "JSON string", + e164: "E.164 number", + jwt: "JWT", + template_literal: "input" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Invalid input: expected ${issue2.expected}, received ${parsedType(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Invalid input: expected ${stringifyPrimitive(issue2.values[0])}`; + return `Invalid option: expected one of ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Too big: expected ${issue2.origin ?? "value"} to have ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elements"}`; + return `Too big: expected ${issue2.origin ?? "value"} to be ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Too small: expected ${issue2.origin} to have ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Too small: expected ${issue2.origin} to be ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Invalid string: must start with "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Invalid string: must end with "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Invalid string: must include "${_issue.includes}"`; + if (_issue.format === "regex") + return `Invalid string: must match pattern ${_issue.pattern}`; + return `Invalid ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Invalid number: must be a multiple of ${issue2.divisor}`; + case "unrecognized_keys": + return `Unrecognized key${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Invalid key in ${issue2.origin}`; + case "invalid_union": + return "Invalid input"; + case "invalid_element": + return `Invalid value in ${issue2.origin}`; + default: + return `Invalid input`; + } + }; +}; +function en_default2() { + return { + localeError: error() + }; +} + +// node_modules/zod/v4/core/registries.js +var $output = Symbol("ZodOutput"); +var $input = Symbol("ZodInput"); +var $ZodRegistry = class { + constructor() { + this._map = /* @__PURE__ */ new Map(); + this._idmap = /* @__PURE__ */ new Map(); + } + add(schema, ..._meta) { + const meta = _meta[0]; + this._map.set(schema, meta); + if (meta && typeof meta === "object" && "id" in meta) { + if (this._idmap.has(meta.id)) { + throw new Error(`ID ${meta.id} already exists in the registry`); + } + this._idmap.set(meta.id, schema); + } + return this; + } + clear() { + this._map = /* @__PURE__ */ new Map(); + this._idmap = /* @__PURE__ */ new Map(); + return this; + } + remove(schema) { + const meta = this._map.get(schema); + if (meta && typeof meta === "object" && "id" in meta) { + this._idmap.delete(meta.id); + } + this._map.delete(schema); + return this; + } + get(schema) { + const p = schema._zod.parent; + if (p) { + const pm = { ...this.get(p) ?? {} }; + delete pm.id; + return { ...pm, ...this._map.get(schema) }; + } + return this._map.get(schema); + } + has(schema) { + return this._map.has(schema); + } +}; +function registry() { + return new $ZodRegistry(); +} +var globalRegistry = /* @__PURE__ */ registry(); + +// node_modules/zod/v4/core/api.js +function _string(Class2, params) { + return new Class2({ + type: "string", + ...normalizeParams(params) + }); +} +function _email(Class2, params) { + return new Class2({ + type: "string", + format: "email", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _guid(Class2, params) { + return new Class2({ + type: "string", + format: "guid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _uuid(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _uuidv4(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v4", + ...normalizeParams(params) + }); +} +function _uuidv6(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v6", + ...normalizeParams(params) + }); +} +function _uuidv7(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v7", + ...normalizeParams(params) + }); +} +function _url(Class2, params) { + return new Class2({ + type: "string", + format: "url", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _emoji2(Class2, params) { + return new Class2({ + type: "string", + format: "emoji", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _nanoid(Class2, params) { + return new Class2({ + type: "string", + format: "nanoid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _cuid(Class2, params) { + return new Class2({ + type: "string", + format: "cuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _cuid2(Class2, params) { + return new Class2({ + type: "string", + format: "cuid2", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _ulid(Class2, params) { + return new Class2({ + type: "string", + format: "ulid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _xid(Class2, params) { + return new Class2({ + type: "string", + format: "xid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _ksuid(Class2, params) { + return new Class2({ + type: "string", + format: "ksuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _ipv4(Class2, params) { + return new Class2({ + type: "string", + format: "ipv4", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _ipv6(Class2, params) { + return new Class2({ + type: "string", + format: "ipv6", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _cidrv4(Class2, params) { + return new Class2({ + type: "string", + format: "cidrv4", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _cidrv6(Class2, params) { + return new Class2({ + type: "string", + format: "cidrv6", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _base64(Class2, params) { + return new Class2({ + type: "string", + format: "base64", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _base64url(Class2, params) { + return new Class2({ + type: "string", + format: "base64url", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _e164(Class2, params) { + return new Class2({ + type: "string", + format: "e164", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _jwt(Class2, params) { + return new Class2({ + type: "string", + format: "jwt", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +function _isoDateTime(Class2, params) { + return new Class2({ + type: "string", + format: "datetime", + check: "string_format", + offset: false, + local: false, + precision: null, + ...normalizeParams(params) + }); +} +function _isoDate(Class2, params) { + return new Class2({ + type: "string", + format: "date", + check: "string_format", + ...normalizeParams(params) + }); +} +function _isoTime(Class2, params) { + return new Class2({ + type: "string", + format: "time", + check: "string_format", + precision: null, + ...normalizeParams(params) + }); +} +function _isoDuration(Class2, params) { + return new Class2({ + type: "string", + format: "duration", + check: "string_format", + ...normalizeParams(params) + }); +} +function _number(Class2, params) { + return new Class2({ + type: "number", + checks: [], + ...normalizeParams(params) + }); +} +function _int(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "safeint", + ...normalizeParams(params) + }); +} +function _boolean(Class2, params) { + return new Class2({ + type: "boolean", + ...normalizeParams(params) + }); +} +function _null2(Class2, params) { + return new Class2({ + type: "null", + ...normalizeParams(params) + }); +} +function _unknown(Class2) { + return new Class2({ + type: "unknown" + }); +} +function _never(Class2, params) { + return new Class2({ + type: "never", + ...normalizeParams(params) + }); +} +function _lt(value, params) { + return new $ZodCheckLessThan({ + check: "less_than", + ...normalizeParams(params), + value, + inclusive: false + }); +} +function _lte(value, params) { + return new $ZodCheckLessThan({ + check: "less_than", + ...normalizeParams(params), + value, + inclusive: true + }); +} +function _gt(value, params) { + return new $ZodCheckGreaterThan({ + check: "greater_than", + ...normalizeParams(params), + value, + inclusive: false + }); +} +function _gte(value, params) { + return new $ZodCheckGreaterThan({ + check: "greater_than", + ...normalizeParams(params), + value, + inclusive: true + }); +} +function _multipleOf(value, params) { + return new $ZodCheckMultipleOf({ + check: "multiple_of", + ...normalizeParams(params), + value + }); +} +function _maxLength(maximum, params) { + const ch = new $ZodCheckMaxLength({ + check: "max_length", + ...normalizeParams(params), + maximum + }); + return ch; +} +function _minLength(minimum, params) { + return new $ZodCheckMinLength({ + check: "min_length", + ...normalizeParams(params), + minimum + }); +} +function _length(length, params) { + return new $ZodCheckLengthEquals({ + check: "length_equals", + ...normalizeParams(params), + length + }); +} +function _regex(pattern, params) { + return new $ZodCheckRegex({ + check: "string_format", + format: "regex", + ...normalizeParams(params), + pattern + }); +} +function _lowercase(params) { + return new $ZodCheckLowerCase({ + check: "string_format", + format: "lowercase", + ...normalizeParams(params) + }); +} +function _uppercase(params) { + return new $ZodCheckUpperCase({ + check: "string_format", + format: "uppercase", + ...normalizeParams(params) + }); +} +function _includes(includes, params) { + return new $ZodCheckIncludes({ + check: "string_format", + format: "includes", + ...normalizeParams(params), + includes + }); +} +function _startsWith(prefix, params) { + return new $ZodCheckStartsWith({ + check: "string_format", + format: "starts_with", + ...normalizeParams(params), + prefix + }); +} +function _endsWith(suffix, params) { + return new $ZodCheckEndsWith({ + check: "string_format", + format: "ends_with", + ...normalizeParams(params), + suffix + }); +} +function _overwrite(tx) { + return new $ZodCheckOverwrite({ + check: "overwrite", + tx + }); +} +function _normalize(form) { + return _overwrite((input) => input.normalize(form)); +} +function _trim() { + return _overwrite((input) => input.trim()); +} +function _toLowerCase() { + return _overwrite((input) => input.toLowerCase()); +} +function _toUpperCase() { + return _overwrite((input) => input.toUpperCase()); +} +function _array(Class2, element, params) { + return new Class2({ + type: "array", + element, + // get element() { + // return element; + // }, + ...normalizeParams(params) + }); +} +function _custom(Class2, fn, _params) { + const norm = normalizeParams(_params); + norm.abort ?? (norm.abort = true); + const schema = new Class2({ + type: "custom", + check: "custom", + fn, + ...norm + }); + return schema; +} +function _refine(Class2, fn, _params) { + const schema = new Class2({ + type: "custom", + check: "custom", + fn, + ...normalizeParams(_params) + }); + return schema; +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js +function isZ4Schema(s) { + const schema = s; + return !!schema._zod; +} +function safeParse2(schema, data) { + if (isZ4Schema(schema)) { + const result2 = safeParse(schema, data); + return result2; + } + const v3Schema = schema; + const result = v3Schema.safeParse(data); + return result; +} +function getObjectShape(schema) { + if (!schema) + return void 0; + let rawShape; + if (isZ4Schema(schema)) { + const v4Schema = schema; + rawShape = v4Schema._zod?.def?.shape; + } else { + const v3Schema = schema; + rawShape = v3Schema.shape; + } + if (!rawShape) + return void 0; + if (typeof rawShape === "function") { + try { + return rawShape(); + } catch { + return void 0; + } + } + return rawShape; +} +function getLiteralValue(schema) { + if (isZ4Schema(schema)) { + const v4Schema = schema; + const def2 = v4Schema._zod?.def; + if (def2) { + if (def2.value !== void 0) + return def2.value; + if (Array.isArray(def2.values) && def2.values.length > 0) { + return def2.values[0]; + } + } + } + const v3Schema = schema; + const def = v3Schema._def; + if (def) { + if (def.value !== void 0) + return def.value; + if (Array.isArray(def.values) && def.values.length > 0) { + return def.values[0]; + } + } + const directValue = schema.value; + if (directValue !== void 0) + return directValue; + return void 0; +} + +// node_modules/zod/v4/classic/iso.js +var iso_exports = {}; +__export(iso_exports, { + ZodISODate: () => ZodISODate, + ZodISODateTime: () => ZodISODateTime, + ZodISODuration: () => ZodISODuration, + ZodISOTime: () => ZodISOTime, + date: () => date2, + datetime: () => datetime2, + duration: () => duration2, + time: () => time2 +}); +var ZodISODateTime = /* @__PURE__ */ $constructor("ZodISODateTime", (inst, def) => { + $ZodISODateTime.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function datetime2(params) { + return _isoDateTime(ZodISODateTime, params); +} +var ZodISODate = /* @__PURE__ */ $constructor("ZodISODate", (inst, def) => { + $ZodISODate.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function date2(params) { + return _isoDate(ZodISODate, params); +} +var ZodISOTime = /* @__PURE__ */ $constructor("ZodISOTime", (inst, def) => { + $ZodISOTime.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function time2(params) { + return _isoTime(ZodISOTime, params); +} +var ZodISODuration = /* @__PURE__ */ $constructor("ZodISODuration", (inst, def) => { + $ZodISODuration.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function duration2(params) { + return _isoDuration(ZodISODuration, params); +} + +// node_modules/zod/v4/classic/errors.js +var initializer2 = (inst, issues) => { + $ZodError.init(inst, issues); + inst.name = "ZodError"; + Object.defineProperties(inst, { + format: { + value: (mapper) => formatError(inst, mapper) + // enumerable: false, + }, + flatten: { + value: (mapper) => flattenError(inst, mapper) + // enumerable: false, + }, + addIssue: { + value: (issue2) => inst.issues.push(issue2) + // enumerable: false, + }, + addIssues: { + value: (issues2) => inst.issues.push(...issues2) + // enumerable: false, + }, + isEmpty: { + get() { + return inst.issues.length === 0; + } + // enumerable: false, + } + }); +}; +var ZodError2 = $constructor("ZodError", initializer2); +var ZodRealError = $constructor("ZodError", initializer2, { + Parent: Error +}); + +// node_modules/zod/v4/classic/parse.js +var parse2 = /* @__PURE__ */ _parse(ZodRealError); +var parseAsync2 = /* @__PURE__ */ _parseAsync(ZodRealError); +var safeParse3 = /* @__PURE__ */ _safeParse(ZodRealError); +var safeParseAsync2 = /* @__PURE__ */ _safeParseAsync(ZodRealError); + +// node_modules/zod/v4/classic/schemas.js +var ZodType2 = /* @__PURE__ */ $constructor("ZodType", (inst, def) => { + $ZodType.init(inst, def); + inst.def = def; + Object.defineProperty(inst, "_def", { value: def }); + inst.check = (...checks) => { + return inst.clone( + { + ...def, + checks: [ + ...def.checks ?? [], + ...checks.map((ch) => typeof ch === "function" ? { _zod: { check: ch, def: { check: "custom" }, onattach: [] } } : ch) + ] + } + // { parent: true } + ); + }; + inst.clone = (def2, params) => clone(inst, def2, params); + inst.brand = () => inst; + inst.register = (reg, meta) => { + reg.add(inst, meta); + return inst; + }; + inst.parse = (data, params) => parse2(inst, data, params, { callee: inst.parse }); + inst.safeParse = (data, params) => safeParse3(inst, data, params); + inst.parseAsync = async (data, params) => parseAsync2(inst, data, params, { callee: inst.parseAsync }); + inst.safeParseAsync = async (data, params) => safeParseAsync2(inst, data, params); + inst.spa = inst.safeParseAsync; + inst.refine = (check2, params) => inst.check(refine(check2, params)); + inst.superRefine = (refinement) => inst.check(superRefine(refinement)); + inst.overwrite = (fn) => inst.check(_overwrite(fn)); + inst.optional = () => optional(inst); + inst.nullable = () => nullable(inst); + inst.nullish = () => optional(nullable(inst)); + inst.nonoptional = (params) => nonoptional(inst, params); + inst.array = () => array(inst); + inst.or = (arg) => union([inst, arg]); + inst.and = (arg) => intersection(inst, arg); + inst.transform = (tx) => pipe(inst, transform(tx)); + inst.default = (def2) => _default(inst, def2); + inst.prefault = (def2) => prefault(inst, def2); + inst.catch = (params) => _catch(inst, params); + inst.pipe = (target) => pipe(inst, target); + inst.readonly = () => readonly(inst); + inst.describe = (description) => { + const cl = inst.clone(); + globalRegistry.add(cl, { description }); + return cl; + }; + Object.defineProperty(inst, "description", { + get() { + return globalRegistry.get(inst)?.description; + }, + configurable: true + }); + inst.meta = (...args) => { + if (args.length === 0) { + return globalRegistry.get(inst); + } + const cl = inst.clone(); + globalRegistry.add(cl, args[0]); + return cl; + }; + inst.isOptional = () => inst.safeParse(void 0).success; + inst.isNullable = () => inst.safeParse(null).success; + return inst; +}); +var _ZodString = /* @__PURE__ */ $constructor("_ZodString", (inst, def) => { + $ZodString.init(inst, def); + ZodType2.init(inst, def); + const bag = inst._zod.bag; + inst.format = bag.format ?? null; + inst.minLength = bag.minimum ?? null; + inst.maxLength = bag.maximum ?? null; + inst.regex = (...args) => inst.check(_regex(...args)); + inst.includes = (...args) => inst.check(_includes(...args)); + inst.startsWith = (...args) => inst.check(_startsWith(...args)); + inst.endsWith = (...args) => inst.check(_endsWith(...args)); + inst.min = (...args) => inst.check(_minLength(...args)); + inst.max = (...args) => inst.check(_maxLength(...args)); + inst.length = (...args) => inst.check(_length(...args)); + inst.nonempty = (...args) => inst.check(_minLength(1, ...args)); + inst.lowercase = (params) => inst.check(_lowercase(params)); + inst.uppercase = (params) => inst.check(_uppercase(params)); + inst.trim = () => inst.check(_trim()); + inst.normalize = (...args) => inst.check(_normalize(...args)); + inst.toLowerCase = () => inst.check(_toLowerCase()); + inst.toUpperCase = () => inst.check(_toUpperCase()); +}); +var ZodString2 = /* @__PURE__ */ $constructor("ZodString", (inst, def) => { + $ZodString.init(inst, def); + _ZodString.init(inst, def); + inst.email = (params) => inst.check(_email(ZodEmail, params)); + inst.url = (params) => inst.check(_url(ZodURL, params)); + inst.jwt = (params) => inst.check(_jwt(ZodJWT, params)); + inst.emoji = (params) => inst.check(_emoji2(ZodEmoji, params)); + inst.guid = (params) => inst.check(_guid(ZodGUID, params)); + inst.uuid = (params) => inst.check(_uuid(ZodUUID, params)); + inst.uuidv4 = (params) => inst.check(_uuidv4(ZodUUID, params)); + inst.uuidv6 = (params) => inst.check(_uuidv6(ZodUUID, params)); + inst.uuidv7 = (params) => inst.check(_uuidv7(ZodUUID, params)); + inst.nanoid = (params) => inst.check(_nanoid(ZodNanoID, params)); + inst.guid = (params) => inst.check(_guid(ZodGUID, params)); + inst.cuid = (params) => inst.check(_cuid(ZodCUID, params)); + inst.cuid2 = (params) => inst.check(_cuid2(ZodCUID2, params)); + inst.ulid = (params) => inst.check(_ulid(ZodULID, params)); + inst.base64 = (params) => inst.check(_base64(ZodBase64, params)); + inst.base64url = (params) => inst.check(_base64url(ZodBase64URL, params)); + inst.xid = (params) => inst.check(_xid(ZodXID, params)); + inst.ksuid = (params) => inst.check(_ksuid(ZodKSUID, params)); + inst.ipv4 = (params) => inst.check(_ipv4(ZodIPv4, params)); + inst.ipv6 = (params) => inst.check(_ipv6(ZodIPv6, params)); + inst.cidrv4 = (params) => inst.check(_cidrv4(ZodCIDRv4, params)); + inst.cidrv6 = (params) => inst.check(_cidrv6(ZodCIDRv6, params)); + inst.e164 = (params) => inst.check(_e164(ZodE164, params)); + inst.datetime = (params) => inst.check(datetime2(params)); + inst.date = (params) => inst.check(date2(params)); + inst.time = (params) => inst.check(time2(params)); + inst.duration = (params) => inst.check(duration2(params)); +}); +function string2(params) { + return _string(ZodString2, params); +} +var ZodStringFormat = /* @__PURE__ */ $constructor("ZodStringFormat", (inst, def) => { + $ZodStringFormat.init(inst, def); + _ZodString.init(inst, def); +}); +var ZodEmail = /* @__PURE__ */ $constructor("ZodEmail", (inst, def) => { + $ZodEmail.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodGUID = /* @__PURE__ */ $constructor("ZodGUID", (inst, def) => { + $ZodGUID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodUUID = /* @__PURE__ */ $constructor("ZodUUID", (inst, def) => { + $ZodUUID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodURL = /* @__PURE__ */ $constructor("ZodURL", (inst, def) => { + $ZodURL.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodEmoji = /* @__PURE__ */ $constructor("ZodEmoji", (inst, def) => { + $ZodEmoji.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodNanoID = /* @__PURE__ */ $constructor("ZodNanoID", (inst, def) => { + $ZodNanoID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodCUID = /* @__PURE__ */ $constructor("ZodCUID", (inst, def) => { + $ZodCUID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodCUID2 = /* @__PURE__ */ $constructor("ZodCUID2", (inst, def) => { + $ZodCUID2.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodULID = /* @__PURE__ */ $constructor("ZodULID", (inst, def) => { + $ZodULID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodXID = /* @__PURE__ */ $constructor("ZodXID", (inst, def) => { + $ZodXID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodKSUID = /* @__PURE__ */ $constructor("ZodKSUID", (inst, def) => { + $ZodKSUID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodIPv4 = /* @__PURE__ */ $constructor("ZodIPv4", (inst, def) => { + $ZodIPv4.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodIPv6 = /* @__PURE__ */ $constructor("ZodIPv6", (inst, def) => { + $ZodIPv6.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodCIDRv4 = /* @__PURE__ */ $constructor("ZodCIDRv4", (inst, def) => { + $ZodCIDRv4.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodCIDRv6 = /* @__PURE__ */ $constructor("ZodCIDRv6", (inst, def) => { + $ZodCIDRv6.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodBase64 = /* @__PURE__ */ $constructor("ZodBase64", (inst, def) => { + $ZodBase64.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodBase64URL = /* @__PURE__ */ $constructor("ZodBase64URL", (inst, def) => { + $ZodBase64URL.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodE164 = /* @__PURE__ */ $constructor("ZodE164", (inst, def) => { + $ZodE164.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodJWT = /* @__PURE__ */ $constructor("ZodJWT", (inst, def) => { + $ZodJWT.init(inst, def); + ZodStringFormat.init(inst, def); +}); +var ZodNumber2 = /* @__PURE__ */ $constructor("ZodNumber", (inst, def) => { + $ZodNumber.init(inst, def); + ZodType2.init(inst, def); + inst.gt = (value, params) => inst.check(_gt(value, params)); + inst.gte = (value, params) => inst.check(_gte(value, params)); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.lt = (value, params) => inst.check(_lt(value, params)); + inst.lte = (value, params) => inst.check(_lte(value, params)); + inst.max = (value, params) => inst.check(_lte(value, params)); + inst.int = (params) => inst.check(int(params)); + inst.safe = (params) => inst.check(int(params)); + inst.positive = (params) => inst.check(_gt(0, params)); + inst.nonnegative = (params) => inst.check(_gte(0, params)); + inst.negative = (params) => inst.check(_lt(0, params)); + inst.nonpositive = (params) => inst.check(_lte(0, params)); + inst.multipleOf = (value, params) => inst.check(_multipleOf(value, params)); + inst.step = (value, params) => inst.check(_multipleOf(value, params)); + inst.finite = () => inst; + const bag = inst._zod.bag; + inst.minValue = Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null; + inst.maxValue = Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null; + inst.isInt = (bag.format ?? "").includes("int") || Number.isSafeInteger(bag.multipleOf ?? 0.5); + inst.isFinite = true; + inst.format = bag.format ?? null; +}); +function number2(params) { + return _number(ZodNumber2, params); +} +var ZodNumberFormat = /* @__PURE__ */ $constructor("ZodNumberFormat", (inst, def) => { + $ZodNumberFormat.init(inst, def); + ZodNumber2.init(inst, def); +}); +function int(params) { + return _int(ZodNumberFormat, params); +} +var ZodBoolean2 = /* @__PURE__ */ $constructor("ZodBoolean", (inst, def) => { + $ZodBoolean.init(inst, def); + ZodType2.init(inst, def); +}); +function boolean2(params) { + return _boolean(ZodBoolean2, params); +} +var ZodNull2 = /* @__PURE__ */ $constructor("ZodNull", (inst, def) => { + $ZodNull.init(inst, def); + ZodType2.init(inst, def); +}); +function _null3(params) { + return _null2(ZodNull2, params); +} +var ZodUnknown2 = /* @__PURE__ */ $constructor("ZodUnknown", (inst, def) => { + $ZodUnknown.init(inst, def); + ZodType2.init(inst, def); +}); +function unknown() { + return _unknown(ZodUnknown2); +} +var ZodNever2 = /* @__PURE__ */ $constructor("ZodNever", (inst, def) => { + $ZodNever.init(inst, def); + ZodType2.init(inst, def); +}); +function never(params) { + return _never(ZodNever2, params); +} +var ZodArray2 = /* @__PURE__ */ $constructor("ZodArray", (inst, def) => { + $ZodArray.init(inst, def); + ZodType2.init(inst, def); + inst.element = def.element; + inst.min = (minLength, params) => inst.check(_minLength(minLength, params)); + inst.nonempty = (params) => inst.check(_minLength(1, params)); + inst.max = (maxLength, params) => inst.check(_maxLength(maxLength, params)); + inst.length = (len, params) => inst.check(_length(len, params)); + inst.unwrap = () => inst.element; +}); +function array(element, params) { + return _array(ZodArray2, element, params); +} +var ZodObject2 = /* @__PURE__ */ $constructor("ZodObject", (inst, def) => { + $ZodObject.init(inst, def); + ZodType2.init(inst, def); + util_exports.defineLazy(inst, "shape", () => def.shape); + inst.keyof = () => _enum(Object.keys(inst._zod.def.shape)); + inst.catchall = (catchall) => inst.clone({ ...inst._zod.def, catchall }); + inst.passthrough = () => inst.clone({ ...inst._zod.def, catchall: unknown() }); + inst.loose = () => inst.clone({ ...inst._zod.def, catchall: unknown() }); + inst.strict = () => inst.clone({ ...inst._zod.def, catchall: never() }); + inst.strip = () => inst.clone({ ...inst._zod.def, catchall: void 0 }); + inst.extend = (incoming) => { + return util_exports.extend(inst, incoming); + }; + inst.merge = (other) => util_exports.merge(inst, other); + inst.pick = (mask) => util_exports.pick(inst, mask); + inst.omit = (mask) => util_exports.omit(inst, mask); + inst.partial = (...args) => util_exports.partial(ZodOptional2, inst, args[0]); + inst.required = (...args) => util_exports.required(ZodNonOptional, inst, args[0]); +}); +function object2(shape, params) { + const def = { + type: "object", + get shape() { + util_exports.assignProp(this, "shape", { ...shape }); + return this.shape; + }, + ...util_exports.normalizeParams(params) + }; + return new ZodObject2(def); +} +function looseObject(shape, params) { + return new ZodObject2({ + type: "object", + get shape() { + util_exports.assignProp(this, "shape", { ...shape }); + return this.shape; + }, + catchall: unknown(), + ...util_exports.normalizeParams(params) + }); +} +var ZodUnion2 = /* @__PURE__ */ $constructor("ZodUnion", (inst, def) => { + $ZodUnion.init(inst, def); + ZodType2.init(inst, def); + inst.options = def.options; +}); +function union(options, params) { + return new ZodUnion2({ + type: "union", + options, + ...util_exports.normalizeParams(params) + }); +} +var ZodDiscriminatedUnion2 = /* @__PURE__ */ $constructor("ZodDiscriminatedUnion", (inst, def) => { + ZodUnion2.init(inst, def); + $ZodDiscriminatedUnion.init(inst, def); +}); +function discriminatedUnion(discriminator, options, params) { + return new ZodDiscriminatedUnion2({ + type: "union", + options, + discriminator, + ...util_exports.normalizeParams(params) + }); +} +var ZodIntersection2 = /* @__PURE__ */ $constructor("ZodIntersection", (inst, def) => { + $ZodIntersection.init(inst, def); + ZodType2.init(inst, def); +}); +function intersection(left, right) { + return new ZodIntersection2({ + type: "intersection", + left, + right + }); +} +var ZodRecord2 = /* @__PURE__ */ $constructor("ZodRecord", (inst, def) => { + $ZodRecord.init(inst, def); + ZodType2.init(inst, def); + inst.keyType = def.keyType; + inst.valueType = def.valueType; +}); +function record(keyType, valueType, params) { + return new ZodRecord2({ + type: "record", + keyType, + valueType, + ...util_exports.normalizeParams(params) + }); +} +var ZodEnum2 = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => { + $ZodEnum.init(inst, def); + ZodType2.init(inst, def); + inst.enum = def.entries; + inst.options = Object.values(def.entries); + const keys = new Set(Object.keys(def.entries)); + inst.extract = (values, params) => { + const newEntries = {}; + for (const value of values) { + if (keys.has(value)) { + newEntries[value] = def.entries[value]; + } else + throw new Error(`Key ${value} not found in enum`); + } + return new ZodEnum2({ + ...def, + checks: [], + ...util_exports.normalizeParams(params), + entries: newEntries + }); + }; + inst.exclude = (values, params) => { + const newEntries = { ...def.entries }; + for (const value of values) { + if (keys.has(value)) { + delete newEntries[value]; + } else + throw new Error(`Key ${value} not found in enum`); + } + return new ZodEnum2({ + ...def, + checks: [], + ...util_exports.normalizeParams(params), + entries: newEntries + }); + }; +}); +function _enum(values, params) { + const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values; + return new ZodEnum2({ + type: "enum", + entries, + ...util_exports.normalizeParams(params) + }); +} +var ZodLiteral2 = /* @__PURE__ */ $constructor("ZodLiteral", (inst, def) => { + $ZodLiteral.init(inst, def); + ZodType2.init(inst, def); + inst.values = new Set(def.values); + Object.defineProperty(inst, "value", { + get() { + if (def.values.length > 1) { + throw new Error("This schema contains multiple valid literal values. Use `.values` instead."); + } + return def.values[0]; + } + }); +}); +function literal(value, params) { + return new ZodLiteral2({ + type: "literal", + values: Array.isArray(value) ? value : [value], + ...util_exports.normalizeParams(params) + }); +} +var ZodTransform = /* @__PURE__ */ $constructor("ZodTransform", (inst, def) => { + $ZodTransform.init(inst, def); + ZodType2.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + payload.addIssue = (issue2) => { + if (typeof issue2 === "string") { + payload.issues.push(util_exports.issue(issue2, payload.value, def)); + } else { + const _issue = issue2; + if (_issue.fatal) + _issue.continue = false; + _issue.code ?? (_issue.code = "custom"); + _issue.input ?? (_issue.input = payload.value); + _issue.inst ?? (_issue.inst = inst); + _issue.continue ?? (_issue.continue = true); + payload.issues.push(util_exports.issue(_issue)); + } + }; + const output = def.transform(payload.value, payload); + if (output instanceof Promise) { + return output.then((output2) => { + payload.value = output2; + return payload; + }); + } + payload.value = output; + return payload; + }; +}); +function transform(fn) { + return new ZodTransform({ + type: "transform", + transform: fn + }); +} +var ZodOptional2 = /* @__PURE__ */ $constructor("ZodOptional", (inst, def) => { + $ZodOptional.init(inst, def); + ZodType2.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; +}); +function optional(innerType) { + return new ZodOptional2({ + type: "optional", + innerType + }); +} +var ZodNullable2 = /* @__PURE__ */ $constructor("ZodNullable", (inst, def) => { + $ZodNullable.init(inst, def); + ZodType2.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; +}); +function nullable(innerType) { + return new ZodNullable2({ + type: "nullable", + innerType + }); +} +var ZodDefault2 = /* @__PURE__ */ $constructor("ZodDefault", (inst, def) => { + $ZodDefault.init(inst, def); + ZodType2.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + inst.removeDefault = inst.unwrap; +}); +function _default(innerType, defaultValue) { + return new ZodDefault2({ + type: "default", + innerType, + get defaultValue() { + return typeof defaultValue === "function" ? defaultValue() : defaultValue; + } + }); +} +var ZodPrefault = /* @__PURE__ */ $constructor("ZodPrefault", (inst, def) => { + $ZodPrefault.init(inst, def); + ZodType2.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; +}); +function prefault(innerType, defaultValue) { + return new ZodPrefault({ + type: "prefault", + innerType, + get defaultValue() { + return typeof defaultValue === "function" ? defaultValue() : defaultValue; + } + }); +} +var ZodNonOptional = /* @__PURE__ */ $constructor("ZodNonOptional", (inst, def) => { + $ZodNonOptional.init(inst, def); + ZodType2.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; +}); +function nonoptional(innerType, params) { + return new ZodNonOptional({ + type: "nonoptional", + innerType, + ...util_exports.normalizeParams(params) + }); +} +var ZodCatch2 = /* @__PURE__ */ $constructor("ZodCatch", (inst, def) => { + $ZodCatch.init(inst, def); + ZodType2.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + inst.removeCatch = inst.unwrap; +}); +function _catch(innerType, catchValue) { + return new ZodCatch2({ + type: "catch", + innerType, + catchValue: typeof catchValue === "function" ? catchValue : () => catchValue + }); +} +var ZodPipe = /* @__PURE__ */ $constructor("ZodPipe", (inst, def) => { + $ZodPipe.init(inst, def); + ZodType2.init(inst, def); + inst.in = def.in; + inst.out = def.out; +}); +function pipe(in_, out) { + return new ZodPipe({ + type: "pipe", + in: in_, + out + // ...util.normalizeParams(params), + }); +} +var ZodReadonly2 = /* @__PURE__ */ $constructor("ZodReadonly", (inst, def) => { + $ZodReadonly.init(inst, def); + ZodType2.init(inst, def); +}); +function readonly(innerType) { + return new ZodReadonly2({ + type: "readonly", + innerType + }); +} +var ZodCustom = /* @__PURE__ */ $constructor("ZodCustom", (inst, def) => { + $ZodCustom.init(inst, def); + ZodType2.init(inst, def); +}); +function check(fn) { + const ch = new $ZodCheck({ + check: "custom" + // ...util.normalizeParams(params), + }); + ch._zod.check = fn; + return ch; +} +function custom2(fn, _params) { + return _custom(ZodCustom, fn ?? (() => true), _params); +} +function refine(fn, _params = {}) { + return _refine(ZodCustom, fn, _params); +} +function superRefine(fn) { + const ch = check((payload) => { + payload.addIssue = (issue2) => { + if (typeof issue2 === "string") { + payload.issues.push(util_exports.issue(issue2, payload.value, ch._zod.def)); + } else { + const _issue = issue2; + if (_issue.fatal) + _issue.continue = false; + _issue.code ?? (_issue.code = "custom"); + _issue.input ?? (_issue.input = payload.value); + _issue.inst ?? (_issue.inst = ch); + _issue.continue ?? (_issue.continue = !ch._zod.def.abort); + payload.issues.push(util_exports.issue(_issue)); + } + }; + return fn(payload.value, payload); + }); + return ch; +} +function preprocess(fn, schema) { + return pipe(transform(fn), schema); +} + +// node_modules/zod/v4/classic/external.js +config(en_default2()); + +// node_modules/@modelcontextprotocol/sdk/dist/esm/types.js +var LATEST_PROTOCOL_VERSION = "2025-11-25"; +var SUPPORTED_PROTOCOL_VERSIONS = [LATEST_PROTOCOL_VERSION, "2025-06-18", "2025-03-26", "2024-11-05", "2024-10-07"]; +var RELATED_TASK_META_KEY = "io.modelcontextprotocol/related-task"; +var JSONRPC_VERSION = "2.0"; +var AssertObjectSchema = custom2((v) => v !== null && (typeof v === "object" || typeof v === "function")); +var ProgressTokenSchema = union([string2(), number2().int()]); +var CursorSchema = string2(); +var TaskCreationParamsSchema = looseObject({ + /** + * Requested duration in milliseconds to retain task from creation. + */ + ttl: number2().optional(), + /** + * Time in milliseconds to wait between task status requests. + */ + pollInterval: number2().optional() +}); +var TaskMetadataSchema = object2({ + ttl: number2().optional() +}); +var RelatedTaskMetadataSchema = object2({ + taskId: string2() +}); +var RequestMetaSchema = looseObject({ + /** + * If specified, the caller is requesting out-of-band progress notifications for this request (as represented by notifications/progress). The value of this parameter is an opaque token that will be attached to any subsequent notifications. The receiver is not obligated to provide these notifications. + */ + progressToken: ProgressTokenSchema.optional(), + /** + * If specified, this request is related to the provided task. + */ + [RELATED_TASK_META_KEY]: RelatedTaskMetadataSchema.optional() +}); +var BaseRequestParamsSchema = object2({ + /** + * See [General fields: `_meta`](/specification/draft/basic/index#meta) for notes on `_meta` usage. + */ + _meta: RequestMetaSchema.optional() +}); +var TaskAugmentedRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * If specified, the caller is requesting task-augmented execution for this request. + * The request will return a CreateTaskResult immediately, and the actual result can be + * retrieved later via tasks/result. + * + * Task augmentation is subject to capability negotiation - receivers MUST declare support + * for task augmentation of specific request types in their capabilities. + */ + task: TaskMetadataSchema.optional() +}); +var isTaskAugmentedRequestParams = (value) => TaskAugmentedRequestParamsSchema.safeParse(value).success; +var RequestSchema = object2({ + method: string2(), + params: BaseRequestParamsSchema.loose().optional() +}); +var NotificationsParamsSchema = object2({ + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: RequestMetaSchema.optional() +}); +var NotificationSchema = object2({ + method: string2(), + params: NotificationsParamsSchema.loose().optional() +}); +var ResultSchema = looseObject({ + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: RequestMetaSchema.optional() +}); +var RequestIdSchema = union([string2(), number2().int()]); +var JSONRPCRequestSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema, + ...RequestSchema.shape +}).strict(); +var isJSONRPCRequest = (value) => JSONRPCRequestSchema.safeParse(value).success; +var JSONRPCNotificationSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + ...NotificationSchema.shape +}).strict(); +var isJSONRPCNotification = (value) => JSONRPCNotificationSchema.safeParse(value).success; +var JSONRPCResultResponseSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema, + result: ResultSchema +}).strict(); +var isJSONRPCResultResponse = (value) => JSONRPCResultResponseSchema.safeParse(value).success; +var ErrorCode; +(function(ErrorCode2) { + ErrorCode2[ErrorCode2["ConnectionClosed"] = -32e3] = "ConnectionClosed"; + ErrorCode2[ErrorCode2["RequestTimeout"] = -32001] = "RequestTimeout"; + ErrorCode2[ErrorCode2["ParseError"] = -32700] = "ParseError"; + ErrorCode2[ErrorCode2["InvalidRequest"] = -32600] = "InvalidRequest"; + ErrorCode2[ErrorCode2["MethodNotFound"] = -32601] = "MethodNotFound"; + ErrorCode2[ErrorCode2["InvalidParams"] = -32602] = "InvalidParams"; + ErrorCode2[ErrorCode2["InternalError"] = -32603] = "InternalError"; + ErrorCode2[ErrorCode2["UrlElicitationRequired"] = -32042] = "UrlElicitationRequired"; +})(ErrorCode || (ErrorCode = {})); +var JSONRPCErrorResponseSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema.optional(), + error: object2({ + /** + * The error type that occurred. + */ + code: number2().int(), + /** + * A short description of the error. The message SHOULD be limited to a concise single sentence. + */ + message: string2(), + /** + * Additional information about the error. The value of this member is defined by the sender (e.g. detailed error information, nested errors etc.). + */ + data: unknown().optional() + }) +}).strict(); +var isJSONRPCErrorResponse = (value) => JSONRPCErrorResponseSchema.safeParse(value).success; +var JSONRPCMessageSchema = union([ + JSONRPCRequestSchema, + JSONRPCNotificationSchema, + JSONRPCResultResponseSchema, + JSONRPCErrorResponseSchema +]); +var JSONRPCResponseSchema = union([JSONRPCResultResponseSchema, JSONRPCErrorResponseSchema]); +var EmptyResultSchema = ResultSchema.strict(); +var CancelledNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The ID of the request to cancel. + * + * This MUST correspond to the ID of a request previously issued in the same direction. + */ + requestId: RequestIdSchema.optional(), + /** + * An optional string describing the reason for the cancellation. This MAY be logged or presented to the user. + */ + reason: string2().optional() +}); +var CancelledNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/cancelled"), + params: CancelledNotificationParamsSchema +}); +var IconSchema = object2({ + /** + * URL or data URI for the icon. + */ + src: string2(), + /** + * Optional MIME type for the icon. + */ + mimeType: string2().optional(), + /** + * Optional array of strings that specify sizes at which the icon can be used. + * Each string should be in WxH format (e.g., `"48x48"`, `"96x96"`) or `"any"` for scalable formats like SVG. + * + * If not provided, the client should assume that the icon can be used at any size. + */ + sizes: array(string2()).optional(), + /** + * Optional specifier for the theme this icon is designed for. `light` indicates + * the icon is designed to be used with a light background, and `dark` indicates + * the icon is designed to be used with a dark background. + * + * If not provided, the client should assume the icon can be used with any theme. + */ + theme: _enum(["light", "dark"]).optional() +}); +var IconsSchema = object2({ + /** + * Optional set of sized icons that the client can display in a user interface. + * + * Clients that support rendering icons MUST support at least the following MIME types: + * - `image/png` - PNG images (safe, universal compatibility) + * - `image/jpeg` (and `image/jpg`) - JPEG images (safe, universal compatibility) + * + * Clients that support rendering icons SHOULD also support: + * - `image/svg+xml` - SVG images (scalable but requires security precautions) + * - `image/webp` - WebP images (modern, efficient format) + */ + icons: array(IconSchema).optional() +}); +var BaseMetadataSchema = object2({ + /** Intended for programmatic or logical use, but used as a display name in past specs or fallback */ + name: string2(), + /** + * Intended for UI and end-user contexts — optimized to be human-readable and easily understood, + * even by those unfamiliar with domain-specific terminology. + * + * If not provided, the name should be used for display (except for Tool, + * where `annotations.title` should be given precedence over using `name`, + * if present). + */ + title: string2().optional() +}); +var ImplementationSchema = BaseMetadataSchema.extend({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + version: string2(), + /** + * An optional URL of the website for this implementation. + */ + websiteUrl: string2().optional(), + /** + * An optional human-readable description of what this implementation does. + * + * This can be used by clients or servers to provide context about their purpose + * and capabilities. For example, a server might describe the types of resources + * or tools it provides, while a client might describe its intended use case. + */ + description: string2().optional() +}); +var FormElicitationCapabilitySchema = intersection(object2({ + applyDefaults: boolean2().optional() +}), record(string2(), unknown())); +var ElicitationCapabilitySchema = preprocess((value) => { + if (value && typeof value === "object" && !Array.isArray(value)) { + if (Object.keys(value).length === 0) { + return { form: {} }; + } + } + return value; +}, intersection(object2({ + form: FormElicitationCapabilitySchema.optional(), + url: AssertObjectSchema.optional() +}), record(string2(), unknown()).optional())); +var ClientTasksCapabilitySchema = looseObject({ + /** + * Present if the client supports listing tasks. + */ + list: AssertObjectSchema.optional(), + /** + * Present if the client supports cancelling tasks. + */ + cancel: AssertObjectSchema.optional(), + /** + * Capabilities for task creation on specific request types. + */ + requests: looseObject({ + /** + * Task support for sampling requests. + */ + sampling: looseObject({ + createMessage: AssertObjectSchema.optional() + }).optional(), + /** + * Task support for elicitation requests. + */ + elicitation: looseObject({ + create: AssertObjectSchema.optional() + }).optional() + }).optional() +}); +var ServerTasksCapabilitySchema = looseObject({ + /** + * Present if the server supports listing tasks. + */ + list: AssertObjectSchema.optional(), + /** + * Present if the server supports cancelling tasks. + */ + cancel: AssertObjectSchema.optional(), + /** + * Capabilities for task creation on specific request types. + */ + requests: looseObject({ + /** + * Task support for tool requests. + */ + tools: looseObject({ + call: AssertObjectSchema.optional() + }).optional() + }).optional() +}); +var ClientCapabilitiesSchema = object2({ + /** + * Experimental, non-standard capabilities that the client supports. + */ + experimental: record(string2(), AssertObjectSchema).optional(), + /** + * Present if the client supports sampling from an LLM. + */ + sampling: object2({ + /** + * Present if the client supports context inclusion via includeContext parameter. + * If not declared, servers SHOULD only use `includeContext: "none"` (or omit it). + */ + context: AssertObjectSchema.optional(), + /** + * Present if the client supports tool use via tools and toolChoice parameters. + */ + tools: AssertObjectSchema.optional() + }).optional(), + /** + * Present if the client supports eliciting user input. + */ + elicitation: ElicitationCapabilitySchema.optional(), + /** + * Present if the client supports listing roots. + */ + roots: object2({ + /** + * Whether the client supports issuing notifications for changes to the roots list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the client supports task creation. + */ + tasks: ClientTasksCapabilitySchema.optional(), + /** + * Extensions that the client supports. Keys are extension identifiers (vendor-prefix/extension-name). + */ + extensions: record(string2(), AssertObjectSchema).optional() +}); +var InitializeRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The latest version of the Model Context Protocol that the client supports. The client MAY decide to support older versions as well. + */ + protocolVersion: string2(), + capabilities: ClientCapabilitiesSchema, + clientInfo: ImplementationSchema +}); +var InitializeRequestSchema = RequestSchema.extend({ + method: literal("initialize"), + params: InitializeRequestParamsSchema +}); +var ServerCapabilitiesSchema = object2({ + /** + * Experimental, non-standard capabilities that the server supports. + */ + experimental: record(string2(), AssertObjectSchema).optional(), + /** + * Present if the server supports sending log messages to the client. + */ + logging: AssertObjectSchema.optional(), + /** + * Present if the server supports sending completions to the client. + */ + completions: AssertObjectSchema.optional(), + /** + * Present if the server offers any prompt templates. + */ + prompts: object2({ + /** + * Whether this server supports issuing notifications for changes to the prompt list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server offers any resources to read. + */ + resources: object2({ + /** + * Whether this server supports clients subscribing to resource updates. + */ + subscribe: boolean2().optional(), + /** + * Whether this server supports issuing notifications for changes to the resource list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server offers any tools to call. + */ + tools: object2({ + /** + * Whether this server supports issuing notifications for changes to the tool list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server supports task creation. + */ + tasks: ServerTasksCapabilitySchema.optional(), + /** + * Extensions that the server supports. Keys are extension identifiers (vendor-prefix/extension-name). + */ + extensions: record(string2(), AssertObjectSchema).optional() +}); +var InitializeResultSchema = ResultSchema.extend({ + /** + * The version of the Model Context Protocol that the server wants to use. This may not match the version that the client requested. If the client cannot support this version, it MUST disconnect. + */ + protocolVersion: string2(), + capabilities: ServerCapabilitiesSchema, + serverInfo: ImplementationSchema, + /** + * Instructions describing how to use the server and its features. + * + * This can be used by clients to improve the LLM's understanding of available tools, resources, etc. It can be thought of like a "hint" to the model. For example, this information MAY be added to the system prompt. + */ + instructions: string2().optional() +}); +var InitializedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/initialized"), + params: NotificationsParamsSchema.optional() +}); +var PingRequestSchema = RequestSchema.extend({ + method: literal("ping"), + params: BaseRequestParamsSchema.optional() +}); +var ProgressSchema = object2({ + /** + * The progress thus far. This should increase every time progress is made, even if the total is unknown. + */ + progress: number2(), + /** + * Total number of items to process (or total progress required), if known. + */ + total: optional(number2()), + /** + * An optional message describing the current progress. + */ + message: optional(string2()) +}); +var ProgressNotificationParamsSchema = object2({ + ...NotificationsParamsSchema.shape, + ...ProgressSchema.shape, + /** + * The progress token which was given in the initial request, used to associate this notification with the request that is proceeding. + */ + progressToken: ProgressTokenSchema +}); +var ProgressNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/progress"), + params: ProgressNotificationParamsSchema +}); +var PaginatedRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * An opaque token representing the current pagination position. + * If provided, the server should return results starting after this cursor. + */ + cursor: CursorSchema.optional() +}); +var PaginatedRequestSchema = RequestSchema.extend({ + params: PaginatedRequestParamsSchema.optional() +}); +var PaginatedResultSchema = ResultSchema.extend({ + /** + * An opaque token representing the pagination position after the last returned result. + * If present, there may be more results available. + */ + nextCursor: CursorSchema.optional() +}); +var TaskStatusSchema = _enum(["working", "input_required", "completed", "failed", "cancelled"]); +var TaskSchema = object2({ + taskId: string2(), + status: TaskStatusSchema, + /** + * Time in milliseconds to keep task results available after completion. + * If null, the task has unlimited lifetime until manually cleaned up. + */ + ttl: union([number2(), _null3()]), + /** + * ISO 8601 timestamp when the task was created. + */ + createdAt: string2(), + /** + * ISO 8601 timestamp when the task was last updated. + */ + lastUpdatedAt: string2(), + pollInterval: optional(number2()), + /** + * Optional diagnostic message for failed tasks or other status information. + */ + statusMessage: optional(string2()) +}); +var CreateTaskResultSchema = ResultSchema.extend({ + task: TaskSchema +}); +var TaskStatusNotificationParamsSchema = NotificationsParamsSchema.merge(TaskSchema); +var TaskStatusNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/tasks/status"), + params: TaskStatusNotificationParamsSchema +}); +var GetTaskRequestSchema = RequestSchema.extend({ + method: literal("tasks/get"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) +}); +var GetTaskResultSchema = ResultSchema.merge(TaskSchema); +var GetTaskPayloadRequestSchema = RequestSchema.extend({ + method: literal("tasks/result"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) +}); +var GetTaskPayloadResultSchema = ResultSchema.loose(); +var ListTasksRequestSchema = PaginatedRequestSchema.extend({ + method: literal("tasks/list") +}); +var ListTasksResultSchema = PaginatedResultSchema.extend({ + tasks: array(TaskSchema) +}); +var CancelTaskRequestSchema = RequestSchema.extend({ + method: literal("tasks/cancel"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) +}); +var CancelTaskResultSchema = ResultSchema.merge(TaskSchema); +var ResourceContentsSchema = object2({ + /** + * The URI of this resource. + */ + uri: string2(), + /** + * The MIME type of this resource, if known. + */ + mimeType: optional(string2()), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var TextResourceContentsSchema = ResourceContentsSchema.extend({ + /** + * The text of the item. This must only be set if the item can actually be represented as text (not binary data). + */ + text: string2() +}); +var Base64Schema = string2().refine((val) => { + try { + atob(val); + return true; + } catch { + return false; + } +}, { message: "Invalid Base64 string" }); +var BlobResourceContentsSchema = ResourceContentsSchema.extend({ + /** + * A base64-encoded string representing the binary data of the item. + */ + blob: Base64Schema +}); +var RoleSchema = _enum(["user", "assistant"]); +var AnnotationsSchema = object2({ + /** + * Intended audience(s) for the resource. + */ + audience: array(RoleSchema).optional(), + /** + * Importance hint for the resource, from 0 (least) to 1 (most). + */ + priority: number2().min(0).max(1).optional(), + /** + * ISO 8601 timestamp for the most recent modification. + */ + lastModified: iso_exports.datetime({ offset: true }).optional() +}); +var ResourceSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * The URI of this resource. + */ + uri: string2(), + /** + * A description of what this resource represents. + * + * This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model. + */ + description: optional(string2()), + /** + * The MIME type of this resource, if known. + */ + mimeType: optional(string2()), + /** + * The size of the raw resource content, in bytes (i.e., before base64 encoding or any tokenization), if known. + * + * This can be used by Hosts to display file sizes and estimate context window usage. + */ + size: optional(number2()), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) +}); +var ResourceTemplateSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * A URI template (according to RFC 6570) that can be used to construct resource URIs. + */ + uriTemplate: string2(), + /** + * A description of what this template is for. + * + * This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model. + */ + description: optional(string2()), + /** + * The MIME type for all resources that match this template. This should only be included if all resources matching this template have the same type. + */ + mimeType: optional(string2()), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) +}); +var ListResourcesRequestSchema = PaginatedRequestSchema.extend({ + method: literal("resources/list") +}); +var ListResourcesResultSchema = PaginatedResultSchema.extend({ + resources: array(ResourceSchema) +}); +var ListResourceTemplatesRequestSchema = PaginatedRequestSchema.extend({ + method: literal("resources/templates/list") +}); +var ListResourceTemplatesResultSchema = PaginatedResultSchema.extend({ + resourceTemplates: array(ResourceTemplateSchema) +}); +var ResourceRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The URI of the resource to read. The URI can use any protocol; it is up to the server how to interpret it. + * + * @format uri + */ + uri: string2() +}); +var ReadResourceRequestParamsSchema = ResourceRequestParamsSchema; +var ReadResourceRequestSchema = RequestSchema.extend({ + method: literal("resources/read"), + params: ReadResourceRequestParamsSchema +}); +var ReadResourceResultSchema = ResultSchema.extend({ + contents: array(union([TextResourceContentsSchema, BlobResourceContentsSchema])) +}); +var ResourceListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/resources/list_changed"), + params: NotificationsParamsSchema.optional() +}); +var SubscribeRequestParamsSchema = ResourceRequestParamsSchema; +var SubscribeRequestSchema = RequestSchema.extend({ + method: literal("resources/subscribe"), + params: SubscribeRequestParamsSchema +}); +var UnsubscribeRequestParamsSchema = ResourceRequestParamsSchema; +var UnsubscribeRequestSchema = RequestSchema.extend({ + method: literal("resources/unsubscribe"), + params: UnsubscribeRequestParamsSchema +}); +var ResourceUpdatedNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The URI of the resource that has been updated. This might be a sub-resource of the one that the client actually subscribed to. + */ + uri: string2() +}); +var ResourceUpdatedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/resources/updated"), + params: ResourceUpdatedNotificationParamsSchema +}); +var PromptArgumentSchema = object2({ + /** + * The name of the argument. + */ + name: string2(), + /** + * A human-readable description of the argument. + */ + description: optional(string2()), + /** + * Whether this argument must be provided. + */ + required: optional(boolean2()) +}); +var PromptSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * An optional description of what this prompt provides + */ + description: optional(string2()), + /** + * A list of arguments to use for templating the prompt. + */ + arguments: optional(array(PromptArgumentSchema)), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) +}); +var ListPromptsRequestSchema = PaginatedRequestSchema.extend({ + method: literal("prompts/list") +}); +var ListPromptsResultSchema = PaginatedResultSchema.extend({ + prompts: array(PromptSchema) +}); +var GetPromptRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The name of the prompt or prompt template. + */ + name: string2(), + /** + * Arguments to use for templating the prompt. + */ + arguments: record(string2(), string2()).optional() +}); +var GetPromptRequestSchema = RequestSchema.extend({ + method: literal("prompts/get"), + params: GetPromptRequestParamsSchema +}); +var TextContentSchema = object2({ + type: literal("text"), + /** + * The text content of the message. + */ + text: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ImageContentSchema = object2({ + type: literal("image"), + /** + * The base64-encoded image data. + */ + data: Base64Schema, + /** + * The MIME type of the image. Different providers may support different image types. + */ + mimeType: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var AudioContentSchema = object2({ + type: literal("audio"), + /** + * The base64-encoded audio data. + */ + data: Base64Schema, + /** + * The MIME type of the audio. Different providers may support different audio types. + */ + mimeType: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ToolUseContentSchema = object2({ + type: literal("tool_use"), + /** + * The name of the tool to invoke. + * Must match a tool name from the request's tools array. + */ + name: string2(), + /** + * Unique identifier for this tool call. + * Used to correlate with ToolResultContent in subsequent messages. + */ + id: string2(), + /** + * Arguments to pass to the tool. + * Must conform to the tool's inputSchema. + */ + input: record(string2(), unknown()), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var EmbeddedResourceSchema = object2({ + type: literal("resource"), + resource: union([TextResourceContentsSchema, BlobResourceContentsSchema]), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ResourceLinkSchema = ResourceSchema.extend({ + type: literal("resource_link") +}); +var ContentBlockSchema = union([ + TextContentSchema, + ImageContentSchema, + AudioContentSchema, + ResourceLinkSchema, + EmbeddedResourceSchema +]); +var PromptMessageSchema = object2({ + role: RoleSchema, + content: ContentBlockSchema +}); +var GetPromptResultSchema = ResultSchema.extend({ + /** + * An optional description for the prompt. + */ + description: string2().optional(), + messages: array(PromptMessageSchema) +}); +var PromptListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/prompts/list_changed"), + params: NotificationsParamsSchema.optional() +}); +var ToolAnnotationsSchema = object2({ + /** + * A human-readable title for the tool. + */ + title: string2().optional(), + /** + * If true, the tool does not modify its environment. + * + * Default: false + */ + readOnlyHint: boolean2().optional(), + /** + * If true, the tool may perform destructive updates to its environment. + * If false, the tool performs only additive updates. + * + * (This property is meaningful only when `readOnlyHint == false`) + * + * Default: true + */ + destructiveHint: boolean2().optional(), + /** + * If true, calling the tool repeatedly with the same arguments + * will have no additional effect on the its environment. + * + * (This property is meaningful only when `readOnlyHint == false`) + * + * Default: false + */ + idempotentHint: boolean2().optional(), + /** + * If true, this tool may interact with an "open world" of external + * entities. If false, the tool's domain of interaction is closed. + * For example, the world of a web search tool is open, whereas that + * of a memory tool is not. + * + * Default: true + */ + openWorldHint: boolean2().optional() +}); +var ToolExecutionSchema = object2({ + /** + * Indicates the tool's preference for task-augmented execution. + * - "required": Clients MUST invoke the tool as a task + * - "optional": Clients MAY invoke the tool as a task or normal request + * - "forbidden": Clients MUST NOT attempt to invoke the tool as a task + * + * If not present, defaults to "forbidden". + */ + taskSupport: _enum(["required", "optional", "forbidden"]).optional() +}); +var ToolSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * A human-readable description of the tool. + */ + description: string2().optional(), + /** + * A JSON Schema 2020-12 object defining the expected parameters for the tool. + * Must have type: 'object' at the root level per MCP spec. + */ + inputSchema: object2({ + type: literal("object"), + properties: record(string2(), AssertObjectSchema).optional(), + required: array(string2()).optional() + }).catchall(unknown()), + /** + * An optional JSON Schema 2020-12 object defining the structure of the tool's output + * returned in the structuredContent field of a CallToolResult. + * Must have type: 'object' at the root level per MCP spec. + */ + outputSchema: object2({ + type: literal("object"), + properties: record(string2(), AssertObjectSchema).optional(), + required: array(string2()).optional() + }).catchall(unknown()).optional(), + /** + * Optional additional tool information. + */ + annotations: ToolAnnotationsSchema.optional(), + /** + * Execution-related properties for this tool. + */ + execution: ToolExecutionSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ListToolsRequestSchema = PaginatedRequestSchema.extend({ + method: literal("tools/list") +}); +var ListToolsResultSchema = PaginatedResultSchema.extend({ + tools: array(ToolSchema) +}); +var CallToolResultSchema = ResultSchema.extend({ + /** + * A list of content objects that represent the result of the tool call. + * + * If the Tool does not define an outputSchema, this field MUST be present in the result. + * For backwards compatibility, this field is always present, but it may be empty. + */ + content: array(ContentBlockSchema).default([]), + /** + * An object containing structured tool output. + * + * If the Tool defines an outputSchema, this field MUST be present in the result, and contain a JSON object that matches the schema. + */ + structuredContent: record(string2(), unknown()).optional(), + /** + * Whether the tool call ended in an error. + * + * If not set, this is assumed to be false (the call was successful). + * + * Any errors that originate from the tool SHOULD be reported inside the result + * object, with `isError` set to true, _not_ as an MCP protocol-level error + * response. Otherwise, the LLM would not be able to see that an error occurred + * and self-correct. + * + * However, any errors in _finding_ the tool, an error indicating that the + * server does not support tool calls, or any other exceptional conditions, + * should be reported as an MCP error response. + */ + isError: boolean2().optional() +}); +var CompatibilityCallToolResultSchema = CallToolResultSchema.or(ResultSchema.extend({ + toolResult: unknown() +})); +var CallToolRequestParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The name of the tool to call. + */ + name: string2(), + /** + * Arguments to pass to the tool. + */ + arguments: record(string2(), unknown()).optional() +}); +var CallToolRequestSchema = RequestSchema.extend({ + method: literal("tools/call"), + params: CallToolRequestParamsSchema +}); +var ToolListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/tools/list_changed"), + params: NotificationsParamsSchema.optional() +}); +var ListChangedOptionsBaseSchema = object2({ + /** + * If true, the list will be refreshed automatically when a list changed notification is received. + * The callback will be called with the updated list. + * + * If false, the callback will be called with null items, allowing manual refresh. + * + * @default true + */ + autoRefresh: boolean2().default(true), + /** + * Debounce time in milliseconds for list changed notification processing. + * + * Multiple notifications received within this timeframe will only trigger one refresh. + * Set to 0 to disable debouncing. + * + * @default 300 + */ + debounceMs: number2().int().nonnegative().default(300) +}); +var LoggingLevelSchema = _enum(["debug", "info", "notice", "warning", "error", "critical", "alert", "emergency"]); +var SetLevelRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The level of logging that the client wants to receive from the server. The server should send all logs at this level and higher (i.e., more severe) to the client as notifications/logging/message. + */ + level: LoggingLevelSchema +}); +var SetLevelRequestSchema = RequestSchema.extend({ + method: literal("logging/setLevel"), + params: SetLevelRequestParamsSchema +}); +var LoggingMessageNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The severity of this log message. + */ + level: LoggingLevelSchema, + /** + * An optional name of the logger issuing this message. + */ + logger: string2().optional(), + /** + * The data to be logged, such as a string message or an object. Any JSON serializable type is allowed here. + */ + data: unknown() +}); +var LoggingMessageNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/message"), + params: LoggingMessageNotificationParamsSchema +}); +var ModelHintSchema = object2({ + /** + * A hint for a model name. + */ + name: string2().optional() +}); +var ModelPreferencesSchema = object2({ + /** + * Optional hints to use for model selection. + */ + hints: array(ModelHintSchema).optional(), + /** + * How much to prioritize cost when selecting a model. + */ + costPriority: number2().min(0).max(1).optional(), + /** + * How much to prioritize sampling speed (latency) when selecting a model. + */ + speedPriority: number2().min(0).max(1).optional(), + /** + * How much to prioritize intelligence and capabilities when selecting a model. + */ + intelligencePriority: number2().min(0).max(1).optional() +}); +var ToolChoiceSchema = object2({ + /** + * Controls when tools are used: + * - "auto": Model decides whether to use tools (default) + * - "required": Model MUST use at least one tool before completing + * - "none": Model MUST NOT use any tools + */ + mode: _enum(["auto", "required", "none"]).optional() +}); +var ToolResultContentSchema = object2({ + type: literal("tool_result"), + toolUseId: string2().describe("The unique identifier for the corresponding tool call."), + content: array(ContentBlockSchema).default([]), + structuredContent: object2({}).loose().optional(), + isError: boolean2().optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var SamplingContentSchema = discriminatedUnion("type", [TextContentSchema, ImageContentSchema, AudioContentSchema]); +var SamplingMessageContentBlockSchema = discriminatedUnion("type", [ + TextContentSchema, + ImageContentSchema, + AudioContentSchema, + ToolUseContentSchema, + ToolResultContentSchema +]); +var SamplingMessageSchema = object2({ + role: RoleSchema, + content: union([SamplingMessageContentBlockSchema, array(SamplingMessageContentBlockSchema)]), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var CreateMessageRequestParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + messages: array(SamplingMessageSchema), + /** + * The server's preferences for which model to select. The client MAY modify or omit this request. + */ + modelPreferences: ModelPreferencesSchema.optional(), + /** + * An optional system prompt the server wants to use for sampling. The client MAY modify or omit this prompt. + */ + systemPrompt: string2().optional(), + /** + * A request to include context from one or more MCP servers (including the caller), to be attached to the prompt. + * The client MAY ignore this request. + * + * Default is "none". Values "thisServer" and "allServers" are soft-deprecated. Servers SHOULD only use these values if the client + * declares ClientCapabilities.sampling.context. These values may be removed in future spec releases. + */ + includeContext: _enum(["none", "thisServer", "allServers"]).optional(), + temperature: number2().optional(), + /** + * The requested maximum number of tokens to sample (to prevent runaway completions). + * + * The client MAY choose to sample fewer tokens than the requested maximum. + */ + maxTokens: number2().int(), + stopSequences: array(string2()).optional(), + /** + * Optional metadata to pass through to the LLM provider. The format of this metadata is provider-specific. + */ + metadata: AssertObjectSchema.optional(), + /** + * Tools that the model may use during generation. + * The client MUST return an error if this field is provided but ClientCapabilities.sampling.tools is not declared. + */ + tools: array(ToolSchema).optional(), + /** + * Controls how the model uses tools. + * The client MUST return an error if this field is provided but ClientCapabilities.sampling.tools is not declared. + * Default is `{ mode: "auto" }`. + */ + toolChoice: ToolChoiceSchema.optional() +}); +var CreateMessageRequestSchema = RequestSchema.extend({ + method: literal("sampling/createMessage"), + params: CreateMessageRequestParamsSchema +}); +var CreateMessageResultSchema = ResultSchema.extend({ + /** + * The name of the model that generated the message. + */ + model: string2(), + /** + * The reason why sampling stopped, if known. + * + * Standard values: + * - "endTurn": Natural end of the assistant's turn + * - "stopSequence": A stop sequence was encountered + * - "maxTokens": Maximum token limit was reached + * + * This field is an open string to allow for provider-specific stop reasons. + */ + stopReason: optional(_enum(["endTurn", "stopSequence", "maxTokens"]).or(string2())), + role: RoleSchema, + /** + * Response content. Single content block (text, image, or audio). + */ + content: SamplingContentSchema +}); +var CreateMessageResultWithToolsSchema = ResultSchema.extend({ + /** + * The name of the model that generated the message. + */ + model: string2(), + /** + * The reason why sampling stopped, if known. + * + * Standard values: + * - "endTurn": Natural end of the assistant's turn + * - "stopSequence": A stop sequence was encountered + * - "maxTokens": Maximum token limit was reached + * - "toolUse": The model wants to use one or more tools + * + * This field is an open string to allow for provider-specific stop reasons. + */ + stopReason: optional(_enum(["endTurn", "stopSequence", "maxTokens", "toolUse"]).or(string2())), + role: RoleSchema, + /** + * Response content. May be a single block or array. May include ToolUseContent if stopReason is "toolUse". + */ + content: union([SamplingMessageContentBlockSchema, array(SamplingMessageContentBlockSchema)]) +}); +var BooleanSchemaSchema = object2({ + type: literal("boolean"), + title: string2().optional(), + description: string2().optional(), + default: boolean2().optional() +}); +var StringSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + minLength: number2().optional(), + maxLength: number2().optional(), + format: _enum(["email", "uri", "date", "date-time"]).optional(), + default: string2().optional() +}); +var NumberSchemaSchema = object2({ + type: _enum(["number", "integer"]), + title: string2().optional(), + description: string2().optional(), + minimum: number2().optional(), + maximum: number2().optional(), + default: number2().optional() +}); +var UntitledSingleSelectEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + enum: array(string2()), + default: string2().optional() +}); +var TitledSingleSelectEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + oneOf: array(object2({ + const: string2(), + title: string2() + })), + default: string2().optional() +}); +var LegacyTitledEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + enum: array(string2()), + enumNames: array(string2()).optional(), + default: string2().optional() +}); +var SingleSelectEnumSchemaSchema = union([UntitledSingleSelectEnumSchemaSchema, TitledSingleSelectEnumSchemaSchema]); +var UntitledMultiSelectEnumSchemaSchema = object2({ + type: literal("array"), + title: string2().optional(), + description: string2().optional(), + minItems: number2().optional(), + maxItems: number2().optional(), + items: object2({ + type: literal("string"), + enum: array(string2()) + }), + default: array(string2()).optional() +}); +var TitledMultiSelectEnumSchemaSchema = object2({ + type: literal("array"), + title: string2().optional(), + description: string2().optional(), + minItems: number2().optional(), + maxItems: number2().optional(), + items: object2({ + anyOf: array(object2({ + const: string2(), + title: string2() + })) + }), + default: array(string2()).optional() +}); +var MultiSelectEnumSchemaSchema = union([UntitledMultiSelectEnumSchemaSchema, TitledMultiSelectEnumSchemaSchema]); +var EnumSchemaSchema = union([LegacyTitledEnumSchemaSchema, SingleSelectEnumSchemaSchema, MultiSelectEnumSchemaSchema]); +var PrimitiveSchemaDefinitionSchema = union([EnumSchemaSchema, BooleanSchemaSchema, StringSchemaSchema, NumberSchemaSchema]); +var ElicitRequestFormParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The elicitation mode. + * + * Optional for backward compatibility. Clients MUST treat missing mode as "form". + */ + mode: literal("form").optional(), + /** + * The message to present to the user describing what information is being requested. + */ + message: string2(), + /** + * A restricted subset of JSON Schema. + * Only top-level properties are allowed, without nesting. + */ + requestedSchema: object2({ + type: literal("object"), + properties: record(string2(), PrimitiveSchemaDefinitionSchema), + required: array(string2()).optional() + }) +}); +var ElicitRequestURLParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The elicitation mode. + */ + mode: literal("url"), + /** + * The message to present to the user explaining why the interaction is needed. + */ + message: string2(), + /** + * The ID of the elicitation, which must be unique within the context of the server. + * The client MUST treat this ID as an opaque value. + */ + elicitationId: string2(), + /** + * The URL that the user should navigate to. + */ + url: string2().url() +}); +var ElicitRequestParamsSchema = union([ElicitRequestFormParamsSchema, ElicitRequestURLParamsSchema]); +var ElicitRequestSchema = RequestSchema.extend({ + method: literal("elicitation/create"), + params: ElicitRequestParamsSchema +}); +var ElicitationCompleteNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The ID of the elicitation that completed. + */ + elicitationId: string2() +}); +var ElicitationCompleteNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/elicitation/complete"), + params: ElicitationCompleteNotificationParamsSchema +}); +var ElicitResultSchema = ResultSchema.extend({ + /** + * The user action in response to the elicitation. + * - "accept": User submitted the form/confirmed the action + * - "decline": User explicitly decline the action + * - "cancel": User dismissed without making an explicit choice + */ + action: _enum(["accept", "decline", "cancel"]), + /** + * The submitted form data, only present when action is "accept". + * Contains values matching the requested schema. + * Per MCP spec, content is "typically omitted" for decline/cancel actions. + * We normalize null to undefined for leniency while maintaining type compatibility. + */ + content: preprocess((val) => val === null ? void 0 : val, record(string2(), union([string2(), number2(), boolean2(), array(string2())])).optional()) +}); +var ResourceTemplateReferenceSchema = object2({ + type: literal("ref/resource"), + /** + * The URI or URI template of the resource. + */ + uri: string2() +}); +var PromptReferenceSchema = object2({ + type: literal("ref/prompt"), + /** + * The name of the prompt or prompt template + */ + name: string2() +}); +var CompleteRequestParamsSchema = BaseRequestParamsSchema.extend({ + ref: union([PromptReferenceSchema, ResourceTemplateReferenceSchema]), + /** + * The argument's information + */ + argument: object2({ + /** + * The name of the argument + */ + name: string2(), + /** + * The value of the argument to use for completion matching. + */ + value: string2() + }), + context: object2({ + /** + * Previously-resolved variables in a URI template or prompt. + */ + arguments: record(string2(), string2()).optional() + }).optional() +}); +var CompleteRequestSchema = RequestSchema.extend({ + method: literal("completion/complete"), + params: CompleteRequestParamsSchema +}); +var CompleteResultSchema = ResultSchema.extend({ + completion: looseObject({ + /** + * An array of completion values. Must not exceed 100 items. + */ + values: array(string2()).max(100), + /** + * The total number of completion options available. This can exceed the number of values actually sent in the response. + */ + total: optional(number2().int()), + /** + * Indicates whether there are additional completion options beyond those provided in the current response, even if the exact total is unknown. + */ + hasMore: optional(boolean2()) + }) +}); +var RootSchema = object2({ + /** + * The URI identifying the root. This *must* start with file:// for now. + */ + uri: string2().startsWith("file://"), + /** + * An optional name for the root. + */ + name: string2().optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ListRootsRequestSchema = RequestSchema.extend({ + method: literal("roots/list"), + params: BaseRequestParamsSchema.optional() +}); +var ListRootsResultSchema = ResultSchema.extend({ + roots: array(RootSchema) +}); +var RootsListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/roots/list_changed"), + params: NotificationsParamsSchema.optional() +}); +var ClientRequestSchema = union([ + PingRequestSchema, + InitializeRequestSchema, + CompleteRequestSchema, + SetLevelRequestSchema, + GetPromptRequestSchema, + ListPromptsRequestSchema, + ListResourcesRequestSchema, + ListResourceTemplatesRequestSchema, + ReadResourceRequestSchema, + SubscribeRequestSchema, + UnsubscribeRequestSchema, + CallToolRequestSchema, + ListToolsRequestSchema, + GetTaskRequestSchema, + GetTaskPayloadRequestSchema, + ListTasksRequestSchema, + CancelTaskRequestSchema +]); +var ClientNotificationSchema = union([ + CancelledNotificationSchema, + ProgressNotificationSchema, + InitializedNotificationSchema, + RootsListChangedNotificationSchema, + TaskStatusNotificationSchema +]); +var ClientResultSchema = union([ + EmptyResultSchema, + CreateMessageResultSchema, + CreateMessageResultWithToolsSchema, + ElicitResultSchema, + ListRootsResultSchema, + GetTaskResultSchema, + ListTasksResultSchema, + CreateTaskResultSchema +]); +var ServerRequestSchema = union([ + PingRequestSchema, + CreateMessageRequestSchema, + ElicitRequestSchema, + ListRootsRequestSchema, + GetTaskRequestSchema, + GetTaskPayloadRequestSchema, + ListTasksRequestSchema, + CancelTaskRequestSchema +]); +var ServerNotificationSchema = union([ + CancelledNotificationSchema, + ProgressNotificationSchema, + LoggingMessageNotificationSchema, + ResourceUpdatedNotificationSchema, + ResourceListChangedNotificationSchema, + ToolListChangedNotificationSchema, + PromptListChangedNotificationSchema, + TaskStatusNotificationSchema, + ElicitationCompleteNotificationSchema +]); +var ServerResultSchema = union([ + EmptyResultSchema, + InitializeResultSchema, + CompleteResultSchema, + GetPromptResultSchema, + ListPromptsResultSchema, + ListResourcesResultSchema, + ListResourceTemplatesResultSchema, + ReadResourceResultSchema, + CallToolResultSchema, + ListToolsResultSchema, + GetTaskResultSchema, + ListTasksResultSchema, + CreateTaskResultSchema +]); +var McpError = class _McpError extends Error { + constructor(code, message, data) { + super(`MCP error ${code}: ${message}`); + this.code = code; + this.data = data; + this.name = "McpError"; + } + /** + * Factory method to create the appropriate error type based on the error code and data + */ + static fromError(code, message, data) { + if (code === ErrorCode.UrlElicitationRequired && data) { + const errorData = data; + if (errorData.elicitations) { + return new UrlElicitationRequiredError(errorData.elicitations, message); + } + } + return new _McpError(code, message, data); + } +}; +var UrlElicitationRequiredError = class extends McpError { + constructor(elicitations, message = `URL elicitation${elicitations.length > 1 ? "s" : ""} required`) { + super(ErrorCode.UrlElicitationRequired, message, { + elicitations + }); + } + get elicitations() { + return this.data?.elicitations ?? []; + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js +function isTerminal(status) { + return status === "completed" || status === "failed" || status === "cancelled"; +} + +// node_modules/zod-to-json-schema/dist/esm/Options.js +var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); + +// node_modules/zod-to-json-schema/dist/esm/parsers/string.js +var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js +function getMethodLiteral(schema) { + const shape = getObjectShape(schema); + const methodSchema = shape?.method; + if (!methodSchema) { + throw new Error("Schema is missing a method literal"); + } + const value = getLiteralValue(methodSchema); + if (typeof value !== "string") { + throw new Error("Schema method literal must be a string"); + } + return value; +} +function parseWithCompat(schema, data) { + const result = safeParse2(schema, data); + if (!result.success) { + throw result.error; + } + return result.data; +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js +var DEFAULT_REQUEST_TIMEOUT_MSEC = 6e4; +var Protocol = class { + constructor(_options) { + this._options = _options; + this._requestMessageId = 0; + this._requestHandlers = /* @__PURE__ */ new Map(); + this._requestHandlerAbortControllers = /* @__PURE__ */ new Map(); + this._notificationHandlers = /* @__PURE__ */ new Map(); + this._responseHandlers = /* @__PURE__ */ new Map(); + this._progressHandlers = /* @__PURE__ */ new Map(); + this._timeoutInfo = /* @__PURE__ */ new Map(); + this._pendingDebouncedNotifications = /* @__PURE__ */ new Set(); + this._taskProgressTokens = /* @__PURE__ */ new Map(); + this._requestResolvers = /* @__PURE__ */ new Map(); + this.setNotificationHandler(CancelledNotificationSchema, (notification) => { + this._oncancel(notification); + }); + this.setNotificationHandler(ProgressNotificationSchema, (notification) => { + this._onprogress(notification); + }); + this.setRequestHandler( + PingRequestSchema, + // Automatic pong by default. + (_request) => ({}) + ); + this._taskStore = _options?.taskStore; + this._taskMessageQueue = _options?.taskMessageQueue; + if (this._taskStore) { + this.setRequestHandler(GetTaskRequestSchema, async (request, extra) => { + const task = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, "Failed to retrieve task: Task not found"); + } + return { + ...task + }; + }); + this.setRequestHandler(GetTaskPayloadRequestSchema, async (request, extra) => { + const handleTaskResult = async () => { + const taskId = request.params.taskId; + if (!await this._taskStore.getTask(taskId, extra.sessionId)) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`); + } + if (this._taskMessageQueue) { + let queuedMessage; + while (queuedMessage = await this._taskMessageQueue.dequeue(taskId, extra.sessionId)) { + if (queuedMessage.type === "response" || queuedMessage.type === "error") { + const message = queuedMessage.message; + const requestId = message.id; + const resolver = this._requestResolvers.get(requestId); + if (resolver) { + this._requestResolvers.delete(requestId); + if (queuedMessage.type === "response") { + resolver(message); + } else { + const errorMessage2 = message; + const error2 = new McpError(errorMessage2.error.code, errorMessage2.error.message, errorMessage2.error.data); + resolver(error2); + } + } else { + const messageType = queuedMessage.type === "response" ? "Response" : "Error"; + this._onerror(new Error(`${messageType} handler missing for request ${requestId}`)); + } + continue; + } + await this._transport?.send(queuedMessage.message, { relatedRequestId: extra.requestId }); + } + } + const task = await this._taskStore.getTask(taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`); + } + if (!isTerminal(task.status)) { + await this._waitForTaskUpdate(taskId, extra.signal, extra.sessionId); + return await handleTaskResult(); + } + if (isTerminal(task.status)) { + const result = await this._taskStore.getTaskResult(taskId, extra.sessionId); + this._clearTaskQueue(taskId, extra.sessionId); + return { + ...result, + _meta: { + ...result._meta, + [RELATED_TASK_META_KEY]: { + taskId + } + } + }; + } + return await handleTaskResult(); + }; + return await handleTaskResult(); + }); + this.setRequestHandler(ListTasksRequestSchema, async (request, extra) => { + try { + const { tasks, nextCursor } = await this._taskStore.listTasks(request.params?.cursor, extra.sessionId); + return { + tasks, + nextCursor, + _meta: {} + }; + } catch (error2) { + throw new McpError(ErrorCode.InvalidParams, `Failed to list tasks: ${error2 instanceof Error ? error2.message : String(error2)}`); + } + }); + this.setRequestHandler(CancelTaskRequestSchema, async (request, extra) => { + try { + const task = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${request.params.taskId}`); + } + if (isTerminal(task.status)) { + throw new McpError(ErrorCode.InvalidParams, `Cannot cancel task in terminal status: ${task.status}`); + } + await this._taskStore.updateTaskStatus(request.params.taskId, "cancelled", "Client cancelled task execution.", extra.sessionId); + this._clearTaskQueue(request.params.taskId, extra.sessionId); + const cancelledTask = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!cancelledTask) { + throw new McpError(ErrorCode.InvalidParams, `Task not found after cancellation: ${request.params.taskId}`); + } + return { + _meta: {}, + ...cancelledTask + }; + } catch (error2) { + if (error2 instanceof McpError) { + throw error2; + } + throw new McpError(ErrorCode.InvalidRequest, `Failed to cancel task: ${error2 instanceof Error ? error2.message : String(error2)}`); + } + }); + } + } + async _oncancel(notification) { + if (!notification.params.requestId) { + return; + } + const controller = this._requestHandlerAbortControllers.get(notification.params.requestId); + controller?.abort(notification.params.reason); + } + _setupTimeout(messageId, timeout, maxTotalTimeout, onTimeout, resetTimeoutOnProgress = false) { + this._timeoutInfo.set(messageId, { + timeoutId: setTimeout(onTimeout, timeout), + startTime: Date.now(), + timeout, + maxTotalTimeout, + resetTimeoutOnProgress, + onTimeout + }); + } + _resetTimeout(messageId) { + const info = this._timeoutInfo.get(messageId); + if (!info) + return false; + const totalElapsed = Date.now() - info.startTime; + if (info.maxTotalTimeout && totalElapsed >= info.maxTotalTimeout) { + this._timeoutInfo.delete(messageId); + throw McpError.fromError(ErrorCode.RequestTimeout, "Maximum total timeout exceeded", { + maxTotalTimeout: info.maxTotalTimeout, + totalElapsed + }); + } + clearTimeout(info.timeoutId); + info.timeoutId = setTimeout(info.onTimeout, info.timeout); + return true; + } + _cleanupTimeout(messageId) { + const info = this._timeoutInfo.get(messageId); + if (info) { + clearTimeout(info.timeoutId); + this._timeoutInfo.delete(messageId); + } + } + /** + * Attaches to the given transport, starts it, and starts listening for messages. + * + * The Protocol object assumes ownership of the Transport, replacing any callbacks that have already been set, and expects that it is the only user of the Transport instance going forward. + */ + async connect(transport2) { + if (this._transport) { + throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection."); + } + this._transport = transport2; + const _onclose = this.transport?.onclose; + this._transport.onclose = () => { + _onclose?.(); + this._onclose(); + }; + const _onerror = this.transport?.onerror; + this._transport.onerror = (error2) => { + _onerror?.(error2); + this._onerror(error2); + }; + const _onmessage = this._transport?.onmessage; + this._transport.onmessage = (message, extra) => { + _onmessage?.(message, extra); + if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) { + this._onresponse(message); + } else if (isJSONRPCRequest(message)) { + this._onrequest(message, extra); + } else if (isJSONRPCNotification(message)) { + this._onnotification(message); + } else { + this._onerror(new Error(`Unknown message type: ${JSON.stringify(message)}`)); + } + }; + await this._transport.start(); + } + _onclose() { + const responseHandlers = this._responseHandlers; + this._responseHandlers = /* @__PURE__ */ new Map(); + this._progressHandlers.clear(); + this._taskProgressTokens.clear(); + this._pendingDebouncedNotifications.clear(); + for (const info of this._timeoutInfo.values()) { + clearTimeout(info.timeoutId); + } + this._timeoutInfo.clear(); + for (const controller of this._requestHandlerAbortControllers.values()) { + controller.abort(); + } + this._requestHandlerAbortControllers.clear(); + const error2 = McpError.fromError(ErrorCode.ConnectionClosed, "Connection closed"); + this._transport = void 0; + this.onclose?.(); + for (const handler of responseHandlers.values()) { + handler(error2); + } + } + _onerror(error2) { + this.onerror?.(error2); + } + _onnotification(notification) { + const handler = this._notificationHandlers.get(notification.method) ?? this.fallbackNotificationHandler; + if (handler === void 0) { + return; + } + Promise.resolve().then(() => handler(notification)).catch((error2) => this._onerror(new Error(`Uncaught error in notification handler: ${error2}`))); + } + _onrequest(request, extra) { + const handler = this._requestHandlers.get(request.method) ?? this.fallbackRequestHandler; + const capturedTransport = this._transport; + const relatedTaskId = request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId; + const sessionId = capturedTransport?.sessionId; + const store = this._taskStore; + let relatedTaskFound = true; + let relatedTaskLookup; + if (relatedTaskId && store && this._taskMessageQueue && sessionId !== void 0) { + relatedTaskFound = false; + relatedTaskLookup = (async () => { + if (!await store.getTask(relatedTaskId, sessionId)) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${relatedTaskId}`); + } + relatedTaskFound = true; + })(); + } + if (handler === void 0) { + const errorResponse = { + jsonrpc: "2.0", + id: request.id, + error: { + code: ErrorCode.MethodNotFound, + message: "Method not found" + } + }; + if (relatedTaskId && relatedTaskLookup) { + const queuedError = { type: "error", message: errorResponse, timestamp: Date.now() }; + relatedTaskLookup.then(() => this._enqueueTaskMessage(relatedTaskId, queuedError, sessionId), () => capturedTransport?.send(errorResponse)).catch((error2) => this._onerror(new Error(`Failed to send an error response: ${error2}`))); + } else if (relatedTaskId && this._taskMessageQueue) { + this._enqueueTaskMessage(relatedTaskId, { + type: "error", + message: errorResponse, + timestamp: Date.now() + }, capturedTransport?.sessionId).catch((error2) => this._onerror(new Error(`Failed to enqueue error response: ${error2}`))); + } else { + capturedTransport?.send(errorResponse).catch((error2) => this._onerror(new Error(`Failed to send an error response: ${error2}`))); + } + return; + } + const abortController = new AbortController(); + this._requestHandlerAbortControllers.set(request.id, abortController); + const taskCreationParams = isTaskAugmentedRequestParams(request.params) ? request.params.task : void 0; + const taskStore = this._taskStore ? this.requestTaskStore(request, capturedTransport?.sessionId) : void 0; + const fullExtra = { + signal: abortController.signal, + sessionId: capturedTransport?.sessionId, + _meta: request.params?._meta, + sendNotification: async (notification) => { + if (abortController.signal.aborted) + return; + const notificationOptions = { relatedRequestId: request.id }; + if (relatedTaskId) { + notificationOptions.relatedTask = { taskId: relatedTaskId }; + } + await this.notification(notification, notificationOptions); + }, + sendRequest: async (r, resultSchema, options) => { + if (abortController.signal.aborted) { + throw new McpError(ErrorCode.ConnectionClosed, "Request was cancelled"); + } + const requestOptions = { ...options, relatedRequestId: request.id }; + if (relatedTaskId && !requestOptions.relatedTask) { + requestOptions.relatedTask = { taskId: relatedTaskId }; + } + const effectiveTaskId = requestOptions.relatedTask?.taskId ?? relatedTaskId; + if (effectiveTaskId && taskStore) { + await taskStore.updateTaskStatus(effectiveTaskId, "input_required"); + } + return await this.request(r, resultSchema, requestOptions); + }, + authInfo: extra?.authInfo, + requestId: request.id, + requestInfo: extra?.requestInfo, + taskId: relatedTaskId, + taskStore, + taskRequestedTtl: taskCreationParams?.ttl, + closeSSEStream: extra?.closeSSEStream, + closeStandaloneSSEStream: extra?.closeStandaloneSSEStream + }; + (relatedTaskLookup ?? Promise.resolve()).then(() => { + if (relatedTaskLookup && abortController.signal.aborted) { + throw new McpError(ErrorCode.ConnectionClosed, "Request was cancelled"); + } + if (taskCreationParams) { + this.assertTaskHandlerCapability(request.method); + } + }).then(() => handler(request, fullExtra)).then(async (result) => { + if (abortController.signal.aborted) { + return; + } + const response = { + result, + jsonrpc: "2.0", + id: request.id + }; + if (relatedTaskId && this._taskMessageQueue) { + await this._enqueueTaskMessage(relatedTaskId, { + type: "response", + message: response, + timestamp: Date.now() + }, capturedTransport?.sessionId); + } else { + await capturedTransport?.send(response); + } + }, async (error2) => { + if (abortController.signal.aborted) { + return; + } + const errorResponse = { + jsonrpc: "2.0", + id: request.id, + error: { + code: Number.isSafeInteger(error2["code"]) ? error2["code"] : ErrorCode.InternalError, + message: error2.message ?? "Internal error", + ...error2["data"] !== void 0 && { data: error2["data"] } + } + }; + if (relatedTaskId && this._taskMessageQueue && relatedTaskFound) { + await this._enqueueTaskMessage(relatedTaskId, { + type: "error", + message: errorResponse, + timestamp: Date.now() + }, capturedTransport?.sessionId); + } else { + await capturedTransport?.send(errorResponse); + } + }).catch((error2) => this._onerror(new Error(`Failed to send response: ${error2}`))).finally(() => { + if (this._requestHandlerAbortControllers.get(request.id) === abortController) { + this._requestHandlerAbortControllers.delete(request.id); + } + }); + } + _onprogress(notification) { + const { progressToken, ...params } = notification.params; + const messageId = Number(progressToken); + const handler = this._progressHandlers.get(messageId); + if (!handler) { + this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(notification)}`)); + return; + } + const responseHandler = this._responseHandlers.get(messageId); + const timeoutInfo = this._timeoutInfo.get(messageId); + if (timeoutInfo && responseHandler && timeoutInfo.resetTimeoutOnProgress) { + try { + this._resetTimeout(messageId); + } catch (error2) { + this._responseHandlers.delete(messageId); + this._progressHandlers.delete(messageId); + this._cleanupTimeout(messageId); + responseHandler(error2); + return; + } + } + handler(params); + } + _onresponse(response) { + const messageId = Number(response.id); + const resolver = this._requestResolvers.get(messageId); + if (resolver) { + this._requestResolvers.delete(messageId); + if (isJSONRPCResultResponse(response)) { + resolver(response); + } else { + const error2 = new McpError(response.error.code, response.error.message, response.error.data); + resolver(error2); + } + return; + } + const handler = this._responseHandlers.get(messageId); + if (handler === void 0) { + this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(response)}`)); + return; + } + this._responseHandlers.delete(messageId); + this._cleanupTimeout(messageId); + let isTaskResponse = false; + if (isJSONRPCResultResponse(response) && response.result && typeof response.result === "object") { + const result = response.result; + if (result.task && typeof result.task === "object") { + const task = result.task; + if (typeof task.taskId === "string") { + isTaskResponse = true; + this._taskProgressTokens.set(task.taskId, messageId); + } + } + } + if (!isTaskResponse) { + this._progressHandlers.delete(messageId); + } + if (isJSONRPCResultResponse(response)) { + handler(response); + } else { + const error2 = McpError.fromError(response.error.code, response.error.message, response.error.data); + handler(error2); + } + } + get transport() { + return this._transport; + } + /** + * Closes the connection. + */ + async close() { + await this._transport?.close(); + } + /** + * Sends a request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * @example + * ```typescript + * const stream = protocol.requestStream(request, resultSchema, options); + * for await (const message of stream) { + * switch (message.type) { + * case 'taskCreated': + * console.log('Task created:', message.task.taskId); + * break; + * case 'taskStatus': + * console.log('Task status:', message.task.status); + * break; + * case 'result': + * console.log('Final result:', message.result); + * break; + * case 'error': + * console.error('Error:', message.error); + * break; + * } + * } + * ``` + * + * @experimental Use `client.experimental.tasks.requestStream()` to access this method. + */ + async *requestStream(request, resultSchema, options) { + const { task } = options ?? {}; + if (!task) { + try { + const result = await this.request(request, resultSchema, options); + yield { type: "result", result }; + } catch (error2) { + yield { + type: "error", + error: error2 instanceof McpError ? error2 : new McpError(ErrorCode.InternalError, String(error2)) + }; + } + return; + } + let taskId; + try { + const createResult = await this.request(request, CreateTaskResultSchema, options); + if (createResult.task) { + taskId = createResult.task.taskId; + yield { type: "taskCreated", task: createResult.task }; + } else { + throw new McpError(ErrorCode.InternalError, "Task creation did not return a task"); + } + while (true) { + const task2 = await this.getTask({ taskId }, options); + yield { type: "taskStatus", task: task2 }; + if (isTerminal(task2.status)) { + if (task2.status === "completed") { + const result = await this.getTaskResult({ taskId }, resultSchema, options); + yield { type: "result", result }; + } else if (task2.status === "failed") { + yield { + type: "error", + error: new McpError(ErrorCode.InternalError, `Task ${taskId} failed`) + }; + } else if (task2.status === "cancelled") { + yield { + type: "error", + error: new McpError(ErrorCode.InternalError, `Task ${taskId} was cancelled`) + }; + } + return; + } + if (task2.status === "input_required") { + const result = await this.getTaskResult({ taskId }, resultSchema, options); + yield { type: "result", result }; + return; + } + const pollInterval = task2.pollInterval ?? this._options?.defaultTaskPollInterval ?? 1e3; + await new Promise((resolve) => setTimeout(resolve, pollInterval)); + options?.signal?.throwIfAborted(); + } + } catch (error2) { + yield { + type: "error", + error: error2 instanceof McpError ? error2 : new McpError(ErrorCode.InternalError, String(error2)) + }; + } + } + /** + * Sends a request and waits for a response. + * + * Do not use this method to emit notifications! Use notification() instead. + */ + request(request, resultSchema, options) { + const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options ?? {}; + return new Promise((resolve, reject) => { + const earlyReject = (error2) => { + reject(error2); + }; + if (!this._transport) { + earlyReject(new Error("Not connected")); + return; + } + if (this._options?.enforceStrictCapabilities === true) { + try { + this.assertCapabilityForMethod(request.method); + if (task) { + this.assertTaskCapability(request.method); + } + } catch (e) { + earlyReject(e); + return; + } + } + options?.signal?.throwIfAborted(); + const messageId = this._requestMessageId++; + const jsonrpcRequest = { + ...request, + jsonrpc: "2.0", + id: messageId + }; + if (options?.onprogress) { + this._progressHandlers.set(messageId, options.onprogress); + jsonrpcRequest.params = { + ...request.params, + _meta: { + ...request.params?._meta || {}, + progressToken: messageId + } + }; + } + if (task) { + jsonrpcRequest.params = { + ...jsonrpcRequest.params, + task + }; + } + if (relatedTask) { + jsonrpcRequest.params = { + ...jsonrpcRequest.params, + _meta: { + ...jsonrpcRequest.params?._meta || {}, + [RELATED_TASK_META_KEY]: relatedTask + } + }; + } + const cancel = (reason) => { + this._responseHandlers.delete(messageId); + this._progressHandlers.delete(messageId); + this._cleanupTimeout(messageId); + this._transport?.send({ + jsonrpc: "2.0", + method: "notifications/cancelled", + params: { + requestId: messageId, + reason: String(reason) + } + }, { relatedRequestId, resumptionToken, onresumptiontoken }).catch((error3) => this._onerror(new Error(`Failed to send cancellation: ${error3}`))); + const error2 = reason instanceof McpError ? reason : new McpError(ErrorCode.RequestTimeout, String(reason)); + reject(error2); + }; + this._responseHandlers.set(messageId, (response) => { + if (options?.signal?.aborted) { + return; + } + if (response instanceof Error) { + return reject(response); + } + try { + const parseResult = safeParse2(resultSchema, response.result); + if (!parseResult.success) { + reject(parseResult.error); + } else { + resolve(parseResult.data); + } + } catch (error2) { + reject(error2); + } + }); + options?.signal?.addEventListener("abort", () => { + cancel(options?.signal?.reason); + }); + const timeout = options?.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC; + const timeoutHandler = () => cancel(McpError.fromError(ErrorCode.RequestTimeout, "Request timed out", { timeout })); + this._setupTimeout(messageId, timeout, options?.maxTotalTimeout, timeoutHandler, options?.resetTimeoutOnProgress ?? false); + const relatedTaskId = relatedTask?.taskId; + if (relatedTaskId) { + const responseResolver = (response) => { + const handler = this._responseHandlers.get(messageId); + if (handler) { + handler(response); + } else { + this._onerror(new Error(`Response handler missing for side-channeled request ${messageId}`)); + } + }; + this._requestResolvers.set(messageId, responseResolver); + this._enqueueTaskMessage(relatedTaskId, { + type: "request", + message: jsonrpcRequest, + timestamp: Date.now() + }).catch((error2) => { + this._cleanupTimeout(messageId); + reject(error2); + }); + } else { + this._transport.send(jsonrpcRequest, { relatedRequestId, resumptionToken, onresumptiontoken }).catch((error2) => { + this._cleanupTimeout(messageId); + reject(error2); + }); + } + }); + } + /** + * Gets the current status of a task. + * + * @experimental Use `client.experimental.tasks.getTask()` to access this method. + */ + async getTask(params, options) { + return this.request({ method: "tasks/get", params }, GetTaskResultSchema, options); + } + /** + * Retrieves the result of a completed task. + * + * @experimental Use `client.experimental.tasks.getTaskResult()` to access this method. + */ + async getTaskResult(params, resultSchema, options) { + return this.request({ method: "tasks/result", params }, resultSchema, options); + } + /** + * Lists tasks, optionally starting from a pagination cursor. + * + * @experimental Use `client.experimental.tasks.listTasks()` to access this method. + */ + async listTasks(params, options) { + return this.request({ method: "tasks/list", params }, ListTasksResultSchema, options); + } + /** + * Cancels a specific task. + * + * @experimental Use `client.experimental.tasks.cancelTask()` to access this method. + */ + async cancelTask(params, options) { + return this.request({ method: "tasks/cancel", params }, CancelTaskResultSchema, options); + } + /** + * Emits a notification, which is a one-way message that does not expect a response. + */ + async notification(notification, options) { + if (!this._transport) { + throw new Error("Not connected"); + } + this.assertNotificationCapability(notification.method); + const relatedTaskId = options?.relatedTask?.taskId; + if (relatedTaskId) { + const jsonrpcNotification2 = { + ...notification, + jsonrpc: "2.0", + params: { + ...notification.params, + _meta: { + ...notification.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + await this._enqueueTaskMessage(relatedTaskId, { + type: "notification", + message: jsonrpcNotification2, + timestamp: Date.now() + }); + return; + } + const debouncedMethods = this._options?.debouncedNotificationMethods ?? []; + const canDebounce = debouncedMethods.includes(notification.method) && !notification.params && !options?.relatedRequestId && !options?.relatedTask; + if (canDebounce) { + if (this._pendingDebouncedNotifications.has(notification.method)) { + return; + } + this._pendingDebouncedNotifications.add(notification.method); + Promise.resolve().then(() => { + this._pendingDebouncedNotifications.delete(notification.method); + if (!this._transport) { + return; + } + let jsonrpcNotification2 = { + ...notification, + jsonrpc: "2.0" + }; + if (options?.relatedTask) { + jsonrpcNotification2 = { + ...jsonrpcNotification2, + params: { + ...jsonrpcNotification2.params, + _meta: { + ...jsonrpcNotification2.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + } + this._transport?.send(jsonrpcNotification2, options).catch((error2) => this._onerror(error2)); + }); + return; + } + let jsonrpcNotification = { + ...notification, + jsonrpc: "2.0" + }; + if (options?.relatedTask) { + jsonrpcNotification = { + ...jsonrpcNotification, + params: { + ...jsonrpcNotification.params, + _meta: { + ...jsonrpcNotification.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + } + await this._transport.send(jsonrpcNotification, options); + } + /** + * Registers a handler to invoke when this protocol object receives a request with the given method. + * + * Note that this will replace any previous request handler for the same method. + */ + setRequestHandler(requestSchema, handler) { + const method = getMethodLiteral(requestSchema); + this.assertRequestHandlerCapability(method); + this._requestHandlers.set(method, (request, extra) => { + const parsed = parseWithCompat(requestSchema, request); + return Promise.resolve(handler(parsed, extra)); + }); + } + /** + * Removes the request handler for the given method. + */ + removeRequestHandler(method) { + this._requestHandlers.delete(method); + } + /** + * Asserts that a request handler has not already been set for the given method, in preparation for a new one being automatically installed. + */ + assertCanSetRequestHandler(method) { + if (this._requestHandlers.has(method)) { + throw new Error(`A request handler for ${method} already exists, which would be overridden`); + } + } + /** + * Registers a handler to invoke when this protocol object receives a notification with the given method. + * + * Note that this will replace any previous notification handler for the same method. + */ + setNotificationHandler(notificationSchema, handler) { + const method = getMethodLiteral(notificationSchema); + this._notificationHandlers.set(method, (notification) => { + const parsed = parseWithCompat(notificationSchema, notification); + return Promise.resolve(handler(parsed)); + }); + } + /** + * Removes the notification handler for the given method. + */ + removeNotificationHandler(method) { + this._notificationHandlers.delete(method); + } + /** + * Cleans up the progress handler associated with a task. + * This should be called when a task reaches a terminal status. + */ + _cleanupTaskProgressHandler(taskId) { + const progressToken = this._taskProgressTokens.get(taskId); + if (progressToken !== void 0) { + this._progressHandlers.delete(progressToken); + this._taskProgressTokens.delete(taskId); + } + } + /** + * Enqueues a task-related message for side-channel delivery via tasks/result. + * @param taskId The task ID to associate the message with + * @param message The message to enqueue + * @param sessionId Optional session ID for binding the operation to a specific session + * @throws Error if taskStore is not configured or if enqueue fails (e.g., queue overflow) + * + * Note: If enqueue fails, it's the TaskMessageQueue implementation's responsibility to handle + * the error appropriately (e.g., by failing the task, logging, etc.). The Protocol layer + * simply propagates the error. + */ + async _enqueueTaskMessage(taskId, message, sessionId) { + if (!this._taskStore || !this._taskMessageQueue) { + throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured"); + } + const maxQueueSize = this._options?.maxTaskQueueSize; + await this._taskMessageQueue.enqueue(taskId, message, sessionId ?? this._transport?.sessionId, maxQueueSize); + } + /** + * Clears the message queue for a task and rejects any pending request resolvers. + * @param taskId The task ID whose queue should be cleared + * @param sessionId Optional session ID for binding the operation to a specific session + */ + async _clearTaskQueue(taskId, sessionId) { + if (this._taskMessageQueue) { + const messages = await this._taskMessageQueue.dequeueAll(taskId, sessionId); + for (const message of messages) { + if (message.type === "request" && isJSONRPCRequest(message.message)) { + const requestId = message.message.id; + const resolver = this._requestResolvers.get(requestId); + if (resolver) { + resolver(new McpError(ErrorCode.InternalError, "Task cancelled or completed")); + this._requestResolvers.delete(requestId); + } else { + this._onerror(new Error(`Resolver missing for request ${requestId} during task ${taskId} cleanup`)); + } + } + } + } + } + /** + * Waits for a task update (new messages or status change) with abort signal support. + * Uses polling to check for updates at the task's configured poll interval. + * @param taskId The task ID to wait for + * @param signal Abort signal to cancel the wait + * @param sessionId Session of the request that waits, passed to the task store + * @returns Promise that resolves when an update occurs or rejects if aborted + */ + async _waitForTaskUpdate(taskId, signal, sessionId) { + let interval = this._options?.defaultTaskPollInterval ?? 1e3; + try { + const task = await this._taskStore?.getTask(taskId, sessionId); + if (task?.pollInterval) { + interval = task.pollInterval; + } + } catch { + } + return new Promise((resolve, reject) => { + if (signal.aborted) { + reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled")); + return; + } + const timeoutId = setTimeout(resolve, interval); + signal.addEventListener("abort", () => { + clearTimeout(timeoutId); + reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled")); + }, { once: true }); + }); + } + requestTaskStore(request, sessionId) { + const taskStore = this._taskStore; + if (!taskStore) { + throw new Error("No task store configured"); + } + return { + createTask: async (taskParams) => { + if (!request) { + throw new Error("No request provided"); + } + return await taskStore.createTask(taskParams, request.id, { + method: request.method, + params: request.params + }, sessionId); + }, + getTask: async (taskId) => { + const task = await taskStore.getTask(taskId, sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, "Failed to retrieve task: Task not found"); + } + return task; + }, + storeTaskResult: async (taskId, status, result) => { + await taskStore.storeTaskResult(taskId, status, result, sessionId); + const task = await taskStore.getTask(taskId, sessionId); + if (task) { + const notification = TaskStatusNotificationSchema.parse({ + method: "notifications/tasks/status", + params: task + }); + await this.notification(notification); + if (isTerminal(task.status)) { + this._cleanupTaskProgressHandler(taskId); + } + } + }, + getTaskResult: (taskId) => { + return taskStore.getTaskResult(taskId, sessionId); + }, + updateTaskStatus: async (taskId, status, statusMessage) => { + const task = await taskStore.getTask(taskId, sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task "${taskId}" not found - it may have been cleaned up`); + } + if (isTerminal(task.status)) { + throw new McpError(ErrorCode.InvalidParams, `Cannot update task "${taskId}" from terminal status "${task.status}" to "${status}". Terminal states (completed, failed, cancelled) cannot transition to other states.`); + } + await taskStore.updateTaskStatus(taskId, status, statusMessage, sessionId); + const updatedTask = await taskStore.getTask(taskId, sessionId); + if (updatedTask) { + const notification = TaskStatusNotificationSchema.parse({ + method: "notifications/tasks/status", + params: updatedTask + }); + await this.notification(notification); + if (isTerminal(updatedTask.status)) { + this._cleanupTaskProgressHandler(taskId); + } + } + }, + listTasks: (cursor) => { + return taskStore.listTasks(cursor, sessionId); + } + }; + } +}; +function isPlainObject2(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); +} +function mergeCapabilities(base, additional) { + const result = { ...base }; + for (const key in additional) { + const k = key; + const addValue = additional[k]; + if (addValue === void 0) + continue; + const baseValue = result[k]; + if (isPlainObject2(baseValue) && isPlainObject2(addValue)) { + result[k] = { ...baseValue, ...addValue }; + } else { + result[k] = addValue; + } + } + return result; +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js +var import_ajv = __toESM(require_ajv(), 1); +var import_ajv_formats = __toESM(require_dist(), 1); +function createDefaultAjvInstance() { + const ajv = new import_ajv.default({ + strict: false, + validateFormats: true, + validateSchema: false, + allErrors: true + }); + const addFormats = import_ajv_formats.default; + addFormats(ajv); + return ajv; +} +var AjvJsonSchemaValidator = class { + /** + * Create an AJV validator + * + * @param ajv - Optional pre-configured AJV instance. If not provided, a default instance will be created. + * + * @example + * ```typescript + * // Use default configuration (recommended for most cases) + * import { AjvJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/ajv'; + * const validator = new AjvJsonSchemaValidator(); + * + * // Or provide custom AJV instance for advanced configuration + * import { Ajv } from 'ajv'; + * import addFormats from 'ajv-formats'; + * + * const ajv = new Ajv({ validateFormats: true }); + * addFormats(ajv); + * const validator = new AjvJsonSchemaValidator(ajv); + * ``` + */ + constructor(ajv) { + this._ajv = ajv ?? createDefaultAjvInstance(); + } + /** + * Create a validator for the given JSON Schema + * + * The validator is compiled once and can be reused multiple times. + * If the schema has an $id, it will be cached by AJV automatically. + * + * @param schema - Standard JSON Schema object + * @returns A validator function that validates input data + */ + getValidator(schema) { + const ajvValidator = "$id" in schema && typeof schema.$id === "string" ? this._ajv.getSchema(schema.$id) ?? this._ajv.compile(schema) : this._ajv.compile(schema); + return (input) => { + const valid = ajvValidator(input); + if (valid) { + return { + valid: true, + data: input, + errorMessage: void 0 + }; + } else { + return { + valid: false, + data: void 0, + errorMessage: this._ajv.errorsText(ajvValidator.errors) + }; + } + }; + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js +var ExperimentalServerTasks = class { + constructor(_server) { + this._server = _server; + } + /** + * Sends a request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * This method provides streaming access to request processing, allowing you to + * observe intermediate task status updates for task-augmented requests. + * + * @param request - The request to send + * @param resultSchema - Zod schema for validating the result + * @param options - Optional request options (timeout, signal, task creation params, etc.) + * @returns AsyncGenerator that yields ResponseMessage objects + * + * @experimental + */ + requestStream(request, resultSchema, options) { + return this._server.requestStream(request, resultSchema, options); + } + /** + * Sends a sampling request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * For task-augmented requests, yields 'taskCreated' and 'taskStatus' messages + * before the final result. + * + * @example + * ```typescript + * const stream = server.experimental.tasks.createMessageStream({ + * messages: [{ role: 'user', content: { type: 'text', text: 'Hello' } }], + * maxTokens: 100 + * }, { + * onprogress: (progress) => { + * // Handle streaming tokens via progress notifications + * console.log('Progress:', progress.message); + * } + * }); + * + * for await (const message of stream) { + * switch (message.type) { + * case 'taskCreated': + * console.log('Task created:', message.task.taskId); + * break; + * case 'taskStatus': + * console.log('Task status:', message.task.status); + * break; + * case 'result': + * console.log('Final result:', message.result); + * break; + * case 'error': + * console.error('Error:', message.error); + * break; + * } + * } + * ``` + * + * @param params - The sampling request parameters + * @param options - Optional request options (timeout, signal, task creation params, onprogress, etc.) + * @returns AsyncGenerator that yields ResponseMessage objects + * + * @experimental + */ + createMessageStream(params, options) { + const clientCapabilities = this._server.getClientCapabilities(); + if ((params.tools || params.toolChoice) && !clientCapabilities?.sampling?.tools) { + throw new Error("Client does not support sampling tools capability."); + } + if (params.messages.length > 0) { + const lastMessage = params.messages[params.messages.length - 1]; + const lastContent = Array.isArray(lastMessage.content) ? lastMessage.content : [lastMessage.content]; + const hasToolResults = lastContent.some((c) => c.type === "tool_result"); + const previousMessage = params.messages.length > 1 ? params.messages[params.messages.length - 2] : void 0; + const previousContent = previousMessage ? Array.isArray(previousMessage.content) ? previousMessage.content : [previousMessage.content] : []; + const hasPreviousToolUse = previousContent.some((c) => c.type === "tool_use"); + if (hasToolResults) { + if (lastContent.some((c) => c.type !== "tool_result")) { + throw new Error("The last message must contain only tool_result content if any is present"); + } + if (!hasPreviousToolUse) { + throw new Error("tool_result blocks are not matching any tool_use from the previous message"); + } + } + if (hasPreviousToolUse) { + const toolUseIds = new Set(previousContent.filter((c) => c.type === "tool_use").map((c) => c.id)); + const toolResultIds = new Set(lastContent.filter((c) => c.type === "tool_result").map((c) => c.toolUseId)); + if (toolUseIds.size !== toolResultIds.size || ![...toolUseIds].every((id) => toolResultIds.has(id))) { + throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match"); + } + } + } + return this.requestStream({ + method: "sampling/createMessage", + params + }, CreateMessageResultSchema, options); + } + /** + * Sends an elicitation request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * For task-augmented requests (especially URL-based elicitation), yields 'taskCreated' + * and 'taskStatus' messages before the final result. + * + * @example + * ```typescript + * const stream = server.experimental.tasks.elicitInputStream({ + * mode: 'url', + * message: 'Please authenticate', + * elicitationId: 'auth-123', + * url: 'https://example.com/auth' + * }, { + * task: { ttl: 300000 } // Task-augmented for long-running auth flow + * }); + * + * for await (const message of stream) { + * switch (message.type) { + * case 'taskCreated': + * console.log('Task created:', message.task.taskId); + * break; + * case 'taskStatus': + * console.log('Task status:', message.task.status); + * break; + * case 'result': + * console.log('User action:', message.result.action); + * break; + * case 'error': + * console.error('Error:', message.error); + * break; + * } + * } + * ``` + * + * @param params - The elicitation request parameters + * @param options - Optional request options (timeout, signal, task creation params, etc.) + * @returns AsyncGenerator that yields ResponseMessage objects + * + * @experimental + */ + elicitInputStream(params, options) { + const clientCapabilities = this._server.getClientCapabilities(); + const mode = params.mode ?? "form"; + switch (mode) { + case "url": { + if (!clientCapabilities?.elicitation?.url) { + throw new Error("Client does not support url elicitation."); + } + break; + } + case "form": { + if (!clientCapabilities?.elicitation?.form) { + throw new Error("Client does not support form elicitation."); + } + break; + } + } + const normalizedParams = mode === "form" && params.mode === void 0 ? { ...params, mode: "form" } : params; + return this.requestStream({ + method: "elicitation/create", + params: normalizedParams + }, ElicitResultSchema, options); + } + /** + * Gets the current status of a task. + * + * @param taskId - The task identifier + * @param options - Optional request options + * @returns The task status + * + * @experimental + */ + async getTask(taskId, options) { + return this._server.getTask({ taskId }, options); + } + /** + * Retrieves the result of a completed task. + * + * @param taskId - The task identifier + * @param resultSchema - Zod schema for validating the result + * @param options - Optional request options + * @returns The task result + * + * @experimental + */ + async getTaskResult(taskId, resultSchema, options) { + return this._server.getTaskResult({ taskId }, resultSchema, options); + } + /** + * Lists tasks with optional pagination. + * + * @param cursor - Optional pagination cursor + * @param options - Optional request options + * @returns List of tasks with optional next cursor + * + * @experimental + */ + async listTasks(cursor, options) { + return this._server.listTasks(cursor ? { cursor } : void 0, options); + } + /** + * Cancels a running task. + * + * @param taskId - The task identifier + * @param options - Optional request options + * + * @experimental + */ + async cancelTask(taskId, options) { + return this._server.cancelTask({ taskId }, options); + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js +function assertToolsCallTaskCapability(requests, method, entityName) { + if (!requests) { + throw new Error(`${entityName} does not support task creation (required for ${method})`); + } + switch (method) { + case "tools/call": + if (!requests.tools?.call) { + throw new Error(`${entityName} does not support task creation for tools/call (required for ${method})`); + } + break; + default: + break; + } +} +function assertClientRequestTaskCapability(requests, method, entityName) { + if (!requests) { + throw new Error(`${entityName} does not support task creation (required for ${method})`); + } + switch (method) { + case "sampling/createMessage": + if (!requests.sampling?.createMessage) { + throw new Error(`${entityName} does not support task creation for sampling/createMessage (required for ${method})`); + } + break; + case "elicitation/create": + if (!requests.elicitation?.create) { + throw new Error(`${entityName} does not support task creation for elicitation/create (required for ${method})`); + } + break; + default: + break; + } +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +var Server = class extends Protocol { + /** + * Initializes this server with the given name and version information. + */ + constructor(_serverInfo, options) { + super(options); + this._serverInfo = _serverInfo; + this._loggingLevels = /* @__PURE__ */ new Map(); + this.LOG_LEVEL_SEVERITY = new Map(LoggingLevelSchema.options.map((level, index) => [level, index])); + this.isMessageIgnored = (level, sessionId) => { + const currentLevel = this._loggingLevels.get(sessionId); + return currentLevel ? this.LOG_LEVEL_SEVERITY.get(level) < this.LOG_LEVEL_SEVERITY.get(currentLevel) : false; + }; + this._capabilities = options?.capabilities ?? {}; + this._instructions = options?.instructions; + this._jsonSchemaValidator = options?.jsonSchemaValidator ?? new AjvJsonSchemaValidator(); + this.setRequestHandler(InitializeRequestSchema, (request) => this._oninitialize(request)); + this.setNotificationHandler(InitializedNotificationSchema, () => this.oninitialized?.()); + if (this._capabilities.logging) { + this.setRequestHandler(SetLevelRequestSchema, async (request, extra) => { + const transportSessionId = extra.sessionId || extra.requestInfo?.headers["mcp-session-id"] || void 0; + const { level } = request.params; + const parseResult = LoggingLevelSchema.safeParse(level); + if (parseResult.success) { + this._loggingLevels.set(transportSessionId, parseResult.data); + } + return {}; + }); + } + } + /** + * Access experimental features. + * + * WARNING: These APIs are experimental and may change without notice. + * + * @experimental + */ + get experimental() { + if (!this._experimental) { + this._experimental = { + tasks: new ExperimentalServerTasks(this) + }; + } + return this._experimental; + } + /** + * Registers new capabilities. This can only be called before connecting to a transport. + * + * The new capabilities will be merged with any existing capabilities previously given (e.g., at initialization). + */ + registerCapabilities(capabilities) { + if (this.transport) { + throw new Error("Cannot register capabilities after connecting to transport"); + } + this._capabilities = mergeCapabilities(this._capabilities, capabilities); + } + /** + * Override request handler registration to enforce server-side validation for tools/call. + */ + setRequestHandler(requestSchema, handler) { + const shape = getObjectShape(requestSchema); + const methodSchema = shape?.method; + if (!methodSchema) { + throw new Error("Schema is missing a method literal"); + } + const methodValue = getLiteralValue(methodSchema); + if (typeof methodValue !== "string") { + throw new Error("Schema method literal must be a string"); + } + const method = methodValue; + if (method === "tools/call") { + const wrappedHandler = async (request, extra) => { + const validatedRequest = safeParse2(CallToolRequestSchema, request); + if (!validatedRequest.success) { + const errorMessage2 = validatedRequest.error instanceof Error ? validatedRequest.error.message : String(validatedRequest.error); + throw new McpError(ErrorCode.InvalidParams, `Invalid tools/call request: ${errorMessage2}`); + } + const { params } = validatedRequest.data; + const result = await Promise.resolve(handler(request, extra)); + if (params.task) { + const taskValidationResult = safeParse2(CreateTaskResultSchema, result); + if (!taskValidationResult.success) { + const errorMessage2 = taskValidationResult.error instanceof Error ? taskValidationResult.error.message : String(taskValidationResult.error); + throw new McpError(ErrorCode.InvalidParams, `Invalid task creation result: ${errorMessage2}`); + } + return taskValidationResult.data; + } + const validationResult = safeParse2(CallToolResultSchema, result); + if (!validationResult.success) { + const errorMessage2 = validationResult.error instanceof Error ? validationResult.error.message : String(validationResult.error); + throw new McpError(ErrorCode.InvalidParams, `Invalid tools/call result: ${errorMessage2}`); + } + return validationResult.data; + }; + return super.setRequestHandler(requestSchema, wrappedHandler); + } + return super.setRequestHandler(requestSchema, handler); + } + assertCapabilityForMethod(method) { + switch (method) { + case "sampling/createMessage": + if (!this._clientCapabilities?.sampling) { + throw new Error(`Client does not support sampling (required for ${method})`); + } + break; + case "elicitation/create": + if (!this._clientCapabilities?.elicitation) { + throw new Error(`Client does not support elicitation (required for ${method})`); + } + break; + case "roots/list": + if (!this._clientCapabilities?.roots) { + throw new Error(`Client does not support listing roots (required for ${method})`); + } + break; + case "ping": + break; + } + } + assertNotificationCapability(method) { + switch (method) { + case "notifications/message": + if (!this._capabilities.logging) { + throw new Error(`Server does not support logging (required for ${method})`); + } + break; + case "notifications/resources/updated": + case "notifications/resources/list_changed": + if (!this._capabilities.resources) { + throw new Error(`Server does not support notifying about resources (required for ${method})`); + } + break; + case "notifications/tools/list_changed": + if (!this._capabilities.tools) { + throw new Error(`Server does not support notifying of tool list changes (required for ${method})`); + } + break; + case "notifications/prompts/list_changed": + if (!this._capabilities.prompts) { + throw new Error(`Server does not support notifying of prompt list changes (required for ${method})`); + } + break; + case "notifications/elicitation/complete": + if (!this._clientCapabilities?.elicitation?.url) { + throw new Error(`Client does not support URL elicitation (required for ${method})`); + } + break; + case "notifications/cancelled": + break; + case "notifications/progress": + break; + } + } + assertRequestHandlerCapability(method) { + if (!this._capabilities) { + return; + } + switch (method) { + case "completion/complete": + if (!this._capabilities.completions) { + throw new Error(`Server does not support completions (required for ${method})`); + } + break; + case "logging/setLevel": + if (!this._capabilities.logging) { + throw new Error(`Server does not support logging (required for ${method})`); + } + break; + case "prompts/get": + case "prompts/list": + if (!this._capabilities.prompts) { + throw new Error(`Server does not support prompts (required for ${method})`); + } + break; + case "resources/list": + case "resources/templates/list": + case "resources/read": + if (!this._capabilities.resources) { + throw new Error(`Server does not support resources (required for ${method})`); + } + break; + case "tools/call": + case "tools/list": + if (!this._capabilities.tools) { + throw new Error(`Server does not support tools (required for ${method})`); + } + break; + case "tasks/get": + case "tasks/list": + case "tasks/result": + case "tasks/cancel": + if (!this._capabilities.tasks) { + throw new Error(`Server does not support tasks capability (required for ${method})`); + } + break; + case "ping": + case "initialize": + break; + } + } + assertTaskCapability(method) { + assertClientRequestTaskCapability(this._clientCapabilities?.tasks?.requests, method, "Client"); + } + assertTaskHandlerCapability(method) { + if (!this._capabilities) { + return; + } + assertToolsCallTaskCapability(this._capabilities.tasks?.requests, method, "Server"); + } + async _oninitialize(request) { + const requestedVersion = request.params.protocolVersion; + this._clientCapabilities = request.params.capabilities; + this._clientVersion = request.params.clientInfo; + const protocolVersion = SUPPORTED_PROTOCOL_VERSIONS.includes(requestedVersion) ? requestedVersion : LATEST_PROTOCOL_VERSION; + return { + protocolVersion, + capabilities: this.getCapabilities(), + serverInfo: this._serverInfo, + ...this._instructions && { instructions: this._instructions } + }; + } + /** + * After initialization has completed, this will be populated with the client's reported capabilities. + */ + getClientCapabilities() { + return this._clientCapabilities; + } + /** + * After initialization has completed, this will be populated with information about the client's name and version. + */ + getClientVersion() { + return this._clientVersion; + } + getCapabilities() { + return this._capabilities; + } + async ping() { + return this.request({ method: "ping" }, EmptyResultSchema); + } + // Implementation + async createMessage(params, options) { + if (params.tools || params.toolChoice) { + if (!this._clientCapabilities?.sampling?.tools) { + throw new Error("Client does not support sampling tools capability."); + } + } + if (params.messages.length > 0) { + const lastMessage = params.messages[params.messages.length - 1]; + const lastContent = Array.isArray(lastMessage.content) ? lastMessage.content : [lastMessage.content]; + const hasToolResults = lastContent.some((c) => c.type === "tool_result"); + const previousMessage = params.messages.length > 1 ? params.messages[params.messages.length - 2] : void 0; + const previousContent = previousMessage ? Array.isArray(previousMessage.content) ? previousMessage.content : [previousMessage.content] : []; + const hasPreviousToolUse = previousContent.some((c) => c.type === "tool_use"); + if (hasToolResults) { + if (lastContent.some((c) => c.type !== "tool_result")) { + throw new Error("The last message must contain only tool_result content if any is present"); + } + if (!hasPreviousToolUse) { + throw new Error("tool_result blocks are not matching any tool_use from the previous message"); + } + } + if (hasPreviousToolUse) { + const toolUseIds = new Set(previousContent.filter((c) => c.type === "tool_use").map((c) => c.id)); + const toolResultIds = new Set(lastContent.filter((c) => c.type === "tool_result").map((c) => c.toolUseId)); + if (toolUseIds.size !== toolResultIds.size || ![...toolUseIds].every((id) => toolResultIds.has(id))) { + throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match"); + } + } + } + if (params.tools) { + return this.request({ method: "sampling/createMessage", params }, CreateMessageResultWithToolsSchema, options); + } + return this.request({ method: "sampling/createMessage", params }, CreateMessageResultSchema, options); + } + /** + * Creates an elicitation request for the given parameters. + * For backwards compatibility, `mode` may be omitted for form requests and will default to `'form'`. + * @param params The parameters for the elicitation request. + * @param options Optional request options. + * @returns The result of the elicitation request. + */ + async elicitInput(params, options) { + const mode = params.mode ?? "form"; + switch (mode) { + case "url": { + if (!this._clientCapabilities?.elicitation?.url) { + throw new Error("Client does not support url elicitation."); + } + const urlParams = params; + return this.request({ method: "elicitation/create", params: urlParams }, ElicitResultSchema, options); + } + case "form": { + if (!this._clientCapabilities?.elicitation?.form) { + throw new Error("Client does not support form elicitation."); + } + const formParams = params.mode === "form" ? params : { ...params, mode: "form" }; + const result = await this.request({ method: "elicitation/create", params: formParams }, ElicitResultSchema, options); + if (result.action === "accept" && result.content && formParams.requestedSchema) { + try { + const validator = this._jsonSchemaValidator.getValidator(formParams.requestedSchema); + const validationResult = validator(result.content); + if (!validationResult.valid) { + throw new McpError(ErrorCode.InvalidParams, `Elicitation response content does not match requested schema: ${validationResult.errorMessage}`); + } + } catch (error2) { + if (error2 instanceof McpError) { + throw error2; + } + throw new McpError(ErrorCode.InternalError, `Error validating elicitation response: ${error2 instanceof Error ? error2.message : String(error2)}`); + } + } + return result; + } + } + } + /** + * Creates a reusable callback that, when invoked, will send a `notifications/elicitation/complete` + * notification for the specified elicitation ID. + * + * @param elicitationId The ID of the elicitation to mark as complete. + * @param options Optional notification options. Useful when the completion notification should be related to a prior request. + * @returns A function that emits the completion notification when awaited. + */ + createElicitationCompletionNotifier(elicitationId, options) { + if (!this._clientCapabilities?.elicitation?.url) { + throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)"); + } + return () => this.notification({ + method: "notifications/elicitation/complete", + params: { + elicitationId + } + }, options); + } + async listRoots(params, options) { + return this.request({ method: "roots/list", params }, ListRootsResultSchema, options); + } + /** + * Sends a logging message to the client, if connected. + * Note: You only need to send the parameters object, not the entire JSON RPC message + * @see LoggingMessageNotification + * @param params + * @param sessionId optional for stateless and backward compatibility + */ + async sendLoggingMessage(params, sessionId) { + if (this._capabilities.logging) { + if (!this.isMessageIgnored(params.level, sessionId)) { + return this.notification({ method: "notifications/message", params }); + } + } + } + async sendResourceUpdated(params) { + return this.notification({ + method: "notifications/resources/updated", + params + }); + } + async sendResourceListChanged() { + return this.notification({ + method: "notifications/resources/list_changed" + }); + } + async sendToolListChanged() { + return this.notification({ method: "notifications/tools/list_changed" }); + } + async sendPromptListChanged() { + return this.notification({ method: "notifications/prompts/list_changed" }); + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js +import process2 from "node:process"; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js +var STDIO_DEFAULT_MAX_BUFFER_SIZE = 10 * 1024 * 1024; +var ReadBuffer = class { + constructor(options) { + this._maxBufferSize = options?.maxBufferSize ?? STDIO_DEFAULT_MAX_BUFFER_SIZE; + } + append(chunk) { + const newSize = (this._buffer?.length ?? 0) + chunk.length; + if (newSize > this._maxBufferSize) { + this.clear(); + throw new Error(`ReadBuffer exceeded maximum size of ${this._maxBufferSize} bytes`); + } + this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk; + } + readMessage() { + if (!this._buffer) { + return null; + } + const index = this._buffer.indexOf("\n"); + if (index === -1) { + return null; + } + const line = this._buffer.toString("utf8", 0, index).replace(/\r$/, ""); + this._buffer = this._buffer.subarray(index + 1); + return deserializeMessage(line); + } + clear() { + this._buffer = void 0; + } +}; +function deserializeMessage(line) { + return JSONRPCMessageSchema.parse(JSON.parse(line)); +} +function serializeMessage(message) { + return JSON.stringify(message) + "\n"; +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js +var StdioServerTransport = class { + constructor(_stdin = process2.stdin, _stdout = process2.stdout, options) { + this._stdin = _stdin; + this._stdout = _stdout; + this._started = false; + this._ondata = (chunk) => { + try { + this._readBuffer.append(chunk); + this.processReadBuffer(); + } catch (error2) { + this.onerror?.(error2); + this.close().catch(() => { + }); + } + }; + this._onerror = (error2) => { + this.onerror?.(error2); + }; + this._readBuffer = new ReadBuffer({ maxBufferSize: options?.maxBufferSize }); + } + /** + * Starts listening for messages on stdin. + */ + async start() { + if (this._started) { + throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically."); + } + this._started = true; + this._stdin.on("data", this._ondata); + this._stdin.on("error", this._onerror); + } + processReadBuffer() { + while (true) { + try { + const message = this._readBuffer.readMessage(); + if (message === null) { + break; + } + this.onmessage?.(message); + } catch (error2) { + this.onerror?.(error2); + } + } + } + async close() { + this._stdin.off("data", this._ondata); + this._stdin.off("error", this._onerror); + const remainingDataListeners = this._stdin.listenerCount("data"); + if (remainingDataListeners === 0) { + this._stdin.pause(); + } + this._readBuffer.clear(); + this.onclose?.(); + } + send(message) { + return new Promise((resolve) => { + const json = serializeMessage(message); + if (this._stdout.write(json)) { + resolve(); + } else { + this._stdout.once("drain", resolve); + } + }); + } +}; + +// src/shared.ts +import fs from "node:fs"; +import path from "node:path"; +import os from "node:os"; + +// src/domain/errors.ts +var TeamError = class extends Error { + code; + constructor(code, message, options) { + super(message, options); + this.name = "TeamError"; + this.code = code; + } + toJSON() { + return serializeTeamError(this); + } +}; +function serializeTeamError(err) { + const out = { name: "TeamError", code: err.code, message: err.message }; + const seen = new WeakSet([err]); + const cause = err.cause; + if (cause !== void 0 && cause !== null) out.cause = serializeCause(cause, seen); + return out; +} +function serializeCause(cause, seen) { + if (!(cause instanceof Error)) return { message: String(cause) }; + if (seen.has(cause)) return { name: cause.name, message: "[circular cause]" }; + seen.add(cause); + if (cause instanceof TeamError) { + const serialized = { + name: "TeamError", + code: cause.code, + message: cause.message + }; + const inner2 = cause.cause; + if (inner2 !== void 0 && inner2 !== null) serialized.cause = serializeCause(inner2, seen); + return serialized; + } + const plain = { name: cause.name, message: cause.message }; + const inner = cause.cause; + if (inner !== void 0 && inner !== null) plain.cause = serializeCause(inner, seen); + return plain; +} +function isTeamError(x) { + return x instanceof TeamError; +} + +// src/domain/config.ts +var TEAM_LIMIT_KEYS = [ + "maxMembers", + "maxTasks", + "maxMessageBytes", + "disposalTimeoutMs" +]; +function validateTeamLimits(input) { + const out = {}; + for (const key of TEAM_LIMIT_KEYS) { + const raw = input[key]; + const n = coerceInteger(raw); + if (n === void 0 || !Number.isSafeInteger(n) || n < 1) { + throw new TeamError("TEAM_INVALID_CONFIG", `${key} must be a positive safe integer`, { + cause: { key, value: raw } + }); + } + out[key] = n; + } + return out; +} +function coerceInteger(raw) { + if (typeof raw === "number") return raw; + if (typeof raw === "string" && /^-?\d+$/.test(raw.trim())) return Number(raw.trim()); + return void 0; +} +function validateLeadMode(raw) { + return raw === "collaborator" ? "collaborator" : "orchestrator"; +} + +// src/shared.ts +function dataDir() { + const candidates = [ + process.env.TEAM_PLUGIN_DATA, + process.env.ZCODE_PLUGIN_DATA, + process.env.CLAUDE_PLUGIN_DATA + ]; + for (const c of candidates) if (c && c.trim()) return c; + return path.join(os.homedir(), ".zcode", "agent-team-dev-data"); +} +function ensurePrivateDir(p) { + fs.mkdirSync(p, { recursive: true, mode: 448 }); + try { + fs.chmodSync(p, 448); + } catch { + } + return p; +} +function runtimeConfigPath() { + return path.join(dataDir(), "meta", "runtime-config.json"); +} +function writeRuntimeConfig(input) { + const file = runtimeConfigPath(); + fs.mkdirSync(path.dirname(file), { recursive: true }); + const tmp = `${file}.tmp-${process.pid}`; + const doc = { + version: 1, + interrupt: input.interrupt, + leadMode: input.leadMode, + limits: input.limits, + updatedAt: ts() + }; + const fd = fs.openSync(tmp, "w", 384); + try { + fs.writeFileSync(fd, JSON.stringify(doc, null, 2)); + fs.fsyncSync(fd); + } finally { + fs.closeSync(fd); + } + fs.renameSync(tmp, file); +} +function appendJsonl(file, obj) { + fs.appendFileSync(file, JSON.stringify(obj) + "\n", { mode: 384 }); + chmodPrivateOnce(file); +} +function ts() { + return (/* @__PURE__ */ new Date()).toISOString(); +} +var SENSITIVE_ENV_KEY = /(?:^|_)(?:KEY|KEYS|APIKEY|TOKEN|TOKENS|SECRET|SECRETS|PASSWORD|PASSWORDS|PASSWD|PASSPHRASE|AUTH|AUTHORIZATION|COOKIE|CREDENTIAL|CREDENTIALS|PRIVATE|URL|URI|DSN|CONNECTION)(?:$|_)/i; +function isSensitiveEnvKey(key) { + return SENSITIVE_ENV_KEY.test(key); +} +function sanitizeToolName(name) { + return typeof name === "string" && /^[A-Za-z0-9_.-]{1,64}$/.test(name) ? name : "unknown-tool"; +} +function metaFilePath(dataRoot, toolName, now2 = Date.now()) { + const safe = sanitizeToolName(toolName); + if (safe === "unknown-tool") return null; + const metaDir = path.resolve(dataRoot, "meta"); + const target = path.resolve(metaDir, `${safe}-${now2}-${Math.random().toString(36).slice(2, 8)}.json`); + if (!target.startsWith(`${metaDir}${path.sep}`)) return null; + return target; +} +function redactToolArguments(args) { + const redactValue = (value, depth = 0) => { + if (depth > 6) return ""; + if (typeof value === "string") { + return value.length > 256 ? `${value.slice(0, 256)}\u2026(${value.length} chars)` : value; + } + if (Array.isArray(value)) return value.map((item) => redactValue(item, depth + 1)); + if (typeof value === "object" && value !== null) { + const out = {}; + for (const [key, child] of Object.entries(value)) { + if (isSensitiveEnvKey(key)) { + out[key] = ""; + continue; + } + if (key === "message" || key === "prompt" || key === "description" || key === "content") { + const length = typeof child === "string" ? child.length : Array.isArray(child) ? child.length : 0; + out[key] = { redacted: true, chars: length }; + continue; + } + out[key] = redactValue(child, depth + 1); + } + return out; + } + return value; + }; + return redactValue(args); +} +function cleanupStaleSpecs(dataRoot, maxAgeMs = 5 * 6e4) { + const teamsRoot = path.join(dataRoot, "teams"); + let removed = 0; + let teams; + try { + teams = fs.readdirSync(teamsRoot); + } catch { + return 0; + } + const now2 = Date.now(); + for (const team of teams) { + const membersRoot = path.join(teamsRoot, team, "members"); + let members; + try { + members = fs.readdirSync(membersRoot); + } catch { + continue; + } + for (const member of members) { + const runDir = path.join(membersRoot, member, "run"); + let files; + try { + files = fs.readdirSync(runDir); + } catch { + continue; + } + for (const file of files) { + if (!file.endsWith(".spec.json")) continue; + const full = path.join(runDir, file); + try { + if (now2 - fs.statSync(full).mtimeMs > maxAgeMs) { + fs.unlinkSync(full); + removed += 1; + } + } catch { + } + } + } + } + return removed; +} +function pruneMetaFiles(dataRoot, maxFiles = 500, maxAgeMs = 7 * 24 * 36e5) { + const dir = path.join(dataRoot, "meta"); + let entries; + try { + entries = fs.readdirSync(dir).filter((name) => name.endsWith(".json")).map((name) => { + const full = path.join(dir, name); + return { name, mtimeMs: fs.statSync(full).mtimeMs }; + }); + } catch { + return 0; + } + const now2 = Date.now(); + let removed = 0; + const stale = entries.filter((e) => now2 - e.mtimeMs > maxAgeMs); + const remaining = entries.filter((e) => now2 - e.mtimeMs <= maxAgeMs).sort((a, b) => a.mtimeMs - b.mtimeMs); + const excess = Math.max(0, remaining.length - maxFiles); + for (const entry of [...stale, ...remaining.slice(0, excess)]) { + try { + fs.unlinkSync(path.join(dir, entry.name)); + removed += 1; + } catch { + } + } + return removed; +} +var chmodded = /* @__PURE__ */ new Set(); +function chmodPrivateOnce(file) { + if (chmodded.has(file)) return; + chmodded.add(file); + try { + fs.chmodSync(file, 384); + } catch { + } +} +var LIMIT_KEYS = [ + ["maxMembers", "TEAM_MAX_MEMBERS", 8], + ["maxTasks", "TEAM_MAX_TASKS", 256], + ["maxMessageBytes", "TEAM_MAX_MESSAGE_BYTES", 65536], + ["disposalTimeoutMs", "TEAM_DISPOSAL_TIMEOUT_MS", 5e3] +]; +function loadConfig() { + const input = {}; + for (const [key, envName, def] of LIMIT_KEYS) { + const raw = process.env[envName]; + input[key] = raw === void 0 || raw === "" ? def : raw; + } + try { + return { ok: true, values: validateTeamLimits(input) }; + } catch (err) { + const detail = err instanceof Error ? err.message : String(err); + return { + ok: false, + error: `TEAM_INVALID_CONFIG: ${detail}\uFF08\u8BF7\u5728 Settings \u2192 Plugins \u2192 agent-team \u7684\u7528\u6237\u914D\u7F6E\u4E2D\u6539\u56DE\u6B63\u6574\u6570\uFF09\u3002` + }; + } +} +function logErr(scope, msg, extra) { + try { + process.stderr.write( + JSON.stringify({ ts: ts(), scope, msg, extra }) + "\n" + ); + } catch { + } +} + +// src/coord/lock.ts +import crypto from "node:crypto"; +import fs2 from "node:fs"; +import path2 from "node:path"; + +// src/coord/identity.ts +import { randomUUID } from "node:crypto"; +var cachedBootId; +function bootId() { + cachedBootId ??= randomUUID(); + return cachedBootId; +} +function writerId() { + return `${bootId()}:${process.pid}`; +} +function parseWriterId(writer) { + const sep = writer.lastIndexOf(":"); + if (sep <= 0) return void 0; + const pid = Number(writer.slice(sep + 1)); + const id = writer.slice(0, sep); + if (!Number.isInteger(pid) || id.length === 0) return void 0; + return { bootId: id, pid }; +} + +// src/coord/lock.ts +var DEFAULT_LOCK_TUNING = { + heartbeatMs: 1e3, + expiryMs: 4500, + pollMs: 200 +}; +var exitReleases = /* @__PURE__ */ new Set(); +var exitHookInstalled = false; +function registerExitRelease(release) { + exitReleases.add(release); + if (!exitHookInstalled) { + exitHookInstalled = true; + process.once("exit", () => { + for (const fn of [...exitReleases]) { + try { + fn(); + } catch { + } + } + exitReleases.clear(); + }); + } + return () => exitReleases.delete(release); +} +var AcquireTimeout = class extends Error { + constructor(message) { + super(message); + this.name = "AcquireTimeout"; + } +}; +function heartbeatFileFor(lockFile, token) { + return `${lockFile}.hb-${token}`; +} +var CoordinatorLock = class { + lockFile; + auditFile; + tuning; + ownerBootId; + onLost; + held = null; + heartbeatTimer = null; + exitUnregister = null; + constructor(lockFile, auditFile, opts = {}) { + this.lockFile = lockFile; + this.auditFile = auditFile; + const { ownerBootId, onLost, ...tuning } = opts; + this.tuning = { ...DEFAULT_LOCK_TUNING, ...tuning }; + this.ownerBootId = ownerBootId ?? bootId(); + this.onLost = onLost; + } + get info() { + return this.held?.info ?? null; + } + get isHeld() { + return this.held !== null; + } + get tuningOptions() { + return { ...this.tuning }; + } + /** + * 抢锁(原子):O_EXCL 创建 owner 文件即持有。已存在时——新鲜则等待重试,过期 + * (心跳龄 > expiryMs;不可解析按 mtime)则经 guard 复核后 quarantine 再重抢。 + * waitMs 内未获得 → AcquireTimeout(所有分支都受 deadline 约束)。 + */ + async acquire(opts = {}) { + const waitMs = opts.waitMs ?? 0; + const deadline = Date.now() + waitMs; + const timeout = () => { + throw new AcquireTimeout(`coordinator lock not acquired within ${waitMs}ms (holder alive)`); + }; + for (; ; ) { + const claimed = await this.tryClaim(); + if (claimed !== null) return claimed; + const observed = this.observe(); + if (!observed.exists) { + if (Date.now() >= deadline) timeout(); + await sleep(1); + continue; + } + if (observed.ageMs > this.tuning.expiryMs) { + this.steal(observed); + continue; + } + if (Date.now() >= deadline) timeout(); + await sleep(Math.min(this.tuning.pollMs, Math.max(deadline - Date.now(), 1))); + } + } + /** 续持:owner inode + token 双 CAS 通过后写心跳;被抢/丢失 → false(onLost 恰一次)。 */ + async renew() { + const held = this.held; + if (held === null) return false; + const owner = this.readOwner(); + if (owner === null || owner.info.token !== held.token || owner.ino !== held.ino || owner.info.pid !== process.pid || owner.info.bootId !== this.ownerBootId) { + this.markLost(owner?.info ?? held.info); + return false; + } + const now2 = Date.now(); + try { + this.writeHeartbeat(held.token, now2); + } catch (err) { + this.audit("renew-failed", { error: String(err) }); + this.markLost(owner.info); + return false; + } + this.held = { ...held, info: { ...held.info, heartbeatAt: now2 } }; + return true; + } + /** 同步释放(exit handler 用;预算 ≤200ms)。只删 inode+token 均为自己的 owner 文件。 */ + releaseSync() { + this.stopHeartbeat(); + if (this.exitUnregister !== null) { + this.exitUnregister(); + this.exitUnregister = null; + } + const held = this.held; + this.held = null; + if (held === null) return; + try { + const fd = fs2.openSync(this.lockFile, "r"); + try { + const stat = fs2.fstatSync(fd); + if (stat.ino !== held.ino) { + this.audit("release-skip", { reason: "inode-changed", expected: held.ino, actual: stat.ino }); + return; + } + const info = JSON.parse(fs2.readFileSync(fd, "utf8")); + if (info.token !== held.token || info.pid !== process.pid || info.bootId !== this.ownerBootId) { + this.audit("release-skip", { reason: "owner-changed", previous: info }); + return; + } + } finally { + fs2.closeSync(fd); + } + if (fs2.statSync(this.lockFile).ino !== held.ino) { + this.audit("release-skip", { reason: "inode-changed-before-unlink" }); + return; + } + fs2.unlinkSync(this.lockFile); + this.audit("release", { via: "exit-handler" }); + } catch (err) { + if (err.code === "ENOENT") return; + this.audit("release-failed", { error: String(err) }); + } finally { + this.removeHeartbeat(held.token); + } + } + async release() { + this.releaseSync(); + } + startHeartbeat() { + this.stopHeartbeat(); + this.heartbeatTimer = setInterval(() => { + void this.renew().catch(() => { + }); + }, this.tuning.heartbeatMs); + this.heartbeatTimer.unref?.(); + } + stopHeartbeat() { + if (this.heartbeatTimer !== null) { + clearInterval(this.heartbeatTimer); + this.heartbeatTimer = null; + } + } + /** 注册 exit handler(幂等):进程退出时 best-effort 释放(单例监听器注册表)。 */ + installExitHandlers() { + if (this.exitUnregister !== null) return; + this.exitUnregister = registerExitRelease(() => this.releaseSync()); + } + /** 观察锁文件(不抢)。ageMs:可解析 = now-heartbeatAt(优先 token 心跳);否则 now-mtime。 */ + observe() { + let raw; + let stat; + try { + stat = fs2.statSync(this.lockFile); + raw = fs2.readFileSync(this.lockFile, "utf8"); + } catch { + return { exists: false, ageMs: Number.POSITIVE_INFINITY, parseable: false }; + } + try { + const info = JSON.parse(raw); + if (typeof info.pid === "number" && typeof info.bootId === "string" && typeof info.heartbeatAt === "number") { + let heartbeatAt = info.heartbeatAt; + if (typeof info.token === "string") { + const hb = this.readHeartbeat(info.token); + if (hb !== void 0) heartbeatAt = hb; + } + return { + exists: true, + info, + ageMs: Date.now() - heartbeatAt, + parseable: true, + ino: stat.ino + }; + } + } catch { + } + return { exists: true, ageMs: Date.now() - stat.mtimeMs, parseable: false, ino: stat.ino }; + } + /** 审计痕迹(获取/释放/抢占/丢失;best-effort,无 fsync)。 */ + audit(event, detail) { + if (this.auditFile === void 0) return; + try { + fs2.mkdirSync(path2.dirname(this.auditFile), { recursive: true }); + fs2.appendFileSync( + this.auditFile, + JSON.stringify({ ts: (/* @__PURE__ */ new Date()).toISOString(), event, pid: process.pid, bootId: this.ownerBootId, detail }) + "\n", + { mode: 384 } + ); + } catch { + } + } + async tryClaim() { + const now2 = Date.now(); + const token = crypto.randomBytes(12).toString("hex"); + const info = { + pid: process.pid, + bootId: this.ownerBootId, + heartbeatAt: now2, + acquiredAt: now2, + token + }; + let fd; + try { + fd = fs2.openSync(this.lockFile, "wx", 384); + } catch (err) { + if (err.code === "EEXIST") return null; + throw err; + } + let ino; + try { + fs2.writeFileSync(fd, JSON.stringify(info)); + fs2.fsyncSync(fd); + ino = fs2.fstatSync(fd).ino; + } catch (err) { + try { + const stat = fs2.fstatSync(fd); + if (stat.ino === fs2.statSync(this.lockFile).ino) fs2.unlinkSync(this.lockFile); + } catch { + } + throw err; + } finally { + fs2.closeSync(fd); + } + this.held = { info, token, ino }; + try { + this.writeHeartbeat(token, now2); + this.cleanupForeignHeartbeats(token); + } catch { + } + this.audit("acquire", { token: token.slice(0, 8), ino }); + return info; + } + readOwner() { + try { + const fd = fs2.openSync(this.lockFile, "r"); + try { + const stat = fs2.fstatSync(fd); + const info = JSON.parse(fs2.readFileSync(fd, "utf8")); + return { info, ino: stat.ino }; + } finally { + fs2.closeSync(fd); + } + } catch { + return null; + } + } + readHeartbeat(token) { + try { + const parsed = JSON.parse(fs2.readFileSync(heartbeatFileFor(this.lockFile, token), "utf8")); + if (parsed.token === token && typeof parsed.heartbeatAt === "number") return parsed.heartbeatAt; + } catch { + } + return void 0; + } + writeHeartbeat(token, at) { + const file = heartbeatFileFor(this.lockFile, token); + const tmp = `${file}.tmp-${process.pid}-${crypto.randomBytes(4).toString("hex")}`; + try { + fs2.writeFileSync(tmp, JSON.stringify({ token, heartbeatAt: at }), { mode: 384 }); + fs2.renameSync(tmp, file); + } catch (err) { + try { + fs2.unlinkSync(tmp); + } catch { + } + throw err; + } + } + removeHeartbeat(token) { + try { + fs2.unlinkSync(heartbeatFileFor(this.lockFile, token)); + } catch { + } + } + cleanupForeignHeartbeats(ownToken) { + let names; + try { + names = fs2.readdirSync(path2.dirname(this.lockFile)); + } catch { + return; + } + const prefix = `${path2.basename(this.lockFile)}.hb-`; + for (const name of names) { + if (!name.startsWith(prefix) || name === `${prefix}${ownToken}`) continue; + try { + fs2.unlinkSync(path2.join(path2.dirname(this.lockFile), name)); + } catch { + } + } + } + /** + * 过期抢占:guard 单飞 → 重读复核 → rename 到 quarantine → 校验 inode。 + * 若 rename 到的不是观察到的 inode(竞争者刚换了新锁)→ 尝试归还并回滚。 + */ + steal(observed) { + const guard = `${this.lockFile}.guard-${process.pid}-${crypto.randomBytes(4).toString("hex")}`; + let guardFd; + try { + guardFd = fs2.openSync(guard, "wx", 384); + } catch (err) { + if (err.code === "EEXIST") return; + throw err; + } + try { + const current = this.observe(); + if (!current.exists || current.ageMs <= this.tuning.expiryMs) return; + if (observed.ino === void 0 || current.ino !== observed.ino || current.info?.token !== observed.info?.token) { + return; + } + const quarantine = `${this.lockFile}.stale-${Date.now()}-${crypto.randomBytes(4).toString("hex")}`; + try { + fs2.renameSync(this.lockFile, quarantine); + } catch (err) { + if (err.code === "ENOENT") return; + throw err; + } + let quarantinedIno = null; + try { + quarantinedIno = fs2.statSync(quarantine).ino; + } catch { + quarantinedIno = null; + } + if (quarantinedIno !== current.ino) { + try { + fs2.linkSync(quarantine, this.lockFile); + fs2.unlinkSync(quarantine); + this.audit("steal-rollback", { reason: "inode-mismatch", quarantinedIno, expected: current.ino }); + } catch (rollbackErr) { + this.audit("steal-rollback-failed", { + reason: "inode-mismatch", + quarantinedIno, + expected: current.ino, + error: String(rollbackErr), + quarantine + }); + } + return; + } + this.audit("steal", { + reason: current.parseable ? "heartbeat-expired" : "unparseable-and-aged", + previous: current.info ?? { mtimeAgeMs: Math.round(current.ageMs) }, + quarantine + }); + if (typeof current.info?.token === "string") this.removeHeartbeat(current.info.token); + } finally { + try { + fs2.closeSync(guardFd); + } catch { + } + try { + fs2.unlinkSync(guard); + } catch { + } + } + } + markLost(previous) { + if (this.held === null) return; + this.audit("lost", { previous }); + this.held = null; + this.stopHeartbeat(); + this.onLost?.({ previous }); + } +}; +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +// src/coord/journal.ts +import fs5 from "node:fs"; +import path4 from "node:path"; + +// src/domain/events.ts +var IMAGE_MEDIA_TYPES = ["png", "jpeg", "webp", "gif"]; +function validateContentBlock(block) { + if (typeof block !== "object" || block === null || Array.isArray(block)) { + throw new Error("content block must be a JSON object"); + } + const b = block; + switch (b.type) { + case "text": + case "reasoning": + if (typeof b.text !== "string") throw new Error(`${String(b.type)} block requires string text`); + return block; + case "image": { + const a = b.attachment; + if (typeof a !== "object" || a === null || Array.isArray(a)) { + throw new Error("image block requires object attachment"); + } + const att = a; + if (typeof att.attachmentId !== "string") throw new Error("image attachment requires string attachmentId"); + if (typeof att.mediaType !== "string" || !IMAGE_MEDIA_TYPES.includes(att.mediaType)) { + throw new Error(`image attachment mediaType must be one of ${IMAGE_MEDIA_TYPES.join("/")}`); + } + if (typeof att.bytes !== "number") throw new Error("image attachment requires number bytes"); + if (typeof att.width !== "number") throw new Error("image attachment requires number width"); + if (typeof att.height !== "number") throw new Error("image attachment requires number height"); + if (att.name !== void 0 && typeof att.name !== "string") { + throw new Error("image attachment name must be a string when present"); + } + return block; + } + case "tool-call": { + if (typeof b.id !== "string") throw new Error("tool-call block requires string id"); + if (typeof b.name !== "string") throw new Error("tool-call block requires string name"); + if (!("arguments" in b)) throw new Error("tool-call block requires arguments"); + return block; + } + case "tool-result": + throw new Error("retired tool-result wrapper is not accepted as Team message content"); + default: + return block; + } +} +var contentBlocksSchema = external_exports.array(external_exports.unknown()).superRefine((blocks, ctx) => { + for (let i = 0; i < blocks.length; i++) { + try { + validateContentBlock(blocks[i]); + } catch (err) { + ctx.addIssue({ + code: external_exports.ZodIssueCode.custom, + path: [i], + message: err instanceof Error ? err.message : String(err) + }); + } + } +}); +var TASK_ID_PATTERN = /^task-(\d+)$/; +function isLooseIdValid(id) { + if (id.length === 0) return false; + const m = id.match(TASK_ID_PATTERN); + if (m && !Number.isSafeInteger(Number(m[1]))) return false; + return true; +} +function taskNumberFromId(id) { + const m = id.match(TASK_ID_PATTERN); + return m ? Number(m[1]) : void 0; +} +var looseIdSchema = external_exports.string().refine(isLooseIdValid, { message: "invalid loose id" }); +var memberSnapshotSchema = external_exports.strictObject({ + id: external_exports.string(), + name: external_exports.string(), + description: external_exports.string(), + provider: external_exports.string(), + context: external_exports.enum(["fresh", "fork"]), + phase: external_exports.enum(["provisioning", "active", "failed"]), + error: external_exports.string().optional() +}); +var taskSnapshotSchema = external_exports.strictObject({ + id: looseIdSchema, + revision: external_exports.number().refine((n) => Number.isSafeInteger(n) && n >= 1, { + message: "revision must be a positive safe integer" + }), + subject: external_exports.string(), + description: external_exports.string(), + status: external_exports.enum(["pending", "in_progress", "completed", "deleted"]), + ownerId: external_exports.string().optional(), + blockedBy: external_exports.array(external_exports.string()), + writeScopes: external_exports.array(external_exports.string()) +}); +var messageSnapshotSchema = external_exports.strictObject({ + id: looseIdSchema, + senderId: external_exports.string(), + senderName: external_exports.string(), + targetId: external_exports.string(), + content: contentBlocksSchema +}); +var TEAM_EVENT_VERSION = 2; +var TEAM_EVENT_TYPES = [ + "team/member", + "team/task", + "team/message/queued", + "team/message/delivered" +]; +var memberEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/member"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + member: memberSnapshotSchema +}); +var taskEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/task"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + task: taskSnapshotSchema +}); +var messageQueuedEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/message/queued"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + message: messageSnapshotSchema +}); +var messageDeliveredEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/message/delivered"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + messageId: external_exports.string(), + targetId: external_exports.string() +}); +var TEAM_EVENT_SCHEMAS = { + "team/member": memberEventSchema, + "team/task": taskEventSchema, + "team/message/queued": messageQueuedEventSchema, + "team/message/delivered": messageDeliveredEventSchema +}; +var LEGACY_EVENT_TYPE_ALIASES = { + "team/message": "team/message/queued" +}; +function selectTeamEvent(raw, teamId) { + if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return { kind: "ignored" }; + const candidate = raw; + const rawType = candidate.type; + if (typeof rawType !== "string") return { kind: "ignored" }; + const eventType = TEAM_EVENT_TYPES.includes(rawType) ? rawType : LEGACY_EVENT_TYPE_ALIASES[rawType]; + if (eventType === void 0) return { kind: "ignored" }; + if (typeof candidate.teamId !== "string" || candidate.teamId !== teamId) { + return { kind: "ignored" }; + } + if (candidate.version !== TEAM_EVENT_VERSION) { + return { kind: "unsupported-version", version: candidate.version }; + } + const normalized = rawType === eventType ? raw : { ...candidate, type: eventType }; + const parsed = TEAM_EVENT_SCHEMAS[eventType].safeParse(normalized); + if (!parsed.success) return { kind: "invalid-payload", type: eventType }; + return { kind: "event", event: parsed.data }; +} +var deliveredIdsSchema = external_exports.preprocess((value) => { + if (!Array.isArray(value)) return value; + return value.map((item) => { + if (typeof item === "string") return item; + if (typeof item === "object" && item !== null && typeof item.messageId === "string") { + return item.messageId; + } + return item; + }); +}, external_exports.array(external_exports.string())); +var teamStateSchema = external_exports.strictObject({ + id: external_exports.string(), + members: external_exports.array(memberSnapshotSchema), + tasks: external_exports.array(taskSnapshotSchema), + messages: external_exports.array(messageSnapshotSchema), + delivered: deliveredIdsSchema, + nextTaskNumber: external_exports.number().refine((n) => Number.isSafeInteger(n) && n >= 1, { + message: "nextTaskNumber must be a positive safe integer" + }), + failure: external_exports.string().optional() +}); + +// src/domain/task-graph.ts +function validateTaskGraph(tasks) { + const byId = new Map(tasks.map((t) => [t.id, t])); + const live = tasks.filter((t) => t.status !== "deleted"); + for (const task of live) { + for (const bid of task.blockedBy) { + if (bid === task.id) { + throw new Error(`team task "${task.id}" cannot block itself`); + } + } + } + for (const task of live) { + const seen = /* @__PURE__ */ new Set(); + for (const bid of task.blockedBy) { + if (seen.has(bid)) { + throw new Error(`team task "${task.id}" repeats blocker "${bid}"`); + } + seen.add(bid); + } + } + for (const task of live) { + for (const bid of task.blockedBy) { + const blocker = byId.get(bid); + if (blocker === void 0 || blocker.status === "deleted") { + throw new Error(`blocker task "${bid}" for "${task.id}" is missing or deleted`); + } + } + } + detectCycle(live, byId); +} +function detectCycle(live, byId) { + const WHITE = 0; + const GRAY = 1; + const BLACK = 2; + const color = /* @__PURE__ */ new Map(); + const visit = (task) => { + color.set(task.id, GRAY); + for (const bid of task.blockedBy) { + const blocker = byId.get(bid); + if (blocker === void 0 || blocker.status === "deleted") continue; + const c = color.get(bid) ?? WHITE; + if (c === GRAY) { + throw new Error(`task dependency cycle includes "${bid}"`); + } + if (c === WHITE) visit(blocker); + } + color.set(task.id, BLACK); + }; + for (const task of live) { + if ((color.get(task.id) ?? WHITE) === WHITE) visit(task); + } +} +function assertTaskGraphCandidate(existing, candidate) { + const tasks = existing.some((t) => t.id === candidate.id) ? existing.map((t) => t.id === candidate.id ? candidate : t) : [...existing, candidate]; + try { + validateTaskGraph(tasks); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + if (message.includes("cannot block itself") || message.includes("task dependency cycle")) { + throw new TeamError("TEAM_TASK_DEPENDENCY_CYCLE", message); + } + if (message.includes("repeats blocker")) { + throw new TeamError("TEAM_INVALID_ARGUMENT", message); + } + if (message.includes("missing or deleted")) { + throw new TeamError("TEAM_TASK_NOT_FOUND", message); + } + throw err; + } +} +function dependencies(existingTasks, taskId, blockedBy) { + const seen = /* @__PURE__ */ new Set(); + for (const bid of blockedBy) { + if (bid === taskId) { + throw new TeamError("TEAM_TASK_DEPENDENCY_CYCLE", "a team task cannot block itself", { + cause: { taskId, blocker: bid } + }); + } + if (seen.has(bid)) { + throw new TeamError("TEAM_INVALID_ARGUMENT", `duplicate blocker "${bid}"`, { + cause: { taskId, blocker: bid } + }); + } + seen.add(bid); + const blocker = existingTasks.find((t) => t.id === bid); + if (blocker === void 0 || blocker.status === "deleted") { + throw new TeamError("TEAM_TASK_NOT_FOUND", `blocker task "${bid}" not found`, { + cause: { taskId, blocker: bid } + }); + } + } +} + +// src/domain/task-view.ts +function taskReady(state, task) { + return task.blockedBy.every((bid) => { + const blocker = state.tasks.find((t) => t.id === bid); + return blocker !== void 0 && blocker.status === "completed"; + }); +} +function projectTaskView(state, task) { + const view2 = { + id: task.id, + revision: task.revision, + subject: task.subject, + description: task.description, + status: task.status, + blockedBy: [...task.blockedBy], + writeScopes: [...task.writeScopes], + ready: task.status === "pending" && taskReady(state, task), + writeScopeWarnings: writeScopeWarnings(state, task) + }; + if (task.ownerId !== void 0) { + const ownerName = task.ownerId === state.id ? "lead" : state.members.find((m) => m.id === task.ownerId)?.name; + if (ownerName !== void 0) view2.ownerName = ownerName; + } + return view2; +} +function writeScopeWarnings(state, task) { + if (task.status !== "in_progress") return []; + const warnings = /* @__PURE__ */ new Set(); + for (const other of state.tasks) { + if (other.id === task.id || other.status !== "in_progress") continue; + if (scopesOverlap(task.writeScopes, other.writeScopes)) { + warnings.add(`write scopes overlap with ${other.id}`); + } + } + return [...warnings]; +} +function scopesOverlap(left, right) { + for (const l of left) { + for (const r of right) { + if (l === r || l.startsWith(r + "/") || r.startsWith(l + "/")) return true; + } + } + return false; +} + +// src/domain/projection.ts +var TEAM_PROJECTION_STATE_VERSION = 4; +function emptyTeamState(rootId) { + return { + id: rootId, + members: [], + tasks: [], + messages: [], + delivered: [], + nextTaskNumber: 1 + }; +} +function failed(state, failure) { + return { ...state, failure }; +} +function applyProjectionEvent(state, raw) { + if (state.failure !== void 0) return state; + const selected = selectTeamEvent(raw, state.id); + switch (selected.kind) { + case "ignored": + return state; + case "unsupported-version": + return failed(state, `unsupported Agent Teams event version ${String(selected.version)}`); + case "invalid-payload": + return failed(state, `persisted Agent Teams ${selected.type} payload is invalid`); + case "event": + return applyCurrentTeamEvent(state, selected.event); + } +} +function applyCurrentTeamEvent(state, event) { + if (state.failure !== void 0) return state; + switch (event.type) { + case "team/member": + return applyMember(state, event.member); + case "team/task": + return applyTask(state, event.task); + case "team/message/queued": + return applyMessageQueued(state, event.message); + case "team/message/delivered": + return applyMessageDelivered(state, event.messageId, event.targetId); + } +} +function applyMember(state, member) { + const prior = state.members.find((m) => m.id === member.id); + if (prior === void 0) { + if (member.phase !== "provisioning") { + return failed(state, `teammate "${member.name}" must begin provisioning`); + } + if (state.members.some((m) => m.name === member.name)) { + return failed(state, `teammate name "${member.name}" is reused by another member`); + } + return { ...state, members: [...state.members, member] }; + } + if (prior.name !== member.name || prior.provider !== member.provider || prior.context !== member.context) { + return failed(state, `teammate "${prior.id}" changed immutable identity fields`); + } + if (prior.phase !== "provisioning" || member.phase !== "active" && member.phase !== "failed") { + return failed( + state, + `teammate "${member.name}" has an invalid ${prior.phase} -> ${member.phase} transition` + ); + } + return { ...state, members: state.members.map((m) => m.id === member.id ? member : m) }; +} +function applyTask(state, task) { + const prior = state.tasks.find((t) => t.id === task.id); + const expectedRevision = prior === void 0 ? 1 : prior.revision + 1; + if (task.revision !== expectedRevision) { + return failed( + state, + prior === void 0 ? `team task "${task.id}" must begin at revision 1` : `team task "${task.id}" revision is not contiguous` + ); + } + const tasks = prior === void 0 ? [...state.tasks, task] : state.tasks.map((t) => t.id === task.id ? task : t); + try { + validateTaskGraph(tasks); + } catch (err) { + return failed(state, err instanceof Error ? err.message : String(err)); + } + let nextTaskNumber = state.nextTaskNumber; + const n = taskNumberFromId(task.id); + if (n !== void 0) { + nextTaskNumber = Math.max(state.nextTaskNumber, Math.min(n + 1, Number.MAX_SAFE_INTEGER)); + } + return { ...state, tasks, nextTaskNumber }; +} +function applyMessageQueued(state, message) { + if (state.messages.some((m) => m.id === message.id)) { + return failed(state, `team message "${message.id}" was queued twice`); + } + return { ...state, messages: [...state.messages, message] }; +} +function applyMessageDelivered(state, messageId, targetId) { + const queued = state.messages.find((m) => m.id === messageId); + if (queued === void 0) { + return failed(state, `team message "${messageId}" was delivered before queueing`); + } + if (queued.targetId !== targetId) { + return failed(state, `team message "${messageId}" target changed`); + } + if (state.delivered.includes(messageId)) { + return failed(state, `team message "${messageId}" was delivered twice`); + } + return { ...state, delivered: [...state.delivered, messageId] }; +} +var viewCache = /* @__PURE__ */ new WeakMap(); +function teamProjectionView(state) { + let byTasks = viewCache.get(state.members); + if (byTasks === void 0) { + byTasks = /* @__PURE__ */ new WeakMap(); + viewCache.set(state.members, byTasks); + } + let entry = byTasks.get(state.tasks); + if (entry === void 0) { + const members = [ + { id: state.id, name: "lead", role: "lead", phase: "active" }, + ...state.members.map((m) => ({ id: m.id, name: m.name, role: "teammate", phase: m.phase, ...m.error !== void 0 ? { error: m.error } : {} })) + ]; + const tasks = state.tasks.filter((t) => t.status !== "deleted").map((t) => projectTaskView(state, t)); + entry = { healthy: { members, tasks } }; + byTasks.set(state.tasks, entry); + } + if (state.failure === void 0) return entry.healthy; + if (entry.failed === void 0) { + entry.failed = { ...entry.healthy, failure: state.failure }; + } + return entry.failed; +} +function tryMembership(loadState, agentId) { + let state; + try { + state = loadState(); + } catch { + return void 0; + } + if (agentId === state.id) { + return { rootId: state.id, role: "lead", name: "lead" }; + } + const member = state.members.find((m) => m.id === agentId); + if (member !== void 0 && (member.phase === "active" || member.phase === "provisioning")) { + return { rootId: state.id, role: "teammate", name: member.name }; + } + return void 0; +} +function requireMembership(loadState, agentId) { + const membership = tryMembership(loadState, agentId); + if (membership === void 0) { + throw new TeamError( + "TEAM_NOT_MEMBER", + `agent "${agentId}" is not a member of an active Agent Team` + ); + } + return membership; +} +function projectionFailureError(failure) { + return new Error(failure); +} + +// src/domain/invariant.ts +function assertAppendable(teamId, committed, candidate) { + let state = emptyTeamState(teamId); + for (let i = 0; i < committed.length; i++) { + const next = applyProjectionEvent(state, committed[i]); + if (next.failure !== void 0) { + throw new Error( + `session event ${i + 1} violates the Agent Teams stream: ${next.failure}` + ); + } + state = next; + } + const withCandidate = applyProjectionEvent(state, candidate); + if (withCandidate.failure !== void 0) { + throw new Error( + `session event ${committed.length + 1} violates the Agent Teams stream: ${withCandidate.failure}` + ); + } +} + +// src/coord/lockfile.ts +import fs3 from "node:fs"; +function observeLockFileFor(lockFile, writer) { + const identity = parseWriterId(writer); + if (identity === void 0) { + return { ok: false, reason: `writer id "${writer}" is malformed` }; + } + let raw; + try { + raw = fs3.readFileSync(lockFile, "utf8"); + } catch (err) { + return { ok: false, reason: `lock unreadable: ${err.code ?? String(err)}` }; + } + let parsed; + try { + parsed = JSON.parse(raw); + } catch { + return { ok: false, reason: "lock file is not valid JSON" }; + } + if (parsed.pid !== identity.pid || parsed.bootId !== identity.bootId) { + return { + ok: false, + reason: `lock held by pid=${String(parsed.pid)} bootId=${String(parsed.bootId)}` + }; + } + return { ok: true, reason: "owned" }; +} + +// src/coord/replay.ts +import fs4 from "node:fs"; +import path3 from "node:path"; +var checkpointDocSchema = external_exports.strictObject({ + kind: external_exports.literal("agent-team-checkpoint"), + stateVersion: external_exports.literal(TEAM_PROJECTION_STATE_VERSION), + lastSeq: external_exports.number().int().nonnegative(), + lastOffset: external_exports.number().int().nonnegative(), + savedAt: external_exports.string(), + state: teamStateSchema, + view: external_exports.unknown() +}); +function checkpointPath(teamDir) { + return path3.join(teamDir, "checkpoint.json"); +} +async function load(teamDir, teamId) { + const startedAt = Date.now(); + const eventsFile = path3.join(teamDir, "events.jsonl"); + const raw = readBufferOrEmpty(eventsFile); + let checkpointIgnored; + let doc; + try { + const rawDoc = fs4.readFileSync(checkpointPath(teamDir), "utf8"); + const parsed = checkpointDocSchema.safeParse(JSON.parse(rawDoc)); + if (!parsed.success) { + checkpointIgnored = `checkpoint invalid: ${parsed.error.issues[0]?.message ?? "schema mismatch"}`; + } else if (parsed.data.state.id !== teamId) { + checkpointIgnored = `checkpoint teamId mismatch (${parsed.data.state.id} != ${teamId})`; + } else { + doc = parsed.data; + } + } catch { + } + const writers = []; + let state = emptyTeamState(teamId); + let seq = 0; + let fromCheckpoint = false; + let corrupt; + if (doc !== void 0) { + const tail = raw.subarray(doc.lastOffset); + const first = firstLineBytes(tail); + if (tail.length > 0 && first === void 0) { + checkpointIgnored = "checkpoint offset desync (tail not line-aligned) \u2014 full replay"; + } else if (first !== void 0 && JSON.parse(first.parsed).seq !== doc.lastSeq + 1) { + checkpointIgnored = "checkpoint offset desync (seq continuity broken) \u2014 full replay"; + } else { + state = doc.state; + seq = doc.lastSeq; + fromCheckpoint = true; + } + } + const startOffset = fromCheckpoint && doc !== void 0 ? doc.lastOffset : 0; + let offset = startOffset; + let consumeRest = true; + while (consumeRest && offset < raw.length) { + const nl = raw.indexOf(10, offset); + if (nl === -1) { + corrupt = { line: seq + 1, reason: "trailing partial line (no newline)" }; + state = withFailure(state, raw.subarray(offset).toString("utf8")); + seq += 1; + consumeRest = false; + break; + } + const lineText = raw.subarray(offset, nl).toString("utf8"); + const lineNo = seq + 1; + offset = nl + 1; + if (lineText.length === 0) { + corrupt = { line: lineNo, reason: "empty line" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + let parsed; + try { + parsed = JSON.parse(lineText); + } catch { + corrupt = { line: lineNo, reason: "invalid JSON" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + const line = parsed; + if (typeof line.writer === "string" && !writers.includes(line.writer)) writers.push(line.writer); + if (typeof parsed !== "object" || parsed === null || typeof parsed.seq !== "number" || !("event" in parsed) || parsed.seq !== lineNo) { + corrupt = { line: lineNo, reason: "line shape invalid or seq discontinuous" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + state = applyProjectionEvent(state, line.event); + seq = lineNo; + if (state.failure !== void 0) { + consumeRest = false; + } + } + return { + state, + view: teamProjectionView(state), + seq, + fromCheckpoint, + checkpointIgnored, + corrupt, + writers, + replayMs: Date.now() - startedAt + }; +} +async function writeCheckpoint(teamDir, input) { + const eventsFile = path3.join(teamDir, "events.jsonl"); + const byteOffset = input.byteOffset ?? countBytesOfLines(eventsFile, input.seq); + const doc = { + kind: "agent-team-checkpoint", + stateVersion: TEAM_PROJECTION_STATE_VERSION, + lastSeq: input.seq, + lastOffset: byteOffset, + savedAt: (/* @__PURE__ */ new Date()).toISOString(), + state: input.state, + view: input.view + }; + fs4.mkdirSync(teamDir, { recursive: true, mode: 448 }); + const target = checkpointPath(teamDir); + const tmp = `${target}.tmp-${process.pid}`; + const fd = fs4.openSync(tmp, "w", 384); + try { + fs4.writeFileSync(fd, JSON.stringify(doc)); + fs4.fsyncSync(fd); + } finally { + fs4.closeSync(fd); + } + fs4.renameSync(tmp, target); +} +function readBufferOrEmpty(file) { + try { + return fs4.readFileSync(file); + } catch { + return Buffer.alloc(0); + } +} +function firstLineBytes(buf) { + const nl = buf.indexOf(10); + const first = (nl === -1 ? buf : buf.subarray(0, nl)).toString("utf8"); + if (first.length === 0) return void 0; + try { + JSON.parse(first); + return { parsed: first }; + } catch { + return void 0; + } +} +function withFailure(state, rawLine) { + const m = rawLine.match(/"type"\s*:\s*"(team\/[A-Za-z/-]+)"/); + const type = m?.[1] ?? "stream"; + return { ...state, failure: `persisted Agent Teams ${type} payload is invalid` }; +} +function countBytesOfLines(eventsFile, seq) { + const raw = readBufferOrEmpty(eventsFile); + let offset = 0; + for (let i = 0; i < seq; i++) { + const nl = raw.indexOf(10, offset); + if (nl === -1) return raw.length; + offset = nl + 1; + } + return offset; +} + +// src/coord/journal.ts +var TeamJournal = class _TeamJournal { + teamDir; + teamId; + eventsFile; + lockFile; + opts; + writer = null; + appendFd = null; + cache = null; + committedCount = 0; + bytesCommitted = 0; + txTail = Promise.resolve(); + txDepth = 0; + listeners = /* @__PURE__ */ new Set(); + static instances = /* @__PURE__ */ new Map(); + /** 进程内单例(同 teamDir+teamId 只允许一个实例,防同进程双写)。 */ + static open(teamDir, teamId, opts) { + const key = `${teamDir}\0${teamId}`; + const existing = _TeamJournal.instances.get(key); + if (existing) return existing; + const journal = new _TeamJournal(teamDir, teamId, opts); + _TeamJournal.instances.set(key, journal); + return journal; + } + constructor(teamDir, teamId, opts = {}) { + this.teamDir = teamDir; + this.teamId = teamId; + this.eventsFile = path4.join(teamDir, "events.jsonl"); + this.lockFile = path4.join(teamDir, "coordinator.lock"); + this.opts = { maxLineBytes: 65536, checkpointEvery: 256, enforceLock: true, ...opts }; + } + /** + * 取得写权(协调者专用):校验锁归属 + 冷启动全量/增量重放缓存状态 + 打开 O_APPEND 句柄。 + * 返回冷启动加载结果(含 checkpoint 命中信息)。 + */ + async openWriter(writer = writerId()) { + if (this.opts.enforceLock) { + const verdict = observeLockFileFor(this.lockFile, writer); + if (!verdict.ok) { + throw new Error( + `journal writer requires the coordinator lock (${verdict.reason}; writer=${writer})` + ); + } + } + const loaded = await load(this.teamDir, this.teamId); + this.writer = writer; + this.cache = loaded.state; + this.committedCount = loaded.seq; + fs5.mkdirSync(this.teamDir, { recursive: true, mode: 448 }); + this.appendFd = fs5.openSync(this.eventsFile, "a", 384); + this.bytesCommitted = fs5.statSync(this.eventsFile).size; + return loaded; + } + /** 追加前不变量 + 落盘 + fsync + 内存态推进 + 通知 + 应答。非法事件绝不落盘(硬断言)。 */ + appendAndFlush(candidate) { + return this.enqueue(async () => { + const seq = this.committedCount + 1; + if (this.opts.enforceLock && this.writer !== null) { + const verdict = observeLockFileFor(this.lockFile, this.writer); + if (!verdict.ok) { + throw new Error(`coordinator lock lost before append (${verdict.reason}; writer=${this.writer})`); + } + } + if (this.cache === null) { + const committed = (await readAllLines(this.eventsFile)).map((l) => l.event); + assertAppendable(this.teamId, committed, candidate); + } + const prior = this.cache ?? emptyTeamState(this.teamId); + const next = applyProjectionEvent(prior, candidate); + if (next.failure !== void 0) { + throw new Error( + `session event ${seq} violates the Agent Teams stream: ${next.failure}` + ); + } + this.opts.crashHook?.("append:before", { seq }); + const ts2 = (/* @__PURE__ */ new Date()).toISOString(); + const line = { seq, ts: ts2, writer: this.writer ?? writerId(), event: candidate }; + const raw = JSON.stringify(line) + "\n"; + if (Buffer.byteLength(raw) > this.opts.maxLineBytes) { + throw new Error( + `journal line exceeds ${this.opts.maxLineBytes} bytes (seq ${seq})` + ); + } + if (this.appendFd === null) throw new Error("journal writer not open (call openWriter first)"); + const lineBytes = Buffer.byteLength(raw); + fs5.writeSync(this.appendFd, raw); + this.opts.crashHook?.("append:after", { seq }); + this.opts.crashHook?.("fsync:before", { seq }); + fs5.fsyncSync(this.appendFd); + this.opts.crashHook?.("fsync:after", { seq }); + this.cache = next; + this.committedCount = seq; + this.bytesCommitted += lineBytes; + this.opts.crashHook?.("ack:before", { seq }); + for (const listener of this.listeners) listener(line, next); + void this.maybeCheckpoint(seq); + return { seq, ts: ts2, state: next }; + }); + } + /** 同 teamId 尾链串行(本实例事务队列;不同 team = 不同实例 = 可并发)。应答序 = 提交序。 */ + transact(op) { + return this.enqueue(() => Promise.resolve(op())); + } + /** 只读读取器:全量读行(不持写句柄;非协调者可用)。 */ + async readAll() { + return readAllLines(this.eventsFile); + } + onCommit(listener) { + this.listeners.add(listener); + return () => this.listeners.delete(listener); + } + get committedSeq() { + return this.committedCount; + } + get cachedState() { + return this.cache; + } + async writeCheckpointNow() { + if (this.cache === null) return; + await writeCheckpoint(this.teamDir, { + state: this.cache, + view: teamProjectionView(this.cache), + seq: this.committedCount, + byteOffset: this.bytesCommitted + }); + } + async close() { + if (this.appendFd !== null) { + fs5.closeSync(this.appendFd); + this.appendFd = null; + } + await this.writeCheckpointNow(); + _TeamJournal.instances.delete(`${this.teamDir}\0${this.teamId}`); + } + async maybeCheckpoint(seq) { + if (this.opts.checkpointEvery <= 0) return; + if (seq % this.opts.checkpointEvery !== 0) return; + try { + await this.writeCheckpointNow(); + } catch { + } + } + /** 尾链入队:op 严格在前一事务完成后才开始;拒绝结果向调用方透传,不阻断后续事务。 + * 重入安全:当前已处于本实例事务的串行区内(txDepth>0)时直接执行(同 MemoryTeamStore 口径)。 */ + enqueue(op) { + if (this.txDepth > 0) return this.runGuarded(op); + const run = this.txTail.then( + () => this.runGuarded(op), + () => this.runGuarded(op) + ); + this.txTail = run.then( + () => void 0, + () => void 0 + ); + return run; + } + async runGuarded(op) { + this.txDepth += 1; + try { + return await op(); + } finally { + this.txDepth -= 1; + } + } +}; +async function readAllLines(eventsFile) { + let raw; + try { + raw = fs5.readFileSync(eventsFile, "utf8"); + } catch { + return []; + } + const lines = []; + for (const chunk of raw.split("\n")) { + if (chunk.length === 0) break; + lines.push(JSON.parse(chunk)); + } + return lines; +} + +// src/coord/paths.ts +import { createHash } from "node:crypto"; +import fs6 from "node:fs"; +import path5 from "node:path"; +import os2 from "node:os"; +var MAX_SOCKET_PATH = 96; +function teamPaths(dataRoot, teamId) { + const teamsRoot = path5.join(dataRoot, "teams"); + const teamDir = path5.join(teamsRoot, safeTeamId(teamId)); + return { + dataRoot, + teamId, + teamDir, + eventsFile: path5.join(teamDir, "events.jsonl"), + checkpointFile: path5.join(teamDir, "checkpoint.json"), + lockFile: path5.join(teamDir, "coordinator.lock"), + auditFile: path5.join(teamDir, "coordinator.audit.jsonl"), + socketCandidate: path5.join(teamDir, "coordinator.sock") + }; +} +function ensureTeamDir(paths) { + fs6.mkdirSync(paths.teamDir, { recursive: true, mode: 448 }); + try { + fs6.chmodSync(paths.teamDir, 448); + } catch { + } + return paths.teamDir; +} +function safeTeamId(teamId) { + const escaped = teamId.replace(/[^A-Za-z0-9._-]/g, (c) => "~" + c.codePointAt(0).toString(16)); + if (escaped === ".") return "~2e"; + if (escaped === "..") return "~2e2e"; + return escaped; +} +function resolveSocketPath(teamDir) { + const candidate = path5.join(teamDir, "coordinator.sock"); + if (candidate.length <= MAX_SOCKET_PATH) { + return { socketPath: candidate, fallback: false, registryFile: path5.join(teamDir, "socket.path") }; + } + const hash = createHash("sha256").update(candidate).digest("hex").slice(0, 16); + const tmpRoot = fs6.realpathSync(os2.tmpdir()); + const fallbackDir = path5.join(tmpRoot, "agent-team-sockets"); + fs6.mkdirSync(fallbackDir, { recursive: true, mode: 448 }); + try { + fs6.chmodSync(fallbackDir, 448); + } catch { + } + const fallbackPath = path5.join(fallbackDir, `at-${hash}.sock`); + return { socketPath: fallbackPath, fallback: true, registryFile: path5.join(teamDir, "socket.path") }; +} +function discoverSocketPath(teamDir) { + const registryFile = path5.join(teamDir, "socket.path"); + try { + const registered = fs6.readFileSync(registryFile, "utf8").trim(); + if (registered.length > 0) return registered; + } catch { + } + return resolveSocketPath(teamDir).socketPath; +} +function writeSocketRegistry(teamDir, socketPath) { + fs6.mkdirSync(teamDir, { recursive: true, mode: 448 }); + fs6.writeFileSync(path5.join(teamDir, "socket.path"), socketPath + "\n", { mode: 384 }); +} +function removeSocketRegistryIf(teamDir, socketPath) { + const file = path5.join(teamDir, "socket.path"); + try { + const current = fs6.readFileSync(file, "utf8").trim(); + if (current !== socketPath) return; + } catch { + return; + } + try { + fs6.unlinkSync(file); + } catch { + } +} + +// src/coord/store-adapter.ts +var JournalTeamStore = class _JournalTeamStore { + constructor(journalInstance, ownedLock) { + this.journalInstance = journalInstance; + this.ownedLock = ownedLock; + this.journal = journalInstance; + } + journal; + cached; + unsubs = []; + /** 冷启动加载信息(host readyInfo 用;open 时捕获)。 */ + lastLoad = null; + /** 打开(含抢锁 + 冷启动重放 + O_APPEND 句柄)。 */ + static async open(dataRoot, teamId, opts = {}) { + const paths = teamPaths(dataRoot, teamId); + ensureTeamDir(paths); + let lock = opts.lock; + let owned = false; + if (lock === void 0) { + lock = new CoordinatorLock(paths.lockFile, paths.auditFile); + await lock.acquire({ waitMs: opts.lockWaitMs ?? 3e4 }); + owned = true; + } + const journal = TeamJournal.open(paths.teamDir, teamId, opts.journal); + const loaded = await journal.openWriter(writerId()); + const store = new _JournalTeamStore(journal, owned ? lock : void 0); + store.lastLoad = { seq: loaded.seq, fromCheckpoint: loaded.fromCheckpoint }; + return store; + } + async append(event) { + const result = await this.journal.appendAndFlush(event); + this.cached = result.state; + return result; + } + state() { + if (this.cached === void 0) { + const cached2 = this.journal.cachedState; + if (cached2 === null) throw new Error("journal store not opened"); + this.cached = cached2; + } + return this.cached; + } + /** 已提交行号(= hello.stateRevision 的冻结语义:journal seq)。 */ + get committedSeq() { + return this.journal.committedSeq; + } + transact(op) { + return this.journal.transact(op); + } + onCommit(listener) { + const adapted = (_entry, state) => { + this.cached = state; + listener(0, state); + }; + const off = this.journal.onCommit(adapted); + this.unsubs.push(off); + return off; + } + /** 释放(自有锁则释放;journal close 落 checkpoint)。 */ + async close() { + for (const off of this.unsubs) off(); + this.unsubs.length = 0; + await this.journal.close(); + await this.ownedLock?.release(); + } +}; + +// src/coord/rpc.ts +import net from "node:net"; +import fs7 from "node:fs"; +import path6 from "node:path"; +import crypto2 from "node:crypto"; +var COORDINATOR_UNAVAILABLE_MESSAGE = "Agent Teams coordinator is unavailable (between coordinators); retry the request shortly"; +var SUN_PATH_LIMIT = 104; +var MAX_RPC_BUFFER_BYTES = 1 << 20; +function frameBudgetFor(maxMessageBytes) { + return Math.max(MAX_RPC_BUFFER_BYTES, maxMessageBytes * 4); +} +var RpcServer = class { + socketPath; + server = null; + socketIno = null; + /** 活连接(close 时主动断开,防幽灵客户端阻塞关停)。 */ + clients = /* @__PURE__ */ new Set(); + handlers = /* @__PURE__ */ new Map(); + maxFrameBytes; + token; + nextId = 0; + constructor(socketPath, opts = {}) { + if (socketPath.length > SUN_PATH_LIMIT) { + throw new Error( + `unix socket path too long for macOS (sun_path \u2248${SUN_PATH_LIMIT}B, got ${socketPath.length}B): ${socketPath} \u2014 use resolveSocketPath() to fall back to a short /tmp path` + ); + } + this.socketPath = socketPath; + this.maxFrameBytes = opts.maxFrameBytes ?? MAX_RPC_BUFFER_BYTES; + this.token = opts.token; + } + register(method, handler, opts = {}) { + this.handlers.set(method, { handler, timeoutMs: opts.timeoutMs }); + return this; + } + has(method) { + return this.handlers.has(method); + } + async listen(opts = {}) { + const callTimeoutMs = opts.callTimeoutMs ?? 1e4; + if (fs7.existsSync(this.socketPath)) { + const active = await probeActiveSocket(this.socketPath); + if (active) { + throw new Error( + `rpc socket already in use by an active coordinator: ${this.socketPath} (refusing to replace it)` + ); + } + try { + fs7.unlinkSync(this.socketPath); + } catch { + } + } + await new Promise((resolve, reject) => { + const server2 = net.createServer((socket) => { + this.clients.add(socket); + const inflight = /* @__PURE__ */ new Set(); + socket.once("close", () => { + this.clients.delete(socket); + for (const controller of inflight) controller.abort(); + inflight.clear(); + }); + socket.setEncoding("utf8"); + let buffer = ""; + socket.on("data", (chunk) => { + buffer += chunk; + if (Buffer.byteLength(buffer, "utf8") > this.maxFrameBytes) { + socket.destroy(); + return; + } + let nl; + while ((nl = buffer.indexOf("\n")) !== -1) { + const line = buffer.slice(0, nl); + buffer = buffer.slice(nl + 1); + if (line.trim().length === 0) continue; + let parsed; + try { + parsed = JSON.parse(line); + } catch { + socket.write(JSON.stringify({ id: -1, ok: false, error: { message: "invalid rpc frame" } }) + "\n"); + continue; + } + if (!this.authorized(parsed)) { + const id = typeof parsed?.id === "number" ? parsed.id : -1; + socket.write(JSON.stringify({ id, ok: false, error: { message: "unauthorized rpc frame" } }) + "\n"); + continue; + } + void this.dispatch(parsed, socket, callTimeoutMs, inflight); + } + }); + socket.on("error", () => socket.destroy()); + }); + server2.on("error", (err) => reject(err)); + server2.listen(this.socketPath, () => { + this.server = server2; + try { + fs7.chmodSync(this.socketPath, 384); + this.socketIno = fs7.statSync(this.socketPath).ino; + } catch (err) { + this.server = null; + try { + server2.close(); + } catch { + } + reject( + new Error( + `rpc socket hardening failed for ${this.socketPath}: ${err instanceof Error ? err.message : String(err)}` + ) + ); + return; + } + resolve(); + }); + }); + } + async close() { + const server2 = this.server; + if (server2 === null) return; + this.server = null; + const ino = this.socketIno; + this.socketIno = null; + for (const client of this.clients) { + try { + client.destroy(); + } catch { + } + } + this.clients.clear(); + let preserve = null; + if (ino !== null) { + try { + if (fs7.statSync(this.socketPath).ino !== ino) { + const quarantine = `${this.socketPath}.preserve-${process.pid}-${crypto2.randomBytes(4).toString("hex")}`; + fs7.renameSync(this.socketPath, quarantine); + preserve = { quarantine }; + } + } catch { + } + } + await new Promise((resolve) => server2.close(() => resolve())); + if (preserve !== null) { + try { + fs7.renameSync(preserve.quarantine, this.socketPath); + } catch (err) { + process.stderr.write( + JSON.stringify({ + ts: (/* @__PURE__ */ new Date()).toISOString(), + scope: "rpc", + msg: "failed to restore preserved socket path", + socketPath: this.socketPath, + quarantine: preserve.quarantine, + error: err instanceof Error ? err.message : String(err) + }) + "\n" + ); + } + } + } + authorized(req) { + if (this.token === void 0) return true; + const provided = typeof req?.token === "string" ? req.token : ""; + const a = Buffer.from(provided); + const b = Buffer.from(this.token); + return a.length === b.length && crypto2.timingSafeEqual(a, b); + } + async dispatch(req, socket, callTimeoutMs, inflight) { + const respond = (res) => { + if (!socket.destroyed) socket.write(JSON.stringify(res) + "\n"); + }; + const id = typeof req?.id === "number" ? req.id : -1; + const registered = this.handlers.get(req?.method); + if (registered === void 0) { + respond({ id, ok: false, error: { message: `unknown rpc method: ${String(req?.method)}` } }); + return; + } + const timeoutMs = registered.timeoutMs ?? callTimeoutMs; + const abort = new AbortController(); + inflight.add(abort); + let settled = false; + const timer = setTimeout(() => { + if (settled) return; + settled = true; + respond({ id, ok: false, error: { message: `rpc method ${req.method} timed out after ${timeoutMs}ms` } }); + abort.abort(); + }, timeoutMs); + try { + const result = await registered.handler(req.params, { + socketPath: this.socketPath, + signal: abort.signal + }); + if (!settled) { + settled = true; + respond({ id, ok: true, result }); + } + } catch (err) { + if (settled) return; + if (isTeamError(err)) { + respond({ + id, + ok: false, + error: { message: err.message, code: err.code, serialized: serializeTeamError(err) } + }); + } else { + respond({ + id, + ok: false, + error: { message: err instanceof Error ? err.message : String(err), name: err instanceof Error ? err.name : void 0 } + }); + } + } finally { + clearTimeout(timer); + inflight.delete(abort); + } + } +}; +var RpcClient = class _RpcClient { + constructor(socket, token = void 0, nextId = 1, pending = /* @__PURE__ */ new Map(), maxFrameBytes = MAX_RPC_BUFFER_BYTES) { + this.socket = socket; + this.token = token; + this.nextId = nextId; + this.pending = pending; + this.maxFrameBytes = maxFrameBytes; + } + maxFrameBytes; + static async connect(socketPath, opts = {}) { + const timeoutMs = opts.timeoutMs ?? 3e3; + const socket = await new Promise((resolve, reject) => { + const s = net.connect(socketPath, () => resolve(s)); + s.setEncoding("utf8"); + const timer = setTimeout(() => { + s.destroy(); + reject(new Error(`rpc connect timeout after ${timeoutMs}ms: ${socketPath}`)); + }, timeoutMs); + s.once("error", (err) => { + clearTimeout(timer); + reject(err); + }); + resolveSocketOnConnect(s, () => clearTimeout(timer)); + }); + const client = new _RpcClient(socket, opts.token, 1, /* @__PURE__ */ new Map(), opts.maxFrameBytes); + socket.on("data", (chunk) => client.onData(chunk)); + socket.on("close", () => client.failAll(new Error("rpc connection closed"))); + socket.on("error", (err) => client.failAll(err)); + return client; + } + async call(method, params, opts = {}) { + const id = this.nextId++; + const timeoutMs = opts.timeoutMs ?? 15e3; + if (opts.signal?.aborted) { + return Promise.reject( + new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal.reason)}`) + ); + } + const payload = JSON.stringify({ id, method, params, ...this.token !== void 0 ? { token: this.token } : {} }) + "\n"; + return new Promise((resolve, reject) => { + let settled = false; + let timer; + const finish = (fn) => { + if (settled) return; + settled = true; + clearTimeout(timer); + opts.signal?.removeEventListener("abort", onAbort); + this.pending.delete(id); + fn(); + }; + const onAbort = () => { + finish( + () => reject(new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal?.reason)}`)) + ); + this.socket.destroy(); + }; + timer = setTimeout(() => { + finish(() => reject(new Error(`rpc call ${method} timed out after ${timeoutMs}ms`))); + }, timeoutMs); + this.pending.set(id, { + resolve: (v) => finish(() => resolve(v)), + reject: (e) => finish(() => reject(e)) + }); + opts.signal?.addEventListener("abort", onAbort, { once: true }); + this.socket.write(payload, (err) => { + if (err) finish(() => reject(err)); + }); + }); + } + close() { + this.socket.destroy(); + } + onData(chunk) { + this.buffer += chunk; + if (Buffer.byteLength(this.buffer, "utf8") > this.maxFrameBytes) { + this.failAll(new Error(`rpc response frame exceeds ${this.maxFrameBytes} bytes`)); + this.socket.destroy(); + return; + } + let nl; + while ((nl = this.buffer.indexOf("\n")) !== -1) { + const line = this.buffer.slice(0, nl); + this.buffer = this.buffer.slice(nl + 1); + if (line.trim().length === 0) continue; + try { + this.onResponse(JSON.parse(line)); + } catch { + this.failAll(new Error("invalid rpc response frame")); + } + } + } + buffer = ""; + onResponse(res) { + const entry = this.pending.get(res.id); + if (entry === void 0) return; + this.pending.delete(res.id); + if (res.ok) { + entry.resolve(res.result); + } else if (res.error?.code !== void 0) { + entry.reject(new TeamError(res.error.code, res.error.message)); + } else { + const err = new Error(res.error?.message ?? "rpc error"); + if (res.error?.name) err.name = res.error.name; + entry.reject(err); + } + } + failAll(err) { + for (const [, entry] of this.pending) entry.reject(err); + this.pending.clear(); + } +}; +function resolveSocketOnConnect(socket, onConnected) { + socket.once("connect", onConnected); +} +function probeActiveSocket(socketPath, timeoutMs = 500) { + return new Promise((resolve) => { + const socket = net.connect(socketPath); + let settled = false; + const finish = (active) => { + if (settled) return; + settled = true; + socket.destroy(); + resolve(active); + }; + const timer = setTimeout(() => finish(false), timeoutMs); + timer.unref?.(); + socket.once("connect", () => { + clearTimeout(timer); + finish(true); + }); + socket.once("error", () => { + clearTimeout(timer); + finish(false); + }); + }); +} +function rpcTokenPath(teamDir) { + return path6.join(teamDir, "rpc.token"); +} +function readRpcToken(teamDir) { + try { + const token = fs7.readFileSync(rpcTokenPath(teamDir), "utf8").trim(); + return token.length > 0 ? token : void 0; + } catch { + return void 0; + } +} +function writeRpcToken(teamDir, token) { + fs7.mkdirSync(teamDir, { recursive: true, mode: 448 }); + fs7.writeFileSync(rpcTokenPath(teamDir), token + "\n", { mode: 384 }); +} +function newRpcToken() { + return crypto2.randomBytes(24).toString("hex"); +} +function coordinatorUnavailableError(detail) { + return new TeamError("TEAM_DISPOSED", COORDINATOR_UNAVAILABLE_MESSAGE, { cause: detail }); +} +function abortReasonText(reason) { + if (reason instanceof Error) return reason.message; + if (reason === void 0 || reason === null) return "aborted"; + return String(reason); +} +async function callCoordinator(teamDir, teamId, method, params, opts = {}) { + const socketPath = discoverSocketPath(teamDir); + const token = readRpcToken(teamDir); + const client = await RpcClient.connect(socketPath, { + timeoutMs: opts.connectTimeoutMs ?? 1e3, + ...token !== void 0 ? { token } : {} + }).catch((err) => { + throw coordinatorUnavailableError(`socket ${socketPath}: ${err.code ?? err.message}`); + }); + try { + return await client.call(method, params, { + timeoutMs: opts.timeoutMs, + ...opts.signal !== void 0 ? { signal: opts.signal } : {} + }); + } finally { + client.close(); + } +} + +// src/provider/model-selection.ts +var DEFAULT_REASONING_LEVEL = "max"; +function parseModelSelection(value) { + if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0; + const record2 = value; + const providerId = nonEmptyString(record2.providerId); + const modelId = nonEmptyString(record2.modelId); + if (providerId === void 0 || modelId === void 0) return void 0; + const options = record2.options; + if (options !== void 0 && (typeof options !== "object" || options === null || Array.isArray(options))) { + return void 0; + } + let reasoningLevel; + const rawLevel = options !== void 0 ? options.reasoningLevel : record2.reasoningLevel; + if (rawLevel !== void 0) { + reasoningLevel = nonEmptyString(rawLevel); + if (reasoningLevel === void 0) return void 0; + } + return { providerId, modelId, ...reasoningLevel !== void 0 ? { reasoningLevel } : {} }; +} +function nonEmptyString(value) { + if (typeof value !== "string") return void 0; + const trimmed = value.trim(); + return trimmed.length > 0 ? trimmed : void 0; +} + +// src/coord/methods.ts +var TASK_ACTIONS = [ + "claim", + "release", + "edit", + "set_dependencies", + "complete", + "reopen", + "reassign", + "delete" +]; +var WAIT_AGENT_GRACE_MS = 5e3; +var METHOD_TIMEOUT_OVERRIDES = { + "member.spawn": 18e4, + "message.send": 3e4 +}; +function methodTimeoutMs(method) { + return METHOD_TIMEOUT_OVERRIDES[method]; +} +function buildTeamMethodTable(deps) { + const { runtime, store } = deps; + const table = /* @__PURE__ */ new Map(); + table.set("coordinator.hello", (raw) => { + const p = asParams(raw, "coordinator.hello"); + assertTeamTarget(p, "coordinator.hello", deps); + return { + coordinatorBootId: deps.coordinatorBootId, + stateRevision: store.committedSeq + }; + }); + table.set("member.claim", (raw) => { + const p = asParams(raw, "member.claim"); + assertTeamTarget(p, "member.claim", deps); + const sessionId = requireSessionId(p, "member.claim"); + const membership = requireMembership(membershipStateLoader(store), sessionId); + return { role: membership.role }; + }); + const memberSpawn = async (raw) => { + const p = asParams(raw, "member.spawn"); + assertTeamTarget(p, "member.spawn", deps); + const sessionId = requireSessionId(p, "member.spawn"); + const context = optionalString(p, "context", "member.spawn", { enum: ["fresh", "fork"] }); + return runtime.roster.spawnTeammate(sessionId, { + // 空串下沉到域层:name → TEAM_INVALID_MEMBER_NAME;description → must be non-empty。 + name: requireString(p, "name", "member.spawn", { allowEmpty: true }), + description: requireString(p, "description", "member.spawn", { allowEmpty: true }), + prompt: requireString(p, "prompt", "member.spawn", { allowEmpty: true }), + ...context !== void 0 ? { context } : {} + }); + }; + memberSpawn.timeoutMs = 18e4; + table.set("member.spawn", memberSpawn); + table.set("member.interrupt", async (raw) => { + const p = asParams(raw, "member.interrupt"); + assertTeamTarget(p, "member.interrupt", deps); + const sessionId = requireSessionId(p, "member.interrupt"); + const name = requireString(p, "name", "member.interrupt", { allowEmpty: true }); + return runtime.roster.interrupt(sessionId, name); + }); + const messageSend = async (raw) => { + const p = asParams(raw, "message.send"); + assertTeamTarget(p, "message.send", deps); + const sessionId = requireSessionId(p, "message.send"); + const targetName = requireString(p, "targetName", "message.send", { allowEmpty: true }); + if (!Array.isArray(p.content)) { + throw new TeamError("TEAM_INVALID_ARGUMENT", 'message.send param "content" must be an array of content blocks'); + } + return runtime.mailbox.send(sessionId, { target: targetName, content: p.content }); + }; + messageSend.timeoutMs = 3e4; + table.set("message.send", messageSend); + table.set("mailbox.ack", async (raw) => { + const p = asParams(raw, "mailbox.ack"); + assertTeamTarget(p, "mailbox.ack", deps); + const sessionId = requireSessionId(p, "mailbox.ack"); + if (!Array.isArray(p.messageIds) || p.messageIds.some((id) => typeof id !== "string")) { + throw new TeamError("TEAM_INVALID_ARGUMENT", 'mailbox.ack param "messageIds" must be an array of strings'); + } + const messageIds = p.messageIds; + const targetId = typeof p.targetId === "string" && p.targetId.length > 0 ? p.targetId : sessionId; + for (const messageId of messageIds) { + await runtime.mailbox.observeDelivery(targetId, messageId); + } + return { acknowledged: messageIds.length }; + }); + table.set("task.create", async (raw) => { + const p = asParams(raw, "task.create"); + assertTeamTarget(p, "task.create", deps); + const sessionId = requireSessionId(p, "task.create"); + const blockedBy = optionalStringArray(p, "blockedBy", "task.create"); + const writeScopes2 = optionalStringArray(p, "writeScopes", "task.create"); + return runtime.taskboard.create(sessionId, { + subject: requireString(p, "subject", "task.create", { allowEmpty: true }), + description: requireString(p, "description", "task.create", { allowEmpty: true }), + ...blockedBy !== void 0 ? { blockedBy } : {}, + ...writeScopes2 !== void 0 ? { writeScopes: writeScopes2 } : {} + }); + }); + table.set("task.update", async (raw) => { + const p = asParams(raw, "task.update"); + assertTeamTarget(p, "task.update", deps); + const sessionId = requireSessionId(p, "task.update"); + const action = requireString(p, "action", "task.update"); + if (!TASK_ACTIONS.includes(action)) { + throw new TeamError( + "TEAM_INVALID_ARGUMENT", + `task.update param "action" must be one of ${TASK_ACTIONS.join(", ")}` + ); + } + const expectedRevision = p.expectedRevision; + if (typeof expectedRevision !== "number" || !Number.isSafeInteger(expectedRevision)) { + throw new TeamError("TEAM_INVALID_ARGUMENT", 'task.update param "expectedRevision" must be a safe integer'); + } + const subject = optionalString(p, "subject", "task.update", { allowEmpty: true }); + const description = optionalString(p, "description", "task.update", { allowEmpty: true }); + const blockedBy = optionalStringArray(p, "blockedBy", "task.update"); + const writeScopes2 = optionalStringArray(p, "writeScopes", "task.update"); + const owner = optionalString(p, "owner", "task.update", { allowEmpty: true }); + return runtime.taskboard.update(sessionId, { + taskId: requireString(p, "taskId", "task.update", { allowEmpty: true }), + expectedRevision, + action, + ...subject !== void 0 ? { subject } : {}, + ...description !== void 0 ? { description } : {}, + ...blockedBy !== void 0 ? { blockedBy } : {}, + ...writeScopes2 !== void 0 ? { writeScopes: writeScopes2 } : {}, + ...owner !== void 0 ? { owner } : {} + }); + }); + table.set("task.list", (raw) => { + const p = asParams(raw, "task.list"); + assertTeamTarget(p, "task.list", deps); + const sessionId = requireSessionId(p, "task.list"); + const status = optionalString(p, "status", "task.list"); + const owner = optionalString(p, "owner", "task.list"); + return runtime.taskboard.list(sessionId, { + ...status !== void 0 ? { status } : {}, + ...owner !== void 0 ? { owner } : {}, + ...typeof p.ready === "boolean" ? { ready: p.ready } : {}, + ...typeof p.cursor === "number" ? { cursor: p.cursor } : {}, + ...typeof p.limit === "number" ? { limit: p.limit } : {} + }); + }); + table.set("task.get", (raw) => { + const p = asParams(raw, "task.get"); + assertTeamTarget(p, "task.get", deps); + const sessionId = requireSessionId(p, "task.get"); + return runtime.taskboard.get(sessionId, requireString(p, "taskId", "task.get", { allowEmpty: true })); + }); + table.set("board.read", (raw) => { + const p = asParams(raw, "board.read"); + assertTeamTarget(p, "board.read", deps); + const sessionId = typeof p.session_id === "string" ? p.session_id : void 0; + if (sessionId !== void 0) { + requireMembership(membershipStateLoader(store), sessionId); + } + return { revision: store.committedSeq, view: teamProjectionView(store.state()) }; + }); + const waitAgent = async (raw, ctx) => { + const p = asParams(raw, "wait.agent"); + assertTeamTarget(p, "wait.agent", deps); + const sessionId = requireSessionId(p, "wait.agent"); + const timeoutMs = typeof p.timeoutMs === "number" ? p.timeoutMs : 3e4; + return runtime.activity.waitForChange(sessionId, timeoutMs, ctx?.signal); + }; + waitAgent.timeoutMs = 36e5 + WAIT_AGENT_GRACE_MS; + table.set("wait.agent", waitAgent); + table.set("admin.reconcile", (raw) => { + const p = asParams(raw, "admin.reconcile"); + assertTeamTarget(p, "admin.reconcile", deps); + return runtime.roster.reconcileProvisioning(); + }); + return table; +} +function registerTeamMethods(server2, table) { + for (const [method, handler] of table) { + server2.register( + method, + (params, ctx) => handler(params, ctx), + handler.timeoutMs !== void 0 ? { timeoutMs: handler.timeoutMs } : {} + ); + } + return server2; +} +async function invokeTeamMethod(table, method, params, ctx) { + const handler = table.get(method); + if (handler === void 0) { + throw new Error(`unknown rpc method: ${method}`); + } + return handler(params, ctx); +} +function membershipStateLoader(store) { + return () => { + const state = store.state(); + if (state.failure !== void 0) throw projectionFailureError(state.failure); + return state; + }; +} +function asParams(raw, method) { + if (raw === void 0 || raw === null) return {}; + if (typeof raw !== "object" || Array.isArray(raw)) { + throw new TeamError("TEAM_INVALID_ARGUMENT", `${method} params must be an object`); + } + return raw; +} +function assertTeamTarget(p, method, deps) { + if (p.teamId !== void 0 && p.teamId !== deps.teamId) { + throw new Error( + `rpc method ${method} targets team ${JSON.stringify(p.teamId)} but this coordinator serves ${JSON.stringify(deps.teamId)}` + ); + } +} +function requireSessionId(p, method) { + const v = p.session_id; + if (typeof v !== "string" || v.length === 0) { + throw new TeamError("TEAM_INVALID_ARGUMENT", `${method} param "session_id" is required`); + } + return v; +} +function requireString(p, key, method, opts = {}) { + const v = p[key]; + if (typeof v !== "string" || !opts.allowEmpty && v.length === 0) { + throw new TeamError( + "TEAM_INVALID_ARGUMENT", + `${method} param "${key}" must be a${opts.allowEmpty ? " string" : " non-empty string"}` + ); + } + return v; +} +function optionalString(p, key, method, opts = {}) { + const v = p[key]; + if (v === void 0) return void 0; + if (typeof v !== "string" || !opts.allowEmpty && v.length === 0) { + throw new TeamError( + "TEAM_INVALID_ARGUMENT", + `${method} param "${key}" must be a${opts.allowEmpty ? " string" : " non-empty string"}` + ); + } + if (opts.enum !== void 0 && !opts.enum.includes(v)) { + throw new TeamError("TEAM_INVALID_ARGUMENT", `${method} param "${key}" must be one of ${opts.enum.join(", ")}`); + } + return v; +} +function optionalStringArray(p, key, method) { + const v = p[key]; + if (v === void 0) return void 0; + if (!Array.isArray(v) || v.some((item) => typeof item !== "string")) { + throw new TeamError("TEAM_INVALID_ARGUMENT", `${method} param "${key}" must be an array of strings`); + } + return v; +} + +// src/domain/lifecycle.ts +var TeamLifecycle = class { + constructor(deps) { + this.deps = deps; + } + phase = "open"; + abort = new AbortController(); + inflight = /* @__PURE__ */ new Set(); + disposeRun; + get status() { + return this.phase; + } + requireOpen() { + if (this.phase !== "open") { + throw new TeamError("TEAM_DISPOSED", "Agent Teams service is disposing"); + } + } + runtimeSignal() { + return this.abort.signal; + } + track(p) { + this.inflight.add(p); + void p.finally(() => { + this.inflight.delete(p); + }).catch(() => void 0); + return p; + } + /** dispose(reason):D9 抽象触发;幂等(重复调用等首次结果)。 */ + dispose(reason) { + this.disposeRun ??= this.runDispose(); + return this.disposeRun; + } + async runDispose() { + const failures = []; + this.phase = "disposing"; + this.abort.abort(new TeamError("TEAM_DISPOSED", "Agent Teams service disposed")); + this.deps.closeWaiters?.(); + const clock = this.deps.clock ?? defaultClock; + const settle = Promise.allSettled([...this.inflight]); + let settled = []; + const timedOut = await Promise.race([ + settle.then((results) => { + settled = results; + return false; + }), + clock.sleep(this.deps.disposalTimeoutMs).then(() => true) + ]); + for (const entry of settled) { + if (entry.status === "rejected" && !isCancellation(entry.reason)) failures.push(entry.reason); + } + if (timedOut) { + failures.push( + new TeamError( + "TEAM_DISPOSAL_TIMEOUT", + `Agent Teams runtime disposal exceeded ${this.deps.disposalTimeoutMs}ms` + ) + ); + } + try { + await this.deps.drainer({ timeoutMs: this.deps.disposalTimeoutMs }); + } catch (err) { + if (!isCancellation(err)) failures.push(err); + } + this.phase = "closed"; + if (failures.length > 0) { + throw new AggregateError(failures, "Agent Teams runtime disposal failed"); + } + } +}; +var defaultClock = { + now: () => Date.now(), + sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)) +}; +function isCancellation(err) { + let current = err; + for (let depth = 0; depth < 8 && current !== void 0 && current !== null; depth++) { + if (isTeamError(current) && current.code === "TEAM_DISPOSED") return true; + if (current instanceof AggregateError && current.errors.length > 0) { + if (current.errors.every((e) => isCancellation(e))) return true; + } + current = current.cause; + } + return false; +} + +// src/domain/ports.ts +var realClock = { + now: () => Date.now(), + sleep: (ms, signal) => new Promise((resolve) => { + if (signal?.aborted) { + resolve(); + return; + } + const onAbort = () => { + clearTimeout(timer); + signal?.removeEventListener("abort", onAbort); + resolve(); + }; + const timer = setTimeout(() => { + signal?.removeEventListener("abort", onAbort); + resolve(); + }, ms); + signal?.addEventListener("abort", onAbort, { once: true }); + }) +}; +function errorMessage(err) { + const message = err instanceof Error ? err.message : String(err); + return message.split("\n")[0] ?? message; +} + +// src/domain/activity.ts +var TeamActivity = class { + constructor(deps) { + this.deps = deps; + this.clock = deps.clock ?? realClock; + } + waiters = /* @__PURE__ */ new Set(); + closed = false; + clock; + unsubscribeCommit; + /** 接线:Team 日志提交边(由 runtime/装配调用;每提交唤醒全部已注册等待者一次)。 */ + bindCommitEdge() { + this.unsubscribeCommit?.(); + this.unsubscribeCommit = this.deps.store.onCommit(() => this.wakeAll()); + return () => this.unsubscribeCommit?.(); + } + /** 接线:成员状态变化边(roster.onMemberStatus → 此处)。 */ + notifyMemberStatus() { + this.wakeAll(); + } + /** 处置:唤醒全部等待者并关闭准入(新等待立即返回 { timedOut:false })。 */ + closeAll() { + this.closed = true; + this.wakeAll(); + } + /** §8 waitForChange。 */ + async waitForChange(callerId, timeoutMs = 3e4, signal) { + if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1e4 || timeoutMs > 36e5) { + throw new TeamError( + "TEAM_INVALID_TIMEOUT", + "timeoutMs must be an integer from 10000 through 3600000" + ); + } + signal?.throwIfAborted(); + if (this.closed) return { timedOut: false }; + requireMembership(() => this.loadState(), callerId); + return new Promise((resolve, reject) => { + const sleepAbort = new AbortController(); + const waiter = { + wake: () => { + cleanup(); + resolve({ timedOut: false }); + } + }; + const onAbort = () => { + cleanup(); + const reason = signal?.reason; + if (reason instanceof Error) reject(reason); + else + reject( + new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${errorMessage(reason)}`) + ); + }; + const cleanup = () => { + if (settled) return; + this.waiters.delete(waiter); + settled = true; + signal?.removeEventListener("abort", onAbort); + sleepAbort.abort(); + }; + let settled = false; + this.waiters.add(waiter); + signal?.addEventListener("abort", onAbort, { once: true }); + void this.clock.sleep(timeoutMs, sleepAbort.signal).then(() => { + if (settled) return; + cleanup(); + resolve({ timedOut: true }); + }); + }); + } + wakeAll() { + const current = [...this.waiters]; + this.waiters.clear(); + for (const waiter of current) waiter.wake(); + } + loadState() { + const state = this.deps.store.state(); + if (state.failure !== void 0) throw new Error(state.failure); + return state; + } +}; + +// src/domain/validation.ts +function requiredText(field, value, maxLen) { + if (typeof value !== "string") { + throw new TeamError("TEAM_INVALID_ARGUMENT", `${field} must be non-empty`, { cause: { field } }); + } + const trimmed = value.trim(); + if (trimmed.length === 0) { + throw new TeamError("TEAM_INVALID_ARGUMENT", `${field} must be non-empty`, { cause: { field } }); + } + if (trimmed.length > maxLen) { + throw new TeamError("TEAM_INVALID_ARGUMENT", `${field} exceeds ${maxLen} characters`, { + cause: { field, length: trimmed.length } + }); + } + return trimmed; +} +function writeScope(scope) { + if (typeof scope !== "string") { + throw invalidWriteScope(scope); + } + let s = scope.replace(/\\/g, "/"); + while (s.startsWith("./")) s = s.slice(2); + while (s.endsWith("/")) s = s.slice(0, -1); + if (s.length === 0) throw invalidWriteScope(scope); + if (s.startsWith("/")) throw invalidWriteScope(scope); + if (/^[a-z]:/i.test(s)) throw invalidWriteScope(scope); + for (const segment of s.split("/")) { + if (segment.length === 0 || segment === "." || segment === "..") throw invalidWriteScope(scope); + } + return s; +} +function writeScopes(list) { + if (!Array.isArray(list)) { + throw new TeamError("TEAM_INVALID_ARGUMENT", "write_scopes must be an array"); + } + const seen = /* @__PURE__ */ new Set(); + const out = []; + for (const scope of list) { + const normalized = writeScope(scope); + if (!seen.has(normalized)) { + seen.add(normalized); + out.push(normalized); + } + } + return out; +} +function invalidWriteScope(scope) { + return new TeamError( + "TEAM_INVALID_WRITE_SCOPE", + `invalid workspace-relative write scope ${JSON.stringify(scope)}`, + { cause: { scope } } + ); +} + +// src/provider/model-inheritance.ts +var ModelInheritanceError = class extends Error { + constructor(message, selection) { + super(message); + this.selection = selection; + this.name = "ModelInheritanceError"; + } +}; +var ModelSyncSuppressedError = class extends ModelInheritanceError { + constructor(message, selection) { + super(message, selection); + this.name = "ModelSyncSuppressedError"; + } +}; +function providerHasModelPreflight(provider) { + return typeof provider.preflightMemberModel === "function"; +} +function selectionSignature(selection) { + return `${selection.providerId}$${selection.modelId}$${selection.reasoningLevel ?? ""}`; +} +function classifyApplyFailure(reason) { + return /^Command failed:|timeout|did not become ready|timed out|spawn|exited|ENOENT|EACCES|ECONNREFUSED|EPIPE|socket hang up|client (is )?closed/i.test( + reason + ) ? "transient" : "deterministic"; +} +function classifySelectionFailure(message) { + return /无法确定 Lead 当前模型/.test(message) ? "transient" : "deterministic"; +} + +// src/domain/roster.ts +var NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/; +var TeamRoster = class { + constructor(deps) { + this.deps = deps; + this.recoveryDone = this.reconcileProvisioning().then( + () => void 0, + () => void 0 + ); + } + statusListeners = /* @__PURE__ */ new Set(); + recoveryDone; + /** 成员状态变化边(Activity 唤醒源之二;settle/interrupt 后触发)。 */ + onMemberStatus(listener) { + this.statusListeners.add(listener); + return () => this.statusListeners.delete(listener); + } + /** 外部状态变化通知(stage-4:provider 轮次边界 → Activity 唤醒;F13 ≤1s 路径)。 */ + notifyStatusChanged() { + this.notifyStatus(); + } + /** C5 服务层落点:投影 failure → 一切调用 TEAM_NOT_MEMBER。 */ + loadState() { + const state = this.deps.store.state(); + if (state.failure !== void 0) throw new Error(state.failure); + return state; + } + requireMember(callerId) { + const membership = requireMembership(() => { + const state = this.loadState(); + if (state.failure !== void 0) throw new Error(state.failure); + return state; + }, callerId); + return { state: this.loadState(), name: membership.name }; + } + // ---------------------------------------------------------------- spawn(§5.3) + async spawnTeammate(callerId, args) { + return this.deps.lifecycle.track(this.spawnInner(callerId, args)); + } + async spawnInner(callerId, args) { + const { state } = this.requireMember(callerId); + this.deps.lifecycle.requireOpen(); + if (callerId !== state.id) { + throw new TeamError("TEAM_LEAD_REQUIRED", "only the Team Lead can create teammates"); + } + const name = args.name; + if (typeof name !== "string" || name.length > 64 || name === "lead" || !NAME_PATTERN.test(name)) { + throw new TeamError( + "TEAM_INVALID_MEMBER_NAME", + 'teammate name must be lower-kebab-case, at most 64 characters, and not "lead"' + ); + } + const description = requiredText("description", args.description, 200); + const providers = this.deps.providers ?? { fresh: "spawn", fork: "fork" }; + const context = args.context ?? "fresh"; + const providerName = requiredText("provider", context === "fork" ? providers.fork : providers.fresh, 200); + const childId = (this.deps.newId ?? defaultNewId)(); + await this.deps.store.transact(async () => { + const fresh = this.loadState(); + if (fresh.members.some((m) => m.name === name)) { + throw new TeamError("TEAM_MEMBER_NAME_TAKEN", `teammate name "${name}" was already used in this Team`); + } + if (fresh.members.length >= this.deps.limits.maxMembers) { + throw new TeamError("TEAM_MEMBER_LIMIT", `Team member limit ${this.deps.limits.maxMembers} reached`); + } + if (providerHasModelPreflight(this.deps.provider)) { + this.deps.provider.preflightMemberModel(); + } + await this.deps.store.append({ + type: "team/member", + version: 2, + teamId: this.deps.teamId, + member: memberSnapshotOf(childId, name, description, providerName, context, "provisioning") + }); + }); + const run = (async () => { + const signal = combineSignals(args.signal, this.deps.lifecycle.runtimeSignal()); + try { + return await this.deps.provider.startContinuable({ + teamId: this.deps.teamId, + memberId: childId, + name, + description, + firstPrompt: args.prompt, + // 对齐轮:0.2.1 初始任务不含身份前缀 + context, + signal + }); + } catch (err) { + throw this.mapAbortToDisposed(err); + } + })(); + try { + const started = await run; + if (started.memberId !== childId) { + throw new Error(`provider returned memberId ${started.memberId} != provisioned ${childId}`); + } + if (!started.accepted) { + throw new TeamError( + "TEAM_PROVISIONING_CONFLICT", + `teammate "${childId}" initial prompt was not durably accepted` + ); + } + const settled = await this.settleProvisioning(childId, "active"); + if (settled === "failed") { + const conflict = new TeamError( + "TEAM_PROVISIONING_CONFLICT", + `teammate "${name}" was reconciled as failed while creation was in progress` + ); + try { + await this.deps.provider.interrupt({ memberId: childId }); + } catch (cleanupError) { + throw new AggregateError([conflict, cleanupError], "provisioning conflict cleanup failed"); + } + throw conflict; + } + this.notifyStatus(); + return { member: this.rowOf(childId) }; + } catch (originalError) { + let becameActiveConflict; + let recordError; + let recordErrorSet = false; + try { + const settled = await this.settleProvisioning(childId, "failed", errorMessage(originalError)); + if (settled === "active") { + becameActiveConflict = new TeamError( + "TEAM_PROVISIONING_CONFLICT", + `teammate "${name}" became active while its creator reported failure` + ); + } + } catch (err) { + recordError = err; + recordErrorSet = true; + } + if (becameActiveConflict !== void 0) { + this.notifyStatus(); + throw becameActiveConflict; + } + if (recordErrorSet) { + throw new AggregateError( + [originalError, recordError], + "teammate creation and durable failure recording both failed" + ); + } + try { + await this.deps.provider.interrupt({ memberId: childId }); + } catch (cleanupError) { + throw new AggregateError( + [originalError, cleanupError], + "teammate creation and durable failure recording both failed" + ); + } + this.notifyStatus(); + throw originalError; + } + } + /** settleProvisioning(幂等):已非 provisioning → 返回现有相位不追加;成员消失 → C1 冲突。 */ + settleProvisioning(memberId, phase, error2) { + return this.deps.store.transact(async () => { + const state = this.loadState(); + const member = state.members.find((m) => m.id === memberId); + if (member === void 0) { + throw new TeamError("TEAM_PROVISIONING_CONFLICT", `provisioned teammate "${memberId}" disappeared`); + } + if (member.phase !== "provisioning") return member.phase; + const next = error2 !== void 0 ? { ...member, phase, error: error2 } : { ...member, phase }; + await this.deps.store.append({ + type: "team/member", + version: 2, + teamId: this.deps.teamId, + member: next + }); + return phase; + }); + } + // ---------------------------------------------------------------- 恢复对账(§5.4) + /** 对每个 provisioning 且不存活的成员执行四条件对账;C3:恢复自身抛错仅警告。 + * 返回摘要(第四轮最小扩展):orphans = 本轮识别的失联成员;settled = 本轮定案者 + * (active/failed 任一去向;幂等竞态下相位已被他方定案也计入——结局已持久)。 */ + async reconcileProvisioning() { + const state = this.loadState(); + const pending = state.members.filter( + (m) => m.phase === "provisioning" && !this.deps.inspector.isAlive(m.id) + ); + const orphans = pending.map((m) => m.id); + const settled = []; + for (const member of pending) { + try { + let failure; + let active = false; + try { + const record2 = this.deps.recon.readProvisioningRecord(member.id); + if (record2 === void 0) { + failure = "provisioning did not leave a resumable child Session"; + } else if (record2.rootSessionId === this.deps.teamId && record2.descriptor !== void 0 && record2.descriptor.mode === "continuable" && record2.descriptor.provider === member.provider && record2.initialUserMessageAccepted) { + active = true; + } else { + failure = "persisted child Session does not match the provisioned continuation"; + } + } catch (err) { + failure = `child Session recovery failed: ${errorMessage(err)}`; + } + await this.settleProvisioning(member.id, active ? "active" : "failed", failure); + settled.push(member.id); + this.notifyStatus(); + } catch (err) { + this.deps.warn?.( + `Agent Teams recovery for "${member.id}" failed: ${err instanceof Error ? err.message : String(err)}` + ); + } + } + return { orphans, settled }; + } + // ---------------------------------------------------------------- listMembers(§5.5) + listMembers(callerId) { + this.requireMember(callerId); + const state = this.loadState(); + const presentation = this.deps.presentation; + const leadModel = presentation?.leadModelOf?.() ?? this.deps.leadModel; + const rows = [ + { + target: "lead", + role: "lead", + // availability(root):Lead 调用方视角恒 running;teammate 视角无法观测宿主 Lead 回合, + // 保守呈 inactive(D19 登记)。此前恒 running 会让 teammate 的 noProgress 捷径失效。 + status: callerId === state.id ? "running" : "inactive", + ...leadModel !== void 0 ? { model: leadModel } : {}, + diagnostics: [] + } + ]; + for (const member of state.members) { + const status = member.phase === "failed" ? "failed" : member.phase === "provisioning" ? "provisioning" : presentation ? presentation.statusOf(member.id) : this.deps.inspector.isAlive(member.id) ? "running" : "inactive"; + const model = presentation?.modelOf(member.id) ?? this.deps.leadModel; + const extraDiagnostics = presentation?.diagnosticsOf?.(member.id) ?? []; + const diagnostics = [ + ...member.error !== void 0 ? [member.error] : [], + ...extraDiagnostics + ]; + rows.push({ + target: member.name, + role: "teammate", + status, + description: member.description, + provider: member.provider, + context: member.context, + ...model !== void 0 ? { model } : {}, + diagnostics + }); + } + return { members: rows }; + } + // ---------------------------------------------------------------- interrupt(§5.6) + async interrupt(callerId, rawName) { + const { state } = this.requireMember(callerId); + if (callerId !== state.id) { + throw new TeamError("TEAM_LEAD_REQUIRED", "only the Team Lead can interrupt teammates"); + } + const name = rawName.trim(); + if (name === "lead") { + throw new TeamError("TEAM_INVALID_TARGET", "the Team Lead cannot interrupt itself"); + } + const target = state.members.find((m) => m.name === name && m.phase === "active"); + if (target === void 0) { + throw new TeamError("TEAM_MEMBER_NOT_FOUND", `active teammate "${name}" not found`); + } + if (!this.deps.inspector.isAlive(target.id)) { + return { previousStatus: "inactive" }; + } + const result = await this.deps.provider.interrupt({ memberId: target.id }); + this.notifyStatus(); + return result; + } + // ---------------------------------------------------------------- 内部 + /** C2③:checkpoint 等待被非 Error reason 中止 → TEAM_DISPOSED `teammate creation aborted: `。 */ + mapAbortToDisposed(err) { + if (err instanceof Error) return err; + return new TeamError("TEAM_DISPOSED", `teammate creation aborted: ${errorMessage(err)}`); + } + rowOf(memberId) { + const rows = this.listMembers(this.deps.teamId).members; + const row = rows.find((r) => r.target === this.nameOf(memberId)); + if (row === void 0) throw new Error(`member row missing for ${memberId}`); + return row; + } + nameOf(memberId) { + const member = this.loadState().members.find((m) => m.id === memberId); + return member?.name ?? ""; + } + notifyStatus() { + for (const listener of this.statusListeners) listener(); + } +}; +function memberSnapshotOf(id, name, description, provider, context, phase, error2) { + return { id, name, description, provider, context, phase, ...error2 !== void 0 ? { error: error2 } : {} }; +} +function defaultNewId() { + return globalThis.crypto.randomUUID(); +} +function combineSignals(a, b) { + if (a === void 0) return b; + return AbortSignal.any([a, b]); +} + +// src/domain/mailbox.ts +function resolveActiveMember(state, teamId, rawName) { + const name = rawName.trim(); + if (name === "lead") return { id: teamId, name: "lead" }; + const member = state.members.find((m) => m.name === name && m.phase === "active"); + if (member === void 0) { + throw new TeamError("TEAM_MEMBER_NOT_FOUND", `active teammate "${name}" not found`); + } + return { id: member.id, name: member.name }; +} +function frameMessage(message) { + return [ + { type: "text", text: `Team message from ${message.senderName}:` }, + ...message.content + ]; +} +function utf8Bytes(text) { + return new TextEncoder().encode(text).length; +} +var TeamMailbox = class { + constructor(deps) { + this.deps = deps; + } + targetChains = /* @__PURE__ */ new Map(); + inflight = /* @__PURE__ */ new Map(); + /** send(对齐轮修订):校验 → pending 落盘 flush(先于任何投递尝试)→ tryDispatch 同步发起(B6)。 */ + async send(callerId, args) { + return this.deps.lifecycle.track(this.sendInner(callerId, args)); + } + async sendInner(callerId, args) { + const membership = requireMembership(() => this.loadState(), callerId); + this.deps.lifecycle.requireOpen(); + let messageId; + let dispatch2; + await this.deps.store.transact(async () => { + const state = this.loadState(); + const target = resolveActiveMember(state, this.deps.teamId, args.target); + if (target.id === callerId) { + throw new TeamError("TEAM_SELF_MESSAGE", "a Team member cannot message itself"); + } + const id = `team-message-${(this.deps.newId ?? defaultNewId2)()}`; + const snapshot = { + id, + senderId: callerId, + senderName: membership.name, + targetId: target.id, + content: structuredClone(args.content) + }; + const framed = frameMessage(snapshot); + const bytes = utf8Bytes(JSON.stringify(framed)); + if (bytes > this.deps.limits.maxMessageBytes) { + throw new TeamError("TEAM_MESSAGE_TOO_LARGE", `team message exceeds ${this.deps.limits.maxMessageBytes} bytes`); + } + await this.deps.store.append({ + type: "team/message/queued", + version: 2, + teamId: this.deps.teamId, + message: snapshot + }); + messageId = id; + dispatch2 = this.tryDispatch(snapshot); + }); + const outcome = await dispatch2; + if (outcome.status === "rejected") { + throw new Error( + `team message could not be delivered to "${args.target}": ${outcome.reason ?? "unknown delivery failure"}` + ); + } + return { + messageId, + status: outcome.status, + ...outcome.reason !== void 0 ? { reason: outcome.reason } : {} + }; + } + /** C5 服务层落点。 */ + loadState() { + const state = this.deps.store.state(); + if (state.failure !== void 0) throw new Error(state.failure); + return state; + } + pendingCount(state, targetId) { + const deliveredIds = new Set(state.delivered); + return state.messages.filter((m) => m.targetId === targetId && !deliveredIds.has(m.id)).length; + } + /** 目标的全部 pending(队列序)。 */ + pendingFor(state, targetId) { + const deliveredIds = new Set(state.delivered); + return state.messages.filter((m) => m.targetId === targetId && !deliveredIds.has(m.id)); + } + // ---------------------------------------------------------------- 投递(§6.3) + /** 单消息入口:in-flight 去重 + C10 短路 + 按目标串行(dispatchThrough)。 */ + tryDispatch(message) { + const state = this.loadState(); + if (!this.pendingFor(state, message.targetId).some((m) => m.id === message.id)) { + return Promise.resolve({ status: "accepted" }); + } + const existing = this.inflight.get(message.id); + if (existing !== void 0) return existing; + const prev = this.targetChains.get(message.targetId) ?? Promise.resolve(); + const attempt = prev.then( + () => this.dispatchThrough(message), + () => this.dispatchThrough(message) + ); + this.inflight.set( + message.id, + attempt.finally(() => this.inflight.delete(message.id)) + ); + this.targetChains.set( + message.targetId, + attempt.then( + () => void 0, + () => void 0 + ) + ); + return this.inflight.get(message.id); + } + /** 取该目标全部 pending,按队列序投递直到本条;前序 pending/rejected 即整体返回该结果。 */ + async dispatchThrough(message) { + const state = this.loadState(); + const queue = this.pendingFor(state, message.targetId); + for (const candidate of queue) { + const outcome = await this.dispatchOne(candidate); + if (candidate.id === message.id) return outcome; + if (outcome.status !== "accepted") return outcome; + } + return { status: "accepted" }; + } + /** dispatchOnce 分支矩阵(§6.3):accepted=确认送达;pending=适配层收件箱;rejected=硬失败。 */ + async dispatchOne(message) { + try { + const framed = frameMessage(message); + const source = { + kind: "agent-message", + form: "relay", + senderSessionId: message.senderId + }; + if (message.targetId === this.deps.teamId) { + const steered = this.deps.steerLead ? this.deps.steerLead(framed, source) : defaultSteerLead(framed, source); + if (steered !== false) { + return await this.tryMarkDelivered(message); + } + if (this.deps.inspector.containsMessage(message.targetId, message.id)) { + return await this.tryMarkDelivered(message); + } + return { status: "pending", reason: "lead inbox has no receipt yet" }; + } + if (this.deps.inspector.isAlive(message.targetId)) { + if (this.deps.inspector.containsMessage(message.targetId, message.id)) { + return await this.tryMarkDelivered(message); + } + const verdict2 = await this.deliverFramed(message, framed); + if (verdict2 === "accepted") return await this.checkpointDelivered(message); + return { status: "pending", reason: "target is running; delivery deferred to turn boundary" }; + } + let record2; + try { + record2 = this.deps.inspector.readColdRecord(message.targetId, message.id); + } catch (err) { + this.deps.warn?.( + `cannot read Team message target "${message.targetId}": ${errText(err)}` + ); + return { status: "rejected", reason: errText(err) }; + } + if (record2 !== void 0 && record2.recorded) { + return await this.tryMarkDelivered(message); + } + const verdict = await this.deliverFramed(message, framed); + if (verdict === "accepted") return await this.checkpointDelivered(message); + return { status: "pending", reason: "cold target resume deferred" }; + } catch (err) { + this.deps.warn?.(`team message "${message.id}" remains queued: ${errText(err)}`); + return { status: "rejected", reason: errText(err) }; + } + } + /** provider.deliver(framedMessage 序列化为字符串——草案 §1 deliver 签名)。 */ + deliverFramed(message, framed) { + return this.deps.provider.deliver({ + memberId: message.targetId, + framedMessage: JSON.stringify(framed), + messageId: message.id + }); + } + /** §6.3 checkpointDelivered:确认目标日志确已含该消息身份,再 markDelivered(幂等)。 */ + async checkpointDelivered(message) { + const confirmed = message.targetId === this.deps.teamId || this.deps.inspector.containsMessage(message.targetId, message.id); + if (!confirmed) { + this.deps.warn?.(`team message "${message.id}" remains queued: target confirmation missing`); + return { status: "pending", reason: "target confirmation missing" }; + } + return await this.tryMarkDelivered(message); + } + /** + * 投递已发生但 delivered 事件未落盘(如 journal 崩溃/确认缺失):返回 pending, + * 由恢复路径按 containsMessage 补记;不向调用方谎报 accepted,也不误报 rejected。 + */ + async tryMarkDelivered(message) { + try { + await this.markDelivered(message); + return { status: "accepted" }; + } catch (err) { + this.deps.warn?.(`team message "${message.id}" delivered confirmation not recorded: ${errText(err)}`); + return { status: "pending", reason: "delivered confirmation not recorded" }; + } + } + /** markDelivered(幂等:已 delivered / 消息不存在 / targetId 不符 → 静默返回)。 */ + async markDelivered(message) { + await this.deps.store.transact(async () => { + const state = this.loadState(); + const existing = state.messages.find((m) => m.id === message.id); + if (existing === void 0) return; + if (existing.targetId !== message.targetId) return; + if (state.delivered.includes(message.id)) return; + await this.deps.store.append({ + type: "team/message/delivered", + version: 2, + teamId: this.deps.teamId, + messageId: message.id, + targetId: message.targetId + }); + }); + } + // ---------------------------------------------------------------- 回执观察与恢复重试(F20) + /** §6.3 回执观察(全局 session/event 等价钩子):目标已持久接收 → 补记 delivered。 */ + async observeDelivery(memberId, messageId) { + try { + const state = this.loadState(); + const message = state.messages.find((m) => m.id === messageId); + if (message === void 0 || message.targetId !== memberId) return; + if (state.delivered.includes(messageId)) return; + if (this.deps.inspector.containsMessage(memberId, messageId)) { + await this.markDelivered(message); + } + } catch (err) { + this.deps.warn?.(`Team message "${messageId}" acknowledgement failed: ${errText(err)}`); + } + } + /** §6.3 恢复重试:成员启动 → 其 pending 重投;Lead("all")→ 全量。 */ + async recoverFor(target) { + const state = this.loadState(); + const targets = target === "all" ? [...new Set(state.messages.map((m) => m.targetId))] : [target]; + for (const targetId of targets) { + const queue = this.pendingFor(this.loadState(), targetId); + if (process.env.TEAM_DEBUG_DELIVERY === "1") { + this.deps.warn?.(`delivery-recover target=${targetId} pending=${queue.length}`); + } + for (const message of queue) { + const outcome = await this.tryDispatch(message); + if (process.env.TEAM_DEBUG_DELIVERY === "1") { + this.deps.warn?.(`delivery-recover target=${targetId} message=${message.id} status=${outcome.status} reason=${outcome.reason ?? ""}`); + } + } + } + } +}; +function defaultSteerLead(framed, source) { +} +function defaultNewId2() { + return globalThis.crypto.randomUUID(); +} +function errText(err) { + return err instanceof Error ? err.message : String(err); +} + +// src/domain/taskboard.ts +var TeamTaskBoard = class { + constructor(deps) { + this.deps = deps; + } + // ---------------------------------------------------------------- create(§7.2) + async create(callerId, args) { + this.requireMember(callerId); + this.deps.lifecycle.requireOpen(); + const subject = requiredText("subject", args.subject, 200); + const description = requiredText("description", args.description, 16384); + const scopes = writeScopes(args.writeScopes ?? []); + return this.deps.store.transact(async () => { + const state = this.loadState(); + const id = `task-${state.nextTaskNumber}`; + if (state.nextTaskNumber > Number.MAX_SAFE_INTEGER || state.tasks.some((t) => t.id === id)) { + throw new TeamError("TEAM_TASK_LIMIT", "Team task id space exhausted"); + } + const liveCount = state.tasks.filter((t) => t.status !== "deleted").length; + if (liveCount >= this.deps.limits.maxTasks) { + throw new TeamError("TEAM_TASK_LIMIT", `Team task limit ${this.deps.limits.maxTasks} reached`); + } + dependencies(state.tasks, id, args.blockedBy ?? []); + const task = { + id, + revision: 1, + subject, + description, + status: "pending", + blockedBy: [...args.blockedBy ?? []], + writeScopes: scopes + }; + assertTaskGraphCandidate(state.tasks, task); + const { state: next } = await this.deps.store.append({ + type: "team/task", + version: 2, + teamId: this.deps.teamId, + task + }); + return { task: projectTaskView(next, next.tasks.find((t) => t.id === id)) }; + }); + } + // ---------------------------------------------------------------- update(§7.3) + async update(callerId, args) { + this.requireMember(callerId); + this.deps.lifecycle.requireOpen(); + return this.deps.store.transact(async () => { + const state = this.loadState(); + const current = state.tasks.find((t) => t.id === args.taskId); + if (current === void 0) { + throw new TeamError("TEAM_TASK_NOT_FOUND", `team task "${args.taskId}" not found`); + } + if (current.revision !== args.expectedRevision) { + throw new TeamError( + "TEAM_TASK_STALE_REVISION", + `stale team task "${args.taskId}" revision ${args.expectedRevision}; current revision is ${current.revision}` + ); + } + if (current.status === "deleted") { + throw new TeamError("TEAM_TASK_DELETED", `team task "${args.taskId}" is deleted`); + } + const isLead = callerId === state.id; + const isOwner = current.ownerId === callerId; + const next = this.applyAction(state, current, callerId, isLead, isOwner, args); + assertTaskGraphCandidate(state.tasks, next); + const { state: nextState } = await this.deps.store.append({ + type: "team/task", + version: 2, + teamId: this.deps.teamId, + task: next + }); + return { + task: projectTaskView(nextState, nextState.tasks.find((t) => t.id === args.taskId)) + }; + }); + } + applyAction(state, current, callerId, isLead, isOwner, args) { + const authorizeOwner = () => { + if (!(isLead || isOwner)) { + throw new TeamError("TEAM_TASK_UNAUTHORIZED", "task mutation requires its owner or Team Lead"); + } + }; + const ready = projectTaskView(state, current).ready; + const bump = (patch) => ({ + ...current, + ...patch, + revision: current.revision + 1 + }); + switch (args.action) { + case "claim": { + if (current.ownerId !== void 0 && current.ownerId !== callerId) { + throw new TeamError( + "TEAM_TASK_ALREADY_CLAIMED", + `team task "${current.id}" is owned by another member` + ); + } + if (current.status !== "pending" || !ready) { + throw new TeamError("TEAM_TASK_BLOCKED", `team task "${current.id}" is not ready to claim`); + } + return bump({ status: "in_progress", ownerId: callerId }); + } + case "release": { + authorizeOwner(); + if (current.status !== "in_progress") { + throw new TeamError("TEAM_TASK_INVALID_TRANSITION", "only an in-progress task can be released"); + } + return stripOwner(bump({ status: "pending" })); + } + case "edit": { + authorizeOwner(); + const hasAny = args.subject !== void 0 || args.description !== void 0 || args.writeScopes !== void 0; + if (!hasAny) { + throw new TeamError( + "TEAM_INVALID_ARGUMENT", + "task edit requires subject, description, or write_scopes" + ); + } + return bump({ + ...args.subject !== void 0 ? { subject: requiredText("subject", args.subject, 200) } : {}, + ...args.description !== void 0 ? { description: requiredText("description", args.description, 16384) } : {}, + ...args.writeScopes !== void 0 ? { writeScopes: writeScopes(args.writeScopes) } : {} + }); + } + case "set_dependencies": { + authorizeOwner(); + if (args.blockedBy === void 0) { + throw new TeamError("TEAM_INVALID_ARGUMENT", "set_dependencies requires blocked_by"); + } + dependencies(state.tasks, current.id, args.blockedBy); + return bump({ blockedBy: [...args.blockedBy] }); + } + case "complete": { + authorizeOwner(); + if (current.status !== "in_progress") { + throw new TeamError("TEAM_TASK_INVALID_TRANSITION", "only an in-progress task can complete"); + } + return bump({ status: "completed" }); + } + case "reopen": { + authorizeOwner(); + if (current.status !== "completed") { + throw new TeamError("TEAM_TASK_INVALID_TRANSITION", "only a completed task can reopen"); + } + return stripOwner( + bump({ + status: "pending", + ...args.description !== void 0 ? { description: requiredText("description", args.description, 16384) } : {} + }) + ); + } + case "reassign": { + if (!isLead) { + throw new TeamError("TEAM_LEAD_REQUIRED", "only the Team Lead can reassign tasks"); + } + if (current.status !== "pending" && current.status !== "in_progress") { + throw new TeamError( + "TEAM_TASK_INVALID_TRANSITION", + "only a pending or in-progress task can be reassigned" + ); + } + const rawOwner = (args.owner ?? "").trim(); + if (rawOwner.length === 0) { + return stripOwner(bump({ status: "pending" })); + } + if (!ready) { + throw new TeamError("TEAM_TASK_BLOCKED", `team task "${current.id}" is blocked`); + } + const target = rawOwner === "lead" ? { id: state.id, name: "lead" } : state.members.find((m) => m.name === rawOwner && m.phase === "active"); + if (target === void 0) { + throw new TeamError("TEAM_MEMBER_NOT_FOUND", `active teammate "${rawOwner}" not found`); + } + return bump({ status: "in_progress", ownerId: target.id }); + } + case "delete": { + authorizeOwner(); + const dependent = state.tasks.find( + (t) => t.id !== current.id && t.status !== "deleted" && t.blockedBy.includes(current.id) + ); + if (dependent !== void 0) { + throw new TeamError( + "TEAM_TASK_HAS_DEPENDENTS", + `team task "${current.id}" still blocks "${dependent.id}"` + ); + } + return bump({ status: "deleted" }); + } + default: + throw new TeamError("TEAM_INVALID_ARGUMENT", `unsupported task action ${String(args.action)}`); + } + } + // ---------------------------------------------------------------- list / get(§7.6) + list(callerId, args = {}) { + this.requireMember(callerId); + const state = this.loadState(); + const cursor = args.cursor ?? 0; + const limit = args.limit ?? 50; + if (!Number.isSafeInteger(cursor) || cursor < 0) { + throw new TeamError("TEAM_INVALID_ARGUMENT", "cursor must be a non-negative safe integer"); + } + if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100) { + throw new TeamError("TEAM_INVALID_ARGUMENT", "limit must be an integer from 1 through 100"); + } + const views = state.tasks.filter((t) => t.status !== "deleted").map((t) => projectTaskView(state, t)); + const filtered = views.filter((view2) => { + if (args.status !== void 0 && view2.status !== args.status) return false; + if (args.owner !== void 0) { + if (args.owner === "unowned" && view2.ownerName !== void 0) return false; + if (args.owner !== "unowned" && view2.ownerName !== args.owner) return false; + } + if (args.ready !== void 0 && view2.ready !== args.ready) return false; + return true; + }); + const page = filtered.slice(cursor, cursor + limit); + const hasNext = cursor + limit < filtered.length; + return hasNext ? { tasks: page, nextCursor: cursor + limit } : { tasks: page }; + } + get(callerId, taskId) { + this.requireMember(callerId); + const state = this.loadState(); + const task = state.tasks.find((t) => t.id === taskId); + if (task === void 0) { + throw new TeamError("TEAM_TASK_NOT_FOUND", `team task "${taskId}" not found`); + } + return { task: projectTaskView(state, task) }; + } + // ---------------------------------------------------------------- 内部 + requireMember(callerId) { + requireMembership(() => this.loadState(), callerId); + } + loadState() { + const state = this.deps.store.state(); + if (state.failure !== void 0) throw new Error(state.failure); + return state; + } +}; +function stripOwner(task) { + if (task.ownerId === void 0) return task; + const clone2 = { ...task }; + delete clone2.ownerId; + return clone2; +} + +// src/domain/runtime.ts +var TeamRuntime = class { + lifecycle; + activity; + roster; + mailbox; + taskboard; + unsubscribeCommit; + unsubscribeStatus; + constructor(deps) { + this.lifecycle = new TeamLifecycle({ + teamId: deps.teamId, + store: deps.store, + disposalTimeoutMs: deps.limits.disposalTimeoutMs, + drainer: (args) => deps.provider.drain({ teamId: deps.teamId, timeoutMs: args.timeoutMs }), + closeWaiters: () => this.activity.closeAll(), + clock: deps.clock + }); + this.activity = new TeamActivity({ store: deps.store, clock: deps.clock }); + this.roster = new TeamRoster({ + teamId: deps.teamId, + store: deps.store, + provider: deps.provider, + recon: deps.provider, + inspector: deps.provider, + limits: deps.limits, + lifecycle: this.lifecycle, + presentation: deps.presentation, + providers: deps.providers, + leadModel: deps.leadModel, + warn: deps.warn, + newId: deps.newId + }); + this.mailbox = new TeamMailbox({ + teamId: deps.teamId, + store: deps.store, + provider: deps.provider, + inspector: deps.provider, + limits: deps.limits, + lifecycle: this.lifecycle, + steerLead: deps.steerLead, + warn: deps.warn, + newId: deps.newId + }); + this.taskboard = new TeamTaskBoard({ + teamId: deps.teamId, + store: deps.store, + limits: deps.limits, + lifecycle: this.lifecycle + }); + this.unsubscribeCommit = this.activity.bindCommitEdge(); + this.unsubscribeStatus = this.roster.onMemberStatus(() => this.activity.notifyMemberStatus()); + } + /** 冷启动恢复对账:roster 对账完成 + 全量邮箱续投。 */ + async recoverAll() { + await this.roster.recoveryDone; + await this.mailbox.recoverFor("all"); + } + /** D9 抽象处置入口。 */ + dispose(reason) { + return this.lifecycle.dispose(reason); + } + close() { + this.unsubscribeCommit(); + this.unsubscribeStatus(); + } +}; + +// src/provider/mock-provider.ts +import { randomUUID as randomUUID2 } from "node:crypto"; +var MockProvider = class { + teamChildren = /* @__PURE__ */ new Map(); + /** 非团队子进程(§12「非 Team 的 continuable 子代理不动」验证)。 */ + foreignChildren = /* @__PURE__ */ new Set(); + provisioningRecords = /* @__PURE__ */ new Map(); + drainedTeamIds = []; + drainCalls = 0; + startCalls = 0; + deliverCalls = 0; + program = {}; + deliverScript = []; + programWith(program) { + this.program = program; + this.deliverScript = program.deliverResults ? [...program.deliverResults] : []; + return this; + } + async startContinuable(args) { + this.startCalls += 1; + const outcome = this.program.startOutcome ?? { kind: "accept" }; + if (this.program.startDelayMs && this.program.startDelayMs > 0) { + await sleep2(this.program.startDelayMs); + } + if (outcome.kind === "hang") { + await new Promise((_, reject) => { + const onAbort = () => reject(args.signal?.reason ?? new Error("aborted")); + if (args.signal?.aborted) return onAbort(); + args.signal?.addEventListener("abort", onAbort, { once: true }); + }); + } + if (outcome.kind === "throw") throw outcome.error; + const child = { + memberId: args.memberId, + name: args.name, + context: args.context, + model: void 0, + modelSelection: void 0, + firstPrompt: args.firstPrompt, + alive: true, + received: /* @__PURE__ */ new Set(), + deliverCount: /* @__PURE__ */ new Map(), + interrupted: 0, + drained: false, + status: "running" + // 首轮 prompt 已投递 → 存活即 running(availability 口径) + }; + this.teamChildren.set(args.memberId, child); + this.provisioningRecords.set(args.memberId, { + rootSessionId: args.teamId, + descriptor: { provider: args.context === "fork" ? "fork" : "spawn", mode: "continuable" }, + initialUserMessageAccepted: outcome.kind === "accept" + }); + return { memberId: args.memberId, accepted: outcome.kind === "accept" }; + } + async deliver(args) { + this.deliverCalls += 1; + if (this.program.deliverDelayMs && this.program.deliverDelayMs > 0) { + await sleep2(this.program.deliverDelayMs); + } + const child = this.teamChildren.get(args.memberId); + if (child === void 0 || !child.alive) { + if (this.program.coldDeliverOutcome === "accepted") { + const cold = child ?? { + memberId: args.memberId, + name: args.memberId, + context: "fresh", + model: void 0, + modelSelection: void 0, + firstPrompt: "", + alive: false, + received: /* @__PURE__ */ new Set(), + deliverCount: /* @__PURE__ */ new Map(), + interrupted: 0, + drained: false, + status: "idle" + }; + if (!cold.received.has(args.messageId)) { + cold.received.add(args.messageId); + cold.deliverCount.set(args.messageId, (cold.deliverCount.get(args.messageId) ?? 0) + 1); + } + if (child === void 0) this.teamChildren.set(args.memberId, cold); + return "accepted"; + } + return "queued"; + } + const verdict = this.deliverScript.length > 0 ? this.deliverScript.shift() : "accepted"; + if (verdict === "throw") throw new Error(`mock deliver failure for ${args.messageId}`); + if (verdict === "lost") { + return "accepted"; + } + if (verdict === "queued") { + return "queued"; + } + if (child.received.has(args.messageId)) { + return "accepted"; + } + child.received.add(args.messageId); + child.deliverCount.set(args.messageId, (child.deliverCount.get(args.messageId) ?? 0) + 1); + return "accepted"; + } + async interrupt(args) { + if (this.program.interruptError !== void 0) throw this.program.interruptError; + const child = this.teamChildren.get(args.memberId); + if (child === void 0 || !child.alive) return { previousStatus: "inactive" }; + const previousStatus = child.status; + child.interrupted += 1; + child.status = "idle"; + return { previousStatus }; + } + async drain(args) { + this.drainCalls += 1; + if (this.program.drainError !== void 0) throw this.program.drainError; + await sleep2(Math.min(args.timeoutMs, 5)); + for (const child of this.teamChildren.values()) { + if (child.alive) { + child.alive = false; + child.drained = true; + } + } + this.drainedTeamIds.push(args.teamId); + } + // ------------------------------------------------ ReconciliationSource(§5.4 桩) + readProvisioningRecord(memberId) { + return this.provisioningRecords.get(memberId); + } + /** 测试直改桩(构造四条件缺失场景)。 */ + setProvisioningRecord(memberId, record2) { + if (record2 === void 0) this.provisioningRecords.delete(memberId); + else this.provisioningRecords.set(memberId, record2); + } + // ------------------------------------------------ TargetInspector(§5.5/§6.3) + isAlive(memberId) { + const child = this.teamChildren.get(memberId); + return child !== void 0 && child.alive; + } + containsMessage(memberId, messageId) { + const child = this.teamChildren.get(memberId); + if (child === void 0) return this.readColdRecord(memberId, messageId)?.recorded ?? false; + return child.received.has(messageId); + } + readColdRecord(memberId, messageId) { + if (this.program.coldRead === "throw") { + throw new Error(`mock cold read failure for ${memberId}`); + } + const child = this.teamChildren.get(memberId); + if (child === void 0) return void 0; + return { recorded: child.received.has(messageId) }; + } + /** 测试辅助:外部把某消息标记为目标已持久接收(F20 回执观察等价钩子)。 */ + markReceived(memberId, messageId) { + const child = this.teamChildren.get(memberId); + if (child) child.received.add(messageId); + } + /** 测试辅助:非团队子进程登记(drain 不动它们)。 */ + addForeignChild(memberId) { + this.foreignChildren.add(memberId); + } + /** 测试辅助:成员生死控制(成员启动/退出模拟)。 */ + killChild(memberId) { + const child = this.teamChildren.get(memberId); + if (child) child.alive = false; + } + reviveChild(memberId) { + const child = this.teamChildren.get(memberId); + if (child) child.alive = true; + } + // §5.5 呈现能力(listMembers 的 availability/model) + statusOf(memberId) { + return this.isAlive(memberId) ? "running" : "inactive"; + } + modelOf(memberId) { + const child = this.teamChildren.get(memberId); + return child?.modelSelection?.modelId ?? child?.model; + } + /** Lead 行模型桩(可编程;缺省 undefined → roster 回落 deps.leadModel)。 */ + leadModelOf() { + return this.program.leadModel; + } + /** 成员附加诊断桩(MemberPresentation.diagnosticsOf;缺省空)。 */ + diagnosticsOf(memberId) { + return this.program.memberDiagnostics?.[memberId] ?? []; + } + /** spawn 预检桩(0.4.1 ModelPreflight;programWith({preflightError}) 注入失败)。 */ + preflightMemberModel() { + if (this.program.preflightError !== void 0) throw this.program.preflightError; + } + newId() { + return randomUUID2(); + } +}; +function sleep2(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +// src/coord/host.ts +var DEFAULT_HOST_LIMITS = { + maxMembers: 8, + maxTasks: 256, + maxMessageBytes: 65536, + disposalTimeoutMs: 5e3 +}; +var TeamCoordinatorHost = class _TeamCoordinatorHost { + constructor(dataRoot, teamId, opts, lock, limits, provider) { + this.dataRoot = dataRoot; + this.teamId = teamId; + this.opts = opts; + this.lock = lock; + this.limits = limits; + this.provider = provider; + } + mode = "proxy"; + store = null; + runtime = null; + server = null; + table = null; + watcher = null; + /** pending 补投扫描(崩溃/瞬时失败后不得永久滞留;边界之外的兜底)。 */ + deliveryTimer = null; + promoting = null; + closed = false; + initialLoad = null; + /** 投影 failure 终态 → 降级服务(见 serve())。 */ + degradedReason; + static async open(opts) { + const paths = teamPaths(opts.dataRoot, opts.teamId); + ensureTeamDir(paths); + let host; + const lock = new CoordinatorLock(paths.lockFile, paths.auditFile, { + // 失锁 = 立即降级;不能继续以 coordinator 身份写 journal/占用 socket。 + onLost: () => { + void host.demoteToProxy("coordinator lock lost"); + } + }); + lock.installExitHandlers(); + const limits = validateTeamLimits({ ...DEFAULT_HOST_LIMITS, ...opts.limits }); + host = new _TeamCoordinatorHost(opts.dataRoot, opts.teamId, opts, lock, limits, opts.provider ?? new MockProvider()); + try { + await lock.acquire({ waitMs: opts.lockWaitMs ?? 0 }); + } catch (err) { + if (err instanceof AcquireTimeout) { + host.startTakeoverWatcher(); + return host; + } + throw err; + } + await host.serve(); + return host; + } + get currentMode() { + return this.mode; + } + get socketPath() { + return this.server?.socketPath; + } + get committedSeq() { + return this.store?.committedSeq ?? this.initialLoad?.seq ?? 0; + } + get coordinatorBootId() { + return this.lock.info?.bootId ?? bootId(); + } + /** 代理模式下的方法表(§2 一致性断言用;协调者模式为 null)。 */ + get methodTable() { + return this.table; + } + /** 降级原因(投影 failure 终态);未降级为 undefined。 */ + get degradedFailure() { + return this.degradedReason; + } + /** + * 协调者模式下的域运行时(stage-3 工具面接线用:list_agents 的 MEMBER_VIEW 全保真 + * 与 wait 捷径需要 roster 呈现;附加式小改,披露于 stage-3 开发记录)。 + * 代理模式为 null(本进程无 runtime)。 + */ + get teamRuntime() { + return this.mode === "coordinator" ? this.runtime : null; + } + /** 协调者就绪信息(socketPath/seq;代理模式仅 seq 本地重放值)。 */ + async readyInfo() { + if (this.mode === "coordinator") { + return { + mode: this.mode, + socketPath: this.socketPath, + seq: this.committedSeq, + fromCheckpoint: this.initialLoad?.fromCheckpoint ?? false, + lockInfo: this.lock.info ?? void 0, + ...this.degradedReason !== void 0 ? { failure: this.degradedReason } : {} + }; + } + const loaded = await load(this.paths().teamDir, this.teamId); + return { + mode: this.mode, + seq: loaded.seq, + fromCheckpoint: loaded.fromCheckpoint, + ...loaded.state.failure !== void 0 ? { failure: loaded.state.failure } : {} + }; + } + /** + * 变更/查询分发:协调者模式 → 方法表直执行(与 socket 路径同一份处理器,语义等价); + * 代理模式 → 经 socket 调当前协调者(缺位窗口错误由调用方/TeamClient 决定重试策略)。 + */ + async dispatch(method, params, opts = {}) { + if (this.mode === "coordinator" && this.table !== null) { + return invokeTeamMethod(this.table, method, params, opts); + } + const { teamDir } = this.paths(); + return callCoordinator(teamDir, this.teamId, method, params, { + // 慢方法(spawn/send)用 per-method 裕量;其余沿用 host 全局(缺省交给 RPC 层 15s)。 + timeoutMs: methodTimeoutMs(method) ?? this.opts.callTimeoutMs, + ...opts.signal !== void 0 ? { signal: opts.signal } : {} + }); + } + /** 本地重放读(两模式皆可;协调者模式等价于内存态,代理模式为权威盘面)。 */ + async readBoard() { + return load(this.paths().teamDir, this.teamId); + } + /** 手动触发一次接任尝试(观察者外的显式入口;测试/演练用)。 */ + tryPromote() { + if (this.mode === "coordinator" || this.promoting !== null) { + return this.promoting ?? Promise.resolve(true); + } + const run = this.promoteOnce().finally(() => { + this.promoting = null; + }); + this.promoting = run; + return run; + } + async close() { + if (this.closed) return; + this.closed = true; + this.stopWatcher(); + this.stopDeliverySweep(); + const errors = []; + if (this.server !== null) { + try { + await this.server.close(); + } catch (err) { + errors.push(err); + } + this.server = null; + } + if (this.runtime !== null) { + try { + await this.runtime.dispose(); + } catch (err) { + errors.push(err); + } + this.runtime.close(); + this.runtime = null; + } + if (this.store !== null) { + try { + await this.store.close(); + } catch (err) { + errors.push(err); + } + this.store = null; + } + try { + await this.lock.release(); + } catch (err) { + errors.push(err); + } + if (providerHasBoundary(this.provider)) { + try { + this.provider.detach(); + } catch (err) { + errors.push(err); + } + } + this.table = null; + if (errors.length > 0) throw new AggregateError(errors, "Agent Teams coordinator host close failed"); + } + /** + * 失锁降级:停止心跳/写路径,关闭 RPC 与 runtime,回到 proxy 并重新观察接任。 + * 与 close() 的区别:不置 closed,仍可再次晋升。 + */ + async demoteToProxy(reason) { + if (this.closed || this.mode !== "coordinator") return; + this.mode = "proxy"; + this.lock.stopHeartbeat(); + this.stopDeliverySweep(); + this.opts.warn?.(`agent-team coordinator demoted for team "${this.teamId}": ${reason}`); + const server2 = this.server; + this.server = null; + this.table = null; + if (server2 !== null) { + try { + await server2.close(); + } catch { + } + removeSocketRegistryIf(this.paths().teamDir, server2.socketPath); + } + const runtime = this.runtime; + this.runtime = null; + if (runtime !== null) { + try { + await runtime.dispose(); + } catch { + } + runtime.close(); + } + const store = this.store; + this.store = null; + if (store !== null) { + try { + await store.close(); + } catch { + } + } + this.startTakeoverWatcher(); + } + // ---------------------------------------------------------------- 内部 + paths() { + return teamPaths(this.dataRoot, this.teamId); + } + /** 轮次边界(stage-4):landed → observeDelivery 折叠 delivered;teammate → pending 续投;状态边 → Activity 唤醒。 */ + async handleTurnBoundary(event) { + if (this.mode !== "coordinator" || this.runtime === null || this.closed) return; + try { + for (const messageId of event.landedMessageIds) { + await this.runtime.mailbox.observeDelivery(event.memberId, messageId); + } + if (event.memberId !== this.teamId) { + await this.runtime.mailbox.recoverFor(event.memberId); + } + this.runtime.roster.notifyStatusChanged(); + } catch (err) { + this.opts.warn?.( + `agent-team turn boundary handling failed for "${event.memberId}": ${err instanceof Error ? err.message : String(err)}` + ); + } + } + /** 持锁后装配:journal(store) → runtime → 恢复对账 → RPC server + 方法表。 */ + async serve() { + if (this.closed) throw new Error("host is closed"); + const paths = this.paths(); + this.lock.startHeartbeat(); + let store; + try { + const journal = { + ...this.opts.journal, + maxLineBytes: Math.max( + this.opts.journal?.maxLineBytes ?? 65536, + this.limits.maxMessageBytes + 4096 + ) + }; + store = await JournalTeamStore.open(this.dataRoot, this.teamId, { + lock: this.lock, + journal + }); + } catch (err) { + this.lock.stopHeartbeat(); + await this.lock.release(); + throw err; + } + const runtime = new TeamRuntime({ + teamId: this.teamId, + store, + provider: this.provider, + limits: this.limits, + presentation: providerIsPresentation(this.provider) ? this.provider : void 0, + // stage-4:宿主内 Lead 无直达通道(D2)→ 投递走 hook 三通道 + 回执折叠。 + // 灰度唤醒:TEAM_WAKE_LEAD=1 且 Lead 空闲时拉起 --resume 回合;仍返回 false(未确认送达)。 + ...providerDeliversLeadViaHooks(this.provider) ? { + steerLead: () => { + if (providerWakesLead(this.provider)) { + void this.provider.wakeLead().then((result) => { + if (result.woke) { + this.opts.warn?.(`agent-team lead wake launched for team "${this.teamId}"`); + } else if (result.reason !== "disabled" && result.reason !== "lead-active" && result.reason !== "recent-activity" && result.reason !== "cooldown") { + this.opts.warn?.(`agent-team lead wake skipped for team "${this.teamId}": ${result.reason}`); + } + }).catch((err) => { + this.opts.warn?.( + `agent-team lead wake failed for team "${this.teamId}": ${err instanceof Error ? err.message : String(err)}` + ); + }); + } + return false; + } + } : {}, + warn: this.opts.warn + }); + if (providerHasBoundary(this.provider)) { + this.provider.bind({ + onBoundary: (event) => void this.handleTurnBoundary(event), + pendingLookup: (memberId) => { + const state = store.state(); + return runtime.mailbox.pendingFor(state, memberId).map((message) => ({ messageId: message.id, framedJson: JSON.stringify(frameMessage(message)) })); + }, + // 0.4.1:模型失败记录变化(后台续跑同步失败/恢复清除)→ 成员展示立即刷新 + // (Activity 唤醒 + 面板下一帧拿到新诊断;不等下一次轮次边界)。 + onModelFailureChanged: () => { + if (this.mode === "coordinator" && this.runtime !== null && !this.closed) { + this.runtime.roster.notifyStatusChanged(); + } + } + }); + const adopted = this.provider.adoptOrphans(); + this.opts.warn?.( + `agent-team coordinator adopted team "${this.teamId}": finalized ${adopted.finalized.length} finished turn(s), watching ${adopted.adopted.length} live turn(s)` + ); + } + this.initialLoad = store.lastLoad; + const initialState = store.state(); + if (initialState.failure !== void 0) { + this.degradedReason = initialState.failure; + this.opts.warn?.( + `Agent Teams coordinator for team "${this.teamId}" started in degraded mode (projection failure): ${initialState.failure}` + ); + } else { + await runtime.recoverAll(); + } + const socket = resolveSocketPath(paths.teamDir); + const token = newRpcToken(); + const server2 = new RpcServer(socket.socketPath, { + token, + maxFrameBytes: frameBudgetFor(this.limits.maxMessageBytes) + }); + const table = buildTeamMethodTable({ + teamId: this.teamId, + runtime, + store, + coordinatorBootId: this.lock.info?.bootId ?? bootId() + }); + registerTeamMethods(server2, table); + await server2.listen({ callTimeoutMs: this.opts.callTimeoutMs }); + writeRpcToken(paths.teamDir, token); + writeSocketRegistry(paths.teamDir, socket.socketPath); + this.store = store; + this.runtime = runtime; + this.server = server2; + this.table = table; + this.mode = "coordinator"; + this.stopWatcher(); + this.startDeliverySweep(); + this.opts.onPromoted?.({ + socketPath: socket.socketPath, + seq: store.committedSeq, + fromCheckpoint: this.initialLoad?.fromCheckpoint ?? false, + ...this.degradedReason !== void 0 ? { failure: this.degradedReason } : {} + }); + } + /** 单发晋升尝试:锁缺失/过龄才出手;新鲜持有 → false。 */ + async promoteOnce() { + if (this.mode === "coordinator" || this.closed) return this.mode === "coordinator"; + const observed = this.lock.observe(); + if (observed.exists && observed.ageMs <= this.lock.tuningOptions.expiryMs) { + return false; + } + try { + await this.lock.acquire({ waitMs: 0 }); + } catch { + return false; + } + await this.serve(); + return true; + } + startTakeoverWatcher() { + if (this.opts.autoTakeover === false || this.watcher !== null) return; + const pollMs = this.opts.takeoverPollMs ?? 100; + const watcher = setInterval(() => { + void this.tryPromote().catch(() => void 0); + }, pollMs); + watcher.unref?.(); + this.watcher = watcher; + } + stopWatcher() { + if (this.watcher !== null) { + clearInterval(this.watcher); + this.watcher = null; + } + } + /** + * pending 补投:轮次边界是主路径;进程瞬时失败(拉起后未落库即退出)会留下 pending, + * 若没有新的边界/发送就永远不会再试。这里按固定间隔扫描(provider 内部对运行中/退避 + * 目标快速返回 queued,不重复拉起)。 + */ + startDeliverySweep() { + if (this.deliveryTimer !== null) return; + const everyMs = this.opts.deliverySweepMs ?? 2e3; + if (everyMs <= 0) return; + this.deliveryTimer = setInterval(() => { + if (this.mode !== "coordinator" || this.runtime === null || this.closed) return; + try { + const state = this.store?.state(); + if (state === void 0) return; + const delivered = new Set(state.delivered); + if (!state.messages.some((message) => !delivered.has(message.id))) return; + } catch { + return; + } + void this.runtime.mailbox.recoverFor("all").catch((err) => { + this.opts.warn?.( + `agent-team delivery sweep failed for "${this.teamId}": ${err instanceof Error ? err.message : String(err)}` + ); + }); + }, everyMs); + this.deliveryTimer.unref?.(); + } + stopDeliverySweep() { + if (this.deliveryTimer !== null) { + clearInterval(this.deliveryTimer); + this.deliveryTimer = null; + } + } +}; +function providerIsPresentation(provider) { + return typeof provider.statusOf === "function" && typeof provider.modelOf === "function"; +} +function providerHasBoundary(provider) { + return typeof provider.bind === "function" && typeof provider.adoptOrphans === "function"; +} +function providerDeliversLeadViaHooks(provider) { + return provider.LEAD_DELIVERY_VIA_HOOKS === true; +} +function providerWakesLead(provider) { + return typeof provider.wakeLead === "function"; +} + +// src/mcp/policy.ts +function teamPolicy(interrupt) { + return `Agent Teams is available in this session + +The Team Lead and all teammates share the same working directory and filesystem. Edits are immediately visible to every member. Split write work into disjoint scopes, record expected write scopes on shared tasks, and use task dependencies when work must be ordered. Write-scope overlap is advisory, not a lock. + +Prefer read/edit/write for file changes. If a file operation reports that the file changed since you last read it, read the current file again, rebase your intended change onto the new content, and retry. Bash, formatters, code generators, and scripts are not fully protected by the filesystem version guard; coordinate them explicitly and have the Lead review the final diff and run tests. + +Use the target returned by spawn_teammate or list_agents for send_message${interrupt ? " and interrupt_agent" : ""}, or as owner when assigning or filtering shared tasks. send_message steers a running target at its nearest step boundary and starts or resumes an inactive target. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Shared-task workflow is list, get, claim with the current revision, perform the work, then complete. Task readiness never starts an owner. Before wait_agent, use list_agents and make sure another required member is running or provisioning; use send_message first when the required member is inactive. wait_agent observes only changes after that call starts, never wakes a member, and returns noProgress immediately when no other member can produce a change. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer.`; +} +var POLICY_TEXT = teamPolicy(true); +var HOOK_POLICY_PREFIX = "[agent-team]"; +var IDENTITY_LEAD_TEXT = `You are the Team Lead named "lead". +Use list_agents({}) to find your teammates and their names. +To message another teammate, use send_message({ target: "", message: "..." }).`; +var POLICY_PROBE_MARKER = "quartz-ember-73"; +var ORCHESTRATOR_SECTION_TEXT = "Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists \u2014 delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer."; +function buildSessionStartContext(identityText, interrupt = true, leadMode2) { + const policy = teamPolicy(interrupt); + const orchestration = leadMode2 === "orchestrator" ? ` +${HOOK_POLICY_PREFIX} ${ORCHESTRATOR_SECTION_TEXT}` : ""; + const probe = process.env.TEAM_POLICY_PROBE === "1" ? ` +${HOOK_POLICY_PREFIX} \u7B56\u7565\u6CE8\u5165\u9A8C\u8BC1\u6807\u8BB0\uFF1A${POLICY_PROBE_MARKER}` : ""; + return `${HOOK_POLICY_PREFIX} ${policy} +${HOOK_POLICY_PREFIX} ${identityText}${orchestration}${probe}`; +} +var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true, "orchestrator"); +var FAIL_LOUD_WARNING = "[agent-team] \u8B66\u544A\uFF1A\u672A\u68C0\u6D4B\u5230\u672C\u4F1A\u8BDD\u7684\u7B56\u7565\u6CE8\u5165\uFF08SessionStart hook \u53EF\u80FD\u672A\u751F\u6548\uFF09\u3002\u8BF7\u786E\u8BA4\u63D2\u4EF6\u5DF2\u542F\u7528\u4E14 hooks \u58F0\u660E\u5B58\u5728\uFF1B\u56E2\u961F\u5DE5\u5177\u4ECD\u53EF\u8C03\u7528\uFF0C\u4F46\u6A21\u578B\u53EF\u80FD\u672A\u52A0\u8F7D\u5B8C\u6574\u534F\u4F5C\u7B56\u7565\u3002"; +var NO_PROGRESS_REASON = "no-active-peer"; +var NO_PROGRESS_MESSAGE = "No other Team member is running or provisioning. wait_agent cannot make progress or wake inactive teammates. Re-list with list_agents and team_task_list, then use send_message to wake each required inactive teammate before waiting again."; +function noProgressResult() { + return { timedOut: false, noProgress: { reason: NO_PROGRESS_REASON, message: NO_PROGRESS_MESSAGE } }; +} + +// src/mcp/backend.ts +var WAIT_PROGRESS_INTERVAL_MS = 9e3; +var WAIT_DEFAULT_TIMEOUT_MS = 3e4; +var WAIT_MIN_TIMEOUT_MS = 1e4; +var WAIT_MAX_TIMEOUT_MS = 36e5; +var DEFAULT_IDLE_RECLAIM_MS = 10 * 6e4; +var IDLE_SWEEP_MS = 6e4; +var TeamToolBackend = class { + constructor(opts) { + this.opts = opts; + this.now = opts.now ?? Date.now; + this.idleReclaimMs = opts.idleReclaimMs ?? DEFAULT_IDLE_RECLAIM_MS; + } + teams = /* @__PURE__ */ new Map(); + idleTimer = null; + now; + idleReclaimMs; + /** 〔对齐轮〕0.2.1 D3:interrupt 开关(默认 true)。 */ + get interruptEnabled() { + return this.opts.interrupt ?? true; + } + /** 冷启动即服务:惰性 open(并发共享同一 promise);失败不留半成品缓存。 */ + backendFor(teamId) { + let entry = this.teams.get(teamId); + if (entry === void 0) { + const provider = this.opts.providerFactory !== void 0 ? this.opts.providerFactory(teamId) : this.opts.provider !== void 0 ? this.opts.provider : void 0; + const resolvedProvider = provider; + const opening = TeamCoordinatorHost.open({ + dataRoot: this.opts.dataRoot, + teamId, + limits: this.opts.limits, + ...provider !== void 0 ? { provider } : {}, + warn: this.opts.warn + }); + entry = { + host: null, + opening, + // 缺省装配(host 内部 new MockProvider)时拿不到实例 → 模型消歧退化为「按目录唯一命中」。 + ...resolvedProvider !== void 0 ? { provider: resolvedProvider } : {}, + lastUsedAt: this.now(), + inflight: 0 + }; + const self = entry; + void opening.then( + (host) => { + self.host = host; + return host; + }, + (err) => { + if (this.teams.get(teamId) === self) this.teams.delete(teamId); + this.opts.warn?.(`agent-team host open failed for "${teamId}": ${err instanceof Error ? err.message : String(err)}`); + return void 0; + } + ); + this.teams.set(teamId, entry); + this.ensureIdleSweep(); + } + entry.lastUsedAt = this.now(); + return entry.opening; + } + /** 用法包装:记录在途/最后使用时间;工具方法统一经此取 host。 */ + async withHost(teamId, fn) { + const host = await this.backendFor(teamId); + const entry = this.teams.get(teamId); + if (entry !== void 0) entry.inflight += 1; + try { + return await fn(host); + } finally { + if (entry !== void 0) { + entry.inflight -= 1; + entry.lastUsedAt = this.now(); + } + } + } + /** 空闲回收:关闭超过阈值且无在途调用的团队 host(durable 日志保留,下次调用按冷启动恢复)。 */ + async sweepIdleHosts() { + if (this.idleReclaimMs <= 0) return 0; + const now2 = this.now(); + let reclaimed = 0; + for (const [teamId, entry] of [...this.teams.entries()]) { + if (entry.host === null || entry.inflight > 0) continue; + if (now2 - entry.lastUsedAt < this.idleReclaimMs) continue; + this.teams.delete(teamId); + const host = entry.host; + try { + await host.close(); + reclaimed += 1; + } catch (err) { + this.opts.warn?.( + `agent-team idle host close failed for "${teamId}": ${err instanceof Error ? err.message : String(err)}` + ); + } + } + if (reclaimed > 0) this.opts.warn?.(`agent-team reclaimed ${reclaimed} idle team host(s)`); + return reclaimed; + } + ensureIdleSweep() { + if (this.idleTimer !== null || this.idleReclaimMs <= 0) return; + this.idleTimer = setInterval(() => void this.sweepIdleHosts(), IDLE_SWEEP_MS); + this.idleTimer.unref?.(); + } + /** 诊断:某团队 host 是否已开且为协调者(契约测试用)。 */ + modeOf(teamId) { + const entry = this.teams.get(teamId); + return entry?.host?.currentMode ?? "unopened"; + } + async close() { + if (this.idleTimer !== null) { + clearInterval(this.idleTimer); + this.idleTimer = null; + } + const entries = [...this.teams.values()]; + this.teams.clear(); + const errors = []; + for (const entry of entries) { + try { + const host = await entry.opening; + await host.close(); + } catch (err) { + errors.push(err); + } + } + if (errors.length > 0) { + throw new AggregateError(errors, "Agent Teams tool backend close failed"); + } + } + // ---------------------------------------------------------------- 9 工具操作 + /** spawn_teammate(02 §9.3;context 缺省 fresh 由域层承担;〔对齐轮〕0.2.1:初始任务不含身份前缀)。 + * 参数原值直传——类型/枚举守卫在方法表 requireString/optionalString(冻结消息)。 + * 0.4.0:model/thoughtLevel 参数注销——成员模型唯一路线 = provider 每轮跟随 Lead 最新 + * 已确认选择;Lead 模型不可继承(官方套餐/目录外/解析不出)时 provider 抛错 → 本调用报错。 */ + async spawnTeammate(identity, args) { + return this.withHost( + identity.teamId, + async (host) => await host.dispatch("member.spawn", { + session_id: identity.agentId, + name: args.name, + description: args.description, + prompt: args.prompt, + ...args.context !== void 0 ? { context: args.context } : {} + }) + ); + } + // 0.4.0 注销 setMemberModel / resolveModelArgs / leadProviderId / catalog / wireModelSelection / + // validateThoughtLevel(成员模型没有独立配置通道;stage-8 原文见 traceability §18 与 git 历史)。 + /** list_agents 的行派生(协调者 = roster 全保真;代理 = 本地重放派生)。 */ + async memberRows(host, identity) { + const runtime = host.teamRuntime; + if (runtime !== null) { + return runtime.roster.listMembers(identity.agentId).members; + } + const loaded = await host.readBoard(); + requireMembership( + () => { + if (loaded.state.failure !== void 0) throw new Error(loaded.state.failure); + return loaded.state; + }, + identity.agentId + ); + return memberRowsFromState(loaded.state.id, loaded.state.members, identity.agentId); + } + /** send_message(02 §9.5;内容映射 content=[{type:"text",text:message}],target 原值直传)。 + * 〔对齐轮〕0.2.1:工具层输出 {sent:true}(不暴露 messageId;投递状态为内部适配层)。 */ + async sendMessage(identity, args) { + const content = [{ type: "text", text: args.message }]; + return this.withHost(identity.teamId, async (host) => { + await host.dispatch("message.send", { + session_id: identity.agentId, + targetName: args.target, + content + }); + return { sent: true }; + }); + } + /** list_agents(02 §9.6;输出 MEMBER_VIEW[],Lead 伪行 target="lead")。 */ + async listAgents(identity) { + return this.withHost(identity.teamId, (host) => this.memberRows(host, identity)); + } + /** interrupt_agent(02 §9.8;Lead-only 域层校验,工具层不放宽;target 原值直传)。 + * 〔对齐轮〕0.2.1 D3:interrupt=false 时本工具未注册——调用按「未知工具」拒绝(handlers 承担)。 */ + async interruptAgent(identity, args) { + return this.withHost( + identity.teamId, + async (host) => await host.dispatch("member.interrupt", { + session_id: identity.agentId, + name: args.target + }) + ); + } + /** + * wait_agent(02 §9.7/§8):缺省 30000 → 非法值绕过捷径直报 TEAM_INVALID_TIMEOUT + * → 合法则先跑 no-active-peer 捷径(仅协调者模式可评估)→ 否则注册等待 + * (等待期 progress 保活 ≤10s;代理模式经 socket 且按调用豁免超时)。 + */ + async waitAgent(identity, args, emitProgress, signal) { + const raw = args.timeout_ms; + const timeoutMs = raw === void 0 ? WAIT_DEFAULT_TIMEOUT_MS : raw; + return this.withHost(identity.teamId, async (host) => { + if (!isValidTimeout(timeoutMs)) { + if (typeof timeoutMs === "number") { + return await host.dispatch( + "wait.agent", + { session_id: identity.agentId, timeoutMs }, + signal !== void 0 ? { signal } : {} + ); + } + throw new TeamError( + "TEAM_INVALID_TIMEOUT", + "timeoutMs must be an integer from 10000 through 3600000" + ); + } + const runtime = host.teamRuntime; + let wait; + if (runtime !== null) { + const rows = runtime.roster.listMembers(identity.agentId).members; + const selfTarget = identity.role === "lead" ? "lead" : identity.name; + const hasActivePeer = rows.some( + (row) => row.target !== selfTarget && (row.status === "running" || row.status === "provisioning") + ); + if (!hasActivePeer) return noProgressResult(); + wait = host.dispatch( + "wait.agent", + { session_id: identity.agentId, timeoutMs }, + signal !== void 0 ? { signal } : {} + ); + } else { + const { teamDir } = teamPaths(this.opts.dataRoot, identity.teamId); + wait = callCoordinator( + teamDir, + identity.teamId, + "wait.agent", + { session_id: identity.agentId, timeoutMs }, + { + timeoutMs: timeoutMs + WAIT_AGENT_GRACE_MS, + ...signal !== void 0 ? { signal } : {} + } + ); + } + return emitProgress === void 0 ? wait : withKeepAlive(wait, emitProgress); + }); + } + /** team_task_create(02 §9.9;snake_case → 方法表参数,原值直传)。 */ + async taskCreate(identity, args) { + return this.withHost(identity.teamId, async (host) => { + const result = await host.dispatch("task.create", { + session_id: identity.agentId, + subject: args.subject, + description: args.description, + ...args.blocked_by !== void 0 ? { blockedBy: args.blocked_by } : {}, + ...args.write_scopes !== void 0 ? { writeScopes: args.write_scopes } : {} + }); + return result.task; + }); + } + /** team_task_list(02 §9.10;过滤/分页语义与越界消息逐字由域层承担;类型守卫在 handlers)。 */ + async taskList(identity, args) { + return this.withHost( + identity.teamId, + async (host) => await host.dispatch("task.list", { + session_id: identity.agentId, + ...args.status !== void 0 ? { status: args.status } : {}, + ...args.owner !== void 0 ? { owner: args.owner } : {}, + ...args.ready !== void 0 ? { ready: args.ready } : {}, + ...args.cursor !== void 0 ? { cursor: args.cursor } : {}, + ...args.limit !== void 0 ? { limit: args.limit } : {} + }) + ); + } + /** team_task_get(02 §9.11;含 deleted 墓碑)。 */ + async taskGet(identity, args) { + return this.withHost(identity.teamId, async (host) => { + const result = await host.dispatch("task.get", { + session_id: identity.agentId, + taskId: args.task_id + }); + return result.task; + }); + } + /** team_task_update(02 §9.12;CAS 直传,原值交方法表校验)。 */ + async taskUpdate(identity, args) { + return this.withHost(identity.teamId, async (host) => { + const result = await host.dispatch("task.update", { + session_id: identity.agentId, + taskId: args.task_id, + expectedRevision: args.expected_revision, + action: args.action, + ...args.subject !== void 0 ? { subject: args.subject } : {}, + ...args.description !== void 0 ? { description: args.description } : {}, + ...args.blocked_by !== void 0 ? { blockedBy: args.blocked_by } : {}, + ...args.write_scopes !== void 0 ? { writeScopes: args.write_scopes } : {}, + ...args.owner !== void 0 ? { owner: args.owner } : {} + }); + return result.task; + }); + } + /** + * teammate 启动参数接口(T3.4;实参注入归 stage-4 provider)。 + * D6 对齐:--disallowed-tools Task(遮蔽一次性子代理工具,本阶段只留接口)。 + */ + static teammateDisallowedTools() { + return ["Task"]; + } +}; +function isValidTimeout(value) { + return typeof value === "number" && Number.isSafeInteger(value) && value >= WAIT_MIN_TIMEOUT_MS && value <= WAIT_MAX_TIMEOUT_MS; +} +var MEMBER_STATUS_BY_PHASE = { + active: "inactive", + provisioning: "provisioning", + failed: "failed" +}; +function memberRowsFromState(teamId, members, callerId) { + const rows = [ + { target: "lead", role: "lead", status: teamId === callerId ? "running" : "inactive", diagnostics: [] } + ]; + for (const member of members) { + rows.push({ + target: member.name, + role: "teammate", + status: MEMBER_STATUS_BY_PHASE[member.phase], + description: member.description, + provider: member.provider, + context: member.context, + diagnostics: member.error !== void 0 ? [member.error] : [] + }); + } + return rows; +} +async function withKeepAlive(wait, emitProgress, intervalMs = WAIT_PROGRESS_INTERVAL_MS) { + let tick = 0; + const timer = setInterval(() => { + tick += 1; + void emitProgress(tick, "waiting for team activity").catch(() => void 0); + }, intervalMs); + try { + return await wait; + } finally { + clearInterval(timer); + } +} + +// src/mcp/tools.ts +var PANEL_RESOURCE_URI = "ui://agent-team/team-panel.html"; +var PANEL_SURFACE_ID = "agent-team-panel"; +var TEAM_TOOL_DEFINITIONS = [ + { + // 02 §9.3 + name: "spawn_teammate", + description: "Create one named, durable teammate. Only the Team Lead may call this tool. In orchestrator mode, create teammates proactively when the goal benefits from delegation, within the member limit. The teammate automatically follows the Lead's latest confirmed model and reasoning level on every turn; there is no per-member model option.", + inputSchema: { + type: "object", + properties: { + name: { type: "string", description: "Unique lower-kebab-case teammate name." }, + description: { type: "string", description: "Short description of the delegated responsibility." }, + prompt: { type: "string", description: "Complete initial task for the teammate." }, + context: { + type: "string", + enum: ["fresh", "fork"], + description: "fresh starts without Lead history; fork inherits completed Lead turns. Defaults to fresh." + } + }, + required: ["name", "description", "prompt"], + additionalProperties: false + }, + _meta: { + ui: { resourceUri: PANEL_RESOURCE_URI, surface: PANEL_SURFACE_ID } + } + }, + { + // 02 §9.5(〔对齐轮〕0.2.1 描述:删 "durable"、"durable message"→"message") + name: "send_message", + description: "Send one message to another Team member. A running target receives it at the nearest step boundary; an inactive target starts or resumes a turn.", + inputSchema: { + type: "object", + properties: { + target: { + type: "string", + description: "Member target returned by spawn_teammate or list_agents, including lead." + }, + message: { type: "string", description: "Self-contained message for the target." } + }, + required: ["target", "message"], + additionalProperties: false + } + }, + { + // 02 §9.6 + name: "list_agents", + description: "List the Lead and every durable teammate with an addressable target and current availability. inactive means no turn is executing, not a task result. provisioning and failed describe member creation.", + inputSchema: { + type: "object", + properties: {}, + additionalProperties: false + } + }, + { + // 02 §9.8 + name: "interrupt_agent", + description: "Interrupt one teammate's current turn while preserving its pending inbox. Team Lead only.", + inputSchema: { + type: "object", + properties: { + target: { + type: "string", + description: "Teammate target returned by spawn_teammate or list_agents." + } + }, + required: ["target"], + additionalProperties: false + } + }, + // 0.4.0 注销 member_set_model(02 §9.13):成员模型没有独立配置通道,唯一路线 = 每轮 + // 跟随 Lead 最新已确认选择;原规格条目见 traceability §18 与 git 历史。 + { + // 02 §9.7(〔对齐轮〕0.2.1 描述:"mailbox"→"message") + name: "wait_agent", + description: "Wait for the next teammate status, message, or shared-task change after this call starts. This never wakes inactive members and returns noProgress immediately when no other member is running or provisioning. Re-list after wakeup or timeout instead of polling.", + inputSchema: { + type: "object", + properties: { + timeout_ms: { + type: "integer", + description: "Wait duration in milliseconds, from 10000 through 3600000. Defaults to 30000." + } + }, + additionalProperties: false + } + }, + { + // 02 §9.9 + name: "team_task_create", + description: "Create one unowned pending task on the shared Team task board.", + inputSchema: { + type: "object", + properties: { + subject: { type: "string", description: "Concise task title." }, + description: { type: "string", description: "Complete task details and acceptance criteria." }, + blocked_by: { type: "array", items: { type: "string" }, description: "Task ids that must complete first." }, + write_scopes: { + type: "array", + items: { type: "string" }, + description: "Advisory workspace-relative file or directory prefixes this task expects to modify." + } + }, + required: ["subject", "description"], + additionalProperties: false + } + }, + { + // 02 §9.10 + name: "team_task_list", + description: "List shared tasks, including readiness, owner, revision, blockers, and write-scope warnings.", + inputSchema: { + type: "object", + properties: { + status: { + type: "string", + enum: ["pending", "in_progress", "completed"], + description: "Optional exact status filter." + }, + owner: { + type: "string", + description: "Optional member target from spawn_teammate or list_agents, matching ownerName; use unowned for tasks without an owner." + }, + ready: { type: "boolean", description: "Optional readiness filter." }, + cursor: { type: "integer", description: "Zero-based result offset. Defaults to 0." }, + limit: { type: "integer", description: "Number of rows, 1 through 100. Defaults to 50." } + }, + additionalProperties: false + } + }, + { + // 02 §9.11 + name: "team_task_get", + description: "Read the complete latest value of one shared task before changing or executing it.", + inputSchema: { + type: "object", + properties: { + task_id: { type: "string", description: "Shared task id." } + }, + required: ["task_id"], + additionalProperties: false + } + }, + { + // 02 §9.12 + name: "team_task_update", + description: "Compare-and-set a shared task action using the latest revision from team_task_get or team_task_list. In orchestrator mode, the Lead verifies a completed task and reopens it with concrete findings on failure.", + inputSchema: { + type: "object", + properties: { + task_id: { type: "string", description: "Shared task id." }, + expected_revision: { + type: "integer", + description: "Current task revision used as the CAS precondition." + }, + action: { + type: "string", + enum: ["claim", "release", "edit", "set_dependencies", "complete", "reopen", "reassign", "delete"], + description: "Task transition to apply." + }, + subject: { type: "string", description: "Replacement title for edit." }, + description: { + type: "string", + description: "Replacement details for edit; for reopen, the concrete findings that failed verification." + }, + blocked_by: { + type: "array", + items: { type: "string" }, + description: "Complete blocker list for set_dependencies." + }, + write_scopes: { + type: "array", + items: { type: "string" }, + description: "Replacement advisory write scopes for edit." + }, + owner: { + type: "string", + description: "Member target from spawn_teammate or list_agents for Lead-only reassign; omit to unassign." + } + }, + required: ["task_id", "expected_revision", "action"], + additionalProperties: false + } + } +]; +var TEAM_TOOL_NAMES = new Set(TEAM_TOOL_DEFINITIONS.map((t) => t.name)); +function teamToolDefinitions(options = {}) { + const interrupt = options.interrupt ?? true; + return interrupt ? TEAM_TOOL_DEFINITIONS : TEAM_TOOL_DEFINITIONS.filter((t) => t.name !== "interrupt_agent"); +} + +// src/mcp/results.ts +function compactJson(value) { + return JSON.stringify(value); +} +function successResult(value) { + return { content: [{ type: "text", text: compactJson(value) }] }; +} +function errorResult(err) { + const body = normalizeError(err); + return { + isError: true, + content: [{ type: "text", text: compactJson({ error: body }) }] + }; +} +function normalizeError(err) { + if (isTeamError(err)) return { code: err.code, message: err.message }; + if (err instanceof AggregateError) { + const first = err.errors.find(isTeamError); + if (first !== void 0) { + return { code: first.code, message: `${err.message}: ${first.message}` }; + } + const firstPlain = err.errors[0]; + return { + message: err.message + (firstPlain !== void 0 ? `: ${firstPlain instanceof Error ? firstPlain.message : String(firstPlain)}` : "") + }; + } + return { message: err instanceof Error ? err.message : String(err) }; +} +function withFailLoud(result, identity) { + if (identity.hookRegistered) return result; + return { ...result, content: [...result.content, { type: "text", text: FAIL_LOUD_WARNING }] }; +} + +// src/mcp/identity.ts +import fs8 from "node:fs"; +import path7 from "node:path"; +function sessionMapPath(dataRoot) { + return path7.join(dataRoot, "session-map.json"); +} +function safeSessionKey(sessionId) { + return sessionId.replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 128); +} +function registryLockPath(dataRoot) { + return `${sessionMapPath(dataRoot)}.lock`; +} +function withRegistryLock(dataRoot, fn) { + const lock = registryLockPath(dataRoot); + const started = Date.now(); + let fd = null; + while (Date.now() - started < 2e3) { + try { + fd = fs8.openSync(lock, "wx", 384); + break; + } catch { + try { + const stat = fs8.statSync(lock); + if (Date.now() - stat.mtimeMs > 5e3) fs8.unlinkSync(lock); + } catch { + } + const until = Date.now() + 20; + while (Date.now() < until) { + } + } + } + try { + fn(); + } finally { + if (fd !== null) { + try { + fs8.closeSync(fd); + fs8.unlinkSync(lock); + } catch { + } + } + } +} +function readSessionRegistry(dataRoot) { + try { + const parsed = JSON.parse(fs8.readFileSync(sessionMapPath(dataRoot), "utf8")); + if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {}; + return parsed; + } catch { + return {}; + } +} +function upsertSessionEntry(dataRoot, sessionId, patch) { + const file = sessionMapPath(dataRoot); + try { + fs8.mkdirSync(path7.dirname(file), { recursive: true }); + withRegistryLock(dataRoot, () => { + let registry2 = {}; + try { + const parsed = JSON.parse(fs8.readFileSync(file, "utf8")); + if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) { + registry2 = parsed; + } + } catch (err) { + if (err.code !== "ENOENT") { + try { + fs8.renameSync(file, `${file}.corrupt-${Date.now()}`); + } catch { + } + } + } + const key = safeSessionKey(sessionId); + const prior = registry2[key] ?? {}; + registry2[key] = { ...prior, ...patch, session_id: sessionId }; + const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 8)}`; + const fd = fs8.openSync(tmp, "w", 384); + try { + fs8.writeFileSync(fd, JSON.stringify(registry2, null, 2)); + fs8.fsyncSync(fd); + } finally { + fs8.closeSync(fd); + } + fs8.renameSync(tmp, file); + }); + } catch { + } +} +function resolveIdentity(opts) { + const metaSession = opts.meta?.session_id; + let sessionId; + let source = "meta"; + if (typeof metaSession === "string" && metaSession.length > 0) { + sessionId = metaSession; + } else { + const windowMs = opts.fallbackWindowMs ?? 3e5; + const candidates = []; + for (const entry2 of Object.values(readSessionRegistry(opts.dataRoot))) { + if (typeof entry2?.session_id !== "string") continue; + const firstSeen = entry2.firstSeen !== void 0 ? Date.parse(entry2.firstSeen) : NaN; + if (Number.isNaN(firstSeen)) continue; + if (Math.abs(firstSeen - opts.bootTimeMs) <= windowMs) candidates.push(entry2); + } + if (candidates.length === 1) { + sessionId = candidates[0].session_id; + source = "hook-map"; + } + } + if (sessionId === void 0) { + throw notMemberError(""); + } + const registry2 = readSessionRegistry(opts.dataRoot); + const entry = registry2[safeSessionKey(sessionId)] ?? {}; + const runtimeScope = opts.meta?.runtime_scope; + const hookRegistered = entry.hookRegistered === true; + if (entry.role === "teammate" && typeof entry.teamId === "string" && entry.teamId.length > 0) { + touch(opts, sessionId, entry, source); + const memberId = typeof entry.memberId === "string" && entry.memberId.length > 0 ? entry.memberId : sessionId; + return { + sessionId, + teamId: entry.teamId, + role: "teammate", + name: typeof entry.name === "string" && entry.name.length > 0 ? entry.name : sessionId, + agentId: memberId, + source, + hookRegistered + }; + } + if (runtimeScope === "subagent") { + throw notMemberError(sessionId); + } + touch(opts, sessionId, entry, source); + return { + sessionId, + teamId: sessionId, + role: "lead", + name: "lead", + agentId: sessionId, + source, + hookRegistered + }; +} +function notMemberError(agentId) { + return new TeamError( + "TEAM_NOT_MEMBER", + `agent "${agentId}" is not a member of an active Agent Team` + ); +} +function touch(opts, sessionId, entry, source) { + const patch = { + lastSeen: ts(), + ...entry.firstSeen === void 0 ? { firstSeen: ts() } : {}, + ...entry.hookRegistered === true ? { hookRegistered: true } : {} + }; + if (entry.session_id === void 0 || source === "hook-map") patch.session_id = sessionId; + upsertSessionEntry(opts.dataRoot, sessionId, patch); +} + +// src/mcp/handlers.ts +async function handleTeamToolCall(opts, tool) { + let identity; + try { + identity = resolveIdentity({ + dataRoot: opts.dataRoot, + meta: opts.meta, + bootTimeMs: opts.bootTimeMs, + ...opts.now !== void 0 ? { now: opts.now } : {} + }); + } catch (err) { + return errorResult(err); + } + try { + const result = await dispatch(opts, identity, tool); + return withFailLoud(successResult(result), identity); + } catch (err) { + return withFailLoud(errorResult(err), identity); + } +} +async function dispatch(opts, identity, tool) { + const { backend: backend2, args } = opts; + switch (tool) { + case "spawn_teammate": + return backend2.spawnTeammate(identity, { + name: args.name, + description: args.description, + prompt: args.prompt, + ...args.context !== void 0 ? { context: args.context } : {} + }); + case "send_message": + guardNonEmptyString(args.message, "message"); + return backend2.sendMessage(identity, { target: args.target, message: args.message }); + case "list_agents": + return backend2.listAgents(identity); + case "interrupt_agent": + if (!backend2.interruptEnabled) throw new TypeError("unsupported team tool: interrupt_agent"); + return backend2.interruptAgent(identity, { target: args.target }); + // 0.4.0 注销 member_set_model case(工具面 9 个;未知工具由上游分派拒绝)。 + case "wait_agent": + return backend2.waitAgent( + identity, + { ...args.timeout_ms !== void 0 ? { timeout_ms: args.timeout_ms } : {} }, + opts.emitProgress, + opts.signal + ); + case "team_task_create": + return backend2.taskCreate(identity, { + subject: args.subject, + description: args.description, + ...args.blocked_by !== void 0 ? { blocked_by: args.blocked_by } : {}, + ...args.write_scopes !== void 0 ? { write_scopes: args.write_scopes } : {} + }); + case "team_task_list": + if (args.ready !== void 0 && typeof args.ready !== "boolean") { + throw invalidArg('param "ready" must be a boolean'); + } + if (args.cursor !== void 0) guardSafeInteger(args.cursor, "cursor"); + if (args.limit !== void 0) guardSafeInteger(args.limit, "limit"); + if (args.status !== void 0 && args.status !== "pending" && args.status !== "in_progress" && args.status !== "completed") { + throw invalidArg('param "status" must be one of pending, in_progress, completed'); + } + return backend2.taskList(identity, { + ...args.status !== void 0 ? { status: args.status } : {}, + ...args.owner !== void 0 ? { owner: args.owner } : {}, + ...args.ready !== void 0 ? { ready: args.ready } : {}, + ...args.cursor !== void 0 ? { cursor: args.cursor } : {}, + ...args.limit !== void 0 ? { limit: args.limit } : {} + }); + case "team_task_get": + return backend2.taskGet(identity, { task_id: args.task_id }); + case "team_task_update": + return backend2.taskUpdate(identity, { + task_id: args.task_id, + expected_revision: args.expected_revision, + action: args.action, + ...args.subject !== void 0 ? { subject: args.subject } : {}, + ...args.description !== void 0 ? { description: args.description } : {}, + ...args.blocked_by !== void 0 ? { blocked_by: args.blocked_by } : {}, + ...args.write_scopes !== void 0 ? { write_scopes: args.write_scopes } : {}, + ...args.owner !== void 0 ? { owner: args.owner } : {} + }); + default: + throw new TypeError(`unsupported team tool: ${tool}`); + } +} +function invalidArg(message) { + return new TeamError("TEAM_INVALID_ARGUMENT", message); +} +function guardNonEmptyString(v, key) { + if (typeof v !== "string" || v.length === 0) { + throw invalidArg(`param "${key}" must be a non-empty string`); + } +} +function guardSafeInteger(v, key) { + if (typeof v !== "number" || !Number.isSafeInteger(v)) { + throw invalidArg(`param "${key}" must be a safe integer`); + } +} +function isTeamTool(name) { + return TEAM_TOOL_NAMES.has(name); +} + +// src/mcp/registry.ts +function listTeamTools(options = {}) { + return teamToolDefinitions(options).map((t) => ({ + name: t.name, + description: t.description, + inputSchema: t.inputSchema, + ...t._meta !== void 0 ? { _meta: t._meta } : {} + })); +} +async function callTeamTool(input, notifier) { + const emitProgress = buildProgressSink(input, notifier); + return handleTeamToolCall( + { + backend: input.backend, + dataRoot: input.dataRoot, + bootTimeMs: input.bootTimeMs, + meta: input.meta, + args: input.args, + ...emitProgress !== void 0 ? { emitProgress } : {}, + ...input.signal !== void 0 ? { signal: input.signal } : {}, + ...input.now !== void 0 ? { now: input.now } : {} + }, + input.name + ); +} +function buildProgressSink(input, notifier) { + if (input.name !== "wait_agent") return void 0; + const token = input.meta?.progressToken; + if (notifier === void 0 || token === void 0) return void 0; + if (typeof token !== "string" && typeof token !== "number") return void 0; + return async (progress, message) => { + try { + await notifier.sendNotification({ + method: "notifications/progress", + params: { + progressToken: token, + progress, + ...message !== void 0 ? { message } : {} + } + }); + } catch { + } + }; +} + +// src/provider/resume-provider.ts +import { createHash as createHash2 } from "node:crypto"; +import fs18 from "node:fs"; +import path17 from "node:path"; + +// src/provider/lead-wake.ts +import fs11 from "node:fs"; +import path10 from "node:path"; + +// src/provider/procgroup.ts +import { execFile } from "node:child_process"; +import fs10 from "node:fs"; +import path9 from "node:path"; +import { fileURLToPath } from "node:url"; + +// src/provider/member-files.ts +import fs9 from "node:fs"; +import path8 from "node:path"; +function memberPaths(teamDir, memberId) { + const memberDir = path8.join(teamDir, "members", memberId); + const runDir = path8.join(memberDir, "run"); + return { + memberDir, + originFile: path8.join(memberDir, "origin.json"), + receiptsFile: path8.join(memberDir, "receipts.jsonl"), + stopBudgetFile: path8.join(memberDir, "stop-budget.json"), + runDir, + currentFile: path8.join(runDir, "current.json"), + drainMarkerFile: path8.join(runDir, "drain-requested.json"), + modelFailedFile: path8.join(memberDir, "model-failed.json") + }; +} +function turnFile(runDir, turnId) { + return path8.join(runDir, `${turnId}.json`); +} +function writeJsonAtomic(file, value) { + fs9.mkdirSync(path8.dirname(file), { recursive: true, mode: 448 }); + const tmp = `${file}.tmp-${process.pid}-${Date.now()}`; + const fd = fs9.openSync(tmp, "w", 384); + try { + fs9.writeFileSync(fd, JSON.stringify(value, null, 2)); + fs9.fsyncSync(fd); + } finally { + fs9.closeSync(fd); + } + fs9.renameSync(tmp, file); +} +function readJson(file) { + let raw; + try { + raw = fs9.readFileSync(file, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return void 0; + throw err; + } + return JSON.parse(raw); +} +function writeOrigin(paths, origin) { + writeJsonAtomic(paths.originFile, origin); +} +function readOrigin(paths) { + return readJson(paths.originFile); +} +function writeTurn(runDir, turn) { + writeJsonAtomic(turnFile(runDir, turn.turnId), turn); +} +function readTurn(runDir, turnId) { + return readJson(turnFile(runDir, turnId)); +} +function setCurrentTurn(paths, turnId) { + writeJsonAtomic(paths.currentFile, { turnId }); +} +function readCurrentTurnId(paths) { + return readJson(paths.currentFile)?.turnId; +} +function listTurns(runDir) { + let names; + try { + names = fs9.readdirSync(runDir); + } catch (err) { + if (err.code === "ENOENT") return []; + throw err; + } + return names.filter((n) => /^turn-\d+\.json$/.test(n)).sort((a, b) => turnNumber(a) - turnNumber(b)).map((n) => readJson(path8.join(runDir, n))).filter((t) => t !== void 0); +} +function turnNumber(name) { + return Number(name.slice("turn-".length, -".json".length)); +} +function nextTurnId(runDir) { + let names = []; + try { + names = fs9.readdirSync(runDir); + } catch { + } + let max = 0; + for (const n of names) { + if (/^turn-\d+\.json$/.test(n)) max = Math.max(max, turnNumber(n)); + } + return `turn-${max + 1}`; +} +function appendReceipt(paths, receipt) { + fs9.mkdirSync(path8.dirname(paths.receiptsFile), { recursive: true, mode: 448 }); + const fd = fs9.openSync(paths.receiptsFile, "a", 384); + try { + fs9.writeFileSync(fd, JSON.stringify(receipt) + "\n"); + fs9.fsyncSync(fd); + } finally { + fs9.closeSync(fd); + } +} +function readReceipts(paths) { + let raw; + try { + raw = fs9.readFileSync(paths.receiptsFile, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return []; + throw err; + } + const receipts = []; + for (const line of raw.split("\n")) { + if (line.trim().length === 0) continue; + receipts.push(JSON.parse(line)); + } + return receipts; +} +function receiptMessageIds(paths) { + return new Set(readReceipts(paths).map((r) => r.messageId)); +} +function readStopBudget(paths) { + return readJson(paths.stopBudgetFile); +} +function writeStopBudget(paths, budget) { + writeJsonAtomic(paths.stopBudgetFile, budget); +} +function readModelFailed(paths) { + return readJson(paths.modelFailedFile); +} +function writeModelFailed(paths, record2) { + writeJsonAtomic(paths.modelFailedFile, record2); +} +function clearModelFailed(paths) { + try { + fs9.unlinkSync(paths.modelFailedFile); + } catch { + } +} + +// src/provider/procgroup.ts +var HELPER_DEFAULT = path9.join(path9.dirname(fileURLToPath(import.meta.url)), "detach-helper.mjs"); +var SPAWN_HELPER_TIMEOUT_MS = 1e4; +async function spawnDetached(spec) { + const dir = path9.dirname(spec.stdoutFile); + const specFile = spec.specFile ?? path9.join(dir, `${path9.basename(spec.stdoutFile, ".out")}.spec.json`); + const resultFile = spec.resultFile ?? path9.join(dir, `${path9.basename(spec.stdoutFile, ".out")}.spawn.json`); + const specDoc = { + command: spec.command, + argv: spec.argv, + cwd: spec.cwd, + stdoutFile: spec.stdoutFile, + resultFile + }; + if (spec.persistEnv === true) specDoc.env = spec.env; + writeJsonAtomic(specFile, specDoc); + const helper = process.env.TEAM_DETACH_HELPER ?? HELPER_DEFAULT; + await new Promise((resolve, reject) => { + execFile( + process.execPath, + ["--", helper, specFile], + { timeout: SPAWN_HELPER_TIMEOUT_MS, cwd: spec.cwd, env: spec.env }, + (err) => { + if (err) reject(new Error(`detach helper failed: ${err.message}`)); + else resolve(); + } + ); + }); + let result; + try { + result = JSON.parse(fs10.readFileSync(resultFile, "utf8")); + } catch (err) { + throw new Error(`detach helper produced no result file: ${err instanceof Error ? err.message : String(err)}`); + } + if (typeof result.error === "string") { + throw new Error(`turn process launch failed: ${result.error}`); + } + return { pid: result.pid ?? null, pgid: result.pid ?? null, stdoutFile: spec.stdoutFile, specFile, resultFile }; +} +function pidAlive(pid) { + if (pid === null || !Number.isInteger(pid) || pid <= 0) return false; + try { + process.kill(pid, 0); + return true; + } catch (err) { + return err.code === "EPERM"; + } +} +function pgidAlive(pgid) { + if (pgid === null || !Number.isInteger(pgid) || pgid <= 0) return false; + try { + process.kill(-pgid, 0); + return true; + } catch (err) { + return err.code === "EPERM"; + } +} +async function killProcessGroup(pgid, graceMs) { + if (pgid === null || pgid <= 0) return true; + signalGroup(pgid, "SIGTERM"); + for (let waited = 0; waited < graceMs; waited += 50) { + await sleep3(50); + if (!pgidAlive(pgid) && !pidAlive(pgid)) return true; + } + if (pgidAlive(pgid) || pidAlive(pgid)) { + signalGroup(pgid, "SIGKILL"); + for (let waited = 0; waited < 2e3; waited += 50) { + await sleep3(50); + if (!pgidAlive(pgid) && !pidAlive(pgid)) return true; + } + } + return !pgidAlive(pgid) && !pidAlive(pgid); +} +function signalGroup(pgid, sig) { + try { + process.kill(-pgid, sig); + } catch (err) { + if (err.code !== "ESRCH") { + throw err; + } + } +} +function sleep3(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +// src/provider/lead-wake.ts +var WAKE_COOLDOWN_MS = 3e4; +var WAKE_LOCK_STALE_MS = 12e4; +var WAKE_PROMPT = "[agent-team] \u4F60\u6709\u5F85\u6536\u56E2\u961F\u6D88\u606F\u3002\u8BF7\u53EA\u5904\u7406\u6536\u4EF6\u7BB1\uFF08\u8BFB\u53D6\u5E76\u56DE\u590D\u6458\u8981\uFF09\uFF0C\u4E0D\u8981\u6267\u884C\u5176\u4ED6\u4EFB\u52A1\u3002"; +function leadDir(teamDir) { + return path10.join(teamDir, "lead"); +} +function leadStatePath(teamDir) { + return path10.join(leadDir(teamDir), "state.json"); +} +function wakeLockPath(teamDir) { + return path10.join(leadDir(teamDir), "wake.lock"); +} +function readLeadState(teamDir) { + try { + const parsed = JSON.parse(fs11.readFileSync(leadStatePath(teamDir), "utf8")); + if (typeof parsed.active !== "boolean" || typeof parsed.updatedAt !== "string") return void 0; + return parsed; + } catch { + return void 0; + } +} +function writeLeadState(teamDir, state) { + const dir = leadDir(teamDir); + fs11.mkdirSync(dir, { recursive: true }); + const file = leadStatePath(teamDir); + const tmp = `${file}.tmp-${process.pid}`; + const fd = fs11.openSync(tmp, "w", 384); + try { + fs11.writeFileSync(fd, JSON.stringify(state, null, 2)); + fs11.fsyncSync(fd); + } finally { + fs11.closeSync(fd); + } + fs11.renameSync(tmp, file); +} +function acquireLock(teamDir, now2) { + const dir = leadDir(teamDir); + fs11.mkdirSync(dir, { recursive: true }); + const file = wakeLockPath(teamDir); + try { + const fd = fs11.openSync(file, "wx", 384); + fs11.writeFileSync(fd, JSON.stringify({ pid: process.pid, at: now2 })); + fs11.closeSync(fd); + return true; + } catch { + try { + const stat = fs11.statSync(file); + if (now2 - stat.mtimeMs > WAKE_LOCK_STALE_MS) { + fs11.unlinkSync(file); + const fd = fs11.openSync(file, "wx", 384); + fs11.writeFileSync(fd, JSON.stringify({ pid: process.pid, at: now2 })); + fs11.closeSync(fd); + return true; + } + } catch { + } + return false; + } +} +function releaseLock(teamDir) { + try { + fs11.unlinkSync(wakeLockPath(teamDir)); + } catch { + } +} +async function maybeWakeLead(args) { + if (process.env.TEAM_WAKE_LEAD !== "1") return Promise.resolve({ woke: false, reason: "disabled" }); + const now2 = args.now ?? Date.now(); + const state = readLeadState(args.teamDir); + if (state === void 0) return Promise.resolve({ woke: false, reason: "no-lead-state" }); + if (state.active) return Promise.resolve({ woke: false, reason: "lead-active" }); + const updated = Date.parse(state.updatedAt); + if (Number.isNaN(updated) || now2 - updated < args.minIdleMs) { + return Promise.resolve({ woke: false, reason: "recent-activity" }); + } + if (state.lastWakeAt !== void 0) { + const last = Date.parse(state.lastWakeAt); + if (!Number.isNaN(last) && now2 - last < WAKE_COOLDOWN_MS) { + return Promise.resolve({ woke: false, reason: "cooldown" }); + } + } + if (!acquireLock(args.teamDir, now2)) return Promise.resolve({ woke: false, reason: "wake-locked" }); + const runDir = path10.join(leadDir(args.teamDir), "run"); + fs11.mkdirSync(runDir, { recursive: true }); + const stdoutFile = path10.join(runDir, `wake-${now2}.out`); + try { + const argv = [ + ...args.zcode.argvPrefix, + "-p", + WAKE_PROMPT, + "--json", + "--mode", + "yolo", + "--surface", + "terminal", + "--cwd", + args.cwd, + "--resume", + args.leadSessionId + ]; + if (args.launch !== void 0) { + await args.launch({ command: args.zcode.command, argv, cwd: args.cwd, stdoutFile }); + } else { + await spawnDetached({ + command: args.zcode.command, + argv, + env: process.env, + cwd: args.cwd, + stdoutFile + }); + } + writeLeadState(args.teamDir, { ...state, lastWakeAt: new Date(now2).toISOString() }); + return { woke: true, reason: "launched" }; + } catch (err) { + return { woke: false, reason: `spawn-failed: ${err instanceof Error ? err.message : String(err)}` }; + } finally { + releaseLock(args.teamDir); + } +} +function leadWakeEnabled() { + return process.env.TEAM_WAKE_LEAD === "1"; +} + +// src/provider/transcript.ts +import fs12 from "node:fs"; +import os3 from "node:os"; +import path11 from "node:path"; +import { DatabaseSync } from "node:sqlite"; +function defaultDbPath() { + return process.env.TEAM_DB_PATH ?? path11.join(os3.homedir(), ".zcode", "cli", "db", "db.sqlite"); +} +var TranscriptReader = class { + dbPath; + db = null; + dbMissing = false; + constructor(deps = {}) { + this.dbPath = deps.dbPath ?? defaultDbPath(); + } + get path() { + return this.dbPath; + } + /** 库不存在 = 空库语义(探针方法走缺省值,不建临时库)。 */ + missing() { + if (!this.dbMissing) this.dbMissing = !fs12.existsSync(this.dbPath); + else if (!fs12.existsSync(this.dbPath)) return true; + else this.dbMissing = false; + return this.dbMissing; + } + open() { + if (this.db !== null) return this.db; + if (!fs12.existsSync(this.dbPath)) { + throw new Error("transcript db missing"); + } + this.db = new DatabaseSync(this.dbPath, { readOnly: true }); + return this.db; + } + close() { + this.db?.close(); + this.db = null; + } + /** 会话行实查;不存在 → undefined;读失败 → 抛错。 */ + session(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + "SELECT id, parent_id, directory, task_type, title, time_created FROM session WHERE id = ?" + ).get(sessionId); + return row ?? void 0; + } + /** 找「目录 = cwd 且创建于 sinceMs 之后、首条真实用户文本 = firstPrompt」的会话(fresh spawn 探针)。 */ + findSessionByFirstPrompt(args) { + if (this.missing()) return void 0; + const rows = this.open().prepare( + "SELECT id, time_created FROM session WHERE directory = ? AND time_created >= ? ORDER BY time_created ASC" + ).all(args.cwd, args.sinceMs - 2e3); + for (const row of rows) { + if (args.excludeSessionIds?.has(row.id)) continue; + const first = this.firstRealUserText(row.id); + if (first === args.firstPrompt) return row.id; + } + return void 0; + } + /** 首条「真实用户」消息的文本部分(跳过 hook/系统注入的 model-only 消息)。 */ + firstRealUserText(sessionId) { + if (this.missing()) return null; + const rows = this.open().prepare( + `SELECT p.data pdata FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + ORDER BY m.sequence, p.sequence LIMIT 1` + ).all(sessionId); + if (rows.length === 0) return null; + return extractText(rows[0].pdata); + } + /** 会话中是否已存在该文本的「真实用户」消息(delivered/去重探针:prompt 逐字落库)。 */ + hasUserText(sessionId, text) { + if (this.missing()) return false; + const row = this.open().prepare( + `SELECT COUNT(*) n FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + AND json_extract(p.data,'$.text') = ? LIMIT 1` + ).get(sessionId, text); + return row.n > 0; + } + /** 会话全部「真实用户」文本消息(时间序;轮次 prompt 审计/恰一次检索用)。 */ + realUserTexts(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.id mid, m.time_created tc, p.data pdata, + json_extract(m.data,'$.semantics.origin') origin, + json_extract(m.data,'$.modelSelection.modelId') model + FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + return rows.map((r) => ({ + messageId: r.mid, + text: extractText(r.pdata) ?? "", + timeCreated: r.tc, + origin: r.origin, + modelId: r.model + })); + } + /** 会话最新使用的模型(成员行 model 字段实查;无消息 → undefined)。 */ + latestModel(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT json_extract(m.data,'$.modelSelection.modelId') model FROM message m + WHERE m.session_id = ? AND json_extract(m.data,'$.modelSelection.modelId') IS NOT NULL + ORDER BY m.sequence DESC LIMIT 1` + ).get(sessionId); + return row?.model; + } + /** + * 最近一条「真实用户提交」(semantics.origin=real_user)消息携带的模型快照 + 提交时间。 + * 0.4.0 三源判定的「提交证据」:宿主保存用户消息时写入该次提交的 modelSelection(本机源码核对), + * 输入框切换在提交瞬间即体现在这里——不依赖会话选模条目(issue #7 场景它可能滞后)。 + * hook/系统注入的 user 消息(origin≠real_user)不算提交。 + */ + latestSubmissionSelection(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT m.time_created tc, + json_extract(m.data,'$.modelSelection.providerId') p, + json_extract(m.data,'$.modelSelection.modelId') mo, + json_extract(m.data,'$.modelSelection.options.reasoningLevel') lvl + FROM message m + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(m.data,'$.modelSelection.providerId') IS NOT NULL + AND json_extract(m.data,'$.modelSelection.modelId') IS NOT NULL + ORDER BY m.time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.p.trim(); + const modelId = row.mo.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const lvl = typeof row.lvl === "string" ? row.lvl.trim() : ""; + return { + selection: { providerId, modelId, ...lvl.length > 0 ? { reasoningLevel: lvl } : {} }, + at: row.tc + }; + } + /** 会话选模条目 + 生效时间(UPSERT 单行;用于与提交快照比较「后来是否有 /model 修改」)。 */ + latestModelSelectionTimed(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT data, MAX(COALESCE(time_updated, time_created), time_created) at FROM session_entry + WHERE session_id = ? AND type = 'runtime/model_selection' + ORDER BY time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const selection = this.latestModelSelection(sessionId); + if (selection === void 0) return void 0; + return { selection, at: row.at }; + } + /** + * 最近一次**主轮**实际模型调用(+ 开始时间)。query_source='main_turn' 过滤是 0.4.0 关键口径: + * compact/标题生成/goal 摘要/subagent/workflow 子轮的行属于辅助模型,绝不能当作 Lead 当前模型 + * (实测本机取值域 = compact, goal_summary_title, main_turn, session_title, subagent, + * target_completion_verification, workflow_child)。 + */ + latestMainTurnUsage(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT provider_id, model_id, variant, started_at FROM model_usage + WHERE session_id = ? AND query_source = 'main_turn' + ORDER BY started_at DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.provider_id.trim(); + const modelId = row.model_id.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const variant = typeof row.variant === "string" ? row.variant.trim() : ""; + return { + selection: { providerId, modelId, ...variant.length > 0 ? { reasoningLevel: variant } : {} }, + at: row.started_at + }; + } + /** + * 会话库中最近一次 setModel 的选择(Round A 实证:条目为 UPSERT 单行,canonical id + * `:runtime-model-selection`,时间排序安全)。data 取嵌套 modelSelection 优先; + * 兼容旧行把 providerId/modelId/thoughtLevel 平铺在顶层的形态。 + */ + latestModelSelection(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT data FROM session_entry + WHERE session_id = ? AND type = 'runtime/model_selection' + ORDER BY time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const data = parseOrNull(row.data); + if (data === null) return void 0; + const nested = parseModelSelection(data.modelSelection); + if (nested !== void 0) return nested; + const providerId = typeof data.providerId === "string" ? data.providerId.trim() : ""; + const modelId = typeof data.modelId === "string" ? data.modelId.trim() : ""; + if (providerId.length === 0 || modelId.length === 0) return void 0; + const thoughtLevel = typeof data.thoughtLevel === "string" ? data.thoughtLevel.trim() : ""; + return { + providerId, + modelId, + ...thoughtLevel.length > 0 ? { reasoningLevel: thoughtLevel } : {} + }; + } + /** 最近一次真实模型调用(session_entry 缺失时的继承兜底;variant = 思考强度)。 */ + latestModelUsage(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT provider_id, model_id, variant FROM model_usage + WHERE session_id = ? ORDER BY started_at DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.provider_id.trim(); + const modelId = row.model_id.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const variant = typeof row.variant === "string" ? row.variant.trim() : ""; + return { + providerId, + modelId, + ...variant.length > 0 ? { reasoningLevel: variant } : {} + }; + } + /** 完成回合导出(D3 fork 转录):真实用户消息 + 助手文本;tool 部分记工具名。 */ + exportTurns(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.data mdata, p.data pdata FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + const turns = []; + for (const r of rows) { + const message = parseOrNull(r.mdata); + const part = parseOrNull(r.pdata); + if (message === null || part === null) continue; + const isUser = message.role === "user"; + const isAssistant = message.role === "assistant"; + const realUser = isUser && message.semantics?.origin === "real_user"; + if (part.type === "text" && typeof part.text === "string") { + if (realUser) turns.push({ role: "user", text: part.text, toolNames: [] }); + else if (isAssistant) turns.push({ role: "assistant", text: part.text, toolNames: [] }); + } else if (isAssistant && part.type === "tool" && typeof part.tool === "string") { + const last = turns[turns.length - 1]; + if (last !== void 0 && last.role === "assistant" && !last.toolNames.length) { + last.toolNames.push(part.tool); + } else { + turns.push({ role: "assistant", text: "", toolNames: [part.tool] }); + } + } + } + return turns; + } + /** + * T5.7 成员会话查看视图导出(detail 合成数据源;只读、走 session_id 索引): + * 时间序全量 part 行(text/tool 两型;其余 part 型跳过),损坏行跳过。 + * 与 exportTurns 的区别:保留每条 part 的时间戳/role/工具状态(面板折叠行渲染), + * 不做回合聚合;hook 注入文本不落 transcript part(H14),framed 徽标由 + * panel/detail.ts 以 events 回填(不改写原文)。 + */ + exportDetailParts(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.data mdata, m.time_created mtc, p.data pdata, p.time_created ptc + FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + const out = []; + for (const r of rows) { + const message = parseOrNull(r.mdata); + const part = parseOrNull(r.pdata); + if (message === null || part === null) continue; + const role = message.role === "user" ? "user" : message.role === "assistant" ? "assistant" : void 0; + if (role === void 0) continue; + if (role === "user" && message.semantics?.origin !== "real_user") continue; + const ts2 = typeof r.ptc === "number" ? r.ptc : r.mtc; + if (part.type === "text" && typeof part.text === "string") { + out.push({ ts: ts2, role, kind: "text", text: part.text }); + } else if (part.type === "tool" && typeof part.tool === "string") { + const status = typeof part.state?.status === "string" ? part.state.status : "unknown"; + out.push({ + ts: ts2, + role: "assistant", + kind: "toolCall", + toolName: part.tool, + toolStatus: status, + ...part.state?.input !== void 0 ? { toolInput: part.state.input } : {}, + ...part.state?.output !== void 0 ? { toolOutput: part.state.output } : {} + }); + } + } + return out; + } +}; +function parseOrNull(raw) { + try { + return JSON.parse(raw); + } catch { + return null; + } +} +function extractText(partData) { + try { + const part = JSON.parse(partData); + return typeof part.text === "string" ? part.text : null; + } catch { + return null; + } +} + +// src/provider/framing.ts +function renderFramed(framedJson) { + const blocks = JSON.parse(framedJson); + if (!Array.isArray(blocks) || blocks.length === 0) { + throw new Error("framed message must be a non-empty JSON array of content blocks"); + } + const header = blocks[0]; + if (header.type !== "text" || typeof header.text !== "string") { + throw new Error("framed message first block must be the text header"); + } + const m = header.text.match(/^Team message from (.+):$/); + if (m === null) { + throw new Error(`framed message header mismatch: ${JSON.stringify(header.text)}`); + } + const lines = [header.text]; + for (const block of blocks.slice(1)) { + if (block.type === "text" && typeof block.text === "string") { + lines.push(block.text); + } else { + lines.push(JSON.stringify(block)); + } + } + return { messageId: "", senderName: m[1], text: lines.join("\n") }; +} +function renderFramedBatch(items) { + const rendered = items.map((item) => ({ ...renderFramed(item.framedJson), messageId: item.messageId })); + return { promptText: rendered.map((r) => r.text).join("\n\n"), rendered }; +} + +// src/provider/fork-context.ts +var FORK_HEADER = "[Agent Teams fork context] Your Team Lead's session transcript so far (for context inheritance):"; +var FORK_FOOTER = "[End of fork context]"; +function buildForkFirstPrompt(reader, leadSessionId, task, opts = {}) { + const maxChars = opts.maxChars ?? Number(process.env.TEAM_FORK_MAX_CHARS ?? 24e3); + const turns = reader.exportTurns(leadSessionId); + const kept = truncateTurns(turns, maxChars); + const lines = [FORK_HEADER]; + kept.turns.forEach((turn, i) => { + lines.push(`--- ${turn.role} #${i + 1} ---`); + if (turn.text.length > 0) lines.push(turn.text); + if (turn.toolNames.length > 0) lines.push(`[tools used: ${turn.toolNames.join(", ")}]`); + }); + lines.push(FORK_FOOTER); + lines.push(""); + lines.push(task); + return { + prompt: lines.join("\n"), + includedTurns: kept.turns.length, + truncated: kept.truncated + }; +} +function truncateTurns(turns, maxChars) { + if (turns.length === 0) return { turns: [], truncated: false }; + const rendered = (t) => t.text.length > 0 ? t.text : `[tools used: ${t.toolNames.join(", ")}]`; + const totalChars = turns.reduce((sum, t) => sum + rendered(t).length, 0); + if (totalChars <= maxChars) return { turns: [...turns], truncated: false }; + const first = turns[0]; + const budget = maxChars - rendered(first).length; + const tail = []; + let used = 0; + for (let i = turns.length - 1; i >= 1; i--) { + const cost = rendered(turns[i]).length; + if (used + cost > budget && tail.length > 0) break; + tail.unshift(turns[i]); + used += cost; + } + return { turns: [first, ...tail], truncated: true }; +} + +// src/provider/zcode-bin.ts +import fs13 from "node:fs"; +import path12 from "node:path"; +import { execFileSync } from "node:child_process"; +var DESKTOP_ZCODE_CJS = "/Applications/ZCode.app/Contents/Resources/glm/zcode.cjs"; +function resolveZcodeBin(env = process.env) { + const explicit = env.TEAM_ZCODE_BIN; + if (explicit && explicit.trim()) { + return binFor(explicit.trim(), "env"); + } + const rg = env.ZCODE_RG_BINARY; + if (rg && rg.trim()) { + const derived = path12.join(path12.dirname(path12.dirname(path12.dirname(rg))), "glm", "zcode.cjs"); + if (fs13.existsSync(derived)) return binFor(derived, "rg-derive"); + } + if (fs13.existsSync(DESKTOP_ZCODE_CJS)) return binFor(DESKTOP_ZCODE_CJS, "desktop-default"); + try { + const which = execFileSync("which", ["zcode"], { encoding: "utf8" }).trim(); + if (which.length > 0) return binFor(which, "which"); + } catch { + } + throw new Error( + "cannot locate the zcode CLI binary: set TEAM_ZCODE_BIN (daemon env) or install ZCode Desktop" + ); +} +function binFor(p, source) { + if (/\.(cjs|mjs|js)$/.test(p)) { + return { command: process.execPath, argvPrefix: [p], source }; + } + return { command: p, argvPrefix: [], source }; +} + +// src/provider/session-breeder.ts +import fs16 from "node:fs"; +import os6 from "node:os"; +import path15 from "node:path"; +import { DatabaseSync as DatabaseSync3 } from "node:sqlite"; + +// src/provider/app-server-client.mjs +import { execFile as execFile2 } from "node:child_process"; +import fs14 from "node:fs"; +import os4 from "node:os"; +import path13 from "node:path"; +import { fileURLToPath as fileURLToPath2 } from "node:url"; +var BRIDGE_DEFAULT = path13.join(path13.dirname(fileURLToPath2(import.meta.url)), "app-server-bridge.mjs"); +var AppServerClient = class _AppServerClient { + #child; + #specFile; + #buffer = ""; + #nextId = 1; + #pending = /* @__PURE__ */ new Map(); + #notifications = []; + #stderr = ""; + #closed = false; + #exited = false; + #log; + constructor(opts) { + this.#log = opts.log; + const specDir = fs14.mkdtempSync(path13.join(os4.tmpdir(), "at-appserver-")); + try { + fs14.chmodSync(specDir, 448); + } catch { + } + this.#specFile = path13.join(specDir, "spec.json"); + fs14.writeFileSync( + this.#specFile, + JSON.stringify({ + executable: opts.executable, + argv: [...opts.argvPrefix, "app-server"], + cwd: opts.cwd + }), + { mode: 384 } + ); + const bridge = process.env.TEAM_APP_SERVER_BRIDGE ?? BRIDGE_DEFAULT; + this.#child = execFile2( + process.execPath, + ["--", bridge, this.#specFile], + { cwd: opts.cwd, timeout: 0, maxBuffer: 8 * 1024 * 1024, env: opts.env ?? process.env }, + (err) => { + this.#exited = true; + const error2 = err ?? new Error("app-server exited"); + for (const [, pending] of this.#pending) { + clearTimeout(pending.timer); + pending.reject(error2); + } + this.#pending.clear(); + } + ); + this.#child.stdout?.on("data", (chunk) => this.#onStdout(String(chunk))); + this.#child.stderr?.on("data", (chunk) => { + this.#stderr += String(chunk); + if (this.#stderr.length > 32e3) this.#stderr = this.#stderr.slice(-32e3); + }); + this.#child.on("exit", () => { + this.#exited = true; + }); + } + /** 校验可执行文件为绝对路径后启动(相对路径/空串一律拒绝)。 */ + static spawn(opts) { + if (typeof opts.executable !== "string" || !path13.isAbsolute(opts.executable)) { + throw new Error("app-server executable must be an absolute path"); + } + return new _AppServerClient(opts); + } + #onStdout(text) { + this.#buffer += text; + let index; + while ((index = this.#buffer.indexOf("\n")) >= 0) { + const line = this.#buffer.slice(0, index).trim(); + this.#buffer = this.#buffer.slice(index + 1); + if (line.length === 0) continue; + let message; + try { + message = JSON.parse(line); + } catch { + continue; + } + if (typeof message.id === "number" && this.#pending.has(message.id)) { + const pending = this.#pending.get(message.id); + this.#pending.delete(message.id); + clearTimeout(pending.timer); + if (message.error !== void 0) { + const error2 = new Error(message.error.message ?? "app-server rpc error"); + error2.rpc = message.error; + pending.reject(error2); + } else { + pending.resolve(message.result); + } + continue; + } + if (typeof message.method === "string") { + this.#notifications.push({ method: message.method, params: message.params }); + if (message.id !== void 0 && message.id !== null) { + const result = message.method === "session/requestRuntimePreferences" ? { + nativeSearchEnhancementsEnabled: true, + memoryEnabled: false, + askUserQuestionAutoResolutionEnabled: true + } : null; + this.#write({ id: message.id, result }); + } + } + } + } + #write(message) { + if (this.#closed || this.#child.stdin === null || this.#child.stdin.destroyed) return; + this.#child.stdin.write(`${JSON.stringify(message)} +`); + } + /** 等待 startup/storageState ready(超时返回 false,不抛错)。 */ + async waitReady(timeoutMs = 2e4) { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + if (this.#notifications.some( + (n) => n.method === "startup/storageState" && n.params?.phase === "ready" + )) { + return true; + } + if (this.#exited) return false; + await new Promise((resolve) => setTimeout(resolve, 50)); + } + return false; + } + rpc(method, params, timeoutMs = 3e4) { + if (this.#closed) return Promise.reject(new Error("app-server client is closed")); + const id = this.#nextId++; + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + this.#pending.delete(id); + reject(new Error(`app-server rpc timeout: ${method}`)); + }, timeoutMs); + timer.unref?.(); + this.#pending.set(id, { resolve, reject, timer }); + this.#write({ id, method, params }); + }); + } + getStderr() { + return this.#stderr; + } + async close() { + if (this.#closed) return; + this.#closed = true; + for (const [, pending] of this.#pending) { + clearTimeout(pending.timer); + pending.reject(new Error("app-server client closed")); + } + this.#pending.clear(); + try { + this.#child.stdin?.end(); + } catch { + } + if (!this.#exited) { + try { + this.#child.kill("SIGTERM"); + } catch { + } + await new Promise((resolve) => { + const timer = setTimeout(() => { + try { + this.#child.kill("SIGKILL"); + } catch { + } + resolve(); + }, 1500); + timer.unref?.(); + this.#child.once("exit", () => { + clearTimeout(timer); + resolve(); + }); + }); + } + try { + fs14.rmSync(path13.dirname(this.#specFile), { recursive: true, force: true }); + } catch { + } + this.#log?.({ event: "app-server-closed", stderrTail: this.#stderr.slice(-800) }); + } +}; + +// src/sidebar/tasks-index.ts +import fs15 from "node:fs"; +import os5 from "node:os"; +import path14 from "node:path"; +import { DatabaseSync as DatabaseSync2 } from "node:sqlite"; +var ANCHOR_TITLE = "Agent Team anchor"; +function defaultTasksIndexPath() { + return process.env.TEAM_TASKS_INDEX ?? path14.join(os5.homedir(), ".zcode", "v2", "tasks-index.sqlite"); +} +function withRetry(fn, attempts = 3) { + let last; + for (let i = 0; i < attempts; i += 1) { + try { + return fn(); + } catch (err) { + last = err; + const message = err instanceof Error ? err.message : String(err); + if (!/SQLITE_BUSY|database is locked/i.test(message)) throw err; + const until = Date.now() + 100 * (i + 1); + while (Date.now() < until) { + } + } + } + throw last; +} +function tombstoneAnchor(input) { + const dbPath = input.dbPath ?? defaultTasksIndexPath(); + if (!fs15.existsSync(dbPath)) return { applied: false, reason: "tasks-index-missing" }; + const now2 = input.now ?? Date.now(); + return withRetry(() => { + const db = new DatabaseSync2(dbPath); + try { + db.exec("PRAGMA busy_timeout = 5000"); + db.exec("BEGIN IMMEDIATE"); + const existing = db.prepare("select task_id, title, workspace_path from tasks where task_id = ?").get(input.taskId); + if (existing !== void 0 && existing.workspace_path === input.workspacePath && existing.title !== "" && existing.title !== "Untitled session" && existing.title !== ANCHOR_TITLE) { + db.exec("ROLLBACK"); + return { applied: false, reason: "row-not-owned" }; + } + if (existing !== void 0 && existing.workspace_path !== input.workspacePath) { + db.exec("ROLLBACK"); + return { applied: false, reason: "row-not-owned" }; + } + const meta = JSON.stringify({ + taskId: input.taskId, + title: ANCHOR_TITLE, + workspacePath: input.workspacePath, + createdAt: now2, + updatedAt: now2, + mode: "default", + provider: "glm", + status: "completed", + titleOverridden: false + }); + db.prepare( + `INSERT INTO tasks ( + workspace_key, workspace_path, workspace_identity, task_id, title, task_status, + provider, mode, model, migration_source, forked_from_task_id, cron_automation_id, + off_peak_task_id, created_at, updated_at, unread_at, last_unread_at, pinned, + archived, deleted, title_overridden, searchable_text, meta_json + ) VALUES ( + @workspace_key, @workspace_path, NULL, @task_id, @title, 'completed', + 'glm', 'default', NULL, NULL, NULL, NULL, + NULL, @now, @now, NULL, 0, 0, + 0, 1, 0, @searchable, @meta + ) + ON CONFLICT(workspace_key, task_id) DO UPDATE SET + deleted = 1, + updated_at = excluded.updated_at + WHERE tasks.task_id = excluded.task_id + AND (tasks.title = '' OR tasks.title = 'Untitled session' OR tasks.title = @title)` + ).run({ + workspace_key: input.workspacePath, + workspace_path: input.workspacePath, + task_id: input.taskId, + title: ANCHOR_TITLE, + now: now2, + searchable: ANCHOR_TITLE, + meta + }); + db.exec("COMMIT"); + return { applied: true }; + } catch (err) { + try { + db.exec("ROLLBACK"); + } catch { + } + throw err; + } finally { + db.close(); + } + }); +} + +// src/provider/session-breeder.ts +function defaultSessionDbPath() { + return process.env.TEAM_DB_PATH ?? path15.join(os6.homedir(), ".zcode", "cli", "db", "db.sqlite"); +} +var BreedError = class extends Error { + constructor(code, message) { + super(message); + this.code = code; + this.name = "BreedError"; + } +}; +var AppServerSessionBreeder = class { + zcode; + tasksIndexPath; + dbPath; + log; + now; + readyTimeoutMs; + constructor(opts = {}) { + this.zcode = opts.zcode ?? resolveZcodeBin(); + this.tasksIndexPath = opts.tasksIndexPath ?? defaultTasksIndexPath(); + this.dbPath = opts.dbPath ?? defaultSessionDbPath(); + this.log = opts.log ?? (() => void 0); + this.now = opts.now ?? Date.now; + this.readyTimeoutMs = opts.readyTimeoutMs ?? 2e4; + } + /** + * 解析 Leader 会话的真实工作目录(只读)。 + * daemon 由宿主跨工作区复用,`TEAM_PROJECT_DIR` 可能来自首个启动工作区—— + * anchor 必须建在 Lead 自己的目录,否则 teammate 工具 cwd 会错。 + */ + resolveWorkspace(leadSessionId, fallback) { + if (!fs16.existsSync(this.dbPath)) return path15.resolve(fallback); + try { + const db = new DatabaseSync3(this.dbPath, { readOnly: true }); + try { + const row = db.prepare("select directory from session where id = ?").get(leadSessionId); + if (typeof row?.directory === "string" && row.directory.length > 0) { + return path15.resolve(row.directory); + } + } finally { + db.close(); + } + } catch { + } + return path15.resolve(fallback); + } + /** + * 培育失败清理:把已创建的 anchor 再写一次 tombstone(幂等),防止 child 未建成时 + * anchor 暴露到左侧任务栏。仅 anchor 行(D25 白名单),不触碰其他行。 + */ + disposeBredSessions(input) { + try { + const result = tombstoneAnchor({ + taskId: input.anchorSessionId, + workspacePath: input.workspacePath, + dbPath: this.tasksIndexPath, + now: this.now() + }); + this.log({ + event: "session-breed-dispose", + anchorSessionId: input.anchorSessionId, + applied: result.applied, + reason: result.reason ?? null + }); + return result; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.log({ event: "session-breed-dispose-failed", anchorSessionId: input.anchorSessionId, message }); + return { applied: false, reason: message }; + } + } + /** 造一个隐藏子会话;失败抛 BreedError(不回退成可见会话——DSH 口径:失败即 failed 成员)。 */ + async createChild(input) { + const startedAt = this.now(); + const workspacePath = this.resolveWorkspace(input.teamId, input.workspacePath); + const client = this.#spawnClient(workspacePath); + let anchorSessionId = null; + let childSessionId = null; + try { + const ready = await client.waitReady(input.timeoutMs ?? this.readyTimeoutMs); + if (!ready) { + throw new BreedError( + "startup-timeout", + `app-server did not become ready within ${input.timeoutMs ?? this.readyTimeoutMs}ms` + ); + } + const anchorAck = await client.rpc("v4/command", { + commandId: `team-anchor-${startedAt}-${Math.random().toString(36).slice(2, 8)}`, + clientId: "agent-team", + sessionId: null, + issuedAt: startedAt, + type: "createSession", + payload: { workspaceId: workspacePath, permissionScope: "session" } + }); + const createdAnchorId = anchorAck?.result?.sessionId; + if (typeof createdAnchorId !== "string" || createdAnchorId.length === 0) { + throw new BreedError("create-rejected", describeAck("createSession", anchorAck)); + } + anchorSessionId = createdAnchorId; + const tombstone = tombstoneAnchor({ + taskId: anchorSessionId, + workspacePath, + dbPath: this.tasksIndexPath, + now: this.now() + }); + if (!tombstone.applied && tombstone.reason === "row-not-owned") { + throw new BreedError( + "create-rejected", + `anchor "${anchorSessionId}" task row is not owned by agent-team; refusing to continue` + ); + } + const sideAck = await client.rpc("v4/command", { + commandId: `team-child-${this.now()}-${Math.random().toString(36).slice(2, 8)}`, + clientId: "agent-team", + sessionId: anchorSessionId, + issuedAt: this.now(), + type: "createSelectionSideSession", + payload: {} + }); + const createdChildId = sideAck?.result?.sessionId; + if (typeof createdChildId !== "string" || createdChildId.length === 0) { + throw new BreedError("command-rejected", describeAck("createSelectionSideSession", sideAck)); + } + childSessionId = createdChildId; + let appliedModel; + if (input.modelSelection !== void 0) { + try { + await this.#setModel(client, childSessionId, input.modelSelection); + appliedModel = input.modelSelection; + this.log({ + event: "model-set", + teamId: input.teamId, + childSessionId, + providerId: input.modelSelection.providerId, + modelId: input.modelSelection.modelId, + reasoningLevel: input.modelSelection.reasoningLevel ?? null + }); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.log({ + event: "model-set-failed", + teamId: input.teamId, + childSessionId, + providerId: input.modelSelection.providerId, + modelId: input.modelSelection.modelId, + message + }); + throw new BreedError( + "model-rejected", + `member could not use the inherited model ${input.modelSelection.providerId}/${input.modelSelection.modelId}: ${message}` + ); + } + } + if (anchorSessionId === null || childSessionId === null) { + throw new BreedError("unsupported", "session breeding produced no anchor/child id"); + } + const elapsedMs = this.now() - startedAt; + this.log({ + event: "session-bred", + teamId: input.teamId, + anchorSessionId, + childSessionId, + tombstone, + elapsedMs + }); + return { + anchorSessionId, + childSessionId, + elapsedMs, + workspacePath, + ...appliedModel !== void 0 ? { appliedModel } : {} + }; + } catch (err) { + const stderr = client.getStderr().slice(-800); + if (err instanceof BreedError) { + this.log({ + event: "session-breed-failed", + teamId: input.teamId, + code: err.code, + message: err.message, + stderr, + anchorSessionId, + childSessionId + }); + if (anchorSessionId !== null) { + this.disposeBredSessions({ anchorSessionId, workspacePath }); + } + throw err; + } + const message = err instanceof Error ? err.message : String(err); + const code = /timeout/i.test(message) ? "startup-timeout" : /exited|ENOENT|EACCES|spawn/i.test(message) ? "spawn-failed" : "unsupported"; + this.log({ + event: "session-breed-failed", + teamId: input.teamId, + code, + message, + stderr, + anchorSessionId, + childSessionId + }); + if (anchorSessionId !== null) { + this.disposeBredSessions({ anchorSessionId, workspacePath }); + } + throw new BreedError(code, `${message}${stderr.length > 0 ? ` | stderr: ${stderr}` : ""}`); + } finally { + await client.close(); + } + } + /** 每轮执行前同步(0.4.0):同 createChild 会话活跃前提下 setModel;失败返回原因(调用方阻止本轮)。 */ + async applyModelSelection(input) { + const readyTimeoutMs = input.timeoutMs ?? this.readyTimeoutMs; + let client; + try { + client = this.#spawnClient(input.workspacePath); + } catch (err) { + const reason = err instanceof Error ? err.message : String(err); + this.log({ event: "model-apply-failed", sessionId: input.sessionId, reason }); + return { applied: false, reason }; + } + try { + const ready = await client.waitReady(readyTimeoutMs); + if (!ready) { + const reason = `app-server did not become ready within ${readyTimeoutMs}ms`; + this.log({ event: "model-apply-failed", sessionId: input.sessionId, reason }); + return { applied: false, reason }; + } + await client.rpc("session/resume", { sessionId: input.sessionId }, 2e4); + await this.#setModel(client, input.sessionId, input.selection); + this.log({ + event: "model-applied", + sessionId: input.sessionId, + providerId: input.selection.providerId, + modelId: input.selection.modelId, + reasoningLevel: input.selection.reasoningLevel ?? null + }); + return { applied: true }; + } catch (err) { + const reason = err instanceof Error ? err.message : String(err); + this.log({ event: "model-apply-failed", sessionId: input.sessionId, reason }); + return { applied: false, reason }; + } finally { + await client.close(); + } + } + /** + * 应用一次模型选择(createChild 首轮 / launchTurn 每轮同步共用)。 + * result 是巨型消息快照(PoC 事实 1):只记目标三元组与错误文本,绝不整包落日志。 + */ + /** setModel 请求体(createChild / applyModelSelection 共用;persistAsWorkspaceLastUsed 恒 false)。 */ + async #setModel(client, sessionId, selection) { + await client.rpc( + "session/setModel", + { + sessionId, + model: { + providerId: selection.providerId, + modelId: selection.modelId, + ...selection.reasoningLevel !== void 0 ? { options: { reasoningLevel: selection.reasoningLevel } } : {} + }, + persistAsWorkspaceLastUsed: false + }, + 2e4 + ); + } + #spawnClient(workspacePath) { + try { + return AppServerClient.spawn({ + executable: this.zcode.command, + argvPrefix: this.zcode.argvPrefix, + cwd: workspacePath, + log: this.log + }); + } catch (err) { + throw new BreedError( + "spawn-failed", + `app-server spawn failed: ${err instanceof Error ? err.message : String(err)}` + ); + } + } +}; +function describeAck(type, ack) { + const status = ack?.reasonCode ?? ack?.status ?? "no session id"; + return `${type} rejected: ${status}${ack?.message !== void 0 ? ` (${ack.message})` : ""}`; +} +function isolationModeFromEnv(env = process.env) { + return env.TEAM_SESSION_ISOLATION === "legacy" ? "legacy" : "child"; +} + +// src/provider/model-catalog.ts +import fs17 from "node:fs"; +import os7 from "node:os"; +import path16 from "node:path"; +function defaultModelConfigPath(homedir = os7.homedir()) { + return path16.join(homedir, ".zcode", "v2", "config.json"); +} +function defaultProviderConfigPath(homedir = os7.homedir()) { + return path16.join(homedir, ".zcode", "v2", "provider_config.json"); +} +function readModelCatalogDetailed(homedir = os7.homedir()) { + const registry2 = readRegistryCatalog(homedir); + if ("catalog" in registry2) { + return { catalog: registry2.catalog, source: "provider-config" }; + } + const registryError = "error" in registry2 ? registry2.error : void 0; + const legacy = readLegacyCatalog(homedir); + return { + ...legacy, + source: "config-json", + ...legacy.error !== void 0 ? { error: registryError !== void 0 ? `${registryError}; ${legacy.error}` : legacy.error } : registryError !== void 0 ? { warning: registryError } : {} + }; +} +function readModelCatalog(homedir = os7.homedir()) { + return readModelCatalogDetailed(homedir).catalog; +} +function findCatalogProvider(catalog, providerId) { + return catalog.providers.find((p) => p.providerId === providerId); +} +function findCatalogModel(catalog, providerId, modelId) { + return findCatalogProvider(catalog, providerId)?.models.find((m) => m.id === modelId); +} +function catalogSupports(catalog, selection) { + const provider = findCatalogProvider(catalog, selection.providerId); + if (provider === void 0 || !provider.enabled) return false; + const model = provider.models.find((m) => m.id === selection.modelId); + return model !== void 0 && model.enabled !== false; +} +function defaultReasoningLevel(catalog, providerId, modelId) { + const model = findCatalogModel(catalog, providerId, modelId); + const variants = model?.reasoning?.variants; + const preferred = model?.reasoning?.defaultVariant; + if (preferred !== void 0 && (variants === void 0 || variants.includes(preferred))) return preferred; + if (variants === void 0) return DEFAULT_REASONING_LEVEL; + return variants.includes(DEFAULT_REASONING_LEVEL) ? DEFAULT_REASONING_LEVEL : variants[0] ?? DEFAULT_REASONING_LEVEL; +} +function applyReasoningDefault(catalog, selection) { + if (selection.reasoningLevel !== void 0) return selection; + return { + ...selection, + reasoningLevel: defaultReasoningLevel(catalog, selection.providerId, selection.modelId) + }; +} +function readRegistryCatalog(homedir) { + const file = defaultProviderConfigPath(homedir); + let doc; + try { + doc = JSON.parse(fs17.readFileSync(file, "utf8")); + } catch (err) { + if (err.code === "ENOENT") return { missing: true }; + return { error: `provider registry unavailable: ${err instanceof Error ? err.message : String(err)}` }; + } + const config3 = doc?.config; + if (config3 === null || typeof config3 !== "object" || Array.isArray(config3)) { + return { error: "provider registry unavailable: config is not an object" }; + } + const cfg = config3; + const order = cfg.providerOrder; + const rules = cfg.providerConfigRules?.providerRules; + if (!Array.isArray(order) || !Array.isArray(rules)) { + return { error: "provider registry unavailable: providerOrder/providerRules is not an array" }; + } + const ruleById = /* @__PURE__ */ new Map(); + for (const raw of rules) { + if (raw === null || typeof raw !== "object" || Array.isArray(raw)) continue; + const rule = raw; + const providerId = nonEmpty(rule.providerId); + if (providerId !== void 0) ruleById.set(providerId, rule); + } + const modelRules = registryModelRules(cfg); + const legacyReasoning = readLegacyReasoning(homedir); + const providers = []; + const seen = /* @__PURE__ */ new Set(); + for (const rawId of order) { + const providerId = nonEmpty(rawId); + if (providerId === void 0 || seen.has(providerId)) continue; + seen.add(providerId); + const rule = ruleById.get(providerId); + const ruleConfig = recordOf(rule?.config); + const models = []; + const modelSeen = /* @__PURE__ */ new Set(); + for (const rawModel of arrayOf(ruleConfig?.modelOrder)) { + const id = nonEmpty(rawModel); + if (id === void 0 || modelSeen.has(id)) continue; + modelSeen.add(id); + const ruleConfigForModel = modelRules.get(modelKey(providerId, id)); + const enabled = ruleConfigForModel?.enabled !== false; + const reasoning = legacyReasoning.get(modelKey(providerId, id)) ?? registryReasoning(ruleConfigForModel); + models.push({ + id, + enabled, + ...reasoning !== void 0 ? { reasoning } : {} + }); + } + providers.push({ + providerId, + name: nonEmpty(rule?.providerName) ?? providerId, + // api.type 是协议族(anthropic/openai-responses…)——只取该字符串,绝不带 baseUrl。 + kind: nonEmpty(recordOf(ruleConfig?.api)?.type) ?? "unknown", + enabled: true, + models + }); + } + return { catalog: { providers } }; +} +function registryModelRules(cfg) { + const rules = cfg.modelConfigRules?.providerModelRules; + const out = /* @__PURE__ */ new Map(); + for (const raw of arrayOf(rules)) { + if (raw === null || typeof raw !== "object" || Array.isArray(raw)) continue; + const rule = raw; + const providerId = nonEmpty(rule.providerId); + const modelId = nonEmpty(rule.modelId); + if (providerId === void 0 || modelId === void 0) continue; + out.set(modelKey(providerId, modelId), recordOf(rule.config) ?? {}); + } + return out; +} +function registryReasoning(rule) { + const specs = recordOf(rule?.optionSpecs); + const level = recordOf(specs?.reasoningLevel); + return catalogReasoning({ variants: level?.values }); +} +function readLegacyCatalog(homedir) { + const file = defaultModelConfigPath(homedir); + const doc = readJsonOrUndefined(file); + if ("error" in doc) { + return { catalog: { providers: [] }, error: `model catalog unavailable: ${doc.error}` }; + } + const rawProviders = doc.value?.provider; + if (rawProviders === null || typeof rawProviders !== "object" || Array.isArray(rawProviders)) { + return { catalog: { providers: [] }, error: "model catalog unavailable: config.provider is not an object" }; + } + const providers = []; + for (const [providerId, raw] of Object.entries(rawProviders)) { + if (providerId.length === 0 || raw === null || typeof raw !== "object" || Array.isArray(raw)) continue; + const record2 = raw; + const enabled = record2.enabled !== false; + const disabledReason = enabled ? void 0 : nonEmpty(record2.systemDisabledReason) ?? "disabled"; + providers.push({ + providerId, + name: nonEmpty(record2.name) ?? providerId, + kind: nonEmpty(record2.kind) ?? "unknown", + enabled, + ...disabledReason !== void 0 ? { disabledReason } : {}, + models: legacyModels(record2.models) + }); + } + return { catalog: { providers } }; +} +function legacyModels(raw) { + const models = []; + if (raw !== null && typeof raw === "object" && !Array.isArray(raw)) { + for (const [id, value] of Object.entries(raw)) { + const model = legacyModel(id, value); + if (model !== void 0) models.push(model); + } + return models; + } + if (Array.isArray(raw)) { + for (const value of raw) { + const id = nonEmpty(value?.id); + const model = legacyModel(id ?? "", value); + if (model !== void 0) models.push(model); + } + } + return models; +} +function legacyModel(id, raw) { + if (id.length === 0) return void 0; + const record2 = raw !== null && typeof raw === "object" && !Array.isArray(raw) ? raw : {}; + const reasoning = catalogReasoning(record2.reasoning); + return { id, enabled: true, ...reasoning !== void 0 ? { reasoning } : {} }; +} +function readLegacyReasoning(homedir) { + const out = /* @__PURE__ */ new Map(); + const doc = readJsonOrUndefined(defaultModelConfigPath(homedir)); + if ("error" in doc) return out; + const rawProviders = doc.value?.provider; + if (rawProviders === null || typeof rawProviders !== "object" || Array.isArray(rawProviders)) return out; + for (const [providerId, raw] of Object.entries(rawProviders)) { + const record2 = recordOf(raw); + const models = recordOf(record2?.models); + if (models === void 0) continue; + for (const [modelId, modelRaw] of Object.entries(models)) { + const reasoning = catalogReasoning(recordOf(modelRaw)?.reasoning); + if (reasoning !== void 0) out.set(modelKey(providerId, modelId), reasoning); + } + } + return out; +} +function catalogReasoning(raw) { + if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return void 0; + const record2 = raw; + if (record2.enabled === false) return void 0; + if (!Array.isArray(record2.variants)) return void 0; + const variants = [...new Set(record2.variants.map(nonEmpty).filter((v) => v !== void 0))]; + if (variants.length === 0) return void 0; + const defaultVariant = nonEmpty(record2.defaultVariant); + return { + variants, + ...defaultVariant !== void 0 && variants.includes(defaultVariant) ? { defaultVariant } : {} + }; +} +function modelKey(providerId, modelId) { + return `${providerId}\0${modelId}`; +} +function recordOf(value) { + return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0; +} +function arrayOf(value) { + return Array.isArray(value) ? value : []; +} +function readJsonOrUndefined(file) { + try { + return { value: JSON.parse(fs17.readFileSync(file, "utf8")) }; + } catch (err) { + return { error: err instanceof Error ? err.message : String(err) }; + } +} +function nonEmpty(value) { + if (typeof value !== "string") return void 0; + const trimmed = value.trim(); + return trimmed.length > 0 ? trimmed : void 0; +} + +// src/provider/resume-provider.ts +var LEAD_DELIVERY_VIA_HOOKS = true; +var DEFAULT_MODEL_RETRY_BACKOFF_MS = [5e3, 15e3, 3e4]; +var ResumePerTurnProvider = class { + constructor(opts) { + this.opts = opts; + this.teamDir = path17.join(opts.dataRoot, "teams", safeDir(opts.teamId)); + this.cwd = opts.cwd ?? process.env.TEAM_PROJECT_DIR ?? process.cwd(); + this.reader = new TranscriptReader({ ...opts.dbPath !== void 0 ? { dbPath: opts.dbPath } : {} }); + this.zcode = opts.zcode ?? resolveZcodeBin(); + this.drainPolicy = opts.drainPolicy ?? drainPolicyFromEnv(); + this.termGraceMs = opts.termGraceMs ?? 3e3; + this.firstTurnTimeoutMs = opts.firstTurnTimeoutMs ?? 12e4; + this.deliverConfirmMs = opts.deliverConfirmMs ?? 15e3; + this.watcherIntervalMs = opts.watcherIntervalMs ?? 500; + this.relaunchBackoffMs = opts.relaunchBackoffMs ?? 2e3; + this.sessionIsolation = opts.sessionIsolation ?? isolationModeFromEnv(); + this.leadWakeMinIdleMs = opts.leadWakeMinIdleMs ?? Number(process.env.TEAM_WAKE_LEAD_MIN_IDLE_MS ?? 3e4); + this.modelRetryBackoffMs = opts.modelRetryBackoffMs !== void 0 && opts.modelRetryBackoffMs.length > 0 ? opts.modelRetryBackoffMs : DEFAULT_MODEL_RETRY_BACKOFF_MS; + this.breeder = opts.breeder ?? new AppServerSessionBreeder({ + zcode: this.zcode, + ...opts.dbPath !== void 0 ? { dbPath: opts.dbPath } : {}, + log: (record2) => this.log(record2), + now: opts.now ?? Date.now + }); + this.now = opts.now ?? Date.now; + this.modelCatalog = opts.modelCatalog ?? (() => readModelCatalog()); + this.sleep = opts.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms))); + this.log = opts.log ?? (() => { + }); + } + LEAD_DELIVERY_VIA_HOOKS = LEAD_DELIVERY_VIA_HOOKS; + teamDir; + cwd; + reader; + zcode; + drainPolicy; + termGraceMs; + firstTurnTimeoutMs; + deliverConfirmMs; + watcherIntervalMs; + relaunchBackoffMs; + sessionIsolation; + leadWakeMinIdleMs; + modelRetryBackoffMs; + breeder; + modelCatalog; + now; + sleep; + log; + boundaryListeners = /* @__PURE__ */ new Set(); + watcherTimer = null; + adoptedPids = /* @__PURE__ */ new Set(); + watcherBusy = false; + leadReceiptsMtimeMs = null; + lastLaunchFailureAt = 0; + pendingLookup = null; + closed = false; + /** 失败记录变化监听(0.4.1:host 接线 → roster.notifyStatusChanged 刷新成员展示)。 */ + modelFailureListeners = /* @__PURE__ */ new Set(); + // ---------------------------------------------------------------- 边界与接线 + /** 协调者接线(host.serve):轮次边界监听 + pending 合并查询(mailbox 派生) + * + 模型失败记录变化通知(0.4.1:后台续跑失败 → 成员展示立即刷新)。 */ + bind(hooks) { + this.boundaryListeners.add(hooks.onBoundary); + this.pendingLookup = hooks.pendingLookup; + if (hooks.onModelFailureChanged !== void 0) { + this.modelFailureListeners.add(hooks.onModelFailureChanged); + } + } + notifyModelFailureChanged() { + for (const listener of this.modelFailureListeners) { + try { + listener(); + } catch (err) { + this.log({ ts: iso(this.now()), kind: "model-failure-listener-error", error: errText2(err) }); + } + } + } + /** + * spawn 前置校验(0.4.1):Lead 模型不可继承 → 抛错。roster 在**登记成员之前**调用, + * 可提前识别的配置错误不产生 provisioning 成员、不占成员名、不建隐藏子会话。 + * 供给阶段仍复检(resolveLeadInheritance 在 startContinuable 内照跑)——预检后配置可能变化。 + * legacy 隔离模式无继承语义 → 恒通过。 + */ + preflightMemberModel() { + if (this.sessionIsolation !== "child") return; + this.resolveLeadInheritance(); + } + /** 协调者启动纳管:孤儿轮次定案/再收养 + drain 标记处置 + lead 回执折叠(T4.4/触发点②)。 */ + adoptOrphans() { + const finalized = []; + const adopted = []; + for (const memberId of listMembers(this.teamDir)) { + const paths = memberPaths(this.teamDir, memberId); + this.handleDrainMarker(paths); + for (const turn of listTurns(paths.runDir)) { + if (turn.status !== "running" && turn.status !== "starting") continue; + if (this.finalizeIfDead(memberId, turn)) { + finalized.push(turn.turnId); + } else if (turn.pid !== null) { + this.adoptedPids.add(turn.pid); + adopted.push(turn.turnId); + } + } + } + this.foldLeadReceipts(true); + this.startWatcher(); + return { finalized, adopted }; + } + /** 协调者关闭:停 watcher(轮次进程不杀——独立进程组纪律)。 */ + detach() { + this.closed = true; + if (this.watcherTimer !== null) { + clearInterval(this.watcherTimer); + this.watcherTimer = null; + } + this.adoptedPids.clear(); + } + emitBoundary(event) { + for (const listener of this.boundaryListeners) { + try { + listener(event); + } catch (err) { + this.log({ ts: iso(this.now()), kind: "boundary-listener-error", memberId: event.memberId, error: errText2(err) }); + } + } + } + startWatcher() { + if (this.watcherTimer !== null || this.closed) return; + const timer = setInterval(() => { + void this.watchTick().catch((err) => { + this.log({ ts: iso(this.now()), kind: "watcher-error", error: errText2(err) }); + }); + }, this.watcherIntervalMs); + timer.unref?.(); + this.watcherTimer = timer; + } + async watchTick() { + if (this.watcherBusy || this.closed) return; + this.watcherBusy = true; + try { + for (const memberId of listMembers(this.teamDir)) { + const paths = memberPaths(this.teamDir, memberId); + const turnId = readCurrentTurnId(paths); + if (turnId === void 0) continue; + const turn = readTurn(paths.runDir, turnId); + if (turn === void 0) continue; + if (turn.status === "running" || turn.status === "starting") { + if (turn.interruptRequestedAt !== void 0) { + const dead = await killProcessGroup(turn.pgid, this.termGraceMs); + if (dead) { + const landed = turn.sessionId !== null && this.reader.hasUserText(turn.sessionId, turn.promptText); + writeTurn(paths.runDir, { + ...turn, + status: "interrupted", + exitedAt: iso(this.now()), + landed + }); + this.emitBoundary({ + memberId, + turnId: turn.turnId, + landedMessageIds: landed ? turn.messageIds : [], + carriedMessageIds: turn.messageIds + }); + } + continue; + } + this.finalizeIfDead(memberId, turn); + } + } + this.foldLeadReceipts(false); + } finally { + this.watcherBusy = false; + } + } + /** 轮次进程已死 → 定案(landed 实查)+ 边界事件;返回是否已定案。 */ + finalizeIfDead(memberId, turn) { + if (turn.pid !== null && pidAlive(turn.pid)) { + this.adoptedPids.add(turn.pid); + return false; + } + const landed = turn.sessionId !== null && this.reader.hasUserText(turn.sessionId, turn.promptText); + const next = { + ...turn, + status: "exited", + exitedAt: iso(this.now()), + landed + }; + const paths = memberPaths(this.teamDir, memberId); + writeTurn(paths.runDir, next); + this.adoptedPids.delete(turn.pid ?? -1); + this.log({ + ts: iso(this.now()), + kind: "turn-exit", + teamId: this.opts.teamId, + memberId, + turnId: turn.turnId, + landed, + messageIds: turn.messageIds + }); + if (!landed && turn.messageIds.length > 0) { + this.lastLaunchFailureAt = this.now(); + } + this.emitBoundary({ + memberId, + turnId: turn.turnId, + landedMessageIds: landed ? turn.messageIds : [], + carriedMessageIds: turn.messageIds + }); + return true; + } + /** lead 回执折叠:回执文件变化 → 边界事件(runtime → mailbox.observeDelivery → markDelivered)。 */ + foldLeadReceipts(force) { + const paths = memberPaths(this.teamDir, this.opts.teamId); + let mtimeMs = null; + try { + mtimeMs = fs18.statSync(paths.receiptsFile).mtimeMs; + } catch { + mtimeMs = null; + } + if (!force && mtimeMs === this.leadReceiptsMtimeMs) return; + this.leadReceiptsMtimeMs = mtimeMs; + if (mtimeMs === null) return; + const ids = [...receiptMessageIds(paths)]; + if (ids.length === 0) return; + this.emitBoundary({ memberId: this.opts.teamId, landedMessageIds: ids, carriedMessageIds: ids }); + } + // ---------------------------------------------------------------- TeammateProvider + async startContinuable(args) { + if (args.teamId !== this.opts.teamId) { + throw new Error(`provider serves team ${this.opts.teamId} but spawn targets ${args.teamId}`); + } + const paths = memberPaths(this.teamDir, args.memberId); + const prompt = args.context === "fork" ? buildForkFirstPrompt(this.reader, this.opts.teamId, args.firstPrompt).prompt : args.firstPrompt; + const inheritedSelection = this.sessionIsolation === "child" ? this.resolveLeadInheritance() : void 0; + let bred = null; + if (this.sessionIsolation === "child") { + try { + bred = await this.breeder.createChild({ + teamId: this.opts.teamId, + workspacePath: this.cwd, + ...inheritedSelection !== void 0 ? { modelSelection: inheritedSelection } : {} + }); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + if (inheritedSelection !== void 0 && /inherited model/.test(message)) { + this.recordModelFailure( + paths, + args.memberId, + new ModelInheritanceError(`\u6210\u5458\u6A21\u578B\u65E0\u6CD5\u7EE7\u627F\uFF1A${message}`, inheritedSelection), + [], + classifyApplyFailure(message) + ); + } + throw err; + } + } + const spawnCwd = bred?.workspacePath ?? this.cwd; + const origin = { + teamId: this.opts.teamId, + memberId: args.memberId, + name: args.name, + provider: args.context === "fork" ? "fork" : "spawn", + mode: "continuable", + context: args.context, + createdAt: iso(this.now()), + cwd: spawnCwd, + firstPromptText: prompt, + firstPromptSha256: sha256(prompt), + sessionId: bred?.childSessionId ?? null, + initialUserMessageAccepted: false, + // 只记实际生效者(createChild 失败即抛,走到这里 appliedModel 与继承选择一致或 legacy 无)。 + ...bred?.appliedModel !== void 0 ? { modelSelection: bred.appliedModel, modelSource: "inherited" } : {}, + sessionIsolation: bred !== null ? "child" : "legacy", + ...bred !== null ? { + anchorSessionId: bred.anchorSessionId, + logicalParentSessionId: this.opts.teamId, + sessionKind: "selection_side_chat" + } : { sessionKind: "interactive" } + }; + writeOrigin(paths, origin); + const spawnT0 = this.now(); + const turn = await this.launchTurn({ + paths, + memberId: args.memberId, + name: args.name, + kind: "first", + messageIds: [], + promptText: prompt, + sessionId: bred?.childSessionId ?? null, + resume: bred !== null, + cwd: spawnCwd, + // createChild 刚把继承选择应用进子会话(0.4.1 验收:首轮不重复应用同一选择)。 + modelJustApplied: bred?.appliedModel + }); + this.startWatcher(); + try { + const sessionId = await this.awaitFirstAccept({ + paths, + origin, + turn, + spawnT0, + signal: args.signal + }); + return { memberId: args.memberId, accepted: sessionId !== null }; + } catch (err) { + if (args.signal?.aborted) throw err; + this.log({ ts: iso(this.now()), kind: "first-probe-error", memberId: args.memberId, error: errText2(err) }); + return { memberId: args.memberId, accepted: false }; + } + } + /** 首轮持久接收探针:session id 认领(hook 领地优先,db 目录+首条用户文本兜底)+ 落库确认。 */ + async awaitFirstAccept(args) { + const { paths, origin, turn, spawnT0 } = args; + const deadline = spawnT0 + this.firstTurnTimeoutMs; + let sessionId = origin.sessionId; + for (; ; ) { + if (args.signal?.aborted) throw args.signal.reason ?? new Error("aborted"); + sessionId ??= this.claimedSessionId(origin.memberId); + if (sessionId === null) { + const exclude = this.claimedSessionsExcluding(origin.memberId); + const found = this.reader.findSessionByFirstPrompt({ + cwd: origin.cwd, + firstPrompt: origin.firstPromptText, + sinceMs: spawnT0, + ...exclude.size > 0 ? { excludeSessionIds: exclude } : {} + }); + if (found !== void 0) sessionId = found; + } + if (sessionId !== null) { + const landed = this.reader.hasUserText(sessionId, origin.firstPromptText); + if (landed) { + const nextOrigin = { + ...readOrigin(paths) ?? origin, + sessionId, + initialUserMessageAccepted: true + }; + writeOrigin(paths, nextOrigin); + const current = readTurn(paths.runDir, turn.turnId) ?? turn; + writeTurn(paths.runDir, { ...current, sessionId, landed: true }); + this.writeTeammateMapping(sessionId, nextOrigin); + this.log({ + ts: iso(this.now()), + kind: "first-accepted", + teamId: this.opts.teamId, + memberId: origin.memberId, + turnId: turn.turnId, + sessionId, + ms: this.now() - spawnT0 + }); + return sessionId; + } + } + const turnNow = readTurn(paths.runDir, turn.turnId); + const pid = turnNow?.pid ?? turn.pid; + if (pid === null || !pidAlive(pid)) { + this.log({ + ts: iso(this.now()), + kind: "first-not-accepted", + teamId: this.opts.teamId, + memberId: origin.memberId, + turnId: turn.turnId, + sessionId + }); + return null; + } + if (this.now() >= deadline) { + await killProcessGroup(turnNow?.pgid ?? turn.pgid, this.termGraceMs).catch(() => void 0); + this.log({ + ts: iso(this.now()), + kind: "first-probe-timeout", + teamId: this.opts.teamId, + memberId: origin.memberId, + turnId: turn.turnId + }); + return null; + } + await this.sleep(150); + } + } + async deliver(args) { + const debug = process.env.TEAM_DEBUG_DELIVERY === "1"; + const paths = memberPaths(this.teamDir, args.memberId); + const origin = readOrigin(paths); + if (origin === void 0) { + if (debug) this.log({ ts: iso(this.now()), kind: "deliver-deferred", memberId: args.memberId, reason: "no-origin" }); + return "queued"; + } + if (this.containsMessage(args.memberId, args.messageId)) return "accepted"; + const current = this.currentRunningTurn(paths); + if (current !== null) { + if (debug) this.log({ ts: iso(this.now()), kind: "deliver-deferred", memberId: args.memberId, reason: "running", turnId: current.turnId }); + return "queued"; + } + const sessionId = origin.sessionId ?? this.resolveSessionId(origin); + if (sessionId === null) { + if (debug) this.log({ ts: iso(this.now()), kind: "deliver-deferred", memberId: args.memberId, reason: "session-unsettled" }); + return "queued"; + } + if (this.now() - this.lastLaunchFailureAt < this.relaunchBackoffMs && this.lastLaunchFailureAt > 0) { + if (debug) this.log({ ts: iso(this.now()), kind: "deliver-deferred", memberId: args.memberId, reason: "launch-backoff" }); + return "queued"; + } + const batchRaw = this.pendingLookup !== null ? this.pendingLookup(args.memberId) : [{ messageId: args.messageId, framedJson: args.framedMessage }]; + const batch = batchRaw.filter((item) => !this.containsMessage(args.memberId, item.messageId)); + if (batch.length === 0) return "accepted"; + const { promptText } = renderFramedBatch(batch); + const turn = await this.launchTurn({ + paths, + memberId: args.memberId, + name: origin.name, + kind: "deliver", + messageIds: batch.map((item) => item.messageId), + promptText, + sessionId, + resume: true, + cwd: origin.cwd + }).catch((err) => { + if (err instanceof ModelSyncSuppressedError) { + if (debug) { + this.log({ ts: iso(this.now()), kind: "deliver-deferred", memberId: args.memberId, reason: "model-sync-suppressed" }); + } + return null; + } + throw err; + }); + if (turn === null) return "queued"; + this.startWatcher(); + const deadline = this.now() + this.deliverConfirmMs; + for (; ; ) { + if (this.reader.hasUserText(sessionId, promptText)) { + const current2 = readTurn(paths.runDir, turn.turnId) ?? turn; + writeTurn(paths.runDir, { ...current2, landed: true }); + this.log({ + ts: iso(this.now()), + kind: "deliver-landed", + teamId: this.opts.teamId, + memberId: args.memberId, + turnId: turn.turnId, + messageIds: current2.messageIds + }); + return "accepted"; + } + const turnNow = readTurn(paths.runDir, turn.turnId); + const pid = turnNow?.pid ?? turn.pid; + if (pid === null || !pidAlive(pid)) { + this.lastLaunchFailureAt = this.now(); + return "queued"; + } + if (this.now() >= deadline) { + return "queued"; + } + await this.sleep(150); + } + } + async interrupt(args) { + const paths = memberPaths(this.teamDir, args.memberId); + const current = this.currentRunningTurn(paths); + const previousStatus = current !== null ? "running" : "inactive"; + if (current === null) return { previousStatus }; + writeTurn(paths.runDir, { ...current, interruptRequestedAt: iso(this.now()) }); + let dead; + try { + dead = await killProcessGroup(current.pgid, this.termGraceMs); + } catch (err) { + writeTurn(paths.runDir, { ...current }); + throw err; + } + if (!dead) { + writeTurn(paths.runDir, { ...current }); + throw new Error(`interrupt failed: process group ${String(current.pgid)} is still alive`); + } + const finalTurn = readTurn(paths.runDir, current.turnId) ?? current; + const landed = finalTurn.sessionId !== null && this.reader.hasUserText(finalTurn.sessionId, finalTurn.promptText); + writeTurn(paths.runDir, { ...finalTurn, status: "interrupted", exitedAt: iso(this.now()), landed }); + this.log({ + ts: iso(this.now()), + kind: "interrupt", + teamId: this.opts.teamId, + memberId: args.memberId, + turnId: current.turnId, + previousStatus, + dead, + landed + }); + this.emitBoundary({ + memberId: args.memberId, + turnId: current.turnId, + landedMessageIds: landed ? current.messageIds : [], + carriedMessageIds: current.messageIds + }); + return { previousStatus }; + } + async drain(args) { + const memberIds = listMembers(this.teamDir); + if (this.drainPolicy === "keep") { + for (const memberId of memberIds) { + const paths = memberPaths(this.teamDir, memberId); + const current = readCurrentTurnId(paths); + if (current === void 0) continue; + writeJsonAtomic(paths.drainMarkerFile, { policy: "keep", requestedAt: iso(this.now()), turnId: current }); + } + this.log({ ts: iso(this.now()), kind: "drain-keep", teamId: this.opts.teamId, members: memberIds.length }); + return; + } + const grace = Math.max(200, Math.min(this.termGraceMs, Math.floor(args.timeoutMs * 0.6))); + const failures = []; + for (const memberId of memberIds) { + const paths = memberPaths(this.teamDir, memberId); + const turnId = readCurrentTurnId(paths); + if (turnId === void 0) continue; + const turn = readTurn(paths.runDir, turnId); + if (turn === void 0 || turn.status !== "running" && turn.status !== "starting") continue; + const dead = await killProcessGroup(turn.pgid, grace); + if (!dead) failures.push(`${memberId}/${turn.turnId}`); + else { + const landed = turn.sessionId !== null && this.reader.hasUserText(turn.sessionId, turn.promptText); + writeTurn(paths.runDir, { ...turn, status: "exited", exitedAt: iso(this.now()), landed }); + } + } + this.log({ ts: iso(this.now()), kind: "drain-kill", teamId: this.opts.teamId, failures: failures.length }); + if (failures.length > 0) { + throw new Error(`drain left ${failures.length} turn process(es) alive: ${failures.join(", ")}`); + } + } + // ---------------------------------------------------------------- ReconciliationSource / TargetInspector / 呈现 + readProvisioningRecord(memberId) { + const paths = memberPaths(this.teamDir, memberId); + const origin = readOrigin(paths); + if (origin === void 0) return void 0; + let sessionId = origin.sessionId; + if (sessionId === null) { + sessionId = this.resolveSessionId(origin); + if (sessionId !== null) { + writeOrigin(paths, { ...origin, sessionId }); + } + } + if (sessionId === null) { + return { + rootSessionId: origin.teamId, + descriptor: { provider: origin.provider, mode: origin.mode }, + initialUserMessageAccepted: false + }; + } + const session = this.reader.session(sessionId); + if (session === void 0) { + return { + rootSessionId: origin.teamId, + descriptor: { provider: origin.provider, mode: origin.mode }, + initialUserMessageAccepted: false + }; + } + const typeKnown = typeof session.task_type === "string" && session.task_type.length > 0; + const structureOk = !typeKnown ? true : origin.sessionIsolation === "child" ? session.task_type === "selection_side_chat" && (origin.anchorSessionId === void 0 || session.parent_id === origin.anchorSessionId) : session.task_type === "interactive"; + const directoryOk = typeof session.directory !== "string" || session.directory.length === 0 ? true : session.directory === origin.cwd; + const firstText = this.reader.firstRealUserText(sessionId); + const accepted = structureOk && directoryOk && firstText !== void 0 && firstText === origin.firstPromptText; + return { + rootSessionId: origin.teamId, + descriptor: { provider: origin.provider, mode: origin.mode }, + initialUserMessageAccepted: accepted + }; + } + isAlive(memberId) { + const paths = memberPaths(this.teamDir, memberId); + return this.currentRunningTurn(paths) !== null; + } + containsMessage(memberId, messageId) { + if (memberId === this.opts.teamId) { + return receiptMessageIds(memberPaths(this.teamDir, memberId)).has(messageId); + } + const paths = memberPaths(this.teamDir, memberId); + for (const turn of listTurns(paths.runDir)) { + if (!turn.messageIds.includes(messageId)) continue; + if (turn.landed === true) return true; + if (turn.sessionId !== null && this.reader.hasUserText(turn.sessionId, turn.promptText)) return true; + return false; + } + return false; + } + readColdRecord(memberId, messageId) { + const origin = readOrigin(memberPaths(this.teamDir, memberId)); + if (origin === void 0) return void 0; + return { recorded: this.containsMessage(memberId, messageId) }; + } + statusOf(memberId) { + return this.isAlive(memberId) ? "running" : "inactive"; + } + modelOf(memberId) { + const origin = readOrigin(memberPaths(this.teamDir, memberId)); + if (origin === void 0) return void 0; + const observed = origin.sessionId !== null ? this.reader.latestModel(origin.sessionId) : void 0; + return observed ?? origin.modelSelection?.modelId ?? origin.model; + } + /** Lead 行模型(roster Lead 伪行):Lead 会话最近消息实查 → model_usage 兜底。 */ + leadModelOf() { + return this.reader.latestModel(this.opts.teamId) ?? this.reader.latestModelUsage(this.opts.teamId)?.modelId; + } + /** Lead 当前结构化选择(成员卡/roster 展示用;0.4.0 = 三源判定的可继承选择,可能 undefined)。 */ + leadModelSelectionOf() { + return this.resolveLeadInheritance({ throwOnUnusable: false }); + } + // 0.4.0 注销 setMemberModel:成员模型不存在独立配置通道(唯一路线 = 每轮跟随 Lead)。 + // ---------------------------------------------------------------- hook 回执(Lead 投递 landed 依据) + /** hook 注入成功后落回执(hooks 进程与协调者双写者安全:O_APPEND+fsync)。 */ + recordLeadReceipts(messageIds, channel) { + const paths = memberPaths(this.teamDir, this.opts.teamId); + for (const messageId of messageIds) { + appendReceipt(paths, { messageId, channel, ts: iso(this.now()) }); + } + this.log({ ts: iso(this.now()), kind: "lead-receipt", teamId: this.opts.teamId, channel, messageIds: [...messageIds] }); + } + /** Stop 预算(≤3 次/run;runKey 复位语义见 hooks)。 */ + consumeStopBudget(memberId, runKey) { + const paths = memberPaths(this.teamDir, memberId); + const current = readStopBudget(paths); + const budget = current !== void 0 && current.runKey === runKey ? current : { runKey, blocks: 0 }; + if (budget.blocks >= 3) { + writeStopBudget(paths, budget); + return false; + } + writeStopBudget(paths, { runKey, blocks: budget.blocks + 1 }); + return true; + } + /** + * 空闲 Lead 唤醒(灰度):只在 TEAM_WAKE_LEAD=1、Lead 回合状态为 inactive 且空闲超阈值时 + * 拉起一个“处理收件箱”的 --resume 回合。返回 woke=false 时调用方必须保持 pending。 + */ + wakeLead() { + if (!leadWakeEnabled()) return Promise.resolve({ woke: false, reason: "disabled" }); + return maybeWakeLead({ + teamDir: this.teamDir, + leadSessionId: this.opts.teamId, + cwd: this.cwd, + zcode: this.zcode, + minIdleMs: this.leadWakeMinIdleMs, + now: this.now() + }); + } + close() { + this.detach(); + this.reader.close(); + } + // ---------------------------------------------------------------- 内部 + /** 孵化一轮(turn 记录先落盘 → spawn → 回填 pid/running)。 */ + async launchTurn(args) { + const turnId = nextTurnId(args.paths.runDir); + const stdoutFile = path17.join(args.paths.runDir, `${turnId}.out`); + const turnCwd = args.cwd ?? this.cwd; + await this.syncMemberModel( + args.paths, + args.memberId, + args.sessionId, + turnCwd, + args.messageIds, + args.modelJustApplied + ); + const scriptArgs = [ + ...this.zcode.argvPrefix, + "-p", + args.promptText, + "--json", + "--mode", + "yolo", + "--surface", + "terminal", + "--disallowed-tools", + "Task", + // D6 + "--cwd", + turnCwd, + ...args.resume && args.sessionId !== null ? ["--resume", args.sessionId] : [] + ]; + const turn = { + turnId, + memberId: args.memberId, + kind: args.kind, + sessionId: args.sessionId, + messageIds: args.messageIds, + promptText: args.promptText, + argv: scriptArgs, + pid: null, + pgid: null, + status: "starting", + startedAt: iso(this.now()), + stdoutFile + }; + writeTurn(args.paths.runDir, turn); + setCurrentTurn(args.paths, turnId); + const env = { + ...process.env, + TEAM_SPAWN_IDENTITY: JSON.stringify({ + teamId: this.opts.teamId, + memberId: args.memberId, + name: args.name + }) + }; + if (this.opts.dbPath !== void 0) env.TEAM_DB_PATH = this.opts.dbPath; + let spawned; + try { + spawned = await spawnDetached({ + command: this.zcode.command, + argv: scriptArgs, + // 真实 env 必须完整传给子进程(API key 等);spec 只短暂存在(helper 读后立即删除,0600)。 + env, + cwd: turnCwd, + stdoutFile + }); + } catch (err) { + writeTurn(args.paths.runDir, { ...turn, status: "spawn-error", exitedAt: iso(this.now()), exitCode: null }); + this.lastLaunchFailureAt = this.now(); + this.log({ ts: iso(this.now()), kind: "spawn-error", teamId: this.opts.teamId, memberId: args.memberId, turnId, error: errText2(err) }); + throw err; + } + const running = { ...turn, pid: spawned.pid, pgid: spawned.pgid, status: "running" }; + writeTurn(args.paths.runDir, running); + if (spawned.pid !== null) this.adoptedPids.add(spawned.pid); + this.log({ + ts: iso(this.now()), + kind: "turn-launch", + teamId: this.opts.teamId, + memberId: args.memberId, + turnId, + kindOfTurn: args.kind, + pid: spawned.pid, + messageIds: args.messageIds, + resume: args.resume, + // 只记 flag 名;prompt/session id/cwd 值不落 provider.jsonl(隐私/体积)。 + argv: [path17.basename(scriptArgs[0] ?? ""), ...scriptArgs.slice(1).map((a) => a.startsWith("--") ? a : "")] + }); + return running; + } + /** 当前「running 且进程存活」的轮次;无 → null。 */ + currentRunningTurn(paths) { + const turnId = readCurrentTurnId(paths); + if (turnId === void 0) return null; + const turn = readTurn(paths.runDir, turnId); + if (turn === void 0) return null; + if (turn.status !== "running" && turn.status !== "starting") return null; + if (turn.pid === null || !pidAlive(turn.pid)) return null; + return turn; + } + /** 会话 id 认领:session-map(teammate SessionStart hook 经 TEAM_SPAWN_IDENTITY 落的映射)。 */ + claimedSessionId(memberId) { + for (const entry of Object.values(readSessionRegistry(this.opts.dataRoot))) { + if (entry.memberId === memberId && typeof entry.session_id === "string") return entry.session_id; + } + return null; + } + claimedSessionsExcluding(memberId) { + const set = /* @__PURE__ */ new Set(); + for (const entry of Object.values(readSessionRegistry(this.opts.dataRoot))) { + if (entry.memberId !== void 0 && entry.memberId !== memberId && typeof entry.session_id === "string") { + set.add(entry.session_id); + } + } + return set; + } + resolveSessionId(origin) { + const claimed = this.claimedSessionId(origin.memberId); + if (claimed !== null) return claimed; + const createdAtMs = Date.parse(origin.createdAt); + return this.reader.findSessionByFirstPrompt({ + cwd: origin.cwd, + firstPrompt: origin.firstPromptText, + sinceMs: Number.isNaN(createdAtMs) ? 0 : createdAtMs, + excludeSessionIds: this.claimedSessionsExcluding(origin.memberId) + }) ?? null; + } + /** + * Lead 最新**已确认**模型选择(0.4.0 三源判定;成员跟随 Lead 的唯一解析入口)。 + * + * 三源各带时间戳,取最新者(epoch ms): + * 1. real_user 提交快照 —— 宿主在保存用户消息时写入该次提交的 modelSelection, + * 输入框切换在提交瞬间即体现在这里(issue #7 不影响本源:它不刷新 entry,但刷得动消息快照); + * 2. session_entry —— `/model` 命令等会话选模记录(time_updated 识别「提交后的修改」); + * 3. main_turn 实际调用 —— `query_source='main_turn'` 严格过滤,compact/标题/subagent/ + * workflow 等辅助行绝不能当作 Lead 模型(本机实测取值域已核验)。 + * + * 判出后按目录分类:官方套餐(`account:`/`builtin:` 前缀)或目录外(provider/model 不存在 + * 或被禁用)= 不可继承。`throwOnUnusable`(缺省 true): + * - true:spawn/每轮同步入口 —— 不可继承或三源全空 → 抛 ModelInheritanceError(明确报告, + * 绝不静默回退宿主缺省冒充继承成功); + * - false:展示口径(Lead 伪行模型)—— 返回 undefined 交回退链处理。 + * 空目录守卫:目录不可读 = 无法分类 → 不过滤(照旧尝试,宿主 setModel 终审)。 + */ + resolveLeadInheritance(options) { + const throwOnUnusable = options?.throwOnUnusable !== false; + const sources = [ + this.reader.latestSubmissionSelection(this.opts.teamId), + this.reader.latestModelSelectionTimed(this.opts.teamId), + this.reader.latestMainTurnUsage(this.opts.teamId) + ].filter((source) => source !== void 0); + let latest; + if (sources.length > 0) { + const winner = sources.reduce((a, b) => b.at > a.at ? b : a); + latest = winner.selection; + } + if (latest === void 0) { + if (!throwOnUnusable) return void 0; + throw new ModelInheritanceError( + "\u65E0\u6CD5\u786E\u5B9A Lead \u5F53\u524D\u6A21\u578B\uFF08\u4F1A\u8BDD\u5E93\u4E2D\u6CA1\u6709\u63D0\u4EA4\u5FEB\u7167\u3001\u9009\u6A21\u8BB0\u5F55\u6216\u4E3B\u8F6E\u8C03\u7528\uFF09\uFF0C\u6210\u5458\u65E0\u6CD5\u7EE7\u627F\u3002" + ); + } + const model = `${latest.providerId}/${latest.modelId}`; + const isOfficialPlan = latest.providerId.startsWith("account:") || latest.providerId.startsWith("builtin:"); + if (isOfficialPlan) { + if (!throwOnUnusable) return void 0; + throw new ModelInheritanceError( + `Lead \u5F53\u524D\u4F7F\u7528\u5B98\u65B9\u5957\u9910\u6A21\u578B\uFF08${model}\uFF09\uFF0C\u6210\u5458\u65E0\u6CD5\u7EE7\u627F\uFF08CLI \u8FDB\u7A0B\u62FF\u4E0D\u5230\u8BA2\u9605\u5957\u9910\u51ED\u636E\uFF09\u3002\u8BF7\u5728 ZCode \u4E2D\u5207\u6362\u5230\u81EA\u914D\u7684\u7B2C\u4E09\u65B9\u6A21\u578B\u540E\u91CD\u8BD5\u3002`, + latest + ); + } + const catalog = this.modelCatalog(); + if (catalog.providers.length > 0 && !catalogSupports(catalog, latest)) { + if (!throwOnUnusable) return void 0; + throw new ModelInheritanceError( + `Lead \u6A21\u578B ${model} \u4E0D\u5728\u53EF\u7528\u6A21\u578B\u76EE\u5F55\uFF08Provider \u5DF2\u5220\u9664/\u7981\u7528\uFF0C\u6216\u6A21\u578B\u4E0D\u5B58\u5728\uFF09\uFF0C\u6210\u5458\u65E0\u6CD5\u7EE7\u627F\u3002`, + latest + ); + } + return applyReasoningDefault(catalog, latest); + } + /** + * 每轮执行前同步(0.4.0;0.4.1 修正一致性判断与重试控制): + * Lead 最新已确认选择 ≠ 成员**宿主实际**选择 → setModel 后再启动本轮。 + * - 一致性判断以宿主会话实际选模条目为准;历史调用不能证明下次恢复的选择。 + * origin.modelSelection 只是辅助记录(setModel 成功后 origin 更新前崩溃 → 宿主为准, + * 不能因 origin 相同就放行)。实际状态无法确认(首轮前无任何记录)→ 重新应用 Lead + * 选择(宁多一次 setModel,不带着未确认的模型开跑)。 + * - 确认一致 → 清除旧失败记录(验证成功才清;不因 Lead 改了配置就清)+ 零 RPC。 + * - 应用失败 / Lead 不可继承:写统一失败记录(含类别/尝试次数/退避闸/Lead 指纹/消息 id) + * + 抛 ModelInheritanceError 阻止本轮 —— 绝不带着旧模型或宿主缺省悄悄开跑。 + * - legacy 隔离模式 / 会话未落定(首轮由 createChild 定模):跳过。 + * + * `trigger`:本轮携带的待投递消息 id(失败记录里做「新消息解锁重试」判定;首轮 = [])。 + */ + async syncMemberModel(paths, memberId, sessionId, workspacePath, triggerMessageIds = [], justApplied) { + if (this.sessionIsolation !== "child" || sessionId === null) return; + let lead; + try { + lead = this.resolveLeadInheritance(); + } catch (err) { + if (err instanceof ModelInheritanceError) { + const selection = err.selection; + const gate2 = this.retryGate(paths, selection, triggerMessageIds); + if (!gate2.allow) { + throw new ModelSyncSuppressedError(err.message, selection); + } + this.recordModelFailure(paths, memberId, err, triggerMessageIds); + } + throw err; + } + if (lead === void 0) return; + const observed = justApplied ?? this.reader.latestModelSelection(sessionId); + if (observed !== void 0 && sameModelSelection(observed, lead)) { + this.clearFailureIfVerified(paths); + const originNow = readOrigin(paths); + if (originNow !== void 0 && (originNow.modelSelection === void 0 || !sameModelSelection(originNow.modelSelection, lead))) { + writeOrigin(paths, { ...originNow, modelSelection: lead, modelSource: "inherited" }); + } + return; + } + const origin = readOrigin(paths); + const gate = this.retryGate(paths, lead, triggerMessageIds); + if (!gate.allow) { + throw new ModelSyncSuppressedError( + `\u6210\u5458 "${memberId}" \u4E0E Lead \u6A21\u578B\uFF08${lead.providerId}/${lead.modelId}\uFF09\u4E0D\u4E00\u81F4\uFF0C\u4E0A\u4E00\u6B21\u540C\u6B65\u5931\u8D25\u5C1A\u672A\u5230\u91CD\u8BD5\u65F6\u673A\uFF1A${gate.reason}`, + lead + ); + } + const result = await this.applySelectionNow(sessionId, workspacePath, lead, memberId); + if (!result.applied) { + const reason = result.reason ?? "model was rejected by the host"; + const err = new ModelInheritanceError( + `\u6210\u5458 "${memberId}" \u65E0\u6CD5\u540C\u6B65 Lead \u6A21\u578B\uFF08${lead.providerId}/${lead.modelId}\uFF09\uFF1A${reason}`, + lead + ); + this.recordModelFailure(paths, memberId, err, triggerMessageIds, classifyApplyFailure(reason), reason); + throw err; + } + if (origin !== void 0) { + writeOrigin(paths, { ...readOrigin(paths) ?? origin, modelSelection: lead, modelSource: "inherited" }); + } + this.clearFailureIfVerified(paths); + this.log({ + ts: iso(this.now()), + kind: "model-synced", + teamId: this.opts.teamId, + memberId, + providerId: lead.providerId, + modelId: lead.modelId, + reasoningLevel: lead.reasoningLevel ?? null + }); + } + /** + * 自动重试闸(0.4.1):读失败记录,判定本次同步尝试是否放行。 + * - 无记录 / Lead 选择已变(指纹不同)→ 放行(换模 = 重新尝试的显式信号)。 + * - 新消息解锁:trigger 里有记录 messageIds 之外的**新** id → 放行(用户再次明确发送)。 + * - deterministic(含 0.4.0 旧记录无 kind)→ 暂停相同选择的自动重试(拒绝)。 + * - transient → 未到 nextAttemptAt 拒绝;到期且 attempts ≤ 退避序列长度放行; + * 序列耗尽 → 停止自动尝试(拒绝)。 + * `lead` 缺省 = 解析失败(三源全空,无选择指纹)——按记录的 leadSignature 缺省口径同目标。 + */ + retryGate(paths, lead, triggerMessageIds) { + let record2; + try { + record2 = readModelFailed(paths); + } catch { + record2 = void 0; + } + if (record2 === void 0) return { allow: true, reason: "" }; + const signature = lead !== void 0 ? selectionSignature(lead) : void 0; + if (record2.leadSignature !== signature) { + return { allow: true, reason: "" }; + } + const known = new Set(record2.messageIds ?? []); + const hasNewMessage = triggerMessageIds.some((id) => !known.has(id)); + if (hasNewMessage) { + return { allow: true, reason: "" }; + } + const kind = record2.kind ?? "deterministic"; + if (kind === "deterministic") { + return { + allow: false, + reason: `\u76F8\u540C\u9009\u62E9\u7684\u540C\u6B65\u5DF2\u88AB\u786E\u5B9A\u6027\u62D2\u7EDD\uFF08${record2.reason}\uFF09\uFF0C\u7B49\u5F85 Lead \u5207\u6362\u53EF\u7528\u6A21\u578B\u6216\u65B0\u6D88\u606F\u540E\u91CD\u8BD5` + }; + } + const attempts = record2.attempts ?? 1; + const nextAt = record2.nextAttemptAt; + if (nextAt !== void 0 && this.now() < nextAt) { + return { + allow: false, + reason: `\u4E34\u65F6\u6545\u969C\u9000\u907F\u4E2D\uFF08\u7B2C ${attempts} \u6B21\u5C1D\u8BD5\u5DF2\u5931\u8D25\uFF09\uFF0C${Math.ceil((nextAt - this.now()) / 1e3)}s \u540E\u81EA\u52A8\u91CD\u8BD5` + }; + } + if (attempts > this.modelRetryBackoffMs.length) { + return { + allow: false, + reason: `\u4E34\u65F6\u6545\u969C\u5DF2\u8FDE\u7EED\u5931\u8D25 ${attempts - 1} \u6B21\uFF08\u9000\u907F\u5E8F\u5217\u8017\u5C3D\uFF09\uFF0C\u505C\u6B62\u81EA\u52A8\u91CD\u8BD5\uFF1B\u7B49\u5F85 Lead \u5207\u6362\u6A21\u578B\u6216\u65B0\u6D88\u606F` + }; + } + return { allow: true, reason: "" }; + } + /** + * 统一失败记录路径(0.4.1):解析失败(throwOnUnusable 抛出的 ModelInheritanceError)与 + * 宿主应用失败都落到这里——model-failed.json(成员行诊断)+ provider.jsonl + 展示刷新通知。 + * 记录携带重试控制所需全部字段(类别/次数/退避闸/Lead 指纹/触发消息 id);不重建 pending 队列。 + */ + recordModelFailure(paths, memberId, err, triggerMessageIds, kindOverride, reasonOverride) { + const now2 = this.now(); + let previous; + try { + previous = readModelFailed(paths); + } catch { + previous = void 0; + } + const selection = err.selection; + const signature = selection !== void 0 ? selectionSignature(selection) : void 0; + const sameTarget = previous !== void 0 && (previous.leadSignature ?? void 0) === signature; + const kind = kindOverride ?? classifySelectionFailure(err.message); + const attempts = sameTarget && kind === "transient" ? (previous?.attempts ?? 1) + 1 : 1; + const backoff = kind === "transient" ? this.modelRetryBackoffMs[attempts - 1] : void 0; + const messageIds = /* @__PURE__ */ new Set([ + ...sameTarget ? previous?.messageIds ?? [] : [], + ...triggerMessageIds, + ...this.pendingLookup !== null ? this.pendingLookup(memberId).map((item) => item.messageId) : [] + ]); + const record2 = { + ...selection !== void 0 ? { modelSelection: selection } : {}, + reason: compactReason(reasonOverride ?? err.message), + failedAt: iso(now2), + kind, + attempts, + ...backoff !== void 0 ? { nextAttemptAt: now2 + backoff } : {}, + ...signature !== void 0 ? { leadSignature: signature } : {}, + ...messageIds.size > 0 ? { messageIds: [...messageIds] } : {} + }; + writeModelFailed(paths, record2); + this.log({ + ts: iso(now2), + kind: "model-sync-failed", + teamId: this.opts.teamId, + memberId, + failureKind: kind, + attempts, + nextAttemptAt: record2.nextAttemptAt ?? null, + providerId: selection?.providerId ?? null, + modelId: selection?.modelId ?? null, + reason: record2.reason + }); + this.notifyModelFailureChanged(); + } + /** 验证成功才清除(修复4):失败记录存在 → 删除 + 展示刷新通知。调用点均已确认一致/应用成功。 */ + clearFailureIfVerified(paths) { + let existed = false; + try { + existed = readModelFailed(paths) !== void 0; + } catch { + existed = true; + } + clearModelFailed(paths); + if (existed) this.notifyModelFailureChanged(); + } + /** 应用一次模型选择(每轮同步通道:临时实例 resume → setModel;失败返回原因不抛)。 */ + async applySelectionNow(sessionId, workspacePath, selection, memberId) { + if (this.breeder.applyModelSelection === void 0) { + this.log({ ts: iso(this.now()), kind: "model-apply-unsupported", memberId }); + return { applied: false, reason: "breeder does not support model application" }; + } + try { + const result = await this.breeder.applyModelSelection({ sessionId, workspacePath, selection }); + if (!result.applied) { + this.log({ + ts: iso(this.now()), + kind: "model-apply-failed", + teamId: this.opts.teamId, + memberId, + reason: result.reason ?? "unknown" + }); + } + return result; + } catch (err) { + const reason = errText2(err); + this.log({ ts: iso(this.now()), kind: "model-apply-failed", teamId: this.opts.teamId, memberId, reason }); + return { applied: false, reason }; + } + } + /** + * 成员行诊断(GitHub #6 保留面):读 model-failed.json → 一条可读诊断。 + * 无记录/损坏 → [](损坏不阻断 list_agents;失败信息已尽力而为)。 + * 0.4.1:记录可无 modelSelection(三源全空解析不出);transient 附重试进度提示。 + */ + diagnosticsOf(memberId) { + const paths = memberPaths(this.teamDir, memberId); + let record2; + try { + record2 = readModelFailed(paths); + } catch { + return []; + } + if (record2 === void 0) return []; + const reason = typeof record2.reason === "string" ? record2.reason : ""; + const selection = parseModelSelection(record2.modelSelection); + const head = selection !== void 0 ? `\u6210\u5458\u6A21\u578B\u7EE7\u627F\u5931\u8D25\uFF1A${selection.providerId}/${selection.modelId}${reason.length > 0 ? `\uFF08${reason}\uFF09` : ""}` : `\u6210\u5458\u6A21\u578B\u7EE7\u627F\u5931\u8D25\uFF1A${reason}`; + if ((record2.kind ?? "deterministic") === "transient" && (record2.attempts ?? 1) > 1) { + return [`${head}\uFF08\u4E34\u65F6\u6545\u969C\uFF0C\u5DF2\u81EA\u52A8\u91CD\u8BD5 ${record2.attempts - 1} \u6B21\uFF09`]; + } + return [head]; + } + /** daemon 侧补写 teammate 映射(hook 未及写时的兜底;不覆盖已有 teammate 映射)。 */ + writeTeammateMapping(sessionId, origin) { + const registry2 = readSessionRegistry(this.opts.dataRoot); + const existing = registry2[sessionId.replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 128)]; + if (existing?.role === "teammate" && existing.memberId !== origin.memberId) return; + upsertSessionEntry(this.opts.dataRoot, sessionId, { + teamId: origin.teamId, + role: "teammate", + name: origin.name, + memberId: origin.memberId + }); + } + /** drain 标记处置(触发点②兜底):keep → 清标记(休眠态,轮次照旧纳管);kill → 补杀。 */ + handleDrainMarker(paths) { + const marker = readJson(paths.drainMarkerFile); + if (marker === void 0) return; + try { + fs18.unlinkSync(paths.drainMarkerFile); + } catch { + } + if (marker.policy === "kill" && marker.turnId !== void 0) { + const turn = readTurn(paths.runDir, marker.turnId); + if (turn !== void 0 && turn.pid !== null && pidAlive(turn.pid)) { + void killProcessGroup(turn.pgid, this.termGraceMs).then((dead) => { + writeTurn(paths.runDir, { ...turn, status: dead ? "exited" : turn.status, exitedAt: iso(this.now()) }); + }).catch(() => void 0); + } + } + } +}; +function listMembers(teamDir) { + const membersDir = path17.join(teamDir, "members"); + let names; + try { + names = fs18.readdirSync(membersDir); + } catch { + return []; + } + return names.filter((n) => !n.startsWith(".")); +} +function safeDir(teamId) { + return teamId.replace(/[^A-Za-z0-9._-]/g, (c) => "~" + c.codePointAt(0).toString(16)); +} +function sha256(text) { + return createHash2("sha256").update(text).digest("hex"); +} +function iso(ms) { + return new Date(ms).toISOString(); +} +function errText2(err) { + return err instanceof Error ? `${err.name}: ${err.message}` : String(err); +} +function compactReason(reason) { + const firstLine = reason.split(/\n/)[0] ?? ""; + const firstSentence = firstLine.split(/(?<=[。!?.!?])\s*/)[0] ?? firstLine; + return truncateReason(firstSentence.trim()); +} +function truncateReason(text) { + if (text.length === 0) return ""; + return text.length > 80 ? `${text.slice(0, 79)}\u2026` : text; +} +function sameModelSelection(a, b) { + return a.providerId === b.providerId && a.modelId === b.modelId && (a.reasoningLevel ?? "") === (b.reasoningLevel ?? ""); +} +function drainPolicyFromEnv() { + return process.env.TEAM_DRAIN_ON_DISPOSE === "kill" ? "kill" : "keep"; +} + +// src/panel/view-service.ts +import fs19 from "node:fs"; +import path18 from "node:path"; + +// src/ui-core/view.ts +var VIEW_STATE_VERSION = 4; +function emptyViewFrame(generatedAt, sessionId) { + return { + type: "view", + stateVersion: VIEW_STATE_VERSION, + team: null, + members: [], + tasks: [], + meta: { generatedAt, revision: 0, ...sessionId !== void 0 ? { sessionId } : {} } + }; +} + +// src/panel/view-service.ts +function snapshotFile(teamDir) { + return path18.join(teamDir, "ui", "view-snapshot.json"); +} +function resolveMemberSession(teamDir, dataRoot, memberId) { + const origin = readOrigin(memberPaths(teamDir, memberId))?.sessionId; + if (origin !== null && origin !== void 0) return origin; + for (const entry of Object.values(readSessionRegistry(dataRoot))) { + if (entry.memberId === memberId && typeof entry.session_id === "string") return entry.session_id; + } + return void 0; +} +function replayFingerprint(teamDir) { + const parts = []; + for (const f of [path18.join(teamDir, "events.jsonl"), path18.join(teamDir, "checkpoint.json")]) { + try { + const st = fs19.statSync(f); + parts.push(`${st.mtimeMs}:${st.size}`); + } catch { + parts.push("missing"); + } + } + return parts.join("|"); +} +function buildStaticFrame(loaded, teamId, generatedAt, sessionId, teamDir, dataRoot) { + const state = loaded.state; + const members = [ + { target: "lead", role: "lead", status: "inactive", diagnostics: [], id: teamId, sessionId: teamId } + ]; + for (const m of state.members) { + const memberSessionId = teamDir !== void 0 && dataRoot !== void 0 ? resolveMemberSession(teamDir, dataRoot, m.id) : void 0; + members.push({ + target: m.name, + role: "teammate", + status: m.phase === "failed" ? "failed" : m.phase === "provisioning" ? "provisioning" : "inactive", + description: m.description, + provider: m.provider, + context: m.context, + diagnostics: m.error !== void 0 ? [m.error] : [], + id: m.id, + ...memberSessionId !== void 0 ? { sessionId: memberSessionId } : {} + }); + } + return { + type: "view", + stateVersion: VIEW_STATE_VERSION, + team: { + teamId, + status: state.failure !== void 0 ? "failure" : "active", + ...state.failure !== void 0 ? { failure: state.failure } : {}, + seq: loaded.seq + }, + members, + tasks: loaded.view.tasks, + meta: { + generatedAt, + revision: loaded.seq, + ...sessionId !== void 0 ? { sessionId } : {} + } + }; +} +var REPLAY_CACHE_MAX = 16; +var PanelViewService = class { + constructor(deps) { + this.deps = deps; + } + replayCache = /* @__PURE__ */ new Map(); + /** + * 推帧判定键:仅覆盖面板**渲染面**(team.status/failure + members + tasks)。 + * 不含 seq/revision——mailbox-only 变化会推进 seq(team/message[/delivered] 事件), + * 但 members/tasks/failure 不变 → 键不变 → 不推帧(F02「mailbox-only 不发帧」口径)。 + */ + contentKey(frame) { + return JSON.stringify({ + // teamId 必须入键:切团队/会话后即便 members/tasks 形状巧合相同,也不得复用上一团队的键。 + teamId: frame.team?.teamId ?? null, + status: frame.team?.status ?? null, + failure: frame.team?.failure ?? null, + members: frame.members, + tasks: frame.tasks + }); + } + /** + * 构建指定会话的团队视图帧。 + * 身份不可解析(无 _meta 且无 hook 映射)→ team:null 空帧(面板呈现加载/不可用, + * 不向订阅者抛错);团队无事件(隐式 Lead 未建团)→ team:null 空帧(不开 host)。 + */ + async buildFrame(meta, sessionIdHint) { + const nowIso = ts(); + let identity; + try { + identity = resolveIdentity({ + dataRoot: this.deps.dataRoot, + meta, + bootTimeMs: this.deps.bootTimeMs + }); + } catch (err) { + this.deps.warn?.(`panel view: identity unresolved (${err instanceof Error ? err.message : String(err)})`); + return emptyViewFrame(nowIso, sessionIdHint); + } + return this.buildFrameForIdentity(identity, nowIso); + } + /** 身份已解析的构帧(team_panel_call refresh 与订阅轮询共用)。 */ + async buildFrameForIdentity(identity, nowIso = ts()) { + const teamId = identity.teamId; + const paths = teamPaths(this.deps.dataRoot, teamId); + if (!fs19.existsSync(paths.eventsFile)) { + const snap = this.readSnapshot(teamId); + if (snap === void 0) { + return { ...emptyViewFrame(nowIso, identity.sessionId), team: null }; + } + return { ...snap, meta: { ...snap.meta, generatedAt: nowIso, sessionId: identity.sessionId } }; + } + const loaded = await this.replay(paths.teamDir, teamId); + const state = loaded.state; + let rows = []; + try { + rows = await this.deps.backend.listAgents(identity); + } catch (err) { + this.deps.warn?.(`panel view: listAgents failed (${err instanceof Error ? err.message : String(err)})`); + } + if (rows.length === 0) { + return buildStaticFrame(loaded, teamId, nowIso, identity.sessionId, paths.teamDir, this.deps.dataRoot); + } + const members = rows.map((row) => { + const snap = row.role === "lead" ? void 0 : state.members.find((m) => m.name === row.target); + const id = row.role === "lead" ? teamId : snap?.id ?? row.target; + const sessionId = row.role === "lead" ? teamId : resolveMemberSession(paths.teamDir, this.deps.dataRoot, id); + return { ...row, id, ...sessionId !== void 0 ? { sessionId } : {} }; + }); + return { + type: "view", + stateVersion: VIEW_STATE_VERSION, + team: { + teamId, + status: state.failure !== void 0 ? "failure" : "active", + ...state.failure !== void 0 ? { failure: state.failure } : {}, + seq: loaded.seq + }, + members, + tasks: loaded.view.tasks, + meta: { + generatedAt: nowIso, + revision: loaded.seq, + sessionId: identity.sessionId + } + }; + } + /** 重放(带指纹缓存;LRU:命中移到队尾,超限淘汰最久未用)。 */ + async replay(teamDir, teamId) { + const fingerprint = replayFingerprint(teamDir); + const cached2 = this.replayCache.get(teamId); + if (cached2 !== void 0 && cached2.fingerprint === fingerprint) { + this.replayCache.delete(teamId); + this.replayCache.set(teamId, cached2); + return cached2.loaded; + } + const loaded = await load(teamDir, teamId); + this.replayCache.delete(teamId); + this.replayCache.set(teamId, { fingerprint, loaded }); + while (this.replayCache.size > REPLAY_CACHE_MAX) { + const oldest = this.replayCache.keys().next().value; + if (oldest === void 0) break; + this.replayCache.delete(oldest); + } + return loaded; + } + /** 帧落盘(teams//ui/view-snapshot.json;tmp+rename 原子替换;失败仅告警)。 */ + writeSnapshot(teamId, frame) { + const file = snapshotFile(teamPaths(this.deps.dataRoot, teamId).teamDir); + try { + fs19.mkdirSync(path18.dirname(file), { recursive: true, mode: 448 }); + const tmp = `${file}.${process.pid}.tmp`; + fs19.writeFileSync(tmp, JSON.stringify(frame), { mode: 384 }); + fs19.renameSync(tmp, file); + } catch (err) { + this.deps.warn?.(`panel view: snapshot write failed (${err instanceof Error ? err.message : String(err)})`); + } + } + /** 读快照(断线重连基线/daemon 冷启动首帧;无/损坏 → undefined)。 */ + readSnapshot(teamId) { + const file = snapshotFile(teamPaths(this.deps.dataRoot, teamId).teamDir); + try { + const parsed = JSON.parse(fs19.readFileSync(file, "utf8")); + return parsed.type === "view" && parsed.stateVersion === VIEW_STATE_VERSION ? parsed : void 0; + } catch { + return void 0; + } + } + /** 重放态直读(detail 合成/team-ctl 共用;无缓存需求场景)。 */ + async loadState(teamId) { + const { teamDir } = teamPaths(this.deps.dataRoot, teamId); + const loaded = await this.replay(teamDir, teamId); + return loaded.state; + } +}; + +// src/panel/detail.ts +var DETAIL_DEFAULT_LIMIT = 100; +var DETAIL_MAX_LIMIT = 200; +var DETAIL_PAGE_BYTES = 256 * 1024; +var TOOL_PAYLOAD_CHARS = 2e3; +var SessionNotSettledError = class extends TeamError { + sessionNotSettled = true; +}; +function resolveMemberSessionId(deps, target, readOriginSession) { + if (target === deps.teamId || target === "lead") { + return { memberId: deps.teamId, sessionId: deps.teamId, name: "lead" }; + } + const member = deps.state.members.find((m) => m.id === target || m.name === target); + if (member === void 0) { + throw new TeamError("TEAM_MEMBER_NOT_FOUND", `active teammate "${target}" not found`); + } + const sessionId = readOriginSession(member.id); + if (sessionId === null || sessionId === void 0) { + throw new SessionNotSettledError( + "TEAM_MEMBER_NOT_FOUND", + `active teammate "${member.name}" not found` + ); + } + return { memberId: member.id, sessionId, name: member.name }; +} +function synthesizeDetailStream(deps, sessionId, memberId) { + const rows = deps.reader.exportDetailParts(sessionId); + const framedQueue = framedFor(deps.state, memberId); + const items = []; + const used = /* @__PURE__ */ new Set(); + for (const row of rows) { + const item = toItem(row); + if (item.role === "user" && item.kind === "text" && item.text !== void 0) { + const idx = framedQueue.findIndex((f, i) => !used.has(i) && textCarriesFrame(item.text, f)); + if (idx >= 0) { + used.add(idx); + item.framed = { messageId: framedQueue[idx].messageId, from: framedQueue[idx].from }; + } + } + items.push(item); + } + return { items }; +} +function framedFor(state, memberId) { + const delivered = new Set(state.delivered); + return state.messages.filter((m) => m.targetId === memberId && delivered.has(m.id)).map((m) => ({ + messageId: m.id, + from: m.senderName, + body: m.content.map((b) => b.type === "text" ? b.text : JSON.stringify(b)).join("\n") + })); +} +function textCarriesFrame(text, framed) { + if (text.includes(`Team message from ${framed.from}:`)) return true; + const anchor = framed.body.slice(0, 64); + return anchor.length >= 8 && text.includes(anchor); +} +function toItem(row) { + const base = { ts: new Date(row.ts).toISOString(), role: row.role }; + if (row.kind === "text") { + return { ...base, kind: "text", text: row.text ?? "" }; + } + const tool = { name: row.toolName ?? "unknown", status: row.toolStatus ?? "unknown" }; + const parts = []; + if (row.toolInput !== void 0) parts.push(`input: ${stringify(row.toolInput)}`); + if (row.toolOutput !== void 0) parts.push(`output: ${stringify(row.toolOutput)}`); + if (parts.length === 0) return { ...base, kind: "toolCall", tool }; + const payload = parts.join("\n"); + return { + ...base, + kind: "toolCall", + tool, + text: payload.length > TOOL_PAYLOAD_CHARS ? payload.slice(0, TOOL_PAYLOAD_CHARS) + "\n\u2026(truncated)" : payload + }; +} +function stringify(v) { + if (typeof v === "string") return v; + try { + return JSON.stringify(v); + } catch { + return String(v); + } +} +function projectSummary(items) { + const out = []; + let round = { tools: [] }; + for (const item of items) { + if (item.role === "user" && item.kind === "text") { + flushRound(out, round); + round = { user: item, tools: [] }; + continue; + } + if (item.kind === "toolCall") { + round.tools.push(item); + continue; + } + if (item.role === "assistant" && item.kind === "text" && (item.text ?? "").trim().length > 0) { + round.conclusion = item; + } + } + flushRound(out, round); + return out; +} +function flushRound(out, round) { + if (round.user !== void 0) out.push(round.user); + if (round.tools.length > 0) out.push(toolGroupItem(round.tools)); + if (round.conclusion !== void 0) out.push(round.conclusion); +} +function toolGroupItem(tools) { + const entries = tools.map((item) => ({ + ts: item.ts, + name: item.tool?.name ?? "unknown", + status: item.tool?.status ?? "unknown", + ...item.text !== void 0 ? { text: item.text } : {} + })); + const last = entries[entries.length - 1]; + return { ts: last.ts, role: "assistant", kind: "toolGroup", count: entries.length, tools: entries }; +} +function pageDetail(items, opts) { + const limit = normalizeLimit(opts.limit); + const total = items.length; + const upper = opts.cursor !== void 0 ? Math.min(opts.cursor - 1, total) : total; + const start = Math.max(0, upper - limit); + let slice = items.slice(start, upper); + let truncated = false; + const bytesOf = (value) => new TextEncoder().encode(JSON.stringify(value)).length; + let bytes = bytesOf(slice); + while (slice.length > 1 && bytes > DETAIL_PAGE_BYTES) { + slice = slice.slice(1); + truncated = true; + bytes = bytesOf(slice); + } + const firstSeq = start + (items.slice(start, upper).length - slice.length) + 1; + const numbered = slice.map((item, i) => ({ seq: firstSeq + i, ...item })); + const page = { items: numbered }; + if (start > 0) page.nextCursor = firstSeq; + return { page, total, truncated }; +} +function normalizeLimit(limit) { + if (limit === void 0) return DETAIL_DEFAULT_LIMIT; + if (typeof limit !== "number" || !Number.isSafeInteger(limit) || limit < 1) { + throw new TeamError("TEAM_INVALID_ARGUMENT", "limit must be a positive safe integer"); + } + return Math.min(limit, DETAIL_MAX_LIMIT); +} +function buildDetail(deps, args, readOriginSession) { + const { memberId, sessionId } = resolveMemberSessionId(deps, args.target, readOriginSession); + const stream = synthesizeDetailStream(deps, sessionId, memberId); + const sourceTotal = stream.items.length; + const projected = projectSummary(stream.items); + const { page, total, truncated } = pageDetail(projected, { + ...args.cursor !== void 0 ? { cursor: args.cursor } : {}, + ...args.limit !== void 0 ? { limit: args.limit } : {} + }); + return { + sessionId, + memberId, + page, + ...truncated ? { truncated: true } : {}, + total, + sourceTotal + }; +} + +// src/panel/panel-call.ts +async function handlePanelCall(deps, args, meta) { + const action = typeof args.action === "string" ? args.action : void 0; + const label = typeof args.label === "string" ? args.label : null; + if (action === void 0 || action === "heartbeat") { + return { kind: "heartbeat", counter: deps.bumpCounter(), ts: now(deps), label }; + } + try { + if (action === "refresh") { + const frame = await deps.view.buildFrame(meta); + return { kind: "view", frame }; + } + if (action === "detail") { + if (typeof args.target !== "string" || args.target.length === 0) { + throw new TeamError("TEAM_INVALID_ARGUMENT", 'param "target" must be a non-empty string'); + } + return { kind: "detail", detail: await buildDetailCall(deps, args, meta) }; + } + throw new TeamError("TEAM_INVALID_ARGUMENT", `unknown panel action "${String(action)}"`); + } catch (err) { + if (err instanceof TeamError) { + const reason = err instanceof SessionNotSettledError ? "session-not-settled" : void 0; + return { kind: "error", code: err.code, message: err.message, ...reason !== void 0 ? { reason } : {} }; + } + const message = err instanceof Error ? err.message : String(err); + deps.warn?.(`panel call failed: ${message}`); + return { kind: "error", code: "", message }; + } +} +async function buildDetailCall(deps, args, meta) { + const identity = resolveIdentity({ + dataRoot: deps.dataRoot, + meta, + bootTimeMs: deps.bootTimeMs + }); + const paths = teamPaths(deps.dataRoot, identity.teamId); + const loaded = await load(paths.teamDir, identity.teamId); + requireMembership(() => { + if (loaded.state.failure !== void 0) throw new Error(loaded.state.failure); + return loaded.state; + }, identity.agentId); + const reader = deps.reader ?? new TranscriptReader(); + const cursor = typeof args.cursor === "number" ? args.cursor : void 0; + const limit = typeof args.limit === "number" ? args.limit : void 0; + return buildDetail( + { teamDir: paths.teamDir, teamId: identity.teamId, state: loaded.state, reader }, + { + target: args.target, + ...cursor !== void 0 ? { cursor } : {}, + ...limit !== void 0 ? { limit } : {} + }, + (memberId) => resolveMemberSession(paths.teamDir, deps.dataRoot, memberId) + ); +} +function now(deps) { + return deps.now !== void 0 ? deps.now() : (/* @__PURE__ */ new Date()).toISOString(); +} + +// src/panel/companion-server.ts +import crypto3 from "node:crypto"; +import fs20 from "node:fs"; +import http from "node:http"; +import path19 from "node:path"; +var COMPANION_REGISTRY_RELPATH = "logs/panel-http.json"; +var SSE_POLL_MS = 500; +function companionRegistryFile(dataRoot) { + const root = path19.resolve(dataRoot); + const file = path19.join(root, COMPANION_REGISTRY_RELPATH); + if (file !== path19.join(root, "logs", "panel-http.json")) { + throw new Error("companion registry path escapes dataRoot"); + } + return file; +} +async function startCompanionServer(deps) { + const token = crypto3.randomBytes(16).toString("hex"); + const registryFile = companionRegistryFile(deps.dataRoot); + const sseClients = /* @__PURE__ */ new Set(); + const backpressured = /* @__PURE__ */ new Set(); + let lastKey = ""; + let lastAnchor = null; + let pushInFlight = null; + let pushDirty = false; + let pollTimer = null; + let closed = false; + const server2 = http.createServer((req, res) => { + void route(req, res); + }); + async function route(req, res) { + const remote = req.socket.remoteAddress; + if (remote !== "127.0.0.1" && remote !== "::1" && remote !== "::ffff:127.0.0.1") { + res.writeHead(403, { "content-type": "text/plain; charset=utf-8" }); + res.end("forbidden"); + return; + } + const url2 = new URL(req.url ?? "/", "http://127.0.0.1"); + const reqToken = url2.searchParams.get("token") ?? headerToken(req); + if (reqToken === null || !timingSafeEqualStr(reqToken, token)) { + res.writeHead(403, { "content-type": "text/plain; charset=utf-8" }); + res.end("forbidden"); + return; + } + if ((url2.pathname === "/" || url2.pathname === "/panel") && (req.method === "GET" || req.method === "HEAD")) { + servePage(res); + return; + } + if (url2.pathname === "/events" && req.method === "GET") { + serveSse(req, res); + return; + } + if (url2.pathname === "/api/call" && req.method === "POST") { + await serveApiCall(req, res); + return; + } + if (url2.pathname === "/healthz" && req.method === "GET") { + res.writeHead(200, { "content-type": "application/json" }); + res.end(JSON.stringify({ ok: true })); + return; + } + res.writeHead(404, { "content-type": "text/plain; charset=utf-8" }); + res.end("not found"); + } + function headerToken(req) { + const h = req.headers["x-team-token"]; + return typeof h === "string" ? h : null; + } + function servePage(res) { + try { + const html = fs20.readFileSync(deps.pageFile, "utf8"); + res.writeHead(200, { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" }); + res.end(html); + } catch (err) { + res.writeHead(500, { "content-type": "text/plain; charset=utf-8" }); + res.end(`companion page unavailable: ${err instanceof Error ? err.message : String(err)}`); + } + } + function serveSse(req, res) { + res.writeHead(200, { + "content-type": "text/event-stream", + "cache-control": "no-store", + connection: "keep-alive" + }); + res.write(`event: hello +data: ${JSON.stringify({ ts: (/* @__PURE__ */ new Date()).toISOString() })} + +`); + sseClients.add(res); + res.on("drain", () => backpressured.delete(res)); + req.on("close", () => { + sseClients.delete(res); + backpressured.delete(res); + if (sseClients.size === 0 && pollTimer !== null) { + clearInterval(pollTimer); + pollTimer = null; + } + }); + ensurePolling(); + void pushFrame2(true); + } + function ensurePolling() { + if (pollTimer !== null || closed) return; + pollTimer = setInterval(() => void pushFrame2(false), SSE_POLL_MS); + pollTimer.unref?.(); + } + async function pushFrame2(force) { + if (closed) return; + if (pushInFlight !== null) { + pushDirty = true; + return pushInFlight; + } + pushInFlight = (async () => { + try { + do { + pushDirty = false; + await pushOnce(force); + force = false; + } while (pushDirty && !closed); + } catch (err) { + deps.warn?.(`companion sse push failed: ${err instanceof Error ? err.message : String(err)}`); + } finally { + pushInFlight = null; + } + })(); + return pushInFlight; + } + async function pushOnce(force) { + if (closed) return; + const sessionId = deps.anchoredSession(); + if (sessionId === null) { + lastAnchor = null; + return; + } + if (sseClients.size === 0) return; + const frame = await deps.view.buildFrame({ session_id: sessionId }); + if (deps.anchoredSession() !== sessionId) { + pushDirty = true; + return; + } + const key = deps.view.contentKey(frame); + const anchorChanged = lastAnchor !== sessionId; + if (!force && !anchorChanged && key === lastKey) return; + lastAnchor = sessionId; + lastKey = key; + const payload = `event: view +data: ${JSON.stringify(frame)} + +`; + for (const client of [...sseClients]) { + if (client.writableEnded || backpressured.has(client)) continue; + if (!client.write(payload)) backpressured.add(client); + } + } + async function serveApiCall(req, res) { + const chunks = []; + let total = 0; + for await (const chunk of req) { + total += chunk.length; + if (total > 8192) { + res.writeHead(413, { "content-type": "application/json" }); + res.end(JSON.stringify({ ok: false, error: { message: "request body too large" } })); + return; + } + chunks.push(chunk); + } + let args = {}; + try { + const parsed = JSON.parse(Buffer.concat(chunks).toString("utf8")); + if (typeof parsed === "object" && parsed !== null) args = parsed; + } catch { + res.writeHead(400, { "content-type": "application/json" }); + res.end(JSON.stringify({ ok: false, error: { message: "invalid json body" } })); + return; + } + const sessionId = deps.anchoredSession(); + const meta = sessionId !== null ? { session_id: sessionId } : void 0; + const result = await handlePanelCall( + { ...deps.panelCall, view: deps.view, dataRoot: deps.dataRoot }, + args, + meta + ); + res.writeHead(200, { "content-type": "application/json" }); + res.end(JSON.stringify(result)); + } + await new Promise((resolve, reject) => { + server2.once("error", reject); + server2.listen(0, "127.0.0.1", () => { + server2.off("error", reject); + resolve(); + }); + }); + const addr = server2.address(); + const url = `http://127.0.0.1:${addr.port}/panel?token=${token}`; + try { + fs20.mkdirSync(path19.dirname(registryFile), { recursive: true }); + const tmp = `${registryFile}.${process.pid}.tmp`; + fs20.writeFileSync( + tmp, + JSON.stringify({ port: addr.port, token, pid: process.pid, startedAt: (/* @__PURE__ */ new Date()).toISOString() }), + { mode: 384 } + ); + fs20.renameSync(tmp, registryFile); + } catch (err) { + deps.warn?.(`companion registry write failed: ${err instanceof Error ? err.message : String(err)}`); + } + return { + url: () => url, + port: () => addr.port, + close: async () => { + if (closed) return; + closed = true; + if (pollTimer !== null) clearInterval(pollTimer); + for (const client of sseClients) client.end(); + sseClients.clear(); + try { + const current = JSON.parse(fs20.readFileSync(registryFile, "utf8")); + if (current.pid === process.pid) fs20.unlinkSync(registryFile); + } catch { + } + await new Promise((resolve) => server2.close(() => resolve())); + } + }; +} +function timingSafeEqualStr(a, b) { + const ba = Buffer.from(a); + const bb = Buffer.from(b); + if (ba.length !== bb.length) return false; + return crypto3.timingSafeEqual(ba, bb); +} + +// src/daemon.ts +var __dirname = path20.dirname(fileURLToPath3(import.meta.url)); +var VIEW_URI = "team://view"; +var PANEL_URI = "ui://agent-team/team-panel.html"; +var NODE_MIN = 22; +var BOOT_TIME_MS = Date.now(); +var nodeMajor = Number(process.versions.node.split(".")[0]); +var nodeWarn = nodeMajor < NODE_MIN ? `agent-team daemon \u9700\u8981 Node >= ${NODE_MIN}\uFF08\u5F53\u524D ${process.versions.node}\uFF09\uFF0C\u9762\u677F\u4E0E\u5DE5\u5177\u53EF\u80FD\u4E0D\u53EF\u7528\u3002\u8BF7\u5B89\u88C5 Node 22+\u3002` : null; +var DATA = dataDir(); +ensurePrivateDir(DATA); +ensurePrivateDir(path20.join(DATA, "logs")); +ensurePrivateDir(path20.join(DATA, "meta")); +ensurePrivateDir(path20.join(DATA, "session-map")); +var staleSpecs = cleanupStaleSpecs(DATA); +var prunedMeta = pruneMetaFiles(DATA); +appendJsonl(path20.join(DATA, "logs", "daemon-lifecycle.jsonl"), { + event: "startup", + ts: ts(), + pid: process.pid, + node: process.versions.node, + execPath: process.execPath, + nodeWarn, + staleSpecsRemoved: staleSpecs, + metaFilesPruned: prunedMeta, + cwd: process.cwd(), + teamEnv: { + TEAM_PLUGIN_DATA: process.env.TEAM_PLUGIN_DATA, + TEAM_PROJECT_DIR: process.env.TEAM_PROJECT_DIR, + TEAM_PLUGIN_ROOT: process.env.TEAM_PLUGIN_ROOT, + ZCODE_SESSION_ID: process.env.ZCODE_SESSION_ID, + // 预期 undefined:env 不注入会话 id(已定案) + TEAM_MAX_MEMBERS: process.env.TEAM_MAX_MEMBERS + } +}); +if (nodeWarn) logErr("daemon", nodeWarn); +var config2 = loadConfig(); +if (!config2.ok) { + logErr("daemon", config2.error); + appendJsonl(path20.join(DATA, "logs", "daemon-lifecycle.jsonl"), { + event: "invalid-config", + ts: ts(), + error: config2.error + }); +} +var interruptEnabled = (process.env.TEAM_INTERRUPT ?? "true") !== "false"; +var leadModeRaw = process.env.TEAM_LEAD_MODE; +var leadMode = validateLeadMode(leadModeRaw); +if (leadModeRaw !== void 0 && leadModeRaw !== "orchestrator" && leadModeRaw !== "collaborator") { + logErr("daemon", `invalid TEAM_LEAD_MODE ${JSON.stringify(leadModeRaw)} \u2014 falling back to "${leadMode}"`); +} +if (config2.ok) { + writeRuntimeConfig({ interrupt: interruptEnabled, leadMode, limits: config2.values }); +} +var sessionIsolation = isolationModeFromEnv(); +var providerLog = (record2) => appendJsonl(path20.join(DATA, "logs", "provider.jsonl"), record2); +var backend = new TeamToolBackend({ + dataRoot: DATA, + limits: config2.ok ? config2.values : DEFAULT_HOST_LIMITS, + interrupt: interruptEnabled, + providerFactory: (teamId) => new ResumePerTurnProvider({ + dataRoot: DATA, + teamId, + cwd: process.env.TEAM_PROJECT_DIR, + sessionIsolation, + log: providerLog + }), + warn: (m) => logErr("backend", m) +}); +appendJsonl(path20.join(DATA, "logs", "provider.jsonl"), { + event: "session-isolation-mode", + mode: sessionIsolation, + ts: ts(), + pid: process.pid +}); +var signalTestMode = fs21.existsSync(path20.join(DATA, "signal-test")); +var signalLog = path20.join(DATA, "logs", "signals.jsonl"); +for (const sig of ["SIGINT", "SIGTERM", "SIGHUP"]) { + process.on(sig, () => { + appendJsonl(signalLog, { sig, ts: ts(), pid: process.pid, mode: signalTestMode ? "observe" : "graceful" }); + logErr("daemon", `signal ${sig} received`); + if (signalTestMode) return; + const deadline = setTimeout(() => { + appendJsonl(path20.join(DATA, "logs", "daemon-lifecycle.jsonl"), { + event: "dispose-timeout", + ts: ts(), + sig, + pid: process.pid + }); + process.exit(0); + }, 200); + backend.close().then(() => companion !== null ? companion.close() : void 0).then(() => { + appendJsonl(path20.join(DATA, "logs", "daemon-lifecycle.jsonl"), { + event: "dispose-ok", + ts: ts(), + sig, + pid: process.pid + }); + }).catch((err) => { + appendJsonl(path20.join(DATA, "logs", "daemon-lifecycle.jsonl"), { + event: "dispose-failed", + ts: ts(), + sig, + pid: process.pid, + error: err instanceof AggregateError ? `${err.message}: ${err.errors.map((e) => String(e)).join("; ")}` : String(err) + }); + }).finally(() => { + clearTimeout(deadline); + process.exit(0); + }); + }); +} +process.on("exit", (code) => { + appendJsonl(path20.join(DATA, "logs", "daemon-lifecycle.jsonl"), { event: "exit", ts: ts(), code, pid: process.pid }); +}); +var panelView = new PanelViewService({ + dataRoot: DATA, + bootTimeMs: BOOT_TIME_MS, + backend, + warn: (m) => logErr("panel-view", m) +}); +var view = { + counter: 0, + /** resources/subscribe 是连接级布尔订阅(同一客户端重复 subscribe 不叠加计数)。 */ + subscribed: false, + /** 会话锚点代际:切会话即 +1;跨代构帧结果丢弃,避免旧会话帧覆盖新会话。 */ + epoch: 0, + lastFrameTs: null, + /** 最近活跃会话 id(team://view 的团队解析键;callTool _meta 每调更新)。 */ + lastSessionId: null, + lastFrame: null, + lastContentKey: "" +}; +var frameTimer = null; +var pollInFlight = null; +var pollDirty = false; +function setViewSession(sessionId) { + if (view.lastSessionId === sessionId) return; + view.lastSessionId = sessionId; + view.epoch += 1; + view.lastContentKey = ""; + pollDirty = true; +} +async function pollOnce() { + const sessionId = view.lastSessionId; + const epoch = view.epoch; + if (sessionId === null) return; + const frame = await panelView.buildFrame({ session_id: sessionId }); + if (view.epoch !== epoch || view.lastSessionId !== sessionId) { + pollDirty = true; + return; + } + const key = panelView.contentKey(frame); + if (key === view.lastContentKey) return; + view.lastContentKey = key; + view.lastFrame = frame; + view.lastFrameTs = ts(); + if (frame.team !== null) panelView.writeSnapshot(frame.team.teamId, frame); + if (view.subscribed) pushFrame(VIEW_URI); +} +async function pollView() { + if (pollInFlight !== null) { + pollDirty = true; + return pollInFlight; + } + pollInFlight = (async () => { + try { + do { + pollDirty = false; + await pollOnce(); + } while (pollDirty); + } catch (err) { + logErr("panel-view", `poll failed: ${err instanceof Error ? err.message : String(err)}`); + } finally { + pollInFlight = null; + } + })(); + return pollInFlight; +} +var panelCallDeps = { + bootTimeMs: BOOT_TIME_MS, + reader: new TranscriptReader(), + bumpCounter: () => view.counter += 1, + now: ts, + warn: (m) => logErr("panel-call", m) +}; +var companion = null; +if ((process.env.TEAM_COMPANION ?? "") === "1") { + void startCompanionServer({ + dataRoot: DATA, + view: panelView, + panelCall: panelCallDeps, + pageFile: path20.join(__dirname, "ui", "team-companion.html"), + anchoredSession: () => view.lastSessionId, + warn: (m) => logErr("companion", m) + }).then( + (srv) => { + companion = srv; + appendJsonl(path20.join(DATA, "logs", "daemon-lifecycle.jsonl"), { + event: "companion-started", + ts: ts(), + pid: process.pid, + port: srv.port() + }); + logErr("companion", `companion panel listening: ${srv.url()}`); + }, + (err) => logErr("companion", `start failed: ${err instanceof Error ? err.message : String(err)}`) + ); +} +var server = new Server( + { + name: "team-daemon", + version: "0.1.0" + }, + { + capabilities: { + tools: {}, + resources: { subscribe: true, listChanged: false } + } + } +); +var TOOL_PING_DESC = "\u56E2\u961F\u5FC3\u8DF3\u63A2\u9488\uFF08\u8BCA\u65AD\u7528\uFF09\u3002\u8FD4\u56DE daemon \u5B58\u6D3B\u72B6\u6001\u3001\u5F53\u524D\u4F1A\u8BDD\u8EAB\u4EFD\uFF08\u6765\u81EA\u8C03\u7528\u4E0A\u4E0B\u6587\u7684 session_id\uFF09\u4E0E\u914D\u7F6E\u6458\u8981\u3002"; +var TOOLS = [ + { + name: "team_ping", + description: TOOL_PING_DESC, + inputSchema: { + type: "object", + properties: { + echo: { type: "string", description: "\u53EF\u9009\u56DE\u663E\u6587\u672C" } + } + } + }, + { + name: "team_panel_call", + description: "\u9762\u677F\u56DE\u73AF\u5DE5\u5177\uFF08app \u4E13\u7528\uFF09\uFF1A\u9762\u677F\u7ECF callServerTool \u8C03\u7528\u3002label-only = \u5FC3\u8DF3/\u8BA1\u6570\uFF08H12 \u4FDD\u6D3B\u8F7D\u4F53\uFF09\uFF1Baction=refresh = \u5168\u91CF\u89C6\u56FE\u5E27\uFF1Baction=detail + target = \u6210\u5458\u4F1A\u8BDD\u67E5\u770B\u89C6\u56FE\uFF08T5.7\uFF0Ccursor/limit \u5206\u9875\uFF09\u3002detail \u6309\u8F6E\u6458\u8981\uFF08\u4EC5\u7B80\u6D01\u4E00\u79CD\u5F62\u6001\uFF1A\u7528\u6237\u6307\u4EE4 + \u52A8\u4F5C\u7EC4 + \u6BCF\u8F6E\u7ED3\u8BBA\uFF09\u3002", + visibility: ["app"], + inputSchema: { + type: "object", + properties: { + label: { type: "string", description: "\u8C03\u7528\u6765\u6E90\u6807\u6CE8\uFF08\u5982 heartbeat / manual\uFF09" }, + action: { + type: "string", + enum: ["refresh", "detail"], + description: "refresh = \u5168\u91CF\u89C6\u56FE\u5E27\uFF1Bdetail = \u6210\u5458\u4F1A\u8BDD\u67E5\u770B\u89C6\u56FE\uFF08\u9700 target\uFF09" + }, + target: { type: "string", description: "detail \u76EE\u6807\u6210\u5458 id\uFF08\u6216\u6210\u5458\u540D\uFF1Blead \u4EA6\u53EF\uFF09" }, + cursor: { type: "number", description: "detail seq \u6E38\u6807\uFF08\u8FD4\u56DE seq < cursor \u7684\u6700\u8FD1\u4E00\u9875\uFF1B\u7F3A\u7701 = \u672B\u9875/\u6700\u8FD1\u4E0A\u4E0B\u6587\uFF09" }, + limit: { type: "number", description: "detail \u9875\u5927\u5C0F\uFF08\u9ED8\u8BA4 100\uFF0C\u4E0A\u9650 200\uFF09" } + } + } + } +]; +var RESOURCES = [ + { uri: PANEL_URI, name: "agent-team-panel", mimeType: "text/html", description: "\u667A\u80FD\u4F53\u56E2\u961F\u4F1A\u8BDD\u9762\u677F\uFF08\u56E2\u961F\u89C6\u56FE + \u6210\u5458\u4F1A\u8BDD\u4E0B\u94BB\uFF09" }, + { uri: VIEW_URI, name: "agent-team-view", mimeType: "application/json", description: "\u56E2\u961F\u89C6\u56FE\u5E27\uFF08\u8BA2\u9605\u63A8\u9001\u6E90\uFF09" } + // 0.4.0 注销 team://models 资源:成员模型没有配置通道(目录仅 provider 层分类内部使用)。 +]; +server.setRequestHandler(ListToolsRequestSchema, async () => { + appendJsonl(path20.join(DATA, "logs", "requests.jsonl"), { ts: ts(), method: "tools/list" }); + const debugTools = process.env.TEAM_DEBUG_TOOLS === "1"; + const supportTools = debugTools ? TOOLS : TOOLS.filter((t) => t.name !== "team_ping"); + return { tools: [...supportTools, ...listTeamTools({ interrupt: backend.interruptEnabled })] }; +}); +server.setRequestHandler(CallToolRequestSchema, async (req, extra) => { + const { name, arguments: args, _meta } = req.params; + const record2 = { + ts: ts(), + tool: sanitizeToolName(name), + params_meta: _meta ?? null, + // H1 证据:每次调用的 _meta 全量 + arguments: redactToolArguments(args ?? null), + sessionIdEnv: process.env.ZCODE_SESSION_ID ?? null + }; + appendJsonl(path20.join(DATA, "logs", "meta-log.jsonl"), record2); + const perCallFile = metaFilePath(DATA, name); + if (perCallFile !== null) { + try { + fs21.writeFileSync(perCallFile, JSON.stringify(record2, null, 2), { mode: 384 }); + } catch (err) { + logErr("daemon", "meta per-call write failed", err instanceof Error ? err.message : String(err)); + } + } + const callSid = _meta?.session_id; + if (typeof callSid === "string" && callSid.length > 0) setViewSession(callSid); + if (!config2.ok) { + return { + isError: true, + content: [{ type: "text", text: config2.error }] + }; + } + if (name === "team_ping") { + view.counter += 1; + const sid = _meta?.session_id; + const body = { + pong: true, + probe: null, + identity: { + session_id: sid ?? null, + // 预期 sess_ 前缀;与所在会话一致(F03 断言) + turn_id: _meta?.turn_id ?? null, + trace_id: _meta?.trace_id ?? null, + workspace_path: _meta?.workspace_path ?? null, + client_mode: _meta?.client_mode ?? null, + delivery_kind: _meta?.delivery_kind ?? null, + meta_keys: _meta ? Object.keys(_meta) : [] + }, + runtime: { node: process.versions.node, pid: process.pid, nodeWarn }, + config: config2.values, + echo: args?.echo ?? null + }; + return { content: [{ type: "text", text: JSON.stringify(body, null, 2) }] }; + } + if (name === "team_panel_call") { + const sid = _meta?.session_id; + if (typeof sid === "string" && sid.length > 0) view.lastSessionId = sid; + const result = await handlePanelCall( + { + view: panelView, + dataRoot: DATA, + ...panelCallDeps + }, + args ?? {}, + _meta + ); + view.lastFrameTs = ts(); + let body; + switch (result.kind) { + case "heartbeat": + body = { ok: true, counter: result.counter, ts: result.ts, label: result.label }; + break; + case "view": + view.lastFrame = result.frame; + view.lastContentKey = panelView.contentKey(result.frame); + if (result.frame.team !== null) { + panelView.writeSnapshot(result.frame.team.teamId, result.frame); + } + body = { ok: true, frame: result.frame }; + break; + case "detail": + body = { ok: true, detail: result.detail }; + break; + // 0.4.0 注销 modelOptions / modelSet 两 case(面板模型通道整体下线)。 + case "error": + body = { + ok: false, + error: { + ...result.code !== "" ? { code: result.code } : {}, + message: result.message, + ...result.reason !== void 0 ? { reason: result.reason } : {} + } + }; + break; + } + return { + // 错误也走正常应答(isError 不置位):面板经 body.error 呈现可读原因并可重试(F14①); + // 通道级失败(daemon 回收)由面板 callServerTool rejection 路径处理。 + content: [{ type: "text", text: JSON.stringify(body) }] + }; + } + if (isTeamTool(name)) { + const meta = _meta; + return callTeamTool( + { + backend, + dataRoot: DATA, + bootTimeMs: BOOT_TIME_MS, + name, + args: args ?? {}, + meta, + signal: extra.signal + }, + // progress 保活:仅 wait_agent + 宿主 progressToken 在场时发(registry 内判定); + // 经 extra.sendNotification(SDK 关联 requestId 的标准路径)。 + // F11 实录:每次发射落 logs/progress.jsonl(报文级证据)。 + { + sendNotification: (notification) => { + appendJsonl(path20.join(DATA, "logs", "progress.jsonl"), { ts: ts(), notification }); + return extra.sendNotification( + notification + ); + } + } + ); + } + throw new Error(`TEAM_UNKNOWN_TOOL: ${name}`); +}); +server.setRequestHandler(ListResourcesRequestSchema, async () => ({ resources: RESOURCES })); +server.setRequestHandler(ReadResourceRequestSchema, async (req) => { + const { uri } = req.params; + if (uri === PANEL_URI) { + const html = fs21.readFileSync(path20.join(__dirname, "ui", "team-panel.html"), "utf8"); + return { contents: [{ uri, mimeType: "text/html", text: html }] }; + } + if (uri === VIEW_URI) { + let frame = null; + if (view.lastSessionId !== null) { + try { + frame = await panelView.buildFrame({ session_id: view.lastSessionId }); + } catch (err) { + logErr("panel-view", `view read failed: ${err instanceof Error ? err.message : String(err)}`); + } + } + frame ??= view.lastFrame ?? (view.lastSessionId !== null ? panelView.readSnapshot(view.lastSessionId) ?? null : null); + frame ??= emptyViewFrame(ts(), view.lastSessionId ?? void 0); + view.lastFrame = frame; + return { + contents: [ + { uri, mimeType: "application/json", text: JSON.stringify(frame) } + ] + }; + } + throw new Error(`TEAM_UNKNOWN_RESOURCE: ${uri}`); +}); +function pushFrame(uri) { + view.lastFrameTs = ts(); + server.notification({ method: "notifications/resources/updated", params: { uri } }).catch((e) => logErr("daemon", "pushFrame failed", String(e))); +} +server.setRequestHandler(SubscribeRequestSchema, async (req) => { + const { uri } = req.params; + appendJsonl(path20.join(DATA, "logs", "requests.jsonl"), { ts: ts(), method: "resources/subscribe", uri }); + if (uri === VIEW_URI) { + view.subscribed = true; + if (!frameTimer) { + frameTimer = setInterval(() => void pollView(), 500); + frameTimer.unref?.(); + } + await pollView(); + } + return {}; +}); +server.setRequestHandler(UnsubscribeRequestSchema, async (req) => { + const { uri } = req.params; + appendJsonl(path20.join(DATA, "logs", "requests.jsonl"), { ts: ts(), method: "resources/unsubscribe", uri }); + if (uri === VIEW_URI) { + view.subscribed = false; + if (frameTimer) { + clearInterval(frameTimer); + frameTimer = null; + } + } + return {}; +}); +var transport = new StdioServerTransport(); +transport.onclose = () => { + view.subscribed = false; + if (frameTimer) { + clearInterval(frameTimer); + frameTimer = null; + } +}; +await server.connect(transport); +logErr("daemon", `agent-team daemon ready (pid=${process.pid}, node=${process.versions.node}, data=${DATA}, config=${config2.ok ? "ok" : "INVALID"})`); diff --git a/external_plugins/agent-team/runtime/team-hooks.mjs b/external_plugins/agent-team/runtime/team-hooks.mjs new file mode 100644 index 00000000..d1dfb453 --- /dev/null +++ b/external_plugins/agent-team/runtime/team-hooks.mjs @@ -0,0 +1,5447 @@ +var __defProp = Object.defineProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; + +// src/hooks.ts +import fs9 from "node:fs"; +import path10 from "node:path"; + +// src/shared.ts +import fs from "node:fs"; +import path from "node:path"; +import os from "node:os"; + +// src/domain/errors.ts +var TeamError = class extends Error { + code; + constructor(code, message, options) { + super(message, options); + this.name = "TeamError"; + this.code = code; + } + toJSON() { + return serializeTeamError(this); + } +}; +function serializeTeamError(err) { + const out2 = { name: "TeamError", code: err.code, message: err.message }; + const seen = new WeakSet([err]); + const cause = err.cause; + if (cause !== void 0 && cause !== null) out2.cause = serializeCause(cause, seen); + return out2; +} +function serializeCause(cause, seen) { + if (!(cause instanceof Error)) return { message: String(cause) }; + if (seen.has(cause)) return { name: cause.name, message: "[circular cause]" }; + seen.add(cause); + if (cause instanceof TeamError) { + const serialized = { + name: "TeamError", + code: cause.code, + message: cause.message + }; + const inner2 = cause.cause; + if (inner2 !== void 0 && inner2 !== null) serialized.cause = serializeCause(inner2, seen); + return serialized; + } + const plain = { name: cause.name, message: cause.message }; + const inner = cause.cause; + if (inner !== void 0 && inner !== null) plain.cause = serializeCause(inner, seen); + return plain; +} + +// src/domain/config.ts +function validateLeadMode(raw2) { + return raw2 === "collaborator" ? "collaborator" : "orchestrator"; +} + +// src/shared.ts +function dataDir() { + const candidates = [ + process.env.TEAM_PLUGIN_DATA, + process.env.ZCODE_PLUGIN_DATA, + process.env.CLAUDE_PLUGIN_DATA + ]; + for (const c of candidates) if (c && c.trim()) return c; + return path.join(os.homedir(), ".zcode", "agent-team-dev-data"); +} +function ensureDir(p) { + fs.mkdirSync(p, { recursive: true }); + return p; +} +function runtimeConfigPath() { + return path.join(dataDir(), "meta", "runtime-config.json"); +} +function readRuntimeConfig() { + try { + const raw2 = fs.readFileSync(runtimeConfigPath(), "utf8"); + const parsed = JSON.parse(raw2); + if (parsed.version !== 1 || typeof parsed.interrupt !== "boolean") return void 0; + return { ...parsed, leadMode: parsed.leadMode === "collaborator" ? "collaborator" : "orchestrator" }; + } catch { + return void 0; + } +} +function readHostLeadModeOverride(homedir = os.homedir()) { + const file = path.join(homedir, ".zcode", "cli", "config.json"); + let doc; + try { + doc = JSON.parse(fs.readFileSync(file, "utf8")); + } catch { + return void 0; + } + const options = doc?.plugins?.options; + if (options === null || typeof options !== "object") return void 0; + const strings = []; + for (const [key, value] of Object.entries(options)) { + if (!key.startsWith("agent-team")) continue; + if (value !== null && typeof value === "object") { + const mode = value.leadMode; + if (typeof mode === "string" && mode.length > 0) strings.push(mode); + } + } + if (strings.length === 0) return void 0; + const first = strings[0]; + if (strings.every((v) => v === first) && (first === "orchestrator" || first === "collaborator")) { + return validateLeadMode(first); + } + return void 0; +} +function appendJsonl(file, obj) { + fs.appendFileSync(file, JSON.stringify(obj) + "\n", { mode: 384 }); + chmodPrivateOnce(file); +} +function ts() { + return (/* @__PURE__ */ new Date()).toISOString(); +} +var SENSITIVE_ENV_KEY = /(?:^|_)(?:KEY|KEYS|APIKEY|TOKEN|TOKENS|SECRET|SECRETS|PASSWORD|PASSWORDS|PASSWD|PASSPHRASE|AUTH|AUTHORIZATION|COOKIE|CREDENTIAL|CREDENTIALS|PRIVATE|URL|URI|DSN|CONNECTION)(?:$|_)/i; +function isSensitiveEnvKey(key) { + return SENSITIVE_ENV_KEY.test(key); +} +var chmodded = /* @__PURE__ */ new Set(); +function chmodPrivateOnce(file) { + if (chmodded.has(file)) return; + chmodded.add(file); + try { + fs.chmodSync(file, 384); + } catch { + } +} + +// src/mcp/policy.ts +function teamPolicy(interrupt) { + return `Agent Teams is available in this session + +The Team Lead and all teammates share the same working directory and filesystem. Edits are immediately visible to every member. Split write work into disjoint scopes, record expected write scopes on shared tasks, and use task dependencies when work must be ordered. Write-scope overlap is advisory, not a lock. + +Prefer read/edit/write for file changes. If a file operation reports that the file changed since you last read it, read the current file again, rebase your intended change onto the new content, and retry. Bash, formatters, code generators, and scripts are not fully protected by the filesystem version guard; coordinate them explicitly and have the Lead review the final diff and run tests. + +Use the target returned by spawn_teammate or list_agents for send_message${interrupt ? " and interrupt_agent" : ""}, or as owner when assigning or filtering shared tasks. send_message steers a running target at its nearest step boundary and starts or resumes an inactive target. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Shared-task workflow is list, get, claim with the current revision, perform the work, then complete. Task readiness never starts an owner. Before wait_agent, use list_agents and make sure another required member is running or provisioning; use send_message first when the required member is inactive. wait_agent observes only changes after that call starts, never wakes a member, and returns noProgress immediately when no other member can produce a change. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer.`; +} +var POLICY_TEXT = teamPolicy(true); +var HOOK_POLICY_PREFIX = "[agent-team]"; +var IDENTITY_LEAD_TEXT = `You are the Team Lead named "lead". +Use list_agents({}) to find your teammates and their names. +To message another teammate, use send_message({ target: "", message: "..." }).`; +function identityTeammateText(name) { + return `You are teammate "${name}". +Your Team Lead is named "lead". +To message your Team Lead, use send_message({ target: "lead", message: "..." }). +Use list_agents({}) to find your teammates and their names. +To message another teammate, use send_message({ target: "", message: "..." }).`; +} +var POLICY_PROBE_MARKER = "quartz-ember-73"; +var ORCHESTRATOR_SECTION_TEXT = "Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists \u2014 delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer."; +function buildSessionStartContext(identityText, interrupt = true, leadMode) { + const policy = teamPolicy(interrupt); + const orchestration = leadMode === "orchestrator" ? ` +${HOOK_POLICY_PREFIX} ${ORCHESTRATOR_SECTION_TEXT}` : ""; + const probe = process.env.TEAM_POLICY_PROBE === "1" ? ` +${HOOK_POLICY_PREFIX} \u7B56\u7565\u6CE8\u5165\u9A8C\u8BC1\u6807\u8BB0\uFF1A${POLICY_PROBE_MARKER}` : ""; + return `${HOOK_POLICY_PREFIX} ${policy} +${HOOK_POLICY_PREFIX} ${identityText}${orchestration}${probe}`; +} +var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true, "orchestrator"); + +// src/mcp/identity.ts +import fs2 from "node:fs"; +import path2 from "node:path"; +function sessionMapPath(dataRoot) { + return path2.join(dataRoot, "session-map.json"); +} +function safeSessionKey(sessionId) { + return sessionId.replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 128); +} +function registryLockPath(dataRoot) { + return `${sessionMapPath(dataRoot)}.lock`; +} +function withRegistryLock(dataRoot, fn) { + const lock = registryLockPath(dataRoot); + const started = Date.now(); + let fd = null; + while (Date.now() - started < 2e3) { + try { + fd = fs2.openSync(lock, "wx", 384); + break; + } catch { + try { + const stat = fs2.statSync(lock); + if (Date.now() - stat.mtimeMs > 5e3) fs2.unlinkSync(lock); + } catch { + } + const until = Date.now() + 20; + while (Date.now() < until) { + } + } + } + try { + fn(); + } finally { + if (fd !== null) { + try { + fs2.closeSync(fd); + fs2.unlinkSync(lock); + } catch { + } + } + } +} +function readSessionRegistry(dataRoot) { + try { + const parsed = JSON.parse(fs2.readFileSync(sessionMapPath(dataRoot), "utf8")); + if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {}; + return parsed; + } catch { + return {}; + } +} +function upsertSessionEntry(dataRoot, sessionId, patch) { + const file = sessionMapPath(dataRoot); + try { + fs2.mkdirSync(path2.dirname(file), { recursive: true }); + withRegistryLock(dataRoot, () => { + let registry2 = {}; + try { + const parsed = JSON.parse(fs2.readFileSync(file, "utf8")); + if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) { + registry2 = parsed; + } + } catch (err) { + if (err.code !== "ENOENT") { + try { + fs2.renameSync(file, `${file}.corrupt-${Date.now()}`); + } catch { + } + } + } + const key = safeSessionKey(sessionId); + const prior = registry2[key] ?? {}; + registry2[key] = { ...prior, ...patch, session_id: sessionId }; + const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 8)}`; + const fd = fs2.openSync(tmp, "w", 384); + try { + fs2.writeFileSync(fd, JSON.stringify(registry2, null, 2)); + fs2.fsyncSync(fd); + } finally { + fs2.closeSync(fd); + } + fs2.renameSync(tmp, file); + }); + } catch { + } +} + +// src/coord/paths.ts +import { createHash } from "node:crypto"; +import fs3 from "node:fs"; +import path3 from "node:path"; +import os2 from "node:os"; +var MAX_SOCKET_PATH = 96; +function teamPaths(dataRoot, teamId) { + const teamsRoot = path3.join(dataRoot, "teams"); + const teamDir = path3.join(teamsRoot, safeTeamId(teamId)); + return { + dataRoot, + teamId, + teamDir, + eventsFile: path3.join(teamDir, "events.jsonl"), + checkpointFile: path3.join(teamDir, "checkpoint.json"), + lockFile: path3.join(teamDir, "coordinator.lock"), + auditFile: path3.join(teamDir, "coordinator.audit.jsonl"), + socketCandidate: path3.join(teamDir, "coordinator.sock") + }; +} +function safeTeamId(teamId) { + const escaped = teamId.replace(/[^A-Za-z0-9._-]/g, (c) => "~" + c.codePointAt(0).toString(16)); + if (escaped === ".") return "~2e"; + if (escaped === "..") return "~2e2e"; + return escaped; +} +function assertPathInside(base, target) { + const resolvedBase = path3.resolve(base); + const resolvedTarget = path3.resolve(target); + if (resolvedTarget !== resolvedBase && !resolvedTarget.startsWith(resolvedBase + path3.sep)) { + throw new Error(`path escapes containment: ${target} (base: ${base})`); + } +} +function resolveSocketPath(teamDir) { + const candidate = path3.join(teamDir, "coordinator.sock"); + if (candidate.length <= MAX_SOCKET_PATH) { + return { socketPath: candidate, fallback: false, registryFile: path3.join(teamDir, "socket.path") }; + } + const hash = createHash("sha256").update(candidate).digest("hex").slice(0, 16); + const tmpRoot = fs3.realpathSync(os2.tmpdir()); + const fallbackDir = path3.join(tmpRoot, "agent-team-sockets"); + fs3.mkdirSync(fallbackDir, { recursive: true, mode: 448 }); + try { + fs3.chmodSync(fallbackDir, 448); + } catch { + } + const fallbackPath = path3.join(fallbackDir, `at-${hash}.sock`); + return { socketPath: fallbackPath, fallback: true, registryFile: path3.join(teamDir, "socket.path") }; +} +function discoverSocketPath(teamDir) { + const registryFile = path3.join(teamDir, "socket.path"); + try { + const registered = fs3.readFileSync(registryFile, "utf8").trim(); + if (registered.length > 0) return registered; + } catch { + } + return resolveSocketPath(teamDir).socketPath; +} + +// src/coord/rpc.ts +import net from "node:net"; +import fs4 from "node:fs"; +import path4 from "node:path"; +var COORDINATOR_UNAVAILABLE_MESSAGE = "Agent Teams coordinator is unavailable (between coordinators); retry the request shortly"; +var MAX_RPC_BUFFER_BYTES = 1 << 20; +var RpcClient = class _RpcClient { + constructor(socket, token = void 0, nextId = 1, pending = /* @__PURE__ */ new Map(), maxFrameBytes = MAX_RPC_BUFFER_BYTES) { + this.socket = socket; + this.token = token; + this.nextId = nextId; + this.pending = pending; + this.maxFrameBytes = maxFrameBytes; + } + maxFrameBytes; + static async connect(socketPath, opts = {}) { + const timeoutMs = opts.timeoutMs ?? 3e3; + const socket = await new Promise((resolve, reject) => { + const s = net.connect(socketPath, () => resolve(s)); + s.setEncoding("utf8"); + const timer = setTimeout(() => { + s.destroy(); + reject(new Error(`rpc connect timeout after ${timeoutMs}ms: ${socketPath}`)); + }, timeoutMs); + s.once("error", (err) => { + clearTimeout(timer); + reject(err); + }); + resolveSocketOnConnect(s, () => clearTimeout(timer)); + }); + const client = new _RpcClient(socket, opts.token, 1, /* @__PURE__ */ new Map(), opts.maxFrameBytes); + socket.on("data", (chunk) => client.onData(chunk)); + socket.on("close", () => client.failAll(new Error("rpc connection closed"))); + socket.on("error", (err) => client.failAll(err)); + return client; + } + async call(method, params, opts = {}) { + const id = this.nextId++; + const timeoutMs = opts.timeoutMs ?? 15e3; + if (opts.signal?.aborted) { + return Promise.reject( + new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal.reason)}`) + ); + } + const payload = JSON.stringify({ id, method, params, ...this.token !== void 0 ? { token: this.token } : {} }) + "\n"; + return new Promise((resolve, reject) => { + let settled = false; + let timer; + const finish = (fn) => { + if (settled) return; + settled = true; + clearTimeout(timer); + opts.signal?.removeEventListener("abort", onAbort); + this.pending.delete(id); + fn(); + }; + const onAbort = () => { + finish( + () => reject(new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal?.reason)}`)) + ); + this.socket.destroy(); + }; + timer = setTimeout(() => { + finish(() => reject(new Error(`rpc call ${method} timed out after ${timeoutMs}ms`))); + }, timeoutMs); + this.pending.set(id, { + resolve: (v) => finish(() => resolve(v)), + reject: (e) => finish(() => reject(e)) + }); + opts.signal?.addEventListener("abort", onAbort, { once: true }); + this.socket.write(payload, (err) => { + if (err) finish(() => reject(err)); + }); + }); + } + close() { + this.socket.destroy(); + } + onData(chunk) { + this.buffer += chunk; + if (Buffer.byteLength(this.buffer, "utf8") > this.maxFrameBytes) { + this.failAll(new Error(`rpc response frame exceeds ${this.maxFrameBytes} bytes`)); + this.socket.destroy(); + return; + } + let nl; + while ((nl = this.buffer.indexOf("\n")) !== -1) { + const line = this.buffer.slice(0, nl); + this.buffer = this.buffer.slice(nl + 1); + if (line.trim().length === 0) continue; + try { + this.onResponse(JSON.parse(line)); + } catch { + this.failAll(new Error("invalid rpc response frame")); + } + } + } + buffer = ""; + onResponse(res) { + const entry = this.pending.get(res.id); + if (entry === void 0) return; + this.pending.delete(res.id); + if (res.ok) { + entry.resolve(res.result); + } else if (res.error?.code !== void 0) { + entry.reject(new TeamError(res.error.code, res.error.message)); + } else { + const err = new Error(res.error?.message ?? "rpc error"); + if (res.error?.name) err.name = res.error.name; + entry.reject(err); + } + } + failAll(err) { + for (const [, entry] of this.pending) entry.reject(err); + this.pending.clear(); + } +}; +function resolveSocketOnConnect(socket, onConnected) { + socket.once("connect", onConnected); +} +function rpcTokenPath(teamDir) { + return path4.join(teamDir, "rpc.token"); +} +function readRpcToken(teamDir) { + try { + const token = fs4.readFileSync(rpcTokenPath(teamDir), "utf8").trim(); + return token.length > 0 ? token : void 0; + } catch { + return void 0; + } +} +function coordinatorUnavailableError(detail) { + return new TeamError("TEAM_DISPOSED", COORDINATOR_UNAVAILABLE_MESSAGE, { cause: detail }); +} +function abortReasonText(reason) { + if (reason instanceof Error) return reason.message; + if (reason === void 0 || reason === null) return "aborted"; + return String(reason); +} +async function callCoordinator(teamDir, teamId, method, params, opts = {}) { + const socketPath = discoverSocketPath(teamDir); + const token = readRpcToken(teamDir); + const client = await RpcClient.connect(socketPath, { + timeoutMs: opts.connectTimeoutMs ?? 1e3, + ...token !== void 0 ? { token } : {} + }).catch((err) => { + throw coordinatorUnavailableError(`socket ${socketPath}: ${err.code ?? err.message}`); + }); + try { + return await client.call(method, params, { + timeoutMs: opts.timeoutMs, + ...opts.signal !== void 0 ? { signal: opts.signal } : {} + }); + } finally { + client.close(); + } +} + +// src/hooks/inbox.ts +import fs7 from "node:fs"; +import path7 from "node:path"; + +// src/coord/replay.ts +import fs5 from "node:fs"; +import path5 from "node:path"; + +// node_modules/zod/v3/external.js +var external_exports = {}; +__export(external_exports, { + BRAND: () => BRAND, + DIRTY: () => DIRTY, + EMPTY_PATH: () => EMPTY_PATH, + INVALID: () => INVALID, + NEVER: () => NEVER, + OK: () => OK, + ParseStatus: () => ParseStatus, + Schema: () => ZodType, + ZodAny: () => ZodAny, + ZodArray: () => ZodArray, + ZodBigInt: () => ZodBigInt, + ZodBoolean: () => ZodBoolean, + ZodBranded: () => ZodBranded, + ZodCatch: () => ZodCatch, + ZodDate: () => ZodDate, + ZodDefault: () => ZodDefault, + ZodDiscriminatedUnion: () => ZodDiscriminatedUnion, + ZodEffects: () => ZodEffects, + ZodEnum: () => ZodEnum, + ZodError: () => ZodError, + ZodFirstPartyTypeKind: () => ZodFirstPartyTypeKind, + ZodFunction: () => ZodFunction, + ZodIntersection: () => ZodIntersection, + ZodIssueCode: () => ZodIssueCode, + ZodLazy: () => ZodLazy, + ZodLiteral: () => ZodLiteral, + ZodMap: () => ZodMap, + ZodNaN: () => ZodNaN, + ZodNativeEnum: () => ZodNativeEnum, + ZodNever: () => ZodNever, + ZodNull: () => ZodNull, + ZodNullable: () => ZodNullable, + ZodNumber: () => ZodNumber, + ZodObject: () => ZodObject, + ZodOptional: () => ZodOptional, + ZodParsedType: () => ZodParsedType, + ZodPipeline: () => ZodPipeline, + ZodPromise: () => ZodPromise, + ZodReadonly: () => ZodReadonly, + ZodRecord: () => ZodRecord, + ZodSchema: () => ZodType, + ZodSet: () => ZodSet, + ZodString: () => ZodString, + ZodSymbol: () => ZodSymbol, + ZodTransformer: () => ZodEffects, + ZodTuple: () => ZodTuple, + ZodType: () => ZodType, + ZodUndefined: () => ZodUndefined, + ZodUnion: () => ZodUnion, + ZodUnknown: () => ZodUnknown, + ZodVoid: () => ZodVoid, + addIssueToContext: () => addIssueToContext, + any: () => anyType, + array: () => arrayType, + bigint: () => bigIntType, + boolean: () => booleanType, + coerce: () => coerce, + custom: () => custom, + date: () => dateType, + datetimeRegex: () => datetimeRegex, + defaultErrorMap: () => en_default, + discriminatedUnion: () => discriminatedUnionType, + effect: () => effectsType, + enum: () => enumType, + function: () => functionType, + getErrorMap: () => getErrorMap, + getParsedType: () => getParsedType, + instanceof: () => instanceOfType, + intersection: () => intersectionType, + isAborted: () => isAborted, + isAsync: () => isAsync, + isDirty: () => isDirty, + isValid: () => isValid, + late: () => late, + lazy: () => lazyType, + literal: () => literalType, + makeIssue: () => makeIssue, + map: () => mapType, + nan: () => nanType, + nativeEnum: () => nativeEnumType, + never: () => neverType, + null: () => nullType, + nullable: () => nullableType, + number: () => numberType, + object: () => objectType, + objectUtil: () => objectUtil, + oboolean: () => oboolean, + onumber: () => onumber, + optional: () => optionalType, + ostring: () => ostring, + pipeline: () => pipelineType, + preprocess: () => preprocessType, + promise: () => promiseType, + quotelessJson: () => quotelessJson, + record: () => recordType, + set: () => setType, + setErrorMap: () => setErrorMap, + strictObject: () => strictObjectType, + string: () => stringType, + symbol: () => symbolType, + transformer: () => effectsType, + tuple: () => tupleType, + undefined: () => undefinedType, + union: () => unionType, + unknown: () => unknownType, + util: () => util, + void: () => voidType +}); + +// node_modules/zod/v3/helpers/util.js +var util; +(function(util2) { + util2.assertEqual = (_) => { + }; + function assertIs(_arg) { + } + util2.assertIs = assertIs; + function assertNever(_x) { + throw new Error(); + } + util2.assertNever = assertNever; + util2.arrayToEnum = (items) => { + const obj = {}; + for (const item of items) { + obj[item] = item; + } + return obj; + }; + util2.getValidEnumValues = (obj) => { + const validKeys = util2.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); + const filtered = {}; + for (const k of validKeys) { + filtered[k] = obj[k]; + } + return util2.objectValues(filtered); + }; + util2.objectValues = (obj) => { + return util2.objectKeys(obj).map(function(e) { + return obj[e]; + }); + }; + util2.objectKeys = typeof Object.keys === "function" ? (obj) => Object.keys(obj) : (object) => { + const keys = []; + for (const key in object) { + if (Object.prototype.hasOwnProperty.call(object, key)) { + keys.push(key); + } + } + return keys; + }; + util2.find = (arr, checker) => { + for (const item of arr) { + if (checker(item)) + return item; + } + return void 0; + }; + util2.isInteger = typeof Number.isInteger === "function" ? (val) => Number.isInteger(val) : (val) => typeof val === "number" && Number.isFinite(val) && Math.floor(val) === val; + function joinValues(array, separator = " | ") { + return array.map((val) => typeof val === "string" ? `'${val}'` : val).join(separator); + } + util2.joinValues = joinValues; + util2.jsonStringifyReplacer = (_, value) => { + if (typeof value === "bigint") { + return value.toString(); + } + return value; + }; +})(util || (util = {})); +var objectUtil; +(function(objectUtil2) { + objectUtil2.mergeShapes = (first, second) => { + return { + ...first, + ...second + // second overwrites first + }; + }; +})(objectUtil || (objectUtil = {})); +var ZodParsedType = util.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set" +]); +var getParsedType = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return ZodParsedType.undefined; + case "string": + return ZodParsedType.string; + case "number": + return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; + case "boolean": + return ZodParsedType.boolean; + case "function": + return ZodParsedType.function; + case "bigint": + return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; + case "object": + if (Array.isArray(data)) { + return ZodParsedType.array; + } + if (data === null) { + return ZodParsedType.null; + } + if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") { + return ZodParsedType.promise; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return ZodParsedType.map; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return ZodParsedType.set; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return ZodParsedType.date; + } + return ZodParsedType.object; + default: + return ZodParsedType.unknown; + } +}; + +// node_modules/zod/v3/ZodError.js +var ZodIssueCode = util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite" +]); +var quotelessJson = (obj) => { + const json = JSON.stringify(obj, null, 2); + return json.replace(/"([^"]+)":/g, "$1:"); +}; +var ZodError = class _ZodError extends Error { + get errors() { + return this.issues; + } + constructor(issues) { + super(); + this.issues = []; + this.addIssue = (sub) => { + this.issues = [...this.issues, sub]; + }; + this.addIssues = (subs = []) => { + this.issues = [...this.issues, ...subs]; + }; + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, actualProto); + } else { + this.__proto__ = actualProto; + } + this.name = "ZodError"; + this.issues = issues; + } + format(_mapper) { + const mapper = _mapper || function(issue) { + return issue.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error) => { + for (const issue of error.issues) { + if (issue.code === "invalid_union") { + issue.unionErrors.map(processError); + } else if (issue.code === "invalid_return_type") { + processError(issue.returnTypeError); + } else if (issue.code === "invalid_arguments") { + processError(issue.argumentsError); + } else if (issue.path.length === 0) { + fieldErrors._errors.push(mapper(issue)); + } else { + let curr = fieldErrors; + let i = 0; + while (i < issue.path.length) { + const el = issue.path[i]; + const terminal = i === issue.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + } else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue)); + } + curr = curr[el]; + i++; + } + } + } + }; + processError(this); + return fieldErrors; + } + static assert(value) { + if (!(value instanceof _ZodError)) { + throw new Error(`Not a ZodError: ${value}`); + } + } + toString() { + return this.message; + } + get message() { + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(mapper = (issue) => issue.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of this.issues) { + if (sub.path.length > 0) { + const firstEl = sub.path[0]; + fieldErrors[firstEl] = fieldErrors[firstEl] || []; + fieldErrors[firstEl].push(mapper(sub)); + } else { + formErrors.push(mapper(sub)); + } + } + return { formErrors, fieldErrors }; + } + get formErrors() { + return this.flatten(); + } +}; +ZodError.create = (issues) => { + const error = new ZodError(issues); + return error; +}; + +// node_modules/zod/v3/locales/en.js +var errorMap = (issue, _ctx) => { + let message; + switch (issue.code) { + case ZodIssueCode.invalid_type: + if (issue.received === ZodParsedType.undefined) { + message = "Required"; + } else { + message = `Expected ${issue.expected}, received ${issue.received}`; + } + break; + case ZodIssueCode.invalid_literal: + message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`; + break; + case ZodIssueCode.unrecognized_keys: + message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, ", ")}`; + break; + case ZodIssueCode.invalid_union: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_union_discriminator: + message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`; + break; + case ZodIssueCode.invalid_enum_value: + message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`; + break; + case ZodIssueCode.invalid_arguments: + message = `Invalid function arguments`; + break; + case ZodIssueCode.invalid_return_type: + message = `Invalid function return type`; + break; + case ZodIssueCode.invalid_date: + message = `Invalid date`; + break; + case ZodIssueCode.invalid_string: + if (typeof issue.validation === "object") { + if ("includes" in issue.validation) { + message = `Invalid input: must include "${issue.validation.includes}"`; + if (typeof issue.validation.position === "number") { + message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`; + } + } else if ("startsWith" in issue.validation) { + message = `Invalid input: must start with "${issue.validation.startsWith}"`; + } else if ("endsWith" in issue.validation) { + message = `Invalid input: must end with "${issue.validation.endsWith}"`; + } else { + util.assertNever(issue.validation); + } + } else if (issue.validation !== "regex") { + message = `Invalid ${issue.validation}`; + } else { + message = "Invalid"; + } + break; + case ZodIssueCode.too_small: + if (issue.type === "array") + message = `Array must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`; + else if (issue.type === "string") + message = `String must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`; + else if (issue.type === "number") + message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`; + else if (issue.type === "bigint") + message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`; + else if (issue.type === "date") + message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.too_big: + if (issue.type === "array") + message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`; + else if (issue.type === "string") + message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`; + else if (issue.type === "number") + message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`; + else if (issue.type === "bigint") + message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`; + else if (issue.type === "date") + message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.custom: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_intersection_types: + message = `Intersection results could not be merged`; + break; + case ZodIssueCode.not_multiple_of: + message = `Number must be a multiple of ${issue.multipleOf}`; + break; + case ZodIssueCode.not_finite: + message = "Number must be finite"; + break; + default: + message = _ctx.defaultError; + util.assertNever(issue); + } + return { message }; +}; +var en_default = errorMap; + +// node_modules/zod/v3/errors.js +var overrideErrorMap = en_default; +function setErrorMap(map) { + overrideErrorMap = map; +} +function getErrorMap() { + return overrideErrorMap; +} + +// node_modules/zod/v3/helpers/parseUtil.js +var makeIssue = (params) => { + const { data, path: path11, errorMaps, issueData } = params; + const fullPath = [...path11, ...issueData.path || []]; + const fullIssue = { + ...issueData, + path: fullPath + }; + if (issueData.message !== void 0) { + return { + ...issueData, + path: fullPath, + message: issueData.message + }; + } + let errorMessage = ""; + const maps = errorMaps.filter((m) => !!m).slice().reverse(); + for (const map of maps) { + errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message; + } + return { + ...issueData, + path: fullPath, + message: errorMessage + }; +}; +var EMPTY_PATH = []; +function addIssueToContext(ctx, issueData) { + const overrideMap = getErrorMap(); + const issue = makeIssue({ + issueData, + data: ctx.data, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + // contextual error map is first priority + ctx.schemaErrorMap, + // then schema-bound map if available + overrideMap, + // then global override map + overrideMap === en_default ? void 0 : en_default + // then global default map + ].filter((x) => !!x) + }); + ctx.common.issues.push(issue); +} +var ParseStatus = class _ParseStatus { + constructor() { + this.value = "valid"; + } + dirty() { + if (this.value === "valid") + this.value = "dirty"; + } + abort() { + if (this.value !== "aborted") + this.value = "aborted"; + } + static mergeArray(status, results) { + const arrayValue = []; + for (const s of results) { + if (s.status === "aborted") + return INVALID; + if (s.status === "dirty") + status.dirty(); + arrayValue.push(s.value); + } + return { status: status.value, value: arrayValue }; + } + static async mergeObjectAsync(status, pairs) { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value + }); + } + return _ParseStatus.mergeObjectSync(status, syncPairs); + } + static mergeObjectSync(status, pairs) { + const finalObject = {}; + for (const pair of pairs) { + const { key, value } = pair; + if (key.status === "aborted") + return INVALID; + if (value.status === "aborted") + return INVALID; + if (key.status === "dirty") + status.dirty(); + if (value.status === "dirty") + status.dirty(); + if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) { + finalObject[key.value] = value.value; + } + } + return { status: status.value, value: finalObject }; + } +}; +var INVALID = Object.freeze({ + status: "aborted" +}); +var DIRTY = (value) => ({ status: "dirty", value }); +var OK = (value) => ({ status: "valid", value }); +var isAborted = (x) => x.status === "aborted"; +var isDirty = (x) => x.status === "dirty"; +var isValid = (x) => x.status === "valid"; +var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; + +// node_modules/zod/v3/helpers/errorUtil.js +var errorUtil; +(function(errorUtil2) { + errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {}; + errorUtil2.toString = (message) => typeof message === "string" ? message : message?.message; +})(errorUtil || (errorUtil = {})); + +// node_modules/zod/v3/types.js +var ParseInputLazyPath = class { + constructor(parent, value, path11, key) { + this._cachedPath = []; + this.parent = parent; + this.data = value; + this._path = path11; + this._key = key; + } + get path() { + if (!this._cachedPath.length) { + if (Array.isArray(this._key)) { + this._cachedPath.push(...this._path, ...this._key); + } else { + this._cachedPath.push(...this._path, this._key); + } + } + return this._cachedPath; + } +}; +var handleResult = (ctx, result) => { + if (isValid(result)) { + return { success: true, data: result.value }; + } else { + if (!ctx.common.issues.length) { + throw new Error("Validation failed but no issues detected."); + } + return { + success: false, + get error() { + if (this._error) + return this._error; + const error = new ZodError(ctx.common.issues); + this._error = error; + return this._error; + } + }; + } +}; +function processCreateParams(params) { + if (!params) + return {}; + const { errorMap: errorMap2, invalid_type_error, required_error, description } = params; + if (errorMap2 && (invalid_type_error || required_error)) { + throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); + } + if (errorMap2) + return { errorMap: errorMap2, description }; + const customMap = (iss, ctx) => { + const { message } = params; + if (iss.code === "invalid_enum_value") { + return { message: message ?? ctx.defaultError }; + } + if (typeof ctx.data === "undefined") { + return { message: message ?? required_error ?? ctx.defaultError }; + } + if (iss.code !== "invalid_type") + return { message: ctx.defaultError }; + return { message: message ?? invalid_type_error ?? ctx.defaultError }; + }; + return { errorMap: customMap, description }; +} +var ZodType = class { + get description() { + return this._def.description; + } + _getType(input2) { + return getParsedType(input2.data); + } + _getOrReturnCtx(input2, ctx) { + return ctx || { + common: input2.parent.common, + data: input2.data, + parsedType: getParsedType(input2.data), + schemaErrorMap: this._def.errorMap, + path: input2.path, + parent: input2.parent + }; + } + _processInputParams(input2) { + return { + status: new ParseStatus(), + ctx: { + common: input2.parent.common, + data: input2.data, + parsedType: getParsedType(input2.data), + schemaErrorMap: this._def.errorMap, + path: input2.path, + parent: input2.parent + } + }; + } + _parseSync(input2) { + const result = this._parse(input2); + if (isAsync(result)) { + throw new Error("Synchronous parse encountered promise."); + } + return result; + } + _parseAsync(input2) { + const result = this._parse(input2); + return Promise.resolve(result); + } + parse(data, params) { + const result = this.safeParse(data, params); + if (result.success) + return result.data; + throw result.error; + } + safeParse(data, params) { + const ctx = { + common: { + issues: [], + async: params?.async ?? false, + contextualErrorMap: params?.errorMap + }, + path: params?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const result = this._parseSync({ data, path: ctx.path, parent: ctx }); + return handleResult(ctx, result); + } + "~validate"(data) { + const ctx = { + common: { + issues: [], + async: !!this["~standard"].async + }, + path: [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + if (!this["~standard"].async) { + try { + const result = this._parseSync({ data, path: [], parent: ctx }); + return isValid(result) ? { + value: result.value + } : { + issues: ctx.common.issues + }; + } catch (err) { + if (err?.message?.toLowerCase()?.includes("encountered")) { + this["~standard"].async = true; + } + ctx.common = { + issues: [], + async: true + }; + } + } + return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result) ? { + value: result.value + } : { + issues: ctx.common.issues + }); + } + async parseAsync(data, params) { + const result = await this.safeParseAsync(data, params); + if (result.success) + return result.data; + throw result.error; + } + async safeParseAsync(data, params) { + const ctx = { + common: { + issues: [], + contextualErrorMap: params?.errorMap, + async: true + }, + path: params?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); + const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult)); + return handleResult(ctx, result); + } + refine(check, message) { + const getIssueProperties = (val) => { + if (typeof message === "string" || typeof message === "undefined") { + return { message }; + } else if (typeof message === "function") { + return message(val); + } else { + return message; + } + }; + return this._refinement((val, ctx) => { + const result = check(val); + const setError = () => ctx.addIssue({ + code: ZodIssueCode.custom, + ...getIssueProperties(val) + }); + if (typeof Promise !== "undefined" && result instanceof Promise) { + return result.then((data) => { + if (!data) { + setError(); + return false; + } else { + return true; + } + }); + } + if (!result) { + setError(); + return false; + } else { + return true; + } + }); + } + refinement(check, refinementData) { + return this._refinement((val, ctx) => { + if (!check(val)) { + ctx.addIssue(typeof refinementData === "function" ? refinementData(val, ctx) : refinementData); + return false; + } else { + return true; + } + }); + } + _refinement(refinement) { + return new ZodEffects({ + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "refinement", refinement } + }); + } + superRefine(refinement) { + return this._refinement(refinement); + } + constructor(def) { + this.spa = this.safeParseAsync; + this._def = def; + this.parse = this.parse.bind(this); + this.safeParse = this.safeParse.bind(this); + this.parseAsync = this.parseAsync.bind(this); + this.safeParseAsync = this.safeParseAsync.bind(this); + this.spa = this.spa.bind(this); + this.refine = this.refine.bind(this); + this.refinement = this.refinement.bind(this); + this.superRefine = this.superRefine.bind(this); + this.optional = this.optional.bind(this); + this.nullable = this.nullable.bind(this); + this.nullish = this.nullish.bind(this); + this.array = this.array.bind(this); + this.promise = this.promise.bind(this); + this.or = this.or.bind(this); + this.and = this.and.bind(this); + this.transform = this.transform.bind(this); + this.brand = this.brand.bind(this); + this.default = this.default.bind(this); + this.catch = this.catch.bind(this); + this.describe = this.describe.bind(this); + this.pipe = this.pipe.bind(this); + this.readonly = this.readonly.bind(this); + this.isNullable = this.isNullable.bind(this); + this.isOptional = this.isOptional.bind(this); + this["~standard"] = { + version: 1, + vendor: "zod", + validate: (data) => this["~validate"](data) + }; + } + optional() { + return ZodOptional.create(this, this._def); + } + nullable() { + return ZodNullable.create(this, this._def); + } + nullish() { + return this.nullable().optional(); + } + array() { + return ZodArray.create(this); + } + promise() { + return ZodPromise.create(this, this._def); + } + or(option) { + return ZodUnion.create([this, option], this._def); + } + and(incoming) { + return ZodIntersection.create(this, incoming, this._def); + } + transform(transform) { + return new ZodEffects({ + ...processCreateParams(this._def), + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "transform", transform } + }); + } + default(def) { + const defaultValueFunc = typeof def === "function" ? def : () => def; + return new ZodDefault({ + ...processCreateParams(this._def), + innerType: this, + defaultValue: defaultValueFunc, + typeName: ZodFirstPartyTypeKind.ZodDefault + }); + } + brand() { + return new ZodBranded({ + typeName: ZodFirstPartyTypeKind.ZodBranded, + type: this, + ...processCreateParams(this._def) + }); + } + catch(def) { + const catchValueFunc = typeof def === "function" ? def : () => def; + return new ZodCatch({ + ...processCreateParams(this._def), + innerType: this, + catchValue: catchValueFunc, + typeName: ZodFirstPartyTypeKind.ZodCatch + }); + } + describe(description) { + const This = this.constructor; + return new This({ + ...this._def, + description + }); + } + pipe(target) { + return ZodPipeline.create(this, target); + } + readonly() { + return ZodReadonly.create(this); + } + isOptional() { + return this.safeParse(void 0).success; + } + isNullable() { + return this.safeParse(null).success; + } +}; +var cuidRegex = /^c[^\s-]{8,}$/i; +var cuid2Regex = /^[0-9a-z]+$/; +var ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i; +var uuidRegex = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i; +var nanoidRegex = /^[a-z0-9_-]{21}$/i; +var jwtRegex = /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/; +var durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/; +var emailRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i; +var _emojiRegex = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; +var emojiRegex; +var ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; +var ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/; +var ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; +var ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; +var base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; +var base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/; +var dateRegexSource = `((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))`; +var dateRegex = new RegExp(`^${dateRegexSource}$`); +function timeRegexSource(args) { + let secondsRegexSource = `[0-5]\\d`; + if (args.precision) { + secondsRegexSource = `${secondsRegexSource}\\.\\d{${args.precision}}`; + } else if (args.precision == null) { + secondsRegexSource = `${secondsRegexSource}(\\.\\d+)?`; + } + const secondsQuantifier = args.precision ? "+" : "?"; + return `([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`; +} +function timeRegex(args) { + return new RegExp(`^${timeRegexSource(args)}$`); +} +function datetimeRegex(args) { + let regex = `${dateRegexSource}T${timeRegexSource(args)}`; + const opts = []; + opts.push(args.local ? `Z?` : `Z`); + if (args.offset) + opts.push(`([+-]\\d{2}:?\\d{2})`); + regex = `${regex}(${opts.join("|")})`; + return new RegExp(`^${regex}$`); +} +function isValidIP(ip, version) { + if ((version === "v4" || !version) && ipv4Regex.test(ip)) { + return true; + } + if ((version === "v6" || !version) && ipv6Regex.test(ip)) { + return true; + } + return false; +} +function isValidJWT(jwt, alg) { + if (!jwtRegex.test(jwt)) + return false; + try { + const [header] = jwt.split("."); + if (!header) + return false; + const base64 = header.replace(/-/g, "+").replace(/_/g, "/").padEnd(header.length + (4 - header.length % 4) % 4, "="); + const decoded = JSON.parse(atob(base64)); + if (typeof decoded !== "object" || decoded === null) + return false; + if ("typ" in decoded && decoded?.typ !== "JWT") + return false; + if (!decoded.alg) + return false; + if (alg && decoded.alg !== alg) + return false; + return true; + } catch { + return false; + } +} +function isValidCidr(ip, version) { + if ((version === "v4" || !version) && ipv4CidrRegex.test(ip)) { + return true; + } + if ((version === "v6" || !version) && ipv6CidrRegex.test(ip)) { + return true; + } + return false; +} +var ZodString = class _ZodString extends ZodType { + _parse(input2) { + if (this._def.coerce) { + input2.data = String(input2.data); + } + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.string) { + const ctx2 = this._getOrReturnCtx(input2); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.string, + received: ctx2.parsedType + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check of this._def.checks) { + if (check.kind === "min") { + if (input2.data.length < check.value) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + if (input2.data.length > check.value) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "length") { + const tooBig = input2.data.length > check.value; + const tooSmall = input2.data.length < check.value; + if (tooBig || tooSmall) { + ctx = this._getOrReturnCtx(input2, ctx); + if (tooBig) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message + }); + } else if (tooSmall) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message + }); + } + status.dirty(); + } + } else if (check.kind === "email") { + if (!emailRegex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "email", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "emoji") { + if (!emojiRegex) { + emojiRegex = new RegExp(_emojiRegex, "u"); + } + if (!emojiRegex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "emoji", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "uuid") { + if (!uuidRegex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "uuid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "nanoid") { + if (!nanoidRegex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "nanoid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "cuid") { + if (!cuidRegex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "cuid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "cuid2") { + if (!cuid2Regex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "cuid2", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "ulid") { + if (!ulidRegex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "ulid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "url") { + try { + new URL(input2.data); + } catch { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "url", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "regex") { + check.regex.lastIndex = 0; + const testResult = check.regex.test(input2.data); + if (!testResult) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "regex", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "trim") { + input2.data = input2.data.trim(); + } else if (check.kind === "includes") { + if (!input2.data.includes(check.value, check.position)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { includes: check.value, position: check.position }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "toLowerCase") { + input2.data = input2.data.toLowerCase(); + } else if (check.kind === "toUpperCase") { + input2.data = input2.data.toUpperCase(); + } else if (check.kind === "startsWith") { + if (!input2.data.startsWith(check.value)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { startsWith: check.value }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "endsWith") { + if (!input2.data.endsWith(check.value)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { endsWith: check.value }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "datetime") { + const regex = datetimeRegex(check); + if (!regex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "datetime", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "date") { + const regex = dateRegex; + if (!regex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "date", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "time") { + const regex = timeRegex(check); + if (!regex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "time", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "duration") { + if (!durationRegex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "duration", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "ip") { + if (!isValidIP(input2.data, check.version)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "ip", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "jwt") { + if (!isValidJWT(input2.data, check.alg)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "jwt", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "cidr") { + if (!isValidCidr(input2.data, check.version)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "cidr", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "base64") { + if (!base64Regex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "base64", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "base64url") { + if (!base64urlRegex.test(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + validation: "base64url", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input2.data }; + } + _regex(regex, validation, message) { + return this.refinement((data) => regex.test(data), { + validation, + code: ZodIssueCode.invalid_string, + ...errorUtil.errToObj(message) + }); + } + _addCheck(check) { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + email(message) { + return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); + } + url(message) { + return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); + } + emoji(message) { + return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); + } + uuid(message) { + return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); + } + nanoid(message) { + return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) }); + } + cuid(message) { + return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); + } + cuid2(message) { + return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); + } + ulid(message) { + return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); + } + base64(message) { + return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) }); + } + base64url(message) { + return this._addCheck({ + kind: "base64url", + ...errorUtil.errToObj(message) + }); + } + jwt(options) { + return this._addCheck({ kind: "jwt", ...errorUtil.errToObj(options) }); + } + ip(options) { + return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); + } + cidr(options) { + return this._addCheck({ kind: "cidr", ...errorUtil.errToObj(options) }); + } + datetime(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "datetime", + precision: null, + offset: false, + local: false, + message: options + }); + } + return this._addCheck({ + kind: "datetime", + precision: typeof options?.precision === "undefined" ? null : options?.precision, + offset: options?.offset ?? false, + local: options?.local ?? false, + ...errorUtil.errToObj(options?.message) + }); + } + date(message) { + return this._addCheck({ kind: "date", message }); + } + time(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "time", + precision: null, + message: options + }); + } + return this._addCheck({ + kind: "time", + precision: typeof options?.precision === "undefined" ? null : options?.precision, + ...errorUtil.errToObj(options?.message) + }); + } + duration(message) { + return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); + } + regex(regex, message) { + return this._addCheck({ + kind: "regex", + regex, + ...errorUtil.errToObj(message) + }); + } + includes(value, options) { + return this._addCheck({ + kind: "includes", + value, + position: options?.position, + ...errorUtil.errToObj(options?.message) + }); + } + startsWith(value, message) { + return this._addCheck({ + kind: "startsWith", + value, + ...errorUtil.errToObj(message) + }); + } + endsWith(value, message) { + return this._addCheck({ + kind: "endsWith", + value, + ...errorUtil.errToObj(message) + }); + } + min(minLength, message) { + return this._addCheck({ + kind: "min", + value: minLength, + ...errorUtil.errToObj(message) + }); + } + max(maxLength, message) { + return this._addCheck({ + kind: "max", + value: maxLength, + ...errorUtil.errToObj(message) + }); + } + length(len, message) { + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message) + }); + } + /** + * Equivalent to `.min(1)` + */ + nonempty(message) { + return this.min(1, errorUtil.errToObj(message)); + } + trim() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }] + }); + } + toLowerCase() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }] + }); + } + toUpperCase() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }] + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((ch) => ch.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((ch) => ch.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((ch) => ch.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((ch) => ch.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((ch) => ch.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((ch) => ch.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((ch) => ch.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((ch) => ch.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } + get isCIDR() { + return !!this._def.checks.find((ch) => ch.kind === "cidr"); + } + get isBase64() { + return !!this._def.checks.find((ch) => ch.kind === "base64"); + } + get isBase64url() { + return !!this._def.checks.find((ch) => ch.kind === "base64url"); + } + get minLength() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxLength() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +}; +ZodString.create = (params) => { + return new ZodString({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodString, + coerce: params?.coerce ?? false, + ...processCreateParams(params) + }); +}; +function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = Number.parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", "")); + return valInt % stepInt / 10 ** decCount; +} +var ZodNumber = class _ZodNumber extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(input2) { + if (this._def.coerce) { + input2.data = Number(input2.data); + } + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.number) { + const ctx2 = this._getOrReturnCtx(input2); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.number, + received: ctx2.parsedType + }); + return INVALID; + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "int") { + if (!util.isInteger(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: "integer", + received: "float", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "min") { + const tooSmall = check.inclusive ? input2.data < check.value : input2.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + const tooBig = check.inclusive ? input2.data > check.value : input2.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "multipleOf") { + if (floatSafeRemainder(input2.data, check.value) !== 0) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "finite") { + if (!Number.isFinite(input2.data)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_finite, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input2.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check) { + return new _ZodNumber({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + int(message) { + return this._addCheck({ + kind: "int", + message: errorUtil.toString(message) + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message) + }); + } + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message) + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || ch.kind === "multipleOf" && util.isInteger(ch.value)); + } + get isFinite() { + let max = null; + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || ch.kind === "int" || ch.kind === "multipleOf") { + return true; + } else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return Number.isFinite(min) && Number.isFinite(max); + } +}; +ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: params?.coerce || false, + ...processCreateParams(params) + }); +}; +var ZodBigInt = class _ZodBigInt extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(input2) { + if (this._def.coerce) { + try { + input2.data = BigInt(input2.data); + } catch { + return this._getInvalidInput(input2); + } + } + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.bigint) { + return this._getInvalidInput(input2); + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "min") { + const tooSmall = check.inclusive ? input2.data < check.value : input2.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check.value, + inclusive: check.inclusive, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + const tooBig = check.inclusive ? input2.data > check.value : input2.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check.value, + inclusive: check.inclusive, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "multipleOf") { + if (input2.data % check.value !== BigInt(0)) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input2.data }; + } + _getInvalidInput(input2) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.bigint, + received: ctx.parsedType + }); + return INVALID; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check) { + return new _ZodBigInt({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +}; +ZodBigInt.create = (params) => { + return new ZodBigInt({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodBigInt, + coerce: params?.coerce ?? false, + ...processCreateParams(params) + }); +}; +var ZodBoolean = class extends ZodType { + _parse(input2) { + if (this._def.coerce) { + input2.data = Boolean(input2.data); + } + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input2.data); + } +}; +ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: params?.coerce || false, + ...processCreateParams(params) + }); +}; +var ZodDate = class _ZodDate extends ZodType { + _parse(input2) { + if (this._def.coerce) { + input2.data = new Date(input2.data); + } + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.date) { + const ctx2 = this._getOrReturnCtx(input2); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.date, + received: ctx2.parsedType + }); + return INVALID; + } + if (Number.isNaN(input2.data.getTime())) { + const ctx2 = this._getOrReturnCtx(input2); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_date + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check of this._def.checks) { + if (check.kind === "min") { + if (input2.data.getTime() < check.value) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + message: check.message, + inclusive: true, + exact: false, + minimum: check.value, + type: "date" + }); + status.dirty(); + } + } else if (check.kind === "max") { + if (input2.data.getTime() > check.value) { + ctx = this._getOrReturnCtx(input2, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + message: check.message, + inclusive: true, + exact: false, + maximum: check.value, + type: "date" + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { + status: status.value, + value: new Date(input2.data.getTime()) + }; + } + _addCheck(check) { + return new _ZodDate({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message) + }); + } + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message) + }); + } + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min != null ? new Date(min) : null; + } + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max != null ? new Date(max) : null; + } +}; +ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: params?.coerce || false, + typeName: ZodFirstPartyTypeKind.ZodDate, + ...processCreateParams(params) + }); +}; +var ZodSymbol = class extends ZodType { + _parse(input2) { + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.symbol, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input2.data); + } +}; +ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params) + }); +}; +var ZodUndefined = class extends ZodType { + _parse(input2) { + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input2.data); + } +}; +ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, + ...processCreateParams(params) + }); +}; +var ZodNull = class extends ZodType { + _parse(input2) { + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.null, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input2.data); + } +}; +ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params) + }); +}; +var ZodAny = class extends ZodType { + constructor() { + super(...arguments); + this._any = true; + } + _parse(input2) { + return OK(input2.data); + } +}; +ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params) + }); +}; +var ZodUnknown = class extends ZodType { + constructor() { + super(...arguments); + this._unknown = true; + } + _parse(input2) { + return OK(input2.data); + } +}; +ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params) + }); +}; +var ZodNever = class extends ZodType { + _parse(input2) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType + }); + return INVALID; + } +}; +ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params) + }); +}; +var ZodVoid = class extends ZodType { + _parse(input2) { + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.void, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input2.data); + } +}; +ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, + ...processCreateParams(params) + }); +}; +var ZodArray = class _ZodArray extends ZodType { + _parse(input2) { + const { ctx, status } = this._processInputParams(input2); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: tooSmall ? def.exactLength.value : void 0, + maximum: tooBig ? def.exactLength.value : void 0, + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.minLength.message + }); + status.dirty(); + } + } + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.maxLength.message + }); + status.dirty(); + } + } + if (ctx.common.async) { + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result2) => { + return ParseStatus.mergeArray(status, result2); + }); + } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + }); + return ParseStatus.mergeArray(status, result); + } + get element() { + return this._def.type; + } + min(minLength, message) { + return new _ZodArray({ + ...this._def, + minLength: { value: minLength, message: errorUtil.toString(message) } + }); + } + max(maxLength, message) { + return new _ZodArray({ + ...this._def, + maxLength: { value: maxLength, message: errorUtil.toString(message) } + }); + } + length(len, message) { + return new _ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) } + }); + } + nonempty(message) { + return this.min(1, message); + } +}; +ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, + ...processCreateParams(params) + }); +}; +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape + }); + } else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element) + }); + } else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); + } else { + return schema; + } +} +var ZodObject = class _ZodObject extends ZodType { + constructor() { + super(...arguments); + this._cached = null; + this.nonstrict = this.passthrough; + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + this._cached = { shape, keys }; + return this._cached; + } + _parse(input2) { + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.object) { + const ctx2 = this._getOrReturnCtx(input2); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx2.parsedType + }); + return INVALID; + } + const { status, ctx } = this._processInputParams(input2); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); + } + } + } + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] } + }); + } + } else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { + addIssueToContext(ctx, { + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys + }); + status.dirty(); + } + } else if (unknownKeys === "strip") { + } else { + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); + } + } else { + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse( + new ParseInputLazyPath(ctx, value, ctx.path, key) + //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data + }); + } + } + if (ctx.common.async) { + return Promise.resolve().then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + alwaysSet: pair.alwaysSet + }); + } + return syncPairs; + }).then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); + }); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get shape() { + return this._def.shape(); + } + strict(message) { + errorUtil.errToObj; + return new _ZodObject({ + ...this._def, + unknownKeys: "strict", + ...message !== void 0 ? { + errorMap: (issue, ctx) => { + const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError; + if (issue.code === "unrecognized_keys") + return { + message: errorUtil.errToObj(message).message ?? defaultError + }; + return { + message: defaultError + }; + } + } : {} + }); + } + strip() { + return new _ZodObject({ + ...this._def, + unknownKeys: "strip" + }); + } + passthrough() { + return new _ZodObject({ + ...this._def, + unknownKeys: "passthrough" + }); + } + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new _ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation + }) + }); + } + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new _ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape() + }), + typeName: ZodFirstPartyTypeKind.ZodObject + }); + return merged; + } + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); + } + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new _ZodObject({ + ...this._def, + catchall: index + }); + } + pick(mask) { + const shape = {}; + for (const key of util.objectKeys(mask)) { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } + } + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + omit(mask) { + const shape = {}; + for (const key of util.objectKeys(this.shape)) { + if (!mask[key]) { + shape[key] = this.shape[key]; + } + } + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); + } + partial(mask) { + const newShape = {}; + for (const key of util.objectKeys(this.shape)) { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; + } else { + newShape[key] = fieldSchema.optional(); + } + } + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + required(mask) { + const newShape = {}; + for (const key of util.objectKeys(this.shape)) { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; + } else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; + } + } + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + keyof() { + return createZodEnum(util.objectKeys(this.shape)); + } +}; +ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +var ZodUnion = class extends ZodType { + _parse(input2) { + const { ctx } = this._processInputParams(input2); + const options = this._def.options; + function handleResults(results) { + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } + } + for (const result of results) { + if (result.result.status === "dirty") { + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } + } + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }), + ctx: childCtx + }; + })).then(handleResults); + } else { + let dirty = void 0; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }); + if (result.status === "valid") { + return result; + } else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; + } + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); + } + } + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; + } + const unionErrors = issues.map((issues2) => new ZodError(issues2)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + } + get options() { + return this._def.options; + } +}; +ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, + ...processCreateParams(params) + }); +}; +var getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); + } else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); + } else if (type instanceof ZodLiteral) { + return [type.value]; + } else if (type instanceof ZodEnum) { + return type.options; + } else if (type instanceof ZodNativeEnum) { + return util.objectValues(type.enum); + } else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); + } else if (type instanceof ZodUndefined) { + return [void 0]; + } else if (type instanceof ZodNull) { + return [null]; + } else if (type instanceof ZodOptional) { + return [void 0, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodNullable) { + return [null, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodBranded) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodReadonly) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodCatch) { + return getDiscriminator(type._def.innerType); + } else { + return []; + } +}; +var ZodDiscriminatedUnion = class _ZodDiscriminatedUnion extends ZodType { + _parse(input2) { + const { ctx } = this._processInputParams(input2); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator] + }); + return INVALID; + } + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } else { + return option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + const optionsMap = /* @__PURE__ */ new Map(); + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues.length) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); + } + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); + } + optionsMap.set(value, type); + } + } + return new _ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params) + }); + } +}; +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; + } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; + } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; + } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) { + return { valid: true, data: a }; + } else { + return { valid: false }; + } +} +var ZodIntersection = class extends ZodType { + _parse(input2) { + const { status, ctx } = this._processInputParams(input2); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); + } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }) + ]).then(([left, right]) => handleParsed(left, right)); + } else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + })); + } + } +}; +ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left, + right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, + ...processCreateParams(params) + }); +}; +var ZodTuple = class _ZodTuple extends ZodType { + _parse(input2) { + const { status, ctx } = this._processInputParams(input2); + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (ctx.data.length < this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + return INVALID; + } + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + status.dirty(); + } + const items = [...ctx.data].map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }).filter((x) => !!x); + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } else { + return ParseStatus.mergeArray(status, items); + } + } + get items() { + return this._def.items; + } + rest(rest) { + return new _ZodTuple({ + ...this._def, + rest + }); + } +}; +ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + } + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, + ...processCreateParams(params) + }); +}; +var ZodRecord = class _ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input2) { + const { status, ctx } = this._processInputParams(input2); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get element() { + return this._def.valueType; + } + static create(first, second, third) { + if (second instanceof ZodType) { + return new _ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third) + }); + } + return new _ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second) + }); + } +}; +var ZodMap = class extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input2) { + const { status, ctx } = this._processInputParams(input2); + if (ctx.parsedType !== ZodParsedType.map) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.map, + received: ctx.parsedType + }); + return INVALID; + } + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])) + }; + }); + if (ctx.common.async) { + const finalMap = /* @__PURE__ */ new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + }); + } else { + const finalMap = /* @__PURE__ */ new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + } + } +}; +ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, + ...processCreateParams(params) + }); +}; +var ZodSet = class _ZodSet extends ZodType { + _parse(input2) { + const { status, ctx } = this._processInputParams(input2); + if (ctx.parsedType !== ZodParsedType.set) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.set, + received: ctx.parsedType + }); + return INVALID; + } + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.minSize.message + }); + status.dirty(); + } + } + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.maxSize.message + }); + status.dirty(); + } + } + const valueType = this._def.valueType; + function finalizeSet(elements2) { + const parsedSet = /* @__PURE__ */ new Set(); + for (const element of elements2) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); + } + return { status: status.value, value: parsedSet }; + } + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); + if (ctx.common.async) { + return Promise.all(elements).then((elements2) => finalizeSet(elements2)); + } else { + return finalizeSet(elements); + } + } + min(minSize, message) { + return new _ZodSet({ + ...this._def, + minSize: { value: minSize, message: errorUtil.toString(message) } + }); + } + max(maxSize, message) { + return new _ZodSet({ + ...this._def, + maxSize: { value: maxSize, message: errorUtil.toString(message) } + }); + } + size(size, message) { + return this.min(size, message).max(size, message); + } + nonempty(message) { + return this.min(1, message); + } +}; +ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, + ...processCreateParams(params) + }); +}; +var ZodFunction = class _ZodFunction extends ZodType { + constructor() { + super(...arguments); + this.validate = this.implement; + } + _parse(input2) { + const { ctx } = this._processInputParams(input2); + if (ctx.parsedType !== ZodParsedType.function) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.function, + received: ctx.parsedType + }); + return INVALID; + } + function makeArgsIssue(args, error) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), en_default].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error + } + }); + } + function makeReturnsIssue(returns, error) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), en_default].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error + } + }); + } + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + const me = this; + return OK(async function(...args) { + const error = new ZodError([]); + const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => { + error.addIssue(makeArgsIssue(args, e)); + throw error; + }); + const result = await Reflect.apply(fn, this, parsedArgs); + const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e) => { + error.addIssue(makeReturnsIssue(result, e)); + throw error; + }); + return parsedReturns; + }); + } else { + const me = this; + return OK(function(...args) { + const parsedArgs = me._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + } + const result = Reflect.apply(fn, this, parsedArgs.data); + const parsedReturns = me._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; + }); + } + } + parameters() { + return this._def.args; + } + returnType() { + return this._def.returns; + } + args(...items) { + return new _ZodFunction({ + ...this._def, + args: ZodTuple.create(items).rest(ZodUnknown.create()) + }); + } + returns(returnType) { + return new _ZodFunction({ + ...this._def, + returns: returnType + }); + } + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + static create(args, returns, params) { + return new _ZodFunction({ + args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params) + }); + } +}; +var ZodLazy = class extends ZodType { + get schema() { + return this._def.getter(); + } + _parse(input2) { + const { ctx } = this._processInputParams(input2); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); + } +}; +ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, + ...processCreateParams(params) + }); +}; +var ZodLiteral = class extends ZodType { + _parse(input2) { + if (input2.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value + }); + return INVALID; + } + return { status: "valid", value: input2.data }; + } + get value() { + return this._def.value; + } +}; +ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, + ...processCreateParams(params) + }); +}; +function createZodEnum(values, params) { + return new ZodEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodEnum, + ...processCreateParams(params) + }); +} +var ZodEnum = class _ZodEnum extends ZodType { + _parse(input2) { + if (typeof input2.data !== "string") { + const ctx = this._getOrReturnCtx(input2); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!this._cache) { + this._cache = new Set(this._def.values); + } + if (!this._cache.has(input2.data)) { + const ctx = this._getOrReturnCtx(input2); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input2.data); + } + get options() { + return this._def.values; + } + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + extract(values, newDef = this._def) { + return _ZodEnum.create(values, { + ...this._def, + ...newDef + }); + } + exclude(values, newDef = this._def) { + return _ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { + ...this._def, + ...newDef + }); + } +}; +ZodEnum.create = createZodEnum; +var ZodNativeEnum = class extends ZodType { + _parse(input2) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input2); + if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!this._cache) { + this._cache = new Set(util.getValidEnumValues(this._def.values)); + } + if (!this._cache.has(input2.data)) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input2.data); + } + get enum() { + return this._def.values; + } +}; +ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, + ...processCreateParams(params) + }); +}; +var ZodPromise = class extends ZodType { + unwrap() { + return this._def.type; + } + _parse(input2) { + const { ctx } = this._processInputParams(input2); + if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.promise, + received: ctx.parsedType + }); + return INVALID; + } + const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { + path: ctx.path, + errorMap: ctx.common.contextualErrorMap + }); + })); + } +}; +ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params) + }); +}; +var ZodEffects = class extends ZodType { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema; + } + _parse(input2) { + const { status, ctx } = this._processInputParams(input2); + const effect = this._def.effect || null; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } else { + status.dirty(); + } + }, + get path() { + return ctx.path; + } + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data, checkCtx); + if (ctx.common.async) { + return Promise.resolve(processed).then(async (processed2) => { + if (status.value === "aborted") + return INVALID; + const result = await this._def.schema._parseAsync({ + data: processed2, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + }); + } else { + if (status.value === "aborted") + return INVALID; + const result = this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + } + } + if (effect.type === "refinement") { + const executeRefinement = (acc) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } + } + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (!isValid(base)) + return INVALID; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { status: status.value, value: result }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => { + if (!isValid(base)) + return INVALID; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ + status: status.value, + value: result + })); + }); + } + } + util.assertNever(effect); + } +}; +ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, + ...processCreateParams(params) + }); +}; +ZodEffects.createWithPreprocess = (preprocess, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params) + }); +}; +var ZodOptional = class extends ZodType { + _parse(input2) { + const parsedType = this._getType(input2); + if (parsedType === ZodParsedType.undefined) { + return OK(void 0); + } + return this._def.innerType._parse(input2); + } + unwrap() { + return this._def.innerType; + } +}; +ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params) + }); +}; +var ZodNullable = class extends ZodType { + _parse(input2) { + const parsedType = this._getType(input2); + if (parsedType === ZodParsedType.null) { + return OK(null); + } + return this._def.innerType._parse(input2); + } + unwrap() { + return this._def.innerType; + } +}; +ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params) + }); +}; +var ZodDefault = class extends ZodType { + _parse(input2) { + const { ctx } = this._processInputParams(input2); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); + } + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + removeDefault() { + return this._def.innerType; + } +}; +ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" ? params.default : () => params.default, + ...processCreateParams(params) + }); +}; +var ZodCatch = class extends ZodType { + _parse(input2) { + const { ctx } = this._processInputParams(input2); + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + } + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx + } + }); + if (isAsync(result)) { + return result.then((result2) => { + return { + status: "valid", + value: result2.status === "valid" ? result2.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + }); + } else { + return { + status: "valid", + value: result.status === "valid" ? result.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + } + } + removeCatch() { + return this._def.innerType; + } +}; +ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, + ...processCreateParams(params) + }); +}; +var ZodNaN = class extends ZodType { + _parse(input2) { + const parsedType = this._getType(input2); + if (parsedType !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input2); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.nan, + received: ctx.parsedType + }); + return INVALID; + } + return { status: "valid", value: input2.data }; + } +}; +ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params) + }); +}; +var BRAND = Symbol("zod_brand"); +var ZodBranded = class extends ZodType { + _parse(input2) { + const { ctx } = this._processInputParams(input2); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + unwrap() { + return this._def.type; + } +}; +var ZodPipeline = class _ZodPipeline extends ZodType { + _parse(input2) { + const { status, ctx } = this._processInputParams(input2); + if (ctx.common.async) { + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + }; + return handleAsync(); + } else { + const inResult = this._def.in._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value + }; + } else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + } + } + static create(a, b) { + return new _ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline + }); + } +}; +var ZodReadonly = class extends ZodType { + _parse(input2) { + const result = this._def.innerType._parse(input2); + const freeze = (data) => { + if (isValid(data)) { + data.value = Object.freeze(data.value); + } + return data; + }; + return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result); + } + unwrap() { + return this._def.innerType; + } +}; +ZodReadonly.create = (type, params) => { + return new ZodReadonly({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodReadonly, + ...processCreateParams(params) + }); +}; +function cleanParams(params, data) { + const p = typeof params === "function" ? params(data) : typeof params === "string" ? { message: params } : params; + const p2 = typeof p === "string" ? { message: p } : p; + return p2; +} +function custom(check, _params = {}, fatal) { + if (check) + return ZodAny.create().superRefine((data, ctx) => { + const r = check(data); + if (r instanceof Promise) { + return r.then((r2) => { + if (!r2) { + const params = cleanParams(_params, data); + const _fatal = params.fatal ?? fatal ?? true; + ctx.addIssue({ code: "custom", ...params, fatal: _fatal }); + } + }); + } + if (!r) { + const params = cleanParams(_params, data); + const _fatal = params.fatal ?? fatal ?? true; + ctx.addIssue({ code: "custom", ...params, fatal: _fatal }); + } + return; + }); + return ZodAny.create(); +} +var late = { + object: ZodObject.lazycreate +}; +var ZodFirstPartyTypeKind; +(function(ZodFirstPartyTypeKind2) { + ZodFirstPartyTypeKind2["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind2["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind2["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind2["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind2["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind2["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind2["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind2["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind2["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind2["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind2["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind2["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind2["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind2["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind2["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind2["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind2["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind2["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind2["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind2["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind2["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind2["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind2["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind2["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind2["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind2["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind2["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind2["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind2["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind2["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind2["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind2["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind2["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind2["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind2["ZodPipeline"] = "ZodPipeline"; + ZodFirstPartyTypeKind2["ZodReadonly"] = "ZodReadonly"; +})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); +var instanceOfType = (cls, params = { + message: `Input not instance of ${cls.name}` +}) => custom((data) => data instanceof cls, params); +var stringType = ZodString.create; +var numberType = ZodNumber.create; +var nanType = ZodNaN.create; +var bigIntType = ZodBigInt.create; +var booleanType = ZodBoolean.create; +var dateType = ZodDate.create; +var symbolType = ZodSymbol.create; +var undefinedType = ZodUndefined.create; +var nullType = ZodNull.create; +var anyType = ZodAny.create; +var unknownType = ZodUnknown.create; +var neverType = ZodNever.create; +var voidType = ZodVoid.create; +var arrayType = ZodArray.create; +var objectType = ZodObject.create; +var strictObjectType = ZodObject.strictCreate; +var unionType = ZodUnion.create; +var discriminatedUnionType = ZodDiscriminatedUnion.create; +var intersectionType = ZodIntersection.create; +var tupleType = ZodTuple.create; +var recordType = ZodRecord.create; +var mapType = ZodMap.create; +var setType = ZodSet.create; +var functionType = ZodFunction.create; +var lazyType = ZodLazy.create; +var literalType = ZodLiteral.create; +var enumType = ZodEnum.create; +var nativeEnumType = ZodNativeEnum.create; +var promiseType = ZodPromise.create; +var effectsType = ZodEffects.create; +var optionalType = ZodOptional.create; +var nullableType = ZodNullable.create; +var preprocessType = ZodEffects.createWithPreprocess; +var pipelineType = ZodPipeline.create; +var ostring = () => stringType().optional(); +var onumber = () => numberType().optional(); +var oboolean = () => booleanType().optional(); +var coerce = { + string: (arg) => ZodString.create({ ...arg, coerce: true }), + number: (arg) => ZodNumber.create({ ...arg, coerce: true }), + boolean: (arg) => ZodBoolean.create({ + ...arg, + coerce: true + }), + bigint: (arg) => ZodBigInt.create({ ...arg, coerce: true }), + date: (arg) => ZodDate.create({ ...arg, coerce: true }) +}; +var NEVER = INVALID; + +// src/domain/events.ts +var IMAGE_MEDIA_TYPES = ["png", "jpeg", "webp", "gif"]; +function validateContentBlock(block) { + if (typeof block !== "object" || block === null || Array.isArray(block)) { + throw new Error("content block must be a JSON object"); + } + const b = block; + switch (b.type) { + case "text": + case "reasoning": + if (typeof b.text !== "string") throw new Error(`${String(b.type)} block requires string text`); + return block; + case "image": { + const a = b.attachment; + if (typeof a !== "object" || a === null || Array.isArray(a)) { + throw new Error("image block requires object attachment"); + } + const att = a; + if (typeof att.attachmentId !== "string") throw new Error("image attachment requires string attachmentId"); + if (typeof att.mediaType !== "string" || !IMAGE_MEDIA_TYPES.includes(att.mediaType)) { + throw new Error(`image attachment mediaType must be one of ${IMAGE_MEDIA_TYPES.join("/")}`); + } + if (typeof att.bytes !== "number") throw new Error("image attachment requires number bytes"); + if (typeof att.width !== "number") throw new Error("image attachment requires number width"); + if (typeof att.height !== "number") throw new Error("image attachment requires number height"); + if (att.name !== void 0 && typeof att.name !== "string") { + throw new Error("image attachment name must be a string when present"); + } + return block; + } + case "tool-call": { + if (typeof b.id !== "string") throw new Error("tool-call block requires string id"); + if (typeof b.name !== "string") throw new Error("tool-call block requires string name"); + if (!("arguments" in b)) throw new Error("tool-call block requires arguments"); + return block; + } + case "tool-result": + throw new Error("retired tool-result wrapper is not accepted as Team message content"); + default: + return block; + } +} +var contentBlocksSchema = external_exports.array(external_exports.unknown()).superRefine((blocks, ctx) => { + for (let i = 0; i < blocks.length; i++) { + try { + validateContentBlock(blocks[i]); + } catch (err) { + ctx.addIssue({ + code: external_exports.ZodIssueCode.custom, + path: [i], + message: err instanceof Error ? err.message : String(err) + }); + } + } +}); +var TASK_ID_PATTERN = /^task-(\d+)$/; +function isLooseIdValid(id) { + if (id.length === 0) return false; + const m = id.match(TASK_ID_PATTERN); + if (m && !Number.isSafeInteger(Number(m[1]))) return false; + return true; +} +function taskNumberFromId(id) { + const m = id.match(TASK_ID_PATTERN); + return m ? Number(m[1]) : void 0; +} +var looseIdSchema = external_exports.string().refine(isLooseIdValid, { message: "invalid loose id" }); +var memberSnapshotSchema = external_exports.strictObject({ + id: external_exports.string(), + name: external_exports.string(), + description: external_exports.string(), + provider: external_exports.string(), + context: external_exports.enum(["fresh", "fork"]), + phase: external_exports.enum(["provisioning", "active", "failed"]), + error: external_exports.string().optional() +}); +var taskSnapshotSchema = external_exports.strictObject({ + id: looseIdSchema, + revision: external_exports.number().refine((n) => Number.isSafeInteger(n) && n >= 1, { + message: "revision must be a positive safe integer" + }), + subject: external_exports.string(), + description: external_exports.string(), + status: external_exports.enum(["pending", "in_progress", "completed", "deleted"]), + ownerId: external_exports.string().optional(), + blockedBy: external_exports.array(external_exports.string()), + writeScopes: external_exports.array(external_exports.string()) +}); +var messageSnapshotSchema = external_exports.strictObject({ + id: looseIdSchema, + senderId: external_exports.string(), + senderName: external_exports.string(), + targetId: external_exports.string(), + content: contentBlocksSchema +}); +var TEAM_EVENT_VERSION = 2; +var TEAM_EVENT_TYPES = [ + "team/member", + "team/task", + "team/message/queued", + "team/message/delivered" +]; +var memberEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/member"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + member: memberSnapshotSchema +}); +var taskEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/task"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + task: taskSnapshotSchema +}); +var messageQueuedEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/message/queued"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + message: messageSnapshotSchema +}); +var messageDeliveredEventSchema = external_exports.strictObject({ + type: external_exports.literal("team/message/delivered"), + version: external_exports.literal(TEAM_EVENT_VERSION), + teamId: external_exports.string(), + messageId: external_exports.string(), + targetId: external_exports.string() +}); +var TEAM_EVENT_SCHEMAS = { + "team/member": memberEventSchema, + "team/task": taskEventSchema, + "team/message/queued": messageQueuedEventSchema, + "team/message/delivered": messageDeliveredEventSchema +}; +var LEGACY_EVENT_TYPE_ALIASES = { + "team/message": "team/message/queued" +}; +function selectTeamEvent(raw2, teamId) { + if (typeof raw2 !== "object" || raw2 === null || Array.isArray(raw2)) return { kind: "ignored" }; + const candidate = raw2; + const rawType = candidate.type; + if (typeof rawType !== "string") return { kind: "ignored" }; + const eventType = TEAM_EVENT_TYPES.includes(rawType) ? rawType : LEGACY_EVENT_TYPE_ALIASES[rawType]; + if (eventType === void 0) return { kind: "ignored" }; + if (typeof candidate.teamId !== "string" || candidate.teamId !== teamId) { + return { kind: "ignored" }; + } + if (candidate.version !== TEAM_EVENT_VERSION) { + return { kind: "unsupported-version", version: candidate.version }; + } + const normalized = rawType === eventType ? raw2 : { ...candidate, type: eventType }; + const parsed = TEAM_EVENT_SCHEMAS[eventType].safeParse(normalized); + if (!parsed.success) return { kind: "invalid-payload", type: eventType }; + return { kind: "event", event: parsed.data }; +} +var deliveredIdsSchema = external_exports.preprocess((value) => { + if (!Array.isArray(value)) return value; + return value.map((item) => { + if (typeof item === "string") return item; + if (typeof item === "object" && item !== null && typeof item.messageId === "string") { + return item.messageId; + } + return item; + }); +}, external_exports.array(external_exports.string())); +var teamStateSchema = external_exports.strictObject({ + id: external_exports.string(), + members: external_exports.array(memberSnapshotSchema), + tasks: external_exports.array(taskSnapshotSchema), + messages: external_exports.array(messageSnapshotSchema), + delivered: deliveredIdsSchema, + nextTaskNumber: external_exports.number().refine((n) => Number.isSafeInteger(n) && n >= 1, { + message: "nextTaskNumber must be a positive safe integer" + }), + failure: external_exports.string().optional() +}); + +// src/domain/task-graph.ts +function validateTaskGraph(tasks) { + const byId = new Map(tasks.map((t) => [t.id, t])); + const live = tasks.filter((t) => t.status !== "deleted"); + for (const task of live) { + for (const bid of task.blockedBy) { + if (bid === task.id) { + throw new Error(`team task "${task.id}" cannot block itself`); + } + } + } + for (const task of live) { + const seen = /* @__PURE__ */ new Set(); + for (const bid of task.blockedBy) { + if (seen.has(bid)) { + throw new Error(`team task "${task.id}" repeats blocker "${bid}"`); + } + seen.add(bid); + } + } + for (const task of live) { + for (const bid of task.blockedBy) { + const blocker = byId.get(bid); + if (blocker === void 0 || blocker.status === "deleted") { + throw new Error(`blocker task "${bid}" for "${task.id}" is missing or deleted`); + } + } + } + detectCycle(live, byId); +} +function detectCycle(live, byId) { + const WHITE = 0; + const GRAY = 1; + const BLACK = 2; + const color = /* @__PURE__ */ new Map(); + const visit = (task) => { + color.set(task.id, GRAY); + for (const bid of task.blockedBy) { + const blocker = byId.get(bid); + if (blocker === void 0 || blocker.status === "deleted") continue; + const c = color.get(bid) ?? WHITE; + if (c === GRAY) { + throw new Error(`task dependency cycle includes "${bid}"`); + } + if (c === WHITE) visit(blocker); + } + color.set(task.id, BLACK); + }; + for (const task of live) { + if ((color.get(task.id) ?? WHITE) === WHITE) visit(task); + } +} + +// src/domain/task-view.ts +function taskReady(state, task) { + return task.blockedBy.every((bid) => { + const blocker = state.tasks.find((t) => t.id === bid); + return blocker !== void 0 && blocker.status === "completed"; + }); +} +function projectTaskView(state, task) { + const view = { + id: task.id, + revision: task.revision, + subject: task.subject, + description: task.description, + status: task.status, + blockedBy: [...task.blockedBy], + writeScopes: [...task.writeScopes], + ready: task.status === "pending" && taskReady(state, task), + writeScopeWarnings: writeScopeWarnings(state, task) + }; + if (task.ownerId !== void 0) { + const ownerName = task.ownerId === state.id ? "lead" : state.members.find((m) => m.id === task.ownerId)?.name; + if (ownerName !== void 0) view.ownerName = ownerName; + } + return view; +} +function writeScopeWarnings(state, task) { + if (task.status !== "in_progress") return []; + const warnings = /* @__PURE__ */ new Set(); + for (const other of state.tasks) { + if (other.id === task.id || other.status !== "in_progress") continue; + if (scopesOverlap(task.writeScopes, other.writeScopes)) { + warnings.add(`write scopes overlap with ${other.id}`); + } + } + return [...warnings]; +} +function scopesOverlap(left, right) { + for (const l of left) { + for (const r of right) { + if (l === r || l.startsWith(r + "/") || r.startsWith(l + "/")) return true; + } + } + return false; +} + +// src/domain/projection.ts +var TEAM_PROJECTION_STATE_VERSION = 4; +function emptyTeamState(rootId) { + return { + id: rootId, + members: [], + tasks: [], + messages: [], + delivered: [], + nextTaskNumber: 1 + }; +} +function failed(state, failure) { + return { ...state, failure }; +} +function applyProjectionEvent(state, raw2) { + if (state.failure !== void 0) return state; + const selected = selectTeamEvent(raw2, state.id); + switch (selected.kind) { + case "ignored": + return state; + case "unsupported-version": + return failed(state, `unsupported Agent Teams event version ${String(selected.version)}`); + case "invalid-payload": + return failed(state, `persisted Agent Teams ${selected.type} payload is invalid`); + case "event": + return applyCurrentTeamEvent(state, selected.event); + } +} +function applyCurrentTeamEvent(state, event2) { + if (state.failure !== void 0) return state; + switch (event2.type) { + case "team/member": + return applyMember(state, event2.member); + case "team/task": + return applyTask(state, event2.task); + case "team/message/queued": + return applyMessageQueued(state, event2.message); + case "team/message/delivered": + return applyMessageDelivered(state, event2.messageId, event2.targetId); + } +} +function applyMember(state, member) { + const prior = state.members.find((m) => m.id === member.id); + if (prior === void 0) { + if (member.phase !== "provisioning") { + return failed(state, `teammate "${member.name}" must begin provisioning`); + } + if (state.members.some((m) => m.name === member.name)) { + return failed(state, `teammate name "${member.name}" is reused by another member`); + } + return { ...state, members: [...state.members, member] }; + } + if (prior.name !== member.name || prior.provider !== member.provider || prior.context !== member.context) { + return failed(state, `teammate "${prior.id}" changed immutable identity fields`); + } + if (prior.phase !== "provisioning" || member.phase !== "active" && member.phase !== "failed") { + return failed( + state, + `teammate "${member.name}" has an invalid ${prior.phase} -> ${member.phase} transition` + ); + } + return { ...state, members: state.members.map((m) => m.id === member.id ? member : m) }; +} +function applyTask(state, task) { + const prior = state.tasks.find((t) => t.id === task.id); + const expectedRevision = prior === void 0 ? 1 : prior.revision + 1; + if (task.revision !== expectedRevision) { + return failed( + state, + prior === void 0 ? `team task "${task.id}" must begin at revision 1` : `team task "${task.id}" revision is not contiguous` + ); + } + const tasks = prior === void 0 ? [...state.tasks, task] : state.tasks.map((t) => t.id === task.id ? task : t); + try { + validateTaskGraph(tasks); + } catch (err) { + return failed(state, err instanceof Error ? err.message : String(err)); + } + let nextTaskNumber = state.nextTaskNumber; + const n = taskNumberFromId(task.id); + if (n !== void 0) { + nextTaskNumber = Math.max(state.nextTaskNumber, Math.min(n + 1, Number.MAX_SAFE_INTEGER)); + } + return { ...state, tasks, nextTaskNumber }; +} +function applyMessageQueued(state, message) { + if (state.messages.some((m) => m.id === message.id)) { + return failed(state, `team message "${message.id}" was queued twice`); + } + return { ...state, messages: [...state.messages, message] }; +} +function applyMessageDelivered(state, messageId, targetId) { + const queued = state.messages.find((m) => m.id === messageId); + if (queued === void 0) { + return failed(state, `team message "${messageId}" was delivered before queueing`); + } + if (queued.targetId !== targetId) { + return failed(state, `team message "${messageId}" target changed`); + } + if (state.delivered.includes(messageId)) { + return failed(state, `team message "${messageId}" was delivered twice`); + } + return { ...state, delivered: [...state.delivered, messageId] }; +} +var viewCache = /* @__PURE__ */ new WeakMap(); +function teamProjectionView(state) { + let byTasks = viewCache.get(state.members); + if (byTasks === void 0) { + byTasks = /* @__PURE__ */ new WeakMap(); + viewCache.set(state.members, byTasks); + } + let entry = byTasks.get(state.tasks); + if (entry === void 0) { + const members = [ + { id: state.id, name: "lead", role: "lead", phase: "active" }, + ...state.members.map((m) => ({ id: m.id, name: m.name, role: "teammate", phase: m.phase, ...m.error !== void 0 ? { error: m.error } : {} })) + ]; + const tasks = state.tasks.filter((t) => t.status !== "deleted").map((t) => projectTaskView(state, t)); + entry = { healthy: { members, tasks } }; + byTasks.set(state.tasks, entry); + } + if (state.failure === void 0) return entry.healthy; + if (entry.failed === void 0) { + entry.failed = { ...entry.healthy, failure: state.failure }; + } + return entry.failed; +} + +// src/coord/replay.ts +var checkpointDocSchema = external_exports.strictObject({ + kind: external_exports.literal("agent-team-checkpoint"), + stateVersion: external_exports.literal(TEAM_PROJECTION_STATE_VERSION), + lastSeq: external_exports.number().int().nonnegative(), + lastOffset: external_exports.number().int().nonnegative(), + savedAt: external_exports.string(), + state: teamStateSchema, + view: external_exports.unknown() +}); +function checkpointPath(teamDir) { + return path5.join(teamDir, "checkpoint.json"); +} +async function load(teamDir, teamId) { + const startedAt = Date.now(); + const eventsFile = path5.join(teamDir, "events.jsonl"); + const raw2 = readBufferOrEmpty(eventsFile); + let checkpointIgnored; + let doc; + try { + const rawDoc = fs5.readFileSync(checkpointPath(teamDir), "utf8"); + const parsed = checkpointDocSchema.safeParse(JSON.parse(rawDoc)); + if (!parsed.success) { + checkpointIgnored = `checkpoint invalid: ${parsed.error.issues[0]?.message ?? "schema mismatch"}`; + } else if (parsed.data.state.id !== teamId) { + checkpointIgnored = `checkpoint teamId mismatch (${parsed.data.state.id} != ${teamId})`; + } else { + doc = parsed.data; + } + } catch { + } + const writers = []; + let state = emptyTeamState(teamId); + let seq = 0; + let fromCheckpoint = false; + let corrupt; + if (doc !== void 0) { + const tail = raw2.subarray(doc.lastOffset); + const first = firstLineBytes(tail); + if (tail.length > 0 && first === void 0) { + checkpointIgnored = "checkpoint offset desync (tail not line-aligned) \u2014 full replay"; + } else if (first !== void 0 && JSON.parse(first.parsed).seq !== doc.lastSeq + 1) { + checkpointIgnored = "checkpoint offset desync (seq continuity broken) \u2014 full replay"; + } else { + state = doc.state; + seq = doc.lastSeq; + fromCheckpoint = true; + } + } + const startOffset = fromCheckpoint && doc !== void 0 ? doc.lastOffset : 0; + let offset = startOffset; + let consumeRest = true; + while (consumeRest && offset < raw2.length) { + const nl = raw2.indexOf(10, offset); + if (nl === -1) { + corrupt = { line: seq + 1, reason: "trailing partial line (no newline)" }; + state = withFailure(state, raw2.subarray(offset).toString("utf8")); + seq += 1; + consumeRest = false; + break; + } + const lineText = raw2.subarray(offset, nl).toString("utf8"); + const lineNo = seq + 1; + offset = nl + 1; + if (lineText.length === 0) { + corrupt = { line: lineNo, reason: "empty line" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + let parsed; + try { + parsed = JSON.parse(lineText); + } catch { + corrupt = { line: lineNo, reason: "invalid JSON" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + const line = parsed; + if (typeof line.writer === "string" && !writers.includes(line.writer)) writers.push(line.writer); + if (typeof parsed !== "object" || parsed === null || typeof parsed.seq !== "number" || !("event" in parsed) || parsed.seq !== lineNo) { + corrupt = { line: lineNo, reason: "line shape invalid or seq discontinuous" }; + state = withFailure(state, lineText); + seq = lineNo; + consumeRest = false; + break; + } + state = applyProjectionEvent(state, line.event); + seq = lineNo; + if (state.failure !== void 0) { + consumeRest = false; + } + } + return { + state, + view: teamProjectionView(state), + seq, + fromCheckpoint, + checkpointIgnored, + corrupt, + writers, + replayMs: Date.now() - startedAt + }; +} +function readBufferOrEmpty(file) { + try { + return fs5.readFileSync(file); + } catch { + return Buffer.alloc(0); + } +} +function firstLineBytes(buf) { + const nl = buf.indexOf(10); + const first = (nl === -1 ? buf : buf.subarray(0, nl)).toString("utf8"); + if (first.length === 0) return void 0; + try { + JSON.parse(first); + return { parsed: first }; + } catch { + return void 0; + } +} +function withFailure(state, rawLine) { + const m = rawLine.match(/"type"\s*:\s*"(team\/[A-Za-z/-]+)"/); + const type = m?.[1] ?? "stream"; + return { ...state, failure: `persisted Agent Teams ${type} payload is invalid` }; +} + +// src/provider/member-files.ts +import fs6 from "node:fs"; +import path6 from "node:path"; +function memberPaths(teamDir, memberId) { + const memberDir = path6.join(teamDir, "members", memberId); + const runDir = path6.join(memberDir, "run"); + return { + memberDir, + originFile: path6.join(memberDir, "origin.json"), + receiptsFile: path6.join(memberDir, "receipts.jsonl"), + stopBudgetFile: path6.join(memberDir, "stop-budget.json"), + runDir, + currentFile: path6.join(runDir, "current.json"), + drainMarkerFile: path6.join(runDir, "drain-requested.json"), + modelFailedFile: path6.join(memberDir, "model-failed.json") + }; +} +function writeJsonAtomic(file, value) { + fs6.mkdirSync(path6.dirname(file), { recursive: true, mode: 448 }); + const tmp = `${file}.tmp-${process.pid}-${Date.now()}`; + const fd = fs6.openSync(tmp, "w", 384); + try { + fs6.writeFileSync(fd, JSON.stringify(value, null, 2)); + fs6.fsyncSync(fd); + } finally { + fs6.closeSync(fd); + } + fs6.renameSync(tmp, file); +} +function readJson(file) { + let raw2; + try { + raw2 = fs6.readFileSync(file, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return void 0; + throw err; + } + return JSON.parse(raw2); +} +function appendReceipt(paths, receipt) { + fs6.mkdirSync(path6.dirname(paths.receiptsFile), { recursive: true, mode: 448 }); + const fd = fs6.openSync(paths.receiptsFile, "a", 384); + try { + fs6.writeFileSync(fd, JSON.stringify(receipt) + "\n"); + fs6.fsyncSync(fd); + } finally { + fs6.closeSync(fd); + } +} +function readReceipts(paths) { + let raw2; + try { + raw2 = fs6.readFileSync(paths.receiptsFile, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return []; + throw err; + } + const receipts = []; + for (const line of raw2.split("\n")) { + if (line.trim().length === 0) continue; + receipts.push(JSON.parse(line)); + } + return receipts; +} +function receiptMessageIds(paths) { + return new Set(readReceipts(paths).map((r) => r.messageId)); +} +function readStopBudget(paths) { + return readJson(paths.stopBudgetFile); +} +function writeStopBudget(paths, budget) { + writeJsonAtomic(paths.stopBudgetFile, budget); +} + +// src/provider/framing.ts +function renderFramed(framedJson) { + const blocks = JSON.parse(framedJson); + if (!Array.isArray(blocks) || blocks.length === 0) { + throw new Error("framed message must be a non-empty JSON array of content blocks"); + } + const header = blocks[0]; + if (header.type !== "text" || typeof header.text !== "string") { + throw new Error("framed message first block must be the text header"); + } + const m = header.text.match(/^Team message from (.+):$/); + if (m === null) { + throw new Error(`framed message header mismatch: ${JSON.stringify(header.text)}`); + } + const lines = [header.text]; + for (const block of blocks.slice(1)) { + if (block.type === "text" && typeof block.text === "string") { + lines.push(block.text); + } else { + lines.push(JSON.stringify(block)); + } + } + return { messageId: "", senderName: m[1], text: lines.join("\n") }; +} + +// src/hooks/inbox.ts +function resolveHookRole(args) { + const entry = args.registryEntry; + if (entry?.role === "teammate" && typeof entry.teamId === "string" && entry.teamId.length > 0) { + return { + role: "teammate", + teamId: entry.teamId, + name: typeof entry.name === "string" && entry.name.length > 0 ? entry.name : "teammate", + ...typeof entry.memberId === "string" && entry.memberId.length > 0 ? { memberId: entry.memberId } : {} + }; + } + const hint = parseSpawnIdentity(args.spawnIdentityEnv); + if (hint !== void 0) return { role: "teammate", teamId: hint.teamId, name: hint.name, memberId: hint.memberId, hint }; + return { role: "lead", teamId: args.sessionId, name: "lead" }; +} +function parseSpawnIdentity(raw2) { + if (raw2 === void 0 || raw2.trim().length === 0) return void 0; + try { + const parsed = JSON.parse(raw2); + if (typeof parsed.teamId === "string" && parsed.teamId.length > 0 && typeof parsed.memberId === "string" && parsed.memberId.length > 0 && typeof parsed.name === "string" && parsed.name.length > 0) { + return { teamId: parsed.teamId, memberId: parsed.memberId, name: parsed.name }; + } + } catch { + } + return void 0; +} +async function pendingForLead(teamDir, teamId) { + if (!fs7.existsSync(path7.join(teamDir, "events.jsonl"))) return []; + const loaded = await load(teamDir, teamId); + if (loaded.state.failure !== void 0) return []; + const delivered = new Set(loaded.state.delivered); + const receipted = receiptMessageIds(memberPaths(teamDir, teamId)); + const pending = []; + for (const message of loaded.state.messages) { + if (message.targetId !== teamId || delivered.has(message.id) || receipted.has(message.id)) continue; + const framed = [ + { type: "text", text: `Team message from ${message.senderName}:` }, + ...message.content + ]; + pending.push({ + messageId: message.id, + senderName: message.senderName, + text: renderFramed(JSON.stringify(framed)).text + }); + } + return pending; +} +function buildStopReason(texts) { + return `[agent-team inbox] \u65B0\u6D88\u606F\u5230\u8FBE\uFF0C\u672C\u8F6E\u7ED3\u675F\u540E\u9700\u5904\u7406\uFF1A +${texts.join("\n\n")}`; +} +function buildInboxContext(texts) { + return `[agent-team inbox] \u5F85\u6536\u6D88\u606F ${texts.length} \u6761\uFF1A +${texts.join("\n\n")}`; +} +function writeReceipts(dataRoot, teamId, messageIds, channel) { + const paths = memberPaths(teamPaths(dataRoot, teamId).teamDir, teamId); + for (const messageId of messageIds) { + appendReceipt(paths, { messageId, channel, ts: (/* @__PURE__ */ new Date()).toISOString() }); + } +} +function runKeyFor(stopHookActive) { + return stopHookActive ? "continuation" : "fresh-run"; +} +function effectiveBlocks(state, runKey) { + if (runKey === "fresh-run") return 0; + return state?.blocks ?? 0; +} +function budgetAllows(state, runKey) { + return effectiveBlocks(state, runKey) < 3; +} +function nextBudget(state, runKey) { + return { runKey, blocks: effectiveBlocks(state, runKey) + 1 }; +} + +// src/provider/lead-wake.ts +import fs8 from "node:fs"; +import path9 from "node:path"; + +// src/provider/procgroup.ts +import path8 from "node:path"; +import { fileURLToPath } from "node:url"; +var HELPER_DEFAULT = path8.join(path8.dirname(fileURLToPath(import.meta.url)), "detach-helper.mjs"); + +// src/provider/lead-wake.ts +function leadDir(teamDir) { + return path9.join(teamDir, "lead"); +} +function leadStatePath(teamDir) { + return path9.join(leadDir(teamDir), "state.json"); +} +function readLeadState(teamDir) { + try { + const parsed = JSON.parse(fs8.readFileSync(leadStatePath(teamDir), "utf8")); + if (typeof parsed.active !== "boolean" || typeof parsed.updatedAt !== "string") return void 0; + return parsed; + } catch { + return void 0; + } +} +function writeLeadState(teamDir, state) { + const dir = leadDir(teamDir); + fs8.mkdirSync(dir, { recursive: true }); + const file = leadStatePath(teamDir); + const tmp = `${file}.tmp-${process.pid}`; + const fd = fs8.openSync(tmp, "w", 384); + try { + fs8.writeFileSync(fd, JSON.stringify(state, null, 2)); + fs8.fsyncSync(fd); + } finally { + fs8.closeSync(fd); + } + fs8.renameSync(tmp, file); +} +function recordLeadTurnEvent(teamDir, event2, now = Date.now()) { + try { + const prior = readLeadState(teamDir); + writeLeadState(teamDir, { + ...prior?.lastWakeAt !== void 0 ? { lastWakeAt: prior.lastWakeAt } : {}, + active: event2 === "start", + updatedAt: new Date(now).toISOString() + }); + } catch { + } +} + +// src/hooks.ts +function readStdin() { + try { + return fs9.readFileSync(0, "utf8"); + } catch { + return ""; + } +} +var raw = readStdin(); +var input = {}; +try { + input = raw ? JSON.parse(raw) : {}; +} catch { + input = { parse_error: true, raw_preview: raw.slice(0, 500) }; +} +var DATA = dataDir(); +ensureDir(path10.join(DATA, "logs")); +var event = (input.hook_event_name ?? process.env.ZCODE_HOOK_EVENT ?? "unknown").toLowerCase(); +var envOverlay = {}; +for (const k of Object.keys(process.env)) { + if (k.startsWith("ZCODE_") || k.startsWith("CLAUDE_") || k.startsWith("TEAM_")) { + envOverlay[k] = isSensitiveEnvKey(k) ? "" : process.env[k]; + } +} +var rawSessionId = input.session_id ?? process.env.ZCODE_SESSION_ID ?? process.env.CLAUDE_SESSION_ID ?? null; +var promptText = input.prompt ? String(input.prompt) : null; +var logLine = { + ts: ts(), + event, + input_session_id: input.session_id ?? null, + env_session_id: process.env.ZCODE_SESSION_ID ?? process.env.CLAUDE_SESSION_ID ?? null, + env_overlay: envOverlay, + cwd: input.cwd ?? process.cwd(), + stop_hook_active: input.stop_hook_active ?? null, + // 不落 prompt 原文(可能含私有任务/代码);只记长度供排障。 + prompt_chars: promptText !== null ? promptText.length : null, + source: input.source ?? null +}; +appendJsonl(path10.join(DATA, "logs", "hooks.jsonl"), logLine); +var registry = readSessionRegistry(DATA); +var sessionKey = rawSessionId !== null ? safeSessionKey(rawSessionId) : ""; +var selfEntry = rawSessionId !== null ? registry[sessionKey] : void 0; +var role = resolveHookRole({ + registryEntry: selfEntry, + spawnIdentityEnv: process.env.TEAM_SPAWN_IDENTITY, + sessionId: rawSessionId ?? "" +}); +function out(obj) { + return new Promise((resolve) => { + process.stdout.write(JSON.stringify(obj), () => resolve()); + }); +} +async function ackCoordinator(method, params) { + if (rawSessionId === null) return; + const teamDir = safeTeamDir(role.teamId); + if (teamDir === null) return; + await callCoordinator(teamDir, role.teamId, method, params, { timeoutMs: 2e3, connectTimeoutMs: 500 }).catch( + () => void 0 + ); +} +function safeTeamDir(teamId) { + if (!/^[A-Za-z0-9._-]+$/.test(teamId) || teamId === "." || teamId === "..") return null; + const { teamDir } = teamPaths(DATA, teamId); + try { + assertPathInside(path10.join(DATA, "teams"), teamDir); + } catch { + return null; + } + return teamDir; +} +async function boundedAck(method, params) { + await Promise.race([ + ackCoordinator(method, params), + new Promise((resolve) => setTimeout(resolve, 500)) + ]); +} +if (event === "sessionstart") { + if (rawSessionId !== null) { + const claim = role.role === "teammate" ? { + teamId: role.teamId, + role: "teammate", + name: role.name, + ...role.memberId !== void 0 ? { memberId: role.memberId } : {} + } : {}; + upsertSessionEntry(DATA, rawSessionId, { + ...selfEntry?.firstSeen === void 0 ? { firstSeen: ts() } : {}, + lastSeen: ts(), + event, + cwd: logLine.cwd, + hookRegistered: true, + ...claim + }); + } + const identityText = role.role === "teammate" ? identityTeammateText(role.name) : IDENTITY_LEAD_TEXT; + const runtimeConfig = readRuntimeConfig(); + const interrupt = process.env.TEAM_INTERRUPT !== void 0 ? process.env.TEAM_INTERRUPT !== "false" : runtimeConfig?.interrupt ?? true; + const leadMode = validateLeadMode( + process.env.TEAM_LEAD_MODE !== void 0 ? process.env.TEAM_LEAD_MODE : readHostLeadModeOverride() ?? runtimeConfig?.leadMode + ); + let context = buildSessionStartContext(identityText, interrupt, role.role === "lead" ? leadMode : void 0); + let pending = []; + if (role.role === "lead" && rawSessionId !== null) { + const teamDir = safeTeamDir(role.teamId); + if (teamDir !== null) { + recordLeadTurnEvent(teamDir, "start"); + pending = await pendingForLead(teamDir, role.teamId); + if (pending.length > 0) { + context += ` +${buildInboxContext(pending.map((m) => m.text))}`; + } + } + } + await out({ + hookSpecificOutput: { + hookEventName: "SessionStart", + additionalContext: context + } + }); + if (role.role === "lead" && rawSessionId !== null) { + if (pending.length > 0) { + writeReceipts(DATA, role.teamId, pending.map((m) => m.messageId), "sessionstart"); + await boundedAck("mailbox.ack", { session_id: rawSessionId, messageIds: pending.map((m) => m.messageId) }); + } + if (input.source === "resume") void ackCoordinator("admin.reconcile", { session_id: rawSessionId }); + } +} else if (event === "userpromptsubmit") { + if (role.role === "lead" && rawSessionId !== null) { + const teamDir = safeTeamDir(role.teamId); + if (teamDir !== null) { + recordLeadTurnEvent(teamDir, "start"); + const pending = await pendingForLead(teamDir, role.teamId); + if (pending.length > 0) { + await out({ + hookSpecificOutput: { + hookEventName: "UserPromptSubmit", + additionalContext: buildInboxContext(pending.map((m) => m.text)) + } + }); + writeReceipts(DATA, role.teamId, pending.map((m) => m.messageId), "userpromptsubmit"); + await boundedAck("mailbox.ack", { session_id: rawSessionId, messageIds: pending.map((m) => m.messageId) }); + } + } + } +} else if (event === "stop") { + if (role.role === "lead" && rawSessionId !== null) { + const teamDir = safeTeamDir(role.teamId); + if (teamDir !== null) { + recordLeadTurnEvent(teamDir, "stop"); + const pending = await pendingForLead(teamDir, role.teamId); + if (pending.length > 0) { + const runKey = runKeyFor(input.stop_hook_active); + const budgetPaths = memberPaths(teamDir, role.teamId); + const state = readStopBudget(budgetPaths); + if (budgetAllows(state, runKey)) { + writeStopBudget(budgetPaths, nextBudget(state, runKey)); + await out({ + decision: "block", + reason: buildStopReason(pending.map((m) => m.text)) + }); + writeReceipts(DATA, role.teamId, pending.map((m) => m.messageId), "stop"); + await boundedAck("mailbox.ack", { session_id: rawSessionId, messageIds: pending.map((m) => m.messageId) }); + } + } + } + } +} +process.exitCode = 0; diff --git a/external_plugins/agent-team/runtime/ui/companion.js b/external_plugins/agent-team/runtime/ui/companion.js new file mode 100644 index 00000000..a7b9a55b --- /dev/null +++ b/external_plugins/agent-team/runtime/ui/companion.js @@ -0,0 +1,1092 @@ +"use strict"; +(() => { + // src/ui-core/tokens.ts + var TOKEN_CSS = ` +:root, [data-theme="light"] { + color-scheme: light; + /* \u6587\u5B57\u56DB\u6863\uFF08dsw label-primary/secondary/tertiary/caption\uFF1B + caption \u65E0\u72EC\u7ACB\u5BBF\u4E3B\u53D8\u91CF \u2192 tertiary \u540C\u6863 + \u5B57\u9762\u515C\u5E95\u533A\u5206\uFF09 */ + --at-label-primary: var(--color-text-primary, var(--foreground, #1a2233)); + --at-label-secondary: var(--color-text-secondary, var(--muted-foreground, #3d4a5c)); + --at-label-tertiary: var(--color-text-tertiary, var(--muted-foreground, #8a94a6)); + --at-label-caption: var(--color-text-tertiary, #9aa3b2); + /* \u80CC\u666F\u4E24\u6863\uFF08dsw specific-menu / bg-layer-2\uFF09 */ + --at-bg-menu: var(--color-background-secondary, var(--muted, #f7f8fa)); + --at-bg-layer-2: var(--color-background-primary, var(--card, #ffffff)); + /* \u63CF\u8FB9\u4E09\u6863\uFF08dsw border-l1/l2/l3\uFF1B\u5BBF\u4E3B\u5355\u6863 --border \u2192 \u4E09\u6863\u900F\u660E\u5EA6\u6D3E\u751F\uFF09 */ + --at-border-l1: var(--color-border-primary, var(--border, rgba(16, 24, 40, 0.08))); + --at-border-l2: var(--color-border-tertiary, var(--border, #e3e6eb)); + --at-border-l3: var(--color-border-secondary, var(--border, #c9cfd8)); + /* \u72B6\u6001\u70B9\u4E94\u7C7B\u8272\uFF08ongoing/idle/done/warning \u2192 --green/\u7070/--blue/--yellow \u6216\u81EA\u7ED8\uFF09 */ + --at-state-ongoing: var(--color-text-success, var(--green, #12a675)); + --at-state-error: var(--color-text-danger, var(--red, #e5484d)); + --at-state-idle: var(--color-text-disabled, #98a2b3); + --at-state-warning: var(--color-text-warning, var(--yellow, #f59e0b)); + --at-state-done: var(--color-text-info, var(--blue, #3e7bfa)); + /* \u4E1A\u52A1\u4E3B\u8272\uFF08dsw state-business-primary\uFF1A\u5F53\u524D\u4F1A\u8BDD\u9AD8\u4EAE/info Tag\uFF09 */ + --at-business: var(--color-text-info, var(--primary, #3e7bfa)); + /* \u9519\u8BEF\u6587\u672C\uFF08dsw state-error-primary\uFF09 */ + --at-error-text: var(--color-text-danger, var(--red, var(--destructive, #d93036))); + /* advisory \u8B66\u544A\u6587\u672C\u8272\uFF08\u6DF1\u7425\u73C0\u4FDD\u8BC1 11px \u5C0F\u5B57\u5BF9\u6BD4\u5EA6\uFF09 */ + --at-warning-text: var(--color-text-warning, var(--yellow, #b45309)); + /* \u9634\u5F71\u4E24\u6863\uFF08dsw elevation-prominent / elevation-panel\uFF09 */ + --at-shadow-prominent: var(--shadow-lg, 0 8px 28px rgba(16, 24, 40, 0.16)); + --at-shadow-panel: var(--shadow-md, 0 4px 16px rgba(16, 24, 40, 0.12)); + /* \u6EDA\u52A8\u6761\uFF08dsh scrollbar \u4EE4\u724C\u81EA\u7ED8\uFF09 */ + --at-scrollbar-thumb: color-mix(in srgb, var(--at-label-tertiary) 40%, transparent); + --at-scrollbar-thumb-hover: color-mix(in srgb, var(--at-label-tertiary) 60%, transparent); + /* \u5B57\u4F53\uFF08\u4E0D\u5F15\u5916\u90E8\u5B57\u4F53\uFF0C\u8DDF\u968F\u5BBF\u4E3B UI \u5B57\u4F53\u6808\uFF09 */ + --at-font: var(--font-sans, -apple-system, "PingFang SC", "Segoe UI", sans-serif); +} +[data-theme="dark"] { + color-scheme: dark; + --at-label-primary: var(--color-text-primary, var(--foreground, #e8eaf0)); + --at-label-secondary: var(--color-text-secondary, var(--muted-foreground, #c0c6d2)); + --at-label-tertiary: var(--color-text-tertiary, var(--muted-foreground, #8d95a3)); + --at-label-caption: var(--color-text-tertiary, #7d8593); + --at-bg-menu: var(--color-background-secondary, var(--muted, #1b1e24)); + --at-bg-layer-2: var(--color-background-primary, var(--card, #23262d)); + --at-border-l1: var(--color-border-primary, var(--border, rgba(255, 255, 255, 0.08))); + --at-border-l2: var(--color-border-tertiary, var(--border, #333842)); + --at-border-l3: var(--color-border-secondary, var(--border, #434a56)); + --at-state-ongoing: var(--color-text-success, var(--green, #2fbf8f)); + --at-state-error: var(--color-text-danger, var(--red, #ff6b6e)); + --at-state-idle: var(--color-text-disabled, #7d8593); + --at-state-warning: var(--color-text-warning, var(--yellow, #ffb454)); + --at-state-done: var(--color-text-info, var(--blue, #6c9cff)); + --at-business: var(--color-text-info, var(--primary, #6c9cff)); + --at-error-text: var(--color-text-danger, var(--red, var(--destructive, #ff8a8d))); + /* advisory \u8B66\u544A\u6587\u672C\u8272 */ + --at-warning-text: var(--color-text-warning, var(--yellow, #ffb454)); + --at-shadow-prominent: var(--shadow-lg, 0 8px 28px rgba(0, 0, 0, 0.5)); + --at-shadow-panel: var(--shadow-md, 0 4px 16px rgba(0, 0, 0, 0.4)); +} +`; + + // src/ui-core/css.ts + var COMPONENT_CSS = ` +${TOKEN_CSS} +* { box-sizing: border-box; } +.at-root { + font-family: var(--at-font); + font-size: 13px; + line-height: 1.5; + color: var(--at-label-primary); + width: 100%; +} +/* \xA710.3 \u9762\u677F\uFF1A\u5BBD min(500px, \u5BB9\u5668\u221232px)\uFF1B\u7D27\u51D1 min(320px,\u2026)\uFF1B\u6700\u5927\u9AD8 min(680px, \u89C6\u53E3\u221232px)\uFF1B + \u5706\u89D2 12\uFF1Bpadding 8px 2px 0\uFF1Bflex column\uFF1Boverflow hidden\uFF1Belevation-prominent \u9634\u5F71\uFF1B + border-l1 \u63CF\u8FB9\uFF08stroke \u7B49\u4EF7\uFF0C\u65E0 border\uFF09 */ +.team-panel { + width: min(500px, 100% - 32px); + max-height: min(680px, 100vh - 32px); + border-radius: 12px; + box-shadow: var(--at-shadow-prominent); + outline: 0.5px solid var(--at-border-l1); + background: var(--at-bg-menu); + padding: 8px 2px 0; + display: flex; + flex-direction: column; + overflow: hidden; + position: relative; +} +.team-panel.compact { width: min(320px, 100% - 32px); } +/* \xA710.3 body\uFF1Aoverflow-y auto\uFF1Bscrollbar-gutter stable\uFF1Bpadding 0 9px 16px 14px */ +.panel-body { + overflow-y: auto; + scrollbar-gutter: stable; + padding: 0 9px 16px 14px; + flex: auto; + min-height: 0; + scrollbar-color: var(--at-scrollbar-thumb) transparent; +} +.panel-body::-webkit-scrollbar { width: 8px; } +.panel-body::-webkit-scrollbar-thumb { + background: var(--at-scrollbar-thumb); + border-radius: 4px; +} +.panel-body::-webkit-scrollbar-thumb:hover { background: var(--at-scrollbar-thumb-hover); } +/* \xA710.5 \u8282\u6807\u9898\uFF1A13px/500\uFF0Cmargin 16px 0 8px 4px\uFF08\u9996\u8282 top 8px\uFF09\uFF0Cgap 8\uFF1B + count 12px/16px tabular-nums caption \u8272 */ +.panel-body h3 { + font-size: 13px; + font-weight: 500; + color: var(--at-label-primary); + margin: 16px 0 8px 4px; + display: flex; + align-items: center; + gap: 8px; +} +.panel-body section:first-of-type h3 { margin-top: 8px; } +h3 .count { + font-size: 12px; + line-height: 16px; + font-weight: 400; + color: var(--at-label-caption); + font-variant-numeric: tabular-nums; +} +/* \xA710.5 \u82B1\u540D\u518C\u7F51\u683C\uFF1A\u53CC\u5217 minmax(0,1fr) gap 8\uFF1B\u7D27\u51D1\u5355\u5217 */ +.roster { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } +.compact .roster { grid-template-columns: minmax(0, 1fr); } +/* \xA710.5 \u6210\u5458\u5361\uFF1A\u5706\u89D2 8\uFF1Bpadding 10px 12px\uFF1Bgap 8\uFF1Bbg-layer-2\uFF1B\u63CF\u8FB9 border-l2\uFF08stroke \u7B49\u4EF7\uFF09\uFF1B + \u6587\u5B57\u5DE6\u5BF9\u9F50\uFF1Bflex \u9876\u5BF9\u9F50\uFF1Bhover\uFF08\u975E\u7981\u7528\uFF09border-l3 + elevation-panel\uFF1Bdisabled cursor default */ +.member { + border-radius: 8px; + padding: 10px 12px; + gap: 8px; + background: var(--at-bg-layer-2); + box-shadow: 0 0 0 0.5px var(--at-border-l2); + border: none; + text-align: left; + display: flex; + align-items: flex-start; + font: inherit; + color: inherit; + min-width: 0; + cursor: pointer; +} +.member:disabled { cursor: default; } +.member:not(:disabled):hover, +.member:not(:disabled):focus-visible { + box-shadow: 0 0 0 0.5px var(--at-border-l3), var(--at-shadow-panel); +} +/* \u5F53\u524D\u4F1A\u8BDD\u9AD8\u4EAE\uFF08\u4EC5 members>1\uFF09\uFF1Abusiness 40% \u6DF7\u8272\u63CF\u8FB9 + inset 1px \u5185\u73AF */ +.member.current { + box-shadow: 0 0 0 0.5px color-mix(in srgb, var(--at-business) 40%, transparent), + inset 0 0 0 1px color-mix(in srgb, var(--at-business) 40%, transparent); +} +/* \u540D\u5B57/\u6B21\u884C\u6587\u672C\u5217\uFF08\xA710.5 memberText\uFF1Acolumn\uFF0Cmin-width 0 \u4F9B ellipsis\uFF09 */ +.member .member-text { display: flex; flex-direction: column; min-width: 0; gap: 2px; } +.member .row1 { display: inline-flex; align-items: center; gap: 5px; min-width: 0; max-width: 100%; } +/* \u72B6\u6001\u70B9\u5BB9\u5668\uFF1A1lh \u9AD8\u5782\u76F4\u5BF9\u9F50\uFF08\xA710.5 memberDot\uFF09 */ +.member-dot { flex: none; align-items: center; height: 1lh; display: inline-flex; } +.member .name { + font-weight: 500; + color: var(--at-label-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + min-width: 0; +} +.member .sub { + font-size: 11px; + color: var(--at-label-tertiary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} +/* hover/focus \u624D\u663E\u793A\u300C \xB7 \u6A21\u578B: model\u300D\uFF08\xA710.5/V06\uFF09 */ +.member .model { display: none; } +.member:hover .model, +.member:focus-visible .model { display: inline; } +.member .diagnostic { + font-size: 11px; + color: var(--at-error-text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} +/* \u5F53\u524D\u4F1A\u8BDD Tag\uFF0810px/15px\uFF0Cpadding 0 4px\uFF0Cinfo tone\uFF09 */ +.current-tag { + font-size: 10px; + line-height: 15px; + padding: 0 4px; + border-radius: 4px; + background: color-mix(in srgb, var(--at-business) 16%, transparent); + color: var(--at-business); + flex: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +/* 0.4.0 \u6CE8\u9500\u6210\u5458\u5361/\u9F7F\u8F6E\u4E0E\u8BBE\u7F6E\u5F39\u7A97\u6837\u5F0F\uFF08member-card\u3001member-gear\u3001settings \u7CFB\u5217\u3001 + source-badge\u3001modal-select\uFF09\uFF1A\u6210\u5458\u6A21\u578B\u552F\u4E00\u8DEF\u7EBF = \u6BCF\u8F6E\u8DDF\u968F Lead\uFF0C\u9762\u677F\u6062\u590D\u96F6\u53D8\u66F4\u901A\u9053\u3002 */ +/* \u72B6\u6001\u70B9\uFF1A\u76F4\u5F84\u4E00\u81F4 8px\uFF08V06\uFF09 */ +.dot { width: 8px; height: 8px; border-radius: 50%; flex: none; display: inline-block; } +.dot.ongoing { background: var(--at-state-ongoing); } +.dot.error { background: var(--at-state-error); } +.dot.idle { background: var(--at-state-idle); } +.dot.warning { background: var(--at-state-warning); } +.dot.done { background: var(--at-state-done); } +/* inactive \u4EBA\u5F62\u56FE\u6807\uFF1A14px tertiary\uFF08\xA710.5/V06\uFF09 */ +.icon-user { width: 14px; height: 14px; flex: none; color: var(--at-label-tertiary); display: inline-flex; } +/* \xA710.4 \u901A\u77E5\u6761\uFF1Aflex gap 6 padding 9 \u5B57\u53F7 12\uFF1Berror = \u9519\u8BEF\u8272\uFF1B\u6309\u5E8F\u6E32\u67D3 */ +.notice, .error-bar { + display: flex; + align-items: center; + gap: 6px; + padding: 9px; + font-size: 12px; +} +.error-bar { color: var(--at-error-text); } +.notice { color: var(--at-label-secondary); } +/* \xA710.6 \u4EFB\u52A1\u677F\uFF1A\u7A7A\u677F\u6BB5\u843D 12px tertiary margin 16px 0 0 4px\uFF1B\u5217\u8868 flex column gap 7 */ +.empty-notice { font-size: 12px; color: var(--at-label-tertiary); margin: 16px 0 0 4px; } +.tasks { display: flex; flex-direction: column; gap: 7px; } +/* \u4EFB\u52A1\u5361\uFF1Aborder 0.5px border-l2\uFF1B\u5706\u89D2 9\uFF1Bpadding 11px 13px\uFF1Bbg-layer-2 */ +article.task { + border: 0.5px solid var(--at-border-l2); + border-radius: 9px; + padding: 11px 13px; + background: var(--at-bg-layer-2); +} +.task .title-row { display: flex; align-items: center; gap: 8px; } +.task strong { font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--at-label-primary); } +/* \u72B6\u6001\u5FBD\u6807\u53F3\u5BF9\u9F50 11px gap 6 */ +.task .task-state { + margin-left: auto; + font-size: 11px; + color: var(--at-label-tertiary); + display: inline-flex; + align-items: center; + gap: 6px; + flex: none; +} +/* \u63CF\u8FF0 12px/18px pre-wrap margin 5px 0\uFF1B\u4E24\u884C\u622A\u65AD */ +.task p { + font-size: 12px; + line-height: 18px; + color: var(--at-label-secondary); + white-space: pre-wrap; + margin: 5px 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} +.task p.expanded { -webkit-line-clamp: unset; display: block; } +/* \u5C55\u5F00\u5F00\u5173\uFF1Afloat right\uFF1B11px/20px\uFF1Bchevron 12px \u65CB\u8F6C 180\xB0 transition .12s */ +.expand-toggle { + float: right; + font-size: 11px; + line-height: 20px; + color: var(--at-label-tertiary); + background: none; + border: none; + cursor: pointer; + padding: 0; + margin-left: 10px; + font-family: inherit; + display: inline-flex; + align-items: center; + gap: 2px; +} +.expand-toggle:hover, .expand-toggle:focus-visible { color: var(--at-label-primary); } +.expand-toggle svg { transition: transform 0.12s; } +.expand-toggle.open svg { transform: rotate(180deg); } +.expand-toggle[hidden] { display: none; } +/* meta \u884C\uFF1A11px/20px\uFF1B\u5B50\u9879\u95F4\u8DDD 10px\uFF1Bwarning \u63D0\u9192\u8272\uFF08advisory \u975E\u9519\u8BEF\uFF09 */ +.task .meta { font-size: 11px; line-height: 20px; color: var(--at-label-tertiary); } +.task .meta > span { margin-right: 10px; } +.task .meta .warning { color: var(--at-warning-text); } +/* T5.7 \u6210\u5458\u4F1A\u8BDD\u67E5\u770B\u89C6\u56FE\uFF08V16\uFF1A\u65E0 DSH \u53C2\u7167\uFF0C\u5BBF\u4E3B\u98CE\u683C\uFF1B\u5224\u636E=\u4E0D\u7834\u7248+\u51E0\u4F55\u4E00\u81F4\uFF09 */ +.detail-view { display: flex; flex-direction: column; min-height: 0; flex: auto; } +.detail-head { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 9px 8px 6px; + border-bottom: 0.5px solid var(--at-border-l2); + flex: none; +} +.detail-back { + display: inline-flex; + align-items: center; + gap: 4px; + background: none; + border: none; + color: var(--at-label-tertiary); + font: inherit; + font-size: 12px; + cursor: pointer; + padding: 2px 6px; + border-radius: 6px; +} +.detail-back:hover, .detail-back:focus-visible { color: var(--at-label-primary); background: color-mix(in srgb, var(--at-label-tertiary) 10%, transparent); } +.detail-title { font-size: 13px; font-weight: 500; color: var(--at-label-primary); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.detail-actions { margin-left: auto; display: inline-flex; gap: 6px; flex: none; } +.detail-action { + background: none; + border: 0.5px solid var(--at-border-l2); + border-radius: 6px; + color: var(--at-label-secondary); + font: inherit; + font-size: 11px; + line-height: 18px; + padding: 1px 8px; + cursor: pointer; +} +.detail-action:hover, .detail-action:focus-visible { color: var(--at-label-primary); border-color: var(--at-border-l3); } +.detail-list { overflow-y: auto; scrollbar-gutter: stable; padding: 8px 9px 16px 14px; flex: auto; min-height: 0; scrollbar-color: var(--at-scrollbar-thumb) transparent; } +.detail-state { font-size: 12px; color: var(--at-label-tertiary); padding: 16px 4px; display: flex; align-items: center; gap: 6px; } +.detail-state.error { color: var(--at-error-text); } +.msg { margin: 0 0 10px; min-width: 0; } +.msg-head { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--at-label-tertiary); margin-bottom: 2px; } +.msg-role { font-weight: 500; color: var(--at-label-secondary); } +.msg-time { font-variant-numeric: tabular-nums; } +.msg-text { + font-size: 12px; + line-height: 18px; + color: var(--at-label-primary); + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: anywhere; +} +.msg.user .msg-text { color: var(--at-label-secondary); } +.msg-badge { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 10px; + line-height: 15px; + padding: 0 4px; + border-radius: 4px; + background: color-mix(in srgb, var(--at-business) 16%, transparent); + color: var(--at-business); +} +.msg-badge.hook { background: color-mix(in srgb, var(--at-label-tertiary) 14%, transparent); color: var(--at-label-tertiary); } +.tool-row { display: block; width: 100%; text-align: left; background: none; border: none; border-top: 0.5px solid var(--at-border-l2); padding: 4px 0; margin-top: 4px; font: inherit; cursor: pointer; color: var(--at-label-tertiary); } +.tool-row:hover, .tool-row:focus-visible { color: var(--at-label-primary); } +.tool-static { display: block; border-top: 0.5px solid var(--at-border-l2); padding: 4px 0; margin-top: 4px; color: var(--at-label-tertiary); } +.tool-row .tool-summary, .tool-static .tool-summary { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; line-height: 20px; } +.tool-row .tool-name, .tool-static .tool-name { font-weight: 500; color: var(--at-label-secondary); } +.tool-row svg { transition: transform 0.12s; } +.tool-row.open svg { transform: rotate(180deg); } +.tool-detail { + display: none; + font-size: 11px; + line-height: 16px; + color: var(--at-label-tertiary); + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: anywhere; + max-height: 200px; + overflow-y: auto; + margin: 2px 0 0 18px; +} +.tool-row.open + .tool-detail { display: block; } +/* toolGroup\uFF1A\u6309\u8F6E\u52A8\u4F5C\u7EC4\uFF08\u5934\u90E8\u4E00\u884C\u6C47\u603B\uFF1B\u5C55\u5F00\u9010\u6761\u5DE5\u5177\u884C\uFF0C\u7F29\u8FDB\u5BF9\u9F50 tool-detail\uFF09 */ +.tool-group-head { + display: flex; + align-items: center; + gap: 6px; + width: 100%; + text-align: left; + background: none; + border: none; + border-top: 0.5px solid var(--at-border-l2); + padding: 4px 0; + margin-top: 4px; + font: inherit; + color: var(--at-label-tertiary); + cursor: pointer; +} +.tool-group-head:hover, .tool-group-head:focus-visible { color: var(--at-label-primary); } +.tool-group-head .tool-group-label { font-size: 11px; line-height: 20px; color: var(--at-label-secondary); } +.tool-group-head:hover .tool-group-label, +.tool-group-head:focus-visible .tool-group-label { color: var(--at-label-primary); } +.tool-group-head svg { flex: none; transition: transform 0.12s; } +.tool-group.open .tool-group-head svg { transform: rotate(180deg); } +.tool-group-items { display: none; margin-left: 18px; } +.tool-group.open .tool-group-items { display: block; } +.tool-group-items > :first-child { border-top: none; } +.detail-pager { display: flex; align-items: center; gap: 8px; padding: 4px 0 8px; } +.detail-pager .detail-action[disabled] { opacity: 0.45; cursor: default; } +`; + + // src/ui-core/dict.ts + var DICT = { + zh: { + trigger: "\u667A\u80FD\u4F53\u56E2\u961F", + loading: "\u6B63\u5728\u52A0\u8F7D\u56E2\u961F\u2026", + unavailable: "Team \u6682\u4E0D\u53EF\u7528", + failure: "\u56E2\u961F\u6301\u4E45\u8BB0\u5F55\u65E0\u6548\uFF1A{message}", + empty: "\u6682\u65E0\u5171\u4EAB\u4EFB\u52A1\uFF0C\u53EF\u4EE5\u901A\u8FC7\u5BF9\u8BDD\u521B\u5EFA", + roster: "\u6210\u5458", + tasks: "\u5171\u4EAB\u4EFB\u52A1", + model: "\u6A21\u578B", + open: "\u6253\u5F00\u6210\u5458\u4F1A\u8BDD", + current: "\u5F53\u524D\u4F1A\u8BDD", + owner: "Owner", + unowned: "\u672A\u5206\u914D", + blockedBy: "\u4F9D\u8D56", + writeScopes: "\u5199\u5165\u8303\u56F4", + ready: "\u53EF\u5F00\u59CB", + blocked: "\u88AB\u4F9D\u8D56\u963B\u585E", + "task.expand": "\u5C55\u5F00", + "task.collapse": "\u6536\u8D77", + "memberStatus.running": "\u8FD0\u884C\u4E2D", + "memberStatus.inactive": "\u672A\u8FD0\u884C", + "memberStatus.provisioning": "\u51C6\u5907\u4E2D", + "memberStatus.failed": "\u5931\u8D25", + "status.pending": "\u5F85\u5904\u7406", + "status.in_progress": "\u8FDB\u884C\u4E2D", + "status.completed": "\u5DF2\u5B8C\u6210" + }, + en: { + trigger: "Agent Team", + loading: "Loading Team\u2026", + unavailable: "Team is unavailable", + failure: "Invalid persisted Team record: {message}", + empty: "No shared tasks yet. Create them through the conversation.", + roster: "Members", + tasks: "Shared tasks", + model: "Model", + open: "Open member conversation", + current: "Current chat", + owner: "Owner", + unowned: "Unowned", + blockedBy: "Blocked by", + writeScopes: "Write scopes", + ready: "Ready", + blocked: "Blocked by dependencies", + "task.expand": "Show more", + "task.collapse": "Show less", + "memberStatus.running": "Running", + "memberStatus.inactive": "Inactive", + "memberStatus.provisioning": "Provisioning", + "memberStatus.failed": "Failed", + "status.pending": "Pending", + "status.in_progress": "In progress", + "status.completed": "Completed" + } + }; + var DETAIL_DICT = { + zh: { + "detail.back": "\u8FD4\u56DE", + "detail.title": "\u6210\u5458\u4F1A\u8BDD", + "detail.loading": "\u6B63\u5728\u52A0\u8F7D\u4F1A\u8BDD\u2026", + "detail.empty": "\u8BE5\u6210\u5458\u6682\u65E0\u4F1A\u8BDD\u6D88\u606F", + "detail.failed": "\u4F1A\u8BDD\u8BFB\u53D6\u5931\u8D25\uFF1A{message}", + "detail.refresh": "\u5237\u65B0", + "detail.copySessionId": "\u590D\u5236\u4F1A\u8BDD id", + "detail.copied": "\u5DF2\u590D\u5236", + "detail.earlier": "\u66F4\u65E9\u6D88\u606F", + "detail.wake": "\u8BF7\u6C42 Lead \u5524\u9192\u8BE5\u6210\u5458", + "detail.wakeInjected": "\u5DF2\u6CE8\u5165\u4E0B\u4E00\u8F6E\uFF1A\u8BF7\u6C42\u5524\u9192 {name}", + "detail.framedFrom": "Team \u6D88\u606F \xB7 \u6765\u81EA {name}", + "detail.hookBadge": "hook \u6CE8\u5165", + "detail.toolCall": "\u5DE5\u5177\u8C03\u7528", + "detail.noSession": "\u4F1A\u8BDD id \u672A\u843D\u5B9A\uFF08\u6210\u5458\u53EF\u80FD\u5C1A\u5728\u51C6\u5907\u4E2D\uFF09", + "detail.you": "\u6211", + "detail.count": "{n} \u6761", + "detail.toolGroup": "{n} \u4E2A\u52A8\u4F5C \xB7 {list}", + "detail.countSummary": "{n} \u6761 \xB7 \u5171 {sourceTotal} \u6761\u8F6C\u5F55" + }, + en: { + "detail.back": "Back", + "detail.title": "Member conversation", + "detail.loading": "Loading conversation\u2026", + "detail.empty": "No conversation messages for this member yet", + "detail.failed": "Conversation read failed: {message}", + "detail.refresh": "Refresh", + "detail.copySessionId": "Copy session id", + "detail.copied": "Copied", + "detail.earlier": "Earlier messages", + "detail.wake": "Ask Lead to wake this member", + "detail.wakeInjected": "Injected for next turn: wake request for {name}", + "detail.framedFrom": "Team message \xB7 from {name}", + "detail.hookBadge": "hook injected", + "detail.toolCall": "Tool call", + "detail.noSession": "Session id not settled yet (member may still be provisioning)", + "detail.you": "me", + "detail.count": "{n} items", + "detail.toolGroup": "{n} actions \xB7 {list}", + "detail.countSummary": "{n} items \xB7 of {sourceTotal} transcript items" + } + }; + function t(lang2, key, vars) { + return interpolate(DICT[lang2][key], vars); + } + function td(lang2, key, vars) { + return interpolate(DETAIL_DICT[lang2][key], vars); + } + function interpolate(template, vars) { + if (vars === void 0) return template; + return template.replace( + /\{(\w+)\}/g, + (m, k) => k in vars ? String(vars[k]) : m + ); + } + function langOfLocale(locale) { + return typeof locale === "string" && locale.toLowerCase().startsWith("zh") ? "zh" : "en"; + } + function statusKey(status) { + return status === "deleted" ? "status.completed" : `status.${status}`; + } + function memberStatusKey(status) { + return `memberStatus.${status}`; + } + + // src/ui-core/icons.ts + var svg = (inner, size) => ``; + function iconUser(size = 14) { + return svg('', size); + } + function iconUsers(size = 14) { + return svg( + '', + size + ); + } + function iconChevron(size = 12) { + return svg('', size); + } + function iconArrowLeft(size = 14) { + return svg('', size); + } + + // src/ui-core/escape.ts + function esc(s) { + return s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); + } + + // src/ui-core/render.ts + function isCompact(frame2) { + return frame2.members.length === 1 && frame2.tasks.length === 0; + } + function currentMemberId(frame2) { + const sid = frame2.meta.sessionId; + if (sid === void 0) return void 0; + return frame2.members.find((m) => m.sessionId === sid)?.id; + } + function isMemberDisabled(m, currentId) { + return m.id === currentId || m.status === "failed" || m.status === "provisioning"; + } + function memberDot(status) { + switch (status) { + case "running": + case "provisioning": + return "ongoing"; + case "failed": + return "error"; + case "inactive": + default: + return "icon"; + } + } + function taskDot(task) { + switch (task.status) { + case "in_progress": + return "ongoing"; + case "completed": + return "done"; + case "deleted": + return "idle"; + // 上游 deleted→idle(视图通常不含墓碑,防御口径) + case "pending": + default: + return task.ready ? "idle" : "warning"; + } + } + function dot(state) { + return ``; + } + function memberIndicator(m) { + const d = memberDot(m.status); + const inner = d === "icon" ? `${iconUser(14)}` : dot(d); + return `${inner}`; + } + function renderMember(m, opts) { + const { lang: lang2, isCurrent, disabled } = opts; + const highlight = opts.highlightCurrent ?? isCurrent; + const cls = ["member", highlight ? "current" : ""].filter(Boolean).join(" "); + const nameRow = `${esc(m.target)}` + (isCurrent ? `${esc(t(lang2, "current"))}` : "") + ``; + const modelSuffix = m.model !== void 0 ? ` \xB7 ${esc(t(lang2, "model"))}: ${esc(m.model)}` : ""; + const sub = `${esc(t(lang2, memberStatusKey(m.status)))}${modelSuffix}`; + const diag = m.diagnostics.length > 0 ? `${esc(m.diagnostics[0])}` : ""; + const openAttr = disabled ? "" : ` title="${esc(t(lang2, "open"))}"`; + return ``; + } + function renderRoster(frame2, lang2) { + const members = frame2.members; + const currentId = currentMemberId(frame2); + const countHtml = members.length > 1 ? `${members.length}` : ""; + const cards = members.map( + (m) => renderMember(m, { + lang: lang2, + // Tag 恒随当前会话;高亮/描边才受 members>1 限制(上游 TeamAction 同口径)。 + isCurrent: m.id === currentId, + highlightCurrent: m.id === currentId && members.length > 1, + disabled: isMemberDisabled(m, currentId) + }) + ).join(""); + return `

${esc(t(lang2, "roster"))}${countHtml}

${cards}
`; + } + function renderTaskMeta(task, lang2, leadingHtml = "") { + const spans = []; + spans.push(`${esc(task.id)}`); + const owner = task.ownerName !== void 0 ? esc(task.ownerName) : esc(t(lang2, "unowned")); + spans.push(`${esc(t(lang2, "owner"))}: ${owner}`); + if (task.status === "pending") { + spans.push(`${esc(t(lang2, task.ready ? "ready" : "blocked"))}`); + } + if (task.blockedBy.length > 0) { + spans.push(`${esc(t(lang2, "blockedBy"))}: ${task.blockedBy.map(esc).join(", ")}`); + } + if (task.writeScopes.length > 0) { + spans.push(`${esc(t(lang2, "writeScopes"))}: ${task.writeScopes.map(esc).join(", ")}`); + } + for (const w of task.writeScopeWarnings) { + spans.push(`${esc(w)}`); + } + return `
${leadingHtml}${spans.join("")}
`; + } + function renderTask(task, lang2) { + const state = `${dot(taskDot(task))}${esc(t(lang2, statusKey(task.status)))}`; + const titleRow = `
${esc(task.subject)}${state}
`; + const toggle = ``; + const desc = `

${esc(task.description)}

`; + return `
` + titleRow + desc + renderTaskMeta(task, lang2, toggle) + `
`; + } + function renderTasks(frame2, lang2) { + if (frame2.tasks.length === 0) { + return `

${esc(t(lang2, "empty"))}

`; + } + const cards = frame2.tasks.map((task) => renderTask(task, lang2)).join(""); + return `

${esc(t(lang2, "tasks"))}${frame2.tasks.length}

${cards}
`; + } + function renderNotices(opts) { + const { lang: lang2 } = opts; + const out = []; + if (opts.navError !== void 0) { + out.push(``); + } + if (opts.loading === true) { + out.push(`
${dot("ongoing")}${esc(t(lang2, "loading"))}
`); + } else if (opts.noTeam === true) { + out.push(`
${dot("warning")}${esc(t(lang2, "unavailable"))}
`); + } + if (opts.failure !== void 0) { + out.push(``); + } + return out.join(""); + } + function renderPanelBody(frame2, lang2, runtime) { + const noTeam = frame2.team === null; + const notices = renderNotices({ + lang: lang2, + ...runtime?.navError !== void 0 ? { navError: runtime.navError } : {}, + ...runtime?.loading !== void 0 ? { loading: runtime.loading } : {}, + noTeam, + ...frame2.team?.failure !== void 0 ? { failure: frame2.team.failure } : {} + }); + if (noTeam && runtime?.loading !== true) { + return notices; + } + return notices + renderRoster(frame2, lang2) + renderTasks(frame2, lang2); + } + + // src/ui-core/detail-render.ts + function aggregateToolNames(tools) { + const counts = /* @__PURE__ */ new Map(); + for (const tool of tools) counts.set(tool.name, (counts.get(tool.name) ?? 0) + 1); + return [...counts.entries()].sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)).map(([name, n]) => `${name}\xD7${n}`).join(" \xB7 "); + } + function renderToolEntry(tool) { + const hasPayload = tool.text !== void 0 && tool.text.length > 0; + const summary = `${hasPayload ? iconChevron(12) : ""}${esc(tool.name)}${esc(tool.status)}`; + return hasPayload ? `
${esc(tool.text)}
` : `${summary}`; + } + function renderDetailItem(item, lang2) { + const time = item.ts.slice(11, 19); + const badge = item.framed !== void 0 ? `${esc(td(lang2, "detail.framedFrom", { name: item.framed.from }))}` : ""; + if (item.kind === "toolCall") { + const tool = item.tool ?? { name: "?", status: "?" }; + const entry = { + ts: item.ts, + name: tool.name, + status: tool.status, + ...item.text !== void 0 ? { text: item.text } : {} + }; + return `
assistant${time}
` + renderToolEntry(entry) + `
`; + } + if (item.kind === "toolGroup") { + const tools = item.tools ?? []; + const count = item.count ?? tools.length; + const label = td(lang2, "detail.toolGroup", { n: count, list: aggregateToolNames(tools) }); + return `
assistant${time}
${tools.map((tool) => renderToolEntry(tool)).join("")}
`; + } + const roleLabel = item.role === "user" ? esc(td(lang2, "detail.you")) : item.role; + return `
${roleLabel}${time}${badge}
${esc(item.text ?? "")}
`; + } + function renderDetailBody(st, lang2) { + if (st.kind === "loading") { + return `
${esc(td(lang2, "detail.loading"))}
`; + } + if (st.kind === "error") { + const text = st.reason === "session-not-settled" ? td(lang2, "detail.noSession") : td(lang2, "detail.failed", { message: st.message }); + return `
${esc(text)}
`; + } + const d = st.detail; + const count = `${esc(td(lang2, "detail.countSummary", { n: d.total, sourceTotal: d.sourceTotal }))}`; + if (d.page.items.length === 0) { + return `
${esc(td(lang2, "detail.empty"))}
`; + } + const pager = d.page.nextCursor !== void 0 ? `
${count}
` : `
${count}
`; + return pager + d.page.items.map((item) => renderDetailItem(item, lang2)).join(""); + } + function renderDetailView(st, lang2, opts = {}) { + if (st.kind === "closed") return ""; + const actions = []; + if (st.kind === "ready") { + actions.push(``); + actions.push( + `` + ); + if (opts.wake === true) { + actions.push(``); + } + } + return `
${esc(st.name)}${actions.join("")}
${renderDetailBody(st, lang2)}
`; + } + + // src/ui-core/expand.ts + function memoryExpandStore(initial) { + const set = new Set(initial ?? []); + return { + isExpanded: (id) => set.has(id), + setExpanded: (id, v) => { + if (v) set.add(id); + else set.delete(id); + } + }; + } + function attachExpandBehavior(root2, store, labels) { + const observers = []; + const measure = (task) => { + const desc = task.querySelector("[data-task-desc]"); + const toggle = task.querySelector("[data-task-toggle]"); + if (desc === null || toggle === null) return; + const id = task.dataset.taskId ?? ""; + const expanded = store.isExpanded(id); + const overflow = desc.scrollHeight > desc.clientHeight + 1; + toggle.hidden = !(overflow || expanded); + const label = toggle.querySelector(".expand-label"); + if (label !== null) label.textContent = expanded ? labels.collapse : labels.expand; + toggle.setAttribute("aria-expanded", expanded ? "true" : "false"); + toggle.classList.toggle("open", expanded); + desc.classList.toggle("expanded", expanded); + }; + const tasks = () => Array.from(root2.querySelectorAll("article.task")); + for (const task of tasks()) { + const desc = task.querySelector("[data-task-desc]"); + if (desc !== null && typeof ResizeObserver !== "undefined") { + const ro = new ResizeObserver(() => measure(task)); + ro.observe(desc); + observers.push(ro); + } + measure(task); + } + const onClick = (ev) => { + const target = ev.target; + const toggle = target?.closest("[data-task-toggle]"); + if (toggle === null || toggle === void 0) return; + const task = toggle.closest("article.task"); + if (task === null) return; + const id = task.dataset.taskId ?? ""; + store.setExpanded(id, !store.isExpanded(id)); + measure(task); + }; + root2.addEventListener("click", onClick); + return () => { + root2.removeEventListener("click", onClick); + for (const ro of observers) ro.disconnect(); + }; + } + + // src/ui-core/request-sequencer.ts + var RequestSequencer = class { + #seq = 0; + begin() { + this.#seq += 1; + return this.#seq; + } + isCurrent(seq) { + return seq === this.#seq; + } + invalidate() { + this.#seq += 1; + } + }; + + // src/panel/companion-main.ts + var HOVER_OPEN_MS = 150; + var LEAVE_CLOSE_MS = 120; + var ANCHOR_GAP = 5; + var ANCHOR_MARGIN = 16; + var EVENTS_ENDPOINT = "/events"; + var API_ENDPOINT = "/api/call"; + var token = new URLSearchParams(location.search).get("token") ?? ""; + var lang = langOfLocale(navigator.language); + var frame = null; + var detailState = { kind: "closed" }; + var expandStore = memoryExpandStore(); + var detachExpand = null; + var pinned = false; + var open = false; + var hoverTimer = null; + var leaveTimer = null; + var detailSequencer = new RequestSequencer(); + var style = document.createElement("style"); + style.textContent = COMPONENT_CSS + ` +html, body { margin: 0; min-height: 100%; background: var(--at-bg-menu); font-family: var(--at-font); } +.at-root { padding: 12px; container-type: inline-size; } +.at-trigger { + min-height: 28px; color: var(--at-label-tertiary); cursor: pointer; background: none; border: 0; + border-radius: 6px; align-items: center; gap: 5px; padding: 3px 7px; font-size: 12px; + display: inline-flex; font-family: inherit; +} +.at-trigger:hover, .at-trigger:focus-visible { color: var(--at-label-primary); } +.at-trigger .at-trigger-label { display: inline; } +@container (max-width: 480px) { .at-trigger .at-trigger-label { display: none; } } +.at-panel-wrap { position: fixed; visibility: hidden; left: 0; top: 0; z-index: 100; } +.at-panel-wrap.open { visibility: visible; } +.team-panel { position: relative; } +.at-conn { font-size: 11px; color: var(--at-label-tertiary); margin-left: 8px; } +`; + document.head.appendChild(style); + var root = document.createElement("div"); + root.className = "at-root"; + root.innerHTML = `connecting\u2026
`; + document.body.appendChild(root); + var trigger = root.querySelector("[data-trigger]"); + trigger.querySelector("[data-trigger-icon]").innerHTML = iconUsers(14); + var wrap = root.querySelector("[data-wrap]"); + var panelEl = root.querySelector(".team-panel"); + var listView = root.querySelector("[data-list-view]"); + var detailView = root.querySelector("[data-detail-view]"); + var conn = root.querySelector("[data-conn]"); + document.documentElement.dataset.theme = matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; + function render() { + const inDetail = detailState.kind !== "closed"; + listView.hidden = inDetail; + detailView.hidden = !inDetail; + panelEl.classList.toggle("compact", frame !== null && isCompact(frame) && !inDetail); + if (inDetail) { + detailView.innerHTML = renderDetailView(detailState, lang); + bindDetail(); + return; + } + if (detachExpand !== null) { + detachExpand(); + detachExpand = null; + } + if (frame === null) { + listView.innerHTML = renderPanelBody( + { type: "view", stateVersion: 4, team: null, members: [], tasks: [], meta: { generatedAt: "", revision: 0 } }, + lang, + { loading: true } + ); + return; + } + listView.innerHTML = renderPanelBody(frame, lang, { loading: false }); + detachExpand = attachExpandBehavior(listView, expandStore, { + expand: DICT[lang]["task.expand"], + collapse: DICT[lang]["task.collapse"] + }); + } + function positionPanel() { + const tr = trigger.getBoundingClientRect(); + const pw = panelEl.offsetWidth; + const ph = panelEl.offsetHeight; + let left = tr.left; + let top = tr.bottom + ANCHOR_GAP; + const maxLeft = window.innerWidth - pw - ANCHOR_MARGIN; + if (left > maxLeft) left = Math.max(ANCHOR_MARGIN, maxLeft); + if (top + ph > window.innerHeight - ANCHOR_MARGIN) { + const above = tr.top - ANCHOR_GAP - ph; + if (above >= ANCHOR_MARGIN) top = above; + } + wrap.style.left = `${Math.round(left)}px`; + wrap.style.top = `${Math.round(top)}px`; + } + function openPanel(focus) { + if (open) return; + open = true; + wrap.classList.add("open"); + trigger.setAttribute("aria-expanded", "true"); + positionPanel(); + if (focus) panelEl.focus(); + } + function closePanel(returnFocus) { + if (!open) return; + open = false; + pinned = false; + wrap.classList.remove("open"); + trigger.setAttribute("aria-expanded", "false"); + if (returnFocus) trigger.focus(); + } + var triggerLabel = root.querySelector(".at-trigger-label"); + trigger.addEventListener("mouseenter", () => { + if (pinned) return; + if (triggerLabel !== null && getComputedStyle(triggerLabel).display === "none") return; + clearTimers(); + hoverTimer = setTimeout(() => openPanel(false), HOVER_OPEN_MS); + }); + trigger.addEventListener("mouseleave", () => { + if (pinned) return; + clearTimers(); + leaveTimer = setTimeout(() => closePanel(false), LEAVE_CLOSE_MS); + }); + panelEl.addEventListener("mouseenter", () => { + if (leaveTimer !== null) { + clearTimeout(leaveTimer); + leaveTimer = null; + } + }); + panelEl.addEventListener("mouseleave", () => { + if (pinned || !open) return; + clearTimers(); + leaveTimer = setTimeout(() => closePanel(false), LEAVE_CLOSE_MS); + }); + trigger.addEventListener("click", () => { + clearTimers(); + pinned = true; + if (open) panelEl.focus(); + else openPanel(true); + }); + document.addEventListener("keydown", (ev) => { + if (ev.key !== "Escape") return; + const inPanel = panelEl.contains(document.activeElement) || document.activeElement === panelEl; + if (open) { + ev.preventDefault(); + closePanel(inPanel); + } + }); + document.addEventListener("pointerdown", (ev) => { + if (!open) return; + const t2 = ev.target; + if (trigger.contains(t2) || panelEl.contains(t2)) return; + closePanel(false); + }); + window.addEventListener("resize", () => { + if (open) positionPanel(); + }); + window.addEventListener("scroll", () => { + if (open) positionPanel(); + }, true); + function clearTimers() { + if (hoverTimer !== null) { + clearTimeout(hoverTimer); + hoverTimer = null; + } + if (leaveTimer !== null) { + clearTimeout(leaveTimer); + leaveTimer = null; + } + } + function connect() { + const es = new EventSource(`${EVENTS_ENDPOINT}?token=${encodeURIComponent(token)}`); + es.addEventListener("hello", () => { + conn.textContent = "live"; + }); + es.addEventListener("view", (ev) => { + try { + frame = JSON.parse(ev.data); + conn.textContent = "live"; + render(); + } catch { + } + }); + es.onerror = () => { + conn.textContent = "reconnecting\u2026"; + }; + } + async function apiCall(args) { + const res = await fetch(API_ENDPOINT, { + method: "POST", + headers: { "content-type": "application/json", "x-team-token": token }, + body: JSON.stringify(args) + }); + return res.json(); + } + listView.addEventListener("click", (ev) => { + const target = ev.target; + if (target?.closest("[data-task-toggle]") !== null && target !== void 0) return; + const member = target?.closest("button.member"); + if (member === null || member === void 0 || member.disabled) return; + const id = member.dataset.memberId; + if (id === void 0) return; + void openDetail(id, member.querySelector(".name")?.textContent ?? id); + }); + async function openDetail(memberId, name, cursor) { + const seq = detailSequencer.begin(); + const fromList = detailState.kind === "closed"; + detailState = { kind: "loading", memberId, name }; + render(); + if (fromList) detailView.focus(); + try { + const body = await apiCall({ + action: "detail", + target: memberId, + ...cursor !== void 0 ? { cursor } : {} + }); + if (!detailSequencer.isCurrent(seq)) return; + if (body.kind === "detail" && body.detail !== void 0) { + detailState = { kind: "ready", memberId, name, detail: body.detail }; + } else { + detailState = { + kind: "error", + memberId, + name, + message: body.message ?? "detail failed", + ...body.reason !== void 0 ? { reason: body.reason } : {} + }; + } + } catch (err) { + if (!detailSequencer.isCurrent(seq)) return; + detailState = { kind: "error", memberId, name, message: err instanceof Error ? err.message : String(err) }; + } + render(); + } + function closeDetail() { + detailSequencer.invalidate(); + detailState = { kind: "closed" }; + render(); + } + function bindDetail() { + detailView.querySelector("[data-detail-back]")?.addEventListener("click", closeDetail); + const reload = () => { + if (detailState.kind === "ready" || detailState.kind === "error") { + void openDetail(detailState.memberId, detailState.name); + } + }; + detailView.querySelector("[data-detail-refresh]")?.addEventListener("click", reload); + detailView.querySelector("[data-detail-retry]")?.addEventListener("click", reload); + detailView.querySelector("[data-detail-copy]")?.addEventListener("click", () => { + if (detailState.kind !== "ready") return; + void navigator.clipboard?.writeText(detailState.detail.sessionId).catch(() => void 0); + const btn = detailView.querySelector("[data-detail-copy]"); + if (btn !== null) { + btn.textContent = td(lang, "detail.copied"); + setTimeout(() => { + if (btn.isConnected) btn.textContent = td(lang, "detail.copySessionId"); + }, 1500); + } + }); + detailView.querySelector("[data-detail-earlier]")?.addEventListener("click", (ev) => { + const cursor = Number(ev.currentTarget.dataset.cursor); + if (detailState.kind === "ready" && Number.isFinite(cursor)) { + void openDetail(detailState.memberId, detailState.name, cursor); + } + }); + for (const head of detailView.querySelectorAll("button.tool-group-head")) { + head.addEventListener("click", () => { + const group = head.closest(".tool-group"); + const open2 = group?.classList.toggle("open") ?? false; + head.setAttribute("aria-expanded", open2 ? "true" : "false"); + }); + } + for (const row of detailView.querySelectorAll("button.tool-row")) { + row.addEventListener("click", () => { + const o = row.classList.toggle("open"); + row.setAttribute("aria-expanded", o ? "true" : "false"); + }); + } + } + render(); + connect(); +})(); diff --git a/external_plugins/agent-team/runtime/ui/panel.js b/external_plugins/agent-team/runtime/ui/panel.js new file mode 100644 index 00000000..b0502696 --- /dev/null +++ b/external_plugins/agent-team/runtime/ui/panel.js @@ -0,0 +1,16048 @@ +"use strict"; +(() => { + var __defProp = Object.defineProperty; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { + get: (a, b2) => (typeof require !== "undefined" ? require : a)[b2] + }) : x)(function(x) { + if (typeof require !== "undefined") return require.apply(this, arguments); + throw Error('Dynamic require of "' + x + '" is not supported'); + }); + var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; + }; + var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); + }; + + // node_modules/zod/v4/core/core.js + // @__NO_SIDE_EFFECTS__ + function $constructor(name, initializer3, params) { + function init(inst, def) { + var _a; + Object.defineProperty(inst, "_zod", { + value: inst._zod ?? {}, + enumerable: false + }); + (_a = inst._zod).traits ?? (_a.traits = /* @__PURE__ */ new Set()); + inst._zod.traits.add(name); + initializer3(inst, def); + for (const k2 in _2.prototype) { + if (!(k2 in inst)) + Object.defineProperty(inst, k2, { value: _2.prototype[k2].bind(inst) }); + } + inst._zod.constr = _2; + inst._zod.def = def; + } + const Parent = params?.Parent ?? Object; + class Definition extends Parent { + } + Object.defineProperty(Definition, "name", { value: name }); + function _2(def) { + var _a; + const inst = params?.Parent ? new Definition() : this; + init(inst, def); + (_a = inst._zod).deferred ?? (_a.deferred = []); + for (const fn of inst._zod.deferred) { + fn(); + } + return inst; + } + Object.defineProperty(_2, "init", { value: init }); + Object.defineProperty(_2, Symbol.hasInstance, { + value: (inst) => { + if (params?.Parent && inst instanceof params.Parent) + return true; + return inst?._zod?.traits?.has(name); + } + }); + Object.defineProperty(_2, "name", { value: name }); + return _2; + } + function config(newConfig) { + if (newConfig) + Object.assign(globalConfig, newConfig); + return globalConfig; + } + var NEVER, $brand, $ZodAsyncError, globalConfig; + var init_core = __esm({ + "node_modules/zod/v4/core/core.js"() { + NEVER = Object.freeze({ + status: "aborted" + }); + $brand = Symbol("zod_brand"); + $ZodAsyncError = class extends Error { + constructor() { + super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`); + } + }; + globalConfig = {}; + } + }); + + // node_modules/zod/v4/core/util.js + var util_exports = {}; + __export(util_exports, { + BIGINT_FORMAT_RANGES: () => BIGINT_FORMAT_RANGES, + Class: () => Class, + NUMBER_FORMAT_RANGES: () => NUMBER_FORMAT_RANGES, + aborted: () => aborted, + allowsEval: () => allowsEval, + assert: () => assert, + assertEqual: () => assertEqual, + assertIs: () => assertIs, + assertNever: () => assertNever, + assertNotEqual: () => assertNotEqual, + assignProp: () => assignProp, + cached: () => cached, + captureStackTrace: () => captureStackTrace, + cleanEnum: () => cleanEnum, + cleanRegex: () => cleanRegex, + clone: () => clone, + createTransparentProxy: () => createTransparentProxy, + defineLazy: () => defineLazy, + esc: () => esc, + escapeRegex: () => escapeRegex, + extend: () => extend, + finalizeIssue: () => finalizeIssue, + floatSafeRemainder: () => floatSafeRemainder, + getElementAtPath: () => getElementAtPath, + getEnumValues: () => getEnumValues, + getLengthableOrigin: () => getLengthableOrigin, + getParsedType: () => getParsedType, + getSizableOrigin: () => getSizableOrigin, + isObject: () => isObject, + isPlainObject: () => isPlainObject, + issue: () => issue, + joinValues: () => joinValues, + jsonStringifyReplacer: () => jsonStringifyReplacer, + merge: () => merge, + normalizeParams: () => normalizeParams, + nullish: () => nullish, + numKeys: () => numKeys, + omit: () => omit, + optionalKeys: () => optionalKeys, + partial: () => partial, + pick: () => pick, + prefixIssues: () => prefixIssues, + primitiveTypes: () => primitiveTypes, + promiseAllObject: () => promiseAllObject, + propertyKeyTypes: () => propertyKeyTypes, + randomString: () => randomString, + required: () => required, + stringifyPrimitive: () => stringifyPrimitive, + unwrapMessage: () => unwrapMessage + }); + function assertEqual(val) { + return val; + } + function assertNotEqual(val) { + return val; + } + function assertIs(_arg) { + } + function assertNever(_x) { + throw new Error(); + } + function assert(_2) { + } + function getEnumValues(entries) { + const numericValues = Object.values(entries).filter((v2) => typeof v2 === "number"); + const values = Object.entries(entries).filter(([k2, _2]) => numericValues.indexOf(+k2) === -1).map(([_2, v2]) => v2); + return values; + } + function joinValues(array2, separator = "|") { + return array2.map((val) => stringifyPrimitive(val)).join(separator); + } + function jsonStringifyReplacer(_2, value) { + if (typeof value === "bigint") + return value.toString(); + return value; + } + function cached(getter) { + const set2 = false; + return { + get value() { + if (!set2) { + const value = getter(); + Object.defineProperty(this, "value", { value }); + return value; + } + throw new Error("cached value already set"); + } + }; + } + function nullish(input) { + return input === null || input === void 0; + } + function cleanRegex(source) { + const start = source.startsWith("^") ? 1 : 0; + const end = source.endsWith("$") ? source.length - 1 : source.length; + return source.slice(start, end); + } + function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = Number.parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", "")); + return valInt % stepInt / 10 ** decCount; + } + function defineLazy(object3, key, getter) { + const set2 = false; + Object.defineProperty(object3, key, { + get() { + if (!set2) { + const value = getter(); + object3[key] = value; + return value; + } + throw new Error("cached value already set"); + }, + set(v2) { + Object.defineProperty(object3, key, { + value: v2 + // configurable: true, + }); + }, + configurable: true + }); + } + function assignProp(target, prop, value) { + Object.defineProperty(target, prop, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + function getElementAtPath(obj, path) { + if (!path) + return obj; + return path.reduce((acc, key) => acc?.[key], obj); + } + function promiseAllObject(promisesObj) { + const keys = Object.keys(promisesObj); + const promises = keys.map((key) => promisesObj[key]); + return Promise.all(promises).then((results) => { + const resolvedObj = {}; + for (let i2 = 0; i2 < keys.length; i2++) { + resolvedObj[keys[i2]] = results[i2]; + } + return resolvedObj; + }); + } + function randomString(length = 10) { + const chars = "abcdefghijklmnopqrstuvwxyz"; + let str = ""; + for (let i2 = 0; i2 < length; i2++) { + str += chars[Math.floor(Math.random() * chars.length)]; + } + return str; + } + function esc(str) { + return JSON.stringify(str); + } + function isObject(data) { + return typeof data === "object" && data !== null && !Array.isArray(data); + } + function isPlainObject(o) { + if (isObject(o) === false) + return false; + const ctor = o.constructor; + if (ctor === void 0) + return true; + const prot = ctor.prototype; + if (isObject(prot) === false) + return false; + if (Object.prototype.hasOwnProperty.call(prot, "isPrototypeOf") === false) { + return false; + } + return true; + } + function numKeys(data) { + let keyCount = 0; + for (const key in data) { + if (Object.prototype.hasOwnProperty.call(data, key)) { + keyCount++; + } + } + return keyCount; + } + function escapeRegex(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function clone(inst, def, params) { + const cl = new inst._zod.constr(def ?? inst._zod.def); + if (!def || params?.parent) + cl._zod.parent = inst; + return cl; + } + function normalizeParams(_params) { + const params = _params; + if (!params) + return {}; + if (typeof params === "string") + return { error: () => params }; + if (params?.message !== void 0) { + if (params?.error !== void 0) + throw new Error("Cannot specify both `message` and `error` params"); + params.error = params.message; + } + delete params.message; + if (typeof params.error === "string") + return { ...params, error: () => params.error }; + return params; + } + function createTransparentProxy(getter) { + let target; + return new Proxy({}, { + get(_2, prop, receiver) { + target ?? (target = getter()); + return Reflect.get(target, prop, receiver); + }, + set(_2, prop, value, receiver) { + target ?? (target = getter()); + return Reflect.set(target, prop, value, receiver); + }, + has(_2, prop) { + target ?? (target = getter()); + return Reflect.has(target, prop); + }, + deleteProperty(_2, prop) { + target ?? (target = getter()); + return Reflect.deleteProperty(target, prop); + }, + ownKeys(_2) { + target ?? (target = getter()); + return Reflect.ownKeys(target); + }, + getOwnPropertyDescriptor(_2, prop) { + target ?? (target = getter()); + return Reflect.getOwnPropertyDescriptor(target, prop); + }, + defineProperty(_2, prop, descriptor) { + target ?? (target = getter()); + return Reflect.defineProperty(target, prop, descriptor); + } + }); + } + function stringifyPrimitive(value) { + if (typeof value === "bigint") + return value.toString() + "n"; + if (typeof value === "string") + return `"${value}"`; + return `${value}`; + } + function optionalKeys(shape) { + return Object.keys(shape).filter((k2) => { + return shape[k2]._zod.optin === "optional" && shape[k2]._zod.optout === "optional"; + }); + } + function pick(schema, mask) { + const newShape = {}; + const currDef = schema._zod.def; + for (const key in mask) { + if (!(key in currDef.shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + newShape[key] = currDef.shape[key]; + } + return clone(schema, { + ...schema._zod.def, + shape: newShape, + checks: [] + }); + } + function omit(schema, mask) { + const newShape = { ...schema._zod.def.shape }; + const currDef = schema._zod.def; + for (const key in mask) { + if (!(key in currDef.shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + delete newShape[key]; + } + return clone(schema, { + ...schema._zod.def, + shape: newShape, + checks: [] + }); + } + function extend(schema, shape) { + if (!isPlainObject(shape)) { + throw new Error("Invalid input to extend: expected a plain object"); + } + const def = { + ...schema._zod.def, + get shape() { + const _shape = { ...schema._zod.def.shape, ...shape }; + assignProp(this, "shape", _shape); + return _shape; + }, + checks: [] + // delete existing checks + }; + return clone(schema, def); + } + function merge(a, b2) { + return clone(a, { + ...a._zod.def, + get shape() { + const _shape = { ...a._zod.def.shape, ...b2._zod.def.shape }; + assignProp(this, "shape", _shape); + return _shape; + }, + catchall: b2._zod.def.catchall, + checks: [] + // delete existing checks + }); + } + function partial(Class2, schema, mask) { + const oldShape = schema._zod.def.shape; + const shape = { ...oldShape }; + if (mask) { + for (const key in mask) { + if (!(key in oldShape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + shape[key] = Class2 ? new Class2({ + type: "optional", + innerType: oldShape[key] + }) : oldShape[key]; + } + } else { + for (const key in oldShape) { + shape[key] = Class2 ? new Class2({ + type: "optional", + innerType: oldShape[key] + }) : oldShape[key]; + } + } + return clone(schema, { + ...schema._zod.def, + shape, + checks: [] + }); + } + function required(Class2, schema, mask) { + const oldShape = schema._zod.def.shape; + const shape = { ...oldShape }; + if (mask) { + for (const key in mask) { + if (!(key in shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + shape[key] = new Class2({ + type: "nonoptional", + innerType: oldShape[key] + }); + } + } else { + for (const key in oldShape) { + shape[key] = new Class2({ + type: "nonoptional", + innerType: oldShape[key] + }); + } + } + return clone(schema, { + ...schema._zod.def, + shape, + // optional: [], + checks: [] + }); + } + function aborted(x, startIndex = 0) { + for (let i2 = startIndex; i2 < x.issues.length; i2++) { + if (x.issues[i2]?.continue !== true) + return true; + } + return false; + } + function prefixIssues(path, issues) { + return issues.map((iss) => { + var _a; + (_a = iss).path ?? (_a.path = []); + iss.path.unshift(path); + return iss; + }); + } + function unwrapMessage(message) { + return typeof message === "string" ? message : message?.message; + } + function finalizeIssue(iss, ctx, config2) { + const full = { ...iss, path: iss.path ?? [] }; + if (!iss.message) { + const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(config2.customError?.(iss)) ?? unwrapMessage(config2.localeError?.(iss)) ?? "Invalid input"; + full.message = message; + } + delete full.inst; + delete full.continue; + if (!ctx?.reportInput) { + delete full.input; + } + return full; + } + function getSizableOrigin(input) { + if (input instanceof Set) + return "set"; + if (input instanceof Map) + return "map"; + if (input instanceof File) + return "file"; + return "unknown"; + } + function getLengthableOrigin(input) { + if (Array.isArray(input)) + return "array"; + if (typeof input === "string") + return "string"; + return "unknown"; + } + function issue(...args) { + const [iss, input, inst] = args; + if (typeof iss === "string") { + return { + message: iss, + code: "custom", + input, + inst + }; + } + return { ...iss }; + } + function cleanEnum(obj) { + return Object.entries(obj).filter(([k2, _2]) => { + return Number.isNaN(Number.parseInt(k2, 10)); + }).map((el) => el[1]); + } + var captureStackTrace, allowsEval, getParsedType, propertyKeyTypes, primitiveTypes, NUMBER_FORMAT_RANGES, BIGINT_FORMAT_RANGES, Class; + var init_util = __esm({ + "node_modules/zod/v4/core/util.js"() { + captureStackTrace = Error.captureStackTrace ? Error.captureStackTrace : (..._args) => { + }; + allowsEval = cached(() => { + if (typeof navigator !== "undefined" && navigator?.userAgent?.includes("Cloudflare")) { + return false; + } + try { + const F2 = Function; + new F2(""); + return true; + } catch (_2) { + return false; + } + }); + getParsedType = (data) => { + const t2 = typeof data; + switch (t2) { + case "undefined": + return "undefined"; + case "string": + return "string"; + case "number": + return Number.isNaN(data) ? "nan" : "number"; + case "boolean": + return "boolean"; + case "function": + return "function"; + case "bigint": + return "bigint"; + case "symbol": + return "symbol"; + case "object": + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") { + return "promise"; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return "map"; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return "set"; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return "date"; + } + if (typeof File !== "undefined" && data instanceof File) { + return "file"; + } + return "object"; + default: + throw new Error(`Unknown data type: ${t2}`); + } + }; + propertyKeyTypes = /* @__PURE__ */ new Set(["string", "number", "symbol"]); + primitiveTypes = /* @__PURE__ */ new Set(["string", "number", "bigint", "boolean", "symbol", "undefined"]); + NUMBER_FORMAT_RANGES = { + safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER], + int32: [-2147483648, 2147483647], + uint32: [0, 4294967295], + float32: [-34028234663852886e22, 34028234663852886e22], + float64: [-Number.MAX_VALUE, Number.MAX_VALUE] + }; + BIGINT_FORMAT_RANGES = { + int64: [/* @__PURE__ */ BigInt("-9223372036854775808"), /* @__PURE__ */ BigInt("9223372036854775807")], + uint64: [/* @__PURE__ */ BigInt(0), /* @__PURE__ */ BigInt("18446744073709551615")] + }; + Class = class { + constructor(..._args) { + } + }; + } + }); + + // node_modules/zod/v4/core/errors.js + function flattenError(error40, mapper = (issue2) => issue2.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of error40.issues) { + if (sub.path.length > 0) { + fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; + fieldErrors[sub.path[0]].push(mapper(sub)); + } else { + formErrors.push(mapper(sub)); + } + } + return { formErrors, fieldErrors }; + } + function formatError(error40, _mapper) { + const mapper = _mapper || function(issue2) { + return issue2.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error41) => { + for (const issue2 of error41.issues) { + if (issue2.code === "invalid_union" && issue2.errors.length) { + issue2.errors.map((issues) => processError({ issues })); + } else if (issue2.code === "invalid_key") { + processError({ issues: issue2.issues }); + } else if (issue2.code === "invalid_element") { + processError({ issues: issue2.issues }); + } else if (issue2.path.length === 0) { + fieldErrors._errors.push(mapper(issue2)); + } else { + let curr = fieldErrors; + let i2 = 0; + while (i2 < issue2.path.length) { + const el = issue2.path[i2]; + const terminal = i2 === issue2.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + } else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue2)); + } + curr = curr[el]; + i2++; + } + } + } + }; + processError(error40); + return fieldErrors; + } + function treeifyError(error40, _mapper) { + const mapper = _mapper || function(issue2) { + return issue2.message; + }; + const result = { errors: [] }; + const processError = (error41, path = []) => { + var _a, _b; + for (const issue2 of error41.issues) { + if (issue2.code === "invalid_union" && issue2.errors.length) { + issue2.errors.map((issues) => processError({ issues }, issue2.path)); + } else if (issue2.code === "invalid_key") { + processError({ issues: issue2.issues }, issue2.path); + } else if (issue2.code === "invalid_element") { + processError({ issues: issue2.issues }, issue2.path); + } else { + const fullpath = [...path, ...issue2.path]; + if (fullpath.length === 0) { + result.errors.push(mapper(issue2)); + continue; + } + let curr = result; + let i2 = 0; + while (i2 < fullpath.length) { + const el = fullpath[i2]; + const terminal = i2 === fullpath.length - 1; + if (typeof el === "string") { + curr.properties ?? (curr.properties = {}); + (_a = curr.properties)[el] ?? (_a[el] = { errors: [] }); + curr = curr.properties[el]; + } else { + curr.items ?? (curr.items = []); + (_b = curr.items)[el] ?? (_b[el] = { errors: [] }); + curr = curr.items[el]; + } + if (terminal) { + curr.errors.push(mapper(issue2)); + } + i2++; + } + } + } + }; + processError(error40); + return result; + } + function toDotPath(path) { + const segs = []; + for (const seg of path) { + if (typeof seg === "number") + segs.push(`[${seg}]`); + else if (typeof seg === "symbol") + segs.push(`[${JSON.stringify(String(seg))}]`); + else if (/[^\w$]/.test(seg)) + segs.push(`[${JSON.stringify(seg)}]`); + else { + if (segs.length) + segs.push("."); + segs.push(seg); + } + } + return segs.join(""); + } + function prettifyError(error40) { + const lines = []; + const issues = [...error40.issues].sort((a, b2) => a.path.length - b2.path.length); + for (const issue2 of issues) { + lines.push(`\u2716 ${issue2.message}`); + if (issue2.path?.length) + lines.push(` \u2192 at ${toDotPath(issue2.path)}`); + } + return lines.join("\n"); + } + var initializer, $ZodError, $ZodRealError; + var init_errors = __esm({ + "node_modules/zod/v4/core/errors.js"() { + init_core(); + init_util(); + initializer = (inst, def) => { + inst.name = "$ZodError"; + Object.defineProperty(inst, "_zod", { + value: inst._zod, + enumerable: false + }); + Object.defineProperty(inst, "issues", { + value: def, + enumerable: false + }); + Object.defineProperty(inst, "message", { + get() { + return JSON.stringify(def, jsonStringifyReplacer, 2); + }, + enumerable: true + // configurable: false, + }); + Object.defineProperty(inst, "toString", { + value: () => inst.message, + enumerable: false + }); + }; + $ZodError = $constructor("$ZodError", initializer); + $ZodRealError = $constructor("$ZodError", initializer, { Parent: Error }); + } + }); + + // node_modules/zod/v4/core/parse.js + var _parse, parse, _parseAsync, parseAsync, _safeParse, safeParse, _safeParseAsync, safeParseAsync; + var init_parse = __esm({ + "node_modules/zod/v4/core/parse.js"() { + init_core(); + init_errors(); + init_util(); + _parse = (_Err) => (schema, value, _ctx, _params) => { + const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false }; + const result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) { + throw new $ZodAsyncError(); + } + if (result.issues.length) { + const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); + captureStackTrace(e, _params?.callee); + throw e; + } + return result.value; + }; + parse = /* @__PURE__ */ _parse($ZodRealError); + _parseAsync = (_Err) => async (schema, value, _ctx, params) => { + const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; + let result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) + result = await result; + if (result.issues.length) { + const e = new (params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); + captureStackTrace(e, params?.callee); + throw e; + } + return result.value; + }; + parseAsync = /* @__PURE__ */ _parseAsync($ZodRealError); + _safeParse = (_Err) => (schema, value, _ctx) => { + const ctx = _ctx ? { ..._ctx, async: false } : { async: false }; + const result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) { + throw new $ZodAsyncError(); + } + return result.issues.length ? { + success: false, + error: new (_Err ?? $ZodError)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + } : { success: true, data: result.value }; + }; + safeParse = /* @__PURE__ */ _safeParse($ZodRealError); + _safeParseAsync = (_Err) => async (schema, value, _ctx) => { + const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; + let result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) + result = await result; + return result.issues.length ? { + success: false, + error: new _Err(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + } : { success: true, data: result.value }; + }; + safeParseAsync = /* @__PURE__ */ _safeParseAsync($ZodRealError); + } + }); + + // node_modules/zod/v4/core/regexes.js + var regexes_exports = {}; + __export(regexes_exports, { + _emoji: () => _emoji, + base64: () => base64, + base64url: () => base64url, + bigint: () => bigint, + boolean: () => boolean, + browserEmail: () => browserEmail, + cidrv4: () => cidrv4, + cidrv6: () => cidrv6, + cuid: () => cuid, + cuid2: () => cuid2, + date: () => date, + datetime: () => datetime, + domain: () => domain, + duration: () => duration, + e164: () => e164, + email: () => email, + emoji: () => emoji, + extendedDuration: () => extendedDuration, + guid: () => guid, + hostname: () => hostname, + html5Email: () => html5Email, + integer: () => integer, + ipv4: () => ipv4, + ipv6: () => ipv6, + ksuid: () => ksuid, + lowercase: () => lowercase, + nanoid: () => nanoid, + null: () => _null, + number: () => number, + rfc5322Email: () => rfc5322Email, + string: () => string, + time: () => time, + ulid: () => ulid, + undefined: () => _undefined, + unicodeEmail: () => unicodeEmail, + uppercase: () => uppercase, + uuid: () => uuid, + uuid4: () => uuid4, + uuid6: () => uuid6, + uuid7: () => uuid7, + xid: () => xid + }); + function emoji() { + return new RegExp(_emoji, "u"); + } + function timeSource(args) { + const hhmm = `(?:[01]\\d|2[0-3]):[0-5]\\d`; + const regex = typeof args.precision === "number" ? args.precision === -1 ? `${hhmm}` : args.precision === 0 ? `${hhmm}:[0-5]\\d` : `${hhmm}:[0-5]\\d\\.\\d{${args.precision}}` : `${hhmm}(?::[0-5]\\d(?:\\.\\d+)?)?`; + return regex; + } + function time(args) { + return new RegExp(`^${timeSource(args)}$`); + } + function datetime(args) { + const time3 = timeSource({ precision: args.precision }); + const opts = ["Z"]; + if (args.local) + opts.push(""); + if (args.offset) + opts.push(`([+-]\\d{2}:\\d{2})`); + const timeRegex = `${time3}(?:${opts.join("|")})`; + return new RegExp(`^${dateSource}T(?:${timeRegex})$`); + } + var cuid, cuid2, ulid, xid, ksuid, nanoid, duration, extendedDuration, guid, uuid, uuid4, uuid6, uuid7, email, html5Email, rfc5322Email, unicodeEmail, browserEmail, _emoji, ipv4, ipv6, cidrv4, cidrv6, base64, base64url, hostname, domain, e164, dateSource, date, string, bigint, integer, number, boolean, _null, _undefined, lowercase, uppercase; + var init_regexes = __esm({ + "node_modules/zod/v4/core/regexes.js"() { + cuid = /^[cC][^\s-]{8,}$/; + cuid2 = /^[0-9a-z]+$/; + ulid = /^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/; + xid = /^[0-9a-vA-V]{20}$/; + ksuid = /^[A-Za-z0-9]{27}$/; + nanoid = /^[a-zA-Z0-9_-]{21}$/; + duration = /^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/; + extendedDuration = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/; + guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/; + uuid = (version2) => { + if (!version2) + return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$/; + return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version2}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`); + }; + uuid4 = /* @__PURE__ */ uuid(4); + uuid6 = /* @__PURE__ */ uuid(6); + uuid7 = /* @__PURE__ */ uuid(7); + email = /^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/; + html5Email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; + rfc5322Email = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + unicodeEmail = /^[^\s@"]{1,64}@[^\s@]{1,255}$/u; + browserEmail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; + _emoji = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; + ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; + ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})$/; + cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/; + cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; + base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/; + base64url = /^[A-Za-z0-9_-]*$/; + hostname = /^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+$/; + domain = /^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/; + e164 = /^\+(?:[0-9]){6,14}[0-9]$/; + dateSource = `(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`; + date = /* @__PURE__ */ new RegExp(`^${dateSource}$`); + string = (params) => { + const regex = params ? `[\\s\\S]{${params?.minimum ?? 0},${params?.maximum ?? ""}}` : `[\\s\\S]*`; + return new RegExp(`^${regex}$`); + }; + bigint = /^\d+n?$/; + integer = /^\d+$/; + number = /^-?\d+(?:\.\d+)?/i; + boolean = /true|false/i; + _null = /null/i; + _undefined = /undefined/i; + lowercase = /^[^A-Z]*$/; + uppercase = /^[^a-z]*$/; + } + }); + + // node_modules/zod/v4/core/checks.js + function handleCheckPropertyResult(result, payload, property) { + if (result.issues.length) { + payload.issues.push(...prefixIssues(property, result.issues)); + } + } + var $ZodCheck, numericOriginMap, $ZodCheckLessThan, $ZodCheckGreaterThan, $ZodCheckMultipleOf, $ZodCheckNumberFormat, $ZodCheckBigIntFormat, $ZodCheckMaxSize, $ZodCheckMinSize, $ZodCheckSizeEquals, $ZodCheckMaxLength, $ZodCheckMinLength, $ZodCheckLengthEquals, $ZodCheckStringFormat, $ZodCheckRegex, $ZodCheckLowerCase, $ZodCheckUpperCase, $ZodCheckIncludes, $ZodCheckStartsWith, $ZodCheckEndsWith, $ZodCheckProperty, $ZodCheckMimeType, $ZodCheckOverwrite; + var init_checks = __esm({ + "node_modules/zod/v4/core/checks.js"() { + init_core(); + init_regexes(); + init_util(); + $ZodCheck = /* @__PURE__ */ $constructor("$ZodCheck", (inst, def) => { + var _a; + inst._zod ?? (inst._zod = {}); + inst._zod.def = def; + (_a = inst._zod).onattach ?? (_a.onattach = []); + }); + numericOriginMap = { + number: "number", + bigint: "bigint", + object: "date" + }; + $ZodCheckLessThan = /* @__PURE__ */ $constructor("$ZodCheckLessThan", (inst, def) => { + $ZodCheck.init(inst, def); + const origin = numericOriginMap[typeof def.value]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY; + if (def.value < curr) { + if (def.inclusive) + bag.maximum = def.value; + else + bag.exclusiveMaximum = def.value; + } + }); + inst._zod.check = (payload) => { + if (def.inclusive ? payload.value <= def.value : payload.value < def.value) { + return; + } + payload.issues.push({ + origin, + code: "too_big", + maximum: def.value, + input: payload.value, + inclusive: def.inclusive, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckGreaterThan = /* @__PURE__ */ $constructor("$ZodCheckGreaterThan", (inst, def) => { + $ZodCheck.init(inst, def); + const origin = numericOriginMap[typeof def.value]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY; + if (def.value > curr) { + if (def.inclusive) + bag.minimum = def.value; + else + bag.exclusiveMinimum = def.value; + } + }); + inst._zod.check = (payload) => { + if (def.inclusive ? payload.value >= def.value : payload.value > def.value) { + return; + } + payload.issues.push({ + origin, + code: "too_small", + minimum: def.value, + input: payload.value, + inclusive: def.inclusive, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckMultipleOf = /* @__PURE__ */ $constructor("$ZodCheckMultipleOf", (inst, def) => { + $ZodCheck.init(inst, def); + inst._zod.onattach.push((inst2) => { + var _a; + (_a = inst2._zod.bag).multipleOf ?? (_a.multipleOf = def.value); + }); + inst._zod.check = (payload) => { + if (typeof payload.value !== typeof def.value) + throw new Error("Cannot mix number and bigint in multiple_of check."); + const isMultiple = typeof payload.value === "bigint" ? payload.value % def.value === BigInt(0) : floatSafeRemainder(payload.value, def.value) === 0; + if (isMultiple) + return; + payload.issues.push({ + origin: typeof payload.value, + code: "not_multiple_of", + divisor: def.value, + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckNumberFormat = /* @__PURE__ */ $constructor("$ZodCheckNumberFormat", (inst, def) => { + $ZodCheck.init(inst, def); + def.format = def.format || "float64"; + const isInt = def.format?.includes("int"); + const origin = isInt ? "int" : "number"; + const [minimum, maximum] = NUMBER_FORMAT_RANGES[def.format]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = def.format; + bag.minimum = minimum; + bag.maximum = maximum; + if (isInt) + bag.pattern = integer; + }); + inst._zod.check = (payload) => { + const input = payload.value; + if (isInt) { + if (!Number.isInteger(input)) { + payload.issues.push({ + expected: origin, + format: def.format, + code: "invalid_type", + input, + inst + }); + return; + } + if (!Number.isSafeInteger(input)) { + if (input > 0) { + payload.issues.push({ + input, + code: "too_big", + maximum: Number.MAX_SAFE_INTEGER, + note: "Integers must be within the safe integer range.", + inst, + origin, + continue: !def.abort + }); + } else { + payload.issues.push({ + input, + code: "too_small", + minimum: Number.MIN_SAFE_INTEGER, + note: "Integers must be within the safe integer range.", + inst, + origin, + continue: !def.abort + }); + } + return; + } + } + if (input < minimum) { + payload.issues.push({ + origin: "number", + input, + code: "too_small", + minimum, + inclusive: true, + inst, + continue: !def.abort + }); + } + if (input > maximum) { + payload.issues.push({ + origin: "number", + input, + code: "too_big", + maximum, + inst + }); + } + }; + }); + $ZodCheckBigIntFormat = /* @__PURE__ */ $constructor("$ZodCheckBigIntFormat", (inst, def) => { + $ZodCheck.init(inst, def); + const [minimum, maximum] = BIGINT_FORMAT_RANGES[def.format]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = def.format; + bag.minimum = minimum; + bag.maximum = maximum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + if (input < minimum) { + payload.issues.push({ + origin: "bigint", + input, + code: "too_small", + minimum, + inclusive: true, + inst, + continue: !def.abort + }); + } + if (input > maximum) { + payload.issues.push({ + origin: "bigint", + input, + code: "too_big", + maximum, + inst + }); + } + }; + }); + $ZodCheckMaxSize = /* @__PURE__ */ $constructor("$ZodCheckMaxSize", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.size !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.maximum ?? Number.POSITIVE_INFINITY; + if (def.maximum < curr) + inst2._zod.bag.maximum = def.maximum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const size = input.size; + if (size <= def.maximum) + return; + payload.issues.push({ + origin: getSizableOrigin(input), + code: "too_big", + maximum: def.maximum, + input, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckMinSize = /* @__PURE__ */ $constructor("$ZodCheckMinSize", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.size !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.minimum ?? Number.NEGATIVE_INFINITY; + if (def.minimum > curr) + inst2._zod.bag.minimum = def.minimum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const size = input.size; + if (size >= def.minimum) + return; + payload.issues.push({ + origin: getSizableOrigin(input), + code: "too_small", + minimum: def.minimum, + input, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckSizeEquals = /* @__PURE__ */ $constructor("$ZodCheckSizeEquals", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.size !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.minimum = def.size; + bag.maximum = def.size; + bag.size = def.size; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const size = input.size; + if (size === def.size) + return; + const tooBig = size > def.size; + payload.issues.push({ + origin: getSizableOrigin(input), + ...tooBig ? { code: "too_big", maximum: def.size } : { code: "too_small", minimum: def.size }, + inclusive: true, + exact: true, + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckMaxLength = /* @__PURE__ */ $constructor("$ZodCheckMaxLength", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.maximum ?? Number.POSITIVE_INFINITY; + if (def.maximum < curr) + inst2._zod.bag.maximum = def.maximum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length <= def.maximum) + return; + const origin = getLengthableOrigin(input); + payload.issues.push({ + origin, + code: "too_big", + maximum: def.maximum, + inclusive: true, + input, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckMinLength = /* @__PURE__ */ $constructor("$ZodCheckMinLength", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.minimum ?? Number.NEGATIVE_INFINITY; + if (def.minimum > curr) + inst2._zod.bag.minimum = def.minimum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length >= def.minimum) + return; + const origin = getLengthableOrigin(input); + payload.issues.push({ + origin, + code: "too_small", + minimum: def.minimum, + inclusive: true, + input, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckLengthEquals = /* @__PURE__ */ $constructor("$ZodCheckLengthEquals", (inst, def) => { + var _a; + $ZodCheck.init(inst, def); + (_a = inst._zod.def).when ?? (_a.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.minimum = def.length; + bag.maximum = def.length; + bag.length = def.length; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length === def.length) + return; + const origin = getLengthableOrigin(input); + const tooBig = length > def.length; + payload.issues.push({ + origin, + ...tooBig ? { code: "too_big", maximum: def.length } : { code: "too_small", minimum: def.length }, + inclusive: true, + exact: true, + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckStringFormat = /* @__PURE__ */ $constructor("$ZodCheckStringFormat", (inst, def) => { + var _a, _b; + $ZodCheck.init(inst, def); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = def.format; + if (def.pattern) { + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(def.pattern); + } + }); + if (def.pattern) + (_a = inst._zod).check ?? (_a.check = (payload) => { + def.pattern.lastIndex = 0; + if (def.pattern.test(payload.value)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: def.format, + input: payload.value, + ...def.pattern ? { pattern: def.pattern.toString() } : {}, + inst, + continue: !def.abort + }); + }); + else + (_b = inst._zod).check ?? (_b.check = () => { + }); + }); + $ZodCheckRegex = /* @__PURE__ */ $constructor("$ZodCheckRegex", (inst, def) => { + $ZodCheckStringFormat.init(inst, def); + inst._zod.check = (payload) => { + def.pattern.lastIndex = 0; + if (def.pattern.test(payload.value)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "regex", + input: payload.value, + pattern: def.pattern.toString(), + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckLowerCase = /* @__PURE__ */ $constructor("$ZodCheckLowerCase", (inst, def) => { + def.pattern ?? (def.pattern = lowercase); + $ZodCheckStringFormat.init(inst, def); + }); + $ZodCheckUpperCase = /* @__PURE__ */ $constructor("$ZodCheckUpperCase", (inst, def) => { + def.pattern ?? (def.pattern = uppercase); + $ZodCheckStringFormat.init(inst, def); + }); + $ZodCheckIncludes = /* @__PURE__ */ $constructor("$ZodCheckIncludes", (inst, def) => { + $ZodCheck.init(inst, def); + const escapedRegex = escapeRegex(def.includes); + const pattern = new RegExp(typeof def.position === "number" ? `^.{${def.position}}${escapedRegex}` : escapedRegex); + def.pattern = pattern; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.includes(def.includes, def.position)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "includes", + includes: def.includes, + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckStartsWith = /* @__PURE__ */ $constructor("$ZodCheckStartsWith", (inst, def) => { + $ZodCheck.init(inst, def); + const pattern = new RegExp(`^${escapeRegex(def.prefix)}.*`); + def.pattern ?? (def.pattern = pattern); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.startsWith(def.prefix)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "starts_with", + prefix: def.prefix, + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckEndsWith = /* @__PURE__ */ $constructor("$ZodCheckEndsWith", (inst, def) => { + $ZodCheck.init(inst, def); + const pattern = new RegExp(`.*${escapeRegex(def.suffix)}$`); + def.pattern ?? (def.pattern = pattern); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.endsWith(def.suffix)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "ends_with", + suffix: def.suffix, + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodCheckProperty = /* @__PURE__ */ $constructor("$ZodCheckProperty", (inst, def) => { + $ZodCheck.init(inst, def); + inst._zod.check = (payload) => { + const result = def.schema._zod.run({ + value: payload.value[def.property], + issues: [] + }, {}); + if (result instanceof Promise) { + return result.then((result2) => handleCheckPropertyResult(result2, payload, def.property)); + } + handleCheckPropertyResult(result, payload, def.property); + return; + }; + }); + $ZodCheckMimeType = /* @__PURE__ */ $constructor("$ZodCheckMimeType", (inst, def) => { + $ZodCheck.init(inst, def); + const mimeSet = new Set(def.mime); + inst._zod.onattach.push((inst2) => { + inst2._zod.bag.mime = def.mime; + }); + inst._zod.check = (payload) => { + if (mimeSet.has(payload.value.type)) + return; + payload.issues.push({ + code: "invalid_value", + values: def.mime, + input: payload.value.type, + inst + }); + }; + }); + $ZodCheckOverwrite = /* @__PURE__ */ $constructor("$ZodCheckOverwrite", (inst, def) => { + $ZodCheck.init(inst, def); + inst._zod.check = (payload) => { + payload.value = def.tx(payload.value); + }; + }); + } + }); + + // node_modules/zod/v4/core/doc.js + var Doc; + var init_doc = __esm({ + "node_modules/zod/v4/core/doc.js"() { + Doc = class { + constructor(args = []) { + this.content = []; + this.indent = 0; + if (this) + this.args = args; + } + indented(fn) { + this.indent += 1; + fn(this); + this.indent -= 1; + } + write(arg) { + if (typeof arg === "function") { + arg(this, { execution: "sync" }); + arg(this, { execution: "async" }); + return; + } + const content = arg; + const lines = content.split("\n").filter((x) => x); + const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length)); + const dedented = lines.map((x) => x.slice(minIndent)).map((x) => " ".repeat(this.indent * 2) + x); + for (const line of dedented) { + this.content.push(line); + } + } + compile() { + const F2 = Function; + const args = this?.args; + const content = this?.content ?? [``]; + const lines = [...content.map((x) => ` ${x}`)]; + return new F2(...args, lines.join("\n")); + } + }; + } + }); + + // node_modules/zod/v4/core/versions.js + var version; + var init_versions = __esm({ + "node_modules/zod/v4/core/versions.js"() { + version = { + major: 4, + minor: 0, + patch: 0 + }; + } + }); + + // node_modules/zod/v4/core/schemas.js + function isValidBase64(data) { + if (data === "") + return true; + if (data.length % 4 !== 0) + return false; + try { + atob(data); + return true; + } catch { + return false; + } + } + function isValidBase64URL(data) { + if (!base64url.test(data)) + return false; + const base643 = data.replace(/[-_]/g, (c) => c === "-" ? "+" : "/"); + const padded = base643.padEnd(Math.ceil(base643.length / 4) * 4, "="); + return isValidBase64(padded); + } + function isValidJWT(token, algorithm = null) { + try { + const tokensParts = token.split("."); + if (tokensParts.length !== 3) + return false; + const [header] = tokensParts; + if (!header) + return false; + const parsedHeader = JSON.parse(atob(header)); + if ("typ" in parsedHeader && parsedHeader?.typ !== "JWT") + return false; + if (!parsedHeader.alg) + return false; + if (algorithm && (!("alg" in parsedHeader) || parsedHeader.alg !== algorithm)) + return false; + return true; + } catch { + return false; + } + } + function handleArrayResult(result, final, index) { + if (result.issues.length) { + final.issues.push(...prefixIssues(index, result.issues)); + } + final.value[index] = result.value; + } + function handleObjectResult(result, final, key) { + if (result.issues.length) { + final.issues.push(...prefixIssues(key, result.issues)); + } + final.value[key] = result.value; + } + function handleOptionalObjectResult(result, final, key, input) { + if (result.issues.length) { + if (input[key] === void 0) { + if (key in input) { + final.value[key] = void 0; + } else { + final.value[key] = result.value; + } + } else { + final.issues.push(...prefixIssues(key, result.issues)); + } + } else if (result.value === void 0) { + if (key in input) + final.value[key] = void 0; + } else { + final.value[key] = result.value; + } + } + function handleUnionResults(results, final, inst, ctx) { + for (const result of results) { + if (result.issues.length === 0) { + final.value = result.value; + return final; + } + } + final.issues.push({ + code: "invalid_union", + input: final.value, + inst, + errors: results.map((result) => result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + }); + return final; + } + function mergeValues(a, b2) { + if (a === b2) { + return { valid: true, data: a }; + } + if (a instanceof Date && b2 instanceof Date && +a === +b2) { + return { valid: true, data: a }; + } + if (isPlainObject(a) && isPlainObject(b2)) { + const bKeys = Object.keys(b2); + const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b2 }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b2[key]); + if (!sharedValue.valid) { + return { + valid: false, + mergeErrorPath: [key, ...sharedValue.mergeErrorPath] + }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; + } + if (Array.isArray(a) && Array.isArray(b2)) { + if (a.length !== b2.length) { + return { valid: false, mergeErrorPath: [] }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b2[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { + valid: false, + mergeErrorPath: [index, ...sharedValue.mergeErrorPath] + }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; + } + return { valid: false, mergeErrorPath: [] }; + } + function handleIntersectionResults(result, left, right) { + if (left.issues.length) { + result.issues.push(...left.issues); + } + if (right.issues.length) { + result.issues.push(...right.issues); + } + if (aborted(result)) + return result; + const merged = mergeValues(left.value, right.value); + if (!merged.valid) { + throw new Error(`Unmergable intersection. Error path: ${JSON.stringify(merged.mergeErrorPath)}`); + } + result.value = merged.data; + return result; + } + function handleTupleResult(result, final, index) { + if (result.issues.length) { + final.issues.push(...prefixIssues(index, result.issues)); + } + final.value[index] = result.value; + } + function handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) { + if (keyResult.issues.length) { + if (propertyKeyTypes.has(typeof key)) { + final.issues.push(...prefixIssues(key, keyResult.issues)); + } else { + final.issues.push({ + origin: "map", + code: "invalid_key", + input, + inst, + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }); + } + } + if (valueResult.issues.length) { + if (propertyKeyTypes.has(typeof key)) { + final.issues.push(...prefixIssues(key, valueResult.issues)); + } else { + final.issues.push({ + origin: "map", + code: "invalid_element", + input, + inst, + key, + issues: valueResult.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }); + } + } + final.value.set(keyResult.value, valueResult.value); + } + function handleSetResult(result, final) { + if (result.issues.length) { + final.issues.push(...result.issues); + } + final.value.add(result.value); + } + function handleDefaultResult(payload, def) { + if (payload.value === void 0) { + payload.value = def.defaultValue; + } + return payload; + } + function handleNonOptionalResult(payload, inst) { + if (!payload.issues.length && payload.value === void 0) { + payload.issues.push({ + code: "invalid_type", + expected: "nonoptional", + input: payload.value, + inst + }); + } + return payload; + } + function handlePipeResult(left, def, ctx) { + if (aborted(left)) { + return left; + } + return def.out._zod.run({ value: left.value, issues: left.issues }, ctx); + } + function handleReadonlyResult(payload) { + payload.value = Object.freeze(payload.value); + return payload; + } + function handleRefineResult(result, payload, input, inst) { + if (!result) { + const _iss = { + code: "custom", + input, + inst, + // incorporates params.error into issue reporting + path: [...inst._zod.def.path ?? []], + // incorporates params.error into issue reporting + continue: !inst._zod.def.abort + // params: inst._zod.def.params, + }; + if (inst._zod.def.params) + _iss.params = inst._zod.def.params; + payload.issues.push(issue(_iss)); + } + } + var $ZodType, $ZodString, $ZodStringFormat, $ZodGUID, $ZodUUID, $ZodEmail, $ZodURL, $ZodEmoji, $ZodNanoID, $ZodCUID, $ZodCUID2, $ZodULID, $ZodXID, $ZodKSUID, $ZodISODateTime, $ZodISODate, $ZodISOTime, $ZodISODuration, $ZodIPv4, $ZodIPv6, $ZodCIDRv4, $ZodCIDRv6, $ZodBase64, $ZodBase64URL, $ZodE164, $ZodJWT, $ZodCustomStringFormat, $ZodNumber, $ZodNumberFormat, $ZodBoolean, $ZodBigInt, $ZodBigIntFormat, $ZodSymbol, $ZodUndefined, $ZodNull, $ZodAny, $ZodUnknown, $ZodNever, $ZodVoid, $ZodDate, $ZodArray, $ZodObject, $ZodUnion, $ZodDiscriminatedUnion, $ZodIntersection, $ZodTuple, $ZodRecord, $ZodMap, $ZodSet, $ZodEnum, $ZodLiteral, $ZodFile, $ZodTransform, $ZodOptional, $ZodNullable, $ZodDefault, $ZodPrefault, $ZodNonOptional, $ZodSuccess, $ZodCatch, $ZodNaN, $ZodPipe, $ZodReadonly, $ZodTemplateLiteral, $ZodPromise, $ZodLazy, $ZodCustom; + var init_schemas = __esm({ + "node_modules/zod/v4/core/schemas.js"() { + init_checks(); + init_core(); + init_doc(); + init_parse(); + init_regexes(); + init_util(); + init_versions(); + init_util(); + $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => { + var _a; + inst ?? (inst = {}); + inst._zod.def = def; + inst._zod.bag = inst._zod.bag || {}; + inst._zod.version = version; + const checks = [...inst._zod.def.checks ?? []]; + if (inst._zod.traits.has("$ZodCheck")) { + checks.unshift(inst); + } + for (const ch of checks) { + for (const fn of ch._zod.onattach) { + fn(inst); + } + } + if (checks.length === 0) { + (_a = inst._zod).deferred ?? (_a.deferred = []); + inst._zod.deferred?.push(() => { + inst._zod.run = inst._zod.parse; + }); + } else { + const runChecks = (payload, checks2, ctx) => { + let isAborted = aborted(payload); + let asyncResult; + for (const ch of checks2) { + if (ch._zod.def.when) { + const shouldRun = ch._zod.def.when(payload); + if (!shouldRun) + continue; + } else if (isAborted) { + continue; + } + const currLen = payload.issues.length; + const _2 = ch._zod.check(payload); + if (_2 instanceof Promise && ctx?.async === false) { + throw new $ZodAsyncError(); + } + if (asyncResult || _2 instanceof Promise) { + asyncResult = (asyncResult ?? Promise.resolve()).then(async () => { + await _2; + const nextLen = payload.issues.length; + if (nextLen === currLen) + return; + if (!isAborted) + isAborted = aborted(payload, currLen); + }); + } else { + const nextLen = payload.issues.length; + if (nextLen === currLen) + continue; + if (!isAborted) + isAborted = aborted(payload, currLen); + } + } + if (asyncResult) { + return asyncResult.then(() => { + return payload; + }); + } + return payload; + }; + inst._zod.run = (payload, ctx) => { + const result = inst._zod.parse(payload, ctx); + if (result instanceof Promise) { + if (ctx.async === false) + throw new $ZodAsyncError(); + return result.then((result2) => runChecks(result2, checks, ctx)); + } + return runChecks(result, checks, ctx); + }; + } + inst["~standard"] = { + validate: (value) => { + try { + const r = safeParse(inst, value); + return r.success ? { value: r.data } : { issues: r.error?.issues }; + } catch (_2) { + return safeParseAsync(inst, value).then((r) => r.success ? { value: r.data } : { issues: r.error?.issues }); + } + }, + vendor: "zod", + version: 1 + }; + }); + $ZodString = /* @__PURE__ */ $constructor("$ZodString", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = [...inst?._zod.bag?.patterns ?? []].pop() ?? string(inst._zod.bag); + inst._zod.parse = (payload, _2) => { + if (def.coerce) + try { + payload.value = String(payload.value); + } catch (_3) { + } + if (typeof payload.value === "string") + return payload; + payload.issues.push({ + expected: "string", + code: "invalid_type", + input: payload.value, + inst + }); + return payload; + }; + }); + $ZodStringFormat = /* @__PURE__ */ $constructor("$ZodStringFormat", (inst, def) => { + $ZodCheckStringFormat.init(inst, def); + $ZodString.init(inst, def); + }); + $ZodGUID = /* @__PURE__ */ $constructor("$ZodGUID", (inst, def) => { + def.pattern ?? (def.pattern = guid); + $ZodStringFormat.init(inst, def); + }); + $ZodUUID = /* @__PURE__ */ $constructor("$ZodUUID", (inst, def) => { + if (def.version) { + const versionMap = { + v1: 1, + v2: 2, + v3: 3, + v4: 4, + v5: 5, + v6: 6, + v7: 7, + v8: 8 + }; + const v2 = versionMap[def.version]; + if (v2 === void 0) + throw new Error(`Invalid UUID version: "${def.version}"`); + def.pattern ?? (def.pattern = uuid(v2)); + } else + def.pattern ?? (def.pattern = uuid()); + $ZodStringFormat.init(inst, def); + }); + $ZodEmail = /* @__PURE__ */ $constructor("$ZodEmail", (inst, def) => { + def.pattern ?? (def.pattern = email); + $ZodStringFormat.init(inst, def); + }); + $ZodURL = /* @__PURE__ */ $constructor("$ZodURL", (inst, def) => { + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + try { + const orig = payload.value; + const url2 = new URL(orig); + const href = url2.href; + if (def.hostname) { + def.hostname.lastIndex = 0; + if (!def.hostname.test(url2.hostname)) { + payload.issues.push({ + code: "invalid_format", + format: "url", + note: "Invalid hostname", + pattern: hostname.source, + input: payload.value, + inst, + continue: !def.abort + }); + } + } + if (def.protocol) { + def.protocol.lastIndex = 0; + if (!def.protocol.test(url2.protocol.endsWith(":") ? url2.protocol.slice(0, -1) : url2.protocol)) { + payload.issues.push({ + code: "invalid_format", + format: "url", + note: "Invalid protocol", + pattern: def.protocol.source, + input: payload.value, + inst, + continue: !def.abort + }); + } + } + if (!orig.endsWith("/") && href.endsWith("/")) { + payload.value = href.slice(0, -1); + } else { + payload.value = href; + } + return; + } catch (_2) { + payload.issues.push({ + code: "invalid_format", + format: "url", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; + }); + $ZodEmoji = /* @__PURE__ */ $constructor("$ZodEmoji", (inst, def) => { + def.pattern ?? (def.pattern = emoji()); + $ZodStringFormat.init(inst, def); + }); + $ZodNanoID = /* @__PURE__ */ $constructor("$ZodNanoID", (inst, def) => { + def.pattern ?? (def.pattern = nanoid); + $ZodStringFormat.init(inst, def); + }); + $ZodCUID = /* @__PURE__ */ $constructor("$ZodCUID", (inst, def) => { + def.pattern ?? (def.pattern = cuid); + $ZodStringFormat.init(inst, def); + }); + $ZodCUID2 = /* @__PURE__ */ $constructor("$ZodCUID2", (inst, def) => { + def.pattern ?? (def.pattern = cuid2); + $ZodStringFormat.init(inst, def); + }); + $ZodULID = /* @__PURE__ */ $constructor("$ZodULID", (inst, def) => { + def.pattern ?? (def.pattern = ulid); + $ZodStringFormat.init(inst, def); + }); + $ZodXID = /* @__PURE__ */ $constructor("$ZodXID", (inst, def) => { + def.pattern ?? (def.pattern = xid); + $ZodStringFormat.init(inst, def); + }); + $ZodKSUID = /* @__PURE__ */ $constructor("$ZodKSUID", (inst, def) => { + def.pattern ?? (def.pattern = ksuid); + $ZodStringFormat.init(inst, def); + }); + $ZodISODateTime = /* @__PURE__ */ $constructor("$ZodISODateTime", (inst, def) => { + def.pattern ?? (def.pattern = datetime(def)); + $ZodStringFormat.init(inst, def); + }); + $ZodISODate = /* @__PURE__ */ $constructor("$ZodISODate", (inst, def) => { + def.pattern ?? (def.pattern = date); + $ZodStringFormat.init(inst, def); + }); + $ZodISOTime = /* @__PURE__ */ $constructor("$ZodISOTime", (inst, def) => { + def.pattern ?? (def.pattern = time(def)); + $ZodStringFormat.init(inst, def); + }); + $ZodISODuration = /* @__PURE__ */ $constructor("$ZodISODuration", (inst, def) => { + def.pattern ?? (def.pattern = duration); + $ZodStringFormat.init(inst, def); + }); + $ZodIPv4 = /* @__PURE__ */ $constructor("$ZodIPv4", (inst, def) => { + def.pattern ?? (def.pattern = ipv4); + $ZodStringFormat.init(inst, def); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = `ipv4`; + }); + }); + $ZodIPv6 = /* @__PURE__ */ $constructor("$ZodIPv6", (inst, def) => { + def.pattern ?? (def.pattern = ipv6); + $ZodStringFormat.init(inst, def); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = `ipv6`; + }); + inst._zod.check = (payload) => { + try { + new URL(`http://[${payload.value}]`); + } catch { + payload.issues.push({ + code: "invalid_format", + format: "ipv6", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; + }); + $ZodCIDRv4 = /* @__PURE__ */ $constructor("$ZodCIDRv4", (inst, def) => { + def.pattern ?? (def.pattern = cidrv4); + $ZodStringFormat.init(inst, def); + }); + $ZodCIDRv6 = /* @__PURE__ */ $constructor("$ZodCIDRv6", (inst, def) => { + def.pattern ?? (def.pattern = cidrv6); + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + const [address, prefix] = payload.value.split("/"); + try { + if (!prefix) + throw new Error(); + const prefixNum = Number(prefix); + if (`${prefixNum}` !== prefix) + throw new Error(); + if (prefixNum < 0 || prefixNum > 128) + throw new Error(); + new URL(`http://[${address}]`); + } catch { + payload.issues.push({ + code: "invalid_format", + format: "cidrv6", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; + }); + $ZodBase64 = /* @__PURE__ */ $constructor("$ZodBase64", (inst, def) => { + def.pattern ?? (def.pattern = base64); + $ZodStringFormat.init(inst, def); + inst._zod.onattach.push((inst2) => { + inst2._zod.bag.contentEncoding = "base64"; + }); + inst._zod.check = (payload) => { + if (isValidBase64(payload.value)) + return; + payload.issues.push({ + code: "invalid_format", + format: "base64", + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodBase64URL = /* @__PURE__ */ $constructor("$ZodBase64URL", (inst, def) => { + def.pattern ?? (def.pattern = base64url); + $ZodStringFormat.init(inst, def); + inst._zod.onattach.push((inst2) => { + inst2._zod.bag.contentEncoding = "base64url"; + }); + inst._zod.check = (payload) => { + if (isValidBase64URL(payload.value)) + return; + payload.issues.push({ + code: "invalid_format", + format: "base64url", + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodE164 = /* @__PURE__ */ $constructor("$ZodE164", (inst, def) => { + def.pattern ?? (def.pattern = e164); + $ZodStringFormat.init(inst, def); + }); + $ZodJWT = /* @__PURE__ */ $constructor("$ZodJWT", (inst, def) => { + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + if (isValidJWT(payload.value, def.alg)) + return; + payload.issues.push({ + code: "invalid_format", + format: "jwt", + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodCustomStringFormat = /* @__PURE__ */ $constructor("$ZodCustomStringFormat", (inst, def) => { + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + if (def.fn(payload.value)) + return; + payload.issues.push({ + code: "invalid_format", + format: def.format, + input: payload.value, + inst, + continue: !def.abort + }); + }; + }); + $ZodNumber = /* @__PURE__ */ $constructor("$ZodNumber", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = inst._zod.bag.pattern ?? number; + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) + try { + payload.value = Number(payload.value); + } catch (_2) { + } + const input = payload.value; + if (typeof input === "number" && !Number.isNaN(input) && Number.isFinite(input)) { + return payload; + } + const received = typeof input === "number" ? Number.isNaN(input) ? "NaN" : !Number.isFinite(input) ? "Infinity" : void 0 : void 0; + payload.issues.push({ + expected: "number", + code: "invalid_type", + input, + inst, + ...received ? { received } : {} + }); + return payload; + }; + }); + $ZodNumberFormat = /* @__PURE__ */ $constructor("$ZodNumber", (inst, def) => { + $ZodCheckNumberFormat.init(inst, def); + $ZodNumber.init(inst, def); + }); + $ZodBoolean = /* @__PURE__ */ $constructor("$ZodBoolean", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = boolean; + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) + try { + payload.value = Boolean(payload.value); + } catch (_2) { + } + const input = payload.value; + if (typeof input === "boolean") + return payload; + payload.issues.push({ + expected: "boolean", + code: "invalid_type", + input, + inst + }); + return payload; + }; + }); + $ZodBigInt = /* @__PURE__ */ $constructor("$ZodBigInt", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = bigint; + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) + try { + payload.value = BigInt(payload.value); + } catch (_2) { + } + if (typeof payload.value === "bigint") + return payload; + payload.issues.push({ + expected: "bigint", + code: "invalid_type", + input: payload.value, + inst + }); + return payload; + }; + }); + $ZodBigIntFormat = /* @__PURE__ */ $constructor("$ZodBigInt", (inst, def) => { + $ZodCheckBigIntFormat.init(inst, def); + $ZodBigInt.init(inst, def); + }); + $ZodSymbol = /* @__PURE__ */ $constructor("$ZodSymbol", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (typeof input === "symbol") + return payload; + payload.issues.push({ + expected: "symbol", + code: "invalid_type", + input, + inst + }); + return payload; + }; + }); + $ZodUndefined = /* @__PURE__ */ $constructor("$ZodUndefined", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = _undefined; + inst._zod.values = /* @__PURE__ */ new Set([void 0]); + inst._zod.optin = "optional"; + inst._zod.optout = "optional"; + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (typeof input === "undefined") + return payload; + payload.issues.push({ + expected: "undefined", + code: "invalid_type", + input, + inst + }); + return payload; + }; + }); + $ZodNull = /* @__PURE__ */ $constructor("$ZodNull", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = _null; + inst._zod.values = /* @__PURE__ */ new Set([null]); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (input === null) + return payload; + payload.issues.push({ + expected: "null", + code: "invalid_type", + input, + inst + }); + return payload; + }; + }); + $ZodAny = /* @__PURE__ */ $constructor("$ZodAny", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload) => payload; + }); + $ZodUnknown = /* @__PURE__ */ $constructor("$ZodUnknown", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload) => payload; + }); + $ZodNever = /* @__PURE__ */ $constructor("$ZodNever", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + payload.issues.push({ + expected: "never", + code: "invalid_type", + input: payload.value, + inst + }); + return payload; + }; + }); + $ZodVoid = /* @__PURE__ */ $constructor("$ZodVoid", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (typeof input === "undefined") + return payload; + payload.issues.push({ + expected: "void", + code: "invalid_type", + input, + inst + }); + return payload; + }; + }); + $ZodDate = /* @__PURE__ */ $constructor("$ZodDate", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) { + try { + payload.value = new Date(payload.value); + } catch (_err) { + } + } + const input = payload.value; + const isDate = input instanceof Date; + const isValidDate = isDate && !Number.isNaN(input.getTime()); + if (isValidDate) + return payload; + payload.issues.push({ + expected: "date", + code: "invalid_type", + input, + ...isDate ? { received: "Invalid Date" } : {}, + inst + }); + return payload; + }; + }); + $ZodArray = /* @__PURE__ */ $constructor("$ZodArray", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!Array.isArray(input)) { + payload.issues.push({ + expected: "array", + code: "invalid_type", + input, + inst + }); + return payload; + } + payload.value = Array(input.length); + const proms = []; + for (let i2 = 0; i2 < input.length; i2++) { + const item = input[i2]; + const result = def.element._zod.run({ + value: item, + issues: [] + }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleArrayResult(result2, payload, i2))); + } else { + handleArrayResult(result, payload, i2); + } + } + if (proms.length) { + return Promise.all(proms).then(() => payload); + } + return payload; + }; + }); + $ZodObject = /* @__PURE__ */ $constructor("$ZodObject", (inst, def) => { + $ZodType.init(inst, def); + const _normalized = cached(() => { + const keys = Object.keys(def.shape); + for (const k2 of keys) { + if (!(def.shape[k2] instanceof $ZodType)) { + throw new Error(`Invalid element at key "${k2}": expected a Zod schema`); + } + } + const okeys = optionalKeys(def.shape); + return { + shape: def.shape, + keys, + keySet: new Set(keys), + numKeys: keys.length, + optionalKeys: new Set(okeys) + }; + }); + defineLazy(inst._zod, "propValues", () => { + const shape = def.shape; + const propValues = {}; + for (const key in shape) { + const field = shape[key]._zod; + if (field.values) { + propValues[key] ?? (propValues[key] = /* @__PURE__ */ new Set()); + for (const v2 of field.values) + propValues[key].add(v2); + } + } + return propValues; + }); + const generateFastpass = (shape) => { + const doc = new Doc(["shape", "payload", "ctx"]); + const normalized = _normalized.value; + const parseStr = (key) => { + const k2 = esc(key); + return `shape[${k2}]._zod.run({ value: input[${k2}], issues: [] }, ctx)`; + }; + doc.write(`const input = payload.value;`); + const ids = /* @__PURE__ */ Object.create(null); + let counter = 0; + for (const key of normalized.keys) { + ids[key] = `key_${counter++}`; + } + doc.write(`const newResult = {}`); + for (const key of normalized.keys) { + if (normalized.optionalKeys.has(key)) { + const id = ids[key]; + doc.write(`const ${id} = ${parseStr(key)};`); + const k2 = esc(key); + doc.write(` + if (${id}.issues.length) { + if (input[${k2}] === undefined) { + if (${k2} in input) { + newResult[${k2}] = undefined; + } + } else { + payload.issues = payload.issues.concat( + ${id}.issues.map((iss) => ({ + ...iss, + path: iss.path ? [${k2}, ...iss.path] : [${k2}], + })) + ); + } + } else if (${id}.value === undefined) { + if (${k2} in input) newResult[${k2}] = undefined; + } else { + newResult[${k2}] = ${id}.value; + } + `); + } else { + const id = ids[key]; + doc.write(`const ${id} = ${parseStr(key)};`); + doc.write(` + if (${id}.issues.length) payload.issues = payload.issues.concat(${id}.issues.map(iss => ({ + ...iss, + path: iss.path ? [${esc(key)}, ...iss.path] : [${esc(key)}] + })));`); + doc.write(`newResult[${esc(key)}] = ${id}.value`); + } + } + doc.write(`payload.value = newResult;`); + doc.write(`return payload;`); + const fn = doc.compile(); + return (payload, ctx) => fn(shape, payload, ctx); + }; + let fastpass; + const isObject2 = isObject; + const jit = !globalConfig.jitless; + const allowsEval2 = allowsEval; + const fastEnabled = jit && allowsEval2.value; + const catchall = def.catchall; + let value; + inst._zod.parse = (payload, ctx) => { + value ?? (value = _normalized.value); + const input = payload.value; + if (!isObject2(input)) { + payload.issues.push({ + expected: "object", + code: "invalid_type", + input, + inst + }); + return payload; + } + const proms = []; + if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) { + if (!fastpass) + fastpass = generateFastpass(def.shape); + payload = fastpass(payload, ctx); + } else { + payload.value = {}; + const shape = value.shape; + for (const key of value.keys) { + const el = shape[key]; + const r = el._zod.run({ value: input[key], issues: [] }, ctx); + const isOptional = el._zod.optin === "optional" && el._zod.optout === "optional"; + if (r instanceof Promise) { + proms.push(r.then((r2) => isOptional ? handleOptionalObjectResult(r2, payload, key, input) : handleObjectResult(r2, payload, key))); + } else if (isOptional) { + handleOptionalObjectResult(r, payload, key, input); + } else { + handleObjectResult(r, payload, key); + } + } + } + if (!catchall) { + return proms.length ? Promise.all(proms).then(() => payload) : payload; + } + const unrecognized = []; + const keySet = value.keySet; + const _catchall = catchall._zod; + const t2 = _catchall.def.type; + for (const key of Object.keys(input)) { + if (keySet.has(key)) + continue; + if (t2 === "never") { + unrecognized.push(key); + continue; + } + const r = _catchall.run({ value: input[key], issues: [] }, ctx); + if (r instanceof Promise) { + proms.push(r.then((r2) => handleObjectResult(r2, payload, key))); + } else { + handleObjectResult(r, payload, key); + } + } + if (unrecognized.length) { + payload.issues.push({ + code: "unrecognized_keys", + keys: unrecognized, + input, + inst + }); + } + if (!proms.length) + return payload; + return Promise.all(proms).then(() => { + return payload; + }); + }; + }); + $ZodUnion = /* @__PURE__ */ $constructor("$ZodUnion", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "optin", () => def.options.some((o) => o._zod.optin === "optional") ? "optional" : void 0); + defineLazy(inst._zod, "optout", () => def.options.some((o) => o._zod.optout === "optional") ? "optional" : void 0); + defineLazy(inst._zod, "values", () => { + if (def.options.every((o) => o._zod.values)) { + return new Set(def.options.flatMap((option) => Array.from(option._zod.values))); + } + return void 0; + }); + defineLazy(inst._zod, "pattern", () => { + if (def.options.every((o) => o._zod.pattern)) { + const patterns = def.options.map((o) => o._zod.pattern); + return new RegExp(`^(${patterns.map((p2) => cleanRegex(p2.source)).join("|")})$`); + } + return void 0; + }); + inst._zod.parse = (payload, ctx) => { + let async = false; + const results = []; + for (const option of def.options) { + const result = option._zod.run({ + value: payload.value, + issues: [] + }, ctx); + if (result instanceof Promise) { + results.push(result); + async = true; + } else { + if (result.issues.length === 0) + return result; + results.push(result); + } + } + if (!async) + return handleUnionResults(results, payload, inst, ctx); + return Promise.all(results).then((results2) => { + return handleUnionResults(results2, payload, inst, ctx); + }); + }; + }); + $ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("$ZodDiscriminatedUnion", (inst, def) => { + $ZodUnion.init(inst, def); + const _super = inst._zod.parse; + defineLazy(inst._zod, "propValues", () => { + const propValues = {}; + for (const option of def.options) { + const pv = option._zod.propValues; + if (!pv || Object.keys(pv).length === 0) + throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(option)}"`); + for (const [k2, v2] of Object.entries(pv)) { + if (!propValues[k2]) + propValues[k2] = /* @__PURE__ */ new Set(); + for (const val of v2) { + propValues[k2].add(val); + } + } + } + return propValues; + }); + const disc = cached(() => { + const opts = def.options; + const map2 = /* @__PURE__ */ new Map(); + for (const o of opts) { + const values = o._zod.propValues[def.discriminator]; + if (!values || values.size === 0) + throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(o)}"`); + for (const v2 of values) { + if (map2.has(v2)) { + throw new Error(`Duplicate discriminator value "${String(v2)}"`); + } + map2.set(v2, o); + } + } + return map2; + }); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!isObject(input)) { + payload.issues.push({ + code: "invalid_type", + expected: "object", + input, + inst + }); + return payload; + } + const opt = disc.value.get(input?.[def.discriminator]); + if (opt) { + return opt._zod.run(payload, ctx); + } + if (def.unionFallback) { + return _super(payload, ctx); + } + payload.issues.push({ + code: "invalid_union", + errors: [], + note: "No matching discriminator", + input, + path: [def.discriminator], + inst + }); + return payload; + }; + }); + $ZodIntersection = /* @__PURE__ */ $constructor("$ZodIntersection", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + const left = def.left._zod.run({ value: input, issues: [] }, ctx); + const right = def.right._zod.run({ value: input, issues: [] }, ctx); + const async = left instanceof Promise || right instanceof Promise; + if (async) { + return Promise.all([left, right]).then(([left2, right2]) => { + return handleIntersectionResults(payload, left2, right2); + }); + } + return handleIntersectionResults(payload, left, right); + }; + }); + $ZodTuple = /* @__PURE__ */ $constructor("$ZodTuple", (inst, def) => { + $ZodType.init(inst, def); + const items = def.items; + const optStart = items.length - [...items].reverse().findIndex((item) => item._zod.optin !== "optional"); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!Array.isArray(input)) { + payload.issues.push({ + input, + inst, + expected: "tuple", + code: "invalid_type" + }); + return payload; + } + payload.value = []; + const proms = []; + if (!def.rest) { + const tooBig = input.length > items.length; + const tooSmall = input.length < optStart - 1; + if (tooBig || tooSmall) { + payload.issues.push({ + input, + inst, + origin: "array", + ...tooBig ? { code: "too_big", maximum: items.length } : { code: "too_small", minimum: items.length } + }); + return payload; + } + } + let i2 = -1; + for (const item of items) { + i2++; + if (i2 >= input.length) { + if (i2 >= optStart) + continue; + } + const result = item._zod.run({ + value: input[i2], + issues: [] + }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleTupleResult(result2, payload, i2))); + } else { + handleTupleResult(result, payload, i2); + } + } + if (def.rest) { + const rest = input.slice(items.length); + for (const el of rest) { + i2++; + const result = def.rest._zod.run({ + value: el, + issues: [] + }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleTupleResult(result2, payload, i2))); + } else { + handleTupleResult(result, payload, i2); + } + } + } + if (proms.length) + return Promise.all(proms).then(() => payload); + return payload; + }; + }); + $ZodRecord = /* @__PURE__ */ $constructor("$ZodRecord", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!isPlainObject(input)) { + payload.issues.push({ + expected: "record", + code: "invalid_type", + input, + inst + }); + return payload; + } + const proms = []; + if (def.keyType._zod.values) { + const values = def.keyType._zod.values; + payload.value = {}; + for (const key of values) { + if (typeof key === "string" || typeof key === "number" || typeof key === "symbol") { + const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => { + if (result2.issues.length) { + payload.issues.push(...prefixIssues(key, result2.issues)); + } + payload.value[key] = result2.value; + })); + } else { + if (result.issues.length) { + payload.issues.push(...prefixIssues(key, result.issues)); + } + payload.value[key] = result.value; + } + } + } + let unrecognized; + for (const key in input) { + if (!values.has(key)) { + unrecognized = unrecognized ?? []; + unrecognized.push(key); + } + } + if (unrecognized && unrecognized.length > 0) { + payload.issues.push({ + code: "unrecognized_keys", + input, + inst, + keys: unrecognized + }); + } + } else { + payload.value = {}; + for (const key of Reflect.ownKeys(input)) { + if (key === "__proto__") + continue; + const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx); + if (keyResult instanceof Promise) { + throw new Error("Async schemas not supported in object keys currently"); + } + if (keyResult.issues.length) { + payload.issues.push({ + origin: "record", + code: "invalid_key", + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())), + input: key, + path: [key], + inst + }); + payload.value[keyResult.value] = keyResult.value; + continue; + } + const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => { + if (result2.issues.length) { + payload.issues.push(...prefixIssues(key, result2.issues)); + } + payload.value[keyResult.value] = result2.value; + })); + } else { + if (result.issues.length) { + payload.issues.push(...prefixIssues(key, result.issues)); + } + payload.value[keyResult.value] = result.value; + } + } + } + if (proms.length) { + return Promise.all(proms).then(() => payload); + } + return payload; + }; + }); + $ZodMap = /* @__PURE__ */ $constructor("$ZodMap", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!(input instanceof Map)) { + payload.issues.push({ + expected: "map", + code: "invalid_type", + input, + inst + }); + return payload; + } + const proms = []; + payload.value = /* @__PURE__ */ new Map(); + for (const [key, value] of input) { + const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx); + const valueResult = def.valueType._zod.run({ value, issues: [] }, ctx); + if (keyResult instanceof Promise || valueResult instanceof Promise) { + proms.push(Promise.all([keyResult, valueResult]).then(([keyResult2, valueResult2]) => { + handleMapResult(keyResult2, valueResult2, payload, key, input, inst, ctx); + })); + } else { + handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx); + } + } + if (proms.length) + return Promise.all(proms).then(() => payload); + return payload; + }; + }); + $ZodSet = /* @__PURE__ */ $constructor("$ZodSet", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!(input instanceof Set)) { + payload.issues.push({ + input, + inst, + expected: "set", + code: "invalid_type" + }); + return payload; + } + const proms = []; + payload.value = /* @__PURE__ */ new Set(); + for (const item of input) { + const result = def.valueType._zod.run({ value: item, issues: [] }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleSetResult(result2, payload))); + } else + handleSetResult(result, payload); + } + if (proms.length) + return Promise.all(proms).then(() => payload); + return payload; + }; + }); + $ZodEnum = /* @__PURE__ */ $constructor("$ZodEnum", (inst, def) => { + $ZodType.init(inst, def); + const values = getEnumValues(def.entries); + inst._zod.values = new Set(values); + inst._zod.pattern = new RegExp(`^(${values.filter((k2) => propertyKeyTypes.has(typeof k2)).map((o) => typeof o === "string" ? escapeRegex(o) : o.toString()).join("|")})$`); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (inst._zod.values.has(input)) { + return payload; + } + payload.issues.push({ + code: "invalid_value", + values, + input, + inst + }); + return payload; + }; + }); + $ZodLiteral = /* @__PURE__ */ $constructor("$ZodLiteral", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.values = new Set(def.values); + inst._zod.pattern = new RegExp(`^(${def.values.map((o) => typeof o === "string" ? escapeRegex(o) : o ? o.toString() : String(o)).join("|")})$`); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (inst._zod.values.has(input)) { + return payload; + } + payload.issues.push({ + code: "invalid_value", + values: def.values, + input, + inst + }); + return payload; + }; + }); + $ZodFile = /* @__PURE__ */ $constructor("$ZodFile", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (input instanceof File) + return payload; + payload.issues.push({ + expected: "file", + code: "invalid_type", + input, + inst + }); + return payload; + }; + }); + $ZodTransform = /* @__PURE__ */ $constructor("$ZodTransform", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + const _out = def.transform(payload.value, payload); + if (_ctx.async) { + const output = _out instanceof Promise ? _out : Promise.resolve(_out); + return output.then((output2) => { + payload.value = output2; + return payload; + }); + } + if (_out instanceof Promise) { + throw new $ZodAsyncError(); + } + payload.value = _out; + return payload; + }; + }); + $ZodOptional = /* @__PURE__ */ $constructor("$ZodOptional", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + inst._zod.optout = "optional"; + defineLazy(inst._zod, "values", () => { + return def.innerType._zod.values ? /* @__PURE__ */ new Set([...def.innerType._zod.values, void 0]) : void 0; + }); + defineLazy(inst._zod, "pattern", () => { + const pattern = def.innerType._zod.pattern; + return pattern ? new RegExp(`^(${cleanRegex(pattern.source)})?$`) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + if (def.innerType._zod.optin === "optional") { + return def.innerType._zod.run(payload, ctx); + } + if (payload.value === void 0) { + return payload; + } + return def.innerType._zod.run(payload, ctx); + }; + }); + $ZodNullable = /* @__PURE__ */ $constructor("$ZodNullable", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "optin", () => def.innerType._zod.optin); + defineLazy(inst._zod, "optout", () => def.innerType._zod.optout); + defineLazy(inst._zod, "pattern", () => { + const pattern = def.innerType._zod.pattern; + return pattern ? new RegExp(`^(${cleanRegex(pattern.source)}|null)$`) : void 0; + }); + defineLazy(inst._zod, "values", () => { + return def.innerType._zod.values ? /* @__PURE__ */ new Set([...def.innerType._zod.values, null]) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + if (payload.value === null) + return payload; + return def.innerType._zod.run(payload, ctx); + }; + }); + $ZodDefault = /* @__PURE__ */ $constructor("$ZodDefault", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + if (payload.value === void 0) { + payload.value = def.defaultValue; + return payload; + } + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => handleDefaultResult(result2, def)); + } + return handleDefaultResult(result, def); + }; + }); + $ZodPrefault = /* @__PURE__ */ $constructor("$ZodPrefault", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + if (payload.value === void 0) { + payload.value = def.defaultValue; + } + return def.innerType._zod.run(payload, ctx); + }; + }); + $ZodNonOptional = /* @__PURE__ */ $constructor("$ZodNonOptional", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "values", () => { + const v2 = def.innerType._zod.values; + return v2 ? new Set([...v2].filter((x) => x !== void 0)) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => handleNonOptionalResult(result2, inst)); + } + return handleNonOptionalResult(result, inst); + }; + }); + $ZodSuccess = /* @__PURE__ */ $constructor("$ZodSuccess", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => { + payload.value = result2.issues.length === 0; + return payload; + }); + } + payload.value = result.issues.length === 0; + return payload; + }; + }); + $ZodCatch = /* @__PURE__ */ $constructor("$ZodCatch", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + defineLazy(inst._zod, "optout", () => def.innerType._zod.optout); + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => { + payload.value = result2.value; + if (result2.issues.length) { + payload.value = def.catchValue({ + ...payload, + error: { + issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }, + input: payload.value + }); + payload.issues = []; + } + return payload; + }); + } + payload.value = result.value; + if (result.issues.length) { + payload.value = def.catchValue({ + ...payload, + error: { + issues: result.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }, + input: payload.value + }); + payload.issues = []; + } + return payload; + }; + }); + $ZodNaN = /* @__PURE__ */ $constructor("$ZodNaN", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + if (typeof payload.value !== "number" || !Number.isNaN(payload.value)) { + payload.issues.push({ + input: payload.value, + inst, + expected: "nan", + code: "invalid_type" + }); + return payload; + } + return payload; + }; + }); + $ZodPipe = /* @__PURE__ */ $constructor("$ZodPipe", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "values", () => def.in._zod.values); + defineLazy(inst._zod, "optin", () => def.in._zod.optin); + defineLazy(inst._zod, "optout", () => def.out._zod.optout); + inst._zod.parse = (payload, ctx) => { + const left = def.in._zod.run(payload, ctx); + if (left instanceof Promise) { + return left.then((left2) => handlePipeResult(left2, def, ctx)); + } + return handlePipeResult(left, def, ctx); + }; + }); + $ZodReadonly = /* @__PURE__ */ $constructor("$ZodReadonly", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "propValues", () => def.innerType._zod.propValues); + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + defineLazy(inst._zod, "optin", () => def.innerType._zod.optin); + defineLazy(inst._zod, "optout", () => def.innerType._zod.optout); + inst._zod.parse = (payload, ctx) => { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then(handleReadonlyResult); + } + return handleReadonlyResult(result); + }; + }); + $ZodTemplateLiteral = /* @__PURE__ */ $constructor("$ZodTemplateLiteral", (inst, def) => { + $ZodType.init(inst, def); + const regexParts = []; + for (const part of def.parts) { + if (part instanceof $ZodType) { + if (!part._zod.pattern) { + throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`); + } + const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern; + if (!source) + throw new Error(`Invalid template literal part: ${part._zod.traits}`); + const start = source.startsWith("^") ? 1 : 0; + const end = source.endsWith("$") ? source.length - 1 : source.length; + regexParts.push(source.slice(start, end)); + } else if (part === null || primitiveTypes.has(typeof part)) { + regexParts.push(escapeRegex(`${part}`)); + } else { + throw new Error(`Invalid template literal part: ${part}`); + } + } + inst._zod.pattern = new RegExp(`^${regexParts.join("")}$`); + inst._zod.parse = (payload, _ctx) => { + if (typeof payload.value !== "string") { + payload.issues.push({ + input: payload.value, + inst, + expected: "template_literal", + code: "invalid_type" + }); + return payload; + } + inst._zod.pattern.lastIndex = 0; + if (!inst._zod.pattern.test(payload.value)) { + payload.issues.push({ + input: payload.value, + inst, + code: "invalid_format", + format: "template_literal", + pattern: inst._zod.pattern.source + }); + return payload; + } + return payload; + }; + }); + $ZodPromise = /* @__PURE__ */ $constructor("$ZodPromise", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + return Promise.resolve(payload.value).then((inner) => def.innerType._zod.run({ value: inner, issues: [] }, ctx)); + }; + }); + $ZodLazy = /* @__PURE__ */ $constructor("$ZodLazy", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "innerType", () => def.getter()); + defineLazy(inst._zod, "pattern", () => inst._zod.innerType._zod.pattern); + defineLazy(inst._zod, "propValues", () => inst._zod.innerType._zod.propValues); + defineLazy(inst._zod, "optin", () => inst._zod.innerType._zod.optin); + defineLazy(inst._zod, "optout", () => inst._zod.innerType._zod.optout); + inst._zod.parse = (payload, ctx) => { + const inner = inst._zod.innerType; + return inner._zod.run(payload, ctx); + }; + }); + $ZodCustom = /* @__PURE__ */ $constructor("$ZodCustom", (inst, def) => { + $ZodCheck.init(inst, def); + $ZodType.init(inst, def); + inst._zod.parse = (payload, _2) => { + return payload; + }; + inst._zod.check = (payload) => { + const input = payload.value; + const r = def.fn(input); + if (r instanceof Promise) { + return r.then((r2) => handleRefineResult(r2, payload, input, inst)); + } + handleRefineResult(r, payload, input, inst); + return; + }; + }); + } + }); + + // node_modules/zod/v4/locales/ar.js + function ar_default() { + return { + localeError: error() + }; + } + var error; + var init_ar = __esm({ + "node_modules/zod/v4/locales/ar.js"() { + init_util(); + error = () => { + const Sizable = { + string: { unit: "\u062D\u0631\u0641", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" }, + file: { unit: "\u0628\u0627\u064A\u062A", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" }, + array: { unit: "\u0639\u0646\u0635\u0631", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" }, + set: { unit: "\u0639\u0646\u0635\u0631", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0645\u062F\u062E\u0644", + email: "\u0628\u0631\u064A\u062F \u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A", + url: "\u0631\u0627\u0628\u0637", + emoji: "\u0625\u064A\u0645\u0648\u062C\u064A", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u062A\u0627\u0631\u064A\u062E \u0648\u0648\u0642\u062A \u0628\u0645\u0639\u064A\u0627\u0631 ISO", + date: "\u062A\u0627\u0631\u064A\u062E \u0628\u0645\u0639\u064A\u0627\u0631 ISO", + time: "\u0648\u0642\u062A \u0628\u0645\u0639\u064A\u0627\u0631 ISO", + duration: "\u0645\u062F\u0629 \u0628\u0645\u0639\u064A\u0627\u0631 ISO", + ipv4: "\u0639\u0646\u0648\u0627\u0646 IPv4", + ipv6: "\u0639\u0646\u0648\u0627\u0646 IPv6", + cidrv4: "\u0645\u062F\u0649 \u0639\u0646\u0627\u0648\u064A\u0646 \u0628\u0635\u064A\u063A\u0629 IPv4", + cidrv6: "\u0645\u062F\u0649 \u0639\u0646\u0627\u0648\u064A\u0646 \u0628\u0635\u064A\u063A\u0629 IPv6", + base64: "\u0646\u064E\u0635 \u0628\u062A\u0631\u0645\u064A\u0632 base64-encoded", + base64url: "\u0646\u064E\u0635 \u0628\u062A\u0631\u0645\u064A\u0632 base64url-encoded", + json_string: "\u0646\u064E\u0635 \u0639\u0644\u0649 \u0647\u064A\u0626\u0629 JSON", + e164: "\u0631\u0642\u0645 \u0647\u0627\u062A\u0641 \u0628\u0645\u0639\u064A\u0627\u0631 E.164", + jwt: "JWT", + template_literal: "\u0645\u062F\u062E\u0644" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 ${issue2.expected}\u060C \u0648\u0644\u0643\u0646 \u062A\u0645 \u0625\u062F\u062E\u0627\u0644 ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 ${stringifyPrimitive(issue2.values[0])}`; + return `\u0627\u062E\u062A\u064A\u0627\u0631 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062A\u0648\u0642\u0639 \u0627\u0646\u062A\u0642\u0627\u0621 \u0623\u062D\u062F \u0647\u0630\u0647 \u0627\u0644\u062E\u064A\u0627\u0631\u0627\u062A: ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return ` \u0623\u0643\u0628\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0623\u0646 \u062A\u0643\u0648\u0646 ${issue2.origin ?? "\u0627\u0644\u0642\u064A\u0645\u0629"} ${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "\u0639\u0646\u0635\u0631"}`; + return `\u0623\u0643\u0628\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0623\u0646 \u062A\u0643\u0648\u0646 ${issue2.origin ?? "\u0627\u0644\u0642\u064A\u0645\u0629"} ${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0623\u0635\u063A\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0644\u0640 ${issue2.origin} \u0623\u0646 \u064A\u0643\u0648\u0646 ${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u0623\u0635\u063A\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0644\u0640 ${issue2.origin} \u0623\u0646 \u064A\u0643\u0648\u0646 ${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0628\u062F\u0623 \u0628\u0640 "${issue2.prefix}"`; + if (_issue.format === "ends_with") + return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0646\u062A\u0647\u064A \u0628\u0640 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u062A\u0636\u0645\u0651\u064E\u0646 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0637\u0627\u0628\u0642 \u0627\u0644\u0646\u0645\u0637 ${_issue.pattern}`; + return `${Nouns[_issue.format] ?? issue2.format} \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644`; + } + case "not_multiple_of": + return `\u0631\u0642\u0645 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0645\u0646 \u0645\u0636\u0627\u0639\u0641\u0627\u062A ${issue2.divisor}`; + case "unrecognized_keys": + return `\u0645\u0639\u0631\u0641${issue2.keys.length > 1 ? "\u0627\u062A" : ""} \u063A\u0631\u064A\u0628${issue2.keys.length > 1 ? "\u0629" : ""}: ${joinValues(issue2.keys, "\u060C ")}`; + case "invalid_key": + return `\u0645\u0639\u0631\u0641 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644 \u0641\u064A ${issue2.origin}`; + case "invalid_union": + return "\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644"; + case "invalid_element": + return `\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644 \u0641\u064A ${issue2.origin}`; + default: + return "\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644"; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/az.js + function az_default() { + return { + localeError: error2() + }; + } + var error2; + var init_az = __esm({ + "node_modules/zod/v4/locales/az.js"() { + init_util(); + error2 = () => { + const Sizable = { + string: { unit: "simvol", verb: "olmal\u0131d\u0131r" }, + file: { unit: "bayt", verb: "olmal\u0131d\u0131r" }, + array: { unit: "element", verb: "olmal\u0131d\u0131r" }, + set: { unit: "element", verb: "olmal\u0131d\u0131r" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "input", + email: "email address", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datetime", + date: "ISO date", + time: "ISO time", + duration: "ISO duration", + ipv4: "IPv4 address", + ipv6: "IPv6 address", + cidrv4: "IPv4 range", + cidrv6: "IPv6 range", + base64: "base64-encoded string", + base64url: "base64url-encoded string", + json_string: "JSON string", + e164: "E.164 number", + jwt: "JWT", + template_literal: "input" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Yanl\u0131\u015F d\u0259y\u0259r: g\xF6zl\u0259nil\u0259n ${issue2.expected}, daxil olan ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Yanl\u0131\u015F d\u0259y\u0259r: g\xF6zl\u0259nil\u0259n ${stringifyPrimitive(issue2.values[0])}`; + return `Yanl\u0131\u015F se\xE7im: a\u015Fa\u011F\u0131dak\u0131lardan biri olmal\u0131d\u0131r: ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\xC7ox b\xF6y\xFCk: g\xF6zl\u0259nil\u0259n ${issue2.origin ?? "d\u0259y\u0259r"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "element"}`; + return `\xC7ox b\xF6y\xFCk: g\xF6zl\u0259nil\u0259n ${issue2.origin ?? "d\u0259y\u0259r"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\xC7ox ki\xE7ik: g\xF6zl\u0259nil\u0259n ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + return `\xC7ox ki\xE7ik: g\xF6zl\u0259nil\u0259n ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Yanl\u0131\u015F m\u0259tn: "${_issue.prefix}" il\u0259 ba\u015Flamal\u0131d\u0131r`; + if (_issue.format === "ends_with") + return `Yanl\u0131\u015F m\u0259tn: "${_issue.suffix}" il\u0259 bitm\u0259lidir`; + if (_issue.format === "includes") + return `Yanl\u0131\u015F m\u0259tn: "${_issue.includes}" daxil olmal\u0131d\u0131r`; + if (_issue.format === "regex") + return `Yanl\u0131\u015F m\u0259tn: ${_issue.pattern} \u015Fablonuna uy\u011Fun olmal\u0131d\u0131r`; + return `Yanl\u0131\u015F ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Yanl\u0131\u015F \u0259d\u0259d: ${issue2.divisor} il\u0259 b\xF6l\xFCn\u0259 bil\u0259n olmal\u0131d\u0131r`; + case "unrecognized_keys": + return `Tan\u0131nmayan a\xE7ar${issue2.keys.length > 1 ? "lar" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} daxilind\u0259 yanl\u0131\u015F a\xE7ar`; + case "invalid_union": + return "Yanl\u0131\u015F d\u0259y\u0259r"; + case "invalid_element": + return `${issue2.origin} daxilind\u0259 yanl\u0131\u015F d\u0259y\u0259r`; + default: + return `Yanl\u0131\u015F d\u0259y\u0259r`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/be.js + function getBelarusianPlural(count, one, few, many) { + const absCount = Math.abs(count); + const lastDigit = absCount % 10; + const lastTwoDigits = absCount % 100; + if (lastTwoDigits >= 11 && lastTwoDigits <= 19) { + return many; + } + if (lastDigit === 1) { + return one; + } + if (lastDigit >= 2 && lastDigit <= 4) { + return few; + } + return many; + } + function be_default() { + return { + localeError: error3() + }; + } + var error3; + var init_be = __esm({ + "node_modules/zod/v4/locales/be.js"() { + init_util(); + error3 = () => { + const Sizable = { + string: { + unit: { + one: "\u0441\u0456\u043C\u0432\u0430\u043B", + few: "\u0441\u0456\u043C\u0432\u0430\u043B\u044B", + many: "\u0441\u0456\u043C\u0432\u0430\u043B\u0430\u045E" + }, + verb: "\u043C\u0435\u0446\u044C" + }, + array: { + unit: { + one: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", + few: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B", + many: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u045E" + }, + verb: "\u043C\u0435\u0446\u044C" + }, + set: { + unit: { + one: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", + few: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B", + many: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u045E" + }, + verb: "\u043C\u0435\u0446\u044C" + }, + file: { + unit: { + one: "\u0431\u0430\u0439\u0442", + few: "\u0431\u0430\u0439\u0442\u044B", + many: "\u0431\u0430\u0439\u0442\u0430\u045E" + }, + verb: "\u043C\u0435\u0446\u044C" + } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u043B\u0456\u043A"; + } + case "object": { + if (Array.isArray(data)) { + return "\u043C\u0430\u0441\u0456\u045E"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0443\u0432\u043E\u0434", + email: "email \u0430\u0434\u0440\u0430\u0441", + url: "URL", + emoji: "\u044D\u043C\u043E\u0434\u0437\u0456", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0434\u0430\u0442\u0430 \u0456 \u0447\u0430\u0441", + date: "ISO \u0434\u0430\u0442\u0430", + time: "ISO \u0447\u0430\u0441", + duration: "ISO \u043F\u0440\u0430\u0446\u044F\u0433\u043B\u0430\u0441\u0446\u044C", + ipv4: "IPv4 \u0430\u0434\u0440\u0430\u0441", + ipv6: "IPv6 \u0430\u0434\u0440\u0430\u0441", + cidrv4: "IPv4 \u0434\u044B\u044F\u043F\u0430\u0437\u043E\u043D", + cidrv6: "IPv6 \u0434\u044B\u044F\u043F\u0430\u0437\u043E\u043D", + base64: "\u0440\u0430\u0434\u043E\u043A \u0443 \u0444\u0430\u0440\u043C\u0430\u0446\u0435 base64", + base64url: "\u0440\u0430\u0434\u043E\u043A \u0443 \u0444\u0430\u0440\u043C\u0430\u0446\u0435 base64url", + json_string: "JSON \u0440\u0430\u0434\u043E\u043A", + e164: "\u043D\u0443\u043C\u0430\u0440 E.164", + jwt: "JWT", + template_literal: "\u0443\u0432\u043E\u0434" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u045E\u0441\u044F ${issue2.expected}, \u0430\u0442\u0440\u044B\u043C\u0430\u043D\u0430 ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F ${stringifyPrimitive(issue2.values[0])}`; + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0432\u0430\u0440\u044B\u044F\u043D\u0442: \u0447\u0430\u043A\u0430\u045E\u0441\u044F \u0430\u0434\u0437\u0456\u043D \u0437 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const maxValue = Number(issue2.maximum); + const unit = getBelarusianPlural(maxValue, sizing.unit.one, sizing.unit.few, sizing.unit.many); + return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u0432\u044F\u043B\u0456\u043A\u0456: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435"} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 ${sizing.verb} ${adj}${issue2.maximum.toString()} ${unit}`; + } + return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u0432\u044F\u043B\u0456\u043A\u0456: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435"} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 \u0431\u044B\u0446\u044C ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const minValue = Number(issue2.minimum); + const unit = getBelarusianPlural(minValue, sizing.unit.one, sizing.unit.few, sizing.unit.many); + return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u043C\u0430\u043B\u044B: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue2.origin} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 ${sizing.verb} ${adj}${issue2.minimum.toString()} ${unit}`; + } + return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u043C\u0430\u043B\u044B: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue2.origin} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 \u0431\u044B\u0446\u044C ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u043F\u0430\u0447\u044B\u043D\u0430\u0446\u0446\u0430 \u0437 "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0437\u0430\u043A\u0430\u043D\u0447\u0432\u0430\u0446\u0446\u0430 \u043D\u0430 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0437\u043C\u044F\u0448\u0447\u0430\u0446\u044C "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0430\u0434\u043F\u0430\u0432\u044F\u0434\u0430\u0446\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`; + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u043B\u0456\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0431\u044B\u0446\u044C \u043A\u0440\u0430\u0442\u043D\u044B\u043C ${issue2.divisor}`; + case "unrecognized_keys": + return `\u041D\u0435\u0440\u0430\u0441\u043F\u0430\u0437\u043D\u0430\u043D\u044B ${issue2.keys.length > 1 ? "\u043A\u043B\u044E\u0447\u044B" : "\u043A\u043B\u044E\u0447"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u043A\u043B\u044E\u0447 \u0443 ${issue2.origin}`; + case "invalid_union": + return "\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434"; + case "invalid_element": + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u0430\u0435 \u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435 \u045E ${issue2.origin}`; + default: + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ca.js + function ca_default() { + return { + localeError: error4() + }; + } + var error4; + var init_ca = __esm({ + "node_modules/zod/v4/locales/ca.js"() { + init_util(); + error4 = () => { + const Sizable = { + string: { unit: "car\xE0cters", verb: "contenir" }, + file: { unit: "bytes", verb: "contenir" }, + array: { unit: "elements", verb: "contenir" }, + set: { unit: "elements", verb: "contenir" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "entrada", + email: "adre\xE7a electr\xF2nica", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "data i hora ISO", + date: "data ISO", + time: "hora ISO", + duration: "durada ISO", + ipv4: "adre\xE7a IPv4", + ipv6: "adre\xE7a IPv6", + cidrv4: "rang IPv4", + cidrv6: "rang IPv6", + base64: "cadena codificada en base64", + base64url: "cadena codificada en base64url", + json_string: "cadena JSON", + e164: "n\xFAmero E.164", + jwt: "JWT", + template_literal: "entrada" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Tipus inv\xE0lid: s'esperava ${issue2.expected}, s'ha rebut ${parsedType4(issue2.input)}`; + // return `Tipus invàlid: s'esperava ${issue.expected}, s'ha rebut ${util.getParsedType(issue.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Valor inv\xE0lid: s'esperava ${stringifyPrimitive(issue2.values[0])}`; + return `Opci\xF3 inv\xE0lida: s'esperava una de ${joinValues(issue2.values, " o ")}`; + case "too_big": { + const adj = issue2.inclusive ? "com a m\xE0xim" : "menys de"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Massa gran: s'esperava que ${issue2.origin ?? "el valor"} contingu\xE9s ${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "elements"}`; + return `Massa gran: s'esperava que ${issue2.origin ?? "el valor"} fos ${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? "com a m\xEDnim" : "m\xE9s de"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Massa petit: s'esperava que ${issue2.origin} contingu\xE9s ${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Massa petit: s'esperava que ${issue2.origin} fos ${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Format inv\xE0lid: ha de comen\xE7ar amb "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Format inv\xE0lid: ha d'acabar amb "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Format inv\xE0lid: ha d'incloure "${_issue.includes}"`; + if (_issue.format === "regex") + return `Format inv\xE0lid: ha de coincidir amb el patr\xF3 ${_issue.pattern}`; + return `Format inv\xE0lid per a ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `N\xFAmero inv\xE0lid: ha de ser m\xFAltiple de ${issue2.divisor}`; + case "unrecognized_keys": + return `Clau${issue2.keys.length > 1 ? "s" : ""} no reconeguda${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Clau inv\xE0lida a ${issue2.origin}`; + case "invalid_union": + return "Entrada inv\xE0lida"; + // Could also be "Tipus d'unió invàlid" but "Entrada invàlida" is more general + case "invalid_element": + return `Element inv\xE0lid a ${issue2.origin}`; + default: + return `Entrada inv\xE0lida`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/cs.js + function cs_default() { + return { + localeError: error5() + }; + } + var error5; + var init_cs = __esm({ + "node_modules/zod/v4/locales/cs.js"() { + init_util(); + error5 = () => { + const Sizable = { + string: { unit: "znak\u016F", verb: "m\xEDt" }, + file: { unit: "bajt\u016F", verb: "m\xEDt" }, + array: { unit: "prvk\u016F", verb: "m\xEDt" }, + set: { unit: "prvk\u016F", verb: "m\xEDt" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u010D\xEDslo"; + } + case "string": { + return "\u0159et\u011Bzec"; + } + case "boolean": { + return "boolean"; + } + case "bigint": { + return "bigint"; + } + case "function": { + return "funkce"; + } + case "symbol": { + return "symbol"; + } + case "undefined": { + return "undefined"; + } + case "object": { + if (Array.isArray(data)) { + return "pole"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "regul\xE1rn\xED v\xFDraz", + email: "e-mailov\xE1 adresa", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "datum a \u010Das ve form\xE1tu ISO", + date: "datum ve form\xE1tu ISO", + time: "\u010Das ve form\xE1tu ISO", + duration: "doba trv\xE1n\xED ISO", + ipv4: "IPv4 adresa", + ipv6: "IPv6 adresa", + cidrv4: "rozsah IPv4", + cidrv6: "rozsah IPv6", + base64: "\u0159et\u011Bzec zak\xF3dovan\xFD ve form\xE1tu base64", + base64url: "\u0159et\u011Bzec zak\xF3dovan\xFD ve form\xE1tu base64url", + json_string: "\u0159et\u011Bzec ve form\xE1tu JSON", + e164: "\u010D\xEDslo E.164", + jwt: "JWT", + template_literal: "vstup" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Neplatn\xFD vstup: o\u010Dek\xE1v\xE1no ${issue2.expected}, obdr\u017Eeno ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Neplatn\xFD vstup: o\u010Dek\xE1v\xE1no ${stringifyPrimitive(issue2.values[0])}`; + return `Neplatn\xE1 mo\u017Enost: o\u010Dek\xE1v\xE1na jedna z hodnot ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Hodnota je p\u0159\xEDli\u0161 velk\xE1: ${issue2.origin ?? "hodnota"} mus\xED m\xEDt ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "prvk\u016F"}`; + } + return `Hodnota je p\u0159\xEDli\u0161 velk\xE1: ${issue2.origin ?? "hodnota"} mus\xED b\xFDt ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Hodnota je p\u0159\xEDli\u0161 mal\xE1: ${issue2.origin ?? "hodnota"} mus\xED m\xEDt ${adj}${issue2.minimum.toString()} ${sizing.unit ?? "prvk\u016F"}`; + } + return `Hodnota je p\u0159\xEDli\u0161 mal\xE1: ${issue2.origin ?? "hodnota"} mus\xED b\xFDt ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Neplatn\xFD \u0159et\u011Bzec: mus\xED za\u010D\xEDnat na "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Neplatn\xFD \u0159et\u011Bzec: mus\xED kon\u010Dit na "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Neplatn\xFD \u0159et\u011Bzec: mus\xED obsahovat "${_issue.includes}"`; + if (_issue.format === "regex") + return `Neplatn\xFD \u0159et\u011Bzec: mus\xED odpov\xEDdat vzoru ${_issue.pattern}`; + return `Neplatn\xFD form\xE1t ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Neplatn\xE9 \u010D\xEDslo: mus\xED b\xFDt n\xE1sobkem ${issue2.divisor}`; + case "unrecognized_keys": + return `Nezn\xE1m\xE9 kl\xED\u010De: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Neplatn\xFD kl\xED\u010D v ${issue2.origin}`; + case "invalid_union": + return "Neplatn\xFD vstup"; + case "invalid_element": + return `Neplatn\xE1 hodnota v ${issue2.origin}`; + default: + return `Neplatn\xFD vstup`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/de.js + function de_default() { + return { + localeError: error6() + }; + } + var error6; + var init_de = __esm({ + "node_modules/zod/v4/locales/de.js"() { + init_util(); + error6 = () => { + const Sizable = { + string: { unit: "Zeichen", verb: "zu haben" }, + file: { unit: "Bytes", verb: "zu haben" }, + array: { unit: "Elemente", verb: "zu haben" }, + set: { unit: "Elemente", verb: "zu haben" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "Zahl"; + } + case "object": { + if (Array.isArray(data)) { + return "Array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "Eingabe", + email: "E-Mail-Adresse", + url: "URL", + emoji: "Emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO-Datum und -Uhrzeit", + date: "ISO-Datum", + time: "ISO-Uhrzeit", + duration: "ISO-Dauer", + ipv4: "IPv4-Adresse", + ipv6: "IPv6-Adresse", + cidrv4: "IPv4-Bereich", + cidrv6: "IPv6-Bereich", + base64: "Base64-codierter String", + base64url: "Base64-URL-codierter String", + json_string: "JSON-String", + e164: "E.164-Nummer", + jwt: "JWT", + template_literal: "Eingabe" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Ung\xFCltige Eingabe: erwartet ${issue2.expected}, erhalten ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Ung\xFCltige Eingabe: erwartet ${stringifyPrimitive(issue2.values[0])}`; + return `Ung\xFCltige Option: erwartet eine von ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Zu gro\xDF: erwartet, dass ${issue2.origin ?? "Wert"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "Elemente"} hat`; + return `Zu gro\xDF: erwartet, dass ${issue2.origin ?? "Wert"} ${adj}${issue2.maximum.toString()} ist`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Zu klein: erwartet, dass ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit} hat`; + } + return `Zu klein: erwartet, dass ${issue2.origin} ${adj}${issue2.minimum.toString()} ist`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Ung\xFCltiger String: muss mit "${_issue.prefix}" beginnen`; + if (_issue.format === "ends_with") + return `Ung\xFCltiger String: muss mit "${_issue.suffix}" enden`; + if (_issue.format === "includes") + return `Ung\xFCltiger String: muss "${_issue.includes}" enthalten`; + if (_issue.format === "regex") + return `Ung\xFCltiger String: muss dem Muster ${_issue.pattern} entsprechen`; + return `Ung\xFCltig: ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ung\xFCltige Zahl: muss ein Vielfaches von ${issue2.divisor} sein`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Unbekannte Schl\xFCssel" : "Unbekannter Schl\xFCssel"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ung\xFCltiger Schl\xFCssel in ${issue2.origin}`; + case "invalid_union": + return "Ung\xFCltige Eingabe"; + case "invalid_element": + return `Ung\xFCltiger Wert in ${issue2.origin}`; + default: + return `Ung\xFCltige Eingabe`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/en.js + function en_default() { + return { + localeError: error7() + }; + } + var parsedType, error7; + var init_en = __esm({ + "node_modules/zod/v4/locales/en.js"() { + init_util(); + parsedType = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + error7 = () => { + const Sizable = { + string: { unit: "characters", verb: "to have" }, + file: { unit: "bytes", verb: "to have" }, + array: { unit: "items", verb: "to have" }, + set: { unit: "items", verb: "to have" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const Nouns = { + regex: "input", + email: "email address", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datetime", + date: "ISO date", + time: "ISO time", + duration: "ISO duration", + ipv4: "IPv4 address", + ipv6: "IPv6 address", + cidrv4: "IPv4 range", + cidrv6: "IPv6 range", + base64: "base64-encoded string", + base64url: "base64url-encoded string", + json_string: "JSON string", + e164: "E.164 number", + jwt: "JWT", + template_literal: "input" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Invalid input: expected ${issue2.expected}, received ${parsedType(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Invalid input: expected ${stringifyPrimitive(issue2.values[0])}`; + return `Invalid option: expected one of ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Too big: expected ${issue2.origin ?? "value"} to have ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elements"}`; + return `Too big: expected ${issue2.origin ?? "value"} to be ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Too small: expected ${issue2.origin} to have ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Too small: expected ${issue2.origin} to be ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Invalid string: must start with "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Invalid string: must end with "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Invalid string: must include "${_issue.includes}"`; + if (_issue.format === "regex") + return `Invalid string: must match pattern ${_issue.pattern}`; + return `Invalid ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Invalid number: must be a multiple of ${issue2.divisor}`; + case "unrecognized_keys": + return `Unrecognized key${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Invalid key in ${issue2.origin}`; + case "invalid_union": + return "Invalid input"; + case "invalid_element": + return `Invalid value in ${issue2.origin}`; + default: + return `Invalid input`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/eo.js + function eo_default() { + return { + localeError: error8() + }; + } + var parsedType2, error8; + var init_eo = __esm({ + "node_modules/zod/v4/locales/eo.js"() { + init_util(); + parsedType2 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "nombro"; + } + case "object": { + if (Array.isArray(data)) { + return "tabelo"; + } + if (data === null) { + return "senvalora"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + error8 = () => { + const Sizable = { + string: { unit: "karaktrojn", verb: "havi" }, + file: { unit: "bajtojn", verb: "havi" }, + array: { unit: "elementojn", verb: "havi" }, + set: { unit: "elementojn", verb: "havi" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const Nouns = { + regex: "enigo", + email: "retadreso", + url: "URL", + emoji: "emo\u011Dio", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO-datotempo", + date: "ISO-dato", + time: "ISO-tempo", + duration: "ISO-da\u016Dro", + ipv4: "IPv4-adreso", + ipv6: "IPv6-adreso", + cidrv4: "IPv4-rango", + cidrv6: "IPv6-rango", + base64: "64-ume kodita karaktraro", + base64url: "URL-64-ume kodita karaktraro", + json_string: "JSON-karaktraro", + e164: "E.164-nombro", + jwt: "JWT", + template_literal: "enigo" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Nevalida enigo: atendi\u011Dis ${issue2.expected}, ricevi\u011Dis ${parsedType2(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Nevalida enigo: atendi\u011Dis ${stringifyPrimitive(issue2.values[0])}`; + return `Nevalida opcio: atendi\u011Dis unu el ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Tro granda: atendi\u011Dis ke ${issue2.origin ?? "valoro"} havu ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementojn"}`; + return `Tro granda: atendi\u011Dis ke ${issue2.origin ?? "valoro"} havu ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Tro malgranda: atendi\u011Dis ke ${issue2.origin} havu ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Tro malgranda: atendi\u011Dis ke ${issue2.origin} estu ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Nevalida karaktraro: devas komenci\u011Di per "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Nevalida karaktraro: devas fini\u011Di per "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Nevalida karaktraro: devas inkluzivi "${_issue.includes}"`; + if (_issue.format === "regex") + return `Nevalida karaktraro: devas kongrui kun la modelo ${_issue.pattern}`; + return `Nevalida ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Nevalida nombro: devas esti oblo de ${issue2.divisor}`; + case "unrecognized_keys": + return `Nekonata${issue2.keys.length > 1 ? "j" : ""} \u015Dlosilo${issue2.keys.length > 1 ? "j" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Nevalida \u015Dlosilo en ${issue2.origin}`; + case "invalid_union": + return "Nevalida enigo"; + case "invalid_element": + return `Nevalida valoro en ${issue2.origin}`; + default: + return `Nevalida enigo`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/es.js + function es_default() { + return { + localeError: error9() + }; + } + var error9; + var init_es = __esm({ + "node_modules/zod/v4/locales/es.js"() { + init_util(); + error9 = () => { + const Sizable = { + string: { unit: "caracteres", verb: "tener" }, + file: { unit: "bytes", verb: "tener" }, + array: { unit: "elementos", verb: "tener" }, + set: { unit: "elementos", verb: "tener" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "n\xFAmero"; + } + case "object": { + if (Array.isArray(data)) { + return "arreglo"; + } + if (data === null) { + return "nulo"; + } + if (Object.getPrototypeOf(data) !== Object.prototype) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "entrada", + email: "direcci\xF3n de correo electr\xF3nico", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "fecha y hora ISO", + date: "fecha ISO", + time: "hora ISO", + duration: "duraci\xF3n ISO", + ipv4: "direcci\xF3n IPv4", + ipv6: "direcci\xF3n IPv6", + cidrv4: "rango IPv4", + cidrv6: "rango IPv6", + base64: "cadena codificada en base64", + base64url: "URL codificada en base64", + json_string: "cadena JSON", + e164: "n\xFAmero E.164", + jwt: "JWT", + template_literal: "entrada" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Entrada inv\xE1lida: se esperaba ${issue2.expected}, recibido ${parsedType4(issue2.input)}`; + // return `Entrada inválida: se esperaba ${issue.expected}, recibido ${util.getParsedType(issue.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Entrada inv\xE1lida: se esperaba ${stringifyPrimitive(issue2.values[0])}`; + return `Opci\xF3n inv\xE1lida: se esperaba una de ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Demasiado grande: se esperaba que ${issue2.origin ?? "valor"} tuviera ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementos"}`; + return `Demasiado grande: se esperaba que ${issue2.origin ?? "valor"} fuera ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Demasiado peque\xF1o: se esperaba que ${issue2.origin} tuviera ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Demasiado peque\xF1o: se esperaba que ${issue2.origin} fuera ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Cadena inv\xE1lida: debe comenzar con "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Cadena inv\xE1lida: debe terminar en "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Cadena inv\xE1lida: debe incluir "${_issue.includes}"`; + if (_issue.format === "regex") + return `Cadena inv\xE1lida: debe coincidir con el patr\xF3n ${_issue.pattern}`; + return `Inv\xE1lido ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `N\xFAmero inv\xE1lido: debe ser m\xFAltiplo de ${issue2.divisor}`; + case "unrecognized_keys": + return `Llave${issue2.keys.length > 1 ? "s" : ""} desconocida${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Llave inv\xE1lida en ${issue2.origin}`; + case "invalid_union": + return "Entrada inv\xE1lida"; + case "invalid_element": + return `Valor inv\xE1lido en ${issue2.origin}`; + default: + return `Entrada inv\xE1lida`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/fa.js + function fa_default() { + return { + localeError: error10() + }; + } + var error10; + var init_fa = __esm({ + "node_modules/zod/v4/locales/fa.js"() { + init_util(); + error10 = () => { + const Sizable = { + string: { unit: "\u06A9\u0627\u0631\u0627\u06A9\u062A\u0631", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" }, + file: { unit: "\u0628\u0627\u06CC\u062A", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" }, + array: { unit: "\u0622\u06CC\u062A\u0645", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" }, + set: { unit: "\u0622\u06CC\u062A\u0645", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u0639\u062F\u062F"; + } + case "object": { + if (Array.isArray(data)) { + return "\u0622\u0631\u0627\u06CC\u0647"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0648\u0631\u0648\u062F\u06CC", + email: "\u0622\u062F\u0631\u0633 \u0627\u06CC\u0645\u06CC\u0644", + url: "URL", + emoji: "\u0627\u06CC\u0645\u0648\u062C\u06CC", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u062A\u0627\u0631\u06CC\u062E \u0648 \u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648", + date: "\u062A\u0627\u0631\u06CC\u062E \u0627\u06CC\u0632\u0648", + time: "\u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648", + duration: "\u0645\u062F\u062A \u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648", + ipv4: "IPv4 \u0622\u062F\u0631\u0633", + ipv6: "IPv6 \u0622\u062F\u0631\u0633", + cidrv4: "IPv4 \u062F\u0627\u0645\u0646\u0647", + cidrv6: "IPv6 \u062F\u0627\u0645\u0646\u0647", + base64: "base64-encoded \u0631\u0634\u062A\u0647", + base64url: "base64url-encoded \u0631\u0634\u062A\u0647", + json_string: "JSON \u0631\u0634\u062A\u0647", + e164: "E.164 \u0639\u062F\u062F", + jwt: "JWT", + template_literal: "\u0648\u0631\u0648\u062F\u06CC" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A ${issue2.expected} \u0645\u06CC\u200C\u0628\u0648\u062F\u060C ${parsedType4(issue2.input)} \u062F\u0631\u06CC\u0627\u0641\u062A \u0634\u062F`; + case "invalid_value": + if (issue2.values.length === 1) { + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A ${stringifyPrimitive(issue2.values[0])} \u0645\u06CC\u200C\u0628\u0648\u062F`; + } + return `\u06AF\u0632\u06CC\u0646\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A \u06CC\u06A9\u06CC \u0627\u0632 ${joinValues(issue2.values, "|")} \u0645\u06CC\u200C\u0628\u0648\u062F`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u062E\u06CC\u0644\u06CC \u0628\u0632\u0631\u06AF: ${issue2.origin ?? "\u0645\u0642\u062F\u0627\u0631"} \u0628\u0627\u06CC\u062F ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0639\u0646\u0635\u0631"} \u0628\u0627\u0634\u062F`; + } + return `\u062E\u06CC\u0644\u06CC \u0628\u0632\u0631\u06AF: ${issue2.origin ?? "\u0645\u0642\u062F\u0627\u0631"} \u0628\u0627\u06CC\u062F ${adj}${issue2.maximum.toString()} \u0628\u0627\u0634\u062F`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u062E\u06CC\u0644\u06CC \u06A9\u0648\u0686\u06A9: ${issue2.origin} \u0628\u0627\u06CC\u062F ${adj}${issue2.minimum.toString()} ${sizing.unit} \u0628\u0627\u0634\u062F`; + } + return `\u062E\u06CC\u0644\u06CC \u06A9\u0648\u0686\u06A9: ${issue2.origin} \u0628\u0627\u06CC\u062F ${adj}${issue2.minimum.toString()} \u0628\u0627\u0634\u062F`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 "${_issue.prefix}" \u0634\u0631\u0648\u0639 \u0634\u0648\u062F`; + } + if (_issue.format === "ends_with") { + return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 "${_issue.suffix}" \u062A\u0645\u0627\u0645 \u0634\u0648\u062F`; + } + if (_issue.format === "includes") { + return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0634\u0627\u0645\u0644 "${_issue.includes}" \u0628\u0627\u0634\u062F`; + } + if (_issue.format === "regex") { + return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 \u0627\u0644\u06AF\u0648\u06CC ${_issue.pattern} \u0645\u0637\u0627\u0628\u0642\u062A \u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F`; + } + return `${Nouns[_issue.format] ?? issue2.format} \u0646\u0627\u0645\u0639\u062A\u0628\u0631`; + } + case "not_multiple_of": + return `\u0639\u062F\u062F \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0645\u0636\u0631\u0628 ${issue2.divisor} \u0628\u0627\u0634\u062F`; + case "unrecognized_keys": + return `\u06A9\u0644\u06CC\u062F${issue2.keys.length > 1 ? "\u0647\u0627\u06CC" : ""} \u0646\u0627\u0634\u0646\u0627\u0633: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u06A9\u0644\u06CC\u062F \u0646\u0627\u0634\u0646\u0627\u0633 \u062F\u0631 ${issue2.origin}`; + case "invalid_union": + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631`; + case "invalid_element": + return `\u0645\u0642\u062F\u0627\u0631 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u062F\u0631 ${issue2.origin}`; + default: + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/fi.js + function fi_default() { + return { + localeError: error11() + }; + } + var error11; + var init_fi = __esm({ + "node_modules/zod/v4/locales/fi.js"() { + init_util(); + error11 = () => { + const Sizable = { + string: { unit: "merkki\xE4", subject: "merkkijonon" }, + file: { unit: "tavua", subject: "tiedoston" }, + array: { unit: "alkiota", subject: "listan" }, + set: { unit: "alkiota", subject: "joukon" }, + number: { unit: "", subject: "luvun" }, + bigint: { unit: "", subject: "suuren kokonaisluvun" }, + int: { unit: "", subject: "kokonaisluvun" }, + date: { unit: "", subject: "p\xE4iv\xE4m\xE4\xE4r\xE4n" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "s\xE4\xE4nn\xF6llinen lauseke", + email: "s\xE4hk\xF6postiosoite", + url: "URL-osoite", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO-aikaleima", + date: "ISO-p\xE4iv\xE4m\xE4\xE4r\xE4", + time: "ISO-aika", + duration: "ISO-kesto", + ipv4: "IPv4-osoite", + ipv6: "IPv6-osoite", + cidrv4: "IPv4-alue", + cidrv6: "IPv6-alue", + base64: "base64-koodattu merkkijono", + base64url: "base64url-koodattu merkkijono", + json_string: "JSON-merkkijono", + e164: "E.164-luku", + jwt: "JWT", + template_literal: "templaattimerkkijono" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Virheellinen tyyppi: odotettiin ${issue2.expected}, oli ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Virheellinen sy\xF6te: t\xE4ytyy olla ${stringifyPrimitive(issue2.values[0])}`; + return `Virheellinen valinta: t\xE4ytyy olla yksi seuraavista: ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Liian suuri: ${sizing.subject} t\xE4ytyy olla ${adj}${issue2.maximum.toString()} ${sizing.unit}`.trim(); + } + return `Liian suuri: arvon t\xE4ytyy olla ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Liian pieni: ${sizing.subject} t\xE4ytyy olla ${adj}${issue2.minimum.toString()} ${sizing.unit}`.trim(); + } + return `Liian pieni: arvon t\xE4ytyy olla ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Virheellinen sy\xF6te: t\xE4ytyy alkaa "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Virheellinen sy\xF6te: t\xE4ytyy loppua "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Virheellinen sy\xF6te: t\xE4ytyy sis\xE4lt\xE4\xE4 "${_issue.includes}"`; + if (_issue.format === "regex") { + return `Virheellinen sy\xF6te: t\xE4ytyy vastata s\xE4\xE4nn\xF6llist\xE4 lauseketta ${_issue.pattern}`; + } + return `Virheellinen ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Virheellinen luku: t\xE4ytyy olla luvun ${issue2.divisor} monikerta`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Tuntemattomat avaimet" : "Tuntematon avain"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return "Virheellinen avain tietueessa"; + case "invalid_union": + return "Virheellinen unioni"; + case "invalid_element": + return "Virheellinen arvo joukossa"; + default: + return `Virheellinen sy\xF6te`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/fr.js + function fr_default() { + return { + localeError: error12() + }; + } + var error12; + var init_fr = __esm({ + "node_modules/zod/v4/locales/fr.js"() { + init_util(); + error12 = () => { + const Sizable = { + string: { unit: "caract\xE8res", verb: "avoir" }, + file: { unit: "octets", verb: "avoir" }, + array: { unit: "\xE9l\xE9ments", verb: "avoir" }, + set: { unit: "\xE9l\xE9ments", verb: "avoir" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "nombre"; + } + case "object": { + if (Array.isArray(data)) { + return "tableau"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "entr\xE9e", + email: "adresse e-mail", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "date et heure ISO", + date: "date ISO", + time: "heure ISO", + duration: "dur\xE9e ISO", + ipv4: "adresse IPv4", + ipv6: "adresse IPv6", + cidrv4: "plage IPv4", + cidrv6: "plage IPv6", + base64: "cha\xEEne encod\xE9e en base64", + base64url: "cha\xEEne encod\xE9e en base64url", + json_string: "cha\xEEne JSON", + e164: "num\xE9ro E.164", + jwt: "JWT", + template_literal: "entr\xE9e" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Entr\xE9e invalide : ${issue2.expected} attendu, ${parsedType4(issue2.input)} re\xE7u`; + case "invalid_value": + if (issue2.values.length === 1) + return `Entr\xE9e invalide : ${stringifyPrimitive(issue2.values[0])} attendu`; + return `Option invalide : une valeur parmi ${joinValues(issue2.values, "|")} attendue`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Trop grand : ${issue2.origin ?? "valeur"} doit ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\xE9l\xE9ment(s)"}`; + return `Trop grand : ${issue2.origin ?? "valeur"} doit \xEAtre ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Trop petit : ${issue2.origin} doit ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Trop petit : ${issue2.origin} doit \xEAtre ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Cha\xEEne invalide : doit commencer par "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Cha\xEEne invalide : doit se terminer par "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Cha\xEEne invalide : doit inclure "${_issue.includes}"`; + if (_issue.format === "regex") + return `Cha\xEEne invalide : doit correspondre au mod\xE8le ${_issue.pattern}`; + return `${Nouns[_issue.format] ?? issue2.format} invalide`; + } + case "not_multiple_of": + return `Nombre invalide : doit \xEAtre un multiple de ${issue2.divisor}`; + case "unrecognized_keys": + return `Cl\xE9${issue2.keys.length > 1 ? "s" : ""} non reconnue${issue2.keys.length > 1 ? "s" : ""} : ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Cl\xE9 invalide dans ${issue2.origin}`; + case "invalid_union": + return "Entr\xE9e invalide"; + case "invalid_element": + return `Valeur invalide dans ${issue2.origin}`; + default: + return `Entr\xE9e invalide`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/fr-CA.js + function fr_CA_default() { + return { + localeError: error13() + }; + } + var error13; + var init_fr_CA = __esm({ + "node_modules/zod/v4/locales/fr-CA.js"() { + init_util(); + error13 = () => { + const Sizable = { + string: { unit: "caract\xE8res", verb: "avoir" }, + file: { unit: "octets", verb: "avoir" }, + array: { unit: "\xE9l\xE9ments", verb: "avoir" }, + set: { unit: "\xE9l\xE9ments", verb: "avoir" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "entr\xE9e", + email: "adresse courriel", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "date-heure ISO", + date: "date ISO", + time: "heure ISO", + duration: "dur\xE9e ISO", + ipv4: "adresse IPv4", + ipv6: "adresse IPv6", + cidrv4: "plage IPv4", + cidrv6: "plage IPv6", + base64: "cha\xEEne encod\xE9e en base64", + base64url: "cha\xEEne encod\xE9e en base64url", + json_string: "cha\xEEne JSON", + e164: "num\xE9ro E.164", + jwt: "JWT", + template_literal: "entr\xE9e" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Entr\xE9e invalide : attendu ${issue2.expected}, re\xE7u ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Entr\xE9e invalide : attendu ${stringifyPrimitive(issue2.values[0])}`; + return `Option invalide : attendu l'une des valeurs suivantes ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "\u2264" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Trop grand : attendu que ${issue2.origin ?? "la valeur"} ait ${adj}${issue2.maximum.toString()} ${sizing.unit}`; + return `Trop grand : attendu que ${issue2.origin ?? "la valeur"} soit ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? "\u2265" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Trop petit : attendu que ${issue2.origin} ait ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Trop petit : attendu que ${issue2.origin} soit ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Cha\xEEne invalide : doit commencer par "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Cha\xEEne invalide : doit se terminer par "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Cha\xEEne invalide : doit inclure "${_issue.includes}"`; + if (_issue.format === "regex") + return `Cha\xEEne invalide : doit correspondre au motif ${_issue.pattern}`; + return `${Nouns[_issue.format] ?? issue2.format} invalide`; + } + case "not_multiple_of": + return `Nombre invalide : doit \xEAtre un multiple de ${issue2.divisor}`; + case "unrecognized_keys": + return `Cl\xE9${issue2.keys.length > 1 ? "s" : ""} non reconnue${issue2.keys.length > 1 ? "s" : ""} : ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Cl\xE9 invalide dans ${issue2.origin}`; + case "invalid_union": + return "Entr\xE9e invalide"; + case "invalid_element": + return `Valeur invalide dans ${issue2.origin}`; + default: + return `Entr\xE9e invalide`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/he.js + function he_default() { + return { + localeError: error14() + }; + } + var error14; + var init_he = __esm({ + "node_modules/zod/v4/locales/he.js"() { + init_util(); + error14 = () => { + const Sizable = { + string: { unit: "\u05D0\u05D5\u05EA\u05D9\u05D5\u05EA", verb: "\u05DC\u05DB\u05DC\u05D5\u05DC" }, + file: { unit: "\u05D1\u05D9\u05D9\u05D8\u05D9\u05DD", verb: "\u05DC\u05DB\u05DC\u05D5\u05DC" }, + array: { unit: "\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD", verb: "\u05DC\u05DB\u05DC\u05D5\u05DC" }, + set: { unit: "\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD", verb: "\u05DC\u05DB\u05DC\u05D5\u05DC" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u05E7\u05DC\u05D8", + email: "\u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D9\u05DE\u05D9\u05D9\u05DC", + url: "\u05DB\u05EA\u05D5\u05D1\u05EA \u05E8\u05E9\u05EA", + emoji: "\u05D0\u05D9\u05DE\u05D5\u05D2'\u05D9", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u05EA\u05D0\u05E8\u05D9\u05DA \u05D5\u05D6\u05DE\u05DF ISO", + date: "\u05EA\u05D0\u05E8\u05D9\u05DA ISO", + time: "\u05D6\u05DE\u05DF ISO", + duration: "\u05DE\u05E9\u05DA \u05D6\u05DE\u05DF ISO", + ipv4: "\u05DB\u05EA\u05D5\u05D1\u05EA IPv4", + ipv6: "\u05DB\u05EA\u05D5\u05D1\u05EA IPv6", + cidrv4: "\u05D8\u05D5\u05D5\u05D7 IPv4", + cidrv6: "\u05D8\u05D5\u05D5\u05D7 IPv6", + base64: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D1\u05D1\u05E1\u05D9\u05E1 64", + base64url: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D1\u05D1\u05E1\u05D9\u05E1 64 \u05DC\u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05E8\u05E9\u05EA", + json_string: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA JSON", + e164: "\u05DE\u05E1\u05E4\u05E8 E.164", + jwt: "JWT", + template_literal: "\u05E7\u05DC\u05D8" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA ${issue2.expected}, \u05D4\u05EA\u05E7\u05D1\u05DC ${parsedType4(issue2.input)}`; + // return `Invalid input: expected ${issue.expected}, received ${util.getParsedType(issue.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA ${stringifyPrimitive(issue2.values[0])}`; + return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA \u05D0\u05D7\u05EA \u05DE\u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9: ${issue2.origin ?? "value"} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elements"}`; + return `\u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9: ${issue2.origin ?? "value"} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${issue2.origin} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${issue2.origin} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D4: \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D1"${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D4: \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05E1\u05EA\u05D9\u05D9\u05DD \u05D1 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D4: \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05DB\u05DC\u05D5\u05DC "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D4: \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D0\u05D9\u05DD \u05DC\u05EA\u05D1\u05E0\u05D9\u05EA ${_issue.pattern}`; + return `${Nouns[_issue.format] ?? issue2.format} \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF`; + } + case "not_multiple_of": + return `\u05DE\u05E1\u05E4\u05E8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D7\u05D9\u05D9\u05D1 \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05DB\u05E4\u05DC\u05D4 \u05E9\u05DC ${issue2.divisor}`; + case "unrecognized_keys": + return `\u05DE\u05E4\u05EA\u05D7${issue2.keys.length > 1 ? "\u05D5\u05EA" : ""} \u05DC\u05D0 \u05DE\u05D6\u05D5\u05D4${issue2.keys.length > 1 ? "\u05D9\u05DD" : "\u05D4"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u05DE\u05E4\u05EA\u05D7 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1${issue2.origin}`; + case "invalid_union": + return "\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF"; + case "invalid_element": + return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1${issue2.origin}`; + default: + return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/hu.js + function hu_default() { + return { + localeError: error15() + }; + } + var error15; + var init_hu = __esm({ + "node_modules/zod/v4/locales/hu.js"() { + init_util(); + error15 = () => { + const Sizable = { + string: { unit: "karakter", verb: "legyen" }, + file: { unit: "byte", verb: "legyen" }, + array: { unit: "elem", verb: "legyen" }, + set: { unit: "elem", verb: "legyen" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "sz\xE1m"; + } + case "object": { + if (Array.isArray(data)) { + return "t\xF6mb"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "bemenet", + email: "email c\xEDm", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO id\u0151b\xE9lyeg", + date: "ISO d\xE1tum", + time: "ISO id\u0151", + duration: "ISO id\u0151intervallum", + ipv4: "IPv4 c\xEDm", + ipv6: "IPv6 c\xEDm", + cidrv4: "IPv4 tartom\xE1ny", + cidrv6: "IPv6 tartom\xE1ny", + base64: "base64-k\xF3dolt string", + base64url: "base64url-k\xF3dolt string", + json_string: "JSON string", + e164: "E.164 sz\xE1m", + jwt: "JWT", + template_literal: "bemenet" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\xC9rv\xE9nytelen bemenet: a v\xE1rt \xE9rt\xE9k ${issue2.expected}, a kapott \xE9rt\xE9k ${parsedType4(issue2.input)}`; + // return `Invalid input: expected ${issue.expected}, received ${util.getParsedType(issue.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\xC9rv\xE9nytelen bemenet: a v\xE1rt \xE9rt\xE9k ${stringifyPrimitive(issue2.values[0])}`; + return `\xC9rv\xE9nytelen opci\xF3: valamelyik \xE9rt\xE9k v\xE1rt ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `T\xFAl nagy: ${issue2.origin ?? "\xE9rt\xE9k"} m\xE9rete t\xFAl nagy ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elem"}`; + return `T\xFAl nagy: a bemeneti \xE9rt\xE9k ${issue2.origin ?? "\xE9rt\xE9k"} t\xFAl nagy: ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `T\xFAl kicsi: a bemeneti \xE9rt\xE9k ${issue2.origin} m\xE9rete t\xFAl kicsi ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `T\xFAl kicsi: a bemeneti \xE9rt\xE9k ${issue2.origin} t\xFAl kicsi ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\xC9rv\xE9nytelen string: "${_issue.prefix}" \xE9rt\xE9kkel kell kezd\u0151dnie`; + if (_issue.format === "ends_with") + return `\xC9rv\xE9nytelen string: "${_issue.suffix}" \xE9rt\xE9kkel kell v\xE9gz\u0151dnie`; + if (_issue.format === "includes") + return `\xC9rv\xE9nytelen string: "${_issue.includes}" \xE9rt\xE9ket kell tartalmaznia`; + if (_issue.format === "regex") + return `\xC9rv\xE9nytelen string: ${_issue.pattern} mint\xE1nak kell megfelelnie`; + return `\xC9rv\xE9nytelen ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\xC9rv\xE9nytelen sz\xE1m: ${issue2.divisor} t\xF6bbsz\xF6r\xF6s\xE9nek kell lennie`; + case "unrecognized_keys": + return `Ismeretlen kulcs${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\xC9rv\xE9nytelen kulcs ${issue2.origin}`; + case "invalid_union": + return "\xC9rv\xE9nytelen bemenet"; + case "invalid_element": + return `\xC9rv\xE9nytelen \xE9rt\xE9k: ${issue2.origin}`; + default: + return `\xC9rv\xE9nytelen bemenet`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/id.js + function id_default() { + return { + localeError: error16() + }; + } + var error16; + var init_id = __esm({ + "node_modules/zod/v4/locales/id.js"() { + init_util(); + error16 = () => { + const Sizable = { + string: { unit: "karakter", verb: "memiliki" }, + file: { unit: "byte", verb: "memiliki" }, + array: { unit: "item", verb: "memiliki" }, + set: { unit: "item", verb: "memiliki" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "input", + email: "alamat email", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "tanggal dan waktu format ISO", + date: "tanggal format ISO", + time: "jam format ISO", + duration: "durasi format ISO", + ipv4: "alamat IPv4", + ipv6: "alamat IPv6", + cidrv4: "rentang alamat IPv4", + cidrv6: "rentang alamat IPv6", + base64: "string dengan enkode base64", + base64url: "string dengan enkode base64url", + json_string: "string JSON", + e164: "angka E.164", + jwt: "JWT", + template_literal: "input" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Input tidak valid: diharapkan ${issue2.expected}, diterima ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Input tidak valid: diharapkan ${stringifyPrimitive(issue2.values[0])}`; + return `Pilihan tidak valid: diharapkan salah satu dari ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Terlalu besar: diharapkan ${issue2.origin ?? "value"} memiliki ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elemen"}`; + return `Terlalu besar: diharapkan ${issue2.origin ?? "value"} menjadi ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Terlalu kecil: diharapkan ${issue2.origin} memiliki ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Terlalu kecil: diharapkan ${issue2.origin} menjadi ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `String tidak valid: harus dimulai dengan "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `String tidak valid: harus berakhir dengan "${_issue.suffix}"`; + if (_issue.format === "includes") + return `String tidak valid: harus menyertakan "${_issue.includes}"`; + if (_issue.format === "regex") + return `String tidak valid: harus sesuai pola ${_issue.pattern}`; + return `${Nouns[_issue.format] ?? issue2.format} tidak valid`; + } + case "not_multiple_of": + return `Angka tidak valid: harus kelipatan dari ${issue2.divisor}`; + case "unrecognized_keys": + return `Kunci tidak dikenali ${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Kunci tidak valid di ${issue2.origin}`; + case "invalid_union": + return "Input tidak valid"; + case "invalid_element": + return `Nilai tidak valid di ${issue2.origin}`; + default: + return `Input tidak valid`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/it.js + function it_default() { + return { + localeError: error17() + }; + } + var error17; + var init_it = __esm({ + "node_modules/zod/v4/locales/it.js"() { + init_util(); + error17 = () => { + const Sizable = { + string: { unit: "caratteri", verb: "avere" }, + file: { unit: "byte", verb: "avere" }, + array: { unit: "elementi", verb: "avere" }, + set: { unit: "elementi", verb: "avere" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "numero"; + } + case "object": { + if (Array.isArray(data)) { + return "vettore"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "input", + email: "indirizzo email", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "data e ora ISO", + date: "data ISO", + time: "ora ISO", + duration: "durata ISO", + ipv4: "indirizzo IPv4", + ipv6: "indirizzo IPv6", + cidrv4: "intervallo IPv4", + cidrv6: "intervallo IPv6", + base64: "stringa codificata in base64", + base64url: "URL codificata in base64", + json_string: "stringa JSON", + e164: "numero E.164", + jwt: "JWT", + template_literal: "input" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Input non valido: atteso ${issue2.expected}, ricevuto ${parsedType4(issue2.input)}`; + // return `Input non valido: atteso ${issue.expected}, ricevuto ${util.getParsedType(issue.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Input non valido: atteso ${stringifyPrimitive(issue2.values[0])}`; + return `Opzione non valida: atteso uno tra ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Troppo grande: ${issue2.origin ?? "valore"} deve avere ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementi"}`; + return `Troppo grande: ${issue2.origin ?? "valore"} deve essere ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Troppo piccolo: ${issue2.origin} deve avere ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Troppo piccolo: ${issue2.origin} deve essere ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Stringa non valida: deve iniziare con "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Stringa non valida: deve terminare con "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Stringa non valida: deve includere "${_issue.includes}"`; + if (_issue.format === "regex") + return `Stringa non valida: deve corrispondere al pattern ${_issue.pattern}`; + return `Invalid ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Numero non valido: deve essere un multiplo di ${issue2.divisor}`; + case "unrecognized_keys": + return `Chiav${issue2.keys.length > 1 ? "i" : "e"} non riconosciut${issue2.keys.length > 1 ? "e" : "a"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Chiave non valida in ${issue2.origin}`; + case "invalid_union": + return "Input non valido"; + case "invalid_element": + return `Valore non valido in ${issue2.origin}`; + default: + return `Input non valido`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ja.js + function ja_default() { + return { + localeError: error18() + }; + } + var error18; + var init_ja = __esm({ + "node_modules/zod/v4/locales/ja.js"() { + init_util(); + error18 = () => { + const Sizable = { + string: { unit: "\u6587\u5B57", verb: "\u3067\u3042\u308B" }, + file: { unit: "\u30D0\u30A4\u30C8", verb: "\u3067\u3042\u308B" }, + array: { unit: "\u8981\u7D20", verb: "\u3067\u3042\u308B" }, + set: { unit: "\u8981\u7D20", verb: "\u3067\u3042\u308B" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u6570\u5024"; + } + case "object": { + if (Array.isArray(data)) { + return "\u914D\u5217"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u5165\u529B\u5024", + email: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9", + url: "URL", + emoji: "\u7D75\u6587\u5B57", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO\u65E5\u6642", + date: "ISO\u65E5\u4ED8", + time: "ISO\u6642\u523B", + duration: "ISO\u671F\u9593", + ipv4: "IPv4\u30A2\u30C9\u30EC\u30B9", + ipv6: "IPv6\u30A2\u30C9\u30EC\u30B9", + cidrv4: "IPv4\u7BC4\u56F2", + cidrv6: "IPv6\u7BC4\u56F2", + base64: "base64\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217", + base64url: "base64url\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217", + json_string: "JSON\u6587\u5B57\u5217", + e164: "E.164\u756A\u53F7", + jwt: "JWT", + template_literal: "\u5165\u529B\u5024" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u7121\u52B9\u306A\u5165\u529B: ${issue2.expected}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F\u304C\u3001${parsedType4(issue2.input)}\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u7121\u52B9\u306A\u5165\u529B: ${stringifyPrimitive(issue2.values[0])}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F`; + return `\u7121\u52B9\u306A\u9078\u629E: ${joinValues(issue2.values, "\u3001")}\u306E\u3044\u305A\u308C\u304B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + case "too_big": { + const adj = issue2.inclusive ? "\u4EE5\u4E0B\u3067\u3042\u308B" : "\u3088\u308A\u5C0F\u3055\u3044"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u5927\u304D\u3059\u304E\u308B\u5024: ${issue2.origin ?? "\u5024"}\u306F${issue2.maximum.toString()}${sizing.unit ?? "\u8981\u7D20"}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + return `\u5927\u304D\u3059\u304E\u308B\u5024: ${issue2.origin ?? "\u5024"}\u306F${issue2.maximum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + } + case "too_small": { + const adj = issue2.inclusive ? "\u4EE5\u4E0A\u3067\u3042\u308B" : "\u3088\u308A\u5927\u304D\u3044"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${issue2.origin}\u306F${issue2.minimum.toString()}${sizing.unit}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${issue2.origin}\u306F${issue2.minimum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.prefix}"\u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + if (_issue.format === "ends_with") + return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.suffix}"\u3067\u7D42\u308F\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + if (_issue.format === "includes") + return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.includes}"\u3092\u542B\u3080\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + if (_issue.format === "regex") + return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \u30D1\u30BF\u30FC\u30F3${_issue.pattern}\u306B\u4E00\u81F4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + return `\u7121\u52B9\u306A${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u7121\u52B9\u306A\u6570\u5024: ${issue2.divisor}\u306E\u500D\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + case "unrecognized_keys": + return `\u8A8D\u8B58\u3055\u308C\u3066\u3044\u306A\u3044\u30AD\u30FC${issue2.keys.length > 1 ? "\u7FA4" : ""}: ${joinValues(issue2.keys, "\u3001")}`; + case "invalid_key": + return `${issue2.origin}\u5185\u306E\u7121\u52B9\u306A\u30AD\u30FC`; + case "invalid_union": + return "\u7121\u52B9\u306A\u5165\u529B"; + case "invalid_element": + return `${issue2.origin}\u5185\u306E\u7121\u52B9\u306A\u5024`; + default: + return `\u7121\u52B9\u306A\u5165\u529B`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/kh.js + function kh_default() { + return { + localeError: error19() + }; + } + var error19; + var init_kh = __esm({ + "node_modules/zod/v4/locales/kh.js"() { + init_util(); + error19 = () => { + const Sizable = { + string: { unit: "\u178F\u17BD\u17A2\u1780\u17D2\u179F\u179A", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" }, + file: { unit: "\u1794\u17C3", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" }, + array: { unit: "\u1792\u17B6\u178F\u17BB", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" }, + set: { unit: "\u1792\u17B6\u178F\u17BB", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "\u1798\u17B7\u1793\u1798\u17C2\u1793\u1787\u17B6\u179B\u17C1\u1781 (NaN)" : "\u179B\u17C1\u1781"; + } + case "object": { + if (Array.isArray(data)) { + return "\u17A2\u17B6\u179A\u17C1 (Array)"; + } + if (data === null) { + return "\u1782\u17D2\u1798\u17B6\u1793\u178F\u1798\u17D2\u179B\u17C3 (null)"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B", + email: "\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793\u17A2\u17CA\u17B8\u1798\u17C2\u179B", + url: "URL", + emoji: "\u179F\u1789\u17D2\u1789\u17B6\u17A2\u17B6\u179A\u1798\u17D2\u1798\u178E\u17CD", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u1780\u17B6\u179B\u1794\u179A\u17B7\u1785\u17D2\u1786\u17C1\u1791 \u1793\u17B7\u1784\u1798\u17C9\u17C4\u1784 ISO", + date: "\u1780\u17B6\u179B\u1794\u179A\u17B7\u1785\u17D2\u1786\u17C1\u1791 ISO", + time: "\u1798\u17C9\u17C4\u1784 ISO", + duration: "\u179A\u1799\u17C8\u1796\u17C1\u179B ISO", + ipv4: "\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv4", + ipv6: "\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv6", + cidrv4: "\u178A\u17C2\u1793\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv4", + cidrv6: "\u178A\u17C2\u1793\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv6", + base64: "\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u17A2\u17CA\u17B7\u1780\u17BC\u178A base64", + base64url: "\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u17A2\u17CA\u17B7\u1780\u17BC\u178A base64url", + json_string: "\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A JSON", + e164: "\u179B\u17C1\u1781 E.164", + jwt: "JWT", + template_literal: "\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.expected} \u1794\u17C9\u17BB\u1793\u17D2\u178F\u17C2\u1791\u1791\u17BD\u179B\u1794\u17B6\u1793 ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${stringifyPrimitive(issue2.values[0])}`; + return `\u1787\u1798\u17D2\u179A\u17BE\u179F\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1787\u17B6\u1798\u17BD\u1799\u1780\u17D2\u1793\u17BB\u1784\u1785\u17C6\u178E\u17C4\u1798 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u1792\u17C6\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.origin ?? "\u178F\u1798\u17D2\u179B\u17C3"} ${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "\u1792\u17B6\u178F\u17BB"}`; + return `\u1792\u17C6\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.origin ?? "\u178F\u1798\u17D2\u179B\u17C3"} ${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u178F\u17BC\u1785\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.origin} ${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u178F\u17BC\u1785\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.origin} ${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1785\u17B6\u1794\u17CB\u1795\u17D2\u178F\u17BE\u1798\u178A\u17C4\u1799 "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1794\u1789\u17D2\u1785\u1794\u17CB\u178A\u17C4\u1799 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1798\u17B6\u1793 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u178F\u17C2\u1795\u17D2\u1782\u17BC\u1795\u17D2\u1782\u1784\u1793\u17B9\u1784\u1791\u1798\u17D2\u179A\u1784\u17CB\u178A\u17C2\u179B\u1794\u17B6\u1793\u1780\u17C6\u178E\u178F\u17CB ${_issue.pattern}`; + return `\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u179B\u17C1\u1781\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u178F\u17C2\u1787\u17B6\u1796\u17A0\u17BB\u1782\u17BB\u178E\u1793\u17C3 ${issue2.divisor}`; + case "unrecognized_keys": + return `\u179A\u1780\u1783\u17BE\u1789\u179F\u17C4\u1798\u17B7\u1793\u179F\u17D2\u1782\u17B6\u179B\u17CB\u17D6 ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u179F\u17C4\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u1793\u17C5\u1780\u17D2\u1793\u17BB\u1784 ${issue2.origin}`; + case "invalid_union": + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C`; + case "invalid_element": + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u1793\u17C5\u1780\u17D2\u1793\u17BB\u1784 ${issue2.origin}`; + default: + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ko.js + function ko_default() { + return { + localeError: error20() + }; + } + var error20; + var init_ko = __esm({ + "node_modules/zod/v4/locales/ko.js"() { + init_util(); + error20 = () => { + const Sizable = { + string: { unit: "\uBB38\uC790", verb: "to have" }, + file: { unit: "\uBC14\uC774\uD2B8", verb: "to have" }, + array: { unit: "\uAC1C", verb: "to have" }, + set: { unit: "\uAC1C", verb: "to have" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\uC785\uB825", + email: "\uC774\uBA54\uC77C \uC8FC\uC18C", + url: "URL", + emoji: "\uC774\uBAA8\uC9C0", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \uB0A0\uC9DC\uC2DC\uAC04", + date: "ISO \uB0A0\uC9DC", + time: "ISO \uC2DC\uAC04", + duration: "ISO \uAE30\uAC04", + ipv4: "IPv4 \uC8FC\uC18C", + ipv6: "IPv6 \uC8FC\uC18C", + cidrv4: "IPv4 \uBC94\uC704", + cidrv6: "IPv6 \uBC94\uC704", + base64: "base64 \uC778\uCF54\uB529 \uBB38\uC790\uC5F4", + base64url: "base64url \uC778\uCF54\uB529 \uBB38\uC790\uC5F4", + json_string: "JSON \uBB38\uC790\uC5F4", + e164: "E.164 \uBC88\uD638", + jwt: "JWT", + template_literal: "\uC785\uB825" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\uC798\uBABB\uB41C \uC785\uB825: \uC608\uC0C1 \uD0C0\uC785\uC740 ${issue2.expected}, \uBC1B\uC740 \uD0C0\uC785\uC740 ${parsedType4(issue2.input)}\uC785\uB2C8\uB2E4`; + case "invalid_value": + if (issue2.values.length === 1) + return `\uC798\uBABB\uB41C \uC785\uB825: \uAC12\uC740 ${stringifyPrimitive(issue2.values[0])} \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`; + return `\uC798\uBABB\uB41C \uC635\uC158: ${joinValues(issue2.values, "\uB610\uB294 ")} \uC911 \uD558\uB098\uC5EC\uC57C \uD569\uB2C8\uB2E4`; + case "too_big": { + const adj = issue2.inclusive ? "\uC774\uD558" : "\uBBF8\uB9CC"; + const suffix = adj === "\uBBF8\uB9CC" ? "\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4" : "\uC5EC\uC57C \uD569\uB2C8\uB2E4"; + const sizing = getSizing(issue2.origin); + const unit = sizing?.unit ?? "\uC694\uC18C"; + if (sizing) + return `${issue2.origin ?? "\uAC12"}\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: ${issue2.maximum.toString()}${unit} ${adj}${suffix}`; + return `${issue2.origin ?? "\uAC12"}\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: ${issue2.maximum.toString()} ${adj}${suffix}`; + } + case "too_small": { + const adj = issue2.inclusive ? "\uC774\uC0C1" : "\uCD08\uACFC"; + const suffix = adj === "\uC774\uC0C1" ? "\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4" : "\uC5EC\uC57C \uD569\uB2C8\uB2E4"; + const sizing = getSizing(issue2.origin); + const unit = sizing?.unit ?? "\uC694\uC18C"; + if (sizing) { + return `${issue2.origin ?? "\uAC12"}\uC774 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4: ${issue2.minimum.toString()}${unit} ${adj}${suffix}`; + } + return `${issue2.origin ?? "\uAC12"}\uC774 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4: ${issue2.minimum.toString()} ${adj}${suffix}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: "${_issue.prefix}"(\uC73C)\uB85C \uC2DC\uC791\uD574\uC57C \uD569\uB2C8\uB2E4`; + } + if (_issue.format === "ends_with") + return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: "${_issue.suffix}"(\uC73C)\uB85C \uB05D\uB098\uC57C \uD569\uB2C8\uB2E4`; + if (_issue.format === "includes") + return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: "${_issue.includes}"\uC744(\uB97C) \uD3EC\uD568\uD574\uC57C \uD569\uB2C8\uB2E4`; + if (_issue.format === "regex") + return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \uC815\uADDC\uC2DD ${_issue.pattern} \uD328\uD134\uACFC \uC77C\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4`; + return `\uC798\uBABB\uB41C ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\uC798\uBABB\uB41C \uC22B\uC790: ${issue2.divisor}\uC758 \uBC30\uC218\uC5EC\uC57C \uD569\uB2C8\uB2E4`; + case "unrecognized_keys": + return `\uC778\uC2DD\uD560 \uC218 \uC5C6\uB294 \uD0A4: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\uC798\uBABB\uB41C \uD0A4: ${issue2.origin}`; + case "invalid_union": + return `\uC798\uBABB\uB41C \uC785\uB825`; + case "invalid_element": + return `\uC798\uBABB\uB41C \uAC12: ${issue2.origin}`; + default: + return `\uC798\uBABB\uB41C \uC785\uB825`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/mk.js + function mk_default() { + return { + localeError: error21() + }; + } + var error21; + var init_mk = __esm({ + "node_modules/zod/v4/locales/mk.js"() { + init_util(); + error21 = () => { + const Sizable = { + string: { unit: "\u0437\u043D\u0430\u0446\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" }, + file: { unit: "\u0431\u0430\u0458\u0442\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" }, + array: { unit: "\u0441\u0442\u0430\u0432\u043A\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" }, + set: { unit: "\u0441\u0442\u0430\u0432\u043A\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u0431\u0440\u043E\u0458"; + } + case "object": { + if (Array.isArray(data)) { + return "\u043D\u0438\u0437\u0430"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0432\u043D\u0435\u0441", + email: "\u0430\u0434\u0440\u0435\u0441\u0430 \u043D\u0430 \u0435-\u043F\u043E\u0448\u0442\u0430", + url: "URL", + emoji: "\u0435\u043C\u043E\u045F\u0438", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0434\u0430\u0442\u0443\u043C \u0438 \u0432\u0440\u0435\u043C\u0435", + date: "ISO \u0434\u0430\u0442\u0443\u043C", + time: "ISO \u0432\u0440\u0435\u043C\u0435", + duration: "ISO \u0432\u0440\u0435\u043C\u0435\u0442\u0440\u0430\u0435\u045A\u0435", + ipv4: "IPv4 \u0430\u0434\u0440\u0435\u0441\u0430", + ipv6: "IPv6 \u0430\u0434\u0440\u0435\u0441\u0430", + cidrv4: "IPv4 \u043E\u043F\u0441\u0435\u0433", + cidrv6: "IPv6 \u043E\u043F\u0441\u0435\u0433", + base64: "base64-\u0435\u043D\u043A\u043E\u0434\u0438\u0440\u0430\u043D\u0430 \u043D\u0438\u0437\u0430", + base64url: "base64url-\u0435\u043D\u043A\u043E\u0434\u0438\u0440\u0430\u043D\u0430 \u043D\u0438\u0437\u0430", + json_string: "JSON \u043D\u0438\u0437\u0430", + e164: "E.164 \u0431\u0440\u043E\u0458", + jwt: "JWT", + template_literal: "\u0432\u043D\u0435\u0441" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.expected}, \u043F\u0440\u0438\u043C\u0435\u043D\u043E ${parsedType4(issue2.input)}`; + // return `Invalid input: expected ${issue.expected}, received ${util.getParsedType(issue.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Invalid input: expected ${stringifyPrimitive(issue2.values[0])}`; + return `\u0413\u0440\u0435\u0448\u0430\u043D\u0430 \u043E\u043F\u0446\u0438\u0458\u0430: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 \u0435\u0434\u043D\u0430 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u0433\u043E\u043B\u0435\u043C: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.origin ?? "\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0430"} \u0434\u0430 \u0438\u043C\u0430 ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0438"}`; + return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u0433\u043E\u043B\u0435\u043C: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.origin ?? "\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0430"} \u0434\u0430 \u0431\u0438\u0434\u0435 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u043C\u0430\u043B: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.origin} \u0434\u0430 \u0438\u043C\u0430 ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u043C\u0430\u043B: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.origin} \u0434\u0430 \u0431\u0438\u0434\u0435 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0437\u0430\u043F\u043E\u0447\u043D\u0443\u0432\u0430 \u0441\u043E "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0437\u0430\u0432\u0440\u0448\u0443\u0432\u0430 \u0441\u043E "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0432\u043A\u043B\u0443\u0447\u0443\u0432\u0430 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u043E\u0434\u0433\u043E\u0430\u0440\u0430 \u043D\u0430 \u043F\u0430\u0442\u0435\u0440\u043D\u043E\u0442 ${_issue.pattern}`; + return `Invalid ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u0413\u0440\u0435\u0448\u0435\u043D \u0431\u0440\u043E\u0458: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0431\u0438\u0434\u0435 \u0434\u0435\u043B\u0438\u0432 \u0441\u043E ${issue2.divisor}`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "\u041D\u0435\u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0435\u043D\u0438 \u043A\u043B\u0443\u0447\u0435\u0432\u0438" : "\u041D\u0435\u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0435\u043D \u043A\u043B\u0443\u0447"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u0413\u0440\u0435\u0448\u0435\u043D \u043A\u043B\u0443\u0447 \u0432\u043E ${issue2.origin}`; + case "invalid_union": + return "\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441"; + case "invalid_element": + return `\u0413\u0440\u0435\u0448\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0432\u043E ${issue2.origin}`; + default: + return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ms.js + function ms_default() { + return { + localeError: error22() + }; + } + var error22; + var init_ms = __esm({ + "node_modules/zod/v4/locales/ms.js"() { + init_util(); + error22 = () => { + const Sizable = { + string: { unit: "aksara", verb: "mempunyai" }, + file: { unit: "bait", verb: "mempunyai" }, + array: { unit: "elemen", verb: "mempunyai" }, + set: { unit: "elemen", verb: "mempunyai" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "nombor"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "input", + email: "alamat e-mel", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "tarikh masa ISO", + date: "tarikh ISO", + time: "masa ISO", + duration: "tempoh ISO", + ipv4: "alamat IPv4", + ipv6: "alamat IPv6", + cidrv4: "julat IPv4", + cidrv6: "julat IPv6", + base64: "string dikodkan base64", + base64url: "string dikodkan base64url", + json_string: "string JSON", + e164: "nombor E.164", + jwt: "JWT", + template_literal: "input" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Input tidak sah: dijangka ${issue2.expected}, diterima ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Input tidak sah: dijangka ${stringifyPrimitive(issue2.values[0])}`; + return `Pilihan tidak sah: dijangka salah satu daripada ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Terlalu besar: dijangka ${issue2.origin ?? "nilai"} ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elemen"}`; + return `Terlalu besar: dijangka ${issue2.origin ?? "nilai"} adalah ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Terlalu kecil: dijangka ${issue2.origin} ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Terlalu kecil: dijangka ${issue2.origin} adalah ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `String tidak sah: mesti bermula dengan "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `String tidak sah: mesti berakhir dengan "${_issue.suffix}"`; + if (_issue.format === "includes") + return `String tidak sah: mesti mengandungi "${_issue.includes}"`; + if (_issue.format === "regex") + return `String tidak sah: mesti sepadan dengan corak ${_issue.pattern}`; + return `${Nouns[_issue.format] ?? issue2.format} tidak sah`; + } + case "not_multiple_of": + return `Nombor tidak sah: perlu gandaan ${issue2.divisor}`; + case "unrecognized_keys": + return `Kunci tidak dikenali: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Kunci tidak sah dalam ${issue2.origin}`; + case "invalid_union": + return "Input tidak sah"; + case "invalid_element": + return `Nilai tidak sah dalam ${issue2.origin}`; + default: + return `Input tidak sah`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/nl.js + function nl_default() { + return { + localeError: error23() + }; + } + var error23; + var init_nl = __esm({ + "node_modules/zod/v4/locales/nl.js"() { + init_util(); + error23 = () => { + const Sizable = { + string: { unit: "tekens" }, + file: { unit: "bytes" }, + array: { unit: "elementen" }, + set: { unit: "elementen" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "getal"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "invoer", + email: "emailadres", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datum en tijd", + date: "ISO datum", + time: "ISO tijd", + duration: "ISO duur", + ipv4: "IPv4-adres", + ipv6: "IPv6-adres", + cidrv4: "IPv4-bereik", + cidrv6: "IPv6-bereik", + base64: "base64-gecodeerde tekst", + base64url: "base64 URL-gecodeerde tekst", + json_string: "JSON string", + e164: "E.164-nummer", + jwt: "JWT", + template_literal: "invoer" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Ongeldige invoer: verwacht ${issue2.expected}, ontving ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Ongeldige invoer: verwacht ${stringifyPrimitive(issue2.values[0])}`; + return `Ongeldige optie: verwacht \xE9\xE9n van ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Te lang: verwacht dat ${issue2.origin ?? "waarde"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementen"} bevat`; + return `Te lang: verwacht dat ${issue2.origin ?? "waarde"} ${adj}${issue2.maximum.toString()} is`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Te kort: verwacht dat ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit} bevat`; + } + return `Te kort: verwacht dat ${issue2.origin} ${adj}${issue2.minimum.toString()} is`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Ongeldige tekst: moet met "${_issue.prefix}" beginnen`; + } + if (_issue.format === "ends_with") + return `Ongeldige tekst: moet op "${_issue.suffix}" eindigen`; + if (_issue.format === "includes") + return `Ongeldige tekst: moet "${_issue.includes}" bevatten`; + if (_issue.format === "regex") + return `Ongeldige tekst: moet overeenkomen met patroon ${_issue.pattern}`; + return `Ongeldig: ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ongeldig getal: moet een veelvoud van ${issue2.divisor} zijn`; + case "unrecognized_keys": + return `Onbekende key${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ongeldige key in ${issue2.origin}`; + case "invalid_union": + return "Ongeldige invoer"; + case "invalid_element": + return `Ongeldige waarde in ${issue2.origin}`; + default: + return `Ongeldige invoer`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/no.js + function no_default() { + return { + localeError: error24() + }; + } + var error24; + var init_no = __esm({ + "node_modules/zod/v4/locales/no.js"() { + init_util(); + error24 = () => { + const Sizable = { + string: { unit: "tegn", verb: "\xE5 ha" }, + file: { unit: "bytes", verb: "\xE5 ha" }, + array: { unit: "elementer", verb: "\xE5 inneholde" }, + set: { unit: "elementer", verb: "\xE5 inneholde" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "tall"; + } + case "object": { + if (Array.isArray(data)) { + return "liste"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "input", + email: "e-postadresse", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO dato- og klokkeslett", + date: "ISO-dato", + time: "ISO-klokkeslett", + duration: "ISO-varighet", + ipv4: "IPv4-omr\xE5de", + ipv6: "IPv6-omr\xE5de", + cidrv4: "IPv4-spekter", + cidrv6: "IPv6-spekter", + base64: "base64-enkodet streng", + base64url: "base64url-enkodet streng", + json_string: "JSON-streng", + e164: "E.164-nummer", + jwt: "JWT", + template_literal: "input" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Ugyldig input: forventet ${issue2.expected}, fikk ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Ugyldig verdi: forventet ${stringifyPrimitive(issue2.values[0])}`; + return `Ugyldig valg: forventet en av ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `For stor(t): forventet ${issue2.origin ?? "value"} til \xE5 ha ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementer"}`; + return `For stor(t): forventet ${issue2.origin ?? "value"} til \xE5 ha ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `For lite(n): forventet ${issue2.origin} til \xE5 ha ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `For lite(n): forventet ${issue2.origin} til \xE5 ha ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Ugyldig streng: m\xE5 starte med "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Ugyldig streng: m\xE5 ende med "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Ugyldig streng: m\xE5 inneholde "${_issue.includes}"`; + if (_issue.format === "regex") + return `Ugyldig streng: m\xE5 matche m\xF8nsteret ${_issue.pattern}`; + return `Ugyldig ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ugyldig tall: m\xE5 v\xE6re et multiplum av ${issue2.divisor}`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Ukjente n\xF8kler" : "Ukjent n\xF8kkel"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ugyldig n\xF8kkel i ${issue2.origin}`; + case "invalid_union": + return "Ugyldig input"; + case "invalid_element": + return `Ugyldig verdi i ${issue2.origin}`; + default: + return `Ugyldig input`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ota.js + function ota_default() { + return { + localeError: error25() + }; + } + var error25; + var init_ota = __esm({ + "node_modules/zod/v4/locales/ota.js"() { + init_util(); + error25 = () => { + const Sizable = { + string: { unit: "harf", verb: "olmal\u0131d\u0131r" }, + file: { unit: "bayt", verb: "olmal\u0131d\u0131r" }, + array: { unit: "unsur", verb: "olmal\u0131d\u0131r" }, + set: { unit: "unsur", verb: "olmal\u0131d\u0131r" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "numara"; + } + case "object": { + if (Array.isArray(data)) { + return "saf"; + } + if (data === null) { + return "gayb"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "giren", + email: "epostag\xE2h", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO heng\xE2m\u0131", + date: "ISO tarihi", + time: "ISO zaman\u0131", + duration: "ISO m\xFCddeti", + ipv4: "IPv4 ni\u015F\xE2n\u0131", + ipv6: "IPv6 ni\u015F\xE2n\u0131", + cidrv4: "IPv4 menzili", + cidrv6: "IPv6 menzili", + base64: "base64-\u015Fifreli metin", + base64url: "base64url-\u015Fifreli metin", + json_string: "JSON metin", + e164: "E.164 say\u0131s\u0131", + jwt: "JWT", + template_literal: "giren" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `F\xE2sit giren: umulan ${issue2.expected}, al\u0131nan ${parsedType4(issue2.input)}`; + // return `Fâsit giren: umulan ${issue.expected}, alınan ${util.getParsedType(issue.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `F\xE2sit giren: umulan ${stringifyPrimitive(issue2.values[0])}`; + return `F\xE2sit tercih: m\xFBteberler ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Fazla b\xFCy\xFCk: ${issue2.origin ?? "value"}, ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elements"} sahip olmal\u0131yd\u0131.`; + return `Fazla b\xFCy\xFCk: ${issue2.origin ?? "value"}, ${adj}${issue2.maximum.toString()} olmal\u0131yd\u0131.`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Fazla k\xFC\xE7\xFCk: ${issue2.origin}, ${adj}${issue2.minimum.toString()} ${sizing.unit} sahip olmal\u0131yd\u0131.`; + } + return `Fazla k\xFC\xE7\xFCk: ${issue2.origin}, ${adj}${issue2.minimum.toString()} olmal\u0131yd\u0131.`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `F\xE2sit metin: "${_issue.prefix}" ile ba\u015Flamal\u0131.`; + if (_issue.format === "ends_with") + return `F\xE2sit metin: "${_issue.suffix}" ile bitmeli.`; + if (_issue.format === "includes") + return `F\xE2sit metin: "${_issue.includes}" ihtiv\xE2 etmeli.`; + if (_issue.format === "regex") + return `F\xE2sit metin: ${_issue.pattern} nak\u015F\u0131na uymal\u0131.`; + return `F\xE2sit ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `F\xE2sit say\u0131: ${issue2.divisor} kat\u0131 olmal\u0131yd\u0131.`; + case "unrecognized_keys": + return `Tan\u0131nmayan anahtar ${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} i\xE7in tan\u0131nmayan anahtar var.`; + case "invalid_union": + return "Giren tan\u0131namad\u0131."; + case "invalid_element": + return `${issue2.origin} i\xE7in tan\u0131nmayan k\u0131ymet var.`; + default: + return `K\u0131ymet tan\u0131namad\u0131.`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ps.js + function ps_default() { + return { + localeError: error26() + }; + } + var error26; + var init_ps = __esm({ + "node_modules/zod/v4/locales/ps.js"() { + init_util(); + error26 = () => { + const Sizable = { + string: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" }, + file: { unit: "\u0628\u0627\u06CC\u067C\u0633", verb: "\u0648\u0644\u0631\u064A" }, + array: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" }, + set: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u0639\u062F\u062F"; + } + case "object": { + if (Array.isArray(data)) { + return "\u0627\u0631\u06D0"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0648\u0631\u0648\u062F\u064A", + email: "\u0628\u0631\u06CC\u069A\u0646\u0627\u0644\u06CC\u06A9", + url: "\u06CC\u0648 \u0622\u0631 \u0627\u0644", + emoji: "\u0627\u06CC\u0645\u0648\u062C\u064A", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u0646\u06CC\u067C\u0647 \u0627\u0648 \u0648\u062E\u062A", + date: "\u0646\u06D0\u067C\u0647", + time: "\u0648\u062E\u062A", + duration: "\u0645\u0648\u062F\u0647", + ipv4: "\u062F IPv4 \u067E\u062A\u0647", + ipv6: "\u062F IPv6 \u067E\u062A\u0647", + cidrv4: "\u062F IPv4 \u0633\u0627\u062D\u0647", + cidrv6: "\u062F IPv6 \u0633\u0627\u062D\u0647", + base64: "base64-encoded \u0645\u062A\u0646", + base64url: "base64url-encoded \u0645\u062A\u0646", + json_string: "JSON \u0645\u062A\u0646", + e164: "\u062F E.164 \u0634\u0645\u06D0\u0631\u0647", + jwt: "JWT", + template_literal: "\u0648\u0631\u0648\u062F\u064A" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F ${issue2.expected} \u0648\u0627\u06CC, \u0645\u06AB\u0631 ${parsedType4(issue2.input)} \u062A\u0631\u0644\u0627\u0633\u0647 \u0634\u0648`; + case "invalid_value": + if (issue2.values.length === 1) { + return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F ${stringifyPrimitive(issue2.values[0])} \u0648\u0627\u06CC`; + } + return `\u0646\u0627\u0633\u0645 \u0627\u0646\u062A\u062E\u0627\u0628: \u0628\u0627\u06CC\u062F \u06CC\u0648 \u0644\u0647 ${joinValues(issue2.values, "|")} \u0685\u062E\u0647 \u0648\u0627\u06CC`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0689\u06CC\u0631 \u0644\u0648\u06CC: ${issue2.origin ?? "\u0627\u0631\u0632\u069A\u062A"} \u0628\u0627\u06CC\u062F ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0639\u0646\u0635\u0631\u0648\u0646\u0647"} \u0648\u0644\u0631\u064A`; + } + return `\u0689\u06CC\u0631 \u0644\u0648\u06CC: ${issue2.origin ?? "\u0627\u0631\u0632\u069A\u062A"} \u0628\u0627\u06CC\u062F ${adj}${issue2.maximum.toString()} \u0648\u064A`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0689\u06CC\u0631 \u06A9\u0648\u0686\u0646\u06CC: ${issue2.origin} \u0628\u0627\u06CC\u062F ${adj}${issue2.minimum.toString()} ${sizing.unit} \u0648\u0644\u0631\u064A`; + } + return `\u0689\u06CC\u0631 \u06A9\u0648\u0686\u0646\u06CC: ${issue2.origin} \u0628\u0627\u06CC\u062F ${adj}${issue2.minimum.toString()} \u0648\u064A`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F "${_issue.prefix}" \u0633\u0631\u0647 \u067E\u06CC\u0644 \u0634\u064A`; + } + if (_issue.format === "ends_with") { + return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F "${_issue.suffix}" \u0633\u0631\u0647 \u067E\u0627\u06CC \u062A\u0647 \u0648\u0631\u0633\u064A\u0696\u064A`; + } + if (_issue.format === "includes") { + return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F "${_issue.includes}" \u0648\u0644\u0631\u064A`; + } + if (_issue.format === "regex") { + return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F ${_issue.pattern} \u0633\u0631\u0647 \u0645\u0637\u0627\u0628\u0642\u062A \u0648\u0644\u0631\u064A`; + } + return `${Nouns[_issue.format] ?? issue2.format} \u0646\u0627\u0633\u0645 \u062F\u06CC`; + } + case "not_multiple_of": + return `\u0646\u0627\u0633\u0645 \u0639\u062F\u062F: \u0628\u0627\u06CC\u062F \u062F ${issue2.divisor} \u0645\u0636\u0631\u0628 \u0648\u064A`; + case "unrecognized_keys": + return `\u0646\u0627\u0633\u0645 ${issue2.keys.length > 1 ? "\u06A9\u0644\u06CC\u0689\u0648\u0646\u0647" : "\u06A9\u0644\u06CC\u0689"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u0646\u0627\u0633\u0645 \u06A9\u0644\u06CC\u0689 \u067E\u0647 ${issue2.origin} \u06A9\u06D0`; + case "invalid_union": + return `\u0646\u0627\u0633\u0645\u0647 \u0648\u0631\u0648\u062F\u064A`; + case "invalid_element": + return `\u0646\u0627\u0633\u0645 \u0639\u0646\u0635\u0631 \u067E\u0647 ${issue2.origin} \u06A9\u06D0`; + default: + return `\u0646\u0627\u0633\u0645\u0647 \u0648\u0631\u0648\u062F\u064A`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/pl.js + function pl_default() { + return { + localeError: error27() + }; + } + var error27; + var init_pl = __esm({ + "node_modules/zod/v4/locales/pl.js"() { + init_util(); + error27 = () => { + const Sizable = { + string: { unit: "znak\xF3w", verb: "mie\u0107" }, + file: { unit: "bajt\xF3w", verb: "mie\u0107" }, + array: { unit: "element\xF3w", verb: "mie\u0107" }, + set: { unit: "element\xF3w", verb: "mie\u0107" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "liczba"; + } + case "object": { + if (Array.isArray(data)) { + return "tablica"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "wyra\u017Cenie", + email: "adres email", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "data i godzina w formacie ISO", + date: "data w formacie ISO", + time: "godzina w formacie ISO", + duration: "czas trwania ISO", + ipv4: "adres IPv4", + ipv6: "adres IPv6", + cidrv4: "zakres IPv4", + cidrv6: "zakres IPv6", + base64: "ci\u0105g znak\xF3w zakodowany w formacie base64", + base64url: "ci\u0105g znak\xF3w zakodowany w formacie base64url", + json_string: "ci\u0105g znak\xF3w w formacie JSON", + e164: "liczba E.164", + jwt: "JWT", + template_literal: "wej\u015Bcie" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano ${issue2.expected}, otrzymano ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano ${stringifyPrimitive(issue2.values[0])}`; + return `Nieprawid\u0142owa opcja: oczekiwano jednej z warto\u015Bci ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Za du\u017Ca warto\u015B\u0107: oczekiwano, \u017Ce ${issue2.origin ?? "warto\u015B\u0107"} b\u0119dzie mie\u0107 ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "element\xF3w"}`; + } + return `Zbyt du\u017C(y/a/e): oczekiwano, \u017Ce ${issue2.origin ?? "warto\u015B\u0107"} b\u0119dzie wynosi\u0107 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Za ma\u0142a warto\u015B\u0107: oczekiwano, \u017Ce ${issue2.origin ?? "warto\u015B\u0107"} b\u0119dzie mie\u0107 ${adj}${issue2.minimum.toString()} ${sizing.unit ?? "element\xF3w"}`; + } + return `Zbyt ma\u0142(y/a/e): oczekiwano, \u017Ce ${issue2.origin ?? "warto\u015B\u0107"} b\u0119dzie wynosi\u0107 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Nieprawid\u0142owy ci\u0105g znak\xF3w: musi zaczyna\u0107 si\u0119 od "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Nieprawid\u0142owy ci\u0105g znak\xF3w: musi ko\u0144czy\u0107 si\u0119 na "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Nieprawid\u0142owy ci\u0105g znak\xF3w: musi zawiera\u0107 "${_issue.includes}"`; + if (_issue.format === "regex") + return `Nieprawid\u0142owy ci\u0105g znak\xF3w: musi odpowiada\u0107 wzorcowi ${_issue.pattern}`; + return `Nieprawid\u0142ow(y/a/e) ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Nieprawid\u0142owa liczba: musi by\u0107 wielokrotno\u015Bci\u0105 ${issue2.divisor}`; + case "unrecognized_keys": + return `Nierozpoznane klucze${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Nieprawid\u0142owy klucz w ${issue2.origin}`; + case "invalid_union": + return "Nieprawid\u0142owe dane wej\u015Bciowe"; + case "invalid_element": + return `Nieprawid\u0142owa warto\u015B\u0107 w ${issue2.origin}`; + default: + return `Nieprawid\u0142owe dane wej\u015Bciowe`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/pt.js + function pt_default() { + return { + localeError: error28() + }; + } + var error28; + var init_pt = __esm({ + "node_modules/zod/v4/locales/pt.js"() { + init_util(); + error28 = () => { + const Sizable = { + string: { unit: "caracteres", verb: "ter" }, + file: { unit: "bytes", verb: "ter" }, + array: { unit: "itens", verb: "ter" }, + set: { unit: "itens", verb: "ter" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "n\xFAmero"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "nulo"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "padr\xE3o", + email: "endere\xE7o de e-mail", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "data e hora ISO", + date: "data ISO", + time: "hora ISO", + duration: "dura\xE7\xE3o ISO", + ipv4: "endere\xE7o IPv4", + ipv6: "endere\xE7o IPv6", + cidrv4: "faixa de IPv4", + cidrv6: "faixa de IPv6", + base64: "texto codificado em base64", + base64url: "URL codificada em base64", + json_string: "texto JSON", + e164: "n\xFAmero E.164", + jwt: "JWT", + template_literal: "entrada" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Tipo inv\xE1lido: esperado ${issue2.expected}, recebido ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Entrada inv\xE1lida: esperado ${stringifyPrimitive(issue2.values[0])}`; + return `Op\xE7\xE3o inv\xE1lida: esperada uma das ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Muito grande: esperado que ${issue2.origin ?? "valor"} tivesse ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementos"}`; + return `Muito grande: esperado que ${issue2.origin ?? "valor"} fosse ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Muito pequeno: esperado que ${issue2.origin} tivesse ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Muito pequeno: esperado que ${issue2.origin} fosse ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Texto inv\xE1lido: deve come\xE7ar com "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Texto inv\xE1lido: deve terminar com "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Texto inv\xE1lido: deve incluir "${_issue.includes}"`; + if (_issue.format === "regex") + return `Texto inv\xE1lido: deve corresponder ao padr\xE3o ${_issue.pattern}`; + return `${Nouns[_issue.format] ?? issue2.format} inv\xE1lido`; + } + case "not_multiple_of": + return `N\xFAmero inv\xE1lido: deve ser m\xFAltiplo de ${issue2.divisor}`; + case "unrecognized_keys": + return `Chave${issue2.keys.length > 1 ? "s" : ""} desconhecida${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Chave inv\xE1lida em ${issue2.origin}`; + case "invalid_union": + return "Entrada inv\xE1lida"; + case "invalid_element": + return `Valor inv\xE1lido em ${issue2.origin}`; + default: + return `Campo inv\xE1lido`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ru.js + function getRussianPlural(count, one, few, many) { + const absCount = Math.abs(count); + const lastDigit = absCount % 10; + const lastTwoDigits = absCount % 100; + if (lastTwoDigits >= 11 && lastTwoDigits <= 19) { + return many; + } + if (lastDigit === 1) { + return one; + } + if (lastDigit >= 2 && lastDigit <= 4) { + return few; + } + return many; + } + function ru_default() { + return { + localeError: error29() + }; + } + var error29; + var init_ru = __esm({ + "node_modules/zod/v4/locales/ru.js"() { + init_util(); + error29 = () => { + const Sizable = { + string: { + unit: { + one: "\u0441\u0438\u043C\u0432\u043E\u043B", + few: "\u0441\u0438\u043C\u0432\u043E\u043B\u0430", + many: "\u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432" + }, + verb: "\u0438\u043C\u0435\u0442\u044C" + }, + file: { + unit: { + one: "\u0431\u0430\u0439\u0442", + few: "\u0431\u0430\u0439\u0442\u0430", + many: "\u0431\u0430\u0439\u0442" + }, + verb: "\u0438\u043C\u0435\u0442\u044C" + }, + array: { + unit: { + one: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", + few: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430", + many: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432" + }, + verb: "\u0438\u043C\u0435\u0442\u044C" + }, + set: { + unit: { + one: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", + few: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430", + many: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432" + }, + verb: "\u0438\u043C\u0435\u0442\u044C" + } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u0447\u0438\u0441\u043B\u043E"; + } + case "object": { + if (Array.isArray(data)) { + return "\u043C\u0430\u0441\u0441\u0438\u0432"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0432\u0432\u043E\u0434", + email: "email \u0430\u0434\u0440\u0435\u0441", + url: "URL", + emoji: "\u044D\u043C\u043E\u0434\u0437\u0438", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043C\u044F", + date: "ISO \u0434\u0430\u0442\u0430", + time: "ISO \u0432\u0440\u0435\u043C\u044F", + duration: "ISO \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C", + ipv4: "IPv4 \u0430\u0434\u0440\u0435\u0441", + ipv6: "IPv6 \u0430\u0434\u0440\u0435\u0441", + cidrv4: "IPv4 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D", + cidrv6: "IPv6 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D", + base64: "\u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 base64", + base64url: "\u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 base64url", + json_string: "JSON \u0441\u0442\u0440\u043E\u043A\u0430", + e164: "\u043D\u043E\u043C\u0435\u0440 E.164", + jwt: "JWT", + template_literal: "\u0432\u0432\u043E\u0434" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C ${issue2.expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043E ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C ${stringifyPrimitive(issue2.values[0])}`; + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0434\u043D\u043E \u0438\u0437 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const maxValue = Number(issue2.maximum); + const unit = getRussianPlural(maxValue, sizing.unit.one, sizing.unit.few, sizing.unit.many); + return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435"} \u0431\u0443\u0434\u0435\u0442 \u0438\u043C\u0435\u0442\u044C ${adj}${issue2.maximum.toString()} ${unit}`; + } + return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435"} \u0431\u0443\u0434\u0435\u0442 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const minValue = Number(issue2.minimum); + const unit = getRussianPlural(minValue, sizing.unit.one, sizing.unit.few, sizing.unit.many); + return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue2.origin} \u0431\u0443\u0434\u0435\u0442 \u0438\u043C\u0435\u0442\u044C ${adj}${issue2.minimum.toString()} ${unit}`; + } + return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue2.origin} \u0431\u0443\u0434\u0435\u0442 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`; + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E: \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043A\u0440\u0430\u0442\u043D\u044B\u043C ${issue2.divisor}`; + case "unrecognized_keys": + return `\u041D\u0435\u0440\u0430\u0441\u043F\u043E\u0437\u043D\u0430\u043D\u043D${issue2.keys.length > 1 ? "\u044B\u0435" : "\u044B\u0439"} \u043A\u043B\u044E\u0447${issue2.keys.length > 1 ? "\u0438" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 \u0432 ${issue2.origin}`; + case "invalid_union": + return "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435"; + case "invalid_element": + return `\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0432 ${issue2.origin}`; + default: + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/sl.js + function sl_default() { + return { + localeError: error30() + }; + } + var error30; + var init_sl = __esm({ + "node_modules/zod/v4/locales/sl.js"() { + init_util(); + error30 = () => { + const Sizable = { + string: { unit: "znakov", verb: "imeti" }, + file: { unit: "bajtov", verb: "imeti" }, + array: { unit: "elementov", verb: "imeti" }, + set: { unit: "elementov", verb: "imeti" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u0161tevilo"; + } + case "object": { + if (Array.isArray(data)) { + return "tabela"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "vnos", + email: "e-po\u0161tni naslov", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datum in \u010Das", + date: "ISO datum", + time: "ISO \u010Das", + duration: "ISO trajanje", + ipv4: "IPv4 naslov", + ipv6: "IPv6 naslov", + cidrv4: "obseg IPv4", + cidrv6: "obseg IPv6", + base64: "base64 kodiran niz", + base64url: "base64url kodiran niz", + json_string: "JSON niz", + e164: "E.164 \u0161tevilka", + jwt: "JWT", + template_literal: "vnos" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Neveljaven vnos: pri\u010Dakovano ${issue2.expected}, prejeto ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Neveljaven vnos: pri\u010Dakovano ${stringifyPrimitive(issue2.values[0])}`; + return `Neveljavna mo\u017Enost: pri\u010Dakovano eno izmed ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Preveliko: pri\u010Dakovano, da bo ${issue2.origin ?? "vrednost"} imelo ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementov"}`; + return `Preveliko: pri\u010Dakovano, da bo ${issue2.origin ?? "vrednost"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Premajhno: pri\u010Dakovano, da bo ${issue2.origin} imelo ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Premajhno: pri\u010Dakovano, da bo ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Neveljaven niz: mora se za\u010Deti z "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Neveljaven niz: mora se kon\u010Dati z "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Neveljaven niz: mora vsebovati "${_issue.includes}"`; + if (_issue.format === "regex") + return `Neveljaven niz: mora ustrezati vzorcu ${_issue.pattern}`; + return `Neveljaven ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Neveljavno \u0161tevilo: mora biti ve\u010Dkratnik ${issue2.divisor}`; + case "unrecognized_keys": + return `Neprepoznan${issue2.keys.length > 1 ? "i klju\u010Di" : " klju\u010D"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Neveljaven klju\u010D v ${issue2.origin}`; + case "invalid_union": + return "Neveljaven vnos"; + case "invalid_element": + return `Neveljavna vrednost v ${issue2.origin}`; + default: + return "Neveljaven vnos"; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/sv.js + function sv_default() { + return { + localeError: error31() + }; + } + var error31; + var init_sv = __esm({ + "node_modules/zod/v4/locales/sv.js"() { + init_util(); + error31 = () => { + const Sizable = { + string: { unit: "tecken", verb: "att ha" }, + file: { unit: "bytes", verb: "att ha" }, + array: { unit: "objekt", verb: "att inneh\xE5lla" }, + set: { unit: "objekt", verb: "att inneh\xE5lla" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "antal"; + } + case "object": { + if (Array.isArray(data)) { + return "lista"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "regulj\xE4rt uttryck", + email: "e-postadress", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO-datum och tid", + date: "ISO-datum", + time: "ISO-tid", + duration: "ISO-varaktighet", + ipv4: "IPv4-intervall", + ipv6: "IPv6-intervall", + cidrv4: "IPv4-spektrum", + cidrv6: "IPv6-spektrum", + base64: "base64-kodad str\xE4ng", + base64url: "base64url-kodad str\xE4ng", + json_string: "JSON-str\xE4ng", + e164: "E.164-nummer", + jwt: "JWT", + template_literal: "mall-literal" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Ogiltig inmatning: f\xF6rv\xE4ntat ${issue2.expected}, fick ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Ogiltig inmatning: f\xF6rv\xE4ntat ${stringifyPrimitive(issue2.values[0])}`; + return `Ogiltigt val: f\xF6rv\xE4ntade en av ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `F\xF6r stor(t): f\xF6rv\xE4ntade ${issue2.origin ?? "v\xE4rdet"} att ha ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "element"}`; + } + return `F\xF6r stor(t): f\xF6rv\xE4ntat ${issue2.origin ?? "v\xE4rdet"} att ha ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `F\xF6r lite(t): f\xF6rv\xE4ntade ${issue2.origin ?? "v\xE4rdet"} att ha ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `F\xF6r lite(t): f\xF6rv\xE4ntade ${issue2.origin ?? "v\xE4rdet"} att ha ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Ogiltig str\xE4ng: m\xE5ste b\xF6rja med "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Ogiltig str\xE4ng: m\xE5ste sluta med "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Ogiltig str\xE4ng: m\xE5ste inneh\xE5lla "${_issue.includes}"`; + if (_issue.format === "regex") + return `Ogiltig str\xE4ng: m\xE5ste matcha m\xF6nstret "${_issue.pattern}"`; + return `Ogiltig(t) ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ogiltigt tal: m\xE5ste vara en multipel av ${issue2.divisor}`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Ok\xE4nda nycklar" : "Ok\xE4nd nyckel"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ogiltig nyckel i ${issue2.origin ?? "v\xE4rdet"}`; + case "invalid_union": + return "Ogiltig input"; + case "invalid_element": + return `Ogiltigt v\xE4rde i ${issue2.origin ?? "v\xE4rdet"}`; + default: + return `Ogiltig input`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ta.js + function ta_default() { + return { + localeError: error32() + }; + } + var error32; + var init_ta = __esm({ + "node_modules/zod/v4/locales/ta.js"() { + init_util(); + error32 = () => { + const Sizable = { + string: { unit: "\u0B8E\u0BB4\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BCD\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" }, + file: { unit: "\u0BAA\u0BC8\u0B9F\u0BCD\u0B9F\u0BC1\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" }, + array: { unit: "\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" }, + set: { unit: "\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "\u0B8E\u0BA3\u0BCD \u0B85\u0BB2\u0BCD\u0BB2\u0BBE\u0BA4\u0BA4\u0BC1" : "\u0B8E\u0BA3\u0BCD"; + } + case "object": { + if (Array.isArray(data)) { + return "\u0B85\u0BA3\u0BBF"; + } + if (data === null) { + return "\u0BB5\u0BC6\u0BB1\u0BC1\u0BAE\u0BC8"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1", + email: "\u0BAE\u0BBF\u0BA9\u0BCD\u0BA9\u0B9E\u0BCD\u0B9A\u0BB2\u0BCD \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0BA4\u0BC7\u0BA4\u0BBF \u0BA8\u0BC7\u0BB0\u0BAE\u0BCD", + date: "ISO \u0BA4\u0BC7\u0BA4\u0BBF", + time: "ISO \u0BA8\u0BC7\u0BB0\u0BAE\u0BCD", + duration: "ISO \u0B95\u0BBE\u0BB2 \u0B85\u0BB3\u0BB5\u0BC1", + ipv4: "IPv4 \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF", + ipv6: "IPv6 \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF", + cidrv4: "IPv4 \u0BB5\u0BB0\u0BAE\u0BCD\u0BAA\u0BC1", + cidrv6: "IPv6 \u0BB5\u0BB0\u0BAE\u0BCD\u0BAA\u0BC1", + base64: "base64-encoded \u0B9A\u0BB0\u0BAE\u0BCD", + base64url: "base64url-encoded \u0B9A\u0BB0\u0BAE\u0BCD", + json_string: "JSON \u0B9A\u0BB0\u0BAE\u0BCD", + e164: "E.164 \u0B8E\u0BA3\u0BCD", + jwt: "JWT", + template_literal: "input" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.expected}, \u0BAA\u0BC6\u0BB1\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${stringifyPrimitive(issue2.values[0])}`; + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0BAE\u0BCD: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${joinValues(issue2.values, "|")} \u0B87\u0BB2\u0BCD \u0B92\u0BA9\u0BCD\u0BB1\u0BC1`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0BAE\u0BBF\u0B95 \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.origin ?? "\u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD"} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + } + return `\u0BAE\u0BBF\u0B95 \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.origin ?? "\u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1"} ${adj}${issue2.maximum.toString()} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0BAE\u0BBF\u0B95\u0B9A\u0BCD \u0B9A\u0BBF\u0BB1\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + } + return `\u0BAE\u0BBF\u0B95\u0B9A\u0BCD \u0B9A\u0BBF\u0BB1\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.origin} ${adj}${issue2.minimum.toString()} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: "${_issue.prefix}" \u0B87\u0BB2\u0BCD \u0BA4\u0BCA\u0B9F\u0B99\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + if (_issue.format === "ends_with") + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: "${_issue.suffix}" \u0B87\u0BB2\u0BCD \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0B9F\u0BC8\u0BAF \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + if (_issue.format === "includes") + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: "${_issue.includes}" \u0B90 \u0B89\u0BB3\u0BCD\u0BB3\u0B9F\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + if (_issue.format === "regex") + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: ${_issue.pattern} \u0BAE\u0BC1\u0BB1\u0BC8\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B9F\u0BA9\u0BCD \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B8E\u0BA3\u0BCD: ${issue2.divisor} \u0B87\u0BA9\u0BCD \u0BAA\u0BB2\u0BAE\u0BBE\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + case "unrecognized_keys": + return `\u0B85\u0B9F\u0BC8\u0BAF\u0BBE\u0BB3\u0BAE\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF\u0BBE\u0BA4 \u0BB5\u0BBF\u0B9A\u0BC8${issue2.keys.length > 1 ? "\u0B95\u0BB3\u0BCD" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} \u0B87\u0BB2\u0BCD \u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BB5\u0BBF\u0B9A\u0BC8`; + case "invalid_union": + return "\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1"; + case "invalid_element": + return `${issue2.origin} \u0B87\u0BB2\u0BCD \u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1`; + default: + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/th.js + function th_default() { + return { + localeError: error33() + }; + } + var error33; + var init_th = __esm({ + "node_modules/zod/v4/locales/th.js"() { + init_util(); + error33 = () => { + const Sizable = { + string: { unit: "\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" }, + file: { unit: "\u0E44\u0E1A\u0E15\u0E4C", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" }, + array: { unit: "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" }, + set: { unit: "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "\u0E44\u0E21\u0E48\u0E43\u0E0A\u0E48\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02 (NaN)" : "\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02"; + } + case "object": { + if (Array.isArray(data)) { + return "\u0E2D\u0E32\u0E23\u0E4C\u0E40\u0E23\u0E22\u0E4C (Array)"; + } + if (data === null) { + return "\u0E44\u0E21\u0E48\u0E21\u0E35\u0E04\u0E48\u0E32 (null)"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19", + email: "\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E2D\u0E35\u0E40\u0E21\u0E25", + url: "URL", + emoji: "\u0E2D\u0E34\u0E42\u0E21\u0E08\u0E34", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO", + date: "\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E41\u0E1A\u0E1A ISO", + time: "\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO", + duration: "\u0E0A\u0E48\u0E27\u0E07\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO", + ipv4: "\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48 IPv4", + ipv6: "\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48 IPv6", + cidrv4: "\u0E0A\u0E48\u0E27\u0E07 IP \u0E41\u0E1A\u0E1A IPv4", + cidrv6: "\u0E0A\u0E48\u0E27\u0E07 IP \u0E41\u0E1A\u0E1A IPv6", + base64: "\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A Base64", + base64url: "\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A Base64 \u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A URL", + json_string: "\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A JSON", + e164: "\u0E40\u0E1A\u0E2D\u0E23\u0E4C\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E23\u0E30\u0E2B\u0E27\u0E48\u0E32\u0E07\u0E1B\u0E23\u0E30\u0E40\u0E17\u0E28 (E.164)", + jwt: "\u0E42\u0E17\u0E40\u0E04\u0E19 JWT", + template_literal: "\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 ${issue2.expected} \u0E41\u0E15\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u0E04\u0E48\u0E32\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 ${stringifyPrimitive(issue2.values[0])}`; + return `\u0E15\u0E31\u0E27\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19\u0E2B\u0E19\u0E36\u0E48\u0E07\u0E43\u0E19 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "\u0E44\u0E21\u0E48\u0E40\u0E01\u0E34\u0E19" : "\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u0E40\u0E01\u0E34\u0E19\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue2.origin ?? "\u0E04\u0E48\u0E32"} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23"}`; + return `\u0E40\u0E01\u0E34\u0E19\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue2.origin ?? "\u0E04\u0E48\u0E32"} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? "\u0E2D\u0E22\u0E48\u0E32\u0E07\u0E19\u0E49\u0E2D\u0E22" : "\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue2.origin} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue2.origin} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E02\u0E36\u0E49\u0E19\u0E15\u0E49\u0E19\u0E14\u0E49\u0E27\u0E22 "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E25\u0E07\u0E17\u0E49\u0E32\u0E22\u0E14\u0E49\u0E27\u0E22 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E21\u0E35 "${_issue.includes}" \u0E2D\u0E22\u0E39\u0E48\u0E43\u0E19\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21`; + if (_issue.format === "regex") + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E15\u0E49\u0E2D\u0E07\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14 ${_issue.pattern}`; + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E15\u0E49\u0E2D\u0E07\u0E40\u0E1B\u0E47\u0E19\u0E08\u0E33\u0E19\u0E27\u0E19\u0E17\u0E35\u0E48\u0E2B\u0E32\u0E23\u0E14\u0E49\u0E27\u0E22 ${issue2.divisor} \u0E44\u0E14\u0E49\u0E25\u0E07\u0E15\u0E31\u0E27`; + case "unrecognized_keys": + return `\u0E1E\u0E1A\u0E04\u0E35\u0E22\u0E4C\u0E17\u0E35\u0E48\u0E44\u0E21\u0E48\u0E23\u0E39\u0E49\u0E08\u0E31\u0E01: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u0E04\u0E35\u0E22\u0E4C\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E19 ${issue2.origin}`; + case "invalid_union": + return "\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E44\u0E21\u0E48\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E22\u0E39\u0E40\u0E19\u0E35\u0E22\u0E19\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E44\u0E27\u0E49"; + case "invalid_element": + return `\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E19 ${issue2.origin}`; + default: + return `\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/tr.js + function tr_default() { + return { + localeError: error34() + }; + } + var parsedType3, error34; + var init_tr = __esm({ + "node_modules/zod/v4/locales/tr.js"() { + init_util(); + parsedType3 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + error34 = () => { + const Sizable = { + string: { unit: "karakter", verb: "olmal\u0131" }, + file: { unit: "bayt", verb: "olmal\u0131" }, + array: { unit: "\xF6\u011Fe", verb: "olmal\u0131" }, + set: { unit: "\xF6\u011Fe", verb: "olmal\u0131" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const Nouns = { + regex: "girdi", + email: "e-posta adresi", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO tarih ve saat", + date: "ISO tarih", + time: "ISO saat", + duration: "ISO s\xFCre", + ipv4: "IPv4 adresi", + ipv6: "IPv6 adresi", + cidrv4: "IPv4 aral\u0131\u011F\u0131", + cidrv6: "IPv6 aral\u0131\u011F\u0131", + base64: "base64 ile \u015Fifrelenmi\u015F metin", + base64url: "base64url ile \u015Fifrelenmi\u015F metin", + json_string: "JSON dizesi", + e164: "E.164 say\u0131s\u0131", + jwt: "JWT", + template_literal: "\u015Eablon dizesi" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `Ge\xE7ersiz de\u011Fer: beklenen ${issue2.expected}, al\u0131nan ${parsedType3(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `Ge\xE7ersiz de\u011Fer: beklenen ${stringifyPrimitive(issue2.values[0])}`; + return `Ge\xE7ersiz se\xE7enek: a\u015Fa\u011F\u0131dakilerden biri olmal\u0131: ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\xC7ok b\xFCy\xFCk: beklenen ${issue2.origin ?? "de\u011Fer"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\xF6\u011Fe"}`; + return `\xC7ok b\xFCy\xFCk: beklenen ${issue2.origin ?? "de\u011Fer"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\xC7ok k\xFC\xE7\xFCk: beklenen ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + return `\xC7ok k\xFC\xE7\xFCk: beklenen ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Ge\xE7ersiz metin: "${_issue.prefix}" ile ba\u015Flamal\u0131`; + if (_issue.format === "ends_with") + return `Ge\xE7ersiz metin: "${_issue.suffix}" ile bitmeli`; + if (_issue.format === "includes") + return `Ge\xE7ersiz metin: "${_issue.includes}" i\xE7ermeli`; + if (_issue.format === "regex") + return `Ge\xE7ersiz metin: ${_issue.pattern} desenine uymal\u0131`; + return `Ge\xE7ersiz ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ge\xE7ersiz say\u0131: ${issue2.divisor} ile tam b\xF6l\xFCnebilmeli`; + case "unrecognized_keys": + return `Tan\u0131nmayan anahtar${issue2.keys.length > 1 ? "lar" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} i\xE7inde ge\xE7ersiz anahtar`; + case "invalid_union": + return "Ge\xE7ersiz de\u011Fer"; + case "invalid_element": + return `${issue2.origin} i\xE7inde ge\xE7ersiz de\u011Fer`; + default: + return `Ge\xE7ersiz de\u011Fer`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ua.js + function ua_default() { + return { + localeError: error35() + }; + } + var error35; + var init_ua = __esm({ + "node_modules/zod/v4/locales/ua.js"() { + init_util(); + error35 = () => { + const Sizable = { + string: { unit: "\u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" }, + file: { unit: "\u0431\u0430\u0439\u0442\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" }, + array: { unit: "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" }, + set: { unit: "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u0447\u0438\u0441\u043B\u043E"; + } + case "object": { + if (Array.isArray(data)) { + return "\u043C\u0430\u0441\u0438\u0432"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456", + email: "\u0430\u0434\u0440\u0435\u0441\u0430 \u0435\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0457 \u043F\u043E\u0448\u0442\u0438", + url: "URL", + emoji: "\u0435\u043C\u043E\u0434\u0437\u0456", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u0434\u0430\u0442\u0430 \u0442\u0430 \u0447\u0430\u0441 ISO", + date: "\u0434\u0430\u0442\u0430 ISO", + time: "\u0447\u0430\u0441 ISO", + duration: "\u0442\u0440\u0438\u0432\u0430\u043B\u0456\u0441\u0442\u044C ISO", + ipv4: "\u0430\u0434\u0440\u0435\u0441\u0430 IPv4", + ipv6: "\u0430\u0434\u0440\u0435\u0441\u0430 IPv6", + cidrv4: "\u0434\u0456\u0430\u043F\u0430\u0437\u043E\u043D IPv4", + cidrv6: "\u0434\u0456\u0430\u043F\u0430\u0437\u043E\u043D IPv6", + base64: "\u0440\u044F\u0434\u043E\u043A \u0443 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u0456 base64", + base64url: "\u0440\u044F\u0434\u043E\u043A \u0443 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u0456 base64url", + json_string: "\u0440\u044F\u0434\u043E\u043A JSON", + e164: "\u043D\u043E\u043C\u0435\u0440 E.164", + jwt: "JWT", + template_literal: "\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F ${issue2.expected}, \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E ${parsedType4(issue2.input)}`; + // return `Неправильні вхідні дані: очікується ${issue.expected}, отримано ${util.getParsedType(issue.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F ${stringifyPrimitive(issue2.values[0])}`; + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0430 \u043E\u043F\u0446\u0456\u044F: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F \u043E\u0434\u043D\u0435 \u0437 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F"} ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432"}`; + return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F"} \u0431\u0443\u0434\u0435 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue2.origin} ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue2.origin} \u0431\u0443\u0434\u0435 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u043F\u043E\u0447\u0438\u043D\u0430\u0442\u0438\u0441\u044F \u0437 "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u0437\u0430\u043A\u0456\u043D\u0447\u0443\u0432\u0430\u0442\u0438\u0441\u044F \u043D\u0430 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u043C\u0456\u0441\u0442\u0438\u0442\u0438 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u0442\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`; + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u0447\u0438\u0441\u043B\u043E: \u043F\u043E\u0432\u0438\u043D\u043D\u043E \u0431\u0443\u0442\u0438 \u043A\u0440\u0430\u0442\u043D\u0438\u043C ${issue2.divisor}`; + case "unrecognized_keys": + return `\u041D\u0435\u0440\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u043D\u0438\u0439 \u043A\u043B\u044E\u0447${issue2.keys.length > 1 ? "\u0456" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u043A\u043B\u044E\u0447 \u0443 ${issue2.origin}`; + case "invalid_union": + return "\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456"; + case "invalid_element": + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0443 ${issue2.origin}`; + default: + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/ur.js + function ur_default() { + return { + localeError: error36() + }; + } + var error36; + var init_ur = __esm({ + "node_modules/zod/v4/locales/ur.js"() { + init_util(); + error36 = () => { + const Sizable = { + string: { unit: "\u062D\u0631\u0648\u0641", verb: "\u06C1\u0648\u0646\u0627" }, + file: { unit: "\u0628\u0627\u0626\u0679\u0633", verb: "\u06C1\u0648\u0646\u0627" }, + array: { unit: "\u0622\u0626\u0679\u0645\u0632", verb: "\u06C1\u0648\u0646\u0627" }, + set: { unit: "\u0622\u0626\u0679\u0645\u0632", verb: "\u06C1\u0648\u0646\u0627" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "\u0646\u0645\u0628\u0631"; + } + case "object": { + if (Array.isArray(data)) { + return "\u0622\u0631\u06D2"; + } + if (data === null) { + return "\u0646\u0644"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0627\u0646 \u067E\u0679", + email: "\u0627\u06CC \u0645\u06CC\u0644 \u0627\u06CC\u0688\u0631\u06CC\u0633", + url: "\u06CC\u0648 \u0622\u0631 \u0627\u06CC\u0644", + emoji: "\u0627\u06CC\u0645\u0648\u062C\u06CC", + uuid: "\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC", + uuidv4: "\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC \u0648\u06CC 4", + uuidv6: "\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC \u0648\u06CC 6", + nanoid: "\u0646\u06CC\u0646\u0648 \u0622\u0626\u06CC \u0688\u06CC", + guid: "\u062C\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC", + cuid: "\u0633\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC", + cuid2: "\u0633\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC 2", + ulid: "\u06CC\u0648 \u0627\u06CC\u0644 \u0622\u0626\u06CC \u0688\u06CC", + xid: "\u0627\u06CC\u06A9\u0633 \u0622\u0626\u06CC \u0688\u06CC", + ksuid: "\u06A9\u06D2 \u0627\u06CC\u0633 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC", + datetime: "\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0688\u06CC\u0679 \u0679\u0627\u0626\u0645", + date: "\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u062A\u0627\u0631\u06CC\u062E", + time: "\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0648\u0642\u062A", + duration: "\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0645\u062F\u062A", + ipv4: "\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 4 \u0627\u06CC\u0688\u0631\u06CC\u0633", + ipv6: "\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 6 \u0627\u06CC\u0688\u0631\u06CC\u0633", + cidrv4: "\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 4 \u0631\u06CC\u0646\u062C", + cidrv6: "\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 6 \u0631\u06CC\u0646\u062C", + base64: "\u0628\u06CC\u0633 64 \u0627\u0646 \u06A9\u0648\u0688\u0688 \u0633\u0679\u0631\u0646\u06AF", + base64url: "\u0628\u06CC\u0633 64 \u06CC\u0648 \u0622\u0631 \u0627\u06CC\u0644 \u0627\u0646 \u06A9\u0648\u0688\u0688 \u0633\u0679\u0631\u0646\u06AF", + json_string: "\u062C\u06D2 \u0627\u06CC\u0633 \u0627\u0648 \u0627\u06CC\u0646 \u0633\u0679\u0631\u0646\u06AF", + e164: "\u0627\u06CC 164 \u0646\u0645\u0628\u0631", + jwt: "\u062C\u06D2 \u0688\u0628\u0644\u06CC\u0648 \u0679\u06CC", + template_literal: "\u0627\u0646 \u067E\u0679" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: ${issue2.expected} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627\u060C ${parsedType4(issue2.input)} \u0645\u0648\u0635\u0648\u0644 \u06C1\u0648\u0627`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: ${stringifyPrimitive(issue2.values[0])} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`; + return `\u063A\u0644\u0637 \u0622\u067E\u0634\u0646: ${joinValues(issue2.values, "|")} \u0645\u06CC\u06BA \u0633\u06D2 \u0627\u06CC\u06A9 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u0628\u06C1\u062A \u0628\u0691\u0627: ${issue2.origin ?? "\u0648\u06CC\u0644\u06CC\u0648"} \u06A9\u06D2 ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0639\u0646\u0627\u0635\u0631"} \u06C1\u0648\u0646\u06D2 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u06D2`; + return `\u0628\u06C1\u062A \u0628\u0691\u0627: ${issue2.origin ?? "\u0648\u06CC\u0644\u06CC\u0648"} \u06A9\u0627 ${adj}${issue2.maximum.toString()} \u06C1\u0648\u0646\u0627 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0628\u06C1\u062A \u0686\u06BE\u0648\u0679\u0627: ${issue2.origin} \u06A9\u06D2 ${adj}${issue2.minimum.toString()} ${sizing.unit} \u06C1\u0648\u0646\u06D2 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u06D2`; + } + return `\u0628\u06C1\u062A \u0686\u06BE\u0648\u0679\u0627: ${issue2.origin} \u06A9\u0627 ${adj}${issue2.minimum.toString()} \u06C1\u0648\u0646\u0627 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: "${_issue.prefix}" \u0633\u06D2 \u0634\u0631\u0648\u0639 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + } + if (_issue.format === "ends_with") + return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: "${_issue.suffix}" \u067E\u0631 \u062E\u062A\u0645 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + if (_issue.format === "includes") + return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: "${_issue.includes}" \u0634\u0627\u0645\u0644 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + if (_issue.format === "regex") + return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \u067E\u06CC\u0679\u0631\u0646 ${_issue.pattern} \u0633\u06D2 \u0645\u06CC\u0686 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + return `\u063A\u0644\u0637 ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u063A\u0644\u0637 \u0646\u0645\u0628\u0631: ${issue2.divisor} \u06A9\u0627 \u0645\u0636\u0627\u0639\u0641 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + case "unrecognized_keys": + return `\u063A\u06CC\u0631 \u062A\u0633\u0644\u06CC\u0645 \u0634\u062F\u06C1 \u06A9\u06CC${issue2.keys.length > 1 ? "\u0632" : ""}: ${joinValues(issue2.keys, "\u060C ")}`; + case "invalid_key": + return `${issue2.origin} \u0645\u06CC\u06BA \u063A\u0644\u0637 \u06A9\u06CC`; + case "invalid_union": + return "\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679"; + case "invalid_element": + return `${issue2.origin} \u0645\u06CC\u06BA \u063A\u0644\u0637 \u0648\u06CC\u0644\u06CC\u0648`; + default: + return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/vi.js + function vi_default() { + return { + localeError: error37() + }; + } + var error37; + var init_vi = __esm({ + "node_modules/zod/v4/locales/vi.js"() { + init_util(); + error37 = () => { + const Sizable = { + string: { unit: "k\xFD t\u1EF1", verb: "c\xF3" }, + file: { unit: "byte", verb: "c\xF3" }, + array: { unit: "ph\u1EA7n t\u1EED", verb: "c\xF3" }, + set: { unit: "ph\u1EA7n t\u1EED", verb: "c\xF3" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "s\u1ED1"; + } + case "object": { + if (Array.isArray(data)) { + return "m\u1EA3ng"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u0111\u1EA7u v\xE0o", + email: "\u0111\u1ECBa ch\u1EC9 email", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ng\xE0y gi\u1EDD ISO", + date: "ng\xE0y ISO", + time: "gi\u1EDD ISO", + duration: "kho\u1EA3ng th\u1EDDi gian ISO", + ipv4: "\u0111\u1ECBa ch\u1EC9 IPv4", + ipv6: "\u0111\u1ECBa ch\u1EC9 IPv6", + cidrv4: "d\u1EA3i IPv4", + cidrv6: "d\u1EA3i IPv6", + base64: "chu\u1ED7i m\xE3 h\xF3a base64", + base64url: "chu\u1ED7i m\xE3 h\xF3a base64url", + json_string: "chu\u1ED7i JSON", + e164: "s\u1ED1 E.164", + jwt: "JWT", + template_literal: "\u0111\u1EA7u v\xE0o" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i ${issue2.expected}, nh\u1EADn \u0111\u01B0\u1EE3c ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i ${stringifyPrimitive(issue2.values[0])}`; + return `T\xF9y ch\u1ECDn kh\xF4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i m\u1ED9t trong c\xE1c gi\xE1 tr\u1ECB ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Qu\xE1 l\u1EDBn: mong \u0111\u1EE3i ${issue2.origin ?? "gi\xE1 tr\u1ECB"} ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "ph\u1EA7n t\u1EED"}`; + return `Qu\xE1 l\u1EDBn: mong \u0111\u1EE3i ${issue2.origin ?? "gi\xE1 tr\u1ECB"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Qu\xE1 nh\u1ECF: mong \u0111\u1EE3i ${issue2.origin} ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Qu\xE1 nh\u1ECF: mong \u0111\u1EE3i ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Chu\u1ED7i kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i b\u1EAFt \u0111\u1EA7u b\u1EB1ng "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Chu\u1ED7i kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i k\u1EBFt th\xFAc b\u1EB1ng "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Chu\u1ED7i kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i bao g\u1ED3m "${_issue.includes}"`; + if (_issue.format === "regex") + return `Chu\u1ED7i kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i kh\u1EDBp v\u1EDBi m\u1EABu ${_issue.pattern}`; + return `${Nouns[_issue.format] ?? issue2.format} kh\xF4ng h\u1EE3p l\u1EC7`; + } + case "not_multiple_of": + return `S\u1ED1 kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i l\xE0 b\u1ED9i s\u1ED1 c\u1EE7a ${issue2.divisor}`; + case "unrecognized_keys": + return `Kh\xF3a kh\xF4ng \u0111\u01B0\u1EE3c nh\u1EADn d\u1EA1ng: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Kh\xF3a kh\xF4ng h\u1EE3p l\u1EC7 trong ${issue2.origin}`; + case "invalid_union": + return "\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7"; + case "invalid_element": + return `Gi\xE1 tr\u1ECB kh\xF4ng h\u1EE3p l\u1EC7 trong ${issue2.origin}`; + default: + return `\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/zh-CN.js + function zh_CN_default() { + return { + localeError: error38() + }; + } + var error38; + var init_zh_CN = __esm({ + "node_modules/zod/v4/locales/zh-CN.js"() { + init_util(); + error38 = () => { + const Sizable = { + string: { unit: "\u5B57\u7B26", verb: "\u5305\u542B" }, + file: { unit: "\u5B57\u8282", verb: "\u5305\u542B" }, + array: { unit: "\u9879", verb: "\u5305\u542B" }, + set: { unit: "\u9879", verb: "\u5305\u542B" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "\u975E\u6570\u5B57(NaN)" : "\u6570\u5B57"; + } + case "object": { + if (Array.isArray(data)) { + return "\u6570\u7EC4"; + } + if (data === null) { + return "\u7A7A\u503C(null)"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u8F93\u5165", + email: "\u7535\u5B50\u90AE\u4EF6", + url: "URL", + emoji: "\u8868\u60C5\u7B26\u53F7", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO\u65E5\u671F\u65F6\u95F4", + date: "ISO\u65E5\u671F", + time: "ISO\u65F6\u95F4", + duration: "ISO\u65F6\u957F", + ipv4: "IPv4\u5730\u5740", + ipv6: "IPv6\u5730\u5740", + cidrv4: "IPv4\u7F51\u6BB5", + cidrv6: "IPv6\u7F51\u6BB5", + base64: "base64\u7F16\u7801\u5B57\u7B26\u4E32", + base64url: "base64url\u7F16\u7801\u5B57\u7B26\u4E32", + json_string: "JSON\u5B57\u7B26\u4E32", + e164: "E.164\u53F7\u7801", + jwt: "JWT", + template_literal: "\u8F93\u5165" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B ${issue2.expected}\uFF0C\u5B9E\u9645\u63A5\u6536 ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B ${stringifyPrimitive(issue2.values[0])}`; + return `\u65E0\u6548\u9009\u9879\uFF1A\u671F\u671B\u4EE5\u4E0B\u4E4B\u4E00 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u6570\u503C\u8FC7\u5927\uFF1A\u671F\u671B ${issue2.origin ?? "\u503C"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u4E2A\u5143\u7D20"}`; + return `\u6570\u503C\u8FC7\u5927\uFF1A\u671F\u671B ${issue2.origin ?? "\u503C"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u6570\u503C\u8FC7\u5C0F\uFF1A\u671F\u671B ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u6570\u503C\u8FC7\u5C0F\uFF1A\u671F\u671B ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u4EE5 "${_issue.prefix}" \u5F00\u5934`; + if (_issue.format === "ends_with") + return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u4EE5 "${_issue.suffix}" \u7ED3\u5C3E`; + if (_issue.format === "includes") + return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u5305\u542B "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u6EE1\u8DB3\u6B63\u5219\u8868\u8FBE\u5F0F ${_issue.pattern}`; + return `\u65E0\u6548${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u65E0\u6548\u6570\u5B57\uFF1A\u5FC5\u987B\u662F ${issue2.divisor} \u7684\u500D\u6570`; + case "unrecognized_keys": + return `\u51FA\u73B0\u672A\u77E5\u7684\u952E(key): ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} \u4E2D\u7684\u952E(key)\u65E0\u6548`; + case "invalid_union": + return "\u65E0\u6548\u8F93\u5165"; + case "invalid_element": + return `${issue2.origin} \u4E2D\u5305\u542B\u65E0\u6548\u503C(value)`; + default: + return `\u65E0\u6548\u8F93\u5165`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/zh-TW.js + function zh_TW_default() { + return { + localeError: error39() + }; + } + var error39; + var init_zh_TW = __esm({ + "node_modules/zod/v4/locales/zh-TW.js"() { + init_util(); + error39 = () => { + const Sizable = { + string: { unit: "\u5B57\u5143", verb: "\u64C1\u6709" }, + file: { unit: "\u4F4D\u5143\u7D44", verb: "\u64C1\u6709" }, + array: { unit: "\u9805\u76EE", verb: "\u64C1\u6709" }, + set: { unit: "\u9805\u76EE", verb: "\u64C1\u6709" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const parsedType4 = (data) => { + const t2 = typeof data; + switch (t2) { + case "number": { + return Number.isNaN(data) ? "NaN" : "number"; + } + case "object": { + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) { + return data.constructor.name; + } + } + } + return t2; + }; + const Nouns = { + regex: "\u8F38\u5165", + email: "\u90F5\u4EF6\u5730\u5740", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u65E5\u671F\u6642\u9593", + date: "ISO \u65E5\u671F", + time: "ISO \u6642\u9593", + duration: "ISO \u671F\u9593", + ipv4: "IPv4 \u4F4D\u5740", + ipv6: "IPv6 \u4F4D\u5740", + cidrv4: "IPv4 \u7BC4\u570D", + cidrv6: "IPv6 \u7BC4\u570D", + base64: "base64 \u7DE8\u78BC\u5B57\u4E32", + base64url: "base64url \u7DE8\u78BC\u5B57\u4E32", + json_string: "JSON \u5B57\u4E32", + e164: "E.164 \u6578\u503C", + jwt: "JWT", + template_literal: "\u8F38\u5165" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": + return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA ${issue2.expected}\uFF0C\u4F46\u6536\u5230 ${parsedType4(issue2.input)}`; + case "invalid_value": + if (issue2.values.length === 1) + return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA ${stringifyPrimitive(issue2.values[0])}`; + return `\u7121\u6548\u7684\u9078\u9805\uFF1A\u9810\u671F\u70BA\u4EE5\u4E0B\u5176\u4E2D\u4E4B\u4E00 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u6578\u503C\u904E\u5927\uFF1A\u9810\u671F ${issue2.origin ?? "\u503C"} \u61C9\u70BA ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u500B\u5143\u7D20"}`; + return `\u6578\u503C\u904E\u5927\uFF1A\u9810\u671F ${issue2.origin ?? "\u503C"} \u61C9\u70BA ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u6578\u503C\u904E\u5C0F\uFF1A\u9810\u671F ${issue2.origin} \u61C9\u70BA ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u6578\u503C\u904E\u5C0F\uFF1A\u9810\u671F ${issue2.origin} \u61C9\u70BA ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u4EE5 "${_issue.prefix}" \u958B\u982D`; + } + if (_issue.format === "ends_with") + return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u4EE5 "${_issue.suffix}" \u7D50\u5C3E`; + if (_issue.format === "includes") + return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u5305\u542B "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u7B26\u5408\u683C\u5F0F ${_issue.pattern}`; + return `\u7121\u6548\u7684 ${Nouns[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u7121\u6548\u7684\u6578\u5B57\uFF1A\u5FC5\u9808\u70BA ${issue2.divisor} \u7684\u500D\u6578`; + case "unrecognized_keys": + return `\u7121\u6CD5\u8B58\u5225\u7684\u9375\u503C${issue2.keys.length > 1 ? "\u5011" : ""}\uFF1A${joinValues(issue2.keys, "\u3001")}`; + case "invalid_key": + return `${issue2.origin} \u4E2D\u6709\u7121\u6548\u7684\u9375\u503C`; + case "invalid_union": + return "\u7121\u6548\u7684\u8F38\u5165\u503C"; + case "invalid_element": + return `${issue2.origin} \u4E2D\u6709\u7121\u6548\u7684\u503C`; + default: + return `\u7121\u6548\u7684\u8F38\u5165\u503C`; + } + }; + }; + } + }); + + // node_modules/zod/v4/locales/index.js + var locales_exports = {}; + __export(locales_exports, { + ar: () => ar_default, + az: () => az_default, + be: () => be_default, + ca: () => ca_default, + cs: () => cs_default, + de: () => de_default, + en: () => en_default, + eo: () => eo_default, + es: () => es_default, + fa: () => fa_default, + fi: () => fi_default, + fr: () => fr_default, + frCA: () => fr_CA_default, + he: () => he_default, + hu: () => hu_default, + id: () => id_default, + it: () => it_default, + ja: () => ja_default, + kh: () => kh_default, + ko: () => ko_default, + mk: () => mk_default, + ms: () => ms_default, + nl: () => nl_default, + no: () => no_default, + ota: () => ota_default, + pl: () => pl_default, + ps: () => ps_default, + pt: () => pt_default, + ru: () => ru_default, + sl: () => sl_default, + sv: () => sv_default, + ta: () => ta_default, + th: () => th_default, + tr: () => tr_default, + ua: () => ua_default, + ur: () => ur_default, + vi: () => vi_default, + zhCN: () => zh_CN_default, + zhTW: () => zh_TW_default + }); + var init_locales = __esm({ + "node_modules/zod/v4/locales/index.js"() { + init_ar(); + init_az(); + init_be(); + init_ca(); + init_cs(); + init_de(); + init_en(); + init_eo(); + init_es(); + init_fa(); + init_fi(); + init_fr(); + init_fr_CA(); + init_he(); + init_hu(); + init_id(); + init_it(); + init_ja(); + init_kh(); + init_ko(); + init_mk(); + init_ms(); + init_nl(); + init_no(); + init_ota(); + init_ps(); + init_pl(); + init_pt(); + init_ru(); + init_sl(); + init_sv(); + init_ta(); + init_th(); + init_tr(); + init_ua(); + init_ur(); + init_vi(); + init_zh_CN(); + init_zh_TW(); + } + }); + + // node_modules/zod/v4/core/registries.js + function registry() { + return new $ZodRegistry(); + } + var $output, $input, $ZodRegistry, globalRegistry; + var init_registries = __esm({ + "node_modules/zod/v4/core/registries.js"() { + $output = Symbol("ZodOutput"); + $input = Symbol("ZodInput"); + $ZodRegistry = class { + constructor() { + this._map = /* @__PURE__ */ new Map(); + this._idmap = /* @__PURE__ */ new Map(); + } + add(schema, ..._meta) { + const meta = _meta[0]; + this._map.set(schema, meta); + if (meta && typeof meta === "object" && "id" in meta) { + if (this._idmap.has(meta.id)) { + throw new Error(`ID ${meta.id} already exists in the registry`); + } + this._idmap.set(meta.id, schema); + } + return this; + } + clear() { + this._map = /* @__PURE__ */ new Map(); + this._idmap = /* @__PURE__ */ new Map(); + return this; + } + remove(schema) { + const meta = this._map.get(schema); + if (meta && typeof meta === "object" && "id" in meta) { + this._idmap.delete(meta.id); + } + this._map.delete(schema); + return this; + } + get(schema) { + const p2 = schema._zod.parent; + if (p2) { + const pm = { ...this.get(p2) ?? {} }; + delete pm.id; + return { ...pm, ...this._map.get(schema) }; + } + return this._map.get(schema); + } + has(schema) { + return this._map.has(schema); + } + }; + globalRegistry = /* @__PURE__ */ registry(); + } + }); + + // node_modules/zod/v4/core/api.js + function _string(Class2, params) { + return new Class2({ + type: "string", + ...normalizeParams(params) + }); + } + function _coercedString(Class2, params) { + return new Class2({ + type: "string", + coerce: true, + ...normalizeParams(params) + }); + } + function _email(Class2, params) { + return new Class2({ + type: "string", + format: "email", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _guid(Class2, params) { + return new Class2({ + type: "string", + format: "guid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _uuid(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _uuidv4(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v4", + ...normalizeParams(params) + }); + } + function _uuidv6(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v6", + ...normalizeParams(params) + }); + } + function _uuidv7(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v7", + ...normalizeParams(params) + }); + } + function _url(Class2, params) { + return new Class2({ + type: "string", + format: "url", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _emoji2(Class2, params) { + return new Class2({ + type: "string", + format: "emoji", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _nanoid(Class2, params) { + return new Class2({ + type: "string", + format: "nanoid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _cuid(Class2, params) { + return new Class2({ + type: "string", + format: "cuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _cuid2(Class2, params) { + return new Class2({ + type: "string", + format: "cuid2", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _ulid(Class2, params) { + return new Class2({ + type: "string", + format: "ulid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _xid(Class2, params) { + return new Class2({ + type: "string", + format: "xid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _ksuid(Class2, params) { + return new Class2({ + type: "string", + format: "ksuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _ipv4(Class2, params) { + return new Class2({ + type: "string", + format: "ipv4", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _ipv6(Class2, params) { + return new Class2({ + type: "string", + format: "ipv6", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _cidrv4(Class2, params) { + return new Class2({ + type: "string", + format: "cidrv4", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _cidrv6(Class2, params) { + return new Class2({ + type: "string", + format: "cidrv6", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _base64(Class2, params) { + return new Class2({ + type: "string", + format: "base64", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _base64url(Class2, params) { + return new Class2({ + type: "string", + format: "base64url", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _e164(Class2, params) { + return new Class2({ + type: "string", + format: "e164", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _jwt(Class2, params) { + return new Class2({ + type: "string", + format: "jwt", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); + } + function _isoDateTime(Class2, params) { + return new Class2({ + type: "string", + format: "datetime", + check: "string_format", + offset: false, + local: false, + precision: null, + ...normalizeParams(params) + }); + } + function _isoDate(Class2, params) { + return new Class2({ + type: "string", + format: "date", + check: "string_format", + ...normalizeParams(params) + }); + } + function _isoTime(Class2, params) { + return new Class2({ + type: "string", + format: "time", + check: "string_format", + precision: null, + ...normalizeParams(params) + }); + } + function _isoDuration(Class2, params) { + return new Class2({ + type: "string", + format: "duration", + check: "string_format", + ...normalizeParams(params) + }); + } + function _number(Class2, params) { + return new Class2({ + type: "number", + checks: [], + ...normalizeParams(params) + }); + } + function _coercedNumber(Class2, params) { + return new Class2({ + type: "number", + coerce: true, + checks: [], + ...normalizeParams(params) + }); + } + function _int(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "safeint", + ...normalizeParams(params) + }); + } + function _float32(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "float32", + ...normalizeParams(params) + }); + } + function _float64(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "float64", + ...normalizeParams(params) + }); + } + function _int32(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "int32", + ...normalizeParams(params) + }); + } + function _uint32(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "uint32", + ...normalizeParams(params) + }); + } + function _boolean(Class2, params) { + return new Class2({ + type: "boolean", + ...normalizeParams(params) + }); + } + function _coercedBoolean(Class2, params) { + return new Class2({ + type: "boolean", + coerce: true, + ...normalizeParams(params) + }); + } + function _bigint(Class2, params) { + return new Class2({ + type: "bigint", + ...normalizeParams(params) + }); + } + function _coercedBigint(Class2, params) { + return new Class2({ + type: "bigint", + coerce: true, + ...normalizeParams(params) + }); + } + function _int64(Class2, params) { + return new Class2({ + type: "bigint", + check: "bigint_format", + abort: false, + format: "int64", + ...normalizeParams(params) + }); + } + function _uint64(Class2, params) { + return new Class2({ + type: "bigint", + check: "bigint_format", + abort: false, + format: "uint64", + ...normalizeParams(params) + }); + } + function _symbol(Class2, params) { + return new Class2({ + type: "symbol", + ...normalizeParams(params) + }); + } + function _undefined2(Class2, params) { + return new Class2({ + type: "undefined", + ...normalizeParams(params) + }); + } + function _null2(Class2, params) { + return new Class2({ + type: "null", + ...normalizeParams(params) + }); + } + function _any(Class2) { + return new Class2({ + type: "any" + }); + } + function _unknown(Class2) { + return new Class2({ + type: "unknown" + }); + } + function _never(Class2, params) { + return new Class2({ + type: "never", + ...normalizeParams(params) + }); + } + function _void(Class2, params) { + return new Class2({ + type: "void", + ...normalizeParams(params) + }); + } + function _date(Class2, params) { + return new Class2({ + type: "date", + ...normalizeParams(params) + }); + } + function _coercedDate(Class2, params) { + return new Class2({ + type: "date", + coerce: true, + ...normalizeParams(params) + }); + } + function _nan(Class2, params) { + return new Class2({ + type: "nan", + ...normalizeParams(params) + }); + } + function _lt(value, params) { + return new $ZodCheckLessThan({ + check: "less_than", + ...normalizeParams(params), + value, + inclusive: false + }); + } + function _lte(value, params) { + return new $ZodCheckLessThan({ + check: "less_than", + ...normalizeParams(params), + value, + inclusive: true + }); + } + function _gt(value, params) { + return new $ZodCheckGreaterThan({ + check: "greater_than", + ...normalizeParams(params), + value, + inclusive: false + }); + } + function _gte(value, params) { + return new $ZodCheckGreaterThan({ + check: "greater_than", + ...normalizeParams(params), + value, + inclusive: true + }); + } + function _positive(params) { + return _gt(0, params); + } + function _negative(params) { + return _lt(0, params); + } + function _nonpositive(params) { + return _lte(0, params); + } + function _nonnegative(params) { + return _gte(0, params); + } + function _multipleOf(value, params) { + return new $ZodCheckMultipleOf({ + check: "multiple_of", + ...normalizeParams(params), + value + }); + } + function _maxSize(maximum, params) { + return new $ZodCheckMaxSize({ + check: "max_size", + ...normalizeParams(params), + maximum + }); + } + function _minSize(minimum, params) { + return new $ZodCheckMinSize({ + check: "min_size", + ...normalizeParams(params), + minimum + }); + } + function _size(size, params) { + return new $ZodCheckSizeEquals({ + check: "size_equals", + ...normalizeParams(params), + size + }); + } + function _maxLength(maximum, params) { + const ch = new $ZodCheckMaxLength({ + check: "max_length", + ...normalizeParams(params), + maximum + }); + return ch; + } + function _minLength(minimum, params) { + return new $ZodCheckMinLength({ + check: "min_length", + ...normalizeParams(params), + minimum + }); + } + function _length(length, params) { + return new $ZodCheckLengthEquals({ + check: "length_equals", + ...normalizeParams(params), + length + }); + } + function _regex(pattern, params) { + return new $ZodCheckRegex({ + check: "string_format", + format: "regex", + ...normalizeParams(params), + pattern + }); + } + function _lowercase(params) { + return new $ZodCheckLowerCase({ + check: "string_format", + format: "lowercase", + ...normalizeParams(params) + }); + } + function _uppercase(params) { + return new $ZodCheckUpperCase({ + check: "string_format", + format: "uppercase", + ...normalizeParams(params) + }); + } + function _includes(includes, params) { + return new $ZodCheckIncludes({ + check: "string_format", + format: "includes", + ...normalizeParams(params), + includes + }); + } + function _startsWith(prefix, params) { + return new $ZodCheckStartsWith({ + check: "string_format", + format: "starts_with", + ...normalizeParams(params), + prefix + }); + } + function _endsWith(suffix, params) { + return new $ZodCheckEndsWith({ + check: "string_format", + format: "ends_with", + ...normalizeParams(params), + suffix + }); + } + function _property(property, schema, params) { + return new $ZodCheckProperty({ + check: "property", + property, + schema, + ...normalizeParams(params) + }); + } + function _mime(types, params) { + return new $ZodCheckMimeType({ + check: "mime_type", + mime: types, + ...normalizeParams(params) + }); + } + function _overwrite(tx) { + return new $ZodCheckOverwrite({ + check: "overwrite", + tx + }); + } + function _normalize(form) { + return _overwrite((input) => input.normalize(form)); + } + function _trim() { + return _overwrite((input) => input.trim()); + } + function _toLowerCase() { + return _overwrite((input) => input.toLowerCase()); + } + function _toUpperCase() { + return _overwrite((input) => input.toUpperCase()); + } + function _array(Class2, element, params) { + return new Class2({ + type: "array", + element, + // get element() { + // return element; + // }, + ...normalizeParams(params) + }); + } + function _union(Class2, options, params) { + return new Class2({ + type: "union", + options, + ...normalizeParams(params) + }); + } + function _discriminatedUnion(Class2, discriminator, options, params) { + return new Class2({ + type: "union", + options, + discriminator, + ...normalizeParams(params) + }); + } + function _intersection(Class2, left, right) { + return new Class2({ + type: "intersection", + left, + right + }); + } + function _tuple(Class2, items, _paramsOrRest, _params) { + const hasRest = _paramsOrRest instanceof $ZodType; + const params = hasRest ? _params : _paramsOrRest; + const rest = hasRest ? _paramsOrRest : null; + return new Class2({ + type: "tuple", + items, + rest, + ...normalizeParams(params) + }); + } + function _record(Class2, keyType, valueType, params) { + return new Class2({ + type: "record", + keyType, + valueType, + ...normalizeParams(params) + }); + } + function _map(Class2, keyType, valueType, params) { + return new Class2({ + type: "map", + keyType, + valueType, + ...normalizeParams(params) + }); + } + function _set(Class2, valueType, params) { + return new Class2({ + type: "set", + valueType, + ...normalizeParams(params) + }); + } + function _enum(Class2, values, params) { + const entries = Array.isArray(values) ? Object.fromEntries(values.map((v2) => [v2, v2])) : values; + return new Class2({ + type: "enum", + entries, + ...normalizeParams(params) + }); + } + function _nativeEnum(Class2, entries, params) { + return new Class2({ + type: "enum", + entries, + ...normalizeParams(params) + }); + } + function _literal(Class2, value, params) { + return new Class2({ + type: "literal", + values: Array.isArray(value) ? value : [value], + ...normalizeParams(params) + }); + } + function _file(Class2, params) { + return new Class2({ + type: "file", + ...normalizeParams(params) + }); + } + function _transform(Class2, fn) { + return new Class2({ + type: "transform", + transform: fn + }); + } + function _optional(Class2, innerType) { + return new Class2({ + type: "optional", + innerType + }); + } + function _nullable(Class2, innerType) { + return new Class2({ + type: "nullable", + innerType + }); + } + function _default(Class2, innerType, defaultValue) { + return new Class2({ + type: "default", + innerType, + get defaultValue() { + return typeof defaultValue === "function" ? defaultValue() : defaultValue; + } + }); + } + function _nonoptional(Class2, innerType, params) { + return new Class2({ + type: "nonoptional", + innerType, + ...normalizeParams(params) + }); + } + function _success(Class2, innerType) { + return new Class2({ + type: "success", + innerType + }); + } + function _catch(Class2, innerType, catchValue) { + return new Class2({ + type: "catch", + innerType, + catchValue: typeof catchValue === "function" ? catchValue : () => catchValue + }); + } + function _pipe(Class2, in_, out) { + return new Class2({ + type: "pipe", + in: in_, + out + }); + } + function _readonly(Class2, innerType) { + return new Class2({ + type: "readonly", + innerType + }); + } + function _templateLiteral(Class2, parts, params) { + return new Class2({ + type: "template_literal", + parts, + ...normalizeParams(params) + }); + } + function _lazy(Class2, getter) { + return new Class2({ + type: "lazy", + getter + }); + } + function _promise(Class2, innerType) { + return new Class2({ + type: "promise", + innerType + }); + } + function _custom(Class2, fn, _params) { + const norm = normalizeParams(_params); + norm.abort ?? (norm.abort = true); + const schema = new Class2({ + type: "custom", + check: "custom", + fn, + ...norm + }); + return schema; + } + function _refine(Class2, fn, _params) { + const schema = new Class2({ + type: "custom", + check: "custom", + fn, + ...normalizeParams(_params) + }); + return schema; + } + function _stringbool(Classes, _params) { + const params = normalizeParams(_params); + let truthyArray = params.truthy ?? ["true", "1", "yes", "on", "y", "enabled"]; + let falsyArray = params.falsy ?? ["false", "0", "no", "off", "n", "disabled"]; + if (params.case !== "sensitive") { + truthyArray = truthyArray.map((v2) => typeof v2 === "string" ? v2.toLowerCase() : v2); + falsyArray = falsyArray.map((v2) => typeof v2 === "string" ? v2.toLowerCase() : v2); + } + const truthySet = new Set(truthyArray); + const falsySet = new Set(falsyArray); + const _Pipe = Classes.Pipe ?? $ZodPipe; + const _Boolean = Classes.Boolean ?? $ZodBoolean; + const _String = Classes.String ?? $ZodString; + const _Transform = Classes.Transform ?? $ZodTransform; + const tx = new _Transform({ + type: "transform", + transform: (input, payload) => { + let data = input; + if (params.case !== "sensitive") + data = data.toLowerCase(); + if (truthySet.has(data)) { + return true; + } else if (falsySet.has(data)) { + return false; + } else { + payload.issues.push({ + code: "invalid_value", + expected: "stringbool", + values: [...truthySet, ...falsySet], + input: payload.value, + inst: tx + }); + return {}; + } + }, + error: params.error + }); + const innerPipe = new _Pipe({ + type: "pipe", + in: new _String({ type: "string", error: params.error }), + out: tx, + error: params.error + }); + const outerPipe = new _Pipe({ + type: "pipe", + in: innerPipe, + out: new _Boolean({ + type: "boolean", + error: params.error + }), + error: params.error + }); + return outerPipe; + } + function _stringFormat(Class2, format, fnOrRegex, _params = {}) { + const params = normalizeParams(_params); + const def = { + ...normalizeParams(_params), + check: "string_format", + type: "string", + format, + fn: typeof fnOrRegex === "function" ? fnOrRegex : (val) => fnOrRegex.test(val), + ...params + }; + if (fnOrRegex instanceof RegExp) { + def.pattern = fnOrRegex; + } + const inst = new Class2(def); + return inst; + } + var TimePrecision; + var init_api = __esm({ + "node_modules/zod/v4/core/api.js"() { + init_checks(); + init_schemas(); + init_util(); + TimePrecision = { + Any: null, + Minute: -1, + Second: 0, + Millisecond: 3, + Microsecond: 6 + }; + } + }); + + // node_modules/zod/v4/core/function.js + function _function(params) { + return new $ZodFunction({ + type: "function", + input: Array.isArray(params?.input) ? _tuple($ZodTuple, params?.input) : params?.input ?? _array($ZodArray, _unknown($ZodUnknown)), + output: params?.output ?? _unknown($ZodUnknown) + }); + } + var $ZodFunction; + var init_function = __esm({ + "node_modules/zod/v4/core/function.js"() { + init_api(); + init_parse(); + init_schemas(); + init_schemas(); + $ZodFunction = class { + constructor(def) { + this._def = def; + this.def = def; + } + implement(func) { + if (typeof func !== "function") { + throw new Error("implement() must be called with a function"); + } + const impl = (...args) => { + const parsedArgs = this._def.input ? parse(this._def.input, args, void 0, { callee: impl }) : args; + if (!Array.isArray(parsedArgs)) { + throw new Error("Invalid arguments schema: not an array or tuple schema."); + } + const output = func(...parsedArgs); + return this._def.output ? parse(this._def.output, output, void 0, { callee: impl }) : output; + }; + return impl; + } + implementAsync(func) { + if (typeof func !== "function") { + throw new Error("implement() must be called with a function"); + } + const impl = async (...args) => { + const parsedArgs = this._def.input ? await parseAsync(this._def.input, args, void 0, { callee: impl }) : args; + if (!Array.isArray(parsedArgs)) { + throw new Error("Invalid arguments schema: not an array or tuple schema."); + } + const output = await func(...parsedArgs); + return this._def.output ? parseAsync(this._def.output, output, void 0, { callee: impl }) : output; + }; + return impl; + } + input(...args) { + const F2 = this.constructor; + if (Array.isArray(args[0])) { + return new F2({ + type: "function", + input: new $ZodTuple({ + type: "tuple", + items: args[0], + rest: args[1] + }), + output: this._def.output + }); + } + return new F2({ + type: "function", + input: args[0], + output: this._def.output + }); + } + output(output) { + const F2 = this.constructor; + return new F2({ + type: "function", + input: this._def.input, + output + }); + } + }; + } + }); + + // node_modules/zod/v4/core/to-json-schema.js + function toJSONSchema(input, _params) { + if (input instanceof $ZodRegistry) { + const gen2 = new JSONSchemaGenerator(_params); + const defs = {}; + for (const entry of input._idmap.entries()) { + const [_2, schema] = entry; + gen2.process(schema); + } + const schemas = {}; + const external = { + registry: input, + uri: _params?.uri, + defs + }; + for (const entry of input._idmap.entries()) { + const [key, schema] = entry; + schemas[key] = gen2.emit(schema, { + ..._params, + external + }); + } + if (Object.keys(defs).length > 0) { + const defsSegment = gen2.target === "draft-2020-12" ? "$defs" : "definitions"; + schemas.__shared = { + [defsSegment]: defs + }; + } + return { schemas }; + } + const gen = new JSONSchemaGenerator(_params); + gen.process(input); + return gen.emit(input, _params); + } + function isTransforming(_schema, _ctx) { + const ctx = _ctx ?? { seen: /* @__PURE__ */ new Set() }; + if (ctx.seen.has(_schema)) + return false; + ctx.seen.add(_schema); + const schema = _schema; + const def = schema._zod.def; + switch (def.type) { + case "string": + case "number": + case "bigint": + case "boolean": + case "date": + case "symbol": + case "undefined": + case "null": + case "any": + case "unknown": + case "never": + case "void": + case "literal": + case "enum": + case "nan": + case "file": + case "template_literal": + return false; + case "array": { + return isTransforming(def.element, ctx); + } + case "object": { + for (const key in def.shape) { + if (isTransforming(def.shape[key], ctx)) + return true; + } + return false; + } + case "union": { + for (const option of def.options) { + if (isTransforming(option, ctx)) + return true; + } + return false; + } + case "intersection": { + return isTransforming(def.left, ctx) || isTransforming(def.right, ctx); + } + case "tuple": { + for (const item of def.items) { + if (isTransforming(item, ctx)) + return true; + } + if (def.rest && isTransforming(def.rest, ctx)) + return true; + return false; + } + case "record": { + return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx); + } + case "map": { + return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx); + } + case "set": { + return isTransforming(def.valueType, ctx); + } + // inner types + case "promise": + case "optional": + case "nonoptional": + case "nullable": + case "readonly": + return isTransforming(def.innerType, ctx); + case "lazy": + return isTransforming(def.getter(), ctx); + case "default": { + return isTransforming(def.innerType, ctx); + } + case "prefault": { + return isTransforming(def.innerType, ctx); + } + case "custom": { + return false; + } + case "transform": { + return true; + } + case "pipe": { + return isTransforming(def.in, ctx) || isTransforming(def.out, ctx); + } + case "success": { + return false; + } + case "catch": { + return false; + } + default: + def; + } + throw new Error(`Unknown schema type: ${def.type}`); + } + var JSONSchemaGenerator; + var init_to_json_schema = __esm({ + "node_modules/zod/v4/core/to-json-schema.js"() { + init_registries(); + init_util(); + JSONSchemaGenerator = class { + constructor(params) { + this.counter = 0; + this.metadataRegistry = params?.metadata ?? globalRegistry; + this.target = params?.target ?? "draft-2020-12"; + this.unrepresentable = params?.unrepresentable ?? "throw"; + this.override = params?.override ?? (() => { + }); + this.io = params?.io ?? "output"; + this.seen = /* @__PURE__ */ new Map(); + } + process(schema, _params = { path: [], schemaPath: [] }) { + var _a; + const def = schema._zod.def; + const formatMap = { + guid: "uuid", + url: "uri", + datetime: "date-time", + json_string: "json-string", + regex: "" + // do not set + }; + const seen = this.seen.get(schema); + if (seen) { + seen.count++; + const isCycle = _params.schemaPath.includes(schema); + if (isCycle) { + seen.cycle = _params.path; + } + return seen.schema; + } + const result = { schema: {}, count: 1, cycle: void 0, path: _params.path }; + this.seen.set(schema, result); + const overrideSchema = schema._zod.toJSONSchema?.(); + if (overrideSchema) { + result.schema = overrideSchema; + } else { + const params = { + ..._params, + schemaPath: [..._params.schemaPath, schema], + path: _params.path + }; + const parent = schema._zod.parent; + if (parent) { + result.ref = parent; + this.process(parent, params); + this.seen.get(parent).isParent = true; + } else { + const _json = result.schema; + switch (def.type) { + case "string": { + const json2 = _json; + json2.type = "string"; + const { minimum, maximum, format, patterns, contentEncoding } = schema._zod.bag; + if (typeof minimum === "number") + json2.minLength = minimum; + if (typeof maximum === "number") + json2.maxLength = maximum; + if (format) { + json2.format = formatMap[format] ?? format; + if (json2.format === "") + delete json2.format; + } + if (contentEncoding) + json2.contentEncoding = contentEncoding; + if (patterns && patterns.size > 0) { + const regexes = [...patterns]; + if (regexes.length === 1) + json2.pattern = regexes[0].source; + else if (regexes.length > 1) { + result.schema.allOf = [ + ...regexes.map((regex) => ({ + ...this.target === "draft-7" ? { type: "string" } : {}, + pattern: regex.source + })) + ]; + } + } + break; + } + case "number": { + const json2 = _json; + const { minimum, maximum, format, multipleOf, exclusiveMaximum, exclusiveMinimum } = schema._zod.bag; + if (typeof format === "string" && format.includes("int")) + json2.type = "integer"; + else + json2.type = "number"; + if (typeof exclusiveMinimum === "number") + json2.exclusiveMinimum = exclusiveMinimum; + if (typeof minimum === "number") { + json2.minimum = minimum; + if (typeof exclusiveMinimum === "number") { + if (exclusiveMinimum >= minimum) + delete json2.minimum; + else + delete json2.exclusiveMinimum; + } + } + if (typeof exclusiveMaximum === "number") + json2.exclusiveMaximum = exclusiveMaximum; + if (typeof maximum === "number") { + json2.maximum = maximum; + if (typeof exclusiveMaximum === "number") { + if (exclusiveMaximum <= maximum) + delete json2.maximum; + else + delete json2.exclusiveMaximum; + } + } + if (typeof multipleOf === "number") + json2.multipleOf = multipleOf; + break; + } + case "boolean": { + const json2 = _json; + json2.type = "boolean"; + break; + } + case "bigint": { + if (this.unrepresentable === "throw") { + throw new Error("BigInt cannot be represented in JSON Schema"); + } + break; + } + case "symbol": { + if (this.unrepresentable === "throw") { + throw new Error("Symbols cannot be represented in JSON Schema"); + } + break; + } + case "null": { + _json.type = "null"; + break; + } + case "any": { + break; + } + case "unknown": { + break; + } + case "undefined": { + if (this.unrepresentable === "throw") { + throw new Error("Undefined cannot be represented in JSON Schema"); + } + break; + } + case "void": { + if (this.unrepresentable === "throw") { + throw new Error("Void cannot be represented in JSON Schema"); + } + break; + } + case "never": { + _json.not = {}; + break; + } + case "date": { + if (this.unrepresentable === "throw") { + throw new Error("Date cannot be represented in JSON Schema"); + } + break; + } + case "array": { + const json2 = _json; + const { minimum, maximum } = schema._zod.bag; + if (typeof minimum === "number") + json2.minItems = minimum; + if (typeof maximum === "number") + json2.maxItems = maximum; + json2.type = "array"; + json2.items = this.process(def.element, { ...params, path: [...params.path, "items"] }); + break; + } + case "object": { + const json2 = _json; + json2.type = "object"; + json2.properties = {}; + const shape = def.shape; + for (const key in shape) { + json2.properties[key] = this.process(shape[key], { + ...params, + path: [...params.path, "properties", key] + }); + } + const allKeys = new Set(Object.keys(shape)); + const requiredKeys = new Set([...allKeys].filter((key) => { + const v2 = def.shape[key]._zod; + if (this.io === "input") { + return v2.optin === void 0; + } else { + return v2.optout === void 0; + } + })); + if (requiredKeys.size > 0) { + json2.required = Array.from(requiredKeys); + } + if (def.catchall?._zod.def.type === "never") { + json2.additionalProperties = false; + } else if (!def.catchall) { + if (this.io === "output") + json2.additionalProperties = false; + } else if (def.catchall) { + json2.additionalProperties = this.process(def.catchall, { + ...params, + path: [...params.path, "additionalProperties"] + }); + } + break; + } + case "union": { + const json2 = _json; + json2.anyOf = def.options.map((x, i2) => this.process(x, { + ...params, + path: [...params.path, "anyOf", i2] + })); + break; + } + case "intersection": { + const json2 = _json; + const a = this.process(def.left, { + ...params, + path: [...params.path, "allOf", 0] + }); + const b2 = this.process(def.right, { + ...params, + path: [...params.path, "allOf", 1] + }); + const isSimpleIntersection = (val) => "allOf" in val && Object.keys(val).length === 1; + const allOf = [ + ...isSimpleIntersection(a) ? a.allOf : [a], + ...isSimpleIntersection(b2) ? b2.allOf : [b2] + ]; + json2.allOf = allOf; + break; + } + case "tuple": { + const json2 = _json; + json2.type = "array"; + const prefixItems = def.items.map((x, i2) => this.process(x, { ...params, path: [...params.path, "prefixItems", i2] })); + if (this.target === "draft-2020-12") { + json2.prefixItems = prefixItems; + } else { + json2.items = prefixItems; + } + if (def.rest) { + const rest = this.process(def.rest, { + ...params, + path: [...params.path, "items"] + }); + if (this.target === "draft-2020-12") { + json2.items = rest; + } else { + json2.additionalItems = rest; + } + } + if (def.rest) { + json2.items = this.process(def.rest, { + ...params, + path: [...params.path, "items"] + }); + } + const { minimum, maximum } = schema._zod.bag; + if (typeof minimum === "number") + json2.minItems = minimum; + if (typeof maximum === "number") + json2.maxItems = maximum; + break; + } + case "record": { + const json2 = _json; + json2.type = "object"; + json2.propertyNames = this.process(def.keyType, { ...params, path: [...params.path, "propertyNames"] }); + json2.additionalProperties = this.process(def.valueType, { + ...params, + path: [...params.path, "additionalProperties"] + }); + break; + } + case "map": { + if (this.unrepresentable === "throw") { + throw new Error("Map cannot be represented in JSON Schema"); + } + break; + } + case "set": { + if (this.unrepresentable === "throw") { + throw new Error("Set cannot be represented in JSON Schema"); + } + break; + } + case "enum": { + const json2 = _json; + const values = getEnumValues(def.entries); + if (values.every((v2) => typeof v2 === "number")) + json2.type = "number"; + if (values.every((v2) => typeof v2 === "string")) + json2.type = "string"; + json2.enum = values; + break; + } + case "literal": { + const json2 = _json; + const vals = []; + for (const val of def.values) { + if (val === void 0) { + if (this.unrepresentable === "throw") { + throw new Error("Literal `undefined` cannot be represented in JSON Schema"); + } else { + } + } else if (typeof val === "bigint") { + if (this.unrepresentable === "throw") { + throw new Error("BigInt literals cannot be represented in JSON Schema"); + } else { + vals.push(Number(val)); + } + } else { + vals.push(val); + } + } + if (vals.length === 0) { + } else if (vals.length === 1) { + const val = vals[0]; + json2.type = val === null ? "null" : typeof val; + json2.const = val; + } else { + if (vals.every((v2) => typeof v2 === "number")) + json2.type = "number"; + if (vals.every((v2) => typeof v2 === "string")) + json2.type = "string"; + if (vals.every((v2) => typeof v2 === "boolean")) + json2.type = "string"; + if (vals.every((v2) => v2 === null)) + json2.type = "null"; + json2.enum = vals; + } + break; + } + case "file": { + const json2 = _json; + const file2 = { + type: "string", + format: "binary", + contentEncoding: "binary" + }; + const { minimum, maximum, mime } = schema._zod.bag; + if (minimum !== void 0) + file2.minLength = minimum; + if (maximum !== void 0) + file2.maxLength = maximum; + if (mime) { + if (mime.length === 1) { + file2.contentMediaType = mime[0]; + Object.assign(json2, file2); + } else { + json2.anyOf = mime.map((m) => { + const mFile = { ...file2, contentMediaType: m }; + return mFile; + }); + } + } else { + Object.assign(json2, file2); + } + break; + } + case "transform": { + if (this.unrepresentable === "throw") { + throw new Error("Transforms cannot be represented in JSON Schema"); + } + break; + } + case "nullable": { + const inner = this.process(def.innerType, params); + _json.anyOf = [inner, { type: "null" }]; + break; + } + case "nonoptional": { + this.process(def.innerType, params); + result.ref = def.innerType; + break; + } + case "success": { + const json2 = _json; + json2.type = "boolean"; + break; + } + case "default": { + this.process(def.innerType, params); + result.ref = def.innerType; + _json.default = JSON.parse(JSON.stringify(def.defaultValue)); + break; + } + case "prefault": { + this.process(def.innerType, params); + result.ref = def.innerType; + if (this.io === "input") + _json._prefault = JSON.parse(JSON.stringify(def.defaultValue)); + break; + } + case "catch": { + this.process(def.innerType, params); + result.ref = def.innerType; + let catchValue; + try { + catchValue = def.catchValue(void 0); + } catch { + throw new Error("Dynamic catch values are not supported in JSON Schema"); + } + _json.default = catchValue; + break; + } + case "nan": { + if (this.unrepresentable === "throw") { + throw new Error("NaN cannot be represented in JSON Schema"); + } + break; + } + case "template_literal": { + const json2 = _json; + const pattern = schema._zod.pattern; + if (!pattern) + throw new Error("Pattern not found in template literal"); + json2.type = "string"; + json2.pattern = pattern.source; + break; + } + case "pipe": { + const innerType = this.io === "input" ? def.in._zod.def.type === "transform" ? def.out : def.in : def.out; + this.process(innerType, params); + result.ref = innerType; + break; + } + case "readonly": { + this.process(def.innerType, params); + result.ref = def.innerType; + _json.readOnly = true; + break; + } + // passthrough types + case "promise": { + this.process(def.innerType, params); + result.ref = def.innerType; + break; + } + case "optional": { + this.process(def.innerType, params); + result.ref = def.innerType; + break; + } + case "lazy": { + const innerType = schema._zod.innerType; + this.process(innerType, params); + result.ref = innerType; + break; + } + case "custom": { + if (this.unrepresentable === "throw") { + throw new Error("Custom types cannot be represented in JSON Schema"); + } + break; + } + default: { + def; + } + } + } + } + const meta = this.metadataRegistry.get(schema); + if (meta) + Object.assign(result.schema, meta); + if (this.io === "input" && isTransforming(schema)) { + delete result.schema.examples; + delete result.schema.default; + } + if (this.io === "input" && result.schema._prefault) + (_a = result.schema).default ?? (_a.default = result.schema._prefault); + delete result.schema._prefault; + const _result = this.seen.get(schema); + return _result.schema; + } + emit(schema, _params) { + const params = { + cycles: _params?.cycles ?? "ref", + reused: _params?.reused ?? "inline", + // unrepresentable: _params?.unrepresentable ?? "throw", + // uri: _params?.uri ?? ((id) => `${id}`), + external: _params?.external ?? void 0 + }; + const root2 = this.seen.get(schema); + if (!root2) + throw new Error("Unprocessed schema. This is a bug in Zod."); + const makeURI = (entry) => { + const defsSegment = this.target === "draft-2020-12" ? "$defs" : "definitions"; + if (params.external) { + const externalId = params.external.registry.get(entry[0])?.id; + const uriGenerator = params.external.uri ?? ((id2) => id2); + if (externalId) { + return { ref: uriGenerator(externalId) }; + } + const id = entry[1].defId ?? entry[1].schema.id ?? `schema${this.counter++}`; + entry[1].defId = id; + return { defId: id, ref: `${uriGenerator("__shared")}#/${defsSegment}/${id}` }; + } + if (entry[1] === root2) { + return { ref: "#" }; + } + const uriPrefix = `#`; + const defUriPrefix = `${uriPrefix}/${defsSegment}/`; + const defId = entry[1].schema.id ?? `__schema${this.counter++}`; + return { defId, ref: defUriPrefix + defId }; + }; + const extractToDef = (entry) => { + if (entry[1].schema.$ref) { + return; + } + const seen = entry[1]; + const { ref, defId } = makeURI(entry); + seen.def = { ...seen.schema }; + if (defId) + seen.defId = defId; + const schema2 = seen.schema; + for (const key in schema2) { + delete schema2[key]; + } + schema2.$ref = ref; + }; + if (params.cycles === "throw") { + for (const entry of this.seen.entries()) { + const seen = entry[1]; + if (seen.cycle) { + throw new Error(`Cycle detected: #/${seen.cycle?.join("/")}/ + +Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`); + } + } + } + for (const entry of this.seen.entries()) { + const seen = entry[1]; + if (schema === entry[0]) { + extractToDef(entry); + continue; + } + if (params.external) { + const ext = params.external.registry.get(entry[0])?.id; + if (schema !== entry[0] && ext) { + extractToDef(entry); + continue; + } + } + const id = this.metadataRegistry.get(entry[0])?.id; + if (id) { + extractToDef(entry); + continue; + } + if (seen.cycle) { + extractToDef(entry); + continue; + } + if (seen.count > 1) { + if (params.reused === "ref") { + extractToDef(entry); + continue; + } + } + } + const flattenRef = (zodSchema, params2) => { + const seen = this.seen.get(zodSchema); + const schema2 = seen.def ?? seen.schema; + const _cached = { ...schema2 }; + if (seen.ref === null) { + return; + } + const ref = seen.ref; + seen.ref = null; + if (ref) { + flattenRef(ref, params2); + const refSchema = this.seen.get(ref).schema; + if (refSchema.$ref && params2.target === "draft-7") { + schema2.allOf = schema2.allOf ?? []; + schema2.allOf.push(refSchema); + } else { + Object.assign(schema2, refSchema); + Object.assign(schema2, _cached); + } + } + if (!seen.isParent) + this.override({ + zodSchema, + jsonSchema: schema2, + path: seen.path ?? [] + }); + }; + for (const entry of [...this.seen.entries()].reverse()) { + flattenRef(entry[0], { target: this.target }); + } + const result = {}; + if (this.target === "draft-2020-12") { + result.$schema = "https://json-schema.org/draft/2020-12/schema"; + } else if (this.target === "draft-7") { + result.$schema = "http://json-schema.org/draft-07/schema#"; + } else { + console.warn(`Invalid target: ${this.target}`); + } + if (params.external?.uri) { + const id = params.external.registry.get(schema)?.id; + if (!id) + throw new Error("Schema is missing an `id` property"); + result.$id = params.external.uri(id); + } + Object.assign(result, root2.def); + const defs = params.external?.defs ?? {}; + for (const entry of this.seen.entries()) { + const seen = entry[1]; + if (seen.def && seen.defId) { + defs[seen.defId] = seen.def; + } + } + if (params.external) { + } else { + if (Object.keys(defs).length > 0) { + if (this.target === "draft-2020-12") { + result.$defs = defs; + } else { + result.definitions = defs; + } + } + } + try { + return JSON.parse(JSON.stringify(result)); + } catch (_err) { + throw new Error("Error converting schema to JSON."); + } + } + }; + } + }); + + // node_modules/zod/v4/core/json-schema.js + var json_schema_exports = {}; + var init_json_schema = __esm({ + "node_modules/zod/v4/core/json-schema.js"() { + } + }); + + // node_modules/zod/v4/core/index.js + var core_exports2 = {}; + __export(core_exports2, { + $ZodAny: () => $ZodAny, + $ZodArray: () => $ZodArray, + $ZodAsyncError: () => $ZodAsyncError, + $ZodBase64: () => $ZodBase64, + $ZodBase64URL: () => $ZodBase64URL, + $ZodBigInt: () => $ZodBigInt, + $ZodBigIntFormat: () => $ZodBigIntFormat, + $ZodBoolean: () => $ZodBoolean, + $ZodCIDRv4: () => $ZodCIDRv4, + $ZodCIDRv6: () => $ZodCIDRv6, + $ZodCUID: () => $ZodCUID, + $ZodCUID2: () => $ZodCUID2, + $ZodCatch: () => $ZodCatch, + $ZodCheck: () => $ZodCheck, + $ZodCheckBigIntFormat: () => $ZodCheckBigIntFormat, + $ZodCheckEndsWith: () => $ZodCheckEndsWith, + $ZodCheckGreaterThan: () => $ZodCheckGreaterThan, + $ZodCheckIncludes: () => $ZodCheckIncludes, + $ZodCheckLengthEquals: () => $ZodCheckLengthEquals, + $ZodCheckLessThan: () => $ZodCheckLessThan, + $ZodCheckLowerCase: () => $ZodCheckLowerCase, + $ZodCheckMaxLength: () => $ZodCheckMaxLength, + $ZodCheckMaxSize: () => $ZodCheckMaxSize, + $ZodCheckMimeType: () => $ZodCheckMimeType, + $ZodCheckMinLength: () => $ZodCheckMinLength, + $ZodCheckMinSize: () => $ZodCheckMinSize, + $ZodCheckMultipleOf: () => $ZodCheckMultipleOf, + $ZodCheckNumberFormat: () => $ZodCheckNumberFormat, + $ZodCheckOverwrite: () => $ZodCheckOverwrite, + $ZodCheckProperty: () => $ZodCheckProperty, + $ZodCheckRegex: () => $ZodCheckRegex, + $ZodCheckSizeEquals: () => $ZodCheckSizeEquals, + $ZodCheckStartsWith: () => $ZodCheckStartsWith, + $ZodCheckStringFormat: () => $ZodCheckStringFormat, + $ZodCheckUpperCase: () => $ZodCheckUpperCase, + $ZodCustom: () => $ZodCustom, + $ZodCustomStringFormat: () => $ZodCustomStringFormat, + $ZodDate: () => $ZodDate, + $ZodDefault: () => $ZodDefault, + $ZodDiscriminatedUnion: () => $ZodDiscriminatedUnion, + $ZodE164: () => $ZodE164, + $ZodEmail: () => $ZodEmail, + $ZodEmoji: () => $ZodEmoji, + $ZodEnum: () => $ZodEnum, + $ZodError: () => $ZodError, + $ZodFile: () => $ZodFile, + $ZodFunction: () => $ZodFunction, + $ZodGUID: () => $ZodGUID, + $ZodIPv4: () => $ZodIPv4, + $ZodIPv6: () => $ZodIPv6, + $ZodISODate: () => $ZodISODate, + $ZodISODateTime: () => $ZodISODateTime, + $ZodISODuration: () => $ZodISODuration, + $ZodISOTime: () => $ZodISOTime, + $ZodIntersection: () => $ZodIntersection, + $ZodJWT: () => $ZodJWT, + $ZodKSUID: () => $ZodKSUID, + $ZodLazy: () => $ZodLazy, + $ZodLiteral: () => $ZodLiteral, + $ZodMap: () => $ZodMap, + $ZodNaN: () => $ZodNaN, + $ZodNanoID: () => $ZodNanoID, + $ZodNever: () => $ZodNever, + $ZodNonOptional: () => $ZodNonOptional, + $ZodNull: () => $ZodNull, + $ZodNullable: () => $ZodNullable, + $ZodNumber: () => $ZodNumber, + $ZodNumberFormat: () => $ZodNumberFormat, + $ZodObject: () => $ZodObject, + $ZodOptional: () => $ZodOptional, + $ZodPipe: () => $ZodPipe, + $ZodPrefault: () => $ZodPrefault, + $ZodPromise: () => $ZodPromise, + $ZodReadonly: () => $ZodReadonly, + $ZodRealError: () => $ZodRealError, + $ZodRecord: () => $ZodRecord, + $ZodRegistry: () => $ZodRegistry, + $ZodSet: () => $ZodSet, + $ZodString: () => $ZodString, + $ZodStringFormat: () => $ZodStringFormat, + $ZodSuccess: () => $ZodSuccess, + $ZodSymbol: () => $ZodSymbol, + $ZodTemplateLiteral: () => $ZodTemplateLiteral, + $ZodTransform: () => $ZodTransform, + $ZodTuple: () => $ZodTuple, + $ZodType: () => $ZodType, + $ZodULID: () => $ZodULID, + $ZodURL: () => $ZodURL, + $ZodUUID: () => $ZodUUID, + $ZodUndefined: () => $ZodUndefined, + $ZodUnion: () => $ZodUnion, + $ZodUnknown: () => $ZodUnknown, + $ZodVoid: () => $ZodVoid, + $ZodXID: () => $ZodXID, + $brand: () => $brand, + $constructor: () => $constructor, + $input: () => $input, + $output: () => $output, + Doc: () => Doc, + JSONSchema: () => json_schema_exports, + JSONSchemaGenerator: () => JSONSchemaGenerator, + NEVER: () => NEVER, + TimePrecision: () => TimePrecision, + _any: () => _any, + _array: () => _array, + _base64: () => _base64, + _base64url: () => _base64url, + _bigint: () => _bigint, + _boolean: () => _boolean, + _catch: () => _catch, + _cidrv4: () => _cidrv4, + _cidrv6: () => _cidrv6, + _coercedBigint: () => _coercedBigint, + _coercedBoolean: () => _coercedBoolean, + _coercedDate: () => _coercedDate, + _coercedNumber: () => _coercedNumber, + _coercedString: () => _coercedString, + _cuid: () => _cuid, + _cuid2: () => _cuid2, + _custom: () => _custom, + _date: () => _date, + _default: () => _default, + _discriminatedUnion: () => _discriminatedUnion, + _e164: () => _e164, + _email: () => _email, + _emoji: () => _emoji2, + _endsWith: () => _endsWith, + _enum: () => _enum, + _file: () => _file, + _float32: () => _float32, + _float64: () => _float64, + _gt: () => _gt, + _gte: () => _gte, + _guid: () => _guid, + _includes: () => _includes, + _int: () => _int, + _int32: () => _int32, + _int64: () => _int64, + _intersection: () => _intersection, + _ipv4: () => _ipv4, + _ipv6: () => _ipv6, + _isoDate: () => _isoDate, + _isoDateTime: () => _isoDateTime, + _isoDuration: () => _isoDuration, + _isoTime: () => _isoTime, + _jwt: () => _jwt, + _ksuid: () => _ksuid, + _lazy: () => _lazy, + _length: () => _length, + _literal: () => _literal, + _lowercase: () => _lowercase, + _lt: () => _lt, + _lte: () => _lte, + _map: () => _map, + _max: () => _lte, + _maxLength: () => _maxLength, + _maxSize: () => _maxSize, + _mime: () => _mime, + _min: () => _gte, + _minLength: () => _minLength, + _minSize: () => _minSize, + _multipleOf: () => _multipleOf, + _nan: () => _nan, + _nanoid: () => _nanoid, + _nativeEnum: () => _nativeEnum, + _negative: () => _negative, + _never: () => _never, + _nonnegative: () => _nonnegative, + _nonoptional: () => _nonoptional, + _nonpositive: () => _nonpositive, + _normalize: () => _normalize, + _null: () => _null2, + _nullable: () => _nullable, + _number: () => _number, + _optional: () => _optional, + _overwrite: () => _overwrite, + _parse: () => _parse, + _parseAsync: () => _parseAsync, + _pipe: () => _pipe, + _positive: () => _positive, + _promise: () => _promise, + _property: () => _property, + _readonly: () => _readonly, + _record: () => _record, + _refine: () => _refine, + _regex: () => _regex, + _safeParse: () => _safeParse, + _safeParseAsync: () => _safeParseAsync, + _set: () => _set, + _size: () => _size, + _startsWith: () => _startsWith, + _string: () => _string, + _stringFormat: () => _stringFormat, + _stringbool: () => _stringbool, + _success: () => _success, + _symbol: () => _symbol, + _templateLiteral: () => _templateLiteral, + _toLowerCase: () => _toLowerCase, + _toUpperCase: () => _toUpperCase, + _transform: () => _transform, + _trim: () => _trim, + _tuple: () => _tuple, + _uint32: () => _uint32, + _uint64: () => _uint64, + _ulid: () => _ulid, + _undefined: () => _undefined2, + _union: () => _union, + _unknown: () => _unknown, + _uppercase: () => _uppercase, + _url: () => _url, + _uuid: () => _uuid, + _uuidv4: () => _uuidv4, + _uuidv6: () => _uuidv6, + _uuidv7: () => _uuidv7, + _void: () => _void, + _xid: () => _xid, + clone: () => clone, + config: () => config, + flattenError: () => flattenError, + formatError: () => formatError, + function: () => _function, + globalConfig: () => globalConfig, + globalRegistry: () => globalRegistry, + isValidBase64: () => isValidBase64, + isValidBase64URL: () => isValidBase64URL, + isValidJWT: () => isValidJWT, + locales: () => locales_exports, + parse: () => parse, + parseAsync: () => parseAsync, + prettifyError: () => prettifyError, + regexes: () => regexes_exports, + registry: () => registry, + safeParse: () => safeParse, + safeParseAsync: () => safeParseAsync, + toDotPath: () => toDotPath, + toJSONSchema: () => toJSONSchema, + treeifyError: () => treeifyError, + util: () => util_exports, + version: () => version + }); + var init_core2 = __esm({ + "node_modules/zod/v4/core/index.js"() { + init_core(); + init_parse(); + init_errors(); + init_schemas(); + init_checks(); + init_versions(); + init_util(); + init_regexes(); + init_locales(); + init_registries(); + init_doc(); + init_function(); + init_api(); + init_to_json_schema(); + init_json_schema(); + } + }); + + // node_modules/zod/v4/classic/checks.js + var init_checks2 = __esm({ + "node_modules/zod/v4/classic/checks.js"() { + init_core2(); + } + }); + + // node_modules/zod/v4/classic/iso.js + var iso_exports = {}; + __export(iso_exports, { + ZodISODate: () => ZodISODate, + ZodISODateTime: () => ZodISODateTime, + ZodISODuration: () => ZodISODuration, + ZodISOTime: () => ZodISOTime, + date: () => date2, + datetime: () => datetime2, + duration: () => duration2, + time: () => time2 + }); + function datetime2(params) { + return _isoDateTime(ZodISODateTime, params); + } + function date2(params) { + return _isoDate(ZodISODate, params); + } + function time2(params) { + return _isoTime(ZodISOTime, params); + } + function duration2(params) { + return _isoDuration(ZodISODuration, params); + } + var ZodISODateTime, ZodISODate, ZodISOTime, ZodISODuration; + var init_iso = __esm({ + "node_modules/zod/v4/classic/iso.js"() { + init_core2(); + init_schemas2(); + ZodISODateTime = /* @__PURE__ */ $constructor("ZodISODateTime", (inst, def) => { + $ZodISODateTime.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodISODate = /* @__PURE__ */ $constructor("ZodISODate", (inst, def) => { + $ZodISODate.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodISOTime = /* @__PURE__ */ $constructor("ZodISOTime", (inst, def) => { + $ZodISOTime.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodISODuration = /* @__PURE__ */ $constructor("ZodISODuration", (inst, def) => { + $ZodISODuration.init(inst, def); + ZodStringFormat.init(inst, def); + }); + } + }); + + // node_modules/zod/v4/classic/errors.js + var initializer2, ZodError, ZodRealError; + var init_errors2 = __esm({ + "node_modules/zod/v4/classic/errors.js"() { + init_core2(); + init_core2(); + initializer2 = (inst, issues) => { + $ZodError.init(inst, issues); + inst.name = "ZodError"; + Object.defineProperties(inst, { + format: { + value: (mapper) => formatError(inst, mapper) + // enumerable: false, + }, + flatten: { + value: (mapper) => flattenError(inst, mapper) + // enumerable: false, + }, + addIssue: { + value: (issue2) => inst.issues.push(issue2) + // enumerable: false, + }, + addIssues: { + value: (issues2) => inst.issues.push(...issues2) + // enumerable: false, + }, + isEmpty: { + get() { + return inst.issues.length === 0; + } + // enumerable: false, + } + }); + }; + ZodError = $constructor("ZodError", initializer2); + ZodRealError = $constructor("ZodError", initializer2, { + Parent: Error + }); + } + }); + + // node_modules/zod/v4/classic/parse.js + var parse2, parseAsync2, safeParse3, safeParseAsync2; + var init_parse2 = __esm({ + "node_modules/zod/v4/classic/parse.js"() { + init_core2(); + init_errors2(); + parse2 = /* @__PURE__ */ _parse(ZodRealError); + parseAsync2 = /* @__PURE__ */ _parseAsync(ZodRealError); + safeParse3 = /* @__PURE__ */ _safeParse(ZodRealError); + safeParseAsync2 = /* @__PURE__ */ _safeParseAsync(ZodRealError); + } + }); + + // node_modules/zod/v4/classic/schemas.js + function string2(params) { + return _string(ZodString, params); + } + function email2(params) { + return _email(ZodEmail, params); + } + function guid2(params) { + return _guid(ZodGUID, params); + } + function uuid2(params) { + return _uuid(ZodUUID, params); + } + function uuidv4(params) { + return _uuidv4(ZodUUID, params); + } + function uuidv6(params) { + return _uuidv6(ZodUUID, params); + } + function uuidv7(params) { + return _uuidv7(ZodUUID, params); + } + function url(params) { + return _url(ZodURL, params); + } + function emoji2(params) { + return _emoji2(ZodEmoji, params); + } + function nanoid2(params) { + return _nanoid(ZodNanoID, params); + } + function cuid3(params) { + return _cuid(ZodCUID, params); + } + function cuid22(params) { + return _cuid2(ZodCUID2, params); + } + function ulid2(params) { + return _ulid(ZodULID, params); + } + function xid2(params) { + return _xid(ZodXID, params); + } + function ksuid2(params) { + return _ksuid(ZodKSUID, params); + } + function ipv42(params) { + return _ipv4(ZodIPv4, params); + } + function ipv62(params) { + return _ipv6(ZodIPv6, params); + } + function cidrv42(params) { + return _cidrv4(ZodCIDRv4, params); + } + function cidrv62(params) { + return _cidrv6(ZodCIDRv6, params); + } + function base642(params) { + return _base64(ZodBase64, params); + } + function base64url2(params) { + return _base64url(ZodBase64URL, params); + } + function e1642(params) { + return _e164(ZodE164, params); + } + function jwt(params) { + return _jwt(ZodJWT, params); + } + function stringFormat(format, fnOrRegex, _params = {}) { + return _stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params); + } + function number2(params) { + return _number(ZodNumber, params); + } + function int(params) { + return _int(ZodNumberFormat, params); + } + function float32(params) { + return _float32(ZodNumberFormat, params); + } + function float64(params) { + return _float64(ZodNumberFormat, params); + } + function int32(params) { + return _int32(ZodNumberFormat, params); + } + function uint32(params) { + return _uint32(ZodNumberFormat, params); + } + function boolean2(params) { + return _boolean(ZodBoolean, params); + } + function bigint2(params) { + return _bigint(ZodBigInt, params); + } + function int64(params) { + return _int64(ZodBigIntFormat, params); + } + function uint64(params) { + return _uint64(ZodBigIntFormat, params); + } + function symbol(params) { + return _symbol(ZodSymbol, params); + } + function _undefined3(params) { + return _undefined2(ZodUndefined, params); + } + function _null3(params) { + return _null2(ZodNull, params); + } + function any() { + return _any(ZodAny); + } + function unknown() { + return _unknown(ZodUnknown); + } + function never(params) { + return _never(ZodNever, params); + } + function _void2(params) { + return _void(ZodVoid, params); + } + function date3(params) { + return _date(ZodDate, params); + } + function array(element, params) { + return _array(ZodArray, element, params); + } + function keyof(schema) { + const shape = schema._zod.def.shape; + return literal(Object.keys(shape)); + } + function object2(shape, params) { + const def = { + type: "object", + get shape() { + util_exports.assignProp(this, "shape", { ...shape }); + return this.shape; + }, + ...util_exports.normalizeParams(params) + }; + return new ZodObject(def); + } + function strictObject(shape, params) { + return new ZodObject({ + type: "object", + get shape() { + util_exports.assignProp(this, "shape", { ...shape }); + return this.shape; + }, + catchall: never(), + ...util_exports.normalizeParams(params) + }); + } + function looseObject(shape, params) { + return new ZodObject({ + type: "object", + get shape() { + util_exports.assignProp(this, "shape", { ...shape }); + return this.shape; + }, + catchall: unknown(), + ...util_exports.normalizeParams(params) + }); + } + function union(options, params) { + return new ZodUnion({ + type: "union", + options, + ...util_exports.normalizeParams(params) + }); + } + function discriminatedUnion(discriminator, options, params) { + return new ZodDiscriminatedUnion({ + type: "union", + options, + discriminator, + ...util_exports.normalizeParams(params) + }); + } + function intersection(left, right) { + return new ZodIntersection({ + type: "intersection", + left, + right + }); + } + function tuple(items, _paramsOrRest, _params) { + const hasRest = _paramsOrRest instanceof $ZodType; + const params = hasRest ? _params : _paramsOrRest; + const rest = hasRest ? _paramsOrRest : null; + return new ZodTuple({ + type: "tuple", + items, + rest, + ...util_exports.normalizeParams(params) + }); + } + function record(keyType, valueType, params) { + return new ZodRecord({ + type: "record", + keyType, + valueType, + ...util_exports.normalizeParams(params) + }); + } + function partialRecord(keyType, valueType, params) { + return new ZodRecord({ + type: "record", + keyType: union([keyType, never()]), + valueType, + ...util_exports.normalizeParams(params) + }); + } + function map(keyType, valueType, params) { + return new ZodMap({ + type: "map", + keyType, + valueType, + ...util_exports.normalizeParams(params) + }); + } + function set(valueType, params) { + return new ZodSet({ + type: "set", + valueType, + ...util_exports.normalizeParams(params) + }); + } + function _enum2(values, params) { + const entries = Array.isArray(values) ? Object.fromEntries(values.map((v2) => [v2, v2])) : values; + return new ZodEnum({ + type: "enum", + entries, + ...util_exports.normalizeParams(params) + }); + } + function nativeEnum(entries, params) { + return new ZodEnum({ + type: "enum", + entries, + ...util_exports.normalizeParams(params) + }); + } + function literal(value, params) { + return new ZodLiteral({ + type: "literal", + values: Array.isArray(value) ? value : [value], + ...util_exports.normalizeParams(params) + }); + } + function file(params) { + return _file(ZodFile, params); + } + function transform(fn) { + return new ZodTransform({ + type: "transform", + transform: fn + }); + } + function optional(innerType) { + return new ZodOptional({ + type: "optional", + innerType + }); + } + function nullable(innerType) { + return new ZodNullable({ + type: "nullable", + innerType + }); + } + function nullish2(innerType) { + return optional(nullable(innerType)); + } + function _default2(innerType, defaultValue) { + return new ZodDefault({ + type: "default", + innerType, + get defaultValue() { + return typeof defaultValue === "function" ? defaultValue() : defaultValue; + } + }); + } + function prefault(innerType, defaultValue) { + return new ZodPrefault({ + type: "prefault", + innerType, + get defaultValue() { + return typeof defaultValue === "function" ? defaultValue() : defaultValue; + } + }); + } + function nonoptional(innerType, params) { + return new ZodNonOptional({ + type: "nonoptional", + innerType, + ...util_exports.normalizeParams(params) + }); + } + function success(innerType) { + return new ZodSuccess({ + type: "success", + innerType + }); + } + function _catch2(innerType, catchValue) { + return new ZodCatch({ + type: "catch", + innerType, + catchValue: typeof catchValue === "function" ? catchValue : () => catchValue + }); + } + function nan(params) { + return _nan(ZodNaN, params); + } + function pipe(in_, out) { + return new ZodPipe({ + type: "pipe", + in: in_, + out + // ...util.normalizeParams(params), + }); + } + function readonly(innerType) { + return new ZodReadonly({ + type: "readonly", + innerType + }); + } + function templateLiteral(parts, params) { + return new ZodTemplateLiteral({ + type: "template_literal", + parts, + ...util_exports.normalizeParams(params) + }); + } + function lazy(getter) { + return new ZodLazy({ + type: "lazy", + getter + }); + } + function promise(innerType) { + return new ZodPromise({ + type: "promise", + innerType + }); + } + function check(fn) { + const ch = new $ZodCheck({ + check: "custom" + // ...util.normalizeParams(params), + }); + ch._zod.check = fn; + return ch; + } + function custom(fn, _params) { + return _custom(ZodCustom, fn ?? (() => true), _params); + } + function refine(fn, _params = {}) { + return _refine(ZodCustom, fn, _params); + } + function superRefine(fn) { + const ch = check((payload) => { + payload.addIssue = (issue2) => { + if (typeof issue2 === "string") { + payload.issues.push(util_exports.issue(issue2, payload.value, ch._zod.def)); + } else { + const _issue = issue2; + if (_issue.fatal) + _issue.continue = false; + _issue.code ?? (_issue.code = "custom"); + _issue.input ?? (_issue.input = payload.value); + _issue.inst ?? (_issue.inst = ch); + _issue.continue ?? (_issue.continue = !ch._zod.def.abort); + payload.issues.push(util_exports.issue(_issue)); + } + }; + return fn(payload.value, payload); + }); + return ch; + } + function _instanceof(cls, params = { + error: `Input not instance of ${cls.name}` + }) { + const inst = new ZodCustom({ + type: "custom", + check: "custom", + fn: (data) => data instanceof cls, + abort: true, + ...util_exports.normalizeParams(params) + }); + inst._zod.bag.Class = cls; + return inst; + } + function json(params) { + const jsonSchema = lazy(() => { + return union([string2(params), number2(), boolean2(), _null3(), array(jsonSchema), record(string2(), jsonSchema)]); + }); + return jsonSchema; + } + function preprocess(fn, schema) { + return pipe(transform(fn), schema); + } + var ZodType, _ZodString, ZodString, ZodStringFormat, ZodEmail, ZodGUID, ZodUUID, ZodURL, ZodEmoji, ZodNanoID, ZodCUID, ZodCUID2, ZodULID, ZodXID, ZodKSUID, ZodIPv4, ZodIPv6, ZodCIDRv4, ZodCIDRv6, ZodBase64, ZodBase64URL, ZodE164, ZodJWT, ZodCustomStringFormat, ZodNumber, ZodNumberFormat, ZodBoolean, ZodBigInt, ZodBigIntFormat, ZodSymbol, ZodUndefined, ZodNull, ZodAny, ZodUnknown, ZodNever, ZodVoid, ZodDate, ZodArray, ZodObject, ZodUnion, ZodDiscriminatedUnion, ZodIntersection, ZodTuple, ZodRecord, ZodMap, ZodSet, ZodEnum, ZodLiteral, ZodFile, ZodTransform, ZodOptional, ZodNullable, ZodDefault, ZodPrefault, ZodNonOptional, ZodSuccess, ZodCatch, ZodNaN, ZodPipe, ZodReadonly, ZodTemplateLiteral, ZodLazy, ZodPromise, ZodCustom, stringbool; + var init_schemas2 = __esm({ + "node_modules/zod/v4/classic/schemas.js"() { + init_core2(); + init_core2(); + init_checks2(); + init_iso(); + init_parse2(); + ZodType = /* @__PURE__ */ $constructor("ZodType", (inst, def) => { + $ZodType.init(inst, def); + inst.def = def; + Object.defineProperty(inst, "_def", { value: def }); + inst.check = (...checks) => { + return inst.clone( + { + ...def, + checks: [ + ...def.checks ?? [], + ...checks.map((ch) => typeof ch === "function" ? { _zod: { check: ch, def: { check: "custom" }, onattach: [] } } : ch) + ] + } + // { parent: true } + ); + }; + inst.clone = (def2, params) => clone(inst, def2, params); + inst.brand = () => inst; + inst.register = (reg, meta) => { + reg.add(inst, meta); + return inst; + }; + inst.parse = (data, params) => parse2(inst, data, params, { callee: inst.parse }); + inst.safeParse = (data, params) => safeParse3(inst, data, params); + inst.parseAsync = async (data, params) => parseAsync2(inst, data, params, { callee: inst.parseAsync }); + inst.safeParseAsync = async (data, params) => safeParseAsync2(inst, data, params); + inst.spa = inst.safeParseAsync; + inst.refine = (check2, params) => inst.check(refine(check2, params)); + inst.superRefine = (refinement) => inst.check(superRefine(refinement)); + inst.overwrite = (fn) => inst.check(_overwrite(fn)); + inst.optional = () => optional(inst); + inst.nullable = () => nullable(inst); + inst.nullish = () => optional(nullable(inst)); + inst.nonoptional = (params) => nonoptional(inst, params); + inst.array = () => array(inst); + inst.or = (arg) => union([inst, arg]); + inst.and = (arg) => intersection(inst, arg); + inst.transform = (tx) => pipe(inst, transform(tx)); + inst.default = (def2) => _default2(inst, def2); + inst.prefault = (def2) => prefault(inst, def2); + inst.catch = (params) => _catch2(inst, params); + inst.pipe = (target) => pipe(inst, target); + inst.readonly = () => readonly(inst); + inst.describe = (description) => { + const cl = inst.clone(); + globalRegistry.add(cl, { description }); + return cl; + }; + Object.defineProperty(inst, "description", { + get() { + return globalRegistry.get(inst)?.description; + }, + configurable: true + }); + inst.meta = (...args) => { + if (args.length === 0) { + return globalRegistry.get(inst); + } + const cl = inst.clone(); + globalRegistry.add(cl, args[0]); + return cl; + }; + inst.isOptional = () => inst.safeParse(void 0).success; + inst.isNullable = () => inst.safeParse(null).success; + return inst; + }); + _ZodString = /* @__PURE__ */ $constructor("_ZodString", (inst, def) => { + $ZodString.init(inst, def); + ZodType.init(inst, def); + const bag = inst._zod.bag; + inst.format = bag.format ?? null; + inst.minLength = bag.minimum ?? null; + inst.maxLength = bag.maximum ?? null; + inst.regex = (...args) => inst.check(_regex(...args)); + inst.includes = (...args) => inst.check(_includes(...args)); + inst.startsWith = (...args) => inst.check(_startsWith(...args)); + inst.endsWith = (...args) => inst.check(_endsWith(...args)); + inst.min = (...args) => inst.check(_minLength(...args)); + inst.max = (...args) => inst.check(_maxLength(...args)); + inst.length = (...args) => inst.check(_length(...args)); + inst.nonempty = (...args) => inst.check(_minLength(1, ...args)); + inst.lowercase = (params) => inst.check(_lowercase(params)); + inst.uppercase = (params) => inst.check(_uppercase(params)); + inst.trim = () => inst.check(_trim()); + inst.normalize = (...args) => inst.check(_normalize(...args)); + inst.toLowerCase = () => inst.check(_toLowerCase()); + inst.toUpperCase = () => inst.check(_toUpperCase()); + }); + ZodString = /* @__PURE__ */ $constructor("ZodString", (inst, def) => { + $ZodString.init(inst, def); + _ZodString.init(inst, def); + inst.email = (params) => inst.check(_email(ZodEmail, params)); + inst.url = (params) => inst.check(_url(ZodURL, params)); + inst.jwt = (params) => inst.check(_jwt(ZodJWT, params)); + inst.emoji = (params) => inst.check(_emoji2(ZodEmoji, params)); + inst.guid = (params) => inst.check(_guid(ZodGUID, params)); + inst.uuid = (params) => inst.check(_uuid(ZodUUID, params)); + inst.uuidv4 = (params) => inst.check(_uuidv4(ZodUUID, params)); + inst.uuidv6 = (params) => inst.check(_uuidv6(ZodUUID, params)); + inst.uuidv7 = (params) => inst.check(_uuidv7(ZodUUID, params)); + inst.nanoid = (params) => inst.check(_nanoid(ZodNanoID, params)); + inst.guid = (params) => inst.check(_guid(ZodGUID, params)); + inst.cuid = (params) => inst.check(_cuid(ZodCUID, params)); + inst.cuid2 = (params) => inst.check(_cuid2(ZodCUID2, params)); + inst.ulid = (params) => inst.check(_ulid(ZodULID, params)); + inst.base64 = (params) => inst.check(_base64(ZodBase64, params)); + inst.base64url = (params) => inst.check(_base64url(ZodBase64URL, params)); + inst.xid = (params) => inst.check(_xid(ZodXID, params)); + inst.ksuid = (params) => inst.check(_ksuid(ZodKSUID, params)); + inst.ipv4 = (params) => inst.check(_ipv4(ZodIPv4, params)); + inst.ipv6 = (params) => inst.check(_ipv6(ZodIPv6, params)); + inst.cidrv4 = (params) => inst.check(_cidrv4(ZodCIDRv4, params)); + inst.cidrv6 = (params) => inst.check(_cidrv6(ZodCIDRv6, params)); + inst.e164 = (params) => inst.check(_e164(ZodE164, params)); + inst.datetime = (params) => inst.check(datetime2(params)); + inst.date = (params) => inst.check(date2(params)); + inst.time = (params) => inst.check(time2(params)); + inst.duration = (params) => inst.check(duration2(params)); + }); + ZodStringFormat = /* @__PURE__ */ $constructor("ZodStringFormat", (inst, def) => { + $ZodStringFormat.init(inst, def); + _ZodString.init(inst, def); + }); + ZodEmail = /* @__PURE__ */ $constructor("ZodEmail", (inst, def) => { + $ZodEmail.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodGUID = /* @__PURE__ */ $constructor("ZodGUID", (inst, def) => { + $ZodGUID.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodUUID = /* @__PURE__ */ $constructor("ZodUUID", (inst, def) => { + $ZodUUID.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodURL = /* @__PURE__ */ $constructor("ZodURL", (inst, def) => { + $ZodURL.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodEmoji = /* @__PURE__ */ $constructor("ZodEmoji", (inst, def) => { + $ZodEmoji.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodNanoID = /* @__PURE__ */ $constructor("ZodNanoID", (inst, def) => { + $ZodNanoID.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodCUID = /* @__PURE__ */ $constructor("ZodCUID", (inst, def) => { + $ZodCUID.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodCUID2 = /* @__PURE__ */ $constructor("ZodCUID2", (inst, def) => { + $ZodCUID2.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodULID = /* @__PURE__ */ $constructor("ZodULID", (inst, def) => { + $ZodULID.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodXID = /* @__PURE__ */ $constructor("ZodXID", (inst, def) => { + $ZodXID.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodKSUID = /* @__PURE__ */ $constructor("ZodKSUID", (inst, def) => { + $ZodKSUID.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodIPv4 = /* @__PURE__ */ $constructor("ZodIPv4", (inst, def) => { + $ZodIPv4.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodIPv6 = /* @__PURE__ */ $constructor("ZodIPv6", (inst, def) => { + $ZodIPv6.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodCIDRv4 = /* @__PURE__ */ $constructor("ZodCIDRv4", (inst, def) => { + $ZodCIDRv4.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodCIDRv6 = /* @__PURE__ */ $constructor("ZodCIDRv6", (inst, def) => { + $ZodCIDRv6.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodBase64 = /* @__PURE__ */ $constructor("ZodBase64", (inst, def) => { + $ZodBase64.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodBase64URL = /* @__PURE__ */ $constructor("ZodBase64URL", (inst, def) => { + $ZodBase64URL.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodE164 = /* @__PURE__ */ $constructor("ZodE164", (inst, def) => { + $ZodE164.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodJWT = /* @__PURE__ */ $constructor("ZodJWT", (inst, def) => { + $ZodJWT.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodCustomStringFormat = /* @__PURE__ */ $constructor("ZodCustomStringFormat", (inst, def) => { + $ZodCustomStringFormat.init(inst, def); + ZodStringFormat.init(inst, def); + }); + ZodNumber = /* @__PURE__ */ $constructor("ZodNumber", (inst, def) => { + $ZodNumber.init(inst, def); + ZodType.init(inst, def); + inst.gt = (value, params) => inst.check(_gt(value, params)); + inst.gte = (value, params) => inst.check(_gte(value, params)); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.lt = (value, params) => inst.check(_lt(value, params)); + inst.lte = (value, params) => inst.check(_lte(value, params)); + inst.max = (value, params) => inst.check(_lte(value, params)); + inst.int = (params) => inst.check(int(params)); + inst.safe = (params) => inst.check(int(params)); + inst.positive = (params) => inst.check(_gt(0, params)); + inst.nonnegative = (params) => inst.check(_gte(0, params)); + inst.negative = (params) => inst.check(_lt(0, params)); + inst.nonpositive = (params) => inst.check(_lte(0, params)); + inst.multipleOf = (value, params) => inst.check(_multipleOf(value, params)); + inst.step = (value, params) => inst.check(_multipleOf(value, params)); + inst.finite = () => inst; + const bag = inst._zod.bag; + inst.minValue = Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null; + inst.maxValue = Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null; + inst.isInt = (bag.format ?? "").includes("int") || Number.isSafeInteger(bag.multipleOf ?? 0.5); + inst.isFinite = true; + inst.format = bag.format ?? null; + }); + ZodNumberFormat = /* @__PURE__ */ $constructor("ZodNumberFormat", (inst, def) => { + $ZodNumberFormat.init(inst, def); + ZodNumber.init(inst, def); + }); + ZodBoolean = /* @__PURE__ */ $constructor("ZodBoolean", (inst, def) => { + $ZodBoolean.init(inst, def); + ZodType.init(inst, def); + }); + ZodBigInt = /* @__PURE__ */ $constructor("ZodBigInt", (inst, def) => { + $ZodBigInt.init(inst, def); + ZodType.init(inst, def); + inst.gte = (value, params) => inst.check(_gte(value, params)); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.gt = (value, params) => inst.check(_gt(value, params)); + inst.gte = (value, params) => inst.check(_gte(value, params)); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.lt = (value, params) => inst.check(_lt(value, params)); + inst.lte = (value, params) => inst.check(_lte(value, params)); + inst.max = (value, params) => inst.check(_lte(value, params)); + inst.positive = (params) => inst.check(_gt(BigInt(0), params)); + inst.negative = (params) => inst.check(_lt(BigInt(0), params)); + inst.nonpositive = (params) => inst.check(_lte(BigInt(0), params)); + inst.nonnegative = (params) => inst.check(_gte(BigInt(0), params)); + inst.multipleOf = (value, params) => inst.check(_multipleOf(value, params)); + const bag = inst._zod.bag; + inst.minValue = bag.minimum ?? null; + inst.maxValue = bag.maximum ?? null; + inst.format = bag.format ?? null; + }); + ZodBigIntFormat = /* @__PURE__ */ $constructor("ZodBigIntFormat", (inst, def) => { + $ZodBigIntFormat.init(inst, def); + ZodBigInt.init(inst, def); + }); + ZodSymbol = /* @__PURE__ */ $constructor("ZodSymbol", (inst, def) => { + $ZodSymbol.init(inst, def); + ZodType.init(inst, def); + }); + ZodUndefined = /* @__PURE__ */ $constructor("ZodUndefined", (inst, def) => { + $ZodUndefined.init(inst, def); + ZodType.init(inst, def); + }); + ZodNull = /* @__PURE__ */ $constructor("ZodNull", (inst, def) => { + $ZodNull.init(inst, def); + ZodType.init(inst, def); + }); + ZodAny = /* @__PURE__ */ $constructor("ZodAny", (inst, def) => { + $ZodAny.init(inst, def); + ZodType.init(inst, def); + }); + ZodUnknown = /* @__PURE__ */ $constructor("ZodUnknown", (inst, def) => { + $ZodUnknown.init(inst, def); + ZodType.init(inst, def); + }); + ZodNever = /* @__PURE__ */ $constructor("ZodNever", (inst, def) => { + $ZodNever.init(inst, def); + ZodType.init(inst, def); + }); + ZodVoid = /* @__PURE__ */ $constructor("ZodVoid", (inst, def) => { + $ZodVoid.init(inst, def); + ZodType.init(inst, def); + }); + ZodDate = /* @__PURE__ */ $constructor("ZodDate", (inst, def) => { + $ZodDate.init(inst, def); + ZodType.init(inst, def); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.max = (value, params) => inst.check(_lte(value, params)); + const c = inst._zod.bag; + inst.minDate = c.minimum ? new Date(c.minimum) : null; + inst.maxDate = c.maximum ? new Date(c.maximum) : null; + }); + ZodArray = /* @__PURE__ */ $constructor("ZodArray", (inst, def) => { + $ZodArray.init(inst, def); + ZodType.init(inst, def); + inst.element = def.element; + inst.min = (minLength, params) => inst.check(_minLength(minLength, params)); + inst.nonempty = (params) => inst.check(_minLength(1, params)); + inst.max = (maxLength, params) => inst.check(_maxLength(maxLength, params)); + inst.length = (len, params) => inst.check(_length(len, params)); + inst.unwrap = () => inst.element; + }); + ZodObject = /* @__PURE__ */ $constructor("ZodObject", (inst, def) => { + $ZodObject.init(inst, def); + ZodType.init(inst, def); + util_exports.defineLazy(inst, "shape", () => def.shape); + inst.keyof = () => _enum2(Object.keys(inst._zod.def.shape)); + inst.catchall = (catchall) => inst.clone({ ...inst._zod.def, catchall }); + inst.passthrough = () => inst.clone({ ...inst._zod.def, catchall: unknown() }); + inst.loose = () => inst.clone({ ...inst._zod.def, catchall: unknown() }); + inst.strict = () => inst.clone({ ...inst._zod.def, catchall: never() }); + inst.strip = () => inst.clone({ ...inst._zod.def, catchall: void 0 }); + inst.extend = (incoming) => { + return util_exports.extend(inst, incoming); + }; + inst.merge = (other) => util_exports.merge(inst, other); + inst.pick = (mask) => util_exports.pick(inst, mask); + inst.omit = (mask) => util_exports.omit(inst, mask); + inst.partial = (...args) => util_exports.partial(ZodOptional, inst, args[0]); + inst.required = (...args) => util_exports.required(ZodNonOptional, inst, args[0]); + }); + ZodUnion = /* @__PURE__ */ $constructor("ZodUnion", (inst, def) => { + $ZodUnion.init(inst, def); + ZodType.init(inst, def); + inst.options = def.options; + }); + ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("ZodDiscriminatedUnion", (inst, def) => { + ZodUnion.init(inst, def); + $ZodDiscriminatedUnion.init(inst, def); + }); + ZodIntersection = /* @__PURE__ */ $constructor("ZodIntersection", (inst, def) => { + $ZodIntersection.init(inst, def); + ZodType.init(inst, def); + }); + ZodTuple = /* @__PURE__ */ $constructor("ZodTuple", (inst, def) => { + $ZodTuple.init(inst, def); + ZodType.init(inst, def); + inst.rest = (rest) => inst.clone({ + ...inst._zod.def, + rest + }); + }); + ZodRecord = /* @__PURE__ */ $constructor("ZodRecord", (inst, def) => { + $ZodRecord.init(inst, def); + ZodType.init(inst, def); + inst.keyType = def.keyType; + inst.valueType = def.valueType; + }); + ZodMap = /* @__PURE__ */ $constructor("ZodMap", (inst, def) => { + $ZodMap.init(inst, def); + ZodType.init(inst, def); + inst.keyType = def.keyType; + inst.valueType = def.valueType; + }); + ZodSet = /* @__PURE__ */ $constructor("ZodSet", (inst, def) => { + $ZodSet.init(inst, def); + ZodType.init(inst, def); + inst.min = (...args) => inst.check(_minSize(...args)); + inst.nonempty = (params) => inst.check(_minSize(1, params)); + inst.max = (...args) => inst.check(_maxSize(...args)); + inst.size = (...args) => inst.check(_size(...args)); + }); + ZodEnum = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => { + $ZodEnum.init(inst, def); + ZodType.init(inst, def); + inst.enum = def.entries; + inst.options = Object.values(def.entries); + const keys = new Set(Object.keys(def.entries)); + inst.extract = (values, params) => { + const newEntries = {}; + for (const value of values) { + if (keys.has(value)) { + newEntries[value] = def.entries[value]; + } else + throw new Error(`Key ${value} not found in enum`); + } + return new ZodEnum({ + ...def, + checks: [], + ...util_exports.normalizeParams(params), + entries: newEntries + }); + }; + inst.exclude = (values, params) => { + const newEntries = { ...def.entries }; + for (const value of values) { + if (keys.has(value)) { + delete newEntries[value]; + } else + throw new Error(`Key ${value} not found in enum`); + } + return new ZodEnum({ + ...def, + checks: [], + ...util_exports.normalizeParams(params), + entries: newEntries + }); + }; + }); + ZodLiteral = /* @__PURE__ */ $constructor("ZodLiteral", (inst, def) => { + $ZodLiteral.init(inst, def); + ZodType.init(inst, def); + inst.values = new Set(def.values); + Object.defineProperty(inst, "value", { + get() { + if (def.values.length > 1) { + throw new Error("This schema contains multiple valid literal values. Use `.values` instead."); + } + return def.values[0]; + } + }); + }); + ZodFile = /* @__PURE__ */ $constructor("ZodFile", (inst, def) => { + $ZodFile.init(inst, def); + ZodType.init(inst, def); + inst.min = (size, params) => inst.check(_minSize(size, params)); + inst.max = (size, params) => inst.check(_maxSize(size, params)); + inst.mime = (types, params) => inst.check(_mime(Array.isArray(types) ? types : [types], params)); + }); + ZodTransform = /* @__PURE__ */ $constructor("ZodTransform", (inst, def) => { + $ZodTransform.init(inst, def); + ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + payload.addIssue = (issue2) => { + if (typeof issue2 === "string") { + payload.issues.push(util_exports.issue(issue2, payload.value, def)); + } else { + const _issue = issue2; + if (_issue.fatal) + _issue.continue = false; + _issue.code ?? (_issue.code = "custom"); + _issue.input ?? (_issue.input = payload.value); + _issue.inst ?? (_issue.inst = inst); + _issue.continue ?? (_issue.continue = true); + payload.issues.push(util_exports.issue(_issue)); + } + }; + const output = def.transform(payload.value, payload); + if (output instanceof Promise) { + return output.then((output2) => { + payload.value = output2; + return payload; + }); + } + payload.value = output; + return payload; + }; + }); + ZodOptional = /* @__PURE__ */ $constructor("ZodOptional", (inst, def) => { + $ZodOptional.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + }); + ZodNullable = /* @__PURE__ */ $constructor("ZodNullable", (inst, def) => { + $ZodNullable.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + }); + ZodDefault = /* @__PURE__ */ $constructor("ZodDefault", (inst, def) => { + $ZodDefault.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + inst.removeDefault = inst.unwrap; + }); + ZodPrefault = /* @__PURE__ */ $constructor("ZodPrefault", (inst, def) => { + $ZodPrefault.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + }); + ZodNonOptional = /* @__PURE__ */ $constructor("ZodNonOptional", (inst, def) => { + $ZodNonOptional.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + }); + ZodSuccess = /* @__PURE__ */ $constructor("ZodSuccess", (inst, def) => { + $ZodSuccess.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + }); + ZodCatch = /* @__PURE__ */ $constructor("ZodCatch", (inst, def) => { + $ZodCatch.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + inst.removeCatch = inst.unwrap; + }); + ZodNaN = /* @__PURE__ */ $constructor("ZodNaN", (inst, def) => { + $ZodNaN.init(inst, def); + ZodType.init(inst, def); + }); + ZodPipe = /* @__PURE__ */ $constructor("ZodPipe", (inst, def) => { + $ZodPipe.init(inst, def); + ZodType.init(inst, def); + inst.in = def.in; + inst.out = def.out; + }); + ZodReadonly = /* @__PURE__ */ $constructor("ZodReadonly", (inst, def) => { + $ZodReadonly.init(inst, def); + ZodType.init(inst, def); + }); + ZodTemplateLiteral = /* @__PURE__ */ $constructor("ZodTemplateLiteral", (inst, def) => { + $ZodTemplateLiteral.init(inst, def); + ZodType.init(inst, def); + }); + ZodLazy = /* @__PURE__ */ $constructor("ZodLazy", (inst, def) => { + $ZodLazy.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.getter(); + }); + ZodPromise = /* @__PURE__ */ $constructor("ZodPromise", (inst, def) => { + $ZodPromise.init(inst, def); + ZodType.init(inst, def); + inst.unwrap = () => inst._zod.def.innerType; + }); + ZodCustom = /* @__PURE__ */ $constructor("ZodCustom", (inst, def) => { + $ZodCustom.init(inst, def); + ZodType.init(inst, def); + }); + stringbool = (...args) => _stringbool({ + Pipe: ZodPipe, + Boolean: ZodBoolean, + String: ZodString, + Transform: ZodTransform + }, ...args); + } + }); + + // node_modules/zod/v4/classic/compat.js + function setErrorMap(map2) { + config({ + customError: map2 + }); + } + function getErrorMap() { + return config().customError; + } + var ZodIssueCode; + var init_compat = __esm({ + "node_modules/zod/v4/classic/compat.js"() { + init_core2(); + ZodIssueCode = { + invalid_type: "invalid_type", + too_big: "too_big", + too_small: "too_small", + invalid_format: "invalid_format", + not_multiple_of: "not_multiple_of", + unrecognized_keys: "unrecognized_keys", + invalid_union: "invalid_union", + invalid_key: "invalid_key", + invalid_element: "invalid_element", + invalid_value: "invalid_value", + custom: "custom" + }; + } + }); + + // node_modules/zod/v4/classic/coerce.js + var coerce_exports = {}; + __export(coerce_exports, { + bigint: () => bigint3, + boolean: () => boolean3, + date: () => date4, + number: () => number3, + string: () => string3 + }); + function string3(params) { + return _coercedString(ZodString, params); + } + function number3(params) { + return _coercedNumber(ZodNumber, params); + } + function boolean3(params) { + return _coercedBoolean(ZodBoolean, params); + } + function bigint3(params) { + return _coercedBigint(ZodBigInt, params); + } + function date4(params) { + return _coercedDate(ZodDate, params); + } + var init_coerce = __esm({ + "node_modules/zod/v4/classic/coerce.js"() { + init_core2(); + init_schemas2(); + } + }); + + // node_modules/zod/v4/classic/external.js + var external_exports = {}; + __export(external_exports, { + $brand: () => $brand, + $input: () => $input, + $output: () => $output, + NEVER: () => NEVER, + TimePrecision: () => TimePrecision, + ZodAny: () => ZodAny, + ZodArray: () => ZodArray, + ZodBase64: () => ZodBase64, + ZodBase64URL: () => ZodBase64URL, + ZodBigInt: () => ZodBigInt, + ZodBigIntFormat: () => ZodBigIntFormat, + ZodBoolean: () => ZodBoolean, + ZodCIDRv4: () => ZodCIDRv4, + ZodCIDRv6: () => ZodCIDRv6, + ZodCUID: () => ZodCUID, + ZodCUID2: () => ZodCUID2, + ZodCatch: () => ZodCatch, + ZodCustom: () => ZodCustom, + ZodCustomStringFormat: () => ZodCustomStringFormat, + ZodDate: () => ZodDate, + ZodDefault: () => ZodDefault, + ZodDiscriminatedUnion: () => ZodDiscriminatedUnion, + ZodE164: () => ZodE164, + ZodEmail: () => ZodEmail, + ZodEmoji: () => ZodEmoji, + ZodEnum: () => ZodEnum, + ZodError: () => ZodError, + ZodFile: () => ZodFile, + ZodGUID: () => ZodGUID, + ZodIPv4: () => ZodIPv4, + ZodIPv6: () => ZodIPv6, + ZodISODate: () => ZodISODate, + ZodISODateTime: () => ZodISODateTime, + ZodISODuration: () => ZodISODuration, + ZodISOTime: () => ZodISOTime, + ZodIntersection: () => ZodIntersection, + ZodIssueCode: () => ZodIssueCode, + ZodJWT: () => ZodJWT, + ZodKSUID: () => ZodKSUID, + ZodLazy: () => ZodLazy, + ZodLiteral: () => ZodLiteral, + ZodMap: () => ZodMap, + ZodNaN: () => ZodNaN, + ZodNanoID: () => ZodNanoID, + ZodNever: () => ZodNever, + ZodNonOptional: () => ZodNonOptional, + ZodNull: () => ZodNull, + ZodNullable: () => ZodNullable, + ZodNumber: () => ZodNumber, + ZodNumberFormat: () => ZodNumberFormat, + ZodObject: () => ZodObject, + ZodOptional: () => ZodOptional, + ZodPipe: () => ZodPipe, + ZodPrefault: () => ZodPrefault, + ZodPromise: () => ZodPromise, + ZodReadonly: () => ZodReadonly, + ZodRealError: () => ZodRealError, + ZodRecord: () => ZodRecord, + ZodSet: () => ZodSet, + ZodString: () => ZodString, + ZodStringFormat: () => ZodStringFormat, + ZodSuccess: () => ZodSuccess, + ZodSymbol: () => ZodSymbol, + ZodTemplateLiteral: () => ZodTemplateLiteral, + ZodTransform: () => ZodTransform, + ZodTuple: () => ZodTuple, + ZodType: () => ZodType, + ZodULID: () => ZodULID, + ZodURL: () => ZodURL, + ZodUUID: () => ZodUUID, + ZodUndefined: () => ZodUndefined, + ZodUnion: () => ZodUnion, + ZodUnknown: () => ZodUnknown, + ZodVoid: () => ZodVoid, + ZodXID: () => ZodXID, + _ZodString: () => _ZodString, + _default: () => _default2, + any: () => any, + array: () => array, + base64: () => base642, + base64url: () => base64url2, + bigint: () => bigint2, + boolean: () => boolean2, + catch: () => _catch2, + check: () => check, + cidrv4: () => cidrv42, + cidrv6: () => cidrv62, + clone: () => clone, + coerce: () => coerce_exports, + config: () => config, + core: () => core_exports2, + cuid: () => cuid3, + cuid2: () => cuid22, + custom: () => custom, + date: () => date3, + discriminatedUnion: () => discriminatedUnion, + e164: () => e1642, + email: () => email2, + emoji: () => emoji2, + endsWith: () => _endsWith, + enum: () => _enum2, + file: () => file, + flattenError: () => flattenError, + float32: () => float32, + float64: () => float64, + formatError: () => formatError, + function: () => _function, + getErrorMap: () => getErrorMap, + globalRegistry: () => globalRegistry, + gt: () => _gt, + gte: () => _gte, + guid: () => guid2, + includes: () => _includes, + instanceof: () => _instanceof, + int: () => int, + int32: () => int32, + int64: () => int64, + intersection: () => intersection, + ipv4: () => ipv42, + ipv6: () => ipv62, + iso: () => iso_exports, + json: () => json, + jwt: () => jwt, + keyof: () => keyof, + ksuid: () => ksuid2, + lazy: () => lazy, + length: () => _length, + literal: () => literal, + locales: () => locales_exports, + looseObject: () => looseObject, + lowercase: () => _lowercase, + lt: () => _lt, + lte: () => _lte, + map: () => map, + maxLength: () => _maxLength, + maxSize: () => _maxSize, + mime: () => _mime, + minLength: () => _minLength, + minSize: () => _minSize, + multipleOf: () => _multipleOf, + nan: () => nan, + nanoid: () => nanoid2, + nativeEnum: () => nativeEnum, + negative: () => _negative, + never: () => never, + nonnegative: () => _nonnegative, + nonoptional: () => nonoptional, + nonpositive: () => _nonpositive, + normalize: () => _normalize, + null: () => _null3, + nullable: () => nullable, + nullish: () => nullish2, + number: () => number2, + object: () => object2, + optional: () => optional, + overwrite: () => _overwrite, + parse: () => parse2, + parseAsync: () => parseAsync2, + partialRecord: () => partialRecord, + pipe: () => pipe, + positive: () => _positive, + prefault: () => prefault, + preprocess: () => preprocess, + prettifyError: () => prettifyError, + promise: () => promise, + property: () => _property, + readonly: () => readonly, + record: () => record, + refine: () => refine, + regex: () => _regex, + regexes: () => regexes_exports, + registry: () => registry, + safeParse: () => safeParse3, + safeParseAsync: () => safeParseAsync2, + set: () => set, + setErrorMap: () => setErrorMap, + size: () => _size, + startsWith: () => _startsWith, + strictObject: () => strictObject, + string: () => string2, + stringFormat: () => stringFormat, + stringbool: () => stringbool, + success: () => success, + superRefine: () => superRefine, + symbol: () => symbol, + templateLiteral: () => templateLiteral, + toJSONSchema: () => toJSONSchema, + toLowerCase: () => _toLowerCase, + toUpperCase: () => _toUpperCase, + transform: () => transform, + treeifyError: () => treeifyError, + trim: () => _trim, + tuple: () => tuple, + uint32: () => uint32, + uint64: () => uint64, + ulid: () => ulid2, + undefined: () => _undefined3, + union: () => union, + unknown: () => unknown, + uppercase: () => _uppercase, + url: () => url, + uuid: () => uuid2, + uuidv4: () => uuidv4, + uuidv6: () => uuidv6, + uuidv7: () => uuidv7, + void: () => _void2, + xid: () => xid2 + }); + var init_external = __esm({ + "node_modules/zod/v4/classic/external.js"() { + init_core2(); + init_schemas2(); + init_checks2(); + init_errors2(); + init_parse2(); + init_compat(); + init_core2(); + init_en(); + init_core2(); + init_locales(); + init_iso(); + init_iso(); + init_coerce(); + config(en_default()); + } + }); + + // node_modules/zod/v4/classic/index.js + var classic_default; + var init_classic = __esm({ + "node_modules/zod/v4/classic/index.js"() { + init_external(); + init_external(); + classic_default = external_exports; + } + }); + + // node_modules/zod/v4/index.js + var v4_exports = {}; + __export(v4_exports, { + $brand: () => $brand, + $input: () => $input, + $output: () => $output, + NEVER: () => NEVER, + TimePrecision: () => TimePrecision, + ZodAny: () => ZodAny, + ZodArray: () => ZodArray, + ZodBase64: () => ZodBase64, + ZodBase64URL: () => ZodBase64URL, + ZodBigInt: () => ZodBigInt, + ZodBigIntFormat: () => ZodBigIntFormat, + ZodBoolean: () => ZodBoolean, + ZodCIDRv4: () => ZodCIDRv4, + ZodCIDRv6: () => ZodCIDRv6, + ZodCUID: () => ZodCUID, + ZodCUID2: () => ZodCUID2, + ZodCatch: () => ZodCatch, + ZodCustom: () => ZodCustom, + ZodCustomStringFormat: () => ZodCustomStringFormat, + ZodDate: () => ZodDate, + ZodDefault: () => ZodDefault, + ZodDiscriminatedUnion: () => ZodDiscriminatedUnion, + ZodE164: () => ZodE164, + ZodEmail: () => ZodEmail, + ZodEmoji: () => ZodEmoji, + ZodEnum: () => ZodEnum, + ZodError: () => ZodError, + ZodFile: () => ZodFile, + ZodGUID: () => ZodGUID, + ZodIPv4: () => ZodIPv4, + ZodIPv6: () => ZodIPv6, + ZodISODate: () => ZodISODate, + ZodISODateTime: () => ZodISODateTime, + ZodISODuration: () => ZodISODuration, + ZodISOTime: () => ZodISOTime, + ZodIntersection: () => ZodIntersection, + ZodIssueCode: () => ZodIssueCode, + ZodJWT: () => ZodJWT, + ZodKSUID: () => ZodKSUID, + ZodLazy: () => ZodLazy, + ZodLiteral: () => ZodLiteral, + ZodMap: () => ZodMap, + ZodNaN: () => ZodNaN, + ZodNanoID: () => ZodNanoID, + ZodNever: () => ZodNever, + ZodNonOptional: () => ZodNonOptional, + ZodNull: () => ZodNull, + ZodNullable: () => ZodNullable, + ZodNumber: () => ZodNumber, + ZodNumberFormat: () => ZodNumberFormat, + ZodObject: () => ZodObject, + ZodOptional: () => ZodOptional, + ZodPipe: () => ZodPipe, + ZodPrefault: () => ZodPrefault, + ZodPromise: () => ZodPromise, + ZodReadonly: () => ZodReadonly, + ZodRealError: () => ZodRealError, + ZodRecord: () => ZodRecord, + ZodSet: () => ZodSet, + ZodString: () => ZodString, + ZodStringFormat: () => ZodStringFormat, + ZodSuccess: () => ZodSuccess, + ZodSymbol: () => ZodSymbol, + ZodTemplateLiteral: () => ZodTemplateLiteral, + ZodTransform: () => ZodTransform, + ZodTuple: () => ZodTuple, + ZodType: () => ZodType, + ZodULID: () => ZodULID, + ZodURL: () => ZodURL, + ZodUUID: () => ZodUUID, + ZodUndefined: () => ZodUndefined, + ZodUnion: () => ZodUnion, + ZodUnknown: () => ZodUnknown, + ZodVoid: () => ZodVoid, + ZodXID: () => ZodXID, + _ZodString: () => _ZodString, + _default: () => _default2, + any: () => any, + array: () => array, + base64: () => base642, + base64url: () => base64url2, + bigint: () => bigint2, + boolean: () => boolean2, + catch: () => _catch2, + check: () => check, + cidrv4: () => cidrv42, + cidrv6: () => cidrv62, + clone: () => clone, + coerce: () => coerce_exports, + config: () => config, + core: () => core_exports2, + cuid: () => cuid3, + cuid2: () => cuid22, + custom: () => custom, + date: () => date3, + default: () => v4_default, + discriminatedUnion: () => discriminatedUnion, + e164: () => e1642, + email: () => email2, + emoji: () => emoji2, + endsWith: () => _endsWith, + enum: () => _enum2, + file: () => file, + flattenError: () => flattenError, + float32: () => float32, + float64: () => float64, + formatError: () => formatError, + function: () => _function, + getErrorMap: () => getErrorMap, + globalRegistry: () => globalRegistry, + gt: () => _gt, + gte: () => _gte, + guid: () => guid2, + includes: () => _includes, + instanceof: () => _instanceof, + int: () => int, + int32: () => int32, + int64: () => int64, + intersection: () => intersection, + ipv4: () => ipv42, + ipv6: () => ipv62, + iso: () => iso_exports, + json: () => json, + jwt: () => jwt, + keyof: () => keyof, + ksuid: () => ksuid2, + lazy: () => lazy, + length: () => _length, + literal: () => literal, + locales: () => locales_exports, + looseObject: () => looseObject, + lowercase: () => _lowercase, + lt: () => _lt, + lte: () => _lte, + map: () => map, + maxLength: () => _maxLength, + maxSize: () => _maxSize, + mime: () => _mime, + minLength: () => _minLength, + minSize: () => _minSize, + multipleOf: () => _multipleOf, + nan: () => nan, + nanoid: () => nanoid2, + nativeEnum: () => nativeEnum, + negative: () => _negative, + never: () => never, + nonnegative: () => _nonnegative, + nonoptional: () => nonoptional, + nonpositive: () => _nonpositive, + normalize: () => _normalize, + null: () => _null3, + nullable: () => nullable, + nullish: () => nullish2, + number: () => number2, + object: () => object2, + optional: () => optional, + overwrite: () => _overwrite, + parse: () => parse2, + parseAsync: () => parseAsync2, + partialRecord: () => partialRecord, + pipe: () => pipe, + positive: () => _positive, + prefault: () => prefault, + preprocess: () => preprocess, + prettifyError: () => prettifyError, + promise: () => promise, + property: () => _property, + readonly: () => readonly, + record: () => record, + refine: () => refine, + regex: () => _regex, + regexes: () => regexes_exports, + registry: () => registry, + safeParse: () => safeParse3, + safeParseAsync: () => safeParseAsync2, + set: () => set, + setErrorMap: () => setErrorMap, + size: () => _size, + startsWith: () => _startsWith, + strictObject: () => strictObject, + string: () => string2, + stringFormat: () => stringFormat, + stringbool: () => stringbool, + success: () => success, + superRefine: () => superRefine, + symbol: () => symbol, + templateLiteral: () => templateLiteral, + toJSONSchema: () => toJSONSchema, + toLowerCase: () => _toLowerCase, + toUpperCase: () => _toUpperCase, + transform: () => transform, + treeifyError: () => treeifyError, + trim: () => _trim, + tuple: () => tuple, + uint32: () => uint32, + uint64: () => uint64, + ulid: () => ulid2, + undefined: () => _undefined3, + union: () => union, + unknown: () => unknown, + uppercase: () => _uppercase, + url: () => url, + uuid: () => uuid2, + uuidv4: () => uuidv4, + uuidv6: () => uuidv6, + uuidv7: () => uuidv7, + void: () => _void2, + xid: () => xid2, + z: () => external_exports + }); + var v4_default; + var init_v4 = __esm({ + "node_modules/zod/v4/index.js"() { + init_classic(); + init_classic(); + v4_default = classic_default; + } + }); + + // node_modules/zod/v4/mini/parse.js + init_core2(); + + // node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js + function isZ4Schema(s) { + const schema = s; + return !!schema._zod; + } + function safeParse2(schema, data) { + if (isZ4Schema(schema)) { + const result2 = safeParse(schema, data); + return result2; + } + const v3Schema = schema; + const result = v3Schema.safeParse(data); + return result; + } + function getObjectShape(schema) { + if (!schema) + return void 0; + let rawShape; + if (isZ4Schema(schema)) { + const v4Schema = schema; + rawShape = v4Schema._zod?.def?.shape; + } else { + const v3Schema = schema; + rawShape = v3Schema.shape; + } + if (!rawShape) + return void 0; + if (typeof rawShape === "function") { + try { + return rawShape(); + } catch { + return void 0; + } + } + return rawShape; + } + function getLiteralValue(schema) { + if (isZ4Schema(schema)) { + const v4Schema = schema; + const def2 = v4Schema._zod?.def; + if (def2) { + if (def2.value !== void 0) + return def2.value; + if (Array.isArray(def2.values) && def2.values.length > 0) { + return def2.values[0]; + } + } + } + const v3Schema = schema; + const def = v3Schema._def; + if (def) { + if (def.value !== void 0) + return def.value; + if (Array.isArray(def.values) && def.values.length > 0) { + return def.values[0]; + } + } + const directValue = schema.value; + if (directValue !== void 0) + return directValue; + return void 0; + } + + // node_modules/@modelcontextprotocol/sdk/dist/esm/types.js + init_v4(); + var RELATED_TASK_META_KEY = "io.modelcontextprotocol/related-task"; + var JSONRPC_VERSION = "2.0"; + var AssertObjectSchema = custom((v2) => v2 !== null && (typeof v2 === "object" || typeof v2 === "function")); + var ProgressTokenSchema = union([string2(), number2().int()]); + var CursorSchema = string2(); + var TaskCreationParamsSchema = looseObject({ + /** + * Requested duration in milliseconds to retain task from creation. + */ + ttl: number2().optional(), + /** + * Time in milliseconds to wait between task status requests. + */ + pollInterval: number2().optional() + }); + var TaskMetadataSchema = object2({ + ttl: number2().optional() + }); + var RelatedTaskMetadataSchema = object2({ + taskId: string2() + }); + var RequestMetaSchema = looseObject({ + /** + * If specified, the caller is requesting out-of-band progress notifications for this request (as represented by notifications/progress). The value of this parameter is an opaque token that will be attached to any subsequent notifications. The receiver is not obligated to provide these notifications. + */ + progressToken: ProgressTokenSchema.optional(), + /** + * If specified, this request is related to the provided task. + */ + [RELATED_TASK_META_KEY]: RelatedTaskMetadataSchema.optional() + }); + var BaseRequestParamsSchema = object2({ + /** + * See [General fields: `_meta`](/specification/draft/basic/index#meta) for notes on `_meta` usage. + */ + _meta: RequestMetaSchema.optional() + }); + var TaskAugmentedRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * If specified, the caller is requesting task-augmented execution for this request. + * The request will return a CreateTaskResult immediately, and the actual result can be + * retrieved later via tasks/result. + * + * Task augmentation is subject to capability negotiation - receivers MUST declare support + * for task augmentation of specific request types in their capabilities. + */ + task: TaskMetadataSchema.optional() + }); + var isTaskAugmentedRequestParams = (value) => TaskAugmentedRequestParamsSchema.safeParse(value).success; + var RequestSchema = object2({ + method: string2(), + params: BaseRequestParamsSchema.loose().optional() + }); + var NotificationsParamsSchema = object2({ + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: RequestMetaSchema.optional() + }); + var NotificationSchema = object2({ + method: string2(), + params: NotificationsParamsSchema.loose().optional() + }); + var ResultSchema = looseObject({ + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: RequestMetaSchema.optional() + }); + var RequestIdSchema = union([string2(), number2().int()]); + var JSONRPCRequestSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema, + ...RequestSchema.shape + }).strict(); + var isJSONRPCRequest = (value) => JSONRPCRequestSchema.safeParse(value).success; + var JSONRPCNotificationSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + ...NotificationSchema.shape + }).strict(); + var isJSONRPCNotification = (value) => JSONRPCNotificationSchema.safeParse(value).success; + var JSONRPCResultResponseSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema, + result: ResultSchema + }).strict(); + var isJSONRPCResultResponse = (value) => JSONRPCResultResponseSchema.safeParse(value).success; + var ErrorCode; + (function(ErrorCode2) { + ErrorCode2[ErrorCode2["ConnectionClosed"] = -32e3] = "ConnectionClosed"; + ErrorCode2[ErrorCode2["RequestTimeout"] = -32001] = "RequestTimeout"; + ErrorCode2[ErrorCode2["ParseError"] = -32700] = "ParseError"; + ErrorCode2[ErrorCode2["InvalidRequest"] = -32600] = "InvalidRequest"; + ErrorCode2[ErrorCode2["MethodNotFound"] = -32601] = "MethodNotFound"; + ErrorCode2[ErrorCode2["InvalidParams"] = -32602] = "InvalidParams"; + ErrorCode2[ErrorCode2["InternalError"] = -32603] = "InternalError"; + ErrorCode2[ErrorCode2["UrlElicitationRequired"] = -32042] = "UrlElicitationRequired"; + })(ErrorCode || (ErrorCode = {})); + var JSONRPCErrorResponseSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema.optional(), + error: object2({ + /** + * The error type that occurred. + */ + code: number2().int(), + /** + * A short description of the error. The message SHOULD be limited to a concise single sentence. + */ + message: string2(), + /** + * Additional information about the error. The value of this member is defined by the sender (e.g. detailed error information, nested errors etc.). + */ + data: unknown().optional() + }) + }).strict(); + var isJSONRPCErrorResponse = (value) => JSONRPCErrorResponseSchema.safeParse(value).success; + var JSONRPCMessageSchema = union([ + JSONRPCRequestSchema, + JSONRPCNotificationSchema, + JSONRPCResultResponseSchema, + JSONRPCErrorResponseSchema + ]); + var JSONRPCResponseSchema = union([JSONRPCResultResponseSchema, JSONRPCErrorResponseSchema]); + var EmptyResultSchema = ResultSchema.strict(); + var CancelledNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The ID of the request to cancel. + * + * This MUST correspond to the ID of a request previously issued in the same direction. + */ + requestId: RequestIdSchema.optional(), + /** + * An optional string describing the reason for the cancellation. This MAY be logged or presented to the user. + */ + reason: string2().optional() + }); + var CancelledNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/cancelled"), + params: CancelledNotificationParamsSchema + }); + var IconSchema = object2({ + /** + * URL or data URI for the icon. + */ + src: string2(), + /** + * Optional MIME type for the icon. + */ + mimeType: string2().optional(), + /** + * Optional array of strings that specify sizes at which the icon can be used. + * Each string should be in WxH format (e.g., `"48x48"`, `"96x96"`) or `"any"` for scalable formats like SVG. + * + * If not provided, the client should assume that the icon can be used at any size. + */ + sizes: array(string2()).optional(), + /** + * Optional specifier for the theme this icon is designed for. `light` indicates + * the icon is designed to be used with a light background, and `dark` indicates + * the icon is designed to be used with a dark background. + * + * If not provided, the client should assume the icon can be used with any theme. + */ + theme: _enum2(["light", "dark"]).optional() + }); + var IconsSchema = object2({ + /** + * Optional set of sized icons that the client can display in a user interface. + * + * Clients that support rendering icons MUST support at least the following MIME types: + * - `image/png` - PNG images (safe, universal compatibility) + * - `image/jpeg` (and `image/jpg`) - JPEG images (safe, universal compatibility) + * + * Clients that support rendering icons SHOULD also support: + * - `image/svg+xml` - SVG images (scalable but requires security precautions) + * - `image/webp` - WebP images (modern, efficient format) + */ + icons: array(IconSchema).optional() + }); + var BaseMetadataSchema = object2({ + /** Intended for programmatic or logical use, but used as a display name in past specs or fallback */ + name: string2(), + /** + * Intended for UI and end-user contexts — optimized to be human-readable and easily understood, + * even by those unfamiliar with domain-specific terminology. + * + * If not provided, the name should be used for display (except for Tool, + * where `annotations.title` should be given precedence over using `name`, + * if present). + */ + title: string2().optional() + }); + var ImplementationSchema = BaseMetadataSchema.extend({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + version: string2(), + /** + * An optional URL of the website for this implementation. + */ + websiteUrl: string2().optional(), + /** + * An optional human-readable description of what this implementation does. + * + * This can be used by clients or servers to provide context about their purpose + * and capabilities. For example, a server might describe the types of resources + * or tools it provides, while a client might describe its intended use case. + */ + description: string2().optional() + }); + var FormElicitationCapabilitySchema = intersection(object2({ + applyDefaults: boolean2().optional() + }), record(string2(), unknown())); + var ElicitationCapabilitySchema = preprocess((value) => { + if (value && typeof value === "object" && !Array.isArray(value)) { + if (Object.keys(value).length === 0) { + return { form: {} }; + } + } + return value; + }, intersection(object2({ + form: FormElicitationCapabilitySchema.optional(), + url: AssertObjectSchema.optional() + }), record(string2(), unknown()).optional())); + var ClientTasksCapabilitySchema = looseObject({ + /** + * Present if the client supports listing tasks. + */ + list: AssertObjectSchema.optional(), + /** + * Present if the client supports cancelling tasks. + */ + cancel: AssertObjectSchema.optional(), + /** + * Capabilities for task creation on specific request types. + */ + requests: looseObject({ + /** + * Task support for sampling requests. + */ + sampling: looseObject({ + createMessage: AssertObjectSchema.optional() + }).optional(), + /** + * Task support for elicitation requests. + */ + elicitation: looseObject({ + create: AssertObjectSchema.optional() + }).optional() + }).optional() + }); + var ServerTasksCapabilitySchema = looseObject({ + /** + * Present if the server supports listing tasks. + */ + list: AssertObjectSchema.optional(), + /** + * Present if the server supports cancelling tasks. + */ + cancel: AssertObjectSchema.optional(), + /** + * Capabilities for task creation on specific request types. + */ + requests: looseObject({ + /** + * Task support for tool requests. + */ + tools: looseObject({ + call: AssertObjectSchema.optional() + }).optional() + }).optional() + }); + var ClientCapabilitiesSchema = object2({ + /** + * Experimental, non-standard capabilities that the client supports. + */ + experimental: record(string2(), AssertObjectSchema).optional(), + /** + * Present if the client supports sampling from an LLM. + */ + sampling: object2({ + /** + * Present if the client supports context inclusion via includeContext parameter. + * If not declared, servers SHOULD only use `includeContext: "none"` (or omit it). + */ + context: AssertObjectSchema.optional(), + /** + * Present if the client supports tool use via tools and toolChoice parameters. + */ + tools: AssertObjectSchema.optional() + }).optional(), + /** + * Present if the client supports eliciting user input. + */ + elicitation: ElicitationCapabilitySchema.optional(), + /** + * Present if the client supports listing roots. + */ + roots: object2({ + /** + * Whether the client supports issuing notifications for changes to the roots list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the client supports task creation. + */ + tasks: ClientTasksCapabilitySchema.optional(), + /** + * Extensions that the client supports. Keys are extension identifiers (vendor-prefix/extension-name). + */ + extensions: record(string2(), AssertObjectSchema).optional() + }); + var InitializeRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The latest version of the Model Context Protocol that the client supports. The client MAY decide to support older versions as well. + */ + protocolVersion: string2(), + capabilities: ClientCapabilitiesSchema, + clientInfo: ImplementationSchema + }); + var InitializeRequestSchema = RequestSchema.extend({ + method: literal("initialize"), + params: InitializeRequestParamsSchema + }); + var ServerCapabilitiesSchema = object2({ + /** + * Experimental, non-standard capabilities that the server supports. + */ + experimental: record(string2(), AssertObjectSchema).optional(), + /** + * Present if the server supports sending log messages to the client. + */ + logging: AssertObjectSchema.optional(), + /** + * Present if the server supports sending completions to the client. + */ + completions: AssertObjectSchema.optional(), + /** + * Present if the server offers any prompt templates. + */ + prompts: object2({ + /** + * Whether this server supports issuing notifications for changes to the prompt list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server offers any resources to read. + */ + resources: object2({ + /** + * Whether this server supports clients subscribing to resource updates. + */ + subscribe: boolean2().optional(), + /** + * Whether this server supports issuing notifications for changes to the resource list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server offers any tools to call. + */ + tools: object2({ + /** + * Whether this server supports issuing notifications for changes to the tool list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server supports task creation. + */ + tasks: ServerTasksCapabilitySchema.optional(), + /** + * Extensions that the server supports. Keys are extension identifiers (vendor-prefix/extension-name). + */ + extensions: record(string2(), AssertObjectSchema).optional() + }); + var InitializeResultSchema = ResultSchema.extend({ + /** + * The version of the Model Context Protocol that the server wants to use. This may not match the version that the client requested. If the client cannot support this version, it MUST disconnect. + */ + protocolVersion: string2(), + capabilities: ServerCapabilitiesSchema, + serverInfo: ImplementationSchema, + /** + * Instructions describing how to use the server and its features. + * + * This can be used by clients to improve the LLM's understanding of available tools, resources, etc. It can be thought of like a "hint" to the model. For example, this information MAY be added to the system prompt. + */ + instructions: string2().optional() + }); + var InitializedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/initialized"), + params: NotificationsParamsSchema.optional() + }); + var PingRequestSchema = RequestSchema.extend({ + method: literal("ping"), + params: BaseRequestParamsSchema.optional() + }); + var ProgressSchema = object2({ + /** + * The progress thus far. This should increase every time progress is made, even if the total is unknown. + */ + progress: number2(), + /** + * Total number of items to process (or total progress required), if known. + */ + total: optional(number2()), + /** + * An optional message describing the current progress. + */ + message: optional(string2()) + }); + var ProgressNotificationParamsSchema = object2({ + ...NotificationsParamsSchema.shape, + ...ProgressSchema.shape, + /** + * The progress token which was given in the initial request, used to associate this notification with the request that is proceeding. + */ + progressToken: ProgressTokenSchema + }); + var ProgressNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/progress"), + params: ProgressNotificationParamsSchema + }); + var PaginatedRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * An opaque token representing the current pagination position. + * If provided, the server should return results starting after this cursor. + */ + cursor: CursorSchema.optional() + }); + var PaginatedRequestSchema = RequestSchema.extend({ + params: PaginatedRequestParamsSchema.optional() + }); + var PaginatedResultSchema = ResultSchema.extend({ + /** + * An opaque token representing the pagination position after the last returned result. + * If present, there may be more results available. + */ + nextCursor: CursorSchema.optional() + }); + var TaskStatusSchema = _enum2(["working", "input_required", "completed", "failed", "cancelled"]); + var TaskSchema = object2({ + taskId: string2(), + status: TaskStatusSchema, + /** + * Time in milliseconds to keep task results available after completion. + * If null, the task has unlimited lifetime until manually cleaned up. + */ + ttl: union([number2(), _null3()]), + /** + * ISO 8601 timestamp when the task was created. + */ + createdAt: string2(), + /** + * ISO 8601 timestamp when the task was last updated. + */ + lastUpdatedAt: string2(), + pollInterval: optional(number2()), + /** + * Optional diagnostic message for failed tasks or other status information. + */ + statusMessage: optional(string2()) + }); + var CreateTaskResultSchema = ResultSchema.extend({ + task: TaskSchema + }); + var TaskStatusNotificationParamsSchema = NotificationsParamsSchema.merge(TaskSchema); + var TaskStatusNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/tasks/status"), + params: TaskStatusNotificationParamsSchema + }); + var GetTaskRequestSchema = RequestSchema.extend({ + method: literal("tasks/get"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) + }); + var GetTaskResultSchema = ResultSchema.merge(TaskSchema); + var GetTaskPayloadRequestSchema = RequestSchema.extend({ + method: literal("tasks/result"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) + }); + var GetTaskPayloadResultSchema = ResultSchema.loose(); + var ListTasksRequestSchema = PaginatedRequestSchema.extend({ + method: literal("tasks/list") + }); + var ListTasksResultSchema = PaginatedResultSchema.extend({ + tasks: array(TaskSchema) + }); + var CancelTaskRequestSchema = RequestSchema.extend({ + method: literal("tasks/cancel"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) + }); + var CancelTaskResultSchema = ResultSchema.merge(TaskSchema); + var ResourceContentsSchema = object2({ + /** + * The URI of this resource. + */ + uri: string2(), + /** + * The MIME type of this resource, if known. + */ + mimeType: optional(string2()), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var TextResourceContentsSchema = ResourceContentsSchema.extend({ + /** + * The text of the item. This must only be set if the item can actually be represented as text (not binary data). + */ + text: string2() + }); + var Base64Schema = string2().refine((val) => { + try { + atob(val); + return true; + } catch { + return false; + } + }, { message: "Invalid Base64 string" }); + var BlobResourceContentsSchema = ResourceContentsSchema.extend({ + /** + * A base64-encoded string representing the binary data of the item. + */ + blob: Base64Schema + }); + var RoleSchema = _enum2(["user", "assistant"]); + var AnnotationsSchema = object2({ + /** + * Intended audience(s) for the resource. + */ + audience: array(RoleSchema).optional(), + /** + * Importance hint for the resource, from 0 (least) to 1 (most). + */ + priority: number2().min(0).max(1).optional(), + /** + * ISO 8601 timestamp for the most recent modification. + */ + lastModified: iso_exports.datetime({ offset: true }).optional() + }); + var ResourceSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * The URI of this resource. + */ + uri: string2(), + /** + * A description of what this resource represents. + * + * This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model. + */ + description: optional(string2()), + /** + * The MIME type of this resource, if known. + */ + mimeType: optional(string2()), + /** + * The size of the raw resource content, in bytes (i.e., before base64 encoding or any tokenization), if known. + * + * This can be used by Hosts to display file sizes and estimate context window usage. + */ + size: optional(number2()), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) + }); + var ResourceTemplateSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * A URI template (according to RFC 6570) that can be used to construct resource URIs. + */ + uriTemplate: string2(), + /** + * A description of what this template is for. + * + * This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model. + */ + description: optional(string2()), + /** + * The MIME type for all resources that match this template. This should only be included if all resources matching this template have the same type. + */ + mimeType: optional(string2()), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) + }); + var ListResourcesRequestSchema = PaginatedRequestSchema.extend({ + method: literal("resources/list") + }); + var ListResourcesResultSchema = PaginatedResultSchema.extend({ + resources: array(ResourceSchema) + }); + var ListResourceTemplatesRequestSchema = PaginatedRequestSchema.extend({ + method: literal("resources/templates/list") + }); + var ListResourceTemplatesResultSchema = PaginatedResultSchema.extend({ + resourceTemplates: array(ResourceTemplateSchema) + }); + var ResourceRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The URI of the resource to read. The URI can use any protocol; it is up to the server how to interpret it. + * + * @format uri + */ + uri: string2() + }); + var ReadResourceRequestParamsSchema = ResourceRequestParamsSchema; + var ReadResourceRequestSchema = RequestSchema.extend({ + method: literal("resources/read"), + params: ReadResourceRequestParamsSchema + }); + var ReadResourceResultSchema = ResultSchema.extend({ + contents: array(union([TextResourceContentsSchema, BlobResourceContentsSchema])) + }); + var ResourceListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/resources/list_changed"), + params: NotificationsParamsSchema.optional() + }); + var SubscribeRequestParamsSchema = ResourceRequestParamsSchema; + var SubscribeRequestSchema = RequestSchema.extend({ + method: literal("resources/subscribe"), + params: SubscribeRequestParamsSchema + }); + var UnsubscribeRequestParamsSchema = ResourceRequestParamsSchema; + var UnsubscribeRequestSchema = RequestSchema.extend({ + method: literal("resources/unsubscribe"), + params: UnsubscribeRequestParamsSchema + }); + var ResourceUpdatedNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The URI of the resource that has been updated. This might be a sub-resource of the one that the client actually subscribed to. + */ + uri: string2() + }); + var ResourceUpdatedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/resources/updated"), + params: ResourceUpdatedNotificationParamsSchema + }); + var PromptArgumentSchema = object2({ + /** + * The name of the argument. + */ + name: string2(), + /** + * A human-readable description of the argument. + */ + description: optional(string2()), + /** + * Whether this argument must be provided. + */ + required: optional(boolean2()) + }); + var PromptSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * An optional description of what this prompt provides + */ + description: optional(string2()), + /** + * A list of arguments to use for templating the prompt. + */ + arguments: optional(array(PromptArgumentSchema)), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) + }); + var ListPromptsRequestSchema = PaginatedRequestSchema.extend({ + method: literal("prompts/list") + }); + var ListPromptsResultSchema = PaginatedResultSchema.extend({ + prompts: array(PromptSchema) + }); + var GetPromptRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The name of the prompt or prompt template. + */ + name: string2(), + /** + * Arguments to use for templating the prompt. + */ + arguments: record(string2(), string2()).optional() + }); + var GetPromptRequestSchema = RequestSchema.extend({ + method: literal("prompts/get"), + params: GetPromptRequestParamsSchema + }); + var TextContentSchema = object2({ + type: literal("text"), + /** + * The text content of the message. + */ + text: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var ImageContentSchema = object2({ + type: literal("image"), + /** + * The base64-encoded image data. + */ + data: Base64Schema, + /** + * The MIME type of the image. Different providers may support different image types. + */ + mimeType: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var AudioContentSchema = object2({ + type: literal("audio"), + /** + * The base64-encoded audio data. + */ + data: Base64Schema, + /** + * The MIME type of the audio. Different providers may support different audio types. + */ + mimeType: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var ToolUseContentSchema = object2({ + type: literal("tool_use"), + /** + * The name of the tool to invoke. + * Must match a tool name from the request's tools array. + */ + name: string2(), + /** + * Unique identifier for this tool call. + * Used to correlate with ToolResultContent in subsequent messages. + */ + id: string2(), + /** + * Arguments to pass to the tool. + * Must conform to the tool's inputSchema. + */ + input: record(string2(), unknown()), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var EmbeddedResourceSchema = object2({ + type: literal("resource"), + resource: union([TextResourceContentsSchema, BlobResourceContentsSchema]), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var ResourceLinkSchema = ResourceSchema.extend({ + type: literal("resource_link") + }); + var ContentBlockSchema = union([ + TextContentSchema, + ImageContentSchema, + AudioContentSchema, + ResourceLinkSchema, + EmbeddedResourceSchema + ]); + var PromptMessageSchema = object2({ + role: RoleSchema, + content: ContentBlockSchema + }); + var GetPromptResultSchema = ResultSchema.extend({ + /** + * An optional description for the prompt. + */ + description: string2().optional(), + messages: array(PromptMessageSchema) + }); + var PromptListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/prompts/list_changed"), + params: NotificationsParamsSchema.optional() + }); + var ToolAnnotationsSchema = object2({ + /** + * A human-readable title for the tool. + */ + title: string2().optional(), + /** + * If true, the tool does not modify its environment. + * + * Default: false + */ + readOnlyHint: boolean2().optional(), + /** + * If true, the tool may perform destructive updates to its environment. + * If false, the tool performs only additive updates. + * + * (This property is meaningful only when `readOnlyHint == false`) + * + * Default: true + */ + destructiveHint: boolean2().optional(), + /** + * If true, calling the tool repeatedly with the same arguments + * will have no additional effect on the its environment. + * + * (This property is meaningful only when `readOnlyHint == false`) + * + * Default: false + */ + idempotentHint: boolean2().optional(), + /** + * If true, this tool may interact with an "open world" of external + * entities. If false, the tool's domain of interaction is closed. + * For example, the world of a web search tool is open, whereas that + * of a memory tool is not. + * + * Default: true + */ + openWorldHint: boolean2().optional() + }); + var ToolExecutionSchema = object2({ + /** + * Indicates the tool's preference for task-augmented execution. + * - "required": Clients MUST invoke the tool as a task + * - "optional": Clients MAY invoke the tool as a task or normal request + * - "forbidden": Clients MUST NOT attempt to invoke the tool as a task + * + * If not present, defaults to "forbidden". + */ + taskSupport: _enum2(["required", "optional", "forbidden"]).optional() + }); + var ToolSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * A human-readable description of the tool. + */ + description: string2().optional(), + /** + * A JSON Schema 2020-12 object defining the expected parameters for the tool. + * Must have type: 'object' at the root level per MCP spec. + */ + inputSchema: object2({ + type: literal("object"), + properties: record(string2(), AssertObjectSchema).optional(), + required: array(string2()).optional() + }).catchall(unknown()), + /** + * An optional JSON Schema 2020-12 object defining the structure of the tool's output + * returned in the structuredContent field of a CallToolResult. + * Must have type: 'object' at the root level per MCP spec. + */ + outputSchema: object2({ + type: literal("object"), + properties: record(string2(), AssertObjectSchema).optional(), + required: array(string2()).optional() + }).catchall(unknown()).optional(), + /** + * Optional additional tool information. + */ + annotations: ToolAnnotationsSchema.optional(), + /** + * Execution-related properties for this tool. + */ + execution: ToolExecutionSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var ListToolsRequestSchema = PaginatedRequestSchema.extend({ + method: literal("tools/list") + }); + var ListToolsResultSchema = PaginatedResultSchema.extend({ + tools: array(ToolSchema) + }); + var CallToolResultSchema = ResultSchema.extend({ + /** + * A list of content objects that represent the result of the tool call. + * + * If the Tool does not define an outputSchema, this field MUST be present in the result. + * For backwards compatibility, this field is always present, but it may be empty. + */ + content: array(ContentBlockSchema).default([]), + /** + * An object containing structured tool output. + * + * If the Tool defines an outputSchema, this field MUST be present in the result, and contain a JSON object that matches the schema. + */ + structuredContent: record(string2(), unknown()).optional(), + /** + * Whether the tool call ended in an error. + * + * If not set, this is assumed to be false (the call was successful). + * + * Any errors that originate from the tool SHOULD be reported inside the result + * object, with `isError` set to true, _not_ as an MCP protocol-level error + * response. Otherwise, the LLM would not be able to see that an error occurred + * and self-correct. + * + * However, any errors in _finding_ the tool, an error indicating that the + * server does not support tool calls, or any other exceptional conditions, + * should be reported as an MCP error response. + */ + isError: boolean2().optional() + }); + var CompatibilityCallToolResultSchema = CallToolResultSchema.or(ResultSchema.extend({ + toolResult: unknown() + })); + var CallToolRequestParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The name of the tool to call. + */ + name: string2(), + /** + * Arguments to pass to the tool. + */ + arguments: record(string2(), unknown()).optional() + }); + var CallToolRequestSchema = RequestSchema.extend({ + method: literal("tools/call"), + params: CallToolRequestParamsSchema + }); + var ToolListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/tools/list_changed"), + params: NotificationsParamsSchema.optional() + }); + var ListChangedOptionsBaseSchema = object2({ + /** + * If true, the list will be refreshed automatically when a list changed notification is received. + * The callback will be called with the updated list. + * + * If false, the callback will be called with null items, allowing manual refresh. + * + * @default true + */ + autoRefresh: boolean2().default(true), + /** + * Debounce time in milliseconds for list changed notification processing. + * + * Multiple notifications received within this timeframe will only trigger one refresh. + * Set to 0 to disable debouncing. + * + * @default 300 + */ + debounceMs: number2().int().nonnegative().default(300) + }); + var LoggingLevelSchema = _enum2(["debug", "info", "notice", "warning", "error", "critical", "alert", "emergency"]); + var SetLevelRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The level of logging that the client wants to receive from the server. The server should send all logs at this level and higher (i.e., more severe) to the client as notifications/logging/message. + */ + level: LoggingLevelSchema + }); + var SetLevelRequestSchema = RequestSchema.extend({ + method: literal("logging/setLevel"), + params: SetLevelRequestParamsSchema + }); + var LoggingMessageNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The severity of this log message. + */ + level: LoggingLevelSchema, + /** + * An optional name of the logger issuing this message. + */ + logger: string2().optional(), + /** + * The data to be logged, such as a string message or an object. Any JSON serializable type is allowed here. + */ + data: unknown() + }); + var LoggingMessageNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/message"), + params: LoggingMessageNotificationParamsSchema + }); + var ModelHintSchema = object2({ + /** + * A hint for a model name. + */ + name: string2().optional() + }); + var ModelPreferencesSchema = object2({ + /** + * Optional hints to use for model selection. + */ + hints: array(ModelHintSchema).optional(), + /** + * How much to prioritize cost when selecting a model. + */ + costPriority: number2().min(0).max(1).optional(), + /** + * How much to prioritize sampling speed (latency) when selecting a model. + */ + speedPriority: number2().min(0).max(1).optional(), + /** + * How much to prioritize intelligence and capabilities when selecting a model. + */ + intelligencePriority: number2().min(0).max(1).optional() + }); + var ToolChoiceSchema = object2({ + /** + * Controls when tools are used: + * - "auto": Model decides whether to use tools (default) + * - "required": Model MUST use at least one tool before completing + * - "none": Model MUST NOT use any tools + */ + mode: _enum2(["auto", "required", "none"]).optional() + }); + var ToolResultContentSchema = object2({ + type: literal("tool_result"), + toolUseId: string2().describe("The unique identifier for the corresponding tool call."), + content: array(ContentBlockSchema).default([]), + structuredContent: object2({}).loose().optional(), + isError: boolean2().optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var SamplingContentSchema = discriminatedUnion("type", [TextContentSchema, ImageContentSchema, AudioContentSchema]); + var SamplingMessageContentBlockSchema = discriminatedUnion("type", [ + TextContentSchema, + ImageContentSchema, + AudioContentSchema, + ToolUseContentSchema, + ToolResultContentSchema + ]); + var SamplingMessageSchema = object2({ + role: RoleSchema, + content: union([SamplingMessageContentBlockSchema, array(SamplingMessageContentBlockSchema)]), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var CreateMessageRequestParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + messages: array(SamplingMessageSchema), + /** + * The server's preferences for which model to select. The client MAY modify or omit this request. + */ + modelPreferences: ModelPreferencesSchema.optional(), + /** + * An optional system prompt the server wants to use for sampling. The client MAY modify or omit this prompt. + */ + systemPrompt: string2().optional(), + /** + * A request to include context from one or more MCP servers (including the caller), to be attached to the prompt. + * The client MAY ignore this request. + * + * Default is "none". Values "thisServer" and "allServers" are soft-deprecated. Servers SHOULD only use these values if the client + * declares ClientCapabilities.sampling.context. These values may be removed in future spec releases. + */ + includeContext: _enum2(["none", "thisServer", "allServers"]).optional(), + temperature: number2().optional(), + /** + * The requested maximum number of tokens to sample (to prevent runaway completions). + * + * The client MAY choose to sample fewer tokens than the requested maximum. + */ + maxTokens: number2().int(), + stopSequences: array(string2()).optional(), + /** + * Optional metadata to pass through to the LLM provider. The format of this metadata is provider-specific. + */ + metadata: AssertObjectSchema.optional(), + /** + * Tools that the model may use during generation. + * The client MUST return an error if this field is provided but ClientCapabilities.sampling.tools is not declared. + */ + tools: array(ToolSchema).optional(), + /** + * Controls how the model uses tools. + * The client MUST return an error if this field is provided but ClientCapabilities.sampling.tools is not declared. + * Default is `{ mode: "auto" }`. + */ + toolChoice: ToolChoiceSchema.optional() + }); + var CreateMessageRequestSchema = RequestSchema.extend({ + method: literal("sampling/createMessage"), + params: CreateMessageRequestParamsSchema + }); + var CreateMessageResultSchema = ResultSchema.extend({ + /** + * The name of the model that generated the message. + */ + model: string2(), + /** + * The reason why sampling stopped, if known. + * + * Standard values: + * - "endTurn": Natural end of the assistant's turn + * - "stopSequence": A stop sequence was encountered + * - "maxTokens": Maximum token limit was reached + * + * This field is an open string to allow for provider-specific stop reasons. + */ + stopReason: optional(_enum2(["endTurn", "stopSequence", "maxTokens"]).or(string2())), + role: RoleSchema, + /** + * Response content. Single content block (text, image, or audio). + */ + content: SamplingContentSchema + }); + var CreateMessageResultWithToolsSchema = ResultSchema.extend({ + /** + * The name of the model that generated the message. + */ + model: string2(), + /** + * The reason why sampling stopped, if known. + * + * Standard values: + * - "endTurn": Natural end of the assistant's turn + * - "stopSequence": A stop sequence was encountered + * - "maxTokens": Maximum token limit was reached + * - "toolUse": The model wants to use one or more tools + * + * This field is an open string to allow for provider-specific stop reasons. + */ + stopReason: optional(_enum2(["endTurn", "stopSequence", "maxTokens", "toolUse"]).or(string2())), + role: RoleSchema, + /** + * Response content. May be a single block or array. May include ToolUseContent if stopReason is "toolUse". + */ + content: union([SamplingMessageContentBlockSchema, array(SamplingMessageContentBlockSchema)]) + }); + var BooleanSchemaSchema = object2({ + type: literal("boolean"), + title: string2().optional(), + description: string2().optional(), + default: boolean2().optional() + }); + var StringSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + minLength: number2().optional(), + maxLength: number2().optional(), + format: _enum2(["email", "uri", "date", "date-time"]).optional(), + default: string2().optional() + }); + var NumberSchemaSchema = object2({ + type: _enum2(["number", "integer"]), + title: string2().optional(), + description: string2().optional(), + minimum: number2().optional(), + maximum: number2().optional(), + default: number2().optional() + }); + var UntitledSingleSelectEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + enum: array(string2()), + default: string2().optional() + }); + var TitledSingleSelectEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + oneOf: array(object2({ + const: string2(), + title: string2() + })), + default: string2().optional() + }); + var LegacyTitledEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + enum: array(string2()), + enumNames: array(string2()).optional(), + default: string2().optional() + }); + var SingleSelectEnumSchemaSchema = union([UntitledSingleSelectEnumSchemaSchema, TitledSingleSelectEnumSchemaSchema]); + var UntitledMultiSelectEnumSchemaSchema = object2({ + type: literal("array"), + title: string2().optional(), + description: string2().optional(), + minItems: number2().optional(), + maxItems: number2().optional(), + items: object2({ + type: literal("string"), + enum: array(string2()) + }), + default: array(string2()).optional() + }); + var TitledMultiSelectEnumSchemaSchema = object2({ + type: literal("array"), + title: string2().optional(), + description: string2().optional(), + minItems: number2().optional(), + maxItems: number2().optional(), + items: object2({ + anyOf: array(object2({ + const: string2(), + title: string2() + })) + }), + default: array(string2()).optional() + }); + var MultiSelectEnumSchemaSchema = union([UntitledMultiSelectEnumSchemaSchema, TitledMultiSelectEnumSchemaSchema]); + var EnumSchemaSchema = union([LegacyTitledEnumSchemaSchema, SingleSelectEnumSchemaSchema, MultiSelectEnumSchemaSchema]); + var PrimitiveSchemaDefinitionSchema = union([EnumSchemaSchema, BooleanSchemaSchema, StringSchemaSchema, NumberSchemaSchema]); + var ElicitRequestFormParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The elicitation mode. + * + * Optional for backward compatibility. Clients MUST treat missing mode as "form". + */ + mode: literal("form").optional(), + /** + * The message to present to the user describing what information is being requested. + */ + message: string2(), + /** + * A restricted subset of JSON Schema. + * Only top-level properties are allowed, without nesting. + */ + requestedSchema: object2({ + type: literal("object"), + properties: record(string2(), PrimitiveSchemaDefinitionSchema), + required: array(string2()).optional() + }) + }); + var ElicitRequestURLParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The elicitation mode. + */ + mode: literal("url"), + /** + * The message to present to the user explaining why the interaction is needed. + */ + message: string2(), + /** + * The ID of the elicitation, which must be unique within the context of the server. + * The client MUST treat this ID as an opaque value. + */ + elicitationId: string2(), + /** + * The URL that the user should navigate to. + */ + url: string2().url() + }); + var ElicitRequestParamsSchema = union([ElicitRequestFormParamsSchema, ElicitRequestURLParamsSchema]); + var ElicitRequestSchema = RequestSchema.extend({ + method: literal("elicitation/create"), + params: ElicitRequestParamsSchema + }); + var ElicitationCompleteNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The ID of the elicitation that completed. + */ + elicitationId: string2() + }); + var ElicitationCompleteNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/elicitation/complete"), + params: ElicitationCompleteNotificationParamsSchema + }); + var ElicitResultSchema = ResultSchema.extend({ + /** + * The user action in response to the elicitation. + * - "accept": User submitted the form/confirmed the action + * - "decline": User explicitly decline the action + * - "cancel": User dismissed without making an explicit choice + */ + action: _enum2(["accept", "decline", "cancel"]), + /** + * The submitted form data, only present when action is "accept". + * Contains values matching the requested schema. + * Per MCP spec, content is "typically omitted" for decline/cancel actions. + * We normalize null to undefined for leniency while maintaining type compatibility. + */ + content: preprocess((val) => val === null ? void 0 : val, record(string2(), union([string2(), number2(), boolean2(), array(string2())])).optional()) + }); + var ResourceTemplateReferenceSchema = object2({ + type: literal("ref/resource"), + /** + * The URI or URI template of the resource. + */ + uri: string2() + }); + var PromptReferenceSchema = object2({ + type: literal("ref/prompt"), + /** + * The name of the prompt or prompt template + */ + name: string2() + }); + var CompleteRequestParamsSchema = BaseRequestParamsSchema.extend({ + ref: union([PromptReferenceSchema, ResourceTemplateReferenceSchema]), + /** + * The argument's information + */ + argument: object2({ + /** + * The name of the argument + */ + name: string2(), + /** + * The value of the argument to use for completion matching. + */ + value: string2() + }), + context: object2({ + /** + * Previously-resolved variables in a URI template or prompt. + */ + arguments: record(string2(), string2()).optional() + }).optional() + }); + var CompleteRequestSchema = RequestSchema.extend({ + method: literal("completion/complete"), + params: CompleteRequestParamsSchema + }); + var CompleteResultSchema = ResultSchema.extend({ + completion: looseObject({ + /** + * An array of completion values. Must not exceed 100 items. + */ + values: array(string2()).max(100), + /** + * The total number of completion options available. This can exceed the number of values actually sent in the response. + */ + total: optional(number2().int()), + /** + * Indicates whether there are additional completion options beyond those provided in the current response, even if the exact total is unknown. + */ + hasMore: optional(boolean2()) + }) + }); + var RootSchema = object2({ + /** + * The URI identifying the root. This *must* start with file:// for now. + */ + uri: string2().startsWith("file://"), + /** + * An optional name for the root. + */ + name: string2().optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() + }); + var ListRootsRequestSchema = RequestSchema.extend({ + method: literal("roots/list"), + params: BaseRequestParamsSchema.optional() + }); + var ListRootsResultSchema = ResultSchema.extend({ + roots: array(RootSchema) + }); + var RootsListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/roots/list_changed"), + params: NotificationsParamsSchema.optional() + }); + var ClientRequestSchema = union([ + PingRequestSchema, + InitializeRequestSchema, + CompleteRequestSchema, + SetLevelRequestSchema, + GetPromptRequestSchema, + ListPromptsRequestSchema, + ListResourcesRequestSchema, + ListResourceTemplatesRequestSchema, + ReadResourceRequestSchema, + SubscribeRequestSchema, + UnsubscribeRequestSchema, + CallToolRequestSchema, + ListToolsRequestSchema, + GetTaskRequestSchema, + GetTaskPayloadRequestSchema, + ListTasksRequestSchema, + CancelTaskRequestSchema + ]); + var ClientNotificationSchema = union([ + CancelledNotificationSchema, + ProgressNotificationSchema, + InitializedNotificationSchema, + RootsListChangedNotificationSchema, + TaskStatusNotificationSchema + ]); + var ClientResultSchema = union([ + EmptyResultSchema, + CreateMessageResultSchema, + CreateMessageResultWithToolsSchema, + ElicitResultSchema, + ListRootsResultSchema, + GetTaskResultSchema, + ListTasksResultSchema, + CreateTaskResultSchema + ]); + var ServerRequestSchema = union([ + PingRequestSchema, + CreateMessageRequestSchema, + ElicitRequestSchema, + ListRootsRequestSchema, + GetTaskRequestSchema, + GetTaskPayloadRequestSchema, + ListTasksRequestSchema, + CancelTaskRequestSchema + ]); + var ServerNotificationSchema = union([ + CancelledNotificationSchema, + ProgressNotificationSchema, + LoggingMessageNotificationSchema, + ResourceUpdatedNotificationSchema, + ResourceListChangedNotificationSchema, + ToolListChangedNotificationSchema, + PromptListChangedNotificationSchema, + TaskStatusNotificationSchema, + ElicitationCompleteNotificationSchema + ]); + var ServerResultSchema = union([ + EmptyResultSchema, + InitializeResultSchema, + CompleteResultSchema, + GetPromptResultSchema, + ListPromptsResultSchema, + ListResourcesResultSchema, + ListResourceTemplatesResultSchema, + ReadResourceResultSchema, + CallToolResultSchema, + ListToolsResultSchema, + GetTaskResultSchema, + ListTasksResultSchema, + CreateTaskResultSchema + ]); + var McpError = class _McpError extends Error { + constructor(code, message, data) { + super(`MCP error ${code}: ${message}`); + this.code = code; + this.data = data; + this.name = "McpError"; + } + /** + * Factory method to create the appropriate error type based on the error code and data + */ + static fromError(code, message, data) { + if (code === ErrorCode.UrlElicitationRequired && data) { + const errorData = data; + if (errorData.elicitations) { + return new UrlElicitationRequiredError(errorData.elicitations, message); + } + } + return new _McpError(code, message, data); + } + }; + var UrlElicitationRequiredError = class extends McpError { + constructor(elicitations, message = `URL elicitation${elicitations.length > 1 ? "s" : ""} required`) { + super(ErrorCode.UrlElicitationRequired, message, { + elicitations + }); + } + get elicitations() { + return this.data?.elicitations ?? []; + } + }; + + // node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js + function isTerminal(status) { + return status === "completed" || status === "failed" || status === "cancelled"; + } + + // node_modules/zod-to-json-schema/dist/esm/Options.js + var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); + + // node_modules/zod-to-json-schema/dist/esm/parsers/string.js + var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); + + // node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js + function getMethodLiteral(schema) { + const shape = getObjectShape(schema); + const methodSchema = shape?.method; + if (!methodSchema) { + throw new Error("Schema is missing a method literal"); + } + const value = getLiteralValue(methodSchema); + if (typeof value !== "string") { + throw new Error("Schema method literal must be a string"); + } + return value; + } + function parseWithCompat(schema, data) { + const result = safeParse2(schema, data); + if (!result.success) { + throw result.error; + } + return result.data; + } + + // node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js + var DEFAULT_REQUEST_TIMEOUT_MSEC = 6e4; + var Protocol = class { + constructor(_options) { + this._options = _options; + this._requestMessageId = 0; + this._requestHandlers = /* @__PURE__ */ new Map(); + this._requestHandlerAbortControllers = /* @__PURE__ */ new Map(); + this._notificationHandlers = /* @__PURE__ */ new Map(); + this._responseHandlers = /* @__PURE__ */ new Map(); + this._progressHandlers = /* @__PURE__ */ new Map(); + this._timeoutInfo = /* @__PURE__ */ new Map(); + this._pendingDebouncedNotifications = /* @__PURE__ */ new Set(); + this._taskProgressTokens = /* @__PURE__ */ new Map(); + this._requestResolvers = /* @__PURE__ */ new Map(); + this.setNotificationHandler(CancelledNotificationSchema, (notification) => { + this._oncancel(notification); + }); + this.setNotificationHandler(ProgressNotificationSchema, (notification) => { + this._onprogress(notification); + }); + this.setRequestHandler( + PingRequestSchema, + // Automatic pong by default. + (_request) => ({}) + ); + this._taskStore = _options?.taskStore; + this._taskMessageQueue = _options?.taskMessageQueue; + if (this._taskStore) { + this.setRequestHandler(GetTaskRequestSchema, async (request, extra) => { + const task = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, "Failed to retrieve task: Task not found"); + } + return { + ...task + }; + }); + this.setRequestHandler(GetTaskPayloadRequestSchema, async (request, extra) => { + const handleTaskResult = async () => { + const taskId = request.params.taskId; + if (!await this._taskStore.getTask(taskId, extra.sessionId)) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`); + } + if (this._taskMessageQueue) { + let queuedMessage; + while (queuedMessage = await this._taskMessageQueue.dequeue(taskId, extra.sessionId)) { + if (queuedMessage.type === "response" || queuedMessage.type === "error") { + const message = queuedMessage.message; + const requestId = message.id; + const resolver = this._requestResolvers.get(requestId); + if (resolver) { + this._requestResolvers.delete(requestId); + if (queuedMessage.type === "response") { + resolver(message); + } else { + const errorMessage = message; + const error40 = new McpError(errorMessage.error.code, errorMessage.error.message, errorMessage.error.data); + resolver(error40); + } + } else { + const messageType = queuedMessage.type === "response" ? "Response" : "Error"; + this._onerror(new Error(`${messageType} handler missing for request ${requestId}`)); + } + continue; + } + await this._transport?.send(queuedMessage.message, { relatedRequestId: extra.requestId }); + } + } + const task = await this._taskStore.getTask(taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`); + } + if (!isTerminal(task.status)) { + await this._waitForTaskUpdate(taskId, extra.signal, extra.sessionId); + return await handleTaskResult(); + } + if (isTerminal(task.status)) { + const result = await this._taskStore.getTaskResult(taskId, extra.sessionId); + this._clearTaskQueue(taskId, extra.sessionId); + return { + ...result, + _meta: { + ...result._meta, + [RELATED_TASK_META_KEY]: { + taskId + } + } + }; + } + return await handleTaskResult(); + }; + return await handleTaskResult(); + }); + this.setRequestHandler(ListTasksRequestSchema, async (request, extra) => { + try { + const { tasks, nextCursor } = await this._taskStore.listTasks(request.params?.cursor, extra.sessionId); + return { + tasks, + nextCursor, + _meta: {} + }; + } catch (error40) { + throw new McpError(ErrorCode.InvalidParams, `Failed to list tasks: ${error40 instanceof Error ? error40.message : String(error40)}`); + } + }); + this.setRequestHandler(CancelTaskRequestSchema, async (request, extra) => { + try { + const task = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${request.params.taskId}`); + } + if (isTerminal(task.status)) { + throw new McpError(ErrorCode.InvalidParams, `Cannot cancel task in terminal status: ${task.status}`); + } + await this._taskStore.updateTaskStatus(request.params.taskId, "cancelled", "Client cancelled task execution.", extra.sessionId); + this._clearTaskQueue(request.params.taskId, extra.sessionId); + const cancelledTask = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!cancelledTask) { + throw new McpError(ErrorCode.InvalidParams, `Task not found after cancellation: ${request.params.taskId}`); + } + return { + _meta: {}, + ...cancelledTask + }; + } catch (error40) { + if (error40 instanceof McpError) { + throw error40; + } + throw new McpError(ErrorCode.InvalidRequest, `Failed to cancel task: ${error40 instanceof Error ? error40.message : String(error40)}`); + } + }); + } + } + async _oncancel(notification) { + if (!notification.params.requestId) { + return; + } + const controller = this._requestHandlerAbortControllers.get(notification.params.requestId); + controller?.abort(notification.params.reason); + } + _setupTimeout(messageId, timeout, maxTotalTimeout, onTimeout, resetTimeoutOnProgress = false) { + this._timeoutInfo.set(messageId, { + timeoutId: setTimeout(onTimeout, timeout), + startTime: Date.now(), + timeout, + maxTotalTimeout, + resetTimeoutOnProgress, + onTimeout + }); + } + _resetTimeout(messageId) { + const info = this._timeoutInfo.get(messageId); + if (!info) + return false; + const totalElapsed = Date.now() - info.startTime; + if (info.maxTotalTimeout && totalElapsed >= info.maxTotalTimeout) { + this._timeoutInfo.delete(messageId); + throw McpError.fromError(ErrorCode.RequestTimeout, "Maximum total timeout exceeded", { + maxTotalTimeout: info.maxTotalTimeout, + totalElapsed + }); + } + clearTimeout(info.timeoutId); + info.timeoutId = setTimeout(info.onTimeout, info.timeout); + return true; + } + _cleanupTimeout(messageId) { + const info = this._timeoutInfo.get(messageId); + if (info) { + clearTimeout(info.timeoutId); + this._timeoutInfo.delete(messageId); + } + } + /** + * Attaches to the given transport, starts it, and starts listening for messages. + * + * The Protocol object assumes ownership of the Transport, replacing any callbacks that have already been set, and expects that it is the only user of the Transport instance going forward. + */ + async connect(transport) { + if (this._transport) { + throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection."); + } + this._transport = transport; + const _onclose = this.transport?.onclose; + this._transport.onclose = () => { + _onclose?.(); + this._onclose(); + }; + const _onerror = this.transport?.onerror; + this._transport.onerror = (error40) => { + _onerror?.(error40); + this._onerror(error40); + }; + const _onmessage = this._transport?.onmessage; + this._transport.onmessage = (message, extra) => { + _onmessage?.(message, extra); + if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) { + this._onresponse(message); + } else if (isJSONRPCRequest(message)) { + this._onrequest(message, extra); + } else if (isJSONRPCNotification(message)) { + this._onnotification(message); + } else { + this._onerror(new Error(`Unknown message type: ${JSON.stringify(message)}`)); + } + }; + await this._transport.start(); + } + _onclose() { + const responseHandlers = this._responseHandlers; + this._responseHandlers = /* @__PURE__ */ new Map(); + this._progressHandlers.clear(); + this._taskProgressTokens.clear(); + this._pendingDebouncedNotifications.clear(); + for (const info of this._timeoutInfo.values()) { + clearTimeout(info.timeoutId); + } + this._timeoutInfo.clear(); + for (const controller of this._requestHandlerAbortControllers.values()) { + controller.abort(); + } + this._requestHandlerAbortControllers.clear(); + const error40 = McpError.fromError(ErrorCode.ConnectionClosed, "Connection closed"); + this._transport = void 0; + this.onclose?.(); + for (const handler of responseHandlers.values()) { + handler(error40); + } + } + _onerror(error40) { + this.onerror?.(error40); + } + _onnotification(notification) { + const handler = this._notificationHandlers.get(notification.method) ?? this.fallbackNotificationHandler; + if (handler === void 0) { + return; + } + Promise.resolve().then(() => handler(notification)).catch((error40) => this._onerror(new Error(`Uncaught error in notification handler: ${error40}`))); + } + _onrequest(request, extra) { + const handler = this._requestHandlers.get(request.method) ?? this.fallbackRequestHandler; + const capturedTransport = this._transport; + const relatedTaskId = request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId; + const sessionId = capturedTransport?.sessionId; + const store = this._taskStore; + let relatedTaskFound = true; + let relatedTaskLookup; + if (relatedTaskId && store && this._taskMessageQueue && sessionId !== void 0) { + relatedTaskFound = false; + relatedTaskLookup = (async () => { + if (!await store.getTask(relatedTaskId, sessionId)) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${relatedTaskId}`); + } + relatedTaskFound = true; + })(); + } + if (handler === void 0) { + const errorResponse = { + jsonrpc: "2.0", + id: request.id, + error: { + code: ErrorCode.MethodNotFound, + message: "Method not found" + } + }; + if (relatedTaskId && relatedTaskLookup) { + const queuedError = { type: "error", message: errorResponse, timestamp: Date.now() }; + relatedTaskLookup.then(() => this._enqueueTaskMessage(relatedTaskId, queuedError, sessionId), () => capturedTransport?.send(errorResponse)).catch((error40) => this._onerror(new Error(`Failed to send an error response: ${error40}`))); + } else if (relatedTaskId && this._taskMessageQueue) { + this._enqueueTaskMessage(relatedTaskId, { + type: "error", + message: errorResponse, + timestamp: Date.now() + }, capturedTransport?.sessionId).catch((error40) => this._onerror(new Error(`Failed to enqueue error response: ${error40}`))); + } else { + capturedTransport?.send(errorResponse).catch((error40) => this._onerror(new Error(`Failed to send an error response: ${error40}`))); + } + return; + } + const abortController = new AbortController(); + this._requestHandlerAbortControllers.set(request.id, abortController); + const taskCreationParams = isTaskAugmentedRequestParams(request.params) ? request.params.task : void 0; + const taskStore = this._taskStore ? this.requestTaskStore(request, capturedTransport?.sessionId) : void 0; + const fullExtra = { + signal: abortController.signal, + sessionId: capturedTransport?.sessionId, + _meta: request.params?._meta, + sendNotification: async (notification) => { + if (abortController.signal.aborted) + return; + const notificationOptions = { relatedRequestId: request.id }; + if (relatedTaskId) { + notificationOptions.relatedTask = { taskId: relatedTaskId }; + } + await this.notification(notification, notificationOptions); + }, + sendRequest: async (r, resultSchema, options) => { + if (abortController.signal.aborted) { + throw new McpError(ErrorCode.ConnectionClosed, "Request was cancelled"); + } + const requestOptions = { ...options, relatedRequestId: request.id }; + if (relatedTaskId && !requestOptions.relatedTask) { + requestOptions.relatedTask = { taskId: relatedTaskId }; + } + const effectiveTaskId = requestOptions.relatedTask?.taskId ?? relatedTaskId; + if (effectiveTaskId && taskStore) { + await taskStore.updateTaskStatus(effectiveTaskId, "input_required"); + } + return await this.request(r, resultSchema, requestOptions); + }, + authInfo: extra?.authInfo, + requestId: request.id, + requestInfo: extra?.requestInfo, + taskId: relatedTaskId, + taskStore, + taskRequestedTtl: taskCreationParams?.ttl, + closeSSEStream: extra?.closeSSEStream, + closeStandaloneSSEStream: extra?.closeStandaloneSSEStream + }; + (relatedTaskLookup ?? Promise.resolve()).then(() => { + if (relatedTaskLookup && abortController.signal.aborted) { + throw new McpError(ErrorCode.ConnectionClosed, "Request was cancelled"); + } + if (taskCreationParams) { + this.assertTaskHandlerCapability(request.method); + } + }).then(() => handler(request, fullExtra)).then(async (result) => { + if (abortController.signal.aborted) { + return; + } + const response = { + result, + jsonrpc: "2.0", + id: request.id + }; + if (relatedTaskId && this._taskMessageQueue) { + await this._enqueueTaskMessage(relatedTaskId, { + type: "response", + message: response, + timestamp: Date.now() + }, capturedTransport?.sessionId); + } else { + await capturedTransport?.send(response); + } + }, async (error40) => { + if (abortController.signal.aborted) { + return; + } + const errorResponse = { + jsonrpc: "2.0", + id: request.id, + error: { + code: Number.isSafeInteger(error40["code"]) ? error40["code"] : ErrorCode.InternalError, + message: error40.message ?? "Internal error", + ...error40["data"] !== void 0 && { data: error40["data"] } + } + }; + if (relatedTaskId && this._taskMessageQueue && relatedTaskFound) { + await this._enqueueTaskMessage(relatedTaskId, { + type: "error", + message: errorResponse, + timestamp: Date.now() + }, capturedTransport?.sessionId); + } else { + await capturedTransport?.send(errorResponse); + } + }).catch((error40) => this._onerror(new Error(`Failed to send response: ${error40}`))).finally(() => { + if (this._requestHandlerAbortControllers.get(request.id) === abortController) { + this._requestHandlerAbortControllers.delete(request.id); + } + }); + } + _onprogress(notification) { + const { progressToken, ...params } = notification.params; + const messageId = Number(progressToken); + const handler = this._progressHandlers.get(messageId); + if (!handler) { + this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(notification)}`)); + return; + } + const responseHandler = this._responseHandlers.get(messageId); + const timeoutInfo = this._timeoutInfo.get(messageId); + if (timeoutInfo && responseHandler && timeoutInfo.resetTimeoutOnProgress) { + try { + this._resetTimeout(messageId); + } catch (error40) { + this._responseHandlers.delete(messageId); + this._progressHandlers.delete(messageId); + this._cleanupTimeout(messageId); + responseHandler(error40); + return; + } + } + handler(params); + } + _onresponse(response) { + const messageId = Number(response.id); + const resolver = this._requestResolvers.get(messageId); + if (resolver) { + this._requestResolvers.delete(messageId); + if (isJSONRPCResultResponse(response)) { + resolver(response); + } else { + const error40 = new McpError(response.error.code, response.error.message, response.error.data); + resolver(error40); + } + return; + } + const handler = this._responseHandlers.get(messageId); + if (handler === void 0) { + this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(response)}`)); + return; + } + this._responseHandlers.delete(messageId); + this._cleanupTimeout(messageId); + let isTaskResponse = false; + if (isJSONRPCResultResponse(response) && response.result && typeof response.result === "object") { + const result = response.result; + if (result.task && typeof result.task === "object") { + const task = result.task; + if (typeof task.taskId === "string") { + isTaskResponse = true; + this._taskProgressTokens.set(task.taskId, messageId); + } + } + } + if (!isTaskResponse) { + this._progressHandlers.delete(messageId); + } + if (isJSONRPCResultResponse(response)) { + handler(response); + } else { + const error40 = McpError.fromError(response.error.code, response.error.message, response.error.data); + handler(error40); + } + } + get transport() { + return this._transport; + } + /** + * Closes the connection. + */ + async close() { + await this._transport?.close(); + } + /** + * Sends a request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * @example + * ```typescript + * const stream = protocol.requestStream(request, resultSchema, options); + * for await (const message of stream) { + * switch (message.type) { + * case 'taskCreated': + * console.log('Task created:', message.task.taskId); + * break; + * case 'taskStatus': + * console.log('Task status:', message.task.status); + * break; + * case 'result': + * console.log('Final result:', message.result); + * break; + * case 'error': + * console.error('Error:', message.error); + * break; + * } + * } + * ``` + * + * @experimental Use `client.experimental.tasks.requestStream()` to access this method. + */ + async *requestStream(request, resultSchema, options) { + const { task } = options ?? {}; + if (!task) { + try { + const result = await this.request(request, resultSchema, options); + yield { type: "result", result }; + } catch (error40) { + yield { + type: "error", + error: error40 instanceof McpError ? error40 : new McpError(ErrorCode.InternalError, String(error40)) + }; + } + return; + } + let taskId; + try { + const createResult = await this.request(request, CreateTaskResultSchema, options); + if (createResult.task) { + taskId = createResult.task.taskId; + yield { type: "taskCreated", task: createResult.task }; + } else { + throw new McpError(ErrorCode.InternalError, "Task creation did not return a task"); + } + while (true) { + const task2 = await this.getTask({ taskId }, options); + yield { type: "taskStatus", task: task2 }; + if (isTerminal(task2.status)) { + if (task2.status === "completed") { + const result = await this.getTaskResult({ taskId }, resultSchema, options); + yield { type: "result", result }; + } else if (task2.status === "failed") { + yield { + type: "error", + error: new McpError(ErrorCode.InternalError, `Task ${taskId} failed`) + }; + } else if (task2.status === "cancelled") { + yield { + type: "error", + error: new McpError(ErrorCode.InternalError, `Task ${taskId} was cancelled`) + }; + } + return; + } + if (task2.status === "input_required") { + const result = await this.getTaskResult({ taskId }, resultSchema, options); + yield { type: "result", result }; + return; + } + const pollInterval = task2.pollInterval ?? this._options?.defaultTaskPollInterval ?? 1e3; + await new Promise((resolve) => setTimeout(resolve, pollInterval)); + options?.signal?.throwIfAborted(); + } + } catch (error40) { + yield { + type: "error", + error: error40 instanceof McpError ? error40 : new McpError(ErrorCode.InternalError, String(error40)) + }; + } + } + /** + * Sends a request and waits for a response. + * + * Do not use this method to emit notifications! Use notification() instead. + */ + request(request, resultSchema, options) { + const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options ?? {}; + return new Promise((resolve, reject) => { + const earlyReject = (error40) => { + reject(error40); + }; + if (!this._transport) { + earlyReject(new Error("Not connected")); + return; + } + if (this._options?.enforceStrictCapabilities === true) { + try { + this.assertCapabilityForMethod(request.method); + if (task) { + this.assertTaskCapability(request.method); + } + } catch (e) { + earlyReject(e); + return; + } + } + options?.signal?.throwIfAborted(); + const messageId = this._requestMessageId++; + const jsonrpcRequest = { + ...request, + jsonrpc: "2.0", + id: messageId + }; + if (options?.onprogress) { + this._progressHandlers.set(messageId, options.onprogress); + jsonrpcRequest.params = { + ...request.params, + _meta: { + ...request.params?._meta || {}, + progressToken: messageId + } + }; + } + if (task) { + jsonrpcRequest.params = { + ...jsonrpcRequest.params, + task + }; + } + if (relatedTask) { + jsonrpcRequest.params = { + ...jsonrpcRequest.params, + _meta: { + ...jsonrpcRequest.params?._meta || {}, + [RELATED_TASK_META_KEY]: relatedTask + } + }; + } + const cancel = (reason) => { + this._responseHandlers.delete(messageId); + this._progressHandlers.delete(messageId); + this._cleanupTimeout(messageId); + this._transport?.send({ + jsonrpc: "2.0", + method: "notifications/cancelled", + params: { + requestId: messageId, + reason: String(reason) + } + }, { relatedRequestId, resumptionToken, onresumptiontoken }).catch((error41) => this._onerror(new Error(`Failed to send cancellation: ${error41}`))); + const error40 = reason instanceof McpError ? reason : new McpError(ErrorCode.RequestTimeout, String(reason)); + reject(error40); + }; + this._responseHandlers.set(messageId, (response) => { + if (options?.signal?.aborted) { + return; + } + if (response instanceof Error) { + return reject(response); + } + try { + const parseResult = safeParse2(resultSchema, response.result); + if (!parseResult.success) { + reject(parseResult.error); + } else { + resolve(parseResult.data); + } + } catch (error40) { + reject(error40); + } + }); + options?.signal?.addEventListener("abort", () => { + cancel(options?.signal?.reason); + }); + const timeout = options?.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC; + const timeoutHandler = () => cancel(McpError.fromError(ErrorCode.RequestTimeout, "Request timed out", { timeout })); + this._setupTimeout(messageId, timeout, options?.maxTotalTimeout, timeoutHandler, options?.resetTimeoutOnProgress ?? false); + const relatedTaskId = relatedTask?.taskId; + if (relatedTaskId) { + const responseResolver = (response) => { + const handler = this._responseHandlers.get(messageId); + if (handler) { + handler(response); + } else { + this._onerror(new Error(`Response handler missing for side-channeled request ${messageId}`)); + } + }; + this._requestResolvers.set(messageId, responseResolver); + this._enqueueTaskMessage(relatedTaskId, { + type: "request", + message: jsonrpcRequest, + timestamp: Date.now() + }).catch((error40) => { + this._cleanupTimeout(messageId); + reject(error40); + }); + } else { + this._transport.send(jsonrpcRequest, { relatedRequestId, resumptionToken, onresumptiontoken }).catch((error40) => { + this._cleanupTimeout(messageId); + reject(error40); + }); + } + }); + } + /** + * Gets the current status of a task. + * + * @experimental Use `client.experimental.tasks.getTask()` to access this method. + */ + async getTask(params, options) { + return this.request({ method: "tasks/get", params }, GetTaskResultSchema, options); + } + /** + * Retrieves the result of a completed task. + * + * @experimental Use `client.experimental.tasks.getTaskResult()` to access this method. + */ + async getTaskResult(params, resultSchema, options) { + return this.request({ method: "tasks/result", params }, resultSchema, options); + } + /** + * Lists tasks, optionally starting from a pagination cursor. + * + * @experimental Use `client.experimental.tasks.listTasks()` to access this method. + */ + async listTasks(params, options) { + return this.request({ method: "tasks/list", params }, ListTasksResultSchema, options); + } + /** + * Cancels a specific task. + * + * @experimental Use `client.experimental.tasks.cancelTask()` to access this method. + */ + async cancelTask(params, options) { + return this.request({ method: "tasks/cancel", params }, CancelTaskResultSchema, options); + } + /** + * Emits a notification, which is a one-way message that does not expect a response. + */ + async notification(notification, options) { + if (!this._transport) { + throw new Error("Not connected"); + } + this.assertNotificationCapability(notification.method); + const relatedTaskId = options?.relatedTask?.taskId; + if (relatedTaskId) { + const jsonrpcNotification2 = { + ...notification, + jsonrpc: "2.0", + params: { + ...notification.params, + _meta: { + ...notification.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + await this._enqueueTaskMessage(relatedTaskId, { + type: "notification", + message: jsonrpcNotification2, + timestamp: Date.now() + }); + return; + } + const debouncedMethods = this._options?.debouncedNotificationMethods ?? []; + const canDebounce = debouncedMethods.includes(notification.method) && !notification.params && !options?.relatedRequestId && !options?.relatedTask; + if (canDebounce) { + if (this._pendingDebouncedNotifications.has(notification.method)) { + return; + } + this._pendingDebouncedNotifications.add(notification.method); + Promise.resolve().then(() => { + this._pendingDebouncedNotifications.delete(notification.method); + if (!this._transport) { + return; + } + let jsonrpcNotification2 = { + ...notification, + jsonrpc: "2.0" + }; + if (options?.relatedTask) { + jsonrpcNotification2 = { + ...jsonrpcNotification2, + params: { + ...jsonrpcNotification2.params, + _meta: { + ...jsonrpcNotification2.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + } + this._transport?.send(jsonrpcNotification2, options).catch((error40) => this._onerror(error40)); + }); + return; + } + let jsonrpcNotification = { + ...notification, + jsonrpc: "2.0" + }; + if (options?.relatedTask) { + jsonrpcNotification = { + ...jsonrpcNotification, + params: { + ...jsonrpcNotification.params, + _meta: { + ...jsonrpcNotification.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + } + await this._transport.send(jsonrpcNotification, options); + } + /** + * Registers a handler to invoke when this protocol object receives a request with the given method. + * + * Note that this will replace any previous request handler for the same method. + */ + setRequestHandler(requestSchema, handler) { + const method = getMethodLiteral(requestSchema); + this.assertRequestHandlerCapability(method); + this._requestHandlers.set(method, (request, extra) => { + const parsed = parseWithCompat(requestSchema, request); + return Promise.resolve(handler(parsed, extra)); + }); + } + /** + * Removes the request handler for the given method. + */ + removeRequestHandler(method) { + this._requestHandlers.delete(method); + } + /** + * Asserts that a request handler has not already been set for the given method, in preparation for a new one being automatically installed. + */ + assertCanSetRequestHandler(method) { + if (this._requestHandlers.has(method)) { + throw new Error(`A request handler for ${method} already exists, which would be overridden`); + } + } + /** + * Registers a handler to invoke when this protocol object receives a notification with the given method. + * + * Note that this will replace any previous notification handler for the same method. + */ + setNotificationHandler(notificationSchema, handler) { + const method = getMethodLiteral(notificationSchema); + this._notificationHandlers.set(method, (notification) => { + const parsed = parseWithCompat(notificationSchema, notification); + return Promise.resolve(handler(parsed)); + }); + } + /** + * Removes the notification handler for the given method. + */ + removeNotificationHandler(method) { + this._notificationHandlers.delete(method); + } + /** + * Cleans up the progress handler associated with a task. + * This should be called when a task reaches a terminal status. + */ + _cleanupTaskProgressHandler(taskId) { + const progressToken = this._taskProgressTokens.get(taskId); + if (progressToken !== void 0) { + this._progressHandlers.delete(progressToken); + this._taskProgressTokens.delete(taskId); + } + } + /** + * Enqueues a task-related message for side-channel delivery via tasks/result. + * @param taskId The task ID to associate the message with + * @param message The message to enqueue + * @param sessionId Optional session ID for binding the operation to a specific session + * @throws Error if taskStore is not configured or if enqueue fails (e.g., queue overflow) + * + * Note: If enqueue fails, it's the TaskMessageQueue implementation's responsibility to handle + * the error appropriately (e.g., by failing the task, logging, etc.). The Protocol layer + * simply propagates the error. + */ + async _enqueueTaskMessage(taskId, message, sessionId) { + if (!this._taskStore || !this._taskMessageQueue) { + throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured"); + } + const maxQueueSize = this._options?.maxTaskQueueSize; + await this._taskMessageQueue.enqueue(taskId, message, sessionId ?? this._transport?.sessionId, maxQueueSize); + } + /** + * Clears the message queue for a task and rejects any pending request resolvers. + * @param taskId The task ID whose queue should be cleared + * @param sessionId Optional session ID for binding the operation to a specific session + */ + async _clearTaskQueue(taskId, sessionId) { + if (this._taskMessageQueue) { + const messages = await this._taskMessageQueue.dequeueAll(taskId, sessionId); + for (const message of messages) { + if (message.type === "request" && isJSONRPCRequest(message.message)) { + const requestId = message.message.id; + const resolver = this._requestResolvers.get(requestId); + if (resolver) { + resolver(new McpError(ErrorCode.InternalError, "Task cancelled or completed")); + this._requestResolvers.delete(requestId); + } else { + this._onerror(new Error(`Resolver missing for request ${requestId} during task ${taskId} cleanup`)); + } + } + } + } + } + /** + * Waits for a task update (new messages or status change) with abort signal support. + * Uses polling to check for updates at the task's configured poll interval. + * @param taskId The task ID to wait for + * @param signal Abort signal to cancel the wait + * @param sessionId Session of the request that waits, passed to the task store + * @returns Promise that resolves when an update occurs or rejects if aborted + */ + async _waitForTaskUpdate(taskId, signal, sessionId) { + let interval = this._options?.defaultTaskPollInterval ?? 1e3; + try { + const task = await this._taskStore?.getTask(taskId, sessionId); + if (task?.pollInterval) { + interval = task.pollInterval; + } + } catch { + } + return new Promise((resolve, reject) => { + if (signal.aborted) { + reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled")); + return; + } + const timeoutId = setTimeout(resolve, interval); + signal.addEventListener("abort", () => { + clearTimeout(timeoutId); + reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled")); + }, { once: true }); + }); + } + requestTaskStore(request, sessionId) { + const taskStore = this._taskStore; + if (!taskStore) { + throw new Error("No task store configured"); + } + return { + createTask: async (taskParams) => { + if (!request) { + throw new Error("No request provided"); + } + return await taskStore.createTask(taskParams, request.id, { + method: request.method, + params: request.params + }, sessionId); + }, + getTask: async (taskId) => { + const task = await taskStore.getTask(taskId, sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, "Failed to retrieve task: Task not found"); + } + return task; + }, + storeTaskResult: async (taskId, status, result) => { + await taskStore.storeTaskResult(taskId, status, result, sessionId); + const task = await taskStore.getTask(taskId, sessionId); + if (task) { + const notification = TaskStatusNotificationSchema.parse({ + method: "notifications/tasks/status", + params: task + }); + await this.notification(notification); + if (isTerminal(task.status)) { + this._cleanupTaskProgressHandler(taskId); + } + } + }, + getTaskResult: (taskId) => { + return taskStore.getTaskResult(taskId, sessionId); + }, + updateTaskStatus: async (taskId, status, statusMessage) => { + const task = await taskStore.getTask(taskId, sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task "${taskId}" not found - it may have been cleaned up`); + } + if (isTerminal(task.status)) { + throw new McpError(ErrorCode.InvalidParams, `Cannot update task "${taskId}" from terminal status "${task.status}" to "${status}". Terminal states (completed, failed, cancelled) cannot transition to other states.`); + } + await taskStore.updateTaskStatus(taskId, status, statusMessage, sessionId); + const updatedTask = await taskStore.getTask(taskId, sessionId); + if (updatedTask) { + const notification = TaskStatusNotificationSchema.parse({ + method: "notifications/tasks/status", + params: updatedTask + }); + await this.notification(notification); + if (isTerminal(updatedTask.status)) { + this._cleanupTaskProgressHandler(taskId); + } + } + }, + listTasks: (cursor) => { + return taskStore.listTasks(cursor, sessionId); + } + }; + } + }; + function isPlainObject2(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); + } + function mergeCapabilities(base, additional) { + const result = { ...base }; + for (const key in additional) { + const k2 = key; + const addValue = additional[k2]; + if (addValue === void 0) + continue; + const baseValue = result[k2]; + if (isPlainObject2(baseValue) && isPlainObject2(addValue)) { + result[k2] = { ...baseValue, ...addValue }; + } else { + result[k2] = addValue; + } + } + return result; + } + + // node_modules/@modelcontextprotocol/ext-apps/dist/src/app.js + init_v4(); + init_v4(); + var p = ((X) => typeof __require < "u" ? __require : typeof Proxy < "u" ? new Proxy(X, { get: (Y, Z) => (typeof __require < "u" ? __require : Y)[Z] }) : X)(function(X) { + if (typeof __require < "u") return __require.apply(this, arguments); + throw Error('Dynamic require of "' + X + '" is not supported'); + }); + var _ = class extends Protocol { + _registeredMethods = /* @__PURE__ */ new Set(); + _eventSlots = /* @__PURE__ */ new Map(); + onEventDispatch(X, Y) { + } + _ensureEventSlot(X) { + let Y = this._eventSlots.get(X); + if (!Y) { + let Z = this.eventSchemas[X]; + if (!Z) throw Error(`Unknown event: ${String(X)}`); + Y = { listeners: [] }, this._eventSlots.set(X, Y); + let $ = Z.shape.method.value; + this._registeredMethods.add($); + let D = Y; + super.setNotificationHandler(Z, (J) => { + let K = J.params; + this.onEventDispatch(X, K), D.onHandler?.(K); + for (let G of [...D.listeners]) G(K); + }); + } + return Y; + } + setEventHandler(X, Y) { + let Z = this._ensureEventSlot(X); + if (Z.onHandler && Y) console.warn(`[MCP Apps] on${String(X)} handler replaced. Use addEventListener("${String(X)}", \u2026) to add multiple listeners without replacing.`); + Z.onHandler = Y; + } + getEventHandler(X) { + return this._eventSlots.get(X)?.onHandler; + } + addEventListener(X, Y) { + this._ensureEventSlot(X).listeners.push(Y); + } + removeEventListener(X, Y) { + let Z = this._eventSlots.get(X); + if (!Z) return; + let $ = Z.listeners.indexOf(Y); + if ($ !== -1) Z.listeners.splice($, 1); + } + setRequestHandler = (X, Y) => { + this._assertMethodNotRegistered(X, "setRequestHandler"), super.setRequestHandler(X, Y); + }; + setNotificationHandler = (X, Y) => { + this._assertMethodNotRegistered(X, "setNotificationHandler"), super.setNotificationHandler(X, Y); + }; + warnIfRequestHandlerReplaced(X, Y, Z) { + if (Y && Z) console.warn(`[MCP Apps] ${X} handler replaced. Previous handler will no longer be called.`); + } + replaceRequestHandler = (X, Y) => { + let Z = X.shape.method.value; + this._registeredMethods.add(Z), super.setRequestHandler(X, Y); + }; + _assertMethodNotRegistered(X, Y) { + let Z = X.shape.method.value; + if (this._registeredMethods.has(Z)) throw Error(`Handler for "${Z}" already registered (via ${Y}). Use addEventListener() to attach multiple listeners, or the on* setter for replace semantics.`); + this._registeredMethods.add(Z); + } + }; + var E = "2026-01-26"; + var O = "ui/notifications/tool-input-partial"; + var j = class { + eventTarget; + eventSource; + messageListener; + constructor(X = window.parent, Y) { + this.eventTarget = X; + this.eventSource = Y; + this.messageListener = (Z) => { + if (Y && Z.source !== this.eventSource) { + console.debug("Ignoring message from unknown source", Z); + return; + } + let $ = JSONRPCMessageSchema.safeParse(Z.data); + if ($.success) console.debug("Parsed message", $.data), this.onmessage?.($.data); + else if (Z.data?.jsonrpc !== "2.0") console.debug("Ignoring non-JSON-RPC message", $.error.message, Z); + else console.error("Failed to parse message", $.error.message, Z), this.onerror?.(Error("Invalid JSON-RPC message received: " + $.error.message)); + }; + } + async start() { + window.addEventListener("message", this.messageListener); + } + async send(X, Y) { + if (X.method !== O) console.debug("Sending message", X); + this.eventTarget.postMessage(X, "*"); + } + async close() { + window.removeEventListener("message", this.messageListener), this.onclose?.(); + } + onclose; + onerror; + onmessage; + sessionId; + setProtocolVersion; + }; + var g = external_exports.union([external_exports.literal("light"), external_exports.literal("dark")]).describe("Color theme preference for the host environment."); + var W = external_exports.union([external_exports.literal("inline"), external_exports.literal("fullscreen"), external_exports.literal("pip")]).describe("Display mode for UI presentation."); + var LQ = external_exports.union([external_exports.literal("--color-background-primary"), external_exports.literal("--color-background-secondary"), external_exports.literal("--color-background-tertiary"), external_exports.literal("--color-background-inverse"), external_exports.literal("--color-background-ghost"), external_exports.literal("--color-background-info"), external_exports.literal("--color-background-danger"), external_exports.literal("--color-background-success"), external_exports.literal("--color-background-warning"), external_exports.literal("--color-background-disabled"), external_exports.literal("--color-text-primary"), external_exports.literal("--color-text-secondary"), external_exports.literal("--color-text-tertiary"), external_exports.literal("--color-text-inverse"), external_exports.literal("--color-text-ghost"), external_exports.literal("--color-text-info"), external_exports.literal("--color-text-danger"), external_exports.literal("--color-text-success"), external_exports.literal("--color-text-warning"), external_exports.literal("--color-text-disabled"), external_exports.literal("--color-border-primary"), external_exports.literal("--color-border-secondary"), external_exports.literal("--color-border-tertiary"), external_exports.literal("--color-border-inverse"), external_exports.literal("--color-border-ghost"), external_exports.literal("--color-border-info"), external_exports.literal("--color-border-danger"), external_exports.literal("--color-border-success"), external_exports.literal("--color-border-warning"), external_exports.literal("--color-border-disabled"), external_exports.literal("--color-ring-primary"), external_exports.literal("--color-ring-secondary"), external_exports.literal("--color-ring-inverse"), external_exports.literal("--color-ring-info"), external_exports.literal("--color-ring-danger"), external_exports.literal("--color-ring-success"), external_exports.literal("--color-ring-warning"), external_exports.literal("--font-sans"), external_exports.literal("--font-mono"), external_exports.literal("--font-weight-normal"), external_exports.literal("--font-weight-medium"), external_exports.literal("--font-weight-semibold"), external_exports.literal("--font-weight-bold"), external_exports.literal("--font-text-xs-size"), external_exports.literal("--font-text-sm-size"), external_exports.literal("--font-text-md-size"), external_exports.literal("--font-text-lg-size"), external_exports.literal("--font-heading-xs-size"), external_exports.literal("--font-heading-sm-size"), external_exports.literal("--font-heading-md-size"), external_exports.literal("--font-heading-lg-size"), external_exports.literal("--font-heading-xl-size"), external_exports.literal("--font-heading-2xl-size"), external_exports.literal("--font-heading-3xl-size"), external_exports.literal("--font-text-xs-line-height"), external_exports.literal("--font-text-sm-line-height"), external_exports.literal("--font-text-md-line-height"), external_exports.literal("--font-text-lg-line-height"), external_exports.literal("--font-heading-xs-line-height"), external_exports.literal("--font-heading-sm-line-height"), external_exports.literal("--font-heading-md-line-height"), external_exports.literal("--font-heading-lg-line-height"), external_exports.literal("--font-heading-xl-line-height"), external_exports.literal("--font-heading-2xl-line-height"), external_exports.literal("--font-heading-3xl-line-height"), external_exports.literal("--border-radius-xs"), external_exports.literal("--border-radius-sm"), external_exports.literal("--border-radius-md"), external_exports.literal("--border-radius-lg"), external_exports.literal("--border-radius-xl"), external_exports.literal("--border-radius-full"), external_exports.literal("--border-width-regular"), external_exports.literal("--shadow-hairline"), external_exports.literal("--shadow-sm"), external_exports.literal("--shadow-md"), external_exports.literal("--shadow-lg")]).describe("CSS variable keys available to MCP apps for theming."); + var BQ = external_exports.record(LQ.describe(`Style variables for theming MCP apps. + +Individual style keys are optional - hosts may provide any subset of these values. +Values are strings containing CSS values (colors, sizes, font stacks, etc.). + +Note: This type uses \`Record\` rather than \`Partial>\` +for compatibility with Zod schema generation. Both are functionally equivalent for validation.`), external_exports.union([external_exports.string(), external_exports.undefined()]).describe(`Style variables for theming MCP apps. + +Individual style keys are optional - hosts may provide any subset of these values. +Values are strings containing CSS values (colors, sizes, font stacks, etc.). + +Note: This type uses \`Record\` rather than \`Partial>\` +for compatibility with Zod schema generation. Both are functionally equivalent for validation.`)).describe(`Style variables for theming MCP apps. + +Individual style keys are optional - hosts may provide any subset of these values. +Values are strings containing CSS values (colors, sizes, font stacks, etc.). + +Note: This type uses \`Record\` rather than \`Partial>\` +for compatibility with Zod schema generation. Both are functionally equivalent for validation.`); + var _Q = external_exports.object({ method: external_exports.literal("ui/open-link"), params: external_exports.object({ url: external_exports.string().describe("URL to open in the host's browser") }) }); + var I = external_exports.object({ isError: external_exports.boolean().optional().describe("True if the host failed to open the URL (e.g., due to security policy).") }).passthrough(); + var F = external_exports.object({ isError: external_exports.boolean().optional().describe("True if the download failed (e.g., user cancelled or host denied).") }).passthrough(); + var q = external_exports.object({ isError: external_exports.boolean().optional().describe("True if the host rejected or failed to deliver the message.") }).passthrough(); + var EQ = external_exports.object({ method: external_exports.literal("ui/notifications/sandbox-proxy-ready"), params: external_exports.object({}) }); + var L = external_exports.object({ connectDomains: external_exports.array(external_exports.string()).optional().describe(`Origins for network requests (fetch/XHR/WebSocket). + +- Maps to CSP \`connect-src\` directive +- Empty or omitted \u2192 no network connections (secure default)`), resourceDomains: external_exports.array(external_exports.string()).optional().describe("Origins for static resources (images, scripts, stylesheets, fonts, media).\n\n- Maps to CSP `img-src`, `script-src`, `style-src`, `font-src`, `media-src` directives\n- Wildcard subdomains supported: `https://*.example.com`\n- Empty or omitted \u2192 no network resources (secure default)"), frameDomains: external_exports.array(external_exports.string()).optional().describe("Origins for nested iframes.\n\n- Maps to CSP `frame-src` directive\n- Empty or omitted \u2192 no nested iframes allowed (`frame-src 'none'`)"), baseUriDomains: external_exports.array(external_exports.string()).optional().describe("Allowed base URIs for the document.\n\n- Maps to CSP `base-uri` directive\n- Empty or omitted \u2192 only same origin allowed (`base-uri 'self'`)") }); + var B = external_exports.object({ camera: external_exports.object({}).optional().describe("Request camera access.\n\nMaps to Permission Policy `camera` feature."), microphone: external_exports.object({}).optional().describe("Request microphone access.\n\nMaps to Permission Policy `microphone` feature."), geolocation: external_exports.object({}).optional().describe("Request geolocation access.\n\nMaps to Permission Policy `geolocation` feature."), clipboardWrite: external_exports.object({}).optional().describe("Request clipboard write access.\n\nMaps to Permission Policy `clipboard-write` feature.") }); + var OQ = external_exports.object({ method: external_exports.literal("ui/notifications/size-changed"), params: external_exports.object({ width: external_exports.number().optional().describe("New width in pixels."), height: external_exports.number().optional().describe("New height in pixels.") }) }); + var P = external_exports.object({ method: external_exports.literal("ui/notifications/tool-input"), params: external_exports.object({ arguments: external_exports.record(external_exports.string(), external_exports.unknown().describe("Complete tool call arguments as key-value pairs.")).optional().describe("Complete tool call arguments as key-value pairs.") }) }); + var w = external_exports.object({ method: external_exports.literal("ui/notifications/tool-input-partial"), params: external_exports.object({ arguments: external_exports.record(external_exports.string(), external_exports.unknown().describe("Partial tool call arguments (incomplete, may change).")).optional().describe("Partial tool call arguments (incomplete, may change).") }) }); + var A = external_exports.object({ method: external_exports.literal("ui/notifications/tool-cancelled"), params: external_exports.object({ reason: external_exports.string().optional().describe('Optional reason for the cancellation (e.g., "user action", "timeout").') }) }); + var v = external_exports.object({ fonts: external_exports.string().optional() }); + var f = external_exports.object({ variables: BQ.optional().describe("CSS variables for theming the app."), css: v.optional().describe("CSS blocks that apps can inject.") }); + var R = external_exports.object({ method: external_exports.literal("ui/resource-teardown"), params: external_exports.object({}) }); + var zQ = external_exports.record(external_exports.string(), external_exports.unknown()); + var z = external_exports.object({ text: external_exports.object({}).optional().describe("Host supports text content blocks."), image: external_exports.object({}).optional().describe("Host supports image content blocks."), audio: external_exports.object({}).optional().describe("Host supports audio content blocks."), resource: external_exports.object({}).optional().describe("Host supports resource content blocks."), resourceLink: external_exports.object({}).optional().describe("Host supports resource link content blocks."), structuredContent: external_exports.object({}).optional().describe("Host supports structured content.") }); + var IQ = external_exports.object({ method: external_exports.literal("ui/notifications/request-teardown"), params: external_exports.object({}).optional() }); + var u = external_exports.object({ experimental: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.any()).describe("Experimental features keyed by identifier.")).optional().describe("Experimental features keyed by identifier."), openLinks: external_exports.object({}).optional().describe("Host supports opening external URLs."), downloadFile: external_exports.object({}).optional().describe("Host supports file downloads via ui/download-file."), serverTools: external_exports.object({ listChanged: external_exports.boolean().optional().describe("Host supports tools/list_changed notifications.") }).optional().describe("Host can proxy tool calls to the MCP server."), serverResources: external_exports.object({ listChanged: external_exports.boolean().optional().describe("Host supports resources/list_changed notifications.") }).optional().describe("Host can proxy resource reads to the MCP server."), logging: external_exports.object({}).optional().describe("Host accepts log messages."), sandbox: external_exports.object({ permissions: B.optional().describe("Permissions granted by the host (camera, microphone, geolocation)."), csp: L.optional().describe("CSP domains approved by the host.") }).optional().describe("Sandbox configuration applied by the host."), updateModelContext: z.optional().describe("Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns."), message: z.optional().describe("Host supports receiving content messages (ui/message) from the view."), sampling: external_exports.object({ tools: external_exports.object({}).optional().describe("Host supports tool use via `tools` and `toolChoice` parameters.") }).optional().describe("Host supports LLM sampling (sampling/createMessage) from the view.\nMirrors the MCP `ClientCapabilities.sampling` shape so hosts can pass it through.") }); + var d = external_exports.object({ experimental: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.any()).describe("Experimental features keyed by identifier.")).optional().describe("Experimental features keyed by identifier."), tools: external_exports.object({ listChanged: external_exports.boolean().optional().describe("App supports tools/list_changed notifications.") }).optional().describe("App exposes MCP-style tools that the host can call."), availableDisplayModes: external_exports.array(W).optional().describe("Display modes the app supports.") }); + var FQ = external_exports.object({ method: external_exports.literal("ui/notifications/initialized"), params: external_exports.object({}).optional() }); + var qQ = external_exports.object({ csp: L.optional().describe("Content Security Policy configuration for UI resources."), permissions: B.optional().describe("Sandbox permissions requested by the UI resource."), domain: external_exports.string().optional().describe(`Dedicated origin for view sandbox. + +Useful when views need stable, dedicated origins for OAuth callbacks, CORS policies, or API key allowlists. + +**Host-dependent:** The format and validation rules for this field are determined by each host. Servers MUST consult host-specific documentation for the expected domain format. Common patterns include: +- Hash-based subdomains (e.g., \`{hash}.claudemcpcontent.com\`) +- URL-derived subdomains (e.g., \`www-example-com.oaiusercontent.com\`) + +If omitted, host uses default sandbox origin (typically per-conversation).`), prefersBorder: external_exports.boolean().optional().describe(`Visual boundary preference - true if view prefers a visible border. + +Boolean requesting whether a visible border and background is provided by the host. Specifying an explicit value for this is recommended because hosts' defaults may vary. + +- \`true\`: request visible border + background +- \`false\`: request no visible border + background +- omitted: host decides border`) }); + var PQ = external_exports.object({ method: external_exports.literal("ui/request-display-mode"), params: external_exports.object({ mode: W.describe("The display mode being requested.") }) }); + var U = external_exports.object({ mode: W.describe("The display mode that was actually set. May differ from requested if not supported.") }).passthrough(); + var h = external_exports.union([external_exports.literal("model"), external_exports.literal("app")]).describe("Tool visibility scope - who can access the tool."); + var wQ = external_exports.object({ resourceUri: external_exports.string().optional(), visibility: external_exports.array(h).optional().describe(`Who can access this tool. Default: ["model", "app"] +- "model": Tool visible to and callable by the agent +- "app": Tool callable by the app from this server only`), csp: external_exports.never().optional(), permissions: external_exports.never().optional() }); + var YX = external_exports.object({ mimeTypes: external_exports.array(external_exports.string()).optional().describe('Array of supported MIME types for UI resources.\nMust include `"text/html;profile=mcp-app"` for MCP Apps support.') }); + var AQ = external_exports.object({ method: external_exports.literal("ui/download-file"), params: external_exports.object({ contents: external_exports.array(external_exports.union([EmbeddedResourceSchema, ResourceLinkSchema])).describe("Resource contents to download \u2014 embedded (inline data) or linked (host fetches). Uses standard MCP resource types.") }) }); + var RQ = external_exports.object({ method: external_exports.literal("ui/message"), params: external_exports.object({ role: external_exports.literal("user").describe('Message role, currently only "user" is supported.'), content: external_exports.array(ContentBlockSchema).describe("Message content blocks (text, image, etc.).") }) }); + var UQ = external_exports.object({ method: external_exports.literal("ui/notifications/sandbox-resource-ready"), params: external_exports.object({ html: external_exports.string().describe("HTML content to load into the inner iframe."), sandbox: external_exports.string().optional().describe("Optional override for the inner iframe's sandbox attribute."), csp: L.optional().describe("CSP configuration from resource metadata."), permissions: B.optional().describe("Sandbox permissions from resource metadata.") }) }); + var H = external_exports.object({ method: external_exports.literal("ui/notifications/tool-result"), params: CallToolResultSchema.describe("Standard MCP tool execution result.") }); + var T = external_exports.object({ toolInfo: external_exports.object({ id: RequestIdSchema.optional().describe("JSON-RPC id of the tools/call request."), tool: ToolSchema.describe("Tool definition including name, inputSchema, etc.") }).optional().describe("Metadata of the tool call that instantiated this App."), theme: g.optional().describe("Current color theme preference."), styles: f.optional().describe("Style configuration for theming the app."), displayMode: W.optional().describe("How the UI is currently displayed."), availableDisplayModes: external_exports.array(W).optional().describe("Display modes the host supports."), containerDimensions: external_exports.union([external_exports.object({ height: external_exports.number().describe("Fixed container height in pixels.") }), external_exports.object({ maxHeight: external_exports.union([external_exports.number(), external_exports.undefined()]).optional().describe("Maximum container height in pixels.") })]).and(external_exports.union([external_exports.object({ width: external_exports.number().describe("Fixed container width in pixels.") }), external_exports.object({ maxWidth: external_exports.union([external_exports.number(), external_exports.undefined()]).optional().describe("Maximum container width in pixels.") })])).optional().describe(`Container dimensions. Represents the dimensions of the iframe or other +container holding the app. Specify either width or maxWidth, and either height or maxHeight.`), locale: external_exports.string().optional().describe("User's language and region preference in BCP 47 format."), timeZone: external_exports.string().optional().describe("User's timezone in IANA format."), userAgent: external_exports.string().optional().describe("Host application identifier."), platform: external_exports.union([external_exports.literal("web"), external_exports.literal("desktop"), external_exports.literal("mobile")]).optional().describe("Platform type for responsive design decisions."), deviceCapabilities: external_exports.object({ touch: external_exports.boolean().optional().describe("Whether the device supports touch input."), hover: external_exports.boolean().optional().describe("Whether the device supports hover interactions.") }).optional().describe("Device input capabilities."), safeAreaInsets: external_exports.object({ top: external_exports.number().describe("Top safe area inset in pixels."), right: external_exports.number().describe("Right safe area inset in pixels."), bottom: external_exports.number().describe("Bottom safe area inset in pixels."), left: external_exports.number().describe("Left safe area inset in pixels.") }).optional().describe("Mobile safe area boundaries in pixels.") }).passthrough(); + var M = external_exports.object({ method: external_exports.literal("ui/notifications/host-context-changed"), params: T.describe("Partial context update containing only changed fields.") }); + var HQ = external_exports.object({ method: external_exports.literal("ui/update-model-context"), params: external_exports.object({ content: external_exports.array(ContentBlockSchema).optional().describe("Context content blocks (text, image, etc.)."), structuredContent: external_exports.record(external_exports.string(), external_exports.unknown().describe("Structured content for machine-readable context data.")).optional().describe("Structured content for machine-readable context data.") }) }); + var TQ = external_exports.object({ method: external_exports.literal("ui/initialize"), params: external_exports.object({ appInfo: ImplementationSchema.describe("App identification (name and version)."), appCapabilities: d.describe("Features and capabilities this app provides."), protocolVersion: external_exports.string().describe("Protocol version this app supports.") }) }); + var C = external_exports.object({ protocolVersion: external_exports.string().describe('Negotiated protocol version string (e.g., "2025-11-21").'), hostInfo: ImplementationSchema.describe("Host application identification and version."), hostCapabilities: u.describe("Features and capabilities provided by the host."), hostContext: T.describe("Rich context about the host environment.") }).passthrough(); + var MQ = { target: "draft-2020-12" }; + async function k(X, Y) { + let Z = X["~standard"]; + if (Z.jsonSchema) return Z.jsonSchema[Y](MQ); + if (Z.vendor === "zod") { + let { z: $ } = await Promise.resolve().then(() => (init_v4(), v4_exports)); + return $.toJSONSchema(X, { io: Y }); + } + throw Error(`Schema (vendor: ${Z.vendor}) does not implement Standard JSON Schema (~standard.jsonSchema). Use a library that does (zod v4, ArkType, Valibot) or wrap your schema accordingly.`); + } + async function b(X, Y, Z = "") { + let $ = await X["~standard"].validate(Y); + if ($.issues) { + let D = $.issues.map((J) => { + let K = J.path?.map((G) => typeof G === "object" ? G.key : G).join("."); + return K ? `${K}: ${J.message}` : J.message; + }).join("; "); + throw Error(Z + D); + } + return $.value; + } + var i = class _i extends _ { + _appInfo; + _capabilities; + options; + _hostCapabilities; + _hostInfo; + _hostContext; + _registeredTools = {}; + _initializedSent = false; + _assertInitialized(X) { + if (this._initializedSent) return; + let Y = `[ext-apps] App.${X}() called before connect() completed the ui/initialize handshake. Await app.connect() before calling this method, or move data loading to an ontoolresult handler.`; + if (this.options?.strict) throw Error(Y); + console.warn(`${Y}. This will throw in a future release.`); + } + eventSchemas = { toolinput: P, toolinputpartial: w, toolresult: H, toolcancelled: A, hostcontextchanged: M }; + static ONE_SHOT_EVENTS = /* @__PURE__ */ new Set(["toolinput", "toolinputpartial", "toolresult", "toolcancelled"]); + _everHadListener = /* @__PURE__ */ new Set(); + _assertHandlerTiming(X) { + if (!_i.ONE_SHOT_EVENTS.has(X) || this._everHadListener.has(X)) return; + if (this._everHadListener.add(X), !this._initializedSent) return; + let Y = `[ext-apps] "${String(X)}" handler registered after connect() completed the ui/initialize handshake. The host may have already sent this notification. Register handlers before calling app.connect().`; + if (this.options?.strict) throw Error(Y); + console.warn(Y); + } + setEventHandler(X, Y) { + if (Y) this._assertHandlerTiming(X); + super.setEventHandler(X, Y); + } + addEventListener(X, Y) { + this._assertHandlerTiming(X), super.addEventListener(X, Y); + } + onEventDispatch(X, Y) { + if (X === "hostcontextchanged") this._hostContext = { ...this._hostContext, ...Y }; + } + constructor(X, Y = {}, Z = { autoResize: true }) { + super(Z); + this._appInfo = X; + this._capabilities = Y; + this.options = Z; + if (!Z.allowUnsafeEval) external_exports.config({ jitless: true }); + this.setRequestHandler(PingRequestSchema, ($) => { + return console.log("Received ping:", $.params), {}; + }), this.setEventHandler("hostcontextchanged", void 0); + } + registerCapabilities(X) { + if (this.transport) throw Error("Cannot register capabilities after transport is established"); + this._capabilities = mergeCapabilities(this._capabilities, X); + } + registerTool(X, Y, Z) { + if (this._registeredTools[X]) throw Error(`Tool ${X} is already registered`); + let $ = this, D = () => { + if ($._initializedSent && $._capabilities.tools?.listChanged) $.sendToolListChanged(); + }, J = Y.inputSchema !== void 0, K = { title: Y.title, description: Y.description, inputSchema: Y.inputSchema, outputSchema: Y.outputSchema, annotations: Y.annotations, _meta: Y._meta, enabled: true, enable() { + this.enabled = true, D(); + }, disable() { + this.enabled = false, D(); + }, update(G) { + Object.assign(this, G), D(); + }, remove() { + if ($._registeredTools[X] !== K) return; + delete $._registeredTools[X], D(); + }, handler: async (G, N) => { + if (!K.enabled) throw Error(`Tool ${X} is disabled`); + let V; + if (J) { + let S = K.inputSchema, m = S ? await b(S, G ?? {}, `Invalid input for tool ${X}: `) : G ?? {}; + V = await Z(m, N); + } else V = await Z(N); + if (K.outputSchema && !V.isError) V.structuredContent = await b(K.outputSchema, V.structuredContent, `Invalid output for tool ${X}: `); + return V; + } }; + if (this._registeredTools[X] = K, !this._capabilities.tools && !this.transport) this.registerCapabilities({ tools: { listChanged: true } }); + return this.ensureToolHandlersInitialized(), D(), K; + } + _toolHandlersInitialized = false; + ensureToolHandlersInitialized() { + if (this._toolHandlersInitialized) return; + this._toolHandlersInitialized = true, this.oncalltool = async (X, Y) => { + let Z = this._registeredTools[X.name]; + if (!Z) throw Error(`Tool ${X.name} not found`); + return Z.handler(X.arguments, Y); + }, this.onlisttools = async (X, Y) => { + return { tools: await Promise.all(Object.entries(this._registeredTools).filter(([$, D]) => D.enabled).map(async ([$, D]) => { + let J = { name: $, title: D.title, description: D.description, inputSchema: D.inputSchema ? await k(D.inputSchema, "input") : { type: "object", properties: {} } }; + if (D.outputSchema) J.outputSchema = await k(D.outputSchema, "output"); + if (D.annotations) J.annotations = D.annotations; + if (D._meta) J._meta = D._meta; + return J; + })) }; + }; + } + async sendToolListChanged(X = {}) { + this._assertInitialized("sendToolListChanged"), await this.notification({ method: "notifications/tools/list_changed", params: X }); + } + getHostCapabilities() { + return this._hostCapabilities; + } + getHostVersion() { + return this._hostInfo; + } + getHostContext() { + return this._hostContext; + } + get ontoolinput() { + return this.getEventHandler("toolinput"); + } + set ontoolinput(X) { + this.setEventHandler("toolinput", X); + } + get ontoolinputpartial() { + return this.getEventHandler("toolinputpartial"); + } + set ontoolinputpartial(X) { + this.setEventHandler("toolinputpartial", X); + } + get ontoolresult() { + return this.getEventHandler("toolresult"); + } + set ontoolresult(X) { + this.setEventHandler("toolresult", X); + } + get ontoolcancelled() { + return this.getEventHandler("toolcancelled"); + } + set ontoolcancelled(X) { + this.setEventHandler("toolcancelled", X); + } + get onhostcontextchanged() { + return this.getEventHandler("hostcontextchanged"); + } + set onhostcontextchanged(X) { + this.setEventHandler("hostcontextchanged", X); + } + _onteardown; + get onteardown() { + return this._onteardown; + } + set onteardown(X) { + this.warnIfRequestHandlerReplaced("onteardown", this._onteardown, X), this._onteardown = X, this.replaceRequestHandler(R, (Y, Z) => { + if (!this._onteardown) throw Error("No onteardown handler set"); + return this._onteardown(Y.params, Z); + }); + } + _oncalltool; + get oncalltool() { + return this._oncalltool; + } + set oncalltool(X) { + this.warnIfRequestHandlerReplaced("oncalltool", this._oncalltool, X), this._oncalltool = X, this.replaceRequestHandler(CallToolRequestSchema, (Y, Z) => { + if (!this._oncalltool) throw Error("No oncalltool handler set"); + return this._oncalltool(Y.params, Z); + }); + } + _onlisttools; + get onlisttools() { + return this._onlisttools; + } + set onlisttools(X) { + this.warnIfRequestHandlerReplaced("onlisttools", this._onlisttools, X), this._onlisttools = X, this.replaceRequestHandler(ListToolsRequestSchema, (Y, Z) => { + if (!this._onlisttools) throw Error("No onlisttools handler set"); + return this._onlisttools(Y.params, Z); + }); + } + assertCapabilityForMethod(X) { + switch (X) { + case "sampling/createMessage": + if (!this._hostCapabilities?.sampling) throw Error(`Host does not support sampling (required for ${X})`); + break; + } + } + assertRequestHandlerCapability(X) { + switch (X) { + case "tools/call": + case "tools/list": + if (!this._capabilities.tools) throw Error(`Client does not support tool capability (required for ${X})`); + return; + case "ping": + case "ui/resource-teardown": + return; + default: + throw Error(`No handler for method ${X} registered`); + } + } + assertNotificationCapability(X) { + } + assertTaskCapability(X) { + throw Error("Tasks are not supported in MCP Apps"); + } + assertTaskHandlerCapability(X) { + throw Error("Task handlers are not supported in MCP Apps"); + } + async callServerTool(X, Y) { + if (this._assertInitialized("callServerTool"), typeof X === "string") throw Error(`callServerTool() expects an object as its first argument, but received a string ("${X}"). Did you mean: callServerTool({ name: "${X}", arguments: { ... } })?`); + return await this.request({ method: "tools/call", params: X }, CallToolResultSchema, { onprogress: () => { + }, resetTimeoutOnProgress: true, ...Y }); + } + async readServerResource(X, Y) { + return this._assertInitialized("readServerResource"), await this.request({ method: "resources/read", params: X }, ReadResourceResultSchema, Y); + } + async listServerResources(X, Y) { + return this._assertInitialized("listServerResources"), await this.request({ method: "resources/list", params: X }, ListResourcesResultSchema, Y); + } + async createSamplingMessage(X, Y) { + this._assertInitialized("createSamplingMessage"); + let Z = X.tools ? CreateMessageResultWithToolsSchema : CreateMessageResultSchema; + return await this.request({ method: "sampling/createMessage", params: X }, Z, Y); + } + sendMessage(X, Y) { + return this._assertInitialized("sendMessage"), this.request({ method: "ui/message", params: X }, q, Y); + } + sendLog(X) { + return this.notification({ method: "notifications/message", params: X }); + } + updateModelContext(X, Y) { + return this._assertInitialized("updateModelContext"), this.request({ method: "ui/update-model-context", params: X }, EmptyResultSchema, Y); + } + openLink(X, Y) { + return this._assertInitialized("openLink"), this.request({ method: "ui/open-link", params: X }, I, Y); + } + sendOpenLink = this.openLink; + downloadFile(X, Y) { + return this._assertInitialized("downloadFile"), this.request({ method: "ui/download-file", params: X }, F, Y); + } + requestTeardown(X = {}) { + return this.notification({ method: "ui/notifications/request-teardown", params: X }); + } + requestDisplayMode(X, Y) { + return this._assertInitialized("requestDisplayMode"), this.request({ method: "ui/request-display-mode", params: X }, U, Y); + } + sendSizeChanged(X) { + return this.notification({ method: "ui/notifications/size-changed", params: X }); + } + setupSizeChangedNotifications() { + let X = false, Y = 0, Z = 0, $ = () => { + if (X) return; + X = true, requestAnimationFrame(() => { + X = false; + let J = document.documentElement, K = J.style.height; + J.style.height = "max-content"; + let G = Math.ceil(J.getBoundingClientRect().height); + J.style.height = K; + let N = Math.ceil(window.innerWidth); + if (N !== Y || G !== Z) Y = N, Z = G, this.sendSizeChanged({ width: N, height: G }); + }); + }; + $(); + let D = new ResizeObserver($); + return D.observe(document.documentElement), D.observe(document.body), () => D.disconnect(); + } + async connect(X = new j(window.parent, window.parent), Y) { + if (this.transport) throw Error("App is already connected. Call close() before connecting again."); + this._initializedSent = false, await super.connect(X); + try { + let Z = await this.request({ method: "ui/initialize", params: { appCapabilities: this._capabilities, appInfo: this._appInfo, protocolVersion: E } }, C, Y); + if (Z === void 0) throw Error(`Server sent invalid initialize result: ${Z}`); + if (this._hostCapabilities = Z.hostCapabilities, this._hostInfo = Z.hostInfo, this._hostContext = Z.hostContext, await this.notification({ method: "ui/notifications/initialized" }), this._initializedSent = true, this.options?.autoResize) this.setupSizeChangedNotifications(); + } catch (Z) { + throw this.close(), Z; + } + } + }; + + // src/ui-core/tokens.ts + var TOKEN_CSS = ` +:root, [data-theme="light"] { + color-scheme: light; + /* \u6587\u5B57\u56DB\u6863\uFF08dsw label-primary/secondary/tertiary/caption\uFF1B + caption \u65E0\u72EC\u7ACB\u5BBF\u4E3B\u53D8\u91CF \u2192 tertiary \u540C\u6863 + \u5B57\u9762\u515C\u5E95\u533A\u5206\uFF09 */ + --at-label-primary: var(--color-text-primary, var(--foreground, #1a2233)); + --at-label-secondary: var(--color-text-secondary, var(--muted-foreground, #3d4a5c)); + --at-label-tertiary: var(--color-text-tertiary, var(--muted-foreground, #8a94a6)); + --at-label-caption: var(--color-text-tertiary, #9aa3b2); + /* \u80CC\u666F\u4E24\u6863\uFF08dsw specific-menu / bg-layer-2\uFF09 */ + --at-bg-menu: var(--color-background-secondary, var(--muted, #f7f8fa)); + --at-bg-layer-2: var(--color-background-primary, var(--card, #ffffff)); + /* \u63CF\u8FB9\u4E09\u6863\uFF08dsw border-l1/l2/l3\uFF1B\u5BBF\u4E3B\u5355\u6863 --border \u2192 \u4E09\u6863\u900F\u660E\u5EA6\u6D3E\u751F\uFF09 */ + --at-border-l1: var(--color-border-primary, var(--border, rgba(16, 24, 40, 0.08))); + --at-border-l2: var(--color-border-tertiary, var(--border, #e3e6eb)); + --at-border-l3: var(--color-border-secondary, var(--border, #c9cfd8)); + /* \u72B6\u6001\u70B9\u4E94\u7C7B\u8272\uFF08ongoing/idle/done/warning \u2192 --green/\u7070/--blue/--yellow \u6216\u81EA\u7ED8\uFF09 */ + --at-state-ongoing: var(--color-text-success, var(--green, #12a675)); + --at-state-error: var(--color-text-danger, var(--red, #e5484d)); + --at-state-idle: var(--color-text-disabled, #98a2b3); + --at-state-warning: var(--color-text-warning, var(--yellow, #f59e0b)); + --at-state-done: var(--color-text-info, var(--blue, #3e7bfa)); + /* \u4E1A\u52A1\u4E3B\u8272\uFF08dsw state-business-primary\uFF1A\u5F53\u524D\u4F1A\u8BDD\u9AD8\u4EAE/info Tag\uFF09 */ + --at-business: var(--color-text-info, var(--primary, #3e7bfa)); + /* \u9519\u8BEF\u6587\u672C\uFF08dsw state-error-primary\uFF09 */ + --at-error-text: var(--color-text-danger, var(--red, var(--destructive, #d93036))); + /* advisory \u8B66\u544A\u6587\u672C\u8272\uFF08\u6DF1\u7425\u73C0\u4FDD\u8BC1 11px \u5C0F\u5B57\u5BF9\u6BD4\u5EA6\uFF09 */ + --at-warning-text: var(--color-text-warning, var(--yellow, #b45309)); + /* \u9634\u5F71\u4E24\u6863\uFF08dsw elevation-prominent / elevation-panel\uFF09 */ + --at-shadow-prominent: var(--shadow-lg, 0 8px 28px rgba(16, 24, 40, 0.16)); + --at-shadow-panel: var(--shadow-md, 0 4px 16px rgba(16, 24, 40, 0.12)); + /* \u6EDA\u52A8\u6761\uFF08dsh scrollbar \u4EE4\u724C\u81EA\u7ED8\uFF09 */ + --at-scrollbar-thumb: color-mix(in srgb, var(--at-label-tertiary) 40%, transparent); + --at-scrollbar-thumb-hover: color-mix(in srgb, var(--at-label-tertiary) 60%, transparent); + /* \u5B57\u4F53\uFF08\u4E0D\u5F15\u5916\u90E8\u5B57\u4F53\uFF0C\u8DDF\u968F\u5BBF\u4E3B UI \u5B57\u4F53\u6808\uFF09 */ + --at-font: var(--font-sans, -apple-system, "PingFang SC", "Segoe UI", sans-serif); +} +[data-theme="dark"] { + color-scheme: dark; + --at-label-primary: var(--color-text-primary, var(--foreground, #e8eaf0)); + --at-label-secondary: var(--color-text-secondary, var(--muted-foreground, #c0c6d2)); + --at-label-tertiary: var(--color-text-tertiary, var(--muted-foreground, #8d95a3)); + --at-label-caption: var(--color-text-tertiary, #7d8593); + --at-bg-menu: var(--color-background-secondary, var(--muted, #1b1e24)); + --at-bg-layer-2: var(--color-background-primary, var(--card, #23262d)); + --at-border-l1: var(--color-border-primary, var(--border, rgba(255, 255, 255, 0.08))); + --at-border-l2: var(--color-border-tertiary, var(--border, #333842)); + --at-border-l3: var(--color-border-secondary, var(--border, #434a56)); + --at-state-ongoing: var(--color-text-success, var(--green, #2fbf8f)); + --at-state-error: var(--color-text-danger, var(--red, #ff6b6e)); + --at-state-idle: var(--color-text-disabled, #7d8593); + --at-state-warning: var(--color-text-warning, var(--yellow, #ffb454)); + --at-state-done: var(--color-text-info, var(--blue, #6c9cff)); + --at-business: var(--color-text-info, var(--primary, #6c9cff)); + --at-error-text: var(--color-text-danger, var(--red, var(--destructive, #ff8a8d))); + /* advisory \u8B66\u544A\u6587\u672C\u8272 */ + --at-warning-text: var(--color-text-warning, var(--yellow, #ffb454)); + --at-shadow-prominent: var(--shadow-lg, 0 8px 28px rgba(0, 0, 0, 0.5)); + --at-shadow-panel: var(--shadow-md, 0 4px 16px rgba(0, 0, 0, 0.4)); +} +`; + + // src/ui-core/css.ts + var COMPONENT_CSS = ` +${TOKEN_CSS} +* { box-sizing: border-box; } +.at-root { + font-family: var(--at-font); + font-size: 13px; + line-height: 1.5; + color: var(--at-label-primary); + width: 100%; +} +/* \xA710.3 \u9762\u677F\uFF1A\u5BBD min(500px, \u5BB9\u5668\u221232px)\uFF1B\u7D27\u51D1 min(320px,\u2026)\uFF1B\u6700\u5927\u9AD8 min(680px, \u89C6\u53E3\u221232px)\uFF1B + \u5706\u89D2 12\uFF1Bpadding 8px 2px 0\uFF1Bflex column\uFF1Boverflow hidden\uFF1Belevation-prominent \u9634\u5F71\uFF1B + border-l1 \u63CF\u8FB9\uFF08stroke \u7B49\u4EF7\uFF0C\u65E0 border\uFF09 */ +.team-panel { + width: min(500px, 100% - 32px); + max-height: min(680px, 100vh - 32px); + border-radius: 12px; + box-shadow: var(--at-shadow-prominent); + outline: 0.5px solid var(--at-border-l1); + background: var(--at-bg-menu); + padding: 8px 2px 0; + display: flex; + flex-direction: column; + overflow: hidden; + position: relative; +} +.team-panel.compact { width: min(320px, 100% - 32px); } +/* \xA710.3 body\uFF1Aoverflow-y auto\uFF1Bscrollbar-gutter stable\uFF1Bpadding 0 9px 16px 14px */ +.panel-body { + overflow-y: auto; + scrollbar-gutter: stable; + padding: 0 9px 16px 14px; + flex: auto; + min-height: 0; + scrollbar-color: var(--at-scrollbar-thumb) transparent; +} +.panel-body::-webkit-scrollbar { width: 8px; } +.panel-body::-webkit-scrollbar-thumb { + background: var(--at-scrollbar-thumb); + border-radius: 4px; +} +.panel-body::-webkit-scrollbar-thumb:hover { background: var(--at-scrollbar-thumb-hover); } +/* \xA710.5 \u8282\u6807\u9898\uFF1A13px/500\uFF0Cmargin 16px 0 8px 4px\uFF08\u9996\u8282 top 8px\uFF09\uFF0Cgap 8\uFF1B + count 12px/16px tabular-nums caption \u8272 */ +.panel-body h3 { + font-size: 13px; + font-weight: 500; + color: var(--at-label-primary); + margin: 16px 0 8px 4px; + display: flex; + align-items: center; + gap: 8px; +} +.panel-body section:first-of-type h3 { margin-top: 8px; } +h3 .count { + font-size: 12px; + line-height: 16px; + font-weight: 400; + color: var(--at-label-caption); + font-variant-numeric: tabular-nums; +} +/* \xA710.5 \u82B1\u540D\u518C\u7F51\u683C\uFF1A\u53CC\u5217 minmax(0,1fr) gap 8\uFF1B\u7D27\u51D1\u5355\u5217 */ +.roster { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } +.compact .roster { grid-template-columns: minmax(0, 1fr); } +/* \xA710.5 \u6210\u5458\u5361\uFF1A\u5706\u89D2 8\uFF1Bpadding 10px 12px\uFF1Bgap 8\uFF1Bbg-layer-2\uFF1B\u63CF\u8FB9 border-l2\uFF08stroke \u7B49\u4EF7\uFF09\uFF1B + \u6587\u5B57\u5DE6\u5BF9\u9F50\uFF1Bflex \u9876\u5BF9\u9F50\uFF1Bhover\uFF08\u975E\u7981\u7528\uFF09border-l3 + elevation-panel\uFF1Bdisabled cursor default */ +.member { + border-radius: 8px; + padding: 10px 12px; + gap: 8px; + background: var(--at-bg-layer-2); + box-shadow: 0 0 0 0.5px var(--at-border-l2); + border: none; + text-align: left; + display: flex; + align-items: flex-start; + font: inherit; + color: inherit; + min-width: 0; + cursor: pointer; +} +.member:disabled { cursor: default; } +.member:not(:disabled):hover, +.member:not(:disabled):focus-visible { + box-shadow: 0 0 0 0.5px var(--at-border-l3), var(--at-shadow-panel); +} +/* \u5F53\u524D\u4F1A\u8BDD\u9AD8\u4EAE\uFF08\u4EC5 members>1\uFF09\uFF1Abusiness 40% \u6DF7\u8272\u63CF\u8FB9 + inset 1px \u5185\u73AF */ +.member.current { + box-shadow: 0 0 0 0.5px color-mix(in srgb, var(--at-business) 40%, transparent), + inset 0 0 0 1px color-mix(in srgb, var(--at-business) 40%, transparent); +} +/* \u540D\u5B57/\u6B21\u884C\u6587\u672C\u5217\uFF08\xA710.5 memberText\uFF1Acolumn\uFF0Cmin-width 0 \u4F9B ellipsis\uFF09 */ +.member .member-text { display: flex; flex-direction: column; min-width: 0; gap: 2px; } +.member .row1 { display: inline-flex; align-items: center; gap: 5px; min-width: 0; max-width: 100%; } +/* \u72B6\u6001\u70B9\u5BB9\u5668\uFF1A1lh \u9AD8\u5782\u76F4\u5BF9\u9F50\uFF08\xA710.5 memberDot\uFF09 */ +.member-dot { flex: none; align-items: center; height: 1lh; display: inline-flex; } +.member .name { + font-weight: 500; + color: var(--at-label-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + min-width: 0; +} +.member .sub { + font-size: 11px; + color: var(--at-label-tertiary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} +/* hover/focus \u624D\u663E\u793A\u300C \xB7 \u6A21\u578B: model\u300D\uFF08\xA710.5/V06\uFF09 */ +.member .model { display: none; } +.member:hover .model, +.member:focus-visible .model { display: inline; } +.member .diagnostic { + font-size: 11px; + color: var(--at-error-text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} +/* \u5F53\u524D\u4F1A\u8BDD Tag\uFF0810px/15px\uFF0Cpadding 0 4px\uFF0Cinfo tone\uFF09 */ +.current-tag { + font-size: 10px; + line-height: 15px; + padding: 0 4px; + border-radius: 4px; + background: color-mix(in srgb, var(--at-business) 16%, transparent); + color: var(--at-business); + flex: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +/* 0.4.0 \u6CE8\u9500\u6210\u5458\u5361/\u9F7F\u8F6E\u4E0E\u8BBE\u7F6E\u5F39\u7A97\u6837\u5F0F\uFF08member-card\u3001member-gear\u3001settings \u7CFB\u5217\u3001 + source-badge\u3001modal-select\uFF09\uFF1A\u6210\u5458\u6A21\u578B\u552F\u4E00\u8DEF\u7EBF = \u6BCF\u8F6E\u8DDF\u968F Lead\uFF0C\u9762\u677F\u6062\u590D\u96F6\u53D8\u66F4\u901A\u9053\u3002 */ +/* \u72B6\u6001\u70B9\uFF1A\u76F4\u5F84\u4E00\u81F4 8px\uFF08V06\uFF09 */ +.dot { width: 8px; height: 8px; border-radius: 50%; flex: none; display: inline-block; } +.dot.ongoing { background: var(--at-state-ongoing); } +.dot.error { background: var(--at-state-error); } +.dot.idle { background: var(--at-state-idle); } +.dot.warning { background: var(--at-state-warning); } +.dot.done { background: var(--at-state-done); } +/* inactive \u4EBA\u5F62\u56FE\u6807\uFF1A14px tertiary\uFF08\xA710.5/V06\uFF09 */ +.icon-user { width: 14px; height: 14px; flex: none; color: var(--at-label-tertiary); display: inline-flex; } +/* \xA710.4 \u901A\u77E5\u6761\uFF1Aflex gap 6 padding 9 \u5B57\u53F7 12\uFF1Berror = \u9519\u8BEF\u8272\uFF1B\u6309\u5E8F\u6E32\u67D3 */ +.notice, .error-bar { + display: flex; + align-items: center; + gap: 6px; + padding: 9px; + font-size: 12px; +} +.error-bar { color: var(--at-error-text); } +.notice { color: var(--at-label-secondary); } +/* \xA710.6 \u4EFB\u52A1\u677F\uFF1A\u7A7A\u677F\u6BB5\u843D 12px tertiary margin 16px 0 0 4px\uFF1B\u5217\u8868 flex column gap 7 */ +.empty-notice { font-size: 12px; color: var(--at-label-tertiary); margin: 16px 0 0 4px; } +.tasks { display: flex; flex-direction: column; gap: 7px; } +/* \u4EFB\u52A1\u5361\uFF1Aborder 0.5px border-l2\uFF1B\u5706\u89D2 9\uFF1Bpadding 11px 13px\uFF1Bbg-layer-2 */ +article.task { + border: 0.5px solid var(--at-border-l2); + border-radius: 9px; + padding: 11px 13px; + background: var(--at-bg-layer-2); +} +.task .title-row { display: flex; align-items: center; gap: 8px; } +.task strong { font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--at-label-primary); } +/* \u72B6\u6001\u5FBD\u6807\u53F3\u5BF9\u9F50 11px gap 6 */ +.task .task-state { + margin-left: auto; + font-size: 11px; + color: var(--at-label-tertiary); + display: inline-flex; + align-items: center; + gap: 6px; + flex: none; +} +/* \u63CF\u8FF0 12px/18px pre-wrap margin 5px 0\uFF1B\u4E24\u884C\u622A\u65AD */ +.task p { + font-size: 12px; + line-height: 18px; + color: var(--at-label-secondary); + white-space: pre-wrap; + margin: 5px 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} +.task p.expanded { -webkit-line-clamp: unset; display: block; } +/* \u5C55\u5F00\u5F00\u5173\uFF1Afloat right\uFF1B11px/20px\uFF1Bchevron 12px \u65CB\u8F6C 180\xB0 transition .12s */ +.expand-toggle { + float: right; + font-size: 11px; + line-height: 20px; + color: var(--at-label-tertiary); + background: none; + border: none; + cursor: pointer; + padding: 0; + margin-left: 10px; + font-family: inherit; + display: inline-flex; + align-items: center; + gap: 2px; +} +.expand-toggle:hover, .expand-toggle:focus-visible { color: var(--at-label-primary); } +.expand-toggle svg { transition: transform 0.12s; } +.expand-toggle.open svg { transform: rotate(180deg); } +.expand-toggle[hidden] { display: none; } +/* meta \u884C\uFF1A11px/20px\uFF1B\u5B50\u9879\u95F4\u8DDD 10px\uFF1Bwarning \u63D0\u9192\u8272\uFF08advisory \u975E\u9519\u8BEF\uFF09 */ +.task .meta { font-size: 11px; line-height: 20px; color: var(--at-label-tertiary); } +.task .meta > span { margin-right: 10px; } +.task .meta .warning { color: var(--at-warning-text); } +/* T5.7 \u6210\u5458\u4F1A\u8BDD\u67E5\u770B\u89C6\u56FE\uFF08V16\uFF1A\u65E0 DSH \u53C2\u7167\uFF0C\u5BBF\u4E3B\u98CE\u683C\uFF1B\u5224\u636E=\u4E0D\u7834\u7248+\u51E0\u4F55\u4E00\u81F4\uFF09 */ +.detail-view { display: flex; flex-direction: column; min-height: 0; flex: auto; } +.detail-head { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 9px 8px 6px; + border-bottom: 0.5px solid var(--at-border-l2); + flex: none; +} +.detail-back { + display: inline-flex; + align-items: center; + gap: 4px; + background: none; + border: none; + color: var(--at-label-tertiary); + font: inherit; + font-size: 12px; + cursor: pointer; + padding: 2px 6px; + border-radius: 6px; +} +.detail-back:hover, .detail-back:focus-visible { color: var(--at-label-primary); background: color-mix(in srgb, var(--at-label-tertiary) 10%, transparent); } +.detail-title { font-size: 13px; font-weight: 500; color: var(--at-label-primary); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.detail-actions { margin-left: auto; display: inline-flex; gap: 6px; flex: none; } +.detail-action { + background: none; + border: 0.5px solid var(--at-border-l2); + border-radius: 6px; + color: var(--at-label-secondary); + font: inherit; + font-size: 11px; + line-height: 18px; + padding: 1px 8px; + cursor: pointer; +} +.detail-action:hover, .detail-action:focus-visible { color: var(--at-label-primary); border-color: var(--at-border-l3); } +.detail-list { overflow-y: auto; scrollbar-gutter: stable; padding: 8px 9px 16px 14px; flex: auto; min-height: 0; scrollbar-color: var(--at-scrollbar-thumb) transparent; } +.detail-state { font-size: 12px; color: var(--at-label-tertiary); padding: 16px 4px; display: flex; align-items: center; gap: 6px; } +.detail-state.error { color: var(--at-error-text); } +.msg { margin: 0 0 10px; min-width: 0; } +.msg-head { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--at-label-tertiary); margin-bottom: 2px; } +.msg-role { font-weight: 500; color: var(--at-label-secondary); } +.msg-time { font-variant-numeric: tabular-nums; } +.msg-text { + font-size: 12px; + line-height: 18px; + color: var(--at-label-primary); + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: anywhere; +} +.msg.user .msg-text { color: var(--at-label-secondary); } +.msg-badge { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 10px; + line-height: 15px; + padding: 0 4px; + border-radius: 4px; + background: color-mix(in srgb, var(--at-business) 16%, transparent); + color: var(--at-business); +} +.msg-badge.hook { background: color-mix(in srgb, var(--at-label-tertiary) 14%, transparent); color: var(--at-label-tertiary); } +.tool-row { display: block; width: 100%; text-align: left; background: none; border: none; border-top: 0.5px solid var(--at-border-l2); padding: 4px 0; margin-top: 4px; font: inherit; cursor: pointer; color: var(--at-label-tertiary); } +.tool-row:hover, .tool-row:focus-visible { color: var(--at-label-primary); } +.tool-static { display: block; border-top: 0.5px solid var(--at-border-l2); padding: 4px 0; margin-top: 4px; color: var(--at-label-tertiary); } +.tool-row .tool-summary, .tool-static .tool-summary { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; line-height: 20px; } +.tool-row .tool-name, .tool-static .tool-name { font-weight: 500; color: var(--at-label-secondary); } +.tool-row svg { transition: transform 0.12s; } +.tool-row.open svg { transform: rotate(180deg); } +.tool-detail { + display: none; + font-size: 11px; + line-height: 16px; + color: var(--at-label-tertiary); + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: anywhere; + max-height: 200px; + overflow-y: auto; + margin: 2px 0 0 18px; +} +.tool-row.open + .tool-detail { display: block; } +/* toolGroup\uFF1A\u6309\u8F6E\u52A8\u4F5C\u7EC4\uFF08\u5934\u90E8\u4E00\u884C\u6C47\u603B\uFF1B\u5C55\u5F00\u9010\u6761\u5DE5\u5177\u884C\uFF0C\u7F29\u8FDB\u5BF9\u9F50 tool-detail\uFF09 */ +.tool-group-head { + display: flex; + align-items: center; + gap: 6px; + width: 100%; + text-align: left; + background: none; + border: none; + border-top: 0.5px solid var(--at-border-l2); + padding: 4px 0; + margin-top: 4px; + font: inherit; + color: var(--at-label-tertiary); + cursor: pointer; +} +.tool-group-head:hover, .tool-group-head:focus-visible { color: var(--at-label-primary); } +.tool-group-head .tool-group-label { font-size: 11px; line-height: 20px; color: var(--at-label-secondary); } +.tool-group-head:hover .tool-group-label, +.tool-group-head:focus-visible .tool-group-label { color: var(--at-label-primary); } +.tool-group-head svg { flex: none; transition: transform 0.12s; } +.tool-group.open .tool-group-head svg { transform: rotate(180deg); } +.tool-group-items { display: none; margin-left: 18px; } +.tool-group.open .tool-group-items { display: block; } +.tool-group-items > :first-child { border-top: none; } +.detail-pager { display: flex; align-items: center; gap: 8px; padding: 4px 0 8px; } +.detail-pager .detail-action[disabled] { opacity: 0.45; cursor: default; } +`; + var PANEL_CSS = ` +html, body { margin: 0; padding: 0; height: 100%; } +body { background: transparent; } +.at-root { height: 100%; display: flex; align-items: flex-start; justify-content: center; padding: 16px 0; } +.team-panel { margin: 0 auto; } +/* \u4F5C\u8005\u6837\u5F0F\u8868\u4E2D\u7684 display \u58F0\u660E\u4F1A\u8986\u76D6 UA \u7684 [hidden]{display:none}\uFF08\u5982 .detail-view \u7684 + display:flex\uFF09\uFF1A\u5217\u8868\u2194\u8BE6\u60C5\u5207\u6362\u5FC5\u987B\u7531 hidden \u771F\u6B63\u9690\u85CF\uFF0C\u5426\u5219\u8FD4\u56DE\u5217\u8868\u540E\u8BE6\u60C5\u6B8B\u7559\u5728\u4E0B\u65B9\u3002 */ +.team-panel [hidden] { display: none !important; } +`; + + // src/ui-core/dict.ts + var DICT = { + zh: { + trigger: "\u667A\u80FD\u4F53\u56E2\u961F", + loading: "\u6B63\u5728\u52A0\u8F7D\u56E2\u961F\u2026", + unavailable: "Team \u6682\u4E0D\u53EF\u7528", + failure: "\u56E2\u961F\u6301\u4E45\u8BB0\u5F55\u65E0\u6548\uFF1A{message}", + empty: "\u6682\u65E0\u5171\u4EAB\u4EFB\u52A1\uFF0C\u53EF\u4EE5\u901A\u8FC7\u5BF9\u8BDD\u521B\u5EFA", + roster: "\u6210\u5458", + tasks: "\u5171\u4EAB\u4EFB\u52A1", + model: "\u6A21\u578B", + open: "\u6253\u5F00\u6210\u5458\u4F1A\u8BDD", + current: "\u5F53\u524D\u4F1A\u8BDD", + owner: "Owner", + unowned: "\u672A\u5206\u914D", + blockedBy: "\u4F9D\u8D56", + writeScopes: "\u5199\u5165\u8303\u56F4", + ready: "\u53EF\u5F00\u59CB", + blocked: "\u88AB\u4F9D\u8D56\u963B\u585E", + "task.expand": "\u5C55\u5F00", + "task.collapse": "\u6536\u8D77", + "memberStatus.running": "\u8FD0\u884C\u4E2D", + "memberStatus.inactive": "\u672A\u8FD0\u884C", + "memberStatus.provisioning": "\u51C6\u5907\u4E2D", + "memberStatus.failed": "\u5931\u8D25", + "status.pending": "\u5F85\u5904\u7406", + "status.in_progress": "\u8FDB\u884C\u4E2D", + "status.completed": "\u5DF2\u5B8C\u6210" + }, + en: { + trigger: "Agent Team", + loading: "Loading Team\u2026", + unavailable: "Team is unavailable", + failure: "Invalid persisted Team record: {message}", + empty: "No shared tasks yet. Create them through the conversation.", + roster: "Members", + tasks: "Shared tasks", + model: "Model", + open: "Open member conversation", + current: "Current chat", + owner: "Owner", + unowned: "Unowned", + blockedBy: "Blocked by", + writeScopes: "Write scopes", + ready: "Ready", + blocked: "Blocked by dependencies", + "task.expand": "Show more", + "task.collapse": "Show less", + "memberStatus.running": "Running", + "memberStatus.inactive": "Inactive", + "memberStatus.provisioning": "Provisioning", + "memberStatus.failed": "Failed", + "status.pending": "Pending", + "status.in_progress": "In progress", + "status.completed": "Completed" + } + }; + var DETAIL_DICT = { + zh: { + "detail.back": "\u8FD4\u56DE", + "detail.title": "\u6210\u5458\u4F1A\u8BDD", + "detail.loading": "\u6B63\u5728\u52A0\u8F7D\u4F1A\u8BDD\u2026", + "detail.empty": "\u8BE5\u6210\u5458\u6682\u65E0\u4F1A\u8BDD\u6D88\u606F", + "detail.failed": "\u4F1A\u8BDD\u8BFB\u53D6\u5931\u8D25\uFF1A{message}", + "detail.refresh": "\u5237\u65B0", + "detail.copySessionId": "\u590D\u5236\u4F1A\u8BDD id", + "detail.copied": "\u5DF2\u590D\u5236", + "detail.earlier": "\u66F4\u65E9\u6D88\u606F", + "detail.wake": "\u8BF7\u6C42 Lead \u5524\u9192\u8BE5\u6210\u5458", + "detail.wakeInjected": "\u5DF2\u6CE8\u5165\u4E0B\u4E00\u8F6E\uFF1A\u8BF7\u6C42\u5524\u9192 {name}", + "detail.framedFrom": "Team \u6D88\u606F \xB7 \u6765\u81EA {name}", + "detail.hookBadge": "hook \u6CE8\u5165", + "detail.toolCall": "\u5DE5\u5177\u8C03\u7528", + "detail.noSession": "\u4F1A\u8BDD id \u672A\u843D\u5B9A\uFF08\u6210\u5458\u53EF\u80FD\u5C1A\u5728\u51C6\u5907\u4E2D\uFF09", + "detail.you": "\u6211", + "detail.count": "{n} \u6761", + "detail.toolGroup": "{n} \u4E2A\u52A8\u4F5C \xB7 {list}", + "detail.countSummary": "{n} \u6761 \xB7 \u5171 {sourceTotal} \u6761\u8F6C\u5F55" + }, + en: { + "detail.back": "Back", + "detail.title": "Member conversation", + "detail.loading": "Loading conversation\u2026", + "detail.empty": "No conversation messages for this member yet", + "detail.failed": "Conversation read failed: {message}", + "detail.refresh": "Refresh", + "detail.copySessionId": "Copy session id", + "detail.copied": "Copied", + "detail.earlier": "Earlier messages", + "detail.wake": "Ask Lead to wake this member", + "detail.wakeInjected": "Injected for next turn: wake request for {name}", + "detail.framedFrom": "Team message \xB7 from {name}", + "detail.hookBadge": "hook injected", + "detail.toolCall": "Tool call", + "detail.noSession": "Session id not settled yet (member may still be provisioning)", + "detail.you": "me", + "detail.count": "{n} items", + "detail.toolGroup": "{n} actions \xB7 {list}", + "detail.countSummary": "{n} items \xB7 of {sourceTotal} transcript items" + } + }; + function t(lang2, key, vars) { + return interpolate(DICT[lang2][key], vars); + } + function td(lang2, key, vars) { + return interpolate(DETAIL_DICT[lang2][key], vars); + } + function interpolate(template, vars) { + if (vars === void 0) return template; + return template.replace( + /\{(\w+)\}/g, + (m, k2) => k2 in vars ? String(vars[k2]) : m + ); + } + function langOfLocale(locale) { + return typeof locale === "string" && locale.toLowerCase().startsWith("zh") ? "zh" : "en"; + } + function statusKey(status) { + return status === "deleted" ? "status.completed" : `status.${status}`; + } + function memberStatusKey(status) { + return `memberStatus.${status}`; + } + + // src/ui-core/icons.ts + var svg = (inner, size) => ``; + function iconUser(size = 14) { + return svg('', size); + } + function iconChevron(size = 12) { + return svg('', size); + } + function iconArrowLeft(size = 14) { + return svg('', size); + } + + // src/ui-core/escape.ts + function esc2(s) { + return s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); + } + + // src/ui-core/render.ts + function isCompact(frame2) { + return frame2.members.length === 1 && frame2.tasks.length === 0; + } + function currentMemberId(frame2) { + const sid = frame2.meta.sessionId; + if (sid === void 0) return void 0; + return frame2.members.find((m) => m.sessionId === sid)?.id; + } + function isMemberDisabled(m, currentId) { + return m.id === currentId || m.status === "failed" || m.status === "provisioning"; + } + function memberDot(status) { + switch (status) { + case "running": + case "provisioning": + return "ongoing"; + case "failed": + return "error"; + case "inactive": + default: + return "icon"; + } + } + function taskDot(task) { + switch (task.status) { + case "in_progress": + return "ongoing"; + case "completed": + return "done"; + case "deleted": + return "idle"; + // 上游 deleted→idle(视图通常不含墓碑,防御口径) + case "pending": + default: + return task.ready ? "idle" : "warning"; + } + } + function dot(state) { + return ``; + } + function memberIndicator(m) { + const d2 = memberDot(m.status); + const inner = d2 === "icon" ? `${iconUser(14)}` : dot(d2); + return `${inner}`; + } + function renderMember(m, opts) { + const { lang: lang2, isCurrent, disabled } = opts; + const highlight = opts.highlightCurrent ?? isCurrent; + const cls = ["member", highlight ? "current" : ""].filter(Boolean).join(" "); + const nameRow = `${esc2(m.target)}` + (isCurrent ? `${esc2(t(lang2, "current"))}` : "") + ``; + const modelSuffix = m.model !== void 0 ? ` \xB7 ${esc2(t(lang2, "model"))}: ${esc2(m.model)}` : ""; + const sub = `${esc2(t(lang2, memberStatusKey(m.status)))}${modelSuffix}`; + const diag = m.diagnostics.length > 0 ? `${esc2(m.diagnostics[0])}` : ""; + const openAttr = disabled ? "" : ` title="${esc2(t(lang2, "open"))}"`; + return ``; + } + function renderRoster(frame2, lang2) { + const members = frame2.members; + const currentId = currentMemberId(frame2); + const countHtml = members.length > 1 ? `${members.length}` : ""; + const cards = members.map( + (m) => renderMember(m, { + lang: lang2, + // Tag 恒随当前会话;高亮/描边才受 members>1 限制(上游 TeamAction 同口径)。 + isCurrent: m.id === currentId, + highlightCurrent: m.id === currentId && members.length > 1, + disabled: isMemberDisabled(m, currentId) + }) + ).join(""); + return `

${esc2(t(lang2, "roster"))}${countHtml}

${cards}
`; + } + function renderTaskMeta(task, lang2, leadingHtml = "") { + const spans = []; + spans.push(`${esc2(task.id)}`); + const owner = task.ownerName !== void 0 ? esc2(task.ownerName) : esc2(t(lang2, "unowned")); + spans.push(`${esc2(t(lang2, "owner"))}: ${owner}`); + if (task.status === "pending") { + spans.push(`${esc2(t(lang2, task.ready ? "ready" : "blocked"))}`); + } + if (task.blockedBy.length > 0) { + spans.push(`${esc2(t(lang2, "blockedBy"))}: ${task.blockedBy.map(esc2).join(", ")}`); + } + if (task.writeScopes.length > 0) { + spans.push(`${esc2(t(lang2, "writeScopes"))}: ${task.writeScopes.map(esc2).join(", ")}`); + } + for (const w2 of task.writeScopeWarnings) { + spans.push(`${esc2(w2)}`); + } + return `
${leadingHtml}${spans.join("")}
`; + } + function renderTask(task, lang2) { + const state = `${dot(taskDot(task))}${esc2(t(lang2, statusKey(task.status)))}`; + const titleRow = `
${esc2(task.subject)}${state}
`; + const toggle = ``; + const desc = `

${esc2(task.description)}

`; + return `
` + titleRow + desc + renderTaskMeta(task, lang2, toggle) + `
`; + } + function renderTasks(frame2, lang2) { + if (frame2.tasks.length === 0) { + return `

${esc2(t(lang2, "empty"))}

`; + } + const cards = frame2.tasks.map((task) => renderTask(task, lang2)).join(""); + return `

${esc2(t(lang2, "tasks"))}${frame2.tasks.length}

${cards}
`; + } + function renderNotices(opts) { + const { lang: lang2 } = opts; + const out = []; + if (opts.navError !== void 0) { + out.push(``); + } + if (opts.loading === true) { + out.push(`
${dot("ongoing")}${esc2(t(lang2, "loading"))}
`); + } else if (opts.noTeam === true) { + out.push(`
${dot("warning")}${esc2(t(lang2, "unavailable"))}
`); + } + if (opts.failure !== void 0) { + out.push(``); + } + return out.join(""); + } + function renderPanelBody(frame2, lang2, runtime) { + const noTeam = frame2.team === null; + const notices = renderNotices({ + lang: lang2, + ...runtime?.navError !== void 0 ? { navError: runtime.navError } : {}, + ...runtime?.loading !== void 0 ? { loading: runtime.loading } : {}, + noTeam, + ...frame2.team?.failure !== void 0 ? { failure: frame2.team.failure } : {} + }); + if (noTeam && runtime?.loading !== true) { + return notices; + } + return notices + renderRoster(frame2, lang2) + renderTasks(frame2, lang2); + } + + // src/ui-core/detail-render.ts + function aggregateToolNames(tools) { + const counts = /* @__PURE__ */ new Map(); + for (const tool of tools) counts.set(tool.name, (counts.get(tool.name) ?? 0) + 1); + return [...counts.entries()].sort((a, b2) => b2[1] - a[1] || (a[0] < b2[0] ? -1 : a[0] > b2[0] ? 1 : 0)).map(([name, n]) => `${name}\xD7${n}`).join(" \xB7 "); + } + function renderToolEntry(tool) { + const hasPayload = tool.text !== void 0 && tool.text.length > 0; + const summary = `${hasPayload ? iconChevron(12) : ""}${esc2(tool.name)}${esc2(tool.status)}`; + return hasPayload ? `
${esc2(tool.text)}
` : `${summary}`; + } + function renderDetailItem(item, lang2) { + const time3 = item.ts.slice(11, 19); + const badge = item.framed !== void 0 ? `${esc2(td(lang2, "detail.framedFrom", { name: item.framed.from }))}` : ""; + if (item.kind === "toolCall") { + const tool = item.tool ?? { name: "?", status: "?" }; + const entry = { + ts: item.ts, + name: tool.name, + status: tool.status, + ...item.text !== void 0 ? { text: item.text } : {} + }; + return `
assistant${time3}
` + renderToolEntry(entry) + `
`; + } + if (item.kind === "toolGroup") { + const tools = item.tools ?? []; + const count = item.count ?? tools.length; + const label = td(lang2, "detail.toolGroup", { n: count, list: aggregateToolNames(tools) }); + return `
assistant${time3}
${tools.map((tool) => renderToolEntry(tool)).join("")}
`; + } + const roleLabel = item.role === "user" ? esc2(td(lang2, "detail.you")) : item.role; + return `
${roleLabel}${time3}${badge}
${esc2(item.text ?? "")}
`; + } + function renderDetailBody(st, lang2) { + if (st.kind === "loading") { + return `
${esc2(td(lang2, "detail.loading"))}
`; + } + if (st.kind === "error") { + const text = st.reason === "session-not-settled" ? td(lang2, "detail.noSession") : td(lang2, "detail.failed", { message: st.message }); + return `
${esc2(text)}
`; + } + const d2 = st.detail; + const count = `${esc2(td(lang2, "detail.countSummary", { n: d2.total, sourceTotal: d2.sourceTotal }))}`; + if (d2.page.items.length === 0) { + return `
${esc2(td(lang2, "detail.empty"))}
`; + } + const pager = d2.page.nextCursor !== void 0 ? `
${count}
` : `
${count}
`; + return pager + d2.page.items.map((item) => renderDetailItem(item, lang2)).join(""); + } + function renderDetailView(st, lang2, opts = {}) { + if (st.kind === "closed") return ""; + const actions = []; + if (st.kind === "ready") { + actions.push(``); + actions.push( + `` + ); + if (opts.wake === true) { + actions.push(``); + } + } + return `
${esc2(st.name)}${actions.join("")}
${renderDetailBody(st, lang2)}
`; + } + + // src/ui-core/expand.ts + function memoryExpandStore(initial) { + const set2 = new Set(initial ?? []); + return { + isExpanded: (id) => set2.has(id), + setExpanded: (id, v2) => { + if (v2) set2.add(id); + else set2.delete(id); + } + }; + } + function attachExpandBehavior(root2, store, labels) { + const observers = []; + const measure = (task) => { + const desc = task.querySelector("[data-task-desc]"); + const toggle = task.querySelector("[data-task-toggle]"); + if (desc === null || toggle === null) return; + const id = task.dataset.taskId ?? ""; + const expanded = store.isExpanded(id); + const overflow = desc.scrollHeight > desc.clientHeight + 1; + toggle.hidden = !(overflow || expanded); + const label = toggle.querySelector(".expand-label"); + if (label !== null) label.textContent = expanded ? labels.collapse : labels.expand; + toggle.setAttribute("aria-expanded", expanded ? "true" : "false"); + toggle.classList.toggle("open", expanded); + desc.classList.toggle("expanded", expanded); + }; + const tasks = () => Array.from(root2.querySelectorAll("article.task")); + for (const task of tasks()) { + const desc = task.querySelector("[data-task-desc]"); + if (desc !== null && typeof ResizeObserver !== "undefined") { + const ro = new ResizeObserver(() => measure(task)); + ro.observe(desc); + observers.push(ro); + } + measure(task); + } + const onClick = (ev) => { + const target = ev.target; + const toggle = target?.closest("[data-task-toggle]"); + if (toggle === null || toggle === void 0) return; + const task = toggle.closest("article.task"); + if (task === null) return; + const id = task.dataset.taskId ?? ""; + store.setExpanded(id, !store.isExpanded(id)); + measure(task); + }; + root2.addEventListener("click", onClick); + return () => { + root2.removeEventListener("click", onClick); + for (const ro of observers) ro.disconnect(); + }; + } + + // src/ui-core/request-sequencer.ts + var RequestSequencer = class { + #seq = 0; + begin() { + this.#seq += 1; + return this.#seq; + } + isCurrent(seq) { + return seq === this.#seq; + } + invalidate() { + this.#seq += 1; + } + }; + + // src/panel/main.ts + var VIEW_URI = "team://view"; + var HEARTBEAT_MS = 25e3; + var app = new i({ name: "agent-team-panel", version: "0.5.0" }, {}); + var frame = null; + var lang = "zh"; + var navError; + var detailState = { kind: "closed" }; + var expandStore = memoryExpandStore(); + var detachExpand = null; + var heartbeatTimer = null; + var heartbeatInFlight = false; + var viewSequencer = new RequestSequencer(); + var detailSequencer = new RequestSequencer(); + var style = document.createElement("style"); + style.textContent = COMPONENT_CSS + PANEL_CSS; + document.head.appendChild(style); + var root = document.createElement("div"); + root.className = "at-root"; + root.innerHTML = ``; + document.body.appendChild(root); + var panelEl = root.querySelector(".team-panel"); + var listView = root.querySelector("[data-list-view]"); + var detailView = root.querySelector("[data-detail-view]"); + function applyHostContext() { + const ctx = app.getHostContext(); + const theme = ctx?.theme === "dark" ? "dark" : "light"; + document.documentElement.dataset.theme = theme; + document.documentElement.style.colorScheme = theme; + const vars = ctx?.styles?.variables; + if (vars !== void 0) { + for (const [k2, v2] of Object.entries(vars)) { + if (typeof v2 === "string") document.documentElement.style.setProperty(k2, v2); + } + } + lang = langOfLocale(ctx?.locale); + panelEl.setAttribute("aria-label", DICT[lang].trigger); + document.documentElement.lang = lang === "zh" ? "zh-CN" : "en"; + } + function restoreWidgetState() { + const ws = app.getHostContext()?.["zcode/widgetState"]; + if (ws !== void 0 && Array.isArray(ws.expanded)) { + expandStore = memoryExpandStore(new Set(ws.expanded)); + } + } + var saveWidgetQueued = false; + function persistWidgetState() { + if (saveWidgetQueued) return; + saveWidgetQueued = true; + setTimeout(() => { + saveWidgetQueued = false; + const expanded = [...expandedIds()]; + void app.request({ method: "ui/set-widget-state", params: { widgetState: { expanded } } }, EmptyResultSchema).catch(() => void 0); + }, 200); + } + function expandedIds() { + const ids = /* @__PURE__ */ new Set(); + for (const el of root.querySelectorAll("article.task")) { + const toggle = el.querySelector("[data-task-toggle]"); + if (toggle !== null && toggle.getAttribute("aria-expanded") === "true") { + ids.add(el.dataset.taskId ?? ""); + } + } + return ids; + } + function parseToolText(res) { + const first = res.content?.[0]; + if (first === void 0 || first.type !== "text" || typeof first.text !== "string") { + throw new Error("empty tool result"); + } + return first.text; + } + async function readView() { + const seq = viewSequencer.begin(); + const res = await app.readServerResource({ uri: VIEW_URI }); + const first = res.contents?.[0]; + const text = first !== void 0 && "text" in first ? first.text : void 0; + if (text === void 0) throw new Error("empty view resource"); + const next = JSON.parse(text); + if (!viewSequencer.isCurrent(seq)) return; + frame = next; + navError = void 0; + render(); + } + async function refreshViaCall() { + const seq = viewSequencer.begin(); + const res = await app.callServerTool({ name: "team_panel_call", arguments: { action: "refresh" } }); + const body = JSON.parse(parseToolText(res)); + if (body.frame === void 0) throw new Error(body.error?.message ?? "refresh failed"); + if (!viewSequencer.isCurrent(seq)) return; + frame = body.frame; + navError = void 0; + render(); + } + async function subscribe() { + await app.request( + { method: "resources/subscribe", params: { uri: VIEW_URI } }, + EmptyResultSchema + ); + await readView(); + } + app.setNotificationHandler(ResourceUpdatedNotificationSchema, async (n) => { + if (n.params.uri !== VIEW_URI) return; + try { + await readView(); + } catch { + try { + await refreshViaCall(); + } catch (err) { + navError = err instanceof Error ? err.message : String(err); + render(); + } + } + }); + function startHeartbeat() { + if (heartbeatTimer !== null) return; + heartbeatTimer = setInterval(() => { + if (heartbeatInFlight) return; + heartbeatInFlight = true; + void (async () => { + try { + await app.callServerTool({ name: "team_panel_call", arguments: { label: "heartbeat" } }); + } catch { + try { + await subscribe(); + } catch { + try { + await refreshViaCall(); + } catch (err) { + navError = err instanceof Error ? err.message : String(err); + render(); + } + } + } finally { + heartbeatInFlight = false; + } + })(); + }, HEARTBEAT_MS); + } + async function openDetail(memberId, name, cursor) { + const seq = detailSequencer.begin(); + const fromList = detailState.kind === "closed"; + detailState = { kind: "loading", memberId, name }; + render(); + if (fromList) detailView.focus(); + try { + const res = await app.callServerTool({ + name: "team_panel_call", + arguments: { + action: "detail", + target: memberId, + ...cursor !== void 0 ? { cursor } : {} + } + }); + if (!detailSequencer.isCurrent(seq)) return; + const body = JSON.parse(parseToolText(res)); + if (body.detail !== void 0) { + detailState = { kind: "ready", memberId, name, detail: body.detail }; + } else { + detailState = { + kind: "error", + memberId, + name, + message: body.error?.message ?? "detail failed", + ...body.error?.reason !== void 0 ? { reason: body.error.reason } : {} + }; + } + } catch (err) { + if (!detailSequencer.isCurrent(seq)) return; + detailState = { kind: "error", memberId, name, message: err instanceof Error ? err.message : String(err) }; + } + render(); + } + function closeDetail() { + detailSequencer.invalidate(); + detailState = { kind: "closed" }; + render(); + } + function injectWake(name) { + void app.updateModelContext({ + content: [ + { + type: "text", + text: `[agent-team \u9762\u677F\u6CE8\u5165] \u7528\u6237\u5728\u300C\u667A\u80FD\u4F53\u56E2\u961F\u300D\u9762\u677F\u8BF7\u6C42\u5173\u6CE8\u6210\u5458 "${name}"\uFF1A\u8BF7\u67E5\u770B\u8BE5\u6210\u5458\u5F53\u524D\u72B6\u6001\uFF0C\u5FC5\u8981\u65F6\u7ECF send_message \u5524\u9192\u6216\u63A8\u8FDB\u5176\u4EFB\u52A1\u3002` + } + ] + }).then( + () => { + const btn = detailView.querySelector("[data-detail-wake]"); + if (btn !== null) btn.textContent = td(lang, "detail.wakeInjected", { name }); + }, + () => void 0 + // 注入失败不打断视图(下钻是提示性动作) + ); + } + function render() { + const inDetail = detailState.kind !== "closed"; + listView.hidden = inDetail; + detailView.hidden = !inDetail; + panelEl.classList.toggle("compact", frame !== null && isCompact(frame) && !inDetail); + if (inDetail) { + detailView.innerHTML = renderDetailView(detailState, lang, { wake: true }); + bindDetail(); + return; + } + if (detachExpand !== null) { + detachExpand(); + detachExpand = null; + } + if (frame === null) { + listView.innerHTML = renderPanelBody( + { type: "view", stateVersion: 4, team: null, members: [], tasks: [], meta: { generatedAt: "", revision: 0 } }, + lang, + { loading: true, ...navError !== void 0 ? { navError } : {} } + ); + return; + } + listView.innerHTML = renderPanelBody( + frame, + lang, + { + ...navError !== void 0 ? { navError } : {}, + loading: false + } + ); + detachExpand = attachExpandBehavior(listView, expandStore, { + expand: DICT[lang]["task.expand"], + collapse: DICT[lang]["task.collapse"] + }); + } + listView.addEventListener("click", (ev) => { + const target = ev.target; + if (target?.closest("[data-task-toggle]") !== null && target !== void 0) { + persistWidgetState(); + return; + } + const member = target?.closest("button.member"); + if (member === null || member === void 0 || member.disabled) return; + const id = member.dataset.memberId; + if (id === void 0) return; + void openDetail(id, member.querySelector(".name")?.textContent ?? id); + }); + function bindDetail() { + detailView.querySelector("[data-detail-back]")?.addEventListener("click", closeDetail); + const reload = () => { + if (detailState.kind === "ready" || detailState.kind === "error") { + void openDetail(detailState.memberId, detailState.name); + } + }; + detailView.querySelector("[data-detail-refresh]")?.addEventListener("click", reload); + detailView.querySelector("[data-detail-retry]")?.addEventListener("click", reload); + detailView.querySelector("[data-detail-wake]")?.addEventListener("click", () => { + if (detailState.kind === "ready") injectWake(detailState.name); + }); + detailView.querySelector("[data-detail-copy]")?.addEventListener("click", () => { + if (detailState.kind !== "ready") return; + const sid = detailState.detail.sessionId; + void navigator.clipboard?.writeText(sid).then(void 0, () => fallbackCopy(sid)); + const btn = detailView.querySelector("[data-detail-copy]"); + if (btn !== null) { + btn.textContent = td(lang, "detail.copied"); + setTimeout(() => { + if (btn.isConnected) btn.textContent = td(lang, "detail.copySessionId"); + }, 1500); + } + }); + detailView.querySelector("[data-detail-earlier]")?.addEventListener("click", (ev) => { + const cursor = Number(ev.currentTarget.dataset.cursor); + if (detailState.kind === "ready" && Number.isFinite(cursor)) { + void openDetail(detailState.memberId, detailState.name, cursor); + } + }); + for (const head of detailView.querySelectorAll("button.tool-group-head")) { + head.addEventListener("click", () => { + const group = head.closest(".tool-group"); + const open = group?.classList.toggle("open") ?? false; + head.setAttribute("aria-expanded", open ? "true" : "false"); + }); + } + for (const row of detailView.querySelectorAll("button.tool-row")) { + row.addEventListener("click", () => { + const open = row.classList.toggle("open"); + row.setAttribute("aria-expanded", open ? "true" : "false"); + }); + } + } + function fallbackCopy(text) { + const ta = document.createElement("textarea"); + ta.value = text; + ta.style.position = "fixed"; + ta.style.opacity = "0"; + document.body.appendChild(ta); + ta.select(); + try { + document.execCommand("copy"); + } catch { + } + ta.remove(); + } + app.onhostcontextchanged = () => { + applyHostContext(); + render(); + }; + void (async () => { + applyHostContext(); + restoreWidgetState(); + render(); + try { + await app.connect(); + applyHostContext(); + restoreWidgetState(); + try { + await subscribe(); + } catch { + } + try { + await refreshViaCall(); + } catch (err) { + if (frame === null) { + try { + await readView(); + } catch (readErr) { + navError = readErr instanceof Error ? readErr.message : err instanceof Error ? err.message : String(err); + render(); + } + } + } + } catch (err) { + navError = err instanceof Error ? err.message : String(err); + render(); + } + startHeartbeat(); + })(); +})(); diff --git a/external_plugins/agent-team/runtime/ui/team-companion.html b/external_plugins/agent-team/runtime/ui/team-companion.html new file mode 100644 index 00000000..59c4c5b7 --- /dev/null +++ b/external_plugins/agent-team/runtime/ui/team-companion.html @@ -0,0 +1,1105 @@ + + + + + +Agent Team · Companion + + + + + \ No newline at end of file diff --git a/external_plugins/agent-team/runtime/ui/team-panel.html b/external_plugins/agent-team/runtime/ui/team-panel.html new file mode 100644 index 00000000..716b358a --- /dev/null +++ b/external_plugins/agent-team/runtime/ui/team-panel.html @@ -0,0 +1,16061 @@ + + + + + +Agent Team + + + + + \ No newline at end of file diff --git a/external_plugins/agent-team/skills/team-coordination/SKILL.md b/external_plugins/agent-team/skills/team-coordination/SKILL.md new file mode 100644 index 00000000..85991fe1 --- /dev/null +++ b/external_plugins/agent-team/skills/team-coordination/SKILL.md @@ -0,0 +1,43 @@ +--- +name: team-coordination +description: 智能体团队协作策略(agent-team 插件辅通道)。当目标可通过多代理并行/委派受益时主动使用:编排团队成员、创建或管理 teammate 成员、成员间消息、共享任务板/任务认领、任务验收与团队并行开发。 +--- + +# 智能体团队 · 协调策略(stage-3 定版;〔对齐轮修订 2026-10-17〕换版 0.2.1-alpha.5) + +本 skill 是团队策略的**辅通道**(主通道 = SessionStart hook additionalContext;兜底 = 工具 description)。三层文本同源:`src/mcp/policy.ts`(teamPolicy/POLICY_TEXT,冻结包 06 §3.1 逐字全文 + D7 冻结替换句;首段门控句随 0.2.1 删除,D5)。〔stage-6.5 D26,2026-10-24〕teamPolicy 四段仍逐字冻结;另有 **Lead-only 编排附加段**(见下节,主通道按 `leadMode` 插值)。 + +## 策略全文(与 hook 主通道同文;以下为 `interrupt=true` 默认版) + +> `interrupt:false` 时 hook 主通道的第 4 段插值为 `for send_message, or as owner...`,且 +> `interrupt_agent` 不注册。本 skill 是静态 Markdown,无法运行时插值;以 hook 注入为准。 + +Agent Teams is available in this session + +The Team Lead and all teammates share the same working directory and filesystem. Edits are immediately visible to every member. Split write work into disjoint scopes, record expected write scopes on shared tasks, and use task dependencies when work must be ordered. Write-scope overlap is advisory, not a lock. + +Prefer read/edit/write for file changes. If a file operation reports that the file changed since you last read it, read the current file again, rebase your intended change onto the new content, and retry. Bash, formatters, code generators, and scripts are not fully protected by the filesystem version guard; coordinate them explicitly and have the Lead review the final diff and run tests. + +Use the target returned by spawn_teammate or list_agents for send_message and interrupt_agent, or as owner when assigning or filtering shared tasks. send_message steers a running target at its nearest step boundary and starts or resumes an inactive target. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Shared-task workflow is list, get, claim with the current revision, perform the work, then complete. Task readiness never starts an owner. Before wait_agent, use list_agents and make sure another required member is running or provisioning; use send_message first when the required member is inactive. wait_agent observes only changes after that call starts, never wakes a member, and returns noProgress immediately when no other member can produce a change. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer. + +## Lead 编排模式(〔stage-6.5 D26〕2026-10-24 定稿) + +主通道在 **Lead 会话**且 `leadMode=orchestrator`(userConfig 默认)时,于身份段后追加以下英文段 +(逐字 = `src/mcp/policy.ts` 的 `ORCHESTRATOR_SECTION_TEXT`): + +> Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists — delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description — a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer. + +- 本 skill 是静态 Markdown,无法运行时插值:`leadMode=collaborator` 时 hook 主通道**不注入**该段 + (注入文本与 DSH 复刻口径逐字节一致);teammate 会话恒不注入。以 hook 注入为准。 +- 验收协议(D27):owner `complete` = 提交;Lead 必须独立复核(读 diff + 跑测试 + 核验任务描述中的 + 验收标准);失败 → `reopen` 附具体问题(completed→pending+去 owner);通过 → `edit` 在 description + 追加验收记录(面板可见),构成「标记完成」闭环。 + +## ZCode 场景说明 + +1. **团队工具**(server `team-daemon`):默认 9 个——`spawn_teammate` / `send_message` / `list_agents` / `interrupt_agent` / `wait_agent` / `team_task_create` / `team_task_list` / `team_task_get` / `team_task_update`;配置 `interrupt:false` 时为 8 个(不注册 `interrupt_agent`,策略中也不会出现该工具指引)。Lead-only 三操作(spawn / interrupt / reassign)在执行层强制;非成员会话调用一律 `TEAM_NOT_MEMBER`。〔stage-6.5 D26〕另有 userConfig `leadMode`(`orchestrator` 默认 / `collaborator`):只影响 Lead 会话是否注入编排段,**不改变工具数量**(两模式均 9/8 工具)。 +2. **建队友用 `spawn_teammate`**,不要用内置 Task/Agent 工具建一次性子代理(teammate 会话启动参数含 `--disallowed-tools Task` 遮蔽,D6)。 +3. **消息投递**(〔对齐轮〕0.2.1 口径):`send_message` 成功 = 收件接受(工具结果 `{"sent":true}`);不保证接收方已处理;ZCode 无 steer → 运行中目标在回合边界交付(D2 适配),成功即免重发。目标离线导致确定性失败时,工具会返回可读错误,不要当作已送达。 +4. **任务板 CAS**:先 `team_task_get`/`team_task_list` 读最新 `revision`,再 `team_task_update(action, expected_revision)`;收到 `TEAM_TASK_STALE_REVISION` → 重新 get 后重试。 +5. **错误自恢复**:工具失败结果 = `{"error":{"code","message"}}` 紧凑 JSON;code 是 27 个 TEAM_* 错误码之一(〔对齐轮〕0.2.1 删 TEAM_MAILBOX_FULL),按 message 指引重试或改参。 +6. **等待纪律**:`wait_agent` 前先 `list_agents` 确认有 running/provisioning 同伴;inactive 目标先用 `send_message` 唤醒;唤醒/超时后必须 re-list,不得盲报。 diff --git a/marketplace.json b/marketplace.json index c7f09a06..95273865 100644 --- a/marketplace.json +++ b/marketplace.json @@ -1443,6 +1443,35 @@ "mcp", "verification" ] + }, + { + "name": "agent-team", + "displayName": "智能体团队", + "displayName_i18n": { + "en": "Agent Teams", + "zh-CN": "智能体团队" + }, + "source": "./external_plugins/agent-team", + "description": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。", + "description_i18n": { + "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", + "zh-CN": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。" + }, + "version": "0.4.3", + "author": { + "name": "Vincent Zuo", + "url": "https://github.com/Vincent-chk" + }, + "category": "developer-tools", + "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/agent-team/icon.png", + "keywords": [ + "agent-teams", + "multi-agent", + "teammates", + "task-board", + "orchestration", + "mcp-apps" + ] } ] } \ No newline at end of file From 952c9a07bce0290259961b79efbea2b3f90875a0 Mon Sep 17 00:00:00 2001 From: Developer Date: Mon, 2 Nov 2026 08:10:26 +0800 Subject: [PATCH 2/7] =?UTF-8?q?feat(agent-team):=20upgrade=20to=200.5.0=20?= =?UTF-8?q?=E2=80=94=20leadMode=20three-way=20(auto=20default=20/=20always?= =?UTF-8?q?=20/=20off),=20legacy=20value=20migration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent-team/.zcode-plugin/plugin.json | 6 +- external_plugins/agent-team/CHANGELOG.md | 14 + external_plugins/agent-team/README.md | 23 +- external_plugins/agent-team/README_CN.md | 23 +- .../agent-team/runtime/team-daemon.mjs | 331 ++++++++++-------- .../agent-team/runtime/team-hooks.mjs | 98 ++++-- .../skills/team-coordination/SKILL.md | 20 +- marketplace.json | 2 +- 8 files changed, 307 insertions(+), 210 deletions(-) diff --git a/external_plugins/agent-team/.zcode-plugin/plugin.json b/external_plugins/agent-team/.zcode-plugin/plugin.json index c4b3c605..8861c613 100644 --- a/external_plugins/agent-team/.zcode-plugin/plugin.json +++ b/external_plugins/agent-team/.zcode-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-team", - "version": "0.4.3", + "version": "0.5.0", "description": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。", "description_i18n": { "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", @@ -44,9 +44,9 @@ }, "leadMode": { "title": "Lead 模式", - "description": "orchestrator(默认):Lead 自主组队/分配/独立验收,专注编排不亲自实现;collaborator:保持原口径,由用户指示建队。取值:orchestrator 或 collaborator。", + "description": "off:完全关闭智能体团队(不注入团队上下文、不注册团队工具);auto(默认):按需委派——建队前默认单 agent 直接处理,建队后按委派价值判断是否走团队流程;always:始终主动编排(自主拆活/组队/分派/独立验收)。旧值 orchestrator/collaborator 将按 auto 处理。取值:off、auto 或 always。", "type": "string", - "default": "orchestrator" + "default": "auto" } }, "skills": "skills", diff --git a/external_plugins/agent-team/CHANGELOG.md b/external_plugins/agent-team/CHANGELOG.md index eb8a2248..a735dd42 100644 --- a/external_plugins/agent-team/CHANGELOG.md +++ b/external_plugins/agent-team/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 0.5.0 — 2026-11-02 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **Lead 模式三档化(issue #9 / 偏差 D28)**:`leadMode` 从二值(orchestrator/collaborator)改为三档—— + - `auto`(**新默认**,按需委派):会话未建过队时不注入任何模式段(普通单 agent 语义,简单任务直接处理,不再为委派而委派);该会话曾创建过团队后(`members/` 存在成员目录即持久判定,含 inactive/failed)注入**按需段**(委派价值门槛 + 正反例:问答/单文件小改/调研汇总由 Lead 直接处理并说明一句理由,多角色并行/写域互斥/长任务 fork/点名成员走团队流程),验收与等待语义不变; + - `always`:保留原 orchestrator 主动编排行为(自主拆活、组队、分派、独立验收); + - `off`:完全关闭——hook 不注入任何团队上下文(策略/身份/收件箱/Stop block 全停,session-map 与轮次记录等内部副作用保留),daemon 不注册团队工具(tools/list 0 个,直连调用被拒)。 +- **旧值迁移**:`orchestrator`/`collaborator` 统一按 `auto` 处理(daemon 记迁移告警);runtime-config 升 v2——0.5.0 前落盘的旧文件 leadMode 视为过期回落默认,升级用户不被锁进激进档;宿主 config 直读层归一后判定(旧值→auto 接受)。 +- **auto 档中途首建队**:SessionStart 只在 startup/resume 触发,首成员 `spawn_teammate` 成功结果尾部以独立 text 块附一行 `FIRST_SPAWN_NOTE` 指引(不改结果 JSON),后续 resume 自然补全按需段。 +- **三通道同步**:工具描述去档位措辞改模式中立(spawn_teammate / team_task_update 两处);`skills/team-coordination/SKILL.md` 编排节重写为三档(含按需段逐字引用);文本审计扩为 24 项(D26/D28 三态两文本)。 +- e2e:S7 改显式 `always` 跑编排旅程;新增 S8 auto 默认链冒烟(简单任务不建队 + 注入无模式段 + runtime-config=auto);U-O1 重写为 auto 默认链口径(db 级无模式段断言),U-O2 改旧值迁移场景。 +- 本地验收:**869 用例 / 73 文件**全部通过(基线 849 + 20);覆盖率 statements **91.65%**、branches **85.19%**、functions **92.58%**、lines **93.42%**,门槛不变;`npm run check` 与文本审计 24 项通过。 + ## 0.4.3 — 2026-11-01 描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 diff --git a/external_plugins/agent-team/README.md b/external_plugins/agent-team/README.md index a6c4f040..7daa9187 100644 --- a/external_plugins/agent-team/README.md +++ b/external_plugins/agent-team/README.md @@ -44,19 +44,19 @@ After install and enable you need **no special command**: the teamwork policy is | `/team` | Type `/team` | Prints a text summary of team status + panel/command entries (**read-only**, creates/modifies nothing) | | `/team-coordination` | Type `/team-coordination` (full name `agent-team:team-coordination`) | Manually (re)load the teamwork policy skill; use when a very long session has lost it | -### 1. Just state the goal (default orchestrator mode) +### 1. Just state the goal (default `auto`: on-demand delegation) -Start a **new task** (old tasks do not refresh plugin capabilities) and describe the goal. With the default `leadMode: orchestrator`, the Lead decomposes the work, forms a team, assigns tasks and independently accepts them — no step-by-step steering needed: +Start a **new task** (old tasks do not refresh plugin capabilities) and describe the goal. Since 0.5.0 the default `leadMode: auto` follows on-demand delegation semantics: with no team spawned yet, the session behaves like a plain single agent — questions, small single-file changes and read-only summaries are handled directly; for goals that clearly benefit from multiple roles in parallel, disjoint write scopes, or long tasks needing their own context, the Lead forms a team: ```text Push two things in parallel: one teammate adds unit tests for src/utils, another reviews the wording of README and CHANGELOG, then summarize. ``` -The Lead's chain: spawn teammates → create tasks on the shared board with owners → wait for completion → independently verify (read diffs, run tests) → report back to you once accepted (D26/D27). +Once a team exists in the session (durable — inactive/failed members count), the Lead judges each request by delegation value: delegate work that is worth the team workflow — tasks with acceptance criteria, owners and independent verification (D26/D27) — and handle the rest directly with a one-line reason (issue #9 / D28). -### 2. Direct orders (collaborator mode / when you want precise control) +### 2. Precise control and the other two modes -Set `leadMode` to `collaborator` and the Lead waits for your instruction before forming a team; at any time you can also just give explicit orders: +At any time you can give explicit orders: ```text Create a teammate named reviewer, have it check the first three paragraphs of README for typos, then summarize its findings. @@ -70,6 +70,8 @@ Send reviewer a message: focus on mixed Chinese/English punctuation. List the current members and task statuses. ``` +Two more modes: `always` restores the pre-0.5.0 proactive orchestration from the very first message (decompose, staff up, assign, verify — no step-by-step steering needed); `off` disables Agent Teams entirely (no team context injected, no team tools registered). + The model maps these phrasings to the right tools (`spawn_teammate` / `send_message` / `list_agents` / `team_task_list` …); you never need to remember tool names. ### 2.1 Model and reasoning effort (auto-follows the Lead, nothing to configure) @@ -103,14 +105,14 @@ Using "create reviewer to check README typos" as the example: 1. The "Agent Team" panel appears in the conversation (the `spawn_teammate` result carries a panel-open hint and the desktop opens it), showing `lead` (current session) and `reviewer`; 2. `reviewer` starts working; tasks and statuses change on the panel/board; -3. `reviewer` reports back; the Lead (in orchestrator mode, after independent verification) summarizes for you; +3. `reviewer` reports back; the Lead (after independent verification, when it delegated the work) summarizes for you; 4. `reviewer`'s session is a hidden child session — it never appears next to the Lead in the left task list. -## Tool reference (9 model-visible tools; 8 with `interrupt:false`) +## Tool reference (9 model-visible tools; 8 with `interrupt:false`; 0 with `leadMode:off`) | Tool | Who uses it | Purpose | |---|---|---| -| `spawn_teammate` | Lead | Create a named persistent teammate (`context: fresh\|fork`; model auto-follows the Lead, no separate parameter; in orchestrator mode the Lead proactively staffs up) | +| `spawn_teammate` | Lead | Create a named persistent teammate (`context: fresh\|fork`; model auto-follows the Lead, no separate parameter; staff up when the goal clearly benefits from delegation) | | `send_message` | Everyone | Message another member: delivered at the nearest turn boundary while running; wakes/resumes an idle member | | `list_agents` | Everyone | List Lead + all teammates with targets and availability (`inactive` = no turn running, not a failure) | | `interrupt_agent` | Lead | Interrupt a teammate's current turn, preserving its pending inbox (**not registered when disabled → 8 tools**) | @@ -133,7 +135,7 @@ Edit under **Settings → Plugins → Agent Team**; changes apply to new tasks ( | `maxMessageBytes` | 65536 | Max bytes per member-to-member message | | `disposalTimeoutMs` | 5000 | Timeout for team disposal (settlement and reclaim) | | `interrupt` | true | When off, the model gets 8 tools (`interrupt_agent` is not registered) | -| `leadMode` | orchestrator | `orchestrator`: the Lead staffs, assigns and accepts work independently; `collaborator`: waits for your instruction | +| `leadMode` | auto | `auto`: on-demand delegation (plain single agent until a team exists, then judge by delegation value); `always`: always orchestrate proactively; `off`: disable Agent Teams entirely (no injection, 0 team tools). Legacy values `orchestrator`/`collaborator` are treated as `auto` (issue #9) | ## Network access, dependencies and side effects @@ -270,8 +272,9 @@ This plugin is a re-implementation of DSH Agent Teams on ZCode. The deviations b | D23 | Historical event names/old checkpoints auto-upgrade: legacy `team/message` normalizes to `team/message/queued`, old delivered structures to string arrays; historical teams stay readable | | D24 | Policy text injects on SessionStart (startup/resume); in very long Lead sessions it may be lost to context compaction — reload the skill or start a new task | | D25 | The plugin writes only two whitelisted points in the host task index (session-hiding anchor tombstone, `sidebar-audit --apply`); `db.sqlite` is strictly read-only | -| D26 | The Lead defaults to `orchestrator`: proactively staffs/assigns/accepts and does not implement itself (except one-line fixes or when nobody can take it); `collaborator` restores "waits for your instruction" | +| D26 | `always` mode (pre-0.5.0 default `orchestrator`): the Lead proactively staffs/assigns/accepts and does not implement itself (except one-line fixes or when nobody can take it) | | D27 | Task `complete` means "submitted": the Lead must independently verify before acceptance; failures are `reopen`ed with concrete findings, passes append an acceptance note to the task | +| D28 | Since 0.5.0 the default is `auto` (issue #9): no mode section is injected before a team exists; after the first teammate the on-demand section applies (delegation-value judgment with positive/negative examples); `off` disables injection and team tools entirely; legacy `orchestrator`/`collaborator` values migrate to `auto`; a stale pre-0.5.0 runtime-config is treated as unset | ## Documentation diff --git a/external_plugins/agent-team/README_CN.md b/external_plugins/agent-team/README_CN.md index 2bc1f3fc..1e8dfdfc 100644 --- a/external_plugins/agent-team/README_CN.md +++ b/external_plugins/agent-team/README_CN.md @@ -44,19 +44,19 @@ zcode plugins enable agent-team@zcode-plugins-official | `/team` | 会话里输入 `/team` | 输出团队状态文本摘要 + 面板/命令入口(**只读**,不创建/修改任何数据) | | `/team-coordination` | 输入 `/team-coordination`(全名 `agent-team:team-coordination`) | 手动(重新)加载团队协作策略 skill;长会话策略丢失后恢复用 | -### 1. 直接说目标(默认 orchestrator 模式) +### 1. 直接说目标(默认 `auto`:按需委派) -新建一个任务(**必须是新任务**——旧任务不会刷新插件能力),直接描述目标即可。默认 `leadMode: orchestrator` 下 Lead 会自主拆活、组队、分派并独立验收,不需要逐条指挥: +新建一个任务(**必须是新任务**——旧任务不会刷新插件能力),直接描述目标即可。0.5.0 起默认 `leadMode: auto` 为按需委派语义:会话还没建过队时就是普通单 agent——问答、单文件小改动、纯调研汇总直接处理,不为委派而委派;目标明显值得协作(多角色并行、写域互斥分人、长任务需要独立上下文)时 Lead 才组队: ```text 帮我并行推进两件事:一边给 src/utils 补单元测试,一边审查 README 与 CHANGELOG 的措辞,完成后汇总。 ``` -Lead 的动作链:创建队友 → 在共享任务板建任务并指定 owner → 等待各成员完成 → 独立复核(读 diff、跑测试)→ 验收通过后汇总给你(D26/D27)。 +会话里建过队后(持久判定——inactive/failed 成员也算),Lead 按委派价值逐请求判断:值得走团队流程的才委派(带验收标准、owner 与独立复核的任务,D26/D27),其余自己直接处理并说明一句理由(issue #9 / D28)。 -### 2. 点名指挥(collaborator 模式 / 想精确控制时) +### 2. 点名指挥与另外两档 -把 `leadMode` 配置为 `collaborator` 后 Lead 等你指示再建队;任何时候想精确控制,也直接下指令: +任何时候想精确控制,直接下指令: ```text 创建一个叫 reviewer 的队友,让它检查 README 前三段的错别字,然后汇总它的结论。 @@ -70,6 +70,8 @@ Lead 的动作链:创建队友 → 在共享任务板建任务并指定 owner 列一下现在的成员和任务状态。 ``` +另外两档:`always` 恢复 0.5.0 之前的主动编排(从首条消息起自主拆活、组队、分派、验收,无需逐条指挥);`off` 完全关闭智能体团队(不注入任何团队上下文、不注册团队工具)。 + 模型会把这些话术映射到对应工具(`spawn_teammate` / `send_message` / `list_agents` / `team_task_list` …),你不需要记工具名。 ### 2.1 模型与思考强度(自动跟随 Lead,无需设置) @@ -103,14 +105,14 @@ Lead 的动作链:创建队友 → 在共享任务板建任务并指定 owner 1. 会话里出现「智能体团队」面板(`spawn_teammate` 的结果携带面板打开提示,桌面上会定向打开),成员区显示 `lead`(当前会话)与 `reviewer`; 2. `reviewer` 创建并开始工作,面板/任务板出现任务与状态变化; -3. `reviewer` 完成后向 Lead 汇报,Lead(orchestrator 下先独立复核)汇总给你; +3. `reviewer` 完成后向 Lead 汇报,Lead(委派出去的工作先独立复核)汇总给你; 4. `reviewer` 的会话是隐藏子会话,不会和 Lead 平级出现在左侧任务栏。 -## 工具速查(模型可见 9 个;`interrupt:false` 时 8 个) +## 工具速查(模型可见 9 个;`interrupt:false` 时 8 个;`leadMode:off` 时 0 个) | 工具 | 谁用 | 作用 | |---|---|---| -| `spawn_teammate` | Lead | 创建一个有名字的持久队友(`context: fresh\|fork`;模型自动跟随 Lead,无独立参数;orchestrator 模式下 Lead 会主动组队) | +| `spawn_teammate` | Lead | 创建一个有名字的持久队友(`context: fresh\|fork`;模型自动跟随 Lead,无独立参数;目标明显值得委派时再组队) | | `send_message` | 全体 | 给另一个成员发消息:运行中在最近回合边界送达;空闲则拉起/恢复一轮 | | `list_agents` | 全体 | 列出 Lead 与全部队友的 target 与可用状态(`inactive` = 当前无回合,不代表任务失败) | | `interrupt_agent` | Lead | 中断一个队友当前回合,保留其待处理收件箱(**配置关闭时此工具不注册 → 8 个**) | @@ -133,7 +135,7 @@ Lead 的动作链:创建队友 → 在共享任务板建任务并指定 owner | `maxMessageBytes` | 65536 | 成员间单条消息的最大字节数 | | `disposalTimeoutMs` | 5000 | 团队处置(结算与回收)的超时时间 | | `interrupt` | true | 关闭后模型只拿到 8 个工具(`interrupt_agent` 不注册) | -| `leadMode` | orchestrator | `orchestrator`:Lead 自主组队、分配、独立验收;`collaborator`:等你指示再建队 | +| `leadMode` | auto | `auto`:按需委派(建队前=普通单 agent,建队后按委派价值判断);`always`:始终主动编排;`off`:完全关闭智能体团队(不注入、0 团队工具)。旧值 `orchestrator`/`collaborator` 按 `auto` 处理(issue #9) | ## 网络访问、依赖与副作用 @@ -270,8 +272,9 @@ zcode plugins list --json # 看 version / rootPath / dataPath / diagnosti | D23 | 历史事件名/旧 checkpoint 自动兼容:旧 `team/message` 归一为 `team/message/queued`,旧 delivered 结构归一为字符串数组;历史团队数据可读 | | D24 | 策略文本在 SessionStart(startup/resume)注入;Lead 极长会话中途可能因上下文压缩丢失,可重新加载 skill 或开新任务 | | D25 | 插件只写宿主任务索引的两个白名单点(会话隔离 anchor 墓碑、`sidebar-audit --apply`);`db.sqlite` 一律只读 | -| D26 | Lead 默认 `orchestrator` 模式:主动组队/分配/独立验收,不亲自实现(除一行级修复或无人可派);`collaborator` 恢复“等你指示” | +| D26 | `always` 档(0.5.0 前的默认 `orchestrator`):主动组队/分配/独立验收,不亲自实现(除一行级修复或无人可派) | | D27 | 任务 `complete` 是“提交”,Lead 需独立复核后才算验收完成;失败会 `reopen` 并附具体问题,通过则在任务描述里追加验收记录 | +| D28 | 0.5.0 起默认 `auto`(issue #9):建队前不注入任何模式段;首个队友创建后注入按需段(委派价值判断+正反例);`off` 完全停注入并注销团队工具;旧值 `orchestrator`/`collaborator` 统一迁移 `auto`;0.5.0 前的 runtime-config 落盘视为过期 | ## 文档 diff --git a/external_plugins/agent-team/runtime/team-daemon.mjs b/external_plugins/agent-team/runtime/team-daemon.mjs index a6d126ba..a6e15107 100644 --- a/external_plugins/agent-team/runtime/team-daemon.mjs +++ b/external_plugins/agent-team/runtime/team-daemon.mjs @@ -18430,8 +18430,18 @@ function coerceInteger(raw) { if (typeof raw === "string" && /^-?\d+$/.test(raw.trim())) return Number(raw.trim()); return void 0; } +var DEFAULT_LEAD_MODE = "auto"; +var LEGACY_LEAD_MODE_MAP = { + orchestrator: "auto", + collaborator: "auto" +}; +function normalizeLeadMode(raw) { + if (typeof raw !== "string") return void 0; + if (raw === "off" || raw === "auto" || raw === "always") return raw; + return LEGACY_LEAD_MODE_MAP[raw]; +} function validateLeadMode(raw) { - return raw === "collaborator" ? "collaborator" : "orchestrator"; + return normalizeLeadMode(raw) ?? DEFAULT_LEAD_MODE; } // src/shared.ts @@ -18460,7 +18470,7 @@ function writeRuntimeConfig(input) { fs.mkdirSync(path.dirname(file), { recursive: true }); const tmp = `${file}.tmp-${process.pid}`; const doc = { - version: 1, + version: 2, interrupt: input.interrupt, leadMode: input.leadMode, limits: input.limits, @@ -22517,17 +22527,17 @@ var IDENTITY_LEAD_TEXT = `You are the Team Lead named "lead". Use list_agents({}) to find your teammates and their names. To message another teammate, use send_message({ target: "", message: "..." }).`; var POLICY_PROBE_MARKER = "quartz-ember-73"; -var ORCHESTRATOR_SECTION_TEXT = "Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists \u2014 delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer."; -function buildSessionStartContext(identityText, interrupt = true, leadMode2) { +var FIRST_SPAWN_NOTE = "[agent-team] Team mode is now active: this is the first teammate of this session. From now on, judge each request by delegation value \u2014 handle simple work directly with a one-line reason, and use the team for work that benefits from multiple roles, parallel execution, or disjoint write scopes."; +function buildSessionStartContext(identityText, interrupt = true, modeSection) { const policy = teamPolicy(interrupt); - const orchestration = leadMode2 === "orchestrator" ? ` -${HOOK_POLICY_PREFIX} ${ORCHESTRATOR_SECTION_TEXT}` : ""; + const section = modeSection !== void 0 ? ` +${HOOK_POLICY_PREFIX} ${modeSection}` : ""; const probe = process.env.TEAM_POLICY_PROBE === "1" ? ` ${HOOK_POLICY_PREFIX} \u7B56\u7565\u6CE8\u5165\u9A8C\u8BC1\u6807\u8BB0\uFF1A${POLICY_PROBE_MARKER}` : ""; return `${HOOK_POLICY_PREFIX} ${policy} -${HOOK_POLICY_PREFIX} ${identityText}${orchestration}${probe}`; +${HOOK_POLICY_PREFIX} ${identityText}${section}${probe}`; } -var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true, "orchestrator"); +var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true); var FAIL_LOUD_WARNING = "[agent-team] \u8B66\u544A\uFF1A\u672A\u68C0\u6D4B\u5230\u672C\u4F1A\u8BDD\u7684\u7B56\u7565\u6CE8\u5165\uFF08SessionStart hook \u53EF\u80FD\u672A\u751F\u6548\uFF09\u3002\u8BF7\u786E\u8BA4\u63D2\u4EF6\u5DF2\u542F\u7528\u4E14 hooks \u58F0\u660E\u5B58\u5728\uFF1B\u56E2\u961F\u5DE5\u5177\u4ECD\u53EF\u8C03\u7528\uFF0C\u4F46\u6A21\u578B\u53EF\u80FD\u672A\u52A0\u8F7D\u5B8C\u6574\u534F\u4F5C\u7B56\u7565\u3002"; var NO_PROGRESS_REASON = "no-active-peer"; var NO_PROGRESS_MESSAGE = "No other Team member is running or provisioning. wait_agent cannot make progress or wake inactive teammates. Re-list with list_agents and team_task_list, then use send_message to wake each required inactive teammate before waiting again."; @@ -22881,9 +22891,9 @@ var PANEL_RESOURCE_URI = "ui://agent-team/team-panel.html"; var PANEL_SURFACE_ID = "agent-team-panel"; var TEAM_TOOL_DEFINITIONS = [ { - // 02 §9.3 + // 02 §9.3(〔issue #9 三档化 D28〕描述去 orchestrator 档位措辞,改模式中立的按需口径) name: "spawn_teammate", - description: "Create one named, durable teammate. Only the Team Lead may call this tool. In orchestrator mode, create teammates proactively when the goal benefits from delegation, within the member limit. The teammate automatically follows the Lead's latest confirmed model and reasoning level on every turn; there is no per-member model option.", + description: "Create one named, durable teammate. Only the Team Lead may call this tool. Create teammates when the goal clearly benefits from delegation \u2014 multiple roles in parallel, disjoint write scopes, or long tasks needing their own context \u2014 within the member limit. The teammate automatically follows the Lead's latest confirmed model and reasoning level on every turn; there is no per-member model option.", inputSchema: { type: "object", properties: { @@ -23020,9 +23030,9 @@ var TEAM_TOOL_DEFINITIONS = [ } }, { - // 02 §9.12 + // 02 §9.12(〔issue #9 三档化 D28〕描述去 orchestrator 档位措辞) name: "team_task_update", - description: "Compare-and-set a shared task action using the latest revision from team_task_get or team_task_list. In orchestrator mode, the Lead verifies a completed task and reopens it with concrete findings on failure.", + description: "Compare-and-set a shared task action using the latest revision from team_task_get or team_task_list. When the Lead verifies a completed task, reopen it with concrete findings on failure.", inputSchema: { type: "object", properties: { @@ -23063,6 +23073,7 @@ var TEAM_TOOL_DEFINITIONS = [ ]; var TEAM_TOOL_NAMES = new Set(TEAM_TOOL_DEFINITIONS.map((t) => t.name)); function teamToolDefinitions(options = {}) { + if (options.leadMode === "off") return []; const interrupt = options.interrupt ?? true; return interrupt ? TEAM_TOOL_DEFINITIONS : TEAM_TOOL_DEFINITIONS.filter((t) => t.name !== "interrupt_agent"); } @@ -23257,8 +23268,154 @@ function touch(opts, sessionId, entry, source) { upsertSessionEntry(opts.dataRoot, sessionId, patch); } +// src/provider/member-files.ts +import fs9 from "node:fs"; +import path8 from "node:path"; +function teamEverCreated(teamDir, leadSessionId) { + let entries; + try { + entries = fs9.readdirSync(path8.join(teamDir, "members")); + } catch { + return false; + } + return entries.some((entry) => entry !== leadSessionId); +} +function memberPaths(teamDir, memberId) { + const memberDir = path8.join(teamDir, "members", memberId); + const runDir = path8.join(memberDir, "run"); + return { + memberDir, + originFile: path8.join(memberDir, "origin.json"), + receiptsFile: path8.join(memberDir, "receipts.jsonl"), + stopBudgetFile: path8.join(memberDir, "stop-budget.json"), + runDir, + currentFile: path8.join(runDir, "current.json"), + drainMarkerFile: path8.join(runDir, "drain-requested.json"), + modelFailedFile: path8.join(memberDir, "model-failed.json") + }; +} +function turnFile(runDir, turnId) { + return path8.join(runDir, `${turnId}.json`); +} +function writeJsonAtomic(file, value) { + fs9.mkdirSync(path8.dirname(file), { recursive: true, mode: 448 }); + const tmp = `${file}.tmp-${process.pid}-${Date.now()}`; + const fd = fs9.openSync(tmp, "w", 384); + try { + fs9.writeFileSync(fd, JSON.stringify(value, null, 2)); + fs9.fsyncSync(fd); + } finally { + fs9.closeSync(fd); + } + fs9.renameSync(tmp, file); +} +function readJson(file) { + let raw; + try { + raw = fs9.readFileSync(file, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return void 0; + throw err; + } + return JSON.parse(raw); +} +function writeOrigin(paths, origin) { + writeJsonAtomic(paths.originFile, origin); +} +function readOrigin(paths) { + return readJson(paths.originFile); +} +function writeTurn(runDir, turn) { + writeJsonAtomic(turnFile(runDir, turn.turnId), turn); +} +function readTurn(runDir, turnId) { + return readJson(turnFile(runDir, turnId)); +} +function setCurrentTurn(paths, turnId) { + writeJsonAtomic(paths.currentFile, { turnId }); +} +function readCurrentTurnId(paths) { + return readJson(paths.currentFile)?.turnId; +} +function listTurns(runDir) { + let names; + try { + names = fs9.readdirSync(runDir); + } catch (err) { + if (err.code === "ENOENT") return []; + throw err; + } + return names.filter((n) => /^turn-\d+\.json$/.test(n)).sort((a, b) => turnNumber(a) - turnNumber(b)).map((n) => readJson(path8.join(runDir, n))).filter((t) => t !== void 0); +} +function turnNumber(name) { + return Number(name.slice("turn-".length, -".json".length)); +} +function nextTurnId(runDir) { + let names = []; + try { + names = fs9.readdirSync(runDir); + } catch { + } + let max = 0; + for (const n of names) { + if (/^turn-\d+\.json$/.test(n)) max = Math.max(max, turnNumber(n)); + } + return `turn-${max + 1}`; +} +function appendReceipt(paths, receipt) { + fs9.mkdirSync(path8.dirname(paths.receiptsFile), { recursive: true, mode: 448 }); + const fd = fs9.openSync(paths.receiptsFile, "a", 384); + try { + fs9.writeFileSync(fd, JSON.stringify(receipt) + "\n"); + fs9.fsyncSync(fd); + } finally { + fs9.closeSync(fd); + } +} +function readReceipts(paths) { + let raw; + try { + raw = fs9.readFileSync(paths.receiptsFile, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return []; + throw err; + } + const receipts = []; + for (const line of raw.split("\n")) { + if (line.trim().length === 0) continue; + receipts.push(JSON.parse(line)); + } + return receipts; +} +function receiptMessageIds(paths) { + return new Set(readReceipts(paths).map((r) => r.messageId)); +} +function readStopBudget(paths) { + return readJson(paths.stopBudgetFile); +} +function writeStopBudget(paths, budget) { + writeJsonAtomic(paths.stopBudgetFile, budget); +} +function readModelFailed(paths) { + return readJson(paths.modelFailedFile); +} +function writeModelFailed(paths, record2) { + writeJsonAtomic(paths.modelFailedFile, record2); +} +function clearModelFailed(paths) { + try { + fs9.unlinkSync(paths.modelFailedFile); + } catch { + } +} + // src/mcp/handlers.ts async function handleTeamToolCall(opts, tool) { + if (opts.leadMode === "off") { + return errorResult( + new TypeError(`unsupported team tool: ${tool} (leadMode "off" \u2014 Agent Teams disabled)`) + ); + } let identity; try { identity = resolveIdentity({ @@ -23270,9 +23427,11 @@ async function handleTeamToolCall(opts, tool) { } catch (err) { return errorResult(err); } + const probeFirstSpawn = opts.leadMode === "auto" && tool === "spawn_teammate" && !teamEverCreated(teamPaths(opts.dataRoot, identity.teamId).teamDir, identity.teamId); try { const result = await dispatch(opts, identity, tool); - return withFailLoud(successResult(result), identity); + const success = withFailLoud(successResult(result), identity); + return probeFirstSpawn ? { ...success, content: [...success.content, { type: "text", text: FIRST_SPAWN_NOTE }] } : success; } catch (err) { return withFailLoud(errorResult(err), identity); } @@ -23378,6 +23537,7 @@ async function callTeamTool(input, notifier) { bootTimeMs: input.bootTimeMs, meta: input.meta, args: input.args, + ...input.leadMode !== void 0 ? { leadMode: input.leadMode } : {}, ...emitProgress !== void 0 ? { emitProgress } : {}, ...input.signal !== void 0 ? { signal: input.signal } : {}, ...input.now !== void 0 ? { now: input.now } : {} @@ -23419,140 +23579,6 @@ import { execFile } from "node:child_process"; import fs10 from "node:fs"; import path9 from "node:path"; import { fileURLToPath } from "node:url"; - -// src/provider/member-files.ts -import fs9 from "node:fs"; -import path8 from "node:path"; -function memberPaths(teamDir, memberId) { - const memberDir = path8.join(teamDir, "members", memberId); - const runDir = path8.join(memberDir, "run"); - return { - memberDir, - originFile: path8.join(memberDir, "origin.json"), - receiptsFile: path8.join(memberDir, "receipts.jsonl"), - stopBudgetFile: path8.join(memberDir, "stop-budget.json"), - runDir, - currentFile: path8.join(runDir, "current.json"), - drainMarkerFile: path8.join(runDir, "drain-requested.json"), - modelFailedFile: path8.join(memberDir, "model-failed.json") - }; -} -function turnFile(runDir, turnId) { - return path8.join(runDir, `${turnId}.json`); -} -function writeJsonAtomic(file, value) { - fs9.mkdirSync(path8.dirname(file), { recursive: true, mode: 448 }); - const tmp = `${file}.tmp-${process.pid}-${Date.now()}`; - const fd = fs9.openSync(tmp, "w", 384); - try { - fs9.writeFileSync(fd, JSON.stringify(value, null, 2)); - fs9.fsyncSync(fd); - } finally { - fs9.closeSync(fd); - } - fs9.renameSync(tmp, file); -} -function readJson(file) { - let raw; - try { - raw = fs9.readFileSync(file, "utf8"); - } catch (err) { - if (err.code === "ENOENT") return void 0; - throw err; - } - return JSON.parse(raw); -} -function writeOrigin(paths, origin) { - writeJsonAtomic(paths.originFile, origin); -} -function readOrigin(paths) { - return readJson(paths.originFile); -} -function writeTurn(runDir, turn) { - writeJsonAtomic(turnFile(runDir, turn.turnId), turn); -} -function readTurn(runDir, turnId) { - return readJson(turnFile(runDir, turnId)); -} -function setCurrentTurn(paths, turnId) { - writeJsonAtomic(paths.currentFile, { turnId }); -} -function readCurrentTurnId(paths) { - return readJson(paths.currentFile)?.turnId; -} -function listTurns(runDir) { - let names; - try { - names = fs9.readdirSync(runDir); - } catch (err) { - if (err.code === "ENOENT") return []; - throw err; - } - return names.filter((n) => /^turn-\d+\.json$/.test(n)).sort((a, b) => turnNumber(a) - turnNumber(b)).map((n) => readJson(path8.join(runDir, n))).filter((t) => t !== void 0); -} -function turnNumber(name) { - return Number(name.slice("turn-".length, -".json".length)); -} -function nextTurnId(runDir) { - let names = []; - try { - names = fs9.readdirSync(runDir); - } catch { - } - let max = 0; - for (const n of names) { - if (/^turn-\d+\.json$/.test(n)) max = Math.max(max, turnNumber(n)); - } - return `turn-${max + 1}`; -} -function appendReceipt(paths, receipt) { - fs9.mkdirSync(path8.dirname(paths.receiptsFile), { recursive: true, mode: 448 }); - const fd = fs9.openSync(paths.receiptsFile, "a", 384); - try { - fs9.writeFileSync(fd, JSON.stringify(receipt) + "\n"); - fs9.fsyncSync(fd); - } finally { - fs9.closeSync(fd); - } -} -function readReceipts(paths) { - let raw; - try { - raw = fs9.readFileSync(paths.receiptsFile, "utf8"); - } catch (err) { - if (err.code === "ENOENT") return []; - throw err; - } - const receipts = []; - for (const line of raw.split("\n")) { - if (line.trim().length === 0) continue; - receipts.push(JSON.parse(line)); - } - return receipts; -} -function receiptMessageIds(paths) { - return new Set(readReceipts(paths).map((r) => r.messageId)); -} -function readStopBudget(paths) { - return readJson(paths.stopBudgetFile); -} -function writeStopBudget(paths, budget) { - writeJsonAtomic(paths.stopBudgetFile, budget); -} -function readModelFailed(paths) { - return readJson(paths.modelFailedFile); -} -function writeModelFailed(paths, record2) { - writeJsonAtomic(paths.modelFailedFile, record2); -} -function clearModelFailed(paths) { - try { - fs9.unlinkSync(paths.modelFailedFile); - } catch { - } -} - -// src/provider/procgroup.ts var HELPER_DEFAULT = path9.join(path9.dirname(fileURLToPath(import.meta.url)), "detach-helper.mjs"); var SPAWN_HELPER_TIMEOUT_MS = 1e4; async function spawnDetached(spec) { @@ -26812,8 +26838,14 @@ if (!config2.ok) { var interruptEnabled = (process.env.TEAM_INTERRUPT ?? "true") !== "false"; var leadModeRaw = process.env.TEAM_LEAD_MODE; var leadMode = validateLeadMode(leadModeRaw); -if (leadModeRaw !== void 0 && leadModeRaw !== "orchestrator" && leadModeRaw !== "collaborator") { +var leadModeNormalized = normalizeLeadMode(leadModeRaw); +if (leadModeRaw !== void 0 && leadModeNormalized === void 0) { logErr("daemon", `invalid TEAM_LEAD_MODE ${JSON.stringify(leadModeRaw)} \u2014 falling back to "${leadMode}"`); +} else if (leadModeRaw === "orchestrator" || leadModeRaw === "collaborator") { + logErr( + "daemon", + `legacy TEAM_LEAD_MODE ${JSON.stringify(leadModeRaw)} mapped to "auto" (issue #9) \u2014 use "always" for proactive orchestration` + ); } if (config2.ok) { writeRuntimeConfig({ interrupt: interruptEnabled, leadMode, limits: config2.values }); @@ -27026,7 +27058,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => { appendJsonl(path20.join(DATA, "logs", "requests.jsonl"), { ts: ts(), method: "tools/list" }); const debugTools = process.env.TEAM_DEBUG_TOOLS === "1"; const supportTools = debugTools ? TOOLS : TOOLS.filter((t) => t.name !== "team_ping"); - return { tools: [...supportTools, ...listTeamTools({ interrupt: backend.interruptEnabled })] }; + return { tools: [...supportTools, ...listTeamTools({ interrupt: backend.interruptEnabled, leadMode })] }; }); server.setRequestHandler(CallToolRequestSchema, async (req, extra) => { const { name, arguments: args, _meta } = req.params; @@ -27134,6 +27166,7 @@ server.setRequestHandler(CallToolRequestSchema, async (req, extra) => { name, args: args ?? {}, meta, + leadMode, signal: extra.signal }, // progress 保活:仅 wait_agent + 宿主 progressToken 在场时发(registry 内判定); diff --git a/external_plugins/agent-team/runtime/team-hooks.mjs b/external_plugins/agent-team/runtime/team-hooks.mjs index d1dfb453..c81dec7f 100644 --- a/external_plugins/agent-team/runtime/team-hooks.mjs +++ b/external_plugins/agent-team/runtime/team-hooks.mjs @@ -53,8 +53,18 @@ function serializeCause(cause, seen) { } // src/domain/config.ts +var DEFAULT_LEAD_MODE = "auto"; +var LEGACY_LEAD_MODE_MAP = { + orchestrator: "auto", + collaborator: "auto" +}; +function normalizeLeadMode(raw2) { + if (typeof raw2 !== "string") return void 0; + if (raw2 === "off" || raw2 === "auto" || raw2 === "always") return raw2; + return LEGACY_LEAD_MODE_MAP[raw2]; +} function validateLeadMode(raw2) { - return raw2 === "collaborator" ? "collaborator" : "orchestrator"; + return normalizeLeadMode(raw2) ?? DEFAULT_LEAD_MODE; } // src/shared.ts @@ -78,8 +88,11 @@ function readRuntimeConfig() { try { const raw2 = fs.readFileSync(runtimeConfigPath(), "utf8"); const parsed = JSON.parse(raw2); - if (parsed.version !== 1 || typeof parsed.interrupt !== "boolean") return void 0; - return { ...parsed, leadMode: parsed.leadMode === "collaborator" ? "collaborator" : "orchestrator" }; + if (typeof parsed.interrupt !== "boolean") return void 0; + if (parsed.version !== 2) { + return { ...parsed, version: 2 }; + } + return { ...parsed, leadMode: normalizeLeadMode(parsed.leadMode) }; } catch { return void 0; } @@ -103,11 +116,10 @@ function readHostLeadModeOverride(homedir = os.homedir()) { } } if (strings.length === 0) return void 0; - const first = strings[0]; - if (strings.every((v) => v === first) && (first === "orchestrator" || first === "collaborator")) { - return validateLeadMode(first); - } - return void 0; + const normalized = strings.map((v) => normalizeLeadMode(v)); + if (normalized.some((v) => v === void 0)) return void 0; + const first = normalized[0]; + return normalized.every((v) => v === first) ? first : void 0; } function appendJsonl(file, obj) { fs.appendFileSync(file, JSON.stringify(obj) + "\n", { mode: 384 }); @@ -154,16 +166,17 @@ To message another teammate, use send_message({ target: "", messa } var POLICY_PROBE_MARKER = "quartz-ember-73"; var ORCHESTRATOR_SECTION_TEXT = "Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists \u2014 delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer."; -function buildSessionStartContext(identityText, interrupt = true, leadMode) { +var ON_DEMAND_SECTION_TEXT = "Lead operating mode (on-demand): Judge each request by delegation value before using the team. Handle work directly yourself \u2014 with a one-line reason, no forced tasks \u2014 for questions and explanations, small changes confined to a single file, read-only research summaries, or when every teammate is busy and the request is unrelated to existing work. Use the team workflow when work clearly benefits from multiple roles in parallel, when write scopes must be split across members, when a long task deserves its own context, or when the user explicitly names members. When you delegate, turn each delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. Wait for required teammates and synthesize their results for the final answer."; +function buildSessionStartContext(identityText, interrupt = true, modeSection) { const policy = teamPolicy(interrupt); - const orchestration = leadMode === "orchestrator" ? ` -${HOOK_POLICY_PREFIX} ${ORCHESTRATOR_SECTION_TEXT}` : ""; + const section = modeSection !== void 0 ? ` +${HOOK_POLICY_PREFIX} ${modeSection}` : ""; const probe = process.env.TEAM_POLICY_PROBE === "1" ? ` ${HOOK_POLICY_PREFIX} \u7B56\u7565\u6CE8\u5165\u9A8C\u8BC1\u6807\u8BB0\uFF1A${POLICY_PROBE_MARKER}` : ""; return `${HOOK_POLICY_PREFIX} ${policy} -${HOOK_POLICY_PREFIX} ${identityText}${orchestration}${probe}`; +${HOOK_POLICY_PREFIX} ${identityText}${section}${probe}`; } -var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true, "orchestrator"); +var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true); // src/mcp/identity.ts import fs2 from "node:fs"; @@ -5056,6 +5069,15 @@ function withFailure(state, rawLine) { // src/provider/member-files.ts import fs6 from "node:fs"; import path6 from "node:path"; +function teamEverCreated(teamDir, leadSessionId) { + let entries; + try { + entries = fs6.readdirSync(path6.join(teamDir, "members")); + } catch { + return false; + } + return entries.some((entry) => entry !== leadSessionId); +} function memberPaths(teamDir, memberId) { const memberDir = path6.join(teamDir, "members", memberId); const runDir = path6.join(memberDir, "run"); @@ -5325,6 +5347,11 @@ var role = resolveHookRole({ spawnIdentityEnv: process.env.TEAM_SPAWN_IDENTITY, sessionId: rawSessionId ?? "" }); +var runtimeConfig = readRuntimeConfig(); +var leadMode = validateLeadMode( + process.env.TEAM_LEAD_MODE !== void 0 ? process.env.TEAM_LEAD_MODE : readHostLeadModeOverride() ?? runtimeConfig?.leadMode +); +var leadOff = role.role === "lead" && leadMode === "off"; function out(obj) { return new Promise((resolve) => { process.stdout.write(JSON.stringify(obj), () => resolve()); @@ -5372,32 +5399,43 @@ if (event === "sessionstart") { }); } const identityText = role.role === "teammate" ? identityTeammateText(role.name) : IDENTITY_LEAD_TEXT; - const runtimeConfig = readRuntimeConfig(); const interrupt = process.env.TEAM_INTERRUPT !== void 0 ? process.env.TEAM_INTERRUPT !== "false" : runtimeConfig?.interrupt ?? true; - const leadMode = validateLeadMode( - process.env.TEAM_LEAD_MODE !== void 0 ? process.env.TEAM_LEAD_MODE : readHostLeadModeOverride() ?? runtimeConfig?.leadMode - ); - let context = buildSessionStartContext(identityText, interrupt, role.role === "lead" ? leadMode : void 0); + let modeSection; + if (role.role === "lead") { + if (leadMode === "always") { + modeSection = ORCHESTRATOR_SECTION_TEXT; + } else if (leadMode === "auto") { + const teamDir = safeTeamDir(role.teamId); + if (teamDir !== null && teamEverCreated(teamDir, role.teamId)) { + modeSection = ON_DEMAND_SECTION_TEXT; + } + } + } + let context = buildSessionStartContext(identityText, interrupt, modeSection); let pending = []; if (role.role === "lead" && rawSessionId !== null) { const teamDir = safeTeamDir(role.teamId); if (teamDir !== null) { recordLeadTurnEvent(teamDir, "start"); - pending = await pendingForLead(teamDir, role.teamId); - if (pending.length > 0) { - context += ` + if (!leadOff) { + pending = await pendingForLead(teamDir, role.teamId); + if (pending.length > 0) { + context += ` ${buildInboxContext(pending.map((m) => m.text))}`; + } } } } - await out({ - hookSpecificOutput: { - hookEventName: "SessionStart", - additionalContext: context - } - }); + if (!leadOff) { + await out({ + hookSpecificOutput: { + hookEventName: "SessionStart", + additionalContext: context + } + }); + } if (role.role === "lead" && rawSessionId !== null) { - if (pending.length > 0) { + if (!leadOff && pending.length > 0) { writeReceipts(DATA, role.teamId, pending.map((m) => m.messageId), "sessionstart"); await boundedAck("mailbox.ack", { session_id: rawSessionId, messageIds: pending.map((m) => m.messageId) }); } @@ -5408,7 +5446,7 @@ ${buildInboxContext(pending.map((m) => m.text))}`; const teamDir = safeTeamDir(role.teamId); if (teamDir !== null) { recordLeadTurnEvent(teamDir, "start"); - const pending = await pendingForLead(teamDir, role.teamId); + const pending = leadOff ? [] : await pendingForLead(teamDir, role.teamId); if (pending.length > 0) { await out({ hookSpecificOutput: { @@ -5426,7 +5464,7 @@ ${buildInboxContext(pending.map((m) => m.text))}`; const teamDir = safeTeamDir(role.teamId); if (teamDir !== null) { recordLeadTurnEvent(teamDir, "stop"); - const pending = await pendingForLead(teamDir, role.teamId); + const pending = leadOff ? [] : await pendingForLead(teamDir, role.teamId); if (pending.length > 0) { const runKey = runKeyFor(input.stop_hook_active); const budgetPaths = memberPaths(teamDir, role.teamId); diff --git a/external_plugins/agent-team/skills/team-coordination/SKILL.md b/external_plugins/agent-team/skills/team-coordination/SKILL.md index 85991fe1..f2b427bc 100644 --- a/external_plugins/agent-team/skills/team-coordination/SKILL.md +++ b/external_plugins/agent-team/skills/team-coordination/SKILL.md @@ -5,7 +5,7 @@ description: 智能体团队协作策略(agent-team 插件辅通道)。当 # 智能体团队 · 协调策略(stage-3 定版;〔对齐轮修订 2026-10-17〕换版 0.2.1-alpha.5) -本 skill 是团队策略的**辅通道**(主通道 = SessionStart hook additionalContext;兜底 = 工具 description)。三层文本同源:`src/mcp/policy.ts`(teamPolicy/POLICY_TEXT,冻结包 06 §3.1 逐字全文 + D7 冻结替换句;首段门控句随 0.2.1 删除,D5)。〔stage-6.5 D26,2026-10-24〕teamPolicy 四段仍逐字冻结;另有 **Lead-only 编排附加段**(见下节,主通道按 `leadMode` 插值)。 +本 skill 是团队策略的**辅通道**(主通道 = SessionStart hook additionalContext;兜底 = 工具 description)。三层文本同源:`src/mcp/policy.ts`(teamPolicy/POLICY_TEXT,冻结包 06 §3.1 逐字全文 + D7 冻结替换句;首段门控句随 0.2.1 删除,D5)。〔stage-6.5 D26,2026-10-24;issue #9 三档化 D28,2026-11-02〕teamPolicy 四段仍逐字冻结;另有 **Lead-only 模式段**(off/auto/always 三档,见下节,主通道按 `leadMode` 与建队状态插值)。 ## 策略全文(与 hook 主通道同文;以下为 `interrupt=true` 默认版) @@ -20,22 +20,28 @@ Prefer read/edit/write for file changes. If a file operation reports that the fi Use the target returned by spawn_teammate or list_agents for send_message and interrupt_agent, or as owner when assigning or filtering shared tasks. send_message steers a running target at its nearest step boundary and starts or resumes an inactive target. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Shared-task workflow is list, get, claim with the current revision, perform the work, then complete. Task readiness never starts an owner. Before wait_agent, use list_agents and make sure another required member is running or provisioning; use send_message first when the required member is inactive. wait_agent observes only changes after that call starts, never wakes a member, and returns noProgress immediately when no other member can produce a change. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer. -## Lead 编排模式(〔stage-6.5 D26〕2026-10-24 定稿) +## Lead 模式三档(〔stage-6.5 D26;issue #9 三档化 D28〕2026-11-02 定稿) -主通道在 **Lead 会话**且 `leadMode=orchestrator`(userConfig 默认)时,于身份段后追加以下英文段 -(逐字 = `src/mcp/policy.ts` 的 `ORCHESTRATOR_SECTION_TEXT`): +userConfig `leadMode` 三档(**新默认 `auto`**;旧值 `orchestrator`/`collaborator` 统一按 `auto` 处理,激进编排需显式改 `always`): + +- **`off`**:完全关闭——hook 不注入任何团队上下文(策略/身份/收件箱均停),daemon 不注册团队工具(tools/list 为 0 个,直连调用被拒)。 +- **`auto`**(默认,按需委派):该会话**未建过队**时注入 = 策略 + 身份(无模式段,对齐上游按需组队语义);**曾建过队**(`teams//members/` 存在非 sessionId 的成员目录——failed 也算,持久判定不回退)时,于身份段后追加以下英文段(逐字 = `src/mcp/policy.ts` 的 `ON_DEMAND_SECTION_TEXT`): + +> Lead operating mode (on-demand): Judge each request by delegation value before using the team. Handle work directly yourself — with a one-line reason, no forced tasks — for questions and explanations, small changes confined to a single file, read-only research summaries, or when every teammate is busy and the request is unrelated to existing work. Use the team workflow when work clearly benefits from multiple roles in parallel, when write scopes must be split across members, when a long task deserves its own context, or when the user explicitly names members. When you delegate, turn each delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description — a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. Wait for required teammates and synthesize their results for the final answer. + + 首次建队发生在会话中途时(SessionStart 已过),首成员 `spawn_teammate` 的成功结果尾部会附一行提示(`FIRST_SPAWN_NOTE`,独立 text 块,不改结果 JSON)。 +- **`always`**:始终主动编排——Lead 会话于身份段后追加以下英文段(逐字 = `src/mcp/policy.ts` 的 `ORCHESTRATOR_SECTION_TEXT`,即原 D26 编排段): > Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists — delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description — a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer. -- 本 skill 是静态 Markdown,无法运行时插值:`leadMode=collaborator` 时 hook 主通道**不注入**该段 - (注入文本与 DSH 复刻口径逐字节一致);teammate 会话恒不注入。以 hook 注入为准。 +- 本 skill 是静态 Markdown,无法运行时插值;teammate 会话恒不注入任何模式段。以 hook 注入为准。 - 验收协议(D27):owner `complete` = 提交;Lead 必须独立复核(读 diff + 跑测试 + 核验任务描述中的 验收标准);失败 → `reopen` 附具体问题(completed→pending+去 owner);通过 → `edit` 在 description 追加验收记录(面板可见),构成「标记完成」闭环。 ## ZCode 场景说明 -1. **团队工具**(server `team-daemon`):默认 9 个——`spawn_teammate` / `send_message` / `list_agents` / `interrupt_agent` / `wait_agent` / `team_task_create` / `team_task_list` / `team_task_get` / `team_task_update`;配置 `interrupt:false` 时为 8 个(不注册 `interrupt_agent`,策略中也不会出现该工具指引)。Lead-only 三操作(spawn / interrupt / reassign)在执行层强制;非成员会话调用一律 `TEAM_NOT_MEMBER`。〔stage-6.5 D26〕另有 userConfig `leadMode`(`orchestrator` 默认 / `collaborator`):只影响 Lead 会话是否注入编排段,**不改变工具数量**(两模式均 9/8 工具)。 +1. **团队工具**(server `team-daemon`):默认 9 个——`spawn_teammate` / `send_message` / `list_agents` / `interrupt_agent` / `wait_agent` / `team_task_create` / `team_task_list` / `team_task_get` / `team_task_update`;配置 `interrupt:false` 时为 8 个(不注册 `interrupt_agent`,策略中也不会出现该工具指引)。Lead-only 三操作(spawn / interrupt / reassign)在执行层强制;非成员会话调用一律 `TEAM_NOT_MEMBER`。〔issue #9 D28〕另有 userConfig `leadMode`(`auto` 默认 / `always` / `off`):`off` = **0 个团队工具**(不注册、直连调用被拒);`auto`/`always` = 9/8 工具(只影响 Lead 会话注入哪段模式文本)。 2. **建队友用 `spawn_teammate`**,不要用内置 Task/Agent 工具建一次性子代理(teammate 会话启动参数含 `--disallowed-tools Task` 遮蔽,D6)。 3. **消息投递**(〔对齐轮〕0.2.1 口径):`send_message` 成功 = 收件接受(工具结果 `{"sent":true}`);不保证接收方已处理;ZCode 无 steer → 运行中目标在回合边界交付(D2 适配),成功即免重发。目标离线导致确定性失败时,工具会返回可读错误,不要当作已送达。 4. **任务板 CAS**:先 `team_task_get`/`team_task_list` 读最新 `revision`,再 `team_task_update(action, expected_revision)`;收到 `TEAM_TASK_STALE_REVISION` → 重新 get 后重试。 diff --git a/marketplace.json b/marketplace.json index 95273865..dc0d4550 100644 --- a/marketplace.json +++ b/marketplace.json @@ -1457,7 +1457,7 @@ "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", "zh-CN": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。" }, - "version": "0.4.3", + "version": "0.5.0", "author": { "name": "Vincent Zuo", "url": "https://github.com/Vincent-chk" From e326d6b087251e6b28ed40684b728f6e9797b000 Mon Sep 17 00:00:00 2001 From: Developer Date: Mon, 2 Nov 2026 13:45:52 +0800 Subject: [PATCH 3/7] =?UTF-8?q?feat(agent-team):=20upgrade=20to=200.5.1=20?= =?UTF-8?q?=E2=80=94=20solo=20fallback=20when=20Lead=20model=20is=20a=20no?= =?UTF-8?q?n-inheritable=20official=20plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent-team/.zcode-plugin/plugin.json | 2 +- external_plugins/agent-team/CHANGELOG.md | 8 + external_plugins/agent-team/README.md | 2 + external_plugins/agent-team/README_CN.md | 2 + .../agent-team/runtime/team-daemon.mjs | 6 +- .../agent-team/runtime/team-hooks.mjs | 420 +++++++++++++++++- marketplace.json | 2 +- 7 files changed, 423 insertions(+), 19 deletions(-) diff --git a/external_plugins/agent-team/.zcode-plugin/plugin.json b/external_plugins/agent-team/.zcode-plugin/plugin.json index 8861c613..33a44b9f 100644 --- a/external_plugins/agent-team/.zcode-plugin/plugin.json +++ b/external_plugins/agent-team/.zcode-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-team", - "version": "0.5.0", + "version": "0.5.1", "description": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。", "description_i18n": { "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", diff --git a/external_plugins/agent-team/CHANGELOG.md b/external_plugins/agent-team/CHANGELOG.md index a735dd42..30bcbec5 100644 --- a/external_plugins/agent-team/CHANGELOG.md +++ b/external_plugins/agent-team/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.5.1 — 2026-11-02 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **订阅模型降级自干(issue #5 / 偏差 D29)**:Lead 的已确认模型为官方套餐(`account:*`/`builtin:*`,CLI 子进程拿不到凭据、spawn 必败)时,hook 在 SessionStart 或首轮提问**每会话一次**注入单 agent 兜底提示——Lead 直接自己干全部工作、不再浪费轮次试建队;措辞非永久(中途切第三方模型后 spawn 成功即恢复正常用队)。检测乐观(三源全空/读库失败绝不误报)。 +- spawn 失败报错与 `spawn_teammate` 工具描述同步补「或由 Lead 直接完成该工作」出路。 +- 本地验收:**882 用例 / 75 文件**全部通过(新增探针 6 例 + hook 注入/去重/合并 7 例);覆盖率 91.6/85.05/92.5/93.35 门槛不变;`npm run check`、文本审计 25 项通过;本机订阅模型真会话实证。 + ## 0.5.0 — 2026-11-02 描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 diff --git a/external_plugins/agent-team/README.md b/external_plugins/agent-team/README.md index 7daa9187..98587bd7 100644 --- a/external_plugins/agent-team/README.md +++ b/external_plugins/agent-team/README.md @@ -87,6 +87,7 @@ Create a teammate named reviewer to check the first three paragraphs of README f - **Failures are never silent; retries are bounded (0.4.1)**: when the Lead's model cannot be inherited (official coding plan, deleted/disabled Provider, unparseable state), spawning/resuming fails loudly with the reason — it never silently runs a different model. The failure shows in the member's diagnostics and pending messages are preserved. Deterministic rejections (plan/out-of-catalog) suspend auto-retry; transient faults (timeouts) back off 5s/15s/30s, at most 3 auto-retries. Switching the Lead back to a usable model — or sending a new message — resumes delivery and clears the stale error. - **Pre-spawn validation (0.4.1)**: when the Lead's model is not inheritable, `spawn_teammate` fails **before** registering the member — no failed member, no name consumed; after fixing the Lead's model the same name is reusable. - **Official coding plans cannot be inherited (hard boundary)**: members are independent CLI processes and the host does not hand subscription-plan credentials (`account:*` / `builtin:*` providers, e.g. GLM official coding plans) to them, so **inheriting an official coding-plan model is not supported**. Spawning/resuming while the Lead uses a plan model fails; switch the Lead to your own third-party model first (ZCode Settings → Model Services, add your own Provider + API key). +- **Solo fallback when teammates are unavailable (0.5.1)**: when the Lead's confirmed model is an official plan model, the Lead is told once per session (SessionStart or the first prompt) that teammates cannot be spawned — it then does all the work itself instead of wasting turns on failing spawns. The note is non-permanent: if you switch the Lead to a third-party model mid-session and a spawn succeeds, the team works normally from then on. ### 3. `/team` for status @@ -275,6 +276,7 @@ This plugin is a re-implementation of DSH Agent Teams on ZCode. The deviations b | D26 | `always` mode (pre-0.5.0 default `orchestrator`): the Lead proactively staffs/assigns/accepts and does not implement itself (except one-line fixes or when nobody can take it) | | D27 | Task `complete` means "submitted": the Lead must independently verify before acceptance; failures are `reopen`ed with concrete findings, passes append an acceptance note to the task | | D28 | Since 0.5.0 the default is `auto` (issue #9): no mode section is injected before a team exists; after the first teammate the on-demand section applies (delegation-value judgment with positive/negative examples); `off` disables injection and team tools entirely; legacy `orchestrator`/`collaborator` values migrate to `auto`; a stale pre-0.5.0 runtime-config is treated as unset | +| D29 | When the Lead's confirmed model is an official plan model (issue #5), hooks inject a one-time solo note (do all work yourself, don't call spawn_teammate; non-permanent — a later successful spawn restores normal team use) and the spawn error message offers the same fallback; detection is optimistic (unknown/failed reads never trigger the note) | ## Documentation diff --git a/external_plugins/agent-team/README_CN.md b/external_plugins/agent-team/README_CN.md index 1e8dfdfc..0094d38e 100644 --- a/external_plugins/agent-team/README_CN.md +++ b/external_plugins/agent-team/README_CN.md @@ -87,6 +87,7 @@ zcode plugins enable agent-team@zcode-plugins-official - **失败绝不静默、重试有节制(0.4.1)**:Lead 的模型无法被成员继承时(官方 coding plan、Provider 被删除/禁用、解析不出),创建/续跑会直接报错并说明原因,不会悄悄用别的模型开跑;失败原因在成员行诊断可见,待处理消息保留不丢。同一失败不会无限重试:确定性拒绝(套餐/目录外)暂停自动重试,临时故障(超时等)按 5s/15s/30s 退避最多自动重试 3 次;Lead 换回可用模型或你再发一条新消息即自动恢复交付,恢复成功后旧错误提示自动消失。 - **创建前校验(0.4.1)**:Lead 模型不可继承时,`spawn_teammate` 在登记成员**之前**就报错——不产生 failed 成员、不占用成员名;修正 Lead 模型后原名可直接重用。 - **不支持继承官方 coding plan(硬性边界)**:成员是独立 CLI 进程,宿主不向它下发订阅套餐(`account:*` / `builtin:*` Provider,如智谱 GLM 官方 coding plan)的凭据,因此**不支持直接继承官方 coding plan 模型配置**。Lead 正在用套餐模型时创建/续跑成员会报错;请先在 ZCode 中把 Lead 切换到自配的第三方模型(ZCode 设置 → 模型服务,添加你自己的 Provider + API Key)。 +- **队友不可用时单 agent 兜底(0.5.1)**:Lead 的已确认模型是官方套餐时,插件会在会话开始(或首轮提问)一次性告知 Lead「队友无法孵化」——Lead 直接自己干全部工作,不再浪费轮次去试注定失败的建队。提示为非永久措辞:中途把 Lead 切到第三方模型后一旦 spawn 成功,团队功能即恢复正常使用。 ### 3. `/team` 看状态 @@ -275,6 +276,7 @@ zcode plugins list --json # 看 version / rootPath / dataPath / diagnosti | D26 | `always` 档(0.5.0 前的默认 `orchestrator`):主动组队/分配/独立验收,不亲自实现(除一行级修复或无人可派) | | D27 | 任务 `complete` 是“提交”,Lead 需独立复核后才算验收完成;失败会 `reopen` 并附具体问题,通过则在任务描述里追加验收记录 | | D28 | 0.5.0 起默认 `auto`(issue #9):建队前不注入任何模式段;首个队友创建后注入按需段(委派价值判断+正反例);`off` 完全停注入并注销团队工具;旧值 `orchestrator`/`collaborator` 统一迁移 `auto`;0.5.0 前的 runtime-config 落盘视为过期 | +| D29 | Lead 已确认模型为官方套餐时(issue #5),hook 每会话一次性注入单 agent 兜底提示(自己干全部工作、不试 spawn;非永久——后续 spawn 成功即恢复正常用队);spawn 报错同步给出该出路;检测乐观(未知/读库失败绝不触发提示) | ## 文档 diff --git a/external_plugins/agent-team/runtime/team-daemon.mjs b/external_plugins/agent-team/runtime/team-daemon.mjs index a6e15107..c11e421d 100644 --- a/external_plugins/agent-team/runtime/team-daemon.mjs +++ b/external_plugins/agent-team/runtime/team-daemon.mjs @@ -22891,9 +22891,9 @@ var PANEL_RESOURCE_URI = "ui://agent-team/team-panel.html"; var PANEL_SURFACE_ID = "agent-team-panel"; var TEAM_TOOL_DEFINITIONS = [ { - // 02 §9.3(〔issue #9 三档化 D28〕描述去 orchestrator 档位措辞,改模式中立的按需口径) + // 02 §9.3(〔issue #9 D28〕去档位措辞;〔issue #5 / D29〕补不可继承失败口径) name: "spawn_teammate", - description: "Create one named, durable teammate. Only the Team Lead may call this tool. Create teammates when the goal clearly benefits from delegation \u2014 multiple roles in parallel, disjoint write scopes, or long tasks needing their own context \u2014 within the member limit. The teammate automatically follows the Lead's latest confirmed model and reasoning level on every turn; there is no per-member model option.", + description: "Create one named, durable teammate. Only the Team Lead may call this tool. Create teammates when the goal clearly benefits from delegation \u2014 multiple roles in parallel, disjoint write scopes, or long tasks needing their own context \u2014 within the member limit. If the Lead's model cannot be inherited (official plan model), the call fails \u2014 handle the work directly instead. The teammate automatically follows the Lead's latest confirmed model and reasoning level on every turn; there is no per-member model option.", inputSchema: { type: "object", properties: { @@ -25817,7 +25817,7 @@ var ResumePerTurnProvider = class { if (isOfficialPlan) { if (!throwOnUnusable) return void 0; throw new ModelInheritanceError( - `Lead \u5F53\u524D\u4F7F\u7528\u5B98\u65B9\u5957\u9910\u6A21\u578B\uFF08${model}\uFF09\uFF0C\u6210\u5458\u65E0\u6CD5\u7EE7\u627F\uFF08CLI \u8FDB\u7A0B\u62FF\u4E0D\u5230\u8BA2\u9605\u5957\u9910\u51ED\u636E\uFF09\u3002\u8BF7\u5728 ZCode \u4E2D\u5207\u6362\u5230\u81EA\u914D\u7684\u7B2C\u4E09\u65B9\u6A21\u578B\u540E\u91CD\u8BD5\u3002`, + `Lead \u5F53\u524D\u4F7F\u7528\u5B98\u65B9\u5957\u9910\u6A21\u578B\uFF08${model}\uFF09\uFF0C\u6210\u5458\u65E0\u6CD5\u7EE7\u627F\uFF08CLI \u8FDB\u7A0B\u62FF\u4E0D\u5230\u8BA2\u9605\u5957\u9910\u51ED\u636E\uFF09\u3002\u8BF7\u5728 ZCode \u4E2D\u5207\u6362\u5230\u81EA\u914D\u7684\u7B2C\u4E09\u65B9\u6A21\u578B\u540E\u91CD\u8BD5\uFF1B\u6216\u7531 Lead \u76F4\u63A5\u5B8C\u6210\u8BE5\u5DE5\u4F5C\uFF08\u5355 agent \u515C\u5E95\uFF09\u3002`, latest ); } diff --git a/external_plugins/agent-team/runtime/team-hooks.mjs b/external_plugins/agent-team/runtime/team-hooks.mjs index c81dec7f..07a752de 100644 --- a/external_plugins/agent-team/runtime/team-hooks.mjs +++ b/external_plugins/agent-team/runtime/team-hooks.mjs @@ -5,8 +5,8 @@ var __export = (target, all) => { }; // src/hooks.ts -import fs9 from "node:fs"; -import path10 from "node:path"; +import fs10 from "node:fs"; +import path11 from "node:path"; // src/shared.ts import fs from "node:fs"; @@ -167,6 +167,7 @@ To message another teammate, use send_message({ target: "", messa var POLICY_PROBE_MARKER = "quartz-ember-73"; var ORCHESTRATOR_SECTION_TEXT = "Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists \u2014 delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer."; var ON_DEMAND_SECTION_TEXT = "Lead operating mode (on-demand): Judge each request by delegation value before using the team. Handle work directly yourself \u2014 with a one-line reason, no forced tasks \u2014 for questions and explanations, small changes confined to a single file, read-only research summaries, or when every teammate is busy and the request is unrelated to existing work. Use the team workflow when work clearly benefits from multiple roles in parallel, when write scopes must be split across members, when a long task deserves its own context, or when the user explicitly names members. When you delegate, turn each delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. Wait for required teammates and synthesize their results for the final answer."; +var DEGRADED_SOLO_NOTE = "[agent-team] Teammates unavailable in this session: the Lead's model is an official plan model that teammate processes cannot inherit, so spawn_teammate will fail. Do all work yourself in this session and do not call spawn_teammate; if a spawn_teammate call succeeds later, use the team normally. To enable teammates, ask the user to switch the Lead to a self-configured third-party model."; function buildSessionStartContext(identityText, interrupt = true, modeSection) { const policy = teamPolicy(interrupt); const section = modeSection !== void 0 ? ` @@ -969,8 +970,8 @@ function getErrorMap() { // node_modules/zod/v3/helpers/parseUtil.js var makeIssue = (params) => { - const { data, path: path11, errorMaps, issueData } = params; - const fullPath = [...path11, ...issueData.path || []]; + const { data, path: path12, errorMaps, issueData } = params; + const fullPath = [...path12, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath @@ -1086,11 +1087,11 @@ var errorUtil; // node_modules/zod/v3/types.js var ParseInputLazyPath = class { - constructor(parent, value, path11, key) { + constructor(parent, value, path12, key) { this._cachedPath = []; this.parent = parent; this.data = value; - this._path = path11; + this._path = path12; this._key = key; } get path() { @@ -5293,17 +5294,393 @@ function recordLeadTurnEvent(teamDir, event2, now = Date.now()) { const prior = readLeadState(teamDir); writeLeadState(teamDir, { ...prior?.lastWakeAt !== void 0 ? { lastWakeAt: prior.lastWakeAt } : {}, + ...prior?.soloNotifiedAt !== void 0 ? { soloNotifiedAt: prior.soloNotifiedAt } : {}, active: event2 === "start", updatedAt: new Date(now).toISOString() }); } catch { } } +function markSoloNotified(teamDir, now = Date.now()) { + try { + const prior = readLeadState(teamDir); + writeLeadState(teamDir, { + ...prior?.lastWakeAt !== void 0 ? { lastWakeAt: prior.lastWakeAt } : {}, + ...prior?.soloNotifiedAt !== void 0 ? { soloNotifiedAt: prior.soloNotifiedAt } : {}, + active: prior?.active ?? false, + updatedAt: new Date(now).toISOString(), + soloNotifiedAt: new Date(now).toISOString() + }); + } catch { + } +} + +// src/provider/transcript.ts +import fs9 from "node:fs"; +import os3 from "node:os"; +import path10 from "node:path"; +import { DatabaseSync } from "node:sqlite"; + +// src/provider/model-selection.ts +function parseModelSelection(value) { + if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0; + const record = value; + const providerId = nonEmptyString(record.providerId); + const modelId = nonEmptyString(record.modelId); + if (providerId === void 0 || modelId === void 0) return void 0; + const options = record.options; + if (options !== void 0 && (typeof options !== "object" || options === null || Array.isArray(options))) { + return void 0; + } + let reasoningLevel; + const rawLevel = options !== void 0 ? options.reasoningLevel : record.reasoningLevel; + if (rawLevel !== void 0) { + reasoningLevel = nonEmptyString(rawLevel); + if (reasoningLevel === void 0) return void 0; + } + return { providerId, modelId, ...reasoningLevel !== void 0 ? { reasoningLevel } : {} }; +} +function nonEmptyString(value) { + if (typeof value !== "string") return void 0; + const trimmed = value.trim(); + return trimmed.length > 0 ? trimmed : void 0; +} + +// src/provider/transcript.ts +function defaultDbPath() { + return process.env.TEAM_DB_PATH ?? path10.join(os3.homedir(), ".zcode", "cli", "db", "db.sqlite"); +} +var TranscriptReader = class { + dbPath; + db = null; + dbMissing = false; + constructor(deps = {}) { + this.dbPath = deps.dbPath ?? defaultDbPath(); + } + get path() { + return this.dbPath; + } + /** 库不存在 = 空库语义(探针方法走缺省值,不建临时库)。 */ + missing() { + if (!this.dbMissing) this.dbMissing = !fs9.existsSync(this.dbPath); + else if (!fs9.existsSync(this.dbPath)) return true; + else this.dbMissing = false; + return this.dbMissing; + } + open() { + if (this.db !== null) return this.db; + if (!fs9.existsSync(this.dbPath)) { + throw new Error("transcript db missing"); + } + this.db = new DatabaseSync(this.dbPath, { readOnly: true }); + return this.db; + } + close() { + this.db?.close(); + this.db = null; + } + /** 会话行实查;不存在 → undefined;读失败 → 抛错。 */ + session(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + "SELECT id, parent_id, directory, task_type, title, time_created FROM session WHERE id = ?" + ).get(sessionId); + return row ?? void 0; + } + /** 找「目录 = cwd 且创建于 sinceMs 之后、首条真实用户文本 = firstPrompt」的会话(fresh spawn 探针)。 */ + findSessionByFirstPrompt(args) { + if (this.missing()) return void 0; + const rows = this.open().prepare( + "SELECT id, time_created FROM session WHERE directory = ? AND time_created >= ? ORDER BY time_created ASC" + ).all(args.cwd, args.sinceMs - 2e3); + for (const row of rows) { + if (args.excludeSessionIds?.has(row.id)) continue; + const first = this.firstRealUserText(row.id); + if (first === args.firstPrompt) return row.id; + } + return void 0; + } + /** 首条「真实用户」消息的文本部分(跳过 hook/系统注入的 model-only 消息)。 */ + firstRealUserText(sessionId) { + if (this.missing()) return null; + const rows = this.open().prepare( + `SELECT p.data pdata FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + ORDER BY m.sequence, p.sequence LIMIT 1` + ).all(sessionId); + if (rows.length === 0) return null; + return extractText(rows[0].pdata); + } + /** 会话中是否已存在该文本的「真实用户」消息(delivered/去重探针:prompt 逐字落库)。 */ + hasUserText(sessionId, text) { + if (this.missing()) return false; + const row = this.open().prepare( + `SELECT COUNT(*) n FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + AND json_extract(p.data,'$.text') = ? LIMIT 1` + ).get(sessionId, text); + return row.n > 0; + } + /** 会话全部「真实用户」文本消息(时间序;轮次 prompt 审计/恰一次检索用)。 */ + realUserTexts(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.id mid, m.time_created tc, p.data pdata, + json_extract(m.data,'$.semantics.origin') origin, + json_extract(m.data,'$.modelSelection.modelId') model + FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(p.data,'$.type') = 'text' + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + return rows.map((r) => ({ + messageId: r.mid, + text: extractText(r.pdata) ?? "", + timeCreated: r.tc, + origin: r.origin, + modelId: r.model + })); + } + /** 会话最新使用的模型(成员行 model 字段实查;无消息 → undefined)。 */ + latestModel(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT json_extract(m.data,'$.modelSelection.modelId') model FROM message m + WHERE m.session_id = ? AND json_extract(m.data,'$.modelSelection.modelId') IS NOT NULL + ORDER BY m.sequence DESC LIMIT 1` + ).get(sessionId); + return row?.model; + } + /** + * 最近一条「真实用户提交」(semantics.origin=real_user)消息携带的模型快照 + 提交时间。 + * 0.4.0 三源判定的「提交证据」:宿主保存用户消息时写入该次提交的 modelSelection(本机源码核对), + * 输入框切换在提交瞬间即体现在这里——不依赖会话选模条目(issue #7 场景它可能滞后)。 + * hook/系统注入的 user 消息(origin≠real_user)不算提交。 + */ + latestSubmissionSelection(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT m.time_created tc, + json_extract(m.data,'$.modelSelection.providerId') p, + json_extract(m.data,'$.modelSelection.modelId') mo, + json_extract(m.data,'$.modelSelection.options.reasoningLevel') lvl + FROM message m + WHERE m.session_id = ? AND json_extract(m.data,'$.role') = 'user' + AND json_extract(m.data,'$.semantics.origin') = 'real_user' + AND json_extract(m.data,'$.modelSelection.providerId') IS NOT NULL + AND json_extract(m.data,'$.modelSelection.modelId') IS NOT NULL + ORDER BY m.time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.p.trim(); + const modelId = row.mo.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const lvl = typeof row.lvl === "string" ? row.lvl.trim() : ""; + return { + selection: { providerId, modelId, ...lvl.length > 0 ? { reasoningLevel: lvl } : {} }, + at: row.tc + }; + } + /** 会话选模条目 + 生效时间(UPSERT 单行;用于与提交快照比较「后来是否有 /model 修改」)。 */ + latestModelSelectionTimed(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT data, MAX(COALESCE(time_updated, time_created), time_created) at FROM session_entry + WHERE session_id = ? AND type = 'runtime/model_selection' + ORDER BY time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const selection = this.latestModelSelection(sessionId); + if (selection === void 0) return void 0; + return { selection, at: row.at }; + } + /** + * 最近一次**主轮**实际模型调用(+ 开始时间)。query_source='main_turn' 过滤是 0.4.0 关键口径: + * compact/标题生成/goal 摘要/subagent/workflow 子轮的行属于辅助模型,绝不能当作 Lead 当前模型 + * (实测本机取值域 = compact, goal_summary_title, main_turn, session_title, subagent, + * target_completion_verification, workflow_child)。 + */ + latestMainTurnUsage(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT provider_id, model_id, variant, started_at FROM model_usage + WHERE session_id = ? AND query_source = 'main_turn' + ORDER BY started_at DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.provider_id.trim(); + const modelId = row.model_id.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const variant = typeof row.variant === "string" ? row.variant.trim() : ""; + return { + selection: { providerId, modelId, ...variant.length > 0 ? { reasoningLevel: variant } : {} }, + at: row.started_at + }; + } + /** + * 会话库中最近一次 setModel 的选择(Round A 实证:条目为 UPSERT 单行,canonical id + * `:runtime-model-selection`,时间排序安全)。data 取嵌套 modelSelection 优先; + * 兼容旧行把 providerId/modelId/thoughtLevel 平铺在顶层的形态。 + */ + latestModelSelection(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT data FROM session_entry + WHERE session_id = ? AND type = 'runtime/model_selection' + ORDER BY time_created DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const data = parseOrNull(row.data); + if (data === null) return void 0; + const nested = parseModelSelection(data.modelSelection); + if (nested !== void 0) return nested; + const providerId = typeof data.providerId === "string" ? data.providerId.trim() : ""; + const modelId = typeof data.modelId === "string" ? data.modelId.trim() : ""; + if (providerId.length === 0 || modelId.length === 0) return void 0; + const thoughtLevel = typeof data.thoughtLevel === "string" ? data.thoughtLevel.trim() : ""; + return { + providerId, + modelId, + ...thoughtLevel.length > 0 ? { reasoningLevel: thoughtLevel } : {} + }; + } + /** 最近一次真实模型调用(session_entry 缺失时的继承兜底;variant = 思考强度)。 */ + latestModelUsage(sessionId) { + if (this.missing()) return void 0; + const row = this.open().prepare( + `SELECT provider_id, model_id, variant FROM model_usage + WHERE session_id = ? ORDER BY started_at DESC LIMIT 1` + ).get(sessionId); + if (row === void 0) return void 0; + const providerId = row.provider_id.trim(); + const modelId = row.model_id.trim(); + if (providerId.length === 0 || modelId.length === 0) return void 0; + const variant = typeof row.variant === "string" ? row.variant.trim() : ""; + return { + providerId, + modelId, + ...variant.length > 0 ? { reasoningLevel: variant } : {} + }; + } + /** 完成回合导出(D3 fork 转录):真实用户消息 + 助手文本;tool 部分记工具名。 */ + exportTurns(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.data mdata, p.data pdata FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + const turns = []; + for (const r of rows) { + const message = parseOrNull(r.mdata); + const part = parseOrNull(r.pdata); + if (message === null || part === null) continue; + const isUser = message.role === "user"; + const isAssistant = message.role === "assistant"; + const realUser = isUser && message.semantics?.origin === "real_user"; + if (part.type === "text" && typeof part.text === "string") { + if (realUser) turns.push({ role: "user", text: part.text, toolNames: [] }); + else if (isAssistant) turns.push({ role: "assistant", text: part.text, toolNames: [] }); + } else if (isAssistant && part.type === "tool" && typeof part.tool === "string") { + const last = turns[turns.length - 1]; + if (last !== void 0 && last.role === "assistant" && !last.toolNames.length) { + last.toolNames.push(part.tool); + } else { + turns.push({ role: "assistant", text: "", toolNames: [part.tool] }); + } + } + } + return turns; + } + /** + * T5.7 成员会话查看视图导出(detail 合成数据源;只读、走 session_id 索引): + * 时间序全量 part 行(text/tool 两型;其余 part 型跳过),损坏行跳过。 + * 与 exportTurns 的区别:保留每条 part 的时间戳/role/工具状态(面板折叠行渲染), + * 不做回合聚合;hook 注入文本不落 transcript part(H14),framed 徽标由 + * panel/detail.ts 以 events 回填(不改写原文)。 + */ + exportDetailParts(sessionId) { + if (this.missing()) return []; + const rows = this.open().prepare( + `SELECT m.data mdata, m.time_created mtc, p.data pdata, p.time_created ptc + FROM message m JOIN part p ON p.message_id = m.id + WHERE m.session_id = ? + ORDER BY m.sequence, p.sequence` + ).all(sessionId); + const out2 = []; + for (const r of rows) { + const message = parseOrNull(r.mdata); + const part = parseOrNull(r.pdata); + if (message === null || part === null) continue; + const role2 = message.role === "user" ? "user" : message.role === "assistant" ? "assistant" : void 0; + if (role2 === void 0) continue; + if (role2 === "user" && message.semantics?.origin !== "real_user") continue; + const ts2 = typeof r.ptc === "number" ? r.ptc : r.mtc; + if (part.type === "text" && typeof part.text === "string") { + out2.push({ ts: ts2, role: role2, kind: "text", text: part.text }); + } else if (part.type === "tool" && typeof part.tool === "string") { + const status = typeof part.state?.status === "string" ? part.state.status : "unknown"; + out2.push({ + ts: ts2, + role: "assistant", + kind: "toolCall", + toolName: part.tool, + toolStatus: status, + ...part.state?.input !== void 0 ? { toolInput: part.state.input } : {}, + ...part.state?.output !== void 0 ? { toolOutput: part.state.output } : {} + }); + } + } + return out2; + } +}; +function parseOrNull(raw2) { + try { + return JSON.parse(raw2); + } catch { + return null; + } +} +function extractText(partData) { + try { + const part = JSON.parse(partData); + return typeof part.text === "string" ? part.text : null; + } catch { + return null; + } +} + +// src/provider/lead-model-probe.ts +function probeLeadPlanModel(sessionId, dbPath = defaultDbPath()) { + try { + const reader = new TranscriptReader({ dbPath }); + try { + const sources = [ + reader.latestSubmissionSelection(sessionId), + reader.latestModelSelectionTimed(sessionId), + reader.latestMainTurnUsage(sessionId) + ].filter((source) => source !== void 0); + if (sources.length === 0) return { blocked: false }; + const latest = sources.reduce((a, b) => b.at > a.at ? b : a).selection; + const isOfficialPlan = latest.providerId.startsWith("account:") || latest.providerId.startsWith("builtin:"); + return isOfficialPlan ? { blocked: true, model: `${latest.providerId}/${latest.modelId}` } : { blocked: false }; + } finally { + reader.close(); + } + } catch { + return { blocked: false }; + } +} // src/hooks.ts function readStdin() { try { - return fs9.readFileSync(0, "utf8"); + return fs10.readFileSync(0, "utf8"); } catch { return ""; } @@ -5316,7 +5693,7 @@ try { input = { parse_error: true, raw_preview: raw.slice(0, 500) }; } var DATA = dataDir(); -ensureDir(path10.join(DATA, "logs")); +ensureDir(path11.join(DATA, "logs")); var event = (input.hook_event_name ?? process.env.ZCODE_HOOK_EVENT ?? "unknown").toLowerCase(); var envOverlay = {}; for (const k of Object.keys(process.env)) { @@ -5338,7 +5715,7 @@ var logLine = { prompt_chars: promptText !== null ? promptText.length : null, source: input.source ?? null }; -appendJsonl(path10.join(DATA, "logs", "hooks.jsonl"), logLine); +appendJsonl(path11.join(DATA, "logs", "hooks.jsonl"), logLine); var registry = readSessionRegistry(DATA); var sessionKey = rawSessionId !== null ? safeSessionKey(rawSessionId) : ""; var selfEntry = rawSessionId !== null ? registry[sessionKey] : void 0; @@ -5369,7 +5746,7 @@ function safeTeamDir(teamId) { if (!/^[A-Za-z0-9._-]+$/.test(teamId) || teamId === "." || teamId === "..") return null; const { teamDir } = teamPaths(DATA, teamId); try { - assertPathInside(path10.join(DATA, "teams"), teamDir); + assertPathInside(path11.join(DATA, "teams"), teamDir); } catch { return null; } @@ -5412,6 +5789,14 @@ if (event === "sessionstart") { } } let context = buildSessionStartContext(identityText, interrupt, modeSection); + if (role.role === "lead" && !leadOff && rawSessionId !== null) { + const soloTeamDir = safeTeamDir(role.teamId); + if (soloTeamDir !== null && readLeadState(soloTeamDir)?.soloNotifiedAt === void 0 && probeLeadPlanModel(rawSessionId).blocked) { + context += ` +${DEGRADED_SOLO_NOTE}`; + markSoloNotified(soloTeamDir); + } + } let pending = []; if (role.role === "lead" && rawSessionId !== null) { const teamDir = safeTeamDir(role.teamId); @@ -5447,15 +5832,22 @@ ${buildInboxContext(pending.map((m) => m.text))}`; if (teamDir !== null) { recordLeadTurnEvent(teamDir, "start"); const pending = leadOff ? [] : await pendingForLead(teamDir, role.teamId); - if (pending.length > 0) { + const soloNeeded = !leadOff && readLeadState(teamDir)?.soloNotifiedAt === void 0 && probeLeadPlanModel(rawSessionId).blocked; + if (pending.length > 0 || soloNeeded) { + const parts = []; + if (soloNeeded) parts.push(DEGRADED_SOLO_NOTE); + if (pending.length > 0) parts.push(buildInboxContext(pending.map((m) => m.text))); await out({ hookSpecificOutput: { hookEventName: "UserPromptSubmit", - additionalContext: buildInboxContext(pending.map((m) => m.text)) + additionalContext: parts.join("\n") } }); - writeReceipts(DATA, role.teamId, pending.map((m) => m.messageId), "userpromptsubmit"); - await boundedAck("mailbox.ack", { session_id: rawSessionId, messageIds: pending.map((m) => m.messageId) }); + if (soloNeeded) markSoloNotified(teamDir); + if (pending.length > 0) { + writeReceipts(DATA, role.teamId, pending.map((m) => m.messageId), "userpromptsubmit"); + await boundedAck("mailbox.ack", { session_id: rawSessionId, messageIds: pending.map((m) => m.messageId) }); + } } } } diff --git a/marketplace.json b/marketplace.json index dc0d4550..92fa44ca 100644 --- a/marketplace.json +++ b/marketplace.json @@ -1457,7 +1457,7 @@ "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", "zh-CN": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。" }, - "version": "0.5.0", + "version": "0.5.1", "author": { "name": "Vincent Zuo", "url": "https://github.com/Vincent-chk" From 8f1a139f13a199e0fb8850f45b301053c0eed05c Mon Sep 17 00:00:00 2001 From: Developer Date: Mon, 2 Nov 2026 22:22:43 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat(agent-team):=20upgrade=20to=200.5.3=20?= =?UTF-8?q?=E2=80=94=20factual=20solo=20note,=20/team=20with-arg=20executi?= =?UTF-8?q?on,=20dual-signal=20lock=20liveness,=20provisioning=20reconcile?= =?UTF-8?q?=20grace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent-team/.zcode-plugin/plugin.json | 2 +- external_plugins/agent-team/CHANGELOG.md | 22 + external_plugins/agent-team/README.md | 14 +- external_plugins/agent-team/README_CN.md | 14 +- external_plugins/agent-team/commands/team.md | 62 +- .../agent-team/runtime/team-daemon.mjs | 921 ++++++++++-------- .../agent-team/runtime/team-hooks.mjs | 116 ++- marketplace.json | 53 +- 8 files changed, 767 insertions(+), 437 deletions(-) diff --git a/external_plugins/agent-team/.zcode-plugin/plugin.json b/external_plugins/agent-team/.zcode-plugin/plugin.json index 33a44b9f..755cd4dd 100644 --- a/external_plugins/agent-team/.zcode-plugin/plugin.json +++ b/external_plugins/agent-team/.zcode-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-team", - "version": "0.5.1", + "version": "0.5.3", "description": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。", "description_i18n": { "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", diff --git a/external_plugins/agent-team/CHANGELOG.md b/external_plugins/agent-team/CHANGELOG.md index 30bcbec5..e44e0fb6 100644 --- a/external_plugins/agent-team/CHANGELOG.md +++ b/external_plugins/agent-team/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## 0.5.3 — 2026-11-02 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **降级提示改为事实描述(D30 修订,重要)**:0.5.2 的提示里含 `do not call spawn_teammate`,该句进入对话历史后**不可撤销**——实测中用户切到第三方模型、撤回提示也已注入,模型仍服从早期禁令、全程不调用 spawn,表现为「切成第三方还是不能用」。现改为只陈述当前事实 + 明确恢复条件("此刻调用会因继承限制失败;一旦换成自配第三方模型就正常可用,无需额外确认"),并**禁止任何禁止性祈使句**(`scripts/text-audit.mjs` 加反向断言)。撤回提示同时显式声明早前提示失效,并要求用一行告知用户「队友已可用」(此前模型心里知道但不告知,用户感知不到恢复)。 +- **`/team` 带参数时真的建队执行**:`/team`(无参)仍严格只读输出状态摘要;`/team <任务>` 先输出摘要,再按角色 spawn 成员、必要时建共享任务并划写域、等齐结果后汇总,`spawn_teammate` 失败时明确说明原因并改为直接完成。此前 `/team <任务>` 只读状态后模型自行代劳,用户连输两次都没建队(2026-11-02 体感问题)。 +- **`/team` 取数改走 MCP 主通道,禁止猜目录**:成员/任务只来自 `list_agents` + `team_task_list`(团队身份由宿主 `_meta.session_id` 解析);`teamDir` 只用于渲染可选 CLI 段且优先取 `TEAM_PLUGIN_DATA`。删除了「扫 `agent-team*/teams/` 最近修改目录」的兜底——多副本并存时它会跨数据根读到别的插件的团队(实测导致 Lead 依据错误成员列表空转)。 +- **协调者锁双信号存活判定(偏差 D32)**:真会话取证(`sess_cabd748c`)显示协调者锁会把**活着的持有者**误判死亡——心跳是 1s 同步写盘,daemon 事件循环被同步 fsync 卡住时心跳文件停滞超过 4.5s 过期阈值,竞争者即抢锁;抢锁瞬间新协调者构造即跑 provisioning 对账,把两个仍在正常供给的成员误杀(面板红字 `provisioning did not leave a…` / `app-server rpc timeout: v4/…`)。现抢锁前先看持有者 PID 是否存活:真崩溃(PID 已死)→ 立即接任(kill -9 ≤5s SLA 不变);stalled-but-alive → 记 `steal-deferred` 审计并宽限 3s 复核、15s 硬上限兜底;锁文件增 `startedAt` + `ps -o etime=` 防 PID 复用;心跳首写失败补审计、renew 坏写重试一次。 +- **provisioning 对账宽限(偏差 D33)**:新协调者上任即跑对账,而 in-flight spawn 的 origin 记录在 createChild 之后才落盘(实测窗口 7–46s)→ 旧逻辑误杀。现按 journal 事件年龄(<60s)跳过瞬态判定并 10s 后复核;年龄超宽限或恢复抛错照旧定案(真故障不被掩盖)。 +- 本地验收:**908 用例 / 75 文件**全部通过;崩溃护栏 f29/crash-matrix/real-host 原样全绿(takeover 实测 4270–4305ms ≤5s,SLA 未退化);文本审计 26 项、S9 14 项、`npm run check` 与构建产物门通过。S3 的 C1–C5 子进程仍受 exFAT 环境挂账影响(stage-2 矩阵 12 点含 takeover-mid 在 S3 内通过)。 + +## 0.5.2 — 2026-11-02 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **会话开始即知晓 + 首轮对账(issue #5 / 偏差 D30)**:`startup` 路径原本读不到库(hook 先于会话行落库约 1.4s,三源必空),0.5.1 的说法「首轮提问即注入」对全新会话并不成立。0.5.2 改为优先读宿主 SessionStart 载荷自带的 `model`(`"providerId/modelId"`)判定套餐档,全新会话**在用户敲第一条消息之前就知晓**;老宿主无该字段自动回落三源探针。已通知后每轮提问与库对账(首轮 UserPromptSubmit 时宿主已写好选模条目),一旦确认已非套餐模型即**一次性撤回**(`SOLO_RETRACT_NOTE`)——覆盖「首条消息前切第三方」与「会话中途切模型」两种自愈路径;三源全空(无证据)绝不撤回。 +- **`hook` 日志增记 `model_category`**(account/builtin/custom/null,只记形态不记模型明细),把「宿主是否下发 model」从源码推断变成运行可实证。 +- **构建产物语法门(偏差 D31)**:`build.mjs` 写完产物即对 7 个 JS(含 0 字节判定)与 2 个 HTML(`` 收尾)校验,失败整体重建 ≤3 次;`release.mjs` 对 staging 与解包树各再校验一次并核缺件清单。外置卷偶发的 ~1MB bundle 落盘撕裂此前只能靠人工 `node --check` 兜,`--verify-repro` 也拦不住(两份同坏产物哈希一致)。 +- **新增 S9 确定性剧本**:直跑出厂 `runtime/team-hooks.mjs`,12 项检查覆盖 startup 载荷注入、去重、第三方不误报、首轮「仅选模条目无消息」真实时序、源 1/源 3 各自正反例、off 档、无证据不撤回、误报撤回恰一次、resume 撤回;夹具强制隔离在临时库(不写宿主库)。 +- 本地验收:**900 用例 / 75 文件**全部通过;覆盖率口径(排除自带阈值的性能基准 `f32.test.ts`,其单跑 903ms 达标)74 文件 / 898 用例,91.65/85.24/92.65/93.47 四项门槛全过;文本审计 26 项、S9 14 项、`npm run check` 通过。 +- 真会话实测(订阅套餐模型):新会话零输入时锚已落盘(早于首条消息 2.3s,`model_category=account` 证明宿主确已下发 model),复杂目标全程 0 次 `spawn_teammate`;会话中途切到第三方模型后,下一轮提问即写入 `soloRetractedAt`(撤回恰一次,通知锚完整保留)。未桌面实测的部分(首条消息前切模型无误报、fork/派生回归)由 S9 的确定性检查覆盖——本机 ZCode 为补丁版(adhoc 签名、无 TeamIdentifier),官方 Computer Use helper 拒绝为非合规签名进程启动,无法做桌面驱动实测。 + ## 0.5.1 — 2026-11-02 描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 diff --git a/external_plugins/agent-team/README.md b/external_plugins/agent-team/README.md index 98587bd7..35efd42a 100644 --- a/external_plugins/agent-team/README.md +++ b/external_plugins/agent-team/README.md @@ -41,7 +41,8 @@ After install and enable you need **no special command**: the teamwork policy is | Surface | How to trigger | What it does | |---|---|---| | Natural language (main channel) | Just state a goal / give orders | Everything: spawning teammates, assigning tasks, messaging; the policy is auto-injected and the model knows which team tools to use | -| `/team` | Type `/team` | Prints a text summary of team status + panel/command entries (**read-only**, creates/modifies nothing) | +| `/team` | Type `/team` | Prints a text summary of team status + panel/command entries (**read-only when called without arguments**, creates/modifies nothing) | +| `/team ` | e.g. `/team expand this story into three characters` | **Actually runs the task with the team**: prints the status summary, then spawns teammates, assigns work, waits and summarizes (if the model cannot be inherited it says so and does the work directly) | | `/team-coordination` | Type `/team-coordination` (full name `agent-team:team-coordination`) | Manually (re)load the teamwork policy skill; use when a very long session has lost it | ### 1. Just state the goal (default `auto`: on-demand delegation) @@ -87,12 +88,14 @@ Create a teammate named reviewer to check the first three paragraphs of README f - **Failures are never silent; retries are bounded (0.4.1)**: when the Lead's model cannot be inherited (official coding plan, deleted/disabled Provider, unparseable state), spawning/resuming fails loudly with the reason — it never silently runs a different model. The failure shows in the member's diagnostics and pending messages are preserved. Deterministic rejections (plan/out-of-catalog) suspend auto-retry; transient faults (timeouts) back off 5s/15s/30s, at most 3 auto-retries. Switching the Lead back to a usable model — or sending a new message — resumes delivery and clears the stale error. - **Pre-spawn validation (0.4.1)**: when the Lead's model is not inheritable, `spawn_teammate` fails **before** registering the member — no failed member, no name consumed; after fixing the Lead's model the same name is reusable. - **Official coding plans cannot be inherited (hard boundary)**: members are independent CLI processes and the host does not hand subscription-plan credentials (`account:*` / `builtin:*` providers, e.g. GLM official coding plans) to them, so **inheriting an official coding-plan model is not supported**. Spawning/resuming while the Lead uses a plan model fails; switch the Lead to your own third-party model first (ZCode Settings → Model Services, add your own Provider + API key). -- **Solo fallback when teammates are unavailable (0.5.1)**: when the Lead's confirmed model is an official plan model, the Lead is told once per session (SessionStart or the first prompt) that teammates cannot be spawned — it then does all the work itself instead of wasting turns on failing spawns. The note is non-permanent: if you switch the Lead to a third-party model mid-session and a spawn succeeds, the team works normally from then on. +- **Solo fallback when teammates are unavailable (0.5.1; timing refined in 0.5.2)**: when the Lead's confirmed model is an official plan model, the Lead is told once per session that teammates cannot be spawned — it then does all the work itself instead of wasting turns on failing spawns. Since 0.5.2 the decision is taken from the model the host reports at session start, so even a brand-new session knows before your first message (older hosts fall back to the first prompt). The note self-corrects: if you switch the Lead to a third-party model — before the first message or mid-session — the next prompt carries a one-time update that teammates are available again, and a successful spawn always restores normal team use. ### 3. `/team` for status Type `/team` any time: the first line reads "Members N · Shared tasks T", followed by one line per member and task (same wording as the panel dictionary), plus panel/command entries depending on the runtime. Refresh semantics: the desktop MCP Apps panel is live (subscription push, no manual refresh); on CLI every `/team` run is fresh. +**With an argument it also does the work**: `/team ` prints the summary and then actually builds the team — spawns members by role, creates shared tasks with write scopes when coordination is needed, waits for results and summarizes. Without arguments it stays strictly read-only. + ### 4. `/team-coordination` to reload the policy The main channel is the automatic hook injection, so manual loading is rarely needed. Two cases: @@ -156,6 +159,9 @@ Edit under **Settings → Plugins → Agent Team**; changes apply to new tasks ( # /team command: prints the team status text summary (desktop & CLI) /team +# With an argument: runs the task with the team (spawn + assign + summarize) +/team expand this story into three characters + # Direct disk replay (same source as /team) node /runtime/team-ctl.mjs state # text summary node /runtime/team-ctl.mjs state --json # machine-readable @@ -256,7 +262,7 @@ This plugin is a re-implementation of DSH Agent Teams on ZCode. The deviations b | D5 | Member sessions stay out of the left task list by default; the panel offers a read-only member conversation view. Legacy visible rows can be archived with `sidebar-audit` | | D6 | The Lead still sees the host's built-in Task tools (cannot be disabled); teammates have Task disabled and team tools are policy-preferred | | D7 | One sentence about "file version conflicts" in the policy text is replaced with ZCode file-tool semantics; everything else is verbatim | -| D8 | The coordinator is ephemeral: the daemon is reclaimed by the host when idle and any instance can take over; a momentary `TEAM_DISPOSED` error may appear during handover — just retry (measured takeover ≤5s) | +| D8 | The coordinator is ephemeral: the daemon is reclaimed by the host when idle and any instance can take over; a momentary `TEAM_DISPOSED` error may appear during handover — just retry (measured takeover ≤5s for a truly dead coordinator; a stalled-but-alive holder is detected via PID liveness and given a bounded grace instead of being stolen from) | | D9 | No SessionEnd hook: disposal is best-effort at daemon exit plus reconciliation on next start; under very short grace only a reconcilable state may remain | | D10 | The policy is injected into message context by the SessionStart hook, not the system prompt; injected text does not land in the transcript; disabling hooks triggers a fail-loud warning | | D11 | Desktop callTool may hang / `Client closed` after daemon reclaim without recovering in that session; a new task recovers. Teammates use separate processes and are unaffected | @@ -277,6 +283,8 @@ This plugin is a re-implementation of DSH Agent Teams on ZCode. The deviations b | D27 | Task `complete` means "submitted": the Lead must independently verify before acceptance; failures are `reopen`ed with concrete findings, passes append an acceptance note to the task | | D28 | Since 0.5.0 the default is `auto` (issue #9): no mode section is injected before a team exists; after the first teammate the on-demand section applies (delegation-value judgment with positive/negative examples); `off` disables injection and team tools entirely; legacy `orchestrator`/`collaborator` values migrate to `auto`; a stale pre-0.5.0 runtime-config is treated as unset | | D29 | When the Lead's confirmed model is an official plan model (issue #5), hooks inject a one-time solo note (do all work yourself, don't call spawn_teammate; non-permanent — a later successful spawn restores normal team use) and the spawn error message offers the same fallback; detection is optimistic (unknown/failed reads never trigger the note) | +| D30 | 0.5.2: the solo note is decided first from the `model` the host passes to the SessionStart hook (brand-new sessions know at startup; the db three-source probe remains the fallback), and every later prompt reconciles it against the db — once the db confirms a non-plan model, a one-time retraction note restores normal team use | +| D31 | 0.5.2: the build runs `node --check` on every runtime bundle and rebuilds up to 3 times on failure; the release packer re-checks the staged and unpacked trees (guards against torn writes on slow/external volumes) | ## Documentation diff --git a/external_plugins/agent-team/README_CN.md b/external_plugins/agent-team/README_CN.md index 0094d38e..2f5e5859 100644 --- a/external_plugins/agent-team/README_CN.md +++ b/external_plugins/agent-team/README_CN.md @@ -41,7 +41,8 @@ zcode plugins enable agent-team@zcode-plugins-official | 调用面 | 怎么触发 | 干什么 | |---|---|---| | 自然语言对话(主通道) | 直接说目标 / 下指令 | 创建队友、分派任务、收发消息等全部操作;策略已自动注入,模型自己知道该用哪些团队工具 | -| `/team` | 会话里输入 `/team` | 输出团队状态文本摘要 + 面板/命令入口(**只读**,不创建/修改任何数据) | +| `/team` | 会话里输入 `/team` | 输出团队状态摘要 + 面板/命令入口(**无参数时只读**,不创建/修改任何数据) | +| `/team <任务>` | 例如 `/team 把这段故事扩写成三个角色` | **用团队真的执行该任务**:先输出状态摘要,再建队、分派、等结果并汇总(模型不可继承时明确说明并改为直接完成) | | `/team-coordination` | 输入 `/team-coordination`(全名 `agent-team:team-coordination`) | 手动(重新)加载团队协作策略 skill;长会话策略丢失后恢复用 | ### 1. 直接说目标(默认 `auto`:按需委派) @@ -87,12 +88,14 @@ zcode plugins enable agent-team@zcode-plugins-official - **失败绝不静默、重试有节制(0.4.1)**:Lead 的模型无法被成员继承时(官方 coding plan、Provider 被删除/禁用、解析不出),创建/续跑会直接报错并说明原因,不会悄悄用别的模型开跑;失败原因在成员行诊断可见,待处理消息保留不丢。同一失败不会无限重试:确定性拒绝(套餐/目录外)暂停自动重试,临时故障(超时等)按 5s/15s/30s 退避最多自动重试 3 次;Lead 换回可用模型或你再发一条新消息即自动恢复交付,恢复成功后旧错误提示自动消失。 - **创建前校验(0.4.1)**:Lead 模型不可继承时,`spawn_teammate` 在登记成员**之前**就报错——不产生 failed 成员、不占用成员名;修正 Lead 模型后原名可直接重用。 - **不支持继承官方 coding plan(硬性边界)**:成员是独立 CLI 进程,宿主不向它下发订阅套餐(`account:*` / `builtin:*` Provider,如智谱 GLM 官方 coding plan)的凭据,因此**不支持直接继承官方 coding plan 模型配置**。Lead 正在用套餐模型时创建/续跑成员会报错;请先在 ZCode 中把 Lead 切换到自配的第三方模型(ZCode 设置 → 模型服务,添加你自己的 Provider + API Key)。 -- **队友不可用时单 agent 兜底(0.5.1)**:Lead 的已确认模型是官方套餐时,插件会在会话开始(或首轮提问)一次性告知 Lead「队友无法孵化」——Lead 直接自己干全部工作,不再浪费轮次去试注定失败的建队。提示为非永久措辞:中途把 Lead 切到第三方模型后一旦 spawn 成功,团队功能即恢复正常使用。 +- **队友不可用时单 agent 兜底(0.5.1;0.5.2 补齐时序)**:Lead 的已确认模型是官方套餐时,插件会每会话一次性告知 Lead「队友无法孵化」——Lead 直接自己干全部工作,不再浪费轮次去试注定失败的建队。0.5.2 起判定优先取宿主在会话开始时上报的模型,因此**全新会话在你输入第一条消息之前就已知晓**(老宿主回落到首轮提问)。提示会自动校正:你在首条消息前或会话中途把 Lead 切到第三方模型后,下一轮提问即附带一次性「队友已可用」更新;spawn 成功也始终恢复正常用队。 ### 3. `/team` 看状态 会话里随时输入 `/team`:首行输出「成员 N · 共享任务 T」,随后逐行列出成员与任务(与面板词典同源同文案),并按运行环境附上面板/命令入口。刷新语义:桌面 MCP Apps 面板自动实时(订阅推送,无需手动刷新);CLI 每次重跑 `/team` 即最新。 +**带参数 = 用团队干活**:输入 `/team <任务描述>`(如 `/team 把这段扩写成三个角色`)时,除状态摘要外,Lead 会**真的建队执行**——按角色 spawn 成员、必要时建共享任务并划写域、等齐结果后汇总。不带参数时仍严格只读。 + ### 4. `/team-coordination` 重载策略 策略的主通道是 hook 自动注入,通常无需手动加载。两种情况会用到这个 skill: @@ -156,6 +159,9 @@ zcode plugins enable agent-team@zcode-plugins-official # /team 命令:输出团队状态文本摘要(桌面/CLI 均可用) /team +# 带参数 = 用团队执行该任务(建队 + 分派 + 汇总) +/team 把这段故事扩写成三个角色 + # 直接读盘重放(与 /team 同源) node <插件目录>/runtime/team-ctl.mjs state # 文本摘要 node <插件目录>/runtime/team-ctl.mjs state --json # 机器可读 @@ -256,7 +262,7 @@ zcode plugins list --json # 看 version / rootPath / dataPath / diagnosti | D5 | 成员会话默认不进左侧任务栏;面板内提供成员会话查看视图(只读)。旧版遗留的可见行可用 `sidebar-audit` 归档 | | D6 | Lead 仍能看见宿主内置 Task 工具(无法禁用);teammate 侧已禁用 Task,团队工具优先由策略引导 | | D7 | 策略文本中“文件版本冲突”一句替换为 ZCode 文件工具的等价语义;其余逐字 | -| D8 | 协调者是“瞬时”的:daemon 空闲会被宿主回收,任一实例可接任;协调者交替的瞬间可能出现 `TEAM_DISPOSED` 临时错误,重试即可(实测接任 ≤5s) | +| D8 | 协调者是“瞬时”的:daemon 空闲会被宿主回收,任一实例可接任;协调者交替的瞬间可能出现 `TEAM_DISPOSED` 临时错误,重试即可(真崩溃实测接任 ≤5s;〔D32〕心跳过期但进程仍存活时按 PID 存活判定宽限复核,不抢活人) | | D9 | 没有 SessionEnd hook:处置靠 daemon 退出时尽力执行 + 下次启动对账;极短宽限下可能只留下可对账的状态 | | D10 | 策略通过 SessionStart hook 注入到消息上下文,而非系统提示;注入文本不落 transcript;被禁用 hook 时会有 fail-loud 警告 | | D11 | 桌面 callTool 在 daemon 被回收后可能挂起/`Client closed` 且本会话不恢复;新任务可恢复。teammate 走独立进程不受影响 | @@ -277,6 +283,8 @@ zcode plugins list --json # 看 version / rootPath / dataPath / diagnosti | D27 | 任务 `complete` 是“提交”,Lead 需独立复核后才算验收完成;失败会 `reopen` 并附具体问题,通过则在任务描述里追加验收记录 | | D28 | 0.5.0 起默认 `auto`(issue #9):建队前不注入任何模式段;首个队友创建后注入按需段(委派价值判断+正反例);`off` 完全停注入并注销团队工具;旧值 `orchestrator`/`collaborator` 统一迁移 `auto`;0.5.0 前的 runtime-config 落盘视为过期 | | D29 | Lead 已确认模型为官方套餐时(issue #5),hook 每会话一次性注入单 agent 兜底提示(自己干全部工作、不试 spawn;非永久——后续 spawn 成功即恢复正常用队);spawn 报错同步给出该出路;检测乐观(未知/读库失败绝不触发提示) | +| D30 | 0.5.2:兜底提示优先依据宿主传给 SessionStart hook 的 `model` 载荷判定(全新会话启动即知晓;db 三源探针为回落),此后每轮提问与 db 对账——db 一旦确认非套餐模型,一次性注入撤回提示恢复正常用队 | +| D31 | 0.5.2:构建对全部 runtime 产物跑 `node --check`,失败自动整体重建 ≤3 次;发布打包对 staged 与解包树再校验一次(防外置/慢卷落盘撕裂) | ## 文档 diff --git a/external_plugins/agent-team/commands/team.md b/external_plugins/agent-team/commands/team.md index 65964f37..6d3aa801 100644 --- a/external_plugins/agent-team/commands/team.md +++ b/external_plugins/agent-team/commands/team.md @@ -4,21 +4,27 @@ allowed-tools: Bash --- /team 命令(stage-5 T5.4):输出团队状态文本摘要,并按运行环境给出对应载体的入口。 -(`team_panel_call` 为 app 专用回环工具(visibility:["app"]),模型不可调;数据面走 -`team-ctl state --json` 读盘重放,只读。) +(`team_panel_call` 为 app 专用回环工具(visibility:["app"]),模型不可调。) + +**两种用法(2026-11-02 起)**: +- `/team`(无参数)= **只读**状态摘要与面板入口。 +- `/team <任务描述>`(带参数)= 先输出状态摘要,**然后用团队真的执行该任务**(见步骤 6)。 + 用户输入 `/team` 后跟内容时,意图就是「用团队做这件事」——不要只读状态后自行代劳。 ## 执行步骤 -1. **取会话 id**:用 Bash 执行 `printf '%s' "${ZCODE_SESSION_ID:-}"`。为空时(hook env 缺失) - → 列出 `$HOME/.zcode/cli/plugins/data/agent-team*/teams/` 下最近修改的目录名作为 teamId; - 仍无法确定 → 直接输出 `Team 暂不可用`(en: `Team is unavailable`)并提示稍后重试。 -2. **读团队视图**:用 Bash 执行(teamDir 中会话 id 无需转义——`sess_` 字符集安全): - `node state --json` - - `` = agent-team 插件安装目录下 `runtime/team-ctl.mjs`(plugins.dirs 直载 = 仓库根; - 市场安装 = `~/.zcode/cli/plugins/cache/**/agent-team*/runtime/team-ctl.mjs`,用 ls/glob 定位); - - `` = `$HOME/.zcode/cli/plugins/data/agent-team*/teams/`(多副本时取 - 与当前安装通道一致者;dev 兜底 = `$HOME/.zcode/agent-team-dev-data/teams/`); - - state 失败/目录不存在 → 视为「尚无团队事件」:输出摘要 `成员 1(Lead)· 共享任务 0`。 +1. **读团队数据(主通道 = MCP 工具,不要猜目录)**: + 分别调用 `list_agents`(空参数)与 `team_task_list`(空参数;需全量时加 `limit: 100`)。 + 这两个工具的团队身份由宿主 `_meta.session_id` 解析,**与会话环境变量无关**,因此是唯一 + 可靠的取数通道。 + - 若任一工具返回 `TEAM_NOT_MEMBER`/报错 → 直接输出 `Team 暂不可用`(en: `Team is unavailable`), + 不要尝试用 Bash 猜目录。 +2. **定位 teamDir(仅用于渲染 CLI 指引,失败可省略该段)**: + 优先用当前 hook/daemon 环境里的 `TEAM_PLUGIN_DATA`(`printf '%s' "${TEAM_PLUGIN_DATA:-}"`); + 取到则 ` = /teams/`。 + **禁止**用「最近修改的 `agent-team*/teams/` 目录」当兜底——多副本并存时会跨数据根捞到 + 别的插件的团队(2026-11-02 实测事故:/team 显示了另一个会话的成员,Lead 据此空转)。 + 取不到 `TEAM_PLUGIN_DATA` → 省略「CLI 细节」段,仅输出摘要与面板入口。 3. **输出文本摘要**(所有场景都输出;文案与面板词典逐字一致): - JSON 的 `failure` 非空 → 首行 `团队持久记录无效:`(en: `Invalid persisted Team record: `),随后照常列最后有效状态; - 正常 → 首行 `成员 N · 共享任务 T`;成员逐行 `- — `(lead/active/provisioning/failed); @@ -32,8 +38,8 @@ allowed-tools: Bash `node widget --out <会话可视化目录>/team-widget.html --theme --lang `, 然后在回复中单独一行输出内容引用(手动刷新 = 重跑 /team): ::visualize{"path":"<--out 的绝对路径>","title":"智能体团队"} - - **CLI 细节指引(恒附——桌面与 CLI 都输出)**:headless/TUI 会话可能不暴露运行环境, - 误判会漏掉终端用户必需的入口,因此摘要后一律附: + - **CLI 细节指引(仅在步骤 2 拿到 `TEAM_PLUGIN_DATA` 时输出)**:headless/TUI 会话可能不暴露运行环境, + 误判会漏掉终端用户必需的入口,因此摘要后附: `细节:node state `; `成员会话:node transcript (按轮摘要:用户指令 + 动作组 + 每轮结论)`; `高保真(可选):TEAM_COMPANION=1 的 daemon 在场时 node open-panel;或 @@ -42,9 +48,33 @@ allowed-tools: Bash 可用);`scripts/team-ctl.mjs` 薄启动器等价。两者任选,不要只导出不执行。 5. **刷新语义**(用户问「怎么刷新」时回答):MCP Apps 面板 = 自动实时(订阅推送 ≤1s); ::visualize 卡片 = 手动(重跑 /team 重渲染);CLI 摘要 = 随轮次(每次 /team 即最新)。 +6. **带参数时的团队执行(`/team <任务描述>`)**——只在前 5 步状态摘要输出后执行: + 1. 先判断该任务是否值得分工:需要多角色 / 可并行 / 写域互不相交 → 建队; + **用户已经用 `/team <任务>` 明确表达「用团队做」的意图,这就是委派信号本身**, + 不要再以「任务简单」为由自行代劳;只有确实单角色即可完成(如一句话问答)时, + 才用一行说明「这个任务不需要分工」并直接给出结果。 + 2. 建队:`spawn_teammate` 2–3 个成员(名字体现角色,`description` 写清职责, + `prompt` 必须是自洽完整的初始任务——成员是独立进程,看不到本会话历史)。 + 3. 需要协作流水线时用 `team_task_create` 建任务(写 `write_scopes` 划清写域、 + 用 `blocked_by` 表达顺序),再 `send_message` 告知成员认领;**不要**只建任务不通知 + (任务就绪不会自动唤醒成员)。 + 4. 用 `list_agents` 确认成员在 running/provisioning 后再 `wait_agent`; + 收到进展后重新 `list_agents` 再决定是否继续等。 + 5. 收齐成员产出后由 Lead 汇总成最终答复;成员自由文本不会自动推给 Lead, + 需要时用 `send_message` 追问或读成员会话。 + 6. **`spawn_teammate` 失败时(套餐模型不可继承)**:不要静默改自干—— + 用一行说明「当前 Lead 模型为官方套餐,队友无法继承,本次由我直接完成」, + 然后自己完成,并提示用户可切换到自配第三方模型后再用团队。 ## 纪律 -- 本命令**只读**:不创建/修改/删除任务或成员(变更走对话中的团队工具面)。 +- **无参数时严格只读**:`/team` 不创建/修改/删除任务或成员。 +- **带参数时必须真的建队执行**(步骤 6):只输出状态、然后把活自己干,是本命令明令禁止 + 的行为(2026-11-02 用户实测体感问题:连输两次 `/team <任务>` 都没建队)。 +- 成员/任务数据**只来自 MCP 工具**(`list_agents` / `team_task_list`);Bash 侧只用于渲染 + 可选的 CLI 指引,绝不用于推断团队内容。 +- **不得跨副本猜目录**:禁止用「`agent-team*/teams/` 最近修改目录」等 glob 兜底。多副本并存 + (dev 直载 + 市场副本)时该兜底会读到别的插件的团队,导致 Lead 依据错误成员列表行动 + (2026-11-02 实测事故)。拿不到 `TEAM_PLUGIN_DATA` 就省略 CLI 段。 - `` 不存在 = 尚无团队事件(隐式 Lead),按空团队摘要输出,不报错。 -- 路径定位失败 → 降级为输出「团队状态不可读」+ `team-ctl state` 重试指引(不阻塞、不猜测路径)。 +- 路径定位失败 → 省略 CLI 细节段,仅输出摘要与面板入口(不阻塞、不猜测路径)。 diff --git a/external_plugins/agent-team/runtime/team-daemon.mjs b/external_plugins/agent-team/runtime/team-daemon.mjs index c11e421d..9569a5da 100644 --- a/external_plugins/agent-team/runtime/team-daemon.mjs +++ b/external_plugins/agent-team/runtime/team-daemon.mjs @@ -18642,8 +18642,9 @@ function logErr(scope, msg, extra) { // src/coord/lock.ts import crypto from "node:crypto"; -import fs2 from "node:fs"; -import path2 from "node:path"; +import fs4 from "node:fs"; +import path4 from "node:path"; +import { spawnSync } from "node:child_process"; // src/coord/identity.ts import { randomUUID } from "node:crypto"; @@ -18664,11 +18665,246 @@ function parseWriterId(writer) { return { bootId: id, pid }; } +// src/provider/procgroup.ts +import { execFile } from "node:child_process"; +import fs3 from "node:fs"; +import path3 from "node:path"; +import { fileURLToPath } from "node:url"; + +// src/provider/member-files.ts +import fs2 from "node:fs"; +import path2 from "node:path"; +function teamEverCreated(teamDir, leadSessionId) { + let entries; + try { + entries = fs2.readdirSync(path2.join(teamDir, "members")); + } catch { + return false; + } + return entries.some((entry) => entry !== leadSessionId); +} +function memberPaths(teamDir, memberId) { + const memberDir = path2.join(teamDir, "members", memberId); + const runDir = path2.join(memberDir, "run"); + return { + memberDir, + originFile: path2.join(memberDir, "origin.json"), + receiptsFile: path2.join(memberDir, "receipts.jsonl"), + stopBudgetFile: path2.join(memberDir, "stop-budget.json"), + runDir, + currentFile: path2.join(runDir, "current.json"), + drainMarkerFile: path2.join(runDir, "drain-requested.json"), + modelFailedFile: path2.join(memberDir, "model-failed.json") + }; +} +function turnFile(runDir, turnId) { + return path2.join(runDir, `${turnId}.json`); +} +function writeJsonAtomic(file, value) { + fs2.mkdirSync(path2.dirname(file), { recursive: true, mode: 448 }); + const tmp = `${file}.tmp-${process.pid}-${Date.now()}`; + const fd = fs2.openSync(tmp, "w", 384); + try { + fs2.writeFileSync(fd, JSON.stringify(value, null, 2)); + fs2.fsyncSync(fd); + } finally { + fs2.closeSync(fd); + } + fs2.renameSync(tmp, file); +} +function readJson(file) { + let raw; + try { + raw = fs2.readFileSync(file, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return void 0; + throw err; + } + return JSON.parse(raw); +} +function writeOrigin(paths, origin) { + writeJsonAtomic(paths.originFile, origin); +} +function readOrigin(paths) { + return readJson(paths.originFile); +} +function writeTurn(runDir, turn) { + writeJsonAtomic(turnFile(runDir, turn.turnId), turn); +} +function readTurn(runDir, turnId) { + return readJson(turnFile(runDir, turnId)); +} +function setCurrentTurn(paths, turnId) { + writeJsonAtomic(paths.currentFile, { turnId }); +} +function readCurrentTurnId(paths) { + return readJson(paths.currentFile)?.turnId; +} +function listTurns(runDir) { + let names; + try { + names = fs2.readdirSync(runDir); + } catch (err) { + if (err.code === "ENOENT") return []; + throw err; + } + return names.filter((n) => /^turn-\d+\.json$/.test(n)).sort((a, b) => turnNumber(a) - turnNumber(b)).map((n) => readJson(path2.join(runDir, n))).filter((t) => t !== void 0); +} +function turnNumber(name) { + return Number(name.slice("turn-".length, -".json".length)); +} +function nextTurnId(runDir) { + let names = []; + try { + names = fs2.readdirSync(runDir); + } catch { + } + let max = 0; + for (const n of names) { + if (/^turn-\d+\.json$/.test(n)) max = Math.max(max, turnNumber(n)); + } + return `turn-${max + 1}`; +} +function appendReceipt(paths, receipt) { + fs2.mkdirSync(path2.dirname(paths.receiptsFile), { recursive: true, mode: 448 }); + const fd = fs2.openSync(paths.receiptsFile, "a", 384); + try { + fs2.writeFileSync(fd, JSON.stringify(receipt) + "\n"); + fs2.fsyncSync(fd); + } finally { + fs2.closeSync(fd); + } +} +function readReceipts(paths) { + let raw; + try { + raw = fs2.readFileSync(paths.receiptsFile, "utf8"); + } catch (err) { + if (err.code === "ENOENT") return []; + throw err; + } + const receipts = []; + for (const line of raw.split("\n")) { + if (line.trim().length === 0) continue; + receipts.push(JSON.parse(line)); + } + return receipts; +} +function receiptMessageIds(paths) { + return new Set(readReceipts(paths).map((r) => r.messageId)); +} +function readStopBudget(paths) { + return readJson(paths.stopBudgetFile); +} +function writeStopBudget(paths, budget) { + writeJsonAtomic(paths.stopBudgetFile, budget); +} +function readModelFailed(paths) { + return readJson(paths.modelFailedFile); +} +function writeModelFailed(paths, record2) { + writeJsonAtomic(paths.modelFailedFile, record2); +} +function clearModelFailed(paths) { + try { + fs2.unlinkSync(paths.modelFailedFile); + } catch { + } +} + +// src/provider/procgroup.ts +var HELPER_DEFAULT = path3.join(path3.dirname(fileURLToPath(import.meta.url)), "detach-helper.mjs"); +var SPAWN_HELPER_TIMEOUT_MS = 1e4; +async function spawnDetached(spec) { + const dir = path3.dirname(spec.stdoutFile); + const specFile = spec.specFile ?? path3.join(dir, `${path3.basename(spec.stdoutFile, ".out")}.spec.json`); + const resultFile = spec.resultFile ?? path3.join(dir, `${path3.basename(spec.stdoutFile, ".out")}.spawn.json`); + const specDoc = { + command: spec.command, + argv: spec.argv, + cwd: spec.cwd, + stdoutFile: spec.stdoutFile, + resultFile + }; + if (spec.persistEnv === true) specDoc.env = spec.env; + writeJsonAtomic(specFile, specDoc); + const helper = process.env.TEAM_DETACH_HELPER ?? HELPER_DEFAULT; + await new Promise((resolve, reject) => { + execFile( + process.execPath, + ["--", helper, specFile], + { timeout: SPAWN_HELPER_TIMEOUT_MS, cwd: spec.cwd, env: spec.env }, + (err) => { + if (err) reject(new Error(`detach helper failed: ${err.message}`)); + else resolve(); + } + ); + }); + let result; + try { + result = JSON.parse(fs3.readFileSync(resultFile, "utf8")); + } catch (err) { + throw new Error(`detach helper produced no result file: ${err instanceof Error ? err.message : String(err)}`); + } + if (typeof result.error === "string") { + throw new Error(`turn process launch failed: ${result.error}`); + } + return { pid: result.pid ?? null, pgid: result.pid ?? null, stdoutFile: spec.stdoutFile, specFile, resultFile }; +} +function pidAlive(pid) { + if (pid === null || !Number.isInteger(pid) || pid <= 0) return false; + try { + process.kill(pid, 0); + return true; + } catch (err) { + return err.code === "EPERM"; + } +} +function pgidAlive(pgid) { + if (pgid === null || !Number.isInteger(pgid) || pgid <= 0) return false; + try { + process.kill(-pgid, 0); + return true; + } catch (err) { + return err.code === "EPERM"; + } +} +async function killProcessGroup(pgid, graceMs) { + if (pgid === null || pgid <= 0) return true; + signalGroup(pgid, "SIGTERM"); + for (let waited = 0; waited < graceMs; waited += 50) { + await sleep(50); + if (!pgidAlive(pgid) && !pidAlive(pgid)) return true; + } + if (pgidAlive(pgid) || pidAlive(pgid)) { + signalGroup(pgid, "SIGKILL"); + for (let waited = 0; waited < 2e3; waited += 50) { + await sleep(50); + if (!pgidAlive(pgid) && !pidAlive(pgid)) return true; + } + } + return !pgidAlive(pgid) && !pidAlive(pgid); +} +function signalGroup(pgid, sig) { + try { + process.kill(-pgid, sig); + } catch (err) { + if (err.code !== "ESRCH") { + throw err; + } + } +} +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + // src/coord/lock.ts var DEFAULT_LOCK_TUNING = { heartbeatMs: 1e3, expiryMs: 4500, - pollMs: 200 + pollMs: 200, + graceMs: 3e3, + hardExpiryMs: 15e3 }; var exitReleases = /* @__PURE__ */ new Set(); var exitHookInstalled = false; @@ -18740,15 +18976,18 @@ var CoordinatorLock = class { const observed = this.observe(); if (!observed.exists) { if (Date.now() >= deadline) timeout(); - await sleep(1); + await sleep2(1); continue; } if (observed.ageMs > this.tuning.expiryMs) { - this.steal(observed); + const outcome = await this.steal(observed); + if (outcome === "stolen") continue; + if (Date.now() >= deadline) timeout(); + await sleep2(Math.min(this.tuning.pollMs, Math.max(deadline - Date.now(), 1))); continue; } if (Date.now() >= deadline) timeout(); - await sleep(Math.min(this.tuning.pollMs, Math.max(deadline - Date.now(), 1))); + await sleep2(Math.min(this.tuning.pollMs, Math.max(deadline - Date.now(), 1))); } } /** 续持:owner inode + token 双 CAS 通过后写心跳;被抢/丢失 → false(onLost 恰一次)。 */ @@ -18764,9 +19003,13 @@ var CoordinatorLock = class { try { this.writeHeartbeat(held.token, now2); } catch (err) { - this.audit("renew-failed", { error: String(err) }); - this.markLost(owner.info); - return false; + try { + this.writeHeartbeat(held.token, now2); + } catch (retryErr) { + this.audit("renew-failed", { error: String(err), retryError: String(retryErr) }); + this.markLost(owner.info); + return false; + } } this.held = { ...held, info: { ...held.info, heartbeatAt: now2 } }; return true; @@ -18782,26 +19025,26 @@ var CoordinatorLock = class { this.held = null; if (held === null) return; try { - const fd = fs2.openSync(this.lockFile, "r"); + const fd = fs4.openSync(this.lockFile, "r"); try { - const stat = fs2.fstatSync(fd); + const stat = fs4.fstatSync(fd); if (stat.ino !== held.ino) { this.audit("release-skip", { reason: "inode-changed", expected: held.ino, actual: stat.ino }); return; } - const info = JSON.parse(fs2.readFileSync(fd, "utf8")); + const info = JSON.parse(fs4.readFileSync(fd, "utf8")); if (info.token !== held.token || info.pid !== process.pid || info.bootId !== this.ownerBootId) { this.audit("release-skip", { reason: "owner-changed", previous: info }); return; } } finally { - fs2.closeSync(fd); + fs4.closeSync(fd); } - if (fs2.statSync(this.lockFile).ino !== held.ino) { + if (fs4.statSync(this.lockFile).ino !== held.ino) { this.audit("release-skip", { reason: "inode-changed-before-unlink" }); return; } - fs2.unlinkSync(this.lockFile); + fs4.unlinkSync(this.lockFile); this.audit("release", { via: "exit-handler" }); } catch (err) { if (err.code === "ENOENT") return; @@ -18832,42 +19075,56 @@ var CoordinatorLock = class { if (this.exitUnregister !== null) return; this.exitUnregister = registerExitRelease(() => this.releaseSync()); } - /** 观察锁文件(不抢)。ageMs:可解析 = now-heartbeatAt(优先 token 心跳);否则 now-mtime。 */ + /** 观察锁文件(不抢)。ageMs:可解析 = now-heartbeatAt(优先 token 心跳);否则 now-mtime。 + * 〔D32〕同时给出持有者进程存活信号与心跳来源(回退路径不再静默不可诊断)。 */ observe() { let raw; let stat; try { - stat = fs2.statSync(this.lockFile); - raw = fs2.readFileSync(this.lockFile, "utf8"); + stat = fs4.statSync(this.lockFile); + raw = fs4.readFileSync(this.lockFile, "utf8"); } catch { - return { exists: false, ageMs: Number.POSITIVE_INFINITY, parseable: false }; + return { exists: false, ageMs: Number.POSITIVE_INFINITY, parseable: false, holderAlive: null, hbSource: "mtime" }; } try { const info = JSON.parse(raw); if (typeof info.pid === "number" && typeof info.bootId === "string" && typeof info.heartbeatAt === "number") { let heartbeatAt = info.heartbeatAt; + let hbSource = "owner-fallback"; if (typeof info.token === "string") { const hb = this.readHeartbeat(info.token); - if (hb !== void 0) heartbeatAt = hb; + if (hb !== void 0) { + heartbeatAt = hb; + hbSource = "token"; + } } return { exists: true, info, ageMs: Date.now() - heartbeatAt, parseable: true, - ino: stat.ino + ino: stat.ino, + holderAlive: pidAlive(info.pid), + hbSource }; } } catch { } - return { exists: true, ageMs: Date.now() - stat.mtimeMs, parseable: false, ino: stat.ino }; + return { + exists: true, + ageMs: Date.now() - stat.mtimeMs, + parseable: false, + ino: stat.ino, + holderAlive: null, + hbSource: "mtime" + }; } /** 审计痕迹(获取/释放/抢占/丢失;best-effort,无 fsync)。 */ audit(event, detail) { if (this.auditFile === void 0) return; try { - fs2.mkdirSync(path2.dirname(this.auditFile), { recursive: true }); - fs2.appendFileSync( + fs4.mkdirSync(path4.dirname(this.auditFile), { recursive: true }); + fs4.appendFileSync( this.auditFile, JSON.stringify({ ts: (/* @__PURE__ */ new Date()).toISOString(), event, pid: process.pid, bootId: this.ownerBootId, detail }) + "\n", { mode: 384 } @@ -18883,48 +19140,51 @@ var CoordinatorLock = class { bootId: this.ownerBootId, heartbeatAt: now2, acquiredAt: now2, + // 〔D32〕进程启动时刻估算(宽限路径做 PID 复用防护;旧锁无此字段则跳过校验)。 + startedAt: now2 - Math.round(process.uptime() * 1e3), token }; let fd; try { - fd = fs2.openSync(this.lockFile, "wx", 384); + fd = fs4.openSync(this.lockFile, "wx", 384); } catch (err) { if (err.code === "EEXIST") return null; throw err; } let ino; try { - fs2.writeFileSync(fd, JSON.stringify(info)); - fs2.fsyncSync(fd); - ino = fs2.fstatSync(fd).ino; + fs4.writeFileSync(fd, JSON.stringify(info)); + fs4.fsyncSync(fd); + ino = fs4.fstatSync(fd).ino; } catch (err) { try { - const stat = fs2.fstatSync(fd); - if (stat.ino === fs2.statSync(this.lockFile).ino) fs2.unlinkSync(this.lockFile); + const stat = fs4.fstatSync(fd); + if (stat.ino === fs4.statSync(this.lockFile).ino) fs4.unlinkSync(this.lockFile); } catch { } throw err; } finally { - fs2.closeSync(fd); + fs4.closeSync(fd); } this.held = { info, token, ino }; try { this.writeHeartbeat(token, now2); this.cleanupForeignHeartbeats(token); - } catch { + } catch (err) { + this.audit("heartbeat-first-write-failed", { error: String(err) }); } this.audit("acquire", { token: token.slice(0, 8), ino }); return info; } readOwner() { try { - const fd = fs2.openSync(this.lockFile, "r"); + const fd = fs4.openSync(this.lockFile, "r"); try { - const stat = fs2.fstatSync(fd); - const info = JSON.parse(fs2.readFileSync(fd, "utf8")); + const stat = fs4.fstatSync(fd); + const info = JSON.parse(fs4.readFileSync(fd, "utf8")); return { info, ino: stat.ino }; } finally { - fs2.closeSync(fd); + fs4.closeSync(fd); } } catch { return null; @@ -18932,7 +19192,7 @@ var CoordinatorLock = class { } readHeartbeat(token) { try { - const parsed = JSON.parse(fs2.readFileSync(heartbeatFileFor(this.lockFile, token), "utf8")); + const parsed = JSON.parse(fs4.readFileSync(heartbeatFileFor(this.lockFile, token), "utf8")); if (parsed.token === token && typeof parsed.heartbeatAt === "number") return parsed.heartbeatAt; } catch { } @@ -18942,11 +19202,11 @@ var CoordinatorLock = class { const file = heartbeatFileFor(this.lockFile, token); const tmp = `${file}.tmp-${process.pid}-${crypto.randomBytes(4).toString("hex")}`; try { - fs2.writeFileSync(tmp, JSON.stringify({ token, heartbeatAt: at }), { mode: 384 }); - fs2.renameSync(tmp, file); + fs4.writeFileSync(tmp, JSON.stringify({ token, heartbeatAt: at }), { mode: 384 }); + fs4.renameSync(tmp, file); } catch (err) { try { - fs2.unlinkSync(tmp); + fs4.unlinkSync(tmp); } catch { } throw err; @@ -18954,62 +19214,81 @@ var CoordinatorLock = class { } removeHeartbeat(token) { try { - fs2.unlinkSync(heartbeatFileFor(this.lockFile, token)); + fs4.unlinkSync(heartbeatFileFor(this.lockFile, token)); } catch { } } cleanupForeignHeartbeats(ownToken) { let names; try { - names = fs2.readdirSync(path2.dirname(this.lockFile)); + names = fs4.readdirSync(path4.dirname(this.lockFile)); } catch { return; } - const prefix = `${path2.basename(this.lockFile)}.hb-`; + const prefix = `${path4.basename(this.lockFile)}.hb-`; for (const name of names) { if (!name.startsWith(prefix) || name === `${prefix}${ownToken}`) continue; try { - fs2.unlinkSync(path2.join(path2.dirname(this.lockFile), name)); + fs4.unlinkSync(path4.join(path4.dirname(this.lockFile), name)); } catch { } } } /** - * 过期抢占:guard 单飞 → 重读复核 → rename 到 quarantine → 校验 inode。 + * 过期抢占(〔D32〕双信号):guard 单飞 → 重读复核 → + * holderAlive=false(真崩溃)→ 立即 quarantine(kill -9 接任 ≤5s SLA 不变); + * holderAlive=true(stalled-but-alive)→ audit `steal-deferred` + 宽限 graceMs 复核: + * 宽限内心跳恢复/换代 → 放弃;仍过期且(已死 或 超过 hardExpiryMs 硬上限)→ quarantine; + * holderAlive=null(锁不可解析)→ 维持旧行为(过期即抢)。 + * 宽限路径做 PID 复用防护(锁内 startedAt 与 ps etimes 推算的启动时刻比对)。 * 若 rename 到的不是观察到的 inode(竞争者刚换了新锁)→ 尝试归还并回滚。 */ - steal(observed) { + async steal(observed) { const guard = `${this.lockFile}.guard-${process.pid}-${crypto.randomBytes(4).toString("hex")}`; let guardFd; try { - guardFd = fs2.openSync(guard, "wx", 384); + guardFd = fs4.openSync(guard, "wx", 384); } catch (err) { - if (err.code === "EEXIST") return; + if (err.code === "EEXIST") return "skipped"; throw err; } try { const current = this.observe(); - if (!current.exists || current.ageMs <= this.tuning.expiryMs) return; + if (!current.exists || current.ageMs <= this.tuning.expiryMs) return "skipped"; if (observed.ino === void 0 || current.ino !== observed.ino || current.info?.token !== observed.info?.token) { - return; + return "skipped"; + } + if (current.holderAlive === true && current.ageMs <= this.tuning.hardExpiryMs && !this.pidReused(current)) { + this.audit("steal-deferred", { + reason: "holder-alive", + ageMs: Math.round(current.ageMs), + graceMs: this.tuning.graceMs, + hbSource: current.hbSource, + previous: current.info + }); + await sleep2(this.tuning.graceMs); + const re = this.observe(); + if (!re.exists || re.ageMs <= this.tuning.expiryMs) return "deferred"; + if (re.ino !== current.ino || re.info?.token !== current.info?.token) return "deferred"; + if (re.holderAlive === true && re.ageMs <= this.tuning.hardExpiryMs) return "deferred"; } const quarantine = `${this.lockFile}.stale-${Date.now()}-${crypto.randomBytes(4).toString("hex")}`; try { - fs2.renameSync(this.lockFile, quarantine); + fs4.renameSync(this.lockFile, quarantine); } catch (err) { - if (err.code === "ENOENT") return; + if (err.code === "ENOENT") return "skipped"; throw err; } let quarantinedIno = null; try { - quarantinedIno = fs2.statSync(quarantine).ino; + quarantinedIno = fs4.statSync(quarantine).ino; } catch { quarantinedIno = null; } if (quarantinedIno !== current.ino) { try { - fs2.linkSync(quarantine, this.lockFile); - fs2.unlinkSync(quarantine); + fs4.linkSync(quarantine, this.lockFile); + fs4.unlinkSync(quarantine); this.audit("steal-rollback", { reason: "inode-mismatch", quarantinedIno, expected: current.ino }); } catch (rollbackErr) { this.audit("steal-rollback-failed", { @@ -19020,25 +19299,47 @@ var CoordinatorLock = class { quarantine }); } - return; + return "skipped"; } this.audit("steal", { reason: current.parseable ? "heartbeat-expired" : "unparseable-and-aged", + holderAlive: current.holderAlive, + hbSource: current.hbSource, previous: current.info ?? { mtimeAgeMs: Math.round(current.ageMs) }, quarantine }); if (typeof current.info?.token === "string") this.removeHeartbeat(current.info.token); + return "stolen"; } finally { try { - fs2.closeSync(guardFd); + fs4.closeSync(guardFd); } catch { } try { - fs2.unlinkSync(guard); + fs4.unlinkSync(guard); } catch { } } } + /** + * 〔D32〕PID 复用防护(仅宽限路径调用):锁内 startedAt 与 `ps -o etime=` 推算的启动时刻 + * 偏差 >3s → 认定 PID 已被复用(原持有者已死)→ 跳过宽限按死亡处理。 + * 旧锁无 startedAt / ps 不可用 / 解析失败 → 返回 false(保守:维持宽限,不误杀活人)。 + * etime 跨平台(macOS 无 etimes;格式 mm:ss | hh:mm:ss | d-hh:mm:ss)。 + */ + pidReused(observed) { + const startedAt = observed.info?.startedAt; + const pid = observed.info?.pid; + if (typeof startedAt !== "number" || typeof pid !== "number" || !Number.isInteger(pid) || pid <= 0) { + return false; + } + const r = spawnSync("ps", ["-o", "etime=", "-p", String(pid)], { encoding: "utf8" }); + if (r.status !== 0) return false; + const elapsedSec = parseEtime(r.stdout.trim()); + if (!Number.isFinite(elapsedSec) || elapsedSec < 0) return false; + const estimatedStart = Date.now() - elapsedSec * 1e3; + return Math.abs(estimatedStart - startedAt) > 3e3; + } markLost(previous) { if (this.held === null) return; this.audit("lost", { previous }); @@ -19047,13 +19348,30 @@ var CoordinatorLock = class { this.onLost?.({ previous }); } }; -function sleep(ms) { +function sleep2(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } +function parseEtime(raw) { + let s = raw.trim(); + if (s.length === 0) return Number.NaN; + let days = 0; + const dash = s.indexOf("-"); + if (dash !== -1) { + days = Number.parseInt(s.slice(0, dash), 10); + s = s.slice(dash + 1); + } + const parts = s.split(":").map((p) => Number.parseInt(p, 10)); + if (parts.some((p) => !Number.isFinite(p) || p < 0)) return Number.NaN; + let sec; + if (parts.length === 3) sec = parts[0] * 3600 + parts[1] * 60 + parts[2]; + else if (parts.length === 2) sec = parts[0] * 60 + parts[1]; + else return Number.NaN; + return days * 86400 + sec; +} // src/coord/journal.ts -import fs5 from "node:fs"; -import path4 from "node:path"; +import fs7 from "node:fs"; +import path6 from "node:path"; // src/domain/events.ts var IMAGE_MEDIA_TYPES = ["png", "jpeg", "webp", "gif"]; @@ -19548,7 +19866,7 @@ function assertAppendable(teamId, committed, candidate) { } // src/coord/lockfile.ts -import fs3 from "node:fs"; +import fs5 from "node:fs"; function observeLockFileFor(lockFile, writer) { const identity = parseWriterId(writer); if (identity === void 0) { @@ -19556,7 +19874,7 @@ function observeLockFileFor(lockFile, writer) { } let raw; try { - raw = fs3.readFileSync(lockFile, "utf8"); + raw = fs5.readFileSync(lockFile, "utf8"); } catch (err) { return { ok: false, reason: `lock unreadable: ${err.code ?? String(err)}` }; } @@ -19576,8 +19894,8 @@ function observeLockFileFor(lockFile, writer) { } // src/coord/replay.ts -import fs4 from "node:fs"; -import path3 from "node:path"; +import fs6 from "node:fs"; +import path5 from "node:path"; var checkpointDocSchema = external_exports.strictObject({ kind: external_exports.literal("agent-team-checkpoint"), stateVersion: external_exports.literal(TEAM_PROJECTION_STATE_VERSION), @@ -19588,16 +19906,16 @@ var checkpointDocSchema = external_exports.strictObject({ view: external_exports.unknown() }); function checkpointPath(teamDir) { - return path3.join(teamDir, "checkpoint.json"); + return path5.join(teamDir, "checkpoint.json"); } async function load(teamDir, teamId) { const startedAt = Date.now(); - const eventsFile = path3.join(teamDir, "events.jsonl"); + const eventsFile = path5.join(teamDir, "events.jsonl"); const raw = readBufferOrEmpty(eventsFile); let checkpointIgnored; let doc; try { - const rawDoc = fs4.readFileSync(checkpointPath(teamDir), "utf8"); + const rawDoc = fs6.readFileSync(checkpointPath(teamDir), "utf8"); const parsed = checkpointDocSchema.safeParse(JSON.parse(rawDoc)); if (!parsed.success) { checkpointIgnored = `checkpoint invalid: ${parsed.error.issues[0]?.message ?? "schema mismatch"}`; @@ -19685,7 +20003,7 @@ async function load(teamDir, teamId) { }; } async function writeCheckpoint(teamDir, input) { - const eventsFile = path3.join(teamDir, "events.jsonl"); + const eventsFile = path5.join(teamDir, "events.jsonl"); const byteOffset = input.byteOffset ?? countBytesOfLines(eventsFile, input.seq); const doc = { kind: "agent-team-checkpoint", @@ -19696,21 +20014,21 @@ async function writeCheckpoint(teamDir, input) { state: input.state, view: input.view }; - fs4.mkdirSync(teamDir, { recursive: true, mode: 448 }); + fs6.mkdirSync(teamDir, { recursive: true, mode: 448 }); const target = checkpointPath(teamDir); const tmp = `${target}.tmp-${process.pid}`; - const fd = fs4.openSync(tmp, "w", 384); + const fd = fs6.openSync(tmp, "w", 384); try { - fs4.writeFileSync(fd, JSON.stringify(doc)); - fs4.fsyncSync(fd); + fs6.writeFileSync(fd, JSON.stringify(doc)); + fs6.fsyncSync(fd); } finally { - fs4.closeSync(fd); + fs6.closeSync(fd); } - fs4.renameSync(tmp, target); + fs6.renameSync(tmp, target); } function readBufferOrEmpty(file) { try { - return fs4.readFileSync(file); + return fs6.readFileSync(file); } catch { return Buffer.alloc(0); } @@ -19770,8 +20088,8 @@ var TeamJournal = class _TeamJournal { constructor(teamDir, teamId, opts = {}) { this.teamDir = teamDir; this.teamId = teamId; - this.eventsFile = path4.join(teamDir, "events.jsonl"); - this.lockFile = path4.join(teamDir, "coordinator.lock"); + this.eventsFile = path6.join(teamDir, "events.jsonl"); + this.lockFile = path6.join(teamDir, "coordinator.lock"); this.opts = { maxLineBytes: 65536, checkpointEvery: 256, enforceLock: true, ...opts }; } /** @@ -19791,9 +20109,9 @@ var TeamJournal = class _TeamJournal { this.writer = writer; this.cache = loaded.state; this.committedCount = loaded.seq; - fs5.mkdirSync(this.teamDir, { recursive: true, mode: 448 }); - this.appendFd = fs5.openSync(this.eventsFile, "a", 384); - this.bytesCommitted = fs5.statSync(this.eventsFile).size; + fs7.mkdirSync(this.teamDir, { recursive: true, mode: 448 }); + this.appendFd = fs7.openSync(this.eventsFile, "a", 384); + this.bytesCommitted = fs7.statSync(this.eventsFile).size; return loaded; } /** 追加前不变量 + 落盘 + fsync + 内存态推进 + 通知 + 应答。非法事件绝不落盘(硬断言)。 */ @@ -19828,10 +20146,10 @@ var TeamJournal = class _TeamJournal { } if (this.appendFd === null) throw new Error("journal writer not open (call openWriter first)"); const lineBytes = Buffer.byteLength(raw); - fs5.writeSync(this.appendFd, raw); + fs7.writeSync(this.appendFd, raw); this.opts.crashHook?.("append:after", { seq }); this.opts.crashHook?.("fsync:before", { seq }); - fs5.fsyncSync(this.appendFd); + fs7.fsyncSync(this.appendFd); this.opts.crashHook?.("fsync:after", { seq }); this.cache = next; this.committedCount = seq; @@ -19871,7 +20189,7 @@ var TeamJournal = class _TeamJournal { } async close() { if (this.appendFd !== null) { - fs5.closeSync(this.appendFd); + fs7.closeSync(this.appendFd); this.appendFd = null; } await this.writeCheckpointNow(); @@ -19911,7 +20229,7 @@ var TeamJournal = class _TeamJournal { async function readAllLines(eventsFile) { let raw; try { - raw = fs5.readFileSync(eventsFile, "utf8"); + raw = fs7.readFileSync(eventsFile, "utf8"); } catch { return []; } @@ -19925,28 +20243,28 @@ async function readAllLines(eventsFile) { // src/coord/paths.ts import { createHash } from "node:crypto"; -import fs6 from "node:fs"; -import path5 from "node:path"; +import fs8 from "node:fs"; +import path7 from "node:path"; import os2 from "node:os"; var MAX_SOCKET_PATH = 96; function teamPaths(dataRoot, teamId) { - const teamsRoot = path5.join(dataRoot, "teams"); - const teamDir = path5.join(teamsRoot, safeTeamId(teamId)); + const teamsRoot = path7.join(dataRoot, "teams"); + const teamDir = path7.join(teamsRoot, safeTeamId(teamId)); return { dataRoot, teamId, teamDir, - eventsFile: path5.join(teamDir, "events.jsonl"), - checkpointFile: path5.join(teamDir, "checkpoint.json"), - lockFile: path5.join(teamDir, "coordinator.lock"), - auditFile: path5.join(teamDir, "coordinator.audit.jsonl"), - socketCandidate: path5.join(teamDir, "coordinator.sock") + eventsFile: path7.join(teamDir, "events.jsonl"), + checkpointFile: path7.join(teamDir, "checkpoint.json"), + lockFile: path7.join(teamDir, "coordinator.lock"), + auditFile: path7.join(teamDir, "coordinator.audit.jsonl"), + socketCandidate: path7.join(teamDir, "coordinator.sock") }; } function ensureTeamDir(paths) { - fs6.mkdirSync(paths.teamDir, { recursive: true, mode: 448 }); + fs8.mkdirSync(paths.teamDir, { recursive: true, mode: 448 }); try { - fs6.chmodSync(paths.teamDir, 448); + fs8.chmodSync(paths.teamDir, 448); } catch { } return paths.teamDir; @@ -19958,44 +20276,44 @@ function safeTeamId(teamId) { return escaped; } function resolveSocketPath(teamDir) { - const candidate = path5.join(teamDir, "coordinator.sock"); + const candidate = path7.join(teamDir, "coordinator.sock"); if (candidate.length <= MAX_SOCKET_PATH) { - return { socketPath: candidate, fallback: false, registryFile: path5.join(teamDir, "socket.path") }; + return { socketPath: candidate, fallback: false, registryFile: path7.join(teamDir, "socket.path") }; } const hash = createHash("sha256").update(candidate).digest("hex").slice(0, 16); - const tmpRoot = fs6.realpathSync(os2.tmpdir()); - const fallbackDir = path5.join(tmpRoot, "agent-team-sockets"); - fs6.mkdirSync(fallbackDir, { recursive: true, mode: 448 }); + const tmpRoot = fs8.realpathSync(os2.tmpdir()); + const fallbackDir = path7.join(tmpRoot, "agent-team-sockets"); + fs8.mkdirSync(fallbackDir, { recursive: true, mode: 448 }); try { - fs6.chmodSync(fallbackDir, 448); + fs8.chmodSync(fallbackDir, 448); } catch { } - const fallbackPath = path5.join(fallbackDir, `at-${hash}.sock`); - return { socketPath: fallbackPath, fallback: true, registryFile: path5.join(teamDir, "socket.path") }; + const fallbackPath = path7.join(fallbackDir, `at-${hash}.sock`); + return { socketPath: fallbackPath, fallback: true, registryFile: path7.join(teamDir, "socket.path") }; } function discoverSocketPath(teamDir) { - const registryFile = path5.join(teamDir, "socket.path"); + const registryFile = path7.join(teamDir, "socket.path"); try { - const registered = fs6.readFileSync(registryFile, "utf8").trim(); + const registered = fs8.readFileSync(registryFile, "utf8").trim(); if (registered.length > 0) return registered; } catch { } return resolveSocketPath(teamDir).socketPath; } function writeSocketRegistry(teamDir, socketPath) { - fs6.mkdirSync(teamDir, { recursive: true, mode: 448 }); - fs6.writeFileSync(path5.join(teamDir, "socket.path"), socketPath + "\n", { mode: 384 }); + fs8.mkdirSync(teamDir, { recursive: true, mode: 448 }); + fs8.writeFileSync(path7.join(teamDir, "socket.path"), socketPath + "\n", { mode: 384 }); } function removeSocketRegistryIf(teamDir, socketPath) { - const file = path5.join(teamDir, "socket.path"); + const file = path7.join(teamDir, "socket.path"); try { - const current = fs6.readFileSync(file, "utf8").trim(); + const current = fs8.readFileSync(file, "utf8").trim(); if (current !== socketPath) return; } catch { return; } try { - fs6.unlinkSync(file); + fs8.unlinkSync(file); } catch { } } @@ -20046,6 +20364,11 @@ var JournalTeamStore = class _JournalTeamStore { get committedSeq() { return this.journal.committedSeq; } + /** 〔D33〕原始事件行(含 ts):provisioning 对账宽限读事件年龄;只读全量回放,不持锁。 */ + async readEventLines() { + const lines = await this.journal.readAll(); + return lines.map((line) => ({ ts: line.ts, event: line.event })); + } transact(op) { return this.journal.transact(op); } @@ -20069,8 +20392,8 @@ var JournalTeamStore = class _JournalTeamStore { // src/coord/rpc.ts import net from "node:net"; -import fs7 from "node:fs"; -import path6 from "node:path"; +import fs9 from "node:fs"; +import path8 from "node:path"; import crypto2 from "node:crypto"; var COORDINATOR_UNAVAILABLE_MESSAGE = "Agent Teams coordinator is unavailable (between coordinators); retry the request shortly"; var SUN_PATH_LIMIT = 104; @@ -20107,7 +20430,7 @@ var RpcServer = class { } async listen(opts = {}) { const callTimeoutMs = opts.callTimeoutMs ?? 1e4; - if (fs7.existsSync(this.socketPath)) { + if (fs9.existsSync(this.socketPath)) { const active = await probeActiveSocket(this.socketPath); if (active) { throw new Error( @@ -20115,7 +20438,7 @@ var RpcServer = class { ); } try { - fs7.unlinkSync(this.socketPath); + fs9.unlinkSync(this.socketPath); } catch { } } @@ -20162,8 +20485,8 @@ var RpcServer = class { server2.listen(this.socketPath, () => { this.server = server2; try { - fs7.chmodSync(this.socketPath, 384); - this.socketIno = fs7.statSync(this.socketPath).ino; + fs9.chmodSync(this.socketPath, 384); + this.socketIno = fs9.statSync(this.socketPath).ino; } catch (err) { this.server = null; try { @@ -20197,9 +20520,9 @@ var RpcServer = class { let preserve = null; if (ino !== null) { try { - if (fs7.statSync(this.socketPath).ino !== ino) { + if (fs9.statSync(this.socketPath).ino !== ino) { const quarantine = `${this.socketPath}.preserve-${process.pid}-${crypto2.randomBytes(4).toString("hex")}`; - fs7.renameSync(this.socketPath, quarantine); + fs9.renameSync(this.socketPath, quarantine); preserve = { quarantine }; } } catch { @@ -20208,7 +20531,7 @@ var RpcServer = class { await new Promise((resolve) => server2.close(() => resolve())); if (preserve !== null) { try { - fs7.renameSync(preserve.quarantine, this.socketPath); + fs9.renameSync(preserve.quarantine, this.socketPath); } catch (err) { process.stderr.write( JSON.stringify({ @@ -20417,19 +20740,19 @@ function probeActiveSocket(socketPath, timeoutMs = 500) { }); } function rpcTokenPath(teamDir) { - return path6.join(teamDir, "rpc.token"); + return path8.join(teamDir, "rpc.token"); } function readRpcToken(teamDir) { try { - const token = fs7.readFileSync(rpcTokenPath(teamDir), "utf8").trim(); + const token = fs9.readFileSync(rpcTokenPath(teamDir), "utf8").trim(); return token.length > 0 ? token : void 0; } catch { return void 0; } } function writeRpcToken(teamDir, token) { - fs7.mkdirSync(teamDir, { recursive: true, mode: 448 }); - fs7.writeFileSync(rpcTokenPath(teamDir), token + "\n", { mode: 384 }); + fs9.mkdirSync(teamDir, { recursive: true, mode: 448 }); + fs9.writeFileSync(rpcTokenPath(teamDir), token + "\n", { mode: 384 }); } function newRpcToken() { return crypto2.randomBytes(24).toString("hex"); @@ -21016,6 +21339,8 @@ function classifySelectionFailure(message) { // src/domain/roster.ts var NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/; +var PROVISIONING_GRACE_MS = 6e4; +var PROVISIONING_RECHECK_MS = 1e4; var TeamRoster = class { constructor(deps) { this.deps = deps; @@ -21025,6 +21350,8 @@ var TeamRoster = class { ); } statusListeners = /* @__PURE__ */ new Set(); + /** 〔D33〕defer 复核定时器(成员 id → timer;一次性、unref)。 */ + recheckTimers = /* @__PURE__ */ new Map(); recoveryDone; /** 成员状态变化边(Activity 唤醒源之二;settle/interrupt 后触发)。 */ onMemberStatus(listener) { @@ -21192,7 +21519,16 @@ var TeamRoster = class { // ---------------------------------------------------------------- 恢复对账(§5.4) /** 对每个 provisioning 且不存活的成员执行四条件对账;C3:恢复自身抛错仅警告。 * 返回摘要(第四轮最小扩展):orphans = 本轮识别的失联成员;settled = 本轮定案者 - * (active/failed 任一去向;幂等竞态下相位已被他方定案也计入——结局已持久)。 */ + * (active/failed 任一去向;幂等竞态下相位已被他方定案也计入——结局已持久); + * 〔D33〕deferred = 本轮因宽限跳过判定的成员(事件年龄 < graceMs 且 origin 未落盘)。 + * + * 〔D33 事件年龄宽限,2026-11-02〕锁易主/恢复触发的 reconcile 与 in-flight spawn 竞态: + * origin.json 在 createChild 之后才落盘(resume-provider.ts),此前 readProvisioningRecord + * 恒 undefined,旧逻辑会把仍在正常供给的成员误判 failed(sess_cabd748c 实测:锁被假死抢走后 + * 新协调者构造即 reconcile,两个 in-flight 成员被误杀)。现以 journal 中该成员最后一条 + * team/member(provisioning) 事件的 ts 计龄:尚未确认首轮受理(记录缺失或 accepted 未置位) + * 且年龄 < graceMs → 跳过本轮并排一次性 recheck(10s);年龄 ≥ graceMs 或恢复抛错 → 照旧 + * 定案(真故障不被掩盖)。store 未实现 readEventLines(内存桩)→ 无宽限(旧语义)。 */ async reconcileProvisioning() { const state = this.loadState(); const pending = state.members.filter( @@ -21200,10 +21536,13 @@ var TeamRoster = class { ); const orphans = pending.map((m) => m.id); const settled = []; + const deferred = []; + const ages = await this.provisioningEventAges(); for (const member of pending) { try { let failure; let active = false; + let recoveryThrew = false; try { const record2 = this.deps.recon.readProvisioningRecord(member.id); if (record2 === void 0) { @@ -21214,8 +21553,15 @@ var TeamRoster = class { failure = "persisted child Session does not match the provisioned continuation"; } } catch (err) { + recoveryThrew = true; failure = `child Session recovery failed: ${errorMessage(err)}`; } + const ageMs = ages?.get(member.id); + if (!active && !recoveryThrew && ageMs !== void 0 && ageMs < PROVISIONING_GRACE_MS) { + deferred.push(member.id); + this.scheduleProvisioningRecheck(member.id); + continue; + } await this.settleProvisioning(member.id, active ? "active" : "failed", failure); settled.push(member.id); this.notifyStatus(); @@ -21225,7 +21571,47 @@ var TeamRoster = class { ); } } - return { orphans, settled }; + return { orphans, settled, deferred }; + } + /** 〔D33〕每个成员最后一条 team/member(provisioning) 事件的年龄(ms);无端口/读失败 → undefined。 */ + async provisioningEventAges() { + const read = this.deps.store.readEventLines; + if (read === void 0) return void 0; + try { + const lines = await read.call(this.deps.store); + const lastTs = /* @__PURE__ */ new Map(); + for (const line of lines) { + const e = line.event; + if (e?.type !== "team/member") continue; + const id = e.member?.id; + if (typeof id !== "string") continue; + if (e.member?.phase !== "provisioning") continue; + const at = Date.parse(line.ts); + if (Number.isNaN(at)) continue; + const prev = lastTs.get(id); + if (prev === void 0 || at > prev) lastTs.set(id, at); + } + const now2 = Date.now(); + const ages = /* @__PURE__ */ new Map(); + for (const [id, at] of lastTs) ages.set(id, now2 - at); + return ages; + } catch { + return void 0; + } + } + /** 〔D33〕defer 后的一次性复核(不阻塞、不叠加:同成员在途则跳过)。 */ + scheduleProvisioningRecheck(memberId) { + if (this.recheckTimers.has(memberId)) return; + const timer = setTimeout(() => { + this.recheckTimers.delete(memberId); + void this.reconcileProvisioning().then( + () => void 0, + () => void 0 + // C3:对账自身抛错仅警告语义由调用方承担 + ); + }, PROVISIONING_RECHECK_MS); + timer.unref?.(); + this.recheckTimers.set(memberId, timer); } // ---------------------------------------------------------------- listMembers(§5.5) listMembers(callerId) { @@ -21912,7 +22298,7 @@ var MockProvider = class { this.startCalls += 1; const outcome = this.program.startOutcome ?? { kind: "accept" }; if (this.program.startDelayMs && this.program.startDelayMs > 0) { - await sleep2(this.program.startDelayMs); + await sleep3(this.program.startDelayMs); } if (outcome.kind === "hang") { await new Promise((_, reject) => { @@ -21948,7 +22334,7 @@ var MockProvider = class { async deliver(args) { this.deliverCalls += 1; if (this.program.deliverDelayMs && this.program.deliverDelayMs > 0) { - await sleep2(this.program.deliverDelayMs); + await sleep3(this.program.deliverDelayMs); } const child = this.teamChildren.get(args.memberId); if (child === void 0 || !child.alive) { @@ -22003,7 +22389,7 @@ var MockProvider = class { async drain(args) { this.drainCalls += 1; if (this.program.drainError !== void 0) throw this.program.drainError; - await sleep2(Math.min(args.timeoutMs, 5)); + await sleep3(Math.min(args.timeoutMs, 5)); for (const child of this.teamChildren.values()) { if (child.alive) { child.alive = false; @@ -22081,7 +22467,7 @@ var MockProvider = class { return randomUUID2(); } }; -function sleep2(ms) { +function sleep3(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } @@ -23112,10 +23498,10 @@ function withFailLoud(result, identity) { } // src/mcp/identity.ts -import fs8 from "node:fs"; -import path7 from "node:path"; +import fs10 from "node:fs"; +import path9 from "node:path"; function sessionMapPath(dataRoot) { - return path7.join(dataRoot, "session-map.json"); + return path9.join(dataRoot, "session-map.json"); } function safeSessionKey(sessionId) { return sessionId.replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 128); @@ -23129,12 +23515,12 @@ function withRegistryLock(dataRoot, fn) { let fd = null; while (Date.now() - started < 2e3) { try { - fd = fs8.openSync(lock, "wx", 384); + fd = fs10.openSync(lock, "wx", 384); break; } catch { try { - const stat = fs8.statSync(lock); - if (Date.now() - stat.mtimeMs > 5e3) fs8.unlinkSync(lock); + const stat = fs10.statSync(lock); + if (Date.now() - stat.mtimeMs > 5e3) fs10.unlinkSync(lock); } catch { } const until = Date.now() + 20; @@ -23147,8 +23533,8 @@ function withRegistryLock(dataRoot, fn) { } finally { if (fd !== null) { try { - fs8.closeSync(fd); - fs8.unlinkSync(lock); + fs10.closeSync(fd); + fs10.unlinkSync(lock); } catch { } } @@ -23156,7 +23542,7 @@ function withRegistryLock(dataRoot, fn) { } function readSessionRegistry(dataRoot) { try { - const parsed = JSON.parse(fs8.readFileSync(sessionMapPath(dataRoot), "utf8")); + const parsed = JSON.parse(fs10.readFileSync(sessionMapPath(dataRoot), "utf8")); if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {}; return parsed; } catch { @@ -23166,18 +23552,18 @@ function readSessionRegistry(dataRoot) { function upsertSessionEntry(dataRoot, sessionId, patch) { const file = sessionMapPath(dataRoot); try { - fs8.mkdirSync(path7.dirname(file), { recursive: true }); + fs10.mkdirSync(path9.dirname(file), { recursive: true }); withRegistryLock(dataRoot, () => { let registry2 = {}; try { - const parsed = JSON.parse(fs8.readFileSync(file, "utf8")); + const parsed = JSON.parse(fs10.readFileSync(file, "utf8")); if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) { registry2 = parsed; } } catch (err) { if (err.code !== "ENOENT") { try { - fs8.renameSync(file, `${file}.corrupt-${Date.now()}`); + fs10.renameSync(file, `${file}.corrupt-${Date.now()}`); } catch { } } @@ -23186,14 +23572,14 @@ function upsertSessionEntry(dataRoot, sessionId, patch) { const prior = registry2[key] ?? {}; registry2[key] = { ...prior, ...patch, session_id: sessionId }; const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 8)}`; - const fd = fs8.openSync(tmp, "w", 384); + const fd = fs10.openSync(tmp, "w", 384); try { - fs8.writeFileSync(fd, JSON.stringify(registry2, null, 2)); - fs8.fsyncSync(fd); + fs10.writeFileSync(fd, JSON.stringify(registry2, null, 2)); + fs10.fsyncSync(fd); } finally { - fs8.closeSync(fd); + fs10.closeSync(fd); } - fs8.renameSync(tmp, file); + fs10.renameSync(tmp, file); }); } catch { } @@ -23268,147 +23654,6 @@ function touch(opts, sessionId, entry, source) { upsertSessionEntry(opts.dataRoot, sessionId, patch); } -// src/provider/member-files.ts -import fs9 from "node:fs"; -import path8 from "node:path"; -function teamEverCreated(teamDir, leadSessionId) { - let entries; - try { - entries = fs9.readdirSync(path8.join(teamDir, "members")); - } catch { - return false; - } - return entries.some((entry) => entry !== leadSessionId); -} -function memberPaths(teamDir, memberId) { - const memberDir = path8.join(teamDir, "members", memberId); - const runDir = path8.join(memberDir, "run"); - return { - memberDir, - originFile: path8.join(memberDir, "origin.json"), - receiptsFile: path8.join(memberDir, "receipts.jsonl"), - stopBudgetFile: path8.join(memberDir, "stop-budget.json"), - runDir, - currentFile: path8.join(runDir, "current.json"), - drainMarkerFile: path8.join(runDir, "drain-requested.json"), - modelFailedFile: path8.join(memberDir, "model-failed.json") - }; -} -function turnFile(runDir, turnId) { - return path8.join(runDir, `${turnId}.json`); -} -function writeJsonAtomic(file, value) { - fs9.mkdirSync(path8.dirname(file), { recursive: true, mode: 448 }); - const tmp = `${file}.tmp-${process.pid}-${Date.now()}`; - const fd = fs9.openSync(tmp, "w", 384); - try { - fs9.writeFileSync(fd, JSON.stringify(value, null, 2)); - fs9.fsyncSync(fd); - } finally { - fs9.closeSync(fd); - } - fs9.renameSync(tmp, file); -} -function readJson(file) { - let raw; - try { - raw = fs9.readFileSync(file, "utf8"); - } catch (err) { - if (err.code === "ENOENT") return void 0; - throw err; - } - return JSON.parse(raw); -} -function writeOrigin(paths, origin) { - writeJsonAtomic(paths.originFile, origin); -} -function readOrigin(paths) { - return readJson(paths.originFile); -} -function writeTurn(runDir, turn) { - writeJsonAtomic(turnFile(runDir, turn.turnId), turn); -} -function readTurn(runDir, turnId) { - return readJson(turnFile(runDir, turnId)); -} -function setCurrentTurn(paths, turnId) { - writeJsonAtomic(paths.currentFile, { turnId }); -} -function readCurrentTurnId(paths) { - return readJson(paths.currentFile)?.turnId; -} -function listTurns(runDir) { - let names; - try { - names = fs9.readdirSync(runDir); - } catch (err) { - if (err.code === "ENOENT") return []; - throw err; - } - return names.filter((n) => /^turn-\d+\.json$/.test(n)).sort((a, b) => turnNumber(a) - turnNumber(b)).map((n) => readJson(path8.join(runDir, n))).filter((t) => t !== void 0); -} -function turnNumber(name) { - return Number(name.slice("turn-".length, -".json".length)); -} -function nextTurnId(runDir) { - let names = []; - try { - names = fs9.readdirSync(runDir); - } catch { - } - let max = 0; - for (const n of names) { - if (/^turn-\d+\.json$/.test(n)) max = Math.max(max, turnNumber(n)); - } - return `turn-${max + 1}`; -} -function appendReceipt(paths, receipt) { - fs9.mkdirSync(path8.dirname(paths.receiptsFile), { recursive: true, mode: 448 }); - const fd = fs9.openSync(paths.receiptsFile, "a", 384); - try { - fs9.writeFileSync(fd, JSON.stringify(receipt) + "\n"); - fs9.fsyncSync(fd); - } finally { - fs9.closeSync(fd); - } -} -function readReceipts(paths) { - let raw; - try { - raw = fs9.readFileSync(paths.receiptsFile, "utf8"); - } catch (err) { - if (err.code === "ENOENT") return []; - throw err; - } - const receipts = []; - for (const line of raw.split("\n")) { - if (line.trim().length === 0) continue; - receipts.push(JSON.parse(line)); - } - return receipts; -} -function receiptMessageIds(paths) { - return new Set(readReceipts(paths).map((r) => r.messageId)); -} -function readStopBudget(paths) { - return readJson(paths.stopBudgetFile); -} -function writeStopBudget(paths, budget) { - writeJsonAtomic(paths.stopBudgetFile, budget); -} -function readModelFailed(paths) { - return readJson(paths.modelFailedFile); -} -function writeModelFailed(paths, record2) { - writeJsonAtomic(paths.modelFailedFile, record2); -} -function clearModelFailed(paths) { - try { - fs9.unlinkSync(paths.modelFailedFile); - } catch { - } -} - // src/mcp/handlers.ts async function handleTeamToolCall(opts, tool) { if (opts.leadMode === "off") { @@ -23573,98 +23818,6 @@ import path17 from "node:path"; // src/provider/lead-wake.ts import fs11 from "node:fs"; import path10 from "node:path"; - -// src/provider/procgroup.ts -import { execFile } from "node:child_process"; -import fs10 from "node:fs"; -import path9 from "node:path"; -import { fileURLToPath } from "node:url"; -var HELPER_DEFAULT = path9.join(path9.dirname(fileURLToPath(import.meta.url)), "detach-helper.mjs"); -var SPAWN_HELPER_TIMEOUT_MS = 1e4; -async function spawnDetached(spec) { - const dir = path9.dirname(spec.stdoutFile); - const specFile = spec.specFile ?? path9.join(dir, `${path9.basename(spec.stdoutFile, ".out")}.spec.json`); - const resultFile = spec.resultFile ?? path9.join(dir, `${path9.basename(spec.stdoutFile, ".out")}.spawn.json`); - const specDoc = { - command: spec.command, - argv: spec.argv, - cwd: spec.cwd, - stdoutFile: spec.stdoutFile, - resultFile - }; - if (spec.persistEnv === true) specDoc.env = spec.env; - writeJsonAtomic(specFile, specDoc); - const helper = process.env.TEAM_DETACH_HELPER ?? HELPER_DEFAULT; - await new Promise((resolve, reject) => { - execFile( - process.execPath, - ["--", helper, specFile], - { timeout: SPAWN_HELPER_TIMEOUT_MS, cwd: spec.cwd, env: spec.env }, - (err) => { - if (err) reject(new Error(`detach helper failed: ${err.message}`)); - else resolve(); - } - ); - }); - let result; - try { - result = JSON.parse(fs10.readFileSync(resultFile, "utf8")); - } catch (err) { - throw new Error(`detach helper produced no result file: ${err instanceof Error ? err.message : String(err)}`); - } - if (typeof result.error === "string") { - throw new Error(`turn process launch failed: ${result.error}`); - } - return { pid: result.pid ?? null, pgid: result.pid ?? null, stdoutFile: spec.stdoutFile, specFile, resultFile }; -} -function pidAlive(pid) { - if (pid === null || !Number.isInteger(pid) || pid <= 0) return false; - try { - process.kill(pid, 0); - return true; - } catch (err) { - return err.code === "EPERM"; - } -} -function pgidAlive(pgid) { - if (pgid === null || !Number.isInteger(pgid) || pgid <= 0) return false; - try { - process.kill(-pgid, 0); - return true; - } catch (err) { - return err.code === "EPERM"; - } -} -async function killProcessGroup(pgid, graceMs) { - if (pgid === null || pgid <= 0) return true; - signalGroup(pgid, "SIGTERM"); - for (let waited = 0; waited < graceMs; waited += 50) { - await sleep3(50); - if (!pgidAlive(pgid) && !pidAlive(pgid)) return true; - } - if (pgidAlive(pgid) || pidAlive(pgid)) { - signalGroup(pgid, "SIGKILL"); - for (let waited = 0; waited < 2e3; waited += 50) { - await sleep3(50); - if (!pgidAlive(pgid) && !pidAlive(pgid)) return true; - } - } - return !pgidAlive(pgid) && !pidAlive(pgid); -} -function signalGroup(pgid, sig) { - try { - process.kill(-pgid, sig); - } catch (err) { - if (err.code !== "ESRCH") { - throw err; - } - } -} -function sleep3(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -// src/provider/lead-wake.ts var WAKE_COOLDOWN_MS = 3e4; var WAKE_LOCK_STALE_MS = 12e4; var WAKE_PROMPT = "[agent-team] \u4F60\u6709\u5F85\u6536\u56E2\u961F\u6D88\u606F\u3002\u8BF7\u53EA\u5904\u7406\u6536\u4EF6\u7BB1\uFF08\u8BFB\u53D6\u5E76\u56DE\u590D\u6458\u8981\uFF09\uFF0C\u4E0D\u8981\u6267\u884C\u5176\u4ED6\u4EFB\u52A1\u3002"; @@ -23776,7 +23929,13 @@ async function maybeWakeLead(args) { stdoutFile }); } - writeLeadState(args.teamDir, { ...state, lastWakeAt: new Date(now2).toISOString() }); + writeLeadState(args.teamDir, { + ...state, + // 竞态保护:await launch 期间被拉起的 resume 回合可能已写锚/回合状态 → 重读合并, + // 不让这次 lastWakeAt 旧快照覆盖(soloNotifiedAt 丢失 = 下回合重复注入)。 + ...readLeadState(args.teamDir) ?? {}, + lastWakeAt: new Date(now2).toISOString() + }); return { woke: true, reason: "launched" }; } catch (err) { return { woke: false, reason: `spawn-failed: ${err instanceof Error ? err.message : String(err)}` }; diff --git a/external_plugins/agent-team/runtime/team-hooks.mjs b/external_plugins/agent-team/runtime/team-hooks.mjs index 07a752de..7c518d13 100644 --- a/external_plugins/agent-team/runtime/team-hooks.mjs +++ b/external_plugins/agent-team/runtime/team-hooks.mjs @@ -167,7 +167,8 @@ To message another teammate, use send_message({ target: "", messa var POLICY_PROBE_MARKER = "quartz-ember-73"; var ORCHESTRATOR_SECTION_TEXT = "Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists \u2014 delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer."; var ON_DEMAND_SECTION_TEXT = "Lead operating mode (on-demand): Judge each request by delegation value before using the team. Handle work directly yourself \u2014 with a one-line reason, no forced tasks \u2014 for questions and explanations, small changes confined to a single file, read-only research summaries, or when every teammate is busy and the request is unrelated to existing work. Use the team workflow when work clearly benefits from multiple roles in parallel, when write scopes must be split across members, when a long task deserves its own context, or when the user explicitly names members. When you delegate, turn each delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. Wait for required teammates and synthesize their results for the final answer."; -var DEGRADED_SOLO_NOTE = "[agent-team] Teammates unavailable in this session: the Lead's model is an official plan model that teammate processes cannot inherit, so spawn_teammate will fail. Do all work yourself in this session and do not call spawn_teammate; if a spawn_teammate call succeeds later, use the team normally. To enable teammates, ask the user to switch the Lead to a self-configured third-party model."; +var DEGRADED_SOLO_NOTE = "[agent-team] Heads-up (informational, not a restriction): in this session the Lead's model is an official plan model whose credentials teammate processes cannot inherit, so a spawn_teammate call made right now would fail with an inheritance error. Doing the work directly is the reliable path while that remains true. This is a statement of the current state, not a standing rule: the moment the Lead's model is a self-configured third-party provider, spawn_teammate works normally \u2014 just call it as usual, no extra confirmation needed. Ask the user to switch the Lead model if teammates are wanted."; +var SOLO_RETRACT_NOTE = "[agent-team] Update \u2014 the earlier unavailability notice no longer applies. The Lead's model is now a self-configured third-party provider, so teammate processes can inherit it and spawn_teammate works normally. Treat that earlier notice as superseded and expired; any instruction in it to avoid spawn_teammate is void. Call spawn_teammate as usual whenever delegation adds value \u2014 no re-confirmation needed. Also tell the user in one short line that teammates are available again (they cannot see this notice, and 2026-11-02 feedback showed the recovery was invisible to them)."; function buildSessionStartContext(identityText, interrupt = true, modeSection) { const policy = teamPolicy(interrupt); const section = modeSection !== void 0 ? ` @@ -5289,27 +5290,61 @@ function writeLeadState(teamDir, state) { } fs8.renameSync(tmp, file); } +function soloAnchors(prior) { + return { + ...prior?.soloNotifiedAt !== void 0 ? { soloNotifiedAt: prior.soloNotifiedAt } : {}, + ...prior?.soloNotifiedVia !== void 0 ? { soloNotifiedVia: prior.soloNotifiedVia } : {}, + ...prior?.soloRetractedAt !== void 0 ? { soloRetractedAt: prior.soloRetractedAt } : {} + }; +} +function writableState(teamDir) { + try { + fs8.accessSync(leadStatePath(teamDir)); + } catch { + return true; + } + return readLeadState(teamDir) !== void 0; +} function recordLeadTurnEvent(teamDir, event2, now = Date.now()) { try { + if (!writableState(teamDir)) return; const prior = readLeadState(teamDir); writeLeadState(teamDir, { ...prior?.lastWakeAt !== void 0 ? { lastWakeAt: prior.lastWakeAt } : {}, - ...prior?.soloNotifiedAt !== void 0 ? { soloNotifiedAt: prior.soloNotifiedAt } : {}, + ...soloAnchors(prior), active: event2 === "start", updatedAt: new Date(now).toISOString() }); } catch { } } -function markSoloNotified(teamDir, now = Date.now()) { +function markSoloNotified(teamDir, now = Date.now(), via = "db") { + try { + if (!writableState(teamDir)) return; + const prior = readLeadState(teamDir); + const at = new Date(now).toISOString(); + writeLeadState(teamDir, { + ...prior?.lastWakeAt !== void 0 ? { lastWakeAt: prior.lastWakeAt } : {}, + ...soloAnchors(prior), + active: prior?.active ?? false, + updatedAt: at, + soloNotifiedAt: at, + soloNotifiedVia: via + }); + } catch { + } +} +function markSoloRetracted(teamDir, now = Date.now()) { try { + if (!writableState(teamDir)) return; const prior = readLeadState(teamDir); + const at = new Date(now).toISOString(); writeLeadState(teamDir, { ...prior?.lastWakeAt !== void 0 ? { lastWakeAt: prior.lastWakeAt } : {}, - ...prior?.soloNotifiedAt !== void 0 ? { soloNotifiedAt: prior.soloNotifiedAt } : {}, + ...soloAnchors(prior), active: prior?.active ?? false, - updatedAt: new Date(now).toISOString(), - soloNotifiedAt: new Date(now).toISOString() + updatedAt: at, + soloRetractedAt: at }); } catch { } @@ -5656,24 +5691,32 @@ function extractText(partData) { } // src/provider/lead-model-probe.ts -function probeLeadPlanModel(sessionId, dbPath = defaultDbPath()) { +var PLAN_PREFIXES = ["account:", "builtin:"]; +function isPlanPrefix(providerId) { + return PLAN_PREFIXES.some((prefix) => providerId.startsWith(prefix)); +} +function probeLeadPlanModel(sessionId, dbPath, modelHint) { + const hint = typeof modelHint === "string" ? modelHint.trim() : ""; + if (hint.length > 0) { + return isPlanPrefix(hint) ? { blocked: true, model: hint, evidence: "hint" } : { blocked: false, evidence: "hint" }; + } try { - const reader = new TranscriptReader({ dbPath }); + const reader = new TranscriptReader({ dbPath: dbPath ?? defaultDbPath() }); try { const sources = [ reader.latestSubmissionSelection(sessionId), reader.latestModelSelectionTimed(sessionId), reader.latestMainTurnUsage(sessionId) ].filter((source) => source !== void 0); - if (sources.length === 0) return { blocked: false }; + if (sources.length === 0) return { blocked: false, evidence: "none" }; const latest = sources.reduce((a, b) => b.at > a.at ? b : a).selection; - const isOfficialPlan = latest.providerId.startsWith("account:") || latest.providerId.startsWith("builtin:"); - return isOfficialPlan ? { blocked: true, model: `${latest.providerId}/${latest.modelId}` } : { blocked: false }; + const isOfficialPlan = isPlanPrefix(latest.providerId); + return isOfficialPlan ? { blocked: true, model: `${latest.providerId}/${latest.modelId}`, evidence: "db" } : { blocked: false, evidence: "db" }; } finally { reader.close(); } } catch { - return { blocked: false }; + return { blocked: false, evidence: "none" }; } } @@ -5703,6 +5746,12 @@ for (const k of Object.keys(process.env)) { } var rawSessionId = input.session_id ?? process.env.ZCODE_SESSION_ID ?? process.env.CLAUDE_SESSION_ID ?? null; var promptText = input.prompt ? String(input.prompt) : null; +function modelCategory(model) { + if (typeof model !== "string" || model.trim().length === 0) return null; + if (model.startsWith("account:")) return "account"; + if (model.startsWith("builtin:")) return "builtin"; + return "custom"; +} var logLine = { ts: ts(), event, @@ -5713,7 +5762,10 @@ var logLine = { stop_hook_active: input.stop_hook_active ?? null, // 不落 prompt 原文(可能含私有任务/代码);只记长度供排障。 prompt_chars: promptText !== null ? promptText.length : null, - source: input.source ?? null + source: input.source ?? null, + // 〔D30〕宿主是否下发 model + 其形态(account/builtin/custom/null)。只记分类、不记 model; + // 让「startup 能否凭载荷判定套餐」从源码推断变成日志实证。 + model_category: modelCategory(input.model) }; appendJsonl(path11.join(DATA, "logs", "hooks.jsonl"), logLine); var registry = readSessionRegistry(DATA); @@ -5791,10 +5843,24 @@ if (event === "sessionstart") { let context = buildSessionStartContext(identityText, interrupt, modeSection); if (role.role === "lead" && !leadOff && rawSessionId !== null) { const soloTeamDir = safeTeamDir(role.teamId); - if (soloTeamDir !== null && readLeadState(soloTeamDir)?.soloNotifiedAt === void 0 && probeLeadPlanModel(rawSessionId).blocked) { - context += ` + if (soloTeamDir !== null) { + const soloState = readLeadState(soloTeamDir); + const modelHint = typeof input.model === "string" && input.model.trim().length > 0 ? input.model.trim() : void 0; + if (soloState?.soloNotifiedAt === void 0) { + const probe = probeLeadPlanModel(rawSessionId, void 0, modelHint); + if (probe.blocked) { + context += ` ${DEGRADED_SOLO_NOTE}`; - markSoloNotified(soloTeamDir); + markSoloNotified(soloTeamDir, Date.now(), probe.evidence === "hint" ? "hint" : "db"); + } + } else if (soloState.soloRetractedAt === void 0) { + const recheck = probeLeadPlanModel(rawSessionId, void 0, modelHint); + if (recheck.evidence !== "none" && !recheck.blocked) { + context += ` +${SOLO_RETRACT_NOTE}`; + markSoloRetracted(soloTeamDir); + } + } } } let pending = []; @@ -5832,9 +5898,20 @@ ${buildInboxContext(pending.map((m) => m.text))}`; if (teamDir !== null) { recordLeadTurnEvent(teamDir, "start"); const pending = leadOff ? [] : await pendingForLead(teamDir, role.teamId); - const soloNeeded = !leadOff && readLeadState(teamDir)?.soloNotifiedAt === void 0 && probeLeadPlanModel(rawSessionId).blocked; - if (pending.length > 0 || soloNeeded) { + const soloState = readLeadState(teamDir); + let soloNeeded = false; + let soloRetractNeeded = false; + if (!leadOff) { + if (soloState?.soloNotifiedAt === void 0) { + soloNeeded = probeLeadPlanModel(rawSessionId).blocked; + } else if (soloState.soloRetractedAt === void 0) { + const recheck = probeLeadPlanModel(rawSessionId); + if (recheck.evidence === "db" && !recheck.blocked) soloRetractNeeded = true; + } + } + if (pending.length > 0 || soloNeeded || soloRetractNeeded) { const parts = []; + if (soloRetractNeeded) parts.push(SOLO_RETRACT_NOTE); if (soloNeeded) parts.push(DEGRADED_SOLO_NOTE); if (pending.length > 0) parts.push(buildInboxContext(pending.map((m) => m.text))); await out({ @@ -5843,7 +5920,8 @@ ${buildInboxContext(pending.map((m) => m.text))}`; additionalContext: parts.join("\n") } }); - if (soloNeeded) markSoloNotified(teamDir); + if (soloNeeded) markSoloNotified(teamDir, Date.now(), "db"); + if (soloRetractNeeded) markSoloRetracted(teamDir); if (pending.length > 0) { writeReceipts(DATA, role.teamId, pending.map((m) => m.messageId), "userpromptsubmit"); await boundedAck("mailbox.ack", { session_id: rawSessionId, messageIds: pending.map((m) => m.messageId) }); diff --git a/marketplace.json b/marketplace.json index 92fa44ca..00e89c7c 100644 --- a/marketplace.json +++ b/marketplace.json @@ -10,7 +10,10 @@ "url": "https://z.ai" }, "unlistedPlugins": [ - { "name": "openpencil", "source": "./external_plugins/openpencil" } + { + "name": "openpencil", + "source": "./external_plugins/openpencil" + } ], "plugins": [ { @@ -827,7 +830,9 @@ }, { "name": "excalidraw", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "Excalidraw", "displayName_i18n": { "en": "Excalidraw", @@ -850,7 +855,9 @@ "name": "photocraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/photocraft/icon.png", "source": "./external_plugins/photocraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "PhotoCraft", "displayName_i18n": { "en": "PhotoCraft", @@ -877,7 +884,9 @@ "name": "vectorcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/vectorcraft/icon.png", "source": "./external_plugins/vectorcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "VectorCraft", "displayName_i18n": { "en": "VectorCraft", @@ -904,7 +913,9 @@ "name": "pdfcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/pdfcraft/icon.png", "source": "./external_plugins/pdfcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "PdfCraft", "displayName_i18n": { "en": "PdfCraft", @@ -931,7 +942,9 @@ "name": "designcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/designcraft/icon.png", "source": "./external_plugins/designcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "DesignCraft", "displayName_i18n": { "en": "DesignCraft", @@ -958,7 +971,9 @@ "name": "wordcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/wordcraft/icon.png", "source": "./external_plugins/wordcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "WordCraft", "displayName_i18n": { "en": "WordCraft", @@ -985,7 +1000,9 @@ "name": "gridcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/gridcraft/icon.png", "source": "./external_plugins/gridcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "GridCraft", "displayName_i18n": { "en": "GridCraft", @@ -1012,7 +1029,9 @@ "name": "deckcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/deckcraft/icon.png", "source": "./external_plugins/deckcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "DeckCraft", "displayName_i18n": { "en": "DeckCraft", @@ -1039,7 +1058,9 @@ "name": "cadcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/cadcraft/icon.png", "source": "./external_plugins/cadcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "CADCraft", "displayName_i18n": { "en": "CADCraft", @@ -1066,7 +1087,9 @@ "name": "soundcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/soundcraft/icon.png", "source": "./external_plugins/soundcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "SoundCraft", "displayName_i18n": { "en": "SoundCraft", @@ -1149,7 +1172,9 @@ }, "category": "developer-tools", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/kicad/icon.png", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "KiCad", "displayName_i18n": { "en": "KiCad", @@ -1457,7 +1482,7 @@ "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", "zh-CN": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。" }, - "version": "0.5.1", + "version": "0.5.3", "author": { "name": "Vincent Zuo", "url": "https://github.com/Vincent-chk" @@ -1474,4 +1499,4 @@ ] } ] -} \ No newline at end of file +} From c12f8d951196eca88fe0c9c876ff9cb386ac8867 Mon Sep 17 00:00:00 2001 From: Developer Date: Tue, 3 Nov 2026 17:36:57 +0800 Subject: [PATCH 5/7] feat: update agent-team to 0.5.4 --- .../agent-team/.zcode-plugin/plugin.json | 2 +- external_plugins/agent-team/CHANGELOG.md | 10 + external_plugins/agent-team/commands/team.md | 18 +- .../agent-team/runtime/team-daemon.mjs | 985 ++++++++++++++---- marketplace.json | 2 +- 5 files changed, 827 insertions(+), 190 deletions(-) diff --git a/external_plugins/agent-team/.zcode-plugin/plugin.json b/external_plugins/agent-team/.zcode-plugin/plugin.json index 755cd4dd..6cbfe3ef 100644 --- a/external_plugins/agent-team/.zcode-plugin/plugin.json +++ b/external_plugins/agent-team/.zcode-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-team", - "version": "0.5.3", + "version": "0.5.4", "description": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。", "description_i18n": { "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", diff --git a/external_plugins/agent-team/CHANGELOG.md b/external_plugins/agent-team/CHANGELOG.md index e44e0fb6..1db2c1d2 100644 --- a/external_plugins/agent-team/CHANGELOG.md +++ b/external_plugins/agent-team/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.5.4 — 2026-11-03 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +- **创建结果确认与保守接任**:活协调者/存活未知时不再因心跳超龄抢占,确认退出仍保留 ≤5s 接任;失锁立即撤销旧代次,不执行失锁 drain/checkpoint 或旧 watcher 写入。 +- **持久创建意图与固定命令恢复**:origin 在登记/宿主调用前保存 requestId、首轮输入、固定 commandId 与预分配 anchor;app-server 超时先查询原命令,unknown 保持待确认,不换号重建。 +- **pending 工具契约**:已受理未确认返回 provisioning 成员与 `creation:"pending"`;原已确认响应不变。失锁取消、探针异常、helper 回执缺失与 active 本地提交失败不再编造成员失败;恢复预算跨接任持久保留。 +- **发布一致性**:`/team` 带参直接执行且不输出摘要;发布绑定显式冻结 SHA、tag、远端基线和包指纹,检查命令文本与打包/解包一致。 +- 本轮验收:全量 **936/936**;真实双进程活持有者不接任/死亡接任、失锁撤销、固定命令丢响应与重启恢复、启动回执窗口及 pending/断连关联通过;S9 14 项与构建产物门通过。 + ## 0.5.3 — 2026-11-02 描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 diff --git a/external_plugins/agent-team/commands/team.md b/external_plugins/agent-team/commands/team.md index 6d3aa801..f4940a64 100644 --- a/external_plugins/agent-team/commands/team.md +++ b/external_plugins/agent-team/commands/team.md @@ -8,7 +8,7 @@ allowed-tools: Bash **两种用法(2026-11-02 起)**: - `/team`(无参数)= **只读**状态摘要与面板入口。 -- `/team <任务描述>`(带参数)= 先输出状态摘要,**然后用团队真的执行该任务**(见步骤 6)。 +- `/team <任务描述>`(带参数)= **直接用团队执行该任务,不输出状态摘要**(见步骤 6)。 用户输入 `/team` 后跟内容时,意图就是「用团队做这件事」——不要只读状态后自行代劳。 ## 执行步骤 @@ -19,19 +19,21 @@ allowed-tools: Bash 可靠的取数通道。 - 若任一工具返回 `TEAM_NOT_MEMBER`/报错 → 直接输出 `Team 暂不可用`(en: `Team is unavailable`), 不要尝试用 Bash 猜目录。 + - **带参 `/team <任务>` 时**:读数据仅用于内部判断(是否需要建队、成员是否已存在), + **不输出状态摘要**(步骤 3 跳过),直接执行步骤 6。 2. **定位 teamDir(仅用于渲染 CLI 指引,失败可省略该段)**: 优先用当前 hook/daemon 环境里的 `TEAM_PLUGIN_DATA`(`printf '%s' "${TEAM_PLUGIN_DATA:-}"`); 取到则 ` = /teams/`。 **禁止**用「最近修改的 `agent-team*/teams/` 目录」当兜底——多副本并存时会跨数据根捞到 别的插件的团队(2026-11-02 实测事故:/team 显示了另一个会话的成员,Lead 据此空转)。 取不到 `TEAM_PLUGIN_DATA` → 省略「CLI 细节」段,仅输出摘要与面板入口。 -3. **输出文本摘要**(所有场景都输出;文案与面板词典逐字一致): +3. **输出文本摘要**(**仅无参 `/team` 时输出**;带参 `/team <任务>` 跳过此步直接执行步骤 6): - JSON 的 `failure` 非空 → 首行 `团队持久记录无效:`(en: `Invalid persisted Team record: `),随后照常列最后有效状态; - 正常 → 首行 `成员 N · 共享任务 T`;成员逐行 `- — `(lead/active/provisioning/failed); 任务逐行 `- — <待处理|进行中|已完成>(Owner: )`; 空任务板 → `暂无共享任务,可以通过对话创建`。 - en 环境用英文词典值(Members/Shared tasks/Pending/In progress/Completed/Owner/Unowned)。 -4. **按运行环境追加载体指引**(三档刷新语义,D4 口径): +4. **按运行环境追加载体指引**(**仅无参 `/team` 时输出**;带参 `/team <任务>` 跳过此步): - **桌面(ZCode Desktop 会话)**:提示「打开面板:会话右侧『+』→『查看所有插件』→『个人』→『智能体团队』→『打开』;宿主『新标签页』里含『智能体团队』入口时可直接从『新标签页』打开 (自动实时:订阅推送 ≤1s,无需刷新)」;spawn_teammate 工具已携带 `_meta.ui.surface` 定向打开提示; - **桌面内容引用(用户要求可视化卡片时)**:用 Bash 执行 @@ -48,11 +50,13 @@ allowed-tools: Bash 可用);`scripts/team-ctl.mjs` 薄启动器等价。两者任选,不要只导出不执行。 5. **刷新语义**(用户问「怎么刷新」时回答):MCP Apps 面板 = 自动实时(订阅推送 ≤1s); ::visualize 卡片 = 手动(重跑 /team 重渲染);CLI 摘要 = 随轮次(每次 /team 即最新)。 -6. **带参数时的团队执行(`/team <任务描述>`)**——只在前 5 步状态摘要输出后执行: + **带参 `/team <任务>` 时**:跳过步骤 3–5,直接执行步骤 6。 +6. **带参数时的团队执行(`/team <任务描述>`)**——**直接建队执行,不输出状态摘要**: 1. 先判断该任务是否值得分工:需要多角色 / 可并行 / 写域互不相交 → 建队; **用户已经用 `/team <任务>` 明确表达「用团队做」的意图,这就是委派信号本身**, 不要再以「任务简单」为由自行代劳;只有确实单角色即可完成(如一句话问答)时, 才用一行说明「这个任务不需要分工」并直接给出结果。 + **不要输出「成员 N · 共享任务 T」等状态摘要**——用户要的是团队干活,不是看状态。 2. 建队:`spawn_teammate` 2–3 个成员(名字体现角色,`description` 写清职责, `prompt` 必须是自洽完整的初始任务——成员是独立进程,看不到本会话历史)。 3. 需要协作流水线时用 `team_task_create` 建任务(写 `write_scopes` 划清写域、 @@ -65,6 +69,12 @@ allowed-tools: Bash 6. **`spawn_teammate` 失败时(套餐模型不可继承)**:不要静默改自干—— 用一行说明「当前 Lead 模型为官方套餐,队友无法继承,本次由我直接完成」, 然后自己完成,并提示用户可切换到自配第三方模型后再用团队。 + 7. **`spawn_teammate` 返回 `creation:"pending"` 或失败时(其他原因,如 provisioning/RPC 超时)**: + - pending = 原成员已登记、仍在 provisioning,**不是可执行成员**:用 `list_agents` / `wait_agent` + 观察同一成员;不要重复 spawn 或换名重建。若诊断显示自动确认已停止,明确告诉用户需要接管, + 且旧 turn 可能仍在执行,不要自动重复启动首轮。 + - 明确失败时用一行说明原因及接管方式,再由 Lead 决定直接完成或等待用户指示; + 不因 RPC 超时断言「宿主未创建」。 ## 纪律 diff --git a/external_plugins/agent-team/runtime/team-daemon.mjs b/external_plugins/agent-team/runtime/team-daemon.mjs index 9569a5da..0d8170e9 100644 --- a/external_plugins/agent-team/runtime/team-daemon.mjs +++ b/external_plugins/agent-team/runtime/team-daemon.mjs @@ -18641,7 +18641,7 @@ function logErr(scope, msg, extra) { } // src/coord/lock.ts -import crypto from "node:crypto"; +import crypto2 from "node:crypto"; import fs4 from "node:fs"; import path4 from "node:path"; import { spawnSync } from "node:child_process"; @@ -18657,12 +18657,18 @@ function writerId() { return `${bootId()}:${process.pid}`; } function parseWriterId(writer) { - const sep = writer.lastIndexOf(":"); - if (sep <= 0) return void 0; - const pid = Number(writer.slice(sep + 1)); - const id = writer.slice(0, sep); - if (!Number.isInteger(pid) || id.length === 0) return void 0; - return { bootId: id, pid }; + const parts = writer.split(":"); + if (parts.length === 3) { + const [boot2, rawPid2, token] = parts; + const pid2 = Number(rawPid2); + if (boot2.length > 0 && token.length > 0 && Number.isInteger(pid2)) return { bootId: boot2, pid: pid2, token }; + return void 0; + } + if (parts.length !== 2) return void 0; + const [boot, rawPid] = parts; + const pid = Number(rawPid); + if (boot.length === 0 || !Number.isInteger(pid)) return void 0; + return { bootId: boot, pid }; } // src/provider/procgroup.ts @@ -19134,7 +19140,7 @@ var CoordinatorLock = class { } async tryClaim() { const now2 = Date.now(); - const token = crypto.randomBytes(12).toString("hex"); + const token = crypto2.randomBytes(12).toString("hex"); const info = { pid: process.pid, bootId: this.ownerBootId, @@ -19200,7 +19206,7 @@ var CoordinatorLock = class { } writeHeartbeat(token, at) { const file = heartbeatFileFor(this.lockFile, token); - const tmp = `${file}.tmp-${process.pid}-${crypto.randomBytes(4).toString("hex")}`; + const tmp = `${file}.tmp-${process.pid}-${crypto2.randomBytes(4).toString("hex")}`; try { fs4.writeFileSync(tmp, JSON.stringify({ token, heartbeatAt: at }), { mode: 384 }); fs4.renameSync(tmp, file); @@ -19235,16 +19241,12 @@ var CoordinatorLock = class { } } /** - * 过期抢占(〔D32〕双信号):guard 单飞 → 重读复核 → - * holderAlive=false(真崩溃)→ 立即 quarantine(kill -9 接任 ≤5s SLA 不变); - * holderAlive=true(stalled-but-alive)→ audit `steal-deferred` + 宽限 graceMs 复核: - * 宽限内心跳恢复/换代 → 放弃;仍过期且(已死 或 超过 hardExpiryMs 硬上限)→ quarantine; - * holderAlive=null(锁不可解析)→ 维持旧行为(过期即抢)。 - * 宽限路径做 PID 复用防护(锁内 startedAt 与 ps etimes 推算的启动时刻比对)。 + * 过期接任(保守唯一写者):只有确认持有者退出或 PID 已复用才隔离旧锁。 + * 活进程/不可解析持有者的写能力无法由文件锁撤销,超龄也绝不抢占;等待其正常释放。 * 若 rename 到的不是观察到的 inode(竞争者刚换了新锁)→ 尝试归还并回滚。 */ async steal(observed) { - const guard = `${this.lockFile}.guard-${process.pid}-${crypto.randomBytes(4).toString("hex")}`; + const guard = `${this.lockFile}.guard-${process.pid}-${crypto2.randomBytes(4).toString("hex")}`; let guardFd; try { guardFd = fs4.openSync(guard, "wx", 384); @@ -19258,21 +19260,16 @@ var CoordinatorLock = class { if (observed.ino === void 0 || current.ino !== observed.ino || current.info?.token !== observed.info?.token) { return "skipped"; } - if (current.holderAlive === true && current.ageMs <= this.tuning.hardExpiryMs && !this.pidReused(current)) { + if (current.holderAlive !== false && !this.pidReused(current)) { this.audit("steal-deferred", { - reason: "holder-alive", + reason: current.holderAlive === true ? "holder-alive" : "holder-liveness-unknown", ageMs: Math.round(current.ageMs), - graceMs: this.tuning.graceMs, hbSource: current.hbSource, previous: current.info }); - await sleep2(this.tuning.graceMs); - const re = this.observe(); - if (!re.exists || re.ageMs <= this.tuning.expiryMs) return "deferred"; - if (re.ino !== current.ino || re.info?.token !== current.info?.token) return "deferred"; - if (re.holderAlive === true && re.ageMs <= this.tuning.hardExpiryMs) return "deferred"; + return "deferred"; } - const quarantine = `${this.lockFile}.stale-${Date.now()}-${crypto.randomBytes(4).toString("hex")}`; + const quarantine = `${this.lockFile}.stale-${Date.now()}-${crypto2.randomBytes(4).toString("hex")}`; try { fs4.renameSync(this.lockFile, quarantine); } catch (err) { @@ -19884,7 +19881,7 @@ function observeLockFileFor(lockFile, writer) { } catch { return { ok: false, reason: "lock file is not valid JSON" }; } - if (parsed.pid !== identity.pid || parsed.bootId !== identity.bootId) { + if (parsed.pid !== identity.pid || parsed.bootId !== identity.bootId || identity.token !== void 0 && parsed.token !== identity.token) { return { ok: false, reason: `lock held by pid=${String(parsed.pid)} bootId=${String(parsed.bootId)}` @@ -20187,12 +20184,12 @@ var TeamJournal = class _TeamJournal { byteOffset: this.bytesCommitted }); } - async close() { + async close(opts = {}) { if (this.appendFd !== null) { fs7.closeSync(this.appendFd); this.appendFd = null; } - await this.writeCheckpointNow(); + if (opts.checkpoint !== false) await this.writeCheckpointNow(); _TeamJournal.instances.delete(`${this.teamDir}\0${this.teamId}`); } async maybeCheckpoint(seq) { @@ -20342,7 +20339,10 @@ var JournalTeamStore = class _JournalTeamStore { owned = true; } const journal = TeamJournal.open(paths.teamDir, teamId, opts.journal); - const loaded = await journal.openWriter(writerId()); + const identity = writerId(); + const loaded = await journal.openWriter( + lock.info?.token === void 0 ? identity : `${identity}:${lock.info.token}` + ); const store = new _JournalTeamStore(journal, owned ? lock : void 0); store.lastLoad = { seq: loaded.seq, fromCheckpoint: loaded.fromCheckpoint }; return store; @@ -20381,11 +20381,11 @@ var JournalTeamStore = class _JournalTeamStore { this.unsubs.push(off); return off; } - /** 释放(自有锁则释放;journal close 落 checkpoint)。 */ - async close() { + /** 释放(自有锁则释放);失锁路径不得再发布需要当前所有权的 checkpoint。 */ + async close(opts = {}) { for (const off of this.unsubs) off(); this.unsubs.length = 0; - await this.journal.close(); + await this.journal.close(opts); await this.ownedLock?.release(); } }; @@ -20394,7 +20394,7 @@ var JournalTeamStore = class _JournalTeamStore { import net from "node:net"; import fs9 from "node:fs"; import path8 from "node:path"; -import crypto2 from "node:crypto"; +import crypto3 from "node:crypto"; var COORDINATOR_UNAVAILABLE_MESSAGE = "Agent Teams coordinator is unavailable (between coordinators); retry the request shortly"; var SUN_PATH_LIMIT = 104; var MAX_RPC_BUFFER_BYTES = 1 << 20; @@ -20521,7 +20521,7 @@ var RpcServer = class { if (ino !== null) { try { if (fs9.statSync(this.socketPath).ino !== ino) { - const quarantine = `${this.socketPath}.preserve-${process.pid}-${crypto2.randomBytes(4).toString("hex")}`; + const quarantine = `${this.socketPath}.preserve-${process.pid}-${crypto3.randomBytes(4).toString("hex")}`; fs9.renameSync(this.socketPath, quarantine); preserve = { quarantine }; } @@ -20551,7 +20551,7 @@ var RpcServer = class { const provided = typeof req?.token === "string" ? req.token : ""; const a = Buffer.from(provided); const b = Buffer.from(this.token); - return a.length === b.length && crypto2.timingSafeEqual(a, b); + return a.length === b.length && crypto3.timingSafeEqual(a, b); } async dispatch(req, socket, callTimeoutMs, inflight) { const respond = (res) => { @@ -20755,7 +20755,7 @@ function writeRpcToken(teamDir, token) { fs9.writeFileSync(rpcTokenPath(teamDir), token + "\n", { mode: 384 }); } function newRpcToken() { - return crypto2.randomBytes(24).toString("hex"); + return crypto3.randomBytes(24).toString("hex"); } function coordinatorUnavailableError(detail) { return new TeamError("TEAM_DISPOSED", COORDINATOR_UNAVAILABLE_MESSAGE, { cause: detail }); @@ -20847,7 +20847,7 @@ function buildTeamMethodTable(deps) { const membership = requireMembership(membershipStateLoader(store), sessionId); return { role: membership.role }; }); - const memberSpawn = async (raw) => { + const memberSpawn = async (raw, ctx) => { const p = asParams(raw, "member.spawn"); assertTeamTarget(p, "member.spawn", deps); const sessionId = requireSessionId(p, "member.spawn"); @@ -20857,6 +20857,8 @@ function buildTeamMethodTable(deps) { name: requireString(p, "name", "member.spawn", { allowEmpty: true }), description: requireString(p, "description", "member.spawn", { allowEmpty: true }), prompt: requireString(p, "prompt", "member.spawn", { allowEmpty: true }), + ...typeof p.requestId === "string" && p.requestId.length > 0 ? { requestId: p.requestId } : {}, + ...ctx?.signal !== void 0 ? { signal: ctx.signal, ownershipSignal: ctx.signal } : {}, ...context !== void 0 ? { context } : {} }); }; @@ -21089,6 +21091,10 @@ var TeamLifecycle = class { }).catch(() => void 0); return p; } + /** 代次撤销只取消当前等待,不进入需要所有权的 drain/turn 清理。 */ + revokeGeneration(reason) { + this.abort.abort(reason ?? new TeamError("TEAM_DISPOSED", "coordinator generation revoked")); + } /** dispose(reason):D9 抽象触发;幂等(重复调用等首次结果)。 */ dispose(reason) { this.disposeRun ??= this.runDispose(); @@ -21344,15 +21350,25 @@ var PROVISIONING_RECHECK_MS = 1e4; var TeamRoster = class { constructor(deps) { this.deps = deps; - this.recoveryDone = this.reconcileProvisioning().then( - () => void 0, - () => void 0 - ); } statusListeners = /* @__PURE__ */ new Set(); /** 〔D33〕defer 复核定时器(成员 id → timer;一次性、unref)。 */ recheckTimers = /* @__PURE__ */ new Map(); + recoveryStopped = /* @__PURE__ */ new Set(); recoveryDone; + /** 仅由宿主在完整意图/轮次恢复后启动;构造对象不得提前判 provisioning 失败。 */ + startRecovery() { + this.recoveryDone ??= this.reconcileProvisioning().then( + () => void 0, + () => void 0 + ); + return this.recoveryDone; + } + cancelPendingRecovery() { + for (const timer of this.recheckTimers.values()) clearTimeout(timer); + this.recheckTimers.clear(); + this.recoveryStopped.clear(); + } /** 成员状态变化边(Activity 唤醒源之二;settle/interrupt 后触发)。 */ onMemberStatus(listener) { this.statusListeners.add(listener); @@ -21398,6 +21414,16 @@ var TeamRoster = class { const context = args.context ?? "fresh"; const providerName = requiredText("provider", context === "fork" ? providers.fork : providers.fresh, 200); const childId = (this.deps.newId ?? defaultNewId)(); + const requestId = args.requestId ?? defaultNewId(); + this.deps.provider.prepareContinuable?.({ + teamId: this.deps.teamId, + memberId: childId, + name, + description, + firstPrompt: args.prompt, + context, + requestId + }); await this.deps.store.transact(async () => { const fresh = this.loadState(); if (fresh.members.some((m) => m.name === name)) { @@ -21418,6 +21444,8 @@ var TeamRoster = class { }); const run = (async () => { const signal = combineSignals(args.signal, this.deps.lifecycle.runtimeSignal()); + const ownershipSignal = args.ownershipSignal; + const runSignal = ownershipSignal === void 0 ? signal : AbortSignal.any([signal, ownershipSignal]); try { return await this.deps.provider.startContinuable({ teamId: this.deps.teamId, @@ -21427,45 +21455,27 @@ var TeamRoster = class { firstPrompt: args.prompt, // 对齐轮:0.2.1 初始任务不含身份前缀 context, - signal + requestId, + signal: runSignal }); } catch (err) { + if (ownershipSignal?.aborted) throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF0C\u521B\u5EFA\u7ED3\u679C\u5F85\u786E\u8BA4"); throw this.mapAbortToDisposed(err); } })(); + let started; try { - const started = await run; - if (started.memberId !== childId) { - throw new Error(`provider returned memberId ${started.memberId} != provisioned ${childId}`); - } - if (!started.accepted) { - throw new TeamError( - "TEAM_PROVISIONING_CONFLICT", - `teammate "${childId}" initial prompt was not durably accepted` - ); - } - const settled = await this.settleProvisioning(childId, "active"); - if (settled === "failed") { - const conflict = new TeamError( - "TEAM_PROVISIONING_CONFLICT", - `teammate "${name}" was reconciled as failed while creation was in progress` - ); - try { - await this.deps.provider.interrupt({ memberId: childId }); - } catch (cleanupError) { - throw new AggregateError([conflict, cleanupError], "provisioning conflict cleanup failed"); - } - throw conflict; - } - this.notifyStatus(); - return { member: this.rowOf(childId) }; + started = await run; } catch (originalError) { + if (originalError instanceof ProvisioningPending) { + return { member: this.rowOf(childId), creation: "pending", message: originalError.message }; + } let becameActiveConflict; let recordError; let recordErrorSet = false; try { - const settled = await this.settleProvisioning(childId, "failed", errorMessage(originalError)); - if (settled === "active") { + const settled2 = await this.settleProvisioning(childId, "failed", errorMessage(originalError)); + if (settled2 === "active") { becameActiveConflict = new TeamError( "TEAM_PROVISIONING_CONFLICT", `teammate "${name}" became active while its creator reported failure` @@ -21496,6 +21506,34 @@ var TeamRoster = class { this.notifyStatus(); throw originalError; } + if (started.memberId !== childId) { + throw new Error(`provider returned memberId ${started.memberId} != provisioned ${childId}`); + } + if (started.creation === "pending") { + return { member: this.rowOf(childId), creation: "pending", message: "\u7ED3\u679C\u5F85\u786E\u8BA4" }; + } + if (!started.accepted) { + const rejection = new TeamError("TEAM_PROVISIONING_CONFLICT", `teammate "${childId}" initial prompt was not durably accepted`); + await this.settleProvisioning(childId, "failed", rejection.message); + await this.deps.provider.interrupt({ memberId: childId }); + this.notifyStatus(); + throw rejection; + } + const settled = await this.settleProvisioning(childId, "active"); + if (settled === "failed") { + const conflict = new TeamError( + "TEAM_PROVISIONING_CONFLICT", + `teammate "${name}" was reconciled as failed while creation was in progress` + ); + try { + await this.deps.provider.interrupt({ memberId: childId }); + } catch (cleanupError) { + throw new AggregateError([conflict, cleanupError], "provisioning conflict cleanup failed"); + } + throw conflict; + } + this.notifyStatus(); + return { member: this.rowOf(childId) }; } /** settleProvisioning(幂等):已非 provisioning → 返回现有相位不追加;成员消失 → C1 冲突。 */ settleProvisioning(memberId, phase, error2) { @@ -21541,14 +21579,17 @@ var TeamRoster = class { for (const member of pending) { try { let failure; + let missingRecord = false; let active = false; let recoveryThrew = false; try { const record2 = this.deps.recon.readProvisioningRecord(member.id); if (record2 === void 0) { - failure = "provisioning did not leave a resumable child Session"; + missingRecord = true; } else if (record2.rootSessionId === this.deps.teamId && record2.descriptor !== void 0 && record2.descriptor.mode === "continuable" && record2.descriptor.provider === member.provider && record2.initialUserMessageAccepted) { active = true; + } else if (record2.rootSessionId === this.deps.teamId && record2.descriptor !== void 0 && record2.descriptor.mode === "continuable" && record2.descriptor.provider === member.provider && !record2.initialUserMessageAccepted) { + missingRecord = true; } else { failure = "persisted child Session does not match the provisioned continuation"; } @@ -21556,12 +21597,48 @@ var TeamRoster = class { recoveryThrew = true; failure = `child Session recovery failed: ${errorMessage(err)}`; } - const ageMs = ages?.get(member.id); - if (!active && !recoveryThrew && ageMs !== void 0 && ageMs < PROVISIONING_GRACE_MS) { - deferred.push(member.id); - this.scheduleProvisioningRecheck(member.id); + if (!active && !recoveryThrew && !missingRecord && failure !== void 0) { + await this.settleProvisioning(member.id, "failed", failure); + settled.push(member.id); + this.notifyStatus(); continue; } + if (!active) { + if (this.deps.provider.noteProvisioningRecovery?.(member.id) === true) { + this.recoveryStopped.add(member.id); + deferred.push(member.id); + this.notifyStatus(); + continue; + } + if (this.deps.provider.resumeContinuable !== void 0) { + try { + const resumed = await this.deps.provider.resumeContinuable( + member.id, + this.deps.lifecycle.runtimeSignal() + ); + if (resumed.creation === "pending" || !resumed.accepted) { + deferred.push(member.id); + this.scheduleProvisioningRecheck(member.id); + continue; + } + active = true; + } catch (err) { + if (err instanceof ProvisioningPending) { + deferred.push(member.id); + this.scheduleProvisioningRecheck(member.id); + continue; + } + throw err; + } + } else { + const ageMs = ages?.get(member.id); + if (!recoveryThrew && ageMs !== void 0 && ageMs < PROVISIONING_GRACE_MS) { + deferred.push(member.id); + this.scheduleProvisioningRecheck(member.id); + continue; + } + } + } await this.settleProvisioning(member.id, active ? "active" : "failed", failure); settled.push(member.id); this.notifyStatus(); @@ -21613,6 +21690,12 @@ var TeamRoster = class { timer.unref?.(); this.recheckTimers.set(memberId, timer); } + hasPendingAutomaticProgress(callerId) { + const { state } = this.requireMember(callerId); + return state.members.some( + (member) => member.phase === "active" && this.deps.inspector.isAlive(member.id) || member.phase === "provisioning" && !this.recoveryStopped.has(member.id) + ); + } // ---------------------------------------------------------------- listMembers(§5.5) listMembers(callerId) { this.requireMember(callerId); @@ -21695,6 +21778,12 @@ var TeamRoster = class { function memberSnapshotOf(id, name, description, provider, context, phase, error2) { return { id, name, description, provider, context, phase, ...error2 !== void 0 ? { error: error2 } : {} }; } +var ProvisioningPending = class extends Error { + constructor(message = "\u7ED3\u679C\u5F85\u786E\u8BA4") { + super(message); + this.name = "ProvisioningPending"; + } +}; function defaultNewId() { return globalThis.crypto.randomUUID(); } @@ -22218,6 +22307,11 @@ var TeamRuntime = class { unsubscribeCommit; unsubscribeStatus; constructor(deps) { + const generationAbort = new AbortController(); + deps.signal?.addEventListener("abort", () => { + this.lifecycle.revokeGeneration(deps.signal?.reason); + this.roster.cancelPendingRecovery(); + }, { once: true }); this.lifecycle = new TeamLifecycle({ teamId: deps.teamId, store: deps.store, @@ -22263,7 +22357,7 @@ var TeamRuntime = class { } /** 冷启动恢复对账:roster 对账完成 + 全量邮箱续投。 */ async recoverAll() { - await this.roster.recoveryDone; + await this.roster.startRecovery(); await this.mailbox.recoverFor("all"); } /** D9 抽象处置入口。 */ @@ -22273,6 +22367,8 @@ var TeamRuntime = class { close() { this.unsubscribeCommit(); this.unsubscribeStatus(); + this.roster.cancelPendingRecovery(); + this.activity.closeAll(); } }; @@ -22286,7 +22382,23 @@ var MockProvider = class { drainedTeamIds = []; drainCalls = 0; startCalls = 0; + prepared = []; deliverCalls = 0; + interruptCalls = 0; + /** 默认无自动恢复能力(保留纯域 mock 旧语义);专项测试可注入持久预算行为。 */ + noteProvisioningRecovery; + resumeContinuable; + generationAbort = new AbortController(); + activateGeneration() { + this.generationAbort = new AbortController(); + return this.generationAbort.signal; + } + get generationSignal() { + return this.generationAbort.signal; + } + detach() { + this.generationAbort.abort(new Error("coordinator generation revoked")); + } program = {}; deliverScript = []; programWith(program) { @@ -22294,6 +22406,14 @@ var MockProvider = class { this.deliverScript = program.deliverResults ? [...program.deliverResults] : []; return this; } + prepareContinuable(args) { + this.prepared.push({ name: args.name, prompt: args.firstPrompt, requestId: args.requestId, context: args.context }); + } + requestStatus(requestId) { + const intent = this.prepared.find((entry) => entry.requestId === requestId); + const member = intent === void 0 ? void 0 : [...this.teamChildren.values()].find((child) => child.name === intent.name); + return intent === void 0 ? void 0 : { memberId: member?.memberId ?? `mock-${intent.name}`, accepted: member?.received.has("") ?? false }; + } async startContinuable(args) { this.startCalls += 1; const outcome = this.program.startOutcome ?? { kind: "accept" }; @@ -22308,6 +22428,7 @@ var MockProvider = class { }); } if (outcome.kind === "throw") throw outcome.error; + if (outcome.kind === "pending") return { memberId: args.memberId, accepted: false, creation: "pending" }; const child = { memberId: args.memberId, name: args.name, @@ -22379,6 +22500,7 @@ var MockProvider = class { } async interrupt(args) { if (this.program.interruptError !== void 0) throw this.program.interruptError; + this.interruptCalls += 1; const child = this.teamChildren.get(args.memberId); if (child === void 0 || !child.alive) return { previousStatus: "inactive" }; const previousStatus = child.status; @@ -22507,6 +22629,7 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { const lock = new CoordinatorLock(paths.lockFile, paths.auditFile, { // 失锁 = 立即降级;不能继续以 coordinator 身份写 journal/占用 socket。 onLost: () => { + if (providerHasGeneration(host.provider)) host.provider.detach?.(); void host.demoteToProxy("coordinator lock lost"); } }); @@ -22537,6 +22660,10 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { get coordinatorBootId() { return this.lock.info?.bootId ?? bootId(); } + /** 外层断连后只读原请求登记,不通过此入口执行写操作。 */ + get providerForRead() { + return this.provider; + } /** 代理模式下的方法表(§2 一致性断言用;协调者模式为 null)。 */ get methodTable() { return this.table; @@ -22639,9 +22766,9 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { } catch (err) { errors.push(err); } - if (providerHasBoundary(this.provider)) { + if (providerHasGeneration(this.provider)) { try { - this.provider.detach(); + this.provider.detach?.(); } catch (err) { errors.push(err); } @@ -22654,8 +22781,9 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { * 与 close() 的区别:不置 closed,仍可再次晋升。 */ async demoteToProxy(reason) { - if (this.closed || this.mode !== "coordinator") return; + if (this.closed) return; this.mode = "proxy"; + if (providerHasGeneration(this.provider)) this.provider.detach?.(); this.lock.stopHeartbeat(); this.stopDeliverySweep(); this.opts.warn?.(`agent-team coordinator demoted for team "${this.teamId}": ${reason}`); @@ -22672,17 +22800,13 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { const runtime = this.runtime; this.runtime = null; if (runtime !== null) { - try { - await runtime.dispose(); - } catch { - } runtime.close(); } const store = this.store; this.store = null; if (store !== null) { try { - await store.close(); + await store.close({ checkpoint: false }); } catch { } } @@ -22713,6 +22837,7 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { async serve() { if (this.closed) throw new Error("host is closed"); const paths = this.paths(); + const generationSignal = providerHasGeneration(this.provider) ? this.provider.activateGeneration() : void 0; this.lock.startHeartbeat(); let store; try { @@ -22758,7 +22883,8 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { return false; } } : {}, - warn: this.opts.warn + warn: this.opts.warn, + ...generationSignal !== void 0 ? { signal: generationSignal } : {} }); if (providerHasBoundary(this.provider)) { this.provider.bind({ @@ -22789,6 +22915,7 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { ); } else { await runtime.recoverAll(); + if (providerHasBoundary(this.provider)) this.provider.startBackground?.(); } const socket = resolveSocketPath(paths.teamDir); const token = newRpcToken(); @@ -22887,6 +23014,9 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { function providerIsPresentation(provider) { return typeof provider.statusOf === "function" && typeof provider.modelOf === "function"; } +function providerHasGeneration(provider) { + return typeof provider.activateGeneration === "function"; +} function providerHasBoundary(provider) { return typeof provider.bind === "function" && typeof provider.adoptOrphans === "function"; } @@ -23063,16 +23193,33 @@ var TeamToolBackend = class { * 0.4.0:model/thoughtLevel 参数注销——成员模型唯一路线 = provider 每轮跟随 Lead 最新 * 已确认选择;Lead 模型不可继承(官方套餐/目录外/解析不出)时 provider 抛错 → 本调用报错。 */ async spawnTeammate(identity, args) { - return this.withHost( - identity.teamId, - async (host) => await host.dispatch("member.spawn", { - session_id: identity.agentId, - name: args.name, - description: args.description, - prompt: args.prompt, - ...args.context !== void 0 ? { context: args.context } : {} - }) - ); + const requestId = crypto.randomUUID(); + try { + return await this.withHost( + identity.teamId, + async (host) => await host.dispatch("member.spawn", { + session_id: identity.agentId, + name: args.name, + description: args.description, + prompt: args.prompt, + requestId, + ...args.context !== void 0 ? { context: args.context } : {} + }) + ); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + if (!/rpc connection closed|rpc (?:method|call) member\.spawn timed out|coordinator is unavailable/.test(message)) throw err; + const host = await this.backendFor(identity.teamId); + const provider = host.providerForRead; + const registered = provider?.requestStatus?.(requestId); + if (registered === void 0) { + throw new Error("\u6210\u5458\u521B\u5EFA\u8BF7\u6C42\u7ED3\u679C\u672A\u786E\u8BA4\uFF0C\u65E0\u6CD5\u5173\u8054\u539F\u767B\u8BB0\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u91CD\u653E"); + } + const rows = await this.memberRows(host, identity); + const member = rows.find((row) => row.target === args.name); + if (member === void 0) throw new Error("\u539F\u521B\u5EFA\u8BF7\u6C42\u5DF2\u767B\u8BB0\uFF0C\u4F46\u6210\u5458\u72B6\u6001\u6682\u4E0D\u53EF\u8BFB"); + return member.status === "provisioning" ? { member, creation: "pending", message: "\u7ED3\u679C\u5F85\u786E\u8BA4" } : { member }; + } } // 0.4.0 注销 setMemberModel / resolveModelArgs / leadProviderId / catalog / wireModelSelection / // validateThoughtLevel(成员模型没有独立配置通道;stage-8 原文见 traceability §18 与 git 历史)。 @@ -23146,6 +23293,10 @@ var TeamToolBackend = class { let wait; if (runtime !== null) { const rows = runtime.roster.listMembers(identity.agentId).members; + if (!runtime.roster.hasPendingAutomaticProgress(identity.agentId)) { + const stopped = rows.find((row) => row.status === "provisioning"); + return stopped !== void 0 ? { ...noProgressResult(), content: [{ type: "text", text: `\u6210\u5458 ${stopped.target} \u5DF2\u505C\u6B62\u81EA\u52A8\u786E\u8BA4\uFF0C\u9700\u8981 Lead \u63A5\u7BA1\uFF1B\u65E7 turn \u4ECD\u53EF\u80FD\u6267\u884C\uFF0C\u4E0D\u5F97\u91CD\u590D\u542F\u52A8\u3002` }] } : noProgressResult(); + } const selfTarget = identity.role === "lead" ? "lead" : identity.name; const hasActivePeer = rows.some( (row) => row.target !== selfTarget && (row.status === "running" || row.status === "provisioning") @@ -23279,7 +23430,7 @@ var TEAM_TOOL_DEFINITIONS = [ { // 02 §9.3(〔issue #9 D28〕去档位措辞;〔issue #5 / D29〕补不可继承失败口径) name: "spawn_teammate", - description: "Create one named, durable teammate. Only the Team Lead may call this tool. Create teammates when the goal clearly benefits from delegation \u2014 multiple roles in parallel, disjoint write scopes, or long tasks needing their own context \u2014 within the member limit. If the Lead's model cannot be inherited (official plan model), the call fails \u2014 handle the work directly instead. The teammate automatically follows the Lead's latest confirmed model and reasoning level on every turn; there is no per-member model option.", + description: "Create one named, durable teammate. Only the Team Lead may call this tool. Create teammates when the goal clearly benefits from delegation \u2014 multiple roles in parallel, disjoint write scopes, or long tasks needing their own context \u2014 within the member limit. A creation=pending response means the request is registered but its result is not confirmed; the member remains provisioning and is not ready for work. Observe that same member with list_agents/wait_agent instead of spawning another. If the Lead's model cannot be inherited (official plan model), the call fails \u2014 handle the work directly instead. The teammate automatically follows the Lead's latest confirmed model and reasoning level on every turn; there is no per-member model option.", inputSchema: { type: "object", properties: { @@ -24491,16 +24642,36 @@ var AppServerClient = class _AppServerClient { } return false; } - rpc(method, params, timeoutMs = 3e4) { + rpc(method, params, timeoutMs = 3e4, opts = {}) { if (this.#closed) return Promise.reject(new Error("app-server client is closed")); + if (opts.signal?.aborted) return Promise.reject(opts.signal.reason ?? new Error("aborted")); const id = this.#nextId++; return new Promise((resolve, reject) => { + const onAbort = () => { + this.#pending.delete(id); + clearTimeout(timer); + reject(opts.signal.reason ?? new Error("aborted")); + }; + opts.signal?.addEventListener("abort", onAbort, { once: true }); const timer = setTimeout(() => { this.#pending.delete(id); - reject(new Error(`app-server rpc timeout: ${method}`)); + opts.signal?.removeEventListener("abort", onAbort); + const error2 = new Error(`app-server rpc timeout: ${method}`); + error2.outcome = "unknown"; + reject(error2); }, timeoutMs); timer.unref?.(); - this.#pending.set(id, { resolve, reject, timer }); + this.#pending.set(id, { + resolve: (result) => { + opts.signal?.removeEventListener("abort", onAbort); + resolve(result); + }, + reject: (error2) => { + opts.signal?.removeEventListener("abort", onAbort); + reject(error2); + }, + timer + }); this.#write({ id, method, params }); }); } @@ -24718,29 +24889,91 @@ var AppServerSessionBreeder = class { const startedAt = this.now(); const workspacePath = this.resolveWorkspace(input.teamId, input.workspacePath); const client = this.#spawnClient(workspacePath); - let anchorSessionId = null; + const anchorCommandId = input.anchorCommandId ?? `team-anchor-${startedAt}-${Math.random().toString(36).slice(2, 8)}`; + const childCommandId = input.childCommandId ?? `team-child-${this.now()}-${Math.random().toString(36).slice(2, 8)}`; + const commandTimeoutMs = input.timeoutMs ?? 3e4; + const queryTimeoutMs = Math.min(input.timeoutMs ?? 5e3, 5e3); + let anchorSessionId = input.anchorSessionId ?? null; let childSessionId = null; + let anchorEvidence = false; try { - const ready = await client.waitReady(input.timeoutMs ?? this.readyTimeoutMs); + const readyTimeoutMs = this.readyTimeoutMs; + const ready = await client.waitReady(readyTimeoutMs); if (!ready) { throw new BreedError( "startup-timeout", - `app-server did not become ready within ${input.timeoutMs ?? this.readyTimeoutMs}ms` + `app-server did not become ready within ${readyTimeoutMs}ms` ); } - const anchorAck = await client.rpc("v4/command", { - commandId: `team-anchor-${startedAt}-${Math.random().toString(36).slice(2, 8)}`, - clientId: "agent-team", - sessionId: null, - issuedAt: startedAt, - type: "createSession", - payload: { workspaceId: workspacePath, permissionScope: "session" } - }); - const createdAnchorId = anchorAck?.result?.sessionId; - if (typeof createdAnchorId !== "string" || createdAnchorId.length === 0) { - throw new BreedError("create-rejected", describeAck("createSession", anchorAck)); + if (input.signal?.aborted) { + throw new BreedError("outcome-unknown", abortDescription(input.signal, "session breeding aborted")); + } + let priorChild; + const hasRecoveryIdentity = input.anchorCommandId !== void 0 && input.childCommandId !== void 0 && input.anchorSessionId !== void 0 && input.recoveryEvidence === true; + if (hasRecoveryIdentity) { + const priorAnchor = await this.#queryCommand(client, { + commandId: anchorCommandId, + sessionId: null, + type: "createSession", + signal: input.signal, + timeoutMs: queryTimeoutMs + }); + if (priorAnchor !== "unknown") { + anchorSessionId = createdSessionId(priorAnchor, { + type: "createSession", + expectedSessionId: input.anchorSessionId, + failure: "create-rejected", + mismatchFailure: "outcome-unknown" + }); + anchorEvidence = true; + } else { + anchorSessionId = await this.#findPreallocatedAnchor(client, { + anchorSessionId: input.anchorSessionId, + workspacePath, + signal: input.signal, + timeoutMs: queryTimeoutMs + }); + anchorEvidence = anchorSessionId !== null; + } + if (anchorEvidence && anchorSessionId !== null) { + this.reportProgress(input, { anchorSessionId, stage: "anchor-recovered" }); + priorChild = await this.#queryCommand(client, { + commandId: childCommandId, + sessionId: anchorSessionId, + type: "createSelectionSideSession", + signal: input.signal, + timeoutMs: queryTimeoutMs + }); + } + } + if (!anchorEvidence) { + const anchorCall = await this.#runCommand(client, { + commandId: anchorCommandId, + sessionId: null, + issuedAt: startedAt, + type: "createSession", + payload: { + ...input.anchorSessionId !== void 0 ? { sessionId: input.anchorSessionId } : {}, + workspaceId: workspacePath, + permissionScope: "session" + }, + signal: input.signal, + commandTimeoutMs, + queryTimeoutMs + }); + const createdAnchorId = createdSessionId(anchorCall.ack, { + type: "createSession", + expectedSessionId: input.anchorSessionId, + failure: "create-rejected", + mismatchFailure: anchorCall.recovered ? "outcome-unknown" : "create-rejected" + }); + anchorSessionId = createdAnchorId; + anchorEvidence = true; + this.reportProgress(input, { anchorSessionId: createdAnchorId, stage: "anchor-created" }); + } + if (anchorSessionId === null) { + throw new BreedError("outcome-unknown", "anchor has no confirmed session id; not creating a replacement"); } - anchorSessionId = createdAnchorId; const tombstone = tombstoneAnchor({ taskId: anchorSessionId, workspacePath, @@ -24753,23 +24986,47 @@ var AppServerSessionBreeder = class { `anchor "${anchorSessionId}" task row is not owned by agent-team; refusing to continue` ); } - const sideAck = await client.rpc("v4/command", { - commandId: `team-child-${this.now()}-${Math.random().toString(36).slice(2, 8)}`, - clientId: "agent-team", + const commandArgs = { + commandId: childCommandId, sessionId: anchorSessionId, issuedAt: this.now(), type: "createSelectionSideSession", - payload: {} - }); - const createdChildId = sideAck?.result?.sessionId; - if (typeof createdChildId !== "string" || createdChildId.length === 0) { - throw new BreedError("command-rejected", describeAck("createSelectionSideSession", sideAck)); + payload: {}, + signal: input.signal, + commandTimeoutMs, + queryTimeoutMs + }; + let sideCall; + let recoveredChildNeedsResume = false; + if (priorChild !== void 0 && priorChild !== "unknown") { + recoveredChildNeedsResume = input.modelSelection !== void 0; + sideCall = { ack: priorChild, recovered: true }; + } else { + sideCall = await this.#runCommand(client, commandArgs); } + const createdChildId = createdSessionId(sideCall.ack, { + type: "createSelectionSideSession", + failure: "command-rejected", + mismatchFailure: sideCall.recovered ? "outcome-unknown" : "command-rejected" + }); childSessionId = createdChildId; + this.reportProgress(input, { + anchorSessionId, + childSessionId: createdChildId, + stage: "child-created" + }); + if (recoveredChildNeedsResume) { + await client.rpc( + "session/resume", + { sessionId: createdChildId }, + queryTimeoutMs, + { signal: input.signal } + ); + } let appliedModel; if (input.modelSelection !== void 0) { try { - await this.#setModel(client, childSessionId, input.modelSelection); + await this.#setModel(client, childSessionId, input.modelSelection, input.signal); appliedModel = input.modelSelection; this.log({ event: "model-set", @@ -24779,6 +25036,11 @@ var AppServerSessionBreeder = class { modelId: input.modelSelection.modelId, reasoningLevel: input.modelSelection.reasoningLevel ?? null }); + this.reportProgress(input, { + anchorSessionId, + childSessionId, + stage: "model-applied" + }); } catch (err) { const message = err instanceof Error ? err.message : String(err); this.log({ @@ -24789,6 +25051,9 @@ var AppServerSessionBreeder = class { modelId: input.modelSelection.modelId, message }); + if (input.signal?.aborted) { + throw new BreedError("outcome-unknown", abortDescription(input.signal, message)); + } throw new BreedError( "model-rejected", `member could not use the inherited model ${input.modelSelection.providerId}/${input.modelSelection.modelId}: ${message}` @@ -24816,6 +25081,7 @@ var AppServerSessionBreeder = class { }; } catch (err) { const stderr = client.getStderr().slice(-800); + const mayDispose = anchorEvidence && !(err instanceof BreedError && err.code === "outcome-unknown") && !input.signal?.aborted; if (err instanceof BreedError) { this.log({ event: "session-breed-failed", @@ -24826,13 +25092,13 @@ var AppServerSessionBreeder = class { anchorSessionId, childSessionId }); - if (anchorSessionId !== null) { + if (mayDispose && anchorSessionId !== null) { this.disposeBredSessions({ anchorSessionId, workspacePath }); } throw err; } const message = err instanceof Error ? err.message : String(err); - const code = /timeout/i.test(message) ? "startup-timeout" : /exited|ENOENT|EACCES|spawn/i.test(message) ? "spawn-failed" : "unsupported"; + const code = input.signal?.aborted ? "outcome-unknown" : /timeout/i.test(message) ? "startup-timeout" : /exited|ENOENT|EACCES|spawn/i.test(message) ? "spawn-failed" : "unsupported"; this.log({ event: "session-breed-failed", teamId: input.teamId, @@ -24842,7 +25108,7 @@ var AppServerSessionBreeder = class { anchorSessionId, childSessionId }); - if (anchorSessionId !== null) { + if (mayDispose && anchorSessionId !== null) { this.disposeBredSessions({ anchorSessionId, workspacePath }); } throw new BreedError(code, `${message}${stderr.length > 0 ? ` | stderr: ${stderr}` : ""}`); @@ -24891,7 +25157,7 @@ var AppServerSessionBreeder = class { * result 是巨型消息快照(PoC 事实 1):只记目标三元组与错误文本,绝不整包落日志。 */ /** setModel 请求体(createChild / applyModelSelection 共用;persistAsWorkspaceLastUsed 恒 false)。 */ - async #setModel(client, sessionId, selection) { + async #setModel(client, sessionId, selection, signal) { await client.rpc( "session/setModel", { @@ -24903,9 +25169,109 @@ var AppServerSessionBreeder = class { }, persistAsWorkspaceLastUsed: false }, - 2e4 + 2e4, + { signal } + ); + } + reportProgress(input, progress) { + if (input.onProgress?.(progress) === false) { + throw new BreedError("outcome-unknown", "coordinator generation revoked; host evidence is retained for recovery"); + } + } + async #runCommand(client, input) { + try { + const ack = await client.rpc("v4/command", commandEnvelope(input), input.commandTimeoutMs, { + signal: input.signal + }); + return { ack, recovered: false }; + } catch (err) { + if (input.signal?.aborted) { + throw new BreedError("outcome-unknown", abortDescription(input.signal, errorDescription(err))); + } + const message = errorDescription(err); + if (/invalid params|method not found|invalid request/i.test(message)) throw err; + const ack = await this.#queryCommand(client, { + commandId: input.commandId, + sessionId: input.sessionId, + type: input.type, + signal: input.signal, + timeoutMs: input.queryTimeoutMs + }); + if (ack === "unknown") { + throw new BreedError("outcome-unknown", `${input.type} outcome is unknown; original command was not replayed`); + } + return { ack, recovered: true }; + } + } + async #queryCommand(client, input) { + let queried; + try { + queried = await client.rpc( + "v4/commands/query", + { commands: [{ sessionId: input.sessionId, commandId: input.commandId }] }, + input.timeoutMs, + { signal: input.signal } + ); + } catch (err) { + const message = errorDescription(err); + throw new BreedError( + "outcome-unknown", + `${input.type} outcome is unknown; command query could not establish a final result: ${message}` + ); + } + const matches = (queried?.results ?? []).filter( + (entry) => entry?.key?.commandId === input.commandId && entry.key.sessionId === input.sessionId + ); + const result = matches.length === 1 ? matches[0].result : "unknown"; + if (result === "unknown") return "unknown"; + if (typeof result !== "object" || result === null) { + throw new BreedError( + "outcome-unknown", + `${input.type} outcome is unknown; malformed command result for "${input.commandId}"` + ); + } + if (result.status === "accepted" || result.status === "duplicate") { + return result; + } + if (isExplicitRejection(result)) { + throw new BreedError( + input.type === "createSession" ? "create-rejected" : "command-rejected", + describeAck(input.type, result) + ); + } + throw new BreedError( + "outcome-unknown", + `${input.type} outcome is unknown; command "${input.commandId}" has non-final status "${result.status ?? "missing"}"` ); } + /** 仅对预分配 anchor 使用:必须同时证明 id、workspace 和非子会话类型,绝不认领近似对象。 */ + async #findPreallocatedAnchor(client, input) { + let listed; + try { + listed = await client.rpc( + "session/list", + { sessionIds: [input.anchorSessionId] }, + input.timeoutMs, + { signal: input.signal } + ); + } catch (err) { + throw new BreedError( + "outcome-unknown", + `createSession outcome is unknown; anchor lookup failed: ${errorDescription(err)}` + ); + } + const matches = (listed?.sessions ?? []).filter((session2) => session2?.sessionId === input.anchorSessionId); + if (matches.length === 0) return null; + const session = matches[0]; + const sessionWorkspace = session.workspace?.workspacePath; + if (matches.length !== 1 || typeof sessionWorkspace !== "string" || path15.resolve(sessionWorkspace) !== path15.resolve(input.workspacePath) || session.sessionKind !== "interactive") { + throw new BreedError( + "outcome-unknown", + `createSession outcome is unknown; preallocated anchor "${input.anchorSessionId}" failed workspace/type verification` + ); + } + return input.anchorSessionId; + } #spawnClient(workspacePath) { try { return AppServerClient.spawn({ @@ -24922,6 +25288,40 @@ var AppServerSessionBreeder = class { } } }; +function commandEnvelope(input) { + return { + commandId: input.commandId, + clientId: "agent-team", + sessionId: input.sessionId, + issuedAt: input.issuedAt, + type: input.type, + payload: input.payload + }; +} +function createdSessionId(ack, input) { + if (ack.status === "accepted" || ack.status === "duplicate") { + const id = ack.result?.sessionId; + if (ack.result?.type === input.type && typeof id === "string" && id.length > 0 && (input.expectedSessionId === void 0 || id === input.expectedSessionId)) { + return id; + } + throw new BreedError( + input.mismatchFailure, + `${input.type} returned mismatched result: ${describeAck(input.type, ack)}` + ); + } + if (isExplicitRejection(ack)) throw new BreedError(input.failure, describeAck(input.type, ack)); + throw new BreedError("outcome-unknown", describeAck(input.type, ack)); +} +function isExplicitRejection(ack) { + return ack.status === "rejected" || ack.status === "failed" || ack.status === void 0; +} +function abortDescription(signal, fallback) { + const reason = signal.reason; + return reason instanceof Error ? reason.message : typeof reason === "string" ? reason : fallback; +} +function errorDescription(err) { + return err instanceof Error ? err.message : String(err); +} function describeAck(type, ack) { const status = ack?.reasonCode ?? ack?.status ?? "no session id"; return `${type} rejected: ${status}${ack?.message !== void 0 ? ` (${ack.message})` : ""}`; @@ -25224,6 +25624,9 @@ var ResumePerTurnProvider = class { lastLaunchFailureAt = 0; pendingLookup = null; closed = false; + generation = 0; + generationAbort = new AbortController(); + backgroundDeferred = false; /** 失败记录变化监听(0.4.1:host 接线 → roster.notifyStatusChanged 刷新成员展示)。 */ modelFailureListeners = /* @__PURE__ */ new Set(); // ---------------------------------------------------------------- 边界与接线 @@ -25255,6 +25658,12 @@ var ResumePerTurnProvider = class { if (this.sessionIsolation !== "child") return; this.resolveLeadInheritance(); } + /** 仅在当前代次内写 origin;旧进度回调/后台恢复只读,不覆盖新代次。 */ + writeCurrentOrigin(paths, origin) { + if (this.closed || this.generationAbort.signal.aborted) return false; + writeOrigin(paths, origin); + return true; + } /** 协调者启动纳管:孤儿轮次定案/再收养 + drain 标记处置 + lead 回执折叠(T4.4/触发点②)。 */ adoptOrphans() { const finalized = []; @@ -25264,6 +25673,15 @@ var ResumePerTurnProvider = class { this.handleDrainMarker(paths); for (const turn of listTurns(paths.runDir)) { if (turn.status !== "running" && turn.status !== "starting") continue; + if (turn.pid === null) { + const receipt = readSpawnReceipt(path17.join(paths.runDir, `${turn.turnId}.spawn.json`)); + if (receipt?.pid !== void 0) { + writeTurn(paths.runDir, { ...turn, pid: receipt.pid, pgid: receipt.pid, status: "running" }); + this.adoptedPids.add(receipt.pid); + adopted.push(turn.turnId); + } + continue; + } if (this.finalizeIfDead(memberId, turn)) { finalized.push(turn.turnId); } else if (turn.pid !== null) { @@ -25276,9 +25694,21 @@ var ResumePerTurnProvider = class { this.startWatcher(); return { finalized, adopted }; } - /** 协调者关闭:停 watcher(轮次进程不杀——独立进程组纪律)。 */ + /** 协调者每次获锁都启用新代次;旧 watcher/恢复回调不能借用下一次获锁的权限。 */ + activateGeneration() { + this.generation += 1; + this.generationAbort = new AbortController(); + this.closed = false; + this.backgroundDeferred = true; + return this.generationAbort.signal; + } + generationIsCurrent(generation) { + return generation === this.generation && !this.closed; + } + /** 协调者关闭:先撤销本代次,再停 watcher;轮次进程不杀。 */ detach() { this.closed = true; + this.generationAbort.abort(new Error("coordinator generation revoked")); if (this.watcherTimer !== null) { clearInterval(this.watcherTimer); this.watcherTimer = null; @@ -25295,20 +25725,23 @@ var ResumePerTurnProvider = class { } } startWatcher() { - if (this.watcherTimer !== null || this.closed) return; + if (this.watcherTimer !== null || this.closed || this.backgroundDeferred) return; + const generation = this.generation; const timer = setInterval(() => { - void this.watchTick().catch((err) => { + if (!this.generationIsCurrent(generation)) return; + void this.watchTick(generation).catch((err) => { this.log({ ts: iso(this.now()), kind: "watcher-error", error: errText2(err) }); }); }, this.watcherIntervalMs); timer.unref?.(); this.watcherTimer = timer; } - async watchTick() { - if (this.watcherBusy || this.closed) return; + async watchTick(generation = this.generation) { + if (this.watcherBusy || !this.generationIsCurrent(generation)) return; this.watcherBusy = true; try { for (const memberId of listMembers(this.teamDir)) { + if (!this.generationIsCurrent(generation)) return; const paths = memberPaths(this.teamDir, memberId); const turnId = readCurrentTurnId(paths); if (turnId === void 0) continue; @@ -25317,6 +25750,7 @@ var ResumePerTurnProvider = class { if (turn.status === "running" || turn.status === "starting") { if (turn.interruptRequestedAt !== void 0) { const dead = await killProcessGroup(turn.pgid, this.termGraceMs); + if (!this.generationIsCurrent(generation)) return; if (dead) { const landed = turn.sessionId !== null && this.reader.hasUserText(turn.sessionId, turn.promptText); writeTurn(paths.runDir, { @@ -25334,17 +25768,18 @@ var ResumePerTurnProvider = class { } continue; } - this.finalizeIfDead(memberId, turn); + if (this.generationIsCurrent(generation)) this.finalizeIfDead(memberId, turn); } } - this.foldLeadReceipts(false); + if (this.generationIsCurrent(generation)) this.foldLeadReceipts(false); } finally { this.watcherBusy = false; } } /** 轮次进程已死 → 定案(landed 实查)+ 边界事件;返回是否已定案。 */ finalizeIfDead(memberId, turn) { - if (turn.pid !== null && pidAlive(turn.pid)) { + if (turn.pid === null) return false; + if (pidAlive(turn.pid)) { this.adoptedPids.add(turn.pid); return false; } @@ -25395,12 +25830,127 @@ var ResumePerTurnProvider = class { this.emitBoundary({ memberId: this.opts.teamId, landedMessageIds: ids, carriedMessageIds: ids }); } // ---------------------------------------------------------------- TeammateProvider + prepareContinuable(args) { + const paths = memberPaths(this.teamDir, args.memberId); + const existing = readOrigin(paths); + if (existing !== void 0) { + if (existing.requestId === args.requestId) return; + throw new Error(`member ${args.memberId} already has a creation intent`); + } + const prompt = args.context === "fork" ? buildForkFirstPrompt(this.reader, this.opts.teamId, args.firstPrompt).prompt : args.firstPrompt; + const request = args.requestId; + const anchorSessionId = `sess_team_${request.replace(/[^A-Za-z0-9_-]/g, "")}`; + writeOrigin(paths, { + teamId: args.teamId, + memberId: args.memberId, + name: args.name, + provider: args.context === "fork" ? "fork" : "spawn", + mode: "continuable", + context: args.context, + createdAt: iso(this.now()), + cwd: this.cwd, + firstPromptText: prompt, + firstPromptSha256: sha256(prompt), + sessionId: null, + initialUserMessageAccepted: false, + sessionIsolation: this.sessionIsolation, + ...this.sessionIsolation === "child" ? { + anchorSessionId, + logicalParentSessionId: args.teamId, + sessionKind: "selection_side_chat", + hostAnchorConfirmed: false + } : { sessionKind: "interactive" }, + requestId: args.requestId, + ...this.sessionIsolation === "child" ? { anchorCommandId: `team-anchor-${request}`, childCommandId: `team-child-${request}` } : {}, + creationPending: true, + creationDiagnostic: "creation intent persisted; awaiting host confirmation", + confirmationAttempts: 0, + confirmationDeadlineAt: iso(this.now() + this.firstTurnTimeoutMs) + }); + } + async resumeContinuable(memberId, signal) { + const paths = memberPaths(this.teamDir, memberId); + const origin = readOrigin(paths); + if (origin === void 0 || origin.requestId === void 0) { + throw new ProvisioningPending("\u521B\u5EFA\u610F\u56FE\u7F3A\u5931\uFF0C\u65E0\u6CD5\u81EA\u52A8\u6062\u590D\uFF1B\u4E0D\u4F1A\u91CD\u65B0\u751F\u6210\u521B\u5EFA\u8BF7\u6C42"); + } + if (origin.confirmationStopped === true) { + throw new ProvisioningPending("\u521B\u5EFA\u7ED3\u679C\u5F85\u786E\u8BA4\uFF0C\u81EA\u52A8\u6062\u590D\u9884\u7B97\u5DF2\u8017\u5C3D\uFF1B\u8BF7\u7531 Lead \u63A5\u7BA1"); + } + return this.startContinuable({ + teamId: origin.teamId, + memberId, + name: origin.name, + description: "", + firstPrompt: origin.firstPromptText, + context: origin.context, + requestId: origin.requestId, + ...signal !== void 0 ? { signal } : {} + }); + } + noteProvisioningRecovery(memberId) { + const paths = memberPaths(this.teamDir, memberId); + let origin; + try { + origin = readOrigin(paths); + } catch { + return true; + } + if (origin === void 0 || origin.confirmationStopped === true) return true; + const attempts = (origin.confirmationAttempts ?? 0) + 1; + const stopped = attempts >= 3 || origin.confirmationDeadlineAt !== void 0 && Date.parse(origin.confirmationDeadlineAt) <= this.now(); + this.writeCurrentOrigin(paths, { + ...origin, + confirmationAttempts: attempts, + ...stopped ? { confirmationStopped: true, creationDiagnostic: "\u7ED3\u679C\u5F85\u786E\u8BA4\uFF1B\u81EA\u52A8\u6062\u590D\u5DF2\u505C\u6B62\uFF0C\u8BF7\u7531 Lead \u63A5\u7BA1" } : {} + }); + return stopped; + } + startBackground() { + this.backgroundDeferred = false; + this.startWatcher(); + } async startContinuable(args) { if (args.teamId !== this.opts.teamId) { throw new Error(`provider serves team ${this.opts.teamId} but spawn targets ${args.teamId}`); } const paths = memberPaths(this.teamDir, args.memberId); - const prompt = args.context === "fork" ? buildForkFirstPrompt(this.reader, this.opts.teamId, args.firstPrompt).prompt : args.firstPrompt; + const persistedOrigin = readOrigin(paths); + if (persistedOrigin === void 0 || persistedOrigin.requestId !== args.requestId) { + throw new ProvisioningPending("\u521B\u5EFA\u610F\u56FE\u7F3A\u5931\u6216\u4E0D\u5339\u914D\uFF1B\u4E0D\u4F1A\u91CD\u65B0\u751F\u6210\u521B\u5EFA\u8BF7\u6C42"); + } + const persisted = persistedOrigin; + if (persisted.confirmationStopped === true) { + throw new ProvisioningPending("\u7ED3\u679C\u5F85\u786E\u8BA4\uFF0C\u81EA\u52A8\u6062\u590D\u9884\u7B97\u5DF2\u8017\u5C3D\uFF1B\u8BF7\u7531 Lead \u63A5\u7BA1"); + } + const prompt = persisted.firstPromptText; + const existingTurnId = readCurrentTurnId(paths); + const existingTurn = existingTurnId === void 0 ? listTurns(paths.runDir).findLast((turn2) => turn2.kind === "first") : readTurn(paths.runDir, existingTurnId); + if (existingTurn !== void 0 && existingTurn.memberId !== args.memberId) { + throw new ProvisioningPending("\u73B0\u6709 turn \u4E0E\u6210\u5458\u610F\u56FE\u4E0D\u5339\u914D\uFF1B\u505C\u6B62\u81EA\u52A8\u6062\u590D"); + } + if (existingTurn?.kind === "first") { + if (existingTurn.promptText !== prompt) { + throw new ProvisioningPending("\u73B0\u6709\u9996\u8F6E\u8F93\u5165\u4E0E origin \u4E0D\u4E00\u81F4\uFF1B\u505C\u6B62\u81EA\u52A8\u6062\u590D"); + } + if (existingTurn.status === "exited" || existingTurn.status === "failed" || existingTurn.status === "spawn-error" || existingTurn.status === "interrupted") { + throw new ProvisioningPending("\u5DF2\u6709\u9996\u8F6E\u7EC8\u6001\u8BB0\u5F55\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u91CD\u590D\u542F\u52A8"); + } + const persistedWithSession = persisted.sessionId === null && existingTurn.sessionId !== null ? { ...persisted, sessionId: existingTurn.sessionId } : persisted; + try { + const accepted = await this.awaitFirstAccept({ + paths, + origin: persistedWithSession, + turn: existingTurn, + spawnT0: Date.parse(existingTurn.startedAt), + ...args.signal !== void 0 ? { signal: args.signal } : {} + }); + return { memberId: args.memberId, accepted: accepted !== null }; + } catch (err) { + if (err instanceof ProvisioningPending) throw err; + throw new ProvisioningPending("\u5DF2\u6709\u9996\u8F6E\u542F\u52A8\u610F\u56FE\uFF0C\u7ED3\u679C\u5F85\u786E\u8BA4\uFF1B\u4E0D\u4F1A\u91CD\u590D\u542F\u52A8"); + } + } const inheritedSelection = this.sessionIsolation === "child" ? this.resolveLeadInheritance() : void 0; let bred = null; if (this.sessionIsolation === "child") { @@ -25408,10 +25958,30 @@ var ResumePerTurnProvider = class { bred = await this.breeder.createChild({ teamId: this.opts.teamId, workspacePath: this.cwd, - ...inheritedSelection !== void 0 ? { modelSelection: inheritedSelection } : {} + ...inheritedSelection !== void 0 ? { modelSelection: inheritedSelection } : {}, + ...persisted.anchorCommandId !== void 0 ? { anchorCommandId: persisted.anchorCommandId } : {}, + ...persisted.childCommandId !== void 0 ? { childCommandId: persisted.childCommandId } : {}, + ...persisted.anchorSessionId !== void 0 ? { anchorSessionId: persisted.anchorSessionId } : {}, + ...persisted.hostAnchorConfirmed === true || persisted.sessionId !== null ? { recoveryEvidence: true } : {}, + ...args.signal !== void 0 ? { signal: args.signal } : {}, + onProgress: (progress) => { + if (this.generationAbort.signal.aborted) return; + const latest = readOrigin(paths) ?? persisted; + if (latest.requestId !== args.requestId) return; + return this.writeCurrentOrigin(paths, { + ...latest, + ...progress.anchorSessionId !== void 0 ? { anchorSessionId: progress.anchorSessionId, hostAnchorConfirmed: true } : {}, + ...progress.childSessionId !== void 0 ? { sessionId: progress.childSessionId } : {}, + creationDiagnostic: progress.stage + }); + } }); } catch (err) { const message = err instanceof Error ? err.message : String(err); + if (err.code === "outcome-unknown") { + if (args.signal?.aborted && !this.generationAbort.signal.aborted) throw err; + throw new ProvisioningPending("\u5BBF\u4E3B\u521B\u5EFA\u7ED3\u679C\u5F85\u786E\u8BA4\uFF1B\u4E0D\u4F1A\u91CD\u65B0\u751F\u6210\u521B\u5EFA\u8BF7\u6C42"); + } if (inheritedSelection !== void 0 && /inherited model/.test(message)) { this.recordModelFailure( paths, @@ -25424,30 +25994,18 @@ var ResumePerTurnProvider = class { throw err; } } - const spawnCwd = bred?.workspacePath ?? this.cwd; + const spawnCwd = bred?.workspacePath ?? persisted.cwd; const origin = { - teamId: this.opts.teamId, - memberId: args.memberId, - name: args.name, - provider: args.context === "fork" ? "fork" : "spawn", - mode: "continuable", - context: args.context, - createdAt: iso(this.now()), + ...persisted, cwd: spawnCwd, - firstPromptText: prompt, - firstPromptSha256: sha256(prompt), - sessionId: bred?.childSessionId ?? null, - initialUserMessageAccepted: false, - // 只记实际生效者(createChild 失败即抛,走到这里 appliedModel 与继承选择一致或 legacy 无)。 + sessionId: bred?.childSessionId ?? persisted.sessionId, + initialUserMessageAccepted: persisted.initialUserMessageAccepted, ...bred?.appliedModel !== void 0 ? { modelSelection: bred.appliedModel, modelSource: "inherited" } : {}, - sessionIsolation: bred !== null ? "child" : "legacy", - ...bred !== null ? { - anchorSessionId: bred.anchorSessionId, - logicalParentSessionId: this.opts.teamId, - sessionKind: "selection_side_chat" - } : { sessionKind: "interactive" } + ...bred !== null ? { anchorSessionId: bred.anchorSessionId } : {} }; - writeOrigin(paths, origin); + if (!this.writeCurrentOrigin(paths, origin)) { + throw new ProvisioningPending("\u521B\u5EFA\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4FDD\u7559\u5BBF\u4E3B\u8BC1\u636E\u4F9B\u63A5\u4EFB\u8005\u786E\u8BA4\uFF0C\u4E0D\u542F\u52A8\u9996\u8F6E"); + } const spawnT0 = this.now(); const turn = await this.launchTurn({ paths, @@ -25460,7 +26018,8 @@ var ResumePerTurnProvider = class { resume: bred !== null, cwd: spawnCwd, // createChild 刚把继承选择应用进子会话(0.4.1 验收:首轮不重复应用同一选择)。 - modelJustApplied: bred?.appliedModel + modelJustApplied: bred?.appliedModel, + ...args.signal !== void 0 ? { signal: args.signal } : {} }); this.startWatcher(); try { @@ -25473,18 +26032,19 @@ var ResumePerTurnProvider = class { }); return { memberId: args.memberId, accepted: sessionId !== null }; } catch (err) { - if (args.signal?.aborted) throw err; + if (args.signal?.aborted && !this.generationAbort.signal.aborted) throw args.signal.reason ?? err; + if (err instanceof ProvisioningPending) throw err; this.log({ ts: iso(this.now()), kind: "first-probe-error", memberId: args.memberId, error: errText2(err) }); - return { memberId: args.memberId, accepted: false }; + throw new ProvisioningPending("\u9996\u8F6E\u6301\u4E45\u63A5\u6536\u7ED3\u679C\u5F85\u786E\u8BA4\uFF1B\u4E0D\u4F1A\u91CD\u590D\u542F\u52A8"); } } /** 首轮持久接收探针:session id 认领(hook 领地优先,db 目录+首条用户文本兜底)+ 落库确认。 */ async awaitFirstAccept(args) { const { paths, origin, turn, spawnT0 } = args; const deadline = spawnT0 + this.firstTurnTimeoutMs; - let sessionId = origin.sessionId; + let sessionId = origin.sessionId ?? this.claimedSessionId(origin.memberId); for (; ; ) { - if (args.signal?.aborted) throw args.signal.reason ?? new Error("aborted"); + if (args.signal?.aborted && !this.generationAbort.signal.aborted) throw args.signal.reason ?? new Error("aborted"); sessionId ??= this.claimedSessionId(origin.memberId); if (sessionId === null) { const exclude = this.claimedSessionsExcluding(origin.memberId); @@ -25497,14 +26057,23 @@ var ResumePerTurnProvider = class { if (found !== void 0) sessionId = found; } if (sessionId !== null) { - const landed = this.reader.hasUserText(sessionId, origin.firstPromptText); + let landed; + try { + landed = this.reader.hasUserText(sessionId, origin.firstPromptText); + } catch (err) { + throw new ProvisioningPending(`\u9996\u8F6E\u63A5\u6536\u6682\u4E0D\u53EF\u786E\u8BA4\uFF1A${errText2(err)}`); + } if (landed) { const nextOrigin = { ...readOrigin(paths) ?? origin, sessionId, - initialUserMessageAccepted: true + initialUserMessageAccepted: true, + creationPending: false, + creationDiagnostic: void 0 }; - writeOrigin(paths, nextOrigin); + if (!this.writeCurrentOrigin(paths, nextOrigin)) { + throw new ProvisioningPending("\u9996\u8F6E\u5DF2\u88AB\u5BBF\u4E3B\u786E\u8BA4\uFF0C\u4F46\u65E7\u4EE3\u6B21\u4E0D\u5F97\u8986\u76D6\u6062\u590D\u72B6\u6001"); + } const current = readTurn(paths.runDir, turn.turnId) ?? turn; writeTurn(paths.runDir, { ...current, sessionId, landed: true }); this.writeTeammateMapping(sessionId, nextOrigin); @@ -25522,7 +26091,10 @@ var ResumePerTurnProvider = class { } const turnNow = readTurn(paths.runDir, turn.turnId); const pid = turnNow?.pid ?? turn.pid; - if (pid === null || !pidAlive(pid)) { + if (pid === null) { + throw new ProvisioningPending("\u5DF2\u6709\u542F\u52A8\u610F\u56FE\u4F46\u5C1A\u65E0 PID/\u56DE\u6267\u786E\u8BA4\uFF1B\u4FDD\u6301\u5F85\u6062\u590D\uFF0C\u4E0D\u91CD\u590D\u542F\u52A8"); + } + if (!pidAlive(pid)) { this.log({ ts: iso(this.now()), kind: "first-not-accepted", @@ -25534,7 +26106,6 @@ var ResumePerTurnProvider = class { return null; } if (this.now() >= deadline) { - await killProcessGroup(turnNow?.pgid ?? turn.pgid, this.termGraceMs).catch(() => void 0); this.log({ ts: iso(this.now()), kind: "first-probe-timeout", @@ -25542,7 +26113,7 @@ var ResumePerTurnProvider = class { memberId: origin.memberId, turnId: turn.turnId }); - return null; + throw new ProvisioningPending("\u9996\u8F6E\u63A5\u6536\u7ED3\u679C\u5F85\u786E\u8BA4\uFF1B\u65E7 turn \u53EF\u80FD\u4ECD\u5728\u6267\u884C\uFF0C\u4E0D\u4F1A\u91CD\u590D\u542F\u52A8"); } await this.sleep(150); } @@ -25661,6 +26232,9 @@ var ResumePerTurnProvider = class { return { previousStatus }; } async drain(args) { + if (this.closed || this.generationAbort.signal.aborted) { + throw new Error("coordinator generation revoked; drain requires current ownership"); + } const memberIds = listMembers(this.teamDir); if (this.drainPolicy === "keep") { for (const memberId of memberIds) { @@ -25700,7 +26274,7 @@ var ResumePerTurnProvider = class { let sessionId = origin.sessionId; if (sessionId === null) { sessionId = this.resolveSessionId(origin); - if (sessionId !== null) { + if (sessionId !== null && !this.closed) { writeOrigin(paths, { ...origin, sessionId }); } } @@ -25816,6 +26390,9 @@ var ResumePerTurnProvider = class { const turnId = nextTurnId(args.paths.runDir); const stdoutFile = path17.join(args.paths.runDir, `${turnId}.out`); const turnCwd = args.cwd ?? this.cwd; + if (this.generationAbort.signal.aborted || args.signal?.aborted) { + throw new ProvisioningPending("\u521B\u5EFA\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4E0D\u4F1A\u542F\u52A8\u65B0 turn"); + } await this.syncMemberModel( args.paths, args.memberId, @@ -25856,6 +26433,9 @@ var ResumePerTurnProvider = class { }; writeTurn(args.paths.runDir, turn); setCurrentTurn(args.paths, turnId); + if (this.generationAbort.signal.aborted || args.signal?.aborted) { + throw new ProvisioningPending("\u542F\u52A8\u610F\u56FE\u5DF2\u4FDD\u5B58\u4F46\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4FDD\u6301\u5F85\u6062\u590D\uFF0C\u4E0D\u542F\u52A8"); + } const env = { ...process.env, TEAM_SPAWN_IDENTITY: JSON.stringify({ @@ -25866,6 +26446,7 @@ var ResumePerTurnProvider = class { }; if (this.opts.dbPath !== void 0) env.TEAM_DB_PATH = this.opts.dbPath; let spawned; + const receiptFile = path17.join(args.paths.runDir, `${turnId}.spawn.json`); try { spawned = await spawnDetached({ command: this.zcode.command, @@ -25873,13 +26454,20 @@ var ResumePerTurnProvider = class { // 真实 env 必须完整传给子进程(API key 等);spec 只短暂存在(helper 读后立即删除,0600)。 env, cwd: turnCwd, - stdoutFile + stdoutFile, + resultFile: receiptFile }); } catch (err) { - writeTurn(args.paths.runDir, { ...turn, status: "spawn-error", exitedAt: iso(this.now()), exitCode: null }); - this.lastLaunchFailureAt = this.now(); - this.log({ ts: iso(this.now()), kind: "spawn-error", teamId: this.opts.teamId, memberId: args.memberId, turnId, error: errText2(err) }); - throw err; + const receipt = readSpawnReceipt(receiptFile); + if (receipt?.error !== void 0) { + writeTurn(args.paths.runDir, { ...turn, status: "spawn-error", exitedAt: iso(this.now()), exitCode: null }); + throw new Error(`turn process launch failed: ${receipt.error}`); + } + if (receipt !== void 0 && receipt.pid !== void 0) { + spawned = { pid: receipt.pid, pgid: receipt.pid, stdoutFile, specFile: "", resultFile: receiptFile }; + } else { + throw new ProvisioningPending("\u542F\u52A8\u7ED3\u679C\u5F85\u786E\u8BA4\uFF1B\u4E0D\u4F1A\u91CD\u590D\u542F\u52A8\u9996\u8F6E"); + } } const running = { ...turn, pid: spawned.pid, pgid: spawned.pgid, status: "running" }; writeTurn(args.paths.runDir, running); @@ -25906,7 +26494,13 @@ var ResumePerTurnProvider = class { const turn = readTurn(paths.runDir, turnId); if (turn === void 0) return null; if (turn.status !== "running" && turn.status !== "starting") return null; - if (turn.pid === null || !pidAlive(turn.pid)) return null; + if (turn.pid === null) { + const receipt = readSpawnReceipt(path17.join(paths.runDir, `${turn.turnId}.spawn.json`)); + if (receipt?.pid === void 0) return null; + writeTurn(paths.runDir, { ...turn, pid: receipt.pid, pgid: receipt.pid, status: "running" }); + return { ...turn, pid: receipt.pid, pgid: receipt.pid, status: "running" }; + } + if (!pidAlive(turn.pid)) return null; return turn; } /** 会话 id 认领:session-map(teammate SessionStart hook 经 TEAM_SPAWN_IDENTITY 落的映射)。 */ @@ -26026,7 +26620,7 @@ var ResumePerTurnProvider = class { this.clearFailureIfVerified(paths); const originNow = readOrigin(paths); if (originNow !== void 0 && (originNow.modelSelection === void 0 || !sameModelSelection(originNow.modelSelection, lead))) { - writeOrigin(paths, { ...originNow, modelSelection: lead, modelSource: "inherited" }); + this.writeCurrentOrigin(paths, { ...originNow, modelSelection: lead, modelSource: "inherited" }); } return; } @@ -26049,7 +26643,7 @@ var ResumePerTurnProvider = class { throw err; } if (origin !== void 0) { - writeOrigin(paths, { ...readOrigin(paths) ?? origin, modelSelection: lead, modelSource: "inherited" }); + this.writeCurrentOrigin(paths, { ...readOrigin(paths) ?? origin, modelSelection: lead, modelSource: "inherited" }); } this.clearFailureIfVerified(paths); this.log({ @@ -26202,20 +26796,32 @@ var ResumePerTurnProvider = class { */ diagnosticsOf(memberId) { const paths = memberPaths(this.teamDir, memberId); + const origin = readOrigin(paths); + const pending = origin?.creationPending === true && origin.creationDiagnostic !== void 0 ? [origin.creationDiagnostic] : []; let record2; try { record2 = readModelFailed(paths); } catch { - return []; + return pending; } - if (record2 === void 0) return []; + if (record2 === void 0) return pending; const reason = typeof record2.reason === "string" ? record2.reason : ""; const selection = parseModelSelection(record2.modelSelection); const head = selection !== void 0 ? `\u6210\u5458\u6A21\u578B\u7EE7\u627F\u5931\u8D25\uFF1A${selection.providerId}/${selection.modelId}${reason.length > 0 ? `\uFF08${reason}\uFF09` : ""}` : `\u6210\u5458\u6A21\u578B\u7EE7\u627F\u5931\u8D25\uFF1A${reason}`; if ((record2.kind ?? "deterministic") === "transient" && (record2.attempts ?? 1) > 1) { - return [`${head}\uFF08\u4E34\u65F6\u6545\u969C\uFF0C\u5DF2\u81EA\u52A8\u91CD\u8BD5 ${record2.attempts - 1} \u6B21\uFF09`]; + return [`${head}\uFF08\u4E34\u65F6\u6545\u969C\uFF0C\u5DF2\u81EA\u52A8\u91CD\u8BD5 ${record2.attempts - 1} \u6B21\uFF09`, ...pending]; } - return [head]; + return [head, ...pending]; + } + /** 外层断连只读原请求登记;没有 requestId 关联不能声称已受理。 */ + requestStatus(requestId) { + for (const memberId of listMembers(this.teamDir)) { + const origin = readOrigin(memberPaths(this.teamDir, memberId)); + if (origin?.requestId === requestId) { + return { memberId, accepted: origin.initialUserMessageAccepted }; + } + } + return void 0; } /** daemon 侧补写 teammate 映射(hook 未及写时的兜底;不覆盖已有 teammate 映射)。 */ writeTeammateMapping(sessionId, origin) { @@ -26263,6 +26869,17 @@ function safeDir(teamId) { function sha256(text) { return createHash2("sha256").update(text).digest("hex"); } +function readSpawnReceipt(file) { + try { + const parsed = JSON.parse(fs18.readFileSync(file, "utf8")); + return { + ...typeof parsed.pid === "number" && Number.isInteger(parsed.pid) && parsed.pid > 0 ? { pid: parsed.pid } : {}, + ...typeof parsed.error === "string" ? { error: parsed.error } : {} + }; + } catch { + return void 0; + } +} function iso(ms) { return new Date(ms).toISOString(); } @@ -26721,7 +27338,7 @@ function now(deps) { } // src/panel/companion-server.ts -import crypto3 from "node:crypto"; +import crypto4 from "node:crypto"; import fs20 from "node:fs"; import http from "node:http"; import path19 from "node:path"; @@ -26736,7 +27353,7 @@ function companionRegistryFile(dataRoot) { return file; } async function startCompanionServer(deps) { - const token = crypto3.randomBytes(16).toString("hex"); + const token = crypto4.randomBytes(16).toString("hex"); const registryFile = companionRegistryFile(deps.dataRoot); const sseClients = /* @__PURE__ */ new Set(); const backpressured = /* @__PURE__ */ new Set(); @@ -26947,7 +27564,7 @@ function timingSafeEqualStr(a, b) { const ba = Buffer.from(a); const bb = Buffer.from(b); if (ba.length !== bb.length) return false; - return crypto3.timingSafeEqual(ba, bb); + return crypto4.timingSafeEqual(ba, bb); } // src/daemon.ts diff --git a/marketplace.json b/marketplace.json index 00e89c7c..675d3dd8 100644 --- a/marketplace.json +++ b/marketplace.json @@ -1482,7 +1482,7 @@ "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", "zh-CN": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。" }, - "version": "0.5.3", + "version": "0.5.4", "author": { "name": "Vincent Zuo", "url": "https://github.com/Vincent-chk" From 2f449baf130484e1cca4e89e754de15e6e1f9b7d Mon Sep 17 00:00:00 2001 From: Developer Date: Wed, 4 Nov 2026 08:23:00 +0800 Subject: [PATCH 6/7] feat(agent-team): update candidate to 0.5.5-rc.1 --- .../agent-team/.zcode-plugin/plugin.json | 2 +- external_plugins/agent-team/CHANGELOG.md | 11 + external_plugins/agent-team/README.md | 4 +- external_plugins/agent-team/README_CN.md | 6 +- external_plugins/agent-team/commands/team.md | 23 +- .../agent-team/runtime/team-daemon.mjs | 652 ++++++++----- .../agent-team/runtime/team-hooks.mjs | 860 +++++++++--------- .../skills/team-coordination/SKILL.md | 8 +- marketplace.json | 2 +- 9 files changed, 897 insertions(+), 671 deletions(-) diff --git a/external_plugins/agent-team/.zcode-plugin/plugin.json b/external_plugins/agent-team/.zcode-plugin/plugin.json index 6cbfe3ef..3ccf0abc 100644 --- a/external_plugins/agent-team/.zcode-plugin/plugin.json +++ b/external_plugins/agent-team/.zcode-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-team", - "version": "0.5.4", + "version": "0.5.5-rc.1", "description": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。", "description_i18n": { "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", diff --git a/external_plugins/agent-team/CHANGELOG.md b/external_plugins/agent-team/CHANGELOG.md index 1db2c1d2..abd84b9c 100644 --- a/external_plugins/agent-team/CHANGELOG.md +++ b/external_plugins/agent-team/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## 0.5.5-rc.1 — 2026-11-04 + +描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 + +本地候选版,尚未发布;ZCode 实机 E2E 待用户验收。 + +- Lead 在 wait_agent 本轮结果中收取成员消息,已空闲成员的待收结果优先于 noProgress;与 hook 共用持久回执,协调者与代理统一领取,批量结果按响应字节预算分批返回。 +- 回执部分写入失败时保留结果正文并提示可能重投,避免已写回执屏蔽正文;取消、失锁与成员隔离继续保护待收消息。 +- 首次建队即补齐完整按需协作规范;每个委派单元先建任务,成员 get/claim 后执行、完成并交付,由 Lead 记录独立验收。纯文本交付不再依赖额外中转文件。 +- 包含 0.5.4 后工作区的恢复与失锁补修:缺启动回执时不重复拉起;pending 自动复核与持久预算;预检失败不留孤儿登记;异步模型同步、启动、投递、处置与接任均受代次保护。 + ## 0.5.4 — 2026-11-03 描述:智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。 diff --git a/external_plugins/agent-team/README.md b/external_plugins/agent-team/README.md index 35efd42a..98f8a76a 100644 --- a/external_plugins/agent-team/README.md +++ b/external_plugins/agent-team/README.md @@ -120,7 +120,7 @@ Using "create reviewer to check README typos" as the example: | `send_message` | Everyone | Message another member: delivered at the nearest turn boundary while running; wakes/resumes an idle member | | `list_agents` | Everyone | List Lead + all teammates with targets and availability (`inactive` = no turn running, not a failure) | | `interrupt_agent` | Lead | Interrupt a teammate's current turn, preserving its pending inbox (**not registered when disabled → 8 tools**) | -| `wait_agent` | Lead | Wait for the next member/message/task change (never wakes idle members; returns noProgress on timeout) | +| `wait_agent` | Everyone | Return pending Lead inbox messages first; otherwise wait for Team changes. No peer progress returns noProgress; timeout returns timedOut. Never wakes members. | | `team_task_create` | Everyone | Create an unassigned task on the shared board (optional `blocked_by` / `write_scopes`) | | `team_task_list` | Everyone | List tasks: status, owner, revision, blocking, write-scope warnings (paginated/filterable) | | `team_task_get` | Everyone | Read one task's latest full content (must-read before editing) | @@ -269,7 +269,7 @@ This plugin is a re-implementation of DSH Agent Teams on ZCode. The deviations b | D13 | Tool entries declare no `outputSchema` (host limitation); output contracts are pinned by tests | | D14 | With missing identity, error messages use an `` placeholder | | D15 | Argument type errors return `TEAM_INVALID_ARGUMENT` with `param "" must be …`; these are tool-face messages within the existing 27-code set | -| D16 | When two daemons serve one team (proxy mode): `list_agents` may conservatively show active members as `inactive`; `wait_agent` waits conservatively and never falsely reports noProgress | +| D16 | When two daemons serve one team (proxy mode): `list_agents` may conservatively show active members as `inactive`; `wait_agent` uses the coordinator to receive messages and assess noProgress | | D17 | Idle reclaim does **not** terminate teammate turns by default (keep-asleep); set `TEAM_DRAIN_ON_DISPOSE=kill` to drain fully | | D18 | "Delivered" to the Lead means the hook injection receipt (the host has no direct injection primitive; injection is not in the transcript); externally it is still `{sent:true}` | | D19 | Hooks read the config persisted by the daemon; before the first daemon start they use defaults (e.g. `interrupt=true`) | diff --git a/external_plugins/agent-team/README_CN.md b/external_plugins/agent-team/README_CN.md index 2f5e5859..2d3b93d2 100644 --- a/external_plugins/agent-team/README_CN.md +++ b/external_plugins/agent-team/README_CN.md @@ -94,7 +94,7 @@ zcode plugins enable agent-team@zcode-plugins-official 会话里随时输入 `/team`:首行输出「成员 N · 共享任务 T」,随后逐行列出成员与任务(与面板词典同源同文案),并按运行环境附上面板/命令入口。刷新语义:桌面 MCP Apps 面板自动实时(订阅推送,无需手动刷新);CLI 每次重跑 `/team` 即最新。 -**带参数 = 用团队干活**:输入 `/team <任务描述>`(如 `/team 把这段扩写成三个角色`)时,除状态摘要外,Lead 会**真的建队执行**——按角色 spawn 成员、必要时建共享任务并划写域、等齐结果后汇总。不带参数时仍严格只读。 +**带参数 = 用团队干活**:输入 `/team <任务描述>`(如 `/team 把这段扩写成三个角色`)时,Lead 会**真的建队执行**——先建共享任务,再按职责创建或复用成员;成员认领、执行并交付,Lead 验收后汇总。不带参数时仍严格只读。 ### 4. `/team-coordination` 重载策略 @@ -120,7 +120,7 @@ zcode plugins enable agent-team@zcode-plugins-official | `send_message` | 全体 | 给另一个成员发消息:运行中在最近回合边界送达;空闲则拉起/恢复一轮 | | `list_agents` | 全体 | 列出 Lead 与全部队友的 target 与可用状态(`inactive` = 当前无回合,不代表任务失败) | | `interrupt_agent` | Lead | 中断一个队友当前回合,保留其待处理收件箱(**配置关闭时此工具不注册 → 8 个**) | -| `wait_agent` | Lead | 等待下一次成员/消息/任务变化(不会唤醒空闲成员;超时返回 noProgress) | +| `wait_agent` | 全体 | Lead 优先收取待收消息;否则等待成员/消息/任务变化(不唤醒成员;无可推进成员时返回 noProgress,超时返回 timedOut) | | `team_task_create` | 全体 | 在共享任务板创建一条未分配任务(可带 `blocked_by` / `write_scopes`) | | `team_task_list` | 全体 | 列出任务:状态、owner、revision、阻塞、写作用域告警(可分页/过滤) | | `team_task_get` | 全体 | 读取单条任务的最新完整内容(改动前必读) | @@ -269,7 +269,7 @@ zcode plugins list --json # 看 version / rootPath / dataPath / diagnosti | D13 | 工具条目不声明 `outputSchema`(宿主限制);输出契约由测试锚定 | | D14 | 身份缺失时错误消息里用 `` 占位 | | D15 | 参数类型错误返回 `TEAM_INVALID_ARGUMENT`,消息为 `param "" must be …`;这些是工具面消息,错误码仍属既有 27 码 | -| D16 | 同一团队由两个 daemon 服务时(代理模式):`list_agents` 的 active 成员可能保守显示 `inactive`;`wait_agent` 保守等待、绝不误报 noProgress | +| D16 | 同一团队由两个 daemon 服务时(代理模式):`list_agents` 的 active 成员可能保守显示 `inactive`;`wait_agent` 由协调者统一收件并判断 noProgress | | D17 | daemon 空闲回收默认**不终止**队友轮次(keep 休眠态);如需要彻底回收可设 `TEAM_DRAIN_ON_DISPOSE=kill` | | D18 | 给 Lead 的“已送达”以 hook 注入回执为准(宿主无直达注入原语,注入不落 transcript);对外仍是 `{sent:true}` | | D19 | hook 读取 daemon 落盘的配置;首次 daemon 启动前 hook 使用默认值(如 `interrupt=true`) | diff --git a/external_plugins/agent-team/commands/team.md b/external_plugins/agent-team/commands/team.md index f4940a64..fb927fb1 100644 --- a/external_plugins/agent-team/commands/team.md +++ b/external_plugins/agent-team/commands/team.md @@ -57,15 +57,20 @@ allowed-tools: Bash 不要再以「任务简单」为由自行代劳;只有确实单角色即可完成(如一句话问答)时, 才用一行说明「这个任务不需要分工」并直接给出结果。 **不要输出「成员 N · 共享任务 T」等状态摘要**——用户要的是团队干活,不是看状态。 - 2. 建队:`spawn_teammate` 2–3 个成员(名字体现角色,`description` 写清职责, - `prompt` 必须是自洽完整的初始任务——成员是独立进程,看不到本会话历史)。 - 3. 需要协作流水线时用 `team_task_create` 建任务(写 `write_scopes` 划清写域、 - 用 `blocked_by` 表达顺序),再 `send_message` 告知成员认领;**不要**只建任务不通知 - (任务就绪不会自动唤醒成员)。 - 4. 用 `list_agents` 确认成员在 running/provisioning 后再 `wait_agent`; - 收到进展后重新 `list_agents` 再决定是否继续等。 - 5. 收齐成员产出后由 Lead 汇总成最终答复;成员自由文本不会自动推给 Lead, - 需要时用 `send_message` 追问或读成员会话。 + 2. 先用 `team_task_create` 为每个委派单元建共享任务,写清验收标准; + 文件改动填 `write_scopes`,先后依赖填 `blocked_by`。初始 prompt、角色说明或产出文件 + 都不能替代任务板记录。 + 3. 建队:`spawn_teammate` 创建所需成员(名字体现角色,`description` 写职责); + `prompt` 提供完整背景、任务 ID,要求先 get 最新 revision、确认 ready 再 claim, + 然后执行、自检、complete,并通过 `send_message` 向 lead 交付结果。 + 复用已有成员时发送相同的任务指引;被依赖阻塞的成员汇报阻塞后结束本轮, + 依赖完成后 Lead 再发消息唤醒(任务就绪不会自动唤醒成员)。 + 4. 用 `wait_agent` 收取成员消息,包括成员已 inactive 时的待收结果;先处理返回的 + `messages`,再通过 `list_agents` / `team_task_list` 核对状态。没有消息且无可推进的 + 成员时会立即返回 noProgress;仅在确实还需执行或补充结果时才发后续消息。 + 5. 收齐产出后由 Lead 独立核验;通过则在任务 description 记录验收结论,失败则 + reopen 并附具体问题,再通知成员返工。最后汇总答复;用消息和任务板交付纯文本结果, + 不为绕过收件箱而额外创建中转文件。 6. **`spawn_teammate` 失败时(套餐模型不可继承)**:不要静默改自干—— 用一行说明「当前 Lead 模型为官方套餐,队友无法继承,本次由我直接完成」, 然后自己完成,并提示用户可切换到自配第三方模型后再用团队。 diff --git a/external_plugins/agent-team/runtime/team-daemon.mjs b/external_plugins/agent-team/runtime/team-daemon.mjs index 0d8170e9..f6211f6f 100644 --- a/external_plugins/agent-team/runtime/team-daemon.mjs +++ b/external_plugins/agent-team/runtime/team-daemon.mjs @@ -18875,17 +18875,21 @@ function pgidAlive(pgid) { return err.code === "EPERM"; } } -async function killProcessGroup(pgid, graceMs) { +async function killProcessGroup(pgid, graceMs, signal) { + signal?.throwIfAborted(); if (pgid === null || pgid <= 0) return true; signalGroup(pgid, "SIGTERM"); for (let waited = 0; waited < graceMs; waited += 50) { await sleep(50); + signal?.throwIfAborted(); if (!pgidAlive(pgid) && !pidAlive(pgid)) return true; } + signal?.throwIfAborted(); if (pgidAlive(pgid) || pidAlive(pgid)) { signalGroup(pgid, "SIGKILL"); for (let waited = 0; waited < 2e3; waited += 50) { await sleep(50); + signal?.throwIfAborted(); if (!pgidAlive(pgid) && !pidAlive(pgid)) return true; } } @@ -20810,6 +20814,178 @@ function nonEmptyString(value) { return trimmed.length > 0 ? trimmed : void 0; } +// src/domain/ports.ts +var realClock = { + now: () => Date.now(), + sleep: (ms, signal) => new Promise((resolve) => { + if (signal?.aborted) { + resolve(); + return; + } + const onAbort = () => { + clearTimeout(timer); + signal?.removeEventListener("abort", onAbort); + resolve(); + }; + const timer = setTimeout(() => { + signal?.removeEventListener("abort", onAbort); + resolve(); + }, ms); + signal?.addEventListener("abort", onAbort, { once: true }); + }) +}; +function errorMessage(err) { + const message = err instanceof Error ? err.message : String(err); + return message.split("\n")[0] ?? message; +} + +// src/domain/activity.ts +function isValidTimeout(value) { + return typeof value === "number" && Number.isSafeInteger(value) && value >= 1e4 && value <= 36e5; +} +var NO_PROGRESS_REASON = "no-active-peer"; +var NO_PROGRESS_MESSAGE = "No other Team member is running or provisioning. wait_agent cannot make progress or wake inactive teammates. Re-list with list_agents and team_task_list, then use send_message to wake each required inactive teammate before waiting again."; +function noProgressResult() { + return { timedOut: false, noProgress: { reason: NO_PROGRESS_REASON, message: NO_PROGRESS_MESSAGE } }; +} +var TeamActivity = class { + constructor(deps) { + this.deps = deps; + this.clock = deps.clock ?? realClock; + } + waiters = /* @__PURE__ */ new Set(); + closed = false; + clock; + unsubscribeCommit; + /** 接线:Team 日志提交边(由 runtime/装配调用;每提交唤醒全部已注册等待者一次)。 */ + bindCommitEdge() { + this.unsubscribeCommit?.(); + this.unsubscribeCommit = this.deps.store.onCommit(() => this.wakeAll()); + return () => this.unsubscribeCommit?.(); + } + /** 接线:成员状态变化边(roster.onMemberStatus → 此处)。 */ + notifyMemberStatus() { + this.wakeAll(); + } + /** 处置:唤醒全部等待者并关闭准入(新等待立即返回 { timedOut:false })。 */ + closeAll() { + this.closed = true; + this.wakeAll(); + } + /** §8 waitForChange。 */ + async waitForChange(callerId, timeoutMs = 3e4, signal) { + if (!isValidTimeout(timeoutMs)) { + throw new TeamError( + "TEAM_INVALID_TIMEOUT", + "timeoutMs must be an integer from 10000 through 3600000" + ); + } + signal?.throwIfAborted(); + if (this.closed) return { timedOut: false }; + requireMembership(() => this.loadState(), callerId); + return new Promise((resolve, reject) => { + const sleepAbort = new AbortController(); + const waiter = { + wake: () => { + cleanup(); + resolve({ timedOut: false }); + } + }; + const onAbort = () => { + cleanup(); + const reason = signal?.reason; + if (reason instanceof Error) reject(reason); + else + reject( + new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${errorMessage(reason)}`) + ); + }; + const cleanup = () => { + if (settled) return; + this.waiters.delete(waiter); + settled = true; + signal?.removeEventListener("abort", onAbort); + sleepAbort.abort(); + }; + let settled = false; + this.waiters.add(waiter); + signal?.addEventListener("abort", onAbort, { once: true }); + void this.clock.sleep(timeoutMs, sleepAbort.signal).then(() => { + if (settled) return; + cleanup(); + resolve({ timedOut: true }); + }); + }); + } + wakeAll() { + const current = [...this.waiters]; + this.waiters.clear(); + for (const waiter of current) waiter.wake(); + } + loadState() { + const state = this.deps.store.state(); + if (state.failure !== void 0) throw new Error(state.failure); + return state; + } +}; + +// src/provider/framing.ts +function renderFramed(framedJson) { + const blocks = JSON.parse(framedJson); + if (!Array.isArray(blocks) || blocks.length === 0) { + throw new Error("framed message must be a non-empty JSON array of content blocks"); + } + const header = blocks[0]; + if (header.type !== "text" || typeof header.text !== "string") { + throw new Error("framed message first block must be the text header"); + } + const m = header.text.match(/^Team message from (.+):$/); + if (m === null) { + throw new Error(`framed message header mismatch: ${JSON.stringify(header.text)}`); + } + const lines = [header.text]; + for (const block of blocks.slice(1)) { + if (block.type === "text" && typeof block.text === "string") { + lines.push(block.text); + } else { + lines.push(JSON.stringify(block)); + } + } + return { messageId: "", senderName: m[1], text: lines.join("\n") }; +} +function renderFramedBatch(items) { + const rendered = items.map((item) => ({ ...renderFramed(item.framedJson), messageId: item.messageId })); + return { promptText: rendered.map((r) => r.text).join("\n\n"), rendered }; +} + +// src/hooks/inbox.ts +function pendingLeadMessages(teamDir, state) { + if (state.failure !== void 0) return []; + const teamId = state.id; + const delivered = new Set(state.delivered); + const receipted = receiptMessageIds(memberPaths(teamDir, teamId)); + const pending = []; + for (const message of state.messages) { + if (message.targetId !== teamId || delivered.has(message.id) || receipted.has(message.id)) continue; + const framed = [ + { type: "text", text: `Team message from ${message.senderName}:` }, + ...message.content + ]; + pending.push({ + messageId: message.id, + senderName: message.senderName, + text: renderFramed(JSON.stringify(framed)).text + }); + } + return pending; +} +function writeReceipts(dataRoot, teamId, messageIds, channel) { + const paths = memberPaths(teamPaths(dataRoot, teamId).teamDir, teamId); + for (const messageId of messageIds) { + appendReceipt(paths, { messageId, channel, ts: (/* @__PURE__ */ new Date()).toISOString() }); + } +} + // src/coord/methods.ts var TASK_ACTIONS = [ "claim", @@ -20831,6 +21007,7 @@ function methodTimeoutMs(method) { } function buildTeamMethodTable(deps) { const { runtime, store } = deps; + const { teamDir } = teamPaths(deps.dataRoot, deps.teamId); const table = /* @__PURE__ */ new Map(); table.set("coordinator.hello", (raw) => { const p = asParams(raw, "coordinator.hello"); @@ -20975,7 +21152,65 @@ function buildTeamMethodTable(deps) { assertTeamTarget(p, "wait.agent", deps); const sessionId = requireSessionId(p, "wait.agent"); const timeoutMs = typeof p.timeoutMs === "number" ? p.timeoutMs : 3e4; - return runtime.activity.waitForChange(sessionId, timeoutMs, ctx?.signal); + if (!isValidTimeout(timeoutMs) || runtime.lifecycle.status !== "open") { + return runtime.activity.waitForChange(sessionId, timeoutMs, ctx?.signal); + } + ctx?.signal?.throwIfAborted(); + runtime.lifecycle.runtimeSignal().throwIfAborted(); + const membership = requireMembership(membershipStateLoader(store), sessionId); + const receiveMessages = () => { + ctx?.signal?.throwIfAborted(); + runtime.lifecycle.runtimeSignal().throwIfAborted(); + if (sessionId !== deps.teamId) return { messages: [] }; + const pending = pendingLeadMessages(teamDir, store.state()); + const messages = []; + const messageIds = []; + const receiptWarning = "\u6536\u4EF6\u56DE\u6267\u6301\u4E45\u5316\u5931\u8D25\uFF1B\u672C\u6279\u6B63\u6587\u5DF2\u8FD4\u56DE\uFF0C\u672A\u786E\u8BA4\u6D88\u606F\u53EF\u80FD\u91CD\u590D\u3002"; + let bytes = Buffer.byteLength(JSON.stringify({ + id: Number.MAX_SAFE_INTEGER, + ok: true, + result: { timedOut: false, messages: [], receiptWarning } + })) + 1; + for (const message of pending) { + const size = Buffer.byteLength(JSON.stringify(message.text)) + (messages.length > 0 ? 1 : 0); + if (bytes + size > MAX_RPC_BUFFER_BYTES) { + if (messages.length === 0) throw new Error("\u5355\u6761\u6210\u5458\u6D88\u606F\u8D85\u8FC7\u6536\u4EF6\u7BB1\u54CD\u5E94\u4E0A\u9650\uFF0C\u6D88\u606F\u4FDD\u6301\u5F85\u6536\uFF1B\u8BF7\u67E5\u770B\u6210\u5458\u4F1A\u8BDD\u83B7\u53D6\u5B8C\u6574\u7ED3\u679C\u3002"); + break; + } + bytes += size; + messages.push(message.text); + messageIds.push(message.messageId); + } + try { + writeReceipts(deps.dataRoot, deps.teamId, messageIds, "wait_agent"); + } catch (err) { + try { + deps.warn?.(`agent-team inbox receipt failed: ${err instanceof Error ? err.message : String(err)}`); + } catch { + } + return { messages, receiptWarning }; + } + return { messages }; + }; + const inbox = receiveMessages(); + if (inbox.messages.length > 0) return { timedOut: false, ...inbox }; + const rows = runtime.roster.listMembers(sessionId).members; + if (!runtime.roster.hasPendingAutomaticProgress(sessionId)) { + const stopped = rows.find((row) => row.status === "provisioning"); + if (stopped !== void 0) { + const message = `\u6210\u5458 ${stopped.target} \u5DF2\u505C\u6B62\u81EA\u52A8\u786E\u8BA4\uFF0C\u9700\u8981 Lead \u63A5\u7BA1\uFF1B\u65E7 turn \u4ECD\u53EF\u80FD\u6267\u884C\uFF0C\u4E0D\u5F97\u91CD\u590D\u542F\u52A8\u3002`; + return { ...noProgressResult(), noProgress: { reason: "no-active-peer", message }, content: [{ type: "text", text: message }] }; + } + return noProgressResult(); + } + const self = membership.role === "lead" ? "lead" : membership.name; + if (!rows.some((row) => row.target !== self && (row.status === "running" || row.status === "provisioning"))) { + return noProgressResult(); + } + const result = await runtime.activity.waitForChange(sessionId, timeoutMs, ctx?.signal); + if (runtime.lifecycle.status !== "open") return result; + const received = receiveMessages(); + return received.messages.length > 0 ? { timedOut: false, ...received } : result; }; waitAgent.timeoutMs = 36e5 + WAIT_AGENT_GRACE_MS; table.set("wait.agent", waitAgent); @@ -21153,113 +21388,6 @@ function isCancellation(err) { return false; } -// src/domain/ports.ts -var realClock = { - now: () => Date.now(), - sleep: (ms, signal) => new Promise((resolve) => { - if (signal?.aborted) { - resolve(); - return; - } - const onAbort = () => { - clearTimeout(timer); - signal?.removeEventListener("abort", onAbort); - resolve(); - }; - const timer = setTimeout(() => { - signal?.removeEventListener("abort", onAbort); - resolve(); - }, ms); - signal?.addEventListener("abort", onAbort, { once: true }); - }) -}; -function errorMessage(err) { - const message = err instanceof Error ? err.message : String(err); - return message.split("\n")[0] ?? message; -} - -// src/domain/activity.ts -var TeamActivity = class { - constructor(deps) { - this.deps = deps; - this.clock = deps.clock ?? realClock; - } - waiters = /* @__PURE__ */ new Set(); - closed = false; - clock; - unsubscribeCommit; - /** 接线:Team 日志提交边(由 runtime/装配调用;每提交唤醒全部已注册等待者一次)。 */ - bindCommitEdge() { - this.unsubscribeCommit?.(); - this.unsubscribeCommit = this.deps.store.onCommit(() => this.wakeAll()); - return () => this.unsubscribeCommit?.(); - } - /** 接线:成员状态变化边(roster.onMemberStatus → 此处)。 */ - notifyMemberStatus() { - this.wakeAll(); - } - /** 处置:唤醒全部等待者并关闭准入(新等待立即返回 { timedOut:false })。 */ - closeAll() { - this.closed = true; - this.wakeAll(); - } - /** §8 waitForChange。 */ - async waitForChange(callerId, timeoutMs = 3e4, signal) { - if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1e4 || timeoutMs > 36e5) { - throw new TeamError( - "TEAM_INVALID_TIMEOUT", - "timeoutMs must be an integer from 10000 through 3600000" - ); - } - signal?.throwIfAborted(); - if (this.closed) return { timedOut: false }; - requireMembership(() => this.loadState(), callerId); - return new Promise((resolve, reject) => { - const sleepAbort = new AbortController(); - const waiter = { - wake: () => { - cleanup(); - resolve({ timedOut: false }); - } - }; - const onAbort = () => { - cleanup(); - const reason = signal?.reason; - if (reason instanceof Error) reject(reason); - else - reject( - new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${errorMessage(reason)}`) - ); - }; - const cleanup = () => { - if (settled) return; - this.waiters.delete(waiter); - settled = true; - signal?.removeEventListener("abort", onAbort); - sleepAbort.abort(); - }; - let settled = false; - this.waiters.add(waiter); - signal?.addEventListener("abort", onAbort, { once: true }); - void this.clock.sleep(timeoutMs, sleepAbort.signal).then(() => { - if (settled) return; - cleanup(); - resolve({ timedOut: true }); - }); - }); - } - wakeAll() { - const current = [...this.waiters]; - this.waiters.clear(); - for (const waiter of current) waiter.wake(); - } - loadState() { - const state = this.deps.store.state(); - if (state.failure !== void 0) throw new Error(state.failure); - return state; - } -}; - // src/domain/validation.ts function requiredText(field, value, maxLen) { if (typeof value !== "string") { @@ -21359,7 +21487,14 @@ var TeamRoster = class { /** 仅由宿主在完整意图/轮次恢复后启动;构造对象不得提前判 provisioning 失败。 */ startRecovery() { this.recoveryDone ??= this.reconcileProvisioning().then( - () => void 0, + () => { + if (this.deps.lifecycle.runtimeSignal().aborted) return; + for (const member of this.loadState().members) { + if (member.phase === "provisioning" && !this.recoveryStopped.has(member.id)) { + this.scheduleProvisioningRecheck(member.id); + } + } + }, () => void 0 ); return this.recoveryDone; @@ -21415,15 +21550,6 @@ var TeamRoster = class { const providerName = requiredText("provider", context === "fork" ? providers.fork : providers.fresh, 200); const childId = (this.deps.newId ?? defaultNewId)(); const requestId = args.requestId ?? defaultNewId(); - this.deps.provider.prepareContinuable?.({ - teamId: this.deps.teamId, - memberId: childId, - name, - description, - firstPrompt: args.prompt, - context, - requestId - }); await this.deps.store.transact(async () => { const fresh = this.loadState(); if (fresh.members.some((m) => m.name === name)) { @@ -21435,6 +21561,15 @@ var TeamRoster = class { if (providerHasModelPreflight(this.deps.provider)) { this.deps.provider.preflightMemberModel(); } + this.deps.provider.prepareContinuable?.({ + teamId: this.deps.teamId, + memberId: childId, + name, + description, + firstPrompt: args.prompt, + context, + requestId + }); await this.deps.store.append({ type: "team/member", version: 2, @@ -21468,6 +21603,9 @@ var TeamRoster = class { started = await run; } catch (originalError) { if (originalError instanceof ProvisioningPending) { + if (!this.deps.lifecycle.runtimeSignal().aborted && !args.ownershipSignal?.aborted) { + this.scheduleProvisioningRecheck(childId); + } return { member: this.rowOf(childId), creation: "pending", message: originalError.message }; } let becameActiveConflict; @@ -21510,6 +21648,9 @@ var TeamRoster = class { throw new Error(`provider returned memberId ${started.memberId} != provisioned ${childId}`); } if (started.creation === "pending") { + if (!this.deps.lifecycle.runtimeSignal().aborted && !args.ownershipSignal?.aborted) { + this.scheduleProvisioningRecheck(childId); + } return { member: this.rowOf(childId), creation: "pending", message: "\u7ED3\u679C\u5F85\u786E\u8BA4" }; } if (!started.accepted) { @@ -21567,10 +21708,10 @@ var TeamRoster = class { * team/member(provisioning) 事件的 ts 计龄:尚未确认首轮受理(记录缺失或 accepted 未置位) * 且年龄 < graceMs → 跳过本轮并排一次性 recheck(10s);年龄 ≥ graceMs 或恢复抛错 → 照旧 * 定案(真故障不被掩盖)。store 未实现 readEventLines(内存桩)→ 无宽限(旧语义)。 */ - async reconcileProvisioning() { + async reconcileProvisioning(recheckMemberId) { const state = this.loadState(); const pending = state.members.filter( - (m) => m.phase === "provisioning" && !this.deps.inspector.isAlive(m.id) + (m) => m.phase === "provisioning" && (m.id === recheckMemberId || !this.deps.inspector.isAlive(m.id)) ); const orphans = pending.map((m) => m.id); const settled = []; @@ -21681,7 +21822,7 @@ var TeamRoster = class { if (this.recheckTimers.has(memberId)) return; const timer = setTimeout(() => { this.recheckTimers.delete(memberId); - void this.reconcileProvisioning().then( + void this.reconcileProvisioning(memberId).then( () => void 0, () => void 0 // C3:对账自身抛错仅警告语义由调用方承担 @@ -21693,7 +21834,7 @@ var TeamRoster = class { hasPendingAutomaticProgress(callerId) { const { state } = this.requireMember(callerId); return state.members.some( - (member) => member.phase === "active" && this.deps.inspector.isAlive(member.id) || member.phase === "provisioning" && !this.recoveryStopped.has(member.id) + (member) => member.phase === "active" && (this.deps.inspector.isAlive(member.id) || this.deps.presentation?.statusOf(member.id) === "running") || member.phase === "provisioning" && !this.recoveryStopped.has(member.id) ); } // ---------------------------------------------------------------- listMembers(§5.5) @@ -21748,7 +21889,7 @@ var TeamRoster = class { if (target === void 0) { throw new TeamError("TEAM_MEMBER_NOT_FOUND", `active teammate "${name}" not found`); } - if (!this.deps.inspector.isAlive(target.id)) { + if (!this.deps.inspector.isAlive(target.id) && this.deps.presentation?.statusOf(target.id) !== "running") { return { previousStatus: "inactive" }; } const result = await this.deps.provider.interrupt({ memberId: target.id }); @@ -22645,7 +22786,13 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { } throw err; } - await host.serve(); + const startup = host.serve().then(() => host.currentMode === "coordinator"); + host.promoting = startup; + try { + await startup; + } finally { + if (host.promoting === startup) host.promoting = null; + } return host; } get currentMode() { @@ -22838,6 +22985,8 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { if (this.closed) throw new Error("host is closed"); const paths = this.paths(); const generationSignal = providerHasGeneration(this.provider) ? this.provider.activateGeneration() : void 0; + const ownerToken = this.lock.info?.token; + const ownsGeneration = () => !this.closed && ownerToken !== void 0 && this.lock.info?.token === ownerToken && !generationSignal?.aborted; this.lock.startHeartbeat(); let store; try { @@ -22853,10 +23002,15 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { journal }); } catch (err) { + if (!ownsGeneration()) return; this.lock.stopHeartbeat(); await this.lock.release(); throw err; } + if (!ownsGeneration()) { + await store.close({ checkpoint: false }); + return; + } const runtime = new TeamRuntime({ teamId: this.teamId, store, @@ -22914,9 +23068,26 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { `Agent Teams coordinator for team "${this.teamId}" started in degraded mode (projection failure): ${initialState.failure}` ); } else { - await runtime.recoverAll(); + try { + await runtime.recoverAll(); + } catch (err) { + if (ownsGeneration()) throw err; + runtime.close(); + await store.close({ checkpoint: false }); + return; + } + if (!ownsGeneration()) { + runtime.close(); + await store.close({ checkpoint: false }); + return; + } if (providerHasBoundary(this.provider)) this.provider.startBackground?.(); } + if (!ownsGeneration()) { + runtime.close(); + await store.close({ checkpoint: false }); + return; + } const socket = resolveSocketPath(paths.teamDir); const token = newRpcToken(); const server2 = new RpcServer(socket.socketPath, { @@ -22924,13 +23095,28 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { maxFrameBytes: frameBudgetFor(this.limits.maxMessageBytes) }); const table = buildTeamMethodTable({ + dataRoot: this.opts.dataRoot, + warn: this.opts.warn, teamId: this.teamId, runtime, store, coordinatorBootId: this.lock.info?.bootId ?? bootId() }); registerTeamMethods(server2, table); - await server2.listen({ callTimeoutMs: this.opts.callTimeoutMs }); + try { + await server2.listen({ callTimeoutMs: this.opts.callTimeoutMs }); + } catch (err) { + if (ownsGeneration()) throw err; + runtime.close(); + await store.close({ checkpoint: false }); + return; + } + if (!ownsGeneration()) { + await server2.close(); + runtime.close(); + await store.close({ checkpoint: false }); + return; + } writeRpcToken(paths.teamDir, token); writeSocketRegistry(paths.teamDir, socket.socketPath); this.store = store; @@ -22960,7 +23146,7 @@ var TeamCoordinatorHost = class _TeamCoordinatorHost { return false; } await this.serve(); - return true; + return this.currentMode === "coordinator"; } startTakeoverWatcher() { if (this.opts.autoTakeover === false || this.watcher !== null) return; @@ -23027,45 +23213,9 @@ function providerWakesLead(provider) { return typeof provider.wakeLead === "function"; } -// src/mcp/policy.ts -function teamPolicy(interrupt) { - return `Agent Teams is available in this session - -The Team Lead and all teammates share the same working directory and filesystem. Edits are immediately visible to every member. Split write work into disjoint scopes, record expected write scopes on shared tasks, and use task dependencies when work must be ordered. Write-scope overlap is advisory, not a lock. - -Prefer read/edit/write for file changes. If a file operation reports that the file changed since you last read it, read the current file again, rebase your intended change onto the new content, and retry. Bash, formatters, code generators, and scripts are not fully protected by the filesystem version guard; coordinate them explicitly and have the Lead review the final diff and run tests. - -Use the target returned by spawn_teammate or list_agents for send_message${interrupt ? " and interrupt_agent" : ""}, or as owner when assigning or filtering shared tasks. send_message steers a running target at its nearest step boundary and starts or resumes an inactive target. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Shared-task workflow is list, get, claim with the current revision, perform the work, then complete. Task readiness never starts an owner. Before wait_agent, use list_agents and make sure another required member is running or provisioning; use send_message first when the required member is inactive. wait_agent observes only changes after that call starts, never wakes a member, and returns noProgress immediately when no other member can produce a change. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer.`; -} -var POLICY_TEXT = teamPolicy(true); -var HOOK_POLICY_PREFIX = "[agent-team]"; -var IDENTITY_LEAD_TEXT = `You are the Team Lead named "lead". -Use list_agents({}) to find your teammates and their names. -To message another teammate, use send_message({ target: "", message: "..." }).`; -var POLICY_PROBE_MARKER = "quartz-ember-73"; -var FIRST_SPAWN_NOTE = "[agent-team] Team mode is now active: this is the first teammate of this session. From now on, judge each request by delegation value \u2014 handle simple work directly with a one-line reason, and use the team for work that benefits from multiple roles, parallel execution, or disjoint write scopes."; -function buildSessionStartContext(identityText, interrupt = true, modeSection) { - const policy = teamPolicy(interrupt); - const section = modeSection !== void 0 ? ` -${HOOK_POLICY_PREFIX} ${modeSection}` : ""; - const probe = process.env.TEAM_POLICY_PROBE === "1" ? ` -${HOOK_POLICY_PREFIX} \u7B56\u7565\u6CE8\u5165\u9A8C\u8BC1\u6807\u8BB0\uFF1A${POLICY_PROBE_MARKER}` : ""; - return `${HOOK_POLICY_PREFIX} ${policy} -${HOOK_POLICY_PREFIX} ${identityText}${section}${probe}`; -} -var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true); -var FAIL_LOUD_WARNING = "[agent-team] \u8B66\u544A\uFF1A\u672A\u68C0\u6D4B\u5230\u672C\u4F1A\u8BDD\u7684\u7B56\u7565\u6CE8\u5165\uFF08SessionStart hook \u53EF\u80FD\u672A\u751F\u6548\uFF09\u3002\u8BF7\u786E\u8BA4\u63D2\u4EF6\u5DF2\u542F\u7528\u4E14 hooks \u58F0\u660E\u5B58\u5728\uFF1B\u56E2\u961F\u5DE5\u5177\u4ECD\u53EF\u8C03\u7528\uFF0C\u4F46\u6A21\u578B\u53EF\u80FD\u672A\u52A0\u8F7D\u5B8C\u6574\u534F\u4F5C\u7B56\u7565\u3002"; -var NO_PROGRESS_REASON = "no-active-peer"; -var NO_PROGRESS_MESSAGE = "No other Team member is running or provisioning. wait_agent cannot make progress or wake inactive teammates. Re-list with list_agents and team_task_list, then use send_message to wake each required inactive teammate before waiting again."; -function noProgressResult() { - return { timedOut: false, noProgress: { reason: NO_PROGRESS_REASON, message: NO_PROGRESS_MESSAGE } }; -} - // src/mcp/backend.ts var WAIT_PROGRESS_INTERVAL_MS = 9e3; var WAIT_DEFAULT_TIMEOUT_MS = 3e4; -var WAIT_MIN_TIMEOUT_MS = 1e4; -var WAIT_MAX_TIMEOUT_MS = 36e5; var DEFAULT_IDLE_RECLAIM_MS = 10 * 6e4; var IDLE_SWEEP_MS = 6e4; var TeamToolBackend = class { @@ -23292,16 +23442,6 @@ var TeamToolBackend = class { const runtime = host.teamRuntime; let wait; if (runtime !== null) { - const rows = runtime.roster.listMembers(identity.agentId).members; - if (!runtime.roster.hasPendingAutomaticProgress(identity.agentId)) { - const stopped = rows.find((row) => row.status === "provisioning"); - return stopped !== void 0 ? { ...noProgressResult(), content: [{ type: "text", text: `\u6210\u5458 ${stopped.target} \u5DF2\u505C\u6B62\u81EA\u52A8\u786E\u8BA4\uFF0C\u9700\u8981 Lead \u63A5\u7BA1\uFF1B\u65E7 turn \u4ECD\u53EF\u80FD\u6267\u884C\uFF0C\u4E0D\u5F97\u91CD\u590D\u542F\u52A8\u3002` }] } : noProgressResult(); - } - const selfTarget = identity.role === "lead" ? "lead" : identity.name; - const hasActivePeer = rows.some( - (row) => row.target !== selfTarget && (row.status === "running" || row.status === "provisioning") - ); - if (!hasActivePeer) return noProgressResult(); wait = host.dispatch( "wait.agent", { session_id: identity.agentId, timeoutMs }, @@ -23385,9 +23525,6 @@ var TeamToolBackend = class { return ["Task"]; } }; -function isValidTimeout(value) { - return typeof value === "number" && Number.isSafeInteger(value) && value >= WAIT_MIN_TIMEOUT_MS && value <= WAIT_MAX_TIMEOUT_MS; -} var MEMBER_STATUS_BY_PHASE = { active: "inactive", provisioning: "provisioning", @@ -23436,7 +23573,7 @@ var TEAM_TOOL_DEFINITIONS = [ properties: { name: { type: "string", description: "Unique lower-kebab-case teammate name." }, description: { type: "string", description: "Short description of the delegated responsibility." }, - prompt: { type: "string", description: "Complete initial task for the teammate." }, + prompt: { type: "string", description: "Bootstrap instructions with a shared task id; get and claim that task before working. Report blockers when not ready." }, context: { type: "string", enum: ["fresh", "fork"], @@ -23453,7 +23590,7 @@ var TEAM_TOOL_DEFINITIONS = [ { // 02 §9.5(〔对齐轮〕0.2.1 描述:删 "durable"、"durable message"→"message") name: "send_message", - description: "Send one message to another Team member. A running target receives it at the nearest step boundary; an inactive target starts or resumes a turn.", + description: "Send one message to another Team member. Running teammates receive it at a turn boundary; inactive teammates resume. The Lead reads messages through wait_agent.", inputSchema: { type: "object", properties: { @@ -23498,7 +23635,7 @@ var TEAM_TOOL_DEFINITIONS = [ { // 02 §9.7(〔对齐轮〕0.2.1 描述:"mailbox"→"message") name: "wait_agent", - description: "Wait for the next teammate status, message, or shared-task change after this call starts. This never wakes inactive members and returns noProgress immediately when no other member is running or provisioning. Re-list after wakeup or timeout instead of polling.", + description: "Receive pending Lead inbox messages immediately, even if teammates are inactive; otherwise wait for the next Team change. This never wakes inactive members and returns noProgress immediately when no peer can progress and no messages await. Read returned messages before follow-ups. Re-list after wakeup or timeout.", inputSchema: { type: "object", properties: { @@ -23615,6 +23752,37 @@ function teamToolDefinitions(options = {}) { return interrupt ? TEAM_TOOL_DEFINITIONS : TEAM_TOOL_DEFINITIONS.filter((t) => t.name !== "interrupt_agent"); } +// src/mcp/policy.ts +function teamPolicy(interrupt) { + return `Agent Teams is available in this session + +The Team Lead and all teammates share the same working directory and filesystem. Edits are immediately visible to every member. Split write work into disjoint scopes, record expected write scopes on shared tasks, and use task dependencies when work must be ordered. Write-scope overlap is advisory, not a lock. + +Prefer read/edit/write for file changes. If a file operation reports that the file changed since you last read it, read the current file again, rebase your intended change onto the new content, and retry. Bash, formatters, code generators, and scripts are not fully protected by the filesystem version guard; coordinate them explicitly and have the Lead review the final diff and run tests. + +Use the target returned by spawn_teammate or list_agents for send_message${interrupt ? " and interrupt_agent" : ""}, or as owner when assigning or filtering shared tasks. send_message queues delivery to a running teammate's next turn boundary and starts or resumes an inactive teammate. The Lead receives queued messages through wait_agent during its current turn, with session hooks as a fallback. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Each delegated unit needs a shared task with acceptance criteria. Create it before dispatching the work; the teammate must list/get it, claim with the current revision, perform the work, then complete and report to the Lead. An initial prompt or an output file is not a task-board record. Task readiness never starts an owner. Use wait_agent to receive pending Lead inbox messages before sending follow-ups, even when teammates are inactive. With no pending messages, it waits for new changes and returns noProgress immediately when no other member can produce a change; it never wakes a member. Consume returned messages, then recheck shared tasks before deciding whether more work or another message is needed. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer.`; +} +var POLICY_TEXT = teamPolicy(true); +var HOOK_POLICY_PREFIX = "[agent-team]"; +var IDENTITY_LEAD_TEXT = `You are the Team Lead named "lead". +Use list_agents({}) to find your teammates and their names. +To message another teammate, use send_message({ target: "", message: "..." }).`; +var POLICY_PROBE_MARKER = "quartz-ember-73"; +var ON_DEMAND_SECTION_TEXT = "Lead operating mode (on-demand): Judge each request by delegation value before using the team. Handle work directly yourself \u2014 with a one-line reason, no forced tasks \u2014 for questions and explanations, small changes confined to a single file, read-only research summaries, or when every teammate is busy and the request is unrelated to existing work. Use the team workflow when work clearly benefits from multiple roles in parallel, when write scopes must be split across members, when a long task deserves its own context, or when the user explicitly names members. When you delegate, turn each delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. Wait for required teammates and synthesize their results for the final answer."; +var FIRST_SPAWN_NOTE = `[agent-team] Team mode is now active: this is the first teammate of this session. +${ON_DEMAND_SECTION_TEXT}`; +function buildSessionStartContext(identityText, interrupt = true, modeSection) { + const policy = teamPolicy(interrupt); + const section = modeSection !== void 0 ? ` +${HOOK_POLICY_PREFIX} ${modeSection}` : ""; + const probe = process.env.TEAM_POLICY_PROBE === "1" ? ` +${HOOK_POLICY_PREFIX} \u7B56\u7565\u6CE8\u5165\u9A8C\u8BC1\u6807\u8BB0\uFF1A${POLICY_PROBE_MARKER}` : ""; + return `${HOOK_POLICY_PREFIX} ${policy} +${HOOK_POLICY_PREFIX} ${identityText}${section}${probe}`; +} +var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true); +var FAIL_LOUD_WARNING = "[agent-team] \u8B66\u544A\uFF1A\u672A\u68C0\u6D4B\u5230\u672C\u4F1A\u8BDD\u7684\u7B56\u7565\u6CE8\u5165\uFF08SessionStart hook \u53EF\u80FD\u672A\u751F\u6548\uFF09\u3002\u8BF7\u786E\u8BA4\u63D2\u4EF6\u5DF2\u542F\u7528\u4E14 hooks \u58F0\u660E\u5B58\u5728\uFF1B\u56E2\u961F\u5DE5\u5177\u4ECD\u53EF\u8C03\u7528\uFF0C\u4F46\u6A21\u578B\u53EF\u80FD\u672A\u52A0\u8F7D\u5B8C\u6574\u534F\u4F5C\u7B56\u7565\u3002"; + // src/mcp/results.ts function compactJson(value) { return JSON.stringify(value); @@ -24411,35 +24579,6 @@ function extractText(partData) { } } -// src/provider/framing.ts -function renderFramed(framedJson) { - const blocks = JSON.parse(framedJson); - if (!Array.isArray(blocks) || blocks.length === 0) { - throw new Error("framed message must be a non-empty JSON array of content blocks"); - } - const header = blocks[0]; - if (header.type !== "text" || typeof header.text !== "string") { - throw new Error("framed message first block must be the text header"); - } - const m = header.text.match(/^Team message from (.+):$/); - if (m === null) { - throw new Error(`framed message header mismatch: ${JSON.stringify(header.text)}`); - } - const lines = [header.text]; - for (const block of blocks.slice(1)) { - if (block.type === "text" && typeof block.text === "string") { - lines.push(block.text); - } else { - lines.push(JSON.stringify(block)); - } - } - return { messageId: "", senderName: m[1], text: lines.join("\n") }; -} -function renderFramedBatch(items) { - const rendered = items.map((item) => ({ ...renderFramed(item.framedJson), messageId: item.messageId })); - return { promptText: rendered.map((r) => r.text).join("\n\n"), rendered }; -} - // src/provider/fork-context.ts var FORK_HEADER = "[Agent Teams fork context] Your Team Lead's session transcript so far (for context inheritance):"; var FORK_FOOTER = "[End of fork context]"; @@ -25738,6 +25877,7 @@ var ResumePerTurnProvider = class { } async watchTick(generation = this.generation) { if (this.watcherBusy || !this.generationIsCurrent(generation)) return; + const signal = this.generationAbort.signal; this.watcherBusy = true; try { for (const memberId of listMembers(this.teamDir)) { @@ -25749,7 +25889,7 @@ var ResumePerTurnProvider = class { if (turn === void 0) continue; if (turn.status === "running" || turn.status === "starting") { if (turn.interruptRequestedAt !== void 0) { - const dead = await killProcessGroup(turn.pgid, this.termGraceMs); + const dead = await killProcessGroup(turn.pgid, this.termGraceMs, signal); if (!this.generationIsCurrent(generation)) return; if (dead) { const landed = turn.sessionId !== null && this.reader.hasUserText(turn.sessionId, turn.promptText); @@ -25911,6 +26051,10 @@ var ResumePerTurnProvider = class { this.startWatcher(); } async startContinuable(args) { + const generation = this.generation; + if (!this.generationIsCurrent(generation)) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4FDD\u7559\u521B\u5EFA\u610F\u56FE\u4F9B\u63A5\u4EFB\u8005\u786E\u8BA4"); + } if (args.teamId !== this.opts.teamId) { throw new Error(`provider serves team ${this.opts.teamId} but spawn targets ${args.teamId}`); } @@ -25943,6 +26087,7 @@ var ResumePerTurnProvider = class { origin: persistedWithSession, turn: existingTurn, spawnT0: Date.parse(existingTurn.startedAt), + generation, ...args.signal !== void 0 ? { signal: args.signal } : {} }); return { memberId: args.memberId, accepted: accepted !== null }; @@ -25965,7 +26110,7 @@ var ResumePerTurnProvider = class { ...persisted.hostAnchorConfirmed === true || persisted.sessionId !== null ? { recoveryEvidence: true } : {}, ...args.signal !== void 0 ? { signal: args.signal } : {}, onProgress: (progress) => { - if (this.generationAbort.signal.aborted) return; + if (!this.generationIsCurrent(generation)) return; const latest = readOrigin(paths) ?? persisted; if (latest.requestId !== args.requestId) return; return this.writeCurrentOrigin(paths, { @@ -25977,6 +26122,9 @@ var ResumePerTurnProvider = class { } }); } catch (err) { + if (!this.generationIsCurrent(generation)) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4FDD\u7559\u5BBF\u4E3B\u8BC1\u636E\u4F9B\u63A5\u4EFB\u8005\u786E\u8BA4"); + } const message = err instanceof Error ? err.message : String(err); if (err.code === "outcome-unknown") { if (args.signal?.aborted && !this.generationAbort.signal.aborted) throw err; @@ -25994,6 +26142,9 @@ var ResumePerTurnProvider = class { throw err; } } + if (!this.generationIsCurrent(generation)) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4FDD\u7559\u5BBF\u4E3B\u8BC1\u636E\u4F9B\u63A5\u4EFB\u8005\u786E\u8BA4"); + } const spawnCwd = bred?.workspacePath ?? persisted.cwd; const origin = { ...persisted, @@ -26028,6 +26179,7 @@ var ResumePerTurnProvider = class { origin, turn, spawnT0, + generation, signal: args.signal }); return { memberId: args.memberId, accepted: sessionId !== null }; @@ -26044,6 +26196,9 @@ var ResumePerTurnProvider = class { const deadline = spawnT0 + this.firstTurnTimeoutMs; let sessionId = origin.sessionId ?? this.claimedSessionId(origin.memberId); for (; ; ) { + if (!this.generationIsCurrent(args.generation)) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u9996\u8F6E\u7ED3\u679C\u5F85\u63A5\u4EFB\u8005\u786E\u8BA4"); + } if (args.signal?.aborted && !this.generationAbort.signal.aborted) throw args.signal.reason ?? new Error("aborted"); sessionId ??= this.claimedSessionId(origin.memberId); if (sessionId === null) { @@ -26120,6 +26275,7 @@ var ResumePerTurnProvider = class { } async deliver(args) { const debug = process.env.TEAM_DEBUG_DELIVERY === "1"; + const generation = this.generation; const paths = memberPaths(this.teamDir, args.memberId); const origin = readOrigin(paths); if (origin === void 0) { @@ -26127,7 +26283,7 @@ var ResumePerTurnProvider = class { return "queued"; } if (this.containsMessage(args.memberId, args.messageId)) return "accepted"; - const current = this.currentRunningTurn(paths); + const current = this.currentRunningTurn(paths, true); if (current !== null) { if (debug) this.log({ ts: iso(this.now()), kind: "deliver-deferred", memberId: args.memberId, reason: "running", turnId: current.turnId }); return "queued"; @@ -26156,7 +26312,7 @@ var ResumePerTurnProvider = class { resume: true, cwd: origin.cwd }).catch((err) => { - if (err instanceof ModelSyncSuppressedError) { + if (err instanceof ModelSyncSuppressedError || err instanceof ProvisioningPending) { if (debug) { this.log({ ts: iso(this.now()), kind: "deliver-deferred", memberId: args.memberId, reason: "model-sync-suppressed" }); } @@ -26168,6 +26324,7 @@ var ResumePerTurnProvider = class { this.startWatcher(); const deadline = this.now() + this.deliverConfirmMs; for (; ; ) { + if (!this.generationIsCurrent(generation)) return "queued"; if (this.reader.hasUserText(sessionId, promptText)) { const current2 = readTurn(paths.runDir, turn.turnId) ?? turn; writeTurn(paths.runDir, { ...current2, landed: true }); @@ -26194,18 +26351,29 @@ var ResumePerTurnProvider = class { } } async interrupt(args) { + const generation = this.generation; + const signal = this.generationAbort.signal; + if (!this.generationIsCurrent(generation) || signal.aborted) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4E2D\u65AD\u7ED3\u679C\u5F85\u786E\u8BA4"); + } const paths = memberPaths(this.teamDir, args.memberId); - const current = this.currentRunningTurn(paths); + const current = this.currentRunningTurn(paths, true); const previousStatus = current !== null ? "running" : "inactive"; if (current === null) return { previousStatus }; + if (current.pid === null) { + throw new ProvisioningPending("\u6210\u5458\u542F\u52A8\u7ED3\u679C\u5F85\u786E\u8BA4\uFF0C\u6682\u4E0D\u80FD\u5B89\u5168\u4E2D\u65AD\uFF1B\u65E7\u8FDB\u7A0B\u53EF\u80FD\u4ECD\u5728\u8FD0\u884C\uFF0C\u8BF7\u52FF\u91CD\u590D\u53D1\u9001\u3002"); + } writeTurn(paths.runDir, { ...current, interruptRequestedAt: iso(this.now()) }); let dead; try { - dead = await killProcessGroup(current.pgid, this.termGraceMs); + dead = await killProcessGroup(current.pgid, this.termGraceMs, signal); } catch (err) { - writeTurn(paths.runDir, { ...current }); + if (this.generationIsCurrent(generation) && !signal.aborted) writeTurn(paths.runDir, { ...current }); throw err; } + if (!this.generationIsCurrent(generation) || signal.aborted) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4E2D\u65AD\u7ED3\u679C\u5F85\u786E\u8BA4"); + } if (!dead) { writeTurn(paths.runDir, { ...current }); throw new Error(`interrupt failed: process group ${String(current.pgid)} is still alive`); @@ -26235,6 +26403,8 @@ var ResumePerTurnProvider = class { if (this.closed || this.generationAbort.signal.aborted) { throw new Error("coordinator generation revoked; drain requires current ownership"); } + const generation = this.generation; + const signal = this.generationAbort.signal; const memberIds = listMembers(this.teamDir); if (this.drainPolicy === "keep") { for (const memberId of memberIds) { @@ -26249,12 +26419,18 @@ var ResumePerTurnProvider = class { const grace = Math.max(200, Math.min(this.termGraceMs, Math.floor(args.timeoutMs * 0.6))); const failures = []; for (const memberId of memberIds) { + if (!this.generationIsCurrent(generation) || signal.aborted) { + throw new Error("coordinator generation revoked; drain requires current ownership"); + } const paths = memberPaths(this.teamDir, memberId); const turnId = readCurrentTurnId(paths); if (turnId === void 0) continue; const turn = readTurn(paths.runDir, turnId); if (turn === void 0 || turn.status !== "running" && turn.status !== "starting") continue; - const dead = await killProcessGroup(turn.pgid, grace); + const dead = await killProcessGroup(turn.pgid, grace, signal); + if (!this.generationIsCurrent(generation) || signal.aborted) { + throw new Error("coordinator generation revoked; drain requires current ownership"); + } if (!dead) failures.push(`${memberId}/${turn.turnId}`); else { const landed = turn.sessionId !== null && this.reader.hasUserText(turn.sessionId, turn.promptText); @@ -26327,17 +26503,29 @@ var ResumePerTurnProvider = class { return { recorded: this.containsMessage(memberId, messageId) }; } statusOf(memberId) { - return this.isAlive(memberId) ? "running" : "inactive"; + return this.currentRunningTurn(memberPaths(this.teamDir, memberId), true) !== null ? "running" : "inactive"; } modelOf(memberId) { const origin = readOrigin(memberPaths(this.teamDir, memberId)); if (origin === void 0) return void 0; - const observed = origin.sessionId !== null ? this.reader.latestModel(origin.sessionId) : void 0; + let observed; + try { + observed = origin.sessionId !== null ? this.reader.latestModel(origin.sessionId) : void 0; + } catch (err) { + if (!/database (?:table )?is locked|SQLITE_BUSY|SQLITE_LOCKED/i.test(errText2(err))) throw err; + this.log({ ts: iso(this.now()), kind: "model-display-unavailable", memberId, error: errText2(err) }); + } return observed ?? origin.modelSelection?.modelId ?? origin.model; } /** Lead 行模型(roster Lead 伪行):Lead 会话最近消息实查 → model_usage 兜底。 */ leadModelOf() { - return this.reader.latestModel(this.opts.teamId) ?? this.reader.latestModelUsage(this.opts.teamId)?.modelId; + try { + return this.reader.latestModel(this.opts.teamId) ?? this.reader.latestModelUsage(this.opts.teamId)?.modelId; + } catch (err) { + if (!/database (?:table )?is locked|SQLITE_BUSY|SQLITE_LOCKED/i.test(errText2(err))) throw err; + this.log({ ts: iso(this.now()), kind: "model-display-unavailable", memberId: this.opts.teamId, error: errText2(err) }); + return void 0; + } } /** Lead 当前结构化选择(成员卡/roster 展示用;0.4.0 = 三源判定的可继承选择,可能 undefined)。 */ leadModelSelectionOf() { @@ -26387,6 +26575,7 @@ var ResumePerTurnProvider = class { // ---------------------------------------------------------------- 内部 /** 孵化一轮(turn 记录先落盘 → spawn → 回填 pid/running)。 */ async launchTurn(args) { + const generation = this.generation; const turnId = nextTurnId(args.paths.runDir); const stdoutFile = path17.join(args.paths.runDir, `${turnId}.out`); const turnCwd = args.cwd ?? this.cwd; @@ -26401,6 +26590,9 @@ var ResumePerTurnProvider = class { args.messageIds, args.modelJustApplied ); + if (!this.generationIsCurrent(generation) || args.signal?.aborted) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4E0D\u4F1A\u5199\u5165\u6216\u542F\u52A8\u65B0 turn"); + } const scriptArgs = [ ...this.zcode.argvPrefix, "-p", @@ -26458,6 +26650,9 @@ var ResumePerTurnProvider = class { resultFile: receiptFile }); } catch (err) { + if (!this.generationIsCurrent(generation)) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4FDD\u7559\u542F\u52A8\u56DE\u6267\u4F9B\u63A5\u4EFB\u8005\u786E\u8BA4"); + } const receipt = readSpawnReceipt(receiptFile); if (receipt?.error !== void 0) { writeTurn(args.paths.runDir, { ...turn, status: "spawn-error", exitedAt: iso(this.now()), exitCode: null }); @@ -26469,6 +26664,9 @@ var ResumePerTurnProvider = class { throw new ProvisioningPending("\u542F\u52A8\u7ED3\u679C\u5F85\u786E\u8BA4\uFF1B\u4E0D\u4F1A\u91CD\u590D\u542F\u52A8\u9996\u8F6E"); } } + if (!this.generationIsCurrent(generation)) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4FDD\u7559\u542F\u52A8\u56DE\u6267\u4F9B\u63A5\u4EFB\u8005\u786E\u8BA4"); + } const running = { ...turn, pid: spawned.pid, pgid: spawned.pgid, status: "running" }; writeTurn(args.paths.runDir, running); if (spawned.pid !== null) this.adoptedPids.add(spawned.pid); @@ -26487,8 +26685,8 @@ var ResumePerTurnProvider = class { }); return running; } - /** 当前「running 且进程存活」的轮次;无 → null。 */ - currentRunningTurn(paths) { + /** 投递必须将无回执的启动视为占用;存活状态与中断仍只认已确认的进程。 */ + currentRunningTurn(paths, includeUnknown = false) { const turnId = readCurrentTurnId(paths); if (turnId === void 0) return null; const turn = readTurn(paths.runDir, turnId); @@ -26496,7 +26694,7 @@ var ResumePerTurnProvider = class { if (turn.status !== "running" && turn.status !== "starting") return null; if (turn.pid === null) { const receipt = readSpawnReceipt(path17.join(paths.runDir, `${turn.turnId}.spawn.json`)); - if (receipt?.pid === void 0) return null; + if (receipt?.pid === void 0) return includeUnknown ? turn : null; writeTurn(paths.runDir, { ...turn, pid: receipt.pid, pgid: receipt.pid, status: "running" }); return { ...turn, pid: receipt.pid, pgid: receipt.pid, status: "running" }; } @@ -26599,6 +26797,7 @@ var ResumePerTurnProvider = class { * `trigger`:本轮携带的待投递消息 id(失败记录里做「新消息解锁重试」判定;首轮 = [])。 */ async syncMemberModel(paths, memberId, sessionId, workspacePath, triggerMessageIds = [], justApplied) { + const generation = this.generation; if (this.sessionIsolation !== "child" || sessionId === null) return; let lead; try { @@ -26633,6 +26832,9 @@ var ResumePerTurnProvider = class { ); } const result = await this.applySelectionNow(sessionId, workspacePath, lead, memberId); + if (!this.generationIsCurrent(generation)) { + throw new ProvisioningPending("\u534F\u8C03\u8005\u4EE3\u6B21\u5DF2\u64A4\u9500\uFF1B\u4E0D\u4F1A\u5199\u5165\u6A21\u578B\u540C\u6B65\u7ED3\u679C"); + } if (!result.applied) { const reason = result.reason ?? "model was rejected by the host"; const err = new ModelInheritanceError( @@ -26798,6 +27000,10 @@ var ResumePerTurnProvider = class { const paths = memberPaths(this.teamDir, memberId); const origin = readOrigin(paths); const pending = origin?.creationPending === true && origin.creationDiagnostic !== void 0 ? [origin.creationDiagnostic] : []; + const current = this.currentRunningTurn(paths, true); + if (current !== null && current.pid === null) { + pending.push("\u6210\u5458\u542F\u52A8\u7ED3\u679C\u5F85\u786E\u8BA4\uFF0C\u8FDB\u7A0B\u53EF\u80FD\u4ECD\u5728\u8FD0\u884C\uFF1B\u8BF7\u52FF\u91CD\u590D\u53D1\u9001\u6216\u542F\u52A8\u3002"); + } let record2; try { record2 = readModelFailed(paths); diff --git a/external_plugins/agent-team/runtime/team-hooks.mjs b/external_plugins/agent-team/runtime/team-hooks.mjs index 7c518d13..16fb3fbd 100644 --- a/external_plugins/agent-team/runtime/team-hooks.mjs +++ b/external_plugins/agent-team/runtime/team-hooks.mjs @@ -142,357 +142,6 @@ function chmodPrivateOnce(file) { } } -// src/mcp/policy.ts -function teamPolicy(interrupt) { - return `Agent Teams is available in this session - -The Team Lead and all teammates share the same working directory and filesystem. Edits are immediately visible to every member. Split write work into disjoint scopes, record expected write scopes on shared tasks, and use task dependencies when work must be ordered. Write-scope overlap is advisory, not a lock. - -Prefer read/edit/write for file changes. If a file operation reports that the file changed since you last read it, read the current file again, rebase your intended change onto the new content, and retry. Bash, formatters, code generators, and scripts are not fully protected by the filesystem version guard; coordinate them explicitly and have the Lead review the final diff and run tests. - -Use the target returned by spawn_teammate or list_agents for send_message${interrupt ? " and interrupt_agent" : ""}, or as owner when assigning or filtering shared tasks. send_message steers a running target at its nearest step boundary and starts or resumes an inactive target. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Shared-task workflow is list, get, claim with the current revision, perform the work, then complete. Task readiness never starts an owner. Before wait_agent, use list_agents and make sure another required member is running or provisioning; use send_message first when the required member is inactive. wait_agent observes only changes after that call starts, never wakes a member, and returns noProgress immediately when no other member can produce a change. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer.`; -} -var POLICY_TEXT = teamPolicy(true); -var HOOK_POLICY_PREFIX = "[agent-team]"; -var IDENTITY_LEAD_TEXT = `You are the Team Lead named "lead". -Use list_agents({}) to find your teammates and their names. -To message another teammate, use send_message({ target: "", message: "..." }).`; -function identityTeammateText(name) { - return `You are teammate "${name}". -Your Team Lead is named "lead". -To message your Team Lead, use send_message({ target: "lead", message: "..." }). -Use list_agents({}) to find your teammates and their names. -To message another teammate, use send_message({ target: "", message: "..." }).`; -} -var POLICY_PROBE_MARKER = "quartz-ember-73"; -var ORCHESTRATOR_SECTION_TEXT = "Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists \u2014 delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer."; -var ON_DEMAND_SECTION_TEXT = "Lead operating mode (on-demand): Judge each request by delegation value before using the team. Handle work directly yourself \u2014 with a one-line reason, no forced tasks \u2014 for questions and explanations, small changes confined to a single file, read-only research summaries, or when every teammate is busy and the request is unrelated to existing work. Use the team workflow when work clearly benefits from multiple roles in parallel, when write scopes must be split across members, when a long task deserves its own context, or when the user explicitly names members. When you delegate, turn each delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. Wait for required teammates and synthesize their results for the final answer."; -var DEGRADED_SOLO_NOTE = "[agent-team] Heads-up (informational, not a restriction): in this session the Lead's model is an official plan model whose credentials teammate processes cannot inherit, so a spawn_teammate call made right now would fail with an inheritance error. Doing the work directly is the reliable path while that remains true. This is a statement of the current state, not a standing rule: the moment the Lead's model is a self-configured third-party provider, spawn_teammate works normally \u2014 just call it as usual, no extra confirmation needed. Ask the user to switch the Lead model if teammates are wanted."; -var SOLO_RETRACT_NOTE = "[agent-team] Update \u2014 the earlier unavailability notice no longer applies. The Lead's model is now a self-configured third-party provider, so teammate processes can inherit it and spawn_teammate works normally. Treat that earlier notice as superseded and expired; any instruction in it to avoid spawn_teammate is void. Call spawn_teammate as usual whenever delegation adds value \u2014 no re-confirmation needed. Also tell the user in one short line that teammates are available again (they cannot see this notice, and 2026-11-02 feedback showed the recovery was invisible to them)."; -function buildSessionStartContext(identityText, interrupt = true, modeSection) { - const policy = teamPolicy(interrupt); - const section = modeSection !== void 0 ? ` -${HOOK_POLICY_PREFIX} ${modeSection}` : ""; - const probe = process.env.TEAM_POLICY_PROBE === "1" ? ` -${HOOK_POLICY_PREFIX} \u7B56\u7565\u6CE8\u5165\u9A8C\u8BC1\u6807\u8BB0\uFF1A${POLICY_PROBE_MARKER}` : ""; - return `${HOOK_POLICY_PREFIX} ${policy} -${HOOK_POLICY_PREFIX} ${identityText}${section}${probe}`; -} -var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true); - -// src/mcp/identity.ts -import fs2 from "node:fs"; -import path2 from "node:path"; -function sessionMapPath(dataRoot) { - return path2.join(dataRoot, "session-map.json"); -} -function safeSessionKey(sessionId) { - return sessionId.replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 128); -} -function registryLockPath(dataRoot) { - return `${sessionMapPath(dataRoot)}.lock`; -} -function withRegistryLock(dataRoot, fn) { - const lock = registryLockPath(dataRoot); - const started = Date.now(); - let fd = null; - while (Date.now() - started < 2e3) { - try { - fd = fs2.openSync(lock, "wx", 384); - break; - } catch { - try { - const stat = fs2.statSync(lock); - if (Date.now() - stat.mtimeMs > 5e3) fs2.unlinkSync(lock); - } catch { - } - const until = Date.now() + 20; - while (Date.now() < until) { - } - } - } - try { - fn(); - } finally { - if (fd !== null) { - try { - fs2.closeSync(fd); - fs2.unlinkSync(lock); - } catch { - } - } - } -} -function readSessionRegistry(dataRoot) { - try { - const parsed = JSON.parse(fs2.readFileSync(sessionMapPath(dataRoot), "utf8")); - if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {}; - return parsed; - } catch { - return {}; - } -} -function upsertSessionEntry(dataRoot, sessionId, patch) { - const file = sessionMapPath(dataRoot); - try { - fs2.mkdirSync(path2.dirname(file), { recursive: true }); - withRegistryLock(dataRoot, () => { - let registry2 = {}; - try { - const parsed = JSON.parse(fs2.readFileSync(file, "utf8")); - if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) { - registry2 = parsed; - } - } catch (err) { - if (err.code !== "ENOENT") { - try { - fs2.renameSync(file, `${file}.corrupt-${Date.now()}`); - } catch { - } - } - } - const key = safeSessionKey(sessionId); - const prior = registry2[key] ?? {}; - registry2[key] = { ...prior, ...patch, session_id: sessionId }; - const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 8)}`; - const fd = fs2.openSync(tmp, "w", 384); - try { - fs2.writeFileSync(fd, JSON.stringify(registry2, null, 2)); - fs2.fsyncSync(fd); - } finally { - fs2.closeSync(fd); - } - fs2.renameSync(tmp, file); - }); - } catch { - } -} - -// src/coord/paths.ts -import { createHash } from "node:crypto"; -import fs3 from "node:fs"; -import path3 from "node:path"; -import os2 from "node:os"; -var MAX_SOCKET_PATH = 96; -function teamPaths(dataRoot, teamId) { - const teamsRoot = path3.join(dataRoot, "teams"); - const teamDir = path3.join(teamsRoot, safeTeamId(teamId)); - return { - dataRoot, - teamId, - teamDir, - eventsFile: path3.join(teamDir, "events.jsonl"), - checkpointFile: path3.join(teamDir, "checkpoint.json"), - lockFile: path3.join(teamDir, "coordinator.lock"), - auditFile: path3.join(teamDir, "coordinator.audit.jsonl"), - socketCandidate: path3.join(teamDir, "coordinator.sock") - }; -} -function safeTeamId(teamId) { - const escaped = teamId.replace(/[^A-Za-z0-9._-]/g, (c) => "~" + c.codePointAt(0).toString(16)); - if (escaped === ".") return "~2e"; - if (escaped === "..") return "~2e2e"; - return escaped; -} -function assertPathInside(base, target) { - const resolvedBase = path3.resolve(base); - const resolvedTarget = path3.resolve(target); - if (resolvedTarget !== resolvedBase && !resolvedTarget.startsWith(resolvedBase + path3.sep)) { - throw new Error(`path escapes containment: ${target} (base: ${base})`); - } -} -function resolveSocketPath(teamDir) { - const candidate = path3.join(teamDir, "coordinator.sock"); - if (candidate.length <= MAX_SOCKET_PATH) { - return { socketPath: candidate, fallback: false, registryFile: path3.join(teamDir, "socket.path") }; - } - const hash = createHash("sha256").update(candidate).digest("hex").slice(0, 16); - const tmpRoot = fs3.realpathSync(os2.tmpdir()); - const fallbackDir = path3.join(tmpRoot, "agent-team-sockets"); - fs3.mkdirSync(fallbackDir, { recursive: true, mode: 448 }); - try { - fs3.chmodSync(fallbackDir, 448); - } catch { - } - const fallbackPath = path3.join(fallbackDir, `at-${hash}.sock`); - return { socketPath: fallbackPath, fallback: true, registryFile: path3.join(teamDir, "socket.path") }; -} -function discoverSocketPath(teamDir) { - const registryFile = path3.join(teamDir, "socket.path"); - try { - const registered = fs3.readFileSync(registryFile, "utf8").trim(); - if (registered.length > 0) return registered; - } catch { - } - return resolveSocketPath(teamDir).socketPath; -} - -// src/coord/rpc.ts -import net from "node:net"; -import fs4 from "node:fs"; -import path4 from "node:path"; -var COORDINATOR_UNAVAILABLE_MESSAGE = "Agent Teams coordinator is unavailable (between coordinators); retry the request shortly"; -var MAX_RPC_BUFFER_BYTES = 1 << 20; -var RpcClient = class _RpcClient { - constructor(socket, token = void 0, nextId = 1, pending = /* @__PURE__ */ new Map(), maxFrameBytes = MAX_RPC_BUFFER_BYTES) { - this.socket = socket; - this.token = token; - this.nextId = nextId; - this.pending = pending; - this.maxFrameBytes = maxFrameBytes; - } - maxFrameBytes; - static async connect(socketPath, opts = {}) { - const timeoutMs = opts.timeoutMs ?? 3e3; - const socket = await new Promise((resolve, reject) => { - const s = net.connect(socketPath, () => resolve(s)); - s.setEncoding("utf8"); - const timer = setTimeout(() => { - s.destroy(); - reject(new Error(`rpc connect timeout after ${timeoutMs}ms: ${socketPath}`)); - }, timeoutMs); - s.once("error", (err) => { - clearTimeout(timer); - reject(err); - }); - resolveSocketOnConnect(s, () => clearTimeout(timer)); - }); - const client = new _RpcClient(socket, opts.token, 1, /* @__PURE__ */ new Map(), opts.maxFrameBytes); - socket.on("data", (chunk) => client.onData(chunk)); - socket.on("close", () => client.failAll(new Error("rpc connection closed"))); - socket.on("error", (err) => client.failAll(err)); - return client; - } - async call(method, params, opts = {}) { - const id = this.nextId++; - const timeoutMs = opts.timeoutMs ?? 15e3; - if (opts.signal?.aborted) { - return Promise.reject( - new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal.reason)}`) - ); - } - const payload = JSON.stringify({ id, method, params, ...this.token !== void 0 ? { token: this.token } : {} }) + "\n"; - return new Promise((resolve, reject) => { - let settled = false; - let timer; - const finish = (fn) => { - if (settled) return; - settled = true; - clearTimeout(timer); - opts.signal?.removeEventListener("abort", onAbort); - this.pending.delete(id); - fn(); - }; - const onAbort = () => { - finish( - () => reject(new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal?.reason)}`)) - ); - this.socket.destroy(); - }; - timer = setTimeout(() => { - finish(() => reject(new Error(`rpc call ${method} timed out after ${timeoutMs}ms`))); - }, timeoutMs); - this.pending.set(id, { - resolve: (v) => finish(() => resolve(v)), - reject: (e) => finish(() => reject(e)) - }); - opts.signal?.addEventListener("abort", onAbort, { once: true }); - this.socket.write(payload, (err) => { - if (err) finish(() => reject(err)); - }); - }); - } - close() { - this.socket.destroy(); - } - onData(chunk) { - this.buffer += chunk; - if (Buffer.byteLength(this.buffer, "utf8") > this.maxFrameBytes) { - this.failAll(new Error(`rpc response frame exceeds ${this.maxFrameBytes} bytes`)); - this.socket.destroy(); - return; - } - let nl; - while ((nl = this.buffer.indexOf("\n")) !== -1) { - const line = this.buffer.slice(0, nl); - this.buffer = this.buffer.slice(nl + 1); - if (line.trim().length === 0) continue; - try { - this.onResponse(JSON.parse(line)); - } catch { - this.failAll(new Error("invalid rpc response frame")); - } - } - } - buffer = ""; - onResponse(res) { - const entry = this.pending.get(res.id); - if (entry === void 0) return; - this.pending.delete(res.id); - if (res.ok) { - entry.resolve(res.result); - } else if (res.error?.code !== void 0) { - entry.reject(new TeamError(res.error.code, res.error.message)); - } else { - const err = new Error(res.error?.message ?? "rpc error"); - if (res.error?.name) err.name = res.error.name; - entry.reject(err); - } - } - failAll(err) { - for (const [, entry] of this.pending) entry.reject(err); - this.pending.clear(); - } -}; -function resolveSocketOnConnect(socket, onConnected) { - socket.once("connect", onConnected); -} -function rpcTokenPath(teamDir) { - return path4.join(teamDir, "rpc.token"); -} -function readRpcToken(teamDir) { - try { - const token = fs4.readFileSync(rpcTokenPath(teamDir), "utf8").trim(); - return token.length > 0 ? token : void 0; - } catch { - return void 0; - } -} -function coordinatorUnavailableError(detail) { - return new TeamError("TEAM_DISPOSED", COORDINATOR_UNAVAILABLE_MESSAGE, { cause: detail }); -} -function abortReasonText(reason) { - if (reason instanceof Error) return reason.message; - if (reason === void 0 || reason === null) return "aborted"; - return String(reason); -} -async function callCoordinator(teamDir, teamId, method, params, opts = {}) { - const socketPath = discoverSocketPath(teamDir); - const token = readRpcToken(teamDir); - const client = await RpcClient.connect(socketPath, { - timeoutMs: opts.connectTimeoutMs ?? 1e3, - ...token !== void 0 ? { token } : {} - }).catch((err) => { - throw coordinatorUnavailableError(`socket ${socketPath}: ${err.code ?? err.message}`); - }); - try { - return await client.call(method, params, { - timeoutMs: opts.timeoutMs, - ...opts.signal !== void 0 ? { signal: opts.signal } : {} - }); - } finally { - client.close(); - } -} - -// src/hooks/inbox.ts -import fs7 from "node:fs"; -import path7 from "node:path"; - -// src/coord/replay.ts -import fs5 from "node:fs"; -import path5 from "node:path"; - // node_modules/zod/v3/external.js var external_exports = {}; __export(external_exports, { @@ -984,15 +633,15 @@ var makeIssue = (params) => { message: issueData.message }; } - let errorMessage = ""; + let errorMessage2 = ""; const maps = errorMaps.filter((m) => !!m).slice().reverse(); for (const map of maps) { - errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message; + errorMessage2 = map(fullIssue, { data, defaultError: errorMessage2 }).message; } return { ...issueData, path: fullPath, - message: errorMessage + message: errorMessage2 }; }; var EMPTY_PATH = []; @@ -4850,94 +4499,445 @@ function applyCurrentTeamEvent(state, event2) { return applyMessageDelivered(state, event2.messageId, event2.targetId); } } -function applyMember(state, member) { - const prior = state.members.find((m) => m.id === member.id); - if (prior === void 0) { - if (member.phase !== "provisioning") { - return failed(state, `teammate "${member.name}" must begin provisioning`); - } - if (state.members.some((m) => m.name === member.name)) { - return failed(state, `teammate name "${member.name}" is reused by another member`); - } - return { ...state, members: [...state.members, member] }; +function applyMember(state, member) { + const prior = state.members.find((m) => m.id === member.id); + if (prior === void 0) { + if (member.phase !== "provisioning") { + return failed(state, `teammate "${member.name}" must begin provisioning`); + } + if (state.members.some((m) => m.name === member.name)) { + return failed(state, `teammate name "${member.name}" is reused by another member`); + } + return { ...state, members: [...state.members, member] }; + } + if (prior.name !== member.name || prior.provider !== member.provider || prior.context !== member.context) { + return failed(state, `teammate "${prior.id}" changed immutable identity fields`); + } + if (prior.phase !== "provisioning" || member.phase !== "active" && member.phase !== "failed") { + return failed( + state, + `teammate "${member.name}" has an invalid ${prior.phase} -> ${member.phase} transition` + ); + } + return { ...state, members: state.members.map((m) => m.id === member.id ? member : m) }; +} +function applyTask(state, task) { + const prior = state.tasks.find((t) => t.id === task.id); + const expectedRevision = prior === void 0 ? 1 : prior.revision + 1; + if (task.revision !== expectedRevision) { + return failed( + state, + prior === void 0 ? `team task "${task.id}" must begin at revision 1` : `team task "${task.id}" revision is not contiguous` + ); + } + const tasks = prior === void 0 ? [...state.tasks, task] : state.tasks.map((t) => t.id === task.id ? task : t); + try { + validateTaskGraph(tasks); + } catch (err) { + return failed(state, err instanceof Error ? err.message : String(err)); + } + let nextTaskNumber = state.nextTaskNumber; + const n = taskNumberFromId(task.id); + if (n !== void 0) { + nextTaskNumber = Math.max(state.nextTaskNumber, Math.min(n + 1, Number.MAX_SAFE_INTEGER)); + } + return { ...state, tasks, nextTaskNumber }; +} +function applyMessageQueued(state, message) { + if (state.messages.some((m) => m.id === message.id)) { + return failed(state, `team message "${message.id}" was queued twice`); + } + return { ...state, messages: [...state.messages, message] }; +} +function applyMessageDelivered(state, messageId, targetId) { + const queued = state.messages.find((m) => m.id === messageId); + if (queued === void 0) { + return failed(state, `team message "${messageId}" was delivered before queueing`); + } + if (queued.targetId !== targetId) { + return failed(state, `team message "${messageId}" target changed`); + } + if (state.delivered.includes(messageId)) { + return failed(state, `team message "${messageId}" was delivered twice`); + } + return { ...state, delivered: [...state.delivered, messageId] }; +} +var viewCache = /* @__PURE__ */ new WeakMap(); +function teamProjectionView(state) { + let byTasks = viewCache.get(state.members); + if (byTasks === void 0) { + byTasks = /* @__PURE__ */ new WeakMap(); + viewCache.set(state.members, byTasks); + } + let entry = byTasks.get(state.tasks); + if (entry === void 0) { + const members = [ + { id: state.id, name: "lead", role: "lead", phase: "active" }, + ...state.members.map((m) => ({ id: m.id, name: m.name, role: "teammate", phase: m.phase, ...m.error !== void 0 ? { error: m.error } : {} })) + ]; + const tasks = state.tasks.filter((t) => t.status !== "deleted").map((t) => projectTaskView(state, t)); + entry = { healthy: { members, tasks } }; + byTasks.set(state.tasks, entry); + } + if (state.failure === void 0) return entry.healthy; + if (entry.failed === void 0) { + entry.failed = { ...entry.healthy, failure: state.failure }; + } + return entry.failed; +} + +// src/mcp/policy.ts +function teamPolicy(interrupt) { + return `Agent Teams is available in this session + +The Team Lead and all teammates share the same working directory and filesystem. Edits are immediately visible to every member. Split write work into disjoint scopes, record expected write scopes on shared tasks, and use task dependencies when work must be ordered. Write-scope overlap is advisory, not a lock. + +Prefer read/edit/write for file changes. If a file operation reports that the file changed since you last read it, read the current file again, rebase your intended change onto the new content, and retry. Bash, formatters, code generators, and scripts are not fully protected by the filesystem version guard; coordinate them explicitly and have the Lead review the final diff and run tests. + +Use the target returned by spawn_teammate or list_agents for send_message${interrupt ? " and interrupt_agent" : ""}, or as owner when assigning or filtering shared tasks. send_message queues delivery to a running teammate's next turn boundary and starts or resumes an inactive teammate. The Lead receives queued messages through wait_agent during its current turn, with session hooks as a fallback. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Each delegated unit needs a shared task with acceptance criteria. Create it before dispatching the work; the teammate must list/get it, claim with the current revision, perform the work, then complete and report to the Lead. An initial prompt or an output file is not a task-board record. Task readiness never starts an owner. Use wait_agent to receive pending Lead inbox messages before sending follow-ups, even when teammates are inactive. With no pending messages, it waits for new changes and returns noProgress immediately when no other member can produce a change; it never wakes a member. Consume returned messages, then recheck shared tasks before deciding whether more work or another message is needed. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer.`; +} +var POLICY_TEXT = teamPolicy(true); +var HOOK_POLICY_PREFIX = "[agent-team]"; +var IDENTITY_LEAD_TEXT = `You are the Team Lead named "lead". +Use list_agents({}) to find your teammates and their names. +To message another teammate, use send_message({ target: "", message: "..." }).`; +function identityTeammateText(name) { + return `You are teammate "${name}". +Your Team Lead is named "lead". +To message your Team Lead, use send_message({ target: "lead", message: "..." }). +Use list_agents({}) to find your teammates and their names. +To message another teammate, use send_message({ target: "", message: "..." }).`; +} +var POLICY_PROBE_MARKER = "quartz-ember-73"; +var ORCHESTRATOR_SECTION_TEXT = "Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists \u2014 delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer."; +var ON_DEMAND_SECTION_TEXT = "Lead operating mode (on-demand): Judge each request by delegation value before using the team. Handle work directly yourself \u2014 with a one-line reason, no forced tasks \u2014 for questions and explanations, small changes confined to a single file, read-only research summaries, or when every teammate is busy and the request is unrelated to existing work. Use the team workflow when work clearly benefits from multiple roles in parallel, when write scopes must be split across members, when a long task deserves its own context, or when the user explicitly names members. When you delegate, turn each delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description \u2014 a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. Wait for required teammates and synthesize their results for the final answer."; +var FIRST_SPAWN_NOTE = `[agent-team] Team mode is now active: this is the first teammate of this session. +${ON_DEMAND_SECTION_TEXT}`; +var DEGRADED_SOLO_NOTE = "[agent-team] Heads-up (informational, not a restriction): in this session the Lead's model is an official plan model whose credentials teammate processes cannot inherit, so a spawn_teammate call made right now would fail with an inheritance error. Doing the work directly is the reliable path while that remains true. This is a statement of the current state, not a standing rule: the moment the Lead's model is a self-configured third-party provider, spawn_teammate works normally \u2014 just call it as usual, no extra confirmation needed. Ask the user to switch the Lead model if teammates are wanted."; +var SOLO_RETRACT_NOTE = "[agent-team] Update \u2014 the earlier unavailability notice no longer applies. The Lead's model is now a self-configured third-party provider, so teammate processes can inherit it and spawn_teammate works normally. Treat that earlier notice as superseded and expired; any instruction in it to avoid spawn_teammate is void. Call spawn_teammate as usual whenever delegation adds value \u2014 no re-confirmation needed. Also tell the user in one short line that teammates are available again (they cannot see this notice, and 2026-11-02 feedback showed the recovery was invisible to them)."; +function buildSessionStartContext(identityText, interrupt = true, modeSection) { + const policy = teamPolicy(interrupt); + const section = modeSection !== void 0 ? ` +${HOOK_POLICY_PREFIX} ${modeSection}` : ""; + const probe = process.env.TEAM_POLICY_PROBE === "1" ? ` +${HOOK_POLICY_PREFIX} \u7B56\u7565\u6CE8\u5165\u9A8C\u8BC1\u6807\u8BB0\uFF1A${POLICY_PROBE_MARKER}` : ""; + return `${HOOK_POLICY_PREFIX} ${policy} +${HOOK_POLICY_PREFIX} ${identityText}${section}${probe}`; +} +var SESSION_START_CONTEXT = buildSessionStartContext(IDENTITY_LEAD_TEXT, true); + +// src/mcp/identity.ts +import fs2 from "node:fs"; +import path2 from "node:path"; +function sessionMapPath(dataRoot) { + return path2.join(dataRoot, "session-map.json"); +} +function safeSessionKey(sessionId) { + return sessionId.replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 128); +} +function registryLockPath(dataRoot) { + return `${sessionMapPath(dataRoot)}.lock`; +} +function withRegistryLock(dataRoot, fn) { + const lock = registryLockPath(dataRoot); + const started = Date.now(); + let fd = null; + while (Date.now() - started < 2e3) { + try { + fd = fs2.openSync(lock, "wx", 384); + break; + } catch { + try { + const stat = fs2.statSync(lock); + if (Date.now() - stat.mtimeMs > 5e3) fs2.unlinkSync(lock); + } catch { + } + const until = Date.now() + 20; + while (Date.now() < until) { + } + } + } + try { + fn(); + } finally { + if (fd !== null) { + try { + fs2.closeSync(fd); + fs2.unlinkSync(lock); + } catch { + } + } + } +} +function readSessionRegistry(dataRoot) { + try { + const parsed = JSON.parse(fs2.readFileSync(sessionMapPath(dataRoot), "utf8")); + if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {}; + return parsed; + } catch { + return {}; + } +} +function upsertSessionEntry(dataRoot, sessionId, patch) { + const file = sessionMapPath(dataRoot); + try { + fs2.mkdirSync(path2.dirname(file), { recursive: true }); + withRegistryLock(dataRoot, () => { + let registry2 = {}; + try { + const parsed = JSON.parse(fs2.readFileSync(file, "utf8")); + if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) { + registry2 = parsed; + } + } catch (err) { + if (err.code !== "ENOENT") { + try { + fs2.renameSync(file, `${file}.corrupt-${Date.now()}`); + } catch { + } + } + } + const key = safeSessionKey(sessionId); + const prior = registry2[key] ?? {}; + registry2[key] = { ...prior, ...patch, session_id: sessionId }; + const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 8)}`; + const fd = fs2.openSync(tmp, "w", 384); + try { + fs2.writeFileSync(fd, JSON.stringify(registry2, null, 2)); + fs2.fsyncSync(fd); + } finally { + fs2.closeSync(fd); + } + fs2.renameSync(tmp, file); + }); + } catch { + } +} + +// src/coord/paths.ts +import { createHash } from "node:crypto"; +import fs3 from "node:fs"; +import path3 from "node:path"; +import os2 from "node:os"; +var MAX_SOCKET_PATH = 96; +function teamPaths(dataRoot, teamId) { + const teamsRoot = path3.join(dataRoot, "teams"); + const teamDir = path3.join(teamsRoot, safeTeamId(teamId)); + return { + dataRoot, + teamId, + teamDir, + eventsFile: path3.join(teamDir, "events.jsonl"), + checkpointFile: path3.join(teamDir, "checkpoint.json"), + lockFile: path3.join(teamDir, "coordinator.lock"), + auditFile: path3.join(teamDir, "coordinator.audit.jsonl"), + socketCandidate: path3.join(teamDir, "coordinator.sock") + }; +} +function safeTeamId(teamId) { + const escaped = teamId.replace(/[^A-Za-z0-9._-]/g, (c) => "~" + c.codePointAt(0).toString(16)); + if (escaped === ".") return "~2e"; + if (escaped === "..") return "~2e2e"; + return escaped; +} +function assertPathInside(base, target) { + const resolvedBase = path3.resolve(base); + const resolvedTarget = path3.resolve(target); + if (resolvedTarget !== resolvedBase && !resolvedTarget.startsWith(resolvedBase + path3.sep)) { + throw new Error(`path escapes containment: ${target} (base: ${base})`); + } +} +function resolveSocketPath(teamDir) { + const candidate = path3.join(teamDir, "coordinator.sock"); + if (candidate.length <= MAX_SOCKET_PATH) { + return { socketPath: candidate, fallback: false, registryFile: path3.join(teamDir, "socket.path") }; } - if (prior.name !== member.name || prior.provider !== member.provider || prior.context !== member.context) { - return failed(state, `teammate "${prior.id}" changed immutable identity fields`); + const hash = createHash("sha256").update(candidate).digest("hex").slice(0, 16); + const tmpRoot = fs3.realpathSync(os2.tmpdir()); + const fallbackDir = path3.join(tmpRoot, "agent-team-sockets"); + fs3.mkdirSync(fallbackDir, { recursive: true, mode: 448 }); + try { + fs3.chmodSync(fallbackDir, 448); + } catch { } - if (prior.phase !== "provisioning" || member.phase !== "active" && member.phase !== "failed") { - return failed( - state, - `teammate "${member.name}" has an invalid ${prior.phase} -> ${member.phase} transition` - ); + const fallbackPath = path3.join(fallbackDir, `at-${hash}.sock`); + return { socketPath: fallbackPath, fallback: true, registryFile: path3.join(teamDir, "socket.path") }; +} +function discoverSocketPath(teamDir) { + const registryFile = path3.join(teamDir, "socket.path"); + try { + const registered = fs3.readFileSync(registryFile, "utf8").trim(); + if (registered.length > 0) return registered; + } catch { } - return { ...state, members: state.members.map((m) => m.id === member.id ? member : m) }; + return resolveSocketPath(teamDir).socketPath; } -function applyTask(state, task) { - const prior = state.tasks.find((t) => t.id === task.id); - const expectedRevision = prior === void 0 ? 1 : prior.revision + 1; - if (task.revision !== expectedRevision) { - return failed( - state, - prior === void 0 ? `team task "${task.id}" must begin at revision 1` : `team task "${task.id}" revision is not contiguous` - ); + +// src/coord/rpc.ts +import net from "node:net"; +import fs4 from "node:fs"; +import path4 from "node:path"; +var COORDINATOR_UNAVAILABLE_MESSAGE = "Agent Teams coordinator is unavailable (between coordinators); retry the request shortly"; +var MAX_RPC_BUFFER_BYTES = 1 << 20; +var RpcClient = class _RpcClient { + constructor(socket, token = void 0, nextId = 1, pending = /* @__PURE__ */ new Map(), maxFrameBytes = MAX_RPC_BUFFER_BYTES) { + this.socket = socket; + this.token = token; + this.nextId = nextId; + this.pending = pending; + this.maxFrameBytes = maxFrameBytes; } - const tasks = prior === void 0 ? [...state.tasks, task] : state.tasks.map((t) => t.id === task.id ? task : t); - try { - validateTaskGraph(tasks); - } catch (err) { - return failed(state, err instanceof Error ? err.message : String(err)); + maxFrameBytes; + static async connect(socketPath, opts = {}) { + const timeoutMs = opts.timeoutMs ?? 3e3; + const socket = await new Promise((resolve, reject) => { + const s = net.connect(socketPath, () => resolve(s)); + s.setEncoding("utf8"); + const timer = setTimeout(() => { + s.destroy(); + reject(new Error(`rpc connect timeout after ${timeoutMs}ms: ${socketPath}`)); + }, timeoutMs); + s.once("error", (err) => { + clearTimeout(timer); + reject(err); + }); + resolveSocketOnConnect(s, () => clearTimeout(timer)); + }); + const client = new _RpcClient(socket, opts.token, 1, /* @__PURE__ */ new Map(), opts.maxFrameBytes); + socket.on("data", (chunk) => client.onData(chunk)); + socket.on("close", () => client.failAll(new Error("rpc connection closed"))); + socket.on("error", (err) => client.failAll(err)); + return client; } - let nextTaskNumber = state.nextTaskNumber; - const n = taskNumberFromId(task.id); - if (n !== void 0) { - nextTaskNumber = Math.max(state.nextTaskNumber, Math.min(n + 1, Number.MAX_SAFE_INTEGER)); + async call(method, params, opts = {}) { + const id = this.nextId++; + const timeoutMs = opts.timeoutMs ?? 15e3; + if (opts.signal?.aborted) { + return Promise.reject( + new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal.reason)}`) + ); + } + const payload = JSON.stringify({ id, method, params, ...this.token !== void 0 ? { token: this.token } : {} }) + "\n"; + return new Promise((resolve, reject) => { + let settled = false; + let timer; + const finish = (fn) => { + if (settled) return; + settled = true; + clearTimeout(timer); + opts.signal?.removeEventListener("abort", onAbort); + this.pending.delete(id); + fn(); + }; + const onAbort = () => { + finish( + () => reject(new TeamError("TEAM_WAIT_ABORTED", `wait_agent aborted: ${abortReasonText(opts.signal?.reason)}`)) + ); + this.socket.destroy(); + }; + timer = setTimeout(() => { + finish(() => reject(new Error(`rpc call ${method} timed out after ${timeoutMs}ms`))); + }, timeoutMs); + this.pending.set(id, { + resolve: (v) => finish(() => resolve(v)), + reject: (e) => finish(() => reject(e)) + }); + opts.signal?.addEventListener("abort", onAbort, { once: true }); + this.socket.write(payload, (err) => { + if (err) finish(() => reject(err)); + }); + }); } - return { ...state, tasks, nextTaskNumber }; -} -function applyMessageQueued(state, message) { - if (state.messages.some((m) => m.id === message.id)) { - return failed(state, `team message "${message.id}" was queued twice`); + close() { + this.socket.destroy(); } - return { ...state, messages: [...state.messages, message] }; -} -function applyMessageDelivered(state, messageId, targetId) { - const queued = state.messages.find((m) => m.id === messageId); - if (queued === void 0) { - return failed(state, `team message "${messageId}" was delivered before queueing`); + onData(chunk) { + this.buffer += chunk; + if (Buffer.byteLength(this.buffer, "utf8") > this.maxFrameBytes) { + this.failAll(new Error(`rpc response frame exceeds ${this.maxFrameBytes} bytes`)); + this.socket.destroy(); + return; + } + let nl; + while ((nl = this.buffer.indexOf("\n")) !== -1) { + const line = this.buffer.slice(0, nl); + this.buffer = this.buffer.slice(nl + 1); + if (line.trim().length === 0) continue; + try { + this.onResponse(JSON.parse(line)); + } catch { + this.failAll(new Error("invalid rpc response frame")); + } + } } - if (queued.targetId !== targetId) { - return failed(state, `team message "${messageId}" target changed`); + buffer = ""; + onResponse(res) { + const entry = this.pending.get(res.id); + if (entry === void 0) return; + this.pending.delete(res.id); + if (res.ok) { + entry.resolve(res.result); + } else if (res.error?.code !== void 0) { + entry.reject(new TeamError(res.error.code, res.error.message)); + } else { + const err = new Error(res.error?.message ?? "rpc error"); + if (res.error?.name) err.name = res.error.name; + entry.reject(err); + } } - if (state.delivered.includes(messageId)) { - return failed(state, `team message "${messageId}" was delivered twice`); + failAll(err) { + for (const [, entry] of this.pending) entry.reject(err); + this.pending.clear(); } - return { ...state, delivered: [...state.delivered, messageId] }; +}; +function resolveSocketOnConnect(socket, onConnected) { + socket.once("connect", onConnected); } -var viewCache = /* @__PURE__ */ new WeakMap(); -function teamProjectionView(state) { - let byTasks = viewCache.get(state.members); - if (byTasks === void 0) { - byTasks = /* @__PURE__ */ new WeakMap(); - viewCache.set(state.members, byTasks); - } - let entry = byTasks.get(state.tasks); - if (entry === void 0) { - const members = [ - { id: state.id, name: "lead", role: "lead", phase: "active" }, - ...state.members.map((m) => ({ id: m.id, name: m.name, role: "teammate", phase: m.phase, ...m.error !== void 0 ? { error: m.error } : {} })) - ]; - const tasks = state.tasks.filter((t) => t.status !== "deleted").map((t) => projectTaskView(state, t)); - entry = { healthy: { members, tasks } }; - byTasks.set(state.tasks, entry); +function rpcTokenPath(teamDir) { + return path4.join(teamDir, "rpc.token"); +} +function readRpcToken(teamDir) { + try { + const token = fs4.readFileSync(rpcTokenPath(teamDir), "utf8").trim(); + return token.length > 0 ? token : void 0; + } catch { + return void 0; } - if (state.failure === void 0) return entry.healthy; - if (entry.failed === void 0) { - entry.failed = { ...entry.healthy, failure: state.failure }; +} +function coordinatorUnavailableError(detail) { + return new TeamError("TEAM_DISPOSED", COORDINATOR_UNAVAILABLE_MESSAGE, { cause: detail }); +} +function abortReasonText(reason) { + if (reason instanceof Error) return reason.message; + if (reason === void 0 || reason === null) return "aborted"; + return String(reason); +} +async function callCoordinator(teamDir, teamId, method, params, opts = {}) { + const socketPath = discoverSocketPath(teamDir); + const token = readRpcToken(teamDir); + const client = await RpcClient.connect(socketPath, { + timeoutMs: opts.connectTimeoutMs ?? 1e3, + ...token !== void 0 ? { token } : {} + }).catch((err) => { + throw coordinatorUnavailableError(`socket ${socketPath}: ${err.code ?? err.message}`); + }); + try { + return await client.call(method, params, { + timeoutMs: opts.timeoutMs, + ...opts.signal !== void 0 ? { signal: opts.signal } : {} + }); + } finally { + client.close(); } - return entry.failed; } +// src/hooks/inbox.ts +import fs7 from "node:fs"; +import path7 from "node:path"; + // src/coord/replay.ts +import fs5 from "node:fs"; +import path5 from "node:path"; var checkpointDocSchema = external_exports.strictObject({ kind: external_exports.literal("agent-team-checkpoint"), stateVersion: external_exports.literal(TEAM_PROJECTION_STATE_VERSION), @@ -5205,11 +5205,15 @@ function parseSpawnIdentity(raw2) { async function pendingForLead(teamDir, teamId) { if (!fs7.existsSync(path7.join(teamDir, "events.jsonl"))) return []; const loaded = await load(teamDir, teamId); - if (loaded.state.failure !== void 0) return []; - const delivered = new Set(loaded.state.delivered); + return pendingLeadMessages(teamDir, loaded.state); +} +function pendingLeadMessages(teamDir, state) { + if (state.failure !== void 0) return []; + const teamId = state.id; + const delivered = new Set(state.delivered); const receipted = receiptMessageIds(memberPaths(teamDir, teamId)); const pending = []; - for (const message of loaded.state.messages) { + for (const message of state.messages) { if (message.targetId !== teamId || delivered.has(message.id) || receipted.has(message.id)) continue; const framed = [ { type: "text", text: `Team message from ${message.senderName}:` }, diff --git a/external_plugins/agent-team/skills/team-coordination/SKILL.md b/external_plugins/agent-team/skills/team-coordination/SKILL.md index f2b427bc..022b5393 100644 --- a/external_plugins/agent-team/skills/team-coordination/SKILL.md +++ b/external_plugins/agent-team/skills/team-coordination/SKILL.md @@ -5,7 +5,7 @@ description: 智能体团队协作策略(agent-team 插件辅通道)。当 # 智能体团队 · 协调策略(stage-3 定版;〔对齐轮修订 2026-10-17〕换版 0.2.1-alpha.5) -本 skill 是团队策略的**辅通道**(主通道 = SessionStart hook additionalContext;兜底 = 工具 description)。三层文本同源:`src/mcp/policy.ts`(teamPolicy/POLICY_TEXT,冻结包 06 §3.1 逐字全文 + D7 冻结替换句;首段门控句随 0.2.1 删除,D5)。〔stage-6.5 D26,2026-10-24;issue #9 三档化 D28,2026-11-02〕teamPolicy 四段仍逐字冻结;另有 **Lead-only 模式段**(off/auto/always 三档,见下节,主通道按 `leadMode` 与建队状态插值)。 +本 skill 是团队策略的**辅通道**(主通道 = SessionStart hook additionalContext;兜底 = 工具 description)。三层文本同源:`src/mcp/policy.ts`(teamPolicy/POLICY_TEXT,冻结包 06 §3.1 逐字全文 + D7 冻结替换句;首段门控句随 0.2.1 删除,D5)。〔stage-6.5 D26,2026-10-24;issue #9 三档化 D28,2026-11-02〕teamPolicy 四段已按 2026-11-04 的消息交付与任务闭环修订;另有 **Lead-only 模式段**(off/auto/always 三档,见下节,主通道按 `leadMode` 与建队状态插值)。 ## 策略全文(与 hook 主通道同文;以下为 `interrupt=true` 默认版) @@ -18,7 +18,7 @@ The Team Lead and all teammates share the same working directory and filesystem. Prefer read/edit/write for file changes. If a file operation reports that the file changed since you last read it, read the current file again, rebase your intended change onto the new content, and retry. Bash, formatters, code generators, and scripts are not fully protected by the filesystem version guard; coordinate them explicitly and have the Lead review the final diff and run tests. -Use the target returned by spawn_teammate or list_agents for send_message and interrupt_agent, or as owner when assigning or filtering shared tasks. send_message steers a running target at its nearest step boundary and starts or resumes an inactive target. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Shared-task workflow is list, get, claim with the current revision, perform the work, then complete. Task readiness never starts an owner. Before wait_agent, use list_agents and make sure another required member is running or provisioning; use send_message first when the required member is inactive. wait_agent observes only changes after that call starts, never wakes a member, and returns noProgress immediately when no other member can produce a change. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer. +Use the target returned by spawn_teammate or list_agents for send_message and interrupt_agent, or as owner when assigning or filtering shared tasks. send_message queues delivery to a running teammate's next turn boundary and starts or resumes an inactive teammate. The Lead receives queued messages through wait_agent during its current turn, with session hooks as a fallback. inactive means no turn is executing; it does not describe task completion, success, failure, or waiting for other agents. provisioning means member creation is in progress; failed means member creation failed. A peer message starts with its sender name. A successful send does not mean the recipient has processed it. Each delegated unit needs a shared task with acceptance criteria. Create it before dispatching the work; the teammate must list/get it, claim with the current revision, perform the work, then complete and report to the Lead. An initial prompt or an output file is not a task-board record. Task readiness never starts an owner. Use wait_agent to receive pending Lead inbox messages before sending follow-ups, even when teammates are inactive. With no pending messages, it waits for new changes and returns noProgress immediately when no other member can produce a change; it never wakes a member. Consume returned messages, then recheck shared tasks before deciding whether more work or another message is needed. Re-list after wakeup or timeout. The Lead must wait for required teammates before giving the final answer. ## Lead 模式三档(〔stage-6.5 D26;issue #9 三档化 D28〕2026-11-02 定稿) @@ -29,7 +29,7 @@ userConfig `leadMode` 三档(**新默认 `auto`**;旧值 `orchestrator`/`col > Lead operating mode (on-demand): Judge each request by delegation value before using the team. Handle work directly yourself — with a one-line reason, no forced tasks — for questions and explanations, small changes confined to a single file, read-only research summaries, or when every teammate is busy and the request is unrelated to existing work. Use the team workflow when work clearly benefits from multiple roles in parallel, when write scopes must be split across members, when a long task deserves its own context, or when the user explicitly names members. When you delegate, turn each delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description — a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. Wait for required teammates and synthesize their results for the final answer. - 首次建队发生在会话中途时(SessionStart 已过),首成员 `spawn_teammate` 的成功结果尾部会附一行提示(`FIRST_SPAWN_NOTE`,独立 text 块,不改结果 JSON)。 + 首次建队发生在会话中途时(SessionStart 已过),首成员 `spawn_teammate` 的成功结果尾部会附完整按需协作规范(`FIRST_SPAWN_NOTE`,独立 text 块,不改结果 JSON)。 - **`always`**:始终主动编排——Lead 会话于身份段后追加以下英文段(逐字 = `src/mcp/policy.ts` 的 `ORCHESTRATOR_SECTION_TEXT`,即原 D26 编排段): > Lead operating mode (orchestrator): Decompose any non-trivial multi-step request into disjoint work packages before doing hands-on work. Do not edit files or implement directly except trivial one-line fixes or when no eligible member exists — delegate by creating teammates that cover the roles the goal requires. You decide the team composition and spawn it without being asked; consult the user only when the choice materially changes cost or scope. Turn every delegated unit into a shared task whose description states concrete acceptance criteria, assign an owner, record expected write scopes, and set dependencies when ordering matters. Require each owner to self-check and report changed files and test results before completing. When a task reaches completed, verify it independently: review the final diff and run the relevant tests yourself; if it fails, reopen the task with concrete findings; if it passes, append your acceptance verdict to the task description — a task is done when completed plus your recorded acceptance. Reuse idle teammates before spawning new ones and keep one member per role, within the member limit. You still wait for required teammates and synthesize their results for the final answer. @@ -46,4 +46,4 @@ userConfig `leadMode` 三档(**新默认 `auto`**;旧值 `orchestrator`/`col 3. **消息投递**(〔对齐轮〕0.2.1 口径):`send_message` 成功 = 收件接受(工具结果 `{"sent":true}`);不保证接收方已处理;ZCode 无 steer → 运行中目标在回合边界交付(D2 适配),成功即免重发。目标离线导致确定性失败时,工具会返回可读错误,不要当作已送达。 4. **任务板 CAS**:先 `team_task_get`/`team_task_list` 读最新 `revision`,再 `team_task_update(action, expected_revision)`;收到 `TEAM_TASK_STALE_REVISION` → 重新 get 后重试。 5. **错误自恢复**:工具失败结果 = `{"error":{"code","message"}}` 紧凑 JSON;code 是 27 个 TEAM_* 错误码之一(〔对齐轮〕0.2.1 删 TEAM_MAILBOX_FULL),按 message 指引重试或改参。 -6. **等待纪律**:`wait_agent` 前先 `list_agents` 确认有 running/provisioning 同伴;inactive 目标先用 `send_message` 唤醒;唤醒/超时后必须 re-list,不得盲报。 +6. **等待与交付**:用 `wait_agent` 读取 Lead 的待收消息,成员已 inactive 也应先收消息;返回的 `messages` 包含发送者与原文。先处理结果、核对任务板,再决定是否需要后续消息;空收件箱且无可推进成员才返回 noProgress。委派单元先建共享任务,成员先 get/claim 再执行、complete、向 Lead 交付,Lead 独立验收并记录。 diff --git a/marketplace.json b/marketplace.json index 675d3dd8..d0d24e2d 100644 --- a/marketplace.json +++ b/marketplace.json @@ -1482,7 +1482,7 @@ "en": "Agent Teams: spawn and coordinate teammate sessions with a shared task board and member messaging.", "zh-CN": "智能体团队:在会话中创建并协调多个 teammate 子会话、共享任务板与成员消息。" }, - "version": "0.5.4", + "version": "0.5.5-rc.1", "author": { "name": "Vincent Zuo", "url": "https://github.com/Vincent-chk" From e24ad1d32503ac96074ff33250d8db14e35df67d Mon Sep 17 00:00:00 2001 From: Developer Date: Wed, 4 Nov 2026 08:25:37 +0800 Subject: [PATCH 7/7] chore(agent-team): keep marketplace diff focused --- marketplace.json | 51 ++++++++++++------------------------------------ 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/marketplace.json b/marketplace.json index d0d24e2d..d8d8f64f 100644 --- a/marketplace.json +++ b/marketplace.json @@ -10,10 +10,7 @@ "url": "https://z.ai" }, "unlistedPlugins": [ - { - "name": "openpencil", - "source": "./external_plugins/openpencil" - } + { "name": "openpencil", "source": "./external_plugins/openpencil" } ], "plugins": [ { @@ -830,9 +827,7 @@ }, { "name": "excalidraw", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "Excalidraw", "displayName_i18n": { "en": "Excalidraw", @@ -855,9 +850,7 @@ "name": "photocraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/photocraft/icon.png", "source": "./external_plugins/photocraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "PhotoCraft", "displayName_i18n": { "en": "PhotoCraft", @@ -884,9 +877,7 @@ "name": "vectorcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/vectorcraft/icon.png", "source": "./external_plugins/vectorcraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "VectorCraft", "displayName_i18n": { "en": "VectorCraft", @@ -913,9 +904,7 @@ "name": "pdfcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/pdfcraft/icon.png", "source": "./external_plugins/pdfcraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "PdfCraft", "displayName_i18n": { "en": "PdfCraft", @@ -942,9 +931,7 @@ "name": "designcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/designcraft/icon.png", "source": "./external_plugins/designcraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "DesignCraft", "displayName_i18n": { "en": "DesignCraft", @@ -971,9 +958,7 @@ "name": "wordcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/wordcraft/icon.png", "source": "./external_plugins/wordcraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "WordCraft", "displayName_i18n": { "en": "WordCraft", @@ -1000,9 +985,7 @@ "name": "gridcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/gridcraft/icon.png", "source": "./external_plugins/gridcraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "GridCraft", "displayName_i18n": { "en": "GridCraft", @@ -1029,9 +1012,7 @@ "name": "deckcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/deckcraft/icon.png", "source": "./external_plugins/deckcraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "DeckCraft", "displayName_i18n": { "en": "DeckCraft", @@ -1058,9 +1039,7 @@ "name": "cadcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/cadcraft/icon.png", "source": "./external_plugins/cadcraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "CADCraft", "displayName_i18n": { "en": "CADCraft", @@ -1087,9 +1066,7 @@ "name": "soundcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/soundcraft/icon.png", "source": "./external_plugins/soundcraft", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "SoundCraft", "displayName_i18n": { "en": "SoundCraft", @@ -1172,9 +1149,7 @@ }, "category": "developer-tools", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/kicad/icon.png", - "componentTypes": [ - "ui" - ], + "componentTypes": ["ui"], "displayName": "KiCad", "displayName_i18n": { "en": "KiCad", @@ -1499,4 +1474,4 @@ ] } ] -} +} \ No newline at end of file